/
module.ts
106 lines (102 loc) 路 3.46 KB
/
module.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import { createRequire } from 'module'
import { defineNuxtModule, installModule, checkNuxtCompatibility } from '@nuxt/kit'
import type { NuxtModule, NuxtCompatibility } from '@nuxt/schema'
import type { BridgeConfig } from '../types'
import { setupNitroBridge } from './nitro'
import { setupAppBridge } from './app'
import { setupCAPIBridge } from './capi'
import { setupBetterResolve } from './resolve'
import importsModule from './imports/module'
import { setupTypescript } from './typescript'
import { setupMeta } from './meta'
import { setupTranspile } from './transpile'
import { generateWebpackBuildManifest } from './webpack/manifest'
export default defineNuxtModule({
meta: {
name: 'nuxt-bridge',
configKey: 'bridge'
},
defaults: {
nitro: true,
nitroGenerator: true,
vite: false,
app: {},
capi: {},
transpile: true,
imports: true,
compatibility: true,
meta: null,
// TODO: Remove from 2.16
postcss8: true,
typescript: true,
resolve: true
} as BridgeConfig,
async setup (opts, nuxt) {
// Disable if users explicitly set to false
if ((nuxt.options as any).bridge === false) { return }
if (!(nuxt.options as any).bridge._version) {
throw new Error('[bridge] Bridge must be enabled by using `defineNuxtConfig` to wrap your Nuxt configuration.')
}
if (opts.vite && !opts.nitro && !nuxt.options.dev) {
throw new Error('[bridge] Vite build will not work unless Nitro is enabled.')
}
if (opts.nitro) {
nuxt.hook('modules:done', async () => {
await setupNitroBridge()
})
}
if (opts.app) {
await setupAppBridge(opts.app)
}
if (opts.capi) {
if (!opts.app) {
throw new Error('[bridge] Cannot enable composition-api with app disabled!')
}
await setupCAPIBridge(opts.capi === true ? {} : opts.capi)
}
if (opts.imports ?? opts.autoImports) {
nuxt.hook('modules:done', () => installModule(importsModule))
}
if (opts.vite) {
const viteModule = await import('./vite/module').then(r => r.default || r) as NuxtModule
nuxt.hook('modules:done', () => installModule(viteModule))
} else {
// with webpack, we need to transpile vue to handle the default/named exports in Vue 2.7
nuxt.options.build.transpile.push('vue')
nuxt.hook('build:done', async () => {
if (opts.nitro && !nuxt.options.dev && !nuxt.options._prepare) {
await generateWebpackBuildManifest()
}
})
}
if (opts.postcss8) {
const _require = createRequire(import.meta.url)
await installModule(_require.resolve('@nuxt/postcss8'))
}
if (opts.typescript) {
await setupTypescript()
}
if (opts.resolve) {
setupBetterResolve()
}
if (opts.transpile) {
setupTranspile()
}
if (opts.compatibility) {
nuxt.hook('modules:done', async (moduleContainer: any) => {
for (const [name, m] of Object.entries(moduleContainer.requiredModules || {})) {
const compat = ((m as any)?.handler?.meta?.compatibility || {}) as NuxtCompatibility
if (compat) {
const issues = await checkNuxtCompatibility(compat, nuxt)
if (issues.length) {
console.warn(`[bridge] Detected module incompatibility issues for \`${name}\`:\n` + issues.toString())
}
}
}
})
}
if (opts.meta !== false && opts.capi) {
await setupMeta({ needsExplicitEnable: opts.meta === null })
}
}
})