@tanstack/router-plugin 1.39.4 → 1.39.9

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 (41) hide show
  1. package/dist/cjs/code-splitter.cjs +10 -6
  2. package/dist/cjs/code-splitter.cjs.map +1 -1
  3. package/dist/cjs/code-splitter.d.cts +1 -19
  4. package/dist/cjs/composed.cjs +16 -0
  5. package/dist/cjs/composed.cjs.map +1 -0
  6. package/dist/cjs/composed.d.cts +4 -0
  7. package/dist/cjs/index.cjs +2 -2
  8. package/dist/cjs/index.d.cts +2 -2
  9. package/dist/cjs/router-generator.cjs +10 -4
  10. package/dist/cjs/router-generator.cjs.map +1 -1
  11. package/dist/cjs/router-generator.d.cts +4 -18
  12. package/dist/cjs/rspack.cjs +20 -0
  13. package/dist/cjs/rspack.cjs.map +1 -0
  14. package/dist/cjs/rspack.d.cts +107 -0
  15. package/dist/cjs/vite.cjs +11 -9
  16. package/dist/cjs/vite.cjs.map +1 -1
  17. package/dist/cjs/vite.d.cts +48 -4
  18. package/dist/esm/code-splitter.d.ts +1 -19
  19. package/dist/esm/code-splitter.js +10 -6
  20. package/dist/esm/code-splitter.js.map +1 -1
  21. package/dist/esm/composed.d.ts +4 -0
  22. package/dist/esm/composed.js +16 -0
  23. package/dist/esm/composed.js.map +1 -0
  24. package/dist/esm/index.d.ts +2 -2
  25. package/dist/esm/index.js +4 -4
  26. package/dist/esm/router-generator.d.ts +4 -18
  27. package/dist/esm/router-generator.js +10 -4
  28. package/dist/esm/router-generator.js.map +1 -1
  29. package/dist/esm/rspack.d.ts +107 -0
  30. package/dist/esm/rspack.js +20 -0
  31. package/dist/esm/rspack.js.map +1 -0
  32. package/dist/esm/vite.d.ts +48 -4
  33. package/dist/esm/vite.js +13 -11
  34. package/dist/esm/vite.js.map +1 -1
  35. package/package.json +16 -2
  36. package/src/code-splitter.ts +27 -14
  37. package/src/composed.ts +30 -0
  38. package/src/index.ts +2 -2
  39. package/src/router-generator.ts +15 -8
  40. package/src/rspack.ts +74 -0
  41. package/src/vite.ts +40 -11
@@ -0,0 +1,16 @@
1
+ import { unpluginRouterGeneratorFactory } from "./router-generator.js";
2
+ import { unpluginRouterCodeSplitterFactory } from "./code-splitter.js";
3
+ const unpluginRouterComposedFactory = (options = {}, meta) => {
4
+ const routerGenerator = unpluginRouterGeneratorFactory(options);
5
+ const routerGeneratorOptions = Array.isArray(routerGenerator) ? routerGenerator : [routerGenerator];
6
+ const routerCodeSplitter = unpluginRouterCodeSplitterFactory(options, meta);
7
+ let routerCodeSplitterOptions = Array.isArray(routerCodeSplitter) ? routerCodeSplitter : [routerCodeSplitter];
8
+ if (meta.framework === "rspack") {
9
+ routerCodeSplitterOptions = [];
10
+ }
11
+ return [...routerGeneratorOptions, ...routerCodeSplitterOptions];
12
+ };
13
+ export {
14
+ unpluginRouterComposedFactory
15
+ };
16
+ //# sourceMappingURL=composed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composed.js","sources":["../../src/composed.ts"],"sourcesContent":["import { unpluginRouterGeneratorFactory } from './router-generator'\nimport { unpluginRouterCodeSplitterFactory } from './code-splitter'\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 let routerCodeSplitterOptions = Array.isArray(routerCodeSplitter)\n ? routerCodeSplitter\n : [routerCodeSplitter]\n\n // Rspack doesn't support the `resolveId` and `transform` hooks provided by unplugin\n // so we need to disable the code splitter for it\n // If you're using Rspack, and know how to implement the code splitting, please let us know\n // We'd love to support it, but we're not sure how to do it yet\n if (meta.framework === 'rspack') {\n routerCodeSplitterOptions = []\n }\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,MAAI,4BAA4B,MAAM,QAAQ,kBAAkB,IAC5D,qBACA,CAAC,kBAAkB;AAMnB,MAAA,KAAK,cAAc,UAAU;AAC/B,gCAA4B,CAAA;AAAA,EAC9B;AAEA,SAAO,CAAC,GAAG,wBAAwB,GAAG,yBAAyB;AACjE;"}
@@ -1,4 +1,4 @@
1
- export { unpluginRouterCodeSplitter } from './code-splitter.js';
2
- export { unpluginRouterGenerator } from './router-generator.js';
1
+ export { unpluginRouterCodeSplitterFactory } from './code-splitter.js';
2
+ export { unpluginRouterGeneratorFactory } from './router-generator.js';
3
3
  export { configSchema } from './config.js';
4
4
  export type { Config } from './config.js';
