@bleedingdev/modern-js-plugin-tanstack 3.9.0-ultramodern.3 → 3.9.0-ultramodern.5

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 (80) hide show
  1. package/dist/cjs/cli/index.js +9 -0
  2. package/dist/cjs/cli/tanstackTypes/source.js +3 -1
  3. package/dist/cjs/runtime/basepathRewrite.js +13 -6
  4. package/dist/cjs/runtime/lifecycle.js +7 -7
  5. package/dist/cjs/runtime/plugin.js +1 -1
  6. package/dist/cjs/runtime/plugin.node.js +5 -1
  7. package/dist/cjs/runtime/prefetchLink.js +2 -7
  8. package/dist/cjs/runtime/register.js +2 -2
  9. package/dist/cjs/runtime/routeTree/construction.js +2 -0
  10. package/dist/cjs/runtime/router.js +25 -9
  11. package/dist/cjs/runtime/state.js +2 -2
  12. package/dist/cjs/runtime/utils.js +2 -0
  13. package/dist/esm/cli/index.mjs +9 -0
  14. package/dist/esm/cli/tanstackTypes/source.mjs +3 -1
  15. package/dist/esm/runtime/basepathRewrite.mjs +10 -3
  16. package/dist/esm/runtime/lifecycle.mjs +1 -1
  17. package/dist/esm/runtime/plugin.mjs +1 -1
  18. package/dist/esm/runtime/plugin.node.mjs +5 -1
  19. package/dist/esm/runtime/prefetchLink.mjs +1 -6
  20. package/dist/esm/runtime/register.mjs +1 -1
  21. package/dist/esm/runtime/routeTree/construction.mjs +2 -0
  22. package/dist/esm/runtime/router.mjs +27 -11
  23. package/dist/esm/runtime/state.mjs +1 -1
  24. package/dist/esm/runtime/utils.mjs +2 -0
  25. package/dist/esm-node/cli/index.mjs +9 -0
  26. package/dist/esm-node/cli/tanstackTypes/source.mjs +3 -1
  27. package/dist/esm-node/runtime/basepathRewrite.mjs +10 -3
  28. package/dist/esm-node/runtime/lifecycle.mjs +1 -1
  29. package/dist/esm-node/runtime/plugin.mjs +1 -1
  30. package/dist/esm-node/runtime/plugin.node.mjs +5 -1
  31. package/dist/esm-node/runtime/prefetchLink.mjs +1 -6
  32. package/dist/esm-node/runtime/register.mjs +1 -1
  33. package/dist/esm-node/runtime/routeTree/construction.mjs +2 -0
  34. package/dist/esm-node/runtime/router.mjs +27 -11
  35. package/dist/esm-node/runtime/state.mjs +1 -1
  36. package/dist/esm-node/runtime/utils.mjs +2 -0
  37. package/dist/types/runtime/basepathRewrite.d.ts +2 -1
  38. package/dist/types/runtime/lifecycle.d.ts +9 -2
  39. package/dist/types/runtime/register.d.ts +1 -1
  40. package/dist/types/runtime/router.d.ts +2 -13
  41. package/dist/types/runtime/state.d.ts +1 -1
  42. package/dist/types/runtime/types.d.ts +2 -1
  43. package/package.json +12 -9
  44. package/rstest.config.mts +1 -6
  45. package/src/cli/index.ts +10 -0
  46. package/src/cli/tanstackTypes/source.ts +3 -1
  47. package/src/runtime/basepathRewrite.ts +11 -2
  48. package/src/runtime/lifecycle.ts +14 -3
  49. package/src/runtime/plugin.node.tsx +9 -2
  50. package/src/runtime/plugin.tsx +5 -1
  51. package/src/runtime/prefetchLink.tsx +1 -23
  52. package/src/runtime/register.ts +1 -1
  53. package/src/runtime/routeTree/construction.ts +2 -0
  54. package/src/runtime/router.ts +25 -40
  55. package/src/runtime/state.ts +1 -1
  56. package/src/runtime/types.ts +2 -2
  57. package/src/runtime/utils.tsx +3 -1
  58. package/tests/realm-isolation.test.ts +8 -2
  59. package/tests/router/cli.test.ts +108 -9
  60. package/tests/router/dataMutation.test.tsx +17 -121
  61. package/tests/router/flightSerialization.roundtrip.test.tsx +9 -6
  62. package/tests/router/generateRouteArtifacts.test.ts +69 -29
  63. package/tests/router/hooks.test.ts +1 -18
  64. package/tests/router/loaderBridge.test.ts +0 -77
  65. package/tests/router/localisedIdentity.test.tsx +95 -0
  66. package/tests/router/prefetchLink.test.tsx +28 -16
  67. package/tests/router/prefetchLinkPreload.test.tsx +21 -28
  68. package/tests/router/register.test.ts +1 -1
  69. package/tests/router/routeHooks.test.ts +41 -105
  70. package/tests/router/routeTree.test.ts +0 -212
  71. package/tests/router/routerCompatibility.test.ts +32 -9
  72. package/tests/router/rsc.test.tsx +118 -136
  73. package/tests/router/rscDecoderSecurity.test.ts +24 -53
  74. package/tests/router/serverPlugin.test.ts +43 -1
  75. package/tests/router/tanstackTypes.test.ts +24 -364
  76. package/tests/router/fastDefaults.test.ts +0 -32
  77. package/tests/router/hydrationBoundary.test.tsx +0 -23
  78. package/tests/router/packageSurface.test.ts +0 -24
  79. package/tests/router/preloadRedirect.test.ts +0 -64
  80. package/tests/router/rscPayloadRouterMatrix.test.ts +0 -197
