@monkeyplus/flow 5.0.0-rc.23 → 5.0.0-rc.230
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app/entry.async.d.ts +3 -0
- package/dist/app/entry.async.mjs +1 -0
- package/dist/app/entry.d.ts +2 -2
- package/dist/app/entry.mjs +3 -2
- package/dist/app/flow.d.ts +12 -3
- package/dist/app/flow.mjs +3 -0
- package/dist/chunks/dev-bundler.mjs +277 -0
- package/dist/core/runtime/client.manifest.d.mts +2 -0
- package/dist/core/runtime/client.manifest.mjs +6 -0
- package/dist/core/runtime/nitro/flow.d.ts +2 -1
- package/dist/core/runtime/nitro/flow.mjs +8 -14
- package/dist/core/runtime/nitro/renderer.d.ts +1 -1
- package/dist/core/runtime/nitro/renderer.mjs +68 -14
- package/dist/core/runtime/vite-node-shared.d.mts +1 -0
- package/dist/core/runtime/vite-node-shared.d.ts +8 -0
- package/dist/core/runtime/vite-node-shared.mjs +3 -0
- package/dist/core/runtime/vite-node.d.mts +2 -0
- package/dist/core/runtime/vite-node.mjs +41 -0
- package/dist/head/runtime/plugin.mjs +0 -1
- package/dist/index.mjs +528 -767
- package/dist/pages/runtime/helpers/index.d.ts +1 -1
- package/dist/pages/runtime/helpers/index.mjs +14 -3
- package/dist/pages/runtime/index.d.ts +10 -3
- package/dist/pages/runtime/index.mjs +5 -1
- package/dist/pages/runtime/pages.mjs +134 -0
- package/package.json +40 -36
- package/dist/pages/runtime/plugin.mjs +0 -71
- package/dist/vite-client/runtime/injectManifest.d.ts +0 -26
- package/dist/vite-client/runtime/injectManifest.mjs +0 -104
- package/dist/vite-client/runtime/plugin.d.ts +0 -2
- package/dist/vite-client/runtime/plugin.mjs +0 -26
- /package/dist/pages/runtime/{plugin.d.ts → pages.d.ts} +0 -0
package/dist/index.mjs
CHANGED
|
@@ -1,36 +1,33 @@
|
|
|
1
1
|
import { createHooks } from 'hookable';
|
|
2
2
|
import { dirname, resolve, normalize, join, isAbsolute, relative, extname } from 'pathe';
|
|
3
|
-
import { defineFlowModule, addPlugin, defineNuxtModule, logger, addTemplate, addPluginTemplate, addVitePlugin, useNuxt, resolveAlias, resolveFilesFlow, nuxtCtx, installModule, loadFlowConfig,
|
|
3
|
+
import { defineFlowModule, addPlugin, defineNuxtModule, logger, addTemplate, addPluginTemplate, addVitePlugin, addWebpackPlugin, updateTemplates, useNuxt, resolveAlias, resolveFilesFlow, nuxtCtx, installModule, loadFlowConfig, normalizeTemplate, compileTemplate, normalizePlugin, findPath, templateUtils, isIgnoredFlow } from '@monkeyplus/flow-kit';
|
|
4
|
+
import escapeRE from 'escape-string-regexp';
|
|
4
5
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
5
6
|
import { defineUnimportPreset, createUnimport, toImports, scanDirExports } from 'unimport';
|
|
7
|
+
import defu from 'defu';
|
|
6
8
|
import { createUnplugin } from 'unplugin';
|
|
7
|
-
import { parseURL, parseQuery, joinURL
|
|
8
|
-
import
|
|
9
|
+
import { parseURL, parseQuery, joinURL } from 'ufo';
|
|
10
|
+
import fs from 'fs';
|
|
9
11
|
import { camelCase, pascalCase } from 'scule';
|
|
10
|
-
import { genImport, genDynamicImport, genArrayFromRaw, genString
|
|
11
|
-
import
|
|
12
|
-
import
|
|
13
|
-
import
|
|
14
|
-
import {
|
|
15
|
-
import { debounce } from 'perfect-debounce';
|
|
16
|
-
import { existsSync, promises, readdirSync, statSync } from 'node:fs';
|
|
17
|
-
import { createNitro, scanHandlers, writeTypes, build as build$2, prepare, copyPublicAssets, prerender, createDevServer } from 'nitropack';
|
|
18
|
-
import defu from 'defu';
|
|
19
|
-
import { dynamicEventHandler, toEventHandler } from 'h3';
|
|
20
|
-
import { createRequire, builtinModules } from 'node:module';
|
|
12
|
+
import { genImport, genDynamicImport, genSafeVariableName, genArrayFromRaw, genString } from 'knitwork';
|
|
13
|
+
import { existsSync, promises } from 'node:fs';
|
|
14
|
+
import { createNitro, scanHandlers, writeTypes, build as build$1, prepare, copyPublicAssets, prerender, createDevServer } from 'nitropack';
|
|
15
|
+
import { dynamicEventHandler } from 'h3';
|
|
16
|
+
import { createRequire } from 'node:module';
|
|
21
17
|
import chokidar from 'chokidar';
|
|
18
|
+
import { debounce } from 'perfect-debounce';
|
|
22
19
|
import { generateTypes, resolveSchema } from 'untyped';
|
|
23
|
-
import {
|
|
24
|
-
import { sanitizeFilePath } from 'mlly';
|
|
20
|
+
import { hash } from 'ohash';
|
|
21
|
+
import { resolvePath, sanitizeFilePath } from 'mlly';
|
|
22
|
+
import * as vite from 'vite';
|
|
25
23
|
import replace from '@rollup/plugin-replace';
|
|
26
|
-
import {
|
|
27
|
-
import
|
|
28
|
-
import MagicString from 'magic-string';
|
|
24
|
+
import { resolveTSConfig } from 'pkg-types';
|
|
25
|
+
import fse from 'fs-extra';
|
|
29
26
|
|
|
30
|
-
const version = "5.0.0-rc.
|
|
27
|
+
const version = "5.0.0-rc.230";
|
|
31
28
|
|
|
32
29
|
let _distDir = dirname(fileURLToPath(import.meta.url));
|
|
33
|
-
if (_distDir.
|
|
30
|
+
if (_distDir.match(/(chunks|shared)$/))
|
|
34
31
|
_distDir = dirname(_distDir);
|
|
35
32
|
const distDir = _distDir;
|
|
36
33
|
const pkgDir = resolve(distDir, "..");
|
|
@@ -53,35 +50,38 @@ const metaModule = defineFlowModule({
|
|
|
53
50
|
|
|
54
51
|
const TransformPlugin = createUnplugin(({ ctx, options, sourcemap }) => {
|
|
55
52
|
return {
|
|
56
|
-
name: "
|
|
53
|
+
name: "nuxt:imports-transform",
|
|
57
54
|
enforce: "post",
|
|
58
55
|
transformInclude(id) {
|
|
59
56
|
const { pathname, search } = parseURL(decodeURIComponent(pathToFileURL(id).href));
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
const include = options.transform?.include || [];
|
|
63
|
-
if (exclude.some((pattern) => id.match(pattern)))
|
|
64
|
-
return false;
|
|
65
|
-
if (include.some((pattern) => id.match(pattern)))
|
|
57
|
+
const query = parseQuery(search);
|
|
58
|
+
if (options.transform?.include?.some((pattern) => id.match(pattern)))
|
|
66
59
|
return true;
|
|
67
|
-
if (
|
|
60
|
+
if (options.transform?.exclude?.some((pattern) => id.match(pattern)))
|
|
61
|
+
return false;
|
|
62
|
+
if (id.endsWith(".vue") || "macro" in query || "vue" in query && (query.type === "template" || query.type === "script" || "setup" in query))
|
|
68
63
|
return true;
|
|
69
64
|
if (pathname.match(/\.((c|m)?j|t)sx?$/g))
|
|
70
65
|
return true;
|
|
71
66
|
},
|
|
72
|
-
async transform(
|
|
73
|
-
|
|
74
|
-
|
|
67
|
+
async transform(code, id) {
|
|
68
|
+
id = normalize(id);
|
|
69
|
+
const isNodeModule = id.match(/[\\/]node_modules[\\/]/) && !options.transform?.include?.some((pattern) => id.match(pattern));
|
|
70
|
+
if (isNodeModule && !code.match(/(['"])#imports\1/))
|
|
75
71
|
return;
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
72
|
+
const { s } = await ctx.injectImports(code, id, { autoImport: options.autoImport && !isNodeModule });
|
|
73
|
+
if (s.hasChanged()) {
|
|
74
|
+
return {
|
|
75
|
+
code: s.toString(),
|
|
76
|
+
map: sourcemap ? s.generateMap({ source: id, includeContent: true }) : void 0
|
|
77
|
+
};
|
|
78
|
+
}
|
|
80
79
|
}
|
|
81
80
|
};
|
|
82
81
|
});
|
|
83
82
|
|
|
84
83
|
const commonPresets = [
|
|
84
|
+
// #head
|
|
85
85
|
defineUnimportPreset({
|
|
86
86
|
from: "#head",
|
|
87
87
|
imports: [
|
|
@@ -92,7 +92,8 @@ const commonPresets = [
|
|
|
92
92
|
from: "#_pages",
|
|
93
93
|
imports: [
|
|
94
94
|
"definePage",
|
|
95
|
-
"
|
|
95
|
+
"defineDynamicPage",
|
|
96
|
+
"defineSharedContext"
|
|
96
97
|
]
|
|
97
98
|
})
|
|
98
99
|
];
|
|
@@ -111,10 +112,12 @@ const appPreset = defineUnimportPreset({
|
|
|
111
112
|
const vuePreset = defineUnimportPreset({
|
|
112
113
|
from: "vue",
|
|
113
114
|
imports: [
|
|
115
|
+
// Components
|
|
114
116
|
"defineComponent",
|
|
115
117
|
"getCurrentInstance",
|
|
116
118
|
"useSlots",
|
|
117
119
|
"h",
|
|
120
|
+
// Reactivity
|
|
118
121
|
"computed"
|
|
119
122
|
]
|
|
120
123
|
});
|
|
@@ -124,50 +127,65 @@ const defaultPresets = [
|
|
|
124
127
|
vuePreset
|
|
125
128
|
];
|
|
126
129
|
|
|
127
|
-
const
|
|
130
|
+
const importsModule = defineNuxtModule({
|
|
128
131
|
meta: {
|
|
129
|
-
name: "
|
|
130
|
-
configKey: "
|
|
132
|
+
name: "imports",
|
|
133
|
+
configKey: "imports"
|
|
131
134
|
},
|
|
132
135
|
defaults: {
|
|
136
|
+
autoImport: true,
|
|
133
137
|
presets: defaultPresets,
|
|
134
138
|
global: false,
|
|
135
139
|
imports: [],
|
|
136
140
|
dirs: [],
|
|
137
141
|
transform: {
|
|
142
|
+
include: [],
|
|
138
143
|
exclude: void 0
|
|
139
144
|
}
|
|
140
145
|
},
|
|
141
|
-
async setup(options,
|
|
142
|
-
|
|
143
|
-
|
|
146
|
+
async setup(options, nuxt) {
|
|
147
|
+
if (nuxt.options.autoImports) {
|
|
148
|
+
logger.warn("`autoImports` config is deprecated, use `imports` instead.");
|
|
149
|
+
options = defu(nuxt.options.autoImports, options);
|
|
150
|
+
}
|
|
151
|
+
await nuxt.callHook("imports:sources", options.presets);
|
|
152
|
+
options.presets?.forEach((_i) => {
|
|
153
|
+
const i = _i;
|
|
144
154
|
if (typeof i !== "string" && i.names && !i.imports) {
|
|
145
155
|
i.imports = i.names;
|
|
146
|
-
logger.warn("
|
|
156
|
+
logger.warn("imports: presets.names is deprecated, use presets.imports instead");
|
|
147
157
|
}
|
|
148
158
|
});
|
|
149
159
|
const ctx = createUnimport({
|
|
150
160
|
presets: options.presets,
|
|
151
|
-
imports: options.imports
|
|
161
|
+
imports: options.imports,
|
|
162
|
+
virtualImports: ["#imports"],
|
|
163
|
+
addons: {
|
|
164
|
+
vueTemplate: options.autoImport
|
|
165
|
+
}
|
|
152
166
|
});
|
|
153
167
|
let composablesDirs = [];
|
|
154
|
-
for (const layer of
|
|
168
|
+
for (const layer of nuxt.options._layers) {
|
|
155
169
|
composablesDirs.push(resolve(layer.config.srcDir, "composables"));
|
|
156
|
-
for (const dir of layer.config.
|
|
170
|
+
for (const dir of layer.config.imports?.dirs ?? []) {
|
|
171
|
+
if (!dir)
|
|
172
|
+
continue;
|
|
157
173
|
composablesDirs.push(resolve(layer.config.srcDir, dir));
|
|
174
|
+
}
|
|
158
175
|
}
|
|
159
|
-
await
|
|
176
|
+
await nuxt.callHook("imports:dirs", composablesDirs);
|
|
160
177
|
composablesDirs = composablesDirs.map((dir) => normalize(dir));
|
|
161
178
|
addTemplate({
|
|
162
179
|
filename: "imports.mjs",
|
|
163
|
-
getContents: () => ctx.toExports()
|
|
180
|
+
getContents: async () => `${await ctx.toExports()}
|
|
181
|
+
if (process.dev) { console.warn("[nuxt] \`#imports\` should be transformed with real imports. There seems to be something wrong with the imports plugin.") }`
|
|
164
182
|
});
|
|
165
|
-
|
|
166
|
-
if (
|
|
183
|
+
nuxt.options.alias["#imports"] = join(nuxt.options.buildDir, "imports");
|
|
184
|
+
if (nuxt.options.dev && options.global) {
|
|
167
185
|
addPluginTemplate({
|
|
168
|
-
filename: "
|
|
169
|
-
getContents: () => {
|
|
170
|
-
const imports = ctx.getImports();
|
|
186
|
+
filename: "imports.mjs",
|
|
187
|
+
getContents: async () => {
|
|
188
|
+
const imports = await ctx.getImports();
|
|
171
189
|
const importStatement = toImports(imports);
|
|
172
190
|
const globalThisSet = imports.map((i) => `globalThis.${i.as} = ${i.as};`).join("\n");
|
|
173
191
|
return `${importStatement}
|
|
@@ -178,32 +196,41 @@ export default () => {};`;
|
|
|
178
196
|
}
|
|
179
197
|
});
|
|
180
198
|
} else {
|
|
181
|
-
addVitePlugin(TransformPlugin.vite({ ctx, options, sourcemap:
|
|
199
|
+
addVitePlugin(TransformPlugin.vite({ ctx, options, sourcemap: nuxt.options.sourcemap.server || nuxt.options.sourcemap.client }));
|
|
200
|
+
addWebpackPlugin(TransformPlugin.webpack({ ctx, options, sourcemap: nuxt.options.sourcemap.server || nuxt.options.sourcemap.client }));
|
|
182
201
|
}
|
|
183
|
-
const
|
|
202
|
+
const regenerateImports = async () => {
|
|
184
203
|
ctx.clearDynamicImports();
|
|
185
204
|
await ctx.modifyDynamicImports(async (imports) => {
|
|
186
205
|
imports.push(...await scanDirExports(composablesDirs));
|
|
187
|
-
await
|
|
206
|
+
await nuxt.callHook("imports:extend", imports);
|
|
188
207
|
});
|
|
189
208
|
};
|
|
190
|
-
await
|
|
191
|
-
addDeclarationTemplates(ctx);
|
|
192
|
-
|
|
193
|
-
references.push({ path: resolve(
|
|
194
|
-
references.push({ path: resolve(
|
|
209
|
+
await regenerateImports();
|
|
210
|
+
addDeclarationTemplates(ctx, options);
|
|
211
|
+
nuxt.hook("prepare:types", ({ references }) => {
|
|
212
|
+
references.push({ path: resolve(nuxt.options.buildDir, "types/imports.d.ts") });
|
|
213
|
+
references.push({ path: resolve(nuxt.options.buildDir, "imports.d.ts") });
|
|
195
214
|
});
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
215
|
+
const templates = [
|
|
216
|
+
"types/imports.d.ts",
|
|
217
|
+
"imports.d.ts",
|
|
218
|
+
"imports.mjs"
|
|
219
|
+
];
|
|
220
|
+
nuxt.hook("builder:watch", async (_, path) => {
|
|
221
|
+
const _resolved = resolve(nuxt.options.srcDir, path);
|
|
222
|
+
if (composablesDirs.find((dir) => _resolved.startsWith(dir))) {
|
|
223
|
+
await updateTemplates({
|
|
224
|
+
filter: (template) => templates.includes(template.filename)
|
|
225
|
+
});
|
|
226
|
+
}
|
|
200
227
|
});
|
|
201
|
-
|
|
202
|
-
await
|
|
228
|
+
nuxt.hook("builder:generateApp", async () => {
|
|
229
|
+
await regenerateImports();
|
|
203
230
|
});
|
|
204
231
|
}
|
|
205
232
|
});
|
|
206
|
-
function addDeclarationTemplates(ctx) {
|
|
233
|
+
function addDeclarationTemplates(ctx, options) {
|
|
207
234
|
const nuxt = useNuxt();
|
|
208
235
|
const stripExtension = (path) => path.replace(/\.[a-z]+$/, "");
|
|
209
236
|
const resolved = {};
|
|
@@ -219,49 +246,64 @@ function addDeclarationTemplates(ctx) {
|
|
|
219
246
|
};
|
|
220
247
|
addTemplate({
|
|
221
248
|
filename: "imports.d.ts",
|
|
222
|
-
getContents: () => ctx.toExports()
|
|
249
|
+
getContents: () => ctx.toExports(nuxt.options.buildDir)
|
|
223
250
|
});
|
|
224
251
|
addTemplate({
|
|
225
|
-
filename: "types/
|
|
226
|
-
getContents: () => `// Generated by auto imports
|
|
227
|
-
${ctx.
|
|
252
|
+
filename: "types/imports.d.ts",
|
|
253
|
+
getContents: async () => `// Generated by auto imports
|
|
254
|
+
${options.autoImport ? await ctx.generateTypeDeclarations({ resolvePath: r }) : "// Implicit auto importing is disabled, you can use explicitly import from `#imports` instead."}`
|
|
228
255
|
});
|
|
229
256
|
}
|
|
230
257
|
|
|
231
|
-
async function
|
|
258
|
+
async function resolveFiles(dir) {
|
|
232
259
|
const nuxt = useNuxt();
|
|
233
|
-
const
|
|
234
|
-
const allRoutes = (await Promise.all(
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
260
|
+
const dirs = [resolve(nuxt.options.srcDir, dir)];
|
|
261
|
+
const allRoutes = (await Promise.all(
|
|
262
|
+
dirs.map(async (dir2) => {
|
|
263
|
+
const files = await resolveFilesFlow(dir2, `**/*{${nuxt.options.extensions.join(",")}}`);
|
|
264
|
+
files.sort();
|
|
265
|
+
return files.filter((file) => {
|
|
266
|
+
if (file.includes(" copy"))
|
|
267
|
+
return false;
|
|
268
|
+
if (!fs.readFileSync(file, "utf8").includes("export"))
|
|
269
|
+
return false;
|
|
270
|
+
return true;
|
|
271
|
+
}).map((file) => {
|
|
272
|
+
const segments = relative(dir2, file).replace(new RegExp(`${escapeRE(extname(file))}$`), "").split("/").join("_");
|
|
273
|
+
return {
|
|
274
|
+
file,
|
|
275
|
+
name: camelCase(segments)
|
|
276
|
+
};
|
|
277
|
+
});
|
|
278
|
+
})
|
|
279
|
+
)).flat();
|
|
245
280
|
return allRoutes;
|
|
246
281
|
}
|
|
247
|
-
function
|
|
248
|
-
const imports =
|
|
282
|
+
function normalizeExports(files) {
|
|
283
|
+
const imports = files.map((page) => genImport(page.file, page.name)).join("\n");
|
|
284
|
+
const exports = files.reduce((acc, curr) => {
|
|
285
|
+
const name = curr.name;
|
|
286
|
+
return `${name}:typeof ${name}==='function'?${name}():${name},${acc}`;
|
|
287
|
+
}, "");
|
|
249
288
|
return {
|
|
250
289
|
imports,
|
|
251
|
-
exports
|
|
252
|
-
const name = curr.name;
|
|
253
|
-
return `${name}:typeof ${name}==='function'?${name}():${name},${acc}`;
|
|
254
|
-
}, "")
|
|
290
|
+
exports
|
|
255
291
|
};
|
|
256
292
|
}
|
|
257
293
|
|
|
258
294
|
const pagesTypeTemplate = {
|
|
259
|
-
filename: "pages.d.ts",
|
|
295
|
+
filename: "types/pages.d.ts",
|
|
260
296
|
getContents: ({ options }) => `// Generated by pages discovery
|
|
261
297
|
export {}
|
|
262
298
|
declare global {
|
|
299
|
+
type ArrElement<ArrType> = ArrType extends readonly (infer ElementType)[]
|
|
300
|
+
? ElementType
|
|
301
|
+
: never;
|
|
263
302
|
|
|
264
|
-
${options.pages.map((c) =>
|
|
303
|
+
${options.pages.map((c) => {
|
|
304
|
+
const _type = `ArrElement<typeof ${genDynamicImport(isAbsolute(c.file) ? relative(join(options.buildDir, "types"), c.file) : c.file, { wrapper: false })}['default']>`;
|
|
305
|
+
return `export type ${pascalCase(c.name)}Context=Awaited<ReturnType<${_type}['locales']['es-ec']['context']>>`;
|
|
306
|
+
}).join("\n")}
|
|
265
307
|
}
|
|
266
308
|
export const pagesNames: string[]
|
|
267
309
|
`.replaceAll(".ts", "")
|
|
@@ -275,29 +317,44 @@ const pagesModule = defineNuxtModule({
|
|
|
275
317
|
const runtimeDir = resolve(distDir, "pages/runtime");
|
|
276
318
|
flow.options.alias["#_pages"] = runtimeDir;
|
|
277
319
|
const pages = [];
|
|
278
|
-
const
|
|
320
|
+
const contexts = [];
|
|
321
|
+
const options = { pages, buildDir: flow.options.buildDir, contexts };
|
|
279
322
|
addTemplate({
|
|
280
323
|
...pagesTypeTemplate,
|
|
281
324
|
options
|
|
282
325
|
});
|
|
283
326
|
const pagesDirs = [{ path: resolve(flow.options.srcDir, flow.options.dir.pages) }];
|
|
284
327
|
flow.options.alias["#pages"] = resolve(flow.options.buildDir, "pages.mjs");
|
|
328
|
+
flow.options.alias["#pagesContexts"] = resolve(flow.options.buildDir, "pages.contexts.mjs");
|
|
285
329
|
addTemplate({
|
|
286
330
|
filename: "pages.mjs",
|
|
287
331
|
async getContents({ options: options2 }) {
|
|
288
|
-
const { exports, imports } =
|
|
289
|
-
|
|
332
|
+
const { exports, imports } = normalizeExports(options2.pages);
|
|
333
|
+
const module = [imports, `export default {${exports}}`].join("\n");
|
|
334
|
+
return module;
|
|
335
|
+
},
|
|
336
|
+
options
|
|
337
|
+
});
|
|
338
|
+
addTemplate({
|
|
339
|
+
filename: "pages.contexts.mjs",
|
|
340
|
+
async getContents({ options: options2 }) {
|
|
341
|
+
const { exports, imports } = normalizeExports(options2.contexts);
|
|
342
|
+
const module = [imports, `export default {${exports}}`].join("\n");
|
|
343
|
+
return module;
|
|
290
344
|
},
|
|
291
345
|
options
|
|
292
346
|
});
|
|
293
347
|
flow.hook("app:templates", async () => {
|
|
294
|
-
options.pages = await
|
|
348
|
+
options.pages = await resolveFiles(flow.options.dir?.pages || "pages");
|
|
349
|
+
});
|
|
350
|
+
flow.hook("app:templates", async () => {
|
|
351
|
+
options.contexts = await resolveFiles("shared/contexts");
|
|
295
352
|
});
|
|
296
353
|
flow.hook("prepare:types", ({ references }) => {
|
|
297
|
-
references.push({ path: resolve(flow.options.buildDir, "pages.d.ts") });
|
|
354
|
+
references.push({ path: resolve(flow.options.buildDir, "types/pages.d.ts") });
|
|
298
355
|
});
|
|
299
356
|
flow.hook("builder:watch", async (event, path) => {
|
|
300
|
-
if (!["add", "unlink"].includes(event))
|
|
357
|
+
if (!["add", "unlink", "change"].includes(event))
|
|
301
358
|
return;
|
|
302
359
|
if (path.includes(" copy"))
|
|
303
360
|
return;
|
|
@@ -305,124 +362,28 @@ const pagesModule = defineNuxtModule({
|
|
|
305
362
|
if (pagesDirs.find((dir) => fPath.startsWith(dir.path)))
|
|
306
363
|
await flow.callHook("builder:generateApp");
|
|
307
364
|
});
|
|
308
|
-
addPlugin(
|
|
309
|
-
}
|
|
310
|
-
});
|
|
311
|
-
|
|
312
|
-
const createClient = async (flow) => {
|
|
313
|
-
let vite;
|
|
314
|
-
if (globalThis.viteClient) {
|
|
315
|
-
vite = globalThis.viteClient;
|
|
316
|
-
} else {
|
|
317
|
-
vite = await createServer({
|
|
318
|
-
root: resolve(flow.options.rootDir),
|
|
319
|
-
base: "/_vite/",
|
|
320
|
-
build: {
|
|
321
|
-
manifest: true
|
|
322
|
-
},
|
|
323
|
-
server: {
|
|
324
|
-
watch: {
|
|
325
|
-
ignored: ["**/.env/**", "**/.env*"]
|
|
326
|
-
},
|
|
327
|
-
middlewareMode: "ssr"
|
|
328
|
-
}
|
|
329
|
-
});
|
|
330
|
-
globalThis.viteClient = vite;
|
|
331
|
-
}
|
|
332
|
-
const _doReload = () => {
|
|
333
|
-
if (vite)
|
|
334
|
-
vite?.ws?.send({ type: "full-reload" });
|
|
335
|
-
};
|
|
336
|
-
const doReload = debounce(_doReload, 60);
|
|
337
|
-
flow.hook("bundler:change", () => {
|
|
338
|
-
doReload();
|
|
339
|
-
});
|
|
340
|
-
flow.hook("close", async () => {
|
|
341
|
-
vite.restart();
|
|
342
|
-
});
|
|
343
|
-
return vite;
|
|
344
|
-
};
|
|
345
|
-
const builClient = async (flow) => {
|
|
346
|
-
return await build$1({
|
|
347
|
-
root: flow.options.rootDir,
|
|
348
|
-
mode: "production",
|
|
349
|
-
build: {
|
|
350
|
-
assetsDir: "scripts",
|
|
351
|
-
target: "es2017",
|
|
352
|
-
outDir: ".vite",
|
|
353
|
-
manifest: true
|
|
354
|
-
}
|
|
355
|
-
});
|
|
356
|
-
};
|
|
357
|
-
|
|
358
|
-
const viteModule = defineFlowModule({
|
|
359
|
-
meta: {
|
|
360
|
-
name: "vite-client",
|
|
361
|
-
configKey: "bundle"
|
|
362
|
-
},
|
|
363
|
-
defaults: {
|
|
364
|
-
route: "/_vite/",
|
|
365
|
-
dir: "/client/pages"
|
|
366
|
-
},
|
|
367
|
-
async setup(_options, flow) {
|
|
368
|
-
const runtimeDir = resolve(distDir, "vite-client/runtime");
|
|
369
|
-
flow.options.alias["#viteManifest"] = resolve(flow.options.buildDir, "viteManifest.mjs");
|
|
370
|
-
let vite;
|
|
371
|
-
if (flow.options.dev) {
|
|
372
|
-
flow.hook("nitro:init", async (nitro) => {
|
|
373
|
-
vite = await createClient(flow);
|
|
374
|
-
nitro.options.devHandlers.push({
|
|
375
|
-
handler: vite.middlewares,
|
|
376
|
-
route: _options.route
|
|
377
|
-
});
|
|
378
|
-
});
|
|
379
|
-
addTemplate({
|
|
380
|
-
filename: "viteManifest.mjs",
|
|
381
|
-
async getContents() {
|
|
382
|
-
return [
|
|
383
|
-
"export default {",
|
|
384
|
-
`head:()=>'<script type="module" src="${joinURL("/", _options.route, "/@vite/client")}"><\/script>'`,
|
|
385
|
-
",",
|
|
386
|
-
`body: (bundle)=>\`<script type="module" src="${joinURL("/", _options.route, _options.dir)}/\${bundle}.ts"><\/script>\``,
|
|
387
|
-
"}"
|
|
388
|
-
].join("\n");
|
|
389
|
-
}
|
|
390
|
-
});
|
|
391
|
-
} else {
|
|
392
|
-
const file = resolve(flow.options.rootDir, ".vite/manifest.json");
|
|
393
|
-
addTemplate({
|
|
394
|
-
filename: "viteManifest.mjs",
|
|
395
|
-
async getContents() {
|
|
396
|
-
return [
|
|
397
|
-
"import fs from 'fs';",
|
|
398
|
-
`export default ()=>JSON.parse(fs.readFileSync("${file}", 'utf8'))`
|
|
399
|
-
].join("\n");
|
|
400
|
-
}
|
|
401
|
-
});
|
|
402
|
-
flow.hook("build:before", async () => {
|
|
403
|
-
const start = Date.now();
|
|
404
|
-
logger$1.info("Building client...");
|
|
405
|
-
await builClient(flow);
|
|
406
|
-
logger$1.success(`Client build in ${Date.now() - start}ms`);
|
|
407
|
-
});
|
|
408
|
-
flow.hook("generate:before", async () => {
|
|
409
|
-
const files = resolve(flow.options.rootDir, ".vite/scripts");
|
|
410
|
-
await fse.copy(files, resolve(flow.options.generate.dir, "assets"));
|
|
411
|
-
});
|
|
412
|
-
}
|
|
413
|
-
addPlugin({ src: resolve(runtimeDir, "plugin") });
|
|
365
|
+
addPlugin(resolve(runtimeDir, "pages"));
|
|
414
366
|
}
|
|
415
367
|
});
|
|
416
368
|
|
|
417
369
|
const _require = createRequire(import.meta.url);
|
|
418
370
|
const ImportProtectionPlugin = createUnplugin((options) => {
|
|
419
371
|
const cache = {};
|
|
372
|
+
const importersToExclude = options?.exclude || [];
|
|
420
373
|
return {
|
|
421
|
-
name: "
|
|
374
|
+
name: "nuxt:import-protection",
|
|
422
375
|
enforce: "pre",
|
|
423
376
|
resolveId(id, importer) {
|
|
377
|
+
if (!importer)
|
|
378
|
+
return;
|
|
379
|
+
if (id.startsWith("."))
|
|
380
|
+
id = join(importer, "..", id);
|
|
381
|
+
if (isAbsolute(id))
|
|
382
|
+
id = relative(options.rootDir, id);
|
|
383
|
+
if (importersToExclude.some((p) => typeof p === "string" ? importer === p : p.test(importer)))
|
|
384
|
+
return;
|
|
424
385
|
const invalidImports = options.patterns.filter(([pattern]) => pattern instanceof RegExp ? pattern.test(id) : pattern === id);
|
|
425
|
-
let matched;
|
|
386
|
+
let matched = false;
|
|
426
387
|
for (const match of invalidImports) {
|
|
427
388
|
cache[id] = cache[id] || /* @__PURE__ */ new Map();
|
|
428
389
|
const [pattern, warning] = match;
|
|
@@ -441,25 +402,38 @@ const ImportProtectionPlugin = createUnplugin((options) => {
|
|
|
441
402
|
});
|
|
442
403
|
|
|
443
404
|
async function initNitro(flow) {
|
|
444
|
-
const { handlers, devHandlers } = await resolveHandlers(flow);
|
|
445
405
|
const _nitroConfig = flow.options.nitro || {};
|
|
446
406
|
globalThis.generate = {};
|
|
407
|
+
const scanDirs = flow.options._layers.map((layer) => (layer.config.serverDir || layer.config.srcDir) && resolve(layer.cwd, layer.config.serverDir || resolve(layer.config.srcDir, "server"))).filter(Boolean);
|
|
447
408
|
const nitroConfig = defu(_nitroConfig, {
|
|
448
409
|
rootDir: flow.options.rootDir,
|
|
449
|
-
|
|
410
|
+
workspaceDir: flow.options.workspaceDir,
|
|
411
|
+
srcDir: flow.options.serverDir,
|
|
450
412
|
dev: flow.options.dev,
|
|
451
|
-
preset: flow.options.dev ? "nitro-dev" : void 0,
|
|
452
413
|
buildDir: flow.options.buildDir,
|
|
453
|
-
scanDirs
|
|
414
|
+
scanDirs,
|
|
454
415
|
renderer: resolve(distDir, "core/runtime/nitro/renderer"),
|
|
416
|
+
// errorHandler: resolve(distDir, 'core/runtime/nitro/error'),
|
|
455
417
|
nodeModulesDirs: flow.options.modulesDir,
|
|
456
|
-
handlers
|
|
418
|
+
handlers: [
|
|
419
|
+
//* Important middleware
|
|
420
|
+
{
|
|
421
|
+
middleware: true,
|
|
422
|
+
handler: resolve(distDir, "core/runtime/nitro/flow")
|
|
423
|
+
},
|
|
424
|
+
...flow.options.serverHandlers
|
|
425
|
+
],
|
|
426
|
+
output: {
|
|
427
|
+
dir: resolve(flow.options.buildDir, "output")
|
|
428
|
+
},
|
|
457
429
|
devHandlers: [],
|
|
458
430
|
baseURL: flow.options.app.baseURL,
|
|
431
|
+
virtual: {},
|
|
459
432
|
runtimeConfig: {
|
|
460
433
|
...flow.options.runtimeConfig,
|
|
461
434
|
app: {
|
|
462
435
|
...flow.options.runtimeConfig.app,
|
|
436
|
+
baseURL: flow.options.dev ? "/" : flow.options.app.baseURL,
|
|
463
437
|
rootDir: flow.options.rootDir,
|
|
464
438
|
locale: flow.options.locale
|
|
465
439
|
},
|
|
@@ -474,62 +448,81 @@ async function initNitro(flow) {
|
|
|
474
448
|
},
|
|
475
449
|
publicAssets: [
|
|
476
450
|
{
|
|
477
|
-
baseURL: flow.options.app.buildAssetsDir,
|
|
451
|
+
// baseURL: flow.options.app.buildAssetsDir,
|
|
478
452
|
dir: resolve(flow.options.buildDir, "dist/client")
|
|
479
453
|
},
|
|
480
454
|
...flow.options._layers.map((layer) => join(layer.config.srcDir, layer.config.dir?.public || "public")).filter((dir) => existsSync(dir)).map((dir) => ({ dir }))
|
|
481
455
|
],
|
|
482
456
|
prerender: {
|
|
483
|
-
crawlLinks: flow.options._generate
|
|
484
|
-
routes: [].concat(flow.options._generate ? ["/_urls", ...flow.options.generate.routes] : [])
|
|
457
|
+
crawlLinks: flow.options._generate ?? void 0,
|
|
458
|
+
routes: [].concat(flow.options.generate.routes).concat(flow.options._generate ? ["/_urls", ...flow.options.generate.routes] : [])
|
|
485
459
|
},
|
|
486
|
-
|
|
460
|
+
sourceMap: flow.options.sourcemap.server,
|
|
487
461
|
externals: {
|
|
488
462
|
inline: [
|
|
489
463
|
...flow.options.dev ? [] : ["eta", "@monkeyplus/", "@vue/", "@nuxt/", flow.options.buildDir],
|
|
490
|
-
"@monkeyplus/flow/dist"
|
|
464
|
+
"@monkeyplus/flow/dist",
|
|
465
|
+
// Dev windows
|
|
466
|
+
"C:/Users/gnu/Documents/GitHub/flow/packages/flow/dist/app",
|
|
467
|
+
distDir
|
|
491
468
|
]
|
|
492
469
|
},
|
|
470
|
+
// preset: flow.options.dev ? 'nitro-dev' : undefined,
|
|
471
|
+
// output: {
|
|
472
|
+
// dir: resolve(flow.options.buildDir, 'output'),
|
|
473
|
+
// },
|
|
474
|
+
replace: {
|
|
475
|
+
"process.dev": flow.options.dev
|
|
476
|
+
},
|
|
493
477
|
alias: {
|
|
478
|
+
// Vue 3 mocks
|
|
494
479
|
"estree-walker": "unenv/runtime/mock/proxy",
|
|
495
480
|
"@babel/parser": "unenv/runtime/mock/proxy",
|
|
481
|
+
// Paths
|
|
496
482
|
"#paths": resolve(distDir, "core/runtime/nitro/paths"),
|
|
483
|
+
// Shortcut to server main file
|
|
497
484
|
"#server": "#build/dist/server/server.mjs",
|
|
485
|
+
// Nuxt aliases
|
|
498
486
|
...flow.options.alias
|
|
499
487
|
},
|
|
500
488
|
rollupConfig: {
|
|
501
|
-
plugins: []
|
|
502
|
-
|
|
489
|
+
plugins: []
|
|
490
|
+
},
|
|
491
|
+
// watchOptions:{}
|
|
492
|
+
//* Include to refresh server
|
|
493
|
+
devServer: {
|
|
494
|
+
watch: [resolve(flow.options.buildDir, "dist/server/server.mjs")]
|
|
503
495
|
}
|
|
504
496
|
});
|
|
497
|
+
nitroConfig.rollupConfig.plugins.push(
|
|
498
|
+
ImportProtectionPlugin.rollup({
|
|
499
|
+
rootDir: flow.options.rootDir,
|
|
500
|
+
patterns: [
|
|
501
|
+
...["#app", /^#build(\/|$)/].map((p) => [p, "Vue app aliases are not allowed in server routes."])
|
|
502
|
+
],
|
|
503
|
+
exclude: [/core[\\/]runtime[\\/]nitro[\\/]renderer/]
|
|
504
|
+
})
|
|
505
|
+
);
|
|
505
506
|
await flow.callHook("nitro:config", nitroConfig);
|
|
506
|
-
nitroConfig.handlers.unshift({
|
|
507
|
-
middleware: true,
|
|
508
|
-
handler: resolve(distDir, "core/runtime/nitro/flow")
|
|
509
|
-
});
|
|
510
507
|
const nitro = await createNitro(nitroConfig);
|
|
508
|
+
flow._nitro = nitro;
|
|
509
|
+
flow.nitro = nitro;
|
|
511
510
|
await flow.callHook("nitro:init", nitro);
|
|
512
511
|
nitro.vfs = flow.vfs = nitro.vfs || flow.vfs || {};
|
|
513
512
|
flow.hook("close", () => nitro.hooks.callHook("close"));
|
|
514
|
-
nitro.hooks.hook("
|
|
515
|
-
|
|
516
|
-
rootDir: flow.options.rootDir,
|
|
517
|
-
patterns: [
|
|
518
|
-
...["#app", /^#build(\/|$)/].map((p) => [p, "Flow app aliases are not allowed in server routes."])
|
|
519
|
-
]
|
|
520
|
-
});
|
|
521
|
-
nitro2.options.rollupConfig.plugins.push(plugin);
|
|
513
|
+
nitro.hooks.hook("prerender:routes", (routes) => {
|
|
514
|
+
flow.callHook("prerender:routes", { routes });
|
|
522
515
|
});
|
|
523
|
-
const
|
|
524
|
-
nitro.options.devHandlers.unshift({ handler:
|
|
525
|
-
nitro.options.devHandlers.push(...
|
|
516
|
+
const devMiddlewareHandler = dynamicEventHandler();
|
|
517
|
+
nitro.options.devHandlers.unshift({ handler: devMiddlewareHandler });
|
|
518
|
+
nitro.options.devHandlers.push(...flow.options.devServerHandlers);
|
|
526
519
|
nitro.options.handlers.unshift({
|
|
527
|
-
route: "/
|
|
520
|
+
route: "/__nuxt_error",
|
|
528
521
|
lazy: true,
|
|
529
522
|
handler: resolve(distDir, "core/runtime/nitro/renderer")
|
|
530
523
|
});
|
|
531
524
|
flow.hook("prepare:types", async (opts) => {
|
|
532
|
-
if (flow.options.
|
|
525
|
+
if (!flow.options.dev) {
|
|
533
526
|
await scanHandlers(nitro);
|
|
534
527
|
await writeTypes(nitro);
|
|
535
528
|
}
|
|
@@ -538,21 +531,15 @@ async function initNitro(flow) {
|
|
|
538
531
|
flow.hook("build:done", async () => {
|
|
539
532
|
await flow.callHook("nitro:build:before", nitro);
|
|
540
533
|
if (flow.options.dev) {
|
|
541
|
-
await build$
|
|
534
|
+
await build$1(nitro);
|
|
542
535
|
} else {
|
|
536
|
+
console.log("build", flow.options._generate);
|
|
543
537
|
await prepare(nitro);
|
|
544
538
|
await copyPublicAssets(nitro);
|
|
545
539
|
await prerender(nitro);
|
|
546
540
|
if (!flow.options._generate) {
|
|
547
|
-
await build$
|
|
541
|
+
await build$1(nitro);
|
|
548
542
|
} else {
|
|
549
|
-
const nitroDev = await createNitro({
|
|
550
|
-
...nitro.options._config,
|
|
551
|
-
rootDir: nitro.options.rootDir,
|
|
552
|
-
logLevel: 0,
|
|
553
|
-
preset: "nitro-prerender"
|
|
554
|
-
});
|
|
555
|
-
flow.server = nitroDev;
|
|
556
543
|
const distDir2 = resolve(flow.options.rootDir, "dist");
|
|
557
544
|
if (!existsSync(distDir2))
|
|
558
545
|
await promises.symlink(nitro.options.output.publicDir, distDir2, "junction").catch(() => {
|
|
@@ -561,37 +548,27 @@ async function initNitro(flow) {
|
|
|
561
548
|
}
|
|
562
549
|
});
|
|
563
550
|
if (flow.options.dev) {
|
|
564
|
-
flow.hook("
|
|
565
|
-
|
|
551
|
+
flow.hook("vite:compiled", () => {
|
|
552
|
+
flow.server.reload();
|
|
566
553
|
});
|
|
567
|
-
flow.hook("server:
|
|
568
|
-
|
|
554
|
+
flow.hook("server:devHandler", (h) => {
|
|
555
|
+
devMiddlewareHandler.set(h);
|
|
569
556
|
});
|
|
570
557
|
flow.server = createDevServer(nitro);
|
|
571
|
-
flow.hook("build:resources", () => {
|
|
572
|
-
flow.server.reload();
|
|
573
|
-
});
|
|
574
558
|
const waitUntilCompile = new Promise((resolve2) => nitro.hooks.hook("compiled", () => resolve2()));
|
|
575
559
|
flow.hook("build:done", () => waitUntilCompile);
|
|
576
560
|
}
|
|
577
561
|
}
|
|
578
|
-
async function resolveHandlers(flow) {
|
|
579
|
-
const handlers = [...flow.options.serverHandlers];
|
|
580
|
-
const devHandlers = [...flow.options.devServerHandlers];
|
|
581
|
-
return {
|
|
582
|
-
handlers,
|
|
583
|
-
devHandlers
|
|
584
|
-
};
|
|
585
|
-
}
|
|
586
562
|
|
|
587
563
|
const addModuleTranspiles = (opts = {}) => {
|
|
588
564
|
const flow = useNuxt();
|
|
589
565
|
const modules = [
|
|
590
566
|
...opts.additionalModules || [],
|
|
567
|
+
// ...flow.options.buildModules,
|
|
591
568
|
...flow.options.modules,
|
|
592
569
|
...flow.options._modules
|
|
593
570
|
].map((m) => typeof m === "string" ? m : Array.isArray(m) ? m[0] : m.src).filter((m) => typeof m === "string").map((m) => m.split("node_modules/").pop());
|
|
594
|
-
flow.options.build.transpile = flow.options.build.transpile.map((m) => typeof m === "string" ? m.split("node_modules/").pop() : m);
|
|
571
|
+
flow.options.build.transpile = flow.options.build.transpile.map((m) => typeof m === "string" ? m.split("node_modules/").pop() : m).filter((x) => !!x);
|
|
595
572
|
function isTranspilePresent(mod) {
|
|
596
573
|
return flow.options.build.transpile.some((t) => !(t instanceof Function) && (t instanceof RegExp ? t.test(mod) : new RegExp(t).test(mod)));
|
|
597
574
|
}
|
|
@@ -604,7 +581,10 @@ const addModuleTranspiles = (opts = {}) => {
|
|
|
604
581
|
function createFlow(options) {
|
|
605
582
|
const hooks = createHooks();
|
|
606
583
|
const flow = {
|
|
607
|
-
|
|
584
|
+
//* Include nuxt version
|
|
585
|
+
_version: "3.0.0",
|
|
586
|
+
//* Include version
|
|
587
|
+
// @ts-ignore
|
|
608
588
|
version,
|
|
609
589
|
options,
|
|
610
590
|
hooks,
|
|
@@ -618,10 +598,12 @@ function createFlow(options) {
|
|
|
618
598
|
return flow;
|
|
619
599
|
}
|
|
620
600
|
async function initFlow(flow) {
|
|
601
|
+
flow.hooks.addHooks(flow.options.hooks);
|
|
621
602
|
nuxtCtx.set(flow);
|
|
622
603
|
flow.hook("close", () => nuxtCtx.unset());
|
|
623
|
-
await flow.callHook("modules:before"
|
|
604
|
+
await flow.callHook("modules:before");
|
|
624
605
|
const modulesToInstall = [
|
|
606
|
+
// ...flow.options.buildModules,
|
|
625
607
|
...flow.options.modules,
|
|
626
608
|
...flow.options._modules
|
|
627
609
|
];
|
|
@@ -631,17 +613,26 @@ async function initFlow(flow) {
|
|
|
631
613
|
else
|
|
632
614
|
await installModule(m, {});
|
|
633
615
|
}
|
|
634
|
-
await flow.callHook("modules:done"
|
|
635
|
-
|
|
616
|
+
await flow.callHook("modules:done");
|
|
617
|
+
flow.options.build.transpile = flow.options.build.transpile.map((t) => typeof t === "string" ? normalize(t) : t);
|
|
618
|
+
addModuleTranspiles();
|
|
636
619
|
await initNitro(flow);
|
|
637
620
|
await flow.callHook("ready", flow);
|
|
638
621
|
}
|
|
639
622
|
async function loadFlow(opts) {
|
|
623
|
+
const start1 = Date.now();
|
|
640
624
|
const options = await loadFlowConfig(opts);
|
|
625
|
+
logger.info(`Config loading in ${Date.now() - start1}ms`);
|
|
641
626
|
options.appDir = resolve(distDir, "app");
|
|
642
627
|
options.alias["#app"] = resolve(distDir, "app/index");
|
|
643
628
|
options._majorVersion = 3;
|
|
644
|
-
options._modules.push(pagesModule, metaModule
|
|
629
|
+
options._modules.push(pagesModule, metaModule);
|
|
630
|
+
options._modules.push([importsModule, {
|
|
631
|
+
transform: {
|
|
632
|
+
include: options._layers.filter((i) => i.cwd && i.cwd.includes("node_modules")).map((i) => new RegExp(`(^|\\/)${escapeRE(i.cwd.split("node_modules/").pop())}(\\/|$)(?!node_modules\\/)`))
|
|
633
|
+
}
|
|
634
|
+
}]);
|
|
635
|
+
options.modulesDir.push(resolve(options.workspaceDir, "node_modules"));
|
|
645
636
|
options.modulesDir.push(resolve(pkgDir, "node_modules"));
|
|
646
637
|
const flow = createFlow(options);
|
|
647
638
|
if (opts.ready !== false)
|
|
@@ -656,11 +647,17 @@ const serverPluginTemplate = {
|
|
|
656
647
|
filename: "plugins/server.mjs",
|
|
657
648
|
getContents(ctx) {
|
|
658
649
|
const serverPlugins = ctx.app.plugins;
|
|
650
|
+
const exports = [];
|
|
651
|
+
const imports = [];
|
|
652
|
+
for (const plugin of serverPlugins) {
|
|
653
|
+
const path = relative(ctx.nuxt.options.rootDir, plugin.src);
|
|
654
|
+
const variable = `${genSafeVariableName(path).replace(/_(45|46|47)/g, "_")}_${hash(path)}`;
|
|
655
|
+
exports.push(variable);
|
|
656
|
+
imports.push(genImport(plugin.src, variable));
|
|
657
|
+
}
|
|
659
658
|
return [
|
|
660
|
-
|
|
661
|
-
`export default ${genArrayFromRaw(
|
|
662
|
-
...serverPlugins.map((p) => templateUtils.importName(p.src))
|
|
663
|
-
])}`
|
|
659
|
+
...imports,
|
|
660
|
+
`export default ${genArrayFromRaw(exports)}`
|
|
664
661
|
].join("\n");
|
|
665
662
|
}
|
|
666
663
|
};
|
|
@@ -689,43 +686,52 @@ export { }
|
|
|
689
686
|
`;
|
|
690
687
|
}
|
|
691
688
|
};
|
|
692
|
-
const adHocModules = ["
|
|
689
|
+
const adHocModules = ["imports", "meta", "pages"];
|
|
693
690
|
const schemaTemplate = {
|
|
694
691
|
filename: "types/schema.d.ts",
|
|
695
|
-
getContents: ({ nuxt }) => {
|
|
692
|
+
getContents: async ({ nuxt }) => {
|
|
696
693
|
const moduleInfo = nuxt.options._installedModules.map((m) => ({
|
|
697
694
|
...m.meta || {},
|
|
698
695
|
importName: m.entryPath || m.meta?.name
|
|
699
696
|
})).filter((m) => m.configKey && m.name && !adHocModules.includes(m.name));
|
|
697
|
+
const relativeRoot = relative(resolve(nuxt.options.buildDir, "types"), nuxt.options.rootDir);
|
|
700
698
|
return [
|
|
701
699
|
"import { FlowModule } from '@monkeyplus/flow-schema'",
|
|
702
700
|
"declare module '@monkeyplus/flow-schema' {",
|
|
703
701
|
" interface FlowConfig {",
|
|
704
|
-
...moduleInfo.filter(Boolean).map(
|
|
702
|
+
...moduleInfo.filter(Boolean).map(
|
|
703
|
+
(meta) => ` [${genString(meta.configKey)}]?: typeof ${genDynamicImport(meta.importName.startsWith(".") ? `./${join(relativeRoot, meta.importName)}` : meta.importName, { wrapper: false })}.default extends FlowModule<infer O> ? Partial<O> : Record<string, any>`
|
|
704
|
+
),
|
|
705
705
|
" }",
|
|
706
|
-
generateTypes(
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
706
|
+
generateTypes(
|
|
707
|
+
await resolveSchema(Object.fromEntries(Object.entries(nuxt.options.runtimeConfig).filter(([key]) => key !== "public"))),
|
|
708
|
+
{
|
|
709
|
+
interfaceName: "RuntimeConfig",
|
|
710
|
+
addExport: false,
|
|
711
|
+
addDefaults: false,
|
|
712
|
+
allowExtraKeys: false,
|
|
713
|
+
indentation: 2
|
|
714
|
+
}
|
|
715
|
+
),
|
|
716
|
+
generateTypes(
|
|
717
|
+
await resolveSchema(nuxt.options.runtimeConfig.public),
|
|
718
|
+
{
|
|
719
|
+
interfaceName: "PublicRuntimeConfig",
|
|
720
|
+
addExport: false,
|
|
721
|
+
addDefaults: false,
|
|
722
|
+
allowExtraKeys: false,
|
|
723
|
+
indentation: 2
|
|
724
|
+
}
|
|
725
|
+
),
|
|
720
726
|
"}"
|
|
721
727
|
].join("\n");
|
|
722
728
|
}
|
|
723
729
|
};
|
|
724
730
|
const publicPathTemplate = {
|
|
725
731
|
filename: "paths.mjs",
|
|
726
|
-
getContents({ nuxt }) {
|
|
732
|
+
async getContents({ nuxt }) {
|
|
727
733
|
return [
|
|
728
|
-
|
|
734
|
+
`import { joinURL } from '${await _resolveId("ufo")}'`,
|
|
729
735
|
!nuxt.options.dev && "import { useRuntimeConfig } from '#internal/nitro'",
|
|
730
736
|
nuxt.options.dev ? `const appConfig = ${JSON.stringify(nuxt.options.app)}` : "const appConfig = useRuntimeConfig().app",
|
|
731
737
|
"export const baseURL = () => appConfig.baseURL",
|
|
@@ -738,15 +744,39 @@ const publicPathTemplate = {
|
|
|
738
744
|
].filter(Boolean).join("\n");
|
|
739
745
|
}
|
|
740
746
|
};
|
|
747
|
+
function _resolveId(id) {
|
|
748
|
+
return resolvePath(id, {
|
|
749
|
+
url: [
|
|
750
|
+
// @ts-ignore
|
|
751
|
+
global.__NUXT_PREPATHS__,
|
|
752
|
+
import.meta.url,
|
|
753
|
+
process.cwd(),
|
|
754
|
+
// @ts-ignore
|
|
755
|
+
global.__NUXT_PATHS__
|
|
756
|
+
]
|
|
757
|
+
});
|
|
758
|
+
}
|
|
741
759
|
|
|
742
760
|
const defaultTemplates = {
|
|
743
761
|
__proto__: null,
|
|
744
|
-
serverPluginTemplate: serverPluginTemplate,
|
|
745
762
|
pluginsDeclaration: pluginsDeclaration,
|
|
763
|
+
publicPathTemplate: publicPathTemplate,
|
|
746
764
|
schemaTemplate: schemaTemplate,
|
|
747
|
-
|
|
765
|
+
serverPluginTemplate: serverPluginTemplate
|
|
748
766
|
};
|
|
749
767
|
|
|
768
|
+
function uniqueBy(arr, key) {
|
|
769
|
+
const res = [];
|
|
770
|
+
const seen = /* @__PURE__ */ new Set();
|
|
771
|
+
for (const item of arr) {
|
|
772
|
+
if (seen.has(item[key]))
|
|
773
|
+
continue;
|
|
774
|
+
seen.add(item[key]);
|
|
775
|
+
res.push(item);
|
|
776
|
+
}
|
|
777
|
+
return res;
|
|
778
|
+
}
|
|
779
|
+
|
|
750
780
|
function createApp(flow, options = {}) {
|
|
751
781
|
return defu(options, {
|
|
752
782
|
dir: flow.options.srcDir,
|
|
@@ -755,51 +785,95 @@ function createApp(flow, options = {}) {
|
|
|
755
785
|
templates: []
|
|
756
786
|
});
|
|
757
787
|
}
|
|
758
|
-
async function generateApp(flow, app) {
|
|
788
|
+
async function generateApp(flow, app, options) {
|
|
759
789
|
await resolveApp(flow, app);
|
|
760
|
-
app.templates = Object.values(defaultTemplates).concat(
|
|
790
|
+
app.templates = Object.values(defaultTemplates).concat(
|
|
791
|
+
flow.options.build.templates
|
|
792
|
+
);
|
|
761
793
|
await flow.callHook("app:templates", app);
|
|
762
794
|
app.templates = app.templates.map((tmpl) => normalizeTemplate(tmpl));
|
|
763
795
|
const templateContext = { utils: templateUtils, nuxt: flow, app };
|
|
764
|
-
await Promise.all(
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
796
|
+
await Promise.all(
|
|
797
|
+
app.templates.map(async (template) => {
|
|
798
|
+
const contents = await compileTemplate(template, templateContext);
|
|
799
|
+
const fullPath = template.dst || resolve(flow.options.buildDir, template.filename);
|
|
800
|
+
flow.vfs[fullPath] = contents;
|
|
801
|
+
const aliasPath = `#build/${template.filename.replace(/\.\w+$/, "")}`;
|
|
802
|
+
flow.vfs[aliasPath] = contents;
|
|
803
|
+
if (process.platform === "win32")
|
|
804
|
+
flow.vfs[fullPath.replace(/\//g, "\\")] = contents;
|
|
805
|
+
if (template.write) {
|
|
806
|
+
await promises.mkdir(dirname(fullPath), { recursive: true });
|
|
807
|
+
await promises.writeFile(fullPath, contents, "utf8");
|
|
808
|
+
}
|
|
809
|
+
})
|
|
810
|
+
);
|
|
777
811
|
await flow.callHook("app:templatesGenerated", app);
|
|
778
812
|
}
|
|
779
813
|
async function resolveApp(flow, app) {
|
|
780
|
-
app.plugins = [
|
|
814
|
+
app.plugins = [
|
|
815
|
+
...flow.options.plugins.map(normalizePlugin)
|
|
816
|
+
];
|
|
781
817
|
for (const config of flow.options._layers.map((layer) => layer.config)) {
|
|
782
818
|
app.plugins.push(...[
|
|
783
819
|
...config.plugins || [],
|
|
784
|
-
...await resolveFilesFlow(config.srcDir, [
|
|
785
|
-
"plugins/*.{ts,js,mjs,cjs,mts,cts}
|
|
786
|
-
"plugins/*/index.*{ts,js,mjs,cjs,mts,cts}
|
|
787
|
-
])
|
|
820
|
+
...config.srcDir ? await resolveFilesFlow(config.srcDir, [
|
|
821
|
+
`${config.dir?.plugins || "plugins"}/*.{ts,js,mjs,cjs,mts,cts}`,
|
|
822
|
+
`${config.dir?.plugins || "plugins"}/*/index.*{ts,js,mjs,cjs,mts,cts}`
|
|
823
|
+
]) : []
|
|
788
824
|
].map((plugin) => normalizePlugin(plugin)));
|
|
789
825
|
}
|
|
790
|
-
app.
|
|
826
|
+
app.configs = [];
|
|
827
|
+
for (const config of flow.options._layers.map((layer) => layer.config)) {
|
|
828
|
+
const appConfigPath = await findPath(resolve(config.srcDir, "app.config"));
|
|
829
|
+
if (appConfigPath)
|
|
830
|
+
app.configs.push(appConfigPath);
|
|
831
|
+
}
|
|
791
832
|
await flow.callHook("app:resolve", app);
|
|
833
|
+
app.plugins = uniqueBy(app.plugins, "src");
|
|
792
834
|
}
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
835
|
+
|
|
836
|
+
const PREFIX = "virtual:nuxt:";
|
|
837
|
+
function virtual(vfs) {
|
|
838
|
+
const extensions = ["", ".ts", ".vue", ".mjs", ".cjs", ".js", ".json"];
|
|
839
|
+
const resolveWithExt = (id) => {
|
|
840
|
+
for (const ext of extensions) {
|
|
841
|
+
const rId = id + ext;
|
|
842
|
+
if (rId in vfs)
|
|
843
|
+
return rId;
|
|
844
|
+
}
|
|
845
|
+
return null;
|
|
846
|
+
};
|
|
847
|
+
return {
|
|
848
|
+
name: "virtual",
|
|
849
|
+
resolveId(id, importer) {
|
|
850
|
+
if (process.platform === "win32" && isAbsolute(id)) {
|
|
851
|
+
id = resolve(id);
|
|
852
|
+
}
|
|
853
|
+
const resolvedId = resolveWithExt(id);
|
|
854
|
+
if (resolvedId)
|
|
855
|
+
return PREFIX + resolvedId;
|
|
856
|
+
if (importer && !isAbsolute(id)) {
|
|
857
|
+
const importerNoPrefix = importer.startsWith(PREFIX) ? importer.slice(PREFIX.length) : importer;
|
|
858
|
+
const importedDir = dirname(importerNoPrefix);
|
|
859
|
+
const resolved = resolveWithExt(join(importedDir, id));
|
|
860
|
+
if (resolved)
|
|
861
|
+
return PREFIX + resolved;
|
|
862
|
+
}
|
|
863
|
+
return null;
|
|
864
|
+
},
|
|
865
|
+
load(id) {
|
|
866
|
+
if (!id.startsWith(PREFIX))
|
|
867
|
+
return null;
|
|
868
|
+
const idNoPrefix = id.slice(PREFIX.length);
|
|
869
|
+
if (idNoPrefix in vfs) {
|
|
870
|
+
return {
|
|
871
|
+
code: vfs[idNoPrefix],
|
|
872
|
+
map: null
|
|
873
|
+
};
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
};
|
|
803
877
|
}
|
|
804
878
|
|
|
805
879
|
async function warmupViteServer(server, entries) {
|
|
@@ -820,6 +894,11 @@ async function warmupViteServer(server, entries) {
|
|
|
820
894
|
await Promise.all(entries.map((entry) => warmup(entry)));
|
|
821
895
|
}
|
|
822
896
|
|
|
897
|
+
const wpfs = {
|
|
898
|
+
...fse,
|
|
899
|
+
join
|
|
900
|
+
};
|
|
901
|
+
|
|
823
902
|
function cacheDirPlugin(rootDir, name) {
|
|
824
903
|
const optimizeCacheDir = resolve(rootDir, "node_modules/.cache/vite", name);
|
|
825
904
|
return {
|
|
@@ -830,279 +909,63 @@ function cacheDirPlugin(rootDir, name) {
|
|
|
830
909
|
};
|
|
831
910
|
}
|
|
832
911
|
|
|
833
|
-
|
|
834
|
-
...fse,
|
|
835
|
-
join
|
|
836
|
-
};
|
|
837
|
-
|
|
838
|
-
function uniq(arr) {
|
|
839
|
-
return Array.from(new Set(arr));
|
|
840
|
-
}
|
|
841
|
-
const IS_CSS_RE = /\.(?:css|scss|sass|postcss|less|stylus|styl)(\?[^.]+)?$/;
|
|
842
|
-
function isCSS(file) {
|
|
843
|
-
return IS_CSS_RE.test(file);
|
|
844
|
-
}
|
|
845
|
-
function hashId(id) {
|
|
846
|
-
return `$id_${hash(id)}`;
|
|
847
|
-
}
|
|
848
|
-
function hash(input, length = 8) {
|
|
849
|
-
return createHash("sha256").update(input).digest("hex").slice(0, length);
|
|
850
|
-
}
|
|
851
|
-
function readDirRecursively(dir) {
|
|
852
|
-
return readdirSync(dir).reduce((files, file) => {
|
|
853
|
-
const name = join(dir, file);
|
|
854
|
-
const isDirectory2 = statSync(name).isDirectory();
|
|
855
|
-
return isDirectory2 ? [...files, ...readDirRecursively(name)] : [...files, name];
|
|
856
|
-
}, []);
|
|
857
|
-
}
|
|
858
|
-
async function isDirectory(path) {
|
|
859
|
-
try {
|
|
860
|
-
return (await promises.stat(path)).isDirectory();
|
|
861
|
-
} catch (_err) {
|
|
862
|
-
return false;
|
|
863
|
-
}
|
|
864
|
-
}
|
|
865
|
-
|
|
866
|
-
function isExternal(opts, id) {
|
|
867
|
-
const ssrConfig = opts.viteServer.config.ssr;
|
|
868
|
-
const externalOpts = {
|
|
869
|
-
inline: [
|
|
870
|
-
/virtual:/,
|
|
871
|
-
/\.ts$/,
|
|
872
|
-
...ExternalsDefaults.inline,
|
|
873
|
-
...ssrConfig.noExternal
|
|
874
|
-
],
|
|
875
|
-
external: [
|
|
876
|
-
/node_modules/
|
|
877
|
-
],
|
|
878
|
-
resolve: {
|
|
879
|
-
type: "module",
|
|
880
|
-
extensions: [".ts", ".js", ".json", ".vue", ".mjs", ".jsx", ".tsx", ".wasm"]
|
|
881
|
-
}
|
|
882
|
-
};
|
|
883
|
-
return isExternal$1(id, opts.viteServer.config.root, externalOpts);
|
|
884
|
-
}
|
|
885
|
-
async function transformRequest(opts, id) {
|
|
886
|
-
if (id && id.startsWith("/@id/__x00__"))
|
|
887
|
-
id = `\0${id.slice("/@id/__x00__".length)}`;
|
|
888
|
-
if (id && id.startsWith("/@id/"))
|
|
889
|
-
id = id.slice("/@id/".length);
|
|
890
|
-
if (id && id.startsWith("/@fs/")) {
|
|
891
|
-
id = id.slice("/@fs".length);
|
|
892
|
-
if (id.match(/^\/\w:/))
|
|
893
|
-
id = id.slice(1);
|
|
894
|
-
} else if (!id.includes("entry") && id.startsWith("/")) {
|
|
895
|
-
const resolvedPath = resolve(opts.viteServer.config.root, `.${id}`);
|
|
896
|
-
if (existsSync(resolvedPath))
|
|
897
|
-
id = resolvedPath;
|
|
898
|
-
}
|
|
899
|
-
const withoutVersionQuery = id.replace(/\?v=\w+$/, "");
|
|
900
|
-
if (await isExternal(opts, withoutVersionQuery)) {
|
|
901
|
-
const path = builtinModules.includes(withoutVersionQuery.split("node:").pop()) ? withoutVersionQuery : pathToFileURL(withoutVersionQuery).href;
|
|
902
|
-
return {
|
|
903
|
-
code: `(global, module, _, exports, importMeta, ssrImport, ssrDynamicImport, ssrExportAll) =>
|
|
904
|
-
${genDynamicImport(path, { wrapper: false })}
|
|
905
|
-
.then(r => {
|
|
906
|
-
if (r.default && r.default.__esModule)
|
|
907
|
-
r = r.default
|
|
908
|
-
exports.default = r.default
|
|
909
|
-
ssrExportAll(r)
|
|
910
|
-
})
|
|
911
|
-
.catch(e => {
|
|
912
|
-
console.error(e)
|
|
913
|
-
throw new Error(${JSON.stringify(`[vite dev] Error loading external "${id}".`)})
|
|
914
|
-
})`,
|
|
915
|
-
deps: [],
|
|
916
|
-
dynamicDeps: []
|
|
917
|
-
};
|
|
918
|
-
}
|
|
919
|
-
const res = await opts.viteServer.transformRequest(id, { ssr: true }).catch((err) => {
|
|
920
|
-
console.warn(`[SSR] Error transforming ${id}:`, err);
|
|
921
|
-
}) || { code: "", map: {}, deps: [], dynamicDeps: [] };
|
|
922
|
-
const code = `async function (global, module, exports, __vite_ssr_exports__, __vite_ssr_import_meta__, __vite_ssr_import__, __vite_ssr_dynamic_import__, __vite_ssr_exportAll__) {
|
|
923
|
-
${res.code || "/* empty */"};
|
|
924
|
-
}`;
|
|
925
|
-
return { code, deps: res.deps || [], dynamicDeps: res.dynamicDeps || [] };
|
|
926
|
-
}
|
|
927
|
-
async function transformRequestRecursive(opts, id, parent = "<entry>", chunks = {}) {
|
|
928
|
-
if (chunks[id]) {
|
|
929
|
-
chunks[id].parents.push(parent);
|
|
930
|
-
return;
|
|
931
|
-
}
|
|
932
|
-
const res = await transformRequest(opts, id);
|
|
933
|
-
const deps = uniq([...res.deps, ...res.dynamicDeps]);
|
|
934
|
-
chunks[id] = {
|
|
935
|
-
id,
|
|
936
|
-
code: res.code,
|
|
937
|
-
deps,
|
|
938
|
-
parents: [parent]
|
|
939
|
-
};
|
|
940
|
-
for (const dep of deps)
|
|
941
|
-
await transformRequestRecursive(opts, dep, id, chunks);
|
|
942
|
-
return Object.values(chunks);
|
|
943
|
-
}
|
|
944
|
-
async function bundleRequest(opts, entryURL) {
|
|
945
|
-
const chunks = await transformRequestRecursive(opts, entryURL);
|
|
946
|
-
const listIds = (ids) => ids.map((id) => `// - ${id} (${hashId(id)})`).join("\n");
|
|
947
|
-
const chunksCode = chunks.map((chunk) => `
|
|
948
|
-
// --------------------
|
|
949
|
-
// Request: ${chunk.id}
|
|
950
|
-
// Parents:
|
|
951
|
-
${listIds(chunk.parents)}
|
|
952
|
-
// Dependencies:
|
|
953
|
-
${listIds(chunk.deps)}
|
|
954
|
-
// --------------------
|
|
955
|
-
const ${hashId(chunk.id)} = ${chunk.code}
|
|
956
|
-
`).join("\n");
|
|
957
|
-
const manifestCode = `const __modules__ = ${genObjectFromRawEntries(chunks.map((chunk) => [chunk.id, hashId(chunk.id)]))}`;
|
|
958
|
-
const ssrModuleLoader = `
|
|
959
|
-
const __pendingModules__ = new Map()
|
|
960
|
-
const __pendingImports__ = new Map()
|
|
961
|
-
const __ssrContext__ = { global: globalThis }
|
|
962
|
-
|
|
963
|
-
function __ssrLoadModule__(url, urlStack = []) {
|
|
964
|
-
const pendingModule = __pendingModules__.get(url)
|
|
965
|
-
if (pendingModule) { return pendingModule }
|
|
966
|
-
const modulePromise = __instantiateModule__(url, urlStack)
|
|
967
|
-
__pendingModules__.set(url, modulePromise)
|
|
968
|
-
modulePromise.catch(() => { __pendingModules__.delete(url) })
|
|
969
|
-
.finally(() => { __pendingModules__.delete(url) })
|
|
970
|
-
return modulePromise
|
|
971
|
-
}
|
|
972
|
-
|
|
973
|
-
async function __instantiateModule__(url, urlStack) {
|
|
974
|
-
const mod = __modules__[url]
|
|
975
|
-
if (mod.stubModule) { return mod.stubModule }
|
|
976
|
-
const stubModule = { [Symbol.toStringTag]: 'Module' }
|
|
977
|
-
Object.defineProperty(stubModule, '__esModule', { value: true })
|
|
978
|
-
mod.stubModule = stubModule
|
|
979
|
-
// https://vitejs.dev/guide/api-hmr.html
|
|
980
|
-
const importMeta = { url, hot: { accept() {}, prune() {}, dispose() {}, invalidate() {}, decline() {}, on() {} } }
|
|
981
|
-
urlStack = urlStack.concat(url)
|
|
982
|
-
const isCircular = url => urlStack.includes(url)
|
|
983
|
-
const pendingDeps = []
|
|
984
|
-
const ssrImport = async (dep) => {
|
|
985
|
-
// TODO: Handle externals if dep[0] !== '.' | '/'
|
|
986
|
-
if (!isCircular(dep) && !__pendingImports__.get(dep)?.some(isCircular)) {
|
|
987
|
-
pendingDeps.push(dep)
|
|
988
|
-
if (pendingDeps.length === 1) {
|
|
989
|
-
__pendingImports__.set(url, pendingDeps)
|
|
990
|
-
}
|
|
991
|
-
await __ssrLoadModule__(dep, urlStack)
|
|
992
|
-
if (pendingDeps.length === 1) {
|
|
993
|
-
__pendingImports__.delete(url)
|
|
994
|
-
} else {
|
|
995
|
-
pendingDeps.splice(pendingDeps.indexOf(dep), 1)
|
|
996
|
-
}
|
|
997
|
-
}
|
|
998
|
-
return __modules__[dep].stubModule
|
|
999
|
-
}
|
|
1000
|
-
function ssrDynamicImport (dep) {
|
|
1001
|
-
// TODO: Handle dynamic import starting with . relative to url
|
|
1002
|
-
return ssrImport(dep)
|
|
1003
|
-
}
|
|
1004
|
-
|
|
1005
|
-
function ssrExportAll(sourceModule) {
|
|
1006
|
-
for (const key in sourceModule) {
|
|
1007
|
-
if (key !== 'default') {
|
|
1008
|
-
try {
|
|
1009
|
-
Object.defineProperty(stubModule, key, {
|
|
1010
|
-
enumerable: true,
|
|
1011
|
-
configurable: true,
|
|
1012
|
-
get() { return sourceModule[key] }
|
|
1013
|
-
})
|
|
1014
|
-
} catch (_err) { }
|
|
1015
|
-
}
|
|
1016
|
-
}
|
|
1017
|
-
}
|
|
1018
|
-
|
|
1019
|
-
const cjsModule = {
|
|
1020
|
-
get exports () {
|
|
1021
|
-
return stubModule.default
|
|
1022
|
-
},
|
|
1023
|
-
set exports (v) {
|
|
1024
|
-
stubModule.default = v
|
|
1025
|
-
},
|
|
1026
|
-
}
|
|
1027
|
-
|
|
1028
|
-
await mod(
|
|
1029
|
-
__ssrContext__.global,
|
|
1030
|
-
cjsModule,
|
|
1031
|
-
stubModule.default,
|
|
1032
|
-
stubModule,
|
|
1033
|
-
importMeta,
|
|
1034
|
-
ssrImport,
|
|
1035
|
-
ssrDynamicImport,
|
|
1036
|
-
ssrExportAll
|
|
1037
|
-
)
|
|
1038
|
-
|
|
1039
|
-
return stubModule
|
|
1040
|
-
}
|
|
1041
|
-
`;
|
|
1042
|
-
const code = [
|
|
1043
|
-
chunksCode,
|
|
1044
|
-
manifestCode,
|
|
1045
|
-
ssrModuleLoader,
|
|
1046
|
-
`export default await __ssrLoadModule__(${JSON.stringify(entryURL)})`
|
|
1047
|
-
].join("\n\n");
|
|
1048
|
-
return {
|
|
1049
|
-
code,
|
|
1050
|
-
ids: chunks.map((i) => i.id)
|
|
1051
|
-
};
|
|
1052
|
-
}
|
|
1053
|
-
|
|
1054
|
-
async function writeManifest(ctx, extraEntries = []) {
|
|
1055
|
-
const clientDist = resolve(ctx.flow.options.buildDir, "dist/client");
|
|
1056
|
-
const serverDist = resolve(ctx.flow.options.buildDir, "dist/server");
|
|
1057
|
-
const entries = [
|
|
1058
|
-
"@vite/client",
|
|
1059
|
-
"entry.mjs",
|
|
1060
|
-
...extraEntries
|
|
1061
|
-
];
|
|
1062
|
-
const devClientManifest = {
|
|
1063
|
-
publicPath: joinURL(ctx.flow.options.app.baseURL, ctx.flow.options.app.buildAssetsDir),
|
|
1064
|
-
all: entries,
|
|
1065
|
-
initial: entries,
|
|
1066
|
-
async: [],
|
|
1067
|
-
modules: {}
|
|
1068
|
-
};
|
|
1069
|
-
const clientManifest = ctx.flow.options.dev ? devClientManifest : await fse.readJSON(resolve(clientDist, "manifest.json"));
|
|
1070
|
-
await fse.mkdirp(serverDist);
|
|
1071
|
-
await fse.writeFile(resolve(serverDist, "client.manifest.json"), JSON.stringify(clientManifest, null, 2), "utf8");
|
|
1072
|
-
await fse.writeFile(resolve(serverDist, "client.manifest.mjs"), `export default ${JSON.stringify(clientManifest, null, 2)}`, "utf8");
|
|
1073
|
-
}
|
|
1074
|
-
|
|
1075
|
-
const buildServer = async (ctx) => {
|
|
912
|
+
async function buildServer(ctx) {
|
|
1076
913
|
const serverConfig = vite.mergeConfig(ctx.config, {
|
|
1077
|
-
|
|
914
|
+
base: ctx.nuxt.options.dev ? joinURL(ctx.nuxt.options.app.baseURL.replace(/^\.\//, "/") || "/", ctx.nuxt.options.app.buildAssetsDir) : void 0,
|
|
915
|
+
// experimental: {
|
|
916
|
+
// renderBuiltUrl: (filename, { type, hostType }) => {
|
|
917
|
+
// if (hostType !== 'js') {
|
|
918
|
+
// // In CSS we only use relative paths until we craft a clever runtime CSS hack
|
|
919
|
+
// return { relative: true };
|
|
920
|
+
// }
|
|
921
|
+
// if (type === 'public')
|
|
922
|
+
// return { runtime: `globalThis.__publicAssetsURL(${JSON.stringify(filename)})` };
|
|
923
|
+
// if (type === 'asset') {
|
|
924
|
+
// const relativeFilename = filename.replace(withTrailingSlash(withoutLeadingSlash(ctx.nuxt.options.app.buildAssetsDir)), '');
|
|
925
|
+
// return { runtime: `globalThis.__buildAssetsURL(${JSON.stringify(relativeFilename)})` };
|
|
926
|
+
// }
|
|
927
|
+
// },
|
|
928
|
+
// },
|
|
1078
929
|
define: {
|
|
1079
930
|
"process.server": true,
|
|
931
|
+
"process.client": false,
|
|
1080
932
|
"typeof window": '"undefined"',
|
|
1081
933
|
"typeof document": '"undefined"',
|
|
1082
934
|
"typeof navigator": '"undefined"',
|
|
1083
935
|
"typeof location": '"undefined"',
|
|
1084
936
|
"typeof XMLHttpRequest": '"undefined"'
|
|
1085
937
|
},
|
|
938
|
+
resolve: {
|
|
939
|
+
alias: {
|
|
940
|
+
"#build/plugins": resolve(ctx.nuxt.options.buildDir, "plugins/server")
|
|
941
|
+
}
|
|
942
|
+
},
|
|
1086
943
|
ssr: {
|
|
944
|
+
external: ["#internal/nitro", "#internal/nitro/utils"],
|
|
1087
945
|
noExternal: [
|
|
1088
|
-
...ctx.
|
|
946
|
+
...ctx.nuxt.options.build.transpile,
|
|
947
|
+
// TODO: Use externality for production (rollup) build
|
|
1089
948
|
/\/esm\/.*\.js$/,
|
|
1090
949
|
/\.(es|esm|esm-browser|esm-bundler).js$/,
|
|
1091
950
|
"/__vue-jsx",
|
|
1092
951
|
"#app",
|
|
1093
952
|
/(nuxt|nuxt3)\/(dist|src|app)/,
|
|
953
|
+
/flow\/(dist|src|app)/,
|
|
954
|
+
/flow\/modules\/(content|icons|images|netlify|netlify-cms|seo|sitemap|vue)/,
|
|
1094
955
|
/@monkeyplus\/flow\/(dist|src|app)/,
|
|
1095
956
|
/@nuxt\/nitro\/(dist|src)/
|
|
1096
957
|
]
|
|
1097
958
|
},
|
|
1098
959
|
build: {
|
|
1099
|
-
outDir: resolve(ctx.
|
|
1100
|
-
|
|
960
|
+
outDir: resolve(ctx.nuxt.options.buildDir, "dist/server"),
|
|
961
|
+
ssr: true,
|
|
1101
962
|
rollupOptions: {
|
|
1102
963
|
external: ["#internal/nitro"],
|
|
1103
964
|
output: {
|
|
1104
965
|
entryFileNames: "server.mjs",
|
|
1105
966
|
preferConst: true,
|
|
967
|
+
// TODO: https://github.com/vitejs/vite/pull/8641
|
|
968
|
+
inlineDynamicImports: !ctx.nuxt.options.experimental.viteServerDynamicImports,
|
|
1106
969
|
format: "module"
|
|
1107
970
|
},
|
|
1108
971
|
onwarn(warning, rollupWarn) {
|
|
@@ -1112,39 +975,31 @@ const buildServer = async (ctx) => {
|
|
|
1112
975
|
}
|
|
1113
976
|
},
|
|
1114
977
|
server: {
|
|
978
|
+
// https://github.com/vitest-dev/vitest/issues/229#issuecomment-1002685027
|
|
1115
979
|
preTransformRequests: false,
|
|
1116
|
-
|
|
980
|
+
hmr: false
|
|
1117
981
|
},
|
|
1118
982
|
plugins: [
|
|
1119
|
-
cacheDirPlugin(ctx.
|
|
983
|
+
cacheDirPlugin(ctx.nuxt.options.rootDir, "server"),
|
|
984
|
+
replace({
|
|
985
|
+
...Object.fromEntries([";", "(", "{", "}", " ", " ", "\n"].map((d) => [`${d}global.`, `${d}globalThis.`])),
|
|
986
|
+
preventAssignment: true
|
|
987
|
+
})
|
|
988
|
+
// vuePlugin(ctx.config.vue),
|
|
989
|
+
// viteJsxPlugin(),
|
|
1120
990
|
]
|
|
1121
991
|
});
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
const publicDir = join(ctx.flow.options.srcDir, ctx.flow.options.dir.public);
|
|
1128
|
-
let publicFiles = [];
|
|
1129
|
-
if (await isDirectory(publicDir)) {
|
|
1130
|
-
publicFiles = readDirRecursively(publicDir).map((r) => r.replace(publicDir, ""));
|
|
1131
|
-
for (const file of publicFiles) {
|
|
1132
|
-
try {
|
|
1133
|
-
fse.rmSync(join(clientDist, file));
|
|
1134
|
-
} catch {
|
|
1135
|
-
}
|
|
1136
|
-
}
|
|
1137
|
-
}
|
|
1138
|
-
if (await isDirectory(clientDist)) {
|
|
1139
|
-
const nestedAssetsPath = withoutTrailingSlash(join(clientDist, ctx.flow.options.app.buildAssetsDir));
|
|
1140
|
-
if (await isDirectory(nestedAssetsPath)) {
|
|
1141
|
-
await fse.copy(nestedAssetsPath, clientDist, { recursive: true });
|
|
1142
|
-
await fse.remove(nestedAssetsPath);
|
|
992
|
+
if (ctx.nuxt.options.typescript.typeCheck === true || ctx.nuxt.options.typescript.typeCheck === "build" && !ctx.nuxt.options.dev) {
|
|
993
|
+
const checker = await import('vite-plugin-checker').then((r) => r.default);
|
|
994
|
+
serverConfig.plugins.push(checker({
|
|
995
|
+
vueTsc: {
|
|
996
|
+
tsconfigPath: await resolveTSConfig(ctx.nuxt.options.rootDir)
|
|
1143
997
|
}
|
|
1144
|
-
}
|
|
1145
|
-
}
|
|
1146
|
-
|
|
1147
|
-
|
|
998
|
+
}));
|
|
999
|
+
}
|
|
1000
|
+
await ctx.nuxt.callHook("vite:extendConfig", serverConfig, { isClient: false, isServer: true });
|
|
1001
|
+
const onBuild = () => ctx.nuxt.callHook("build:resources", wpfs);
|
|
1002
|
+
if (!ctx.nuxt.options.dev) {
|
|
1148
1003
|
const start = Date.now();
|
|
1149
1004
|
logger.info("Building server...");
|
|
1150
1005
|
await vite.build(serverConfig);
|
|
@@ -1154,184 +1009,87 @@ const buildServer = async (ctx) => {
|
|
|
1154
1009
|
}
|
|
1155
1010
|
const viteServer = await vite.createServer(serverConfig);
|
|
1156
1011
|
ctx.ssrServer = viteServer;
|
|
1157
|
-
await ctx.
|
|
1158
|
-
ctx.
|
|
1012
|
+
await ctx.nuxt.callHook("vite:serverCreated", viteServer, { isClient: false, isServer: true });
|
|
1013
|
+
ctx.nuxt.hook("close", () => viteServer.close());
|
|
1159
1014
|
await viteServer.pluginContainer.buildStart({});
|
|
1160
|
-
|
|
1161
|
-
const start = Date.now();
|
|
1162
|
-
const { code, ids } = await bundleRequest({ viteServer }, resolve(ctx.flow.options.appDir, "entry"));
|
|
1163
|
-
await fse.ensureFile(resolve(ctx.flow.options.buildDir, "dist/server/server.mjs"));
|
|
1164
|
-
await fse.writeFile(resolve(ctx.flow.options.buildDir, "dist/server/server.mjs"), code, "utf-8");
|
|
1165
|
-
await writeManifest(ctx, ids.filter(isCSS).map((i) => i.slice(1)));
|
|
1166
|
-
const time = Date.now() - start;
|
|
1167
|
-
logger.success(`Vite server built in ${time}ms`);
|
|
1168
|
-
await onBuild();
|
|
1169
|
-
ctx.flow.callHook("bundler:change", {});
|
|
1170
|
-
};
|
|
1171
|
-
const doBuild = debounce(_doBuild, 50);
|
|
1172
|
-
await _doBuild();
|
|
1173
|
-
viteServer.watcher.on("all", (_event, file) => {
|
|
1174
|
-
file = normalize(file);
|
|
1175
|
-
if (file.indexOf(ctx.flow.options.buildDir) === 0)
|
|
1176
|
-
return;
|
|
1177
|
-
doBuild();
|
|
1178
|
-
});
|
|
1179
|
-
ctx.flow.hook("app:templatesGenerated", () => doBuild());
|
|
1180
|
-
};
|
|
1181
|
-
|
|
1182
|
-
const PREFIX = "virtual:";
|
|
1183
|
-
function virtual(vfs) {
|
|
1184
|
-
const extensions = ["", ".ts", ".vue", ".mjs", ".cjs", ".js", ".json"];
|
|
1185
|
-
const resolveWithExt = (id) => {
|
|
1186
|
-
for (const ext of extensions) {
|
|
1187
|
-
const rId = id + ext;
|
|
1188
|
-
if (rId in vfs)
|
|
1189
|
-
return rId;
|
|
1190
|
-
}
|
|
1191
|
-
return null;
|
|
1192
|
-
};
|
|
1193
|
-
return {
|
|
1194
|
-
name: "virtual",
|
|
1195
|
-
resolveId(id, importer) {
|
|
1196
|
-
if (process.platform === "win32" && isAbsolute(id)) {
|
|
1197
|
-
id = resolve(id);
|
|
1198
|
-
}
|
|
1199
|
-
const resolvedId = resolveWithExt(id);
|
|
1200
|
-
if (resolvedId)
|
|
1201
|
-
return PREFIX + resolvedId;
|
|
1202
|
-
if (importer && !isAbsolute(id)) {
|
|
1203
|
-
const importerNoPrefix = importer.startsWith(PREFIX) ? importer.slice(PREFIX.length) : importer;
|
|
1204
|
-
const importedDir = dirname(importerNoPrefix);
|
|
1205
|
-
const resolved = resolveWithExt(join(importedDir, id));
|
|
1206
|
-
if (resolved)
|
|
1207
|
-
return PREFIX + resolved;
|
|
1208
|
-
}
|
|
1209
|
-
return null;
|
|
1210
|
-
},
|
|
1211
|
-
load(id) {
|
|
1212
|
-
if (!id.startsWith(PREFIX))
|
|
1213
|
-
return null;
|
|
1214
|
-
const idNoPrefix = id.slice(PREFIX.length);
|
|
1215
|
-
return {
|
|
1216
|
-
code: vfs[idNoPrefix],
|
|
1217
|
-
map: null
|
|
1218
|
-
};
|
|
1219
|
-
}
|
|
1220
|
-
};
|
|
1015
|
+
await import('./chunks/dev-bundler.mjs').then((r) => r.initViteDevBundler(ctx, onBuild));
|
|
1221
1016
|
}
|
|
1222
1017
|
|
|
1223
|
-
|
|
1224
|
-
const
|
|
1225
|
-
return {
|
|
1226
|
-
name: "nuxt:dynamic-base-path",
|
|
1227
|
-
resolveId(id) {
|
|
1228
|
-
if (id.startsWith("/__NUXT_BASE__"))
|
|
1229
|
-
return id.replace("/__NUXT_BASE__", "");
|
|
1230
|
-
if (id === "#internal/nitro")
|
|
1231
|
-
return "#internal/nitro";
|
|
1232
|
-
return null;
|
|
1233
|
-
},
|
|
1234
|
-
enforce: "post",
|
|
1235
|
-
transform(code, id) {
|
|
1236
|
-
const s = new MagicString(code);
|
|
1237
|
-
if (options.globalPublicPath && id.includes("paths.mjs") && code.includes("const appConfig = "))
|
|
1238
|
-
s.append(`${options.globalPublicPath} = buildAssetsURL();
|
|
1239
|
-
`);
|
|
1240
|
-
const assetId = code.match(VITE_ASSET_RE);
|
|
1241
|
-
if (assetId) {
|
|
1242
|
-
s.overwrite(0, code.length, [
|
|
1243
|
-
"import { buildAssetsURL } from '#build/paths.mjs';",
|
|
1244
|
-
`export default buildAssetsURL("${assetId[1]}".replace("/__NUXT_BASE__", ""));`
|
|
1245
|
-
].join("\n"));
|
|
1246
|
-
}
|
|
1247
|
-
if (!id.includes("paths.mjs") && code.includes("NUXT_BASE") && !code.includes("import { publicAssetsURL as __publicAssetsURL }"))
|
|
1248
|
-
s.prepend("import { publicAssetsURL as __publicAssetsURL } from '#build/paths.mjs';\n");
|
|
1249
|
-
if (id === "vite/preload-helper") {
|
|
1250
|
-
s.prepend("import { buildAssetsDir } from '#build/paths.mjs';\n");
|
|
1251
|
-
s.replace(/const base = ['"]\/__NUXT_BASE__\/['"]/, "const base = buildAssetsDir()");
|
|
1252
|
-
}
|
|
1253
|
-
s.replace(/from *['"]\/__NUXT_BASE__(\/[^'"]*)['"]/g, 'from "$1"');
|
|
1254
|
-
const delimiterRE = /(?<!(const base = |from *))(`([^`]*)\/__NUXT_BASE__\/([^`]*)`|'([^']*)\/__NUXT_BASE__\/([^']*)'|"([^"]*)\/__NUXT_BASE__\/([^"]*)")/g;
|
|
1255
|
-
s.replace(delimiterRE, (r) => `\`${r.replace(/\/__NUXT_BASE__\//g, "${__publicAssetsURL()}").slice(1, -1)}\``);
|
|
1256
|
-
if (s.hasChanged()) {
|
|
1257
|
-
return {
|
|
1258
|
-
code: s.toString(),
|
|
1259
|
-
map: options.sourcemap && s.generateMap({ source: id, includeContent: true })
|
|
1260
|
-
};
|
|
1261
|
-
}
|
|
1262
|
-
}
|
|
1263
|
-
};
|
|
1264
|
-
});
|
|
1265
|
-
|
|
1266
|
-
async function bundleVite(flow) {
|
|
1267
|
-
const hmrPortDefault = 24678;
|
|
1268
|
-
const hmrPort = await getPort({
|
|
1269
|
-
port: hmrPortDefault,
|
|
1270
|
-
ports: Array.from({ length: 20 }, (_, i) => hmrPortDefault + 1 + i)
|
|
1271
|
-
});
|
|
1018
|
+
async function bundle$1(nuxt) {
|
|
1019
|
+
const entry = resolve(nuxt.options.appDir, nuxt.options.experimental.asyncEntry ? "entry.async" : "entry");
|
|
1272
1020
|
const ctx = {
|
|
1273
|
-
nuxt
|
|
1274
|
-
|
|
1275
|
-
config: vite.mergeConfig(
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
output: { sanitizeFileName: sanitizeFilePath },
|
|
1295
|
-
input: resolve(flow.options.appDir, "entry")
|
|
1296
|
-
}
|
|
1297
|
-
},
|
|
1298
|
-
plugins: [
|
|
1299
|
-
replace({
|
|
1300
|
-
...Object.fromEntries([";", "(", "{", "}", " ", " ", "\n"].map((d) => [`${d}global.`, `${d}globalThis.`])),
|
|
1301
|
-
preventAssignment: true
|
|
1302
|
-
}),
|
|
1303
|
-
virtual(flow.vfs),
|
|
1304
|
-
DynamicBasePlugin.vite({ sourcemap: flow.options.sourcemap })
|
|
1305
|
-
],
|
|
1306
|
-
server: {
|
|
1307
|
-
watch: {
|
|
1308
|
-
ignored: isIgnoredFlow
|
|
1021
|
+
nuxt,
|
|
1022
|
+
entry,
|
|
1023
|
+
config: vite.mergeConfig(
|
|
1024
|
+
{
|
|
1025
|
+
configFile: false,
|
|
1026
|
+
resolve: {
|
|
1027
|
+
alias: {
|
|
1028
|
+
...nuxt.options.alias,
|
|
1029
|
+
"#app": nuxt.options.appDir,
|
|
1030
|
+
// We need this resolution to be present before the following entry, but it
|
|
1031
|
+
// will be filled in client/server configs
|
|
1032
|
+
"#build/plugins": "",
|
|
1033
|
+
"#build": nuxt.options.buildDir,
|
|
1034
|
+
"web-streams-polyfill/ponyfill/es2018": "unenv/runtime/mock/empty",
|
|
1035
|
+
// Cannot destructure property 'AbortController' of ..
|
|
1036
|
+
"abort-controller": "unenv/runtime/mock/empty"
|
|
1037
|
+
}
|
|
1038
|
+
},
|
|
1039
|
+
optimizeDeps: {
|
|
1040
|
+
entries: [entry],
|
|
1041
|
+
include: []
|
|
1309
1042
|
},
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1043
|
+
// css: resolveCSSOptions(nuxt),
|
|
1044
|
+
build: {
|
|
1045
|
+
rollupOptions: {
|
|
1046
|
+
output: { sanitizeFileName: sanitizeFilePath },
|
|
1047
|
+
input: resolve(nuxt.options.appDir, "entry")
|
|
1048
|
+
},
|
|
1049
|
+
watch: {
|
|
1050
|
+
exclude: nuxt.options.ignore
|
|
1051
|
+
}
|
|
1314
1052
|
},
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1053
|
+
plugins: [
|
|
1054
|
+
// composableKeysPlugin.vite({ sourcemap: nuxt.options.sourcemap, rootDir: nuxt.options.rootDir }),
|
|
1055
|
+
replace({
|
|
1056
|
+
...Object.fromEntries([";", "(", "{", "}", " ", " ", "\n"].map((d) => [`${d}global.`, `${d}globalThis.`])),
|
|
1057
|
+
preventAssignment: true
|
|
1058
|
+
}),
|
|
1059
|
+
virtual(nuxt.vfs)
|
|
1060
|
+
],
|
|
1061
|
+
vue: {
|
|
1062
|
+
reactivityTransform: nuxt.options.experimental.reactivityTransform
|
|
1063
|
+
},
|
|
1064
|
+
server: {
|
|
1065
|
+
watch: { ignored: isIgnoredFlow },
|
|
1066
|
+
fs: {
|
|
1067
|
+
allow: [
|
|
1068
|
+
nuxt.options.appDir
|
|
1069
|
+
]
|
|
1070
|
+
},
|
|
1071
|
+
hmr: false
|
|
1319
1072
|
}
|
|
1320
|
-
}
|
|
1321
|
-
|
|
1073
|
+
},
|
|
1074
|
+
nuxt.options.vite
|
|
1075
|
+
)
|
|
1322
1076
|
};
|
|
1323
|
-
if (
|
|
1324
|
-
ctx.config.
|
|
1325
|
-
|
|
1326
|
-
|
|
1077
|
+
if (!nuxt.options.dev) {
|
|
1078
|
+
ctx.config.server.watch = void 0;
|
|
1079
|
+
ctx.config.build.watch = void 0;
|
|
1080
|
+
}
|
|
1081
|
+
await nuxt.callHook("vite:extend", ctx);
|
|
1082
|
+
nuxt.hook("vite:serverCreated", (server, env) => {
|
|
1327
1083
|
ctx.nuxt.hook("app:templatesGenerated", () => {
|
|
1328
1084
|
for (const [id, mod] of server.moduleGraph.idToModuleMap) {
|
|
1329
|
-
if (id.
|
|
1085
|
+
if (id.includes("pages."))
|
|
1086
|
+
server.moduleGraph.invalidateModule(mod);
|
|
1087
|
+
if (id.startsWith("\virtual:"))
|
|
1330
1088
|
server.moduleGraph.invalidateModule(mod);
|
|
1331
1089
|
}
|
|
1332
1090
|
});
|
|
1333
1091
|
const start = Date.now();
|
|
1334
|
-
warmupViteServer(server, ["/entry
|
|
1092
|
+
warmupViteServer(server, [join("/@fs/", ctx.entry)]).then(() => logger.info(`Vite ${env.isClient ? "client" : "server"} warmed up in ${Date.now() - start}ms`)).catch(logger.error);
|
|
1335
1093
|
});
|
|
1336
1094
|
await buildServer(ctx);
|
|
1337
1095
|
}
|
|
@@ -1346,12 +1104,16 @@ async function build(flow) {
|
|
|
1346
1104
|
if (event !== "change" && /app|error|plugins/i.test(path))
|
|
1347
1105
|
await generateApp$1();
|
|
1348
1106
|
});
|
|
1349
|
-
flow.hook("builder:generateApp",
|
|
1107
|
+
flow.hook("builder:generateApp", (options) => {
|
|
1108
|
+
if (options)
|
|
1109
|
+
return generateApp(flow, app);
|
|
1110
|
+
return generateApp$1();
|
|
1111
|
+
});
|
|
1350
1112
|
}
|
|
1351
|
-
await flow.callHook("build:before"
|
|
1113
|
+
await flow.callHook("build:before");
|
|
1352
1114
|
if (!flow.options._prepare) {
|
|
1353
1115
|
await bundle(flow);
|
|
1354
|
-
await flow.callHook("build:done"
|
|
1116
|
+
await flow.callHook("build:done");
|
|
1355
1117
|
}
|
|
1356
1118
|
if (!flow.options.dev)
|
|
1357
1119
|
await flow.callHook("close", flow);
|
|
@@ -1367,14 +1129,13 @@ function watch(flow) {
|
|
|
1367
1129
|
"node_modules"
|
|
1368
1130
|
]
|
|
1369
1131
|
});
|
|
1370
|
-
|
|
1371
|
-
watcher.on("all", watchHook);
|
|
1132
|
+
watcher.on("all", (event, path) => flow.callHook("builder:watch", event, normalize(path)));
|
|
1372
1133
|
flow.hook("close", () => watcher.close());
|
|
1373
1134
|
return watcher;
|
|
1374
1135
|
}
|
|
1375
1136
|
async function bundle(nuxt) {
|
|
1376
1137
|
try {
|
|
1377
|
-
return
|
|
1138
|
+
return bundle$1(nuxt);
|
|
1378
1139
|
} catch (error) {
|
|
1379
1140
|
await nuxt.callHook("build:error", error);
|
|
1380
1141
|
throw error;
|