@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
@@ -0,0 +1,154 @@
1
+ import { pathToFileURL } from 'node:url';
2
+ import { createApp, defineEventHandler, defineLazyEventHandler, createError } from 'h3';
3
+ import { ViteNodeServer } from 'vite-node/server';
4
+ import fse from 'fs-extra';
5
+ import { resolve as resolve$1 } from 'pathe';
6
+ import { addServerMiddleware } from '@monkeyplus/flow-kit';
7
+ import { normalizeViteManifest } from 'vue-bundle-renderer';
8
+ import { resolve } from 'mlly';
9
+ import { d as distDir } from './index.mjs';
10
+ import { c as createIsExternal, i as isCSS } from './external.mjs';
11
+ import 'hookable';
12
+ import 'url';
13
+ import 'unimport';
14
+ import 'unplugin';
15
+ import 'ufo';
16
+ import 'fs';
17
+ import 'escape-string-regexp';
18
+ import 'scule';
19
+ import 'knitwork';
20
+ import 'node:fs';
21
+ import 'nitropack';
22
+ import 'defu';
23
+ import 'node:module';
24
+ import 'chokidar';
25
+ import 'perfect-debounce';
26
+ import 'untyped';
27
+ import 'vite';
28
+ import '@rollup/plugin-replace';
29
+ import 'pkg-types';
30
+ import 'ohash';
31
+ import 'externality';
32
+
33
+ function viteNodePlugin(ctx) {
34
+ const invalidates = /* @__PURE__ */ new Set();
35
+ return {
36
+ name: "nuxt:vite-node-server",
37
+ enforce: "post",
38
+ configureServer(server) {
39
+ server.middlewares.use("/__nuxt_vite_node__", createViteNodeMiddleware(ctx, invalidates));
40
+ },
41
+ handleHotUpdate({ file, server }) {
42
+ function markInvalidate(mod) {
43
+ if (invalidates.has(mod.id))
44
+ return;
45
+ invalidates.add(mod.id);
46
+ for (const importer of mod.importers)
47
+ markInvalidate(importer);
48
+ }
49
+ const mods = server.moduleGraph.getModulesByFile(file) || [];
50
+ for (const mod of mods)
51
+ markInvalidate(mod);
52
+ }
53
+ };
54
+ }
55
+ function registerViteNodeMiddleware(ctx) {
56
+ addServerMiddleware({
57
+ route: "/__nuxt_vite_node__/",
58
+ handler: createViteNodeMiddleware(ctx)
59
+ });
60
+ }
61
+ function getManifest(ctx) {
62
+ const css = Array.from(ctx.ssrServer.moduleGraph.urlToModuleMap.keys()).filter((i) => isCSS(i));
63
+ const manifest = normalizeViteManifest({
64
+ "@vite/client": {
65
+ file: "@vite/client",
66
+ css,
67
+ module: true,
68
+ isEntry: true
69
+ },
70
+ [ctx.entry]: {
71
+ file: ctx.entry,
72
+ isEntry: true,
73
+ module: true,
74
+ resourceType: "script"
75
+ }
76
+ });
77
+ return manifest;
78
+ }
79
+ function createViteNodeMiddleware(ctx, invalidates = /* @__PURE__ */ new Set()) {
80
+ const app = createApp();
81
+ app.use("/manifest", defineEventHandler(() => {
82
+ const manifest = getManifest(ctx);
83
+ return manifest;
84
+ }));
85
+ app.use("/invalidates", defineEventHandler(() => {
86
+ if (invalidates.size) {
87
+ for (const key of ctx.ssrServer.moduleGraph.fileToModulesMap.keys()) {
88
+ if (key.startsWith(`${ctx.nuxt.options.appDir}/entry`))
89
+ invalidates.add(key);
90
+ }
91
+ }
92
+ const ids = Array.from(invalidates);
93
+ invalidates.clear();
94
+ return ids;
95
+ }));
96
+ app.use("/module", defineLazyEventHandler(() => {
97
+ const viteServer = ctx.ssrServer;
98
+ const node = new ViteNodeServer(viteServer, {
99
+ deps: {
100
+ inline: [
101
+ /\/(nuxt|nuxt3)\//,
102
+ /^#/,
103
+ ...ctx.nuxt.options.build.transpile
104
+ ]
105
+ },
106
+ transformMode: {
107
+ ssr: [/.*/],
108
+ web: []
109
+ }
110
+ });
111
+ const isExternal = createIsExternal(viteServer, ctx.nuxt.options.rootDir);
112
+ node.shouldExternalize = async (id) => {
113
+ const result = await isExternal(id);
114
+ if (result?.external)
115
+ return resolve(result.id, { url: ctx.nuxt.options.rootDir });
116
+ return false;
117
+ };
118
+ return async (event) => {
119
+ const moduleId = decodeURI(event.req.url).substring(1);
120
+ if (moduleId === "/")
121
+ throw createError({ statusCode: 400 });
122
+ const module = await node.fetchModule(moduleId);
123
+ return module;
124
+ };
125
+ }));
126
+ return app.nodeHandler;
127
+ }
128
+ async function initViteNodeServer(ctx) {
129
+ let entryPath = resolve$1(ctx.nuxt.options.appDir, "entry.async.mjs");
130
+ if (!fse.existsSync(entryPath))
131
+ entryPath = resolve$1(ctx.nuxt.options.appDir, "entry.async.ts");
132
+ const host = ctx.nuxt.options.server.host || "localhost";
133
+ const port = ctx.nuxt.options.server.port || "3000";
134
+ const protocol = ctx.nuxt.options.server.https ? "https" : "http";
135
+ const viteNodeServerOptions = {
136
+ baseURL: `${protocol}://${host}:${port}/__nuxt_vite_node__`,
137
+ root: ctx.nuxt.options.srcDir,
138
+ entryPath,
139
+ base: ctx.ssrServer.config.base || "/_nuxt/"
140
+ };
141
+ process.env.NUXT_VITE_NODE_OPTIONS = JSON.stringify(viteNodeServerOptions);
142
+ const serverResolvedPath = resolve$1(distDir, "core/runtime/vite-node.mjs");
143
+ const manifestResolvedPath = resolve$1(distDir, "core/runtime/client.manifest.mjs");
144
+ await fse.writeFile(
145
+ resolve$1(ctx.nuxt.options.buildDir, "dist/server/server.mjs"),
146
+ `export { default } from ${JSON.stringify(pathToFileURL(serverResolvedPath).href)}`
147
+ );
148
+ await fse.writeFile(
149
+ resolve$1(ctx.nuxt.options.buildDir, "dist/server/client.manifest.mjs"),
150
+ `export { default } from ${JSON.stringify(pathToFileURL(manifestResolvedPath).href)}`
151
+ );
152
+ }
153
+
154
+ export { initViteNodeServer, registerViteNodeMiddleware, viteNodePlugin };
@@ -0,0 +1,2 @@
1
+ declare function _default(): Promise<any>;
2
+ export default _default;
@@ -0,0 +1,6 @@
1
+ import { $fetch } from 'ohmyfetch';
2
+ import { getViteNodeOptions } from './vite-node-shared.mjs';
3
+
4
+ const viteNodeOptions = getViteNodeOptions();
5
+
6
+ export default () => $fetch('/manifest', { baseURL: viteNodeOptions.baseURL });
@@ -1,6 +1,6 @@
1
- import { defineEventHandler } from "h3";
2
1
  import "node-fetch-native/polyfill";
