@tanstack/router-plugin 1.120.4-alpha.19 → 1.120.4

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 (73) hide show
  1. package/dist/cjs/core/code-splitter/compilers.cjs +21 -39
  2. package/dist/cjs/core/code-splitter/compilers.cjs.map +1 -1
  3. package/dist/cjs/core/code-splitter/compilers.d.cts +0 -3
  4. package/dist/cjs/core/code-splitter/framework-options.cjs +8 -4
  5. package/dist/cjs/core/code-splitter/framework-options.cjs.map +1 -1
  6. package/dist/cjs/core/code-splitter/framework-options.d.cts +2 -0
  7. package/dist/cjs/core/config.d.cts +40 -31
  8. package/dist/cjs/core/router-code-splitter-plugin.cjs +20 -11
  9. package/dist/cjs/core/router-code-splitter-plugin.cjs.map +1 -1
  10. package/dist/cjs/core/router-composed-plugin.cjs +5 -19
  11. package/dist/cjs/core/router-composed-plugin.cjs.map +1 -1
  12. package/dist/cjs/core/router-generator-plugin.cjs +2 -8
  13. package/dist/cjs/core/router-generator-plugin.cjs.map +1 -1
  14. package/dist/cjs/esbuild.d.cts +27 -21
  15. package/dist/cjs/rspack.d.cts +27 -21
  16. package/dist/cjs/vite.cjs +0 -2
  17. package/dist/cjs/vite.cjs.map +1 -1
  18. package/dist/cjs/vite.d.cts +26 -52
  19. package/dist/cjs/webpack.d.cts +27 -21
  20. package/dist/esm/core/code-splitter/compilers.d.ts +0 -3
  21. package/dist/esm/core/code-splitter/compilers.js +21 -39
  22. package/dist/esm/core/code-splitter/compilers.js.map +1 -1
  23. package/dist/esm/core/code-splitter/framework-options.d.ts +2 -0
  24. package/dist/esm/core/code-splitter/framework-options.js +8 -4
  25. package/dist/esm/core/code-splitter/framework-options.js.map +1 -1
  26. package/dist/esm/core/config.d.ts +40 -31
  27. package/dist/esm/core/router-code-splitter-plugin.js +14 -5
  28. package/dist/esm/core/router-code-splitter-plugin.js.map +1 -1
  29. package/dist/esm/core/router-composed-plugin.js +5 -19
  30. package/dist/esm/core/router-composed-plugin.js.map +1 -1
  31. package/dist/esm/core/router-generator-plugin.js +2 -8
  32. package/dist/esm/core/router-generator-plugin.js.map +1 -1
  33. package/dist/esm/esbuild.d.ts +27 -21
  34. package/dist/esm/rspack.d.ts +27 -21
  35. package/dist/esm/vite.d.ts +26 -52
  36. package/dist/esm/vite.js +1 -3
  37. package/dist/esm/vite.js.map +1 -1
  38. package/dist/esm/webpack.d.ts +27 -21
  39. package/package.json +6 -6
  40. package/src/core/code-splitter/compilers.ts +27 -54
  41. package/src/core/code-splitter/framework-options.ts +6 -0
  42. package/src/core/router-code-splitter-plugin.ts +23 -3
  43. package/src/core/router-composed-plugin.ts +10 -20
  44. package/src/core/router-generator-plugin.ts +1 -12
  45. package/src/vite.ts +0 -3
  46. package/dist/cjs/core/route-autoimport-plugin.cjs +0 -98
  47. package/dist/cjs/core/route-autoimport-plugin.cjs.map +0 -1
  48. package/dist/cjs/core/route-autoimport-plugin.d.cts +0 -6
  49. package/dist/cjs/core/route-hmr-statement.cjs +0 -33
  50. package/dist/cjs/core/route-hmr-statement.cjs.map +0 -1
  51. package/dist/cjs/core/route-hmr-statement.d.cts +0 -1
  52. package/dist/cjs/core/router-hmr-plugin.cjs +0 -51
  53. package/dist/cjs/core/router-hmr-plugin.cjs.map +0 -1
  54. package/dist/cjs/core/router-hmr-plugin.d.cts +0 -8
  55. package/dist/cjs/core/utils.cjs +0 -12
  56. package/dist/cjs/core/utils.cjs.map +0 -1
  57. package/dist/cjs/core/utils.d.cts +0 -2
  58. package/dist/esm/core/route-autoimport-plugin.d.ts +0 -6
  59. package/dist/esm/core/route-autoimport-plugin.js +0 -81
  60. package/dist/esm/core/route-autoimport-plugin.js.map +0 -1
  61. package/dist/esm/core/route-hmr-statement.d.ts +0 -1
  62. package/dist/esm/core/route-hmr-statement.js +0 -16
  63. package/dist/esm/core/route-hmr-statement.js.map +0 -1
  64. package/dist/esm/core/router-hmr-plugin.d.ts +0 -8
  65. package/dist/esm/core/router-hmr-plugin.js +0 -51
  66. package/dist/esm/core/router-hmr-plugin.js.map +0 -1
  67. package/dist/esm/core/utils.d.ts +0 -2
  68. package/dist/esm/core/utils.js +0 -12
  69. package/dist/esm/core/utils.js.map +0 -1
  70. package/src/core/route-autoimport-plugin.ts +0 -102
  71. package/src/core/route-hmr-statement.ts +0 -13
  72. package/src/core/router-hmr-plugin.ts +0 -65
  73. package/src/core/utils.ts +0 -18
@@ -7,8 +7,10 @@ function getFrameworkOptions(framework) {
7
7
  idents: {
8
8
  createFileRoute: "createFileRoute",
9
9
  lazyFn: "lazyFn",
10
- lazyRouteComponent: "lazyRouteComponent"
11
- }
10
+ lazyRouteComponent: "lazyRouteComponent",
11
+ dummyHMRComponent: "TSRDummyComponent"
12
+ },
13
+ dummyHMRComponent: `export function TSRDummyComponent() { return null }`
12
14
  };
13
15
  break;
14
16
  case "solid":
@@ -17,8 +19,10 @@ function getFrameworkOptions(framework) {
17
19
  idents: {
18
20
  createFileRoute: "createFileRoute",
19
21
  lazyFn: "lazyFn",
20
- lazyRouteComponent: "lazyRouteComponent"
21
- }
22
+ lazyRouteComponent: "lazyRouteComponent",
23
+ dummyHMRComponent: "TSRDummyComponent"
24
+ },
25
+ dummyHMRComponent: `export function TSRDummyComponent() { return null }`
22
26
  };
23
27
  break;
24
28
  default:
@@ -1 +1 @@
1
- {"version":3,"file":"framework-options.js","sources":["../../../../src/core/code-splitter/framework-options.ts"],"sourcesContent":["type FrameworkOptions = {\n package: string\n idents: {\n createFileRoute: string\n lazyFn: string\n lazyRouteComponent: string\n }\n}\n\nexport function getFrameworkOptions(framework: string): FrameworkOptions {\n let frameworkOptions: FrameworkOptions\n\n switch (framework) {\n case 'react':\n frameworkOptions = {\n package: '@tanstack/react-router',\n idents: {\n createFileRoute: 'createFileRoute',\n lazyFn: 'lazyFn',\n lazyRouteComponent: 'lazyRouteComponent',\n },\n }\n break\n case 'solid':\n frameworkOptions = {\n package: '@tanstack/solid-router',\n idents: {\n createFileRoute: 'createFileRoute',\n lazyFn: 'lazyFn',\n lazyRouteComponent: 'lazyRouteComponent',\n },\n }\n break\n default:\n throw new Error(\n `[getFrameworkOptions] - Unsupported framework: ${framework}`,\n )\n }\n\n return frameworkOptions\n}\n"],"names":[],"mappings":"AASO,SAAS,oBAAoB,WAAqC;AACnE,MAAA;AAEJ,UAAQ,WAAW;AAAA,IACjB,KAAK;AACgB,yBAAA;AAAA,QACjB,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,iBAAiB;AAAA,UACjB,QAAQ;AAAA,UACR,oBAAoB;AAAA,QAAA;AAAA,MAExB;AACA;AAAA,IACF,KAAK;AACgB,yBAAA;AAAA,QACjB,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,iBAAiB;AAAA,UACjB,QAAQ;AAAA,UACR,oBAAoB;AAAA,QAAA;AAAA,MAExB;AACA;AAAA,IACF;AACE,YAAM,IAAI;AAAA,QACR,kDAAkD,SAAS;AAAA,MAC7D;AAAA,EAAA;AAGG,SAAA;AACT;"}
1
+ {"version":3,"file":"framework-options.js","sources":["../../../../src/core/code-splitter/framework-options.ts"],"sourcesContent":["type FrameworkOptions = {\n package: string\n idents: {\n createFileRoute: string\n lazyFn: string\n lazyRouteComponent: string\n dummyHMRComponent: string\n }\n dummyHMRComponent: string\n}\n\nexport function getFrameworkOptions(framework: string): FrameworkOptions {\n let frameworkOptions: FrameworkOptions\n\n switch (framework) {\n case 'react':\n frameworkOptions = {\n package: '@tanstack/react-router',\n idents: {\n createFileRoute: 'createFileRoute',\n lazyFn: 'lazyFn',\n lazyRouteComponent: 'lazyRouteComponent',\n dummyHMRComponent: 'TSRDummyComponent',\n },\n dummyHMRComponent: `export function TSRDummyComponent() { return null }`,\n }\n break\n case 'solid':\n frameworkOptions = {\n package: '@tanstack/solid-router',\n idents: {\n createFileRoute: 'createFileRoute',\n lazyFn: 'lazyFn',\n lazyRouteComponent: 'lazyRouteComponent',\n dummyHMRComponent: 'TSRDummyComponent',\n },\n dummyHMRComponent: `export function TSRDummyComponent() { return null }`,\n }\n break\n default:\n throw new Error(\n `[getFrameworkOptions] - Unsupported framework: ${framework}`,\n )\n }\n\n return frameworkOptions\n}\n"],"names":[],"mappings":"AAWO,SAAS,oBAAoB,WAAqC;AACnE,MAAA;AAEJ,UAAQ,WAAW;AAAA,IACjB,KAAK;AACgB,yBAAA;AAAA,QACjB,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,iBAAiB;AAAA,UACjB,QAAQ;AAAA,UACR,oBAAoB;AAAA,UACpB,mBAAmB;AAAA,QACrB;AAAA,QACA,mBAAmB;AAAA,MACrB;AACA;AAAA,IACF,KAAK;AACgB,yBAAA;AAAA,QACjB,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,iBAAiB;AAAA,UACjB,QAAQ;AAAA,UACR,oBAAoB;AAAA,UACpB,mBAAmB;AAAA,QACrB;AAAA,QACA,mBAAmB;AAAA,MACrB;AACA;AAAA,IACF;AACE,YAAM,IAAI;AAAA,QACR,kDAAkD,SAAS;AAAA,MAC7D;AAAA,EAAA;AAGG,SAAA;AACT;"}
@@ -19,38 +19,41 @@ export type CodeSplittingOptions = {
19
19
  */
20
20
  defaultBehavior?: CodeSplitGroupings;
21
21
  };