@@ -91,6 +91,15 @@ var __webpack_exports__ = {};
91
91
  '@modern-js/runtime'
92
92
  ],
93
93
  setup: (api)=>{
94
+ const { srcDirectory, serverCompileExcludedFiles = [] } = api.getAppContext();
95
+ api.updateAppContext({
96
+ serverCompileExcludedFiles: [
97
+ ...new Set([
98
+ ...serverCompileExcludedFiles,
99
+ external_node_path_default().join(srcDirectory, generatedDirName, 'register.gen.d.ts')
100
+ ])
101
+ ]
102
+ });
94
103
  const nestedRoutesForServer = {};
95
104
  const isTanstackEntrypoint = (entrypoint)=>{
96
105
  const { getEntrypointRoutesDir } = getRuntimeRouterCli();
@@ -30,11 +30,13 @@ __webpack_require__.r(__webpack_exports__);
30
30
  __webpack_require__.d(__webpack_exports__, {
31
31
  generateTanstackRouterTypesSourceForEntry: ()=>generateTanstackRouterTypesSourceForEntry
32
32
  });
33
+ const i18n_runtime_extensions_namespaceObject = require("@modern-js/i18n-runtime-extensions");
33
34
  const cli_namespaceObject = require("@modern-js/runtime/cli");
34
35
  const utils_namespaceObject = require("@modern-js/utils");
35
36
  const external_shared_js_namespaceObject = require("./shared.js");
36
37
  async function generateTanstackRouterTypesSourceForEntry(opts) {
37
- const { appContext, entryName, generatedDirName = 'modern-tanstack', routes } = opts;
38
+ const { appContext, entryName, generatedDirName = 'modern-tanstack', routes: rawRoutes } = opts;
39
+ const routes = (0, i18n_runtime_extensions_namespaceObject.canonicaliseLocalisedRoutes)(rawRoutes);
38
40
  const outDir = utils_namespaceObject.upath.join(appContext.srcDirectory, generatedDirName, entryName);
39
41
  const rootModern = routes.find((r)=>{
40
42
  const extras = r;
@@ -27,19 +27,25 @@ var __webpack_require__ = {};
27
27
  })();
28
28
  var __webpack_exports__ = {};
29
29
  __webpack_require__.r(__webpack_exports__);
30
+ __webpack_require__.d(__webpack_exports__, {
31
+ createModernBasepathRewrite: ()=>createModernBasepathRewrite
32
+ });
33
+ const i18n_runtime_extensions_namespaceObject = require("@modern-js/i18n-runtime-extensions");
34
+ const react_router_namespaceObject = require("@tanstack/react-router");
30
35
  function normalizeBasepath(basepath) {
31
36
  if (!basepath) return '/';
32
37
  let normalized = basepath.startsWith('/') ? basepath : `/${basepath}`;
33
38
  if (normalized.length > 1 && normalized.endsWith('/')) normalized = normalized.slice(0, -1);
34
39
  return normalized || '/';
35
40
  }
36
- function createModernBasepathRewrite(basepath, caseSensitive = false) {
41
+ function createModernBasepathRewrite(basepath, caseSensitive = false, routes = []) {
42
+ const localisedRewrite = (0, i18n_runtime_extensions_namespaceObject.createLocalisedRouteRewrite)(routes);
37
43
  const normalizedBasepath = normalizeBasepath(basepath);
38
- if ('/' === normalizedBasepath) return;
44
+ if ('/' === normalizedBasepath) return localisedRewrite;
39
45
  const normalizedBasepathWithSlash = `${normalizedBasepath}/`;
40
46
  const checkBasepath = caseSensitive ? normalizedBasepath : normalizedBasepath.toLowerCase();
41
47
  const checkBasepathWithSlash = caseSensitive ? normalizedBasepathWithSlash : normalizedBasepathWithSlash.toLowerCase();
42
- return {
48
+ const basepathRewrite = {
43
49
  input: ({ url })=>{
44
50
  const pathname = caseSensitive ? url.pathname : url.pathname.toLowerCase();
45
51
  if (pathname === checkBasepath) url.pathname = '/';
@@ -53,10 +59,11 @@ function createModernBasepathRewrite(basepath, caseSensitive = false) {
53
59
  return url;
54
60
  }
55
61
  };
62
+ return localisedRewrite ? (0, react_router_namespaceObject.composeRewrites)([
63
+ basepathRewrite,
64
+ localisedRewrite
65
+ ]) : basepathRewrite;
56
66
  }
57
- __webpack_require__.d(__webpack_exports__, {
58
- createModernBasepathRewrite: ()=>createModernBasepathRewrite
59
- });
60
67
  exports.createModernBasepathRewrite = __webpack_exports__.createModernBasepathRewrite;
61
68
  for(var __rspack_i in __webpack_exports__)if (-1 === [
62
69
  "createModernBasepathRewrite"
@@ -28,14 +28,14 @@ var __webpack_require__ = {};
28
28
  var __webpack_exports__ = {};
29
29
  __webpack_require__.r(__webpack_exports__);
30
30
  __webpack_require__.d(__webpack_exports__, {
31
- applyRouterRuntimeState: ()=>context_namespaceObject.applyRouterRuntimeState,
32
- applyRouterServerPrepareResult: ()=>context_namespaceObject.applyRouterServerPrepareResult,
33
- createRouterRuntimeState: ()=>context_namespaceObject.createRouterRuntimeState,
34
- createRouterServerSnapshot: ()=>context_namespaceObject.createRouterServerSnapshot,
35
- getRouterRuntimeState: ()=>context_namespaceObject.getRouterRuntimeState,
36
- getRouterServerSnapshot: ()=>context_namespaceObject.getRouterServerSnapshot
31
+ applyRouterRuntimeState: ()=>router_state_namespaceObject.applyRouterRuntimeState,
32
+ applyRouterServerPrepareResult: ()=>router_state_namespaceObject.applyRouterServerPrepareResult,
33
+ createRouterRuntimeState: ()=>router_state_namespaceObject.createRouterRuntimeState,
34
+ createRouterServerSnapshot: ()=>router_state_namespaceObject.createRouterServerSnapshot,
35
+ getRouterRuntimeState: ()=>router_state_namespaceObject.getRouterRuntimeState,
36
+ getRouterServerSnapshot: ()=>router_state_namespaceObject.getRouterServerSnapshot
37
37
  });
38
- const context_namespaceObject = require("@modern-js/runtime/context");
38
+ const router_state_namespaceObject = require("@modern-js/runtime-extensions/router-state");
39
39
  exports.applyRouterRuntimeState = __webpack_exports__.applyRouterRuntimeState;
40
40
  exports.applyRouterServerPrepareResult = __webpack_exports__.applyRouterServerPrepareResult;
41
41
  exports.createRouterRuntimeState = __webpack_exports__.createRouterRuntimeState;
@@ -110,7 +110,7 @@ const tanstackRouterPlugin = (userConfig = {})=>{
110
110
  const mergedConfig = getMergedConfig();
111
111
  const { supportHtml5History = true } = mergedConfig;
112
112
  const history = supportHtml5History ? (0, react_router_namespaceObject.createBrowserHistory)() : (0, react_router_namespaceObject.createHashHistory)();
113
- const rewrite = (0, external_basepathRewrite_js_namespaceObject.createModernBasepathRewrite)(_basename);
113
+ const rewrite = (0, external_basepathRewrite_js_namespaceObject.createModernBasepathRewrite)(_basename, false, getRouteObjects());
114
114
  const serializationAdapters = (0, context_namespaceObject.getGlobalEnableRsc)() ? (0, client_js_namespaceObject.getTanstackRscSerializationAdapters)() : void 0;
115
115
  const routerFastDefaults = (0, external_types_js_namespaceObject.getModernTanstackRouterFastDefaults)(mergedConfig);
116
116
  cachedRouter = (0, react_router_namespaceObject.createRouter)({
@@ -43,6 +43,7 @@ const external_hooks_js_namespaceObject = require("./hooks.js");
43
43
  const external_hydrationBoundary_js_namespaceObject = require("./hydrationBoundary.js");
44
44
  const external_lifecycle_js_namespaceObject = require("./lifecycle.js");
45
45
  const external_pluginShared_js_namespaceObject = require("./pluginShared.js");
46
+ const external_prefetchLink_js_namespaceObject = require("./prefetchLink.js");
46
47
  const index_js_namespaceObject = require("./routeTree/index.js");
47
48
  const payloadRouter_js_namespaceObject = require("./rsc/payloadRouter.js");
48
49
  const payloadStorage_js_namespaceObject = require("./rsc/payloadStorage.js");
@@ -68,6 +69,9 @@ const tanstackRouterPlugin = (userConfig = {})=>{
68
69
  routeConfig
69
70
  });
70
71
  if (!modifiedRouteObjects.length) return;
72
+ context.router = {
73
+ Link: external_prefetchLink_js_namespaceObject.Link
74
+ };
71
75
  const { request, nonce, baseUrl, loaderFailureMode = 'errorBoundary' } = context.ssrContext;
72
76
  const _basename = '/' === baseUrl ? (0, external_pluginShared_js_namespaceObject.joinBasename)(baseUrl, basename || '') : baseUrl;
73
77
  const rawRequest = request.raw;
@@ -90,7 +94,7 @@ const tanstackRouterPlugin = (userConfig = {})=>{
90
94
  initialHref
91
95
  ]
92
96
  });
93
- const rewrite = (0, external_basepathRewrite_js_namespaceObject.createModernBasepathRewrite)(_basename);
97
+ const rewrite = (0, external_basepathRewrite_js_namespaceObject.createModernBasepathRewrite)(_basename, false, modifiedRouteObjects);
94
98
  const routerLifecycleContext = {
95
99
  framework: 'tanstack',
96
100
  phase: 'ssr-prepare',
@@ -32,19 +32,14 @@ __webpack_require__.d(__webpack_exports__, {
32
32
  NavLink: ()=>NavLink
33
33
  });
34
34
  const jsx_runtime_namespaceObject = require("react/jsx-runtime");
35
+ const runtime_extensions_namespaceObject = require("@modern-js/runtime-extensions");
35
36
  const react_router_namespaceObject = require("@tanstack/react-router");
36
- function resolvePreloadFromPrefetch(prefetch, preload) {
37
- if (void 0 !== preload) return preload;
38
- if ('none' === prefetch) return false;
39
- if ('intent' === prefetch || 'render' === prefetch || 'viewport' === prefetch) return prefetch;
40
- return 'viewport';
41
- }
42
37
  const LinkComponentImpl = (props)=>{
43
38
  const { prefetch, preload, 'aria-current': ariaCurrentProp, ref, children, ...rest } = props;
44
39
  const hasAriaCurrentOverride = 'aria-current' in props;
45
40
  const linkOptions = {
46
41
  ...rest,
47
- preload: resolvePreloadFromPrefetch(prefetch, preload)
42
+ preload: (0, runtime_extensions_namespaceObject.resolvePreloadFromPrefetch)(prefetch, preload)
48
43
  };
49
44
  const linkProps = (0, react_router_namespaceObject.useLinkProps)(linkOptions, ref);
50
45
  const { disabled: _disabled, type: _type, ...anchorProps } = linkProps;
@@ -30,10 +30,10 @@ __webpack_require__.r(__webpack_exports__);
30
30
  __webpack_require__.d(__webpack_exports__, {
31
31
  tanstackRouterProviderFactory: ()=>tanstackRouterProviderFactory
32
32
  });
33
- const context_namespaceObject = require("@modern-js/runtime/context");
33
+ const router_provider_namespaceObject = require("@modern-js/runtime-extensions/router-provider");
34
34
  const external_plugin_js_namespaceObject = require("./plugin.js");
35
35
  const tanstackRouterProviderFactory = (userConfig)=>(0, external_plugin_js_namespaceObject.tanstackRouterPlugin)(userConfig);
36
- (0, context_namespaceObject.registerRouterProvider)('tanstack', tanstackRouterProviderFactory);
36
+ (0, router_provider_namespaceObject.registerRouterProvider)('tanstack', tanstackRouterProviderFactory);
37
37
  exports.tanstackRouterProviderFactory = __webpack_exports__.tanstackRouterProviderFactory;
38
38
  for(var __rspack_i in __webpack_exports__)if (-1 === [
39
39
  "tanstackRouterProviderFactory"
@@ -31,6 +31,7 @@ __webpack_require__.d(__webpack_exports__, {
31
31
  createRouteTreeFromRouteObjects: ()=>createRouteTreeFromRouteObjects,
32
32
  getModernRouteIdsFromMatches: ()=>getModernRouteIdsFromMatches
33
33
  });
34
+ const i18n_runtime_extensions_namespaceObject = require("@modern-js/i18n-runtime-extensions");
34
35
  const context_namespaceObject = require("@modern-js/runtime/context");
35
36
  const react_router_namespaceObject = require("@tanstack/react-router");
36
37
  const routeStaticData_js_namespaceObject = require("../../shared/routeStaticData.js");
@@ -90,6 +91,7 @@ function getRootLikeRouteObject(routes) {
90
91
  return routes.find((route)=>'/' === route.path && !route.index);
91
92
  }
92
93
  function createRouteTreeFromRouteObjects(routes, options = {}) {
94
+ routes = (0, i18n_runtime_extensions_namespaceObject.canonicaliseLocalisedRoutes)(routes);
93
95
  const rootLikeRoute = getRootLikeRouteObject(routes);
94
96
  const rootRevalidationState = {};
95
97
  const rootShouldRevalidate = rootLikeRoute?.shouldRevalidate;
@@ -30,21 +30,37 @@ __webpack_require__.r(__webpack_exports__);
30
30
  __webpack_require__.d(__webpack_exports__, {
31
31
  routerPlugin: ()=>routerPlugin
32
32
  });
33
+ const context_namespaceObject = require("@modern-js/runtime/context");
33
34
  const internal_namespaceObject = require("@modern-js/runtime/router/internal");
35
+ const router_provider_namespaceObject = require("@modern-js/runtime-extensions/router-provider");
36
+ const router_state_plugin_namespaceObject = require("@modern-js/runtime-extensions/router-state-plugin");
34
37
  const external_register_js_namespaceObject = require("./register.js");
35
- function getRouterPlugin() {
36
- const createRouterPlugin = Reflect.get(internal_namespaceObject, 'createRouterPlugin');
37
- if ('function' == typeof createRouterPlugin) return createRouterPlugin([
38
+ const createProviderPlugin = (0, router_provider_namespaceObject.createRouterPlugin)({
39
+ defaultProvider: {
40
+ name: 'react-router',
41
+ factory: internal_namespaceObject.routerPlugin
42
+ },
43
+ registryHooks: context_namespaceObject.routerProviderRegistryHooks,
44
+ localProviders: [
38
45
  {
39
46
  name: 'tanstack',
40
47
  factory: external_register_js_namespaceObject.tanstackRouterProviderFactory
41
48
  }
42
- ]);
43
- const legacyRouterPlugin = Reflect.get(internal_namespaceObject, 'routerPlugin');
44
- if ('function' == typeof legacyRouterPlugin) return external_register_js_namespaceObject.tanstackRouterProviderFactory;
45
- throw new Error('[@modern-js/plugin-tanstack] The installed @modern-js/runtime/router/internal exports neither createRouterPlugin nor routerPlugin. Install a compatible @modern-js/runtime version.');
46
- }
47
- const routerPlugin = getRouterPlugin();
49
+ ]
50
+ });
51
+ const statePlugin = (0, router_state_plugin_namespaceObject.createRouterStatePlugin)({
52
+ registryHooks: context_namespaceObject.routerProviderRegistryHooks
53
+ });
54
+ const routerPlugin = (userConfig = {})=>{
55
+ const providerPlugin = createProviderPlugin(userConfig);
56
+ return {
57
+ ...providerPlugin,
58
+ setup (api) {
59
+ statePlugin.setup(api);
60
+ providerPlugin.setup(api);
61
+ }
62
+ };
63
+ };
48
64
  exports.routerPlugin = __webpack_exports__.routerPlugin;
49
65
  for(var __rspack_i in __webpack_exports__)if (-1 === [
50
66
  "routerPlugin"
@@ -30,9 +30,9 @@ __webpack_require__.r(__webpack_exports__);
30
30
  __webpack_require__.d(__webpack_exports__, {
31
31
  getTanstackRouterState: ()=>getTanstackRouterState
32
32
  });
33
- const context_namespaceObject = require("@modern-js/runtime/context");
33
+ const router_state_namespaceObject = require("@modern-js/runtime-extensions/router-state");
34
34
  function getTanstackRouterState(context) {
35
- const state = (0, context_namespaceObject.getRouterRuntimeState)(context);
35
+ const state = (0, router_state_namespaceObject.getRouterRuntimeState)(context);
36
36
  if (void 0 === state || 'tanstack' !== state.framework || void 0 === state.instance) return;
37
37
  return state;
38
38
  }
@@ -55,6 +55,7 @@ function withGlobalLayout(Component, globalApp) {
55
55
  }
56
56
  function toTanstackRouteObject(route, globalApp) {
57
57
  if ('nested' === route.type) return {
58
+ modernLocalisedRoute: Reflect.get(route, 'modernLocalisedRoute'),
58
59
  path: route.path,
59
60
  id: route.id,
60
61
  loader: route.loader,
@@ -79,6 +80,7 @@ function toTanstackRouteObject(route, globalApp) {
79
80
  if ('function' != typeof route.component && 'object' != typeof route.component) return null;
80
81
  const LayoutComponent = withGlobalLayout(route.component, globalApp);
81
82
  return {
83
+ modernLocalisedRoute: Reflect.get(route, 'modernLocalisedRoute'),
82
84
  path: route.path,
83
85
  element: /*#__PURE__*/ (external_react_default()).createElement(LayoutComponent)
84
86
  };
@@ -31,6 +31,15 @@ function tanstackRouterPlugin(options = {}) {
31
31
  '@modern-js/runtime'
32
32
  ],
33
33
  setup: (api)=>{
34
+ const { srcDirectory, serverCompileExcludedFiles = [] } = api.getAppContext();
35
+ api.updateAppContext({
36
+ serverCompileExcludedFiles: [
37
+ ...new Set([
38
+ ...serverCompileExcludedFiles,
39
+ node_path.join(srcDirectory, generatedDirName, 'register.gen.d.ts')
40
+ ])
41
+ ]
42
+ });
34
43
  const nestedRoutesForServer = {};
35
44
  const isTanstackEntrypoint = (entrypoint)=>{
36
45
  const { getEntrypointRoutesDir } = getRuntimeRouterCli();
@@ -1,8 +1,10 @@
1
+ import { canonicaliseLocalisedRoutes } from "@modern-js/i18n-runtime-extensions";
1
2
  import { makeLegalIdentifier } from "@modern-js/runtime/cli";
2
3
  import { upath } from "@modern-js/utils";
3
4
  import { createRouteStaticDataSnippet, isIndexRoute, isPathlessLayout, normalizeRelativeImport, pickModernLoaderModule, pickRouteSearchContractModules, quote, resolveFileNoExt, toTanstackPath } from "./shared.mjs";
4
5
  async function generateTanstackRouterTypesSourceForEntry(opts) {
5
- const { appContext, entryName, generatedDirName = 'modern-tanstack', routes } = opts;
6
+ const { appContext, entryName, generatedDirName = 'modern-tanstack', routes: rawRoutes } = opts;
7
+ const routes = canonicaliseLocalisedRoutes(rawRoutes);
6
8
  const outDir = upath.join(appContext.srcDirectory, generatedDirName, entryName);
7
9
  const rootModern = routes.find((r)=>{
8
10
  const extras = r;
@@ -1,16 +1,19 @@
1
+ import { createLocalisedRouteRewrite } from "@modern-js/i18n-runtime-extensions";
2
+ import { composeRewrites } from "@tanstack/react-router";
1
3
  function normalizeBasepath(basepath) {
2
4
  if (!basepath) return '/';
3
5
  let normalized = basepath.startsWith('/') ? basepath : `/${basepath}`;
4
6
  if (normalized.length > 1 && normalized.endsWith('/')) normalized = normalized.slice(0, -1);
5
7
  return normalized || '/';
6
8
  }
7
- function createModernBasepathRewrite(basepath, caseSensitive = false) {
9
+ function createModernBasepathRewrite(basepath, caseSensitive = false, routes = []) {
10
+ const localisedRewrite = createLocalisedRouteRewrite(routes);
8
11
  const normalizedBasepath = normalizeBasepath(basepath);
9
- if ('/' === normalizedBasepath) return;
12
+ if ('/' === normalizedBasepath) return localisedRewrite;
10
13
  const normalizedBasepathWithSlash = `${normalizedBasepath}/`;
11
14
  const checkBasepath = caseSensitive ? normalizedBasepath : normalizedBasepath.toLowerCase();
12
15
  const checkBasepathWithSlash = caseSensitive ? normalizedBasepathWithSlash : normalizedBasepathWithSlash.toLowerCase();
13
- return {
16
+ const basepathRewrite = {
14
17
  input: ({ url })=>{
15
18
  const pathname = caseSensitive ? url.pathname : url.pathname.toLowerCase();
16
19
  if (pathname === checkBasepath) url.pathname = '/';
@@ -24,5 +27,9 @@ function createModernBasepathRewrite(basepath, caseSensitive = false) {
24
27
  return url;
25
28
  }
26
29
  };
30
+ return localisedRewrite ? composeRewrites([
31
+ basepathRewrite,
32
+ localisedRewrite
33
+ ]) : basepathRewrite;
27
34
  }
28
35
  export { createModernBasepathRewrite };
@@ -1 +1 @@
1
- export { applyRouterRuntimeState, applyRouterServerPrepareResult, createRouterRuntimeState, createRouterServerSnapshot, getRouterRuntimeState, getRouterServerSnapshot } from "@modern-js/runtime/context";
1
+ export { applyRouterRuntimeState, applyRouterServerPrepareResult, createRouterRuntimeState, createRouterServerSnapshot, getRouterRuntimeState, getRouterServerSnapshot } from "@modern-js/runtime-extensions/router-state";
@@ -77,7 +77,7 @@ const tanstackRouterPlugin = (userConfig = {})=>{
77
77
  const mergedConfig = getMergedConfig();
78
78
  const { supportHtml5History = true } = mergedConfig;
79
79
  const history = supportHtml5History ? createBrowserHistory() : createHashHistory();
80
- const rewrite = createModernBasepathRewrite(_basename);
80
+ const rewrite = createModernBasepathRewrite(_basename, false, getRouteObjects());
81
81
  const serializationAdapters = getGlobalEnableRsc() ? getTanstackRscSerializationAdapters() : void 0;
82
82
  const routerFastDefaults = getModernTanstackRouterFastDefaults(mergedConfig);
83
83
  cachedRouter = createRouter({
@@ -10,6 +10,7 @@ import { routerProviderRegistryHooks } from "./hooks.mjs";
10
10
  import { wrapTanstackSsrHydrationBoundary } from "./hydrationBoundary.mjs";
11
11
  import { applyRouterServerPrepareResult, createRouterServerSnapshot, getRouterRuntimeState } from "./lifecycle.mjs";
12
12
  import { createTanstackRouteObjects, getTanstackRouteConfig, joinBasename } from "./pluginShared.mjs";
13
+ import { Link } from "./prefetchLink.mjs";
13
14
  import { createRouteTreeFromRouteObjects, getModernRouteIdsFromMatches } from "./routeTree/index.mjs";
14
15
  import { createTanstackRscServerPayload, handleTanstackRscRedirect } from "./rsc/payloadRouter.mjs";
15
16
  import { getTanstackRscRouter, setTanstackRscRouter, setTanstackRscServerPayload } from "./rsc/payloadStorage.mjs";
@@ -35,6 +36,9 @@ const tanstackRouterPlugin = (userConfig = {})=>{
35
36
  routeConfig
36
37
  });
37
38
  if (!modifiedRouteObjects.length) return;
39
+ context.router = {
40
+ Link: Link
41
+ };
38
42
  const { request, nonce, baseUrl, loaderFailureMode = 'errorBoundary' } = context.ssrContext;
39
43
  const _basename = '/' === baseUrl ? joinBasename(baseUrl, basename || '') : baseUrl;
40
44
  const rawRequest = request.raw;
@@ -57,7 +61,7 @@ const tanstackRouterPlugin = (userConfig = {})=>{
57
61
  initialHref
58
62
  ]
59
63
  });
60
- const rewrite = createModernBasepathRewrite(_basename);
64
+ const rewrite = createModernBasepathRewrite(_basename, false, modifiedRouteObjects);
61
65
  const routerLifecycleContext = {
62
66
  framework: 'tanstack',
63
67
  phase: 'ssr-prepare',
@@ -1,11 +1,6 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
+ import { resolvePreloadFromPrefetch } from "@modern-js/runtime-extensions";
2
3
  import { useLinkProps } from "@tanstack/react-router";
3
- function resolvePreloadFromPrefetch(prefetch, preload) {
4
- if (void 0 !== preload) return preload;
5
- if ('none' === prefetch) return false;
6
- if ('intent' === prefetch || 'render' === prefetch || 'viewport' === prefetch) return prefetch;
7
- return 'viewport';
8
- }
9
4
  const LinkComponentImpl = (props)=>{
10
5
  const { prefetch, preload, 'aria-current': ariaCurrentProp, ref, children, ...rest } = props;
11
6
  const hasAriaCurrentOverride = 'aria-current' in props;
@@ -1,4 +1,4 @@
1
- import { registerRouterProvider } from "@modern-js/runtime/context";
1
+ import { registerRouterProvider } from "@modern-js/runtime-extensions/router-provider";
2
2
  import { tanstackRouterPlugin } from "./plugin.mjs";
3
3
  const tanstackRouterProviderFactory = (userConfig)=>tanstackRouterPlugin(userConfig);
4
4
  registerRouterProvider('tanstack', tanstackRouterProviderFactory);
@@ -1,3 +1,4 @@
1
+ import { canonicaliseLocalisedRoutes } from "@modern-js/i18n-runtime-extensions";
1
2
  import { DefaultNotFound } from "@modern-js/runtime/context";
2
3
  import { rootRouteId } from "@tanstack/react-router";
3
4
  import { createRouteStaticData } from "../../shared/routeStaticData.mjs";
@@ -57,6 +58,7 @@ function getRootLikeRouteObject(routes) {
57
58
  return routes.find((route)=>'/' === route.path && !route.index);
58
59
  }
59
60
  function createRouteTreeFromRouteObjects(routes, options = {}) {
61
+ routes = canonicaliseLocalisedRoutes(routes);
60
62
  const rootLikeRoute = getRootLikeRouteObject(routes);
61
63
  const rootRevalidationState = {};
62
64
  const rootShouldRevalidate = rootLikeRoute?.shouldRevalidate;
@@ -1,16 +1,32 @@
1
- import * as __rspack_external__modern_js_runtime_router_internal_8b8183c5 from "@modern-js/runtime/router/internal";
1
+ import { routerProviderRegistryHooks } from "@modern-js/runtime/context";
2
+ import { routerPlugin } from "@modern-js/runtime/router/internal";
3
+ import { createRouterPlugin } from "@modern-js/runtime-extensions/router-provider";
4
+ import { createRouterStatePlugin } from "@modern-js/runtime-extensions/router-state-plugin";
2
5
  import { tanstackRouterProviderFactory } from "./register.mjs";
3
- function getRouterPlugin() {
4
- const createRouterPlugin = Reflect.get(__rspack_external__modern_js_runtime_router_internal_8b8183c5, 'createRouterPlugin');
5
- if ('function' == typeof createRouterPlugin) return createRouterPlugin([
6
+ const createProviderPlugin = createRouterPlugin({
7
+ defaultProvider: {
8
+ name: 'react-router',
9
+ factory: routerPlugin
10
+ },
11
+ registryHooks: routerProviderRegistryHooks,
12
+ localProviders: [
6
13
  {
7
14
  name: 'tanstack',
8
15
  factory: tanstackRouterProviderFactory
9
16
  }
10
- ]);
11
- const legacyRouterPlugin = Reflect.get(__rspack_external__modern_js_runtime_router_internal_8b8183c5, 'routerPlugin');
12
- if ('function' == typeof legacyRouterPlugin) return tanstackRouterProviderFactory;
13
- throw new Error('[@modern-js/plugin-tanstack] The installed @modern-js/runtime/router/internal exports neither createRouterPlugin nor routerPlugin. Install a compatible @modern-js/runtime version.');
14
- }
15
- const routerPlugin = getRouterPlugin();
16
- export { routerPlugin };
17
+ ]
18
+ });
19
+ const statePlugin = createRouterStatePlugin({
20
+ registryHooks: routerProviderRegistryHooks
21
+ });
22
+ const router_routerPlugin = (userConfig = {})=>{
23
+ const providerPlugin = createProviderPlugin(userConfig);
24
+ return {
25
+ ...providerPlugin,
26
+ setup (api) {
27
+ statePlugin.setup(api);
28
+ providerPlugin.setup(api);
29
+ }
30
+ };
31
+ };
32
+ export { router_routerPlugin as routerPlugin };
@@ -1,4 +1,4 @@
1
- import { getRouterRuntimeState } from "@modern-js/runtime/context";
1
+ import { getRouterRuntimeState } from "@modern-js/runtime-extensions/router-state";
2
2
  function getTanstackRouterState(context) {
3
3
  const state = getRouterRuntimeState(context);
4
4
  if (void 0 === state || 'tanstack' !== state.framework || void 0 === state.instance) return;
@@ -13,6 +13,7 @@ function withGlobalLayout(Component, globalApp) {
13
13
  }
14
14
  function toTanstackRouteObject(route, globalApp) {
15
15
  if ('nested' === route.type) return {
16
+ modernLocalisedRoute: Reflect.get(route, 'modernLocalisedRoute'),
16
17
  path: route.path,
17
18
  id: route.id,
18
19
  loader: route.loader,
@@ -37,6 +38,7 @@ function toTanstackRouteObject(route, globalApp) {
37
38
  if ('function' != typeof route.component && 'object' != typeof route.component) return null;
38
39
  const LayoutComponent = withGlobalLayout(route.component, globalApp);
39
40
  return {
41
+ modernLocalisedRoute: Reflect.get(route, 'modernLocalisedRoute'),
40
42
  path: route.path,
41
43
  element: /*#__PURE__*/ react.createElement(LayoutComponent)
42
44
  };
@@ -37,6 +37,15 @@ function tanstackRouterPlugin(options = {}) {
37
37
  '@modern-js/runtime'
38
38
  ],
39
39
  setup: (api)=>{
40
+ const { srcDirectory, serverCompileExcludedFiles = [] } = api.getAppContext();
41
+ api.updateAppContext({
42
+ serverCompileExcludedFiles: [
43
+ ...new Set([
44
+ ...serverCompileExcludedFiles,
45
+ node_path.join(srcDirectory, generatedDirName, 'register.gen.d.ts')
46
+ ])
47
+ ]
48
+ });
40
49
  const nestedRoutesForServer = {};
41
50
  const isTanstackEntrypoint = (entrypoint)=>{
42
51
  const { getEntrypointRoutesDir } = getRuntimeRouterCli();
@@ -1,9 +1,11 @@
1
1
  import "node:module";
2
+ import { canonicaliseLocalisedRoutes } from "@modern-js/i18n-runtime-extensions";
2
3
  import { makeLegalIdentifier } from "@modern-js/runtime/cli";
3
4
  import { upath } from "@modern-js/utils";
4
5
  import { createRouteStaticDataSnippet, isIndexRoute, isPathlessLayout, normalizeRelativeImport, pickModernLoaderModule, pickRouteSearchContractModules, quote, resolveFileNoExt, toTanstackPath } from "./shared.mjs";
5
6
  async function generateTanstackRouterTypesSourceForEntry(opts) {
6
- const { appContext, entryName, generatedDirName = 'modern-tanstack', routes } = opts;
7
+ const { appContext, entryName, generatedDirName = 'modern-tanstack', routes: rawRoutes } = opts;
8
+ const routes = canonicaliseLocalisedRoutes(rawRoutes);
7
9
  const outDir = upath.join(appContext.srcDirectory, generatedDirName, entryName);
8
10
  const rootModern = routes.find((r)=>{
9
11
  const extras = r;
@@ -1,17 +1,20 @@
1
1
  import "node:module";
2
+ import { createLocalisedRouteRewrite } from "@modern-js/i18n-runtime-extensions";
3
+ import { composeRewrites } from "@tanstack/react-router";
2
4
  function normalizeBasepath(basepath) {
3
5
  if (!basepath) return '/';
4
6
  let normalized = basepath.startsWith('/') ? basepath : `/${basepath}`;
5
7
  if (normalized.length > 1 && normalized.endsWith('/')) normalized = normalized.slice(0, -1);
6
8
  return normalized || '/';
7
9
  }
8
- function createModernBasepathRewrite(basepath, caseSensitive = false) {
10
+ function createModernBasepathRewrite(basepath, caseSensitive = false, routes = []) {
11
+ const localisedRewrite = createLocalisedRouteRewrite(routes);
9
12
  const normalizedBasepath = normalizeBasepath(basepath);
10
- if ('/' === normalizedBasepath) return;
13
+ if ('/' === normalizedBasepath) return localisedRewrite;
11
14
  const normalizedBasepathWithSlash = `${normalizedBasepath}/`;
12
15
  const checkBasepath = caseSensitive ? normalizedBasepath : normalizedBasepath.toLowerCase();
13
16
  const checkBasepathWithSlash = caseSensitive ? normalizedBasepathWithSlash : normalizedBasepathWithSlash.toLowerCase();
14
- return {
17
+ const basepathRewrite = {
15
18
  input: ({ url })=>{
16
19
  const pathname = caseSensitive ? url.pathname : url.pathname.toLowerCase();
17
20
  if (pathname === checkBasepath) url.pathname = '/';
@@ -25,5 +28,9 @@ function createModernBasepathRewrite(basepath, caseSensitive = false) {
25
28
  return url;
26
29
  }
27
30
  };
31
+ return localisedRewrite ? composeRewrites([
32
+ basepathRewrite,
33
+ localisedRewrite
34
+ ]) : basepathRewrite;
28
35
  }
29
36
  export { createModernBasepathRewrite };
@@ -1,2 +1,2 @@
1
1
  import "node:module";
2
- export { applyRouterRuntimeState, applyRouterServerPrepareResult, createRouterRuntimeState, createRouterServerSnapshot, getRouterRuntimeState, getRouterServerSnapshot } from "@modern-js/runtime/context";
2
+ export { applyRouterRuntimeState, applyRouterServerPrepareResult, createRouterRuntimeState, createRouterServerSnapshot, getRouterRuntimeState, getRouterServerSnapshot } from "@modern-js/runtime-extensions/router-state";
@@ -78,7 +78,7 @@ const tanstackRouterPlugin = (userConfig = {})=>{
78
78
  const mergedConfig = getMergedConfig();
79
79
  const { supportHtml5History = true } = mergedConfig;
80
80
  const history = supportHtml5History ? createBrowserHistory() : createHashHistory();
81
- const rewrite = createModernBasepathRewrite(_basename);
81
+ const rewrite = createModernBasepathRewrite(_basename, false, getRouteObjects());
82
82
  const serializationAdapters = getGlobalEnableRsc() ? getTanstackRscSerializationAdapters() : void 0;
83
83
  const routerFastDefaults = getModernTanstackRouterFastDefaults(mergedConfig);
84
84
  cachedRouter = createRouter({
@@ -11,6 +11,7 @@ import { routerProviderRegistryHooks } from "./hooks.mjs";
11
11
  import { wrapTanstackSsrHydrationBoundary } from "./hydrationBoundary.mjs";
12
12
  import { applyRouterServerPrepareResult, createRouterServerSnapshot, getRouterRuntimeState } from "./lifecycle.mjs";
13
13
  import { createTanstackRouteObjects, getTanstackRouteConfig, joinBasename } from "./pluginShared.mjs";
14
+ import { Link } from "./prefetchLink.mjs";
14
15
  import { createRouteTreeFromRouteObjects, getModernRouteIdsFromMatches } from "./routeTree/index.mjs";
15
16
  import { createTanstackRscServerPayload, handleTanstackRscRedirect } from "./rsc/payloadRouter.mjs";
16
17
  import { getTanstackRscRouter, setTanstackRscRouter, setTanstackRscServerPayload } from "./rsc/payloadStorage.mjs";
@@ -36,6 +37,9 @@ const tanstackRouterPlugin = (userConfig = {})=>{
36
37
  routeConfig
37
38
  });
38
39
  if (!modifiedRouteObjects.length) return;
40
+ context.router = {
41
+ Link: Link
42
+ };
39
43
  const { request, nonce, baseUrl, loaderFailureMode = 'errorBoundary' } = context.ssrContext;
40
44
  const _basename = '/' === baseUrl ? joinBasename(baseUrl, basename || '') : baseUrl;
41
45
  const rawRequest = request.raw;
@@ -58,7 +62,7 @@ const tanstackRouterPlugin = (userConfig = {})=>{
58
62
  initialHref
59
63
  ]
60
64
  });
61
- const rewrite = createModernBasepathRewrite(_basename);
65
+ const rewrite = createModernBasepathRewrite(_basename, false, modifiedRouteObjects);
62
66
  const routerLifecycleContext = {
63
67
  framework: 'tanstack',
64
68
  phase: 'ssr-prepare',
@@ -1,12 +1,7 @@
1
1
  import "node:module";
2
2
  import { jsx } from "react/jsx-runtime";
3
+ import { resolvePreloadFromPrefetch } from "@modern-js/runtime-extensions";
3
4
  import { useLinkProps } from "@tanstack/react-router";
4
- function resolvePreloadFromPrefetch(prefetch, preload) {
5
- if (void 0 !== preload) return preload;
6
- if ('none' === prefetch) return false;
7
- if ('intent' === prefetch || 'render' === prefetch || 'viewport' === prefetch) return prefetch;
8
- return 'viewport';
9
- }
10
5
  const LinkComponentImpl = (props)=>{
11
6
  const { prefetch, preload, 'aria-current': ariaCurrentProp, ref, children, ...rest } = props;
12
7
  const hasAriaCurrentOverride = 'aria-current' in props;
@@ -1,5 +1,5 @@
1
1
  import "node:module";
2
- import { registerRouterProvider } from "@modern-js/runtime/context";
2
+ import { registerRouterProvider } from "@modern-js/runtime-extensions/router-provider";
3
3
  import { tanstackRouterPlugin } from "./plugin.mjs";
4
4
  const tanstackRouterProviderFactory = (userConfig)=>tanstackRouterPlugin(userConfig);
5
5
  registerRouterProvider('tanstack', tanstackRouterProviderFactory);