@tanstack/start-plugin-core 1.167.34 → 1.168.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 (197) hide show
  1. package/dist/esm/import-protection/adapterUtils.d.ts +27 -0
  2. package/dist/esm/import-protection/adapterUtils.js +31 -0
  3. package/dist/esm/import-protection/adapterUtils.js.map +1 -0
  4. package/dist/esm/import-protection/analysis.d.ts +36 -0
  5. package/dist/esm/import-protection/analysis.js +407 -0
  6. package/dist/esm/import-protection/analysis.js.map +1 -0
  7. package/dist/esm/{import-protection-plugin → import-protection}/ast.js +1 -1
  8. package/dist/esm/import-protection/ast.js.map +1 -0
  9. package/dist/esm/import-protection/constants.d.ts +11 -0
  10. package/dist/esm/{import-protection-plugin → import-protection}/constants.js +7 -2
  11. package/dist/esm/import-protection/constants.js.map +1 -0
  12. package/dist/esm/{import-protection-plugin → import-protection}/defaults.js +1 -1
  13. package/dist/esm/import-protection/defaults.js.map +1 -0
  14. package/dist/esm/{import-protection-plugin → import-protection}/extensionlessAbsoluteIdResolver.js +1 -1
  15. package/dist/esm/import-protection/extensionlessAbsoluteIdResolver.js.map +1 -0
  16. package/dist/esm/{import-protection-plugin → import-protection}/matchers.js +1 -1
  17. package/dist/esm/import-protection/matchers.js.map +1 -0
  18. package/dist/esm/{import-protection-plugin/rewriteDeniedImports.d.ts → import-protection/rewrite.d.ts} +0 -4
  19. package/dist/esm/import-protection/rewrite.js +121 -0
  20. package/dist/esm/import-protection/rewrite.js.map +1 -0
  21. package/dist/esm/{import-protection-plugin → import-protection}/sourceLocation.d.ts +32 -3
  22. package/dist/esm/{import-protection-plugin → import-protection}/sourceLocation.js +65 -10
  23. package/dist/esm/import-protection/sourceLocation.js.map +1 -0
  24. package/dist/esm/{import-protection-plugin → import-protection}/trace.d.ts +0 -1
  25. package/dist/esm/{import-protection-plugin → import-protection}/trace.js +1 -1
  26. package/dist/esm/import-protection/trace.js.map +1 -0
  27. package/dist/esm/{import-protection-plugin → import-protection}/utils.d.ts +18 -1
  28. package/dist/esm/{import-protection-plugin → import-protection}/utils.js +12 -19
  29. package/dist/esm/import-protection/utils.js.map +1 -0
  30. package/dist/esm/import-protection/virtualModules.d.ts +25 -0
  31. package/dist/esm/{import-protection-plugin → import-protection}/virtualModules.js +5 -117
  32. package/dist/esm/import-protection/virtualModules.js.map +1 -0
  33. package/dist/esm/index.d.ts +4 -0
  34. package/dist/esm/index.js +3 -1
  35. package/dist/esm/post-build.d.ts +9 -0
  36. package/dist/esm/post-build.js +37 -0
  37. package/dist/esm/post-build.js.map +1 -0
  38. package/dist/esm/prerender.d.ts +11 -0
  39. package/dist/esm/prerender.js +159 -0
  40. package/dist/esm/prerender.js.map +1 -0
  41. package/dist/esm/rsbuild/dev-server.d.ts +21 -0
  42. package/dist/esm/rsbuild/dev-server.js +76 -0
  43. package/dist/esm/rsbuild/dev-server.js.map +1 -0
  44. package/dist/esm/rsbuild/import-protection.d.ts +10 -0
  45. package/dist/esm/rsbuild/import-protection.js +775 -0
  46. package/dist/esm/rsbuild/import-protection.js.map +1 -0
  47. package/dist/esm/rsbuild/normalized-client-build.d.ts +18 -0
  48. package/dist/esm/rsbuild/normalized-client-build.js +207 -0
  49. package/dist/esm/rsbuild/normalized-client-build.js.map +1 -0
  50. package/dist/esm/rsbuild/planning.d.ts +52 -0
  51. package/dist/esm/rsbuild/planning.js +108 -0
  52. package/dist/esm/rsbuild/planning.js.map +1 -0
  53. package/dist/esm/rsbuild/plugin.d.ts +4 -0
  54. package/dist/esm/rsbuild/plugin.js +344 -0
  55. package/dist/esm/rsbuild/plugin.js.map +1 -0
  56. package/dist/esm/rsbuild/post-build.d.ts +6 -0
  57. package/dist/esm/rsbuild/post-build.js +57 -0
  58. package/dist/esm/rsbuild/post-build.js.map +1 -0
  59. package/dist/esm/rsbuild/schema.d.ts +3372 -0
  60. package/dist/esm/rsbuild/schema.js +12 -0
  61. package/dist/esm/rsbuild/schema.js.map +1 -0
  62. package/dist/esm/rsbuild/start-compiler-host.d.ts +20 -0
  63. package/dist/esm/rsbuild/start-compiler-host.js +150 -0
  64. package/dist/esm/rsbuild/start-compiler-host.js.map +1 -0
  65. package/dist/esm/rsbuild/start-router-plugin.d.ts +18 -0
  66. package/dist/esm/rsbuild/start-router-plugin.js +63 -0
  67. package/dist/esm/rsbuild/start-router-plugin.js.map +1 -0
  68. package/dist/esm/rsbuild/swc-rsc.d.ts +14 -0
  69. package/dist/esm/rsbuild/swc-rsc.js +93 -0
  70. package/dist/esm/rsbuild/swc-rsc.js.map +1 -0
  71. package/dist/esm/rsbuild/types.d.ts +17 -0
  72. package/dist/esm/rsbuild/types.js +0 -0
  73. package/dist/esm/rsbuild/virtual-modules.d.ts +53 -0
  74. package/dist/esm/rsbuild/virtual-modules.js +287 -0
  75. package/dist/esm/rsbuild/virtual-modules.js.map +1 -0
  76. package/dist/esm/schema.d.ts +43 -43
  77. package/dist/esm/schema.js +1 -1
  78. package/dist/esm/start-compiler/compiler.d.ts +1 -1
  79. package/dist/esm/start-compiler/compiler.js +80 -9
  80. package/dist/esm/start-compiler/compiler.js.map +1 -1
  81. package/dist/esm/start-compiler/handleCreateServerFn.js +9 -0
  82. package/dist/esm/start-compiler/handleCreateServerFn.js.map +1 -1
  83. package/dist/esm/start-compiler/host.js +5 -1
  84. package/dist/esm/start-compiler/host.js.map +1 -1
  85. package/dist/esm/start-compiler/types.d.ts +1 -0
  86. package/dist/esm/start-manifest-plugin/manifestBuilder.d.ts +3 -6
  87. package/dist/esm/start-manifest-plugin/manifestBuilder.js +34 -81
  88. package/dist/esm/start-manifest-plugin/manifestBuilder.js.map +1 -1
  89. package/dist/esm/utils.d.ts +1 -0
  90. package/dist/esm/utils.js +4 -1
  91. package/dist/esm/utils.js.map +1 -1
  92. package/dist/esm/{import-protection-plugin → vite/import-protection-plugin}/plugin.js +41 -92
  93. package/dist/esm/vite/import-protection-plugin/plugin.js.map +1 -0
  94. package/dist/esm/{import-protection-plugin → vite/import-protection-plugin}/types.d.ts +5 -5
  95. package/dist/esm/vite/import-protection-plugin/virtualModules.d.ts +8 -0
  96. package/dist/esm/vite/import-protection-plugin/virtualModules.js +49 -0
  97. package/dist/esm/vite/import-protection-plugin/virtualModules.js.map +1 -0
  98. package/dist/esm/vite/plugin.js +4 -12
  99. package/dist/esm/vite/plugin.js.map +1 -1
  100. package/dist/esm/vite/plugins.d.ts +1 -5
  101. package/dist/esm/vite/plugins.js +2 -17
  102. package/dist/esm/vite/plugins.js.map +1 -1
  103. package/dist/esm/vite/post-server-build.js +14 -32
  104. package/dist/esm/vite/post-server-build.js.map +1 -1
  105. package/dist/esm/vite/prerender.d.ts +2 -2
  106. package/dist/esm/vite/prerender.js +17 -147
  107. package/dist/esm/vite/prerender.js.map +1 -1
  108. package/dist/esm/vite/schema.d.ts +23 -23
  109. package/dist/esm/vite/start-compiler-plugin/hot-update.d.ts +2 -0
  110. package/dist/esm/vite/start-compiler-plugin/hot-update.js +16 -0
  111. package/dist/esm/vite/start-compiler-plugin/hot-update.js.map +1 -0
  112. package/dist/esm/vite/start-compiler-plugin/module-specifier.js +9 -4
  113. package/dist/esm/vite/start-compiler-plugin/module-specifier.js.map +1 -1
  114. package/dist/esm/vite/start-compiler-plugin/plugin.js +86 -13
  115. package/dist/esm/vite/start-compiler-plugin/plugin.js.map +1 -1
  116. package/dist/esm/vite/start-manifest-plugin/normalized-client-build.js +2 -2
  117. package/dist/esm/vite/start-manifest-plugin/normalized-client-build.js.map +1 -1
  118. package/dist/esm/vite/start-manifest-plugin/plugin.d.ts +1 -2
  119. package/dist/esm/vite/start-manifest-plugin/plugin.js +48 -14
  120. package/dist/esm/vite/start-manifest-plugin/plugin.js.map +1 -1
  121. package/package.json +17 -4
  122. package/src/import-protection/INTERNALS.md +266 -0
  123. package/src/import-protection/adapterUtils.ts +94 -0
  124. package/src/import-protection/analysis.ts +853 -0
  125. package/src/{import-protection-plugin → import-protection}/constants.ts +7 -0
  126. package/src/import-protection/rewrite.ts +229 -0
  127. package/src/{import-protection-plugin → import-protection}/sourceLocation.ts +125 -9
  128. package/src/{import-protection-plugin → import-protection}/trace.ts +0 -1
  129. package/src/{import-protection-plugin → import-protection}/utils.ts +35 -20
  130. package/src/{import-protection-plugin → import-protection}/virtualModules.ts +30 -177
  131. package/src/index.ts +5 -0
  132. package/src/post-build.ts +64 -0
  133. package/src/prerender.ts +292 -0
  134. package/src/rsbuild/INTERNALS-import-protection.md +169 -0
  135. package/src/rsbuild/dev-server.ts +129 -0
  136. package/src/rsbuild/import-protection.ts +1600 -0
  137. package/src/rsbuild/normalized-client-build.ts +346 -0
  138. package/src/rsbuild/planning.ts +234 -0
  139. package/src/rsbuild/plugin.ts +754 -0
  140. package/src/rsbuild/post-build.ts +96 -0
  141. package/src/rsbuild/schema.ts +31 -0
  142. package/src/rsbuild/start-compiler-host.ts +250 -0
  143. package/src/rsbuild/start-router-plugin.ts +86 -0
  144. package/src/rsbuild/swc-rsc.ts +166 -0
  145. package/src/rsbuild/types.ts +20 -0
  146. package/src/rsbuild/virtual-modules.ts +565 -0
  147. package/src/start-compiler/compiler.ts +153 -19
  148. package/src/start-compiler/handleCreateServerFn.ts +18 -0
  149. package/src/start-compiler/types.ts +1 -0
  150. package/src/start-manifest-plugin/manifestBuilder.ts +53 -116
  151. package/src/utils.ts +4 -0
  152. package/src/vite/import-protection-plugin/INTERNALS.md +187 -0
  153. package/src/{import-protection-plugin → vite/import-protection-plugin}/plugin.ts +73 -158
  154. package/src/{import-protection-plugin → vite/import-protection-plugin}/types.ts +5 -5
  155. package/src/vite/import-protection-plugin/virtualModules.ts +122 -0
  156. package/src/vite/plugin.ts +1 -18
  157. package/src/vite/plugins.ts +2 -33
  158. package/src/vite/post-server-build.ts +14 -57
  159. package/src/vite/prerender.ts +19 -260
  160. package/src/vite/start-compiler-plugin/hot-update.ts +24 -0
  161. package/src/vite/start-compiler-plugin/module-specifier.ts +15 -5
  162. package/src/vite/start-compiler-plugin/plugin.ts +193 -18
  163. package/src/vite/start-manifest-plugin/normalized-client-build.ts +15 -16
  164. package/src/vite/start-manifest-plugin/plugin.ts +121 -38
  165. package/dist/esm/import-protection-plugin/ast.js.map +0 -1
  166. package/dist/esm/import-protection-plugin/constants.d.ts +0 -6
  167. package/dist/esm/import-protection-plugin/constants.js.map +0 -1
  168. package/dist/esm/import-protection-plugin/defaults.js.map +0 -1
  169. package/dist/esm/import-protection-plugin/extensionlessAbsoluteIdResolver.js.map +0 -1
  170. package/dist/esm/import-protection-plugin/matchers.js.map +0 -1
  171. package/dist/esm/import-protection-plugin/plugin.js.map +0 -1
  172. package/dist/esm/import-protection-plugin/postCompileUsage.d.ts +0 -13
  173. package/dist/esm/import-protection-plugin/postCompileUsage.js +0 -63
  174. package/dist/esm/import-protection-plugin/postCompileUsage.js.map +0 -1
  175. package/dist/esm/import-protection-plugin/rewriteDeniedImports.js +0 -205
  176. package/dist/esm/import-protection-plugin/rewriteDeniedImports.js.map +0 -1
  177. package/dist/esm/import-protection-plugin/sourceLocation.js.map +0 -1
  178. package/dist/esm/import-protection-plugin/trace.js.map +0 -1
  179. package/dist/esm/import-protection-plugin/utils.js.map +0 -1
  180. package/dist/esm/import-protection-plugin/virtualModules.d.ts +0 -78
  181. package/dist/esm/import-protection-plugin/virtualModules.js.map +0 -1
  182. package/dist/esm/start-compiler/load-module.d.ts +0 -14
  183. package/dist/esm/start-compiler/load-module.js +0 -18
  184. package/dist/esm/start-compiler/load-module.js.map +0 -1
  185. package/src/import-protection-plugin/INTERNALS.md +0 -700
  186. package/src/import-protection-plugin/postCompileUsage.ts +0 -100
  187. package/src/import-protection-plugin/rewriteDeniedImports.ts +0 -379
  188. package/src/start-compiler/load-module.ts +0 -31
  189. /package/dist/esm/{import-protection-plugin → import-protection}/ast.d.ts +0 -0
  190. /package/dist/esm/{import-protection-plugin → import-protection}/defaults.d.ts +0 -0
  191. /package/dist/esm/{import-protection-plugin → import-protection}/extensionlessAbsoluteIdResolver.d.ts +0 -0
  192. /package/dist/esm/{import-protection-plugin → import-protection}/matchers.d.ts +0 -0
  193. /package/dist/esm/{import-protection-plugin → vite/import-protection-plugin}/plugin.d.ts +0 -0
  194. /package/src/{import-protection-plugin → import-protection}/ast.ts +0 -0
  195. /package/src/{import-protection-plugin → import-protection}/defaults.ts +0 -0
  196. /package/src/{import-protection-plugin → import-protection}/extensionlessAbsoluteIdResolver.ts +0 -0
  197. /package/src/{import-protection-plugin → import-protection}/matchers.ts +0 -0
