@tanstack/start-plugin-core 1.169.0 → 1.169.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -149,13 +149,13 @@ function createChunkCssAssetCollector(options) {
149
149
  stateByChunk.set(chunk, VISITING_CHUNK);
150
150
  const assets = [];
151
151
  const seenAssets = /* @__PURE__ */ new Set();
152
- for (const cssFile of chunk.css) appendAsset(assets, seenAssets, options.getStylesheetAsset(cssFile));
153
152
  for (let i = 0; i < chunk.imports.length; i++) {
154
153
  const importedChunk = options.chunksByFileName.get(chunk.imports[i]);
155
154
  if (!importedChunk) continue;
156
155
  const importedAssets = getChunkCssAssets(importedChunk);
157
156
  for (let j = 0; j < importedAssets.length; j++) appendAsset(assets, seenAssets, importedAssets[j]);
158
157
  }
158
+ for (const cssFile of chunk.css) appendAsset(assets, seenAssets, options.getStylesheetAsset(cssFile));
159
159
  stateByChunk.delete(chunk);
160
160
  assetsByChunk.set(chunk, assets);
161
161
  return assets;
@@ -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 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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"}
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 (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 for (const cssFile of chunk.css) {\n appendAsset(assets, seenAssets, options.getStylesheetAsset(cssFile))\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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/start-plugin-core",
3
- "version": "1.169.0",
3
+ "version": "1.169.1",
4
4
  "description": "Modern and scalable routing for React applications",
5
5
  "author": "Tanner Linsley",
6
6
  "license": "MIT",
@@ -323,10 +323,6 @@ export function createChunkCssAssetCollector(options: {
323
323
  const assets: Array<RouterManagedTag> = []
324
324
  const seenAssets = new Set<RouterManagedTag>()
325
325
 
326
- for (const cssFile of chunk.css) {
327
- appendAsset(assets, seenAssets, options.getStylesheetAsset(cssFile))
328
- }
329
-
330
326
  for (let i = 0; i < chunk.imports.length; i++) {
331
327
  const importedChunk = options.chunksByFileName.get(chunk.imports[i]!)
332
328
  if (!importedChunk) {
@@ -339,6 +335,10 @@ export function createChunkCssAssetCollector(options: {
339
335
  }
340
336
  }
341
337
 
338
+ for (const cssFile of chunk.css) {
339
+ appendAsset(assets, seenAssets, options.getStylesheetAsset(cssFile))
340
+ }
341
+
342
342
  stateByChunk.delete(chunk)
343
343
  assetsByChunk.set(chunk, assets)
344
344
  return assets