package/dist/esm/index.js CHANGED
@@ -1,9 +1,9 @@
1
- import { unpluginRouterCodeSplitter } from "./code-splitter.js";
2
- import { unpluginRouterGenerator } from "./router-generator.js";
1
+ import { unpluginRouterCodeSplitterFactory } from "./code-splitter.js";
2
+ import { unpluginRouterGeneratorFactory } from "./router-generator.js";
3
3
  import { configSchema } from "./config.js";
4
4
  export {
5
5
  configSchema,
6
- unpluginRouterCodeSplitter,
7
- unpluginRouterGenerator
6
+ unpluginRouterCodeSplitterFactory,
7
+ unpluginRouterGeneratorFactory
8
8
  };
9
9
  //# sourceMappingURL=index.js.map
@@ -1,18 +1,4 @@
1
- export declare const unpluginRouterGenerator: import('unplugin').UnpluginInstance<Partial<{
2
- routeFileIgnorePrefix: string;
3
- routesDirectory: string;
4
- generatedRouteTree: string;
5
- quoteStyle: "single" | "double";
6
- semicolons: boolean;
7
- disableTypes: boolean;
8
- addExtensions: boolean;
9
- disableLogging: boolean;
10
- routeTreeFileHeader: string[];
11
- routeTreeFileFooter: string[];
12
- enableRouteGeneration?: boolean | undefined;
13
- experimental?: {
14
- enableCodeSplitting?: boolean | undefined;
15
- } | undefined;
16
- routeFilePrefix?: string | undefined;
17
- routeFileIgnorePattern?: string | undefined;
18
- }> | undefined, boolean>;
1
+ import { UnpluginFactory } from 'unplugin';
2
+ import { Config } from './config.js';
3
+
4
+ export declare const unpluginRouterGeneratorFactory: UnpluginFactory<Partial<Config> | undefined>;
@@ -1,5 +1,4 @@
1
1
  import { normalize, join, resolve, isAbsolute } from "node:path";
2
- import { createUnplugin } from "unplugin";
3
2
  import { generator } from "@tanstack/router-generator";
4
3
  import { getConfig } from "./config.js";
5
4
  import { CONFIG_FILE_NAME } from "./constants.js";
@@ -8,7 +7,8 @@ const checkLock = () => lock;
8
7
  const setLock = (bool) => {
9
8
  lock = bool;
10
9
  };
11
- const unpluginFactory = (options = {}) => {
10
+ const PLUGIN_NAME = "unplugin:router-generator";
11
+ const unpluginRouterGeneratorFactory = (options = {}) => {
12
12
  let ROOT = process.cwd();
13
13
  let userConfig = options;
14
14
  const generate = async () => {
@@ -57,11 +57,17 @@ const unpluginFactory = (options = {}) => {
57
57
  userConfig = await getConfig(options, ROOT);
58
58
  await run(generate);
59
59
  }
60
+ },
61
+ async rspack(compiler) {
62
+ userConfig = await getConfig(options, ROOT);
63
+ await run(generate);
64
+ compiler.hooks.watchRun.tap(PLUGIN_NAME, async () => {
65
+ await run(generate);
66
+ });
60
67
  }
61
68
  };
62
69
  };
63
- const unpluginRouterGenerator = /* @__PURE__ */ createUnplugin(unpluginFactory);
64
70
  export {
65
- unpluginRouterGenerator
71
+ unpluginRouterGeneratorFactory
66
72
  };
67
73
  //# sourceMappingURL=router-generator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"router-generator.js","sources":["../../src/router-generator.ts"],"sourcesContent":["import { isAbsolute, join, normalize, resolve } from 'node:path'\nimport { createUnplugin } from 'unplugin'\nimport { generator } from '@tanstack/router-generator'\n\nimport { getConfig } from './config'\nimport { CONFIG_FILE_NAME } from './constants'\nimport type { Config } from './config'\nimport type { UnpluginFactory } from 'unplugin'\n\nlet lock = false\nconst checkLock = () => lock\nconst setLock = (bool: boolean) => {\n lock = bool\n}\n\nconst unpluginFactory: UnpluginFactory<Partial<Config> | undefined> = (\n options = {},\n) => {\n let ROOT: string = process.cwd()\n let userConfig = options as Config\n\n const generate = async () => {\n if (checkLock()) {\n return\n }\n\n setLock(true)\n\n try {\n await generator(userConfig)\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 === join(ROOT, CONFIG_FILE_NAME)) {\n userConfig = await 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 = isAbsolute(userConfig.routesDirectory)\n ? userConfig.routesDirectory\n : join(ROOT, userConfig.routesDirectory)\n\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 = await getConfig(options, ROOT)\n\n await run(generate)\n },\n },\n }\n}\n\nexport const unpluginRouterGenerator =\n /* #__PURE__ */ createUnplugin(unpluginFactory)\n"],"names":[],"mappings":";;;;;AASA,IAAI,OAAO;AACX,MAAM,YAAY,MAAM;AACxB,MAAM,UAAU,CAAC,SAAkB;AAC1B,SAAA;AACT;AAEA,MAAM,kBAAgE,CACpE,UAAU,OACP;AACC,MAAA,OAAe,QAAQ;AAC3B,MAAI,aAAa;AAEjB,QAAM,WAAW,YAAY;AAC3B,QAAI,aAAa;AACf;AAAA,IACF;AAEA,YAAQ,IAAI;AAER,QAAA;AACF,YAAM,UAAU,UAAU;AAAA,aACnB,KAAK;AACZ,cAAQ,MAAM,GAAG;AACjB,cAAQ,KAAK;AAAA,IAAA,UACb;AACA,cAAQ,KAAK;AAAA,IACf;AAAA,EAAA;AAGI,QAAA,aAAa,OACjB,MACA,UACG;AACG,UAAA,WAAW,UAAU,IAAI;AAE/B,QAAI,aAAa,KAAK,MAAM,gBAAgB,GAAG;AAChC,mBAAA,MAAM,UAAU,SAAS,IAAI;AAC1C;AAAA,IACF;AAEA,QACE,UAAU,YACV,aAAa,QAAQ,WAAW,kBAAkB,GAClD;AAEA;AAAA,IACF;AAEM,UAAA,sBAAsB,WAAW,WAAW,eAAe,IAC7D,WAAW,kBACX,KAAK,MAAM,WAAW,eAAe;AAErC,QAAA,SAAS,WAAW,mBAAmB,GAAG;AAC5C,YAAM,SAAS;AAAA,IACjB;AAAA,EAAA;AAGI,QAAA,MAAyD,OAAO,OAAO;AACvE,QAAA,WAAW,yBAAyB,MAAM;AAC5C,YAAM,GAAG;AAAA,IACX;AAAA,EAAA;AAGK,SAAA;AAAA,IACL,MAAM;AAAA,IACN,MAAM,YAAY,IAAI,EAAE,SAAS;AAC/B,YAAM,IAAI,YAAY;AACd,cAAA,WAAW,IAAI,KAAK;AAAA,MAAA,CAC3B;AAAA,IACH;AAAA,IACA,MAAM;AAAA,MACJ,MAAM,eAAe,QAAQ;AAC3B,eAAO,OAAO;AACD,qBAAA,MAAM,UAAU,SAAS,IAAI;AAE1C,cAAM,IAAI,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,EAAA;AAEJ;AAEa,MAAA,yDACoB,eAAe;"}