@@ -32,7 +32,11 @@ function mergeServerFnsById(current, next) {
32
32
  current[id] = fn;
33
33
  }
34
34
  }
35
+ function matchesCodeFilters(code, filters) {
36
+ for (const pattern of filters) if (pattern.test(code)) return true;
37
+ return false;
38
+ }
35
39
  //#endregion
36
- export { createStartCompiler, mergeServerFnsById };
40
+ export { createStartCompiler, matchesCodeFilters, mergeServerFnsById };
37
41
 
38
42
  //# sourceMappingURL=host.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"host.js","names":[],"sources":["../../../src/start-compiler/host.ts"],"sourcesContent":["import { LookupKindsPerEnv, StartCompiler } from './compiler'\nimport { getLookupConfigurationsForEnv } from './config'\nimport type { CompileStartFrameworkOptions } from '../types'\nimport type {\n DevServerFnModuleSpecifierEncoder,\n GenerateFunctionIdFnOptional,\n ServerFn,\n} from './types'\n\nexport interface CreateStartCompilerOptions {\n env: 'client' | 'server'\n envName: string\n root: string\n framework: CompileStartFrameworkOptions\n providerEnvName: string\n mode: 'dev' | 'build'\n generateFunctionId?: GenerateFunctionIdFnOptional\n onServerFnsById?: (d: Record<string, ServerFn>) => void\n getKnownServerFns: () => Record<string, ServerFn>\n encodeModuleSpecifierInDev?: DevServerFnModuleSpecifierEncoder\n loadModule: (id: string) => Promise<void>\n resolveId: (id: string, importer?: string) => Promise<string | null>\n}\n\nexport function createStartCompiler(\n options: CreateStartCompilerOptions,\n): StartCompiler {\n return new StartCompiler({\n env: options.env,\n envName: options.envName,\n root: options.root,\n lookupKinds: LookupKindsPerEnv[options.env],\n lookupConfigurations: getLookupConfigurationsForEnv(\n options.env,\n options.framework,\n ),\n mode: options.mode,\n framework: options.framework,\n providerEnvName: options.providerEnvName,\n generateFunctionId: options.generateFunctionId,\n onServerFnsById: options.onServerFnsById,\n getKnownServerFns: options.getKnownServerFns,\n devServerFnModuleSpecifierEncoder: options.encodeModuleSpecifierInDev,\n loadModule: options.loadModule,\n resolveId: options.resolveId,\n })\n}\n\nexport function mergeServerFnsById(\n current: Record<string, ServerFn>,\n next: Record<string, ServerFn>,\n): void {\n for (const [id, fn] of Object.entries(next)) {\n const existing = current[id]\n\n if (existing) {\n current[id] = {\n ...fn,\n isClientReferenced:\n existing.isClientReferenced || fn.isClientReferenced,\n }\n continue\n }\n\n current[id] = fn\n }\n}\n\nexport function matchesCodeFilters(\n code: string,\n filters: ReadonlyArray<RegExp>,\n): boolean {\n for (const pattern of filters) {\n if (pattern.test(code)) {\n return true\n }\n }\n\n return false\n}\n"],"mappings":";;;AAwBA,SAAgB,oBACd,SACe;AACf,QAAO,IAAI,cAAc;EACvB,KAAK,QAAQ;EACb,SAAS,QAAQ;EACjB,MAAM,QAAQ;EACd,aAAa,kBAAkB,QAAQ;EACvC,sBAAsB,8BACpB,QAAQ,KACR,QAAQ,UACT;EACD,MAAM,QAAQ;EACd,WAAW,QAAQ;EACnB,iBAAiB,QAAQ;EACzB,oBAAoB,QAAQ;EAC5B,iBAAiB,QAAQ;EACzB,mBAAmB,QAAQ;EAC3B,mCAAmC,QAAQ;EAC3C,YAAY,QAAQ;EACpB,WAAW,QAAQ;EACpB,CAAC;;AAGJ,SAAgB,mBACd,SACA,MACM;AACN,MAAK,MAAM,CAAC,IAAI,OAAO,OAAO,QAAQ,KAAK,EAAE;EAC3C,MAAM,WAAW,QAAQ;AAEzB,MAAI,UAAU;AACZ,WAAQ,MAAM;IACZ,GAAG;IACH,oBACE,SAAS,sBAAsB,GAAG;IACrC;AACD;;AAGF,UAAQ,MAAM"}
