@tanstack/start-plugin-core 1.166.12 → 1.166.13
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.
- package/dist/esm/build-sitemap.js +94 -123
- package/dist/esm/build-sitemap.js.map +1 -1
- package/dist/esm/constants.js +15 -20
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/dev-server-plugin/dev-styles.js +137 -150
- package/dist/esm/dev-server-plugin/dev-styles.js.map +1 -1
- package/dist/esm/dev-server-plugin/extract-html-scripts.js +16 -15
- package/dist/esm/dev-server-plugin/extract-html-scripts.js.map +1 -1
- package/dist/esm/dev-server-plugin/plugin.js +125 -195
- package/dist/esm/dev-server-plugin/plugin.js.map +1 -1
- package/dist/esm/import-protection-plugin/ast.js +6 -5
- package/dist/esm/import-protection-plugin/ast.js.map +1 -1
- package/dist/esm/import-protection-plugin/constants.js +20 -22
- package/dist/esm/import-protection-plugin/constants.js.map +1 -1
- package/dist/esm/import-protection-plugin/defaults.js +35 -25
- package/dist/esm/import-protection-plugin/defaults.js.map +1 -1
- package/dist/esm/import-protection-plugin/extensionlessAbsoluteIdResolver.js +93 -92
- package/dist/esm/import-protection-plugin/extensionlessAbsoluteIdResolver.js.map +1 -1
- package/dist/esm/import-protection-plugin/matchers.js +23 -24
- package/dist/esm/import-protection-plugin/matchers.js.map +1 -1
- package/dist/esm/import-protection-plugin/plugin.js +1045 -1361
- package/dist/esm/import-protection-plugin/plugin.js.map +1 -1
- package/dist/esm/import-protection-plugin/postCompileUsage.js +58 -55
- package/dist/esm/import-protection-plugin/postCompileUsage.js.map +1 -1
- package/dist/esm/import-protection-plugin/rewriteDeniedImports.js +187 -259
- package/dist/esm/import-protection-plugin/rewriteDeniedImports.js.map +1 -1
- package/dist/esm/import-protection-plugin/sourceLocation.js +238 -248
- package/dist/esm/import-protection-plugin/sourceLocation.js.map +1 -1
- package/dist/esm/import-protection-plugin/trace.js +173 -184
- package/dist/esm/import-protection-plugin/trace.js.map +1 -1
- package/dist/esm/import-protection-plugin/utils.js +132 -111
- package/dist/esm/import-protection-plugin/utils.js.map +1 -1
- package/dist/esm/import-protection-plugin/virtualModules.js +216 -196
- package/dist/esm/import-protection-plugin/virtualModules.js.map +1 -1
- package/dist/esm/index.js +2 -7
- package/dist/esm/load-env-plugin/plugin.js +12 -11
- package/dist/esm/load-env-plugin/plugin.js.map +1 -1
- package/dist/esm/output-directory.js +10 -10
- package/dist/esm/output-directory.js.map +1 -1
- package/dist/esm/plugin.js +275 -355
- package/dist/esm/plugin.js.map +1 -1
- package/dist/esm/post-server-build.js +39 -53
- package/dist/esm/post-server-build.js.map +1 -1
- package/dist/esm/prerender.js +177 -239
- package/dist/esm/prerender.js.map +1 -1
- package/dist/esm/preview-server-plugin/plugin.js +41 -44
- package/dist/esm/preview-server-plugin/plugin.js.map +1 -1
- package/dist/esm/queue.js +115 -126
- package/dist/esm/queue.js.map +1 -1
- package/dist/esm/resolve-entries.js +31 -32
- package/dist/esm/resolve-entries.js.map +1 -1
- package/dist/esm/schema.js +156 -179
- package/dist/esm/schema.js.map +1 -1
- package/dist/esm/start-compiler-plugin/compiler.js +655 -812
- package/dist/esm/start-compiler-plugin/compiler.js.map +1 -1
- package/dist/esm/start-compiler-plugin/handleClientOnlyJSX.js +25 -8
- package/dist/esm/start-compiler-plugin/handleClientOnlyJSX.js.map +1 -1
- package/dist/esm/start-compiler-plugin/handleCreateIsomorphicFn.js +22 -19
- package/dist/esm/start-compiler-plugin/handleCreateIsomorphicFn.js.map +1 -1
- package/dist/esm/start-compiler-plugin/handleCreateMiddleware.js +20 -22
- package/dist/esm/start-compiler-plugin/handleCreateMiddleware.js.map +1 -1
- package/dist/esm/start-compiler-plugin/handleCreateServerFn.js +187 -255
- package/dist/esm/start-compiler-plugin/handleCreateServerFn.js.map +1 -1
- package/dist/esm/start-compiler-plugin/handleEnvOnly.js +23 -33
- package/dist/esm/start-compiler-plugin/handleEnvOnly.js.map +1 -1
- package/dist/esm/start-compiler-plugin/plugin.js +247 -291
- package/dist/esm/start-compiler-plugin/plugin.js.map +1 -1
- package/dist/esm/start-compiler-plugin/utils.js +27 -27
- package/dist/esm/start-compiler-plugin/utils.js.map +1 -1
- package/dist/esm/start-manifest-plugin/manifestBuilder.js +272 -378
- package/dist/esm/start-manifest-plugin/manifestBuilder.js.map +1 -1
- package/dist/esm/start-manifest-plugin/plugin.js +35 -44
- package/dist/esm/start-manifest-plugin/plugin.js.map +1 -1
- package/dist/esm/start-router-plugin/constants.js +6 -5
- package/dist/esm/start-router-plugin/constants.js.map +1 -1
- package/dist/esm/start-router-plugin/generator-plugins/prerender-routes-plugin.js +24 -19
- package/dist/esm/start-router-plugin/generator-plugins/prerender-routes-plugin.js.map +1 -1
- package/dist/esm/start-router-plugin/generator-plugins/routes-manifest-plugin.js +28 -29
- package/dist/esm/start-router-plugin/generator-plugins/routes-manifest-plugin.js.map +1 -1
- package/dist/esm/start-router-plugin/plugin.js +146 -199
- package/dist/esm/start-router-plugin/plugin.js.map +1 -1
- package/dist/esm/start-router-plugin/pruneServerOnlySubtrees.js +32 -31
- package/dist/esm/start-router-plugin/pruneServerOnlySubtrees.js.map +1 -1
- package/dist/esm/utils.js +14 -14
- package/dist/esm/utils.js.map +1 -1
- package/package.json +7 -7
- package/dist/esm/index.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifestBuilder.js","sources":["../../../src/start-manifest-plugin/manifestBuilder.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/prefer-for-of */\nimport { joinURL } from 'ufo'\nimport { rootRouteId } from '@tanstack/router-core'\nimport { tsrSplit } from '@tanstack/router-plugin'\nimport type { RouterManagedTag } from '@tanstack/router-core'\nimport type { Rollup } from 'vite'\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: Rollup.OutputChunk\n chunksByFileName: Map<string, Rollup.OutputChunk>\n routeChunksByFilePath: Map<string, Array<Rollup.OutputChunk>>\n routeEntryChunks: Set<Rollup.OutputChunk>\n}\n\ninterface ManifestAssetResolvers {\n getAssetPath: (fileName: string) => string\n getChunkPreloads: (chunk: Rollup.OutputChunk) => Array<string>\n getStylesheetAsset: (cssFile: string) => RouterManagedTag\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: Rollup.OutputChunk\n getChunkCssAssets: (chunk: Rollup.OutputChunk) => Array<RouterManagedTag>\n getChunkPreloads: (chunk: Rollup.OutputChunk) => 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 clientBundle: Rollup.OutputBundle\n routeTreeRoutes: RouteTreeRoutes\n basePath: string\n}) {\n const scannedChunks = scanClientChunks(options.clientBundle)\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 dedupeNestedRoutePreloads(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 scanClientChunks(\n clientBundle: Rollup.OutputBundle,\n): ScannedClientChunks {\n let entryChunk: Rollup.OutputChunk | undefined\n const chunksByFileName = new Map<string, Rollup.OutputChunk>()\n const routeChunksByFilePath = new Map<string, Array<Rollup.OutputChunk>>()\n const routeEntryChunks = new Set<Rollup.OutputChunk>()\n\n for (const fileName in clientBundle) {\n const bundleEntry = clientBundle[fileName]!\n if (bundleEntry.type !== 'chunk') {\n continue\n }\n\n chunksByFileName.set(bundleEntry.fileName, bundleEntry)\n\n if (bundleEntry.isEntry) {\n if (entryChunk) {\n throw new Error(\n `multiple entries detected: ${entryChunk.fileName} ${bundleEntry.fileName}`,\n )\n }\n entryChunk = bundleEntry\n }\n\n const routeFilePaths = getRouteFilePathsFromModuleIds(bundleEntry.moduleIds)\n if (routeFilePaths.length === 0) {\n continue\n }\n\n routeEntryChunks.add(bundleEntry)\n\n for (let i = 0; i < routeFilePaths.length; i++) {\n const routeFilePath = routeFilePaths[i]!\n let chunks = routeChunksByFilePath.get(routeFilePath)\n if (chunks === undefined) {\n chunks = []\n routeChunksByFilePath.set(routeFilePath, chunks)\n }\n chunks.push(bundleEntry)\n }\n }\n\n if (!entryChunk) {\n throw new Error('No entry file found')\n }\n\n return {\n entryChunk,\n chunksByFileName,\n routeChunksByFilePath,\n routeEntryChunks,\n }\n}\n\nexport function getRouteFilePathsFromModuleIds(moduleIds: Array<string>) {\n let routeFilePaths: Array<string> | undefined\n let seenRouteFilePaths: Set<string> | undefined\n\n for (const moduleId of moduleIds) {\n const queryIndex = moduleId.indexOf('?')\n\n if (queryIndex < 0) {\n continue\n }\n\n const query = moduleId.slice(queryIndex + 1)\n\n // Fast check before allocating URLSearchParams\n if (!query.includes(tsrSplit)) {\n continue\n }\n\n if (!new URLSearchParams(query).has(tsrSplit)) {\n continue\n }\n\n const routeFilePath = moduleId.slice(0, queryIndex)\n\n if (seenRouteFilePaths?.has(routeFilePath)) {\n continue\n }\n\n if (routeFilePaths === undefined) {\n routeFilePaths = []\n seenRouteFilePaths = new Set<string>()\n }\n\n routeFilePaths.push(routeFilePath)\n seenRouteFilePaths!.add(routeFilePath)\n }\n\n return routeFilePaths ?? []\n}\n\nexport function collectDynamicImportCss(\n routeEntryChunks: Set<Rollup.OutputChunk>,\n chunksByFileName: Map<string, Rollup.OutputChunk>,\n entryChunk?: Rollup.OutputChunk,\n) {\n const routerManagedCssFiles = new Set<string>()\n const nonRouteDynamicCssFiles = new Set<string>()\n const hashedCssFiles = new Set<string>()\n const visitedByChunk = new Map<Rollup.OutputChunk, number>()\n const chunkStack: Array<Rollup.OutputChunk> = []\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.viteMetadata?.importedCss ?? []) {\n routerManagedCssFiles.add(cssFile)\n }\n }\n\n if ((mode & NON_ROUTE_DYNAMIC_MODE) !== 0) {\n for (const cssFile of chunk.viteMetadata?.importedCss ?? []) {\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<Rollup.OutputChunk, 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: Rollup.OutputChunk) => {\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: Map<string, Rollup.OutputChunk>\n getStylesheetAsset: (cssFile: string) => RouterManagedTag\n}) {\n const assetsByChunk = new Map<Rollup.OutputChunk, Array<RouterManagedTag>>()\n const stateByChunk = new Map<Rollup.OutputChunk, number>()\n\n const getChunkCssAssets = (\n chunk: Rollup.OutputChunk,\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\n for (const cssFile of chunk.viteMetadata?.importedCss ?? []) {\n assets.push(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 assets.push(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: Map<string, Array<Rollup.OutputChunk>>\n chunksByFileName: Map<string, Rollup.OutputChunk>\n entryChunk: Rollup.OutputChunk\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 function dedupeNestedRoutePreloads(\n route: { preloads?: Array<string>; children?: Array<string> },\n routesById: Record<string, RouteTreeRoute>,\n seenPreloads = new Set<string>(),\n) {\n let routePreloads = route.preloads\n\n if (routePreloads && routePreloads.length > 0) {\n let dedupedPreloads: Array<string> | undefined\n\n for (let i = 0; i < routePreloads.length; i++) {\n const preload = routePreloads[i]!\n if (seenPreloads.has(preload)) {\n if (dedupedPreloads === undefined) {\n dedupedPreloads = routePreloads.slice(0, i)\n }\n continue\n }\n\n seenPreloads.add(preload)\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 (route.children) {\n for (const childRouteId of route.children) {\n dedupeNestedRoutePreloads(\n routesById[childRouteId]!,\n routesById,\n seenPreloads,\n )\n }\n }\n\n if (routePreloads) {\n for (let i = routePreloads.length - 1; i >= 0; i--) {\n seenPreloads.delete(routePreloads[i]!)\n }\n }\n}\n"],"names":[],"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 { joinURL } from 'ufo'\nimport { rootRouteId } from '@tanstack/router-core'\nimport { tsrSplit } from '@tanstack/router-plugin'\nimport type { RouterManagedTag } from '@tanstack/router-core'\nimport type { Rollup } from 'vite'\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: Rollup.OutputChunk\n chunksByFileName: Map<string, Rollup.OutputChunk>\n routeChunksByFilePath: Map<string, Array<Rollup.OutputChunk>>\n routeEntryChunks: Set<Rollup.OutputChunk>\n}\n\ninterface ManifestAssetResolvers {\n getAssetPath: (fileName: string) => string\n getChunkPreloads: (chunk: Rollup.OutputChunk) => Array<string>\n getStylesheetAsset: (cssFile: string) => RouterManagedTag\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: Rollup.OutputChunk\n getChunkCssAssets: (chunk: Rollup.OutputChunk) => Array<RouterManagedTag>\n getChunkPreloads: (chunk: Rollup.OutputChunk) => 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 clientBundle: Rollup.OutputBundle\n routeTreeRoutes: RouteTreeRoutes\n basePath: string\n}) {\n const scannedChunks = scanClientChunks(options.clientBundle)\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 dedupeNestedRoutePreloads(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 scanClientChunks(\n clientBundle: Rollup.OutputBundle,\n): ScannedClientChunks {\n let entryChunk: Rollup.OutputChunk | undefined\n const chunksByFileName = new Map<string, Rollup.OutputChunk>()\n const routeChunksByFilePath = new Map<string, Array<Rollup.OutputChunk>>()\n const routeEntryChunks = new Set<Rollup.OutputChunk>()\n\n for (const fileName in clientBundle) {\n const bundleEntry = clientBundle[fileName]!\n if (bundleEntry.type !== 'chunk') {\n continue\n }\n\n chunksByFileName.set(bundleEntry.fileName, bundleEntry)\n\n if (bundleEntry.isEntry) {\n if (entryChunk) {\n throw new Error(\n `multiple entries detected: ${entryChunk.fileName} ${bundleEntry.fileName}`,\n )\n }\n entryChunk = bundleEntry\n }\n\n const routeFilePaths = getRouteFilePathsFromModuleIds(bundleEntry.moduleIds)\n if (routeFilePaths.length === 0) {\n continue\n }\n\n routeEntryChunks.add(bundleEntry)\n\n for (let i = 0; i < routeFilePaths.length; i++) {\n const routeFilePath = routeFilePaths[i]!\n let chunks = routeChunksByFilePath.get(routeFilePath)\n if (chunks === undefined) {\n chunks = []\n routeChunksByFilePath.set(routeFilePath, chunks)\n }\n chunks.push(bundleEntry)\n }\n }\n\n if (!entryChunk) {\n throw new Error('No entry file found')\n }\n\n return {\n entryChunk,\n chunksByFileName,\n routeChunksByFilePath,\n routeEntryChunks,\n }\n}\n\nexport function getRouteFilePathsFromModuleIds(moduleIds: Array<string>) {\n let routeFilePaths: Array<string> | undefined\n let seenRouteFilePaths: Set<string> | undefined\n\n for (const moduleId of moduleIds) {\n const queryIndex = moduleId.indexOf('?')\n\n if (queryIndex < 0) {\n continue\n }\n\n const query = moduleId.slice(queryIndex + 1)\n\n // Fast check before allocating URLSearchParams\n if (!query.includes(tsrSplit)) {\n continue\n }\n\n if (!new URLSearchParams(query).has(tsrSplit)) {\n continue\n }\n\n const routeFilePath = moduleId.slice(0, queryIndex)\n\n if (seenRouteFilePaths?.has(routeFilePath)) {\n continue\n }\n\n if (routeFilePaths === undefined) {\n routeFilePaths = []\n seenRouteFilePaths = new Set<string>()\n }\n\n routeFilePaths.push(routeFilePath)\n seenRouteFilePaths!.add(routeFilePath)\n }\n\n return routeFilePaths ?? []\n}\n\nexport function collectDynamicImportCss(\n routeEntryChunks: Set<Rollup.OutputChunk>,\n chunksByFileName: Map<string, Rollup.OutputChunk>,\n entryChunk?: Rollup.OutputChunk,\n) {\n const routerManagedCssFiles = new Set<string>()\n const nonRouteDynamicCssFiles = new Set<string>()\n const hashedCssFiles = new Set<string>()\n const visitedByChunk = new Map<Rollup.OutputChunk, number>()\n const chunkStack: Array<Rollup.OutputChunk> = []\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.viteMetadata?.importedCss ?? []) {\n routerManagedCssFiles.add(cssFile)\n }\n }\n\n if ((mode & NON_ROUTE_DYNAMIC_MODE) !== 0) {\n for (const cssFile of chunk.viteMetadata?.importedCss ?? []) {\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<Rollup.OutputChunk, 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: Rollup.OutputChunk) => {\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: Map<string, Rollup.OutputChunk>\n getStylesheetAsset: (cssFile: string) => RouterManagedTag\n}) {\n const assetsByChunk = new Map<Rollup.OutputChunk, Array<RouterManagedTag>>()\n const stateByChunk = new Map<Rollup.OutputChunk, number>()\n\n const getChunkCssAssets = (\n chunk: Rollup.OutputChunk,\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\n for (const cssFile of chunk.viteMetadata?.importedCss ?? []) {\n assets.push(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 assets.push(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: Map<string, Array<Rollup.OutputChunk>>\n chunksByFileName: Map<string, Rollup.OutputChunk>\n entryChunk: Rollup.OutputChunk\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 function dedupeNestedRoutePreloads(\n route: { preloads?: Array<string>; children?: Array<string> },\n routesById: Record<string, RouteTreeRoute>,\n seenPreloads = new Set<string>(),\n) {\n let routePreloads = route.preloads\n\n if (routePreloads && routePreloads.length > 0) {\n let dedupedPreloads: Array<string> | undefined\n\n for (let i = 0; i < routePreloads.length; i++) {\n const preload = routePreloads[i]!\n if (seenPreloads.has(preload)) {\n if (dedupedPreloads === undefined) {\n dedupedPreloads = routePreloads.slice(0, i)\n }\n continue\n }\n\n seenPreloads.add(preload)\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 (route.children) {\n for (const childRouteId of route.children) {\n dedupeNestedRoutePreloads(\n routesById[childRouteId]!,\n routesById,\n seenPreloads,\n )\n }\n }\n\n if (routePreloads) {\n for (let i = routePreloads.length - 1; i >= 0; i--) {\n seenPreloads.delete(routePreloads[i]!)\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,52 +1,43 @@
|
|
|
1
|
-
import { joinURL } from "ufo";
|
|
2
|
-
import { VIRTUAL_MODULES } from "@tanstack/start-server-core";
|
|
3
1
|
import { resolveViteId } from "../utils.js";
|
|
4
2
|
import { ENTRY_POINTS } from "../constants.js";
|
|
5
3
|
import { buildStartManifest } from "./manifestBuilder.js";
|
|
6
|
-
|
|
4
|
+
import { joinURL } from "ufo";
|
|
5
|
+
import { VIRTUAL_MODULES } from "@tanstack/start-server-core";
|
|
6
|
+
//#region src/start-manifest-plugin/plugin.ts
|
|
7
|
+
var resolvedModuleId = resolveViteId(VIRTUAL_MODULES.startManifest);
|
|
7
8
|
function startManifestPlugin(opts) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
handler(id) {
|
|
25
|
-
const { resolvedStartConfig } = opts.getConfig();
|
|
26
|
-
if (id === resolvedModuleId) {
|
|
27
|
-
if (this.environment.name !== resolvedStartConfig.serverFnProviderEnv) {
|
|
28
|
-
return `export default {}`;
|
|
29
|
-
}
|
|
30
|
-
if (this.environment.config.command === "serve") {
|
|
31
|
-
return `export const tsrStartManifest = () => ({
|
|
9
|
+
return {
|
|
10
|
+
name: "tanstack-start:start-manifest-plugin",
|
|
11
|
+
enforce: "pre",
|
|
12
|
+
resolveId: {
|
|
13
|
+
filter: { id: new RegExp(VIRTUAL_MODULES.startManifest) },
|
|
14
|
+
handler(id) {
|
|
15
|
+
if (id === VIRTUAL_MODULES.startManifest) return resolvedModuleId;
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
load: {
|
|
19
|
+
filter: { id: new RegExp(resolvedModuleId) },
|
|
20
|
+
handler(id) {
|
|
21
|
+
const { resolvedStartConfig } = opts.getConfig();
|
|
22
|
+
if (id === resolvedModuleId) {
|
|
23
|
+
if (this.environment.name !== resolvedStartConfig.serverFnProviderEnv) return `export default {}`;
|
|
24
|
+
if (this.environment.config.command === "serve") return `export const tsrStartManifest = () => ({
|
|
32
25
|
routes: {},
|
|
33
26
|
clientEntry: '${joinURL(resolvedStartConfig.viteAppBase, "@id", ENTRY_POINTS.client)}',
|
|
34
27
|
})`;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
};
|
|
28
|
+
const routeTreeRoutes = globalThis.TSS_ROUTES_MANIFEST;
|
|
29
|
+
const startManifest = buildStartManifest({
|
|
30
|
+
clientBundle: opts.getClientBundle(),
|
|
31
|
+
routeTreeRoutes,
|
|
32
|
+
basePath: resolvedStartConfig.viteAppBase
|
|
33
|
+
});
|
|
34
|
+
return `export const tsrStartManifest = () => (${JSON.stringify(startManifest)})`;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
};
|
|
48
39
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
//# sourceMappingURL=plugin.js.map
|
|
40
|
+
//#endregion
|
|
41
|
+
export { startManifestPlugin };
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sources":["../../../src/start-manifest-plugin/plugin.ts"],"sourcesContent":["import { joinURL } from 'ufo'\nimport { VIRTUAL_MODULES } from '@tanstack/start-server-core'\nimport { resolveViteId } from '../utils'\nimport { ENTRY_POINTS } from '../constants'\nimport { buildStartManifest } from './manifestBuilder'\nimport type { GetConfigFn } from '../types'\nimport type { PluginOption, Rollup } from 'vite'\n\nconst resolvedModuleId = resolveViteId(VIRTUAL_MODULES.startManifest)\n\nexport function startManifestPlugin(opts: {\n getClientBundle: () => Rollup.OutputBundle\n getConfig: GetConfigFn\n}): PluginOption {\n return {\n name: 'tanstack-start:start-manifest-plugin',\n enforce: 'pre',\n resolveId: {\n filter: { id: new RegExp(VIRTUAL_MODULES.startManifest) },\n handler(id) {\n if (id === VIRTUAL_MODULES.startManifest) {\n return resolvedModuleId\n }\n return undefined\n },\n },\n load: {\n filter: {\n id: new RegExp(resolvedModuleId),\n },\n handler(id) {\n const { resolvedStartConfig } = opts.getConfig()\n if (id === resolvedModuleId) {\n if (\n this.environment.name !== resolvedStartConfig.serverFnProviderEnv\n ) {\n return `export default {}`\n }\n\n if (this.environment.config.command === 'serve') {\n return `export const tsrStartManifest = () => ({\n routes: {},\n clientEntry: '${joinURL(resolvedStartConfig.viteAppBase, '@id', ENTRY_POINTS.client)}',\n })`\n }\n\n const routeTreeRoutes = globalThis.TSS_ROUTES_MANIFEST\n const startManifest = buildStartManifest({\n clientBundle: opts.getClientBundle(),\n routeTreeRoutes,\n basePath: resolvedStartConfig.viteAppBase,\n })\n\n return `export const tsrStartManifest = () => (${JSON.stringify(startManifest)})`\n }\n\n return undefined\n },\n },\n }\n}\n"],"
|
|
1
|
+
{"version":3,"file":"plugin.js","names":[],"sources":["../../../src/start-manifest-plugin/plugin.ts"],"sourcesContent":["import { joinURL } from 'ufo'\nimport { VIRTUAL_MODULES } from '@tanstack/start-server-core'\nimport { resolveViteId } from '../utils'\nimport { ENTRY_POINTS } from '../constants'\nimport { buildStartManifest } from './manifestBuilder'\nimport type { GetConfigFn } from '../types'\nimport type { PluginOption, Rollup } from 'vite'\n\nconst resolvedModuleId = resolveViteId(VIRTUAL_MODULES.startManifest)\n\nexport function startManifestPlugin(opts: {\n getClientBundle: () => Rollup.OutputBundle\n getConfig: GetConfigFn\n}): PluginOption {\n return {\n name: 'tanstack-start:start-manifest-plugin',\n enforce: 'pre',\n resolveId: {\n filter: { id: new RegExp(VIRTUAL_MODULES.startManifest) },\n handler(id) {\n if (id === VIRTUAL_MODULES.startManifest) {\n return resolvedModuleId\n }\n return undefined\n },\n },\n load: {\n filter: {\n id: new RegExp(resolvedModuleId),\n },\n handler(id) {\n const { resolvedStartConfig } = opts.getConfig()\n if (id === resolvedModuleId) {\n if (\n this.environment.name !== resolvedStartConfig.serverFnProviderEnv\n ) {\n return `export default {}`\n }\n\n if (this.environment.config.command === 'serve') {\n return `export const tsrStartManifest = () => ({\n routes: {},\n clientEntry: '${joinURL(resolvedStartConfig.viteAppBase, '@id', ENTRY_POINTS.client)}',\n })`\n }\n\n const routeTreeRoutes = globalThis.TSS_ROUTES_MANIFEST\n const startManifest = buildStartManifest({\n clientBundle: opts.getClientBundle(),\n routeTreeRoutes,\n basePath: resolvedStartConfig.viteAppBase,\n })\n\n return `export const tsrStartManifest = () => (${JSON.stringify(startManifest)})`\n }\n\n return undefined\n },\n },\n }\n}\n"],"mappings":";;;;;;AAQA,IAAM,mBAAmB,cAAc,gBAAgB,cAAc;AAErE,SAAgB,oBAAoB,MAGnB;AACf,QAAO;EACL,MAAM;EACN,SAAS;EACT,WAAW;GACT,QAAQ,EAAE,IAAI,IAAI,OAAO,gBAAgB,cAAc,EAAE;GACzD,QAAQ,IAAI;AACV,QAAI,OAAO,gBAAgB,cACzB,QAAO;;GAIZ;EACD,MAAM;GACJ,QAAQ,EACN,IAAI,IAAI,OAAO,iBAAiB,EACjC;GACD,QAAQ,IAAI;IACV,MAAM,EAAE,wBAAwB,KAAK,WAAW;AAChD,QAAI,OAAO,kBAAkB;AAC3B,SACE,KAAK,YAAY,SAAS,oBAAoB,oBAE9C,QAAO;AAGT,SAAI,KAAK,YAAY,OAAO,YAAY,QACtC,QAAO;;4BAES,QAAQ,oBAAoB,aAAa,OAAO,aAAa,OAAO,CAAC;;KAIvF,MAAM,kBAAkB,WAAW;KACnC,MAAM,gBAAgB,mBAAmB;MACvC,cAAc,KAAK,iBAAiB;MACpC;MACA,UAAU,oBAAoB;MAC/B,CAAC;AAEF,YAAO,0CAA0C,KAAK,UAAU,cAAc,CAAC;;;GAKpF;EACF"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
1
|
+
//#region src/start-router-plugin/constants.ts
|
|
2
|
+
var SERVER_PROP = "server";
|
|
3
|
+
//#endregion
|
|
4
|
+
export { SERVER_PROP };
|
|
5
|
+
|
|
6
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sources":["../../../src/start-router-plugin/constants.ts"],"sourcesContent":["export const SERVER_PROP = 'server'\n"],"
|
|
1
|
+
{"version":3,"file":"constants.js","names":[],"sources":["../../../src/start-router-plugin/constants.ts"],"sourcesContent":["export const SERVER_PROP = 'server'\n"],"mappings":";AAAA,IAAa,cAAc"}
|
|
@@ -1,24 +1,29 @@
|
|
|
1
1
|
import { inferFullPath } from "@tanstack/router-generator";
|
|
2
|
+
//#region src/start-router-plugin/generator-plugins/prerender-routes-plugin.ts
|
|
3
|
+
/**
|
|
4
|
+
* this plugin gets the prerenderable paths and stores it on globalThis
|
|
5
|
+
* so that it can be accessed later (e.g. from a vite plugin)
|
|
6
|
+
*/
|
|
2
7
|
function prerenderRoutesPlugin() {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
return {
|
|
9
|
+
name: "prerender-routes-plugin",
|
|
10
|
+
onRouteTreeChanged: ({ routeNodes }) => {
|
|
11
|
+
globalThis.TSS_PRERENDABLE_PATHS = getPrerenderablePaths(routeNodes);
|
|
12
|
+
}
|
|
13
|
+
};
|
|
9
14
|
}
|
|
10
15
|
function getPrerenderablePaths(routeNodes) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
const paths = new Set(["/"]);
|
|
17
|
+
for (const route of routeNodes) {
|
|
18
|
+
if (!route.routePath) continue;
|
|
19
|
+
if (route.isNonPath === true) continue;
|
|
20
|
+
if (route.routePath.includes("$")) continue;
|
|
21
|
+
if (!route.createFileRouteProps?.has("component")) continue;
|
|
22
|
+
paths.add(inferFullPath(route));
|
|
23
|
+
}
|
|
24
|
+
return Array.from(paths).map((path) => ({ path }));
|
|
20
25
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
//# sourceMappingURL=prerender-routes-plugin.js.map
|
|
26
|
+
//#endregion
|
|
27
|
+
export { prerenderRoutesPlugin };
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=prerender-routes-plugin.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prerender-routes-plugin.js","sources":["../../../../src/start-router-plugin/generator-plugins/prerender-routes-plugin.ts"],"sourcesContent":["import { inferFullPath } from '@tanstack/router-generator'\nimport type { GeneratorPlugin, RouteNode } from '@tanstack/router-generator'\n\n/**\n * this plugin gets the prerenderable paths and stores it on globalThis\n * so that it can be accessed later (e.g. from a vite plugin)\n */\nexport function prerenderRoutesPlugin(): GeneratorPlugin {\n return {\n name: 'prerender-routes-plugin',\n onRouteTreeChanged: ({ routeNodes }) => {\n globalThis.TSS_PRERENDABLE_PATHS = getPrerenderablePaths(routeNodes)\n },\n }\n}\n\nfunction getPrerenderablePaths(\n routeNodes: Array<RouteNode>,\n): Array<{ path: string }> {\n const paths = new Set<string>(['/'])\n\n for (const route of routeNodes) {\n if (!route.routePath) continue\n // filter routes that are layout\n if (route.isNonPath === true) continue\n\n // filter dynamic routes\n // if routePath contains $ it is dynamic\n if (route.routePath.includes('$')) continue\n\n // filter routes that do not have a component, i.e api routes\n if (!route.createFileRouteProps?.has('component')) continue\n\n paths.add(inferFullPath(route))\n }\n\n return Array.from(paths).map((path) => ({ path }))\n}\n"],"
|
|
1
|
+
{"version":3,"file":"prerender-routes-plugin.js","names":[],"sources":["../../../../src/start-router-plugin/generator-plugins/prerender-routes-plugin.ts"],"sourcesContent":["import { inferFullPath } from '@tanstack/router-generator'\nimport type { GeneratorPlugin, RouteNode } from '@tanstack/router-generator'\n\n/**\n * this plugin gets the prerenderable paths and stores it on globalThis\n * so that it can be accessed later (e.g. from a vite plugin)\n */\nexport function prerenderRoutesPlugin(): GeneratorPlugin {\n return {\n name: 'prerender-routes-plugin',\n onRouteTreeChanged: ({ routeNodes }) => {\n globalThis.TSS_PRERENDABLE_PATHS = getPrerenderablePaths(routeNodes)\n },\n }\n}\n\nfunction getPrerenderablePaths(\n routeNodes: Array<RouteNode>,\n): Array<{ path: string }> {\n const paths = new Set<string>(['/'])\n\n for (const route of routeNodes) {\n if (!route.routePath) continue\n // filter routes that are layout\n if (route.isNonPath === true) continue\n\n // filter dynamic routes\n // if routePath contains $ it is dynamic\n if (route.routePath.includes('$')) continue\n\n // filter routes that do not have a component, i.e api routes\n if (!route.createFileRouteProps?.has('component')) continue\n\n paths.add(inferFullPath(route))\n }\n\n return Array.from(paths).map((path) => ({ path }))\n}\n"],"mappings":";;;;;;AAOA,SAAgB,wBAAyC;AACvD,QAAO;EACL,MAAM;EACN,qBAAqB,EAAE,iBAAiB;AACtC,cAAW,wBAAwB,sBAAsB,WAAW;;EAEvE;;AAGH,SAAS,sBACP,YACyB;CACzB,MAAM,QAAQ,IAAI,IAAY,CAAC,IAAI,CAAC;AAEpC,MAAK,MAAM,SAAS,YAAY;AAC9B,MAAI,CAAC,MAAM,UAAW;AAEtB,MAAI,MAAM,cAAc,KAAM;AAI9B,MAAI,MAAM,UAAU,SAAS,IAAI,CAAE;AAGnC,MAAI,CAAC,MAAM,sBAAsB,IAAI,YAAY,CAAE;AAEnD,QAAM,IAAI,cAAc,MAAM,CAAC;;AAGjC,QAAO,MAAM,KAAK,MAAM,CAAC,KAAK,UAAU,EAAE,MAAM,EAAE"}
|
|
@@ -1,32 +1,31 @@
|
|
|
1
1
|
import { rootRouteId } from "@tanstack/router-core";
|
|
2
|
+
//#region src/start-router-plugin/generator-plugins/routes-manifest-plugin.ts
|
|
3
|
+
/**
|
|
4
|
+
* this plugin builds the routes manifest and stores it on globalThis
|
|
5
|
+
* so that it can be accessed later (e.g. from a vite plugin)
|
|
6
|
+
*/
|
|
2
7
|
function routesManifestPlugin() {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
})
|
|
23
|
-
)
|
|
24
|
-
};
|
|
25
|
-
globalThis.TSS_ROUTES_MANIFEST = routes;
|
|
26
|
-
}
|
|
27
|
-
};
|
|
8
|
+
return {
|
|
9
|
+
name: "routes-manifest-plugin",
|
|
10
|
+
onRouteTreeChanged: ({ routeTree, rootRouteNode, routeNodes }) => {
|
|
11
|
+
const allChildren = routeTree.map((d) => d.routePath);
|
|
12
|
+
const routes = {
|
|
13
|
+
[rootRouteId]: {
|
|
14
|
+
filePath: rootRouteNode.fullPath,
|
|
15
|
+
children: allChildren
|
|
16
|
+
},
|
|
17
|
+
...Object.fromEntries(routeNodes.map((d) => {
|
|
18
|
+
return [d.routePath, {
|
|
19
|
+
filePath: d.fullPath,
|
|
20
|
+
children: d.children?.map((childRoute) => childRoute.routePath)
|
|
21
|
+
}];
|
|
22
|
+
}))
|
|
23
|
+
};
|
|
24
|
+
globalThis.TSS_ROUTES_MANIFEST = routes;
|
|
25
|
+
}
|
|
26
|
+
};
|
|
28
27
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
//# sourceMappingURL=routes-manifest-plugin.js.map
|
|
28
|
+
//#endregion
|
|
29
|
+
export { routesManifestPlugin };
|
|
30
|
+
|
|
31
|
+
//# sourceMappingURL=routes-manifest-plugin.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes-manifest-plugin.js","sources":["../../../../src/start-router-plugin/generator-plugins/routes-manifest-plugin.ts"],"sourcesContent":["import { rootRouteId } from '@tanstack/router-core'\n\nimport type { GeneratorPlugin } from '@tanstack/router-generator'\n\n/**\n * this plugin builds the routes manifest and stores it on globalThis\n * so that it can be accessed later (e.g. from a vite plugin)\n */\nexport function routesManifestPlugin(): GeneratorPlugin {\n return {\n name: 'routes-manifest-plugin',\n onRouteTreeChanged: ({ routeTree, rootRouteNode, routeNodes }) => {\n const allChildren = routeTree.map((d) => d.routePath)\n const routes: Record<\n string,\n {\n filePath: string\n children: Array<string>\n }\n > = {\n [rootRouteId]: {\n filePath: rootRouteNode.fullPath,\n children: allChildren,\n },\n ...Object.fromEntries(\n routeNodes.map((d) => {\n const filePathId = d.routePath\n\n return [\n filePathId,\n {\n filePath: d.fullPath,\n children: d.children?.map((childRoute) => childRoute.routePath),\n },\n ]\n }),\n ),\n }\n\n globalThis.TSS_ROUTES_MANIFEST = routes\n },\n }\n}\n"],"
|
|
1
|
+
{"version":3,"file":"routes-manifest-plugin.js","names":[],"sources":["../../../../src/start-router-plugin/generator-plugins/routes-manifest-plugin.ts"],"sourcesContent":["import { rootRouteId } from '@tanstack/router-core'\n\nimport type { GeneratorPlugin } from '@tanstack/router-generator'\n\n/**\n * this plugin builds the routes manifest and stores it on globalThis\n * so that it can be accessed later (e.g. from a vite plugin)\n */\nexport function routesManifestPlugin(): GeneratorPlugin {\n return {\n name: 'routes-manifest-plugin',\n onRouteTreeChanged: ({ routeTree, rootRouteNode, routeNodes }) => {\n const allChildren = routeTree.map((d) => d.routePath)\n const routes: Record<\n string,\n {\n filePath: string\n children: Array<string>\n }\n > = {\n [rootRouteId]: {\n filePath: rootRouteNode.fullPath,\n children: allChildren,\n },\n ...Object.fromEntries(\n routeNodes.map((d) => {\n const filePathId = d.routePath\n\n return [\n filePathId,\n {\n filePath: d.fullPath,\n children: d.children?.map((childRoute) => childRoute.routePath),\n },\n ]\n }),\n ),\n }\n\n globalThis.TSS_ROUTES_MANIFEST = routes\n },\n }\n}\n"],"mappings":";;;;;;AAQA,SAAgB,uBAAwC;AACtD,QAAO;EACL,MAAM;EACN,qBAAqB,EAAE,WAAW,eAAe,iBAAiB;GAChE,MAAM,cAAc,UAAU,KAAK,MAAM,EAAE,UAAU;GACrD,MAAM,SAMF;KACD,cAAc;KACb,UAAU,cAAc;KACxB,UAAU;KACX;IACD,GAAG,OAAO,YACR,WAAW,KAAK,MAAM;AAGpB,YAAO,CAFY,EAAE,WAInB;MACE,UAAU,EAAE;MACZ,UAAU,EAAE,UAAU,KAAK,eAAe,WAAW,UAAU;MAChE,CACF;MACD,CACH;IACF;AAED,cAAW,sBAAsB;;EAEpC"}
|