rsbuild-plugin-react-router 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/README.md +185 -204
  2. package/dist/451.js +1087 -0
  3. package/dist/bounded-cache.d.ts +1 -0
  4. package/dist/build-manifest.d.ts +1 -1
  5. package/dist/build-output-transforms.d.ts +30 -0
  6. package/dist/concurrency.d.ts +2 -0
  7. package/dist/config-imports.d.ts +3 -0
  8. package/dist/constants.d.ts +3 -0
  9. package/dist/dev-generation.d.ts +25 -0
  10. package/dist/dev-runtime-artifacts.d.ts +39 -0
  11. package/dist/dev-runtime-compilation.d.ts +32 -0
  12. package/dist/dev-runtime-controller.d.ts +14 -0
  13. package/dist/dev-runtime-session.d.ts +34 -0
  14. package/dist/dev-server.d.ts +11 -2
  15. package/dist/export-utils.d.ts +15 -7
  16. package/dist/index.cjs +3085 -1272
  17. package/dist/index.d.ts +4 -1
  18. package/dist/index.js +2039 -1299
  19. package/dist/lazy-compilation.d.ts +5 -0
  20. package/dist/manifest.d.ts +32 -9
  21. package/dist/modify-browser-manifest.d.ts +30 -13
  22. package/dist/parallel-route-transform-protocol.d.ts +25 -0
  23. package/dist/parallel-route-transform-worker.d.ts +1 -0
  24. package/dist/parallel-route-transform-worker.js +38 -0
  25. package/dist/parallel-route-transforms.d.ts +14 -0
  26. package/dist/performance.d.ts +26 -0
  27. package/dist/plugin-utils.d.ts +2 -12
  28. package/dist/prerender-build.d.ts +32 -0
  29. package/dist/prerender.d.ts +28 -2
  30. package/dist/react-router-config.d.ts +8 -1
  31. package/dist/route-artifacts.d.ts +33 -0
  32. package/dist/route-ast.d.ts +21 -0
  33. package/dist/route-chunks.d.ts +9 -1
  34. package/dist/route-component-transform.d.ts +5 -0
  35. package/dist/route-export-pruning.d.ts +6 -0
  36. package/dist/route-export-resolution.d.ts +5 -0
  37. package/dist/route-transform-tasks.d.ts +47 -0
  38. package/dist/route-watch.d.ts +27 -0
  39. package/dist/server-build-plan.d.ts +22 -0
  40. package/dist/server-utils.d.ts +3 -2
  41. package/dist/templates/entry.client.js +3 -3
  42. package/dist/templates/entry.server.cjs +11 -8
  43. package/dist/templates/entry.server.js +5 -5
  44. package/dist/typegen.d.ts +2 -0
  45. package/dist/types.d.ts +30 -12
  46. package/dist/virtual-modules.d.ts +2 -0
  47. package/dist/warnings/warn-on-client-source-maps.d.ts +1 -0
  48. package/dist/yuku.d.ts +15 -0
  49. package/package.json +26 -22
  50. package/src/bounded-cache.ts +18 -0
  51. package/src/build-manifest.ts +168 -0
  52. package/src/build-output-transforms.ts +273 -0
  53. package/src/concurrency.ts +34 -0
  54. package/src/config-imports.ts +45 -0
  55. package/src/constants.ts +91 -0
  56. package/src/dev-generation.ts +700 -0
  57. package/src/dev-runtime-artifacts.ts +207 -0
  58. package/src/dev-runtime-compilation.ts +92 -0
  59. package/src/dev-runtime-controller.ts +462 -0
  60. package/src/dev-runtime-session.ts +184 -0
  61. package/src/dev-server.ts +58 -0
  62. package/src/export-utils.ts +219 -0
  63. package/src/index.ts +1025 -0
  64. package/src/lazy-compilation.ts +94 -0
  65. package/src/manifest.ts +480 -0
  66. package/src/modify-browser-manifest.ts +245 -0
  67. package/src/parallel-route-transform-protocol.ts +35 -0
  68. package/src/parallel-route-transform-worker.ts +82 -0
  69. package/src/parallel-route-transforms.ts +332 -0
  70. package/src/performance.ts +254 -0
  71. package/src/plugin-utils.ts +82 -0
  72. package/src/prerender-build.ts +623 -0
  73. package/src/prerender.ts +367 -0
  74. package/src/react-router-config.ts +220 -0
  75. package/src/route-artifacts.ts +155 -0
  76. package/src/route-ast.ts +163 -0
  77. package/src/route-chunks.ts +857 -0
  78. package/src/route-component-transform.ts +314 -0
  79. package/src/route-config.ts +106 -0
  80. package/src/route-export-pruning.ts +668 -0
  81. package/src/route-export-resolution.ts +329 -0
  82. package/src/route-transform-tasks.ts +249 -0
  83. package/src/route-watch.ts +322 -0
  84. package/src/server-build-plan.ts +91 -0
  85. package/src/server-utils.ts +210 -0
  86. package/src/ssr-externals.ts +59 -0
  87. package/src/templates/context.ts +12 -0
  88. package/src/templates/entry.client.tsx +12 -0
  89. package/src/templates/entry.server.tsx +76 -0
  90. package/src/typegen.ts +49 -0
  91. package/src/types.ts +82 -0
  92. package/src/validation/validate-plugin-order.ts +76 -0
  93. package/src/virtual-modules.ts +30 -0
  94. package/src/warnings/warn-on-client-source-maps.ts +96 -0
  95. package/src/yuku.ts +67 -0
  96. package/dist/906.js +0 -1
  97. package/dist/946.js +0 -1
  98. package/dist/babel.d.ts +0 -8
  99. package/dist/rslib-runtime.js +0 -23