1
+ {"version":3,"file":"router-generator.js","sources":["../../src/router-generator.ts"],"sourcesContent":["import { isAbsolute, join, normalize, resolve } from 'node:path'\nimport { generator } from '@tanstack/router-generator'\n\nimport { getConfig } from './config'\nimport { CONFIG_FILE_NAME } from './constants'\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 generate = async () => {\n if (checkLock()) {\n return\n }\n\n setLock(true)\n\n try {\n await generator(userConfig)\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 === join(ROOT, CONFIG_FILE_NAME)) {\n userConfig = await 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 = isAbsolute(userConfig.routesDirectory)\n ? userConfig.routesDirectory\n : join(ROOT, userConfig.routesDirectory)\n\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 = await getConfig(options, ROOT)\n\n await run(generate)\n },\n },\n async rspack(compiler) {\n userConfig = await getConfig(options, ROOT)\n\n await run(generate)\n\n compiler.hooks.watchRun.tap(PLUGIN_NAME, async () => {\n await run(generate)\n })\n },\n }\n}\n"],"names":[],"mappings":";;;;AAQA,IAAI,OAAO;AACX,MAAM,YAAY,MAAM;AACxB,MAAM,UAAU,CAAC,SAAkB;AAC1B,SAAA;AACT;AAEA,MAAM,cAAc;AAEb,MAAM,iCAET,CAAC,UAAU,OAAO;AAChB,MAAA,OAAe,QAAQ;AAC3B,MAAI,aAAa;AAEjB,QAAM,WAAW,YAAY;AAC3B,QAAI,aAAa;AACf;AAAA,IACF;AAEA,YAAQ,IAAI;AAER,QAAA;AACF,YAAM,UAAU,UAAU;AAAA,aACnB,KAAK;AACZ,cAAQ,MAAM,GAAG;AACjB,cAAQ,KAAK;AAAA,IAAA,UACb;AACA,cAAQ,KAAK;AAAA,IACf;AAAA,EAAA;AAGI,QAAA,aAAa,OACjB,MACA,UACG;AACG,UAAA,WAAW,UAAU,IAAI;AAE/B,QAAI,aAAa,KAAK,MAAM,gBAAgB,GAAG;AAChC,mBAAA,MAAM,UAAU,SAAS,IAAI;AAC1C;AAAA,IACF;AAEA,QACE,UAAU,YACV,aAAa,QAAQ,WAAW,kBAAkB,GAClD;AAEA;AAAA,IACF;AAEM,UAAA,sBAAsB,WAAW,WAAW,eAAe,IAC7D,WAAW,kBACX,KAAK,MAAM,WAAW,eAAe;AAErC,QAAA,SAAS,WAAW,mBAAmB,GAAG;AAC5C,YAAM,SAAS;AAAA,IACjB;AAAA,EAAA;AAGI,QAAA,MAAyD,OAAO,OAAO;AACvE,QAAA,WAAW,yBAAyB,MAAM;AAC5C,YAAM,GAAG;AAAA,IACX;AAAA,EAAA;AAGK,SAAA;AAAA,IACL,MAAM;AAAA,IACN,MAAM,YAAY,IAAI,EAAE,SAAS;AAC/B,YAAM,IAAI,YAAY;AACd,cAAA,WAAW,IAAI,KAAK;AAAA,MAAA,CAC3B;AAAA,IACH;AAAA,IACA,MAAM;AAAA,MACJ,MAAM,eAAe,QAAQ;AAC3B,eAAO,OAAO;AACD,qBAAA,MAAM,UAAU,SAAS,IAAI;AAE1C,cAAM,IAAI,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,IACA,MAAM,OAAO,UAAU;AACR,mBAAA,MAAM,UAAU,SAAS,IAAI;AAE1C,YAAM,IAAI,QAAQ;AAElB,eAAS,MAAM,SAAS,IAAI,aAAa,YAAY;AACnD,cAAM,IAAI,QAAQ;AAAA,MAAA,CACnB;AAAA,IACH;AAAA,EAAA;AAEJ;"}
@@ -0,0 +1,107 @@
1
+ import { configSchema, Config } from './config.js';
2
+
3
+ /**
4
+ * @example
5
+ * ```ts
6
+ * export default defineConfig({
7
+ * // ...
8
+ * tools: {
9
+ * rspack: {
10
+ * plugins: [TanStackRouterGeneratorRspack()],
11
+ * },
12
+ * },
13
+ * })
14
+ * ```
15
+ */
16
+ declare const TanStackRouterGeneratorRspack: (options?: Partial<{
17
+ routeFileIgnorePrefix: string;
18
+ routesDirectory: string;
19
+ generatedRouteTree: string;
20
+ quoteStyle: "single" | "double";
21
+ semicolons: boolean;
22
+ disableTypes: boolean;
23
+ addExtensions: boolean;
24
+ disableLogging: boolean;
25
+ routeTreeFileHeader: string[];
26
+ routeTreeFileFooter: string[];
27
+ enableRouteGeneration?: boolean | undefined;
28
+ experimental?: {
29
+ enableCodeSplitting?: boolean | undefined;
30
+ } | undefined;
31
+ routeFilePrefix?: string | undefined;
32
+ routeFileIgnorePattern?: string | undefined;
33
+ }> | undefined) => _rspack_core_dist_config_zod.RspackPluginInstance;
34
+ /**
35
+ * @experimental Do not use this plugin yet
36
+ *
37
+ * Unplugin's Rspack integration doesn't support the `resolveId` and `transform` hooks.
38
+ * The code-splitter won't work with Rspack and will probably break your dev and build.
39
+ *
40
+ * If you're familiar with Rspack and know how to overcome our `resolveId` and `transform`
41
+ * limitations, please let us know.
42
+ * We'd love to support it, but we're not sure how to do it yet 😅.
43
+ *
44
+ * @example
45
+ * ```ts
46
+ * export default defineConfig({
47
+ * // ...
48
+ * tools: {
49
+ * rspack: {
50
+ * plugins: [unstable_TanStackRouterCodeSplitterRspack()],
51
+ * },
52
+ * },
53
+ * })
54
+ * ```
55
+ */
56
+ declare const unstable_TanStackRouterCodeSplitterRspack: (options?: Partial<{
57
+ routeFileIgnorePrefix: string;
58
+ routesDirectory: string;
59
+ generatedRouteTree: string;
60
+ quoteStyle: "single" | "double";
61
+ semicolons: boolean;
62
+ disableTypes: boolean;
63
+ addExtensions: boolean;
64
+ disableLogging: boolean;
65
+ routeTreeFileHeader: string[];
66
+ routeTreeFileFooter: string[];
67
+ enableRouteGeneration?: boolean | undefined;
68
+ experimental?: {
69
+ enableCodeSplitting?: boolean | undefined;
70
+ } | undefined;
71
+ routeFilePrefix?: string | undefined;
72
+ routeFileIgnorePattern?: string | undefined;
73
+ }> | undefined) => _rspack_core_dist_config_zod.RspackPluginInstance;
74
+ /**
75
+ * @example
76
+ * ```ts
77
+ * export default defineConfig({
78
+ * // ...
79
+ * tools: {
80
+ * rspack: {
81
+ * plugins: [TanStackRouterRspack()],
82
+ * },
83
+ * },
84
+ * })
85
+ * ```
86
+ */
87
+ declare const TanStackRouterRspack: (options?: Partial<{
88
+ routeFileIgnorePrefix: string;
89
+ routesDirectory: string;
90
+ generatedRouteTree: string;
91
+ quoteStyle: "single" | "double";
92
+ semicolons: boolean;
93
+ disableTypes: boolean;
94
+ addExtensions: boolean;
95
+ disableLogging: boolean;
96
+ routeTreeFileHeader: string[];
97
+ routeTreeFileFooter: string[];
98
+ enableRouteGeneration?: boolean | undefined;
99
+ experimental?: {
100
+ enableCodeSplitting?: boolean | undefined;
101
+ } | undefined;
102
+ routeFilePrefix?: string | undefined;
103
+ routeFileIgnorePattern?: string | undefined;
104
+ }> | undefined) => _rspack_core_dist_config_zod.RspackPluginInstance;
105
+ export default TanStackRouterRspack;
106
+ export { configSchema, TanStackRouterRspack, TanStackRouterGeneratorRspack, unstable_TanStackRouterCodeSplitterRspack, };
107
+ export type { Config };
@@ -0,0 +1,20 @@
1
+ import { createRspackPlugin } from "unplugin";
2
+ import { unpluginRouterCodeSplitterFactory } from "./code-splitter.js";
3
+ import { configSchema } from "./config.js";
4
+ import { unpluginRouterGeneratorFactory } from "./router-generator.js";
5
+ import { unpluginRouterComposedFactory } from "./composed.js";
6
+ const TanStackRouterGeneratorRspack = /* @__PURE__ */ createRspackPlugin(
7
+ unpluginRouterGeneratorFactory
8
+ );
9
+ const unstable_TanStackRouterCodeSplitterRspack = /* @__PURE__ */ createRspackPlugin(unpluginRouterCodeSplitterFactory);
10
+ const TanStackRouterRspack = /* @__PURE__ */ createRspackPlugin(
11
+ unpluginRouterComposedFactory
12
+ );
13
+ export {
14
+ TanStackRouterGeneratorRspack,
15
+ TanStackRouterRspack,
16
+ configSchema,
17
+ TanStackRouterRspack as default,
18
+ unstable_TanStackRouterCodeSplitterRspack
19
+ };
20
+ //# sourceMappingURL=rspack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rspack.js","sources":["../../src/rspack.ts"],"sourcesContent":["import { createRspackPlugin } from 'unplugin'\nimport { unpluginRouterCodeSplitterFactory } from './code-splitter'\nimport { configSchema } from './config'\nimport { unpluginRouterGeneratorFactory } from './router-generator'\nimport { unpluginRouterComposedFactory } from './composed'\nimport type { Config } from './config'\n\n/**\n * @example\n * ```ts\n * export default defineConfig({\n * // ...\n * tools: {\n * rspack: {\n * plugins: [TanStackRouterGeneratorRspack()],\n * },\n * },\n * })\n * ```\n */\nconst TanStackRouterGeneratorRspack = /* #__PURE__ */ createRspackPlugin(\n unpluginRouterGeneratorFactory,\n)\n\n/**\n * @experimental Do not use this plugin yet\n *\n * Unplugin's Rspack integration doesn't support the `resolveId` and `transform` hooks.\n * The code-splitter won't work with Rspack and will probably break your dev and build.\n *\n * If you're familiar with Rspack and know how to overcome our `resolveId` and `transform`\n * limitations, please let us know.\n * We'd love to support it, but we're not sure how to do it yet 😅.\n *\n * @example\n * ```ts\n * export default defineConfig({\n * // ...\n * tools: {\n * rspack: {\n * plugins: [unstable_TanStackRouterCodeSplitterRspack()],\n * },\n * },\n * })\n * ```\n */\nconst unstable_TanStackRouterCodeSplitterRspack =\n /* #__PURE__ */ createRspackPlugin(unpluginRouterCodeSplitterFactory)\n\n/**\n * @example\n * ```ts\n * export default defineConfig({\n * // ...\n * tools: {\n * rspack: {\n * plugins: [TanStackRouterRspack()],\n * },\n * },\n * })\n * ```\n */\nconst TanStackRouterRspack = /* #__PURE__ */ createRspackPlugin(\n unpluginRouterComposedFactory,\n)\n\nexport default TanStackRouterRspack\nexport {\n configSchema,\n TanStackRouterRspack,\n TanStackRouterGeneratorRspack,\n unstable_TanStackRouterCodeSplitterRspack,\n}\nexport type { Config }\n"],"names":[],"mappings":";;;;;AAoBA,MAAM,gCAAgD;AAAA,EACpD;AACF;AAwBM,MAAA,+EAC+B,iCAAiC;AAetE,MAAM,uBAAuC;AAAA,EAC3C;AACF;"}
@@ -1,6 +1,14 @@
1
1
  import { configSchema, Config } from './config.js';
