@tanstack/start-plugin-core 1.167.35 → 1.169.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/import-protection/adapterUtils.d.ts +27 -0
- package/dist/esm/import-protection/adapterUtils.js +31 -0
- package/dist/esm/import-protection/adapterUtils.js.map +1 -0
- package/dist/esm/import-protection/analysis.d.ts +36 -0
- package/dist/esm/import-protection/analysis.js +407 -0
- package/dist/esm/import-protection/analysis.js.map +1 -0
- package/dist/esm/{import-protection-plugin → import-protection}/ast.js +1 -1
- package/dist/esm/import-protection/ast.js.map +1 -0
- package/dist/esm/import-protection/constants.d.ts +11 -0
- package/dist/esm/{import-protection-plugin → import-protection}/constants.js +7 -2
- package/dist/esm/import-protection/constants.js.map +1 -0
- package/dist/esm/{import-protection-plugin → import-protection}/defaults.js +1 -1
- package/dist/esm/import-protection/defaults.js.map +1 -0
- package/dist/esm/{import-protection-plugin → import-protection}/extensionlessAbsoluteIdResolver.js +2 -2
- package/dist/esm/import-protection/extensionlessAbsoluteIdResolver.js.map +1 -0
- package/dist/esm/{import-protection-plugin → import-protection}/matchers.js +1 -1
- package/dist/esm/import-protection/matchers.js.map +1 -0
- package/dist/esm/{import-protection-plugin/rewriteDeniedImports.d.ts → import-protection/rewrite.d.ts} +0 -4
- package/dist/esm/import-protection/rewrite.js +121 -0
- package/dist/esm/import-protection/rewrite.js.map +1 -0
- package/dist/esm/{import-protection-plugin → import-protection}/sourceLocation.d.ts +32 -3
- package/dist/esm/{import-protection-plugin → import-protection}/sourceLocation.js +65 -10
- package/dist/esm/import-protection/sourceLocation.js.map +1 -0
- package/dist/esm/{import-protection-plugin → import-protection}/trace.d.ts +0 -1
- package/dist/esm/{import-protection-plugin → import-protection}/trace.js +1 -1
- package/dist/esm/import-protection/trace.js.map +1 -0
- package/dist/esm/{import-protection-plugin → import-protection}/utils.d.ts +18 -1
- package/dist/esm/{import-protection-plugin → import-protection}/utils.js +13 -20
- package/dist/esm/import-protection/utils.js.map +1 -0
- package/dist/esm/import-protection/virtualModules.d.ts +25 -0
- package/dist/esm/{import-protection-plugin → import-protection}/virtualModules.js +5 -117
- package/dist/esm/import-protection/virtualModules.js.map +1 -0
- package/dist/esm/index.d.ts +1 -5
- package/dist/esm/index.js +2 -4
- package/dist/esm/post-build.d.ts +9 -0
- package/dist/esm/post-build.js +37 -0
- package/dist/esm/post-build.js.map +1 -0
- package/dist/esm/prerender.d.ts +11 -0
- package/dist/esm/prerender.js +159 -0
- package/dist/esm/prerender.js.map +1 -0
- package/dist/esm/rsbuild/dev-server.d.ts +21 -0
- package/dist/esm/rsbuild/dev-server.js +76 -0
- package/dist/esm/rsbuild/dev-server.js.map +1 -0
- package/dist/esm/rsbuild/import-protection.d.ts +10 -0
- package/dist/esm/rsbuild/import-protection.js +775 -0
- package/dist/esm/rsbuild/import-protection.js.map +1 -0
- package/dist/esm/rsbuild/index.d.ts +4 -0
- package/dist/esm/rsbuild/index.js +3 -0
- package/dist/esm/rsbuild/normalized-client-build.d.ts +18 -0
- package/dist/esm/rsbuild/normalized-client-build.js +207 -0
- package/dist/esm/rsbuild/normalized-client-build.js.map +1 -0
- package/dist/esm/rsbuild/planning.d.ts +52 -0
- package/dist/esm/rsbuild/planning.js +108 -0
- package/dist/esm/rsbuild/planning.js.map +1 -0
- package/dist/esm/rsbuild/plugin.d.ts +4 -0
- package/dist/esm/rsbuild/plugin.js +344 -0
- package/dist/esm/rsbuild/plugin.js.map +1 -0
- package/dist/esm/rsbuild/post-build.d.ts +6 -0
- package/dist/esm/rsbuild/post-build.js +57 -0
- package/dist/esm/rsbuild/post-build.js.map +1 -0
- package/dist/esm/rsbuild/schema.d.ts +3372 -0
- package/dist/esm/rsbuild/schema.js +12 -0
- package/dist/esm/rsbuild/schema.js.map +1 -0
- package/dist/esm/rsbuild/start-compiler-host.d.ts +20 -0
- package/dist/esm/rsbuild/start-compiler-host.js +150 -0
- package/dist/esm/rsbuild/start-compiler-host.js.map +1 -0
- package/dist/esm/rsbuild/start-router-plugin.d.ts +18 -0
- package/dist/esm/rsbuild/start-router-plugin.js +63 -0
- package/dist/esm/rsbuild/start-router-plugin.js.map +1 -0
- package/dist/esm/rsbuild/swc-rsc.d.ts +14 -0
- package/dist/esm/rsbuild/swc-rsc.js +93 -0
- package/dist/esm/rsbuild/swc-rsc.js.map +1 -0
- package/dist/esm/rsbuild/types.d.ts +17 -0
- package/dist/esm/rsbuild/types.js +0 -0
- package/dist/esm/rsbuild/virtual-modules.d.ts +53 -0
- package/dist/esm/rsbuild/virtual-modules.js +287 -0
- package/dist/esm/rsbuild/virtual-modules.js.map +1 -0
- package/dist/esm/schema.d.ts +43 -43
- package/dist/esm/start-compiler/compiler.d.ts +1 -1
- package/dist/esm/start-compiler/compiler.js +80 -9
- package/dist/esm/start-compiler/compiler.js.map +1 -1
- package/dist/esm/start-compiler/handleCreateServerFn.js +9 -0
- package/dist/esm/start-compiler/handleCreateServerFn.js.map +1 -1
- package/dist/esm/start-compiler/host.js +5 -1
- package/dist/esm/start-compiler/host.js.map +1 -1
- package/dist/esm/start-compiler/types.d.ts +1 -0
- package/dist/esm/utils.d.ts +1 -0
- package/dist/esm/utils.js +10 -1
- package/dist/esm/utils.js.map +1 -1
- package/dist/esm/{import-protection-plugin → vite/import-protection-plugin}/plugin.js +41 -92
- package/dist/esm/vite/import-protection-plugin/plugin.js.map +1 -0
- package/dist/esm/{import-protection-plugin → vite/import-protection-plugin}/types.d.ts +5 -5
- package/dist/esm/vite/import-protection-plugin/virtualModules.d.ts +8 -0
- package/dist/esm/vite/import-protection-plugin/virtualModules.js +49 -0
- package/dist/esm/vite/import-protection-plugin/virtualModules.js.map +1 -0
- package/dist/esm/vite/index.d.ts +5 -0
- package/dist/esm/vite/index.js +4 -0
- package/dist/esm/vite/plugin.js +1 -1
- package/dist/esm/vite/plugin.js.map +1 -1
- package/dist/esm/vite/post-server-build.js +14 -32
- package/dist/esm/vite/post-server-build.js.map +1 -1
- package/dist/esm/vite/prerender.d.ts +2 -2
- package/dist/esm/vite/prerender.js +17 -147
- package/dist/esm/vite/prerender.js.map +1 -1
- package/dist/esm/vite/schema.d.ts +23 -23
- package/dist/esm/vite/start-compiler-plugin/hot-update.d.ts +2 -0
- package/dist/esm/vite/start-compiler-plugin/hot-update.js +16 -0
- package/dist/esm/vite/start-compiler-plugin/hot-update.js.map +1 -0
- package/dist/esm/vite/start-compiler-plugin/module-specifier.js +9 -4
- package/dist/esm/vite/start-compiler-plugin/module-specifier.js.map +1 -1
- package/dist/esm/vite/start-compiler-plugin/plugin.js +86 -13
- package/dist/esm/vite/start-compiler-plugin/plugin.js.map +1 -1
- package/package.json +32 -4
- package/src/import-protection/INTERNALS.md +266 -0
- package/src/import-protection/adapterUtils.ts +94 -0
- package/src/import-protection/analysis.ts +853 -0
- package/src/{import-protection-plugin → import-protection}/constants.ts +7 -0
- package/src/import-protection/rewrite.ts +229 -0
- package/src/{import-protection-plugin → import-protection}/sourceLocation.ts +125 -9
- package/src/{import-protection-plugin → import-protection}/trace.ts +0 -1
- package/src/{import-protection-plugin → import-protection}/utils.ts +36 -21
- package/src/{import-protection-plugin → import-protection}/virtualModules.ts +30 -177
- package/src/index.ts +1 -8
- package/src/post-build.ts +64 -0
- package/src/prerender.ts +292 -0
- package/src/rsbuild/INTERNALS-import-protection.md +169 -0
- package/src/rsbuild/dev-server.ts +129 -0
- package/src/rsbuild/import-protection.ts +1599 -0
- package/src/rsbuild/index.ts +4 -0
- package/src/rsbuild/normalized-client-build.ts +346 -0
- package/src/rsbuild/planning.ts +234 -0
- package/src/rsbuild/plugin.ts +754 -0
- package/src/rsbuild/post-build.ts +96 -0
- package/src/rsbuild/schema.ts +31 -0
- package/src/rsbuild/start-compiler-host.ts +250 -0
- package/src/rsbuild/start-router-plugin.ts +86 -0
- package/src/rsbuild/swc-rsc.ts +166 -0
- package/src/rsbuild/types.ts +20 -0
- package/src/rsbuild/virtual-modules.ts +565 -0
- package/src/start-compiler/compiler.ts +153 -19
- package/src/start-compiler/handleCreateServerFn.ts +18 -0
- package/src/start-compiler/types.ts +1 -0
- package/src/utils.ts +14 -0
- package/src/vite/import-protection-plugin/INTERNALS.md +187 -0
- package/src/{import-protection-plugin → vite/import-protection-plugin}/plugin.ts +73 -158
- package/src/{import-protection-plugin → vite/import-protection-plugin}/types.ts +5 -5
- package/src/vite/import-protection-plugin/virtualModules.ts +122 -0
- package/src/vite/index.ts +8 -0
- package/src/vite/plugin.ts +1 -1
- package/src/vite/post-server-build.ts +14 -57
- package/src/vite/prerender.ts +19 -260
- package/src/vite/start-compiler-plugin/hot-update.ts +24 -0
- package/src/vite/start-compiler-plugin/module-specifier.ts +15 -5
- package/src/vite/start-compiler-plugin/plugin.ts +193 -18
- package/dist/esm/import-protection-plugin/ast.js.map +0 -1
- package/dist/esm/import-protection-plugin/constants.d.ts +0 -6
- package/dist/esm/import-protection-plugin/constants.js.map +0 -1
- package/dist/esm/import-protection-plugin/defaults.js.map +0 -1
- package/dist/esm/import-protection-plugin/extensionlessAbsoluteIdResolver.js.map +0 -1
- package/dist/esm/import-protection-plugin/matchers.js.map +0 -1
- package/dist/esm/import-protection-plugin/plugin.js.map +0 -1
- package/dist/esm/import-protection-plugin/postCompileUsage.d.ts +0 -13
- package/dist/esm/import-protection-plugin/postCompileUsage.js +0 -63
- package/dist/esm/import-protection-plugin/postCompileUsage.js.map +0 -1
- package/dist/esm/import-protection-plugin/rewriteDeniedImports.js +0 -205
- package/dist/esm/import-protection-plugin/rewriteDeniedImports.js.map +0 -1
- package/dist/esm/import-protection-plugin/sourceLocation.js.map +0 -1
- package/dist/esm/import-protection-plugin/trace.js.map +0 -1
- package/dist/esm/import-protection-plugin/utils.js.map +0 -1
- package/dist/esm/import-protection-plugin/virtualModules.d.ts +0 -78
- package/dist/esm/import-protection-plugin/virtualModules.js.map +0 -1
- package/dist/esm/start-compiler/load-module.d.ts +0 -14
- package/dist/esm/start-compiler/load-module.js +0 -18
- package/dist/esm/start-compiler/load-module.js.map +0 -1
- package/src/import-protection-plugin/INTERNALS.md +0 -700
- package/src/import-protection-plugin/postCompileUsage.ts +0 -100
- package/src/import-protection-plugin/rewriteDeniedImports.ts +0 -379
- package/src/start-compiler/load-module.ts +0 -31
- /package/dist/esm/{import-protection-plugin → import-protection}/ast.d.ts +0 -0
- /package/dist/esm/{import-protection-plugin → import-protection}/defaults.d.ts +0 -0
- /package/dist/esm/{import-protection-plugin → import-protection}/extensionlessAbsoluteIdResolver.d.ts +0 -0
- /package/dist/esm/{import-protection-plugin → import-protection}/matchers.d.ts +0 -0
- /package/dist/esm/{import-protection-plugin → vite/import-protection-plugin}/plugin.d.ts +0 -0
- /package/src/{import-protection-plugin → import-protection}/ast.ts +0 -0
- /package/src/{import-protection-plugin → import-protection}/defaults.ts +0 -0
- /package/src/{import-protection-plugin → import-protection}/extensionlessAbsoluteIdResolver.ts +0 -0
- /package/src/{import-protection-plugin → import-protection}/matchers.ts +0 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { MARKER_PREFIX, MOCK_BUILD_PREFIX, MOCK_EDGE_PREFIX, MOCK_MODULE_ID, MOCK_RUNTIME_PREFIX, RUNTIME_SUGGESTION_TEXT, generateDevSelfDenialModule, generateSelfContainedMockModule, loadMarkerModule, loadMockEdgeModule, loadMockRuntimeModule, loadSilentMockModule, makeMockEdgeModuleId, mockRuntimeModuleIdFromViolation } from '../../import-protection/virtualModules.js';
|
|
2
|
+
export declare function resolvedMarkerVirtualModuleId(kind: 'server' | 'client'): string;
|
|
3
|
+
export declare function getResolvedVirtualModuleMatchers(): ReadonlyArray<string>;
|
|
4
|
+
export declare function resolveInternalVirtualModuleId(source: string): string | undefined;
|
|
5
|
+
export declare function loadResolvedVirtualModule(id: string): {
|
|
6
|
+
code: string;
|
|
7
|
+
} | undefined;
|
|
8
|
+
export { MARKER_PREFIX, MOCK_BUILD_PREFIX, MOCK_EDGE_PREFIX, MOCK_MODULE_ID, MOCK_RUNTIME_PREFIX, RUNTIME_SUGGESTION_TEXT, generateDevSelfDenialModule, generateSelfContainedMockModule, loadMarkerModule, loadMockEdgeModule, loadMockRuntimeModule, loadSilentMockModule, makeMockEdgeModuleId, mockRuntimeModuleIdFromViolation, };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { resolveViteId } from "../../utils.js";
|
|
2
|
+
import { MARKER_PREFIX, MOCK_BUILD_PREFIX, MOCK_EDGE_PREFIX, MOCK_MODULE_ID, MOCK_RUNTIME_PREFIX, VITE_BROWSER_VIRTUAL_PREFIX } from "../../import-protection/constants.js";
|
|
3
|
+
import { loadMarkerModule, loadMockEdgeModule, loadMockRuntimeModule, loadSilentMockModule } from "../../import-protection/virtualModules.js";
|
|
4
|
+
//#region src/vite/import-protection-plugin/virtualModules.ts
|
|
5
|
+
var RESOLVED_MOCK_MODULE_ID = resolveViteId(MOCK_MODULE_ID);
|
|
6
|
+
var RESOLVED_MOCK_BUILD_PREFIX = resolveViteId(MOCK_BUILD_PREFIX);
|
|
7
|
+
var RESOLVED_MOCK_EDGE_PREFIX = resolveViteId(MOCK_EDGE_PREFIX);
|
|
8
|
+
var RESOLVED_MOCK_RUNTIME_PREFIX = resolveViteId(MOCK_RUNTIME_PREFIX);
|
|
9
|
+
var RESOLVED_MARKER_PREFIX = resolveViteId(MARKER_PREFIX);
|
|
10
|
+
var RESOLVED_MARKER_SERVER_ONLY = resolveViteId(`${MARKER_PREFIX}server-only`);
|
|
11
|
+
var RESOLVED_MARKER_CLIENT_ONLY = resolveViteId(`${MARKER_PREFIX}client-only`);
|
|
12
|
+
function resolvedMarkerVirtualModuleId(kind) {
|
|
13
|
+
return kind === "server" ? RESOLVED_MARKER_SERVER_ONLY : RESOLVED_MARKER_CLIENT_ONLY;
|
|
14
|
+
}
|
|
15
|
+
function getResolvedVirtualModuleMatchers() {
|
|
16
|
+
return RESOLVED_VIRTUAL_MODULE_MATCHERS;
|
|
17
|
+
}
|
|
18
|
+
var RESOLVED_VIRTUAL_MODULE_MATCHERS = [
|
|
19
|
+
RESOLVED_MOCK_MODULE_ID,
|
|
20
|
+
RESOLVED_MOCK_BUILD_PREFIX,
|
|
21
|
+
RESOLVED_MOCK_EDGE_PREFIX,
|
|
22
|
+
RESOLVED_MOCK_RUNTIME_PREFIX,
|
|
23
|
+
RESOLVED_MARKER_PREFIX
|
|
24
|
+
];
|
|
25
|
+
var RESOLVE_PREFIX_PAIRS = [
|
|
26
|
+
[MOCK_EDGE_PREFIX, RESOLVED_MOCK_EDGE_PREFIX],
|
|
27
|
+
[MOCK_RUNTIME_PREFIX, RESOLVED_MOCK_RUNTIME_PREFIX],
|
|
28
|
+
[MOCK_BUILD_PREFIX, RESOLVED_MOCK_BUILD_PREFIX],
|
|
29
|
+
[MARKER_PREFIX, RESOLVED_MARKER_PREFIX]
|
|
30
|
+
];
|
|
31
|
+
function resolveInternalVirtualModuleId(source) {
|
|
32
|
+
if (source.startsWith("/@id/__x00__")) return resolveInternalVirtualModuleId(`\0${source.slice(VITE_BROWSER_VIRTUAL_PREFIX.length)}`);
|
|
33
|
+
if (source === "tanstack-start-import-protection:mock" || source === RESOLVED_MOCK_MODULE_ID) return RESOLVED_MOCK_MODULE_ID;
|
|
34
|
+
for (const [unresolvedPrefix, resolvedPrefix] of RESOLVE_PREFIX_PAIRS) {
|
|
35
|
+
if (source.startsWith(unresolvedPrefix)) return resolveViteId(source);
|
|
36
|
+
if (source.startsWith(resolvedPrefix)) return source;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function loadResolvedVirtualModule(id) {
|
|
40
|
+
if (id === RESOLVED_MOCK_MODULE_ID) return loadSilentMockModule();
|
|
41
|
+
if (id.startsWith(RESOLVED_MOCK_BUILD_PREFIX)) return loadSilentMockModule();
|
|
42
|
+
if (id.startsWith(RESOLVED_MOCK_EDGE_PREFIX)) return loadMockEdgeModule(id.slice(RESOLVED_MOCK_EDGE_PREFIX.length));
|
|
43
|
+
if (id.startsWith(RESOLVED_MOCK_RUNTIME_PREFIX)) return loadMockRuntimeModule(id.slice(RESOLVED_MOCK_RUNTIME_PREFIX.length));
|
|
44
|
+
if (id.startsWith(RESOLVED_MARKER_PREFIX)) return loadMarkerModule();
|
|
45
|
+
}
|
|
46
|
+
//#endregion
|
|
47
|
+
export { getResolvedVirtualModuleMatchers, loadResolvedVirtualModule, resolveInternalVirtualModuleId, resolvedMarkerVirtualModuleId };
|
|
48
|
+
|
|
49
|
+
//# sourceMappingURL=virtualModules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virtualModules.js","names":[],"sources":["../../../../src/vite/import-protection-plugin/virtualModules.ts"],"sourcesContent":["import { resolveViteId } from '../../utils'\nimport {\n MARKER_PREFIX,\n MOCK_BUILD_PREFIX,\n MOCK_EDGE_PREFIX,\n MOCK_MODULE_ID,\n MOCK_RUNTIME_PREFIX,\n RUNTIME_SUGGESTION_TEXT,\n generateDevSelfDenialModule,\n generateSelfContainedMockModule,\n loadMarkerModule,\n loadMockEdgeModule,\n loadMockRuntimeModule,\n loadSilentMockModule,\n makeMockEdgeModuleId,\n mockRuntimeModuleIdFromViolation,\n} from '../../import-protection/virtualModules'\nimport { VITE_BROWSER_VIRTUAL_PREFIX } from '../../import-protection/constants'\n\nconst RESOLVED_MOCK_MODULE_ID = resolveViteId(MOCK_MODULE_ID)\nconst RESOLVED_MOCK_BUILD_PREFIX = resolveViteId(MOCK_BUILD_PREFIX)\nconst RESOLVED_MOCK_EDGE_PREFIX = resolveViteId(MOCK_EDGE_PREFIX)\nconst RESOLVED_MOCK_RUNTIME_PREFIX = resolveViteId(MOCK_RUNTIME_PREFIX)\nconst RESOLVED_MARKER_PREFIX = resolveViteId(MARKER_PREFIX)\nconst RESOLVED_MARKER_SERVER_ONLY = resolveViteId(`${MARKER_PREFIX}server-only`)\nconst RESOLVED_MARKER_CLIENT_ONLY = resolveViteId(`${MARKER_PREFIX}client-only`)\n\nexport function resolvedMarkerVirtualModuleId(\n kind: 'server' | 'client',\n): string {\n return kind === 'server'\n ? RESOLVED_MARKER_SERVER_ONLY\n : RESOLVED_MARKER_CLIENT_ONLY\n}\n\nexport function getResolvedVirtualModuleMatchers(): ReadonlyArray<string> {\n return RESOLVED_VIRTUAL_MODULE_MATCHERS\n}\n\nconst RESOLVED_VIRTUAL_MODULE_MATCHERS = [\n RESOLVED_MOCK_MODULE_ID,\n RESOLVED_MOCK_BUILD_PREFIX,\n RESOLVED_MOCK_EDGE_PREFIX,\n RESOLVED_MOCK_RUNTIME_PREFIX,\n RESOLVED_MARKER_PREFIX,\n] as const\n\nconst RESOLVE_PREFIX_PAIRS = [\n [MOCK_EDGE_PREFIX, RESOLVED_MOCK_EDGE_PREFIX],\n [MOCK_RUNTIME_PREFIX, RESOLVED_MOCK_RUNTIME_PREFIX],\n [MOCK_BUILD_PREFIX, RESOLVED_MOCK_BUILD_PREFIX],\n [MARKER_PREFIX, RESOLVED_MARKER_PREFIX],\n] as const\n\nexport function resolveInternalVirtualModuleId(\n source: string,\n): string | undefined {\n if (source.startsWith(VITE_BROWSER_VIRTUAL_PREFIX)) {\n return resolveInternalVirtualModuleId(\n `\\0${source.slice(VITE_BROWSER_VIRTUAL_PREFIX.length)}`,\n )\n }\n\n if (source === MOCK_MODULE_ID || source === RESOLVED_MOCK_MODULE_ID) {\n return RESOLVED_MOCK_MODULE_ID\n }\n\n for (const [unresolvedPrefix, resolvedPrefix] of RESOLVE_PREFIX_PAIRS) {\n if (source.startsWith(unresolvedPrefix)) {\n return resolveViteId(source)\n }\n\n if (source.startsWith(resolvedPrefix)) {\n return source\n }\n }\n\n return undefined\n}\n\nexport function loadResolvedVirtualModule(\n id: string,\n): { code: string } | undefined {\n if (id === RESOLVED_MOCK_MODULE_ID) {\n return loadSilentMockModule()\n }\n\n if (id.startsWith(RESOLVED_MOCK_BUILD_PREFIX)) {\n return loadSilentMockModule()\n }\n\n if (id.startsWith(RESOLVED_MOCK_EDGE_PREFIX)) {\n return loadMockEdgeModule(id.slice(RESOLVED_MOCK_EDGE_PREFIX.length))\n }\n\n if (id.startsWith(RESOLVED_MOCK_RUNTIME_PREFIX)) {\n return loadMockRuntimeModule(id.slice(RESOLVED_MOCK_RUNTIME_PREFIX.length))\n }\n\n if (id.startsWith(RESOLVED_MARKER_PREFIX)) {\n return loadMarkerModule()\n }\n\n return undefined\n}\n\nexport {\n MARKER_PREFIX,\n MOCK_BUILD_PREFIX,\n MOCK_EDGE_PREFIX,\n MOCK_MODULE_ID,\n MOCK_RUNTIME_PREFIX,\n RUNTIME_SUGGESTION_TEXT,\n generateDevSelfDenialModule,\n generateSelfContainedMockModule,\n loadMarkerModule,\n loadMockEdgeModule,\n loadMockRuntimeModule,\n loadSilentMockModule,\n makeMockEdgeModuleId,\n mockRuntimeModuleIdFromViolation,\n}\n"],"mappings":";;;;AAmBA,IAAM,0BAA0B,cAAc,eAAe;AAC7D,IAAM,6BAA6B,cAAc,kBAAkB;AACnE,IAAM,4BAA4B,cAAc,iBAAiB;AACjE,IAAM,+BAA+B,cAAc,oBAAoB;AACvE,IAAM,yBAAyB,cAAc,cAAc;AAC3D,IAAM,8BAA8B,cAAc,GAAG,cAAc,aAAa;AAChF,IAAM,8BAA8B,cAAc,GAAG,cAAc,aAAa;AAEhF,SAAgB,8BACd,MACQ;AACR,QAAO,SAAS,WACZ,8BACA;;AAGN,SAAgB,mCAA0D;AACxE,QAAO;;AAGT,IAAM,mCAAmC;CACvC;CACA;CACA;CACA;CACA;CACD;AAED,IAAM,uBAAuB;CAC3B,CAAC,kBAAkB,0BAA0B;CAC7C,CAAC,qBAAqB,6BAA6B;CACnD,CAAC,mBAAmB,2BAA2B;CAC/C,CAAC,eAAe,uBAAuB;CACxC;AAED,SAAgB,+BACd,QACoB;AACpB,KAAI,OAAO,WAAA,eAAuC,CAChD,QAAO,+BACL,KAAK,OAAO,MAAM,4BAA4B,OAAO,GACtD;AAGH,KAAI,WAAA,2CAA6B,WAAW,wBAC1C,QAAO;AAGT,MAAK,MAAM,CAAC,kBAAkB,mBAAmB,sBAAsB;AACrE,MAAI,OAAO,WAAW,iBAAiB,CACrC,QAAO,cAAc,OAAO;AAG9B,MAAI,OAAO,WAAW,eAAe,CACnC,QAAO;;;AAOb,SAAgB,0BACd,IAC8B;AAC9B,KAAI,OAAO,wBACT,QAAO,sBAAsB;AAG/B,KAAI,GAAG,WAAW,2BAA2B,CAC3C,QAAO,sBAAsB;AAG/B,KAAI,GAAG,WAAW,0BAA0B,CAC1C,QAAO,mBAAmB,GAAG,MAAM,0BAA0B,OAAO,CAAC;AAGvE,KAAI,GAAG,WAAW,6BAA6B,CAC7C,QAAO,sBAAsB,GAAG,MAAM,6BAA6B,OAAO,CAAC;AAG7E,KAAI,GAAG,WAAW,uBAAuB,CACvC,QAAO,kBAAkB"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type { TanStackStartVitePluginCoreOptions, ViteRscForwardSsrResolverStrategy, } from './types.js';
|
|
2
|
+
export type { TanStackStartViteInputConfig } from './schema.js';
|
|
3
|
+
export { START_ENVIRONMENT_NAMES, VITE_ENVIRONMENT_NAMES } from '../constants.js';
|
|
4
|
+
export { createVirtualModule } from './createVirtualModule.js';
|
|
5
|
+
export { tanStackStartVite } from './plugin.js';
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { START_ENVIRONMENT_NAMES, VITE_ENVIRONMENT_NAMES } from "../constants.js";
|
|
2
|
+
import { createVirtualModule } from "./createVirtualModule.js";
|
|
3
|
+
import { tanStackStartVite } from "./plugin.js";
|
|
4
|
+
export { START_ENVIRONMENT_NAMES, VITE_ENVIRONMENT_NAMES, createVirtualModule, tanStackStartVite };
|
package/dist/esm/vite/plugin.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { START_ENVIRONMENT_NAMES } from "../constants.js";
|
|
2
2
|
import { createServerFnBasePath, normalizePublicBase, shouldRewriteDevBasepath } from "../planning.js";
|
|
3
3
|
import { applyResolvedBaseAndOutput, applyResolvedRouterBasepath, createStartConfigContext } from "../config-context.js";
|
|
4
|
-
import { importProtectionPlugin } from "
|
|
4
|
+
import { importProtectionPlugin } from "./import-protection-plugin/plugin.js";
|
|
5
5
|
import { startCompilerPlugin } from "./start-compiler-plugin/plugin.js";
|
|
6
6
|
import { loadEnvPlugin } from "./load-env-plugin/plugin.js";
|
|
7
7
|
import { buildStartViteEnvironments, createViteConfigPlan, createViteDefineConfig, createViteResolvedEntryAliases } from "./planning.js";
|
|
@@ -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 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
|
+
{"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 {\n createServerFnBasePath,\n normalizePublicBase,\n shouldRewriteDevBasepath,\n} from '../planning'\nimport { importProtectionPlugin } from './import-protection-plugin/plugin'\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,39 +1,21 @@
|
|
|
1
1
|
import { getClientOutputDirectory } from "./output-directory.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { HEADERS } from "@tanstack/start-server-core";
|
|
2
|
+
import { postBuild } from "../post-build.js";
|
|
3
|
+
import { prerenderWithVite } from "./prerender.js";
|
|
5
4
|
//#region src/vite/post-server-build.ts
|
|
6
5
|
async function postServerBuild({ builder, startConfig }) {
|
|
7
|
-
|
|
8
|
-
...startConfig.prerender,
|
|
9
|
-
enabled: startConfig.prerender?.enabled ?? startConfig.pages.some((d) => typeof d === "string" ? false : !!d.prerender?.enabled)
|
|
10
|
-
};
|
|
11
|
-
if (startConfig.spa?.enabled) {
|
|
12
|
-
startConfig.prerender = {
|
|
13
|
-
...startConfig.prerender,
|
|
14
|
-
enabled: true
|
|
15
|
-
};
|
|
16
|
-
const maskUrl = new URL(startConfig.spa.maskPath, "http://localhost");
|
|
17
|
-
if (maskUrl.origin !== "http://localhost") throw new Error("spa.maskPath must be a path (no protocol/host)");
|
|
18
|
-
startConfig.pages.push({
|
|
19
|
-
path: maskUrl.toString().replace("http://localhost", ""),
|
|
20
|
-
prerender: {
|
|
21
|
-
...startConfig.spa.prerender,
|
|
22
|
-
headers: {
|
|
23
|
-
...startConfig.spa.prerender.headers,
|
|
24
|
-
[HEADERS.TSS_SHELL]: "true"
|
|
25
|
-
}
|
|
26
|
-
},
|
|
27
|
-
sitemap: { exclude: true }
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
if (startConfig.prerender.enabled) await prerender({
|
|
31
|
-
startConfig,
|
|
32
|
-
builder
|
|
33
|
-
});
|
|
34
|
-
if (startConfig.sitemap?.enabled) buildSitemap({
|
|
6
|
+
await postBuild({
|
|
35
7
|
startConfig,
|
|
36
|
-
|
|
8
|
+
adapter: {
|
|
9
|
+
getClientOutputDirectory() {
|
|
10
|
+
return getClientOutputDirectory(builder.config);
|
|
11
|
+
},
|
|
12
|
+
prerender(startConfig) {
|
|
13
|
+
return prerenderWithVite({
|
|
14
|
+
startConfig,
|
|
15
|
+
builder
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
37
19
|
});
|
|
38
20
|
}
|
|
39
21
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post-server-build.js","names":[],"sources":["../../../src/vite/post-server-build.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"post-server-build.js","names":[],"sources":["../../../src/vite/post-server-build.ts"],"sourcesContent":["import { postBuild } from '../post-build'\nimport { getClientOutputDirectory } from './output-directory'\nimport { prerenderWithVite } from './prerender'\nimport type { TanStackStartOutputConfig } from '../schema'\nimport type { ViteBuilder } from 'vite'\n\nexport async function postServerBuild({\n builder,\n startConfig,\n}: {\n builder: ViteBuilder\n startConfig: TanStackStartOutputConfig\n}) {\n await postBuild({\n startConfig,\n adapter: {\n getClientOutputDirectory() {\n return getClientOutputDirectory(builder.config)\n },\n prerender(startConfig) {\n return prerenderWithVite({\n startConfig,\n builder,\n })\n },\n },\n })\n}\n"],"mappings":";;;;AAMA,eAAsB,gBAAgB,EACpC,SACA,eAIC;AACD,OAAM,UAAU;EACd;EACA,SAAS;GACP,2BAA2B;AACzB,WAAO,yBAAyB,QAAQ,OAAO;;GAEjD,UAAU,aAAa;AACrB,WAAO,kBAAkB;KACvB;KACA;KACD,CAAC;;GAEL;EACF,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { ViteBuilder } from 'vite';
|
|
2
1
|
import { TanStackStartOutputConfig } from '../schema.js';
|
|
3
|
-
|
|
2
|
+
import { ViteBuilder } from 'vite';
|
|
3
|
+
export declare function prerenderWithVite({ startConfig, builder, }: {
|
|
4
4
|
startConfig: TanStackStartOutputConfig;
|
|
5
5
|
builder: ViteBuilder;
|
|
6
6
|
}): Promise<void>;
|
|
@@ -1,27 +1,7 @@
|
|
|
1
1
|
import { VITE_ENVIRONMENT_NAMES } from "../constants.js";
|
|
2
|
-
import {
|
|
3
|
-
import { Queue } from "../queue.js";
|
|
4
|
-
import path from "pathe";
|
|
5
|
-
import { joinURL, withBase, withTrailingSlash, withoutBase } from "ufo";
|
|
6
|
-
import { promises } from "node:fs";
|
|
7
|
-
import os from "node:os";
|
|
2
|
+
import { prerender } from "../prerender.js";
|
|
8
3
|
//#region src/vite/prerender.ts
|
|
9
|
-
async function
|
|
10
|
-
const logger = createLogger("prerender");
|
|
11
|
-
logger.info("Prerendering pages...");
|
|
12
|
-
if (startConfig.prerender?.enabled) {
|
|
13
|
-
let pages = startConfig.pages.length ? startConfig.pages : [{ path: "/" }];
|
|
14
|
-
if (startConfig.prerender.autoStaticPathsDiscovery ?? true) {
|
|
15
|
-
const pagesMap = new Map(pages.map((item) => [item.path, item]));
|
|
16
|
-
const discoveredPages = globalThis.TSS_PRERENDABLE_PATHS || [];
|
|
17
|
-
for (const page of discoveredPages) if (!pagesMap.has(page.path)) pagesMap.set(page.path, page);
|
|
18
|
-
pages = Array.from(pagesMap.values());
|
|
19
|
-
}
|
|
20
|
-
startConfig.pages = pages;
|
|
21
|
-
}
|
|
22
|
-
const routerBasePath = joinURL("/", startConfig.router.basepath ?? "");
|
|
23
|
-
const routerBaseUrl = new URL(routerBasePath, "http://localhost");
|
|
24
|
-
startConfig.pages = validateAndNormalizePrerenderPages(startConfig.pages, routerBaseUrl);
|
|
4
|
+
async function prerenderWithVite({ startConfig, builder }) {
|
|
25
5
|
const serverEnv = builder.environments[VITE_ENVIRONMENT_NAMES.server];
|
|
26
6
|
if (!serverEnv) throw new Error(`Vite's "${VITE_ENVIRONMENT_NAMES.server}" environment not found`);
|
|
27
7
|
const clientEnv = builder.environments[VITE_ENVIRONMENT_NAMES.client];
|
|
@@ -31,115 +11,21 @@ async function prerender({ startConfig, builder }) {
|
|
|
31
11
|
process.env.TSS_CLIENT_OUTPUT_DIR = outputDir;
|
|
32
12
|
const previewServer = await startPreviewServer(serverEnv.config);
|
|
33
13
|
const baseUrl = getResolvedUrl(previewServer);
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
try {
|
|
49
|
-
const pages = await prerenderPages({ outputDir });
|
|
50
|
-
logger.info(`Prerendered ${pages.length} pages:`);
|
|
51
|
-
pages.forEach((page) => {
|
|
52
|
-
logger.info(`- ${page}`);
|
|
53
|
-
});
|
|
54
|
-
} catch (error) {
|
|
55
|
-
logger.error(error);
|
|
56
|
-
} finally {
|
|
57
|
-
await previewServer.close();
|
|
58
|
-
}
|
|
59
|
-
function extractLinks(html) {
|
|
60
|
-
const linkRegex = /<a[^>]+href=["']([^"']+)["'][^>]*>/g;
|
|
61
|
-
const links = [];
|
|
62
|
-
let match;
|
|
63
|
-
while ((match = linkRegex.exec(html)) !== null) {
|
|
64
|
-
const href = match[1];
|
|
65
|
-
if (href && (href.startsWith("/") || href.startsWith("./"))) links.push(href);
|
|
66
|
-
}
|
|
67
|
-
return links;
|
|
68
|
-
}
|
|
69
|
-
async function prerenderPages({ outputDir }) {
|
|
70
|
-
const seen = /* @__PURE__ */ new Set();
|
|
71
|
-
const prerendered = /* @__PURE__ */ new Set();
|
|
72
|
-
const retriesByPath = /* @__PURE__ */ new Map();
|
|
73
|
-
const concurrency = startConfig.prerender?.concurrency ?? os.cpus().length;
|
|
74
|
-
logger.info(`Concurrency: ${concurrency}`);
|
|
75
|
-
const queue = new Queue({ concurrency });
|
|
76
|
-
const routerBasePath = joinURL("/", startConfig.router.basepath ?? "");
|
|
77
|
-
const routerBaseUrl = new URL(routerBasePath, "http://localhost");
|
|
78
|
-
startConfig.pages = validateAndNormalizePrerenderPages(startConfig.pages, routerBaseUrl);
|
|
79
|
-
startConfig.pages.forEach((page) => addCrawlPageTask(page));
|
|
80
|
-
if (queue.isSettled()) {
|
|
81
|
-
logger.info("No pages matched prerender filter; skipping.");
|
|
82
|
-
return Array.from(prerendered);
|
|
83
|
-
}
|
|
84
|
-
await queue.start();
|
|
85
|
-
return Array.from(prerendered);
|
|
86
|
-
function addCrawlPageTask(page) {
|
|
87
|
-
if (seen.has(page.path)) return;
|
|
88
|
-
seen.add(page.path);
|
|
89
|
-
if (page.fromCrawl) startConfig.pages.push(page);
|
|
90
|
-
if (!(page.prerender?.enabled ?? true)) return;
|
|
91
|
-
if (startConfig.prerender?.filter && !startConfig.prerender.filter(page)) return;
|
|
92
|
-
const prerenderOptions = {
|
|
93
|
-
...startConfig.prerender,
|
|
94
|
-
...page.prerender
|
|
95
|
-
};
|
|
96
|
-
queue.add(async () => {
|
|
97
|
-
logger.info(`Crawling: ${page.path}`);
|
|
98
|
-
const retries = retriesByPath.get(page.path) || 0;
|
|
99
|
-
try {
|
|
100
|
-
const res = await localFetch(withTrailingSlash(withBase(page.path, routerBasePath)), { headers: { ...prerenderOptions.headers ?? {} } }, prerenderOptions.maxRedirects);
|
|
101
|
-
if (!res.ok) {
|
|
102
|
-
if (isRedirectResponse(res)) logger.warn(`Max redirects reached for ${page.path}`);
|
|
103
|
-
throw new Error(`Failed to fetch ${page.path}: ${res.statusText}`, { cause: res });
|
|
104
|
-
}
|
|
105
|
-
const cleanPagePath = (prerenderOptions.outputPath || page.path).split(/[?#]/)[0];
|
|
106
|
-
const contentType = res.headers.get("content-type") || "";
|
|
107
|
-
const isImplicitHTML = !cleanPagePath.endsWith(".html") && contentType.includes("html");
|
|
108
|
-
const routeWithIndex = cleanPagePath.endsWith("/") ? cleanPagePath + "index" : cleanPagePath;
|
|
109
|
-
const isSpaShell = startConfig.spa?.prerender.outputPath === cleanPagePath;
|
|
110
|
-
let htmlPath;
|
|
111
|
-
if (isSpaShell) htmlPath = cleanPagePath + ".html";
|
|
112
|
-
else if (cleanPagePath.endsWith("/") || (prerenderOptions.autoSubfolderIndex ?? true)) htmlPath = joinURL(cleanPagePath, "index.html");
|
|
113
|
-
else htmlPath = cleanPagePath + ".html";
|
|
114
|
-
const filename = withoutBase(isImplicitHTML ? htmlPath : routeWithIndex, routerBasePath);
|
|
115
|
-
const html = await res.text();
|
|
116
|
-
const filepath = path.join(outputDir, filename);
|
|
117
|
-
await promises.mkdir(path.dirname(filepath), { recursive: true });
|
|
118
|
-
await promises.writeFile(filepath, html);
|
|
119
|
-
prerendered.add(page.path);
|
|
120
|
-
const newPage = await prerenderOptions.onSuccess?.({
|
|
121
|
-
page,
|
|
122
|
-
html
|
|
123
|
-
});
|
|
124
|
-
if (newPage) Object.assign(page, newPage);
|
|
125
|
-
if (prerenderOptions.crawlLinks ?? true) {
|
|
126
|
-
const links = extractLinks(html);
|
|
127
|
-
for (const link of links) addCrawlPageTask({
|
|
128
|
-
path: link,
|
|
129
|
-
fromCrawl: true
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
} catch (error) {
|
|
133
|
-
if (retries < (prerenderOptions.retryCount ?? 0)) {
|
|
134
|
-
logger.warn(`Encountered error, retrying: ${page.path} in 500ms`);
|
|
135
|
-
await new Promise((resolve) => setTimeout(resolve, prerenderOptions.retryDelay));
|
|
136
|
-
retriesByPath.set(page.path, retries + 1);
|
|
137
|
-
addCrawlPageTask(page);
|
|
138
|
-
} else if (prerenderOptions.failOnError ?? true) throw error;
|
|
139
|
-
}
|
|
140
|
-
});
|
|
14
|
+
return prerender({
|
|
15
|
+
startConfig,
|
|
16
|
+
handler: {
|
|
17
|
+
getClientOutputDirectory() {
|
|
18
|
+
return outputDir;
|
|
19
|
+
},
|
|
20
|
+
request(path, options) {
|
|
21
|
+
const url = new URL(path, baseUrl);
|
|
22
|
+
return fetch(new Request(url, options));
|
|
23
|
+
},
|
|
24
|
+
close() {
|
|
25
|
+
return previewServer.close();
|
|
26
|
+
}
|
|
141
27
|
}
|
|
142
|
-
}
|
|
28
|
+
});
|
|
143
29
|
}
|
|
144
30
|
async function startPreviewServer(viteConfig) {
|
|
145
31
|
const vite = await import("vite");
|
|
@@ -160,23 +46,7 @@ function getResolvedUrl(previewServer) {
|
|
|
160
46
|
if (!baseUrl) throw new Error("No resolved URL is available from the Vite preview server");
|
|
161
47
|
return new URL(baseUrl);
|
|
162
48
|
}
|
|
163
|
-
function validateAndNormalizePrerenderPages(pages, routerBaseUrl) {
|
|
164
|
-
return pages.map((page) => {
|
|
165
|
-
let url;
|
|
166
|
-
try {
|
|
167
|
-
url = new URL(page.path, routerBaseUrl);
|
|
168
|
-
} catch (err) {
|
|
169
|
-
throw new Error(`prerender page path must be relative: ${page.path}`, { cause: err });
|
|
170
|
-
}
|
|
171
|
-
if (url.origin !== "http://localhost") throw new Error(`prerender page path must be relative: ${page.path}`);
|
|
172
|
-
const decodedPathname = decodeURIComponent(url.pathname);
|
|
173
|
-
return {
|
|
174
|
-
...page,
|
|
175
|
-
path: decodedPathname + url.search + url.hash
|
|
176
|
-
};
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
49
|
//#endregion
|
|
180
|
-
export {
|
|
50
|
+
export { prerenderWithVite };
|
|
181
51
|
|
|
182
52
|
//# sourceMappingURL=prerender.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prerender.js","names":[],"sources":["../../../src/vite/prerender.ts"],"sourcesContent":["import { promises as fsp } from 'node:fs'\nimport os from 'node:os'\nimport path from 'pathe'\nimport { joinURL, withBase, withTrailingSlash, withoutBase } from 'ufo'\nimport { VITE_ENVIRONMENT_NAMES } from '../constants'\nimport { createLogger } from '../utils'\nimport { Queue } from '../queue'\nimport type { PreviewServer, ResolvedConfig, ViteBuilder } from 'vite'\nimport type { Page, TanStackStartOutputConfig } from '../schema'\n\nexport async function prerender({\n startConfig,\n builder,\n}: {\n startConfig: TanStackStartOutputConfig\n builder: ViteBuilder\n}) {\n const logger = createLogger('prerender')\n logger.info('Prerendering pages...')\n\n if (startConfig.prerender?.enabled) {\n let pages = startConfig.pages.length ? startConfig.pages : [{ path: '/' }]\n\n if (startConfig.prerender.autoStaticPathsDiscovery ?? true) {\n const pagesMap = new Map(pages.map((item) => [item.path, item]))\n const discoveredPages = globalThis.TSS_PRERENDABLE_PATHS || []\n\n for (const page of discoveredPages) {\n if (!pagesMap.has(page.path)) {\n pagesMap.set(page.path, page)\n }\n }\n\n pages = Array.from(pagesMap.values())\n }\n\n startConfig.pages = pages\n }\n\n const routerBasePath = joinURL('/', startConfig.router.basepath ?? '')\n const routerBaseUrl = new URL(routerBasePath, 'http://localhost')\n\n startConfig.pages = validateAndNormalizePrerenderPages(\n startConfig.pages,\n routerBaseUrl,\n )\n\n const serverEnv = builder.environments[VITE_ENVIRONMENT_NAMES.server]\n\n if (!serverEnv) {\n throw new Error(\n `Vite's \"${VITE_ENVIRONMENT_NAMES.server}\" environment not found`,\n )\n }\n\n const clientEnv = builder.environments[VITE_ENVIRONMENT_NAMES.client]\n if (!clientEnv) {\n throw new Error(\n `Vite's \"${VITE_ENVIRONMENT_NAMES.client}\" environment not found`,\n )\n }\n\n const outputDir = clientEnv.config.build.outDir\n\n process.env.TSS_PRERENDERING = 'true'\n process.env.TSS_CLIENT_OUTPUT_DIR = outputDir\n\n const previewServer = await startPreviewServer(serverEnv.config)\n const baseUrl = getResolvedUrl(previewServer)\n\n const isRedirectResponse = (res: Response) => {\n return res.status >= 300 && res.status < 400 && res.headers.get('location')\n }\n\n async function localFetch(\n path: string,\n options?: RequestInit,\n maxRedirects: number = 5,\n ): Promise<Response> {\n const url = new URL(path, baseUrl)\n const request = new Request(url, options)\n const response = await fetch(request)\n\n if (isRedirectResponse(response) && maxRedirects > 0) {\n const location = response.headers.get('location')!\n if (location.startsWith('http://localhost') || location.startsWith('/')) {\n const newUrl = location.replace('http://localhost', '')\n return localFetch(newUrl, options, maxRedirects - 1)\n }\n\n logger.warn(`Skipping redirect to external location: ${location}`)\n }\n\n return response\n }\n\n try {\n const pages = await prerenderPages({ outputDir })\n\n logger.info(`Prerendered ${pages.length} pages:`)\n pages.forEach((page) => {\n logger.info(`- ${page}`)\n })\n } catch (error) {\n logger.error(error)\n } finally {\n await previewServer.close()\n }\n\n function extractLinks(html: string): Array<string> {\n const linkRegex = /<a[^>]+href=[\"']([^\"']+)[\"'][^>]*>/g\n const links: Array<string> = []\n let match: RegExpExecArray | null\n\n while ((match = linkRegex.exec(html)) !== null) {\n const href = match[1]\n if (href && (href.startsWith('/') || href.startsWith('./'))) {\n links.push(href)\n }\n }\n\n return links\n }\n\n async function prerenderPages({ outputDir }: { outputDir: string }) {\n const seen = new Set<string>()\n const prerendered = new Set<string>()\n const retriesByPath = new Map<string, number>()\n const concurrency = startConfig.prerender?.concurrency ?? os.cpus().length\n logger.info(`Concurrency: ${concurrency}`)\n const queue = new Queue({ concurrency })\n const routerBasePath = joinURL('/', startConfig.router.basepath ?? '')\n\n const routerBaseUrl = new URL(routerBasePath, 'http://localhost')\n startConfig.pages = validateAndNormalizePrerenderPages(\n startConfig.pages,\n routerBaseUrl,\n )\n\n startConfig.pages.forEach((page) => addCrawlPageTask(page))\n\n if (queue.isSettled()) {\n logger.info('No pages matched prerender filter; skipping.')\n return Array.from(prerendered)\n }\n\n await queue.start()\n\n return Array.from(prerendered)\n\n function addCrawlPageTask(page: Page) {\n if (seen.has(page.path)) return\n\n seen.add(page.path)\n\n if (page.fromCrawl) {\n startConfig.pages.push(page)\n }\n\n if (!(page.prerender?.enabled ?? true)) return\n\n if (\n startConfig.prerender?.filter &&\n !startConfig.prerender.filter(page)\n ) {\n return\n }\n\n const prerenderOptions = {\n ...startConfig.prerender,\n ...page.prerender,\n }\n\n queue.add(async () => {\n logger.info(`Crawling: ${page.path}`)\n const retries = retriesByPath.get(page.path) || 0\n try {\n const res = await localFetch(\n withTrailingSlash(withBase(page.path, routerBasePath)),\n {\n headers: {\n ...(prerenderOptions.headers ?? {}),\n },\n },\n prerenderOptions.maxRedirects,\n )\n\n if (!res.ok) {\n if (isRedirectResponse(res)) {\n logger.warn(`Max redirects reached for ${page.path}`)\n }\n throw new Error(`Failed to fetch ${page.path}: ${res.statusText}`, {\n cause: res,\n })\n }\n\n const cleanPagePath = (\n prerenderOptions.outputPath || page.path\n ).split(/[?#]/)[0]!\n\n const contentType = res.headers.get('content-type') || ''\n const isImplicitHTML =\n !cleanPagePath.endsWith('.html') && contentType.includes('html')\n\n const routeWithIndex = cleanPagePath.endsWith('/')\n ? cleanPagePath + 'index'\n : cleanPagePath\n\n const isSpaShell =\n startConfig.spa?.prerender.outputPath === cleanPagePath\n\n let htmlPath: string\n if (isSpaShell) {\n htmlPath = cleanPagePath + '.html'\n } else if (\n cleanPagePath.endsWith('/') ||\n (prerenderOptions.autoSubfolderIndex ?? true)\n ) {\n htmlPath = joinURL(cleanPagePath, 'index.html')\n } else {\n htmlPath = cleanPagePath + '.html'\n }\n\n const filename = withoutBase(\n isImplicitHTML ? htmlPath : routeWithIndex,\n routerBasePath,\n )\n\n const html = await res.text()\n\n const filepath = path.join(outputDir, filename)\n\n await fsp.mkdir(path.dirname(filepath), {\n recursive: true,\n })\n\n await fsp.writeFile(filepath, html)\n\n prerendered.add(page.path)\n\n const newPage = await prerenderOptions.onSuccess?.({ page, html })\n\n if (newPage) {\n Object.assign(page, newPage)\n }\n\n if (prerenderOptions.crawlLinks ?? true) {\n const links = extractLinks(html)\n for (const link of links) {\n addCrawlPageTask({ path: link, fromCrawl: true })\n }\n }\n } catch (error) {\n if (retries < (prerenderOptions.retryCount ?? 0)) {\n logger.warn(`Encountered error, retrying: ${page.path} in 500ms`)\n await new Promise((resolve) =>\n setTimeout(resolve, prerenderOptions.retryDelay),\n )\n retriesByPath.set(page.path, retries + 1)\n addCrawlPageTask(page)\n } else if (prerenderOptions.failOnError ?? true) {\n throw error\n }\n }\n })\n }\n }\n}\n\nasync function startPreviewServer(\n viteConfig: ResolvedConfig,\n): Promise<PreviewServer> {\n const vite = await import('vite')\n\n try {\n return await vite.preview({\n configFile: viteConfig.configFile,\n preview: {\n port: 0,\n open: false,\n },\n })\n } catch (error) {\n throw new Error(\n 'Failed to start the Vite preview server for prerendering',\n {\n cause: error,\n },\n )\n }\n}\n\nfunction getResolvedUrl(previewServer: PreviewServer): URL {\n const baseUrl = previewServer.resolvedUrls?.local[0]\n\n if (!baseUrl) {\n throw new Error('No resolved URL is available from the Vite preview server')\n }\n\n return new URL(baseUrl)\n}\n\nfunction validateAndNormalizePrerenderPages(\n pages: Array<Page>,\n routerBaseUrl: URL,\n): Array<Page> {\n return pages.map((page) => {\n let url: URL\n try {\n url = new URL(page.path, routerBaseUrl)\n } catch (err) {\n throw new Error(`prerender page path must be relative: ${page.path}`, {\n cause: err,\n })\n }\n\n if (url.origin !== 'http://localhost') {\n throw new Error(`prerender page path must be relative: ${page.path}`)\n }\n\n const decodedPathname = decodeURIComponent(url.pathname)\n\n return {\n ...page,\n path: decodedPathname + url.search + url.hash,\n }\n })\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"prerender.js","names":[],"sources":["../../../src/vite/prerender.ts"],"sourcesContent":["import { VITE_ENVIRONMENT_NAMES } from '../constants'\nimport { prerender } from '../prerender'\nimport type { PrerenderHandler } from '../prerender'\nimport type { TanStackStartOutputConfig } from '../schema'\nimport type { PreviewServer, ResolvedConfig, ViteBuilder } from 'vite'\n\nexport async function prerenderWithVite({\n startConfig,\n builder,\n}: {\n startConfig: TanStackStartOutputConfig\n builder: ViteBuilder\n}) {\n const serverEnv = builder.environments[VITE_ENVIRONMENT_NAMES.server]\n\n if (!serverEnv) {\n throw new Error(\n `Vite's \"${VITE_ENVIRONMENT_NAMES.server}\" environment not found`,\n )\n }\n\n const clientEnv = builder.environments[VITE_ENVIRONMENT_NAMES.client]\n if (!clientEnv) {\n throw new Error(\n `Vite's \"${VITE_ENVIRONMENT_NAMES.client}\" environment not found`,\n )\n }\n\n const outputDir = clientEnv.config.build.outDir\n\n process.env.TSS_PRERENDERING = 'true'\n process.env.TSS_CLIENT_OUTPUT_DIR = outputDir\n\n const previewServer = await startPreviewServer(serverEnv.config)\n const baseUrl = getResolvedUrl(previewServer)\n\n const handler: PrerenderHandler = {\n getClientOutputDirectory() {\n return outputDir\n },\n request(path, options) {\n const url = new URL(path, baseUrl)\n return fetch(new Request(url, options))\n },\n close() {\n return previewServer.close()\n },\n }\n\n return prerender({\n startConfig,\n handler,\n })\n}\n\nasync function startPreviewServer(\n viteConfig: ResolvedConfig,\n): Promise<PreviewServer> {\n const vite = await import('vite')\n\n try {\n return await vite.preview({\n configFile: viteConfig.configFile,\n preview: {\n port: 0,\n open: false,\n },\n })\n } catch (error) {\n throw new Error(\n 'Failed to start the Vite preview server for prerendering',\n {\n cause: error,\n },\n )\n }\n}\n\nfunction getResolvedUrl(previewServer: PreviewServer): URL {\n const baseUrl = previewServer.resolvedUrls?.local[0]\n\n if (!baseUrl) {\n throw new Error('No resolved URL is available from the Vite preview server')\n }\n\n return new URL(baseUrl)\n}\n"],"mappings":";;;AAMA,eAAsB,kBAAkB,EACtC,aACA,WAIC;CACD,MAAM,YAAY,QAAQ,aAAa,uBAAuB;AAE9D,KAAI,CAAC,UACH,OAAM,IAAI,MACR,WAAW,uBAAuB,OAAO,yBAC1C;CAGH,MAAM,YAAY,QAAQ,aAAa,uBAAuB;AAC9D,KAAI,CAAC,UACH,OAAM,IAAI,MACR,WAAW,uBAAuB,OAAO,yBAC1C;CAGH,MAAM,YAAY,UAAU,OAAO,MAAM;AAEzC,SAAQ,IAAI,mBAAmB;AAC/B,SAAQ,IAAI,wBAAwB;CAEpC,MAAM,gBAAgB,MAAM,mBAAmB,UAAU,OAAO;CAChE,MAAM,UAAU,eAAe,cAAc;AAe7C,QAAO,UAAU;EACf;EACA,SAfgC;GAChC,2BAA2B;AACzB,WAAO;;GAET,QAAQ,MAAM,SAAS;IACrB,MAAM,MAAM,IAAI,IAAI,MAAM,QAAQ;AAClC,WAAO,MAAM,IAAI,QAAQ,KAAK,QAAQ,CAAC;;GAEzC,QAAQ;AACN,WAAO,cAAc,OAAO;;GAE/B;EAKA,CAAC;;AAGJ,eAAe,mBACb,YACwB;CACxB,MAAM,OAAO,MAAM,OAAO;AAE1B,KAAI;AACF,SAAO,MAAM,KAAK,QAAQ;GACxB,YAAY,WAAW;GACvB,SAAS;IACP,MAAM;IACN,MAAM;IACP;GACF,CAAC;UACK,OAAO;AACd,QAAM,IAAI,MACR,4DACA,EACE,OAAO,OACR,CACF;;;AAIL,SAAS,eAAe,eAAmC;CACzD,MAAM,UAAU,cAAc,cAAc,MAAM;AAElD,KAAI,CAAC,QACH,OAAM,IAAI,MAAM,4DAA4D;AAG9E,QAAO,IAAI,IAAI,QAAQ"}
|
|
@@ -78,11 +78,11 @@ export declare const tanstackStartViteOptionsSchema: z.ZodDefault<z.ZodOptional<
|
|
|
78
78
|
codeSplittingOptions: z.ZodOptional<z.ZodOptional<z.ZodType<import('@tanstack/router-plugin').CodeSplittingOptions, z.ZodTypeDef, import('@tanstack/router-plugin').CodeSplittingOptions>>>;
|
|
79
79
|
plugin: z.ZodOptional<z.ZodOptional<z.ZodObject<{
|
|
80
80
|
hmr: z.ZodOptional<z.ZodObject<{
|
|
81
|
-
|
|
81
|
+
style: z.ZodOptional<z.ZodEnum<["vite", "webpack"]>>;
|
|
82
82
|
}, "strip", z.ZodTypeAny, {
|
|
83
|
-
|
|
83
|
+
style?: "vite" | "webpack" | undefined;
|
|
84
84
|
}, {
|
|
85
|
-
|
|
85
|
+
style?: "vite" | "webpack" | undefined;
|
|
86
86
|
}>>;
|
|
87
87
|
vite: z.ZodOptional<z.ZodObject<{
|
|
88
88
|
environmentName: z.ZodOptional<z.ZodString>;
|
|
@@ -92,19 +92,19 @@ export declare const tanstackStartViteOptionsSchema: z.ZodDefault<z.ZodOptional<
|
|
|
92
92
|
environmentName?: string | undefined;
|
|
93
93
|
}>>;
|
|
94
94
|
}, "strip", z.ZodTypeAny, {
|
|
95
|
-
hmr?: {
|
|
96
|
-
hotExpression?: string | undefined;
|
|
97
|
-
} | undefined;
|
|
98
95
|
vite?: {
|
|
99
96
|
environmentName?: string | undefined;
|
|
100
97
|
} | undefined;
|
|
101
|
-
}, {
|
|
102
98
|
hmr?: {
|
|
103
|
-
|
|
99
|
+
style?: "vite" | "webpack" | undefined;
|
|
104
100
|
} | undefined;
|
|
101
|
+
}, {
|
|
105
102
|
vite?: {
|
|
106
103
|
environmentName?: string | undefined;
|
|
107
104
|
} | undefined;
|
|
105
|
+
hmr?: {
|
|
106
|
+
style?: "vite" | "webpack" | undefined;
|
|
107
|
+
} | undefined;
|
|
108
108
|
}>>>;
|
|
109
109
|
}, "strip", z.ZodTypeAny, {
|
|
110
110
|
virtualRouteConfig?: string | import('@tanstack/virtual-file-routes').VirtualRootRoute | undefined;
|
|
@@ -143,12 +143,12 @@ export declare const tanstackStartViteOptionsSchema: z.ZodDefault<z.ZodOptional<
|
|
|
143
143
|
enableRouteGeneration?: boolean | undefined;
|
|
144
144
|
codeSplittingOptions?: import('@tanstack/router-plugin').CodeSplittingOptions | undefined;
|
|
145
145
|
plugin?: {
|
|
146
|
-
hmr?: {
|
|
147
|
-
hotExpression?: string | undefined;
|
|
148
|
-
} | undefined;
|
|
149
146
|
vite?: {
|
|
150
147
|
environmentName?: string | undefined;
|
|
151
148
|
} | undefined;
|
|
149
|
+
hmr?: {
|
|
150
|
+
style?: "vite" | "webpack" | undefined;
|
|
151
|
+
} | undefined;
|
|
152
152
|
} | undefined;
|
|
153
153
|
}, {
|
|
154
154
|
virtualRouteConfig?: string | import('@tanstack/virtual-file-routes').VirtualRootRoute | undefined;
|
|
@@ -187,12 +187,12 @@ export declare const tanstackStartViteOptionsSchema: z.ZodDefault<z.ZodOptional<
|
|
|
187
187
|
enableRouteGeneration?: boolean | undefined;
|
|
188
188
|
codeSplittingOptions?: import('@tanstack/router-plugin').CodeSplittingOptions | undefined;
|
|
189
189
|
plugin?: {
|
|
190
|
-
hmr?: {
|
|
191
|
-
hotExpression?: string | undefined;
|
|
192
|
-
} | undefined;
|
|
193
190
|
vite?: {
|
|
194
191
|
environmentName?: string | undefined;
|
|
195
192
|
} | undefined;
|
|
193
|
+
hmr?: {
|
|
194
|
+
style?: "vite" | "webpack" | undefined;
|
|
195
|
+
} | undefined;
|
|
196
196
|
} | undefined;
|
|
197
197
|
}>>>>>>;
|
|
198
198
|
client: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
@@ -2438,12 +2438,12 @@ export declare const tanstackStartViteOptionsSchema: z.ZodDefault<z.ZodOptional<
|
|
|
2438
2438
|
enableRouteGeneration?: boolean | undefined;
|
|
2439
2439
|
codeSplittingOptions?: import('@tanstack/router-plugin').CodeSplittingOptions | undefined;
|
|
2440
2440
|
plugin?: {
|
|
2441
|
-
hmr?: {
|
|
2442
|
-
hotExpression?: string | undefined;
|
|
2443
|
-
} | undefined;
|
|
2444
2441
|
vite?: {
|
|
2445
2442
|
environmentName?: string | undefined;
|
|
2446
2443
|
} | undefined;
|
|
2444
|
+
hmr?: {
|
|
2445
|
+
style?: "vite" | "webpack" | undefined;
|
|
2446
|
+
} | undefined;
|
|
2447
2447
|
} | undefined;
|
|
2448
2448
|
};
|
|
2449
2449
|
serverFns: {
|
|
@@ -2766,12 +2766,12 @@ export declare const tanstackStartViteOptionsSchema: z.ZodDefault<z.ZodOptional<
|
|
|
2766
2766
|
enableRouteGeneration?: boolean | undefined;
|
|
2767
2767
|
codeSplittingOptions?: import('@tanstack/router-plugin').CodeSplittingOptions | undefined;
|
|
2768
2768
|
plugin?: {
|
|
2769
|
-
hmr?: {
|
|
2770
|
-
hotExpression?: string | undefined;
|
|
2771
|
-
} | undefined;
|
|
2772
2769
|
vite?: {
|
|
2773
2770
|
environmentName?: string | undefined;
|
|
2774
2771
|
} | undefined;
|
|
2772
|
+
hmr?: {
|
|
2773
|
+
style?: "vite" | "webpack" | undefined;
|
|
2774
|
+
} | undefined;
|
|
2775
2775
|
} | undefined;
|
|
2776
2776
|
}) | undefined;
|
|
2777
2777
|
serverFns?: {
|
|
@@ -3068,12 +3068,12 @@ export declare function parseStartConfig(opts: z.input<typeof tanstackStartViteO
|
|
|
3068
3068
|
enableRouteGeneration?: boolean | undefined;
|
|
3069
3069
|
codeSplittingOptions?: import('@tanstack/router-plugin').CodeSplittingOptions | undefined;
|
|
3070
3070
|
plugin?: {
|
|
3071
|
-
hmr?: {
|
|
3072
|
-
hotExpression?: string | undefined;
|
|
3073
|
-
} | undefined;
|
|
3074
3071
|
vite?: {
|
|
3075
3072
|
environmentName?: string | undefined;
|
|
3076
3073
|
} | undefined;
|
|
3074
|
+
hmr?: {
|
|
3075
|
+
style?: "vite" | "webpack" | undefined;
|
|
3076
|
+
} | undefined;
|
|
3077
3077
|
} | undefined;
|
|
3078
3078
|
virtualRouteConfig?: string | import('@tanstack/virtual-file-routes').VirtualRootRoute | undefined;
|
|
3079
3079
|
routeFilePrefix?: string | undefined;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//#region src/vite/start-compiler-plugin/hot-update.ts
|
|
2
|
+
function mergeHotUpdateModules(currentModules, additionalModules) {
|
|
3
|
+
if (additionalModules.length === 0) return;
|
|
4
|
+
const mergedModules = currentModules.slice();
|
|
5
|
+
const seenModules = new Set(currentModules);
|
|
6
|
+
for (const mod of additionalModules) {
|
|
7
|
+
if (seenModules.has(mod)) continue;
|
|
8
|
+
seenModules.add(mod);
|
|
9
|
+
mergedModules.push(mod);
|
|
10
|
+
}
|
|
11
|
+
return mergedModules;
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
export { mergeHotUpdateModules };
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=hot-update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hot-update.js","names":[],"sources":["../../../../src/vite/start-compiler-plugin/hot-update.ts"],"sourcesContent":["import type { EnvironmentModuleNode } from 'vite'\n\nexport function mergeHotUpdateModules(\n currentModules: Array<EnvironmentModuleNode>,\n additionalModules: Array<EnvironmentModuleNode>,\n): Array<EnvironmentModuleNode> | undefined {\n if (additionalModules.length === 0) {\n return undefined\n }\n\n const mergedModules = currentModules.slice()\n const seenModules = new Set(currentModules)\n\n for (const mod of additionalModules) {\n if (seenModules.has(mod)) {\n continue\n }\n\n seenModules.add(mod)\n mergedModules.push(mod)\n }\n\n return mergedModules\n}\n"],"mappings":";AAEA,SAAgB,sBACd,gBACA,mBAC0C;AAC1C,KAAI,kBAAkB,WAAW,EAC/B;CAGF,MAAM,gBAAgB,eAAe,OAAO;CAC5C,MAAM,cAAc,IAAI,IAAI,eAAe;AAE3C,MAAK,MAAM,OAAO,mBAAmB;AACnC,MAAI,YAAY,IAAI,IAAI,CACtB;AAGF,cAAY,IAAI,IAAI;AACpB,gBAAc,KAAK,IAAI;;AAGzB,QAAO"}
|