@@ -0,0 +1,5 @@
1
+ import type { PluginOptions } from './types.js';
2
+ export declare const guardReactRouterLazyCompilation: ({ lazyCompilation, entryClientPath, }: {
3
+ lazyCompilation: PluginOptions["lazyCompilation"] | undefined;
4
+ entryClientPath: string;
5
+ }) => PluginOptions["lazyCompilation"] | undefined;
@@ -1,20 +1,15 @@
1
1
  import type { Route, PluginOptions, RouteManifestItem } from './types.js';
2
2
  import type { RouteConfigEntry } from '@react-router/dev/routes';
3
- import type { Rspack } from '@rsbuild/core';
4
3
  import { type RouteChunkCache } from './route-chunks.js';
5
4
  export declare function configRoutesToRouteManifest(appDirectory: string, routes: RouteConfigEntry[], rootId?: string): Record<string, Route>;
5
+ export declare function configRoutesToRouteManifestEntries(appDirectory: string, routes: RouteConfigEntry[], rootId?: string): Array<[string, Route]>;
6
6
  type RouteChunkManifestOptions = {
7
7
  splitRouteModules?: boolean | 'enforce';
8
8
  rootRouteFile?: string;
9
9
  isBuild?: boolean;
10
10
  cache?: RouteChunkCache;
11
11
  };