2
- import { VitePlugin } from 'unplugin';
3
2
 
3
+ /**
4
+ * @example
5
+ * ```ts
6
+ * export default defineConfig({
7
+ * plugins: [TanStackRouterGeneratorVite()],
8
+ * // ...
9
+ * })
10
+ * ```
11
+ */
4
12
  declare const TanStackRouterGeneratorVite: (options?: Partial<{
5
13
  routeFileIgnorePrefix: string;
6
14
  routesDirectory: string;
@@ -18,7 +26,16 @@ declare const TanStackRouterGeneratorVite: (options?: Partial<{
18
26
  } | undefined;
19
27
  routeFilePrefix?: string | undefined;
20
28
  routeFileIgnorePattern?: string | undefined;
21
- }> | undefined) => VitePlugin<any> | VitePlugin<any>[];
29
+ }> | undefined) => import('vite').Plugin<any> | import('vite').Plugin<any>[];
30
+ /**
31
+ * @example
32
+ * ```ts
33
+ * export default defineConfig({
34
+ * plugins: [TanStackRouterCodeSplitterVite()],
35
+ * // ...
36
+ * })
37
+ * ```
38
+ */
22
39
  declare const TanStackRouterCodeSplitterVite: (options?: Partial<{
23
40
  routeFileIgnorePrefix: string;
24
41
  routesDirectory: string;
@@ -36,7 +53,34 @@ declare const TanStackRouterCodeSplitterVite: (options?: Partial<{
36
53
  } | undefined;
37
54
  routeFilePrefix?: string | undefined;
38
55
  routeFileIgnorePattern?: string | undefined;
39
- }> | undefined) => VitePlugin<any> | VitePlugin<any>[];
40
- declare function TanStackRouterVite(inlineConfig?: Partial<Config>): Array<VitePlugin>;
56
+ }> | undefined) => import('vite').Plugin<any> | import('vite').Plugin<any>[];
57
+ /**
58
+ * @example
59
+ * ```ts
60
+ * export default defineConfig({
61
+ * plugins: [TanStackRouterVite()],
62
+ * // ...
63
+ * })
64
+ * ```
65
+ */
66
+ declare const TanStackRouterVite: (options?: Partial<{
67
+ routeFileIgnorePrefix: string;
68
+ routesDirectory: string;
69
+ generatedRouteTree: string;
70
+ quoteStyle: "single" | "double";
71
+ semicolons: boolean;
72
+ disableTypes: boolean;
73
+ addExtensions: boolean;
74
+ disableLogging: boolean;
75
+ routeTreeFileHeader: string[];
76
+ routeTreeFileFooter: string[];
77
+ enableRouteGeneration?: boolean | undefined;
78
+ experimental?: {
79
+ enableCodeSplitting?: boolean | undefined;
80
+ } | undefined;
81
+ routeFilePrefix?: string | undefined;
82
+ routeFileIgnorePattern?: string | undefined;
83
+ }> | undefined) => import('vite').Plugin<any> | import('vite').Plugin<any>[];
84
+ export default TanStackRouterVite;
41
85
  export { configSchema, TanStackRouterGeneratorVite, TanStackRouterCodeSplitterVite, TanStackRouterVite, };
