@tanstack/start-plugin-core 1.132.0-alpha.8 → 1.132.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 (85) hide show
  1. package/dist/esm/constants.d.ts +2 -1
  2. package/dist/esm/constants.js +3 -2
  3. package/dist/esm/constants.js.map +1 -1
  4. package/dist/esm/create-server-fn-plugin/compiler.d.ts +64 -0
  5. package/dist/esm/create-server-fn-plugin/compiler.js +364 -0
  6. package/dist/esm/create-server-fn-plugin/compiler.js.map +1 -0
  7. package/dist/esm/create-server-fn-plugin/handleCreateMiddleware.d.ts +5 -0
  8. package/dist/esm/{start-compiler-plugin/middleware.js → create-server-fn-plugin/handleCreateMiddleware.js} +11 -11
  9. package/dist/esm/create-server-fn-plugin/handleCreateMiddleware.js.map +1 -0
  10. package/dist/esm/create-server-fn-plugin/handleCreateServerFn.d.ts +6 -0
  11. package/dist/esm/{start-compiler-plugin/serverFn.js → create-server-fn-plugin/handleCreateServerFn.js} +15 -17
  12. package/dist/esm/create-server-fn-plugin/handleCreateServerFn.js.map +1 -0
  13. package/dist/esm/create-server-fn-plugin/plugin.d.ts +3 -0
  14. package/dist/esm/create-server-fn-plugin/plugin.js +128 -0
  15. package/dist/esm/create-server-fn-plugin/plugin.js.map +1 -0
  16. package/dist/esm/dev-server-plugin/plugin.d.ts +4 -2
  17. package/dist/esm/dev-server-plugin/plugin.js +6 -2
  18. package/dist/esm/dev-server-plugin/plugin.js.map +1 -1
  19. package/dist/esm/plugin.d.ts +12 -6
  20. package/dist/esm/plugin.js +56 -68
  21. package/dist/esm/plugin.js.map +1 -1
  22. package/dist/esm/resolve-entries.d.ts +0 -1
  23. package/dist/esm/resolve-entries.js +1 -1
  24. package/dist/esm/resolve-entries.js.map +1 -1
  25. package/dist/esm/schema.d.ts +375 -308
  26. package/dist/esm/schema.js +23 -11
  27. package/dist/esm/schema.js.map +1 -1
  28. package/dist/esm/start-compiler-plugin/compilers.js +17 -55
  29. package/dist/esm/start-compiler-plugin/compilers.js.map +1 -1
  30. package/dist/esm/start-compiler-plugin/constants.d.ts +1 -1
  31. package/dist/esm/start-compiler-plugin/constants.js +1 -6
  32. package/dist/esm/start-compiler-plugin/constants.js.map +1 -1
  33. package/dist/esm/start-compiler-plugin/plugin.d.ts +1 -8
  34. package/dist/esm/start-compiler-plugin/plugin.js +6 -13
  35. package/dist/esm/start-compiler-plugin/plugin.js.map +1 -1
  36. package/dist/esm/start-router-plugin/constants.d.ts +1 -0
  37. package/dist/esm/start-router-plugin/constants.js +5 -0
  38. package/dist/esm/start-router-plugin/constants.js.map +1 -0
  39. package/dist/esm/start-router-plugin/generator-plugins/routes-manifest-plugin.js +3 -9
  40. package/dist/esm/start-router-plugin/generator-plugins/routes-manifest-plugin.js.map +1 -1
  41. package/dist/esm/start-router-plugin/plugin.d.ts +3 -2
  42. package/dist/esm/start-router-plugin/plugin.js +191 -31
  43. package/dist/esm/start-router-plugin/plugin.js.map +1 -1
  44. package/dist/esm/start-router-plugin/pruneServerOnlySubtrees.d.ts +8 -0
  45. package/dist/esm/start-router-plugin/pruneServerOnlySubtrees.js +34 -0
  46. package/dist/esm/start-router-plugin/pruneServerOnlySubtrees.js.map +1 -0
  47. package/package.json +8 -8
  48. package/src/constants.ts +3 -2
  49. package/src/create-server-fn-plugin/compiler.ts +498 -0
  50. package/src/{start-compiler-plugin/middleware.ts → create-server-fn-plugin/handleCreateMiddleware.ts} +15 -12
  51. package/src/{start-compiler-plugin/serverFn.ts → create-server-fn-plugin/handleCreateServerFn.ts} +32 -39
  52. package/src/create-server-fn-plugin/plugin.ts +153 -0
  53. package/src/dev-server-plugin/plugin.ts +6 -3
  54. package/src/plugin.ts +78 -87
  55. package/src/resolve-entries.ts +1 -2
  56. package/src/schema.ts +31 -14
  57. package/src/start-compiler-plugin/compilers.ts +18 -57
  58. package/src/start-compiler-plugin/constants.ts +0 -5
  59. package/src/start-compiler-plugin/plugin.ts +7 -22
  60. package/src/start-router-plugin/constants.ts +1 -0
  61. package/src/start-router-plugin/generator-plugins/routes-manifest-plugin.ts +3 -9
  62. package/src/start-router-plugin/plugin.ts +233 -45
  63. package/src/start-router-plugin/pruneServerOnlySubtrees.ts +51 -0
  64. package/dist/esm/debug.js +0 -5
  65. package/dist/esm/debug.js.map +0 -1
  66. package/dist/esm/start-compiler-plugin/middleware.d.ts +0 -4
  67. package/dist/esm/start-compiler-plugin/middleware.js.map +0 -1
  68. package/dist/esm/start-compiler-plugin/serverFileRoute.d.ts +0 -4
  69. package/dist/esm/start-compiler-plugin/serverFileRoute.js +0 -38
  70. package/dist/esm/start-compiler-plugin/serverFileRoute.js.map +0 -1
  71. package/dist/esm/start-compiler-plugin/serverFn.d.ts +0 -4
  72. package/dist/esm/start-compiler-plugin/serverFn.js.map +0 -1
  73. package/dist/esm/start-router-plugin/generator-plugins/server-routes-plugin.d.ts +0 -2
  74. package/dist/esm/start-router-plugin/generator-plugins/server-routes-plugin.js +0 -119
  75. package/dist/esm/start-router-plugin/generator-plugins/server-routes-plugin.js.map +0 -1
  76. package/dist/esm/start-router-plugin/route-tree-client-plugin.d.ts +0 -6
  77. package/dist/esm/start-router-plugin/route-tree-client-plugin.js +0 -56
  78. package/dist/esm/start-router-plugin/route-tree-client-plugin.js.map +0 -1
  79. package/dist/esm/start-router-plugin/virtual-route-tree-plugin.d.ts +0 -3
  80. package/dist/esm/start-router-plugin/virtual-route-tree-plugin.js +0 -29
  81. package/dist/esm/start-router-plugin/virtual-route-tree-plugin.js.map +0 -1
  82. package/src/start-compiler-plugin/serverFileRoute.ts +0 -59
  83. package/src/start-router-plugin/generator-plugins/server-routes-plugin.ts +0 -138
  84. package/src/start-router-plugin/route-tree-client-plugin.ts +0 -77
  85. package/src/start-router-plugin/virtual-route-tree-plugin.ts +0 -29
@@ -1,21 +1,31 @@
1
1
  import path from "node:path";
2
2
  import { z } from "zod";
