@tanstack/start-plugin-core 1.20.3-alpha.1

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 (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +12 -0
  3. package/dist/cjs/compilers.cjs +402 -0
  4. package/dist/cjs/compilers.cjs.map +1 -0
  5. package/dist/cjs/compilers.d.cts +21 -0
  6. package/dist/cjs/extractHtmlScripts.cjs +35 -0
  7. package/dist/cjs/extractHtmlScripts.cjs.map +1 -0
  8. package/dist/cjs/extractHtmlScripts.d.cts +4 -0
  9. package/dist/cjs/index.cjs +15 -0
  10. package/dist/cjs/index.cjs.map +1 -0
  11. package/dist/cjs/index.d.cts +7 -0
  12. package/dist/cjs/nitro/build-nitro.cjs +18 -0
  13. package/dist/cjs/nitro/build-nitro.cjs.map +1 -0
  14. package/dist/cjs/nitro/build-nitro.d.cts +2 -0
  15. package/dist/cjs/nitro/build-sitemap.cjs +54 -0
  16. package/dist/cjs/nitro/build-sitemap.cjs.map +1 -0
  17. package/dist/cjs/nitro/build-sitemap.d.cts +9 -0
  18. package/dist/cjs/nitro/dev-server-plugin.cjs +128 -0
  19. package/dist/cjs/nitro/dev-server-plugin.cjs.map +1 -0
  20. package/dist/cjs/nitro/dev-server-plugin.d.cts +5 -0
  21. package/dist/cjs/nitro/nitro-plugin.cjs +128 -0
  22. package/dist/cjs/nitro/nitro-plugin.cjs.map +1 -0
  23. package/dist/cjs/nitro/nitro-plugin.d.cts +3 -0
  24. package/dist/cjs/plugin.cjs +117 -0
  25. package/dist/cjs/plugin.cjs.map +1 -0
  26. package/dist/cjs/plugin.d.cts +2713 -0
  27. package/dist/cjs/prerender.cjs +171 -0
  28. package/dist/cjs/prerender.cjs.map +1 -0
  29. package/dist/cjs/prerender.d.cts +8 -0
  30. package/dist/cjs/queue.cjs +131 -0
  31. package/dist/cjs/queue.cjs.map +1 -0
  32. package/dist/cjs/queue.d.cts +32 -0
  33. package/dist/cjs/routesManifestPlugin.cjs +165 -0
  34. package/dist/cjs/routesManifestPlugin.cjs.map +1 -0
  35. package/dist/cjs/routesManifestPlugin.d.cts +3 -0
  36. package/dist/cjs/schema.cjs +136 -0
  37. package/dist/cjs/schema.cjs.map +1 -0
  38. package/dist/cjs/schema.d.cts +8128 -0
  39. package/dist/cjs/start-compiler-plugin.cjs +72 -0
  40. package/dist/cjs/start-compiler-plugin.cjs.map +1 -0
  41. package/dist/cjs/start-compiler-plugin.d.cts +13 -0
  42. package/dist/cjs/start-server-routes-plugin/config.d.cts +49 -0
  43. package/dist/cjs/start-server-routes-plugin/plugin.cjs +608 -0
  44. package/dist/cjs/start-server-routes-plugin/plugin.cjs.map +1 -0
  45. package/dist/cjs/start-server-routes-plugin/plugin.d.cts +3 -0
  46. package/dist/cjs/start-server-routes-plugin/template.cjs +111 -0
  47. package/dist/cjs/start-server-routes-plugin/template.cjs.map +1 -0
  48. package/dist/cjs/start-server-routes-plugin/template.d.cts +34 -0
  49. package/dist/esm/compilers.d.ts +21 -0
  50. package/dist/esm/compilers.js +384 -0
  51. package/dist/esm/compilers.js.map +1 -0
  52. package/dist/esm/extractHtmlScripts.d.ts +4 -0
  53. package/dist/esm/extractHtmlScripts.js +18 -0
  54. package/dist/esm/extractHtmlScripts.js.map +1 -0
  55. package/dist/esm/index.d.ts +7 -0
  56. package/dist/esm/index.js +15 -0
  57. package/dist/esm/index.js.map +1 -0
  58. package/dist/esm/nitro/build-nitro.d.ts +2 -0
  59. package/dist/esm/nitro/build-nitro.js +18 -0
  60. package/dist/esm/nitro/build-nitro.js.map +1 -0
  61. package/dist/esm/nitro/build-sitemap.d.ts +9 -0
  62. package/dist/esm/nitro/build-sitemap.js +54 -0
  63. package/dist/esm/nitro/build-sitemap.js.map +1 -0
  64. package/dist/esm/nitro/dev-server-plugin.d.ts +5 -0
  65. package/dist/esm/nitro/dev-server-plugin.js +128 -0
  66. package/dist/esm/nitro/dev-server-plugin.js.map +1 -0
  67. package/dist/esm/nitro/nitro-plugin.d.ts +3 -0
  68. package/dist/esm/nitro/nitro-plugin.js +128 -0
  69. package/dist/esm/nitro/nitro-plugin.js.map +1 -0
  70. package/dist/esm/plugin.d.ts +2713 -0
  71. package/dist/esm/plugin.js +117 -0
  72. package/dist/esm/plugin.js.map +1 -0
  73. package/dist/esm/prerender.d.ts +8 -0
  74. package/dist/esm/prerender.js +171 -0
  75. package/dist/esm/prerender.js.map +1 -0
  76. package/dist/esm/queue.d.ts +32 -0
  77. package/dist/esm/queue.js +131 -0
  78. package/dist/esm/queue.js.map +1 -0
  79. package/dist/esm/routesManifestPlugin.d.ts +3 -0
  80. package/dist/esm/routesManifestPlugin.js +165 -0
  81. package/dist/esm/routesManifestPlugin.js.map +1 -0
  82. package/dist/esm/schema.d.ts +8128 -0
  83. package/dist/esm/schema.js +136 -0
  84. package/dist/esm/schema.js.map +1 -0
  85. package/dist/esm/start-compiler-plugin.d.ts +13 -0
  86. package/dist/esm/start-compiler-plugin.js +72 -0
  87. package/dist/esm/start-compiler-plugin.js.map +1 -0
  88. package/dist/esm/start-server-routes-plugin/config.d.ts +49 -0
  89. package/dist/esm/start-server-routes-plugin/plugin.d.ts +3 -0
  90. package/dist/esm/start-server-routes-plugin/plugin.js +608 -0
  91. package/dist/esm/start-server-routes-plugin/plugin.js.map +1 -0
  92. package/dist/esm/start-server-routes-plugin/template.d.ts +34 -0
  93. package/dist/esm/start-server-routes-plugin/template.js +111 -0
  94. package/dist/esm/start-server-routes-plugin/template.js.map +1 -0
  95. package/package.json +72 -0
  96. package/src/compilers.ts +759 -0
  97. package/src/extractHtmlScripts.ts +19 -0
  98. package/src/index.ts +15 -0
  99. package/src/nitro/build-nitro.ts +27 -0
  100. package/src/nitro/build-sitemap.ts +79 -0
  101. package/src/nitro/dev-server-plugin.ts +159 -0
  102. package/src/nitro/nitro-plugin.ts +161 -0
  103. package/src/plugin.ts +145 -0
  104. package/src/prerender.ts +245 -0
  105. package/src/queue.ts +153 -0
  106. package/src/routesManifestPlugin.ts +216 -0
  107. package/src/schema.ts +193 -0
  108. package/src/start-compiler-plugin.ts +111 -0
  109. package/src/start-server-routes-plugin/config.ts +8 -0
  110. package/src/start-server-routes-plugin/plugin.ts +890 -0
  111. package/src/start-server-routes-plugin/template.ts +164 -0
@@ -0,0 +1,117 @@
1
+ import path from "node:path";
2
+ import { createNitro } from "nitropack";
3
+ import { createTanStackStartOptionsSchema, createTanStackConfig } from "./schema.js";
4
+ import { nitroPlugin } from "./nitro/nitro-plugin.js";
5
+ import { startManifestPlugin } from "./routesManifestPlugin.js";
6
+ import { TanStackStartCompilerPlugin } from "./start-compiler-plugin.js";
7
+ createTanStackStartOptionsSchema();
8
+ createTanStackConfig();
9
+ const clientDistDir = ".tanstack-start/build/client-dist";
10
+ const ssrEntryFile = "ssr.mjs";
11
+ let ssrBundle;
12
+ function TanStackStartVitePluginCore(framework, opts) {
13
+ return [
14
+ {
15
+ name: "tanstack-start-core:config-client",
16
+ async config() {
17
+ const nitroOutputPublicDir = await (async () => {
18
+ const dummyNitroApp = await createNitro({
19
+ preset: opts.target,
20
+ compatibilityDate: "2024-12-01"
21
+ });
22
+ const nitroOutputPublicDir2 = dummyNitroApp.options.output.publicDir;
23
+ await dummyNitroApp.close();
24
+ return nitroOutputPublicDir2;
25
+ })();
26
+ return {
27
+ environments: {
28
+ client: {
29
+ consumer: "client",
30
+ build: {
31
+ manifest: true,
32
+ rollupOptions: {
33
+ input: {
34
+ main: opts.clientEntryPath
35
+ },
36
+ output: {
37
+ dir: path.resolve(opts.root, clientDistDir)
38
+ },
39
+ // TODO this should be removed
40
+ external: ["node:fs", "node:path", "node:os", "node:crypto"]
41
+ }
42
+ }
43
+ },
44
+ server: {
45
+ consumer: "server",
46
+ build: {
47
+ ssr: true,
48
+ // we don't write to the file system as the below 'capture-output' plugin will
49
+ // capture the output and write it to the virtual file system
50
+ write: false,
51
+ copyPublicDir: false,
52
+ rollupOptions: {
53
+ output: {
54
+ entryFileNames: ssrEntryFile
55
+ },
56
+ plugins: [
57
+ {
58
+ name: "capture-output",
59
+ generateBundle(options, bundle) {
60
+ ssrBundle = bundle;
61
+ }
62
+ }
63
+ ]
64
+ },
65
+ commonjsOptions: {
66
+ include: [/node_modules/]
67
+ }
68
+ }
69
+ }
70
+ },
71
+ resolve: {
72
+ noExternal: [
73
+ "@tanstack/start-client",
74
+ "@tanstack/start-client-core",
75
+ "@tanstack/start-server",
76
+ "@tanstack/start-server-core",
77
+ "@tanstack/start-server-functions-fetcher",
78
+ "@tanstack/start-server-functions-client",
79
+ "@tanstack/start-server-functions-server",
80
+ "@tanstack/start-router-manifest",
81
+ "@tanstack/start-config",
82
+ "@tanstack/server-functions-plugin",
83
+ "tanstack:start-manifest",
84
+ "tanstack:server-fn-manifest",
85
+ "nitropack",
86
+ "@tanstack/**"
87
+ ],
88
+ external: ["undici"]
89
+ },
90
+ /* prettier-ignore */
91
+ define: {
92
+ ...injectDefineEnv("TSS_PUBLIC_BASE", opts.public.base),
93
+ ...injectDefineEnv("TSS_CLIENT_BASE", opts.client.base),
94
+ ...injectDefineEnv("TSS_CLIENT_ENTRY", opts.clientEntryPath),
95
+ ...injectDefineEnv("TSS_SERVER_FN_BASE", opts.serverFns.base),
96
+ ...injectDefineEnv("TSS_OUTPUT_PUBLIC_DIR", nitroOutputPublicDir)
97
+ }
98
+ };
99
+ }
100
+ },
101
+ TanStackStartCompilerPlugin(framework),
102
+ startManifestPlugin(opts),
103
+ nitroPlugin(opts, () => ssrBundle)
104
+ ];
105
+ }
106
+ function injectDefineEnv(key, value) {
107
+ return {
108
+ [`process.env.${key}`]: JSON.stringify(value),
109
+ [`import.meta.env.${key}`]: JSON.stringify(value)
110
+ };
111
+ }
112
+ export {
113
+ TanStackStartVitePluginCore,
114
+ clientDistDir,
115
+ ssrEntryFile
116
+ };
117
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sources":["../../src/plugin.ts"],"sourcesContent":["import path from 'node:path'\nimport { createNitro } from 'nitropack'\nimport {\n createTanStackConfig,\n createTanStackStartOptionsSchema,\n} from './schema'\nimport { nitroPlugin } from './nitro/nitro-plugin'\nimport { startManifestPlugin } from './routesManifestPlugin'\nimport { TanStackStartCompilerPlugin } from './start-compiler-plugin'\nimport type { PluginOption, Rollup } from 'vite'\nimport type { z } from 'zod'\nimport type { CompileStartFrameworkOptions } from './compilers'\n\nconst TanStackStartOptionsSchema = createTanStackStartOptionsSchema()\nexport type TanStackStartInputConfig = z.input<\n typeof TanStackStartOptionsSchema\n>\n\nconst defaultConfig = createTanStackConfig()\nexport function getTanStackStartOptions(opts?: TanStackStartInputConfig) {\n return defaultConfig.parse(opts)\n}\n\nexport type TanStackStartOutputConfig = ReturnType<\n typeof getTanStackStartOptions\n>\n\nexport const clientDistDir = '.tanstack-start/build/client-dist'\nexport const ssrEntryFile = 'ssr.mjs'\n\n// this needs to live outside of the TanStackStartVitePluginCore since it will be invoked multiple times by vite\nlet ssrBundle: Rollup.OutputBundle\n\nexport function TanStackStartVitePluginCore(\n framework: CompileStartFrameworkOptions,\n opts: TanStackStartOutputConfig,\n): Array<PluginOption> {\n return [\n {\n name: 'tanstack-start-core:config-client',\n async config() {\n const nitroOutputPublicDir = await (async () => {\n // Create a dummy nitro app to get the resolved public output path\n const dummyNitroApp = await createNitro({\n preset: opts.target,\n compatibilityDate: '2024-12-01',\n })\n\n const nitroOutputPublicDir = dummyNitroApp.options.output.publicDir\n await dummyNitroApp.close()\n\n return nitroOutputPublicDir\n })()\n\n return {\n environments: {\n client: {\n consumer: 'client',\n build: {\n manifest: true,\n rollupOptions: {\n input: {\n main: opts.clientEntryPath,\n },\n output: {\n dir: path.resolve(opts.root, clientDistDir),\n },\n // TODO this should be removed\n external: ['node:fs', 'node:path', 'node:os', 'node:crypto'],\n },\n },\n },\n server: {\n consumer: 'server',\n build: {\n ssr: true,\n // we don't write to the file system as the below 'capture-output' plugin will\n // capture the output and write it to the virtual file system\n write: false,\n copyPublicDir: false,\n rollupOptions: {\n output: {\n entryFileNames: ssrEntryFile,\n },\n plugins: [\n {\n name: 'capture-output',\n generateBundle(options, bundle) {\n // TODO can this hook be called more than once?\n ssrBundle = bundle\n },\n },\n ],\n },\n commonjsOptions: {\n include: [/node_modules/],\n },\n },\n },\n },\n resolve: {\n noExternal: [\n '@tanstack/start-client',\n '@tanstack/start-client-core',\n '@tanstack/start-server',\n '@tanstack/start-server-core',\n '@tanstack/start-server-functions-fetcher',\n '@tanstack/start-server-functions-client',\n '@tanstack/start-server-functions-server',\n '@tanstack/start-router-manifest',\n '@tanstack/start-config',\n '@tanstack/server-functions-plugin',\n 'tanstack:start-manifest',\n 'tanstack:server-fn-manifest',\n 'nitropack',\n '@tanstack/**',\n ],\n external: ['undici'],\n },\n /* prettier-ignore */\n define: {\n ...injectDefineEnv('TSS_PUBLIC_BASE', opts.public.base),\n ...injectDefineEnv('TSS_CLIENT_BASE', opts.client.base),\n ...injectDefineEnv('TSS_CLIENT_ENTRY', opts.clientEntryPath),\n ...injectDefineEnv('TSS_SERVER_FN_BASE', opts.serverFns.base),\n ...injectDefineEnv('TSS_OUTPUT_PUBLIC_DIR', nitroOutputPublicDir),\n },\n }\n },\n },\n TanStackStartCompilerPlugin(framework),\n startManifestPlugin(opts),\n nitroPlugin(opts, () => ssrBundle),\n ]\n}\n\nfunction injectDefineEnv<TKey extends string, TValue extends string>(\n key: TKey,\n value: TValue,\n): { [P in `process.env.${TKey}` | `import.meta.env.${TKey}`]: TValue } {\n return {\n [`process.env.${key}`]: JSON.stringify(value),\n [`import.meta.env.${key}`]: JSON.stringify(value),\n } as { [P in `process.env.${TKey}` | `import.meta.env.${TKey}`]: TValue }\n}\n"],"names":["nitroOutputPublicDir"],"mappings":";;;;;;AAamC,iCAAiC;AAK9C,qBAAqB;AASpC,MAAM,gBAAgB;AACtB,MAAM,eAAe;AAG5B,IAAI;AAEY,SAAA,4BACd,WACA,MACqB;AACd,SAAA;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,MAAM,SAAS;AACP,cAAA,uBAAuB,OAAO,YAAY;AAExC,gBAAA,gBAAgB,MAAM,YAAY;AAAA,YACtC,QAAQ,KAAK;AAAA,YACb,mBAAmB;AAAA,UAAA,CACpB;AAEKA,gBAAAA,wBAAuB,cAAc,QAAQ,OAAO;AAC1D,gBAAM,cAAc,MAAM;AAEnBA,iBAAAA;AAAAA,QAAAA,GACN;AAEI,eAAA;AAAA,UACL,cAAc;AAAA,YACZ,QAAQ;AAAA,cACN,UAAU;AAAA,cACV,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,eAAe;AAAA,kBACb,OAAO;AAAA,oBACL,MAAM,KAAK;AAAA,kBACb;AAAA,kBACA,QAAQ;AAAA,oBACN,KAAK,KAAK,QAAQ,KAAK,MAAM,aAAa;AAAA,kBAC5C;AAAA;AAAA,kBAEA,UAAU,CAAC,WAAW,aAAa,WAAW,aAAa;AAAA,gBAAA;AAAA,cAC7D;AAAA,YAEJ;AAAA,YACA,QAAQ;AAAA,cACN,UAAU;AAAA,cACV,OAAO;AAAA,gBACL,KAAK;AAAA;AAAA;AAAA,gBAGL,OAAO;AAAA,gBACP,eAAe;AAAA,gBACf,eAAe;AAAA,kBACb,QAAQ;AAAA,oBACN,gBAAgB;AAAA,kBAClB;AAAA,kBACA,SAAS;AAAA,oBACP;AAAA,sBACE,MAAM;AAAA,sBACN,eAAe,SAAS,QAAQ;AAElB,oCAAA;AAAA,sBAAA;AAAA,oBACd;AAAA,kBACF;AAAA,gBAEJ;AAAA,gBACA,iBAAiB;AAAA,kBACf,SAAS,CAAC,cAAc;AAAA,gBAAA;AAAA,cAC1B;AAAA,YACF;AAAA,UAEJ;AAAA,UACA,SAAS;AAAA,YACP,YAAY;AAAA,cACV;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA,UAAU,CAAC,QAAQ;AAAA,UACrB;AAAA;AAAA,UAEA,QAAQ;AAAA,YACN,GAAG,gBAAgB,mBAAmB,KAAK,OAAO,IAAI;AAAA,YACtD,GAAG,gBAAgB,mBAAmB,KAAK,OAAO,IAAI;AAAA,YACtD,GAAG,gBAAgB,oBAAoB,KAAK,eAAe;AAAA,YAC3D,GAAG,gBAAgB,sBAAsB,KAAK,UAAU,IAAI;AAAA,YAC5D,GAAG,gBAAgB,yBAAyB,oBAAoB;AAAA,UAAA;AAAA,QAEpE;AAAA,MAAA;AAAA,IAEJ;AAAA,IACA,4BAA4B,SAAS;AAAA,IACrC,oBAAoB,IAAI;AAAA,IACxB,YAAY,MAAM,MAAM,SAAS;AAAA,EACnC;AACF;AAEA,SAAS,gBACP,KACA,OACsE;AAC/D,SAAA;AAAA,IACL,CAAC,eAAe,GAAG,EAAE,GAAG,KAAK,UAAU,KAAK;AAAA,IAC5C,CAAC,mBAAmB,GAAG,EAAE,GAAG,KAAK,UAAU,KAAK;AAAA,EAClD;AACF;"}
@@ -0,0 +1,8 @@
1
+ import { ViteBuilder } from 'vite';
2
+ import { Nitro } from 'nitropack';
3
+ import { TanStackStartOutputConfig } from './plugin.js';
4
+ export declare function prerender({ options, nitro, builder, }: {
5
+ options: TanStackStartOutputConfig;
6
+ nitro: Nitro;
7
+ builder: ViteBuilder;
8
+ }): Promise<void>;
@@ -0,0 +1,171 @@
1
+ import { promises } from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { getRollupConfig } from "nitropack/rollup";
5
+ import { createNitro, build } from "nitropack";
6
+ import { withBase, joinURL, withoutBase } from "ufo";
7
+ import { Queue } from "./queue.js";
8
+ import { buildNitroEnvironment } from "./nitro/build-nitro.js";
9
+ async function prerender({
10
+ options,
11
+ nitro,
12
+ builder
13
+ }) {
14
+ var _a;
15
+ nitro.logger.info("Prendering pages...");
16
+ if (((_a = options.prerender) == null ? void 0 : _a.enabled) && !options.pages.length) {
17
+ options.pages = [
18
+ {
19
+ path: "/"
20
+ }
21
+ ];
22
+ }
23
+ const serverEnv = builder.environments["server"];
24
+ if (!serverEnv) {
25
+ throw new Error(`Vite's "server" environment not found`);
26
+ }
27
+ const prerenderOutputDir = path.resolve(
28
+ options.root,
29
+ ".tanstack-start/build/prerenderer"
30
+ );
31
+ const nodeNitro = await createNitro({
32
+ ...nitro.options._config,
33
+ preset: "nitro-prerender",
34
+ logLevel: 0,
35
+ output: {
36
+ dir: prerenderOutputDir,
37
+ serverDir: path.resolve(prerenderOutputDir, "server"),
38
+ publicDir: path.resolve(prerenderOutputDir, "public")
39
+ }
40
+ });
41
+ const nodeNitroRollupOptions = getRollupConfig(nodeNitro);
42
+ const build$1 = serverEnv.config.build;
43
+ build$1.outDir = prerenderOutputDir;
44
+ build$1.rollupOptions = {
45
+ ...build$1.rollupOptions,
46
+ ...nodeNitroRollupOptions,
47
+ output: {
48
+ ...build$1.rollupOptions.output,
49
+ ...nodeNitroRollupOptions.output,
50
+ sourcemap: void 0
51
+ }
52
+ };
53
+ await buildNitroEnvironment(nodeNitro, () => build(nodeNitro));
54
+ const serverFilename = typeof nodeNitroRollupOptions.output.entryFileNames === "string" ? nodeNitroRollupOptions.output.entryFileNames : "index.mjs";
55
+ const serverEntrypoint = path.resolve(
56
+ path.join(nodeNitro.options.output.serverDir, serverFilename)
57
+ );
58
+ const { closePrerenderer, localFetch } = await import(serverEntrypoint);
59
+ try {
60
+ const pages = await prerenderPages();
61
+ nitro.logger.info(`Prerendered ${pages.length} pages:`);
62
+ pages.forEach((page) => {
63
+ nitro.logger.info(`- ${page}`);
64
+ });
65
+ } catch (error) {
66
+ nitro.logger.error(error);
67
+ } finally {
68
+ closePrerenderer();
69
+ }
70
+ function extractLinks(html) {
71
+ const linkRegex = /<a[^>]+href=["']([^"']+)["'][^>]*>/g;
72
+ const links = [];
73
+ let match;
74
+ while ((match = linkRegex.exec(html)) !== null) {
75
+ const href = match[1];
76
+ if (href && (href.startsWith("/") || href.startsWith("./"))) {
77
+ links.push(href);
78
+ }
79
+ }
80
+ return links;
81
+ }
82
+ async function prerenderPages() {
83
+ var _a2;
84
+ const seen = /* @__PURE__ */ new Set();
85
+ const retriesByPath = /* @__PURE__ */ new Map();
86
+ const concurrency = ((_a2 = options.prerender) == null ? void 0 : _a2.concurrency) ?? os.cpus().length;
87
+ nitro.logger.info(`Concurrency: ${concurrency}`);
88
+ const queue = new Queue({ concurrency });
89
+ options.pages.forEach((_page) => {
90
+ let page = _page;
91
+ if (typeof _page === "string") {
92
+ page = { path: _page };
93
+ }
94
+ addCrawlPageTask(page);
95
+ });
96
+ await queue.start();
97
+ return Array.from(seen);
98
+ function addCrawlPageTask(page) {
99
+ var _a3, _b;
100
+ if (seen.has(page.path)) return;
101
+ seen.add(page.path);
102
+ if (page.fromCrawl) {
103
+ options.pages.push(page);
104
+ }
105
+ if (!(((_a3 = page.prerender) == null ? void 0 : _a3.enabled) ?? true)) return;
106
+ if (((_b = options.prerender) == null ? void 0 : _b.filter) && !options.prerender.filter(page)) return;
107
+ const prerenderOptions = {
108
+ ...options.prerender,
109
+ ...page.prerender
110
+ };
111
+ queue.add(async () => {
112
+ var _a4;
113
+ nitro.logger.info(`Crawling: ${page.path}`);
114
+ const retries = retriesByPath.get(page.path) || 0;
115
+ try {
116
+ const encodedRoute = encodeURI(page.path);
117
+ const res = await localFetch(
118
+ withBase(encodedRoute, nodeNitro.options.baseURL),
119
+ {
120
+ headers: { "x-nitro-prerender": encodedRoute }
121
+ }
122
+ );
123
+ if (!res.ok) {
124
+ throw new Error(`Failed to fetch ${page.path}: ${res.statusText}`);
125
+ }
126
+ const contentType = res.headers.get("content-type") || "";
127
+ const isImplicitHTML = !page.path.endsWith(".html") && contentType.includes("html");
128
+ const routeWithIndex = page.path.endsWith("/") ? page.path + "index" : page.path;
129
+ const htmlPath = page.path.endsWith("/") || prerenderOptions.autoSubfolderIndex ? joinURL(page.path, "index.html") : page.path + ".html";
130
+ const filename = withoutBase(
131
+ isImplicitHTML ? htmlPath : routeWithIndex,
132
+ nitro.options.baseURL
133
+ );
134
+ const html = await res.text();
135
+ const filepath = path.join(nitro.options.output.publicDir, filename);
136
+ await promises.mkdir(path.dirname(filepath), {
137
+ recursive: true
138
+ });
139
+ await promises.writeFile(filepath, html);
140
+ const newPage = await ((_a4 = prerenderOptions.onSuccess) == null ? void 0 : _a4.call(prerenderOptions, { page, html }));
141
+ if (newPage) {
142
+ Object.assign(page, newPage);
143
+ }
144
+ if (prerenderOptions.crawlLinks ?? true) {
145
+ const links = extractLinks(html);
146
+ for (const link of links) {
147
+ addCrawlPageTask({ path: link, fromCrawl: true });
148
+ }
149
+ }
150
+ } catch (error) {
151
+ if (retries < (prerenderOptions.retryCount ?? 0)) {
152
+ nitro.logger.warn(
153
+ `Encountered error, retrying: ${page.path} in 500ms`
154
+ );
155
+ await new Promise(
156
+ (resolve) => setTimeout(resolve, prerenderOptions.retryDelay)
157
+ );
158
+ retriesByPath.set(page.path, retries + 1);
159
+ addCrawlPageTask(page);
160
+ } else {
161
+ throw error;
162
+ }
163
+ }
164
+ });
165
+ }
166
+ }
167
+ }
168
+ export {
169
+ prerender
170
+ };
171
+ //# sourceMappingURL=prerender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prerender.js","sources":["../../src/prerender.ts"],"sourcesContent":["import { promises as fsp } from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { getRollupConfig } from 'nitropack/rollup'\nimport { build as buildNitro, createNitro } from 'nitropack'\nimport { joinURL, withBase, withoutBase } from 'ufo'\nimport { Queue } from './queue'\nimport { buildNitroEnvironment } from './nitro/build-nitro'\nimport type { ViteBuilder } from 'vite'\nimport type { $Fetch, Nitro } from 'nitropack'\nimport type { TanStackStartOutputConfig } from './plugin'\nimport type { Page } from './schema'\n\nexport async function prerender({\n options,\n nitro,\n builder,\n}: {\n options: TanStackStartOutputConfig\n nitro: Nitro\n builder: ViteBuilder\n}) {\n nitro.logger.info('Prendering pages...')\n\n // If prerender is enabled but no pages are provided, default to prerendering the root page\n if (options.prerender?.enabled && !options.pages.length) {\n options.pages = [\n {\n path: '/',\n },\n ]\n }\n\n const serverEnv = builder.environments['server']\n\n if (!serverEnv) {\n throw new Error(`Vite's \"server\" environment not found`)\n }\n\n const prerenderOutputDir = path.resolve(\n options.root,\n '.tanstack-start/build/prerenderer',\n )\n\n const nodeNitro = await createNitro({\n ...nitro.options._config,\n preset: 'nitro-prerender',\n logLevel: 0,\n output: {\n dir: prerenderOutputDir,\n serverDir: path.resolve(prerenderOutputDir, 'server'),\n publicDir: path.resolve(prerenderOutputDir, 'public'),\n },\n })\n\n const nodeNitroRollupOptions = getRollupConfig(nodeNitro)\n\n const build = serverEnv.config.build\n\n build.outDir = prerenderOutputDir\n\n build.rollupOptions = {\n ...build.rollupOptions,\n ...nodeNitroRollupOptions,\n output: {\n ...build.rollupOptions.output,\n ...nodeNitroRollupOptions.output,\n sourcemap: undefined,\n },\n }\n\n await buildNitroEnvironment(nodeNitro, () => buildNitro(nodeNitro))\n\n // Import renderer entry\n const serverFilename =\n typeof nodeNitroRollupOptions.output.entryFileNames === 'string'\n ? nodeNitroRollupOptions.output.entryFileNames\n : 'index.mjs'\n\n const serverEntrypoint = path.resolve(\n path.join(nodeNitro.options.output.serverDir, serverFilename),\n )\n\n const { closePrerenderer, localFetch } = (await import(serverEntrypoint)) as {\n closePrerenderer: () => void\n localFetch: $Fetch\n }\n\n try {\n // Crawl all pages\n const pages = await prerenderPages()\n\n nitro.logger.info(`Prerendered ${pages.length} pages:`)\n pages.forEach((page) => {\n nitro.logger.info(`- ${page}`)\n })\n\n // TODO: Write the prerendered pages to the output directory\n } catch (error) {\n nitro.logger.error(error)\n } finally {\n // Ensure server is always closed\n // server.process.kill()\n closePrerenderer()\n }\n\n function extractLinks(html: string): Array<string> {\n const linkRegex = /<a[^>]+href=[\"']([^\"']+)[\"'][^>]*>/g\n const links: Array<string> = []\n let match\n\n while ((match = linkRegex.exec(html)) !== null) {\n const href = match[1]\n if (href && (href.startsWith('/') || href.startsWith('./'))) {\n links.push(href)\n }\n }\n\n return links\n }\n\n async function prerenderPages() {\n const seen = new Set<string>()\n const retriesByPath = new Map<string, number>()\n const concurrency = options.prerender?.concurrency ?? os.cpus().length\n nitro.logger.info(`Concurrency: ${concurrency}`)\n const queue = new Queue({ concurrency })\n\n options.pages.forEach((_page) => {\n let page = _page as Page\n\n if (typeof _page === 'string') {\n page = { path: _page }\n }\n\n addCrawlPageTask(page)\n })\n\n await queue.start()\n\n return Array.from(seen)\n\n function addCrawlPageTask(page: Page) {\n // Was the page already seen?\n if (seen.has(page.path)) return\n\n // Add the page to the seen set\n seen.add(page.path)\n\n if (page.fromCrawl) {\n options.pages.push(page)\n }\n\n // If not enabled, skip\n if (!(page.prerender?.enabled ?? true)) return\n\n // If there is a filter link, check if the page should be prerendered\n if (options.prerender?.filter && !options.prerender.filter(page)) return\n\n // Resolve the merged default and page-specific prerender options\n const prerenderOptions = {\n ...options.prerender,\n ...page.prerender,\n }\n\n // Add the task\n queue.add(async () => {\n nitro.logger.info(`Crawling: ${page.path}`)\n const retries = retriesByPath.get(page.path) || 0\n try {\n // Fetch the route\n const encodedRoute = encodeURI(page.path)\n\n const res = await localFetch<Response>(\n withBase(encodedRoute, nodeNitro.options.baseURL),\n {\n headers: { 'x-nitro-prerender': encodedRoute },\n },\n )\n\n if (!res.ok) {\n throw new Error(`Failed to fetch ${page.path}: ${res.statusText}`)\n }\n\n // Guess route type and populate fileName\n const contentType = res.headers.get('content-type') || ''\n const isImplicitHTML =\n !page.path.endsWith('.html') && contentType.includes('html')\n // &&\n // !JsonSigRx.test(dataBuff.subarray(0, 32).toString('utf8'))\n const routeWithIndex = page.path.endsWith('/')\n ? page.path + 'index'\n : page.path\n\n const htmlPath =\n page.path.endsWith('/') || prerenderOptions.autoSubfolderIndex\n ? joinURL(page.path, 'index.html')\n : page.path + '.html'\n\n const filename = withoutBase(\n isImplicitHTML ? htmlPath : routeWithIndex,\n nitro.options.baseURL,\n )\n\n const html = await res.text()\n\n const filepath = path.join(nitro.options.output.publicDir, filename)\n\n await fsp.mkdir(path.dirname(filepath), {\n recursive: true,\n })\n\n await fsp.writeFile(filepath, html)\n\n const newPage = await prerenderOptions.onSuccess?.({ page, html })\n\n if (newPage) {\n Object.assign(page, newPage)\n }\n\n // Find new links\n if (prerenderOptions.crawlLinks ?? true) {\n const links = extractLinks(html)\n for (const link of links) {\n addCrawlPageTask({ path: link, fromCrawl: true })\n }\n }\n } catch (error) {\n if (retries < (prerenderOptions.retryCount ?? 0)) {\n nitro.logger.warn(\n `Encountered error, retrying: ${page.path} in 500ms`,\n )\n await new Promise((resolve) =>\n setTimeout(resolve, prerenderOptions.retryDelay),\n )\n retriesByPath.set(page.path, retries + 1)\n addCrawlPageTask(page)\n } else {\n throw error\n }\n }\n })\n }\n }\n}\n"],"names":["build","buildNitro","_a","fsp"],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ interface PoolConfig {
2
+ concurrency?: number;
3
+ started?: boolean;
4
+ tasks?: Array<() => Promise<any>>;
5
+ }
6
+ export declare class Queue<T> {
7
+ private onSettles;
8
+ private onErrors;
9
+ private onSuccesses;
10
+ private running;
11
+ private active;
12
+ private pending;
13
+ private currentConcurrency;
14
+ constructor(config?: PoolConfig);
15
+ private tick;
16
+ add(fn: () => Promise<T> | T, { priority }?: {
17
+ priority?: boolean;
18
+ }): Promise<any>;
19
+ throttle(n: number): void;
20
+ onSettled(cb: () => void): () => void;
21
+ onError(cb: (error: any, task: () => Promise<any>) => void): () => void;
22
+ onSuccess(cb: (result: any, task: () => Promise<any>) => void): () => void;
23
+ stop(): void;
24
+ start(): Promise<void>;
25
+ clear(): void;
26
+ getActive(): (() => Promise<any>)[];
27
+ getPending(): (() => Promise<any>)[];
28
+ getAll(): (() => Promise<any>)[];
29
+ isRunning(): boolean;
30
+ isSettled(): boolean;
31
+ }
32
+ export {};
@@ -0,0 +1,131 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
+ const defaultConfig = {
5
+ concurrency: 5,
6
+ started: false,
7
+ tasks: []
8
+ };
9
+ class Queue {
10
+ constructor(config = defaultConfig) {
11
+ __publicField(this, "onSettles", []);
12
+ __publicField(this, "onErrors", []);
13
+ __publicField(this, "onSuccesses", []);
14
+ __publicField(this, "running");
15
+ __publicField(this, "active", []);
16
+ __publicField(this, "pending");
17
+ __publicField(this, "currentConcurrency");
18
+ const { concurrency, started, tasks } = {
19
+ ...defaultConfig,
20
+ ...config
21
+ };
22
+ this.running = started;
23
+ this.pending = tasks;
24
+ this.currentConcurrency = concurrency;
25
+ }
26
+ tick() {
27
+ if (!this.running) {
28
+ return;
29
+ }
30
+ while (this.active.length < this.currentConcurrency && this.pending.length) {
31
+ const nextFn = this.pending.shift();
32
+ if (!nextFn) {
33
+ throw new Error("Found task that is not a function");
34
+ }
35
+ this.active.push(nextFn);
36
+ (async () => {
37
+ let success = false;
38
+ let res;
39
+ let error;
40
+ try {
41
+ res = await nextFn();
42
+ success = true;
43
+ } catch (e) {
44
+ error = e;
45
+ }
46
+ this.active = this.active.filter((d) => d !== nextFn);
47
+ if (success) {
48
+ this.onSuccesses.forEach((d) => d(res, nextFn));
49
+ } else {
50
+ this.onErrors.forEach((d) => d(error, nextFn));
51
+ }
52
+ this.onSettles.forEach((d) => d(res, error));
53
+ this.tick();
54
+ })();
55
+ }
56
+ }
57
+ add(fn, { priority } = {}) {
58
+ return new Promise((resolve, reject) => {
59
+ const task = () => Promise.resolve(fn()).then((res) => {
60
+ resolve(res);
61
+ return res;
62
+ }).catch((err) => {
63
+ reject(err);
64
+ throw err;
65
+ });
66
+ if (priority) {
67
+ this.pending.unshift(task);
68
+ } else {
69
+ this.pending.push(task);
70
+ }
71
+ this.tick();
72
+ });
73
+ }
74
+ throttle(n) {
75
+ this.currentConcurrency = n;
76
+ }
77
+ onSettled(cb) {
78
+ this.onSettles.push(cb);
79
+ return () => {
80
+ this.onSettles = this.onSettles.filter((d) => d !== cb);
81
+ };
82
+ }
83
+ onError(cb) {
84
+ this.onErrors.push(cb);
85
+ return () => {
86
+ this.onErrors = this.onErrors.filter((d) => d !== cb);
87
+ };
88
+ }
89
+ onSuccess(cb) {
90
+ this.onSuccesses.push(cb);
91
+ return () => {
92
+ this.onSuccesses = this.onSuccesses.filter((d) => d !== cb);
93
+ };
94
+ }
95
+ stop() {
96
+ this.running = false;
97
+ }
98
+ start() {
99
+ this.running = true;
100
+ this.tick();
101
+ return new Promise((resolve) => {
102
+ this.onSettled(() => {
103
+ if (this.isSettled()) {
104
+ resolve();
105
+ }
106
+ });
107
+ });
108
+ }
109
+ clear() {
110
+ this.pending = [];
111
+ }
112
+ getActive() {
113
+ return this.active;
114
+ }
115
+ getPending() {
116
+ return this.pending;
117
+ }
118
+ getAll() {
119
+ return [...this.active, ...this.pending];
120
+ }
121
+ isRunning() {
122
+ return this.running;
123
+ }
124
+ isSettled() {
125
+ return !this.active.length && !this.pending.length;
126
+ }
127
+ }
128
+ export {
129
+ Queue
130
+ };
131
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sources":["../../src/queue.ts"],"sourcesContent":["interface PoolConfig {\n concurrency?: number\n started?: boolean\n tasks?: Array<() => Promise<any>>\n}\n\nconst defaultConfig: PoolConfig = {\n concurrency: 5,\n started: false,\n tasks: [],\n}\n\nexport class Queue<T> {\n private onSettles: Array<(res: any, error: any) => void> = []\n private onErrors: Array<(error: any, task: () => Promise<any>) => void> = []\n private onSuccesses: Array<(result: any, task: () => Promise<any>) => void> =\n []\n private running: boolean\n private active: Array<() => Promise<any>> = []\n private pending: Array<() => Promise<any>>\n private currentConcurrency: number\n\n constructor(config: PoolConfig = defaultConfig) {\n const { concurrency, started, tasks } = {\n ...defaultConfig,\n ...config,\n }\n this.running = started!\n this.pending = tasks as Array<() => Promise<any>>\n this.currentConcurrency = concurrency!\n }\n\n private tick() {\n if (!this.running) {\n return\n }\n while (\n this.active.length < this.currentConcurrency &&\n this.pending.length\n ) {\n const nextFn = this.pending.shift()\n if (!nextFn) {\n throw new Error('Found task that is not a function')\n }\n this.active.push(nextFn)\n ;(async () => {\n let success = false\n let res!: T\n let error: any\n try {\n res = await nextFn()\n success = true\n } catch (e) {\n error = e\n }\n this.active = this.active.filter((d) => d !== nextFn)\n if (success) {\n this.onSuccesses.forEach((d) => d(res, nextFn))\n } else {\n this.onErrors.forEach((d) => d(error, nextFn))\n }\n this.onSettles.forEach((d) => d(res, error))\n this.tick()\n })()\n }\n }\n\n add(fn: () => Promise<T> | T, { priority }: { priority?: boolean } = {}) {\n return new Promise<any>((resolve, reject) => {\n const task = () =>\n Promise.resolve(fn())\n .then((res) => {\n resolve(res)\n return res\n })\n .catch((err) => {\n reject(err)\n throw err\n })\n if (priority) {\n this.pending.unshift(task)\n } else {\n this.pending.push(task)\n }\n this.tick()\n })\n }\n\n throttle(n: number) {\n this.currentConcurrency = n\n }\n\n onSettled(cb: () => void) {\n this.onSettles.push(cb)\n return () => {\n this.onSettles = this.onSettles.filter((d) => d !== cb)\n }\n }\n\n onError(cb: (error: any, task: () => Promise<any>) => void) {\n this.onErrors.push(cb)\n return () => {\n this.onErrors = this.onErrors.filter((d) => d !== cb)\n }\n }\n\n onSuccess(cb: (result: any, task: () => Promise<any>) => void) {\n this.onSuccesses.push(cb)\n return () => {\n this.onSuccesses = this.onSuccesses.filter((d) => d !== cb)\n }\n }\n\n stop() {\n this.running = false\n }\n\n start() {\n this.running = true\n this.tick()\n return new Promise<void>((resolve) => {\n this.onSettled(() => {\n if (this.isSettled()) {\n resolve()\n }\n })\n })\n }\n\n clear() {\n this.pending = []\n }\n\n getActive() {\n return this.active\n }\n\n getPending() {\n return this.pending\n }\n\n getAll() {\n return [...this.active, ...this.pending]\n }\n\n isRunning() {\n return this.running\n }\n\n isSettled() {\n return !this.active.length && !this.pending.length\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { PluginOption } from 'vite';
2
+ import { TanStackStartOutputConfig } from './plugin.js';
3
+ export declare function startManifestPlugin(opts: TanStackStartOutputConfig): PluginOption;