22
- export declare const configSchema: z.ZodObject<z.objectUtil.extendShape<z.objectUtil.extendShape<{
22
+ export declare const configSchema: z.ZodObject<z.objectUtil.extendShape<{
23
23
  target: z.ZodDefault<z.ZodOptional<z.ZodEnum<["react", "solid"]>>>;
24
24
  virtualRouteConfig: z.ZodOptional<z.ZodUnion<[z.ZodType<import('@tanstack/virtual-file-routes').VirtualRootRoute, z.ZodTypeDef, import('@tanstack/virtual-file-routes').VirtualRootRoute>, z.ZodString]>>;
25
25
  routeFilePrefix: z.ZodOptional<z.ZodString>;
26
26
  routeFileIgnorePrefix: z.ZodDefault<z.ZodOptional<z.ZodString>>;
27
27
  routeFileIgnorePattern: z.ZodOptional<z.ZodString>;
28
28
  routesDirectory: z.ZodDefault<z.ZodOptional<z.ZodString>>;
29
+ generatedRouteTree: z.ZodDefault<z.ZodOptional<z.ZodString>>;
29
30
  quoteStyle: z.ZodDefault<z.ZodOptional<z.ZodEnum<["single", "double"]>>>;
30
31
  semicolons: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
31
- disableLogging: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
32
- routeTreeFileHeader: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
33
- indexToken: z.ZodDefault<z.ZodOptional<z.ZodString>>;
34
- routeToken: z.ZodDefault<z.ZodOptional<z.ZodString>>;
35
- pathParamsAllowedCharacters: z.ZodOptional<z.ZodArray<z.ZodEnum<[";", ":", "@", "&", "=", "+", "$", ","]>, "many">>;
36
- }, {
37
- generatedRouteTree: z.ZodDefault<z.ZodOptional<z.ZodString>>;
38
32
  disableTypes: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
39
- verboseFileRoutes: z.ZodOptional<z.ZodBoolean>;
40
33
  addExtensions: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
34
+ disableLogging: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
41
35
  disableManifestGeneration: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
42
36
  enableRouteTreeFormatting: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
37
+ __enableAPIRoutesGeneration: z.ZodOptional<z.ZodBoolean>;
38
+ apiBase: z.ZodDefault<z.ZodOptional<z.ZodString>>;
39
+ routeTreeFileHeader: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
43
40
  routeTreeFileFooter: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
44
41
  autoCodeSplitting: z.ZodOptional<z.ZodBoolean>;
42
+ indexToken: z.ZodDefault<z.ZodOptional<z.ZodString>>;
43
+ routeToken: z.ZodDefault<z.ZodOptional<z.ZodString>>;
44
+ pathParamsAllowedCharacters: z.ZodOptional<z.ZodArray<z.ZodEnum<[";", ":", "@", "&", "=", "+", "$", ","]>, "many">>;
45
45
  customScaffolding: z.ZodOptional<z.ZodObject<{
46
46
  routeTemplate: z.ZodOptional<z.ZodString>;
47
47
  lazyRouteTemplate: z.ZodOptional<z.ZodString>;
48
+ apiTemplate: z.ZodOptional<z.ZodString>;
48
49
  }, "strip", z.ZodTypeAny, {
49
50
  routeTemplate?: string | undefined;
50
51
  lazyRouteTemplate?: string | undefined;
52
+ apiTemplate?: string | undefined;
51
53
  }, {
52
54
  routeTemplate?: string | undefined;
53
55
  lazyRouteTemplate?: string | undefined;
56
+ apiTemplate?: string | undefined;
54
57
  }>>;
55
58
  experimental: z.ZodOptional<z.ZodObject<{
56
59
  enableCodeSplitting: z.ZodOptional<z.ZodBoolean>;
@@ -59,36 +62,38 @@ export declare const configSchema: z.ZodObject<z.objectUtil.extendShape<z.object
59
62
  }, {
60
63
  enableCodeSplitting?: boolean | undefined;
61
64
  }>>;
62
- }>, {
65
+ }, {
63
66
  enableRouteGeneration: z.ZodOptional<z.ZodBoolean>;
64
67
  codeSplittingOptions: z.ZodOptional<z.ZodType<CodeSplittingOptions, z.ZodTypeDef, CodeSplittingOptions>>;
65
68
  }>, "strip", z.ZodTypeAny, {
66
69
  target: "react" | "solid";
67
70
  routeFileIgnorePrefix: string;
68
71
  routesDirectory: string;
72
+ generatedRouteTree: string;
69
73
  quoteStyle: "single" | "double";
70
74
  semicolons: boolean;
71
- disableLogging: boolean;
72
- routeTreeFileHeader: string[];
73
- indexToken: string;
74
- routeToken: string;
75
- generatedRouteTree: string;
76
75
  disableTypes: boolean;
77
76
  addExtensions: boolean;
77
+ disableLogging: boolean;
78
78
  disableManifestGeneration: boolean;
79
79
  enableRouteTreeFormatting: boolean;
80
+ apiBase: string;
81
+ routeTreeFileHeader: string[];
80
82
  routeTreeFileFooter: string[];
83
+ indexToken: string;
84
+ routeToken: string;
81
85
  enableRouteGeneration?: boolean | undefined;
82
86
  codeSplittingOptions?: CodeSplittingOptions | undefined;
83
87
  virtualRouteConfig?: string | import('@tanstack/virtual-file-routes').VirtualRootRoute | undefined;
84
88
  routeFilePrefix?: string | undefined;
85
89
  routeFileIgnorePattern?: string | undefined;
86
- pathParamsAllowedCharacters?: (";" | ":" | "@" | "&" | "=" | "+" | "$" | ",")[] | undefined;
87
- verboseFileRoutes?: boolean | undefined;
90
+ __enableAPIRoutesGeneration?: boolean | undefined;
88
91
  autoCodeSplitting?: boolean | undefined;
92
+ pathParamsAllowedCharacters?: (";" | ":" | "@" | "&" | "=" | "+" | "$" | ",")[] | undefined;
89
93
  customScaffolding?: {
90
94
  routeTemplate?: string | undefined;
91
95
  lazyRouteTemplate?: string | undefined;
96
+ apiTemplate?: string | undefined;
92
97
  } | undefined;
93
98
  experimental?: {
94
99
  enableCodeSplitting?: boolean | undefined;
@@ -102,24 +107,26 @@ export declare const configSchema: z.ZodObject<z.objectUtil.extendShape<z.object
102
107
  routeFileIgnorePrefix?: string | undefined;
103
108
  routeFileIgnorePattern?: string | undefined;
104
109
  routesDirectory?: string | undefined;
110
+ generatedRouteTree?: string | undefined;
105
111
  quoteStyle?: "single" | "double" | undefined;
106
112
  semicolons?: boolean | undefined;
107
- disableLogging?: boolean | undefined;
108
- routeTreeFileHeader?: string[] | undefined;
109
- indexToken?: string | undefined;
110
- routeToken?: string | undefined;
111
- pathParamsAllowedCharacters?: (";" | ":" | "@" | "&" | "=" | "+" | "$" | ",")[] | undefined;
112
- generatedRouteTree?: string | undefined;
113
113
  disableTypes?: boolean | undefined;
114
- verboseFileRoutes?: boolean | undefined;
115
114
  addExtensions?: boolean | undefined;
115
+ disableLogging?: boolean | undefined;
116
116
  disableManifestGeneration?: boolean | undefined;
117
117
  enableRouteTreeFormatting?: boolean | undefined;
118
+ __enableAPIRoutesGeneration?: boolean | undefined;
119
+ apiBase?: string | undefined;
120
+ routeTreeFileHeader?: string[] | undefined;
118
121
  routeTreeFileFooter?: string[] | undefined;
119
122
  autoCodeSplitting?: boolean | undefined;
123
+ indexToken?: string | undefined;
124
+ routeToken?: string | undefined;
125
+ pathParamsAllowedCharacters?: (";" | ":" | "@" | "&" | "=" | "+" | "$" | ",")[] | undefined;
120
126
  customScaffolding?: {
121
127
  routeTemplate?: string | undefined;
122
128
  lazyRouteTemplate?: string | undefined;
129
+ apiTemplate?: string | undefined;
123
130
  } | undefined;
124
131
  experimental?: {
125
132
  enableCodeSplitting?: boolean | undefined;
@@ -129,29 +136,31 @@ export declare const getConfig: (inlineConfig: Partial<Config>, root: string) =>
129
136
  target: "react" | "solid";
130
137
  routeFileIgnorePrefix: string;
131
138
  routesDirectory: string;
139
+ generatedRouteTree: string;
132
140
  quoteStyle: "single" | "double";
133
141
  semicolons: boolean;
134
- disableLogging: boolean;
135
- routeTreeFileHeader: string[];
136
- indexToken: string;
137
- routeToken: string;
138
- generatedRouteTree: string;
139
142
  disableTypes: boolean;
140
143
  addExtensions: boolean;
144
+ disableLogging: boolean;
141
145
  disableManifestGeneration: boolean;
142
146
  enableRouteTreeFormatting: boolean;
147
+ apiBase: string;
148
+ routeTreeFileHeader: string[];
143
149
  routeTreeFileFooter: string[];
150
+ indexToken: string;
151
+ routeToken: string;
144
152
  enableRouteGeneration?: boolean | undefined;
145
153
  codeSplittingOptions?: CodeSplittingOptions | undefined;
146
154
  virtualRouteConfig?: string | import('@tanstack/virtual-file-routes').VirtualRootRoute | undefined;
147
155
  routeFilePrefix?: string | undefined;
148
156
  routeFileIgnorePattern?: string | undefined;
149
- pathParamsAllowedCharacters?: (";" | ":" | "@" | "&" | "=" | "+" | "$" | ",")[] | undefined;
150
- verboseFileRoutes?: boolean | undefined;
157
+ __enableAPIRoutesGeneration?: boolean | undefined;
151
158
  autoCodeSplitting?: boolean | undefined;
159
+ pathParamsAllowedCharacters?: (";" | ":" | "@" | "&" | "=" | "+" | "$" | ",")[] | undefined;
152
160
  customScaffolding?: {
153
161
  routeTemplate?: string | undefined;
154
162
  lazyRouteTemplate?: string | undefined;
163
+ apiTemplate?: string | undefined;
155
164
  } | undefined;
156
165
  experimental?: {
157
166
  enableCodeSplitting?: boolean | undefined;
@@ -1,13 +1,19 @@
1
+ import { isAbsolute, join, normalize } from "node:path";
1
2
  import { pathToFileURL, fileURLToPath } from "node:url";
2
3
  import { logDiff } from "@tanstack/router-utils";
3
4
  import { getConfig, splitGroupingsSchema } from "./config.js";
4
5
  import { compileCodeSplitVirtualRoute, detectCodeSplitGroupingsFromRoute, compileCodeSplitReferenceRoute } from "./code-splitter/compilers.js";
5
6
  import { tsrSplit, splitRouteIdentNodes, defaultCodeSplitGroupings } from "./constants.js";
6
7
  import { decodeIdentifier } from "./code-splitter/path-ids.js";
7
- import { fileIsInRoutesDirectory, debug } from "./utils.js";
8
+ const debug = process.env.TSR_VITE_DEBUG && ["true", "router-plugin"].includes(process.env.TSR_VITE_DEBUG);
8
9
  function capitalizeFirst(str) {
9
10
  return str.charAt(0).toUpperCase() + str.slice(1);
10
11
  }
12
+ function fileIsInRoutesDirectory(filePath, routesDirectory) {
13
+ const routesDirectoryPath = isAbsolute(routesDirectory) ? routesDirectory : join(process.cwd(), routesDirectory);
14
+ const path = normalize(filePath);
15
+ return path.startsWith(routesDirectoryPath);
16
+ }
11
17
  const bannedBeforeExternalPlugins = [
12
18
  {
13
19
  identifier: "@react-refresh",
@@ -43,7 +49,9 @@ const unpluginRouterCodeSplitterFactory = (options = {}, { framework }) => {
43
49
  const handleCompilingReferenceFile = (code, id) => {
44
50
  if (debug) console.info("Compiling Route: ", id);
45
51
  const fromCode = detectCodeSplitGroupingsFromRoute({
46
- code
52
+ code,
53
+ root: ROOT,
54
+ filename: id
47
55
  });
48
56
  if (fromCode.groupings) {
49
57
  const res = splitGroupingsSchema.safeParse(fromCode.groupings);
@@ -72,11 +80,11 @@ ${message}`
72
80
  const splitGroupings = fromCode.groupings || pluginSplitBehavior || getGlobalCodeSplitGroupings();
73
81
  const compiledReferenceRoute = compileCodeSplitReferenceRoute({
74
82
  code,
83
+ root: ROOT,
84
+ filename: id,
75
85
  runtimeEnv: isProduction ? "prod" : "dev",
76
86
  codeSplitGroupings: splitGroupings,
77
- targetFramework: userConfig.target,
78
- filename: id,
79
- id
87
+ targetFramework: userConfig.target
80
88
  });
81
89
  if (debug) {
82
90
  logDiff(code, compiledReferenceRoute.code);
@@ -100,6 +108,7 @@ ${message}`
100
108
  );
101
109
  const result = compileCodeSplitVirtualRoute({
102
110
  code,
111
+ root: ROOT,
103
112
  filename: id,
104
113
  splitTargets: grouping
105
114
  });
@@ -1 +1 @@
1
- {"version":3,"file":"router-code-splitter-plugin.js","sources":["../../../src/core/router-code-splitter-plugin.ts"],"sourcesContent":["/**\n * It is important to familiarize yourself with how the code-splitting works in this plugin.\n * https://github.com/TanStack/router/pull/3355\n */\n\nimport { fileURLToPath, pathToFileURL } from 'node:url'\nimport { logDiff } from '@tanstack/router-utils'\nimport { getConfig, splitGroupingsSchema } from './config'\nimport {\n compileCodeSplitReferenceRoute,\n compileCodeSplitVirtualRoute,\n detectCodeSplitGroupingsFromRoute,\n} from './code-splitter/compilers'\nimport {\n defaultCodeSplitGroupings,\n splitRouteIdentNodes,\n tsrSplit,\n} from './constants'\nimport { decodeIdentifier } from './code-splitter/path-ids'\nimport { debug, fileIsInRoutesDirectory } from './utils'\nimport type { CodeSplitGroupings, SplitRouteIdentNodes } from './constants'\n\nimport type { Config } from './config'\nimport type {\n UnpluginContextMeta,\n UnpluginFactory,\n TransformResult as UnpluginTransformResult,\n} from 'unplugin'\n\nfunction capitalizeFirst(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1)\n}\n\ntype BannedBeforeExternalPlugin = {\n identifier: string\n pkg: string\n usage: string\n frameworks: Array<UnpluginContextMeta['framework']>\n}\n\nconst bannedBeforeExternalPlugins: Array<BannedBeforeExternalPlugin> = [\n {\n identifier: '@react-refresh',\n pkg: '@vitejs/plugin-react',\n usage: 'viteReact()',\n frameworks: ['vite'],\n },\n]\n\nclass FoundPluginInBeforeCode extends Error {\n constructor(externalPlugin: BannedBeforeExternalPlugin, framework: string) {\n super(`We detected that the '${externalPlugin.pkg}' was passed before '@tanstack/router-plugin'. Please make sure that '@tanstack/router-plugin' is passed before '${externalPlugin.pkg}' and try again: \ne.g.\nplugins: [\n TanStackRouter${capitalizeFirst(framework)}(), // Place this before ${externalPlugin.usage}\n ${externalPlugin.usage},\n]\n`)\n }\n}\n\nconst PLUGIN_NAME = 'unplugin:router-code-splitter'\n\nexport const unpluginRouterCodeSplitterFactory: UnpluginFactory<\n Partial<Config> | undefined\n> = (options = {}, { framework }) => {\n let ROOT: string = process.cwd()\n let userConfig = options as Config\n\n const isProduction = process.env.NODE_ENV === 'production'\n\n const getGlobalCodeSplitGroupings = () => {\n return (\n userConfig.codeSplittingOptions?.defaultBehavior ||\n defaultCodeSplitGroupings\n )\n }\n const getShouldSplitFn = () => {\n return userConfig.codeSplittingOptions?.splitBehavior\n }\n\n const handleCompilingReferenceFile = (\n code: string,\n id: string,\n ): UnpluginTransformResult => {\n if (debug) console.info('Compiling Route: ', id)\n\n const fromCode = detectCodeSplitGroupingsFromRoute({\n code,\n })\n\n if (fromCode.groupings) {\n const res = splitGroupingsSchema.safeParse(fromCode.groupings)\n if (!res.success) {\n const message = res.error.errors.map((e) => e.message).join('. ')\n throw new Error(\n `The groupings for the route \"${id}\" are invalid.\\n${message}`,\n )\n }\n }\n\n const userShouldSplitFn = getShouldSplitFn()\n\n const pluginSplitBehavior = userShouldSplitFn?.({\n routeId: fromCode.routeId,\n }) as CodeSplitGroupings | undefined\n\n if (pluginSplitBehavior) {\n const res = splitGroupingsSchema.safeParse(pluginSplitBehavior)\n if (!res.success) {\n const message = res.error.errors.map((e) => e.message).join('. ')\n throw new Error(\n `The groupings returned when using \\`splitBehavior\\` for the route \"${id}\" are invalid.\\n${message}`,\n )\n }\n }\n\n const splitGroupings: CodeSplitGroupings =\n fromCode.groupings || pluginSplitBehavior || getGlobalCodeSplitGroupings()\n\n const compiledReferenceRoute = compileCodeSplitReferenceRoute({\n code,\n runtimeEnv: isProduction ? 'prod' : 'dev',\n codeSplitGroupings: splitGroupings,\n targetFramework: userConfig.target,\n filename: id,\n id,\n })\n\n if (debug) {\n logDiff(code, compiledReferenceRoute.code)\n console.log('Output:\\n', compiledReferenceRoute.code + '\\n\\n')\n }\n\n return compiledReferenceRoute\n }\n\n const handleCompilingVirtualFile = (\n code: string,\n id: string,\n ): UnpluginTransformResult => {\n if (debug) console.info('Splitting Route: ', id)\n\n const [_, ...pathnameParts] = id.split('?')\n\n const searchParams = new URLSearchParams(pathnameParts.join('?'))\n const splitValue = searchParams.get(tsrSplit)\n\n if (!splitValue) {\n throw new Error(\n `The split value for the virtual route \"${id}\" was not found.`,\n )\n }\n\n const rawGrouping = decodeIdentifier(splitValue)\n const grouping = [...new Set(rawGrouping)].filter((p) =>\n splitRouteIdentNodes.includes(p as any),\n ) as Array<SplitRouteIdentNodes>\n\n const result = compileCodeSplitVirtualRoute({\n code,\n filename: id,\n splitTargets: grouping,\n })\n\n if (debug) {\n logDiff(code, result.code)\n console.log('Output:\\n', result.code + '\\n\\n')\n }\n\n return result\n }\n\n return {\n name: 'router-code-splitter-plugin',\n enforce: 'pre',\n\n transform(code, id) {\n if (!userConfig.autoCodeSplitting) {\n return null\n }\n\n const url = pathToFileURL(id)\n url.searchParams.delete('v')\n id = fileURLToPath(url).replace(/\\\\/g, '/')\n\n if (id.includes(tsrSplit)) {\n return handleCompilingVirtualFile(code, id)\n } else if (\n fileIsInRoutesDirectory(id, userConfig.routesDirectory) &&\n (code.includes('createRoute(') || code.includes('createFileRoute('))\n ) {\n for (const externalPlugin of bannedBeforeExternalPlugins) {\n if (!externalPlugin.frameworks.includes(framework)) {\n continue\n }\n\n if (code.includes(externalPlugin.identifier)) {\n throw new FoundPluginInBeforeCode(externalPlugin, framework)\n }\n }\n\n return handleCompilingReferenceFile(code, id)\n }\n\n return null\n },\n\n transformInclude(id) {\n if (!userConfig.autoCodeSplitting) {\n return undefined\n }\n\n if (\n fileIsInRoutesDirectory(id, userConfig.routesDirectory) ||\n id.includes(tsrSplit)\n ) {\n return true\n }\n return false\n },\n\n vite: {\n configResolved(config) {\n ROOT = config.root\n\n userConfig = getConfig(options, ROOT)\n },\n },\n\n rspack(_compiler) {\n ROOT = process.cwd()\n userConfig = getConfig(options, ROOT)\n },\n\n webpack(compiler) {\n ROOT = process.cwd()\n userConfig = getConfig(options, ROOT)\n\n if (\n userConfig.autoCodeSplitting &&\n compiler.options.mode === 'production'\n ) {\n compiler.hooks.done.tap(PLUGIN_NAME, () => {\n console.info('✅ ' + PLUGIN_NAME + ': code-splitting done!')\n setTimeout(() => {\n process.exit(0)\n })\n })\n }\n },\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router-code-splitter-plugin.js","sources":["../../../src/core/router-code-splitter-plugin.ts"],"sourcesContent":["/**\n * It is important to familiarize yourself with how the code-splitting works in this plugin.\n * https://github.com/TanStack/router/pull/3355\n */\n\nimport { isAbsolute, join, normalize } from 'node:path'\nimport { fileURLToPath, pathToFileURL } from 'node:url'\nimport { logDiff } from '@tanstack/router-utils'\nimport { getConfig, splitGroupingsSchema } from './config'\nimport {\n compileCodeSplitReferenceRoute,\n compileCodeSplitVirtualRoute,\n detectCodeSplitGroupingsFromRoute,\n} from './code-splitter/compilers'\nimport {\n defaultCodeSplitGroupings,\n splitRouteIdentNodes,\n tsrSplit,\n} from './constants'\nimport { decodeIdentifier } from './code-splitter/path-ids'\nimport type { CodeSplitGroupings, SplitRouteIdentNodes } from './constants'\n\nimport type { Config } from './config'\nimport type {\n UnpluginContextMeta,\n UnpluginFactory,\n TransformResult as UnpluginTransformResult,\n} from 'unplugin'\n\nconst debug =\n process.env.TSR_VITE_DEBUG &&\n ['true', 'router-plugin'].includes(process.env.TSR_VITE_DEBUG)\n\nfunction capitalizeFirst(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1)\n}\n\nfunction fileIsInRoutesDirectory(\n filePath: string,\n routesDirectory: string,\n): boolean {\n const routesDirectoryPath = isAbsolute(routesDirectory)\n ? routesDirectory\n : join(process.cwd(), routesDirectory)\n\n const path = normalize(filePath)\n\n return path.startsWith(routesDirectoryPath)\n}\n\ntype BannedBeforeExternalPlugin = {\n identifier: string\n pkg: string\n usage: string\n frameworks: Array<UnpluginContextMeta['framework']>\n}\n\nconst bannedBeforeExternalPlugins: Array<BannedBeforeExternalPlugin> = [\n {\n identifier: '@react-refresh',\n pkg: '@vitejs/plugin-react',\n usage: 'viteReact()',\n frameworks: ['vite'],\n },\n]\n\nclass FoundPluginInBeforeCode extends Error {\n constructor(externalPlugin: BannedBeforeExternalPlugin, framework: string) {\n super(`We detected that the '${externalPlugin.pkg}' was passed before '@tanstack/router-plugin'. Please make sure that '@tanstack/router-plugin' is passed before '${externalPlugin.pkg}' and try again: \ne.g.\nplugins: [\n TanStackRouter${capitalizeFirst(framework)}(), // Place this before ${externalPlugin.usage}\n ${externalPlugin.usage},\n]\n`)\n }\n}\n\nconst PLUGIN_NAME = 'unplugin:router-code-splitter'\n\nexport const unpluginRouterCodeSplitterFactory: UnpluginFactory<\n Partial<Config> | undefined\n> = (options = {}, { framework }) => {\n let ROOT: string = process.cwd()\n let userConfig = options as Config\n\n const isProduction = process.env.NODE_ENV === 'production'\n\n const getGlobalCodeSplitGroupings = () => {\n return (\n userConfig.codeSplittingOptions?.defaultBehavior ||\n defaultCodeSplitGroupings\n )\n }\n const getShouldSplitFn = () => {\n return userConfig.codeSplittingOptions?.splitBehavior\n }\n\n const handleCompilingReferenceFile = (\n code: string,\n id: string,\n ): UnpluginTransformResult => {\n if (debug) console.info('Compiling Route: ', id)\n\n const fromCode = detectCodeSplitGroupingsFromRoute({\n code,\n root: ROOT,\n filename: id,\n })\n\n if (fromCode.groupings) {\n const res = splitGroupingsSchema.safeParse(fromCode.groupings)\n if (!res.success) {\n const message = res.error.errors.map((e) => e.message).join('. ')\n throw new Error(\n `The groupings for the route \"${id}\" are invalid.\\n${message}`,\n )\n }\n }\n\n const userShouldSplitFn = getShouldSplitFn()\n\n const pluginSplitBehavior = userShouldSplitFn?.({\n routeId: fromCode.routeId,\n }) as CodeSplitGroupings | undefined\n\n if (pluginSplitBehavior) {\n const res = splitGroupingsSchema.safeParse(pluginSplitBehavior)\n if (!res.success) {\n const message = res.error.errors.map((e) => e.message).join('. ')\n throw new Error(\n `The groupings returned when using \\`splitBehavior\\` for the route \"${id}\" are invalid.\\n${message}`,\n )\n }\n }\n\n const splitGroupings: CodeSplitGroupings =\n fromCode.groupings || pluginSplitBehavior || getGlobalCodeSplitGroupings()\n\n const compiledReferenceRoute = compileCodeSplitReferenceRoute({\n code,\n root: ROOT,\n filename: id,\n runtimeEnv: isProduction ? 'prod' : 'dev',\n codeSplitGroupings: splitGroupings,\n targetFramework: userConfig.target,\n })\n\n if (debug) {\n logDiff(code, compiledReferenceRoute.code)\n console.log('Output:\\n', compiledReferenceRoute.code + '\\n\\n')\n }\n\n return compiledReferenceRoute\n }\n\n const handleCompilingVirtualFile = (\n code: string,\n id: string,\n ): UnpluginTransformResult => {\n if (debug) console.info('Splitting Route: ', id)\n\n const [_, ...pathnameParts] = id.split('?')\n\n const searchParams = new URLSearchParams(pathnameParts.join('?'))\n const splitValue = searchParams.get(tsrSplit)\n\n if (!splitValue) {\n throw new Error(\n `The split value for the virtual route \"${id}\" was not found.`,\n )\n }\n\n const rawGrouping = decodeIdentifier(splitValue)\n const grouping = [...new Set(rawGrouping)].filter((p) =>\n splitRouteIdentNodes.includes(p as any),\n ) as Array<SplitRouteIdentNodes>\n\n const result = compileCodeSplitVirtualRoute({\n code,\n root: ROOT,\n filename: id,\n splitTargets: grouping,\n })\n\n if (debug) {\n logDiff(code, result.code)\n console.log('Output:\\n', result.code + '\\n\\n')\n }\n\n return result\n }\n\n return {\n name: 'router-code-splitter-plugin',\n enforce: 'pre',\n\n transform(code, id) {\n if (!userConfig.autoCodeSplitting) {\n return null\n }\n\n const url = pathToFileURL(id)\n url.searchParams.delete('v')\n id = fileURLToPath(url).replace(/\\\\/g, '/')\n\n if (id.includes(tsrSplit)) {\n return handleCompilingVirtualFile(code, id)\n } else if (\n fileIsInRoutesDirectory(id, userConfig.routesDirectory) &&\n (code.includes('createRoute(') || code.includes('createFileRoute('))\n ) {\n for (const externalPlugin of bannedBeforeExternalPlugins) {\n if (!externalPlugin.frameworks.includes(framework)) {\n continue\n }\n\n if (code.includes(externalPlugin.identifier)) {\n throw new FoundPluginInBeforeCode(externalPlugin, framework)\n }\n }\n\n return handleCompilingReferenceFile(code, id)\n }\n\n return null\n },\n\n transformInclude(id) {\n if (!userConfig.autoCodeSplitting) {\n return undefined\n }\n\n if (\n fileIsInRoutesDirectory(id, userConfig.routesDirectory) ||\n id.includes(tsrSplit)\n ) {\n return true\n }\n return false\n },\n\n vite: {\n configResolved(config) {\n ROOT = config.root\n\n userConfig = getConfig(options, ROOT)\n },\n },\n\n rspack(_compiler) {\n ROOT = process.cwd()\n userConfig = getConfig(options, ROOT)\n },\n\n webpack(compiler) {\n ROOT = process.cwd()\n userConfig = getConfig(options, ROOT)\n\n if (\n userConfig.autoCodeSplitting &&\n compiler.options.mode === 'production'\n ) {\n compiler.hooks.done.tap(PLUGIN_NAME, () => {\n console.info('✅ ' + PLUGIN_NAME + ': code-splitting done!')\n setTimeout(() => {\n process.exit(0)\n })\n })\n }\n },\n }\n}\n"],"names":[],"mappings":";;;;;;;AA6BA,MAAM,QACJ,QAAQ,IAAI,kBACZ,CAAC,QAAQ,eAAe,EAAE,SAAS,QAAQ,IAAI,cAAc;AAE/D,SAAS,gBAAgB,KAAqB;AACrC,SAAA,IAAI,OAAO,CAAC,EAAE,gBAAgB,IAAI,MAAM,CAAC;AAClD;AAEA,SAAS,wBACP,UACA,iBACS;AACH,QAAA,sBAAsB,WAAW,eAAe,IAClD,kBACA,KAAK,QAAQ,IAAI,GAAG,eAAe;AAEjC,QAAA,OAAO,UAAU,QAAQ;AAExB,SAAA,KAAK,WAAW,mBAAmB;AAC5C;AASA,MAAM,8BAAiE;AAAA,EACrE;AAAA,IACE,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,OAAO;AAAA,IACP,YAAY,CAAC,MAAM;AAAA,EAAA;AAEvB;AAEA,MAAM,gCAAgC,MAAM;AAAA,EAC1C,YAAY,gBAA4C,WAAmB;AACzE,UAAM,yBAAyB,eAAe,GAAG,oHAAoH,eAAe,GAAG;AAAA;AAAA;AAAA,kBAGzK,gBAAgB,SAAS,CAAC,4BAA4B,eAAe,KAAK;AAAA,IACxF,eAAe,KAAK;AAAA;AAAA,CAEvB;AAAA,EAAA;AAED;AAEA,MAAM,cAAc;AAEb,MAAM,oCAET,CAAC,UAAU,IAAI,EAAE,gBAAgB;AAC/B,MAAA,OAAe,QAAQ,IAAI;AAC/B,MAAI,aAAa;AAEX,QAAA,eAAe,QAAQ,IAAI,aAAa;AAE9C,QAAM,8BAA8B,MAAM;;AAEtC,aAAA,gBAAW,yBAAX,mBAAiC,oBACjC;AAAA,EAEJ;AACA,QAAM,mBAAmB,MAAM;;AAC7B,YAAO,gBAAW,yBAAX,mBAAiC;AAAA,EAC1C;AAEM,QAAA,+BAA+B,CACnC,MACA,OAC4B;AAC5B,QAAI,MAAO,SAAQ,KAAK,qBAAqB,EAAE;AAE/C,UAAM,WAAW,kCAAkC;AAAA,MACjD;AAAA,MACA,MAAM;AAAA,MACN,UAAU;AAAA,IAAA,CACX;AAED,QAAI,SAAS,WAAW;AACtB,YAAM,MAAM,qBAAqB,UAAU,SAAS,SAAS;AACzD,UAAA,CAAC,IAAI,SAAS;AACV,cAAA,UAAU,IAAI,MAAM,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI;AAChE,cAAM,IAAI;AAAA,UACR,gCAAgC,EAAE;AAAA,EAAmB,OAAO;AAAA,QAC9D;AAAA,MAAA;AAAA,IACF;AAGF,UAAM,oBAAoB,iBAAiB;AAE3C,UAAM,sBAAsB,uDAAoB;AAAA,MAC9C,SAAS,SAAS;AAAA,IAAA;AAGpB,QAAI,qBAAqB;AACjB,YAAA,MAAM,qBAAqB,UAAU,mBAAmB;AAC1D,UAAA,CAAC,IAAI,SAAS;AACV,cAAA,UAAU,IAAI,MAAM,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI;AAChE,cAAM,IAAI;AAAA,UACR,sEAAsE,EAAE;AAAA,EAAmB,OAAO;AAAA,QACpG;AAAA,MAAA;AAAA,IACF;AAGF,UAAM,iBACJ,SAAS,aAAa,uBAAuB,4BAA4B;AAE3E,UAAM,yBAAyB,+BAA+B;AAAA,MAC5D;AAAA,MACA,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAY,eAAe,SAAS;AAAA,MACpC,oBAAoB;AAAA,MACpB,iBAAiB,WAAW;AAAA,IAAA,CAC7B;AAED,QAAI,OAAO;AACD,cAAA,MAAM,uBAAuB,IAAI;AACzC,cAAQ,IAAI,aAAa,uBAAuB,OAAO,MAAM;AAAA,IAAA;AAGxD,WAAA;AAAA,EACT;AAEM,QAAA,6BAA6B,CACjC,MACA,OAC4B;AAC5B,QAAI,MAAO,SAAQ,KAAK,qBAAqB,EAAE;AAE/C,UAAM,CAAC,GAAG,GAAG,aAAa,IAAI,GAAG,MAAM,GAAG;AAE1C,UAAM,eAAe,IAAI,gBAAgB,cAAc,KAAK,GAAG,CAAC;AAC1D,UAAA,aAAa,aAAa,IAAI,QAAQ;AAE5C,QAAI,CAAC,YAAY;AACf,YAAM,IAAI;AAAA,QACR,0CAA0C,EAAE;AAAA,MAC9C;AAAA,IAAA;AAGI,UAAA,cAAc,iBAAiB,UAAU;AAC/C,UAAM,WAAW,CAAC,GAAG,IAAI,IAAI,WAAW,CAAC,EAAE;AAAA,MAAO,CAAC,MACjD,qBAAqB,SAAS,CAAQ;AAAA,IACxC;AAEA,UAAM,SAAS,6BAA6B;AAAA,MAC1C;AAAA,MACA,MAAM;AAAA,MACN,UAAU;AAAA,MACV,cAAc;AAAA,IAAA,CACf;AAED,QAAI,OAAO;AACD,cAAA,MAAM,OAAO,IAAI;AACzB,cAAQ,IAAI,aAAa,OAAO,OAAO,MAAM;AAAA,IAAA;AAGxC,WAAA;AAAA,EACT;AAEO,SAAA;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IAET,UAAU,MAAM,IAAI;AACd,UAAA,CAAC,WAAW,mBAAmB;AAC1B,eAAA;AAAA,MAAA;AAGH,YAAA,MAAM,cAAc,EAAE;AACxB,UAAA,aAAa,OAAO,GAAG;AAC3B,WAAK,cAAc,GAAG,EAAE,QAAQ,OAAO,GAAG;AAEtC,UAAA,GAAG,SAAS,QAAQ,GAAG;AAClB,eAAA,2BAA2B,MAAM,EAAE;AAAA,MAE1C,WAAA,wBAAwB,IAAI,WAAW,eAAe,MACrD,KAAK,SAAS,cAAc,KAAK,KAAK,SAAS,kBAAkB,IAClE;AACA,mBAAW,kBAAkB,6BAA6B;AACxD,cAAI,CAAC,eAAe,WAAW,SAAS,SAAS,GAAG;AAClD;AAAA,UAAA;AAGF,cAAI,KAAK,SAAS,eAAe,UAAU,GAAG;AACtC,kBAAA,IAAI,wBAAwB,gBAAgB,SAAS;AAAA,UAAA;AAAA,QAC7D;AAGK,eAAA,6BAA6B,MAAM,EAAE;AAAA,MAAA;AAGvC,aAAA;AAAA,IACT;AAAA,IAEA,iBAAiB,IAAI;AACf,UAAA,CAAC,WAAW,mBAAmB;AAC1B,eAAA;AAAA,MAAA;AAIP,UAAA,wBAAwB,IAAI,WAAW,eAAe,KACtD,GAAG,SAAS,QAAQ,GACpB;AACO,eAAA;AAAA,MAAA;AAEF,aAAA;AAAA,IACT;AAAA,IAEA,MAAM;AAAA,MACJ,eAAe,QAAQ;AACrB,eAAO,OAAO;AAED,qBAAA,UAAU,SAAS,IAAI;AAAA,MAAA;AAAA,IAExC;AAAA,IAEA,OAAO,WAAW;AAChB,aAAO,QAAQ,IAAI;AACN,mBAAA,UAAU,SAAS,IAAI;AAAA,IACtC;AAAA,IAEA,QAAQ,UAAU;AAChB,aAAO,QAAQ,IAAI;AACN,mBAAA,UAAU,SAAS,IAAI;AAEpC,UACE,WAAW,qBACX,SAAS,QAAQ,SAAS,cAC1B;AACA,iBAAS,MAAM,KAAK,IAAI,aAAa,MAAM;AACjC,kBAAA,KAAK,OAAO,cAAc,wBAAwB;AAC1D,qBAAW,MAAM;AACf,oBAAQ,KAAK,CAAC;AAAA,UAAA,CACf;AAAA,QAAA,CACF;AAAA,MAAA;AAAA,IACH;AAAA,EAEJ;AACF;"}
@@ -1,25 +1,11 @@
1
1
  import { unpluginRouterGeneratorFactory } from "./router-generator-plugin.js";
2
2
  import { unpluginRouterCodeSplitterFactory } from "./router-code-splitter-plugin.js";
3
- import { unpluginRouterHmrFactory } from "./router-hmr-plugin.js";
4
- import { unpluginRouteAutoimportFactory } from "./route-autoimport-plugin.js";
5
3
  const unpluginRouterComposedFactory = (options = {}, meta) => {
6
- const getPlugin = (pluginFactory) => {
7
- const plugin = pluginFactory(options, meta);
8
- if (!Array.isArray(plugin)) {
9
- return [plugin];
10
- }
11
- return plugin;
12
- };
13
- const routerGenerator = getPlugin(unpluginRouterGeneratorFactory);
14
- const routerCodeSplitter = getPlugin(unpluginRouterCodeSplitterFactory);
15
- const routeAutoImport = getPlugin(unpluginRouteAutoimportFactory);
16
- const result = [...routerGenerator, ...routerCodeSplitter, ...routeAutoImport];
17
- const isProduction = process.env.NODE_ENV === "production";
18
- if (!isProduction && !options.autoCodeSplitting) {
19
- const routerHmr = getPlugin(unpluginRouterHmrFactory);
20
- result.push(...routerHmr);
21
- }
22
- return result;
4
+ const routerGenerator = unpluginRouterGeneratorFactory(options);
5
+ const routerGeneratorOptions = Array.isArray(routerGenerator) ? routerGenerator : [routerGenerator];
6
+ const routerCodeSplitter = unpluginRouterCodeSplitterFactory(options, meta);
7
+ const routerCodeSplitterOptions = Array.isArray(routerCodeSplitter) ? routerCodeSplitter : [routerCodeSplitter];
8
+ return [...routerGeneratorOptions, ...routerCodeSplitterOptions];
23
9
  };
24
10
  export {
25
11
  unpluginRouterComposedFactory
@@ -1 +1 @@
1
- {"version":3,"file":"router-composed-plugin.js","sources":["../../../src/core/router-composed-plugin.ts"],"sourcesContent":["import { unpluginRouterGeneratorFactory } from './router-generator-plugin'\nimport { unpluginRouterCodeSplitterFactory } from './router-code-splitter-plugin'\nimport { unpluginRouterHmrFactory } from './router-hmr-plugin'\nimport { unpluginRouteAutoimportFactory } from './route-autoimport-plugin'\nimport type { Config } from './config'\nimport type { UnpluginFactory } from 'unplugin'\n\nexport const unpluginRouterComposedFactory: UnpluginFactory<\n Partial<Config> | undefined\n> = (options = {}, meta) => {\n const getPlugin = (pluginFactory: UnpluginFactory<Partial<Config>>) => {\n const plugin = pluginFactory(options, meta)\n if (!Array.isArray(plugin)) {\n return [plugin]\n }\n return plugin\n }\n\n const routerGenerator = getPlugin(unpluginRouterGeneratorFactory)\n const routerCodeSplitter = getPlugin(unpluginRouterCodeSplitterFactory)\n const routeAutoImport = getPlugin(unpluginRouteAutoimportFactory)\n\n const result = [...routerGenerator, ...routerCodeSplitter, ...routeAutoImport]\n\n const isProduction = process.env.NODE_ENV === 'production'\n\n if (!isProduction && !options.autoCodeSplitting) {\n const routerHmr = getPlugin(unpluginRouterHmrFactory)\n result.push(...routerHmr)\n }\n return result\n}\n"],"names":[],"mappings":";;;;AAOO,MAAM,gCAET,CAAC,UAAU,IAAI,SAAS;AACpB,QAAA,YAAY,CAAC,kBAAoD;AAC/D,UAAA,SAAS,cAAc,SAAS,IAAI;AAC1C,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,aAAO,CAAC,MAAM;AAAA,IAAA;AAET,WAAA;AAAA,EACT;AAEM,QAAA,kBAAkB,UAAU,8BAA8B;AAC1D,QAAA,qBAAqB,UAAU,iCAAiC;AAChE,QAAA,kBAAkB,UAAU,8BAA8B;AAEhE,QAAM,SAAS,CAAC,GAAG,iBAAiB,GAAG,oBAAoB,GAAG,eAAe;AAEvE,QAAA,eAAe,QAAQ,IAAI,aAAa;AAE9C,MAAI,CAAC,gBAAgB,CAAC,QAAQ,mBAAmB;AACzC,UAAA,YAAY,UAAU,wBAAwB;AAC7C,WAAA,KAAK,GAAG,SAAS;AAAA,EAAA;AAEnB,SAAA;AACT;"}
1
+ {"version":3,"file":"router-composed-plugin.js","sources":["../../../src/core/router-composed-plugin.ts"],"sourcesContent":["import { unpluginRouterGeneratorFactory } from './router-generator-plugin'\nimport { unpluginRouterCodeSplitterFactory } from './router-code-splitter-plugin'\n\nimport type { Config } from './config'\nimport type { UnpluginFactory } from 'unplugin'\n\nexport const unpluginRouterComposedFactory: UnpluginFactory<\n Partial<Config> | undefined\n> = (options = {}, meta) => {\n const routerGenerator = unpluginRouterGeneratorFactory(options, meta)\n\n const routerGeneratorOptions = Array.isArray(routerGenerator)\n ? routerGenerator\n : [routerGenerator]\n\n const routerCodeSplitter = unpluginRouterCodeSplitterFactory(options, meta)\n const routerCodeSplitterOptions = Array.isArray(routerCodeSplitter)\n ? routerCodeSplitter\n : [routerCodeSplitter]\n\n return [...routerGeneratorOptions, ...routerCodeSplitterOptions]\n}\n"],"names":[],"mappings":";;AAMO,MAAM,gCAET,CAAC,UAAU,IAAI,SAAS;AACpB,QAAA,kBAAkB,+BAA+B,OAAa;AAEpE,QAAM,yBAAyB,MAAM,QAAQ,eAAe,IACxD,kBACA,CAAC,eAAe;AAEd,QAAA,qBAAqB,kCAAkC,SAAS,IAAI;AAC1E,QAAM,4BAA4B,MAAM,QAAQ,kBAAkB,IAC9D,qBACA,CAAC,kBAAkB;AAEvB,SAAO,CAAC,GAAG,wBAAwB,GAAG,yBAAyB;AACjE;"}
@@ -54,17 +54,11 @@ const unpluginRouterGeneratorFactory = (options = {}) => {
54
54
  });
55
55
  },
56
56
  vite: {
57
- configResolved(config) {
57
+ async configResolved(config) {
58
58
  ROOT = config.root;
59
59
  userConfig = getConfig(options, ROOT);
60
- },
61
- async buildStart() {
62
- if (this.environment.config.consumer === "server") {
63
- return;
64
- }
65
60
  await run(generate);
66
- },
67
- sharedDuringBuild: true
61
+ }
68
62
  },
69
63
  rspack(compiler) {
70
64
  userConfig = getConfig(options, ROOT);
@@ -1 +1 @@
1
- {"version":3,"file":"router-generator-plugin.js","sources":["../../../src/core/router-generator-plugin.ts"],"sourcesContent":["import { isAbsolute, join, normalize, resolve } from 'node:path'\nimport { generator, resolveConfigPath } from '@tanstack/router-generator'\n\nimport { getConfig } from './config'\nimport type { FSWatcher } from 'chokidar'\nimport type { UnpluginFactory } from 'unplugin'\nimport type { Config } from './config'\n\nlet lock = false\nconst checkLock = () => lock\nconst setLock = (bool: boolean) => {\n lock = bool\n}\n\nconst PLUGIN_NAME = 'unplugin:router-generator'\n\nexport const unpluginRouterGeneratorFactory: UnpluginFactory<\n Partial<Config> | undefined\n> = (options = {}) => {\n let ROOT: string = process.cwd()\n let userConfig = options as Config\n\n const getRoutesDirectoryPath = () => {\n return isAbsolute(userConfig.routesDirectory)\n ? userConfig.routesDirectory\n : join(ROOT, userConfig.routesDirectory)\n }\n\n const generate = async () => {\n if (checkLock()) {\n return\n }\n\n setLock(true)\n\n try {\n await generator(userConfig, process.cwd())\n } catch (err) {\n console.error(err)\n console.info()\n } finally {\n setLock(false)\n }\n }\n\n const handleFile = async (\n file: string,\n event: 'create' | 'update' | 'delete',\n ) => {\n const filePath = normalize(file)\n\n if (filePath === resolveConfigPath({ configDirectory: ROOT })) {\n userConfig = getConfig(options, ROOT)\n return\n }\n\n if (\n event === 'update' &&\n filePath === resolve(userConfig.generatedRouteTree)\n ) {\n // skip generating routes if the generated route tree is updated\n return\n }\n\n const routesDirectoryPath = getRoutesDirectoryPath()\n if (filePath.startsWith(routesDirectoryPath)) {\n await generate()\n }\n }\n\n const run: (cb: () => Promise<void> | void) => Promise<void> = async (cb) => {\n if (userConfig.enableRouteGeneration ?? true) {\n await cb()\n }\n }\n\n return {\n name: 'router-generator-plugin',\n async watchChange(id, { event }) {\n await run(async () => {\n await handleFile(id, event)\n })\n },\n vite: {\n configResolved(config) {\n ROOT = config.root\n userConfig = getConfig(options, ROOT)\n\n // if (config.command === 'serve') {\n // await run(generate)\n // }\n },\n async buildStart() {\n if (this.environment.config.consumer === 'server') {\n // When building in environment mode, we only need to generate routes\n // for the client environment\n return\n }\n await run(generate)\n },\n sharedDuringBuild: true,\n },\n rspack(compiler) {\n userConfig = getConfig(options, ROOT)\n\n let handle: FSWatcher | null = null\n\n compiler.hooks.beforeRun.tapPromise(PLUGIN_NAME, async () => {\n await run(generate)\n })\n\n compiler.hooks.watchRun.tapPromise(PLUGIN_NAME, async () => {\n if (handle) {\n return\n }\n\n // rspack watcher doesn't register newly created files\n const routesDirectoryPath = getRoutesDirectoryPath()\n const chokidar = await import('chokidar')\n handle = chokidar\n .watch(routesDirectoryPath, { ignoreInitial: true })\n .on('add', async () => {\n await run(generate)\n })\n\n await run(generate)\n })\n\n compiler.hooks.watchClose.tap(PLUGIN_NAME, async () => {\n if (handle) {\n await handle.close()\n }\n })\n },\n webpack(compiler) {\n userConfig = getConfig(options, ROOT)\n\n let handle: FSWatcher | null = null\n\n compiler.hooks.beforeRun.tapPromise(PLUGIN_NAME, async () => {\n await run(generate)\n })\n\n compiler.hooks.watchRun.tapPromise(PLUGIN_NAME, async () => {\n if (handle) {\n return\n }\n\n // webpack watcher doesn't register newly created files\n const routesDirectoryPath = getRoutesDirectoryPath()\n const chokidar = await import('chokidar')\n handle = chokidar\n .watch(routesDirectoryPath, { ignoreInitial: true })\n .on('add', async () => {\n await run(generate)\n })\n\n await run(generate)\n })\n\n compiler.hooks.watchClose.tap(PLUGIN_NAME, async () => {\n if (handle) {\n await handle.close()\n }\n })\n\n compiler.hooks.done.tap(PLUGIN_NAME, () => {\n console.info('✅ ' + PLUGIN_NAME + ': route-tree generation done')\n })\n },\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router-generator-plugin.js","sources":["../../../src/core/router-generator-plugin.ts"],"sourcesContent":["import { isAbsolute, join, normalize, resolve } from 'node:path'\nimport { generator, resolveConfigPath } from '@tanstack/router-generator'\n\nimport { getConfig } from './config'\nimport type { FSWatcher } from 'chokidar'\nimport type { UnpluginFactory } from 'unplugin'\nimport type { Config } from './config'\n\nlet lock = false\nconst checkLock = () => lock\nconst setLock = (bool: boolean) => {\n lock = bool\n}\n\nconst PLUGIN_NAME = 'unplugin:router-generator'\n\nexport const unpluginRouterGeneratorFactory: UnpluginFactory<\n Partial<Config> | undefined\n> = (options = {}) => {\n let ROOT: string = process.cwd()\n let userConfig = options as Config\n\n const getRoutesDirectoryPath = () => {\n return isAbsolute(userConfig.routesDirectory)\n ? userConfig.routesDirectory\n : join(ROOT, userConfig.routesDirectory)\n }\n\n const generate = async () => {\n if (checkLock()) {\n return\n }\n\n setLock(true)\n\n try {\n await generator(userConfig, process.cwd())\n } catch (err) {\n console.error(err)\n console.info()\n } finally {\n setLock(false)\n }\n }\n\n const handleFile = async (\n file: string,\n event: 'create' | 'update' | 'delete',\n ) => {\n const filePath = normalize(file)\n\n if (filePath === resolveConfigPath({ configDirectory: ROOT })) {\n userConfig = getConfig(options, ROOT)\n return\n }\n\n if (\n event === 'update' &&\n filePath === resolve(userConfig.generatedRouteTree)\n ) {\n // skip generating routes if the generated route tree is updated\n return\n }\n\n const routesDirectoryPath = getRoutesDirectoryPath()\n if (filePath.startsWith(routesDirectoryPath)) {\n await generate()\n }\n }\n\n const run: (cb: () => Promise<void> | void) => Promise<void> = async (cb) => {\n if (userConfig.enableRouteGeneration ?? true) {\n await cb()\n }\n }\n\n return {\n name: 'router-generator-plugin',\n async watchChange(id, { event }) {\n await run(async () => {\n await handleFile(id, event)\n })\n },\n vite: {\n async configResolved(config) {\n ROOT = config.root\n userConfig = getConfig(options, ROOT)\n\n await run(generate)\n },\n },\n rspack(compiler) {\n userConfig = getConfig(options, ROOT)\n\n let handle: FSWatcher | null = null\n\n compiler.hooks.beforeRun.tapPromise(PLUGIN_NAME, async () => {\n await run(generate)\n })\n\n compiler.hooks.watchRun.tapPromise(PLUGIN_NAME, async () => {\n if (handle) {\n return\n }\n\n // rspack watcher doesn't register newly created files\n const routesDirectoryPath = getRoutesDirectoryPath()\n const chokidar = await import('chokidar')\n handle = chokidar\n .watch(routesDirectoryPath, { ignoreInitial: true })\n .on('add', async () => {\n await run(generate)\n })\n\n await run(generate)\n })\n\n compiler.hooks.watchClose.tap(PLUGIN_NAME, async () => {\n if (handle) {\n await handle.close()\n }\n })\n },\n webpack(compiler) {\n userConfig = getConfig(options, ROOT)\n\n let handle: FSWatcher | null = null\n\n compiler.hooks.beforeRun.tapPromise(PLUGIN_NAME, async () => {\n await run(generate)\n })\n\n compiler.hooks.watchRun.tapPromise(PLUGIN_NAME, async () => {\n if (handle) {\n return\n }\n\n // webpack watcher doesn't register newly created files\n const routesDirectoryPath = getRoutesDirectoryPath()\n const chokidar = await import('chokidar')\n handle = chokidar\n .watch(routesDirectoryPath, { ignoreInitial: true })\n .on('add', async () => {\n await run(generate)\n })\n\n await run(generate)\n })\n\n compiler.hooks.watchClose.tap(PLUGIN_NAME, async () => {\n if (handle) {\n await handle.close()\n }\n })\n\n compiler.hooks.done.tap(PLUGIN_NAME, () => {\n console.info('✅ ' + PLUGIN_NAME + ': route-tree generation done')\n })\n },\n }\n}\n"],"names":[],"mappings":"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"}
@@ -12,29 +12,31 @@ declare const TanStackRouterGeneratorEsbuild: (options?: Partial<{
12
12
  target: "react" | "solid";
13
13
  routeFileIgnorePrefix: string;
14
14
  routesDirectory: string;
15
+ generatedRouteTree: string;
15
16
  quoteStyle: "single" | "double";
16
17
  semicolons: boolean;
17
- disableLogging: boolean;
18
- routeTreeFileHeader: string[];
19
- indexToken: string;
20
- routeToken: string;
21
- generatedRouteTree: string;
22
18
  disableTypes: boolean;
23
19
  addExtensions: boolean;
20
+ disableLogging: boolean;
24
21
  disableManifestGeneration: boolean;
25
22
  enableRouteTreeFormatting: boolean;
23
+ apiBase: string;
24
+ routeTreeFileHeader: string[];
26
25
  routeTreeFileFooter: string[];
26
+ indexToken: string;
27
+ routeToken: string;
27
28
  enableRouteGeneration?: boolean | undefined;
28
29
  codeSplittingOptions?: import('./core/config.js').CodeSplittingOptions | undefined;
29
30
  virtualRouteConfig?: string | import('@tanstack/virtual-file-routes').VirtualRootRoute | undefined;
30
31
  routeFilePrefix?: string | undefined;
31
32
  routeFileIgnorePattern?: string | undefined;
32
- pathParamsAllowedCharacters?: (";" | ":" | "@" | "&" | "=" | "+" | "$" | ",")[] | undefined;
33
- verboseFileRoutes?: boolean | undefined;
33
+ __enableAPIRoutesGeneration?: boolean | undefined;
34
34
  autoCodeSplitting?: boolean | undefined;
35
+ pathParamsAllowedCharacters?: (";" | ":" | "@" | "&" | "=" | "+" | "$" | ",")[] | undefined;
35
36
  customScaffolding?: {
36
37
  routeTemplate?: string | undefined;
37
38
  lazyRouteTemplate?: string | undefined;
39
+ apiTemplate?: string | undefined;
38
40
  } | undefined;
39
41
  experimental?: {
40
42
  enableCodeSplitting?: boolean | undefined;
@@ -53,29 +55,31 @@ declare const TanStackRouterCodeSplitterEsbuild: (options?: Partial<{
53
55
  target: "react" | "solid";
54
56
  routeFileIgnorePrefix: string;
55
57
  routesDirectory: string;
58
+ generatedRouteTree: string;
56
59
  quoteStyle: "single" | "double";
57
60
  semicolons: boolean;
58
- disableLogging: boolean;
59
- routeTreeFileHeader: string[];
60
- indexToken: string;
61
- routeToken: string;
62
- generatedRouteTree: string;
63
61
  disableTypes: boolean;
64
62
  addExtensions: boolean;
63
+ disableLogging: boolean;
65
64
  disableManifestGeneration: boolean;
66
65
  enableRouteTreeFormatting: boolean;
66
+ apiBase: string;
67
+ routeTreeFileHeader: string[];
67
68
  routeTreeFileFooter: string[];
69
+ indexToken: string;
70
+ routeToken: string;
68
71
  enableRouteGeneration?: boolean | undefined;
69
72
  codeSplittingOptions?: import('./core/config.js').CodeSplittingOptions | undefined;
70
73
  virtualRouteConfig?: string | import('@tanstack/virtual-file-routes').VirtualRootRoute | undefined;
71
74
  routeFilePrefix?: string | undefined;
72
75
  routeFileIgnorePattern?: string | undefined;
73
- pathParamsAllowedCharacters?: (";" | ":" | "@" | "&" | "=" | "+" | "$" | ",")[] | undefined;
74
- verboseFileRoutes?: boolean | undefined;
76
+ __enableAPIRoutesGeneration?: boolean | undefined;
75
77
  autoCodeSplitting?: boolean | undefined;
78
+ pathParamsAllowedCharacters?: (";" | ":" | "@" | "&" | "=" | "+" | "$" | ",")[] | undefined;
76
79
  customScaffolding?: {
77
80
  routeTemplate?: string | undefined;
78
81
  lazyRouteTemplate?: string | undefined;
82
+ apiTemplate?: string | undefined;
79
83
  } | undefined;
80
84
  experimental?: {
81
85
  enableCodeSplitting?: boolean | undefined;
@@ -94,29 +98,31 @@ declare const TanStackRouterEsbuild: (options?: Partial<{
94
98
  target: "react" | "solid";
95
99
  routeFileIgnorePrefix: string;
96
100
  routesDirectory: string;
101
+ generatedRouteTree: string;
97
102
  quoteStyle: "single" | "double";
98
103
  semicolons: boolean;
99
- disableLogging: boolean;
100
- routeTreeFileHeader: string[];
101
- indexToken: string;
102
- routeToken: string;
103
- generatedRouteTree: string;
104
104
  disableTypes: boolean;
105
105
  addExtensions: boolean;
106
+ disableLogging: boolean;
106
107
  disableManifestGeneration: boolean;
107
108
  enableRouteTreeFormatting: boolean;
109
+ apiBase: string;
110
+ routeTreeFileHeader: string[];
108
111
  routeTreeFileFooter: string[];
112
+ indexToken: string;
113
+ routeToken: string;
109
114
  enableRouteGeneration?: boolean | undefined;
110
115
  codeSplittingOptions?: import('./core/config.js').CodeSplittingOptions | undefined;
111
116
  virtualRouteConfig?: string | import('@tanstack/virtual-file-routes').VirtualRootRoute | undefined;
112
117
  routeFilePrefix?: string | undefined;
113
118
  routeFileIgnorePattern?: string | undefined;
114
- pathParamsAllowedCharacters?: (";" | ":" | "@" | "&" | "=" | "+" | "$" | ",")[] | undefined;
115
- verboseFileRoutes?: boolean | undefined;
119
+ __enableAPIRoutesGeneration?: boolean | undefined;
116
120
  autoCodeSplitting?: boolean | undefined;
121
+ pathParamsAllowedCharacters?: (";" | ":" | "@" | "&" | "=" | "+" | "$" | ",")[] | undefined;
117
122
  customScaffolding?: {
118
123
  routeTemplate?: string | undefined;
119
124
  lazyRouteTemplate?: string | undefined;
125
+ apiTemplate?: string | undefined;
120
126
  } | undefined;
121
127
  experimental?: {
122
128
  enableCodeSplitting?: boolean | undefined;