42
86
  export type { Config };
package/dist/esm/vite.js CHANGED
@@ -1,18 +1,20 @@
1
- import { unpluginRouterCodeSplitter } from "./code-splitter.js";
1
+ import { createVitePlugin } from "unplugin";
2
+ import { unpluginRouterCodeSplitterFactory } from "./code-splitter.js";
2
3
  import { configSchema } from "./config.js";
3
- import { unpluginRouterGenerator } from "./router-generator.js";
4
- const TanStackRouterGeneratorVite = unpluginRouterGenerator.vite;
5
- const TanStackRouterCodeSplitterVite = unpluginRouterCodeSplitter.vite;
6
- function TanStackRouterVite(inlineConfig) {
7
- return [
8
- TanStackRouterGeneratorVite(inlineConfig),
9
- TanStackRouterCodeSplitterVite(inlineConfig)
10
- ];
11
- }
4
+ import { unpluginRouterGeneratorFactory } from "./router-generator.js";
5
+ import { unpluginRouterComposedFactory } from "./composed.js";
6
+ const TanStackRouterGeneratorVite = createVitePlugin(
7
+ unpluginRouterGeneratorFactory
8
+ );
9
+ const TanStackRouterCodeSplitterVite = createVitePlugin(
10
+ unpluginRouterCodeSplitterFactory
11
+ );
12
+ const TanStackRouterVite = createVitePlugin(unpluginRouterComposedFactory);
12
13
  export {
13
14
  TanStackRouterCodeSplitterVite,
14
15
  TanStackRouterGeneratorVite,
15
16
  TanStackRouterVite,
16
- configSchema
17
+ configSchema,
18
+ TanStackRouterVite as default
17
19
  };
