@tanstack/start-plugin-core 1.121.0-alpha.8 → 1.121.0

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 (187) hide show
  1. package/dist/cjs/compilers.cjs +24 -10
  2. package/dist/cjs/compilers.cjs.map +1 -1
  3. package/dist/cjs/constants.cjs +10 -0
  4. package/dist/cjs/constants.cjs.map +1 -1
  5. package/dist/cjs/constants.d.cts +2 -0
  6. package/dist/cjs/debug.cjs +5 -0
  7. package/dist/cjs/debug.cjs.map +1 -0
  8. package/dist/cjs/debug.d.cts +1 -0
  9. package/dist/cjs/{extractHtmlScripts.cjs → dev-server-plugin/extract-html-scripts.cjs} +1 -1
  10. package/dist/cjs/dev-server-plugin/extract-html-scripts.cjs.map +1 -0
  11. package/dist/cjs/{nitro/dev-server-plugin.cjs → dev-server-plugin/plugin.cjs} +2 -2
  12. package/dist/cjs/dev-server-plugin/plugin.cjs.map +1 -0
  13. package/dist/cjs/load-env-plugin/plugin.cjs +34 -0
  14. package/dist/cjs/load-env-plugin/plugin.cjs.map +1 -0
  15. package/dist/cjs/load-env-plugin/plugin.d.cts +3 -0
  16. package/dist/cjs/{build-sitemap.cjs → nitro-plugin/build-sitemap.cjs} +12 -10
  17. package/dist/cjs/nitro-plugin/build-sitemap.cjs.map +1 -0
  18. package/dist/cjs/{build-sitemap.d.cts → nitro-plugin/build-sitemap.d.cts} +2 -2
  19. package/dist/cjs/{nitro/nitro-plugin.cjs → nitro-plugin/plugin.cjs} +79 -65
  20. package/dist/cjs/nitro-plugin/plugin.cjs.map +1 -0
  21. package/dist/cjs/{prerender.cjs → nitro-plugin/prerender.cjs} +18 -14
  22. package/dist/cjs/nitro-plugin/prerender.cjs.map +1 -0
  23. package/dist/cjs/{prerender.d.cts → nitro-plugin/prerender.d.cts} +1 -1
  24. package/dist/cjs/nitro-plugin/queue.cjs.map +1 -0
  25. package/dist/cjs/plugin.cjs +50 -38
  26. package/dist/cjs/plugin.cjs.map +1 -1
  27. package/dist/cjs/plugin.d.cts +14 -2657
  28. package/dist/cjs/resolve-virtual-entries-plugin/plugin.cjs +66 -0
  29. package/dist/cjs/resolve-virtual-entries-plugin/plugin.cjs.map +1 -0
  30. package/dist/cjs/resolve-virtual-entries-plugin/plugin.d.cts +3 -0
  31. package/dist/cjs/schema.cjs +5 -5
  32. package/dist/cjs/schema.cjs.map +1 -1
  33. package/dist/cjs/schema.d.cts +32 -16
  34. package/dist/cjs/start-compiler-plugin.cjs +21 -19
  35. package/dist/cjs/start-compiler-plugin.cjs.map +1 -1
  36. package/dist/cjs/start-compiler-plugin.d.cts +1 -1
  37. package/dist/cjs/start-manifest-plugin/plugin.cjs +182 -0
  38. package/dist/cjs/start-manifest-plugin/plugin.cjs.map +1 -0
  39. package/dist/{esm/routesManifestPlugin.d.ts → cjs/start-manifest-plugin/plugin.d.cts} +1 -1
  40. package/dist/cjs/start-router-plugin/generator-plugins/routes-manifest-plugin.cjs +39 -0
  41. package/dist/cjs/start-router-plugin/generator-plugins/routes-manifest-plugin.cjs.map +1 -0
  42. package/dist/cjs/start-router-plugin/generator-plugins/routes-manifest-plugin.d.cts +6 -0
  43. package/dist/cjs/start-router-plugin/generator-plugins/server-routes-plugin.cjs +121 -0
  44. package/dist/cjs/start-router-plugin/generator-plugins/server-routes-plugin.cjs.map +1 -0
  45. package/dist/cjs/start-router-plugin/generator-plugins/server-routes-plugin.d.cts +2 -0
  46. package/dist/cjs/start-router-plugin/plugin.cjs +21 -0
  47. package/dist/cjs/start-router-plugin/plugin.cjs.map +1 -0
  48. package/dist/cjs/start-router-plugin/plugin.d.cts +3 -0
  49. package/dist/cjs/start-router-plugin/route-tree-client-plugin.cjs +72 -0
  50. package/dist/cjs/start-router-plugin/route-tree-client-plugin.cjs.map +1 -0
  51. package/dist/cjs/start-router-plugin/route-tree-client-plugin.d.cts +6 -0
  52. package/dist/cjs/start-router-plugin/virtual-route-tree-plugin.cjs +30 -0
  53. package/dist/cjs/start-router-plugin/virtual-route-tree-plugin.cjs.map +1 -0
  54. package/dist/cjs/start-router-plugin/virtual-route-tree-plugin.d.cts +4 -0
  55. package/dist/cjs/utils.cjs +11 -0
  56. package/dist/cjs/utils.cjs.map +1 -1
  57. package/dist/cjs/utils.d.cts +7 -0
  58. package/dist/esm/compilers.js +24 -10
  59. package/dist/esm/compilers.js.map +1 -1
  60. package/dist/esm/constants.d.ts +2 -0
  61. package/dist/esm/constants.js +10 -0
  62. package/dist/esm/constants.js.map +1 -1
  63. package/dist/esm/debug.d.ts +1 -0
  64. package/dist/esm/debug.js +5 -0
  65. package/dist/esm/debug.js.map +1 -0
  66. package/dist/esm/{extractHtmlScripts.js → dev-server-plugin/extract-html-scripts.js} +1 -1
  67. package/dist/esm/dev-server-plugin/extract-html-scripts.js.map +1 -0
  68. package/dist/esm/{nitro/dev-server-plugin.js → dev-server-plugin/plugin.js} +2 -2
  69. package/dist/esm/dev-server-plugin/plugin.js.map +1 -0
  70. package/dist/esm/load-env-plugin/plugin.d.ts +3 -0
  71. package/dist/esm/load-env-plugin/plugin.js +17 -0
  72. package/dist/esm/load-env-plugin/plugin.js.map +1 -0
  73. package/dist/esm/{build-sitemap.d.ts → nitro-plugin/build-sitemap.d.ts} +2 -2
  74. package/dist/esm/{build-sitemap.js → nitro-plugin/build-sitemap.js} +9 -7
  75. package/dist/esm/nitro-plugin/build-sitemap.js.map +1 -0
  76. package/dist/esm/nitro-plugin/plugin.js +181 -0
  77. package/dist/esm/nitro-plugin/plugin.js.map +1 -0
  78. package/dist/esm/{prerender.d.ts → nitro-plugin/prerender.d.ts} +1 -1
  79. package/dist/esm/{prerender.js → nitro-plugin/prerender.js} +15 -11
  80. package/dist/esm/nitro-plugin/prerender.js.map +1 -0
  81. package/dist/esm/nitro-plugin/queue.js.map +1 -0
  82. package/dist/esm/plugin.d.ts +14 -2657
  83. package/dist/esm/plugin.js +51 -39
  84. package/dist/esm/plugin.js.map +1 -1
  85. package/dist/esm/resolve-virtual-entries-plugin/plugin.d.ts +3 -0
  86. package/dist/esm/resolve-virtual-entries-plugin/plugin.js +49 -0
  87. package/dist/esm/resolve-virtual-entries-plugin/plugin.js.map +1 -0
  88. package/dist/esm/schema.d.ts +32 -16
  89. package/dist/esm/start-compiler-plugin.d.ts +1 -1
  90. package/dist/esm/start-compiler-plugin.js +21 -19
  91. package/dist/esm/start-compiler-plugin.js.map +1 -1
  92. package/dist/{cjs/routesManifestPlugin.d.cts → esm/start-manifest-plugin/plugin.d.ts} +1 -1
  93. package/dist/esm/start-manifest-plugin/plugin.js +182 -0
  94. package/dist/esm/start-manifest-plugin/plugin.js.map +1 -0
  95. package/dist/esm/start-router-plugin/generator-plugins/routes-manifest-plugin.d.ts +6 -0
  96. package/dist/esm/start-router-plugin/generator-plugins/routes-manifest-plugin.js +39 -0
  97. package/dist/esm/start-router-plugin/generator-plugins/routes-manifest-plugin.js.map +1 -0
  98. package/dist/esm/start-router-plugin/generator-plugins/server-routes-plugin.d.ts +2 -0
  99. package/dist/esm/start-router-plugin/generator-plugins/server-routes-plugin.js +121 -0
  100. package/dist/esm/start-router-plugin/generator-plugins/server-routes-plugin.js.map +1 -0
  101. package/dist/esm/start-router-plugin/plugin.d.ts +3 -0
  102. package/dist/esm/start-router-plugin/plugin.js +21 -0
  103. package/dist/esm/start-router-plugin/plugin.js.map +1 -0
  104. package/dist/esm/start-router-plugin/route-tree-client-plugin.d.ts +6 -0
  105. package/dist/esm/start-router-plugin/route-tree-client-plugin.js +55 -0
  106. package/dist/esm/start-router-plugin/route-tree-client-plugin.js.map +1 -0
  107. package/dist/esm/start-router-plugin/virtual-route-tree-plugin.d.ts +4 -0
  108. package/dist/esm/start-router-plugin/virtual-route-tree-plugin.js +30 -0
  109. package/dist/esm/start-router-plugin/virtual-route-tree-plugin.js.map +1 -0
  110. package/dist/esm/utils.d.ts +7 -0
  111. package/dist/esm/utils.js +11 -0
  112. package/dist/esm/utils.js.map +1 -1
  113. package/package.json +8 -7
  114. package/src/compilers.ts +31 -131
  115. package/src/constants.ts +10 -0
  116. package/src/debug.ts +3 -0
  117. package/src/{nitro/dev-server-plugin.ts → dev-server-plugin/plugin.ts} +11 -1
  118. package/src/global.d.ts +8 -0
  119. package/src/load-env-plugin/plugin.ts +17 -0
  120. package/src/{build-sitemap.ts → nitro-plugin/build-sitemap.ts} +11 -8
  121. package/src/nitro-plugin/plugin.ts +244 -0
  122. package/src/{prerender.ts → nitro-plugin/prerender.ts} +17 -13
  123. package/src/plugin.ts +63 -41
  124. package/src/resolve-virtual-entries-plugin/plugin.ts +63 -0
  125. package/src/start-compiler-plugin.ts +25 -25
  126. package/src/start-manifest-plugin/plugin.ts +249 -0
  127. package/src/start-router-plugin/generator-plugins/routes-manifest-plugin.ts +43 -0
  128. package/src/start-router-plugin/generator-plugins/server-routes-plugin.ts +138 -0
  129. package/src/start-router-plugin/plugin.ts +35 -0
  130. package/src/start-router-plugin/route-tree-client-plugin.ts +76 -0
  131. package/src/start-router-plugin/virtual-route-tree-plugin.ts +30 -0
  132. package/src/utils.ts +11 -0
  133. package/dist/cjs/build-sitemap.cjs.map +0 -1
  134. package/dist/cjs/extractHtmlScripts.cjs.map +0 -1
  135. package/dist/cjs/nitro/build-nitro.cjs +0 -18
  136. package/dist/cjs/nitro/build-nitro.cjs.map +0 -1
  137. package/dist/cjs/nitro/build-nitro.d.cts +0 -2
  138. package/dist/cjs/nitro/dev-server-plugin.cjs.map +0 -1
  139. package/dist/cjs/nitro/nitro-plugin.cjs.map +0 -1
  140. package/dist/cjs/prerender.cjs.map +0 -1
  141. package/dist/cjs/queue.cjs.map +0 -1
  142. package/dist/cjs/routesManifestPlugin.cjs +0 -168
  143. package/dist/cjs/routesManifestPlugin.cjs.map +0 -1
  144. package/dist/cjs/start-server-routes-plugin/config.d.cts +0 -49
  145. package/dist/cjs/start-server-routes-plugin/plugin.cjs +0 -613
  146. package/dist/cjs/start-server-routes-plugin/plugin.cjs.map +0 -1
  147. package/dist/cjs/start-server-routes-plugin/plugin.d.cts +0 -3
  148. package/dist/cjs/start-server-routes-plugin/template.cjs +0 -111
  149. package/dist/cjs/start-server-routes-plugin/template.cjs.map +0 -1
  150. package/dist/cjs/start-server-routes-plugin/template.d.cts +0 -34
  151. package/dist/esm/build-sitemap.js.map +0 -1
  152. package/dist/esm/extractHtmlScripts.js.map +0 -1
  153. package/dist/esm/nitro/build-nitro.d.ts +0 -2
  154. package/dist/esm/nitro/build-nitro.js +0 -18
  155. package/dist/esm/nitro/build-nitro.js.map +0 -1
  156. package/dist/esm/nitro/dev-server-plugin.js.map +0 -1
  157. package/dist/esm/nitro/nitro-plugin.js +0 -167
  158. package/dist/esm/nitro/nitro-plugin.js.map +0 -1
  159. package/dist/esm/prerender.js.map +0 -1
  160. package/dist/esm/queue.js.map +0 -1
  161. package/dist/esm/routesManifestPlugin.js +0 -168
  162. package/dist/esm/routesManifestPlugin.js.map +0 -1
  163. package/dist/esm/start-server-routes-plugin/config.d.ts +0 -49
  164. package/dist/esm/start-server-routes-plugin/plugin.d.ts +0 -3
  165. package/dist/esm/start-server-routes-plugin/plugin.js +0 -613
  166. package/dist/esm/start-server-routes-plugin/plugin.js.map +0 -1
  167. package/dist/esm/start-server-routes-plugin/template.d.ts +0 -34
  168. package/dist/esm/start-server-routes-plugin/template.js +0 -111
  169. package/dist/esm/start-server-routes-plugin/template.js.map +0 -1
  170. package/src/nitro/build-nitro.ts +0 -27
  171. package/src/nitro/nitro-plugin.ts +0 -195
  172. package/src/routesManifestPlugin.ts +0 -220
  173. package/src/start-server-routes-plugin/config.ts +0 -8
  174. package/src/start-server-routes-plugin/plugin.ts +0 -899
  175. package/src/start-server-routes-plugin/template.ts +0 -164
  176. /package/dist/cjs/{extractHtmlScripts.d.cts → dev-server-plugin/extract-html-scripts.d.cts} +0 -0
  177. /package/dist/cjs/{nitro/dev-server-plugin.d.cts → dev-server-plugin/plugin.d.cts} +0 -0
  178. /package/dist/cjs/{nitro/nitro-plugin.d.cts → nitro-plugin/plugin.d.cts} +0 -0
  179. /package/dist/cjs/{queue.cjs → nitro-plugin/queue.cjs} +0 -0
  180. /package/dist/cjs/{queue.d.cts → nitro-plugin/queue.d.cts} +0 -0
  181. /package/dist/esm/{extractHtmlScripts.d.ts → dev-server-plugin/extract-html-scripts.d.ts} +0 -0
  182. /package/dist/esm/{nitro/dev-server-plugin.d.ts → dev-server-plugin/plugin.d.ts} +0 -0
  183. /package/dist/esm/{nitro/nitro-plugin.d.ts → nitro-plugin/plugin.d.ts} +0 -0
  184. /package/dist/esm/{queue.d.ts → nitro-plugin/queue.d.ts} +0 -0
  185. /package/dist/esm/{queue.js → nitro-plugin/queue.js} +0 -0
  186. /package/src/{extractHtmlScripts.ts → dev-server-plugin/extract-html-scripts.ts} +0 -0
  187. /package/src/{queue.ts → nitro-plugin/queue.ts} +0 -0
