@tanstack/start-plugin-core 1.131.10 → 1.132.0-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 (145) hide show
  1. package/dist/esm/{nitro-plugin/build-sitemap.d.ts → build-sitemap.d.ts} +3 -3
  2. package/dist/esm/{nitro-plugin/build-sitemap.js → build-sitemap.js} +19 -24
  3. package/dist/esm/build-sitemap.js.map +1 -0
  4. package/dist/esm/compilers.js +7 -10
  5. package/dist/esm/compilers.js.map +1 -1
  6. package/dist/esm/constants.d.ts +6 -2
  7. package/dist/esm/constants.js +7 -10
  8. package/dist/esm/constants.js.map +1 -1
  9. package/dist/esm/debug.js.map +1 -1
  10. package/dist/esm/dev-server-plugin/extract-html-scripts.js.map +1 -1
  11. package/dist/esm/dev-server-plugin/plugin.d.ts +5 -5
  12. package/dist/esm/dev-server-plugin/plugin.js +117 -79
  13. package/dist/esm/dev-server-plugin/plugin.js.map +1 -1
  14. package/dist/esm/index.d.ts +2 -1
  15. package/dist/esm/index.js +2 -4
  16. package/dist/esm/load-env-plugin/plugin.d.ts +2 -3
  17. package/dist/esm/load-env-plugin/plugin.js +5 -8
  18. package/dist/esm/load-env-plugin/plugin.js.map +1 -1
  19. package/dist/esm/output-directory.d.ts +3 -0
  20. package/dist/esm/output-directory.js +14 -0
  21. package/dist/esm/output-directory.js.map +1 -0
  22. package/dist/esm/plugin.d.ts +6 -290
  23. package/dist/esm/plugin.js +135 -76
  24. package/dist/esm/plugin.js.map +1 -1
  25. package/dist/esm/post-server-build.d.ts +7 -0
  26. package/dist/esm/post-server-build.js +55 -0
  27. package/dist/esm/post-server-build.js.map +1 -0
  28. package/dist/esm/prerender.d.ts +11 -0
  29. package/dist/esm/{nitro-plugin/prerender.js → prerender.js} +85 -73
  30. package/dist/esm/prerender.js.map +1 -0
  31. package/dist/esm/{nitro-plugin/queue.js → queue.js} +7 -10
  32. package/dist/esm/queue.js.map +1 -0
  33. package/dist/esm/resolve-entries.d.ts +8 -0
  34. package/dist/esm/resolve-entries.js +37 -0
  35. package/dist/esm/resolve-entries.js.map +1 -0
  36. package/dist/esm/schema.d.ts +1369 -6719
  37. package/dist/esm/schema.js +52 -85
  38. package/dist/esm/schema.js.map +1 -1
  39. package/dist/esm/start-compiler-plugin.js +2 -2
  40. package/dist/esm/start-compiler-plugin.js.map +1 -1
  41. package/dist/esm/start-manifest-plugin/plugin.d.ts +1 -1
  42. package/dist/esm/start-manifest-plugin/plugin.js +8 -13
  43. package/dist/esm/start-manifest-plugin/plugin.js.map +1 -1
  44. package/dist/esm/start-router-plugin/generator-plugins/routes-manifest-plugin.js +2 -3
  45. package/dist/esm/start-router-plugin/generator-plugins/routes-manifest-plugin.js.map +1 -1
  46. package/dist/esm/start-router-plugin/generator-plugins/server-routes-plugin.js +2 -4
  47. package/dist/esm/start-router-plugin/generator-plugins/server-routes-plugin.js.map +1 -1
  48. package/dist/esm/start-router-plugin/plugin.js.map +1 -1
  49. package/dist/esm/start-router-plugin/route-tree-client-plugin.js.map +1 -1
  50. package/dist/esm/start-router-plugin/virtual-route-tree-plugin.js.map +1 -1
  51. package/dist/esm/utils.js.map +1 -1
  52. package/package.json +13 -18
  53. package/src/{nitro-plugin/build-sitemap.ts → build-sitemap.ts} +8 -8
  54. package/src/constants.ts +12 -9
  55. package/src/dev-server-plugin/plugin.ts +140 -99
  56. package/src/global.d.ts +0 -2
  57. package/src/index.ts +3 -5
  58. package/src/load-env-plugin/plugin.ts +6 -11
  59. package/src/output-directory.ts +18 -0
  60. package/src/plugin.ts +172 -98
  61. package/src/post-server-build.ts +73 -0
  62. package/src/{nitro-plugin/prerender.ts → prerender.ts} +93 -86
  63. package/src/resolve-entries.ts +52 -0
  64. package/src/schema.ts +88 -121
  65. package/src/start-manifest-plugin/plugin.ts +8 -14
  66. package/dist/cjs/compilers.cjs +0 -416
  67. package/dist/cjs/compilers.cjs.map +0 -1
  68. package/dist/cjs/compilers.d.cts +0 -21
  69. package/dist/cjs/constants.cjs +0 -20
  70. package/dist/cjs/constants.cjs.map +0 -1
  71. package/dist/cjs/constants.d.cts +0 -6
  72. package/dist/cjs/debug.cjs +0 -5
  73. package/dist/cjs/debug.cjs.map +0 -1
  74. package/dist/cjs/debug.d.cts +0 -1
  75. package/dist/cjs/dev-server-plugin/extract-html-scripts.cjs +0 -35
  76. package/dist/cjs/dev-server-plugin/extract-html-scripts.cjs.map +0 -1
  77. package/dist/cjs/dev-server-plugin/extract-html-scripts.d.cts +0 -4
  78. package/dist/cjs/dev-server-plugin/plugin.cjs +0 -121
  79. package/dist/cjs/dev-server-plugin/plugin.cjs.map +0 -1
  80. package/dist/cjs/dev-server-plugin/plugin.d.cts +0 -5
  81. package/dist/cjs/index.cjs +0 -11
  82. package/dist/cjs/index.cjs.map +0 -1
  83. package/dist/cjs/index.d.cts +0 -3
  84. package/dist/cjs/load-env-plugin/plugin.cjs +0 -34
  85. package/dist/cjs/load-env-plugin/plugin.cjs.map +0 -1
  86. package/dist/cjs/load-env-plugin/plugin.d.cts +0 -3
  87. package/dist/cjs/nitro-plugin/build-sitemap.cjs +0 -138
  88. package/dist/cjs/nitro-plugin/build-sitemap.cjs.map +0 -1
  89. package/dist/cjs/nitro-plugin/build-sitemap.d.cts +0 -31
  90. package/dist/cjs/nitro-plugin/plugin.cjs +0 -187
  91. package/dist/cjs/nitro-plugin/plugin.cjs.map +0 -1
  92. package/dist/cjs/nitro-plugin/plugin.d.cts +0 -3
  93. package/dist/cjs/nitro-plugin/prerender.cjs +0 -178
  94. package/dist/cjs/nitro-plugin/prerender.cjs.map +0 -1
  95. package/dist/cjs/nitro-plugin/prerender.d.cts +0 -8
  96. package/dist/cjs/nitro-plugin/queue.cjs +0 -131
  97. package/dist/cjs/nitro-plugin/queue.cjs.map +0 -1
  98. package/dist/cjs/nitro-plugin/queue.d.cts +0 -32
  99. package/dist/cjs/plugin.cjs +0 -227
  100. package/dist/cjs/plugin.cjs.map +0 -1
  101. package/dist/cjs/plugin.d.cts +0 -300
  102. package/dist/cjs/resolve-virtual-entries-plugin/plugin.cjs +0 -80
  103. package/dist/cjs/resolve-virtual-entries-plugin/plugin.cjs.map +0 -1
  104. package/dist/cjs/resolve-virtual-entries-plugin/plugin.d.cts +0 -3
  105. package/dist/cjs/schema.cjs +0 -158
  106. package/dist/cjs/schema.cjs.map +0 -1
  107. package/dist/cjs/schema.d.cts +0 -8878
  108. package/dist/cjs/start-compiler-plugin.cjs +0 -78
  109. package/dist/cjs/start-compiler-plugin.cjs.map +0 -1
  110. package/dist/cjs/start-compiler-plugin.d.cts +0 -13
  111. package/dist/cjs/start-manifest-plugin/plugin.cjs +0 -182
  112. package/dist/cjs/start-manifest-plugin/plugin.cjs.map +0 -1
  113. package/dist/cjs/start-manifest-plugin/plugin.d.cts +0 -6
  114. package/dist/cjs/start-router-plugin/generator-plugins/routes-manifest-plugin.cjs +0 -39
  115. package/dist/cjs/start-router-plugin/generator-plugins/routes-manifest-plugin.cjs.map +0 -1
  116. package/dist/cjs/start-router-plugin/generator-plugins/routes-manifest-plugin.d.cts +0 -6
  117. package/dist/cjs/start-router-plugin/generator-plugins/server-routes-plugin.cjs +0 -121
  118. package/dist/cjs/start-router-plugin/generator-plugins/server-routes-plugin.cjs.map +0 -1
  119. package/dist/cjs/start-router-plugin/generator-plugins/server-routes-plugin.d.cts +0 -2
  120. package/dist/cjs/start-router-plugin/plugin.cjs +0 -45
  121. package/dist/cjs/start-router-plugin/plugin.cjs.map +0 -1
  122. package/dist/cjs/start-router-plugin/plugin.d.cts +0 -3
  123. package/dist/cjs/start-router-plugin/route-tree-client-plugin.cjs +0 -73
  124. package/dist/cjs/start-router-plugin/route-tree-client-plugin.cjs.map +0 -1
  125. package/dist/cjs/start-router-plugin/route-tree-client-plugin.d.cts +0 -6
  126. package/dist/cjs/start-router-plugin/virtual-route-tree-plugin.cjs +0 -29
  127. package/dist/cjs/start-router-plugin/virtual-route-tree-plugin.cjs.map +0 -1
  128. package/dist/cjs/start-router-plugin/virtual-route-tree-plugin.d.cts +0 -3
  129. package/dist/cjs/utils.cjs +0 -18
  130. package/dist/cjs/utils.cjs.map +0 -1
  131. package/dist/cjs/utils.d.cts +0 -8
  132. package/dist/esm/nitro-plugin/build-sitemap.js.map +0 -1
  133. package/dist/esm/nitro-plugin/plugin.d.ts +0 -3
  134. package/dist/esm/nitro-plugin/plugin.js +0 -187
  135. package/dist/esm/nitro-plugin/plugin.js.map +0 -1
  136. package/dist/esm/nitro-plugin/prerender.d.ts +0 -8
  137. package/dist/esm/nitro-plugin/prerender.js.map +0 -1
  138. package/dist/esm/nitro-plugin/queue.js.map +0 -1
  139. package/dist/esm/resolve-virtual-entries-plugin/plugin.d.ts +0 -3
  140. package/dist/esm/resolve-virtual-entries-plugin/plugin.js +0 -63
  141. package/dist/esm/resolve-virtual-entries-plugin/plugin.js.map +0 -1
  142. package/src/nitro-plugin/plugin.ts +0 -252
  143. package/src/resolve-virtual-entries-plugin/plugin.ts +0 -77
  144. /package/dist/esm/{nitro-plugin/queue.d.ts → queue.d.ts} +0 -0
  145. /package/src/{nitro-plugin/queue.ts → queue.ts} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"route-tree-client-plugin.cjs","sources":["../../../src/start-router-plugin/route-tree-client-plugin.ts"],"sourcesContent":["import path from 'node:path'\nimport * as t from '@babel/types'\nimport { generateFromAst, logDiff, parseAst } from '@tanstack/router-utils'\nimport { normalizePath } from 'vite'\nimport { deadCodeElimination } from 'babel-dead-code-elimination'\nimport { debug } from '../debug'\nimport { VITE_ENVIRONMENT_NAMES } from '../constants'\nimport type { Plugin } from 'vite'\nimport type { Config } from '@tanstack/router-generator'\n\n/**\n * This removes the server part from the generated route tree so that it can be used on the client.\n */\nexport function routeTreeClientPlugin(config: Config): Plugin {\n const generatedRouteTreePath = normalizePath(\n path.resolve(config.generatedRouteTree),\n )\n\n return {\n name: 'tanstack-start:route-tree-client-plugin',\n enforce: 'pre',\n // only run this plugin in the client environment\n applyToEnvironment: (env) => env.name === VITE_ENVIRONMENT_NAMES.client,\n transform: {\n filter: { id: generatedRouteTreePath },\n handler(code, id) {\n if (id !== generatedRouteTreePath) {\n return null\n }\n if (debug) console.info(`Compiling route tree for the client`, id)\n const ast = parseAst({ code, sourceFilename: id })\n\n // only keep `export const routeTree = ... `\n const filteredBody = ast.program.body.filter((node) => {\n if (t.isExportNamedDeclaration(node)) {\n if (\n node.declaration &&\n t.isVariableDeclaration(node.declaration) &&\n node.declaration.declarations.length === 1 &&\n node.declaration.declarations[0] &&\n t.isVariableDeclarator(node.declaration.declarations[0]) &&\n t.isIdentifier(node.declaration.declarations[0].id) &&\n node.declaration.declarations[0].id.name === 'routeTree'\n ) {\n return true\n }\n return false\n }\n // strip off the typescript interface & module declarations since they also reference the server routes\n if (\n t.isTSInterfaceDeclaration(node) ||\n t.isTSModuleDeclaration(node)\n ) {\n return false\n }\n return true\n })\n\n ast.program.body = filteredBody\n\n deadCodeElimination(ast)\n\n const compiled = generateFromAst(ast, {\n sourceMaps: true,\n sourceFileName: id,\n filename: id,\n })\n if (debug) {\n logDiff(code, compiled.code)\n console.log('Output:\\n', compiled.code, '\\n\\n')\n }\n\n return compiled\n },\n },\n }\n}\n"],"names":["normalizePath","VITE_ENVIRONMENT_NAMES","debug","parseAst","t","deadCodeElimination","generateFromAst","logDiff"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAaO,SAAS,sBAAsB,QAAwB;AAC5D,QAAM,yBAAyBA,KAAA;AAAA,IAC7B,KAAK,QAAQ,OAAO,kBAAkB;AAAA,EACxC;AAEO,SAAA;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA;AAAA,IAET,oBAAoB,CAAC,QAAQ,IAAI,SAASC,UAAuB,uBAAA;AAAA,IACjE,WAAW;AAAA,MACT,QAAQ,EAAE,IAAI,uBAAuB;AAAA,MACrC,QAAQ,MAAM,IAAI;AAChB,YAAI,OAAO,wBAAwB;AAC1B,iBAAA;AAAA,QAAA;AAET,YAAIC,MAAAA,MAAO,SAAQ,KAAK,uCAAuC,EAAE;AACjE,cAAM,MAAMC,YAAAA,SAAS,EAAE,MAAM,gBAAgB,IAAI;AAGjD,cAAM,eAAe,IAAI,QAAQ,KAAK,OAAO,CAAC,SAAS;AACjD,cAAAC,aAAE,yBAAyB,IAAI,GAAG;AACpC,gBACE,KAAK,eACLA,aAAE,sBAAsB,KAAK,WAAW,KACxC,KAAK,YAAY,aAAa,WAAW,KACzC,KAAK,YAAY,aAAa,CAAC,KAC/BA,aAAE,qBAAqB,KAAK,YAAY,aAAa,CAAC,CAAC,KACvDA,aAAE,aAAa,KAAK,YAAY,aAAa,CAAC,EAAE,EAAE,KAClD,KAAK,YAAY,aAAa,CAAC,EAAE,GAAG,SAAS,aAC7C;AACO,qBAAA;AAAA,YAAA;AAEF,mBAAA;AAAA,UAAA;AAGT,cACEA,aAAE,yBAAyB,IAAI,KAC/BA,aAAE,sBAAsB,IAAI,GAC5B;AACO,mBAAA;AAAA,UAAA;AAEF,iBAAA;AAAA,QAAA,CACR;AAED,YAAI,QAAQ,OAAO;AAEnBC,iCAAAA,oBAAoB,GAAG;AAEjB,cAAA,WAAWC,4BAAgB,KAAK;AAAA,UACpC,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,UAAU;AAAA,QAAA,CACX;AACD,YAAIJ,aAAO;AACDK,8BAAA,MAAM,SAAS,IAAI;AAC3B,kBAAQ,IAAI,aAAa,SAAS,MAAM,MAAM;AAAA,QAAA;AAGzC,eAAA;AAAA,MAAA;AAAA,IACT;AAAA,EAEJ;AACF;;"}
@@ -1,6 +0,0 @@
1
- import { Plugin } from 'vite';
2
- import { Config } from '@tanstack/router-generator';
3
- /**
4
- * This removes the server part from the generated route tree so that it can be used on the client.
5
- */
6
- export declare function routeTreeClientPlugin(config: Config): Plugin;
@@ -1,29 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const path = require("node:path");
4
- const vite = require("vite");
5
- const startServerCore = require("@tanstack/start-server-core");
6
- const debug = require("../debug.cjs");
7
- function virtualRouteTreePlugin(config) {
8
- const generatedRouteTreePath = vite.normalizePath(
9
- path.resolve(config.generatedRouteTree)
10
- );
11
- return {
12
- name: "tanstack-start:virtual-route-tree",
13
- enforce: "pre",
14
- sharedDuringBuild: true,
15
- resolveId: {
16
- filter: { id: new RegExp(startServerCore.VIRTUAL_MODULES.routeTree) },
17
- handler(id) {
18
- let resolvedId = null;
19
- if (id === startServerCore.VIRTUAL_MODULES.routeTree) {
20
- if (debug.debug) console.info("resolving id", id, generatedRouteTreePath);
21
- resolvedId = generatedRouteTreePath;
22
- }
23
- return resolvedId;
24
- }
25
- }
26
- };
27
- }
28
- exports.virtualRouteTreePlugin = virtualRouteTreePlugin;
29
- //# sourceMappingURL=virtual-route-tree-plugin.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"virtual-route-tree-plugin.cjs","sources":["../../../src/start-router-plugin/virtual-route-tree-plugin.ts"],"sourcesContent":["import path from 'node:path'\nimport { normalizePath } from 'vite'\nimport { VIRTUAL_MODULES } from '@tanstack/start-server-core'\nimport { debug } from '../debug'\nimport type { Config } from '@tanstack/router-generator'\nimport type { Plugin } from 'vite'\n\nexport function virtualRouteTreePlugin(config: Config): Plugin {\n const generatedRouteTreePath = normalizePath(\n path.resolve(config.generatedRouteTree),\n )\n\n return {\n name: 'tanstack-start:virtual-route-tree',\n enforce: 'pre',\n sharedDuringBuild: true,\n resolveId: {\n filter: { id: new RegExp(VIRTUAL_MODULES.routeTree) },\n handler(id) {\n let resolvedId: string | null = null\n if (id === VIRTUAL_MODULES.routeTree) {\n if (debug) console.info('resolving id', id, generatedRouteTreePath)\n resolvedId = generatedRouteTreePath\n }\n return resolvedId\n },\n },\n }\n}\n"],"names":["normalizePath","VIRTUAL_MODULES","debug"],"mappings":";;;;;;AAOO,SAAS,uBAAuB,QAAwB;AAC7D,QAAM,yBAAyBA,KAAA;AAAA,IAC7B,KAAK,QAAQ,OAAO,kBAAkB;AAAA,EACxC;AAEO,SAAA;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,mBAAmB;AAAA,IACnB,WAAW;AAAA,MACT,QAAQ,EAAE,IAAI,IAAI,OAAOC,gBAAA,gBAAgB,SAAS,EAAE;AAAA,MACpD,QAAQ,IAAI;AACV,YAAI,aAA4B;AAC5B,YAAA,OAAOA,gCAAgB,WAAW;AACpC,cAAIC,MAAAA,MAAO,SAAQ,KAAK,gBAAgB,IAAI,sBAAsB;AACrD,uBAAA;AAAA,QAAA;AAER,eAAA;AAAA,MAAA;AAAA,IACT;AAAA,EAEJ;AACF;;"}
@@ -1,3 +0,0 @@
1
- import { Config } from '@tanstack/router-generator';
2
- import { Plugin } from 'vite';
3
- export declare function virtualRouteTreePlugin(config: Config): Plugin;
@@ -1,18 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- function resolveViteId(id) {
4
- return `\0${id}`;
5
- }
6
- function createLogger(prefix) {
7
- const label = `[${prefix}]`;
8
- return {
9
- log: (...args) => console.log(label, ...args),
10
- debug: (...args) => console.debug(label, ...args),
11
- info: (...args) => console.info(label, ...args),
12
- warn: (...args) => console.warn(label, ...args),
13
- error: (...args) => console.error(label, ...args)
14
- };
15
- }
16
- exports.createLogger = createLogger;
17
- exports.resolveViteId = resolveViteId;
18
- //# sourceMappingURL=utils.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.cjs","sources":["../../src/utils.ts"],"sourcesContent":["export function resolveViteId(id: string) {\n return `\\0${id}`\n}\n\nexport function createLogger(prefix: string) {\n const label = `[${prefix}]`\n return {\n log: (...args: any) => console.log(label, ...args),\n debug: (...args: any) => console.debug(label, ...args),\n info: (...args: any) => console.info(label, ...args),\n warn: (...args: any) => console.warn(label, ...args),\n error: (...args: any) => console.error(label, ...args),\n }\n}\n"],"names":[],"mappings":";;AAAO,SAAS,cAAc,IAAY;AACxC,SAAO,KAAK,EAAE;AAChB;AAEO,SAAS,aAAa,QAAgB;AACrC,QAAA,QAAQ,IAAI,MAAM;AACjB,SAAA;AAAA,IACL,KAAK,IAAI,SAAc,QAAQ,IAAI,OAAO,GAAG,IAAI;AAAA,IACjD,OAAO,IAAI,SAAc,QAAQ,MAAM,OAAO,GAAG,IAAI;AAAA,IACrD,MAAM,IAAI,SAAc,QAAQ,KAAK,OAAO,GAAG,IAAI;AAAA,IACnD,MAAM,IAAI,SAAc,QAAQ,KAAK,OAAO,GAAG,IAAI;AAAA,IACnD,OAAO,IAAI,SAAc,QAAQ,MAAM,OAAO,GAAG,IAAI;AAAA,EACvD;AACF;;;"}
@@ -1,8 +0,0 @@
1
- export declare function resolveViteId(id: string): string;
2
- export declare function createLogger(prefix: string): {
3
- log: (...args: any) => void;
4
- debug: (...args: any) => void;
5
- info: (...args: any) => void;
6
- warn: (...args: any) => void;
7
- error: (...args: any) => void;
8
- };
@@ -1 +0,0 @@
1
- {"version":3,"file":"build-sitemap.js","sources":["../../../src/nitro-plugin/build-sitemap.ts"],"sourcesContent":["import { writeFileSync } from 'node:fs'\nimport path from 'node:path'\nimport { create } from 'xmlbuilder2'\nimport { createLogger } from '../utils'\nimport type { TanStackStartOutputConfig } from '../plugin'\nimport type { XMLBuilder } from 'xmlbuilder2/lib/interfaces'\n\nexport type SitemapUrl = {\n loc: string\n lastmod: string\n priority?: number\n changefreq?:\n | 'always'\n | 'hourly'\n | 'daily'\n | 'weekly'\n | 'monthly'\n | 'yearly'\n | 'never'\n alternateRefs?: Array<{\n href: string\n hreflang?: string\n }>\n images?: Array<{\n loc: string\n title?: string\n caption?: string\n }>\n news?: {\n publication: {\n name: string\n language: string\n }\n publicationDate: string | Date\n title: string\n }\n}\n\nexport type SitemapData = {\n urls: Array<SitemapUrl>\n}\n\nfunction buildSitemapJson(\n pages: TanStackStartOutputConfig['pages'],\n host: string,\n): SitemapData {\n const slash = checkSlash(host)\n\n const urls: Array<SitemapUrl> = pages\n .filter((page) => {\n return page.sitemap?.exclude !== true\n })\n .map((page) => ({\n loc: `${host}${slash}${page.path.replace(/^\\/+/g, '')}`,\n lastmod: page.sitemap?.lastmod\n ? new Date(page.sitemap.lastmod).toISOString().split('T')[0]!\n : new Date().toISOString().split('T')[0]!,\n priority: page.sitemap?.priority,\n changefreq: page.sitemap?.changefreq,\n alternateRefs: page.sitemap?.alternateRefs,\n images: page.sitemap?.images,\n news: page.sitemap?.news,\n }))\n\n return { urls }\n}\n\nfunction jsonToXml(sitemapData: SitemapData): string {\n const sitemap = createXml('urlset')\n\n for (const item of sitemapData.urls) {\n const page = sitemap.ele('url')\n page.ele('loc').txt(item.loc)\n page.ele('lastmod').txt(item.lastmod)\n\n if (item.priority !== undefined) {\n page.ele('priority').txt(item.priority.toString())\n }\n if (item.changefreq) {\n page.ele('changefreq').txt(item.changefreq)\n }\n\n // Add alternate references\n if (item.alternateRefs?.length) {\n for (const ref of item.alternateRefs) {\n const alternateRef = page.ele('xhtml:link')\n alternateRef.att('rel', 'alternate')\n alternateRef.att('href', ref.href)\n if (ref.hreflang) {\n alternateRef.att('hreflang', ref.hreflang)\n }\n }\n }\n\n // Add images\n if (item.images?.length) {\n for (const image of item.images) {\n const imageElement = page.ele('image:image')\n imageElement.ele('image:loc').txt(image.loc)\n if (image.title) {\n imageElement.ele('image:title').txt(image.title)\n }\n if (image.caption) {\n imageElement.ele('image:caption').txt(image.caption)\n }\n }\n }\n\n // Add news\n if (item.news) {\n const newsElement = page.ele('news:news')\n const publication = newsElement.ele('news:publication')\n publication.ele('news:name').txt(item.news.publication.name)\n publication.ele('news:language').txt(item.news.publication.language)\n newsElement\n .ele('news:publication_date')\n .txt(new Date(item.news.publicationDate).toISOString().split('T')[0]!)\n newsElement.ele('news:title').txt(item.news.title)\n }\n }\n\n return sitemap.end({ prettyPrint: true })\n}\n\nexport function buildSitemap({\n options,\n publicDir,\n}: {\n options: TanStackStartOutputConfig\n publicDir: string\n}) {\n const logger = createLogger('sitemap')\n\n let sitemapOptions = options.sitemap\n\n if (!sitemapOptions && options.pages.length) {\n sitemapOptions = { enabled: true, outputPath: 'sitemap.xml' }\n }\n\n if (!sitemapOptions?.enabled) {\n throw new Error('Sitemap is not enabled')\n }\n\n const { host, outputPath } = sitemapOptions\n\n if (!host) {\n if (!options.sitemap) {\n logger.info(\n 'Hint: Pages found, but no sitemap host has been set. To enable sitemap generation, set the `sitemap.host` option.',\n )\n return\n }\n throw new Error(\n 'Sitemap host is not set and required to build the sitemap.',\n )\n }\n\n if (!outputPath) {\n throw new Error('Sitemap output path is not set')\n }\n\n const { pages } = options\n\n if (!pages.length) {\n logger.info('No pages were found to build the sitemap. Skipping...')\n return\n }\n\n logger.info('Building Sitemap...')\n\n // Build the sitemap data\n const sitemapData = buildSitemapJson(pages, host)\n\n // Generate output paths\n const xmlOutputPath = path.join(publicDir, outputPath)\n const pagesOutputPath = path.join(publicDir, 'pages.json')\n\n try {\n // Write XML sitemap\n logger.info(`Writing sitemap XML at ${xmlOutputPath}`)\n writeFileSync(xmlOutputPath, jsonToXml(sitemapData))\n\n // Write pages data for runtime use\n logger.info(`Writing pages data at ${pagesOutputPath}`)\n writeFileSync(\n pagesOutputPath,\n JSON.stringify(\n {\n pages,\n host,\n lastBuilt: new Date().toISOString(),\n },\n null,\n 2,\n ),\n )\n } catch (e) {\n logger.error(`Unable to write sitemap files`, e)\n }\n}\n\nfunction createXml(elementName: 'urlset' | 'sitemapindex'): XMLBuilder {\n return create({ version: '1.0', encoding: 'UTF-8' })\n .ele(elementName, {\n xmlns: 'https://www.sitemaps.org/schemas/sitemap/0.9',\n })\n .com(`This file was automatically generated by TanStack Start.`)\n}\n\nfunction checkSlash(host: string): string {\n const finalChar = host.slice(-1)\n return finalChar === '/' ? '' : '/'\n}\n"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { PluginOption, Rollup } from 'vite';
2
- import { TanStackStartOutputConfig } from '../plugin.js';
3
- export declare function nitroPlugin(options: TanStackStartOutputConfig, getSsrBundle: () => Rollup.OutputBundle): Array<PluginOption>;
@@ -1,187 +0,0 @@
1
- import path from "node:path";
2
- import { rmSync } from "node:fs";
3
- import { createNitro, prepare, copyPublicAssets, build } from "nitropack";
4
- import { resolve, dirname } from "pathe";
5
- import { HEADERS } from "@tanstack/start-server-core";
6
- import { VITE_ENVIRONMENT_NAMES, CLIENT_DIST_DIR, SSR_ENTRY_FILE } from "../constants.js";
7
- import { buildSitemap } from "./build-sitemap.js";
8
- import { prerender } from "./prerender.js";
9
- function nitroPlugin(options, getSsrBundle) {
10
- const buildPreset = process.env["START_TARGET"] ?? options.target;
11
- return [
12
- {
13
- name: "tanstack-vite-plugin-nitro",
14
- configEnvironment(name) {
15
- if (name === VITE_ENVIRONMENT_NAMES.server) {
16
- return {
17
- build: {
18
- commonjsOptions: {
19
- include: []
20
- },
21
- ssr: true,
22
- sourcemap: true,
23
- rollupOptions: {
24
- input: "/~start/server-entry"
25
- }
26
- }
27
- };
28
- }
29
- return null;
30
- },
31
- config() {
32
- return {
33
- builder: {
34
- sharedPlugins: true,
35
- async buildApp(builder) {
36
- const client = builder.environments[VITE_ENVIRONMENT_NAMES.client];
37
- const server = builder.environments[VITE_ENVIRONMENT_NAMES.server];
38
- if (!client) {
39
- throw new Error("Client environment not found");
40
- }
41
- if (!server) {
42
- throw new Error("SSR environment not found");
43
- }
44
- const clientOutputDir = resolve(options.root, CLIENT_DIST_DIR);
45
- rmSync(clientOutputDir, { recursive: true, force: true });
46
- await builder.build(client);
47
- await builder.build(server);
48
- const nitroConfig = {
49
- dev: false,
50
- // TODO: do we need this? should this be made configurable?
51
- compatibilityDate: "2024-11-19",
52
- logLevel: 3,
53
- preset: buildPreset,
54
- baseURL: globalThis.TSS_APP_BASE,
55
- publicAssets: [
56
- {
57
- dir: path.resolve(options.root, CLIENT_DIST_DIR),
58
- baseURL: "/",
59
- maxAge: 31536e3
60
- // 1 year
61
- }
62
- ],
63
- typescript: {
64
- generateTsConfig: false
65
- },
66
- prerender: void 0,
67
- renderer: SSR_ENTRY_FILE,
68
- plugins: [],
69
- // Nitro's plugins
70
- appConfigFiles: [],
71
- scanDirs: [],
72
- imports: false,
73
- // unjs/unimport for global/magic imports
74
- rollupConfig: {
75
- plugins: [virtualBundlePlugin(getSsrBundle())]
76
- },
77
- virtual: {
78
- // This is Nitro's way of defining virtual modules
79
- // Should we define the ones for TanStack Start's here as well?
80
- }
81
- };
82
- const nitro = await createNitro(nitroConfig);
83
- await buildNitroApp(builder, nitro, options);
84
- }
85
- }
86
- };
87
- }
88
- }
89
- ];
90
- }
91
- async function buildNitroApp(builder, nitro, options) {
92
- var _a, _b, _c;
93
- await prepare(nitro);
94
- await copyPublicAssets(nitro);
95
- if (((_a = options.prerender) == null ? void 0 : _a.enabled) !== false) {
96
- options.prerender = {
97
- ...options.prerender,
98
- enabled: ((_b = options.prerender) == null ? void 0 : _b.enabled) ?? options.pages.some(
99
- (d) => {
100
- var _a2;
101
- return typeof d === "string" ? false : !!((_a2 = d.prerender) == null ? void 0 : _a2.enabled);
102
- }
103
- )
104
- };
105
- }
106
- if ((_c = options.spa) == null ? void 0 : _c.enabled) {
107
- options.prerender = {
108
- ...options.prerender,
109
- enabled: true
110
- };
111
- const maskUrl = new URL(options.spa.maskPath, "http://localhost");
112
- options.pages.push({
113
- path: maskUrl.toString().replace("http://localhost", ""),
114
- prerender: {
115
- ...options.spa.prerender,
116
- headers: {
117
- ...options.spa.prerender.headers,
118
- [HEADERS.TSS_SHELL]: "true"
119
- }
120
- },
121
- sitemap: {
122
- exclude: true
123
- }
124
- });
125
- }
126
- if (options.prerender.enabled) {
127
- await prerender({
128
- options,
129
- nitro,
130
- builder
131
- });
132
- }
133
- if (options.pages.length) {
134
- buildSitemap({
135
- options,
136
- publicDir: nitro.options.output.publicDir
137
- });
138
- }
139
- await build(nitro);
140
- await nitro.close();
141
- nitro.logger.success(
142
- "Client and Server bundles for TanStack Start have been successfully built."
143
- );
144
- }
145
- function virtualBundlePlugin(ssrBundle) {
146
- const _modules = /* @__PURE__ */ new Map();
147
- for (const [fileName, content] of Object.entries(ssrBundle)) {
148
- if (content.type === "chunk") {
149
- const virtualModule = {
150
- code: content.code,
151
- map: null
152
- };
153
- const maybeMap = ssrBundle[`${fileName}.map`];
154
- if (maybeMap && maybeMap.type === "asset") {
155
- virtualModule.map = maybeMap.source;
156
- }
157
- _modules.set(fileName, virtualModule);
158
- _modules.set(resolve(fileName), virtualModule);
159
- }
160
- }
161
- return {
162
- name: "virtual-bundle",
163
- resolveId(id, importer) {
164
- if (_modules.has(id)) {
165
- return resolve(id);
166
- }
167
- if (importer) {
168
- const resolved = resolve(dirname(importer), id);
169
- if (_modules.has(resolved)) {
170
- return resolved;
171
- }
172
- }
173
- return null;
174
- },
175
- load(id) {
176
- const m = _modules.get(id);
177
- if (!m) {
178
- return null;
179
- }
180
- return m;
181
- }
182
- };
183
- }
184
- export {
185
- nitroPlugin
186
- };
187
- //# sourceMappingURL=plugin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin.js","sources":["../../../src/nitro-plugin/plugin.ts"],"sourcesContent":["import path from 'node:path'\nimport { rmSync } from 'node:fs'\nimport { build, copyPublicAssets, createNitro, prepare } from 'nitropack'\nimport { dirname, resolve } from 'pathe'\nimport { HEADERS } from '@tanstack/start-server-core'\nimport {\n CLIENT_DIST_DIR,\n SSR_ENTRY_FILE,\n VITE_ENVIRONMENT_NAMES,\n} from '../constants'\nimport { buildSitemap } from './build-sitemap'\nimport { prerender } from './prerender'\nimport type {\n EnvironmentOptions,\n PluginOption,\n Rollup,\n ViteBuilder,\n} from 'vite'\nimport type { Nitro, NitroConfig } from 'nitropack'\nimport type { TanStackStartOutputConfig } from '../plugin'\n\nexport function nitroPlugin(\n options: TanStackStartOutputConfig,\n getSsrBundle: () => Rollup.OutputBundle,\n): Array<PluginOption> {\n const buildPreset =\n process.env['START_TARGET'] ?? (options.target as string | undefined)\n return [\n {\n name: 'tanstack-vite-plugin-nitro',\n configEnvironment(name) {\n if (name === VITE_ENVIRONMENT_NAMES.server) {\n return {\n build: {\n commonjsOptions: {\n include: [],\n },\n ssr: true,\n sourcemap: true,\n rollupOptions: {\n input: '/~start/server-entry',\n },\n },\n } satisfies EnvironmentOptions\n }\n\n return null\n },\n config() {\n return {\n builder: {\n sharedPlugins: true,\n async buildApp(builder) {\n const client = builder.environments[VITE_ENVIRONMENT_NAMES.client]\n const server = builder.environments[VITE_ENVIRONMENT_NAMES.server]\n\n if (!client) {\n throw new Error('Client environment not found')\n }\n\n if (!server) {\n throw new Error('SSR environment not found')\n }\n\n // Build the client bundle\n // i.e client entry file with `hydrateRoot(...)`\n const clientOutputDir = resolve(options.root, CLIENT_DIST_DIR)\n rmSync(clientOutputDir, { recursive: true, force: true })\n await builder.build(client)\n\n // Build the SSR bundle\n await builder.build(server)\n\n const nitroConfig: NitroConfig = {\n dev: false,\n // TODO: do we need this? should this be made configurable?\n compatibilityDate: '2024-11-19',\n logLevel: 3,\n preset: buildPreset,\n baseURL: globalThis.TSS_APP_BASE,\n publicAssets: [\n {\n dir: path.resolve(options.root, CLIENT_DIST_DIR),\n baseURL: '/',\n maxAge: 31536000, // 1 year\n },\n ],\n typescript: {\n generateTsConfig: false,\n },\n prerender: undefined,\n renderer: SSR_ENTRY_FILE,\n plugins: [], // Nitro's plugins\n appConfigFiles: [],\n scanDirs: [],\n imports: false, // unjs/unimport for global/magic imports\n rollupConfig: {\n plugins: [virtualBundlePlugin(getSsrBundle())],\n },\n virtual: {\n // This is Nitro's way of defining virtual modules\n // Should we define the ones for TanStack Start's here as well?\n },\n }\n\n const nitro = await createNitro(nitroConfig)\n\n await buildNitroApp(builder, nitro, options)\n },\n },\n }\n },\n },\n ]\n}\n\n/**\n * Correctly co-ordinates the nitro app build process to make sure that the\n * app is built, while also correctly handling the prerendering and sitemap\n * generation and including their outputs in the final build.\n */\nasync function buildNitroApp(\n builder: ViteBuilder,\n nitro: Nitro,\n options: TanStackStartOutputConfig,\n) {\n // Cleans the public and server directories for a fresh build\n // i.e the `.output/public` and `.output/server` directories\n await prepare(nitro)\n\n // Creates the `.output/public` directory and copies the public assets\n await copyPublicAssets(nitro)\n\n // If the user has not set a prerender option, we need to set it to true\n // if the pages array is not empty and has sub options requiring for prerendering\n // If the user has explicitly set prerender.enabled, this should be respected\n if (options.prerender?.enabled !== false) {\n options.prerender = {\n ...options.prerender,\n enabled:\n options.prerender?.enabled ??\n options.pages.some((d) =>\n typeof d === 'string' ? false : !!d.prerender?.enabled,\n ),\n }\n }\n\n // Setup the options for prerendering the SPA shell (i.e `src/routes/__root.tsx`)\n if (options.spa?.enabled) {\n options.prerender = {\n ...options.prerender,\n enabled: true,\n }\n\n const maskUrl = new URL(options.spa.maskPath, 'http://localhost')\n\n options.pages.push({\n path: maskUrl.toString().replace('http://localhost', ''),\n prerender: {\n ...options.spa.prerender,\n headers: {\n ...options.spa.prerender.headers,\n [HEADERS.TSS_SHELL]: 'true',\n },\n },\n sitemap: {\n exclude: true,\n },\n })\n }\n\n // Run the prerendering process\n if (options.prerender.enabled) {\n await prerender({\n options,\n nitro,\n builder,\n })\n }\n\n // Run the sitemap build process\n if (options.pages.length) {\n buildSitemap({\n options,\n publicDir: nitro.options.output.publicDir,\n })\n }\n\n // Build the nitro app\n // We only build the nitro app, once we've prepared the public assets,\n // prerendered the pages and built the sitemap.\n // If we try to do this earlier, then the public assets may not be available\n // in the production build.\n await build(nitro)\n\n // Close the nitro instance\n await nitro.close()\n nitro.logger.success(\n 'Client and Server bundles for TanStack Start have been successfully built.',\n )\n}\n\ntype NitroRollupPluginOption = NonNullable<\n NitroConfig['rollupConfig']\n>['plugins']\n\nfunction virtualBundlePlugin(\n ssrBundle: Rollup.OutputBundle,\n): NitroRollupPluginOption {\n type VirtualModule = { code: string; map: string | null }\n const _modules = new Map<string, VirtualModule>()\n\n // group chunks and source maps\n for (const [fileName, content] of Object.entries(ssrBundle)) {\n if (content.type === 'chunk') {\n const virtualModule: VirtualModule = {\n code: content.code,\n map: null,\n }\n const maybeMap = ssrBundle[`${fileName}.map`]\n if (maybeMap && maybeMap.type === 'asset') {\n virtualModule.map = maybeMap.source as string\n }\n _modules.set(fileName, virtualModule)\n _modules.set(resolve(fileName), virtualModule)\n }\n }\n\n return {\n name: 'virtual-bundle',\n resolveId(id, importer) {\n if (_modules.has(id)) {\n return resolve(id)\n }\n\n if (importer) {\n const resolved = resolve(dirname(importer), id)\n if (_modules.has(resolved)) {\n return resolved\n }\n }\n return null\n },\n load(id) {\n const m = _modules.get(id)\n if (!m) {\n return null\n }\n return m\n },\n }\n}\n"],"names":["_a"],"mappings":"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"}
@@ -1,8 +0,0 @@
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>;
@@ -1 +0,0 @@
1
- {"version":3,"file":"prerender.js","sources":["../../../src/nitro-plugin/prerender.ts"],"sourcesContent":["import { promises as fsp } from 'node:fs'\nimport { pathToFileURL } from 'node:url'\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 { VITE_ENVIRONMENT_NAMES } from '../constants'\nimport { createLogger } from '../utils'\nimport { Queue } from './queue'\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 const logger = createLogger('prerender')\n logger.info('Prerendering 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[VITE_ENVIRONMENT_NAMES.server]\n\n if (!serverEnv) {\n throw new Error(\n `Vite's \"${VITE_ENVIRONMENT_NAMES.server}\" environment not found`,\n )\n }\n\n const prerenderOutputDir = path.resolve(\n options.root,\n '.tanstack',\n 'start',\n 'build',\n '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 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 = pathToFileURL(\n path.resolve(path.join(nodeNitro.options.output.serverDir, serverFilename)),\n ).toString()\n\n process.env.TSS_PRERENDERING = 'true'\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 logger.info(`Prerendered ${pages.length} pages:`)\n pages.forEach((page) => {\n logger.info(`- ${page}`)\n })\n\n // TODO: Write the prerendered pages to the output directory\n } catch (error) {\n 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 logger.info(`Concurrency: ${concurrency}`)\n const queue = new Queue({ concurrency })\n\n options.pages.forEach((page) => addCrawlPageTask(page))\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 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: {\n ...prerenderOptions.headers,\n 'x-nitro-prerender': encodedRoute,\n },\n },\n )\n\n if (!res.ok) {\n throw new Error(`Failed to fetch ${page.path}: ${res.statusText}`, {\n cause: res,\n })\n }\n\n const cleanPagePath = (\n prerenderOptions.outputPath || page.path\n ).split(/[?#]/)[0]!\n\n // Guess route type and populate fileName\n const contentType = res.headers.get('content-type') || ''\n const isImplicitHTML =\n !cleanPagePath.endsWith('.html') && contentType.includes('html')\n // &&\n // !JsonSigRx.test(dataBuff.subarray(0, 32).toString('utf8'))\n const routeWithIndex = cleanPagePath.endsWith('/')\n ? cleanPagePath + 'index'\n : cleanPagePath\n\n const htmlPath =\n cleanPagePath.endsWith('/') || prerenderOptions.autoSubfolderIndex\n ? joinURL(cleanPagePath, 'index.html')\n : cleanPagePath + '.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 logger.warn(`Encountered error, retrying: ${page.path} in 500ms`)\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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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"queue.js","sources":["../../../src/nitro-plugin/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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"}
@@ -1,3 +0,0 @@
1
- import { TanStackStartOutputConfig, TanStackStartVitePluginCoreOptions } from '../plugin.js';
2
- import * as vite from 'vite';
3
- export declare function resolveVirtualEntriesPlugin(opts: TanStackStartVitePluginCoreOptions, startConfig: TanStackStartOutputConfig): vite.Plugin;
@@ -1,63 +0,0 @@
1
- import path from "node:path";
2
- import * as vite from "vite";
3
- function resolveVirtualEntriesPlugin(opts, startConfig) {
4
- let resolvedConfig;
5
- const modules = /* @__PURE__ */ new Set([
6
- "/~start/server-entry",
7
- "/~start/default-server-entry",
8
- "/~start/default-client-entry"
9
- ]);
10
- return {
11
- name: "tanstack-start-core:resolve-virtual-entries",
12
- configResolved(config) {
13
- resolvedConfig = config;
14
- },
15
- resolveId: {
16
- filter: {
17
- id: new RegExp([...modules].join("|"))
18
- },
19
- handler(id) {
20
- if (modules.has(id)) {
21
- return `${id}.tsx`;
22
- }
23
- return void 0;
24
- }
25
- },
26
- load: {
27
- filter: {
28
- id: new RegExp([...modules].map((m) => `${m}.tsx`).join("|"))
29
- },
30
- handler(id) {
31
- const routerFilepath = vite.normalizePath(
32
- path.resolve(
33
- startConfig.root,
34
- startConfig.tsr.srcDirectory,
35
- "router"
36
- )
37
- );
38
- if (id === "/~start/server-entry.tsx") {
39
- const ssrEntryFilepath = startConfig.serverEntryPath.startsWith(
40
- "/~start/default-server-entry"
41
- ) ? startConfig.serverEntryPath : vite.normalizePath(
42
- path.resolve(resolvedConfig.root, startConfig.serverEntryPath)
43
- );
44
- return opts.getVirtualServerRootHandler({
45
- routerFilepath,
46
- serverEntryFilepath: ssrEntryFilepath
47
- });
48
- }
49
- if (id === "/~start/default-client-entry.tsx") {
50
- return opts.getVirtualClientEntry({ routerFilepath });
51
- }
52
- if (id === "/~start/default-server-entry.tsx") {
53
- return opts.getVirtualServerEntry({ routerFilepath });
54
- }
55
- return void 0;
56
- }
57
- }
58
- };
59
- }
60
- export {
61
- resolveVirtualEntriesPlugin
62
- };
63
- //# sourceMappingURL=plugin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin.js","sources":["../../../src/resolve-virtual-entries-plugin/plugin.ts"],"sourcesContent":["import path from 'node:path'\nimport * as vite from 'vite'\nimport type {\n TanStackStartOutputConfig,\n TanStackStartVitePluginCoreOptions,\n} from '../plugin'\n\nexport function resolveVirtualEntriesPlugin(\n opts: TanStackStartVitePluginCoreOptions,\n startConfig: TanStackStartOutputConfig,\n): vite.Plugin {\n let resolvedConfig: vite.ResolvedConfig\n\n const modules = new Set<string>([\n '/~start/server-entry',\n '/~start/default-server-entry',\n '/~start/default-client-entry',\n ])\n\n return {\n name: 'tanstack-start-core:resolve-virtual-entries',\n configResolved(config) {\n resolvedConfig = config\n },\n resolveId: {\n filter: {\n id: new RegExp([...modules].join('|')),\n },\n handler(id) {\n if (modules.has(id)) {\n return `${id}.tsx`\n }\n\n return undefined\n },\n },\n load: {\n filter: {\n id: new RegExp([...modules].map((m) => `${m}.tsx`).join('|')),\n },\n handler(id) {\n const routerFilepath = vite.normalizePath(\n path.resolve(\n startConfig.root,\n startConfig.tsr.srcDirectory,\n 'router',\n ),\n )\n\n if (id === '/~start/server-entry.tsx') {\n const ssrEntryFilepath = startConfig.serverEntryPath.startsWith(\n '/~start/default-server-entry',\n )\n ? startConfig.serverEntryPath\n : vite.normalizePath(\n path.resolve(resolvedConfig.root, startConfig.serverEntryPath),\n )\n\n return opts.getVirtualServerRootHandler({\n routerFilepath,\n serverEntryFilepath: ssrEntryFilepath,\n })\n }\n\n if (id === '/~start/default-client-entry.tsx') {\n return opts.getVirtualClientEntry({ routerFilepath })\n }\n\n if (id === '/~start/default-server-entry.tsx') {\n return opts.getVirtualServerEntry({ routerFilepath })\n }\n\n return undefined\n },\n },\n }\n}\n"],"names":[],"mappings":";;AAOgB,SAAA,4BACd,MACA,aACa;AACT,MAAA;AAEE,QAAA,8BAAc,IAAY;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AAEM,SAAA;AAAA,IACL,MAAM;AAAA,IACN,eAAe,QAAQ;AACJ,uBAAA;AAAA,IACnB;AAAA,IACA,WAAW;AAAA,MACT,QAAQ;AAAA,QACN,IAAI,IAAI,OAAO,CAAC,GAAG,OAAO,EAAE,KAAK,GAAG,CAAC;AAAA,MACvC;AAAA,MACA,QAAQ,IAAI;AACN,YAAA,QAAQ,IAAI,EAAE,GAAG;AACnB,iBAAO,GAAG,EAAE;AAAA,QAAA;AAGP,eAAA;AAAA,MAAA;AAAA,IAEX;AAAA,IACA,MAAM;AAAA,MACJ,QAAQ;AAAA,QACN,IAAI,IAAI,OAAO,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC;AAAA,MAC9D;AAAA,MACA,QAAQ,IAAI;AACV,cAAM,iBAAiB,KAAK;AAAA,UAC1B,KAAK;AAAA,YACH,YAAY;AAAA,YACZ,YAAY,IAAI;AAAA,YAChB;AAAA,UAAA;AAAA,QAEJ;AAEA,YAAI,OAAO,4BAA4B;AAC/B,gBAAA,mBAAmB,YAAY,gBAAgB;AAAA,YACnD;AAAA,UAAA,IAEE,YAAY,kBACZ,KAAK;AAAA,YACH,KAAK,QAAQ,eAAe,MAAM,YAAY,eAAe;AAAA,UAC/D;AAEJ,iBAAO,KAAK,4BAA4B;AAAA,YACtC;AAAA,YACA,qBAAqB;AAAA,UAAA,CACtB;AAAA,QAAA;AAGH,YAAI,OAAO,oCAAoC;AAC7C,iBAAO,KAAK,sBAAsB,EAAE,gBAAgB;AAAA,QAAA;AAGtD,YAAI,OAAO,oCAAoC;AAC7C,iBAAO,KAAK,sBAAsB,EAAE,gBAAgB;AAAA,QAAA;AAG/C,eAAA;AAAA,MAAA;AAAA,IACT;AAAA,EAEJ;AACF;"}