@tanstack/router-plugin 1.20.3-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +13 -0
  3. package/dist/cjs/core/code-splitter/compilers.cjs +755 -0
  4. package/dist/cjs/core/code-splitter/compilers.cjs.map +1 -0
  5. package/dist/cjs/core/code-splitter/compilers.d.cts +22 -0
  6. package/dist/cjs/core/code-splitter/framework-options.cjs +34 -0
  7. package/dist/cjs/core/code-splitter/framework-options.cjs.map +1 -0
  8. package/dist/cjs/core/code-splitter/framework-options.d.cts +10 -0
  9. package/dist/cjs/core/code-splitter/path-ids.cjs +37 -0
  10. package/dist/cjs/core/code-splitter/path-ids.cjs.map +1 -0
  11. package/dist/cjs/core/code-splitter/path-ids.d.cts +2 -0
  12. package/dist/cjs/core/config.cjs +46 -0
  13. package/dist/cjs/core/config.cjs.map +1 -0
  14. package/dist/cjs/core/config.d.cts +160 -0
  15. package/dist/cjs/core/constants.cjs +19 -0
  16. package/dist/cjs/core/constants.cjs.map +1 -0
  17. package/dist/cjs/core/constants.d.cts +5 -0
  18. package/dist/cjs/core/route-autoimport-plugin.cjs +98 -0
  19. package/dist/cjs/core/route-autoimport-plugin.cjs.map +1 -0
  20. package/dist/cjs/core/route-autoimport-plugin.d.cts +6 -0
  21. package/dist/cjs/core/route-hmr-statement.cjs +33 -0
  22. package/dist/cjs/core/route-hmr-statement.cjs.map +1 -0
  23. package/dist/cjs/core/route-hmr-statement.d.cts +1 -0
  24. package/dist/cjs/core/router-code-splitter-plugin.cjs +173 -0
  25. package/dist/cjs/core/router-code-splitter-plugin.cjs.map +1 -0
  26. package/dist/cjs/core/router-code-splitter-plugin.d.cts +3 -0
  27. package/dist/cjs/core/router-composed-plugin.cjs +27 -0
  28. package/dist/cjs/core/router-composed-plugin.cjs.map +1 -0
  29. package/dist/cjs/core/router-composed-plugin.d.cts +3 -0
  30. package/dist/cjs/core/router-generator-plugin.cjs +145 -0
  31. package/dist/cjs/core/router-generator-plugin.cjs.map +1 -0
  32. package/dist/cjs/core/router-generator-plugin.d.cts +3 -0
  33. package/dist/cjs/core/router-hmr-plugin.cjs +51 -0
  34. package/dist/cjs/core/router-hmr-plugin.cjs.map +1 -0
  35. package/dist/cjs/core/router-hmr-plugin.d.cts +8 -0
  36. package/dist/cjs/core/utils.cjs +12 -0
  37. package/dist/cjs/core/utils.cjs.map +1 -0
  38. package/dist/cjs/core/utils.d.cts +2 -0
  39. package/dist/cjs/esbuild.cjs +20 -0
  40. package/dist/cjs/esbuild.cjs.map +1 -0
  41. package/dist/cjs/esbuild.d.cts +127 -0
  42. package/dist/cjs/index.cjs +9 -0
  43. package/dist/cjs/index.cjs.map +1 -0
  44. package/dist/cjs/index.d.cts +4 -0
  45. package/dist/cjs/rspack.cjs +22 -0
  46. package/dist/cjs/rspack.cjs.map +1 -0
  47. package/dist/cjs/rspack.d.cts +139 -0
  48. package/dist/cjs/vite.cjs +22 -0
  49. package/dist/cjs/vite.cjs.map +1 -0
  50. package/dist/cjs/vite.d.cts +159 -0
  51. package/dist/cjs/webpack.cjs +22 -0
  52. package/dist/cjs/webpack.cjs.map +1 -0
  53. package/dist/cjs/webpack.d.cts +127 -0
  54. package/dist/esm/core/code-splitter/compilers.d.ts +22 -0
  55. package/dist/esm/core/code-splitter/compilers.js +737 -0
  56. package/dist/esm/core/code-splitter/compilers.js.map +1 -0
  57. package/dist/esm/core/code-splitter/framework-options.d.ts +10 -0
  58. package/dist/esm/core/code-splitter/framework-options.js +34 -0
  59. package/dist/esm/core/code-splitter/framework-options.js.map +1 -0
  60. package/dist/esm/core/code-splitter/path-ids.d.ts +2 -0
  61. package/dist/esm/core/code-splitter/path-ids.js +37 -0
  62. package/dist/esm/core/code-splitter/path-ids.js.map +1 -0
  63. package/dist/esm/core/config.d.ts +160 -0
  64. package/dist/esm/core/config.js +46 -0
  65. package/dist/esm/core/config.js.map +1 -0
  66. package/dist/esm/core/constants.d.ts +5 -0
  67. package/dist/esm/core/constants.js +19 -0
  68. package/dist/esm/core/constants.js.map +1 -0
  69. package/dist/esm/core/route-autoimport-plugin.d.ts +6 -0
  70. package/dist/esm/core/route-autoimport-plugin.js +81 -0
  71. package/dist/esm/core/route-autoimport-plugin.js.map +1 -0
  72. package/dist/esm/core/route-hmr-statement.d.ts +1 -0
  73. package/dist/esm/core/route-hmr-statement.js +16 -0
  74. package/dist/esm/core/route-hmr-statement.js.map +1 -0
  75. package/dist/esm/core/router-code-splitter-plugin.d.ts +3 -0
  76. package/dist/esm/core/router-code-splitter-plugin.js +173 -0
  77. package/dist/esm/core/router-code-splitter-plugin.js.map +1 -0
  78. package/dist/esm/core/router-composed-plugin.d.ts +3 -0
  79. package/dist/esm/core/router-composed-plugin.js +27 -0
  80. package/dist/esm/core/router-composed-plugin.js.map +1 -0
  81. package/dist/esm/core/router-generator-plugin.d.ts +3 -0
  82. package/dist/esm/core/router-generator-plugin.js +123 -0
  83. package/dist/esm/core/router-generator-plugin.js.map +1 -0
  84. package/dist/esm/core/router-hmr-plugin.d.ts +8 -0
  85. package/dist/esm/core/router-hmr-plugin.js +51 -0
  86. package/dist/esm/core/router-hmr-plugin.js.map +1 -0
  87. package/dist/esm/core/utils.d.ts +2 -0
  88. package/dist/esm/core/utils.js +12 -0
  89. package/dist/esm/core/utils.js.map +1 -0
  90. package/dist/esm/esbuild.d.ts +127 -0
  91. package/dist/esm/esbuild.js +20 -0
  92. package/dist/esm/esbuild.js.map +1 -0
  93. package/dist/esm/index.d.ts +4 -0
  94. package/dist/esm/index.js +9 -0
  95. package/dist/esm/index.js.map +1 -0
  96. package/dist/esm/rspack.d.ts +139 -0
  97. package/dist/esm/rspack.js +22 -0
  98. package/dist/esm/rspack.js.map +1 -0
  99. package/dist/esm/vite.d.ts +159 -0
  100. package/dist/esm/vite.js +22 -0
  101. package/dist/esm/vite.js.map +1 -0
  102. package/dist/esm/webpack.d.ts +127 -0
  103. package/dist/esm/webpack.js +22 -0
  104. package/dist/esm/webpack.js.map +1 -0
  105. package/package.json +133 -0
  106. package/src/core/code-splitter/compilers.ts +1005 -0
  107. package/src/core/code-splitter/framework-options.ts +41 -0
  108. package/src/core/code-splitter/path-ids.ts +39 -0
  109. package/src/core/config.ts +80 -0
  110. package/src/core/constants.ts +17 -0
  111. package/src/core/route-autoimport-plugin.ts +102 -0
  112. package/src/core/route-hmr-statement.ts +13 -0
  113. package/src/core/router-code-splitter-plugin.ts +253 -0
  114. package/src/core/router-composed-plugin.ts +32 -0
  115. package/src/core/router-generator-plugin.ts +172 -0
  116. package/src/core/router-hmr-plugin.ts +65 -0
  117. package/src/core/utils.ts +18 -0
  118. package/src/esbuild.ts +56 -0
  119. package/src/index.ts +4 -0
  120. package/src/rspack.ts +67 -0
  121. package/src/vite.ts +57 -0
  122. package/src/webpack.ts +55 -0
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const template = require("@babel/template");
4
+ function _interopNamespaceDefault(e) {
5
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
6
+ if (e) {
7
+ for (const k in e) {
8
+ if (k !== "default") {
9
+ const d = Object.getOwnPropertyDescriptor(e, k);
10
+ Object.defineProperty(n, k, d.get ? d : {
11
+ enumerable: true,
12
+ get: () => e[k]
13
+ });
14
+ }
15
+ }
16
+ }
17
+ n.default = e;
18
+ return Object.freeze(n);
19
+ }
20
+ const template__namespace = /* @__PURE__ */ _interopNamespaceDefault(template);
21
+ const routeHmrStatement = template__namespace.statement(
22
+ `
23
+ if (import.meta.hot) {
24
+ import.meta.hot.accept((newModule) => {
25
+ if (newModule.Route && typeof newModule.Route.clone === 'function') {
26
+ newModule.Route.clone(Route)
27
+ }
28
+ })
29
+ }
30
+ `
31
+ )();
32
+ exports.routeHmrStatement = routeHmrStatement;
33
+ //# sourceMappingURL=route-hmr-statement.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-hmr-statement.cjs","sources":["../../../src/core/route-hmr-statement.ts"],"sourcesContent":["import * as template from '@babel/template'\n\nexport const routeHmrStatement = template.statement(\n `\nif (import.meta.hot) {\n import.meta.hot.accept((newModule) => {\n if (newModule.Route && typeof newModule.Route.clone === 'function') {\n newModule.Route.clone(Route)\n }\n })\n}\n`,\n)()\n"],"names":["template"],"mappings":";;;;;;;;;;;;;;;;;;;;AAEO,MAAM,oBAAoBA,oBAAS;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASF,EAAE;;"}
@@ -0,0 +1 @@
1
+ export declare const routeHmrStatement: import('@babel/types').Statement;
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const node_url = require("node:url");
4
+ const routerUtils = require("@tanstack/router-utils");
5
+ const config = require("./config.cjs");
6
+ const compilers = require("./code-splitter/compilers.cjs");
7
+ const constants = require("./constants.cjs");
8
+ const pathIds = require("./code-splitter/path-ids.cjs");
9
+ const utils = require("./utils.cjs");
10
+ function capitalizeFirst(str) {
11
+ return str.charAt(0).toUpperCase() + str.slice(1);
12
+ }
13
+ const bannedBeforeExternalPlugins = [
14
+ {
15
+ identifier: "@react-refresh",
16
+ pkg: "@vitejs/plugin-react",
17
+ usage: "viteReact()",
18
+ frameworks: ["vite"]
19
+ }
20
+ ];
21
+ class FoundPluginInBeforeCode extends Error {
22
+ constructor(externalPlugin, framework) {
23
+ 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:
24
+ e.g.
25
+ plugins: [
26
+ TanStackRouter${capitalizeFirst(framework)}(), // Place this before ${externalPlugin.usage}
27
+ ${externalPlugin.usage},
28
+ ]
29
+ `);
30
+ }
31
+ }
32
+ const PLUGIN_NAME = "unplugin:router-code-splitter";
33
+ const unpluginRouterCodeSplitterFactory = (options = {}, { framework }) => {
34
+ let ROOT = process.cwd();
35
+ let userConfig = options;
36
+ const isProduction = process.env.NODE_ENV === "production";
37
+ const getGlobalCodeSplitGroupings = () => {
38
+ var _a;
39
+ return ((_a = userConfig.codeSplittingOptions) == null ? void 0 : _a.defaultBehavior) || constants.defaultCodeSplitGroupings;
40
+ };
41
+ const getShouldSplitFn = () => {
42
+ var _a;
43
+ return (_a = userConfig.codeSplittingOptions) == null ? void 0 : _a.splitBehavior;
44
+ };
45
+ const handleCompilingReferenceFile = (code, id) => {
46
+ if (utils.debug) console.info("Compiling Route: ", id);
47
+ const fromCode = compilers.detectCodeSplitGroupingsFromRoute({
48
+ code
49
+ });
50
+ if (fromCode.groupings) {
51
+ const res = config.splitGroupingsSchema.safeParse(fromCode.groupings);
52
+ if (!res.success) {
53
+ const message = res.error.errors.map((e) => e.message).join(". ");
54
+ throw new Error(
55
+ `The groupings for the route "${id}" are invalid.
56
+ ${message}`
57
+ );
58
+ }
59
+ }
60
+ const userShouldSplitFn = getShouldSplitFn();
61
+ const pluginSplitBehavior = userShouldSplitFn == null ? void 0 : userShouldSplitFn({
62
+ routeId: fromCode.routeId
63
+ });
64
+ if (pluginSplitBehavior) {
65
+ const res = config.splitGroupingsSchema.safeParse(pluginSplitBehavior);
66
+ if (!res.success) {
67
+ const message = res.error.errors.map((e) => e.message).join(". ");
68
+ throw new Error(
69
+ `The groupings returned when using \`splitBehavior\` for the route "${id}" are invalid.
70
+ ${message}`
71
+ );
72
+ }
73
+ }
74
+ const splitGroupings = fromCode.groupings || pluginSplitBehavior || getGlobalCodeSplitGroupings();
75
+ const compiledReferenceRoute = compilers.compileCodeSplitReferenceRoute({
76
+ code,
77
+ runtimeEnv: isProduction ? "prod" : "dev",
78
+ codeSplitGroupings: splitGroupings,
79
+ targetFramework: userConfig.target,
80
+ filename: id,
81
+ id
82
+ });
83
+ if (utils.debug) {
84
+ routerUtils.logDiff(code, compiledReferenceRoute.code);
85
+ console.log("Output:\n", compiledReferenceRoute.code + "\n\n");
86
+ }
87
+ return compiledReferenceRoute;
88
+ };
89
+ const handleCompilingVirtualFile = (code, id) => {
90
+ if (utils.debug) console.info("Splitting Route: ", id);
91
+ const [_, ...pathnameParts] = id.split("?");
92
+ const searchParams = new URLSearchParams(pathnameParts.join("?"));
93
+ const splitValue = searchParams.get(constants.tsrSplit);
94
+ if (!splitValue) {
95
+ throw new Error(
96
+ `The split value for the virtual route "${id}" was not found.`
97
+ );
98
+ }
99
+ const rawGrouping = pathIds.decodeIdentifier(splitValue);
100
+ const grouping = [...new Set(rawGrouping)].filter(
101
+ (p) => constants.splitRouteIdentNodes.includes(p)
102
+ );
103
+ const result = compilers.compileCodeSplitVirtualRoute({
104
+ code,
105
+ filename: id,
106
+ splitTargets: grouping
107
+ });
108
+ if (utils.debug) {
109
+ routerUtils.logDiff(code, result.code);
110
+ console.log("Output:\n", result.code + "\n\n");
111
+ }
112
+ return result;
113
+ };
114
+ return {
115
+ name: "router-code-splitter-plugin",
116
+ enforce: "pre",
117
+ transform(code, id) {
118
+ if (!userConfig.autoCodeSplitting) {
119
+ return null;
120
+ }
121
+ const url = node_url.pathToFileURL(id);
122
+ url.searchParams.delete("v");
123
+ id = node_url.fileURLToPath(url).replace(/\\/g, "/");
124
+ if (id.includes(constants.tsrSplit)) {
125
+ return handleCompilingVirtualFile(code, id);
126
+ } else if (utils.fileIsInRoutesDirectory(id, userConfig.routesDirectory) && (code.includes("createRoute(") || code.includes("createFileRoute("))) {
127
+ for (const externalPlugin of bannedBeforeExternalPlugins) {
128
+ if (!externalPlugin.frameworks.includes(framework)) {
129
+ continue;
130
+ }
131
+ if (code.includes(externalPlugin.identifier)) {
132
+ throw new FoundPluginInBeforeCode(externalPlugin, framework);
133
+ }
134
+ }
135
+ return handleCompilingReferenceFile(code, id);
136
+ }
137
+ return null;
138
+ },
139
+ transformInclude(id) {
140
+ if (!userConfig.autoCodeSplitting) {
141
+ return void 0;
142
+ }
143
+ if (utils.fileIsInRoutesDirectory(id, userConfig.routesDirectory) || id.includes(constants.tsrSplit)) {
144
+ return true;
145
+ }
146
+ return false;
147
+ },
148
+ vite: {
149
+ configResolved(config$1) {
150
+ ROOT = config$1.root;
151
+ userConfig = config.getConfig(options, ROOT);
152
+ }
153
+ },
154
+ rspack(_compiler) {
155
+ ROOT = process.cwd();
156
+ userConfig = config.getConfig(options, ROOT);
157
+ },
158
+ webpack(compiler) {
159
+ ROOT = process.cwd();
160
+ userConfig = config.getConfig(options, ROOT);
161
+ if (userConfig.autoCodeSplitting && compiler.options.mode === "production") {
162
+ compiler.hooks.done.tap(PLUGIN_NAME, () => {
163
+ console.info("✅ " + PLUGIN_NAME + ": code-splitting done!");
164
+ setTimeout(() => {
165
+ process.exit(0);
166
+ });
167
+ });
168
+ }
169
+ }
170
+ };
171
+ };
172
+ exports.unpluginRouterCodeSplitterFactory = unpluginRouterCodeSplitterFactory;
173
+ //# sourceMappingURL=router-code-splitter-plugin.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-code-splitter-plugin.cjs","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":["defaultCodeSplitGroupings","debug","detectCodeSplitGroupingsFromRoute","splitGroupingsSchema","compileCodeSplitReferenceRoute","logDiff","tsrSplit","decodeIdentifier","splitRouteIdentNodes","compileCodeSplitVirtualRoute","pathToFileURL","fileURLToPath","fileIsInRoutesDirectory","config","getConfig"],"mappings":";;;;;;;;;AA6BA,SAAS,gBAAgB,KAAqB;AACrC,SAAA,IAAI,OAAO,CAAC,EAAE,gBAAgB,IAAI,MAAM,CAAC;AAClD;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,oBACjCA,UAAA;AAAA,EAEJ;AACA,QAAM,mBAAmB,MAAM;;AAC7B,YAAO,gBAAW,yBAAX,mBAAiC;AAAA,EAC1C;AAEM,QAAA,+BAA+B,CACnC,MACA,OAC4B;AAC5B,QAAIC,MAAO,MAAA,SAAQ,KAAK,qBAAqB,EAAE;AAE/C,UAAM,WAAWC,UAAAA,kCAAkC;AAAA,MACjD;AAAA,IAAA,CACD;AAED,QAAI,SAAS,WAAW;AACtB,YAAM,MAAMC,OAAA,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,MAAMA,OAAAA,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,yBAAyBC,UAAAA,+BAA+B;AAAA,MAC5D;AAAA,MACA,YAAY,eAAe,SAAS;AAAA,MACpC,oBAAoB;AAAA,MACpB,iBAAiB,WAAW;AAAA,MAC5B,UAAU;AAAA,MACV;AAAA,IAAA,CACD;AAED,QAAIH,aAAO;AACDI,0BAAA,MAAM,uBAAuB,IAAI;AACzC,cAAQ,IAAI,aAAa,uBAAuB,OAAO,MAAM;AAAA,IAAA;AAGxD,WAAA;AAAA,EACT;AAEM,QAAA,6BAA6B,CACjC,MACA,OAC4B;AAC5B,QAAIJ,MAAO,MAAA,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,IAAIK,kBAAQ;AAE5C,QAAI,CAAC,YAAY;AACf,YAAM,IAAI;AAAA,QACR,0CAA0C,EAAE;AAAA,MAC9C;AAAA,IAAA;AAGI,UAAA,cAAcC,yBAAiB,UAAU;AAC/C,UAAM,WAAW,CAAC,GAAG,IAAI,IAAI,WAAW,CAAC,EAAE;AAAA,MAAO,CAAC,MACjDC,+BAAqB,SAAS,CAAQ;AAAA,IACxC;AAEA,UAAM,SAASC,UAAAA,6BAA6B;AAAA,MAC1C;AAAA,MACA,UAAU;AAAA,MACV,cAAc;AAAA,IAAA,CACf;AAED,QAAIR,aAAO;AACDI,0BAAA,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,MAAMK,uBAAc,EAAE;AACxB,UAAA,aAAa,OAAO,GAAG;AAC3B,WAAKC,SAAc,cAAA,GAAG,EAAE,QAAQ,OAAO,GAAG;AAEtC,UAAA,GAAG,SAASL,UAAAA,QAAQ,GAAG;AAClB,eAAA,2BAA2B,MAAM,EAAE;AAAA,MAE1C,WAAAM,MAAAA,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,UAAAA,MAAA,wBAAwB,IAAI,WAAW,eAAe,KACtD,GAAG,SAASN,UAAAA,QAAQ,GACpB;AACO,eAAA;AAAA,MAAA;AAEF,aAAA;AAAA,IACT;AAAA,IAEA,MAAM;AAAA,MACJ,eAAeO,UAAQ;AACrB,eAAOA,SAAO;AAED,qBAAAC,OAAAA,UAAU,SAAS,IAAI;AAAA,MAAA;AAAA,IAExC;AAAA,IAEA,OAAO,WAAW;AAChB,aAAO,QAAQ,IAAI;AACN,mBAAAA,OAAAA,UAAU,SAAS,IAAI;AAAA,IACtC;AAAA,IAEA,QAAQ,UAAU;AAChB,aAAO,QAAQ,IAAI;AACN,mBAAAA,OAAAA,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;;"}
@@ -0,0 +1,3 @@
1
+ import { Config } from './config.cjs';
2
+ import { UnpluginFactory } from 'unplugin';
3
+ export declare const unpluginRouterCodeSplitterFactory: UnpluginFactory<Partial<Config> | undefined>;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const routerGeneratorPlugin = require("./router-generator-plugin.cjs");
4
+ const routerCodeSplitterPlugin = require("./router-code-splitter-plugin.cjs");
5
+ const routerHmrPlugin = require("./router-hmr-plugin.cjs");
6
+ const routeAutoimportPlugin = require("./route-autoimport-plugin.cjs");
7
+ const unpluginRouterComposedFactory = (options = {}, meta) => {
8
+ const getPlugin = (pluginFactory) => {
9
+ const plugin = pluginFactory(options, meta);
10
+ if (!Array.isArray(plugin)) {
11
+ return [plugin];
12
+ }
13
+ return plugin;
14
+ };
15
+ const routerGenerator = getPlugin(routerGeneratorPlugin.unpluginRouterGeneratorFactory);
16
+ const routerCodeSplitter = getPlugin(routerCodeSplitterPlugin.unpluginRouterCodeSplitterFactory);
17
+ const routeAutoImport = getPlugin(routeAutoimportPlugin.unpluginRouteAutoimportFactory);
18
+ const result = [...routerGenerator, ...routerCodeSplitter, ...routeAutoImport];
19
+ const isProduction = process.env.NODE_ENV === "production";
20
+ if (!isProduction && !options.autoCodeSplitting) {
21
+ const routerHmr = getPlugin(routerHmrPlugin.unpluginRouterHmrFactory);
22
+ result.push(...routerHmr);
23
+ }
24
+ return result;
25
+ };
26
+ exports.unpluginRouterComposedFactory = unpluginRouterComposedFactory;
27
+ //# sourceMappingURL=router-composed-plugin.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-composed-plugin.cjs","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":["unpluginRouterGeneratorFactory","unpluginRouterCodeSplitterFactory","unpluginRouteAutoimportFactory","unpluginRouterHmrFactory"],"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,UAAUA,oDAA8B;AAC1D,QAAA,qBAAqB,UAAUC,0DAAiC;AAChE,QAAA,kBAAkB,UAAUC,oDAA8B;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,UAAUC,wCAAwB;AAC7C,WAAA,KAAK,GAAG,SAAS;AAAA,EAAA;AAEnB,SAAA;AACT;;"}
@@ -0,0 +1,3 @@
1
+ import { Config } from './config.cjs';
2
+ import { UnpluginFactory } from 'unplugin';
3
+ export declare const unpluginRouterComposedFactory: UnpluginFactory<Partial<Config> | undefined>;
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") {
10
+ for (let key of __getOwnPropNames(from))
11
+ if (!__hasOwnProp.call(to, key) && key !== except)
12
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
13
+ }
14
+ return to;
15
+ };
16
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
17
+ // If the importer is in node compatibility mode or this is not an ESM
18
+ // file that has been converted to a CommonJS file using a Babel-
19
+ // compatible transform (i.e. "__esModule" has not been set), then set
20
+ // "default" to the CommonJS "module.exports" for node compatibility.
21
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
+ mod
23
+ ));
24
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
25
+ const node_path = require("node:path");
26
+ const routerGenerator = require("@tanstack/router-generator");
27
+ const config = require("./config.cjs");
28
+ let lock = false;
29
+ const checkLock = () => lock;
30
+ const setLock = (bool) => {
31
+ lock = bool;
32
+ };
33
+ const PLUGIN_NAME = "unplugin:router-generator";
34
+ const unpluginRouterGeneratorFactory = (options = {}) => {
35
+ let ROOT = process.cwd();
36
+ let userConfig = options;
37
+ const getRoutesDirectoryPath = () => {
38
+ return node_path.isAbsolute(userConfig.routesDirectory) ? userConfig.routesDirectory : node_path.join(ROOT, userConfig.routesDirectory);
39
+ };
40
+ const generate = async () => {
41
+ if (checkLock()) {
42
+ return;
43
+ }
44
+ setLock(true);
45
+ try {
46
+ await routerGenerator.generator(userConfig, process.cwd());
47
+ } catch (err) {
48
+ console.error(err);
49
+ console.info();
50
+ } finally {
51
+ setLock(false);
52
+ }
53
+ };
54
+ const handleFile = async (file, event) => {
55
+ const filePath = node_path.normalize(file);
56
+ if (filePath === routerGenerator.resolveConfigPath({ configDirectory: ROOT })) {
57
+ userConfig = config.getConfig(options, ROOT);
58
+ return;
59
+ }
60
+ if (event === "update" && filePath === node_path.resolve(userConfig.generatedRouteTree)) {
61
+ return;
62
+ }
63
+ const routesDirectoryPath = getRoutesDirectoryPath();
64
+ if (filePath.startsWith(routesDirectoryPath)) {
65
+ await generate();
66
+ }
67
+ };
68
+ const run = async (cb) => {
69
+ if (userConfig.enableRouteGeneration ?? true) {
70
+ await cb();
71
+ }
72
+ };
73
+ return {
74
+ name: "router-generator-plugin",
75
+ async watchChange(id, { event }) {
76
+ await run(async () => {
77
+ await handleFile(id, event);
78
+ });
79
+ },
80
+ vite: {
81
+ configResolved(config$1) {
82
+ ROOT = config$1.root;
83
+ userConfig = config.getConfig(options, ROOT);
84
+ },
85
+ async buildStart() {
86
+ if (this.environment.name === "server") {
87
+ return;
88
+ }
89
+ await run(generate);
90
+ },
91
+ sharedDuringBuild: true
92
+ },
93
+ rspack(compiler) {
94
+ userConfig = config.getConfig(options, ROOT);
95
+ let handle = null;
96
+ compiler.hooks.beforeRun.tapPromise(PLUGIN_NAME, async () => {
97
+ await run(generate);
98
+ });
99
+ compiler.hooks.watchRun.tapPromise(PLUGIN_NAME, async () => {
100
+ if (handle) {
101
+ return;
102
+ }
103
+ const routesDirectoryPath = getRoutesDirectoryPath();
104
+ const chokidar = await import("chokidar");
105
+ handle = chokidar.watch(routesDirectoryPath, { ignoreInitial: true }).on("add", async () => {
106
+ await run(generate);
107
+ });
108
+ await run(generate);
109
+ });
110
+ compiler.hooks.watchClose.tap(PLUGIN_NAME, async () => {
111
+ if (handle) {
112
+ await handle.close();
113
+ }
114
+ });
115
+ },
116
+ webpack(compiler) {
117
+ userConfig = config.getConfig(options, ROOT);
118
+ let handle = null;
119
+ compiler.hooks.beforeRun.tapPromise(PLUGIN_NAME, async () => {
120
+ await run(generate);
121
+ });
122
+ compiler.hooks.watchRun.tapPromise(PLUGIN_NAME, async () => {
123
+ if (handle) {
124
+ return;
125
+ }
126
+ const routesDirectoryPath = getRoutesDirectoryPath();
127
+ const chokidar = await import("chokidar");
128
+ handle = chokidar.watch(routesDirectoryPath, { ignoreInitial: true }).on("add", async () => {
129
+ await run(generate);
130
+ });
131
+ await run(generate);
132
+ });
133
+ compiler.hooks.watchClose.tap(PLUGIN_NAME, async () => {
134
+ if (handle) {
135
+ await handle.close();
136
+ }
137
+ });
138
+ compiler.hooks.done.tap(PLUGIN_NAME, () => {
139
+ console.info("✅ " + PLUGIN_NAME + ": route-tree generation done");
140
+ });
141
+ }
142
+ };
143
+ };
144
+ exports.unpluginRouterGeneratorFactory = unpluginRouterGeneratorFactory;
145
+ //# sourceMappingURL=router-generator-plugin.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-generator-plugin.cjs","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.name === '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":["isAbsolute","join","generator","normalize","resolveConfigPath","getConfig","resolve","config"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { UnpluginFactory } from 'unplugin';
2
+ import { Config } from './config.cjs';
3
+ export declare const unpluginRouterGeneratorFactory: UnpluginFactory<Partial<Config> | undefined>;
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const routerUtils = require("@tanstack/router-utils");
4
+ const config = require("./config.cjs");
5
+ const routeHmrStatement = require("./route-hmr-statement.cjs");
6
+ const utils = require("./utils.cjs");
7
+ const unpluginRouterHmrFactory = (options = {}) => {
8
+ let ROOT = process.cwd();
9
+ let userConfig = options;
10
+ return {
11
+ name: "router-hmr-plugin",
12
+ enforce: "pre",
13
+ transform(code, id) {
14
+ if (!code.includes("export const Route = createFileRoute(")) {
15
+ return null;
16
+ }
17
+ if (utils.debug) console.info("Adding HMR handling to route ", id);
18
+ const ast = routerUtils.parseAst({ code });
19
+ ast.program.body.push(routeHmrStatement.routeHmrStatement);
20
+ const result = routerUtils.generateFromAst(ast, {
21
+ sourceMaps: true,
22
+ filename: id,
23
+ sourceFileName: id
24
+ });
25
+ if (utils.debug) {
26
+ routerUtils.logDiff(code, result.code);
27
+ console.log("Output:\n", result.code + "\n\n");
28
+ }
29
+ return result;
30
+ },
31
+ transformInclude(id) {
32
+ return utils.fileIsInRoutesDirectory(id, userConfig.routesDirectory);
33
+ },
34
+ vite: {
35
+ configResolved(config$1) {
36
+ ROOT = config$1.root;
37
+ userConfig = config.getConfig(options, ROOT);
38
+ }
39
+ },
40
+ rspack() {
41
+ ROOT = process.cwd();
42
+ userConfig = config.getConfig(options, ROOT);
43
+ },
44
+ webpack() {
45
+ ROOT = process.cwd();
46
+ userConfig = config.getConfig(options, ROOT);
47
+ }
48
+ };
49
+ };
50
+ exports.unpluginRouterHmrFactory = unpluginRouterHmrFactory;
51
+ //# sourceMappingURL=router-hmr-plugin.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-hmr-plugin.cjs","sources":["../../../src/core/router-hmr-plugin.ts"],"sourcesContent":["import { generateFromAst, logDiff, parseAst } from '@tanstack/router-utils'\nimport { getConfig } from './config'\nimport { routeHmrStatement } from './route-hmr-statement'\nimport { debug, fileIsInRoutesDirectory } from './utils'\nimport type { Config } from './config'\nimport type { UnpluginFactory } from 'unplugin'\n\n/**\n * This plugin adds HMR support for file routes.\n * It is only added to the composed plugin in dev when autoCodeSplitting is disabled, since the code splitting plugin\n * handles HMR for code-split routes itself.\n */\nexport const unpluginRouterHmrFactory: UnpluginFactory<\n Partial<Config> | undefined\n> = (options = {}) => {\n let ROOT: string = process.cwd()\n let userConfig = options as Config\n\n return {\n name: 'router-hmr-plugin',\n enforce: 'pre',\n\n transform(code, id) {\n if (!code.includes('export const Route = createFileRoute(')) {\n return null\n }\n\n if (debug) console.info('Adding HMR handling to route ', id)\n\n const ast = parseAst({ code })\n ast.program.body.push(routeHmrStatement)\n const result = generateFromAst(ast, {\n sourceMaps: true,\n filename: id,\n sourceFileName: id,\n })\n if (debug) {\n logDiff(code, result.code)\n console.log('Output:\\n', result.code + '\\n\\n')\n }\n return result\n },\n\n transformInclude(id) {\n return fileIsInRoutesDirectory(id, userConfig.routesDirectory)\n },\n\n vite: {\n configResolved(config) {\n ROOT = config.root\n userConfig = getConfig(options, ROOT)\n },\n },\n\n rspack() {\n ROOT = process.cwd()\n userConfig = getConfig(options, ROOT)\n },\n\n webpack() {\n ROOT = process.cwd()\n userConfig = getConfig(options, ROOT)\n },\n }\n}\n"],"names":["debug","parseAst","routeHmrStatement","generateFromAst","logDiff","fileIsInRoutesDirectory","config","getConfig"],"mappings":";;;;;;AAYO,MAAM,2BAET,CAAC,UAAU,OAAO;AAChB,MAAA,OAAe,QAAQ,IAAI;AAC/B,MAAI,aAAa;AAEV,SAAA;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IAET,UAAU,MAAM,IAAI;AAClB,UAAI,CAAC,KAAK,SAAS,uCAAuC,GAAG;AACpD,eAAA;AAAA,MAAA;AAGT,UAAIA,MAAO,MAAA,SAAQ,KAAK,iCAAiC,EAAE;AAE3D,YAAM,MAAMC,YAAAA,SAAS,EAAE,MAAM;AACzB,UAAA,QAAQ,KAAK,KAAKC,kBAAAA,iBAAiB;AACjC,YAAA,SAASC,4BAAgB,KAAK;AAAA,QAClC,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,gBAAgB;AAAA,MAAA,CACjB;AACD,UAAIH,aAAO;AACDI,4BAAA,MAAM,OAAO,IAAI;AACzB,gBAAQ,IAAI,aAAa,OAAO,OAAO,MAAM;AAAA,MAAA;AAExC,aAAA;AAAA,IACT;AAAA,IAEA,iBAAiB,IAAI;AACZ,aAAAC,8BAAwB,IAAI,WAAW,eAAe;AAAA,IAC/D;AAAA,IAEA,MAAM;AAAA,MACJ,eAAeC,UAAQ;AACrB,eAAOA,SAAO;AACD,qBAAAC,OAAAA,UAAU,SAAS,IAAI;AAAA,MAAA;AAAA,IAExC;AAAA,IAEA,SAAS;AACP,aAAO,QAAQ,IAAI;AACN,mBAAAA,OAAAA,UAAU,SAAS,IAAI;AAAA,IACtC;AAAA,IAEA,UAAU;AACR,aAAO,QAAQ,IAAI;AACN,mBAAAA,OAAAA,UAAU,SAAS,IAAI;AAAA,IAAA;AAAA,EAExC;AACF;;"}
@@ -0,0 +1,8 @@
1
+ import { Config } from './config.cjs';
2
+ import { UnpluginFactory } from 'unplugin';
3
+ /**
4
+ * This plugin adds HMR support for file routes.
5
+ * It is only added to the composed plugin in dev when autoCodeSplitting is disabled, since the code splitting plugin
6
+ * handles HMR for code-split routes itself.
7
+ */
8
+ export declare const unpluginRouterHmrFactory: UnpluginFactory<Partial<Config> | undefined>;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const node_path = require("node:path");
4
+ const debug = process.env.TSR_VITE_DEBUG && ["true", "router-plugin"].includes(process.env.TSR_VITE_DEBUG);
5
+ function fileIsInRoutesDirectory(filePath, routesDirectory) {
6
+ const routesDirectoryPath = node_path.isAbsolute(routesDirectory) ? routesDirectory : node_path.join(process.cwd(), routesDirectory);
7
+ const path = node_path.normalize(filePath);
8
+ return path.startsWith(routesDirectoryPath);
9
+ }
10
+ exports.debug = debug;
11
+ exports.fileIsInRoutesDirectory = fileIsInRoutesDirectory;
12
+ //# sourceMappingURL=utils.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.cjs","sources":["../../../src/core/utils.ts"],"sourcesContent":["import { isAbsolute, join, normalize } from 'node:path'\n\nexport const debug =\n process.env.TSR_VITE_DEBUG &&\n ['true', 'router-plugin'].includes(process.env.TSR_VITE_DEBUG)\n\nexport function 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"],"names":["isAbsolute","join","normalize"],"mappings":";;;AAEa,MAAA,QACX,QAAQ,IAAI,kBACZ,CAAC,QAAQ,eAAe,EAAE,SAAS,QAAQ,IAAI,cAAc;AAE/C,SAAA,wBACd,UACA,iBACS;AACH,QAAA,sBAAsBA,qBAAW,eAAe,IAClD,kBACAC,UAAAA,KAAK,QAAQ,IAAI,GAAG,eAAe;AAEjC,QAAA,OAAOC,oBAAU,QAAQ;AAExB,SAAA,KAAK,WAAW,mBAAmB;AAC5C;;;"}
@@ -0,0 +1,2 @@
1
+ export declare const debug: boolean | "" | undefined;
2
+ export declare function fileIsInRoutesDirectory(filePath: string, routesDirectory: string): boolean;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ const unplugin = require("unplugin");
4
+ const config = require("./core/config.cjs");
5
+ const routerCodeSplitterPlugin = require("./core/router-code-splitter-plugin.cjs");
6
+ const routerGeneratorPlugin = require("./core/router-generator-plugin.cjs");
7
+ const routerComposedPlugin = require("./core/router-composed-plugin.cjs");
8
+ const TanStackRouterGeneratorEsbuild = unplugin.createEsbuildPlugin(
9
+ routerGeneratorPlugin.unpluginRouterGeneratorFactory
10
+ );
11
+ const TanStackRouterCodeSplitterEsbuild = unplugin.createEsbuildPlugin(
12
+ routerCodeSplitterPlugin.unpluginRouterCodeSplitterFactory
13
+ );
14
+ const TanStackRouterEsbuild = unplugin.createEsbuildPlugin(routerComposedPlugin.unpluginRouterComposedFactory);
15
+ exports.configSchema = config.configSchema;
16
+ exports.TanStackRouterCodeSplitterEsbuild = TanStackRouterCodeSplitterEsbuild;
17
+ exports.TanStackRouterEsbuild = TanStackRouterEsbuild;
18
+ exports.TanStackRouterGeneratorEsbuild = TanStackRouterGeneratorEsbuild;
19
+ exports.default = TanStackRouterEsbuild;
20
+ //# sourceMappingURL=esbuild.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"esbuild.cjs","sources":["../../src/esbuild.ts"],"sourcesContent":["import { createEsbuildPlugin } from 'unplugin'\n\nimport { configSchema } from './core/config'\nimport { unpluginRouterCodeSplitterFactory } from './core/router-code-splitter-plugin'\nimport { unpluginRouterGeneratorFactory } from './core/router-generator-plugin'\nimport { unpluginRouterComposedFactory } from './core/router-composed-plugin'\n\nimport type { Config } from './core/config'\n\n/**\n * @example\n * ```ts\n * export default {\n * plugins: [TanStackRouterGeneratorEsbuild()],\n * // ...\n * }\n * ```\n */\nconst TanStackRouterGeneratorEsbuild = createEsbuildPlugin(\n unpluginRouterGeneratorFactory,\n)\n\n/**\n * @example\n * ```ts\n * export default {\n * plugins: [TanStackRouterCodeSplitterEsbuild()],\n * // ...\n * }\n * ```\n */\nconst TanStackRouterCodeSplitterEsbuild = createEsbuildPlugin(\n unpluginRouterCodeSplitterFactory,\n)\n\n/**\n * @example\n * ```ts\n * export default {\n * plugins: [TanStackRouterEsbuild()],\n * // ...\n * }\n * ```\n */\nconst TanStackRouterEsbuild = createEsbuildPlugin(unpluginRouterComposedFactory)\n\nexport default TanStackRouterEsbuild\n\nexport {\n configSchema,\n TanStackRouterGeneratorEsbuild,\n TanStackRouterCodeSplitterEsbuild,\n TanStackRouterEsbuild,\n}\n\nexport type { Config }\n"],"names":["createEsbuildPlugin","unpluginRouterGeneratorFactory","unpluginRouterCodeSplitterFactory","unpluginRouterComposedFactory"],"mappings":";;;;;;;AAkBA,MAAM,iCAAiCA,SAAA;AAAA,EACrCC,sBAAAA;AACF;AAWA,MAAM,oCAAoCD,SAAA;AAAA,EACxCE,yBAAAA;AACF;AAWM,MAAA,wBAAwBF,6BAAoBG,qBAA6B,6BAAA;;;;;;"}