18
20
  //# sourceMappingURL=vite.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vite.js","sources":["../../src/vite.ts"],"sourcesContent":["import { unpluginRouterCodeSplitter } from './code-splitter'\nimport { configSchema } from './config'\nimport { unpluginRouterGenerator } from './router-generator'\n\nimport type { Config } from './config'\nimport type { VitePlugin } from 'unplugin'\n\nconst TanStackRouterGeneratorVite = unpluginRouterGenerator.vite\nconst TanStackRouterCodeSplitterVite = unpluginRouterCodeSplitter.vite\n\nfunction TanStackRouterVite(inlineConfig?: Partial<Config>): Array<VitePlugin> {\n return [\n TanStackRouterGeneratorVite(inlineConfig) as VitePlugin,\n TanStackRouterCodeSplitterVite(inlineConfig) as VitePlugin,\n ]\n}\n\nexport {\n configSchema,\n TanStackRouterGeneratorVite,\n TanStackRouterCodeSplitterVite,\n TanStackRouterVite,\n}\nexport type { Config }\n"],"names":[],"mappings":";;;AAOA,MAAM,8BAA8B,wBAAwB;AAC5D,MAAM,iCAAiC,2BAA2B;AAElE,SAAS,mBAAmB,cAAmD;AACtE,SAAA;AAAA,IACL,4BAA4B,YAAY;AAAA,IACxC,+BAA+B,YAAY;AAAA,EAAA;AAE/C;"}