1
+ {"version":3,"file":"host.js","names":[],"sources":["../../../src/start-compiler/host.ts"],"sourcesContent":["import { LookupKindsPerEnv, StartCompiler } from './compiler'\nimport { getLookupConfigurationsForEnv } from './config'\nimport type { CompileStartFrameworkOptions } from '../types'\nimport type {\n DevServerFnModuleSpecifierEncoder,\n GenerateFunctionIdFnOptional,\n ServerFn,\n} from './types'\n\nexport interface CreateStartCompilerOptions {\n env: 'client' | 'server'\n envName: string\n root: string\n framework: CompileStartFrameworkOptions\n providerEnvName: string\n mode: 'dev' | 'build'\n generateFunctionId?: GenerateFunctionIdFnOptional\n onServerFnsById?: (d: Record<string, ServerFn>) => void\n getKnownServerFns: () => Record<string, ServerFn>\n encodeModuleSpecifierInDev?: DevServerFnModuleSpecifierEncoder\n loadModule: (id: string) => Promise<void>\n resolveId: (id: string, importer?: string) => Promise<string | null>\n}\n\nexport function createStartCompiler(\n options: CreateStartCompilerOptions,\n): StartCompiler {\n return new StartCompiler({\n env: options.env,\n envName: options.envName,\n root: options.root,\n lookupKinds: LookupKindsPerEnv[options.env],\n lookupConfigurations: getLookupConfigurationsForEnv(\n options.env,\n options.framework,\n ),\n mode: options.mode,\n framework: options.framework,\n providerEnvName: options.providerEnvName,\n generateFunctionId: options.generateFunctionId,\n onServerFnsById: options.onServerFnsById,\n getKnownServerFns: options.getKnownServerFns,\n devServerFnModuleSpecifierEncoder: options.encodeModuleSpecifierInDev,\n loadModule: options.loadModule,\n resolveId: options.resolveId,\n })\n}\n\nexport function mergeServerFnsById(\n current: Record<string, ServerFn>,\n next: Record<string, ServerFn>,\n): void {\n for (const [id, fn] of Object.entries(next)) {\n const existing = current[id]\n\n if (existing) {\n current[id] = {\n ...fn,\n isClientReferenced:\n existing.isClientReferenced || fn.isClientReferenced,\n }\n continue\n }\n\n current[id] = fn\n }\n}\n\nexport function matchesCodeFilters(\n code: string,\n filters: ReadonlyArray<RegExp>,\n): boolean {\n for (const pattern of filters) {\n if (pattern.test(code)) {\n return true\n }\n }\n\n return false\n}\n"],"mappings":";;;AAwBA,SAAgB,oBACd,SACe;AACf,QAAO,IAAI,cAAc;EACvB,KAAK,QAAQ;EACb,SAAS,QAAQ;EACjB,MAAM,QAAQ;EACd,aAAa,kBAAkB,QAAQ;EACvC,sBAAsB,8BACpB,QAAQ,KACR,QAAQ,UACT;EACD,MAAM,QAAQ;EACd,WAAW,QAAQ;EACnB,iBAAiB,QAAQ;EACzB,oBAAoB,QAAQ;EAC5B,iBAAiB,QAAQ;EACzB,mBAAmB,QAAQ;EAC3B,mCAAmC,QAAQ;EAC3C,YAAY,QAAQ;EACpB,WAAW,QAAQ;EACpB,CAAC;;AAGJ,SAAgB,mBACd,SACA,MACM;AACN,MAAK,MAAM,CAAC,IAAI,OAAO,OAAO,QAAQ,KAAK,EAAE;EAC3C,MAAM,WAAW,QAAQ;AAEzB,MAAI,UAAU;AACZ,WAAQ,MAAM;IACZ,GAAG;IACH,oBACE,SAAS,sBAAsB,GAAG;IACrC;AACD;;AAGF,UAAQ,MAAM;;;AAIlB,SAAgB,mBACd,MACA,SACS;AACT,MAAK,MAAM,WAAW,QACpB,KAAI,QAAQ,KAAK,KAAK,CACpB,QAAO;AAIX,QAAO"}
@@ -11,6 +11,7 @@ export interface CompilationContext {
11
11
  readonly id: string;
12
12
  readonly env: 'client' | 'server';
13
13
  readonly envName: string;
14
+ readonly mode: 'dev' | 'build';
14
15
  readonly root: string;
15
16
  /** The framework being used (e.g., 'react', 'solid') */
16
17
  readonly framework: CompileStartFrameworkOptions;
@@ -12,7 +12,6 @@ interface ScannedClientChunks {
12
12
  entryChunk: NormalizedClientChunk;
13
13
  chunksByFileName: ReadonlyMap<string, NormalizedClientChunk>;
14
14
  routeChunksByFilePath: ReadonlyMap<string, Array<NormalizedClientChunk>>;
15
- routeEntryChunks: ReadonlySet<NormalizedClientChunk>;
16
15
  }
17
16
  interface ManifestAssetResolvers {
18
17
  getAssetPath: (fileName: string) => string;
@@ -29,14 +28,11 @@ export declare function buildStartManifest(options: {
29
28
  clientBuild: NormalizedClientBuild;
30
29
  routeTreeRoutes: RouteTreeRoutes;
31
30
  basePath: string;
31
+ additionalRouteAssets?: Partial<Record<string, ReadonlyArray<RouterManagedTag>>>;
32
32
  }): StartManifest;
33
33
  export declare function serializeStartManifest(startManifest: StartManifest): string;
34
34
  export declare function scanClientChunks(clientBuild: NormalizedClientBuild): ScannedClientChunks;
35
- export declare function collectDynamicImportCss(routeEntryChunks: ReadonlySet<NormalizedClientChunk>, chunksByFileName: ReadonlyMap<string, NormalizedClientChunk>, entryChunk?: NormalizedClientChunk): Set<string>;
36
- export declare function createManifestAssetResolvers(options: {
37
- basePath: string;
38
- hashedCssFiles?: Set<string>;
39
- }): ManifestAssetResolvers;
35
+ export declare function createManifestAssetResolvers(basePath: string): ManifestAssetResolvers;
40
36
  export declare function createChunkCssAssetCollector(options: {
41
37
  chunksByFileName: ReadonlyMap<string, NormalizedClientChunk>;
42
38
  getStylesheetAsset: (cssFile: string) => RouterManagedTag;
@@ -49,5 +45,6 @@ export declare function buildRouteManifestRoutes(options: {
49
45
  chunksByFileName: ReadonlyMap<string, NormalizedClientChunk>;
50
46
  entryChunk: NormalizedClientChunk;
51
47
  assetResolvers: ManifestAssetResolvers;
48
+ additionalRouteAssets?: Partial<Record<string, ReadonlyArray<RouterManagedTag>>>;
52
49
  }): Record<string, RouteTreeRoute>;
53
50
  export { getRouteFilePathsFromModuleIds, normalizeViteClientBuild, normalizeViteClientChunk, };
@@ -3,8 +3,6 @@ import { resolveManifestAssetLink, rootRouteId } from "@tanstack/router-core";
3
3
  import { joinURL } from "ufo";
4
4
  import { serialize } from "seroval";
5
5
  //#region src/start-manifest-plugin/manifestBuilder.ts
6
- var ROUTER_MANAGED_MODE = 1;
7
- var NON_ROUTE_DYNAMIC_MODE = 2;
8
6
  var VISITING_CHUNK = 1;
9
7
  function appendUniqueStrings(target, source) {
10
8
  if (source.length === 0) return target;
@@ -34,18 +32,18 @@ function appendUniqueAssets(target, source) {
34
32
  return result ?? target;
35
33
  }
36
34
  function getAssetIdentity(asset) {
37
- if (asset.tag === "link" || asset.tag === "script") {
38
- const attrs = asset.attrs ?? {};
39
- return [
40
- asset.tag,
41
- "href" in attrs ? String(attrs.href) : "",
42
- "src" in attrs ? String(attrs.src) : "",
43
- "rel" in attrs ? String(attrs.rel) : "",
44
- "type" in attrs ? String(attrs.type) : "",
45
- asset.children ?? ""
46
- ].join("|");
47
- }
48
- return JSON.stringify(asset);
35
+ return JSON.stringify({
36
+ tag: asset.tag,
37
+ attrs: normalizeAssetAttrs(asset.attrs),
38
+ children: "children" in asset ? asset.children ?? null : null
39
+ });
40
+ }
41
+ function normalizeAssetAttrs(attrs) {
42
+ if (!attrs) return null;
43
+ const entries = Object.entries(attrs);
44
+ if (entries.length === 0) return null;
45
+ entries.sort(([left], [right]) => left.localeCompare(right));
46
+ return Object.fromEntries(entries);
49
47
  }
50
48
  function mergeRouteChunkData(options) {
51
49
  const chunkAssets = options.getChunkCssAssets(options.chunk);
@@ -55,17 +53,14 @@ function mergeRouteChunkData(options) {
55
53
  }
56
54
  function buildStartManifest(options) {
57
55
  const scannedChunks = scanClientChunks(options.clientBuild);
58
- const hashedCssFiles = collectDynamicImportCss(scannedChunks.routeEntryChunks, scannedChunks.chunksByFileName, scannedChunks.entryChunk);
59
- const assetResolvers = createManifestAssetResolvers({
60
- basePath: options.basePath,
61
- hashedCssFiles
62
- });
56
+ const assetResolvers = createManifestAssetResolvers(options.basePath);
63
57
  const routes = buildRouteManifestRoutes({
64
58
  routeTreeRoutes: options.routeTreeRoutes,
65
59
  routeChunksByFilePath: scannedChunks.routeChunksByFilePath,
66
60
  chunksByFileName: scannedChunks.chunksByFileName,
67
61
  entryChunk: scannedChunks.entryChunk,
68
- assetResolvers
62
+ assetResolvers,
63
+ additionalRouteAssets: options.additionalRouteAssets
69
64
  });
70
65
  dedupeNestedRouteManifestEntries(rootRouteId, routes[rootRouteId], routes);
71
66
  for (const routeId of Object.keys(routes)) {
@@ -85,87 +80,40 @@ function serializeStartManifest(startManifest) {
85
80
  function scanClientChunks(clientBuild) {
86
81
  const entryChunk = clientBuild.chunksByFileName.get(clientBuild.entryChunkFileName);
87
82
  if (!entryChunk) throw new Error(`Missing entry chunk: ${clientBuild.entryChunkFileName}`);
88
- const routeEntryChunks = /* @__PURE__ */ new Set();
89
83
  const routeChunksByFilePath = /* @__PURE__ */ new Map();
90
- for (const chunk of clientBuild.chunksByFileName.values()) if (chunk.routeFilePaths.length > 0) {
91
- routeEntryChunks.add(chunk);
92
- for (const routeFilePath of chunk.routeFilePaths) {
93
- let chunks = routeChunksByFilePath.get(routeFilePath);
94
- if (chunks === void 0) {
95
- chunks = [];
96
- routeChunksByFilePath.set(routeFilePath, chunks);
97
- }
98
- chunks.push(chunk);
84
+ for (const chunk of clientBuild.chunksByFileName.values()) if (chunk.routeFilePaths.length > 0) for (const routeFilePath of chunk.routeFilePaths) {
85
+ let chunks = routeChunksByFilePath.get(routeFilePath);
86
+ if (chunks === void 0) {
87
+ chunks = [];
88
+ routeChunksByFilePath.set(routeFilePath, chunks);
99
89
  }
90
+ chunks.push(chunk);
100
91
  }
101
92
  return {
102
93
  entryChunk,
103
94
  chunksByFileName: clientBuild.chunksByFileName,
104
- routeChunksByFilePath,
105
- routeEntryChunks
95
+ routeChunksByFilePath
106
96
  };
107
97
  }
108
- function collectDynamicImportCss(routeEntryChunks, chunksByFileName, entryChunk) {
109
- const routerManagedCssFiles = /* @__PURE__ */ new Set();
110
- const nonRouteDynamicCssFiles = /* @__PURE__ */ new Set();
111
- const hashedCssFiles = /* @__PURE__ */ new Set();
112
- const visitedByChunk = /* @__PURE__ */ new Map();
113
- const chunkStack = [];
114
- const modeStack = [];
115
- for (const routeEntryChunk of routeEntryChunks) {
116
- chunkStack.push(routeEntryChunk);
117
- modeStack.push(ROUTER_MANAGED_MODE);
118
- }
119
- if (entryChunk) {
120
- chunkStack.push(entryChunk);
121
- modeStack.push(ROUTER_MANAGED_MODE);
122
- }
123
- while (chunkStack.length > 0) {
124
- const chunk = chunkStack.pop();
125
- const mode = modeStack.pop();
126
- const previousMode = visitedByChunk.get(chunk) ?? 0;
127
- if ((previousMode & mode) === mode) continue;
128
- visitedByChunk.set(chunk, previousMode | mode);
129
- if ((mode & ROUTER_MANAGED_MODE) !== 0) for (const cssFile of chunk.css) routerManagedCssFiles.add(cssFile);
130
- if ((mode & NON_ROUTE_DYNAMIC_MODE) !== 0) for (const cssFile of chunk.css) nonRouteDynamicCssFiles.add(cssFile);
131
- for (let i = 0; i < chunk.imports.length; i++) {
132
- const importedChunk = chunksByFileName.get(chunk.imports[i]);
133
- if (importedChunk) {
134
- chunkStack.push(importedChunk);
135
- modeStack.push(mode);
136
- }
137
- }
138
- for (let i = 0; i < chunk.dynamicImports.length; i++) {
139
- const dynamicImportedChunk = chunksByFileName.get(chunk.dynamicImports[i]);
140
- if (dynamicImportedChunk) {
141
- chunkStack.push(dynamicImportedChunk);
142
- modeStack.push((mode & NON_ROUTE_DYNAMIC_MODE) !== 0 || !routeEntryChunks.has(dynamicImportedChunk) ? NON_ROUTE_DYNAMIC_MODE : ROUTER_MANAGED_MODE);
143
- }
144
- }
145
- }
146
- for (const cssFile of routerManagedCssFiles) if (nonRouteDynamicCssFiles.has(cssFile)) hashedCssFiles.add(cssFile);
147
- return hashedCssFiles;
148
- }
149
- function createManifestAssetResolvers(options) {
98
+ function createManifestAssetResolvers(basePath) {
150
99
  const assetPathByFileName = /* @__PURE__ */ new Map();
151
100
  const stylesheetAssetByFileName = /* @__PURE__ */ new Map();
152
101
  const preloadsByChunk = /* @__PURE__ */ new Map();
153
102
  const getAssetPath = (fileName) => {
154
103
  const cachedPath = assetPathByFileName.get(fileName);
155
104
  if (cachedPath) return cachedPath;
156
- const assetPath = joinURL(options.basePath, fileName);
105
+ const assetPath = joinURL(basePath, fileName);
157
106
  assetPathByFileName.set(fileName, assetPath);
158
107
  return assetPath;
159
108
  };
160
109
  const getStylesheetAsset = (cssFile) => {
161
110
  const cachedAsset = stylesheetAssetByFileName.get(cssFile);
162
111
  if (cachedAsset) return cachedAsset;
163
- const href = getAssetPath(cssFile);
164
112
  const asset = {
165
113
  tag: "link",
166
114
  attrs: {
167
115
  rel: "stylesheet",
168
- href: options.hashedCssFiles?.has(cssFile) ? `${href}#` : href,
116
+ href: getAssetPath(cssFile),
169
117
  type: "text/css"
170
118
  }
171
119
  };
@@ -190,9 +138,8 @@ function createChunkCssAssetCollector(options) {
190
138
  const assetsByChunk = /* @__PURE__ */ new Map();
191
139
  const stateByChunk = /* @__PURE__ */ new Map();
192
140
  const appendAsset = (assets, seenAssets, asset) => {
193
- const identity = getAssetIdentity(asset);
194
- if (seenAssets.has(identity)) return;
195
- seenAssets.add(identity);
141
+ if (seenAssets.has(asset)) return;
142
+ seenAssets.add(asset);
196
143
  assets.push(asset);
197
144
  };
198
145
  const getChunkCssAssets = (chunk) => {
@@ -249,6 +196,12 @@ function buildRouteManifestRoutes(options) {
249
196
  getChunkCssAssets,
250
197
  getChunkPreloads: options.assetResolvers.getChunkPreloads
251
198
  });
199
+ if (options.additionalRouteAssets) for (const [routeId, assets] of Object.entries(options.additionalRouteAssets)) {
200
+ if (!assets || assets.length === 0) continue;
201
+ if (!(routeId in options.routeTreeRoutes)) throw new Error(`expected additionalRouteAssets routeId to exist in routeTreeRoutes: ${routeId}`);
202
+ const route = routes[routeId] = routes[routeId] || {};
203
+ route.assets = appendUniqueAssets(route.assets, [...assets]);
204
+ }
252
205
  return routes;
253
206
  }
254
207
  function dedupeNestedRouteManifestEntries(routeId, route, routesById, seenPreloads = /* @__PURE__ */ new Set(), seenAssets = /* @__PURE__ */ new Set()) {
@@ -297,6 +250,6 @@ function dedupeNestedRouteManifestEntries(routeId, route, routesById, seenPreloa
297
250
  if (routeAssets) for (let i = routeAssets.length - 1; i >= 0; i--) seenAssets.delete(getAssetIdentity(routeAssets[i]));
298
251
  }
299
252
  //#endregion
300
- export { buildStartManifest, serializeStartManifest };
253
+ export { buildStartManifest, createManifestAssetResolvers, serializeStartManifest };
301
254
 
302
255
  //# sourceMappingURL=manifestBuilder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"manifestBuilder.js","names":[],"sources":["../../../src/start-manifest-plugin/manifestBuilder.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/prefer-for-of */\nimport { serialize } from 'seroval'\nimport { joinURL } from 'ufo'\nimport { resolveManifestAssetLink, rootRouteId } from '@tanstack/router-core'\nimport {\n getRouteFilePathsFromModuleIds,\n normalizeViteClientBuild,\n normalizeViteClientChunk,\n} from '../vite/start-manifest-plugin/normalized-client-build'\nimport type { ManifestAssetLink, RouterManagedTag } from '@tanstack/router-core'\nimport type { NormalizedClientBuild, NormalizedClientChunk } from '../types'\n\nconst ROUTER_MANAGED_MODE = 1\nconst NON_ROUTE_DYNAMIC_MODE = 2\nconst VISITING_CHUNK = 1\n\ntype RouteTreeRoute = {\n filePath?: string\n preloads?: Array<string>\n assets?: Array<RouterManagedTag>\n children?: Array<string>\n}\n\ntype RouteTreeRoutes = Record<string, RouteTreeRoute>\n\ninterface ScannedClientChunks {\n entryChunk: NormalizedClientChunk\n chunksByFileName: ReadonlyMap<string, NormalizedClientChunk>\n routeChunksByFilePath: ReadonlyMap<string, Array<NormalizedClientChunk>>\n routeEntryChunks: ReadonlySet<NormalizedClientChunk>\n}\n\ninterface ManifestAssetResolvers {\n getAssetPath: (fileName: string) => string\n getChunkPreloads: (chunk: NormalizedClientChunk) => Array<string>\n getStylesheetAsset: (cssFile: string) => RouterManagedTag\n}\n\ntype DedupeRoute = {\n preloads?: Array<ManifestAssetLink>\n assets?: Array<RouterManagedTag>\n children?: Array<string>\n}\n\nexport interface StartManifest {\n routes: Record<string, RouteTreeRoute>\n clientEntry: string\n}\n\nexport function appendUniqueStrings(\n target: Array<string> | undefined,\n source: Array<string>,\n) {\n // Similar to Set.prototype.union, but for ordered arrays.\n // It preserves first-seen order and returns the original target array when\n // source contributes no new values, which avoids extra allocations.\n if (source.length === 0) {\n return target\n }\n\n if (!target || target.length === 0) {\n return source\n }\n\n const seen = new Set(target)\n let result: Array<string> | undefined\n\n for (const value of source) {\n if (seen.has(value)) {\n continue\n }\n\n seen.add(value)\n if (!result) {\n result = target.slice()\n }\n result.push(value)\n }\n\n return result ?? target\n}\n\nexport function appendUniqueAssets(\n target: Array<RouterManagedTag> | undefined,\n source: Array<RouterManagedTag>,\n) {\n // Same semantics as appendUniqueStrings, but uniqueness is based on the\n // serialized asset identity instead of object reference.\n if (source.length === 0) {\n return target\n }\n\n if (!target || target.length === 0) {\n return source\n }\n\n const seen = new Set(target.map(getAssetIdentity))\n let result: Array<RouterManagedTag> | undefined\n\n for (const asset of source) {\n const identity = getAssetIdentity(asset)\n if (seen.has(identity)) {\n continue\n }\n\n seen.add(identity)\n if (!result) {\n result = target.slice()\n }\n result.push(asset)\n }\n\n return result ?? target\n}\n\nfunction getAssetIdentity(asset: RouterManagedTag) {\n if (asset.tag === 'link' || asset.tag === 'script') {\n const attrs = asset.attrs ?? {}\n return [\n asset.tag,\n 'href' in attrs ? String(attrs.href) : '',\n 'src' in attrs ? String(attrs.src) : '',\n 'rel' in attrs ? String(attrs.rel) : '',\n 'type' in attrs ? String(attrs.type) : '',\n asset.children ?? '',\n ].join('|')\n }\n\n return JSON.stringify(asset)\n}\n\nfunction mergeRouteChunkData(options: {\n route: RouteTreeRoute\n chunk: NormalizedClientChunk\n getChunkCssAssets: (chunk: NormalizedClientChunk) => Array<RouterManagedTag>\n getChunkPreloads: (chunk: NormalizedClientChunk) => Array<string>\n}) {\n const chunkAssets = options.getChunkCssAssets(options.chunk)\n const chunkPreloads = options.getChunkPreloads(options.chunk)\n\n options.route.assets = appendUniqueAssets(options.route.assets, chunkAssets)\n options.route.preloads = appendUniqueStrings(\n options.route.preloads,\n chunkPreloads,\n )\n}\n\nexport function buildStartManifest(options: {\n clientBuild: NormalizedClientBuild\n routeTreeRoutes: RouteTreeRoutes\n basePath: string\n}): StartManifest {\n const scannedChunks = scanClientChunks(options.clientBuild)\n const hashedCssFiles = collectDynamicImportCss(\n scannedChunks.routeEntryChunks,\n scannedChunks.chunksByFileName,\n scannedChunks.entryChunk,\n )\n const assetResolvers = createManifestAssetResolvers({\n basePath: options.basePath,\n hashedCssFiles,\n })\n\n const routes = buildRouteManifestRoutes({\n routeTreeRoutes: options.routeTreeRoutes,\n routeChunksByFilePath: scannedChunks.routeChunksByFilePath,\n chunksByFileName: scannedChunks.chunksByFileName,\n entryChunk: scannedChunks.entryChunk,\n assetResolvers,\n })\n\n dedupeNestedRouteManifestEntries(rootRouteId, routes[rootRouteId]!, routes)\n\n // Prune routes with no assets or preloads from the manifest\n for (const routeId of Object.keys(routes)) {\n const route = routes[routeId]!\n const hasAssets = route.assets && route.assets.length > 0\n const hasPreloads = route.preloads && route.preloads.length > 0\n if (!hasAssets && !hasPreloads) {\n delete routes[routeId]\n }\n }\n\n return {\n routes,\n clientEntry: assetResolvers.getAssetPath(scannedChunks.entryChunk.fileName),\n }\n}\n\nexport function serializeStartManifest(startManifest: StartManifest) {\n return serialize(startManifest)\n}\n\nexport function scanClientChunks(\n clientBuild: NormalizedClientBuild,\n): ScannedClientChunks {\n const entryChunk = clientBuild.chunksByFileName.get(\n clientBuild.entryChunkFileName,\n )\n\n if (!entryChunk) {\n throw new Error(`Missing entry chunk: ${clientBuild.entryChunkFileName}`)\n }\n\n const routeEntryChunks = new Set<NormalizedClientChunk>()\n const routeChunksByFilePath = new Map<string, Array<NormalizedClientChunk>>()\n\n for (const chunk of clientBuild.chunksByFileName.values()) {\n if (chunk.routeFilePaths.length > 0) {\n routeEntryChunks.add(chunk)\n\n for (const routeFilePath of chunk.routeFilePaths) {\n let chunks = routeChunksByFilePath.get(routeFilePath)\n if (chunks === undefined) {\n chunks = []\n routeChunksByFilePath.set(routeFilePath, chunks)\n }\n chunks.push(chunk)\n }\n }\n }\n\n return {\n entryChunk,\n chunksByFileName: clientBuild.chunksByFileName,\n routeChunksByFilePath,\n routeEntryChunks,\n }\n}\n\nexport function collectDynamicImportCss(\n routeEntryChunks: ReadonlySet<NormalizedClientChunk>,\n chunksByFileName: ReadonlyMap<string, NormalizedClientChunk>,\n entryChunk?: NormalizedClientChunk,\n) {\n const routerManagedCssFiles = new Set<string>()\n const nonRouteDynamicCssFiles = new Set<string>()\n const hashedCssFiles = new Set<string>()\n const visitedByChunk = new Map<NormalizedClientChunk, number>()\n const chunkStack: Array<NormalizedClientChunk> = []\n const modeStack: Array<number> = []\n\n for (const routeEntryChunk of routeEntryChunks) {\n chunkStack.push(routeEntryChunk)\n modeStack.push(ROUTER_MANAGED_MODE)\n }\n\n if (entryChunk) {\n chunkStack.push(entryChunk)\n modeStack.push(ROUTER_MANAGED_MODE)\n }\n\n while (chunkStack.length > 0) {\n const chunk = chunkStack.pop()!\n const mode = modeStack.pop()!\n const previousMode = visitedByChunk.get(chunk) ?? 0\n\n if ((previousMode & mode) === mode) {\n continue\n }\n\n visitedByChunk.set(chunk, previousMode | mode)\n\n if ((mode & ROUTER_MANAGED_MODE) !== 0) {\n for (const cssFile of chunk.css) {\n routerManagedCssFiles.add(cssFile)\n }\n }\n\n if ((mode & NON_ROUTE_DYNAMIC_MODE) !== 0) {\n for (const cssFile of chunk.css) {\n nonRouteDynamicCssFiles.add(cssFile)\n }\n }\n\n for (let i = 0; i < chunk.imports.length; i++) {\n const importedChunk = chunksByFileName.get(chunk.imports[i]!)\n if (importedChunk) {\n chunkStack.push(importedChunk)\n modeStack.push(mode)\n }\n }\n\n for (let i = 0; i < chunk.dynamicImports.length; i++) {\n const dynamicImportedChunk = chunksByFileName.get(\n chunk.dynamicImports[i]!,\n )\n if (dynamicImportedChunk) {\n chunkStack.push(dynamicImportedChunk)\n modeStack.push(\n (mode & NON_ROUTE_DYNAMIC_MODE) !== 0 ||\n !routeEntryChunks.has(dynamicImportedChunk)\n ? NON_ROUTE_DYNAMIC_MODE\n : ROUTER_MANAGED_MODE,\n )\n }\n }\n }\n\n for (const cssFile of routerManagedCssFiles) {\n if (nonRouteDynamicCssFiles.has(cssFile)) {\n hashedCssFiles.add(cssFile)\n }\n }\n\n return hashedCssFiles\n}\n\nexport function createManifestAssetResolvers(options: {\n basePath: string\n hashedCssFiles?: Set<string>\n}): ManifestAssetResolvers {\n const assetPathByFileName = new Map<string, string>()\n const stylesheetAssetByFileName = new Map<string, RouterManagedTag>()\n const preloadsByChunk = new Map<NormalizedClientChunk, Array<string>>()\n\n const getAssetPath = (fileName: string) => {\n const cachedPath = assetPathByFileName.get(fileName)\n if (cachedPath) {\n return cachedPath\n }\n\n const assetPath = joinURL(options.basePath, fileName)\n assetPathByFileName.set(fileName, assetPath)\n return assetPath\n }\n\n const getStylesheetAsset = (cssFile: string) => {\n const cachedAsset = stylesheetAssetByFileName.get(cssFile)\n if (cachedAsset) {\n return cachedAsset\n }\n\n const href = getAssetPath(cssFile)\n const asset = {\n tag: 'link',\n attrs: {\n rel: 'stylesheet',\n href: options.hashedCssFiles?.has(cssFile) ? `${href}#` : href,\n type: 'text/css',\n },\n } satisfies RouterManagedTag\n\n stylesheetAssetByFileName.set(cssFile, asset)\n return asset\n }\n\n const getChunkPreloads = (chunk: NormalizedClientChunk) => {\n const cachedPreloads = preloadsByChunk.get(chunk)\n if (cachedPreloads) {\n return cachedPreloads\n }\n\n const preloads = [getAssetPath(chunk.fileName)]\n\n for (let i = 0; i < chunk.imports.length; i++) {\n preloads.push(getAssetPath(chunk.imports[i]!))\n }\n\n preloadsByChunk.set(chunk, preloads)\n return preloads\n }\n\n return {\n getAssetPath,\n getChunkPreloads,\n getStylesheetAsset,\n }\n}\n\nexport function createChunkCssAssetCollector(options: {\n chunksByFileName: ReadonlyMap<string, NormalizedClientChunk>\n getStylesheetAsset: (cssFile: string) => RouterManagedTag\n}) {\n const assetsByChunk = new Map<\n NormalizedClientChunk,\n Array<RouterManagedTag>\n >()\n const stateByChunk = new Map<NormalizedClientChunk, number>()\n\n const appendAsset = (\n assets: Array<RouterManagedTag>,\n seenAssets: Set<string>,\n asset: RouterManagedTag,\n ) => {\n const identity = getAssetIdentity(asset)\n if (seenAssets.has(identity)) {\n return\n }\n\n seenAssets.add(identity)\n assets.push(asset)\n }\n\n const getChunkCssAssets = (\n chunk: NormalizedClientChunk,\n ): Array<RouterManagedTag> => {\n const cachedAssets = assetsByChunk.get(chunk)\n if (cachedAssets) {\n return cachedAssets\n }\n\n if (stateByChunk.get(chunk) === VISITING_CHUNK) {\n return []\n }\n stateByChunk.set(chunk, VISITING_CHUNK)\n\n const assets: Array<RouterManagedTag> = []\n const seenAssets = new Set<string>()\n\n for (const cssFile of chunk.css) {\n appendAsset(assets, seenAssets, options.getStylesheetAsset(cssFile))\n }\n\n for (let i = 0; i < chunk.imports.length; i++) {\n const importedChunk = options.chunksByFileName.get(chunk.imports[i]!)\n if (!importedChunk) {\n continue\n }\n\n const importedAssets = getChunkCssAssets(importedChunk)\n for (let j = 0; j < importedAssets.length; j++) {\n appendAsset(assets, seenAssets, importedAssets[j]!)\n }\n }\n\n stateByChunk.delete(chunk)\n assetsByChunk.set(chunk, assets)\n return assets\n }\n\n return { getChunkCssAssets }\n}\n\nexport function buildRouteManifestRoutes(options: {\n routeTreeRoutes: RouteTreeRoutes\n routeChunksByFilePath: ReadonlyMap<\n string,\n ReadonlyArray<NormalizedClientChunk>\n >\n chunksByFileName: ReadonlyMap<string, NormalizedClientChunk>\n entryChunk: NormalizedClientChunk\n assetResolvers: ManifestAssetResolvers\n}) {\n const routes: Record<string, RouteTreeRoute> = {}\n const getChunkCssAssets = createChunkCssAssetCollector({\n chunksByFileName: options.chunksByFileName,\n getStylesheetAsset: options.assetResolvers.getStylesheetAsset,\n }).getChunkCssAssets\n\n for (const [routeId, route] of Object.entries(options.routeTreeRoutes)) {\n if (!route.filePath) {\n if (routeId === rootRouteId) {\n routes[routeId] = route\n continue\n }\n\n throw new Error(`expected filePath to be set for ${routeId}`)\n }\n\n const chunks = options.routeChunksByFilePath.get(route.filePath)\n if (!chunks) {\n routes[routeId] = route\n continue\n }\n\n const existing = routes[routeId]\n const targetRoute = (routes[routeId] = existing ? existing : { ...route })\n\n for (const chunk of chunks) {\n mergeRouteChunkData({\n route: targetRoute,\n chunk,\n getChunkCssAssets,\n getChunkPreloads: options.assetResolvers.getChunkPreloads,\n })\n }\n }\n\n const rootRoute = (routes[rootRouteId] = routes[rootRouteId] || {})\n mergeRouteChunkData({\n route: rootRoute,\n chunk: options.entryChunk,\n getChunkCssAssets,\n getChunkPreloads: options.assetResolvers.getChunkPreloads,\n })\n\n return routes\n}\n\nexport {\n getRouteFilePathsFromModuleIds,\n normalizeViteClientBuild,\n normalizeViteClientChunk,\n}\n\nfunction dedupeNestedRouteManifestEntries(\n routeId: string,\n route: DedupeRoute,\n routesById: Record<string, DedupeRoute>,\n seenPreloads = new Set<string>(),\n seenAssets = new Set<string>(),\n) {\n let routePreloads = route.preloads\n let routeAssets = route.assets\n\n if (routePreloads && routePreloads.length > 0) {\n let dedupedPreloads: Array<ManifestAssetLink> | undefined\n\n for (let i = 0; i < routePreloads.length; i++) {\n const preload = routePreloads[i]!\n const preloadHref = resolveManifestAssetLink(preload).href\n\n if (seenPreloads.has(preloadHref)) {\n if (dedupedPreloads === undefined) {\n dedupedPreloads = routePreloads.slice(0, i)\n }\n continue\n }\n\n seenPreloads.add(preloadHref)\n\n if (dedupedPreloads) {\n dedupedPreloads.push(preload)\n }\n }\n\n if (dedupedPreloads) {\n routePreloads = dedupedPreloads\n route.preloads = dedupedPreloads\n }\n }\n\n if (routeAssets && routeAssets.length > 0) {\n let dedupedAssets: Array<RouterManagedTag> | undefined\n\n for (let i = 0; i < routeAssets.length; i++) {\n const asset = routeAssets[i]!\n const identity = getAssetIdentity(asset)\n\n if (seenAssets.has(identity)) {\n if (dedupedAssets === undefined) {\n dedupedAssets = routeAssets.slice(0, i)\n }\n continue\n }\n\n seenAssets.add(identity)\n\n if (dedupedAssets) {\n dedupedAssets.push(asset)\n }\n }\n\n if (dedupedAssets) {\n routeAssets = dedupedAssets\n route.assets = dedupedAssets\n }\n }\n\n if (route.children) {\n for (const childRouteId of route.children) {\n const childRoute = routesById[childRouteId]\n\n if (!childRoute) {\n throw new Error(\n `Route tree references child route ${childRouteId} from ${routeId}, but no route entry was found`,\n )\n }\n\n dedupeNestedRouteManifestEntries(\n childRouteId,\n childRoute,\n routesById,\n seenPreloads,\n seenAssets,\n )\n }\n }\n\n if (routePreloads) {\n for (let i = routePreloads.length - 1; i >= 0; i--) {\n seenPreloads.delete(resolveManifestAssetLink(routePreloads[i]!).href)\n }\n }\n\n if (routeAssets) {\n for (let i = routeAssets.length - 1; i >= 0; i--) {\n seenAssets.delete(getAssetIdentity(routeAssets[i]!))\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"manifestBuilder.js","names":[],"sources":["../../../src/start-manifest-plugin/manifestBuilder.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/prefer-for-of */\nimport { serialize } from 'seroval'\nimport { joinURL } from 'ufo'\nimport { resolveManifestAssetLink, rootRouteId } from '@tanstack/router-core'\nimport {\n getRouteFilePathsFromModuleIds,\n normalizeViteClientBuild,\n normalizeViteClientChunk,\n} from '../vite/start-manifest-plugin/normalized-client-build'\nimport type { ManifestAssetLink, RouterManagedTag } from '@tanstack/router-core'\nimport type { NormalizedClientBuild, NormalizedClientChunk } from '../types'\n\nconst VISITING_CHUNK = 1\n\ntype RouteTreeRoute = {\n filePath?: string\n preloads?: Array<string>\n assets?: Array<RouterManagedTag>\n children?: Array<string>\n}\n\ntype RouteTreeRoutes = Record<string, RouteTreeRoute>\n\ninterface ScannedClientChunks {\n entryChunk: NormalizedClientChunk\n chunksByFileName: ReadonlyMap<string, NormalizedClientChunk>\n routeChunksByFilePath: ReadonlyMap<string, Array<NormalizedClientChunk>>\n}\n\ninterface ManifestAssetResolvers {\n getAssetPath: (fileName: string) => string\n getChunkPreloads: (chunk: NormalizedClientChunk) => Array<string>\n getStylesheetAsset: (cssFile: string) => RouterManagedTag\n}\n\ntype DedupeRoute = {\n preloads?: Array<ManifestAssetLink>\n assets?: Array<RouterManagedTag>\n children?: Array<string>\n}\n\nexport interface StartManifest {\n routes: Record<string, RouteTreeRoute>\n clientEntry: string\n}\n\nexport function appendUniqueStrings(\n target: Array<string> | undefined,\n source: Array<string>,\n) {\n // Similar to Set.prototype.union, but for ordered arrays.\n // It preserves first-seen order and returns the original target array when\n // source contributes no new values, which avoids extra allocations.\n if (source.length === 0) {\n return target\n }\n\n if (!target || target.length === 0) {\n return source\n }\n\n const seen = new Set(target)\n let result: Array<string> | undefined\n\n for (const value of source) {\n if (seen.has(value)) {\n continue\n }\n\n seen.add(value)\n if (!result) {\n result = target.slice()\n }\n result.push(value)\n }\n\n return result ?? target\n}\n\nexport function appendUniqueAssets(\n target: Array<RouterManagedTag> | undefined,\n source: Array<RouterManagedTag>,\n) {\n // Same semantics as appendUniqueStrings, but uniqueness is based on the\n // serialized asset identity instead of object reference.\n if (source.length === 0) {\n return target\n }\n\n if (!target || target.length === 0) {\n return source\n }\n\n const seen = new Set(target.map(getAssetIdentity))\n let result: Array<RouterManagedTag> | undefined\n\n for (const asset of source) {\n const identity = getAssetIdentity(asset)\n if (seen.has(identity)) {\n continue\n }\n\n seen.add(identity)\n if (!result) {\n result = target.slice()\n }\n result.push(asset)\n }\n\n return result ?? target\n}\n\nfunction getAssetIdentity(asset: RouterManagedTag) {\n return JSON.stringify({\n tag: asset.tag,\n attrs: normalizeAssetAttrs(asset.attrs),\n children: 'children' in asset ? (asset.children ?? null) : null,\n })\n}\n\nfunction normalizeAssetAttrs(attrs: Record<string, any> | undefined) {\n if (!attrs) {\n return null\n }\n\n const entries = Object.entries(attrs)\n if (entries.length === 0) {\n return null\n }\n\n entries.sort(([left], [right]) => left.localeCompare(right))\n return Object.fromEntries(entries)\n}\n\nfunction mergeRouteChunkData(options: {\n route: RouteTreeRoute\n chunk: NormalizedClientChunk\n getChunkCssAssets: (chunk: NormalizedClientChunk) => Array<RouterManagedTag>\n getChunkPreloads: (chunk: NormalizedClientChunk) => Array<string>\n}) {\n const chunkAssets = options.getChunkCssAssets(options.chunk)\n const chunkPreloads = options.getChunkPreloads(options.chunk)\n\n options.route.assets = appendUniqueAssets(options.route.assets, chunkAssets)\n options.route.preloads = appendUniqueStrings(\n options.route.preloads,\n chunkPreloads,\n )\n}\n\nexport function buildStartManifest(options: {\n clientBuild: NormalizedClientBuild\n routeTreeRoutes: RouteTreeRoutes\n basePath: string\n additionalRouteAssets?: Partial<\n Record<string, ReadonlyArray<RouterManagedTag>>\n >\n}): StartManifest {\n const scannedChunks = scanClientChunks(options.clientBuild)\n const assetResolvers = createManifestAssetResolvers(options.basePath)\n\n const routes = buildRouteManifestRoutes({\n routeTreeRoutes: options.routeTreeRoutes,\n routeChunksByFilePath: scannedChunks.routeChunksByFilePath,\n chunksByFileName: scannedChunks.chunksByFileName,\n entryChunk: scannedChunks.entryChunk,\n assetResolvers,\n additionalRouteAssets: options.additionalRouteAssets,\n })\n\n dedupeNestedRouteManifestEntries(rootRouteId, routes[rootRouteId]!, routes)\n\n // Prune routes with no assets or preloads from the manifest\n for (const routeId of Object.keys(routes)) {\n const route = routes[routeId]!\n const hasAssets = route.assets && route.assets.length > 0\n const hasPreloads = route.preloads && route.preloads.length > 0\n if (!hasAssets && !hasPreloads) {\n delete routes[routeId]\n }\n }\n\n return {\n routes,\n clientEntry: assetResolvers.getAssetPath(scannedChunks.entryChunk.fileName),\n }\n}\n\nexport function serializeStartManifest(startManifest: StartManifest) {\n return serialize(startManifest)\n}\n\nexport function scanClientChunks(\n clientBuild: NormalizedClientBuild,\n): ScannedClientChunks {\n const entryChunk = clientBuild.chunksByFileName.get(\n clientBuild.entryChunkFileName,\n )\n\n if (!entryChunk) {\n throw new Error(`Missing entry chunk: ${clientBuild.entryChunkFileName}`)\n }\n\n const routeChunksByFilePath = new Map<string, Array<NormalizedClientChunk>>()\n\n for (const chunk of clientBuild.chunksByFileName.values()) {\n if (chunk.routeFilePaths.length > 0) {\n for (const routeFilePath of chunk.routeFilePaths) {\n let chunks = routeChunksByFilePath.get(routeFilePath)\n if (chunks === undefined) {\n chunks = []\n routeChunksByFilePath.set(routeFilePath, chunks)\n }\n chunks.push(chunk)\n }\n }\n }\n\n return {\n entryChunk,\n chunksByFileName: clientBuild.chunksByFileName,\n routeChunksByFilePath,\n }\n}\n\nexport function createManifestAssetResolvers(\n basePath: string,\n): ManifestAssetResolvers {\n const assetPathByFileName = new Map<string, string>()\n const stylesheetAssetByFileName = new Map<string, RouterManagedTag>()\n const preloadsByChunk = new Map<NormalizedClientChunk, Array<string>>()\n\n const getAssetPath = (fileName: string) => {\n const cachedPath = assetPathByFileName.get(fileName)\n if (cachedPath) {\n return cachedPath\n }\n\n const assetPath = joinURL(basePath, fileName)\n assetPathByFileName.set(fileName, assetPath)\n return assetPath\n }\n\n const getStylesheetAsset = (cssFile: string) => {\n const cachedAsset = stylesheetAssetByFileName.get(cssFile)\n if (cachedAsset) {\n return cachedAsset\n }\n\n const href = getAssetPath(cssFile)\n const asset = {\n tag: 'link',\n attrs: {\n rel: 'stylesheet',\n href,\n type: 'text/css',\n },\n } satisfies RouterManagedTag\n\n stylesheetAssetByFileName.set(cssFile, asset)\n return asset\n }\n\n const getChunkPreloads = (chunk: NormalizedClientChunk) => {\n const cachedPreloads = preloadsByChunk.get(chunk)\n if (cachedPreloads) {\n return cachedPreloads\n }\n\n const preloads = [getAssetPath(chunk.fileName)]\n\n for (let i = 0; i < chunk.imports.length; i++) {\n preloads.push(getAssetPath(chunk.imports[i]!))\n }\n\n preloadsByChunk.set(chunk, preloads)\n return preloads\n }\n\n return {\n getAssetPath,\n getChunkPreloads,\n getStylesheetAsset,\n }\n}\n\nexport function createChunkCssAssetCollector(options: {\n chunksByFileName: ReadonlyMap<string, NormalizedClientChunk>\n getStylesheetAsset: (cssFile: string) => RouterManagedTag\n}) {\n const assetsByChunk = new Map<\n NormalizedClientChunk,\n Array<RouterManagedTag>\n >()\n const stateByChunk = new Map<NormalizedClientChunk, number>()\n\n const appendAsset = (\n assets: Array<RouterManagedTag>,\n seenAssets: Set<RouterManagedTag>,\n asset: RouterManagedTag,\n ) => {\n if (seenAssets.has(asset)) {\n return\n }\n\n seenAssets.add(asset)\n assets.push(asset)\n }\n\n const getChunkCssAssets = (\n chunk: NormalizedClientChunk,\n ): Array<RouterManagedTag> => {\n const cachedAssets = assetsByChunk.get(chunk)\n if (cachedAssets) {\n return cachedAssets\n }\n\n if (stateByChunk.get(chunk) === VISITING_CHUNK) {\n return []\n }\n stateByChunk.set(chunk, VISITING_CHUNK)\n\n const assets: Array<RouterManagedTag> = []\n const seenAssets = new Set<RouterManagedTag>()\n\n for (const cssFile of chunk.css) {\n appendAsset(assets, seenAssets, options.getStylesheetAsset(cssFile))\n }\n\n for (let i = 0; i < chunk.imports.length; i++) {\n const importedChunk = options.chunksByFileName.get(chunk.imports[i]!)\n if (!importedChunk) {\n continue\n }\n\n const importedAssets = getChunkCssAssets(importedChunk)\n for (let j = 0; j < importedAssets.length; j++) {\n appendAsset(assets, seenAssets, importedAssets[j]!)\n }\n }\n\n stateByChunk.delete(chunk)\n assetsByChunk.set(chunk, assets)\n return assets\n }\n\n return { getChunkCssAssets }\n}\n\nexport function buildRouteManifestRoutes(options: {\n routeTreeRoutes: RouteTreeRoutes\n routeChunksByFilePath: ReadonlyMap<\n string,\n ReadonlyArray<NormalizedClientChunk>\n >\n chunksByFileName: ReadonlyMap<string, NormalizedClientChunk>\n entryChunk: NormalizedClientChunk\n assetResolvers: ManifestAssetResolvers\n additionalRouteAssets?: Partial<\n Record<string, ReadonlyArray<RouterManagedTag>>\n >\n}) {\n const routes: Record<string, RouteTreeRoute> = {}\n const getChunkCssAssets = createChunkCssAssetCollector({\n chunksByFileName: options.chunksByFileName,\n getStylesheetAsset: options.assetResolvers.getStylesheetAsset,\n }).getChunkCssAssets\n\n for (const [routeId, route] of Object.entries(options.routeTreeRoutes)) {\n if (!route.filePath) {\n if (routeId === rootRouteId) {\n routes[routeId] = route\n continue\n }\n\n throw new Error(`expected filePath to be set for ${routeId}`)\n }\n\n const chunks = options.routeChunksByFilePath.get(route.filePath)\n if (!chunks) {\n routes[routeId] = route\n continue\n }\n\n const existing = routes[routeId]\n const targetRoute = (routes[routeId] = existing ? existing : { ...route })\n\n for (const chunk of chunks) {\n mergeRouteChunkData({\n route: targetRoute,\n chunk,\n getChunkCssAssets,\n getChunkPreloads: options.assetResolvers.getChunkPreloads,\n })\n }\n }\n\n const rootRoute = (routes[rootRouteId] = routes[rootRouteId] || {})\n mergeRouteChunkData({\n route: rootRoute,\n chunk: options.entryChunk,\n getChunkCssAssets,\n getChunkPreloads: options.assetResolvers.getChunkPreloads,\n })\n\n if (options.additionalRouteAssets) {\n for (const [routeId, assets] of Object.entries(\n options.additionalRouteAssets,\n )) {\n if (!assets || assets.length === 0) {\n continue\n }\n\n if (!(routeId in options.routeTreeRoutes)) {\n throw new Error(\n `expected additionalRouteAssets routeId to exist in routeTreeRoutes: ${routeId}`,\n )\n }\n\n const route = (routes[routeId] = routes[routeId] || {})\n route.assets = appendUniqueAssets(route.assets, [...assets])\n }\n }\n\n return routes\n}\n\nexport {\n getRouteFilePathsFromModuleIds,\n normalizeViteClientBuild,\n normalizeViteClientChunk,\n}\n\nfunction dedupeNestedRouteManifestEntries(\n routeId: string,\n route: DedupeRoute,\n routesById: Record<string, DedupeRoute>,\n seenPreloads = new Set<string>(),\n seenAssets = new Set<string>(),\n) {\n let routePreloads = route.preloads\n let routeAssets = route.assets\n\n if (routePreloads && routePreloads.length > 0) {\n let dedupedPreloads: Array<ManifestAssetLink> | undefined\n\n for (let i = 0; i < routePreloads.length; i++) {\n const preload = routePreloads[i]!\n const preloadHref = resolveManifestAssetLink(preload).href\n\n if (seenPreloads.has(preloadHref)) {\n if (dedupedPreloads === undefined) {\n dedupedPreloads = routePreloads.slice(0, i)\n }\n continue\n }\n\n seenPreloads.add(preloadHref)\n\n if (dedupedPreloads) {\n dedupedPreloads.push(preload)\n }\n }\n\n if (dedupedPreloads) {\n routePreloads = dedupedPreloads\n route.preloads = dedupedPreloads\n }\n }\n\n if (routeAssets && routeAssets.length > 0) {\n let dedupedAssets: Array<RouterManagedTag> | undefined\n\n for (let i = 0; i < routeAssets.length; i++) {\n const asset = routeAssets[i]!\n const identity = getAssetIdentity(asset)\n\n if (seenAssets.has(identity)) {\n if (dedupedAssets === undefined) {\n dedupedAssets = routeAssets.slice(0, i)\n }\n continue\n }\n\n seenAssets.add(identity)\n\n if (dedupedAssets) {\n dedupedAssets.push(asset)\n }\n }\n\n if (dedupedAssets) {\n routeAssets = dedupedAssets\n route.assets = dedupedAssets\n }\n }\n\n if (route.children) {\n for (const childRouteId of route.children) {\n const childRoute = routesById[childRouteId]\n\n if (!childRoute) {\n throw new Error(\n `Route tree references child route ${childRouteId} from ${routeId}, but no route entry was found`,\n )\n }\n\n dedupeNestedRouteManifestEntries(\n childRouteId,\n childRoute,\n routesById,\n seenPreloads,\n seenAssets,\n )\n }\n }\n\n if (routePreloads) {\n for (let i = routePreloads.length - 1; i >= 0; i--) {\n seenPreloads.delete(resolveManifestAssetLink(routePreloads[i]!).href)\n }\n }\n\n if (routeAssets) {\n for (let i = routeAssets.length - 1; i >= 0; i--) {\n seenAssets.delete(getAssetIdentity(routeAssets[i]!))\n }\n }\n}\n"],"mappings":"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"}
@@ -8,3 +8,4 @@ export declare function createLogger(prefix: string): {
8
8
  warn: (...args: any) => void;
9
9
  error: (...args: any) => void;
10
10
  };
11
+ export declare function normalizePath(path: string): string;
package/dist/esm/utils.js CHANGED
@@ -16,7 +16,10 @@ function createLogger(prefix) {
16
16
  error: (...args) => console.error(label, ...args)
17
17
  };
18
18
  }
19
+ function normalizePath(path) {
20
+ return path.replace(/\\/g, "/");
21
+ }
19
22
  //#endregion
20
- export { createLogger, getBundlerOptions, resolveViteId };
23
+ export { createLogger, getBundlerOptions, normalizePath, resolveViteId };
21
24
 
22
25
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../../src/utils.ts"],"sourcesContent":["/** Read `build.rollupOptions` or `build.rolldownOptions` from a build config. */\nexport function getBundlerOptions(build: any): any {\n return build?.rolldownOptions ?? build?.rollupOptions\n}\n\nexport function resolveViteId(id: string) {\n return `\\0${id}`\n}\n\nexport function createLogger(prefix: string) {\n const label = `[${prefix}]`\n return {\n log: (...args: any) => console.log(label, ...args),\n debug: (...args: any) => console.debug(label, ...args),\n info: (...args: any) => console.info(label, ...args),\n warn: (...args: any) => console.warn(label, ...args),\n error: (...args: any) => console.error(label, ...args),\n }\n}\n"],"mappings":";;AACA,SAAgB,kBAAkB,OAAiB;AACjD,QAAO,OAAO,mBAAmB,OAAO;;AAG1C,SAAgB,cAAc,IAAY;AACxC,QAAO,KAAK;;AAGd,SAAgB,aAAa,QAAgB;CAC3C,MAAM,QAAQ,IAAI,OAAO;AACzB,QAAO;EACL,MAAM,GAAG,SAAc,QAAQ,IAAI,OAAO,GAAG,KAAK;EAClD,QAAQ,GAAG,SAAc,QAAQ,MAAM,OAAO,GAAG,KAAK;EACtD,OAAO,GAAG,SAAc,QAAQ,KAAK,OAAO,GAAG,KAAK;EACpD,OAAO,GAAG,SAAc,QAAQ,KAAK,OAAO,GAAG,KAAK;EACpD,QAAQ,GAAG,SAAc,QAAQ,MAAM,OAAO,GAAG,KAAK;EACvD"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../src/utils.ts"],"sourcesContent":["/** Read `build.rollupOptions` or `build.rolldownOptions` from a build config. */\nexport function getBundlerOptions(build: any): any {\n return build?.rolldownOptions ?? build?.rollupOptions\n}\n\nexport function resolveViteId(id: string) {\n return `\\0${id}`\n}\n\nexport function createLogger(prefix: string) {\n const label = `[${prefix}]`\n return {\n log: (...args: any) => console.log(label, ...args),\n debug: (...args: any) => console.debug(label, ...args),\n info: (...args: any) => console.info(label, ...args),\n warn: (...args: any) => console.warn(label, ...args),\n error: (...args: any) => console.error(label, ...args),\n }\n}\n\nexport function normalizePath(path: string): string {\n return path.replace(/\\\\/g, '/')\n}\n"],"mappings":";;AACA,SAAgB,kBAAkB,OAAiB;AACjD,QAAO,OAAO,mBAAmB,OAAO;;AAG1C,SAAgB,cAAc,IAAY;AACxC,QAAO,KAAK;;AAGd,SAAgB,aAAa,QAAgB;CAC3C,MAAM,QAAQ,IAAI,OAAO;AACzB,QAAO;EACL,MAAM,GAAG,SAAc,QAAQ,IAAI,OAAO,GAAG,KAAK;EAClD,QAAQ,GAAG,SAAc,QAAQ,MAAM,OAAO,GAAG,KAAK;EACtD,OAAO,GAAG,SAAc,QAAQ,KAAK,OAAO,GAAG,KAAK;EACpD,OAAO,GAAG,SAAc,QAAQ,KAAK,OAAO,GAAG,KAAK;EACpD,QAAQ,GAAG,SAAc,QAAQ,MAAM,OAAO,GAAG,KAAK;EACvD;;AAGH,SAAgB,cAAc,MAAsB;AAClD,QAAO,KAAK,QAAQ,OAAO,IAAI"}