3
- import { getConfig, configSchema } from "@tanstack/router-generator";
4
- const tsrConfig = configSchema.omit({ autoCodeSplitting: true }).partial();
5
- function parseStartConfig(opts) {
3
+ import { getConfig, configSchema } from "@tanstack/router-plugin";
4
+ const tsrConfig = configSchema.omit({ autoCodeSplitting: true, target: true, verboseFileRoutes: true }).partial();
5
+ function parseStartConfig(opts, corePluginOpts, root) {
6
6
  const options = tanstackStartOptionsSchema.parse(opts);
7
7
  const srcDirectory = options.srcDirectory;
8
- const routesDirectory = options.router.routesDirectory ?? path.join(srcDirectory, "routes");
9
- const generatedRouteTree = options.router.generatedRouteTree ?? path.join(srcDirectory, "routeTree.gen.ts");
8
+ const routesDirectory = path.resolve(
9
+ srcDirectory,
10
+ options.router.routesDirectory ?? "routes"
11
+ );
12
+ const generatedRouteTree = path.resolve(
13
+ srcDirectory,
14
+ options.router.generatedRouteTree ?? "routeTree.gen.ts"
15
+ );
10
16
  return {
11
17
  ...options,
12
18
  router: {
13
19
  ...options.router,
14
- ...getConfig({
15
- ...options.router,
16
- routesDirectory,
17
- generatedRouteTree
18
- })
20
+ ...getConfig(
21
+ {
22
+ ...options.router,
23
+ routesDirectory,
24
+ generatedRouteTree
25
+ },
26
+ root
27
+ ),
28
+ target: corePluginOpts.framework
19
29
  }
20
30
  };
21
31
  }
@@ -82,8 +92,10 @@ const pageSchema = pageBaseSchema.extend({
82
92
  });
83
93
  const tanstackStartOptionsSchema = z.object({
84
94
  srcDirectory: z.string().optional().default("src"),
95
+ start: z.object({
96
+ entry: z.string().optional()
97
+ }).optional().default({}),
85
98
  router: z.object({
86
- // TODO this will move to 'start' once we have `createStart`
87
99
  entry: z.string().optional()
88
100
  }).and(tsrConfig.optional().default({})).optional().default({}),
89
101
  client: z.object({
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sources":["../../src/schema.ts"],"sourcesContent":["import path from 'node:path'\nimport { z } from 'zod'\nimport { configSchema, getConfig } from '@tanstack/router-generator'\n\nconst tsrConfig = configSchema.omit({ autoCodeSplitting: true }).partial()\n\nexport function parseStartConfig(\n opts?: z.input<typeof tanstackStartOptionsSchema>,\n) {\n const options = tanstackStartOptionsSchema.parse(opts)\n\n const srcDirectory = options.srcDirectory\n\n const routesDirectory =\n options.router.routesDirectory ?? path.join(srcDirectory, 'routes')\n\n const generatedRouteTree =\n options.router.generatedRouteTree ??\n path.join(srcDirectory, 'routeTree.gen.ts')\n\n return {\n ...options,\n router: {\n ...options.router,\n ...getConfig({\n ...options.router,\n routesDirectory,\n generatedRouteTree,\n }),\n },\n }\n}\n\nconst pageSitemapOptionsSchema = z.object({\n exclude: z.boolean().optional(),\n priority: z.number().min(0).max(1).optional(),\n changefreq: z\n .enum(['always', 'hourly', 'daily', 'weekly', 'monthly', 'yearly', 'never'])\n .optional(),\n lastmod: z.union([z.string(), z.date()]).optional(),\n alternateRefs: z\n .array(\n z.object({\n href: z.string(),\n hreflang: z.string(),\n }),\n )\n .optional(),\n images: z\n .array(\n z.object({\n loc: z.string(),\n caption: z.string().optional(),\n title: z.string().optional(),\n }),\n )\n .optional(),\n news: z\n .object({\n publication: z.object({\n name: z.string(),\n language: z.string(),\n }),\n publicationDate: z.union([z.string(), z.date()]),\n title: z.string(),\n })\n .optional(),\n})\n\nconst pageBaseSchema = z.object({\n path: z.string(),\n sitemap: pageSitemapOptionsSchema.optional(),\n fromCrawl: z.boolean().optional(),\n})\n\nconst pagePrerenderOptionsSchema = z.object({\n enabled: z.boolean().optional(),\n outputPath: z.string().optional(),\n autoSubfolderIndex: z.boolean().optional(),\n crawlLinks: z.boolean().optional(),\n retryCount: z.number().optional(),\n retryDelay: z.number().optional(),\n onSuccess: z\n .function()\n .args(\n z.object({\n page: pageBaseSchema,\n html: z.string(),\n }),\n )\n .returns(z.any())\n .optional(),\n headers: z.record(z.string(), z.string()).optional(),\n})\n\nconst spaSchema = z.object({\n enabled: z.boolean().optional().default(true),\n maskPath: z.string().optional().default('/'),\n prerender: pagePrerenderOptionsSchema\n .optional()\n .default({})\n .transform((opts) => ({\n outputPath: opts.outputPath ?? '/_shell',\n crawlLinks: false,\n retryCount: 0,\n ...opts,\n enabled: true,\n })),\n})\n\nconst pageSchema = pageBaseSchema.extend({\n prerender: pagePrerenderOptionsSchema.optional(),\n})\n\nconst tanstackStartOptionsSchema = z\n .object({\n srcDirectory: z.string().optional().default('src'),\n router: z\n .object({\n // TODO this will move to 'start' once we have `createStart`\n entry: z.string().optional(),\n })\n .and(tsrConfig.optional().default({}))\n .optional()\n .default({}),\n client: z\n .object({\n entry: z.string().optional(),\n base: z.string().optional().default('/_build'),\n })\n .optional()\n .default({}),\n server: z\n .object({\n entry: z.string().optional(),\n })\n .optional()\n .default({}),\n serverFns: z\n .object({\n base: z.string().optional().default('/_serverFn'),\n })\n .optional()\n .default({}),\n public: z\n .object({\n dir: z.string().optional().default('public'),\n base: z.string().optional().default('/'),\n })\n .optional()\n .default({}),\n pages: z.array(pageSchema).optional().default([]),\n sitemap: z\n .object({\n enabled: z.boolean().optional().default(true),\n host: z.string().optional(),\n outputPath: z.string().optional().default('sitemap.xml'),\n })\n .optional(),\n prerender: z\n .object({\n enabled: z.boolean().optional(),\n concurrency: z.number().optional(),\n filter: z.function().args(pageSchema).returns(z.any()).optional(),\n failOnError: z.boolean().optional(),\n })\n .and(pagePrerenderOptionsSchema.optional())\n .optional(),\n spa: spaSchema.optional(),\n vite: z\n .object({ installDevServerMiddleware: z.boolean().optional() })\n .optional(),\n })\n .optional()\n .default({})\n\nexport type Page = z.infer<typeof pageSchema>\n\nexport type TanStackStartInputConfig = z.input<\n typeof tanstackStartOptionsSchema\n>\nexport type TanStackStartOutputConfig = ReturnType<typeof parseStartConfig>\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sources":["../../src/schema.ts"],"sourcesContent":["import path from 'node:path'\nimport { z } from 'zod'\nimport { configSchema, getConfig } from '@tanstack/router-plugin'\nimport type { TanStackStartVitePluginCoreOptions } from './plugin'\n\nconst tsrConfig = configSchema\n .omit({ autoCodeSplitting: true, target: true, verboseFileRoutes: true })\n .partial()\n\nexport function parseStartConfig(\n opts: z.input<typeof tanstackStartOptionsSchema>,\n corePluginOpts: TanStackStartVitePluginCoreOptions,\n root: string,\n) {\n const options = tanstackStartOptionsSchema.parse(opts)\n\n const srcDirectory = options.srcDirectory\n\n const routesDirectory = path.resolve(\n srcDirectory,\n options.router.routesDirectory ?? 'routes',\n )\n\n const generatedRouteTree = path.resolve(\n srcDirectory,\n options.router.generatedRouteTree ?? 'routeTree.gen.ts',\n )\n\n return {\n ...options,\n router: {\n ...options.router,\n ...getConfig(\n {\n ...options.router,\n routesDirectory,\n generatedRouteTree,\n },\n root,\n ),\n target: corePluginOpts.framework,\n },\n }\n}\n\nconst pageSitemapOptionsSchema = z.object({\n exclude: z.boolean().optional(),\n priority: z.number().min(0).max(1).optional(),\n changefreq: z\n .enum(['always', 'hourly', 'daily', 'weekly', 'monthly', 'yearly', 'never'])\n .optional(),\n lastmod: z.union([z.string(), z.date()]).optional(),\n alternateRefs: z\n .array(\n z.object({\n href: z.string(),\n hreflang: z.string(),\n }),\n )\n .optional(),\n images: z\n .array(\n z.object({\n loc: z.string(),\n caption: z.string().optional(),\n title: z.string().optional(),\n }),\n )\n .optional(),\n news: z\n .object({\n publication: z.object({\n name: z.string(),\n language: z.string(),\n }),\n publicationDate: z.union([z.string(), z.date()]),\n title: z.string(),\n })\n .optional(),\n})\n\nconst pageBaseSchema = z.object({\n path: z.string(),\n sitemap: pageSitemapOptionsSchema.optional(),\n fromCrawl: z.boolean().optional(),\n})\n\nconst pagePrerenderOptionsSchema = z.object({\n enabled: z.boolean().optional(),\n outputPath: z.string().optional(),\n autoSubfolderIndex: z.boolean().optional(),\n crawlLinks: z.boolean().optional(),\n retryCount: z.number().optional(),\n retryDelay: z.number().optional(),\n onSuccess: z\n .function()\n .args(\n z.object({\n page: pageBaseSchema,\n html: z.string(),\n }),\n )\n .returns(z.any())\n .optional(),\n headers: z.record(z.string(), z.string()).optional(),\n})\n\nconst spaSchema = z.object({\n enabled: z.boolean().optional().default(true),\n maskPath: z.string().optional().default('/'),\n prerender: pagePrerenderOptionsSchema\n .optional()\n .default({})\n .transform((opts) => ({\n outputPath: opts.outputPath ?? '/_shell',\n crawlLinks: false,\n retryCount: 0,\n ...opts,\n enabled: true,\n })),\n})\n\nconst pageSchema = pageBaseSchema.extend({\n prerender: pagePrerenderOptionsSchema.optional(),\n})\n\nconst tanstackStartOptionsSchema = z\n .object({\n srcDirectory: z.string().optional().default('src'),\n start: z\n .object({\n entry: z.string().optional(),\n })\n .optional()\n .default({}),\n router: z\n .object({\n entry: z.string().optional(),\n })\n .and(tsrConfig.optional().default({}))\n .optional()\n .default({}),\n client: z\n .object({\n entry: z.string().optional(),\n base: z.string().optional().default('/_build'),\n })\n .optional()\n .default({}),\n server: z\n .object({\n entry: z.string().optional(),\n })\n .optional()\n .default({}),\n serverFns: z\n .object({\n base: z.string().optional().default('/_serverFn'),\n })\n .optional()\n .default({}),\n public: z\n .object({\n dir: z.string().optional().default('public'),\n base: z.string().optional().default('/'),\n })\n .optional()\n .default({}),\n pages: z.array(pageSchema).optional().default([]),\n sitemap: z\n .object({\n enabled: z.boolean().optional().default(true),\n host: z.string().optional(),\n outputPath: z.string().optional().default('sitemap.xml'),\n })\n .optional(),\n prerender: z\n .object({\n enabled: z.boolean().optional(),\n concurrency: z.number().optional(),\n filter: z.function().args(pageSchema).returns(z.any()).optional(),\n failOnError: z.boolean().optional(),\n })\n .and(pagePrerenderOptionsSchema.optional())\n .optional(),\n spa: spaSchema.optional(),\n vite: z\n .object({ installDevServerMiddleware: z.boolean().optional() })\n .optional(),\n })\n .optional()\n .default({})\n\nexport type Page = z.infer<typeof pageSchema>\n\nexport type TanStackStartInputConfig = z.input<\n typeof tanstackStartOptionsSchema\n>\nexport type TanStackStartOutputConfig = ReturnType<typeof parseStartConfig>\n"],"names":[],"mappings":"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"}
@@ -3,71 +3,33 @@ import * as t from "@babel/types";
3
3
  import { findReferencedIdentifiers, deadCodeElimination } from "babel-dead-code-elimination";
4
4
  import { parseAst, generateFromAst } from "@tanstack/router-utils";
5
5
  import { transformFuncs } from "./constants.js";
6
- import { handleCreateServerFileRouteCallExpressionFactory } from "./serverFileRoute.js";
7
6
  import { handleCreateIsomorphicFnCallExpression } from "./isomorphicFn.js";
8
- import { handleCreateMiddlewareCallExpression } from "./middleware.js";
9
- import { handleCreateServerFnCallExpression } from "./serverFn.js";
10
7
  import { handleCreateClientOnlyFnCallExpression, handleCreateServerOnlyFnCallExpression } from "./envOnly.js";
11
- const getIdentifiers = (framework) => ({
12
- createServerRootRoute: {
13
- name: "createServerRootRoute",
14
- handleCallExpression: handleCreateServerFileRouteCallExpressionFactory(
15
- framework,
16
- "createServerRootRoute"
17
- ),
18
- paths: []
19
- },
20
- createServerRoute: {
21
- name: "createServerRoute",
22
- handleCallExpression: handleCreateServerFileRouteCallExpressionFactory(
23
- framework,
24
- "createServerRoute"
25
- ),
26
- paths: []
27
- },
28
- createServerFileRoute: {
29
- name: "createServerFileRoute",
30
- handleCallExpression: handleCreateServerFileRouteCallExpressionFactory(
31
- framework,
32
- "createServerFileRoute"
33
- ),
34
- paths: []
35
- },
36
- createServerFn: {
37
- name: "createServerFn",
38
- handleCallExpression: handleCreateServerFnCallExpression,
39
- paths: []
40
- },
41
- createMiddleware: {
42
- name: "createMiddleware",
43
- handleCallExpression: handleCreateMiddlewareCallExpression,
44
- paths: []
45
- },
46
- createServerOnlyFn: {
47
- name: "createServerOnlyFn",
48
- handleCallExpression: handleCreateServerOnlyFnCallExpression,
49
- paths: []
50
- },
51
- createClientOnlyFn: {
52
- name: "createClientOnlyFn",
53
- handleCallExpression: handleCreateClientOnlyFnCallExpression,
54
- paths: []
55
- },
56
- createIsomorphicFn: {
57
- name: "createIsomorphicFn",
58
- handleCallExpression: handleCreateIsomorphicFnCallExpression,
59
- paths: []
60
- }
61
- });
62
8
  function compileStartOutputFactory(framework) {
63
9
  return function compileStartOutput(opts) {
10
+ const identifiers = {
11
+ createServerOnlyFn: {
12
+ name: "createServerOnlyFn",
13
+ handleCallExpression: handleCreateServerOnlyFnCallExpression,
14
+ paths: []
15
+ },
16
+ createClientOnlyFn: {
17
+ name: "createClientOnlyFn",
18
+ handleCallExpression: handleCreateClientOnlyFnCallExpression,
19
+ paths: []
20
+ },
21
+ createIsomorphicFn: {
22
+ name: "createIsomorphicFn",
23
+ handleCallExpression: handleCreateIsomorphicFnCallExpression,
24
+ paths: []
25
+ }
26
+ };
64
27
  const ast = parseAst(opts);
65
28
  const doDce = opts.dce ?? true;
66
29
  const refIdents = doDce ? findReferencedIdentifiers(ast) : void 0;
67
30
  babel.traverse(ast, {
68
31
  Program: {
69
32
  enter(programPath) {
70
- const identifiers = getIdentifiers(framework);
71
33
  programPath.traverse({
72
34
  ImportDeclaration: (path) => {
73
35
  if (path.node.source.value !== `@tanstack/${framework}-start`) {
@@ -1 +1 @@
1
- {"version":3,"file":"compilers.js","sources":["../../../src/start-compiler-plugin/compilers.ts"],"sourcesContent":["import * as babel from '@babel/core'\nimport * as t from '@babel/types'\n\nimport {\n deadCodeElimination,\n findReferencedIdentifiers,\n} from 'babel-dead-code-elimination'\nimport { generateFromAst, parseAst } from '@tanstack/router-utils'\nimport { transformFuncs } from './constants'\nimport { handleCreateServerFileRouteCallExpressionFactory } from './serverFileRoute'\nimport { handleCreateIsomorphicFnCallExpression } from './isomorphicFn'\nimport { handleCreateMiddlewareCallExpression } from './middleware'\nimport { handleCreateServerFnCallExpression } from './serverFn'\nimport {\n handleCreateClientOnlyFnCallExpression,\n handleCreateServerOnlyFnCallExpression,\n} from './envOnly'\nimport type { GeneratorResult, ParseAstOptions } from '@tanstack/router-utils'\n\nexport type CompileStartFrameworkOptions = 'react' | 'solid'\n\ntype Identifiers = { [K in (typeof transformFuncs)[number]]: IdentifierConfig }\nconst getIdentifiers = (\n framework: CompileStartFrameworkOptions,\n): Identifiers => ({\n createServerRootRoute: {\n name: 'createServerRootRoute',\n handleCallExpression: handleCreateServerFileRouteCallExpressionFactory(\n framework,\n 'createServerRootRoute',\n ),\n paths: [],\n },\n createServerRoute: {\n name: 'createServerRoute',\n handleCallExpression: handleCreateServerFileRouteCallExpressionFactory(\n framework,\n 'createServerRoute',\n ),\n paths: [],\n },\n createServerFileRoute: {\n name: 'createServerFileRoute',\n handleCallExpression: 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 createServerOnlyFn: {\n name: 'createServerOnlyFn',\n handleCallExpression: handleCreateServerOnlyFnCallExpression,\n paths: [],\n },\n createClientOnlyFn: {\n name: 'createClientOnlyFn',\n handleCallExpression: handleCreateClientOnlyFnCallExpression,\n paths: [],\n },\n createIsomorphicFn: {\n name: 'createIsomorphicFn',\n handleCallExpression: handleCreateIsomorphicFnCallExpression,\n paths: [],\n },\n})\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 = getIdentifiers(framework)\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 transformFuncs.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 transformFuncs.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 // handle namespace imports like \"import * as TanStackStart from '@tanstack/react-start';\"\n // which are then called like \"TanStackStart.createServerFn()\"\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 transformFuncs.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\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"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compilers.js","sources":["../../../src/start-compiler-plugin/compilers.ts"],"sourcesContent":["import * as babel from '@babel/core'\nimport * as t from '@babel/types'\n\nimport {\n deadCodeElimination,\n findReferencedIdentifiers,\n} from 'babel-dead-code-elimination'\nimport { generateFromAst, parseAst } from '@tanstack/router-utils'\nimport { transformFuncs } from './constants'\nimport { handleCreateIsomorphicFnCallExpression } from './isomorphicFn'\nimport {\n handleCreateClientOnlyFnCallExpression,\n handleCreateServerOnlyFnCallExpression,\n} from './envOnly'\nimport type { GeneratorResult, ParseAstOptions } from '@tanstack/router-utils'\n\nexport type CompileStartFrameworkOptions = 'react' | 'solid'\n\ntype Identifiers = { [K in (typeof transformFuncs)[number]]: IdentifierConfig }\n\nexport function compileStartOutputFactory(\n framework: CompileStartFrameworkOptions,\n) {\n return function compileStartOutput(opts: CompileOptions): GeneratorResult {\n const identifiers: Identifiers = {\n createServerOnlyFn: {\n name: 'createServerOnlyFn',\n handleCallExpression: handleCreateServerOnlyFnCallExpression,\n paths: [],\n },\n createClientOnlyFn: {\n name: 'createClientOnlyFn',\n handleCallExpression: handleCreateClientOnlyFnCallExpression,\n paths: [],\n },\n createIsomorphicFn: {\n name: 'createIsomorphicFn',\n handleCallExpression: handleCreateIsomorphicFnCallExpression,\n paths: [],\n },\n }\n\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 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 transformFuncs.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 transformFuncs.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 // handle namespace imports like \"import * as TanStackStart from '@tanstack/react-start';\"\n // which are then called like \"TanStackStart.createServerFn()\"\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 transformFuncs.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\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"],"names":[],"mappings":";;;;;;;AAoBO,SAAS,0BACd,WACA;AACA,SAAO,SAAS,mBAAmB,MAAuC;AACxE,UAAM,cAA2B;AAAA,MAC/B,oBAAoB;AAAA,QAClB,MAAM;AAAA,QACN,sBAAsB;AAAA,QACtB,OAAO,CAAA;AAAA,MAAC;AAAA,MAEV,oBAAoB;AAAA,QAClB,MAAM;AAAA,QACN,sBAAsB;AAAA,QACtB,OAAO,CAAA;AAAA,MAAC;AAAA,MAEV,oBAAoB;AAAA,QAClB,MAAM;AAAA,QACN,sBAAsB;AAAA,QACtB,OAAO,CAAA;AAAA,MAAC;AAAA,IACV;AAGF,UAAM,MAAM,SAAS,IAAI;AAEzB,UAAM,QAAQ,KAAK,OAAO;AAE1B,UAAM,YAAY,QAAQ,0BAA0B,GAAG,IAAI;AAE3D,UAAM,SAAS,KAAK;AAAA,MAClB,SAAS;AAAA,QACP,MAAM,aAAa;AACjB,sBAAY,SAAS;AAAA,YACnB,mBAAmB,CAAC,SAAS;AAC3B,kBAAI,KAAK,KAAK,OAAO,UAAU,aAAa,SAAS,UAAU;AAC7D;AAAA,cACF;AAGA,mBAAK,KAAK,WAAW,QAAQ,CAAC,cAAc;AAC1C,+BAAe,QAAQ,CAAC,kBAAkB;AACxC,wBAAM,aAAa,YAAY,aAAa;AAE5C,sBACE,UAAU,SAAS,qBACnB,UAAU,SAAS,SAAS,cAC5B;AACA,wBAAI,UAAU,SAAS,SAAS,eAAe;AAC7C,iCAAW,OAAO,UAAU,MAAM;AAAA,oBACpC;AAAA,kBACF;AAGA,sBAAI,UAAU,SAAS,4BAA4B;AACjD,+BAAW,OAAO,GAAG,UAAU,MAAM,IAAI,IAAI,aAAa;AAAA,kBAC5D;AAAA,gBACF,CAAC;AAAA,cACH,CAAC;AAAA,YACH;AAAA,YACA,gBAAgB,CAAC,SAAS;AACxB,6BAAe,QAAQ,CAAC,kBAAkB;AAGxC,oBACE,EAAE,aAAa,KAAK,KAAK,MAAM,KAC/B,KAAK,KAAK,OAAO,SAAS,YAAY,aAAa,EAAE,MACrD;AAMA,sBACE,KAAK,MAAM,WAAW,YAAY,aAAa,EAAE,IAAI,GAAG,KACrD,KAAK,SAAS,uBACjB;AACA;AAAA,kBACF;AAEA,yBAAO,YAAY,aAAa,EAAE,MAAM,KAAK,IAAI;AAAA,gBACnD;AAIA,oBAAI,EAAE,mBAAmB,KAAK,KAAK,MAAM,GAAG;AAC1C,sBACE,EAAE,aAAa,KAAK,KAAK,OAAO,MAAM,KACtC,EAAE,aAAa,KAAK,KAAK,OAAO,QAAQ,GACxC;AACA,0BAAM,WAAW;AAAA,sBACf,KAAK,KAAK,OAAO,OAAO;AAAA,sBACxB,KAAK,KAAK,OAAO,SAAS;AAAA,oBAAA,EAC1B,KAAK,GAAG;AAEV,wBAAI,aAAa,YAAY,aAAa,EAAE,MAAM;AAChD,kCAAY,aAAa,EAAE,MAAM,KAAK,IAAI;AAAA,oBAC5C;AAAA,kBACF;AAAA,gBACF;AAEA;AAAA,cACF,CAAC;AAAA,YACH;AAAA,UAAA,CACD;AAED,yBAAe,QAAQ,CAAC,kBAAkB;AACxC,wBAAY,aAAa,EAAE,MAAM,QAAQ,CAAC,SAAS;AACjD,0BAAY,aAAa,EAAE;AAAA,gBACzB;AAAA,gBACA;AAAA,cAAA;AAAA,YAEJ,CAAC;AAAA,UACH,CAAC;AAAA,QACH;AAAA,MAAA;AAAA,IACF,CACD;AAED,QAAI,OAAO;AACT,0BAAoB,KAAK,SAAS;AAAA,IACpC;AAEA,WAAO,gBAAgB,KAAK;AAAA,MAC1B,YAAY;AAAA,MACZ,gBAAgB,KAAK;AAAA,MACrB,UAAU,KAAK;AAAA,IAAA,CAChB;AAAA,EACH;AACF;"}
@@ -1 +1 @@
1
- export declare const transformFuncs: readonly ["createServerFn", "createMiddleware", "createServerOnlyFn", "createClientOnlyFn", "createIsomorphicFn", "createServerRoute", "createServerFileRoute", "createServerRootRoute"];
1
+ export declare const transformFuncs: readonly ["createServerOnlyFn", "createClientOnlyFn", "createIsomorphicFn"];
@@ -1,12 +1,7 @@
1
1
  const transformFuncs = [
2
- "createServerFn",
3
- "createMiddleware",
4
2
  "createServerOnlyFn",
5
3
  "createClientOnlyFn",
6
- "createIsomorphicFn",
7
- "createServerRoute",
8
- "createServerFileRoute",
9
- "createServerRootRoute"
4
+ "createIsomorphicFn"
10
5
  ];
11
6
  export {
12
7
  transformFuncs
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sources":["../../../src/start-compiler-plugin/constants.ts"],"sourcesContent":["export const transformFuncs = [\n 'createServerFn',\n 'createMiddleware',\n 'createServerOnlyFn',\n 'createClientOnlyFn',\n 'createIsomorphicFn',\n 'createServerRoute',\n 'createServerFileRoute',\n 'createServerRootRoute',\n] as const\n"],"names":[],"mappings":"AAAO,MAAM,iBAAiB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;"}
1
+ {"version":3,"file":"constants.js","sources":["../../../src/start-compiler-plugin/constants.ts"],"sourcesContent":["export const transformFuncs = [\n 'createServerOnlyFn',\n 'createClientOnlyFn',\n 'createIsomorphicFn',\n] as const\n"],"names":[],"mappings":"AAAO,MAAM,iBAAiB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AACF;"}
@@ -3,11 +3,4 @@ import { CompileStartFrameworkOptions } from './compilers.js';
3
3
  export type TanStackStartViteOptions = {
4
4
  globalMiddlewareEntry: string;
5
5
  };
6
- export declare function startCompilerPlugin(framework: CompileStartFrameworkOptions, inputOpts?: {
7
- client?: {
8
- envName?: string;
9
- };
10
- server?: {
11
- envName?: string;
12
- };
13
- }): Plugin;
6
+ export declare function startCompilerPlugin(framework: CompileStartFrameworkOptions): Plugin;
@@ -19,23 +19,16 @@ function resolvePackage(packageName) {
19
19
  const pkgRoot = path.dirname(require2.resolve(packageName + "/package.json"));
20
20
  return pkgRoot;
21
21
  }
22
- function startCompilerPlugin(framework, inputOpts) {
23
- const opts = {
24
- client: {
25
- envName: VITE_ENVIRONMENT_NAMES.client,
26
- ...inputOpts?.client
27
- },
28
- server: {
29
- envName: VITE_ENVIRONMENT_NAMES.server,
30
- ...inputOpts?.server
31
- }
32
- };
22
+ function startCompilerPlugin(framework) {
33
23
  const compileStartOutput = compileStartOutputFactory(framework);
34
24
  return {
35
25
  name: "tanstack-start-core:compiler",
36
26
  enforce: "pre",
37
27
  applyToEnvironment(env) {
38
- return [opts.client.envName, opts.server.envName].includes(env.name);
28
+ return [
29
+ VITE_ENVIRONMENT_NAMES.client,
30
+ VITE_ENVIRONMENT_NAMES.server
31
+ ].includes(env.name);
39
32
  },
40
33
  transform: {
41
34
  filter: {
@@ -74,7 +67,7 @@ function startCompilerPlugin(framework, inputOpts) {
74
67
  }
75
68
  },
76
69
  handler(code, id) {
77
- const env = this.environment.name === opts.client.envName ? "client" : this.environment.name === opts.server.envName ? "server" : (() => {
70
+ const env = this.environment.name === VITE_ENVIRONMENT_NAMES.client ? "client" : this.environment.name === VITE_ENVIRONMENT_NAMES.server ? "server" : (() => {
78
71
  throw new Error(
79
72
  `Environment ${this.environment.name} not configured`
80
73
  );
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sources":["../../../src/start-compiler-plugin/plugin.ts"],"sourcesContent":["import { fileURLToPath, pathToFileURL } from 'node:url'\nimport { createRequire } from 'node:module'\nimport { logDiff } from '@tanstack/router-utils'\n\nimport { VIRTUAL_MODULES } from '@tanstack/start-server-core'\nimport { normalizePath } from 'vite'\nimport path from 'pathe'\nimport { VITE_ENVIRONMENT_NAMES } from '../constants'\nimport { compileStartOutputFactory } from './compilers'\nimport { transformFuncs } from './constants'\nimport type { Plugin } from 'vite'\nimport type { CompileStartFrameworkOptions } from './compilers'\n\nconst debug =\n process.env.TSR_VITE_DEBUG &&\n ['true', 'start-plugin'].includes(process.env.TSR_VITE_DEBUG)\n\nexport type TanStackStartViteOptions = {\n globalMiddlewareEntry: string\n}\n\nconst tokenRegex = new RegExp(transformFuncs.join('|'))\n\nconst require = createRequire(import.meta.url)\n\nfunction resolveRuntimeFiles(opts: { package: string; files: Array<string> }) {\n const pkgRoot = resolvePackage(opts.package)\n const basePath = path.join(pkgRoot, 'dist', 'esm')\n\n return opts.files.map((file) => normalizePath(path.join(basePath, file)))\n}\n\nfunction resolvePackage(packageName: string): string {\n const pkgRoot = path.dirname(require.resolve(packageName + '/package.json'))\n return pkgRoot\n}\n\nexport function startCompilerPlugin(\n framework: CompileStartFrameworkOptions,\n inputOpts?: {\n client?: {\n envName?: string\n }\n server?: {\n envName?: string\n }\n },\n): Plugin {\n const opts = {\n client: {\n envName: VITE_ENVIRONMENT_NAMES.client,\n ...inputOpts?.client,\n },\n server: {\n envName: VITE_ENVIRONMENT_NAMES.server,\n ...inputOpts?.server,\n },\n }\n\n const compileStartOutput = compileStartOutputFactory(framework)\n\n return {\n name: 'tanstack-start-core:compiler',\n enforce: 'pre',\n applyToEnvironment(env) {\n return [opts.client.envName, opts.server.envName].includes(env.name)\n },\n transform: {\n filter: {\n code: tokenRegex,\n id: {\n exclude: [\n VIRTUAL_MODULES.serverFnManifest,\n // N.B. the following files either just re-export or provide the runtime implementation of those functions\n // we do not want to include them in the transformation\n // however, those packages (especially start-client-core ATM) also USE these functions\n // (namely `createIsomorphicFn` in `packages/start-client-core/src/getRouterInstance.ts`) and thus need to be transformed\n ...resolveRuntimeFiles({\n package: '@tanstack/start-client-core',\n files: [\n 'index.js',\n 'createIsomorphicFn.js',\n 'envOnly.js',\n 'createServerFn.js',\n 'createMiddleware.js',\n 'serverFnFetcher.js',\n ],\n }),\n ...resolveRuntimeFiles({\n package: '@tanstack/start-server-core',\n files: [\n 'index.js',\n 'server-functions-handler.js',\n 'serverRoute.js',\n ],\n }),\n ...resolveRuntimeFiles({\n package: `@tanstack/${framework}-start-client`,\n files: ['index.js'],\n }),\n ],\n },\n },\n handler(code, id) {\n const env =\n this.environment.name === opts.client.envName\n ? 'client'\n : this.environment.name === opts.server.envName\n ? 'server'\n : (() => {\n throw new Error(\n `Environment ${this.environment.name} not configured`,\n )\n })()\n\n const url = pathToFileURL(id)\n url.searchParams.delete('v')\n id = fileURLToPath(url).replace(/\\\\/g, '/')\n\n if (debug) console.info(`${env} Compiling Start: `, id)\n\n const compiled = compileStartOutput({\n code,\n filename: id,\n env,\n })\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":["require"],"mappings":";;;;;;;;;AAaA,MAAM,QACJ,QAAQ,IAAI,kBACZ,CAAC,QAAQ,cAAc,EAAE,SAAS,QAAQ,IAAI,cAAc;AAM9D,MAAM,aAAa,IAAI,OAAO,eAAe,KAAK,GAAG,CAAC;AAEtD,MAAMA,WAAU,cAAc,YAAY,GAAG;AAE7C,SAAS,oBAAoB,MAAiD;AAC5E,QAAM,UAAU,eAAe,KAAK,OAAO;AAC3C,QAAM,WAAW,KAAK,KAAK,SAAS,QAAQ,KAAK;AAEjD,SAAO,KAAK,MAAM,IAAI,CAAC,SAAS,cAAc,KAAK,KAAK,UAAU,IAAI,CAAC,CAAC;AAC1E;AAEA,SAAS,eAAe,aAA6B;AACnD,QAAM,UAAU,KAAK,QAAQA,SAAQ,QAAQ,cAAc,eAAe,CAAC;AAC3E,SAAO;AACT;AAEO,SAAS,oBACd,WACA,WAQQ;AACR,QAAM,OAAO;AAAA,IACX,QAAQ;AAAA,MACN,SAAS,uBAAuB;AAAA,MAChC,GAAG,WAAW;AAAA,IAAA;AAAA,IAEhB,QAAQ;AAAA,MACN,SAAS,uBAAuB;AAAA,MAChC,GAAG,WAAW;AAAA,IAAA;AAAA,EAChB;AAGF,QAAM,qBAAqB,0BAA0B,SAAS;AAE9D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,mBAAmB,KAAK;AACtB,aAAO,CAAC,KAAK,OAAO,SAAS,KAAK,OAAO,OAAO,EAAE,SAAS,IAAI,IAAI;AAAA,IACrE;AAAA,IACA,WAAW;AAAA,MACT,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,IAAI;AAAA,UACF,SAAS;AAAA,YACP,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,YAKhB,GAAG,oBAAoB;AAAA,cACrB,SAAS;AAAA,cACT,OAAO;AAAA,gBACL;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cAAA;AAAA,YACF,CACD;AAAA,YACD,GAAG,oBAAoB;AAAA,cACrB,SAAS;AAAA,cACT,OAAO;AAAA,gBACL;AAAA,gBACA;AAAA,gBACA;AAAA,cAAA;AAAA,YACF,CACD;AAAA,YACD,GAAG,oBAAoB;AAAA,cACrB,SAAS,aAAa,SAAS;AAAA,cAC/B,OAAO,CAAC,UAAU;AAAA,YAAA,CACnB;AAAA,UAAA;AAAA,QACH;AAAA,MACF;AAAA,MAEF,QAAQ,MAAM,IAAI;AAChB,cAAM,MACJ,KAAK,YAAY,SAAS,KAAK,OAAO,UAClC,WACA,KAAK,YAAY,SAAS,KAAK,OAAO,UACpC,YACC,MAAM;AACL,gBAAM,IAAI;AAAA,YACR,eAAe,KAAK,YAAY,IAAI;AAAA,UAAA;AAAA,QAExC,GAAA;AAER,cAAM,MAAM,cAAc,EAAE;AAC5B,YAAI,aAAa,OAAO,GAAG;AAC3B,aAAK,cAAc,GAAG,EAAE,QAAQ,OAAO,GAAG;AAE1C,YAAI,MAAO,SAAQ,KAAK,GAAG,GAAG,sBAAsB,EAAE;AAEtD,cAAM,WAAW,mBAAmB;AAAA,UAClC;AAAA,UACA,UAAU;AAAA,UACV;AAAA,QAAA,CACD;AAED,YAAI,OAAO;AACT,kBAAQ,MAAM,SAAS,IAAI;AAC3B,kBAAQ,IAAI,aAAa,SAAS,OAAO,MAAM;AAAA,QACjD;AAEA,eAAO;AAAA,MACT;AAAA,IAAA;AAAA,EACF;AAEJ;"}
1
+ {"version":3,"file":"plugin.js","sources":["../../../src/start-compiler-plugin/plugin.ts"],"sourcesContent":["import { fileURLToPath, pathToFileURL } from 'node:url'\nimport { createRequire } from 'node:module'\nimport { logDiff } from '@tanstack/router-utils'\n\nimport { VIRTUAL_MODULES } from '@tanstack/start-server-core'\nimport { normalizePath } from 'vite'\nimport path from 'pathe'\nimport { VITE_ENVIRONMENT_NAMES } from '../constants'\nimport { compileStartOutputFactory } from './compilers'\nimport { transformFuncs } from './constants'\nimport type { ViteEnvironmentNames } from '../constants'\nimport type { Plugin } from 'vite'\nimport type { CompileStartFrameworkOptions } from './compilers'\n\nconst debug =\n process.env.TSR_VITE_DEBUG &&\n ['true', 'start-plugin'].includes(process.env.TSR_VITE_DEBUG)\n\nexport type TanStackStartViteOptions = {\n globalMiddlewareEntry: string\n}\n\nconst tokenRegex = new RegExp(transformFuncs.join('|'))\n\nconst require = createRequire(import.meta.url)\n\nfunction resolveRuntimeFiles(opts: { package: string; files: Array<string> }) {\n const pkgRoot = resolvePackage(opts.package)\n const basePath = path.join(pkgRoot, 'dist', 'esm')\n\n return opts.files.map((file) => normalizePath(path.join(basePath, file)))\n}\n\nfunction resolvePackage(packageName: string): string {\n const pkgRoot = path.dirname(require.resolve(packageName + '/package.json'))\n return pkgRoot\n}\n\nexport function startCompilerPlugin(\n framework: CompileStartFrameworkOptions,\n): Plugin {\n const compileStartOutput = compileStartOutputFactory(framework)\n\n return {\n name: 'tanstack-start-core:compiler',\n enforce: 'pre',\n applyToEnvironment(env) {\n return [\n VITE_ENVIRONMENT_NAMES.client,\n VITE_ENVIRONMENT_NAMES.server,\n ].includes(env.name as ViteEnvironmentNames)\n },\n transform: {\n filter: {\n code: tokenRegex,\n id: {\n exclude: [\n VIRTUAL_MODULES.serverFnManifest,\n // N.B. the following files either just re-export or provide the runtime implementation of those functions\n // we do not want to include them in the transformation\n // however, those packages (especially start-client-core ATM) also USE these functions\n // (namely `createIsomorphicFn` in `packages/start-client-core/src/getRouterInstance.ts`) and thus need to be transformed\n ...resolveRuntimeFiles({\n package: '@tanstack/start-client-core',\n files: [\n 'index.js',\n 'createIsomorphicFn.js',\n 'envOnly.js',\n 'createServerFn.js',\n 'createMiddleware.js',\n 'serverFnFetcher.js',\n ],\n }),\n ...resolveRuntimeFiles({\n package: '@tanstack/start-server-core',\n files: [\n 'index.js',\n 'server-functions-handler.js',\n 'serverRoute.js',\n ],\n }),\n ...resolveRuntimeFiles({\n package: `@tanstack/${framework}-start-client`,\n files: ['index.js'],\n }),\n ],\n },\n },\n handler(code, id) {\n const env =\n this.environment.name === VITE_ENVIRONMENT_NAMES.client\n ? 'client'\n : this.environment.name === VITE_ENVIRONMENT_NAMES.server\n ? 'server'\n : (() => {\n throw new Error(\n `Environment ${this.environment.name} not configured`,\n )\n })()\n\n const url = pathToFileURL(id)\n url.searchParams.delete('v')\n id = fileURLToPath(url).replace(/\\\\/g, '/')\n\n if (debug) console.info(`${env} Compiling Start: `, id)\n\n const compiled = compileStartOutput({\n code,\n filename: id,\n env,\n })\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":["require"],"mappings":";;;;;;;;;AAcA,MAAM,QACJ,QAAQ,IAAI,kBACZ,CAAC,QAAQ,cAAc,EAAE,SAAS,QAAQ,IAAI,cAAc;AAM9D,MAAM,aAAa,IAAI,OAAO,eAAe,KAAK,GAAG,CAAC;AAEtD,MAAMA,WAAU,cAAc,YAAY,GAAG;AAE7C,SAAS,oBAAoB,MAAiD;AAC5E,QAAM,UAAU,eAAe,KAAK,OAAO;AAC3C,QAAM,WAAW,KAAK,KAAK,SAAS,QAAQ,KAAK;AAEjD,SAAO,KAAK,MAAM,IAAI,CAAC,SAAS,cAAc,KAAK,KAAK,UAAU,IAAI,CAAC,CAAC;AAC1E;AAEA,SAAS,eAAe,aAA6B;AACnD,QAAM,UAAU,KAAK,QAAQA,SAAQ,QAAQ,cAAc,eAAe,CAAC;AAC3E,SAAO;AACT;AAEO,SAAS,oBACd,WACQ;AACR,QAAM,qBAAqB,0BAA0B,SAAS;AAE9D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,mBAAmB,KAAK;AACtB,aAAO;AAAA,QACL,uBAAuB;AAAA,QACvB,uBAAuB;AAAA,MAAA,EACvB,SAAS,IAAI,IAA4B;AAAA,IAC7C;AAAA,IACA,WAAW;AAAA,MACT,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,IAAI;AAAA,UACF,SAAS;AAAA,YACP,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,YAKhB,GAAG,oBAAoB;AAAA,cACrB,SAAS;AAAA,cACT,OAAO;AAAA,gBACL;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cAAA;AAAA,YACF,CACD;AAAA,YACD,GAAG,oBAAoB;AAAA,cACrB,SAAS;AAAA,cACT,OAAO;AAAA,gBACL;AAAA,gBACA;AAAA,gBACA;AAAA,cAAA;AAAA,YACF,CACD;AAAA,YACD,GAAG,oBAAoB;AAAA,cACrB,SAAS,aAAa,SAAS;AAAA,cAC/B,OAAO,CAAC,UAAU;AAAA,YAAA,CACnB;AAAA,UAAA;AAAA,QACH;AAAA,MACF;AAAA,MAEF,QAAQ,MAAM,IAAI;AAChB,cAAM,MACJ,KAAK,YAAY,SAAS,uBAAuB,SAC7C,WACA,KAAK,YAAY,SAAS,uBAAuB,SAC/C,YACC,MAAM;AACL,gBAAM,IAAI;AAAA,YACR,eAAe,KAAK,YAAY,IAAI;AAAA,UAAA;AAAA,QAExC,GAAA;AAER,cAAM,MAAM,cAAc,EAAE;AAC5B,YAAI,aAAa,OAAO,GAAG;AAC3B,aAAK,cAAc,GAAG,EAAE,QAAQ,OAAO,GAAG;AAE1C,YAAI,MAAO,SAAQ,KAAK,GAAG,GAAG,sBAAsB,EAAE;AAEtD,cAAM,WAAW,mBAAmB;AAAA,UAClC;AAAA,UACA,UAAU;AAAA,UACV;AAAA,QAAA,CACD;AAED,YAAI,OAAO;AACT,kBAAQ,MAAM,SAAS,IAAI;AAC3B,kBAAQ,IAAI,aAAa,SAAS,OAAO,MAAM;AAAA,QACjD;AAEA,eAAO;AAAA,MACT;AAAA,IAAA;AAAA,EACF;AAEJ;"}
@@ -0,0 +1 @@
1
+ export declare const SERVER_PROP = "server";
@@ -0,0 +1,5 @@
1
+ const SERVER_PROP = "server";
2
+ export {
3
+ SERVER_PROP
4
+ };
5
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sources":["../../../src/start-router-plugin/constants.ts"],"sourcesContent":["export const SERVER_PROP = 'server'\n"],"names":[],"mappings":"AAAO,MAAM,cAAc;"}
@@ -2,20 +2,14 @@ import { rootRouteId } from "@tanstack/router-core";
2
2
  function routesManifestPlugin() {
3
3
  return {
4
4
  name: "routes-manifest-plugin",
5
- onRouteTreesChanged: ({ routeTrees, rootRouteNode }) => {
6
- const routeTree = routeTrees.find((tree) => tree.exportName === "Route");
7
- if (!routeTree) {
8
- throw new Error(
9
- 'No route tree found with export name "Route". Please ensure your routes are correctly defined.'
10
- );
11
- }
5
+ onRouteTreeChanged: ({ routeTree, rootRouteNode, routeNodes }) => {
12
6
  const routesManifest = {
13
7
  [rootRouteId]: {
14
8
  filePath: rootRouteNode.fullPath,
15
- children: routeTree.acc.routeTree.map((d) => d.routePath)
9
+ children: routeTree.map((d) => d.routePath)
16
10
  },
17
11
  ...Object.fromEntries(
18
- routeTree.acc.routeNodes.map((d) => {
12
+ routeNodes.map((d) => {
19
13
  const filePathId = d.routePath;
20
14
  return [
21
15
  filePathId,
@@ -1 +1 @@
1
- {"version":3,"file":"routes-manifest-plugin.js","sources":["../../../../src/start-router-plugin/generator-plugins/routes-manifest-plugin.ts"],"sourcesContent":["import { rootRouteId } from '@tanstack/router-core'\n\nimport type { GeneratorPlugin } from '@tanstack/router-generator'\n\n/**\n * this plugin builds the routes manifest and stores it on globalThis\n * so that it can be accessed later (e.g. from a vite plugin)\n */\nexport function routesManifestPlugin(): GeneratorPlugin {\n return {\n name: 'routes-manifest-plugin',\n onRouteTreesChanged: ({ routeTrees, rootRouteNode }) => {\n const routeTree = routeTrees.find((tree) => tree.exportName === 'Route')\n if (!routeTree) {\n throw new Error(\n 'No route tree found with export name \"Route\". Please ensure your routes are correctly defined.',\n )\n }\n const routesManifest = {\n [rootRouteId]: {\n filePath: rootRouteNode.fullPath,\n children: routeTree.acc.routeTree.map((d) => d.routePath),\n },\n ...Object.fromEntries(\n routeTree.acc.routeNodes.map((d) => {\n const filePathId = d.routePath\n\n return [\n filePathId,\n {\n filePath: d.fullPath,\n parent: d.parent?.routePath ? d.parent.routePath : undefined,\n children: d.children?.map((childRoute) => childRoute.routePath),\n },\n ]\n }),\n ),\n }\n\n globalThis.TSS_ROUTES_MANIFEST = { routes: routesManifest }\n },\n }\n}\n"],"names":[],"mappings":";AAQO,SAAS,uBAAwC;AACtD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,qBAAqB,CAAC,EAAE,YAAY,oBAAoB;AACtD,YAAM,YAAY,WAAW,KAAK,CAAC,SAAS,KAAK,eAAe,OAAO;AACvE,UAAI,CAAC,WAAW;AACd,cAAM,IAAI;AAAA,UACR;AAAA,QAAA;AAAA,MAEJ;AACA,YAAM,iBAAiB;AAAA,QACrB,CAAC,WAAW,GAAG;AAAA,UACb,UAAU,cAAc;AAAA,UACxB,UAAU,UAAU,IAAI,UAAU,IAAI,CAAC,MAAM,EAAE,SAAS;AAAA,QAAA;AAAA,QAE1D,GAAG,OAAO;AAAA,UACR,UAAU,IAAI,WAAW,IAAI,CAAC,MAAM;AAClC,kBAAM,aAAa,EAAE;AAErB,mBAAO;AAAA,cACL;AAAA,cACA;AAAA,gBACE,UAAU,EAAE;AAAA,gBACZ,QAAQ,EAAE,QAAQ,YAAY,EAAE,OAAO,YAAY;AAAA,gBACnD,UAAU,EAAE,UAAU,IAAI,CAAC,eAAe,WAAW,SAAS;AAAA,cAAA;AAAA,YAChE;AAAA,UAEJ,CAAC;AAAA,QAAA;AAAA,MACH;AAGF,iBAAW,sBAAsB,EAAE,QAAQ,eAAA;AAAA,IAC7C;AAAA,EAAA;AAEJ;"}
1
+ {"version":3,"file":"routes-manifest-plugin.js","sources":["../../../../src/start-router-plugin/generator-plugins/routes-manifest-plugin.ts"],"sourcesContent":["import { rootRouteId } from '@tanstack/router-core'\n\nimport type { GeneratorPlugin } from '@tanstack/router-generator'\n\n/**\n * this plugin builds the routes manifest and stores it on globalThis\n * so that it can be accessed later (e.g. from a vite plugin)\n */\nexport function routesManifestPlugin(): GeneratorPlugin {\n return {\n name: 'routes-manifest-plugin',\n onRouteTreeChanged: ({ routeTree, rootRouteNode, routeNodes }) => {\n const routesManifest = {\n [rootRouteId]: {\n filePath: rootRouteNode.fullPath,\n children: routeTree.map((d) => d.routePath),\n },\n ...Object.fromEntries(\n routeNodes.map((d) => {\n const filePathId = d.routePath\n\n return [\n filePathId,\n {\n filePath: d.fullPath,\n parent: d.parent?.routePath ? d.parent.routePath : undefined,\n children: d.children?.map((childRoute) => childRoute.routePath),\n },\n ]\n }),\n ),\n }\n\n globalThis.TSS_ROUTES_MANIFEST = { routes: routesManifest }\n },\n }\n}\n"],"names":[],"mappings":";AAQO,SAAS,uBAAwC;AACtD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,oBAAoB,CAAC,EAAE,WAAW,eAAe,iBAAiB;AAChE,YAAM,iBAAiB;AAAA,QACrB,CAAC,WAAW,GAAG;AAAA,UACb,UAAU,cAAc;AAAA,UACxB,UAAU,UAAU,IAAI,CAAC,MAAM,EAAE,SAAS;AAAA,QAAA;AAAA,QAE5C,GAAG,OAAO;AAAA,UACR,WAAW,IAAI,CAAC,MAAM;AACpB,kBAAM,aAAa,EAAE;AAErB,mBAAO;AAAA,cACL;AAAA,cACA;AAAA,gBACE,UAAU,EAAE;AAAA,gBACZ,QAAQ,EAAE,QAAQ,YAAY,EAAE,OAAO,YAAY;AAAA,gBACnD,UAAU,EAAE,UAAU,IAAI,CAAC,eAAe,WAAW,SAAS;AAAA,cAAA;AAAA,YAChE;AAAA,UAEJ,CAAC;AAAA,QAAA;AAAA,MACH;AAGF,iBAAW,sBAAsB,EAAE,QAAQ,eAAA;AAAA,IAC7C;AAAA,EAAA;AAEJ;"}
@@ -1,3 +1,4 @@
1
1
  import { PluginOption } from 'vite';
2
- import { Config } from '@tanstack/router-plugin';
3
- export declare function tanStackStartRouter(config: Config): Array<PluginOption>;
2
+ import { TanStackStartInputConfig } from '../schema.js';
3
+ import { GetConfigFn, TanStackStartVitePluginCoreOptions } from '../plugin.js';
4
+ export declare function tanStackStartRouter(startPluginOpts: TanStackStartInputConfig, getConfig: GetConfigFn, corePluginOpts: TanStackStartVitePluginCoreOptions): Array<PluginOption>;
@@ -1,42 +1,202 @@
1
1
  import { tanstackRouterGenerator, tanStackRouterCodeSplitter, tanstackRouterAutoImport } from "@tanstack/router-plugin/vite";
2
+ import { normalizePath } from "vite";
3
+ import path from "pathe";
2
4
  import { VITE_ENVIRONMENT_NAMES } from "../constants.js";
3
- import { routeTreeClientPlugin } from "./route-tree-client-plugin.js";
4
- import { virtualRouteTreePlugin } from "./virtual-route-tree-plugin.js";
5
5
  import { routesManifestPlugin } from "./generator-plugins/routes-manifest-plugin.js";
6
- import { serverRoutesPlugin } from "./generator-plugins/server-routes-plugin.js";
7
- function tanStackStartRouter(config) {
8
- return [
9
- tanstackRouterGenerator({
10
- ...config,
11
- plugins: [serverRoutesPlugin(), routesManifestPlugin()],
12
- plugin: {
13
- vite: { environmentName: VITE_ENVIRONMENT_NAMES.client }
6
+ import { pruneServerOnlySubtrees } from "./pruneServerOnlySubtrees.js";
7
+ import { SERVER_PROP } from "./constants.js";
8
+ function isServerOnlyNode(node) {
9
+ if (!node?.createFileRouteProps) {
10
+ return false;
11
+ }
12
+ return node.createFileRouteProps.has(SERVER_PROP) && node.createFileRouteProps.size === 1;
13
+ }
14
+ function moduleDeclaration({
15
+ startFilePath,
16
+ routerFilePath,
17
+ corePluginOpts,
18
+ generatedRouteTreePath
19
+ }) {
20
+ function getImportPath(absolutePath) {
21
+ let relativePath = path.relative(
22
+ path.dirname(generatedRouteTreePath),
23
+ absolutePath
24
+ );
25
+ if (!relativePath.startsWith(".")) {
26
+ relativePath = "./" + relativePath;
27
+ }
28
+ relativePath = relativePath.split(path.sep).join("/");
29
+ return relativePath;
30
+ }
31
+ const result = [
32
+ `import type { getRouter } from '${getImportPath(routerFilePath)}'`
33
+ ];
34
+ if (startFilePath) {
35
+ result.push(
36
+ `import type { startInstance } from '${getImportPath(startFilePath)}'`
37
+ );
38
+ } else {
39
+ result.push(
40
+ `import type { createStart } from '@tanstack/${corePluginOpts.framework}-start'`
41
+ );
42
+ }
43
+ result.push(
44
+ `declare module '@tanstack/${corePluginOpts.framework}-start' {
45
+ interface Register {
46
+ router: Awaited<ReturnType<typeof getRouter>>`
47
+ );
48
+ if (startFilePath) {
49
+ result.push(
50
+ ` config: Awaited<ReturnType<typeof startInstance.getOptions>>`
51
+ );
52
+ }
53
+ result.push(` }
54
+ }`);
55
+ return result.join("\n");
56
+ }
57
+ function tanStackStartRouter(startPluginOpts, getConfig, corePluginOpts) {
58
+ const getGeneratedRouteTreePath = () => {
59
+ const { startConfig } = getConfig();
60
+ return path.resolve(startConfig.router.generatedRouteTree);
61
+ };
62
+ let clientEnvironment = null;
63
+ function invalidate() {
64
+ if (!clientEnvironment) {
65
+ return;
66
+ }
67
+ const mod = clientEnvironment.moduleGraph.getModuleById(
68
+ getGeneratedRouteTreePath()
69
+ );
70
+ if (mod) {
71
+ clientEnvironment.moduleGraph.invalidateModule(mod);
72
+ }
73
+ clientEnvironment.hot.send({ type: "full-reload", path: "*" });
74
+ }
75
+ let generatorInstance = null;
76
+ const clientTreeGeneratorPlugin = {
77
+ name: "start-client-tree-plugin",
78
+ init({ generator }) {
79
+ generatorInstance = generator;
80
+ },
81
+ afterTransform({ node, prevNode }) {
82
+ if (isServerOnlyNode(node) !== isServerOnlyNode(prevNode)) {
83
+ invalidate();
14
84
  }
15
- }),
16
- tanStackRouterCodeSplitter({
17
- ...config,
18
- codeSplittingOptions: {
19
- ...config.codeSplittingOptions,
20
- deleteNodes: ["ssr"],
21
- addHmr: true
22
- },
23
- plugin: {
24
- vite: { environmentName: VITE_ENVIRONMENT_NAMES.client }
85
+ }
86
+ };
87
+ let routeTreeFileFooter = null;
88
+ function getRouteTreeFileFooter() {
89
+ if (routeTreeFileFooter) {
90
+ return routeTreeFileFooter;
91
+ }
92
+ const { startConfig, resolvedStartConfig } = getConfig();
93
+ const ogRouteTreeFileFooter = startConfig.router.routeTreeFileFooter;
94
+ if (ogRouteTreeFileFooter) {
95
+ if (Array.isArray(ogRouteTreeFileFooter)) {
96
+ routeTreeFileFooter = ogRouteTreeFileFooter;
97
+ } else {
98
+ routeTreeFileFooter = ogRouteTreeFileFooter();
25
99
  }
26
- }),
27
- tanStackRouterCodeSplitter({
28
- ...config,
29
- codeSplittingOptions: {
30
- ...config.codeSplittingOptions,
31
- addHmr: false
100
+ }
101
+ routeTreeFileFooter = [
102
+ moduleDeclaration({
103
+ generatedRouteTreePath: getGeneratedRouteTreePath(),
104
+ corePluginOpts,
105
+ startFilePath: resolvedStartConfig.startFilePath,
106
+ routerFilePath: resolvedStartConfig.routerFilePath
107
+ }),
108
+ ...routeTreeFileFooter ?? []
109
+ ];
110
+ return routeTreeFileFooter;
111
+ }
112
+ let resolvedGeneratedRouteTreePath = null;
113
+ const clientTreePlugin = {
114
+ name: "tanstack-start:route-tree-client-plugin",
115
+ enforce: "pre",
116
+ applyToEnvironment: (env) => env.name === VITE_ENVIRONMENT_NAMES.client,
117
+ configureServer(server) {
118
+ clientEnvironment = server.environments[VITE_ENVIRONMENT_NAMES.client];
119
+ },
120
+ config() {
121
+ resolvedGeneratedRouteTreePath = normalizePath(
122
+ getGeneratedRouteTreePath()
123
+ );
124
+ clientTreePlugin.load.filter = {
125
+ id: { include: new RegExp(resolvedGeneratedRouteTreePath) }
126
+ };
127
+ },
128
+ load: {
129
+ filter: {
130
+ // this will be set in the config hook above since it relies on `config` hook being called first
32
131
  },
33
- plugin: {
34
- vite: { environmentName: VITE_ENVIRONMENT_NAMES.server }
132
+ async handler() {
133
+ if (!generatorInstance) {
134
+ throw new Error("Generator instance not initialized");
135
+ }
136
+ const crawlingResult = await generatorInstance.getCrawlingResult();
137
+ if (!crawlingResult) {
138
+ throw new Error("Crawling result not available");
139
+ }
140
+ const prunedAcc = pruneServerOnlySubtrees(crawlingResult);
141
+ const acc = {
142
+ ...crawlingResult.acc,
143
+ ...prunedAcc
144
+ };
145
+ const buildResult = generatorInstance.buildRouteTree({
146
+ ...crawlingResult,
147
+ acc,
148
+ config: {
149
+ // importRoutesUsingAbsolutePaths: true,
150
+ // addExtensions: true,
151
+ disableTypes: true,
152
+ enableRouteTreeFormatting: false,
153
+ routeTreeFileHeader: [],
154
+ routeTreeFileFooter: []
155
+ }
156
+ });
157
+ return { code: buildResult.routeTreeContent, map: null };
35
158
  }
159
+ }
160
+ };
161
+ return [
162
+ clientTreePlugin,
163
+ tanstackRouterGenerator(() => {
164
+ const routerConfig = getConfig().startConfig.router;
165
+ return {
166
+ ...routerConfig,
167
+ target: corePluginOpts.framework,
168
+ routeTreeFileFooter: getRouteTreeFileFooter,
169
+ plugins: [clientTreeGeneratorPlugin, routesManifestPlugin()]
170
+ };
171
+ }),
172
+ tanStackRouterCodeSplitter(() => {
173
+ const routerConfig = getConfig().startConfig.router;
174
+ return {
175
+ ...routerConfig,
176
+ codeSplittingOptions: {
177
+ ...routerConfig.codeSplittingOptions,
178
+ deleteNodes: ["ssr", "server"],
179
+ addHmr: true
180
+ },
181
+ plugin: {
182
+ vite: { environmentName: VITE_ENVIRONMENT_NAMES.client }
183
+ }
184
+ };
185
+ }),
186
+ tanStackRouterCodeSplitter(() => {
187
+ const routerConfig = getConfig().startConfig.router;
188
+ return {
189
+ ...routerConfig,
190
+ codeSplittingOptions: {
191
+ ...routerConfig.codeSplittingOptions,
192
+ addHmr: false
193
+ },
194
+ plugin: {
195
+ vite: { environmentName: VITE_ENVIRONMENT_NAMES.server }
196
+ }
197
+ };
36
198
  }),
37
- tanstackRouterAutoImport(config),
38
- routeTreeClientPlugin(config),
39
- virtualRouteTreePlugin(config)
199
+ tanstackRouterAutoImport(startPluginOpts?.router)
40
200
  ];
41
201
  }
42
202
  export {