@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.
Files changed (32) hide show
  1. package/dist/app/entry.async.d.ts +3 -0
  2. package/dist/app/entry.async.mjs +1 -0
  3. package/dist/app/entry.d.ts +2 -2
  4. package/dist/app/entry.mjs +3 -2
  5. package/dist/app/flow.d.ts +12 -3
  6. package/dist/app/flow.mjs +3 -0
  7. package/dist/chunks/dev-bundler.mjs +277 -0
  8. package/dist/core/runtime/client.manifest.d.mts +2 -0
  9. package/dist/core/runtime/client.manifest.mjs +6 -0
  10. package/dist/core/runtime/nitro/flow.d.ts +2 -1
  11. package/dist/core/runtime/nitro/flow.mjs +8 -14
  12. package/dist/core/runtime/nitro/renderer.d.ts +1 -1
  13. package/dist/core/runtime/nitro/renderer.mjs +68 -14
  14. package/dist/core/runtime/vite-node-shared.d.mts +1 -0
  15. package/dist/core/runtime/vite-node-shared.d.ts +8 -0
  16. package/dist/core/runtime/vite-node-shared.mjs +3 -0
  17. package/dist/core/runtime/vite-node.d.mts +2 -0
  18. package/dist/core/runtime/vite-node.mjs +41 -0
  19. package/dist/head/runtime/plugin.mjs +0 -1
  20. package/dist/index.mjs +528 -767
  21. package/dist/pages/runtime/helpers/index.d.ts +1 -1
  22. package/dist/pages/runtime/helpers/index.mjs +14 -3
  23. package/dist/pages/runtime/index.d.ts +10 -3
  24. package/dist/pages/runtime/index.mjs +5 -1
  25. package/dist/pages/runtime/pages.mjs +134 -0
  26. package/package.json +40 -36
  27. package/dist/pages/runtime/plugin.mjs +0 -71
  28. package/dist/vite-client/runtime/injectManifest.d.ts +0 -26
  29. package/dist/vite-client/runtime/injectManifest.mjs +0 -104
  30. package/dist/vite-client/runtime/plugin.d.ts +0 -2
  31. package/dist/vite-client/runtime/plugin.mjs +0 -26
  32. /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, templateUtils, normalizeTemplate, compileTemplate, normalizePlugin, isIgnoredFlow } from '@monkeyplus/flow-kit';
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, withoutTrailingSlash } from 'ufo';
8
- import escapeRE from 'escape-string-regexp';
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, genObjectFromRawEntries } from 'knitwork';
11
- import fse from 'fs-extra';
12
- import logger$1 from 'consola';
13
- import * as vite from 'vite';
14
- import { createServer, build as build$1 } from 'vite';
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 { getPort } from 'get-port-please';
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 { isExternal as isExternal$1, ExternalsDefaults } from 'externality';
27
- import { createHash } from 'node:crypto';
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.23";
27
+ const version = "5.0.0-rc.230";
31
28
 
32
29
  let _distDir = dirname(fileURLToPath(import.meta.url));
