@tanstack/start-plugin-core 1.167.34 → 1.167.35
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/schema.js +1 -1
- package/dist/esm/start-manifest-plugin/manifestBuilder.d.ts +3 -6
- package/dist/esm/start-manifest-plugin/manifestBuilder.js +34 -81
- package/dist/esm/start-manifest-plugin/manifestBuilder.js.map +1 -1
- package/dist/esm/vite/plugin.js +3 -11
- package/dist/esm/vite/plugin.js.map +1 -1
- package/dist/esm/vite/plugins.d.ts +1 -5
- package/dist/esm/vite/plugins.js +2 -17
- package/dist/esm/vite/plugins.js.map +1 -1
- package/dist/esm/vite/start-manifest-plugin/normalized-client-build.js +2 -2
- package/dist/esm/vite/start-manifest-plugin/normalized-client-build.js.map +1 -1
- package/dist/esm/vite/start-manifest-plugin/plugin.d.ts +1 -2
- package/dist/esm/vite/start-manifest-plugin/plugin.js +48 -14
- package/dist/esm/vite/start-manifest-plugin/plugin.js.map +1 -1
- package/package.json +1 -1
- package/src/start-manifest-plugin/manifestBuilder.ts +53 -116
- package/src/vite/plugin.ts +0 -17
- package/src/vite/plugins.ts +2 -33
- package/src/vite/start-manifest-plugin/normalized-client-build.ts +15 -16
- package/src/vite/start-manifest-plugin/plugin.ts +121 -38
package/dist/esm/schema.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
import { configSchema, getConfig } from "@tanstack/router-plugin";
|
|
3
2
|
import { z } from "zod";
|
|
3
|
+
import { configSchema, getConfig } from "@tanstack/router-plugin";
|
|
4
4
|
//#region src/schema.ts
|
|
5
5
|
var tsrConfig = configSchema.omit({
|
|
6
6
|
autoCodeSplitting: true,
|
|
@@ -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
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
return
|
|
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
|
|
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
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
|
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(
|
|
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:
|
|
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
|
-
|
|
194
|
-
|
|
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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"}
|
package/dist/esm/vite/plugin.js
CHANGED
|
@@ -8,7 +8,7 @@ import { buildStartViteEnvironments, createViteConfigPlan, createViteDefineConfi
|
|
|
8
8
|
import { devServerPlugin } from "./dev-server-plugin/plugin.js";
|
|
9
9
|
import { getClientOutputDirectory, getServerOutputDirectory } from "./output-directory.js";
|
|
10
10
|
import { previewServerPlugin } from "./preview-server-plugin/plugin.js";
|
|
11
|
-
import {
|
|
11
|
+
import { createDevBaseRewritePlugin, createPostBuildPlugin, createVirtualClientEntryPlugin } from "./plugins.js";
|
|
12
12
|
import { parseStartConfig } from "./schema.js";
|
|
13
13
|
import { startManifestPlugin } from "./start-manifest-plugin/plugin.js";
|
|
14
14
|
import { tanStackStartRouter } from "./start-router-plugin/plugin.js";
|
|
@@ -27,10 +27,6 @@ function tanStackStartVite(corePluginOpts, startPluginOpts) {
|
|
|
27
27
|
const serverFnProviderEnv = corePluginOpts.providerEnvironmentName;
|
|
28
28
|
const ssrIsProvider = corePluginOpts.ssrIsProvider;
|
|
29
29
|
let needsDevBaseRewrite = false;
|
|
30
|
-
const capturedClientBuild = {};
|
|
31
|
-
function getClientBuild(envName) {
|
|
32
|
-
return capturedClientBuild[envName];
|
|
33
|
-
}
|
|
34
30
|
const environments = [{
|
|
35
31
|
name: START_ENVIRONMENT_NAMES.client,
|
|
36
32
|
type: "client"
|
|
@@ -140,10 +136,7 @@ function tanStackStartVite(corePluginOpts, startPluginOpts) {
|
|
|
140
136
|
tanStackStartRouter(normalizedStartPluginOpts, getConfig, corePluginOpts),
|
|
141
137
|
loadEnvPlugin(),
|
|
142
138
|
createVirtualClientEntryPlugin({ getClientEntry: () => configContext.resolveEntries().entryPaths.client }),
|
|
143
|
-
startManifestPlugin({
|
|
144
|
-
getClientBuild: () => getClientBuild(START_ENVIRONMENT_NAMES.client),
|
|
145
|
-
getConfig
|
|
146
|
-
}),
|
|
139
|
+
startManifestPlugin({ getConfig }),
|
|
147
140
|
createDevBaseRewritePlugin({
|
|
148
141
|
shouldRewriteDevBase: () => needsDevBaseRewrite,
|
|
149
142
|
resolvedStartConfig
|
|
@@ -154,8 +147,7 @@ function tanStackStartVite(corePluginOpts, startPluginOpts) {
|
|
|
154
147
|
installDevServerMiddleware: normalizedStartPluginOpts.vite?.installDevServerMiddleware
|
|
155
148
|
}),
|
|
156
149
|
previewServerPlugin(),
|
|
157
|
-
serializationAdaptersPlugin({ adapters: corePluginOpts.serializationAdapters })
|
|
158
|
-
createCaptureClientBuildPlugin({ capturedClientBuild })
|
|
150
|
+
serializationAdaptersPlugin({ adapters: corePluginOpts.serializationAdapters })
|
|
159
151
|
];
|
|
160
152
|
}
|
|
161
153
|
function createViteRscForwarder(strategy) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","names":[],"sources":["../../../src/vite/plugin.ts"],"sourcesContent":["import { crawlFrameworkPkgs } from 'vitefu'\nimport {\n applyResolvedBaseAndOutput,\n applyResolvedRouterBasepath,\n createStartConfigContext,\n} from '../config-context'\nimport { START_ENVIRONMENT_NAMES } from '../constants'\nimport { importProtectionPlugin } from '../import-protection-plugin/plugin'\nimport {\n createServerFnBasePath,\n normalizePublicBase,\n shouldRewriteDevBasepath,\n} from '../planning'\nimport { startCompilerPlugin } from './start-compiler-plugin/plugin'\nimport { loadEnvPlugin } from './load-env-plugin/plugin'\nimport {\n buildStartViteEnvironments,\n createViteConfigPlan,\n createViteDefineConfig,\n createViteResolvedEntryAliases,\n} from './planning'\nimport { devServerPlugin } from './dev-server-plugin/plugin'\nimport { previewServerPlugin } from './preview-server-plugin/plugin'\nimport {\n createCaptureClientBuildPlugin,\n createDevBaseRewritePlugin,\n createPostBuildPlugin,\n createVirtualClientEntryPlugin,\n} from './plugins'\nimport { parseStartConfig } from './schema'\nimport { startManifestPlugin } from './start-manifest-plugin/plugin'\nimport { tanStackStartRouter } from './start-router-plugin/plugin'\nimport {\n getClientOutputDirectory,\n getServerOutputDirectory,\n} from './output-directory'\nimport { postServerBuild } from './post-server-build'\nimport { serializationAdaptersPlugin } from './serialization-adapters-plugin'\nimport type { NormalizedClientBuild } from '../types'\nimport type {\n TanStackStartVitePluginCoreOptions,\n ViteRscForwardSsrResolverStrategy,\n} from './types'\nimport type { StartEnvironmentName } from '../constants'\nimport type { TanStackStartViteInputConfig } from './schema'\nimport type { PluginOption } from 'vite'\n\nexport function tanStackStartVite(\n corePluginOpts: TanStackStartVitePluginCoreOptions,\n startPluginOpts: TanStackStartViteInputConfig | undefined,\n): Array<PluginOption> {\n const normalizedStartPluginOpts = startPluginOpts ?? {}\n\n const configContext = createStartConfigContext({\n corePluginOpts,\n startPluginOpts: normalizedStartPluginOpts,\n parseConfig: parseStartConfig,\n })\n const { getConfig, resolvedStartConfig } = configContext\n const serverFnProviderEnv = corePluginOpts.providerEnvironmentName\n const ssrIsProvider = corePluginOpts.ssrIsProvider\n\n // When the router basepath and vite base are misaligned during dev,\n // we install a URL rewrite middleware instead of erroring.\n let needsDevBaseRewrite = false\n\n const capturedClientBuild: Partial<\n Record<StartEnvironmentName, NormalizedClientBuild>\n > = {}\n\n function getClientBuild(\n envName: StartEnvironmentName,\n ): NormalizedClientBuild | undefined {\n return capturedClientBuild[envName]\n }\n\n const environments: Array<{\n name: string\n type: 'client' | 'server'\n getServerFnById?: string\n }> = [\n { name: START_ENVIRONMENT_NAMES.client, type: 'client' },\n {\n name: START_ENVIRONMENT_NAMES.server,\n type: 'server',\n getServerFnById:\n corePluginOpts.ssrResolverStrategy.type === 'vite-rsc-forward'\n ? createViteRscForwarder(corePluginOpts.ssrResolverStrategy)\n : undefined,\n },\n ]\n if (\n serverFnProviderEnv !== START_ENVIRONMENT_NAMES.server &&\n !environments.find((e) => e.name === serverFnProviderEnv)\n ) {\n environments.push({\n name: serverFnProviderEnv,\n type: 'server',\n })\n }\n return [\n {\n name: 'tanstack-start-core:config',\n enforce: 'pre',\n async config(viteConfig, { command }) {\n const publicBase = normalizePublicBase(viteConfig.base)\n applyResolvedBaseAndOutput({\n resolvedStartConfig,\n root: viteConfig.root || process.cwd(),\n publicBase,\n clientOutputDirectory: getClientOutputDirectory(viteConfig),\n serverOutputDirectory: getServerOutputDirectory(viteConfig),\n })\n const { startConfig } = getConfig()\n const routerBasepath = applyResolvedRouterBasepath({\n resolvedStartConfig,\n startConfig,\n })\n\n if (\n shouldRewriteDevBasepath({\n command,\n middlewareMode: Boolean(viteConfig.server?.middlewareMode),\n routerBasepath,\n publicBase: resolvedStartConfig.basePaths.publicBase,\n })\n ) {\n // The router basepath and vite base are misaligned.\n // Instead of erroring, we install a dev-server middleware that\n // rewrites incoming request URLs to prepend the vite base prefix.\n // This allows users to have e.g. base: '/_ui/' for asset URLs\n // while keeping router basepath at '/' for page navigation.\n needsDevBaseRewrite = true\n }\n\n const TSS_SERVER_FN_BASE = createServerFnBasePath({\n routerBasepath,\n serverFnBase: startConfig.serverFns.base,\n })\n const resolvedEntryPlan = configContext.resolveEntries()\n\n const entryAliases = createViteResolvedEntryAliases({\n entryPaths: resolvedEntryPlan.entryPaths,\n })\n\n const startPackageName =\n `@tanstack/${corePluginOpts.framework}-start` as const\n\n // crawl packages that have start in \"peerDependencies\"\n // see https://github.com/svitejs/vitefu/blob/d8d82fa121e3b2215ba437107093c77bde51b63b/src/index.js#L95-L101\n\n // this is currently uncached; could be implemented similarly as vite handles lock file changes\n // see https://github.com/vitejs/vite/blob/557f797d29422027e8c451ca50dd84bf8c41b5f0/packages/vite/src/node/optimizer/index.ts#L1282\n\n const crawlFrameworkPkgsResult = await crawlFrameworkPkgs({\n root: process.cwd(),\n isBuild: command === 'build',\n isFrameworkPkgByJson(pkgJson) {\n const peerDependencies = pkgJson['peerDependencies']\n\n if (peerDependencies) {\n if (\n startPackageName in peerDependencies ||\n '@tanstack/start-client-core' in peerDependencies\n ) {\n return true\n }\n }\n\n return false\n },\n })\n\n const viteConfigPlan = createViteConfigPlan({\n viteConfig,\n framework: corePluginOpts.framework,\n entryAliases,\n clientOutputDirectory: resolvedStartConfig.outputDirectories.client,\n serverOutputDirectory: resolvedStartConfig.outputDirectories.server,\n serverFnProviderEnv,\n optimizeDepsExclude: crawlFrameworkPkgsResult.optimizeDeps.exclude,\n noExternal: crawlFrameworkPkgsResult.ssr.noExternal.sort(),\n })\n\n return {\n // see https://vite.dev/config/shared-options.html#apptype\n // this will prevent vite from injecting middlewares that we don't want\n appType: viteConfig.appType ?? 'custom',\n environments: viteConfigPlan.environments,\n resolve: viteConfigPlan.resolve,\n define: createViteDefineConfig({\n command,\n mode: viteConfig.mode,\n serverFnBase: TSS_SERVER_FN_BASE,\n routerBasepath,\n spaEnabled: startConfig.spa?.enabled,\n devSsrStylesEnabled: startConfig.dev.ssrStyles.enabled,\n devSsrStylesBasepath:\n startConfig.dev.ssrStyles.basepath ??\n resolvedStartConfig.basePaths.publicBase,\n staticNodeEnv: startConfig.server.build.staticNodeEnv,\n }),\n builder: {\n sharedPlugins: true,\n async buildApp(builder) {\n await buildStartViteEnvironments({\n builder,\n providerEnvironmentName: serverFnProviderEnv,\n ssrIsProvider,\n })\n },\n },\n }\n },\n },\n createPostBuildPlugin({\n getConfig,\n postServerBuild,\n }),\n // Server function plugin handles:\n // 1. Identifying createServerFn().handler() calls\n // 2. Extracting server functions to separate modules\n // 3. Replacing call sites with RPC stubs\n // 4. Generating the server function manifest\n // Also handles createIsomorphicFn, createServerOnlyFn, createClientOnlyFn, createMiddleware\n startCompilerPlugin({\n framework: corePluginOpts.framework,\n environments,\n generateFunctionId:\n normalizedStartPluginOpts.serverFns?.generateFunctionId,\n providerEnvName: serverFnProviderEnv,\n }),\n importProtectionPlugin({\n getConfig,\n framework: corePluginOpts.framework,\n environments,\n providerEnvName: serverFnProviderEnv,\n }),\n tanStackStartRouter(normalizedStartPluginOpts, getConfig, corePluginOpts),\n loadEnvPlugin(),\n createVirtualClientEntryPlugin({\n getClientEntry: () => configContext.resolveEntries().entryPaths.client,\n }),\n startManifestPlugin({\n getClientBuild: () => getClientBuild(START_ENVIRONMENT_NAMES.client),\n getConfig,\n }),\n // When the vite base and router basepath are misaligned (e.g. base: '/_ui/', basepath: '/'),\n // install a middleware that rewrites incoming request URLs to prepend the vite base prefix.\n // This allows Vite's internal base middleware to accept the requests, then strips the prefix\n // before passing to the SSR handler.\n // Registered BEFORE devServerPlugin so this middleware is added to the Connect stack first,\n // ensuring all subsequent middlewares (CSS, SSR, etc.) see the rewritten URL.\n createDevBaseRewritePlugin({\n shouldRewriteDevBase: () => needsDevBaseRewrite,\n resolvedStartConfig,\n }),\n devServerPlugin({\n getConfig,\n devSsrStylesEnabled:\n normalizedStartPluginOpts.dev?.ssrStyles?.enabled ?? true,\n installDevServerMiddleware:\n normalizedStartPluginOpts.vite?.installDevServerMiddleware,\n }),\n previewServerPlugin(),\n serializationAdaptersPlugin({\n adapters: corePluginOpts.serializationAdapters,\n }),\n createCaptureClientBuildPlugin({\n capturedClientBuild,\n }),\n ]\n}\n\nfunction createViteRscForwarder(strategy: ViteRscForwardSsrResolverStrategy) {\n return `export async function getServerFnById(id, access) {\n const m = await import.meta.viteRsc.loadModule(${JSON.stringify(strategy.sourceEnvironmentName)}, ${JSON.stringify(strategy.sourceEntry)})\n return m[${JSON.stringify(strategy.exportName)}](id, access)\n}`\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.js","names":[],"sources":["../../../src/vite/plugin.ts"],"sourcesContent":["import { crawlFrameworkPkgs } from 'vitefu'\nimport {\n applyResolvedBaseAndOutput,\n applyResolvedRouterBasepath,\n createStartConfigContext,\n} from '../config-context'\nimport { START_ENVIRONMENT_NAMES } from '../constants'\nimport { importProtectionPlugin } from '../import-protection-plugin/plugin'\nimport {\n createServerFnBasePath,\n normalizePublicBase,\n shouldRewriteDevBasepath,\n} from '../planning'\nimport { startCompilerPlugin } from './start-compiler-plugin/plugin'\nimport { loadEnvPlugin } from './load-env-plugin/plugin'\nimport {\n buildStartViteEnvironments,\n createViteConfigPlan,\n createViteDefineConfig,\n createViteResolvedEntryAliases,\n} from './planning'\nimport { devServerPlugin } from './dev-server-plugin/plugin'\nimport { previewServerPlugin } from './preview-server-plugin/plugin'\nimport {\n createDevBaseRewritePlugin,\n createPostBuildPlugin,\n createVirtualClientEntryPlugin,\n} from './plugins'\nimport { parseStartConfig } from './schema'\nimport { startManifestPlugin } from './start-manifest-plugin/plugin'\nimport { tanStackStartRouter } from './start-router-plugin/plugin'\nimport {\n getClientOutputDirectory,\n getServerOutputDirectory,\n} from './output-directory'\nimport { postServerBuild } from './post-server-build'\nimport { serializationAdaptersPlugin } from './serialization-adapters-plugin'\nimport type {\n TanStackStartVitePluginCoreOptions,\n ViteRscForwardSsrResolverStrategy,\n} from './types'\nimport type { TanStackStartViteInputConfig } from './schema'\nimport type { PluginOption } from 'vite'\n\nexport function tanStackStartVite(\n corePluginOpts: TanStackStartVitePluginCoreOptions,\n startPluginOpts: TanStackStartViteInputConfig | undefined,\n): Array<PluginOption> {\n const normalizedStartPluginOpts = startPluginOpts ?? {}\n\n const configContext = createStartConfigContext({\n corePluginOpts,\n startPluginOpts: normalizedStartPluginOpts,\n parseConfig: parseStartConfig,\n })\n const { getConfig, resolvedStartConfig } = configContext\n const serverFnProviderEnv = corePluginOpts.providerEnvironmentName\n const ssrIsProvider = corePluginOpts.ssrIsProvider\n\n // When the router basepath and vite base are misaligned during dev,\n // we install a URL rewrite middleware instead of erroring.\n let needsDevBaseRewrite = false\n\n const environments: Array<{\n name: string\n type: 'client' | 'server'\n getServerFnById?: string\n }> = [\n { name: START_ENVIRONMENT_NAMES.client, type: 'client' },\n {\n name: START_ENVIRONMENT_NAMES.server,\n type: 'server',\n getServerFnById:\n corePluginOpts.ssrResolverStrategy.type === 'vite-rsc-forward'\n ? createViteRscForwarder(corePluginOpts.ssrResolverStrategy)\n : undefined,\n },\n ]\n if (\n serverFnProviderEnv !== START_ENVIRONMENT_NAMES.server &&\n !environments.find((e) => e.name === serverFnProviderEnv)\n ) {\n environments.push({\n name: serverFnProviderEnv,\n type: 'server',\n })\n }\n return [\n {\n name: 'tanstack-start-core:config',\n enforce: 'pre',\n async config(viteConfig, { command }) {\n const publicBase = normalizePublicBase(viteConfig.base)\n applyResolvedBaseAndOutput({\n resolvedStartConfig,\n root: viteConfig.root || process.cwd(),\n publicBase,\n clientOutputDirectory: getClientOutputDirectory(viteConfig),\n serverOutputDirectory: getServerOutputDirectory(viteConfig),\n })\n const { startConfig } = getConfig()\n const routerBasepath = applyResolvedRouterBasepath({\n resolvedStartConfig,\n startConfig,\n })\n\n if (\n shouldRewriteDevBasepath({\n command,\n middlewareMode: Boolean(viteConfig.server?.middlewareMode),\n routerBasepath,\n publicBase: resolvedStartConfig.basePaths.publicBase,\n })\n ) {\n // The router basepath and vite base are misaligned.\n // Instead of erroring, we install a dev-server middleware that\n // rewrites incoming request URLs to prepend the vite base prefix.\n // This allows users to have e.g. base: '/_ui/' for asset URLs\n // while keeping router basepath at '/' for page navigation.\n needsDevBaseRewrite = true\n }\n\n const TSS_SERVER_FN_BASE = createServerFnBasePath({\n routerBasepath,\n serverFnBase: startConfig.serverFns.base,\n })\n const resolvedEntryPlan = configContext.resolveEntries()\n\n const entryAliases = createViteResolvedEntryAliases({\n entryPaths: resolvedEntryPlan.entryPaths,\n })\n\n const startPackageName =\n `@tanstack/${corePluginOpts.framework}-start` as const\n\n // crawl packages that have start in \"peerDependencies\"\n // see https://github.com/svitejs/vitefu/blob/d8d82fa121e3b2215ba437107093c77bde51b63b/src/index.js#L95-L101\n\n // this is currently uncached; could be implemented similarly as vite handles lock file changes\n // see https://github.com/vitejs/vite/blob/557f797d29422027e8c451ca50dd84bf8c41b5f0/packages/vite/src/node/optimizer/index.ts#L1282\n\n const crawlFrameworkPkgsResult = await crawlFrameworkPkgs({\n root: process.cwd(),\n isBuild: command === 'build',\n isFrameworkPkgByJson(pkgJson) {\n const peerDependencies = pkgJson['peerDependencies']\n\n if (peerDependencies) {\n if (\n startPackageName in peerDependencies ||\n '@tanstack/start-client-core' in peerDependencies\n ) {\n return true\n }\n }\n\n return false\n },\n })\n\n const viteConfigPlan = createViteConfigPlan({\n viteConfig,\n framework: corePluginOpts.framework,\n entryAliases,\n clientOutputDirectory: resolvedStartConfig.outputDirectories.client,\n serverOutputDirectory: resolvedStartConfig.outputDirectories.server,\n serverFnProviderEnv,\n optimizeDepsExclude: crawlFrameworkPkgsResult.optimizeDeps.exclude,\n noExternal: crawlFrameworkPkgsResult.ssr.noExternal.sort(),\n })\n\n return {\n // see https://vite.dev/config/shared-options.html#apptype\n // this will prevent vite from injecting middlewares that we don't want\n appType: viteConfig.appType ?? 'custom',\n environments: viteConfigPlan.environments,\n resolve: viteConfigPlan.resolve,\n define: createViteDefineConfig({\n command,\n mode: viteConfig.mode,\n serverFnBase: TSS_SERVER_FN_BASE,\n routerBasepath,\n spaEnabled: startConfig.spa?.enabled,\n devSsrStylesEnabled: startConfig.dev.ssrStyles.enabled,\n devSsrStylesBasepath:\n startConfig.dev.ssrStyles.basepath ??\n resolvedStartConfig.basePaths.publicBase,\n staticNodeEnv: startConfig.server.build.staticNodeEnv,\n }),\n builder: {\n sharedPlugins: true,\n async buildApp(builder) {\n await buildStartViteEnvironments({\n builder,\n providerEnvironmentName: serverFnProviderEnv,\n ssrIsProvider,\n })\n },\n },\n }\n },\n },\n createPostBuildPlugin({\n getConfig,\n postServerBuild,\n }),\n // Server function plugin handles:\n // 1. Identifying createServerFn().handler() calls\n // 2. Extracting server functions to separate modules\n // 3. Replacing call sites with RPC stubs\n // 4. Generating the server function manifest\n // Also handles createIsomorphicFn, createServerOnlyFn, createClientOnlyFn, createMiddleware\n startCompilerPlugin({\n framework: corePluginOpts.framework,\n environments,\n generateFunctionId:\n normalizedStartPluginOpts.serverFns?.generateFunctionId,\n providerEnvName: serverFnProviderEnv,\n }),\n importProtectionPlugin({\n getConfig,\n framework: corePluginOpts.framework,\n environments,\n providerEnvName: serverFnProviderEnv,\n }),\n tanStackStartRouter(normalizedStartPluginOpts, getConfig, corePluginOpts),\n loadEnvPlugin(),\n createVirtualClientEntryPlugin({\n getClientEntry: () => configContext.resolveEntries().entryPaths.client,\n }),\n startManifestPlugin({\n getConfig,\n }),\n // When the vite base and router basepath are misaligned (e.g. base: '/_ui/', basepath: '/'),\n // install a middleware that rewrites incoming request URLs to prepend the vite base prefix.\n // This allows Vite's internal base middleware to accept the requests, then strips the prefix\n // before passing to the SSR handler.\n // Registered BEFORE devServerPlugin so this middleware is added to the Connect stack first,\n // ensuring all subsequent middlewares (CSS, SSR, etc.) see the rewritten URL.\n createDevBaseRewritePlugin({\n shouldRewriteDevBase: () => needsDevBaseRewrite,\n resolvedStartConfig,\n }),\n devServerPlugin({\n getConfig,\n devSsrStylesEnabled:\n normalizedStartPluginOpts.dev?.ssrStyles?.enabled ?? true,\n installDevServerMiddleware:\n normalizedStartPluginOpts.vite?.installDevServerMiddleware,\n }),\n previewServerPlugin(),\n serializationAdaptersPlugin({\n adapters: corePluginOpts.serializationAdapters,\n }),\n ]\n}\n\nfunction createViteRscForwarder(strategy: ViteRscForwardSsrResolverStrategy) {\n return `export async function getServerFnById(id, access) {\n const m = await import.meta.viteRsc.loadModule(${JSON.stringify(strategy.sourceEnvironmentName)}, ${JSON.stringify(strategy.sourceEntry)})\n return m[${JSON.stringify(strategy.exportName)}](id, access)\n}`\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { GetConfigFn,
|
|
2
|
-
import { StartEnvironmentName } from '../constants.js';
|
|
1
|
+
import { GetConfigFn, ResolvedStartConfig } from '../types.js';
|
|
3
2
|
import { PluginOption, ViteBuilder } from 'vite';
|
|
4
3
|
export declare function createVirtualClientEntryPlugin(opts: {
|
|
5
4
|
getClientEntry: () => string;
|
|
@@ -15,6 +14,3 @@ export declare function createDevBaseRewritePlugin(opts: {
|
|
|
15
14
|
shouldRewriteDevBase: () => boolean;
|
|
16
15
|
resolvedStartConfig: ResolvedStartConfig;
|
|
17
16
|
}): PluginOption;
|
|
18
|
-
export declare function createCaptureClientBuildPlugin(opts: {
|
|
19
|
-
capturedClientBuild: Partial<Record<StartEnvironmentName, NormalizedClientBuild>>;
|
|
20
|
-
}): PluginOption;
|
package/dist/esm/vite/plugins.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { ENTRY_POINTS
|
|
1
|
+
import { ENTRY_POINTS } from "../constants.js";
|
|
2
2
|
import { createVirtualModule } from "./createVirtualModule.js";
|
|
3
|
-
import { normalizeViteClientBuild } from "./start-manifest-plugin/normalized-client-build.js";
|
|
4
3
|
import { normalizePath } from "vite";
|
|
5
4
|
//#region src/vite/plugins.ts
|
|
6
5
|
function createVirtualClientEntryPlugin(opts) {
|
|
@@ -42,21 +41,7 @@ function createDevBaseRewritePlugin(opts) {
|
|
|
42
41
|
}
|
|
43
42
|
};
|
|
44
43
|
}
|
|
45
|
-
function createCaptureClientBuildPlugin(opts) {
|
|
46
|
-
return {
|
|
47
|
-
name: "tanstack-start:core:capture-bundle",
|
|
48
|
-
applyToEnvironment(environment) {
|
|
49
|
-
return environment.name === START_ENVIRONMENT_NAMES.client;
|
|
50
|
-
},
|
|
51
|
-
enforce: "post",
|
|
52
|
-
generateBundle(_options, bundle) {
|
|
53
|
-
const environment = this.environment.name;
|
|
54
|
-
if (environment !== START_ENVIRONMENT_NAMES.client) throw new Error(`Unexpected environment for client build capture: ${environment}`);
|
|
55
|
-
opts.capturedClientBuild[environment] = normalizeViteClientBuild(bundle);
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
44
|
//#endregion
|
|
60
|
-
export {
|
|
45
|
+
export { createDevBaseRewritePlugin, createPostBuildPlugin, createVirtualClientEntryPlugin };
|
|
61
46
|
|
|
62
47
|
//# sourceMappingURL=plugins.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugins.js","names":[],"sources":["../../../src/vite/plugins.ts"],"sourcesContent":["import { normalizePath } from 'vite'\nimport { ENTRY_POINTS
|
|
1
|
+
{"version":3,"file":"plugins.js","names":[],"sources":["../../../src/vite/plugins.ts"],"sourcesContent":["import { normalizePath } from 'vite'\nimport { ENTRY_POINTS } from '../constants'\nimport { createVirtualModule } from './createVirtualModule'\nimport type { GetConfigFn, ResolvedStartConfig } from '../types'\nimport type { PluginOption, ViteBuilder } from 'vite'\n\nexport function createVirtualClientEntryPlugin(opts: {\n getClientEntry: () => string\n}): PluginOption {\n return createVirtualModule({\n name: 'tanstack-start-core:virtual-client-entry',\n moduleId: ENTRY_POINTS.client,\n enforce: 'pre',\n load() {\n return `import ${JSON.stringify(normalizePath(opts.getClientEntry()).replaceAll('\\\\', '/'))}`\n },\n })\n}\n\nexport function createPostBuildPlugin(opts: {\n getConfig: GetConfigFn\n postServerBuild: (opts: {\n startConfig: ReturnType<GetConfigFn>['startConfig']\n builder: ViteBuilder\n }) => Promise<void>\n}): PluginOption {\n return {\n name: 'tanstack-start-core:post-build',\n enforce: 'post',\n buildApp: {\n order: 'post',\n async handler(builder) {\n const { startConfig } = opts.getConfig()\n await opts.postServerBuild({ builder, startConfig })\n },\n },\n }\n}\n\nexport function createDevBaseRewritePlugin(opts: {\n shouldRewriteDevBase: () => boolean\n resolvedStartConfig: ResolvedStartConfig\n}): PluginOption {\n return {\n name: 'tanstack-start-core:dev-base-rewrite',\n configureServer(server) {\n if (!opts.shouldRewriteDevBase()) {\n return\n }\n\n const basePrefix = opts.resolvedStartConfig.basePaths.publicBase.replace(\n /\\/$/,\n '',\n )\n\n server.middlewares.use((req, _res, next) => {\n if (req.url && !req.url.startsWith(basePrefix)) {\n req.url = basePrefix + req.url\n }\n\n next()\n })\n },\n }\n}\n"],"mappings":";;;;AAMA,SAAgB,+BAA+B,MAE9B;AACf,QAAO,oBAAoB;EACzB,MAAM;EACN,UAAU,aAAa;EACvB,SAAS;EACT,OAAO;AACL,UAAO,UAAU,KAAK,UAAU,cAAc,KAAK,gBAAgB,CAAC,CAAC,WAAW,MAAM,IAAI,CAAC;;EAE9F,CAAC;;AAGJ,SAAgB,sBAAsB,MAMrB;AACf,QAAO;EACL,MAAM;EACN,SAAS;EACT,UAAU;GACR,OAAO;GACP,MAAM,QAAQ,SAAS;IACrB,MAAM,EAAE,gBAAgB,KAAK,WAAW;AACxC,UAAM,KAAK,gBAAgB;KAAE;KAAS;KAAa,CAAC;;GAEvD;EACF;;AAGH,SAAgB,2BAA2B,MAG1B;AACf,QAAO;EACL,MAAM;EACN,gBAAgB,QAAQ;AACtB,OAAI,CAAC,KAAK,sBAAsB,CAC9B;GAGF,MAAM,aAAa,KAAK,oBAAoB,UAAU,WAAW,QAC/D,OACA,GACD;AAED,UAAO,YAAY,KAAK,KAAK,MAAM,SAAS;AAC1C,QAAI,IAAI,OAAO,CAAC,IAAI,IAAI,WAAW,WAAW,CAC5C,KAAI,MAAM,aAAa,IAAI;AAG7B,UAAM;KACN;;EAEL"}
|
|
@@ -26,6 +26,7 @@ function normalizeViteClientBuild(clientBundle) {
|
|
|
26
26
|
const chunkFileNamesByRouteFilePath = /* @__PURE__ */ new Map();
|
|
27
27
|
const cssFilesBySourcePath = /* @__PURE__ */ new Map();
|
|
28
28
|
for (const chunk of chunksByFileName.values()) {
|
|
29
|
+
const bundleEntry = clientBundle[chunk.fileName];
|
|
29
30
|
if (chunk.isEntry) {
|
|
30
31
|
if (entryChunkFileName) throw new Error(`multiple entries detected: ${entryChunkFileName} ${chunk.fileName}`);
|
|
31
32
|
entryChunkFileName = chunk.fileName;
|
|
@@ -38,8 +39,7 @@ function normalizeViteClientBuild(clientBundle) {
|
|
|
38
39
|
}
|
|
39
40
|
chunkFileNames.push(chunk.fileName);
|
|
40
41
|
}
|
|
41
|
-
const
|
|
42
|
-
if (bundleEntry?.type === "chunk") for (const moduleId of bundleEntry.moduleIds) {
|
|
42
|
+
for (const moduleId of bundleEntry.moduleIds) {
|
|
43
43
|
const queryIndex = moduleId.indexOf("?");
|
|
44
44
|
const sourcePath = queryIndex >= 0 ? moduleId.slice(0, queryIndex) : moduleId;
|
|
45
45
|
if (!sourcePath) continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalized-client-build.js","names":[],"sources":["../../../../src/vite/start-manifest-plugin/normalized-client-build.ts"],"sourcesContent":["import { tsrSplit } from '@tanstack/router-plugin'\nimport type { Rollup } from 'vite'\nimport type { NormalizedClientBuild, NormalizedClientChunk } from '../../types'\n\nexport function normalizeViteClientChunk(\n chunk: Rollup.OutputChunk,\n): NormalizedClientChunk {\n return {\n fileName: chunk.fileName,\n isEntry: chunk.isEntry,\n imports: chunk.imports,\n dynamicImports: chunk.dynamicImports,\n css: Array.from(chunk.viteMetadata?.importedCss ?? []),\n routeFilePaths: getRouteFilePathsFromModuleIds(chunk.moduleIds),\n }\n}\n\nexport function normalizeViteClientChunks(\n clientBundle: Rollup.OutputBundle,\n): ReadonlyMap<string, NormalizedClientChunk> {\n const chunksByFileName = new Map<string, NormalizedClientChunk>()\n\n for (const fileName in clientBundle) {\n const bundleEntry = clientBundle[fileName]!\n if (bundleEntry.type !== 'chunk') {\n continue\n }\n\n const normalizedChunk = normalizeViteClientChunk(bundleEntry)\n chunksByFileName.set(normalizedChunk.fileName, normalizedChunk)\n }\n\n return chunksByFileName\n}\n\nexport function normalizeViteClientBuild(\n clientBundle: Rollup.OutputBundle,\n): NormalizedClientBuild {\n let entryChunkFileName: string | undefined\n const chunksByFileName = normalizeViteClientChunks(clientBundle)\n const chunkFileNamesByRouteFilePath = new Map<string, Array<string>>()\n const cssFilesBySourcePath = new Map<string, Array<string>>()\n\n for (const chunk of chunksByFileName.values()) {\n if (chunk.isEntry) {\n if (entryChunkFileName) {\n throw new Error(\n `multiple entries detected: ${entryChunkFileName} ${chunk.fileName}`,\n )\n }\n entryChunkFileName = chunk.fileName\n }\n\n for (const routeFilePath of chunk.routeFilePaths) {\n let chunkFileNames = chunkFileNamesByRouteFilePath.get(routeFilePath)\n if (chunkFileNames === undefined) {\n chunkFileNames = []\n chunkFileNamesByRouteFilePath.set(routeFilePath, chunkFileNames)\n }\n chunkFileNames.push(chunk.fileName)\n }\n\n
|
|
1
|
+
{"version":3,"file":"normalized-client-build.js","names":[],"sources":["../../../../src/vite/start-manifest-plugin/normalized-client-build.ts"],"sourcesContent":["import { tsrSplit } from '@tanstack/router-plugin'\nimport type { Rollup } from 'vite'\nimport type { NormalizedClientBuild, NormalizedClientChunk } from '../../types'\n\nexport function normalizeViteClientChunk(\n chunk: Rollup.OutputChunk,\n): NormalizedClientChunk {\n return {\n fileName: chunk.fileName,\n isEntry: chunk.isEntry,\n imports: chunk.imports,\n dynamicImports: chunk.dynamicImports,\n css: Array.from(chunk.viteMetadata?.importedCss ?? []),\n routeFilePaths: getRouteFilePathsFromModuleIds(chunk.moduleIds),\n }\n}\n\nexport function normalizeViteClientChunks(\n clientBundle: Rollup.OutputBundle,\n): ReadonlyMap<string, NormalizedClientChunk> {\n const chunksByFileName = new Map<string, NormalizedClientChunk>()\n\n for (const fileName in clientBundle) {\n const bundleEntry = clientBundle[fileName]!\n if (bundleEntry.type !== 'chunk') {\n continue\n }\n\n const normalizedChunk = normalizeViteClientChunk(bundleEntry)\n chunksByFileName.set(normalizedChunk.fileName, normalizedChunk)\n }\n\n return chunksByFileName\n}\n\nexport function normalizeViteClientBuild(\n clientBundle: Rollup.OutputBundle,\n): NormalizedClientBuild {\n let entryChunkFileName: string | undefined\n const chunksByFileName = normalizeViteClientChunks(clientBundle)\n const chunkFileNamesByRouteFilePath = new Map<string, Array<string>>()\n const cssFilesBySourcePath = new Map<string, Array<string>>()\n\n for (const chunk of chunksByFileName.values()) {\n const bundleEntry = clientBundle[chunk.fileName] as Rollup.OutputChunk\n\n if (chunk.isEntry) {\n if (entryChunkFileName) {\n throw new Error(\n `multiple entries detected: ${entryChunkFileName} ${chunk.fileName}`,\n )\n }\n entryChunkFileName = chunk.fileName\n }\n\n for (const routeFilePath of chunk.routeFilePaths) {\n let chunkFileNames = chunkFileNamesByRouteFilePath.get(routeFilePath)\n if (chunkFileNames === undefined) {\n chunkFileNames = []\n chunkFileNamesByRouteFilePath.set(routeFilePath, chunkFileNames)\n }\n chunkFileNames.push(chunk.fileName)\n }\n\n for (const moduleId of bundleEntry.moduleIds) {\n const queryIndex = moduleId.indexOf('?')\n const sourcePath =\n queryIndex >= 0 ? moduleId.slice(0, queryIndex) : moduleId\n if (!sourcePath) continue\n\n const existing = cssFilesBySourcePath.get(sourcePath)\n cssFilesBySourcePath.set(\n sourcePath,\n existing\n ? Array.from(new Set([...existing, ...chunk.css]))\n : chunk.css.slice(),\n )\n }\n }\n\n if (!entryChunkFileName) {\n throw new Error('No entry file found')\n }\n\n return {\n entryChunkFileName,\n chunksByFileName,\n chunkFileNamesByRouteFilePath,\n cssFilesBySourcePath,\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 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 || seenRouteFilePaths === 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"],"mappings":";;AAIA,SAAgB,yBACd,OACuB;AACvB,QAAO;EACL,UAAU,MAAM;EAChB,SAAS,MAAM;EACf,SAAS,MAAM;EACf,gBAAgB,MAAM;EACtB,KAAK,MAAM,KAAK,MAAM,cAAc,eAAe,EAAE,CAAC;EACtD,gBAAgB,+BAA+B,MAAM,UAAU;EAChE;;AAGH,SAAgB,0BACd,cAC4C;CAC5C,MAAM,mCAAmB,IAAI,KAAoC;AAEjE,MAAK,MAAM,YAAY,cAAc;EACnC,MAAM,cAAc,aAAa;AACjC,MAAI,YAAY,SAAS,QACvB;EAGF,MAAM,kBAAkB,yBAAyB,YAAY;AAC7D,mBAAiB,IAAI,gBAAgB,UAAU,gBAAgB;;AAGjE,QAAO;;AAGT,SAAgB,yBACd,cACuB;CACvB,IAAI;CACJ,MAAM,mBAAmB,0BAA0B,aAAa;CAChE,MAAM,gDAAgC,IAAI,KAA4B;CACtE,MAAM,uCAAuB,IAAI,KAA4B;AAE7D,MAAK,MAAM,SAAS,iBAAiB,QAAQ,EAAE;EAC7C,MAAM,cAAc,aAAa,MAAM;AAEvC,MAAI,MAAM,SAAS;AACjB,OAAI,mBACF,OAAM,IAAI,MACR,8BAA8B,mBAAmB,GAAG,MAAM,WAC3D;AAEH,wBAAqB,MAAM;;AAG7B,OAAK,MAAM,iBAAiB,MAAM,gBAAgB;GAChD,IAAI,iBAAiB,8BAA8B,IAAI,cAAc;AACrE,OAAI,mBAAmB,KAAA,GAAW;AAChC,qBAAiB,EAAE;AACnB,kCAA8B,IAAI,eAAe,eAAe;;AAElE,kBAAe,KAAK,MAAM,SAAS;;AAGrC,OAAK,MAAM,YAAY,YAAY,WAAW;GAC5C,MAAM,aAAa,SAAS,QAAQ,IAAI;GACxC,MAAM,aACJ,cAAc,IAAI,SAAS,MAAM,GAAG,WAAW,GAAG;AACpD,OAAI,CAAC,WAAY;GAEjB,MAAM,WAAW,qBAAqB,IAAI,WAAW;AACrD,wBAAqB,IACnB,YACA,WACI,MAAM,KAAK,IAAI,IAAI,CAAC,GAAG,UAAU,GAAG,MAAM,IAAI,CAAC,CAAC,GAChD,MAAM,IAAI,OAAO,CACtB;;;AAIL,KAAI,CAAC,mBACH,OAAM,IAAI,MAAM,sBAAsB;AAGxC,QAAO;EACL;EACA;EACA;EACA;EACD;;AAGH,SAAgB,+BAA+B,WAA0B;CACvE,IAAI;CACJ,IAAI;AAEJ,MAAK,MAAM,YAAY,WAAW;EAChC,MAAM,aAAa,SAAS,QAAQ,IAAI;AAExC,MAAI,aAAa,EACf;EAGF,MAAM,QAAQ,SAAS,MAAM,aAAa,EAAE;AAE5C,MAAI,CAAC,MAAM,SAAS,SAAS,CAC3B;AAGF,MAAI,CAAC,IAAI,gBAAgB,MAAM,CAAC,IAAI,SAAS,CAC3C;EAGF,MAAM,gBAAgB,SAAS,MAAM,GAAG,WAAW;AAEnD,MAAI,oBAAoB,IAAI,cAAc,CACxC;AAGF,MAAI,mBAAmB,KAAA,KAAa,uBAAuB,KAAA,GAAW;AACpE,oBAAiB,EAAE;AACnB,wCAAqB,IAAI,KAAa;;AAGxC,iBAAe,KAAK,cAAc;AAClC,qBAAmB,IAAI,cAAc;;AAGvC,QAAO,kBAAkB,EAAE"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { GetConfigFn
|
|
1
|
+
import { GetConfigFn } from '../../types.js';
|
|
2
2
|
import { PluginOption } from 'vite';
|
|
3
3
|
export declare function startManifestPlugin(opts: {
|
|
4
|
-
getClientBuild: () => NormalizedClientBuild | undefined;
|
|
5
4
|
getConfig: GetConfigFn;
|
|
6
5
|
}): PluginOption;
|