1
+ {"version":3,"file":"vite.js","sources":["../../src/vite.ts"],"sourcesContent":["import { createVitePlugin } from 'unplugin'\nimport { unpluginRouterCodeSplitterFactory } from './code-splitter'\nimport { configSchema } from './config'\nimport { unpluginRouterGeneratorFactory } from './router-generator'\nimport { unpluginRouterComposedFactory } from './composed'\n\nimport type { Config } from './config'\n\n/**\n * @example\n * ```ts\n * export default defineConfig({\n * plugins: [TanStackRouterGeneratorVite()],\n * // ...\n * })\n * ```\n */\nconst TanStackRouterGeneratorVite = createVitePlugin(\n unpluginRouterGeneratorFactory,\n)\n\n/**\n * @example\n * ```ts\n * export default defineConfig({\n * plugins: [TanStackRouterCodeSplitterVite()],\n * // ...\n * })\n * ```\n */\nconst TanStackRouterCodeSplitterVite = createVitePlugin(\n unpluginRouterCodeSplitterFactory,\n)\n\n/**\n * @example\n * ```ts\n * export default defineConfig({\n * plugins: [TanStackRouterVite()],\n * // ...\n * })\n * ```\n */\nconst TanStackRouterVite = createVitePlugin(unpluginRouterComposedFactory)\n\nexport default TanStackRouterVite\nexport {\n configSchema,\n TanStackRouterGeneratorVite,\n TanStackRouterCodeSplitterVite,\n TanStackRouterVite,\n}\nexport type { Config }\n"],"names":[],"mappings":";;;;;AAiBA,MAAM,8BAA8B;AAAA,EAClC;AACF;AAWA,MAAM,iCAAiC;AAAA,EACrC;AACF;AAWM,MAAA,qBAAqB,iBAAiB,6BAA6B;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/router-plugin",
3
- "version": "1.39.4",
3
+ "version": "1.39.9",
4
4
  "description": "",
5
5
  "author": "Tanner Linsley",
6
6
  "license": "MIT",
@@ -36,6 +36,16 @@
36
36
  "default": "./dist/cjs/vite.cjs"
37
37
  }
38
38
  },
39
+ "./rspack": {
40
+ "import": {
41
+ "types": "./dist/esm/rspack.d.ts",
42
+ "default": "./dist/esm/rspack.js"
43
+ },
44
+ "require": {
45
+ "types": "./dist/cjs/rspack.d.cts",
46
+ "default": "./dist/cjs/rspack.cjs"
47
+ }
48
+ },
39
49
  "./package.json": "./package.json"
40
50
  },
41
51
  "sideEffects": false,
@@ -56,11 +66,15 @@
56
66
  "src/**"
57
67
  ],
58
68
  "peerDependencies": {
59
- "vite": ">=5"
69
+ "vite": ">=5",
70
+ "@rsbuild/core": ">=0.7.9"
60
71
  },
61
72
  "peerDependenciesMeta": {
62
73
  "vite": {
63
74
  "optional": true
75
+ },
76
+ "@rsbuild/core": {
77
+ "optional": true
64
78
  }
65
79
  },