3
- import { useRuntimeConfig } from "#internal/nitro";
2
+ import { defineEventHandler } from "h3";
3
+ import { defineCachedFunction, useRuntimeConfig } from "#internal/nitro";
4
4
  const getServerApp = cachedImport(() => import("#server"));
5
5
  const getFlowRenderer = cachedResult(async () => {
6
6
  const createFlowApp = await getServerApp();
@@ -12,6 +12,7 @@ export default defineEventHandler(async ({ context }) => {
12
12
  const flow = await getFlowRenderer();
13
13
  context.flow = flow;
14
14
  context.render = flow.render;
15
+ context.defineCachedFunction = defineCachedFunction;
15
16
  });
16
17
  function _interopDefault(e) {
17
18
  return e && typeof e === "object" && "default" in e ? e.default : e;
@@ -1,4 +1,10 @@
1
1
  import { eventHandler, useQuery } from "h3";
2
+ import { joinURL } from "ufo";
3
+ const normalizeCall = async (seo, ctx) => {
4
+ if (typeof seo === "function")
5
+ return await seo(ctx);
6
+ return seo || {};
7
+ };
2
8
  export default eventHandler(async (event) => {
3
9
  const url = event.req.url?.split("?")[0];
4
10
  const flow = event.context.flow;
@@ -9,48 +15,84 @@ export default eventHandler(async (event) => {
9
15
  const scripts = { head: [], bodyStart: [], bodyEnd: [] };
10
16
  const chunks = { head: [], body: [] };
11
17
  const generate = {};
12
- const { page, locale, params, view } = flow.router.byUrl.lookup(url) || {};
18
+ const { page, locale, params, view, name: pageName } = flow.router.byUrl.lookup(url) || {};
13
19
  if (!page)
14
20
  return;
15
- await flow.callHook("page:scripts", scripts);
16
21
  if (view.bundle)
17
22
  await flow.callHook("page:chunks", view.bundle, chunks);
18
23
  const templateContext = {};
19
- const dynamyc = params?._;
20
- const contextPage = {};
21
- const utils = Object.assign({ getLocale: () => locale }, flow.app.utils);
24
+ const dynamic = params?._;
25
+ const contextPage = {
26
+ chunks,
27
+ locale
28
+ };
29
+ const contextInject = {};
30
+ const utils = Object.assign({ getLocale: () => locale, injectContext: (key, value) => contextInject[key] = value, defineCachedFunction: event.context.defineCachedFunction }, flow.app.utils);
31
+ const contextHooks = {};
32
+ await flow.callHook("page:context", { localeCode: locale.code, page: pageName }, utils, contextHooks);
22
33
  templateContext.url = url;
34
+ templateContext.baseURL = flow.$config.app.baseURL;
35
+ const pageObject = {
36
+ name: pageName,
37
+ pathname: url,
38
+ url: joinURL(flow.site.origin, templateContext.baseURL, `${url}`),
39
+ origin: flow.site.origin,
40
+ joinOrigin: (_url, includeBase) => joinURL(flow.site.origin, includeBase ? templateContext.baseURL : "/", _url)
41
+ };
42
+ templateContext.page = pageObject;
43
+ contextPage.page = pageObject;
23
44
  templateContext.locale = locale;
24
45
  templateContext.view = view;
25
- if (dynamyc && page.dynamic) {
46
+ if (dynamic && page.dynamic) {
26
47
  const pages = await page.dynamic.method({ locale, utils });
27
- const dynamicPage = pages.find((_page) => _page.url === dynamyc);
48
+ const dynamicPage = pages.find((_page) => _page.url === dynamic);
28
49
  if (!dynamicPage)
29
50
  return;
30
51
  if (page.dynamic.assign)
31
52
  templateContext[page.dynamic.assign] = dynamicPage.context;
32
- contextPage.dynamyc = dynamicPage;
53
+ contextPage.dynamic = dynamicPage;
33
54
  }
34
55
  templateContext.seo = {};
35
- templateContext.context = {};
36
- templateContext.sharedContext = {};
56
+ const sharedContext = await utils.getSharedContext({
57
+ ...contextHooks,
58
+ ...contextPage,
59
+ utils
60
+ });
61
+ templateContext.sharedContext = sharedContext || {};
37
62
  templateContext.utils = utils;
38
- templateContext.seo = await page.seo?.({ ...contextPage, utils }) || {};
39
- templateContext.context = await page.context?.({ ...contextPage, utils }) || {};
63
+ templateContext.seo = await normalizeCall(page?.seo, { ...contextHooks, ...contextPage, utils, sharedContext });
64
+ const contexData = await page.context?.({ ...contextHooks, ...contextPage, utils, sharedContext }) || {};
65
+ templateContext.context = {
66
+ ...contextHooks,
67
+ ...contexData
68
+ };
69
+ await flow.callHook("page:scripts", scripts, templateContext);
40
70
  templateContext.getHeadScripts = () => {
41
71
  return scripts.head.join("\n");
42
72
  };
73
+ templateContext.getBodyEndScripts = () => {
74
+ return scripts.bodyEnd.join("\n");
75
+ };
43
76
  templateContext.getHeadChunks = () => {
44
77
  return chunks.head.join("\n");
45
78
  };
46
79
  templateContext.getBodyChunks = () => {
47
80
  return chunks.body.join("\n");
48
81
  };
82
+ templateContext.getInjectContext = () => {
83
+ return `<script id="__FLOW_DATA__" type="application/json">${JSON.stringify(contextInject)}<\/script>`;
84
+ };
49
85
  const query = useQuery(event);
50
86
  if (query?.context)
51
87
  return { ...templateContext, utils: Object.keys(utils) };
52
- const html = await flow.render(view, templateContext);
53
- event.res.setHeader("Content-Type", "text/html;charset=UTF-8");
88
+ let html;
89
+ if (view.render)
90
+ html = await view.render(templateContext, event);
91
+ else
92
+ html = await flow.render(view, templateContext);
93
+ event.res.setHeader("Content-Type", view.contentType || "text/html;charset=UTF-8");
94
+ if (view.postRender)
95
+ html = await view.postRender(html, event);
54
96
  if (flow.generate) {
55
97
  await flow.callHook("page:generate", generate);
56
98
  globalThis.generate = generate;
@@ -0,0 +1 @@
1
+ export function getViteNodeOptions(): any;
@@ -0,0 +1,8 @@
1
+ export interface ViteNodeRuntimeOptions {
2
+ baseURL: string
3
+ rootDir: string
4
+ entryPath: string
5
+ base: string
6
+ }
7
+
8
+ export function getViteNodeOptions (): ViteNodeRuntimeOptions;
@@ -0,0 +1,3 @@
1
+ export function getViteNodeOptions() {
2
+ return JSON.parse(process.env.NUXT_VITE_NODE_OPTIONS || '{}');
3
+ }
@@ -0,0 +1,2 @@
1
+ declare function _default(ssrContext: any): Promise<any>;
2
+ export default _default;
@@ -0,0 +1,42 @@
1
+ import { performance } from 'node:perf_hooks';
2
+ import { ViteNodeRunner } from 'vite-node/client';
3
+ import { $fetch } from 'ohmyfetch';
4
+ import consola from 'consola';
5
+ import { getViteNodeOptions } from './vite-node-shared.mjs';
6
+
7
+ const viteNodeOptions = getViteNodeOptions();
8
+ console.log(viteNodeOptions);
9
+ const runner = new ViteNodeRunner({
10
+ root: viteNodeOptions.root, // Equals to Nuxt `srcDir`
11
+ base: viteNodeOptions.base,
12
+ async fetchModule(id) {
13
+ return await $fetch(`/module/${encodeURI(id)}`, {
14
+ baseURL: viteNodeOptions.baseURL,
15
+ });
16
+ },
17
+ });
18
+
19
+ let render;
20
+
21
+ export default async(ssrContext) => {
22
+ // Workaround for stub mode
23
+ // https://github.com/nuxt/framework/pull/3983
24
+ process.server = true;
25
+
26
+ // Invalidate cache for files changed since last rendering
27
+ const invalidates = await $fetch('/invalidates', {
28
+ baseURL: viteNodeOptions.baseURL,
29
+ });
30
+ const updates = runner.moduleCache.invalidateDepTree(invalidates);
31
+
32
+ // Execute SSR bundle on demand
33
+ const start = performance.now();
34
+ render = render || (await runner.executeFile(viteNodeOptions.entryPath)).default;
35
+ if (updates.size) {
36
+ const time = Math.round((performance.now() - start) * 1000) / 1000;
37
+ consola.success(`Vite server hmr ${updates.size} files`, time ? `in ${time}ms` : '');
38
+ }
39
+
40
+ const result = await render(ssrContext);
41
+ return result;
42
+ };
@@ -1,6 +1,5 @@
1
1
  import { defineFlowPlugin } from "#app";
2
2
  export default defineFlowPlugin((flow) => {
3
3
  flow._useHead = (_meta) => {
4
- console.log(_meta);
5
4
  };
6
5
  });