12
- export declare const getReactRouterManifestPath: ({ version, isBuild, entryModulePath, }: {
13
- version: string;
14
- isBuild: boolean;
15
- entryModulePath?: string;
16
- }) => string;
17
- export declare function getReactRouterManifestForDev(routes: Record<string, Route>, options: PluginOptions, clientStats: Rspack.StatsCompilation | undefined, context: string, assetPrefix?: string, routeChunkOptions?: RouteChunkManifestOptions): Promise<{
12
+ export type ReactRouterManifestForDev = {
18
13
  version: string;
19
14
  url: string;
20
15
  hmr?: {
@@ -25,7 +20,35 @@ export declare function getReactRouterManifestForDev(routes: Record<string, Rout
25
20
  imports: string[];
26
21
  css: string[];
27
22
  };
28
- sri?: Record<string, string>;
23
+ sri?: Record<string, string> | true;
29
24
  routes: Record<string, RouteManifestItem>;
30
- }>;
25
+ };
26
+ export type ReactRouterManifestStats = {
27
+ assetsByChunkName?: Record<string, string[]>;
28
+ entrypointFilesByName?: Record<string, string[]>;
29
+ };
30
+ type ReactRouterManifestStatsChunk = {
31
+ files?: Iterable<string>;
32
+ };
33
+ type ReactRouterManifestStatsEntrypoint = {
34
+ getFiles?: () => Iterable<string>;
35
+ };
36
+ type ReactRouterManifestStatsCompilation = {
37
+ namedChunks: Iterable<[string, ReactRouterManifestStatsChunk]>;
38
+ entrypoints?: Iterable<[string, ReactRouterManifestStatsEntrypoint]>;
39
+ };
40
+ export declare const createReactRouterManifestStats: (compilation: ReactRouterManifestStatsCompilation | undefined, chunkNames?: ReadonlySet<string>) => ReactRouterManifestStats | undefined;
41
+ export type RouteManifestModuleExports = Record<string, readonly string[]>;
42
+ export type ReactRouterManifestGenerationResult = {
43
+ manifest: ReactRouterManifestForDev;
44
+ moduleExportsByRouteId: RouteManifestModuleExports;
45
+ };
46
+ export declare const getReactRouterManifestPath: ({ version, isBuild, entryModulePath, }: {
47
+ version: string;
48
+ isBuild: boolean;
49
+ entryModulePath?: string;
50
+ }) => string;
51
+ export declare const getReactRouterManifestChunkNames: (routes: Record<string, Route>, splitRouteModules?: boolean | "enforce") => Set<string>;
52
+ export declare function generateReactRouterManifestForDev(routes: Record<string, Route>, _options: PluginOptions, clientStats: ReactRouterManifestStats | undefined, context: string, assetPrefix?: string, routeChunkOptions?: RouteChunkManifestOptions): Promise<ReactRouterManifestGenerationResult>;
53
+ export declare function getReactRouterManifestForDev(...args: Parameters<typeof generateReactRouterManifestForDev>): Promise<ReactRouterManifestForDev>;
31
54
  export {};
@@ -1,18 +1,35 @@
1
1
  import type { Route, PluginOptions } from './types.js';
2
- import type { Rspack } from '@rsbuild/core';
3
- import { getReactRouterManifestForDev } from './manifest.js';
4
- /**
5
- * Creates a Webpack/Rspack plugin that modifies the browser manifest
6
- * @param routes - The routes configuration
7
- * @param pluginOptions - The plugin options
8
- * @param appDirectory - The application directory
9
- * @returns A webpack/rspack plugin
10
- */
11
- export declare function createModifyBrowserManifestPlugin(routes: Record<string, Route>, pluginOptions: PluginOptions, appDirectory: string, assetPrefix?: string, routeChunkOptions?: Parameters<typeof getReactRouterManifestForDev>[5], options?: {
2
+ import type { RsbuildPluginAPI, Rspack } from '@rsbuild/core';
3
+ import { createReactRouterManifestStats, generateReactRouterManifestForDev, getReactRouterManifestForDev } from './manifest.js';
4
+ type StatsAssetWithIntegrity = {
5
+ name?: string;
6
+ integrity?: unknown;
7
+ };
8
+ type StatsWithIntegrity = {
9
+ assets?: StatsAssetWithIntegrity[];
10
+ };
11
+ type CompilationAssetWithIntegrity = {
12
+ name: string;
13
+ info?: {
14
+ integrity?: unknown;
15
+ };
16
+ };
17
+ type CompilationWithIntegrityAssets = {
18
+ getAssets?: () => readonly CompilationAssetWithIntegrity[];
19
+ } | Pick<Rspack.Compilation, 'getAssets'>;
20
+ type ModifyBrowserManifestOptions = {
12
21
  future?: {
13
22
  unstable_subResourceIntegrity?: boolean;
14
23
  };
15
- onManifest?: (manifest: Awaited<ReturnType<typeof getReactRouterManifestForDev>>, sri: Record<string, string> | undefined) => void;
16
- }): {
17
- apply(compiler: Rspack.Compiler): void;
24
+ subResourceIntegrity?: boolean;
25
+ manifestChunkNames?: ReadonlySet<string>;
26
+ onManifest?: (manifest: Awaited<ReturnType<typeof getReactRouterManifestForDev>>, sri: Record<string, string> | true | undefined, moduleExportsByRouteId: Awaited<ReturnType<typeof generateReactRouterManifestForDev>>['moduleExportsByRouteId'], context: {
27
+ compilation: Rspack.Compilation;
28
+ manifestStats: ReturnType<typeof createReactRouterManifestStats>;
29
+ }) => void;
18
30
  };
31
+ type ProcessAssetsApi = Pick<RsbuildPluginAPI, 'processAssets'>;
32
+ type AssetPrefixInput = string | (() => string);
33
+ export declare const collectSubresourceIntegrity: (stats: StatsWithIntegrity | undefined, compilation: CompilationWithIntegrityAssets | undefined, assetPrefix?: string) => Record<string, string> | undefined;
34
+ export declare function registerModifyBrowserManifestAssets(api: ProcessAssetsApi, routes: Record<string, Route>, pluginOptions: PluginOptions, appDirectory: string, assetPrefix?: AssetPrefixInput, routeChunkOptions?: Parameters<typeof getReactRouterManifestForDev>[5], options?: ModifyBrowserManifestOptions): void;
35
+ export {};
@@ -0,0 +1,25 @@
1
+ import type { RouteTransformResult, RouteTransformTask } from './route-transform-tasks.js';
2
+ type WithoutRequiredSource<Task> = Task extends RouteTransformTask ? Omit<Task, 'code'> & {
3
+ code?: string;
4
+ } : never;
5
+ export type CachedRouteTransformTask = WithoutRequiredSource<RouteTransformTask>;
6
+ export type WorkerRequest = {
7
+ id: number;
8
+ task: RouteTransformTask | CachedRouteTransformTask;
9
+ sourceCacheKey?: string;
10
+ };
11
+ export type WorkerErrorPayload = {
12
+ name?: string;
13
+ message: string;
14
+ stack?: string;
15
+ };
16
+ export type WorkerResponse = {
17
+ id: number;
18
+ ok: true;
19
+ result: RouteTransformResult;
20
+ } | {
21
+ id: number;
22
+ ok: false;
23
+ error: WorkerErrorPayload;
24
+ };
25
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,38 @@
1
+ import { parentPort } from "node:worker_threads";
2
+ import { setBoundedCacheEntry, executeRouteTransformTask } from "./451.js";
3
+ if (!parentPort) throw Error('parallel route transform worker requires parentPort');
4
+ let sourceCache = new Map();
5
+ parentPort.on('message', async ({ id, task, sourceCacheKey })=>{
6
+ try {
7
+ let hydratedTask = (({ task, sourceCacheKey })=>{
8
+ if (!sourceCacheKey) return task;
9
+ if ('string' == typeof task.code) return setBoundedCacheEntry(sourceCache, sourceCacheKey, task.code, 2048), task;
10
+ let code = sourceCache.get(sourceCacheKey);
11
+ if (void 0 === code) throw Error(`Missing cached route transform source for ${sourceCacheKey}.`);
12
+ return {
13
+ ...task,
14
+ code
15
+ };
16
+ })({
17
+ task,
18
+ sourceCacheKey
19
+ }), result = await executeRouteTransformTask(hydratedTask);
20
+ parentPort?.postMessage({
21
+ id,
22
+ ok: !0,
23
+ result
24
+ });
25
+ } catch (error) {
26
+ parentPort?.postMessage({
27
+ id,
28
+ ok: !1,
29
+ error: error instanceof Error ? {
30
+ name: error.name,
31
+ message: error.message,
32
+ stack: error.stack
33
+ } : {
34
+ message: String(error)
35
+ }
36
+ });
37
+ }
38
+ });
@@ -0,0 +1,14 @@
1
+ import { type RouteTransformResult, type RouteTransformTask, type RouteTransformTaskOptions } from './route-transform-tasks.js';
2
+ import type { PluginOptions } from './types.js';
3
+ export type ParallelRouteTransformConfig = NonNullable<PluginOptions['parallelRouteTransform']> extends infer Config ? Exclude<Config, false> : never;
4
+ export type RouteTransformExecutorOptions = RouteTransformTaskOptions & {
5
+ parallelRouteTransform?: PluginOptions['parallelRouteTransform'];
6
+ splitRouteModules?: boolean;
7
+ };
8
+ export type RouteTransformExecutor = {
9
+ run: (task: RouteTransformTask) => Promise<RouteTransformResult>;
10
+ close: () => Promise<void>;
11
+ };
12
+ export declare const getDefaultWorkerCount: (cpuCount?: number) => number;
13
+ export declare const shouldParallelizeRouteTransforms: (routeCount: number) => boolean;
14
+ export declare const createRouteTransformExecutor: ({ parallelRouteTransform, routeChunkCache, splitRouteModules, }?: RouteTransformExecutorOptions) => RouteTransformExecutor;
@@ -0,0 +1,26 @@
1
+ type OperationTiming = {
2
+ count: number;
3
+ totalMs: number;
4
+ wallMs: number;
5
+ maxMs: number;
6
+ slowest: Array<{
7
+ durationMs: number;
8
+ resource: string;
9
+ }>;
10
+ };
11
+ export declare const roundMs: (value: number) => number;
12
+ export type ReactRouterPerformanceReport = {
13
+ environment: string;
14
+ compilerLifecycleMs?: number;
15
+ operations: Record<string, OperationTiming>;
16
+ };
17
+ export type ReactRouterPerformanceProfiler = {
18
+ record<T>(environment: string | undefined, operation: string, resource: string, callback: () => Promise<T>): Promise<T>;
19
+ recordSync<T>(environment: string | undefined, operation: string, resource: string, callback: () => T): T;
20
+ flush(environment: string | undefined, details?: Pick<ReactRouterPerformanceReport, 'compilerLifecycleMs'>): void;
21
+ };
22
+ export declare const createReactRouterPerformanceProfiler: ({ enabled, log, }: {
23
+ enabled: boolean;
24
+ log: (message: string) => void;
25
+ }) => ReactRouterPerformanceProfiler;
26
+ export {};
@@ -1,18 +1,8 @@
1
- import type { Babel, ParseResult } from './babel.js';
2
- export declare function validateDestructuredExports(id: Babel.ArrayPattern | Babel.ObjectPattern, exportsToRemove: string[]): void;
3
- export declare function invalidDestructureError(name: string): Error;
4
- export declare function toFunctionExpression(decl: Babel.FunctionDeclaration): any;
5
1
  export declare function combineURLs(baseURL: string, relativeURL: string): string;
6
2
  export declare function normalizeAssetPrefix(assetPrefix?: string): string;
7
3
  export declare function stripFileExtension(file: string): string;
8
4
  export declare function createRouteId(file: string): string;
9
- /**
10
- * Find a file with any of the supported JavaScript extensions
11
- * @param basePath - The base path without extension
12
- * @returns The file path with extension if found, or a default path
13
- */
14
5
  export declare function findEntryFile(basePath: string): string;
15
6
  export declare function generateWithProps(): string;
16
- export declare const removeExports: (ast: ParseResult<Babel.File>, exportsToRemove: string[]) => void;
17
- export declare const removeUnusedImports: (ast: ParseResult<Babel.File>) => void;
18
- export declare const transformRoute: (ast: ParseResult<Babel.File>) => void;
7
+ export { invalidDestructureError, removeExports, removeUnusedImports, validateDestructuredExports, } from './route-export-pruning.js';
8
+ export { transformRoute } from './route-component-transform.js';
@@ -0,0 +1,32 @@
1
+ import type { RsbuildPluginAPI } from '@rsbuild/core';
2
+ import { getBuildManifest } from './build-manifest.js';
3
+ import { getReactRouterManifestForDev, type ReactRouterManifestStats, type RouteManifestModuleExports } from './manifest.js';
4
+ import type { Config, ResolvedReactRouterConfig } from './react-router-config.js';
5
+ import type { PluginOptions, Route } from './types.js';
6
+ type ReactRouterManifest = Awaited<ReturnType<typeof getReactRouterManifestForDev>>;
7
+ type PrerenderBuildApi = Pick<RsbuildPluginAPI, 'logger' | 'getNormalizedConfig'>;
8
+ type RunReactRouterPrerenderBuildOptions = {
9
+ api: PrerenderBuildApi;
10
+ hasWebEnvironment: boolean;
11
+ buildDirectory: string;
12
+ serverBuildFile?: string;
13
+ ssr: boolean;
14
+ isPrerenderEnabled: boolean;
15
+ prerenderConfig: Config['prerender'];
16
+ prerenderPaths: string[];
17
+ basename: string;
18
+ future: ResolvedReactRouterConfig['future'];
19
+ routes: Record<string, Route>;
20
+ latestBrowserManifest: ReactRouterManifest | null;
21
+ latestBrowserManifestModuleExports: RouteManifestModuleExports;
22
+ clientStats: ReactRouterManifestStats | undefined;
23
+ pluginOptions: PluginOptions;
24
+ appDirectory: string;
25
+ assetPrefix: string;
26
+ routeChunkOptions: Parameters<typeof getReactRouterManifestForDev>[5];
27
+ buildManifest: Awaited<ReturnType<typeof getBuildManifest>>;
28
+ resolvedConfigWithRoutes: ResolvedReactRouterConfig;
29
+ buildEnd: Config['buildEnd'];
30
+ };
31
+ export declare const runReactRouterPrerenderBuild: (options: RunReactRouterPrerenderBuildOptions) => Promise<void>;
32
+ export {};
@@ -1,6 +1,14 @@
1
1
  import type { Config } from './react-router-config.js';
2
2
  import type { RouteConfigEntry } from '@react-router/dev/routes';
3
- type PrerenderConfig = Config['prerender'];
3
+ import { matchRoutes } from 'react-router';
4
+ type ReactRouterPrerenderConfig = Config['prerender'];
5
+ type MatchRouteObject = Parameters<typeof matchRoutes>[0] extends Array<infer R> ? R : never;
6
+ type PrerenderConfigObject = Extract<NonNullable<ReactRouterPrerenderConfig>, {
7
+ paths: unknown;
8
+ }> & {
9
+ unstable_concurrency?: number;
10
+ };
11
+ type PrerenderConfig = ReactRouterPrerenderConfig | PrerenderConfigObject;
4
12
  type PrerenderResolveOptions = {
5
13
  logWarning?: boolean;
6
14
  warn?: (message: string) => void;
@@ -9,8 +17,26 @@ type StaticPrerenderPaths = {
9
17
  paths: string[];
10
18
  paramRoutes: string[];
11
19
  };
20
+ type SsrFalsePrerenderRoute = {
21
+ id: string;
22
+ parentId?: string;
23
+ path?: string;
24
+ index?: boolean;
25
+ hasLoader?: boolean;
26
+ hasClientLoader?: boolean;
27
+ };
28
+ type SsrFalsePrerenderExportOptions = {
29
+ routes: Record<string, SsrFalsePrerenderRoute>;
30
+ manifestRoutes: Record<string, SsrFalsePrerenderRoute>;
31
+ routeExports: Record<string, readonly string[] | undefined>;
32
+ prerenderPaths: string[];
33
+ };
34
+ export declare const createPrerenderRoutes: (manifest: Record<string, any>, parentId?: string, grouped?: Record<string, any[]>) => MatchRouteObject[];
35
+ export declare const normalizePrerenderMatchPath: (path: string) => string;
36
+ export declare const withBuildRequest: <T>(input: string | URL, init: RequestInit | undefined, handle: (request: Request) => Promise<T>) => Promise<T>;
37
+ export declare const getSsrFalsePrerenderExportErrors: ({ routes, manifestRoutes, routeExports, prerenderPaths, }: SsrFalsePrerenderExportOptions) => string[];
12
38
  export declare const getStaticPrerenderPaths: (routes: RouteConfigEntry[]) => StaticPrerenderPaths;
13
39
  export declare const resolvePrerenderPaths: (prerender: PrerenderConfig, ssr: boolean, routes: RouteConfigEntry[], options?: PrerenderResolveOptions) => Promise<string[]>;
14
- export declare const getPrerenderConcurrency: (prerender: PrerenderConfig) => number;
40
+ export declare const getPrerenderConcurrency: (prerender: PrerenderConfig, _cpuCount?: number) => number;
15
41
  export declare const validatePrerenderConfig: (prerender: PrerenderConfig) => string | null;
16
42
  export {};
@@ -8,8 +8,12 @@ export type BuildEndHook = {
8
8
  viteConfig: NormalizedConfig;
9
9
  }): void | Promise<void>;
10
10
  }['bivarianceHack'];
11
- export type Config = Omit<ReactRouterConfig, 'buildEnd'> & {
11
+ type SplitRouteModulesConfig = boolean | 'enforce';
12
+ export type Config = Omit<ReactRouterConfig, 'buildEnd' | 'future' | 'splitRouteModules' | 'subResourceIntegrity'> & {
12
13
  buildEnd?: BuildEndHook;
14
+ future?: Partial<FutureConfig>;
15
+ splitRouteModules?: SplitRouteModulesConfig;
16
+ subResourceIntegrity?: boolean;
13
17
  };
14
18
  type FutureConfig = {
15
19
  unstable_optimizeDeps: boolean;
@@ -40,6 +44,8 @@ export type ResolvedReactRouterConfig = Readonly<{
40
44
  serverBuildFile: NonNullable<ReactRouterConfig['serverBuildFile']>;
41
45
  serverBundles?: Config['serverBundles'];
42
46
  serverModuleFormat: NonNullable<ReactRouterConfig['serverModuleFormat']>;
47
+ splitRouteModules: SplitRouteModulesConfig;
48
+ subResourceIntegrity: boolean;
43
49
  ssr: NonNullable<ReactRouterConfig['ssr']>;
44
50
  allowedActionOrigins: string[] | false;
45
51
  unstable_routeConfig: RouteConfigEntry[];
@@ -47,5 +53,6 @@ export type ResolvedReactRouterConfig = Readonly<{
47
53
  export declare const resolveReactRouterConfig: (reactRouterUserConfig: Config) => Promise<{
48
54
  resolved: ResolvedReactRouterConfig;
49
55
  presets: NonNullable<Config["presets"]>;
56
+ hasConfiguredServerModuleFormat: boolean;
50
57
  }>;
51
58
  export {};
@@ -0,0 +1,33 @@
1
+ import { type RouteChunkCache, type RouteChunkConfig } from './route-chunks.js';
2
+ export type RouteClientEntryArtifactOptions = {
3
+ code: string;
4
+ resourcePath: string;
5
+ environmentName?: string;
6
+ isBuild: boolean;
7
+ routeChunkCache?: RouteChunkCache;
8
+ routeChunkConfig: RouteChunkConfig;
9
+ };
10
+ type RouteClientEntryArtifact = {
11
+ code: string;
12
+ };
13
+ export type RouteChunkArtifactOptions = {
14
+ code: string;
15
+ resource: string;
16
+ resourcePath: string;
17
+ isBuild: boolean;
18
+ routeChunkCache?: RouteChunkCache;
19
+ routeChunkConfig: RouteChunkConfig;
20
+ };
21
+ type RouteChunkArtifact = {
22
+ code: string;
23
+ map: null;
24
+ };
25
+ export declare const buildRouteClientEntryCode: ({ exportNames, chunkedExports, isServer, resourcePath, }: {
26
+ exportNames: readonly string[];
27
+ chunkedExports: readonly string[];
28
+ isServer: boolean;
29
+ resourcePath: string;
30
+ }) => string;
31
+ export declare const createRouteClientEntryArtifact: ({ code, resourcePath, environmentName, isBuild, routeChunkCache, routeChunkConfig, }: RouteClientEntryArtifactOptions) => Promise<RouteClientEntryArtifact>;
32
+ export declare const createRouteChunkArtifact: ({ code, resource, resourcePath, isBuild, routeChunkCache, routeChunkConfig, }: RouteChunkArtifactOptions) => Promise<RouteChunkArtifact>;
33
+ export {};
@@ -0,0 +1,21 @@
1
+ import type { ParseResult } from 'yuku-parser';
2
+ export type AnyNode = Record<string, any>;
3
+ export type ProgramNode = AnyNode & {
4
+ body: AnyNode[];
5
+ };
6
+ export declare const getProgram: (ast: ParseResult | AnyNode) => ProgramNode;
7
+ export declare const getPatternIdentifierNames: (pattern: AnyNode | null | undefined, names?: Set<string>) => Set<string>;
8
+ export declare const getIdentifierNamesFromPattern: (pattern: AnyNode | null | undefined) => string[];
9
+ export declare const patternIncludesName: (pattern: AnyNode | null | undefined, name: string) => boolean;
10
+ export declare const getExportedName: (node: AnyNode | null | undefined) => string | null;
11
+ export declare const identifier: (name: string) => AnyNode;
12
+ export declare const literal: (value: string) => AnyNode;
13
+ export declare const callExpression: (callee: AnyNode, args: AnyNode[]) => AnyNode;
14
+ export declare const importDeclaration: (specifiers: Array<{
15
+ local: string;
16
+ imported: string;
17
+ }>, source: string) => AnyNode;
18
+ export declare const exportSpecifier: (local: string, exported: string) => AnyNode;
19
+ export declare const exportNamedDeclaration: (specifiers: AnyNode[]) => AnyNode;
20
+ export declare const variableDeclaration: (name: string, init: AnyNode) => AnyNode;
21
+ export declare const removeFromArray: <T>(array: T[], value: T) => void;
@@ -5,23 +5,30 @@ export type RouteChunkConfig = {
5
5
  appDirectory: string;
6
6
  rootRouteFile: string;
7
7
  };
8
- export type RouteChunkCacheEntry<T> = {
8
+ type RouteChunkCacheEntry<T> = {
9
9
  value: T;
10
10
  version: string;
11
11
  };
12
12
  export type RouteChunkCache = Map<string, RouteChunkCacheEntry<unknown>>;
13
13
  export type RouteChunkInfo = {
14
+ exportNames: string[];
14
15
  hasRouteChunks: boolean;
15
16
  hasRouteChunkByExportName: Record<RouteChunkExportName, boolean>;
16
17
  chunkedExports: RouteChunkExportName[];
17
18
  };
18
19
  export declare const routeChunkExportNames: RouteChunkExportName[];
19
20
  export declare const routeChunkNames: RouteChunkName[];
21
+ export declare const mightContainRouteChunkExportName: (source: string) => boolean;
22
+ export declare const emptyRouteChunkSnippet: () => string;
20
23
  export declare const detectRouteChunks: (code: string, cache: RouteChunkCache | undefined, cacheKey: string) => RouteChunkInfo;
21
24
  export declare const getRouteChunkCode: (code: string, chunkName: RouteChunkName, cache: RouteChunkCache | undefined, cacheKey: string) => string | undefined;
22
25
  export declare const getRouteChunkModuleId: (filePath: string, chunkName: RouteChunkName) => string;
23
26
  export declare const isRouteChunkModuleId: (id: string) => boolean;
24
27
  export declare const getRouteChunkNameFromModuleId: (id: string) => RouteChunkName | null;
28
+ export declare const shouldAnalyzeRouteChunks: (config: RouteChunkConfig, id: string, code: string) => boolean;
29
+ export declare const createEmptyRouteChunkByExportName: () => Record<RouteChunkExportName, boolean>;
30
+ export declare const buildEnforceChunkValidity: (exportNames: readonly string[]) => Record<RouteChunkExportName, boolean>;
31
+ export declare const buildManifestChunkValidity: (exportNames: ReadonlySet<string>, hasRouteChunkByExportName: Readonly<Record<RouteChunkExportName, boolean>>) => Record<RouteChunkExportName, boolean>;
25
32
  export declare const detectRouteChunksIfEnabled: (cache: RouteChunkCache | undefined, config: RouteChunkConfig, id: string, code: string) => Promise<RouteChunkInfo>;
26
33
  export declare const getRouteChunkIfEnabled: (cache: RouteChunkCache | undefined, config: RouteChunkConfig, id: string, chunkName: RouteChunkName, code: string) => Promise<string | null>;
27
34
  export declare const validateRouteChunks: (args: {
@@ -30,3 +37,4 @@ export declare const validateRouteChunks: (args: {
30
37
  valid: Record<RouteChunkExportName, boolean>;
31
38
  }) => void;
32
39
  export declare const getRouteChunkEntryName: (routeId: string, chunkName: RouteChunkExportName) => string;
40
+ export {};
@@ -0,0 +1,5 @@
1
+ import type { ParseResult } from 'yuku-parser';
2
+ import { type AnyNode } from './route-ast.js';
3
+ export declare function toFunctionExpression(decl: AnyNode): AnyNode;
4
+ export declare function toClassExpression(decl: AnyNode): AnyNode;
5
+ export declare const transformRoute: (ast: ParseResult | AnyNode) => void;
@@ -0,0 +1,6 @@
1
+ import { type ParseResult } from 'yuku-parser';
2
+ import { type AnyNode } from './route-ast.js';
3
+ export declare function validateDestructuredExports(id: AnyNode, exportsToRemove: readonly string[]): void;
4
+ export declare function invalidDestructureError(name: string): Error;
5
+ export declare const removeExports: (ast: ParseResult | AnyNode, exportsToRemove: readonly string[], exportsToRemoveSet?: ReadonlySet<string>) => boolean;
6
+ export declare const removeUnusedImports: (ast: ParseResult | AnyNode) => void;
@@ -0,0 +1,5 @@
1
+ export type RouteExportResolver = (specifier: string, importerPath: string) => Promise<string | null> | string | null;
2
+ export type RouteModuleResolveCallback = (error: Error | null, resolved?: string | false) => void;
3
+ export type RouteModuleResolver = (context: string, specifier: string, callback: RouteModuleResolveCallback) => void;
4
+ export declare const createBundlerRouteExportResolver: (resolveModule: RouteModuleResolver) => RouteExportResolver;
5
+ export declare const collectClientOnlyStubExportNames: (code: string, resourcePath: string, resolveModule?: RouteExportResolver) => Promise<Set<string>>;
@@ -0,0 +1,47 @@
1
+ import { generate } from './yuku.js';
2
+ import { type RouteExportResolver } from './route-export-resolution.js';
3
+ import { type RouteChunkCache, type RouteChunkConfig } from './route-chunks.js';
4
+ export type RouteTransformResult = {
5
+ code: string;
6
+ map?: ReturnType<typeof generate>['map'];
7
+ };
8
+ type BaseRouteTransformTask = {
9
+ code: string;
10
+ resourcePath: string;
11
+ };
12
+ export type RouteClientEntryTransformTask = BaseRouteTransformTask & {
13
+ kind: 'routeClientEntry';
14
+ environmentName?: string;
15
+ isBuild: boolean;
16
+ routeChunkConfig: RouteChunkConfig;
17
+ };
18
+ export type RouteChunkTransformTask = BaseRouteTransformTask & {
19
+ kind: 'routeChunk';
20
+ resource: string;
21
+ isBuild: boolean;
22
+ routeChunkConfig: RouteChunkConfig;
23
+ };
24
+ export type SplitRouteExportsTransformTask = BaseRouteTransformTask & {
25
+ kind: 'splitRouteExports';
26
+ routeChunkConfig: RouteChunkConfig;
27
+ };
28
+ export type ClientOnlyStubTransformTask = BaseRouteTransformTask & {
29
+ kind: 'clientOnlyStub';
30
+ resolveExportAllModule?: RouteExportResolver;
31
+ };
32
+ export type RouteModuleTransformTask = BaseRouteTransformTask & {
33
+ kind: 'routeModule';
34
+ resource: string;
35
+ environmentName: string;
36
+ sourceMaps: boolean;
37
+ ssr: boolean;
38
+ isBuild: boolean;
39
+ isSpaMode: boolean;
40
+ rootRoutePath: string | null;
41
+ };
42
+ export type RouteTransformTask = RouteClientEntryTransformTask | RouteChunkTransformTask | SplitRouteExportsTransformTask | ClientOnlyStubTransformTask | RouteModuleTransformTask;
43
+ export type RouteTransformTaskOptions = {
44
+ routeChunkCache?: RouteChunkCache;
45
+ };
46
+ export declare const executeRouteTransformTask: (task: RouteTransformTask, options?: RouteTransformTaskOptions) => Promise<RouteTransformResult>;
47
+ export {};
@@ -0,0 +1,27 @@
1
+ import { type FSWatcher } from 'node:fs';
2
+ import type { RsbuildConfig } from '@rsbuild/core';
3
+ import type { Route } from './types.js';
4
+ type RouteManifestSnapshotEntry = Pick<Route, 'caseSensitive' | 'file' | 'id' | 'index' | 'parentId' | 'path'>;
5
+ type RouteManifestSnapshotEntryPair = readonly [
6
+ string,
7
+ RouteManifestSnapshotEntry
8
+ ];
9
+ type RouteManifestSnapshotEntries = Record<string, RouteManifestSnapshotEntry> | ReadonlyArray<RouteManifestSnapshotEntryPair>;
10
+ type WatchFilesConfig = NonNullable<NonNullable<RsbuildConfig['dev']>['watchFiles']>;
11
+ export type WatchFileConfig = Exclude<WatchFilesConfig, readonly unknown[]> | Extract<WatchFilesConfig, readonly unknown[]>[number];
12
+ type DirectoryWatcher = Pick<FSWatcher, 'close'>;
13
+ type WatchDirectoryEntry = (directory: string, onChange: () => void, onError: (error: unknown) => void) => DirectoryWatcher;
14
+ export declare const mergeWatchFiles: (existing: WatchFilesConfig | undefined, additions: WatchFileConfig[]) => WatchFilesConfig;
15
+ export declare const getRouteRestartMarkerPath: (outputClientPath: string) => string;
16
+ export declare const createRouteManifestSnapshot: (routes: RouteManifestSnapshotEntries) => Set<string>;
17
+ export declare const ensureDevRestartMarker: (restartMarkerPath: string) => Promise<void>;
18
+ export declare const createRouteTopologyWatcher: ({ watchDirectory, getRouteTopology, initialRouteTopology, restartMarkerPath, onError, onRouteTopologyChange, watchDirectoryEntry: watchDirectoryOverride, }: {
19
+ watchDirectory: string;
20
+ getRouteTopology: () => Promise<Set<string>>;
21
+ initialRouteTopology?: Set<string>;
22
+ restartMarkerPath: string;
23
+ onError: (error: unknown) => void;
24
+ onRouteTopologyChange?: () => void | Promise<void>;
25
+ watchDirectoryEntry?: WatchDirectoryEntry;
26
+ }) => Promise<() => Promise<void>>;
27
+ export {};
@@ -0,0 +1,22 @@
1
+ import type { ReactRouterDevBuildPlan } from './dev-runtime-artifacts.js';
2
+ import type { Route } from './types.js';
3
+ export type ReactRouterServerBundleEntry = {
4
+ bundleId: string;
5
+ entryName: string;
6
+ };
7
+ export type ReactRouterServerBuildPlan = ReactRouterDevBuildPlan & {
8
+ serverBundleEntries: ReactRouterServerBundleEntry[];
9
+ };
10
+ export declare const createReactRouterServerBuildPlan: ({ routesByServerBundleId, serverBuildFile, defaultEntryName, }: {
11
+ routesByServerBundleId: Record<string, Record<string, Route>>;
12
+ serverBuildFile: string | undefined;
13
+ defaultEntryName: string;
14
+ }) => ReactRouterServerBuildPlan;
15
+ export declare const createReactRouterNodeEntries: ({ hasServerApp, isBuild, serverAppPath, entryServerPath, defaultEntryName, serverBundleEntries, }: {
16
+ hasServerApp: boolean;
17
+ isBuild: boolean;
18
+ serverAppPath: string;
19
+ entryServerPath: string;
20
+ defaultEntryName: string;
21
+ serverBundleEntries: readonly ReactRouterServerBundleEntry[];
22
+ }) => Record<string, string>;
@@ -1,3 +1,4 @@
1
+ import type { ServerBuild } from 'react-router';
1
2
  import type { Route } from './types.js';
2
3
  /**
3
4
  * Generates the server build template string.
@@ -33,6 +34,6 @@ interface ServerBuildOptions {
33
34
  declare function generateServerBuild(routes: Record<string, Route>, options: ServerBuildOptions & {
34
35
  federation?: boolean;
35
36
  }): string;
36
- export declare const normalizeBuildModule: <T extends Record<string, any>>(build: T) => T;
37
- export declare const resolveBuildExports: <T extends Record<string, any>>(build: T) => Promise<T>;
37
+ export declare function resolveServerBuildModule(buildModule: unknown, source: string): Promise<ServerBuild>;
38
+ export declare function resolveReactRouterServerBuild(buildModule: unknown): Promise<ServerBuild>;
38
39
  export { generateServerBuild };
@@ -1,6 +1,6 @@
1
1
  import { hydrateRoot } from "react-dom/client";
2
2
  import { HydratedRouter } from "react-router/dom";
3
- import { startTransition, createElement, StrictMode } from "../946.js";
4
- startTransition(()=>{
5
- hydrateRoot(document, createElement(StrictMode, null, createElement(HydratedRouter, null)));
3
+ import * as __rspack_external_react from "react";
4
+ __rspack_external_react.startTransition(()=>{
5
+ hydrateRoot(document, __rspack_external_react.createElement(__rspack_external_react.StrictMode, null, __rspack_external_react.createElement(HydratedRouter, null)));
6
6
  });