66
80
  "dependencies": {
@@ -1,6 +1,5 @@
1
1
  import { isAbsolute, join } from 'node:path'
2
2
  import { fileURLToPath, pathToFileURL } from 'node:url'
3
- import { createUnplugin } from 'unplugin'
4
3
 
5
4
  import { compileAst } from './ast'
6
5
  import { compileFile, splitFile } from './compilers'
@@ -8,7 +7,7 @@ import { getConfig } from './config'
8
7
  import { splitPrefix } from './constants'
9
8
 
10
9
  import type { Config } from './config'
11
- import type { UnpluginFactory } from 'unplugin'
10
+ import type { UnpluginContextMeta, UnpluginFactory } from 'unplugin'
12
11
 
13
12
  function capitalizeFirst(str: string): string {
14
13
  return str.charAt(0).toUpperCase() + str.slice(1)
@@ -22,19 +21,24 @@ function fileIsInRoutesDirectory(filePath: string, routesDirectory: string) {
22
21
  return filePath.startsWith(routesDirectoryPath)
23
22
  }
24
23
 
25
- const bannedBeforeExternalPlugins = [
24
+ type BannedBeforeExternalPlugin = {
25
+ identifier: string
26
+ pkg: string
27
+ usage: string
28
+ frameworks: Array<UnpluginContextMeta['framework']>
29
+ }
30
+
31
+ const bannedBeforeExternalPlugins: Array<BannedBeforeExternalPlugin> = [
26
32
  {
27
33
  identifier: '@react-refresh',
28
34
  pkg: '@vitejs/plugin-react',
29
35
  usage: 'viteReact()',
36
+ frameworks: ['vite'],
30
37
  },
31
38
  ]
32
39
 
33
40
  class FoundPluginInBeforeCode extends Error {
34
- constructor(
35
- externalPlugin: (typeof bannedBeforeExternalPlugins)[number],
36
- framework: string,
37
- ) {
41
+ constructor(externalPlugin: BannedBeforeExternalPlugin, framework: string) {
38
42
  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:
39
43
  e.g.
40
44
  plugins: [
@@ -45,10 +49,11 @@ plugins: [
45
49
  }
46
50
  }
47
51
 
48
- export const unpluginFactory: UnpluginFactory<Partial<Config> | undefined> = (
49
- options = {},
50
- { framework },
51
- ) => {
52
+ const PLUGIN_NAME = 'unplugin:router-code-splitter'
53
+
54
+ export const unpluginRouterCodeSplitterFactory: UnpluginFactory<
55
+ Partial<Config> | undefined
56
+ > = (options = {}, { framework }) => {
52
57
  const debug = Boolean(process.env.TSR_VITE_DEBUG)
53
58
 
54
59
  let ROOT: string = process.cwd()
@@ -117,6 +122,7 @@ export const unpluginFactory: UnpluginFactory<Partial<Config> | undefined> = (
117
122
  return {
118
123
  name: 'router-code-splitter-plugin',
119
124
  enforce: 'pre',
125
+
120
126
  resolveId(source) {
121
127
  if (!userConfig.experimental?.enableCodeSplitting) {
122
128
  return null
@@ -127,6 +133,7 @@ export const unpluginFactory: UnpluginFactory<Partial<Config> | undefined> = (
127
133
  }
128
134
  return null
129
135
  },
136
+
130
137
  async transform(code, id) {
131
138
  if (!userConfig.experimental?.enableCodeSplitting) {
132
139
  return null
@@ -143,6 +150,10 @@ export const unpluginFactory: UnpluginFactory<Partial<Config> | undefined> = (
143
150
  (code.includes('createRoute(') || code.includes('createFileRoute('))
144
151
  ) {
145
152
  for (const externalPlugin of bannedBeforeExternalPlugins) {
153
+ if (!externalPlugin.frameworks.includes(framework)) {
154
+ continue
155
+ }
156
+
146
157
  if (code.includes(externalPlugin.identifier)) {
147
158
  throw new FoundPluginInBeforeCode(externalPlugin, framework)
148
159
  }
@@ -153,14 +164,16 @@ export const unpluginFactory: UnpluginFactory<Partial<Config> | undefined> = (
153
164
 
154
165
  return null
155
166
  },
167
+
156
168
  vite: {
157
169
  async configResolved(config) {
158
170
  ROOT = config.root
159
171
  userConfig = await getConfig(options, ROOT)
160
172
  },
161
173
  },
174
+
175
+ async rspack(compiler) {
176
+ userConfig = await getConfig(options, ROOT)
177
+ },
162
178
  }
163
179
  }
164
-
165
- export const unpluginRouterCodeSplitter =
166
- /* #__PURE__ */ createUnplugin(unpluginFactory)
@@ -0,0 +1,30 @@
1
+ import { unpluginRouterGeneratorFactory } from './router-generator'
2
+ import { unpluginRouterCodeSplitterFactory } from './code-splitter'
3
+
4
+ import type { Config } from './config'
5
+ import type { UnpluginFactory } from 'unplugin'
6
+
7
+ export const unpluginRouterComposedFactory: UnpluginFactory<
8
+ Partial<Config> | undefined
9
+ > = (options = {}, meta) => {
10
+ const routerGenerator = unpluginRouterGeneratorFactory(options, meta)
11
+
12
+ const routerGeneratorOptions = Array.isArray(routerGenerator)
13
+ ? routerGenerator
14
+ : [routerGenerator]
15
+
16
+ const routerCodeSplitter = unpluginRouterCodeSplitterFactory(options, meta)
17
+ let routerCodeSplitterOptions = Array.isArray(routerCodeSplitter)
18
+ ? routerCodeSplitter
19
+ : [routerCodeSplitter]
20
+
21
+ // Rspack doesn't support the `resolveId` and `transform` hooks provided by unplugin
22
+ // so we need to disable the code splitter for it
23
+ // If you're using Rspack, and know how to implement the code splitting, please let us know
24
+ // We'd love to support it, but we're not sure how to do it yet
25
+ if (meta.framework === 'rspack') {
26
+ routerCodeSplitterOptions = []
27
+ }
28
+
29
+ return [...routerGeneratorOptions, ...routerCodeSplitterOptions]
30
+ }
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { unpluginRouterCodeSplitter } from './code-splitter'
2
- export { unpluginRouterGenerator } from './router-generator'
1
+ export { unpluginRouterCodeSplitterFactory } from './code-splitter'
2
+ export { unpluginRouterGeneratorFactory } from './router-generator'
3
3
  export { configSchema } from './config'
4
4
  export type { Config } from './config'
@@ -1,11 +1,10 @@
1
1
  import { isAbsolute, join, normalize, resolve } from 'node:path'
2
- import { createUnplugin } from 'unplugin'
3
2
  import { generator } from '@tanstack/router-generator'
4
3
 
5
4
  import { getConfig } from './config'
6
5
  import { CONFIG_FILE_NAME } from './constants'
7
- import type { Config } from './config'
8
6
  import type { UnpluginFactory } from 'unplugin'
7
+ import type { Config } from './config'
9
8
 
10
9
  let lock = false
11
10
  const checkLock = () => lock
@@ -13,9 +12,11 @@ const setLock = (bool: boolean) => {
13
12
  lock = bool
14
13
  }
15
14
 
16
- const unpluginFactory: UnpluginFactory<Partial<Config> | undefined> = (
17
- options = {},
18
- ) => {
15
+ const PLUGIN_NAME = 'unplugin:router-generator'
16
+
17
+ export const unpluginRouterGeneratorFactory: UnpluginFactory<
18
+ Partial<Config> | undefined
19
+ > = (options = {}) => {
19
20
  let ROOT: string = process.cwd()
20
21
  let userConfig = options as Config
21
22
 
@@ -85,8 +86,14 @@ const unpluginFactory: UnpluginFactory<Partial<Config> | undefined> = (
85
86
  await run(generate)
86
87
  },
87
88
  },
89
+ async rspack(compiler) {
90
+ userConfig = await getConfig(options, ROOT)
91
+
92
+ await run(generate)
93
+
94
+ compiler.hooks.watchRun.tap(PLUGIN_NAME, async () => {
95
+ await run(generate)
96
+ })
97
+ },
88
98
  }
89
99
  }
90
-
91
- export const unpluginRouterGenerator =
92
- /* #__PURE__ */ createUnplugin(unpluginFactory)