33
- if (_distDir.endsWith("chunks"))
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: "flow:auto-imports-transform",
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 { type, macro } = parseQuery(search);
61
- const exclude = options.transform?.exclude || [/[\\/]node_modules[\\/]/];
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 (pathname.endsWith(".vue") && (type === "template" || type === "script" || macro || !search))
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(_code, id) {
73
- const { code, s } = await ctx.injectImports(_code);
74
- if (code === _code)
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
- return {
77
- code,
78
- map: sourcemap && s.generateMap({ source: id, includeContent: true })
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
- "defineDinamycPage"
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 autoImportsModule = defineNuxtModule({
130
+ const importsModule = defineNuxtModule({
128
131
  meta: {
129
- name: "auto-imports",
130
- configKey: "autoImports"
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, flow) {
142
- await flow.callHook("autoImports:sources", options.presets);
143
- options.presets.forEach((i) => {
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("auto-imports: presets.names is deprecated, use presets.imports instead");
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 flow.options._layers) {
168
+ for (const layer of nuxt.options._layers) {
155
169
  composablesDirs.push(resolve(layer.config.srcDir, "composables"));
156
- for (const dir of layer.config.autoImports?.dirs ?? [])
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 flow.callHook("autoImports:dirs", composablesDirs);
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
- flow.options.alias["#imports"] = join(flow.options.buildDir, "imports");
166
- if (flow.options.dev && options.global) {
183
+ nuxt.options.alias["#imports"] = join(nuxt.options.buildDir, "imports");
184
+ if (nuxt.options.dev && options.global) {
167
185
  addPluginTemplate({
168
- filename: "auto-imports.mjs",
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: flow.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 regenerateAutoImports = async () => {
202
+ const regenerateImports = async () => {
184
203
  ctx.clearDynamicImports();
185
204
  await ctx.modifyDynamicImports(async (imports) => {
186
205
  imports.push(...await scanDirExports(composablesDirs));
187
- await flow.callHook("autoImports:extend", imports);
206
+ await nuxt.callHook("imports:extend", imports);
188
207
  });
189
208
  };
190
- await regenerateAutoImports();
191
- addDeclarationTemplates(ctx);
192
- flow.hook("prepare:types", ({ references }) => {
193
- references.push({ path: resolve(flow.options.buildDir, "types/auto-imports.d.ts") });
194
- references.push({ path: resolve(flow.options.buildDir, "imports.d.ts") });
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
- flow.hook("builder:watch", async (_, path) => {
197
- const _resolved = resolve(flow.options.srcDir, path);
198
- if (composablesDirs.find((dir) => _resolved.startsWith(dir)))
199
- await flow.callHook("builder:generateApp");
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
- flow.hook("builder:generateApp", async () => {
202
- await regenerateAutoImports();
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/auto-imports.d.ts",
226
- getContents: () => `// Generated by auto imports
227
- ${ctx.generateTypeDecarations({ resolvePath: r })}`
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 resolvePagesRoutes() {
258
+ async function resolveFiles(dir) {
232
259
  const nuxt = useNuxt();
233
- const pagesDirs = [resolve(nuxt.options.srcDir, nuxt.options.dir?.pages || "pages")];
234
- const allRoutes = (await Promise.all(pagesDirs.map(async (dir) => {
235
- const files = await resolveFilesFlow(dir, `**/*{${nuxt.options.extensions.join(",")}}`);
236
- files.sort();
237
- return files.filter((file) => !file.includes(" copy")).map((file) => {
238
- const segments = relative(dir, file).replace(new RegExp(`${escapeRE(extname(file))}$`), "").split("/").join("_");
239
- return {
240
- file,
241
- name: camelCase(segments)
242
- };
243
- });
244
- }))).flat();
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 normalizePages(pages) {
248
- const imports = pages.map((page) => genImport(page.file, [{ name: "pages", as: page.name }])).join("\n");
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: pages.reduce((acc, curr) => {
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) => `export type ${pascalCase(c.name)}Context=Awaited<ReturnType<typeof ${genDynamicImport(isAbsolute(c.file) ? relative(options.buildDir, c.file) : c.file, { wrapper: false })}['pages']['locales']['es-ec']['context']>>`).join("\n")}
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 options = { pages, buildDir: flow.options.buildDir };
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 } = normalizePages(options2.pages);
289
- return [imports, `export default {${exports}}`].join("\n");
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 resolvePagesRoutes();
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({ src: resolve(runtimeDir, "plugin") });
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: "flow:import-protection",
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
- srcDir: join(flow.options.srcDir, "server"),
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: flow.options._layers.map((layer) => join(layer.config.srcDir, "server")),
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 ? flow.options.generate.crawler : false,
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
- sourcemap: flow.options.sourcemap,
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
- external: [""]
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("rollup:before", (nitro2) => {
515
- const plugin = ImportProtectionPlugin.rollup({
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 devMidlewareHandler = dynamicEventHandler();
524
- nitro.options.devHandlers.unshift({ handler: devMidlewareHandler });
525
- nitro.options.devHandlers.push(...devHandlers);
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: "/__flow_error",
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._prepare) {
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$2(nitro);
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$2(nitro);
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("build:compile", ({ compiler }) => {
565
- compiler.outputFileSystem = { ...fse, join };
551
+ flow.hook("vite:compiled", () => {
552
+ flow.server.reload();
566
553
  });
567
- flow.hook("server:devMiddleware", (m) => {
568
- devMidlewareHandler.set(toEventHandler(m));
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
- _version: "3.0.0-rc.3",
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", { nuxt: flow });
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", { nuxt: flow });
635
- await addModuleTranspiles();
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, autoImportsModule, viteModule);
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
- templateUtils.importSources(serverPlugins.map((p) => p.src)),
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 = ["auto-imports", "meta", "pages", "vite-client"];
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((meta) => ` [${genString(meta.configKey)}]?: typeof ${genDynamicImport(meta.importName, { wrapper: false })}.default extends FlowModule<infer O> ? Partial<O> : Record<string, any>`),
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(resolveSchema(Object.fromEntries(Object.entries(nuxt.options.runtimeConfig).filter(([key]) => key !== "public"))), {
707
- interfaceName: "RuntimeConfig",
708
- addExport: false,
709
- addDefaults: false,
710
- allowExtraKeys: false,
711
- indentation: 2
712
- }),
713
- generateTypes(resolveSchema(nuxt.options.runtimeConfig.public), {
714
- interfaceName: "PublicRuntimeConfig",
715
- addExport: false,
716
- addDefaults: false,
717
- allowExtraKeys: false,
718
- indentation: 2
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
- "import { joinURL } from 'ufo'",
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
- publicPathTemplate: publicPathTemplate
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(flow.options.build.templates);
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(app.templates.map(async (template) => {
765
- const contents = await compileTemplate(template, templateContext);
766
- const fullPath = template.dst || resolve(flow.options.buildDir, template.filename);
767
- flow.vfs[fullPath] = contents;
768
- const aliasPath = `#build/${template.filename.replace(/\.\w+$/, "")}`;
769
- flow.vfs[aliasPath] = contents;
770
- if (process.platform === "win32")
771
- flow.vfs[fullPath.replace(/\//g, "\\")] = contents;
772
- if (template.write) {
773
- await promises.mkdir(dirname(fullPath), { recursive: true });
774
- await promises.writeFile(fullPath, contents, "utf8");
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 = [...flow.options.plugins.map(normalizePlugin)];
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.plugins = uniqueBy(app.plugins, "src");
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
- function uniqueBy(arr, key) {
794
- const res = [];
795
- const seen = /* @__PURE__ */ new Set();
796
- for (const item of arr) {
797
- if (seen.has(item[key]))
798
- continue;
799
- seen.add(item[key]);
800
- res.push(item);
801
- }
802
- return res;
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
- const wpfs = {
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
- configFile: false,
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.flow.options.build.transpile,
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.flow.options.buildDir, "dist/server"),
1100
- manifest: true,
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
- cors: true
980
+ hmr: false
1117
981
  },
1118
982
  plugins: [
1119
- cacheDirPlugin(ctx.flow.options.rootDir, "server")
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
- await ctx.flow.callHook("vite:extendConfig", serverConfig, { isClient: false, isServer: true });
1123
- ctx.flow.hook("nitro:build:before", async () => {
1124
- if (ctx.flow.options.dev)
1125
- return;
1126
- const clientDist = resolve(ctx.flow.options.buildDir, "dist/client");
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
- const onBuild = () => ctx.flow.callHook("build:resources", wpfs);
1147
- if (!ctx.flow.options.dev) {
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.flow.callHook("vite:serverCreated", viteServer, { isClient: false, isServer: true });
1158
- ctx.flow.hook("close", () => viteServer.close());
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
- const _doBuild = async () => {
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
- const VITE_ASSET_RE = /^export default ["'](__VITE_ASSET.*)["']$/;
1224
- const DynamicBasePlugin = createUnplugin((options = {}) => {
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: flow,
1274
- flow,
1275
- config: vite.mergeConfig({
1276
- mode: flow.options.dev ? "development" : void 0,
1277
- resolve: {
1278
- alias: {
1279
- ...flow.options.alias,
1280
- "#app": flow.options.appDir,
1281
- "#build/plugins": resolve(flow.options.buildDir, "plugins/server"),
1282
- "#build": flow.options.buildDir,
1283
- "/entry.mjs": resolve(flow.options.appDir, "entry")
1284
- }
1285
- },
1286
- optimizeDeps: {
1287
- entries: [
1288
- resolve(flow.options.appDir, "entry.ts")
1289
- ],
1290
- include: []
1291
- },
1292
- build: {
1293
- rollupOptions: {
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
- hmr: {
1311
- protocol: "ws",
1312
- clientPort: hmrPort,
1313
- port: hmrPort
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
- fs: {
1316
- allow: [
1317
- flow.options.appDir
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
- }, flow.options.vite)
1073
+ },
1074
+ nuxt.options.vite
1075
+ )
1322
1076
  };
1323
- if (flow.options.dev)
1324
- ctx.config.mode = process.env.NODE_ENV || "development";
1325
- await flow.callHook("vite:extend", ctx);
1326
- flow.hook("vite:serverCreated", (server) => {
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.startsWith("\0virtual:"))
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.mjs"]).then(() => logger.info(`Vite server warmed up in ${Date.now() - start}ms`)).catch(logger.error);
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", generateApp$1);
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", { flow }, flow.options.build);
1113
+ await flow.callHook("build:before");
1352
1114
  if (!flow.options._prepare) {
1353
1115
  await bundle(flow);
1354
- await flow.callHook("build:done", { flow });
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
- const watchHook = debounce((event, path) => flow.callHook("builder:watch", event, normalize(path)));
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 bundleVite(nuxt);
1138
+ return bundle$1(nuxt);
1378
1139
  } catch (error) {
1379
1140
  await nuxt.callHook("build:error", error);
1380
1141
  throw error;