@monkeyplus/flow 5.0.0-rc.1 → 5.0.0-rc.100

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