@@ -32,9 +32,28 @@ function compileStartOutputFactory(framework) {
32
32
  Program: {
33
33
  enter(programPath) {
34
34
  const identifiers = {
35
+ createServerRootRoute: {
36
+ name: "createServerRootRoute",
37
+ handleCallExpression: handleCreateServerFileRouteCallExpressionFactory(
38
+ framework,
39
+ "createServerRootRoute"
40
+ ),
41
+ paths: []
42
+ },
43
+ createServerRoute: {
44
+ name: "createServerRoute",
45
+ handleCallExpression: handleCreateServerFileRouteCallExpressionFactory(
46
+ framework,
47
+ "createServerRoute"
48
+ ),
49
+ paths: []
50
+ },
35
51
  createServerFileRoute: {
36
52
  name: "createServerFileRoute",
37
- handleCallExpression: handleCreateServerFileRouteCallExpressionFactory(framework),
53
+ handleCallExpression: handleCreateServerFileRouteCallExpressionFactory(
54
+ framework,
55
+ "createServerFileRoute"
56
+ ),
38
57
  paths: []
39
58
  },
40
59
  createServerFn: {
@@ -66,7 +85,7 @@ function compileStartOutputFactory(framework) {
66
85
  const identifierKeys = Object.keys(identifiers);
67
86
  programPath.traverse({
68
87
  ImportDeclaration: (path) => {
69
- if (path.node.source.value !== "@tanstack/react-start" && path.node.source.value !== "@tanstack/solid-start") {
88
+ if (path.node.source.value !== `@tanstack/${framework}-start`) {
70
89
  return;
71
90
  }
72
91
  path.node.specifiers.forEach((specifier) => {
@@ -128,7 +147,7 @@ function compileStartOutputFactory(framework) {
128
147
  });
129
148
  };
130
149
  }
131
- function handleCreateServerFileRouteCallExpressionFactory(factory) {
150
+ function handleCreateServerFileRouteCallExpressionFactory(factory, method) {
132
151
  return function handleCreateServerFileRouteCallExpression(path, opts) {
133
152
  const PACKAGES = { start: `@tanstack/${factory}-start/server` };
134
153
  let highestParent = path;
@@ -147,19 +166,14 @@ function handleCreateServerFileRouteCallExpressionFactory(factory) {
147
166
  if (importSource === PACKAGES.start) {
148
167
  const specifiers = importPath.node.specifiers;
149
168
  isCreateServerFileRouteImported = specifiers.some((specifier) => {
150
- return t__namespace.isImportSpecifier(specifier) && t__namespace.isIdentifier(specifier.imported) && specifier.imported.name === "createServerFileRoute";
169
+ return t__namespace.isImportSpecifier(specifier) && t__namespace.isIdentifier(specifier.imported) && specifier.imported.name === method;
151
170
  });
152
171
  }
153
172
  }
154
173
  });
155
174
  if (!isCreateServerFileRouteImported) {
156
175
  const importDeclaration = t__namespace.importDeclaration(
157
- [
158
- t__namespace.importSpecifier(
159
- t__namespace.identifier("createServerFileRoute"),
160
- t__namespace.identifier("createServerFileRoute")
161
- )
162
- ],
176
+ [t__namespace.importSpecifier(t__namespace.identifier(method), t__namespace.identifier(method))],
163
177
  t__namespace.stringLiteral(PACKAGES.start)
164
178
  );
165
179
  programPath.node.body.unshift(importDeclaration);
@@ -1 +1 @@
1
- {"version":3,"file":"compilers.cjs","sources":["../../src/compilers.ts"],"sourcesContent":["import * as babel from '@babel/core'\nimport * as t from '@babel/types'\nimport { codeFrameColumns } from '@babel/code-frame'\n\nimport {\n deadCodeElimination,\n findReferencedIdentifiers,\n} from 'babel-dead-code-elimination'\nimport { generateFromAst, parseAst } from '@tanstack/router-utils'\nimport type { GeneratorResult, ParseAstOptions } from '@tanstack/router-utils'\n\nexport type CompileStartFrameworkOptions = 'react' | 'solid'\n\nexport function compileStartOutputFactory(\n framework: CompileStartFrameworkOptions,\n) {\n return function compileStartOutput(opts: CompileOptions): GeneratorResult {\n const ast = parseAst(opts)\n\n const doDce = opts.dce ?? true\n // find referenced identifiers *before* we transform anything\n const refIdents = doDce ? findReferencedIdentifiers(ast) : undefined\n\n babel.traverse(ast, {\n Program: {\n enter(programPath) {\n const identifiers: {\n createServerFileRoute: IdentifierConfig\n createServerFn: IdentifierConfig\n createMiddleware: IdentifierConfig\n serverOnly: IdentifierConfig\n clientOnly: IdentifierConfig\n createIsomorphicFn: IdentifierConfig\n } = {\n createServerFileRoute: {\n name: 'createServerFileRoute',\n handleCallExpression:\n handleCreateServerFileRouteCallExpressionFactory(framework),\n paths: [],\n },\n createServerFn: {\n name: 'createServerFn',\n handleCallExpression: handleCreateServerFnCallExpression,\n paths: [],\n },\n createMiddleware: {\n name: 'createMiddleware',\n handleCallExpression: handleCreateMiddlewareCallExpression,\n paths: [],\n },\n serverOnly: {\n name: 'serverOnly',\n handleCallExpression: handleServerOnlyCallExpression,\n paths: [],\n },\n clientOnly: {\n name: 'clientOnly',\n handleCallExpression: handleClientOnlyCallExpression,\n paths: [],\n },\n createIsomorphicFn: {\n name: 'createIsomorphicFn',\n handleCallExpression: handleCreateIsomorphicFnCallExpression,\n paths: [],\n },\n }\n\n const identifierKeys = Object.keys(identifiers) as Array<\n keyof typeof identifiers\n >\n\n programPath.traverse({\n ImportDeclaration: (path) => {\n if (\n path.node.source.value !== '@tanstack/react-start' &&\n path.node.source.value !== '@tanstack/solid-start'\n ) {\n return\n }\n\n // handle a destructured imports being renamed like \"import { createServerFn as myCreateServerFn } from '@tanstack/react-start';\"\n path.node.specifiers.forEach((specifier) => {\n identifierKeys.forEach((identifierKey) => {\n const identifier = identifiers[identifierKey]\n\n if (\n specifier.type === 'ImportSpecifier' &&\n specifier.imported.type === 'Identifier'\n ) {\n if (specifier.imported.name === identifierKey) {\n identifier.name = specifier.local.name\n }\n }\n\n // handle namespace imports like \"import * as TanStackStart from '@tanstack/react-start';\"\n if (specifier.type === 'ImportNamespaceSpecifier') {\n identifier.name = `${specifier.local.name}.${identifierKey}`\n }\n })\n })\n },\n CallExpression: (path) => {\n identifierKeys.forEach((identifierKey) => {\n // Check to see if the call expression is a call to the\n // identifiers[identifierKey].name\n if (\n t.isIdentifier(path.node.callee) &&\n path.node.callee.name === identifiers[identifierKey].name\n ) {\n // The identifier could be a call to the original function\n // in the source code. If this is case, we need to ignore it.\n // Check the scope to see if the identifier is a function declaration.\n // if it is, then we can ignore it.\n\n if (\n path.scope.getBinding(identifiers[identifierKey].name)?.path\n .node.type === 'FunctionDeclaration'\n ) {\n return\n }\n\n return identifiers[identifierKey].paths.push(path)\n }\n\n if (t.isMemberExpression(path.node.callee)) {\n if (\n t.isIdentifier(path.node.callee.object) &&\n t.isIdentifier(path.node.callee.property)\n ) {\n const callname = [\n path.node.callee.object.name,\n path.node.callee.property.name,\n ].join('.')\n\n if (callname === identifiers[identifierKey].name) {\n identifiers[identifierKey].paths.push(path)\n }\n }\n }\n\n return\n })\n },\n })\n\n identifierKeys.forEach((identifierKey) => {\n identifiers[identifierKey].paths.forEach((path) => {\n identifiers[identifierKey].handleCallExpression(\n path as babel.NodePath<t.CallExpression>,\n opts,\n )\n })\n })\n },\n },\n })\n\n if (doDce) {\n deadCodeElimination(ast, refIdents)\n }\n\n return generateFromAst(ast, {\n sourceMaps: true,\n sourceFileName: opts.filename,\n filename: opts.filename,\n })\n }\n}\n\nfunction handleCreateServerFileRouteCallExpressionFactory(\n factory: CompileStartFrameworkOptions,\n) {\n return function handleCreateServerFileRouteCallExpression(\n path: babel.NodePath<t.CallExpression>,\n opts: CompileOptions,\n ) {\n const PACKAGES = { start: `@tanstack/${factory}-start/server` }\n\n let highestParent: babel.NodePath<any> = path\n\n while (highestParent.parentPath && !highestParent.parentPath.isProgram()) {\n highestParent = highestParent.parentPath\n }\n\n const programPath = highestParent.parentPath as babel.NodePath<t.Program>\n\n // // Find the root call expression and all of the methods that are called on it\n // const rootCallExpression = getRootCallExpression(path)\n\n // const callExpressionPaths = {\n // validator: null as babel.NodePath<t.CallExpression> | null,\n // middleware: null as babel.NodePath<t.CallExpression> | null,\n // methods: null as babel.NodePath<t.CallExpression> | null,\n // }\n\n // const validMethods = Object.keys(callExpressionPaths)\n\n // rootCallExpression.traverse({\n // MemberExpression(memberExpressionPath) {\n // if (t.isIdentifier(memberExpressionPath.node.property)) {\n // const name = memberExpressionPath.node.property\n // .name as keyof typeof callExpressionPaths\n\n // if (\n // validMethods.includes(name) &&\n // memberExpressionPath.parentPath.isCallExpression()\n // ) {\n // callExpressionPaths[name] = memberExpressionPath.parentPath\n // }\n // }\n // },\n // })\n\n // const manifest = { middleware: false, methods: {} as any }\n\n // Object.entries(callExpressionPaths).forEach(([key, callPath]) => {\n // if (callPath && t.isMemberExpression(callPath.node.callee)) {\n // if (key === 'middleware') {\n // manifest.middleware = true\n // } else if (key === 'methods') {\n // // Get the methods object from the methods call\n // const methodsArg = callPath.node.arguments[0]\n\n // // Handle the case where methods is a function that returns an object\n // if (\n // t.isArrowFunctionExpression(methodsArg) &&\n // t.isObjectExpression(methodsArg.body)\n // ) {\n // methodsArg.body.properties.forEach((prop) => {\n // if (t.isObjectProperty(prop) && t.isIdentifier(prop.key)) {\n // const methodName = prop.key.name\n // manifest.methods[methodName] = {\n // middleware: false,\n // }\n\n // // Check if this method has a middleware\n // if (t.isCallExpression(prop.value)) {\n // const method = prop.value\n // method.arguments.forEach((arg) => {\n // if (t.isObjectExpression(arg)) {\n // arg.properties.forEach((methodProp) => {\n // if (\n // t.isObjectProperty(methodProp) &&\n // t.isIdentifier(methodProp.key)\n // ) {\n // if (methodProp.key.name === 'middleware') {\n // manifest.methods[methodName].middleware = true\n // }\n // }\n // })\n // }\n // })\n // }\n // }\n // })\n // }\n // // Handle the case where methods is a direct object\n // else if (t.isObjectExpression(methodsArg)) {\n // methodsArg.properties.forEach((prop) => {\n // if (t.isObjectProperty(prop) && t.isIdentifier(prop.key)) {\n // const methodName = prop.key.name\n // manifest.methods[methodName] = {\n // middleware: false,\n // }\n // }\n // })\n // }\n // }\n\n // if (opts.env === 'client') {\n // callPath.replaceWith(callPath.node.callee.object)\n // }\n // }\n // })\n\n // If we're on the client, remove the entire variable\n if (opts.env === 'client') {\n // console.debug('createServerFileRoute -> manifest:\\n', manifest)\n highestParent.remove()\n return\n }\n\n // path.replaceWith(\n // t.callExpression(t.identifier('createServerFileRoute'), [\n // t.identifier('undefined'),\n // t.callExpression(\n // t.memberExpression(t.identifier('Object'), t.identifier('assign')),\n // [\n // t.objectExpression(\n // path.node.arguments\n // .map((arg) => {\n // if (t.isIdentifier(arg)) {\n // return t.objectProperty(t.identifier(arg.name), arg)\n // }\n // // Handle other cases or return a default value if necessary\n // return null // or throw an error, or handle accordingly\n // })\n // .filter(\n // (property): property is t.ObjectProperty => property !== null,\n // ),\n // ),\n // t.objectExpression([\n // t.objectProperty(\n // t.identifier('manifest'),\n // t.valueToNode(manifest),\n // ),\n // ]),\n // ],\n // ),\n // ]),\n // )\n\n let isCreateServerFileRouteImported = false as boolean\n\n programPath.traverse({\n ImportDeclaration(importPath) {\n const importSource = importPath.node.source.value\n if (importSource === PACKAGES.start) {\n const specifiers = importPath.node.specifiers\n isCreateServerFileRouteImported = specifiers.some((specifier) => {\n return (\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.imported) &&\n specifier.imported.name === 'createServerFileRoute'\n )\n })\n }\n },\n })\n\n if (!isCreateServerFileRouteImported) {\n const importDeclaration = t.importDeclaration(\n [\n t.importSpecifier(\n t.identifier('createServerFileRoute'),\n t.identifier('createServerFileRoute'),\n ),\n ],\n t.stringLiteral(PACKAGES.start),\n )\n programPath.node.body.unshift(importDeclaration)\n }\n }\n}\n\n// build these once and reuse them\nexport const handleServerOnlyCallExpression =\n buildEnvOnlyCallExpressionHandler('server')\nexport const handleClientOnlyCallExpression =\n buildEnvOnlyCallExpressionHandler('client')\n\nexport type CompileOptions = ParseAstOptions & {\n env: 'server' | 'client'\n dce?: boolean\n filename: string\n}\n\nexport type IdentifierConfig = {\n name: string\n handleCallExpression: (\n path: babel.NodePath<t.CallExpression>,\n opts: CompileOptions,\n ) => void\n paths: Array<babel.NodePath>\n}\n\nexport function handleCreateServerFnCallExpression(\n path: babel.NodePath<t.CallExpression>,\n opts: CompileOptions,\n) {\n // The function is the 'fn' property of the object passed to createServerFn\n\n // const firstArg = path.node.arguments[0]\n // if (t.isObjectExpression(firstArg)) {\n // // Was called with some options\n // }\n\n // Traverse the member expression and find the call expressions for\n // the validator, handler, and middleware methods. Check to make sure they\n // are children of the createServerFn call expression.\n\n const calledOptions = path.node.arguments[0]\n ? (path.get('arguments.0') as babel.NodePath<t.ObjectExpression>)\n : null\n\n const shouldValidateClient = !!calledOptions?.node.properties.find((prop) => {\n return (\n t.isObjectProperty(prop) &&\n t.isIdentifier(prop.key) &&\n prop.key.name === 'validateClient' &&\n t.isBooleanLiteral(prop.value) &&\n prop.value.value === true\n )\n })\n\n const callExpressionPaths = {\n middleware: null as babel.NodePath<t.CallExpression> | null,\n validator: null as babel.NodePath<t.CallExpression> | null,\n handler: null as babel.NodePath<t.CallExpression> | null,\n }\n\n const validMethods = Object.keys(callExpressionPaths)\n\n const rootCallExpression = getRootCallExpression(path)\n\n // if (debug)\n // console.info(\n // 'Handling createServerFn call expression:',\n // rootCallExpression.toString(),\n // )\n\n // Check if the call is assigned to a variable\n if (!rootCallExpression.parentPath.isVariableDeclarator()) {\n throw new Error('createServerFn must be assigned to a variable!')\n }\n\n // Get the identifier name of the variable\n const variableDeclarator = rootCallExpression.parentPath.node\n const existingVariableName = (variableDeclarator.id as t.Identifier).name\n\n rootCallExpression.traverse({\n MemberExpression(memberExpressionPath) {\n if (t.isIdentifier(memberExpressionPath.node.property)) {\n const name = memberExpressionPath.node.property\n .name as keyof typeof callExpressionPaths\n\n if (\n validMethods.includes(name) &&\n memberExpressionPath.parentPath.isCallExpression()\n ) {\n callExpressionPaths[name] = memberExpressionPath.parentPath\n }\n }\n },\n })\n\n if (callExpressionPaths.validator) {\n const innerInputExpression = callExpressionPaths.validator.node.arguments[0]\n\n if (!innerInputExpression) {\n throw new Error(\n 'createServerFn().validator() must be called with a validator!',\n )\n }\n\n // If we're on the client, and we're not validating the client, remove the validator call expression\n if (\n opts.env === 'client' &&\n !shouldValidateClient &&\n t.isMemberExpression(callExpressionPaths.validator.node.callee)\n ) {\n callExpressionPaths.validator.replaceWith(\n callExpressionPaths.validator.node.callee.object,\n )\n }\n }\n\n // First, we need to move the handler function to a nested function call\n // that is applied to the arguments passed to the server function.\n\n const handlerFnPath = callExpressionPaths.handler?.get(\n 'arguments.0',\n ) as babel.NodePath<any>\n\n if (!callExpressionPaths.handler || !handlerFnPath.node) {\n throw codeFrameError(\n opts.code,\n path.node.callee.loc!,\n `createServerFn must be called with a \"handler\" property!`,\n )\n }\n\n const handlerFn = handlerFnPath.node\n\n // So, the way we do this is we give the handler function a way\n // to access the serverFn ctx on the server via function scope.\n // The 'use server' extracted function will be called with the\n // payload from the client, then use the scoped serverFn ctx\n // to execute the handler function.\n // This way, we can do things like data and middleware validation\n // in the __execute function without having to AST transform the\n // handler function too much itself.\n\n // .handler((optsOut, ctx) => {\n // return ((optsIn) => {\n // 'use server'\n // ctx.__execute(handlerFn, optsIn)\n // })(optsOut)\n // })\n\n // If the handler function is an identifier and we're on the client, we need to\n // remove the bound function from the file.\n // If we're on the server, you can leave it, since it will get referenced\n // as a second argument.\n\n if (t.isIdentifier(handlerFn)) {\n if (opts.env === 'client') {\n // Find the binding for the handler function\n const binding = handlerFnPath.scope.getBinding(handlerFn.name)\n // Remove it\n if (binding) {\n binding.path.remove()\n }\n }\n // If the env is server, just leave it alone\n }\n\n handlerFnPath.replaceWith(\n t.arrowFunctionExpression(\n [t.identifier('opts'), t.identifier('signal')],\n t.blockStatement(\n // Everything in here is server-only, since the client\n // will strip out anything in the 'use server' directive.\n [\n t.returnStatement(\n t.callExpression(\n t.identifier(`${existingVariableName}.__executeServer`),\n [t.identifier('opts'), t.identifier('signal')],\n ),\n ),\n ],\n [t.directive(t.directiveLiteral('use server'))],\n ),\n ),\n )\n\n if (opts.env === 'server') {\n callExpressionPaths.handler.node.arguments.push(handlerFn)\n }\n}\n\nexport function handleCreateMiddlewareCallExpression(\n path: babel.NodePath<t.CallExpression>,\n opts: CompileOptions,\n) {\n const rootCallExpression = getRootCallExpression(path)\n\n // if (debug)\n // console.info(\n // 'Handling createMiddleware call expression:',\n // rootCallExpression.toString(),\n // )\n\n const callExpressionPaths = {\n middleware: null as babel.NodePath<t.CallExpression> | null,\n validator: null as babel.NodePath<t.CallExpression> | null,\n client: null as babel.NodePath<t.CallExpression> | null,\n server: null as babel.NodePath<t.CallExpression> | null,\n }\n\n const validMethods = Object.keys(callExpressionPaths)\n\n rootCallExpression.traverse({\n MemberExpression(memberExpressionPath) {\n if (t.isIdentifier(memberExpressionPath.node.property)) {\n const name = memberExpressionPath.node.property\n .name as keyof typeof callExpressionPaths\n\n if (\n validMethods.includes(name) &&\n memberExpressionPath.parentPath.isCallExpression()\n ) {\n callExpressionPaths[name] = memberExpressionPath.parentPath\n }\n }\n },\n })\n\n if (callExpressionPaths.validator) {\n const innerInputExpression = callExpressionPaths.validator.node.arguments[0]\n\n if (!innerInputExpression) {\n throw new Error(\n 'createMiddleware().validator() must be called with a validator!',\n )\n }\n\n // If we're on the client, remove the validator call expression\n if (opts.env === 'client') {\n if (t.isMemberExpression(callExpressionPaths.validator.node.callee)) {\n callExpressionPaths.validator.replaceWith(\n callExpressionPaths.validator.node.callee.object,\n )\n }\n }\n }\n\n const serverFnPath = callExpressionPaths.server?.get(\n 'arguments.0',\n ) as babel.NodePath<any>\n\n if (\n callExpressionPaths.server &&\n serverFnPath.node &&\n opts.env === 'client'\n ) {\n // If we're on the client, remove the server call expression\n if (t.isMemberExpression(callExpressionPaths.server.node.callee)) {\n callExpressionPaths.server.replaceWith(\n callExpressionPaths.server.node.callee.object,\n )\n }\n }\n}\n\nfunction buildEnvOnlyCallExpressionHandler(env: 'client' | 'server') {\n return function envOnlyCallExpressionHandler(\n path: babel.NodePath<t.CallExpression>,\n opts: CompileOptions,\n ) {\n // if (debug)\n // console.info(`Handling ${env}Only call expression:`, path.toString())\n\n const isEnvMatch =\n env === 'client' ? opts.env === 'client' : opts.env === 'server'\n\n if (isEnvMatch) {\n // extract the inner function from the call expression\n const innerInputExpression = path.node.arguments[0]\n\n if (!t.isExpression(innerInputExpression)) {\n throw new Error(\n `${env}Only() functions must be called with a function!`,\n )\n }\n\n path.replaceWith(innerInputExpression)\n return\n }\n\n // If we're on the wrong environment, replace the call expression\n // with a function that always throws an error.\n path.replaceWith(\n t.arrowFunctionExpression(\n [],\n t.blockStatement([\n t.throwStatement(\n t.newExpression(t.identifier('Error'), [\n t.stringLiteral(\n `${env}Only() functions can only be called on the ${env}!`,\n ),\n ]),\n ),\n ]),\n ),\n )\n }\n}\n\nexport function handleCreateIsomorphicFnCallExpression(\n path: babel.NodePath<t.CallExpression>,\n opts: CompileOptions,\n) {\n const rootCallExpression = getRootCallExpression(path)\n\n // if (debug)\n // console.info(\n // 'Handling createIsomorphicFn call expression:',\n // rootCallExpression.toString(),\n // )\n\n const callExpressionPaths = {\n client: null as babel.NodePath<t.CallExpression> | null,\n server: null as babel.NodePath<t.CallExpression> | null,\n }\n\n const validMethods = Object.keys(callExpressionPaths)\n\n rootCallExpression.traverse({\n MemberExpression(memberExpressionPath) {\n if (t.isIdentifier(memberExpressionPath.node.property)) {\n const name = memberExpressionPath.node.property\n .name as keyof typeof callExpressionPaths\n\n if (\n validMethods.includes(name) &&\n memberExpressionPath.parentPath.isCallExpression()\n ) {\n callExpressionPaths[name] = memberExpressionPath.parentPath\n }\n }\n },\n })\n\n if (\n validMethods.every(\n (method) =>\n !callExpressionPaths[method as keyof typeof callExpressionPaths],\n )\n ) {\n const variableId = rootCallExpression.parentPath.isVariableDeclarator()\n ? rootCallExpression.parentPath.node.id\n : null\n console.warn(\n 'createIsomorphicFn called without a client or server implementation!',\n 'This will result in a no-op function.',\n 'Variable name:',\n t.isIdentifier(variableId) ? variableId.name : 'unknown',\n )\n }\n\n const envCallExpression = callExpressionPaths[opts.env]\n\n if (!envCallExpression) {\n // if we don't have an implementation for this environment, default to a no-op\n rootCallExpression.replaceWith(\n t.arrowFunctionExpression([], t.blockStatement([])),\n )\n return\n }\n\n const innerInputExpression = envCallExpression.node.arguments[0]\n\n if (!t.isExpression(innerInputExpression)) {\n throw new Error(\n `createIsomorphicFn().${opts.env}(func) must be called with a function!`,\n )\n }\n\n rootCallExpression.replaceWith(innerInputExpression)\n}\n\nexport function getRootCallExpression(path: babel.NodePath<t.CallExpression>) {\n // Find the highest callExpression parent\n let rootCallExpression: babel.NodePath<t.CallExpression> = path\n\n // Traverse up the chain of CallExpressions\n while (rootCallExpression.parentPath.isMemberExpression()) {\n const parent = rootCallExpression.parentPath\n if (parent.parentPath.isCallExpression()) {\n rootCallExpression = parent.parentPath\n }\n }\n\n return rootCallExpression\n}\n\nfunction codeFrameError(\n code: string,\n loc: {\n start: { line: number; column: number }\n end: { line: number; column: number }\n },\n message: string,\n) {\n const frame = codeFrameColumns(\n code,\n {\n start: loc.start,\n end: loc.end,\n },\n {\n highlightCode: true,\n message,\n },\n )\n\n return new Error(frame)\n}\n"],"names":["parseAst","findReferencedIdentifiers","babel","t","deadCodeElimination","generateFromAst","codeFrameColumns"],"mappings":"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"}
1
+ {"version":3,"file":"compilers.cjs","sources":["../../src/compilers.ts"],"sourcesContent":["import * as babel from '@babel/core'\nimport * as t from '@babel/types'\nimport { codeFrameColumns } from '@babel/code-frame'\n\nimport {\n deadCodeElimination,\n findReferencedIdentifiers,\n} from 'babel-dead-code-elimination'\nimport { generateFromAst, parseAst } from '@tanstack/router-utils'\nimport type { GeneratorResult, ParseAstOptions } from '@tanstack/router-utils'\n\nexport type CompileStartFrameworkOptions = 'react' | 'solid'\n\nexport function compileStartOutputFactory(\n framework: CompileStartFrameworkOptions,\n) {\n return function compileStartOutput(opts: CompileOptions): GeneratorResult {\n const ast = parseAst(opts)\n\n const doDce = opts.dce ?? true\n // find referenced identifiers *before* we transform anything\n const refIdents = doDce ? findReferencedIdentifiers(ast) : undefined\n\n babel.traverse(ast, {\n Program: {\n enter(programPath) {\n const identifiers: {\n createServerRoute: IdentifierConfig\n createServerFileRoute: IdentifierConfig\n createServerFn: IdentifierConfig\n createMiddleware: IdentifierConfig\n serverOnly: IdentifierConfig\n clientOnly: IdentifierConfig\n createIsomorphicFn: IdentifierConfig\n createServerRootRoute: IdentifierConfig\n } = {\n createServerRootRoute: {\n name: 'createServerRootRoute',\n handleCallExpression:\n handleCreateServerFileRouteCallExpressionFactory(\n framework,\n 'createServerRootRoute',\n ),\n paths: [],\n },\n createServerRoute: {\n name: 'createServerRoute',\n handleCallExpression:\n handleCreateServerFileRouteCallExpressionFactory(\n framework,\n 'createServerRoute',\n ),\n paths: [],\n },\n createServerFileRoute: {\n name: 'createServerFileRoute',\n handleCallExpression:\n handleCreateServerFileRouteCallExpressionFactory(\n framework,\n 'createServerFileRoute',\n ),\n paths: [],\n },\n createServerFn: {\n name: 'createServerFn',\n handleCallExpression: handleCreateServerFnCallExpression,\n paths: [],\n },\n createMiddleware: {\n name: 'createMiddleware',\n handleCallExpression: handleCreateMiddlewareCallExpression,\n paths: [],\n },\n serverOnly: {\n name: 'serverOnly',\n handleCallExpression: handleServerOnlyCallExpression,\n paths: [],\n },\n clientOnly: {\n name: 'clientOnly',\n handleCallExpression: handleClientOnlyCallExpression,\n paths: [],\n },\n createIsomorphicFn: {\n name: 'createIsomorphicFn',\n handleCallExpression: handleCreateIsomorphicFnCallExpression,\n paths: [],\n },\n }\n\n const identifierKeys = Object.keys(identifiers) as Array<\n keyof typeof identifiers\n >\n\n programPath.traverse({\n ImportDeclaration: (path) => {\n if (path.node.source.value !== `@tanstack/${framework}-start`) {\n return\n }\n\n // handle a destructured imports being renamed like \"import { createServerFn as myCreateServerFn } from '@tanstack/react-start';\"\n path.node.specifiers.forEach((specifier) => {\n identifierKeys.forEach((identifierKey) => {\n const identifier = identifiers[identifierKey]\n\n if (\n specifier.type === 'ImportSpecifier' &&\n specifier.imported.type === 'Identifier'\n ) {\n if (specifier.imported.name === identifierKey) {\n identifier.name = specifier.local.name\n }\n }\n\n // handle namespace imports like \"import * as TanStackStart from '@tanstack/react-start';\"\n if (specifier.type === 'ImportNamespaceSpecifier') {\n identifier.name = `${specifier.local.name}.${identifierKey}`\n }\n })\n })\n },\n CallExpression: (path) => {\n identifierKeys.forEach((identifierKey) => {\n // Check to see if the call expression is a call to the\n // identifiers[identifierKey].name\n if (\n t.isIdentifier(path.node.callee) &&\n path.node.callee.name === identifiers[identifierKey].name\n ) {\n // The identifier could be a call to the original function\n // in the source code. If this is case, we need to ignore it.\n // Check the scope to see if the identifier is a function declaration.\n // if it is, then we can ignore it.\n\n if (\n path.scope.getBinding(identifiers[identifierKey].name)?.path\n .node.type === 'FunctionDeclaration'\n ) {\n return\n }\n\n return identifiers[identifierKey].paths.push(path)\n }\n\n if (t.isMemberExpression(path.node.callee)) {\n if (\n t.isIdentifier(path.node.callee.object) &&\n t.isIdentifier(path.node.callee.property)\n ) {\n const callname = [\n path.node.callee.object.name,\n path.node.callee.property.name,\n ].join('.')\n\n if (callname === identifiers[identifierKey].name) {\n identifiers[identifierKey].paths.push(path)\n }\n }\n }\n\n return\n })\n },\n })\n\n identifierKeys.forEach((identifierKey) => {\n identifiers[identifierKey].paths.forEach((path) => {\n identifiers[identifierKey].handleCallExpression(\n path as babel.NodePath<t.CallExpression>,\n opts,\n )\n })\n })\n },\n },\n })\n\n if (doDce) {\n deadCodeElimination(ast, refIdents)\n }\n\n return generateFromAst(ast, {\n sourceMaps: true,\n sourceFileName: opts.filename,\n filename: opts.filename,\n })\n }\n}\n\nfunction handleCreateServerFileRouteCallExpressionFactory(\n factory: CompileStartFrameworkOptions,\n method:\n | 'createServerFileRoute'\n | 'createServerRoute'\n | 'createServerRootRoute',\n) {\n return function handleCreateServerFileRouteCallExpression(\n path: babel.NodePath<t.CallExpression>,\n opts: CompileOptions,\n ) {\n const PACKAGES = { start: `@tanstack/${factory}-start/server` }\n\n let highestParent: babel.NodePath<any> = path\n\n while (highestParent.parentPath && !highestParent.parentPath.isProgram()) {\n highestParent = highestParent.parentPath\n }\n\n const programPath = highestParent.parentPath as babel.NodePath<t.Program>\n\n // If we're on the client, remove the entire variable\n if (opts.env === 'client') {\n // console.debug('createServerFileRoute -> manifest:\\n', manifest)\n highestParent.remove()\n return\n }\n\n let isCreateServerFileRouteImported = false as boolean\n\n programPath.traverse({\n ImportDeclaration(importPath) {\n const importSource = importPath.node.source.value\n if (importSource === PACKAGES.start) {\n const specifiers = importPath.node.specifiers\n isCreateServerFileRouteImported = specifiers.some((specifier) => {\n return (\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.imported) &&\n specifier.imported.name === method\n )\n })\n }\n },\n })\n\n if (!isCreateServerFileRouteImported) {\n const importDeclaration = t.importDeclaration(\n [t.importSpecifier(t.identifier(method), t.identifier(method))],\n t.stringLiteral(PACKAGES.start),\n )\n programPath.node.body.unshift(importDeclaration)\n }\n }\n}\n\n// build these once and reuse them\nexport const handleServerOnlyCallExpression =\n buildEnvOnlyCallExpressionHandler('server')\nexport const handleClientOnlyCallExpression =\n buildEnvOnlyCallExpressionHandler('client')\n\nexport type CompileOptions = ParseAstOptions & {\n env: 'server' | 'client'\n dce?: boolean\n filename: string\n}\n\nexport type IdentifierConfig = {\n name: string\n handleCallExpression: (\n path: babel.NodePath<t.CallExpression>,\n opts: CompileOptions,\n ) => void\n paths: Array<babel.NodePath>\n}\n\nexport function handleCreateServerFnCallExpression(\n path: babel.NodePath<t.CallExpression>,\n opts: CompileOptions,\n) {\n // The function is the 'fn' property of the object passed to createServerFn\n\n // const firstArg = path.node.arguments[0]\n // if (t.isObjectExpression(firstArg)) {\n // // Was called with some options\n // }\n\n // Traverse the member expression and find the call expressions for\n // the validator, handler, and middleware methods. Check to make sure they\n // are children of the createServerFn call expression.\n\n const calledOptions = path.node.arguments[0]\n ? (path.get('arguments.0') as babel.NodePath<t.ObjectExpression>)\n : null\n\n const shouldValidateClient = !!calledOptions?.node.properties.find((prop) => {\n return (\n t.isObjectProperty(prop) &&\n t.isIdentifier(prop.key) &&\n prop.key.name === 'validateClient' &&\n t.isBooleanLiteral(prop.value) &&\n prop.value.value === true\n )\n })\n\n const callExpressionPaths = {\n middleware: null as babel.NodePath<t.CallExpression> | null,\n validator: null as babel.NodePath<t.CallExpression> | null,\n handler: null as babel.NodePath<t.CallExpression> | null,\n }\n\n const validMethods = Object.keys(callExpressionPaths)\n\n const rootCallExpression = getRootCallExpression(path)\n\n // if (debug)\n // console.info(\n // 'Handling createServerFn call expression:',\n // rootCallExpression.toString(),\n // )\n\n // Check if the call is assigned to a variable\n if (!rootCallExpression.parentPath.isVariableDeclarator()) {\n throw new Error('createServerFn must be assigned to a variable!')\n }\n\n // Get the identifier name of the variable\n const variableDeclarator = rootCallExpression.parentPath.node\n const existingVariableName = (variableDeclarator.id as t.Identifier).name\n\n rootCallExpression.traverse({\n MemberExpression(memberExpressionPath) {\n if (t.isIdentifier(memberExpressionPath.node.property)) {\n const name = memberExpressionPath.node.property\n .name as keyof typeof callExpressionPaths\n\n if (\n validMethods.includes(name) &&\n memberExpressionPath.parentPath.isCallExpression()\n ) {\n callExpressionPaths[name] = memberExpressionPath.parentPath\n }\n }\n },\n })\n\n if (callExpressionPaths.validator) {\n const innerInputExpression = callExpressionPaths.validator.node.arguments[0]\n\n if (!innerInputExpression) {\n throw new Error(\n 'createServerFn().validator() must be called with a validator!',\n )\n }\n\n // If we're on the client, and we're not validating the client, remove the validator call expression\n if (\n opts.env === 'client' &&\n !shouldValidateClient &&\n t.isMemberExpression(callExpressionPaths.validator.node.callee)\n ) {\n callExpressionPaths.validator.replaceWith(\n callExpressionPaths.validator.node.callee.object,\n )\n }\n }\n\n // First, we need to move the handler function to a nested function call\n // that is applied to the arguments passed to the server function.\n\n const handlerFnPath = callExpressionPaths.handler?.get(\n 'arguments.0',\n ) as babel.NodePath<any>\n\n if (!callExpressionPaths.handler || !handlerFnPath.node) {\n throw codeFrameError(\n opts.code,\n path.node.callee.loc!,\n `createServerFn must be called with a \"handler\" property!`,\n )\n }\n\n const handlerFn = handlerFnPath.node\n\n // So, the way we do this is we give the handler function a way\n // to access the serverFn ctx on the server via function scope.\n // The 'use server' extracted function will be called with the\n // payload from the client, then use the scoped serverFn ctx\n // to execute the handler function.\n // This way, we can do things like data and middleware validation\n // in the __execute function without having to AST transform the\n // handler function too much itself.\n\n // .handler((optsOut, ctx) => {\n // return ((optsIn) => {\n // 'use server'\n // ctx.__execute(handlerFn, optsIn)\n // })(optsOut)\n // })\n\n // If the handler function is an identifier and we're on the client, we need to\n // remove the bound function from the file.\n // If we're on the server, you can leave it, since it will get referenced\n // as a second argument.\n\n if (t.isIdentifier(handlerFn)) {\n if (opts.env === 'client') {\n // Find the binding for the handler function\n const binding = handlerFnPath.scope.getBinding(handlerFn.name)\n // Remove it\n if (binding) {\n binding.path.remove()\n }\n }\n // If the env is server, just leave it alone\n }\n\n handlerFnPath.replaceWith(\n t.arrowFunctionExpression(\n [t.identifier('opts'), t.identifier('signal')],\n t.blockStatement(\n // Everything in here is server-only, since the client\n // will strip out anything in the 'use server' directive.\n [\n t.returnStatement(\n t.callExpression(\n t.identifier(`${existingVariableName}.__executeServer`),\n [t.identifier('opts'), t.identifier('signal')],\n ),\n ),\n ],\n [t.directive(t.directiveLiteral('use server'))],\n ),\n ),\n )\n\n if (opts.env === 'server') {\n callExpressionPaths.handler.node.arguments.push(handlerFn)\n }\n}\n\nexport function handleCreateMiddlewareCallExpression(\n path: babel.NodePath<t.CallExpression>,\n opts: CompileOptions,\n) {\n const rootCallExpression = getRootCallExpression(path)\n\n // if (debug)\n // console.info(\n // 'Handling createMiddleware call expression:',\n // rootCallExpression.toString(),\n // )\n\n const callExpressionPaths = {\n middleware: null as babel.NodePath<t.CallExpression> | null,\n validator: null as babel.NodePath<t.CallExpression> | null,\n client: null as babel.NodePath<t.CallExpression> | null,\n server: null as babel.NodePath<t.CallExpression> | null,\n }\n\n const validMethods = Object.keys(callExpressionPaths)\n\n rootCallExpression.traverse({\n MemberExpression(memberExpressionPath) {\n if (t.isIdentifier(memberExpressionPath.node.property)) {\n const name = memberExpressionPath.node.property\n .name as keyof typeof callExpressionPaths\n\n if (\n validMethods.includes(name) &&\n memberExpressionPath.parentPath.isCallExpression()\n ) {\n callExpressionPaths[name] = memberExpressionPath.parentPath\n }\n }\n },\n })\n\n if (callExpressionPaths.validator) {\n const innerInputExpression = callExpressionPaths.validator.node.arguments[0]\n\n if (!innerInputExpression) {\n throw new Error(\n 'createMiddleware().validator() must be called with a validator!',\n )\n }\n\n // If we're on the client, remove the validator call expression\n if (opts.env === 'client') {\n if (t.isMemberExpression(callExpressionPaths.validator.node.callee)) {\n callExpressionPaths.validator.replaceWith(\n callExpressionPaths.validator.node.callee.object,\n )\n }\n }\n }\n\n const serverFnPath = callExpressionPaths.server?.get(\n 'arguments.0',\n ) as babel.NodePath<any>\n\n if (\n callExpressionPaths.server &&\n serverFnPath.node &&\n opts.env === 'client'\n ) {\n // If we're on the client, remove the server call expression\n if (t.isMemberExpression(callExpressionPaths.server.node.callee)) {\n callExpressionPaths.server.replaceWith(\n callExpressionPaths.server.node.callee.object,\n )\n }\n }\n}\n\nfunction buildEnvOnlyCallExpressionHandler(env: 'client' | 'server') {\n return function envOnlyCallExpressionHandler(\n path: babel.NodePath<t.CallExpression>,\n opts: CompileOptions,\n ) {\n // if (debug)\n // console.info(`Handling ${env}Only call expression:`, path.toString())\n\n const isEnvMatch =\n env === 'client' ? opts.env === 'client' : opts.env === 'server'\n\n if (isEnvMatch) {\n // extract the inner function from the call expression\n const innerInputExpression = path.node.arguments[0]\n\n if (!t.isExpression(innerInputExpression)) {\n throw new Error(\n `${env}Only() functions must be called with a function!`,\n )\n }\n\n path.replaceWith(innerInputExpression)\n return\n }\n\n // If we're on the wrong environment, replace the call expression\n // with a function that always throws an error.\n path.replaceWith(\n t.arrowFunctionExpression(\n [],\n t.blockStatement([\n t.throwStatement(\n t.newExpression(t.identifier('Error'), [\n t.stringLiteral(\n `${env}Only() functions can only be called on the ${env}!`,\n ),\n ]),\n ),\n ]),\n ),\n )\n }\n}\n\nexport function handleCreateIsomorphicFnCallExpression(\n path: babel.NodePath<t.CallExpression>,\n opts: CompileOptions,\n) {\n const rootCallExpression = getRootCallExpression(path)\n\n // if (debug)\n // console.info(\n // 'Handling createIsomorphicFn call expression:',\n // rootCallExpression.toString(),\n // )\n\n const callExpressionPaths = {\n client: null as babel.NodePath<t.CallExpression> | null,\n server: null as babel.NodePath<t.CallExpression> | null,\n }\n\n const validMethods = Object.keys(callExpressionPaths)\n\n rootCallExpression.traverse({\n MemberExpression(memberExpressionPath) {\n if (t.isIdentifier(memberExpressionPath.node.property)) {\n const name = memberExpressionPath.node.property\n .name as keyof typeof callExpressionPaths\n\n if (\n validMethods.includes(name) &&\n memberExpressionPath.parentPath.isCallExpression()\n ) {\n callExpressionPaths[name] = memberExpressionPath.parentPath\n }\n }\n },\n })\n\n if (\n validMethods.every(\n (method) =>\n !callExpressionPaths[method as keyof typeof callExpressionPaths],\n )\n ) {\n const variableId = rootCallExpression.parentPath.isVariableDeclarator()\n ? rootCallExpression.parentPath.node.id\n : null\n console.warn(\n 'createIsomorphicFn called without a client or server implementation!',\n 'This will result in a no-op function.',\n 'Variable name:',\n t.isIdentifier(variableId) ? variableId.name : 'unknown',\n )\n }\n\n const envCallExpression = callExpressionPaths[opts.env]\n\n if (!envCallExpression) {\n // if we don't have an implementation for this environment, default to a no-op\n rootCallExpression.replaceWith(\n t.arrowFunctionExpression([], t.blockStatement([])),\n )\n return\n }\n\n const innerInputExpression = envCallExpression.node.arguments[0]\n\n if (!t.isExpression(innerInputExpression)) {\n throw new Error(\n `createIsomorphicFn().${opts.env}(func) must be called with a function!`,\n )\n }\n\n rootCallExpression.replaceWith(innerInputExpression)\n}\n\nexport function getRootCallExpression(path: babel.NodePath<t.CallExpression>) {\n // Find the highest callExpression parent\n let rootCallExpression: babel.NodePath<t.CallExpression> = path\n\n // Traverse up the chain of CallExpressions\n while (rootCallExpression.parentPath.isMemberExpression()) {\n const parent = rootCallExpression.parentPath\n if (parent.parentPath.isCallExpression()) {\n rootCallExpression = parent.parentPath\n }\n }\n\n return rootCallExpression\n}\n\nfunction codeFrameError(\n code: string,\n loc: {\n start: { line: number; column: number }\n end: { line: number; column: number }\n },\n message: string,\n) {\n const frame = codeFrameColumns(\n code,\n {\n start: loc.start,\n end: loc.end,\n },\n {\n highlightCode: true,\n message,\n },\n )\n\n return new Error(frame)\n}\n"],"names":["parseAst","findReferencedIdentifiers","babel","t","deadCodeElimination","generateFromAst","codeFrameColumns"],"mappings":"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"}
@@ -1,10 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const path = require("node:path");
3
4
  const VITE_ENVIRONMENT_NAMES = {
4
5
  // 'ssr' is chosen as the name for the server environment to ensure backwards compatibility
5
6
  // with vite plugins that are not compatible with the new vite environment API (e.g. tailwindcss)
6
7
  server: "ssr",
7
8
  client: "client"
8
9
  };
10
+ const CLIENT_DIST_DIR = path.join(
11
+ ".tanstack",
12
+ "start",
13
+ "build",
14
+ "client-dist"
15
+ );
16
+ const SSR_ENTRY_FILE = "ssr.mjs";
17
+ exports.CLIENT_DIST_DIR = CLIENT_DIST_DIR;
18
+ exports.SSR_ENTRY_FILE = SSR_ENTRY_FILE;
9
19
  exports.VITE_ENVIRONMENT_NAMES = VITE_ENVIRONMENT_NAMES;
10
20
  //# sourceMappingURL=constants.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.cjs","sources":["../../src/constants.ts"],"sourcesContent":["export const VITE_ENVIRONMENT_NAMES = {\n // 'ssr' is chosen as the name for the server environment to ensure backwards compatibility\n // with vite plugins that are not compatible with the new vite environment API (e.g. tailwindcss)\n server: 'ssr',\n client: 'client',\n} as const\n"],"names":[],"mappings":";;AAAO,MAAM,yBAAyB;AAAA;AAAA;AAAA,EAGpC,QAAQ;AAAA,EACR,QAAQ;AACV;;"}
1
+ {"version":3,"file":"constants.cjs","sources":["../../src/constants.ts"],"sourcesContent":["import path from 'node:path'\n\nexport const VITE_ENVIRONMENT_NAMES = {\n // 'ssr' is chosen as the name for the server environment to ensure backwards compatibility\n // with vite plugins that are not compatible with the new vite environment API (e.g. tailwindcss)\n server: 'ssr',\n client: 'client',\n} as const\n\nexport const CLIENT_DIST_DIR = path.join(\n '.tanstack',\n 'start',\n 'build',\n 'client-dist',\n)\nexport const SSR_ENTRY_FILE = 'ssr.mjs'\n"],"names":[],"mappings":";;;AAEO,MAAM,yBAAyB;AAAA;AAAA;AAAA,EAGpC,QAAQ;AAAA,EACR,QAAQ;AACV;AAEO,MAAM,kBAAkB,KAAK;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACO,MAAM,iBAAiB;;;;"}
@@ -2,3 +2,5 @@ export declare const VITE_ENVIRONMENT_NAMES: {
2
2
  readonly server: "ssr";
3
3
  readonly client: "client";
4
4
  };
5
+ export declare const CLIENT_DIST_DIR: string;
6
+ export declare const SSR_ENTRY_FILE = "ssr.mjs";
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const debug = process.env.TSR_VITE_DEBUG && ["true", "start-plugin-core"].includes(process.env.TSR_VITE_DEBUG);
4
+ exports.debug = debug;
5
+ //# sourceMappingURL=debug.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.cjs","sources":["../../src/debug.ts"],"sourcesContent":["export const debug =\n process.env.TSR_VITE_DEBUG &&\n ['true', 'start-plugin-core'].includes(process.env.TSR_VITE_DEBUG)\n"],"names":[],"mappings":";;AAAa,MAAA,QACX,QAAQ,IAAI,kBACZ,CAAC,QAAQ,mBAAmB,EAAE,SAAS,QAAQ,IAAI,cAAc;;"}
@@ -0,0 +1 @@
1
+ export declare const debug: boolean | "" | undefined;
@@ -32,4 +32,4 @@ function extractHtmlScripts(html) {
32
32
  return scripts;
33
33
  }
34
34
  exports.extractHtmlScripts = extractHtmlScripts;
35
- //# sourceMappingURL=extractHtmlScripts.cjs.map
35
+ //# sourceMappingURL=extract-html-scripts.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-html-scripts.cjs","sources":["../../../src/dev-server-plugin/extract-html-scripts.ts"],"sourcesContent":["import * as cheerio from 'cheerio'\n\nexport function extractHtmlScripts(\n html: string,\n): Array<{ content?: string; src?: string }> {\n const $ = cheerio.load(html)\n const scripts: Array<{ content?: string; src?: string }> = []\n\n $('script').each((_, element) => {\n const src = $(element).attr('src')\n const content = $(element).html() ?? undefined\n scripts.push({\n src,\n content,\n })\n })\n\n return scripts\n}\n"],"names":["cheerio"],"mappings":";;;;;;;;;;;;;;;;;;;;AAEO,SAAS,mBACd,MAC2C;AACrC,QAAA,IAAIA,mBAAQ,KAAK,IAAI;AAC3B,QAAM,UAAqD,CAAC;AAE5D,IAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,YAAY;AAC/B,UAAM,MAAM,EAAE,OAAO,EAAE,KAAK,KAAK;AACjC,UAAM,UAAU,EAAE,OAAO,EAAE,KAAU,KAAA;AACrC,YAAQ,KAAK;AAAA,MACX;AAAA,MACA;AAAA,IAAA,CACD;AAAA,EAAA,CACF;AAEM,SAAA;AACT;;"}
@@ -2,8 +2,8 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const h3 = require("h3");
4
4
  const vite = require("vite");
5
- const extractHtmlScripts = require("../extractHtmlScripts.cjs");
6
5
  const constants = require("../constants.cjs");
6
+ const extractHtmlScripts = require("./extract-html-scripts.cjs");
7
7
  function devServerPlugin() {
8
8
  let isTest = false;
9
9
  return {
@@ -133,4 +133,4 @@ function prepareError(req, error) {
133
133
  };
134
134
  }
135
135
  exports.devServerPlugin = devServerPlugin;
136
- //# sourceMappingURL=dev-server-plugin.cjs.map
136
+ //# sourceMappingURL=plugin.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.cjs","sources":["../../../src/dev-server-plugin/plugin.ts"],"sourcesContent":["import { createEvent, getHeader, sendWebResponse } from 'h3'\nimport { isRunnableDevEnvironment } from 'vite'\nimport { VITE_ENVIRONMENT_NAMES } from '../constants'\nimport { extractHtmlScripts } from './extract-html-scripts'\nimport type { Connect, DevEnvironment, Plugin, ViteDevServer } from 'vite'\n\ndeclare global {\n // eslint-disable-next-line no-var\n var TSS_INJECTED_HEAD_SCRIPTS: string | undefined\n}\n\nexport function devServerPlugin(): Plugin {\n // let config: UserConfig\n let isTest = false\n\n return {\n name: 'start-dev-ssr-plugin',\n config(userConfig, { mode }) {\n // config = userConfig\n isTest = isTest ? isTest : mode === 'test'\n },\n configureServer(viteDevServer) {\n if (isTest) {\n return\n }\n\n ;(globalThis as any).viteDevServer = viteDevServer\n\n return () => {\n remove_html_middlewares(viteDevServer.middlewares)\n let cachedScripts: string | undefined\n\n viteDevServer.middlewares.use(async (req, res) => {\n // Create an H3Event to have it passed into the server entry\n // i.e: event => defineEventHandler(event)\n const event = createEvent(req, res)\n\n const serverEnv = viteDevServer.environments[\n VITE_ENVIRONMENT_NAMES.server\n ] as DevEnvironment | undefined\n\n try {\n if (!serverEnv) {\n throw new Error(\n `Server environment ${VITE_ENVIRONMENT_NAMES.server} not found`,\n )\n }\n\n if (!isRunnableDevEnvironment(serverEnv)) {\n throw new Error(\n `Expected server environment ${VITE_ENVIRONMENT_NAMES.server} to be a RunnableDevEnvironment. This can be caused by multiple vite versions being installed in the project.`,\n )\n }\n\n // Extract the scripts that Vite plugins would inject into the initial HTML\n if (cachedScripts === undefined) {\n const templateHtml = `<html><head></head><body></body></html>`\n const transformedHtml = await viteDevServer.transformIndexHtml(\n req.url || '/',\n templateHtml,\n )\n const scripts = extractHtmlScripts(transformedHtml)\n globalThis.TSS_INJECTED_HEAD_SCRIPTS = scripts\n .map((script) => script.content ?? '')\n .join(';')\n }\n\n // Import and resolve the request by running the server entry point\n // i.e export default defineEventHandler((event) => { ... })\n const serverEntry = await serverEnv.runner.import(\n '/~start/server-entry',\n )\n const response = await serverEntry['default'](event)\n\n return sendWebResponse(event, response)\n } catch (e) {\n console.error(e)\n viteDevServer.ssrFixStacktrace(e as Error)\n\n if (\n getHeader(event, 'content-type')?.includes('application/json')\n ) {\n return sendWebResponse(\n event,\n new Response(\n JSON.stringify(\n {\n status: 500,\n error: 'Internal Server Error',\n message:\n 'An unexpected error occurred. Please try again later.',\n timestamp: new Date().toISOString(),\n },\n null,\n 2,\n ),\n {\n status: 500,\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ),\n )\n }\n\n return sendWebResponse(\n event,\n new Response(\n `\n <!DOCTYPE html>\n <html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <title>Error</title>\n <script type=\"module\">\n import { ErrorOverlay } from '/@vite/client'\n document.body.appendChild(new ErrorOverlay(${JSON.stringify(\n prepareError(req, e),\n ).replace(/</g, '\\\\u003c')}))\n </script>\n </head>\n <body>\n </body>\n </html>\n `,\n {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n },\n ),\n )\n }\n })\n }\n },\n }\n}\n\n/**\n * Removes Vite internal middleware\n *\n * @param server\n */\nfunction remove_html_middlewares(server: ViteDevServer['middlewares']) {\n const html_middlewares = [\n 'viteIndexHtmlMiddleware',\n 'vite404Middleware',\n 'viteSpaFallbackMiddleware',\n ]\n for (let i = server.stack.length - 1; i > 0; i--) {\n if (\n html_middlewares.includes(\n // @ts-expect-error\n server.stack[i].handle.name,\n )\n ) {\n server.stack.splice(i, 1)\n }\n }\n}\n\n/**\n * Formats error for SSR message in error overlay\n * @param req\n * @param error\n * @returns\n */\nfunction prepareError(req: Connect.IncomingMessage, error: unknown) {\n const e = error as Error\n return {\n message: `An error occured while server rendering ${req.url}:\\n\\n\\t${\n typeof e === 'string' ? e : e.message\n } `,\n stack: typeof e === 'string' ? '' : e.stack,\n }\n}\n"],"names":["createEvent","VITE_ENVIRONMENT_NAMES","isRunnableDevEnvironment","extractHtmlScripts","sendWebResponse","getHeader"],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const vite = require("vite");
4
+ function _interopNamespaceDefault(e) {
5
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
6
+ if (e) {
7
+ for (const k in e) {
8
+ if (k !== "default") {
9
+ const d = Object.getOwnPropertyDescriptor(e, k);
10
+ Object.defineProperty(n, k, d.get ? d : {
11
+ enumerable: true,
12
+ get: () => e[k]
13
+ });
14
+ }
15
+ }
16
+ }
17
+ n.default = e;
18
+ return Object.freeze(n);
19
+ }
20
+ const vite__namespace = /* @__PURE__ */ _interopNamespaceDefault(vite);
21
+ function loadEnvPlugin(startOpts) {
22
+ return {
23
+ name: "tanstack-vite-plugin-nitro-load-env",
24
+ enforce: "pre",
25
+ config(userConfig, envConfig) {
26
+ Object.assign(
27
+ process.env,
28
+ vite__namespace.loadEnv(envConfig.mode, userConfig.root ?? startOpts.root, "")
29
+ );
30
+ }
31
+ };
32
+ }
33
+ exports.loadEnvPlugin = loadEnvPlugin;
34
+ //# sourceMappingURL=plugin.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.cjs","sources":["../../../src/load-env-plugin/plugin.ts"],"sourcesContent":["import * as vite from 'vite'\nimport type { TanStackStartOutputConfig } from '../plugin'\n\nexport function loadEnvPlugin(\n startOpts: TanStackStartOutputConfig,\n): vite.Plugin {\n return {\n name: 'tanstack-vite-plugin-nitro-load-env',\n enforce: 'pre',\n config(userConfig, envConfig) {\n Object.assign(\n process.env,\n vite.loadEnv(envConfig.mode, userConfig.root ?? startOpts.root, ''),\n )\n },\n }\n}\n"],"names":["vite"],"mappings":";;;;;;;;;;;;;;;;;;;;AAGO,SAAS,cACd,WACa;AACN,SAAA;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,OAAO,YAAY,WAAW;AACrB,aAAA;AAAA,QACL,QAAQ;AAAA,QACRA,gBAAK,QAAQ,UAAU,MAAM,WAAW,QAAQ,UAAU,MAAM,EAAE;AAAA,MACpE;AAAA,IAAA;AAAA,EAEJ;AACF;;"}
@@ -0,0 +1,3 @@
1
+ import { TanStackStartOutputConfig } from '../plugin.cjs';
2
+ import * as vite from 'vite';
3
+ export declare function loadEnvPlugin(startOpts: TanStackStartOutputConfig): vite.Plugin;
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const fs = require("node:fs");
3
+ const node_fs = require("node:fs");
4
4
  const path = require("node:path");
5
5
  const xmlbuilder2 = require("xmlbuilder2");
6
+ const utils = require("../utils.cjs");
6
7
  function buildSitemapJson(pages, host) {
7
8
  const slash = checkSlash(host);
8
9
  const urls = pages.filter((page) => {
@@ -68,10 +69,11 @@ function jsonToXml(sitemapData) {
68
69
  }
69
70
  return sitemap.end({ prettyPrint: true });
70
71
  }
71
- async function buildSitemap({
72
+ function buildSitemap({
72
73
  options,
73
74
  publicDir
74
75
  }) {
76
+ const logger = utils.createLogger("sitemap");
75
77
  let sitemapOptions = options.sitemap;
76
78
  if (!sitemapOptions && options.pages.length) {
77
79
  sitemapOptions = { enabled: true, outputPath: "sitemap.xml" };
@@ -82,7 +84,7 @@ async function buildSitemap({
82
84
  const { host, outputPath } = sitemapOptions;
83
85
  if (!host) {
84
86
  if (!options.sitemap) {
85
- console.info(
87
+ logger.info(
86
88
  "Hint: Pages found, but no sitemap host has been set. To enable sitemap generation, set the `sitemap.host` option."
87
89
  );
88
90
  return;
@@ -96,18 +98,18 @@ async function buildSitemap({
96
98
  }
97
99
  const { pages } = options;
98
100
  if (!pages.length) {
99
- console.log("No pages were found to build the sitemap. Skipping...");
101
+ logger.info("No pages were found to build the sitemap. Skipping...");
100
102
  return;
101
103
  }
102
- console.log("Building Sitemap...");
104
+ logger.info("Building Sitemap...");
103
105
  const sitemapData = buildSitemapJson(pages, host);
104
106
  const xmlOutputPath = path.join(publicDir, outputPath);
105
107
  const pagesOutputPath = path.join(publicDir, "pages.json");
106
108
  try {
107
- console.log(`Writing sitemap XML at ${xmlOutputPath}`);
108
- fs.writeFileSync(xmlOutputPath, jsonToXml(sitemapData));
109
- console.log(`Writing pages data at ${pagesOutputPath}`);
110
- fs.writeFileSync(
109
+ logger.info(`Writing sitemap XML at ${xmlOutputPath}`);
110
+ node_fs.writeFileSync(xmlOutputPath, jsonToXml(sitemapData));
111
+ logger.info(`Writing pages data at ${pagesOutputPath}`);
112
+ node_fs.writeFileSync(
111
113
  pagesOutputPath,
112
114
  JSON.stringify(
113
115
  {
@@ -120,7 +122,7 @@ async function buildSitemap({
120
122
  )
121
123
  );
122
124
  } catch (e) {
123
- console.error(`Unable to write sitemap files`, e);
125
+ logger.error(`Unable to write sitemap files`, e);
124
126
  }
125
127
  }
126
128
  function createXml(elementName) {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-sitemap.cjs","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":["createLogger","writeFileSync","create"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { TanStackStartOutputConfig } from './plugin.cjs';
1
+ import { TanStackStartOutputConfig } from '../plugin.cjs';
2
2
  export type SitemapUrl = {
3
3
  loc: string;
4
4
  lastmod: string;
@@ -28,4 +28,4 @@ export type SitemapData = {
28
28
  export declare function buildSitemap({ options, publicDir, }: {
29
29
  options: TanStackStartOutputConfig;
30
30
  publicDir: string;
31
- }): Promise<void>;
31
+ }): void;