@tanstack/start-plugin-core 1.167.18 → 1.167.20
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/config-context.d.ts +26 -0
- package/dist/esm/config-context.js +81 -0
- package/dist/esm/config-context.js.map +1 -0
- package/dist/esm/constants.d.ts +6 -1
- package/dist/esm/constants.js +3 -2
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/import-protection-plugin/extensionlessAbsoluteIdResolver.js +1 -1
- package/dist/esm/import-protection-plugin/plugin.js +1 -1
- package/dist/esm/import-protection-plugin/virtualModules.js +1 -1
- package/dist/esm/index.d.ts +5 -3
- package/dist/esm/index.js +3 -4
- package/dist/esm/planning.d.ts +40 -0
- package/dist/esm/planning.js +107 -0
- package/dist/esm/planning.js.map +1 -0
- package/dist/esm/schema.d.ts +3093 -44
- package/dist/esm/schema.js +5 -5
- package/dist/esm/schema.js.map +1 -1
- package/dist/esm/serialization-adapters-module.d.ts +17 -0
- package/dist/esm/serialization-adapters-module.js +39 -0
- package/dist/esm/serialization-adapters-module.js.map +1 -0
- package/dist/esm/{start-compiler-plugin → start-compiler}/compiler.d.ts +2 -3
- package/dist/esm/{start-compiler-plugin → start-compiler}/compiler.js +17 -16
- package/dist/esm/start-compiler/compiler.js.map +1 -0
- package/dist/esm/start-compiler/config.d.ts +4 -0
- package/dist/esm/start-compiler/config.js +54 -0
- package/dist/esm/start-compiler/config.js.map +1 -0
- package/dist/esm/{start-compiler-plugin → start-compiler}/handleClientOnlyJSX.js +1 -1
- package/dist/esm/start-compiler/handleClientOnlyJSX.js.map +1 -0
- package/dist/esm/{start-compiler-plugin → start-compiler}/handleCreateIsomorphicFn.js +1 -1
- package/dist/esm/start-compiler/handleCreateIsomorphicFn.js.map +1 -0
- package/dist/esm/{start-compiler-plugin → start-compiler}/handleCreateMiddleware.js +1 -1
- package/dist/esm/start-compiler/handleCreateMiddleware.js.map +1 -0
- package/dist/esm/{start-compiler-plugin → start-compiler}/handleCreateServerFn.js +6 -17
- package/dist/esm/start-compiler/handleCreateServerFn.js.map +1 -0
- package/dist/esm/{start-compiler-plugin → start-compiler}/handleEnvOnly.js +1 -1
- package/dist/esm/start-compiler/handleEnvOnly.js.map +1 -0
- package/dist/esm/start-compiler/host.d.ts +20 -0
- package/dist/esm/start-compiler/host.js +38 -0
- package/dist/esm/start-compiler/host.js.map +1 -0
- package/dist/esm/start-compiler/load-module.d.ts +14 -0
- package/dist/esm/start-compiler/load-module.js +18 -0
- package/dist/esm/start-compiler/load-module.js.map +1 -0
- package/dist/esm/start-compiler/server-fn-resolver-module.d.ts +8 -0
- package/dist/esm/start-compiler/server-fn-resolver-module.js +77 -0
- package/dist/esm/start-compiler/server-fn-resolver-module.js.map +1 -0
- package/dist/esm/{start-compiler-plugin → start-compiler}/types.d.ts +4 -0
- package/dist/esm/{start-compiler-plugin → start-compiler}/utils.js +1 -1
- package/dist/esm/start-compiler/utils.js.map +1 -0
- package/dist/esm/start-manifest-plugin/manifestBuilder.d.ts +16 -16
- package/dist/esm/start-manifest-plugin/manifestBuilder.js +14 -45
- package/dist/esm/start-manifest-plugin/manifestBuilder.js.map +1 -1
- package/dist/esm/start-router-plugin/route-tree-footer.d.ts +6 -0
- package/dist/esm/start-router-plugin/route-tree-footer.js +44 -0
- package/dist/esm/start-router-plugin/route-tree-footer.js.map +1 -0
- package/dist/esm/types.d.ts +44 -10
- package/dist/esm/{dev-server-plugin → vite/dev-server-plugin}/dev-styles.js +1 -1
- package/dist/esm/vite/dev-server-plugin/dev-styles.js.map +1 -0
- package/dist/esm/{dev-server-plugin → vite/dev-server-plugin}/extract-html-scripts.js +1 -1
- package/dist/esm/vite/dev-server-plugin/extract-html-scripts.js.map +1 -0
- package/dist/esm/vite/dev-server-plugin/plugin.d.ts +7 -0
- package/dist/esm/{dev-server-plugin → vite/dev-server-plugin}/plugin.js +5 -6
- package/dist/esm/vite/dev-server-plugin/plugin.js.map +1 -0
- package/dist/esm/{load-env-plugin → vite/load-env-plugin}/plugin.js +1 -1
- package/dist/esm/vite/load-env-plugin/plugin.js.map +1 -0
- package/dist/esm/{output-directory.js → vite/output-directory.js} +2 -2
- package/dist/esm/vite/output-directory.js.map +1 -0
- package/dist/esm/vite/planning.d.ts +105 -0
- package/dist/esm/vite/planning.js +116 -0
- package/dist/esm/vite/planning.js.map +1 -0
- package/dist/esm/vite/plugin.d.ts +4 -0
- package/dist/esm/vite/plugin.js +169 -0
- package/dist/esm/vite/plugin.js.map +1 -0
- package/dist/esm/vite/plugins.d.ts +17 -0
- package/dist/esm/vite/plugins.js +50 -0
- package/dist/esm/vite/plugins.js.map +1 -0
- package/dist/esm/{post-server-build.d.ts → vite/post-server-build.d.ts} +1 -1
- package/dist/esm/{post-server-build.js → vite/post-server-build.js} +4 -4
- package/dist/esm/vite/post-server-build.js.map +1 -0
- package/dist/esm/{prerender.d.ts → vite/prerender.d.ts} +1 -1
- package/dist/esm/{prerender.js → vite/prerender.js} +5 -10
- package/dist/esm/vite/prerender.js.map +1 -0
- package/dist/esm/{preview-server-plugin → vite/preview-server-plugin}/plugin.js +4 -4
- package/dist/esm/vite/preview-server-plugin/plugin.js.map +1 -0
- package/dist/esm/vite/schema.d.ts +3373 -0
- package/dist/esm/vite/schema.js +12 -0
- package/dist/esm/vite/schema.js.map +1 -0
- package/dist/esm/vite/serialization-adapters-plugin.d.ts +5 -0
- package/dist/esm/vite/serialization-adapters-plugin.js +42 -0
- package/dist/esm/vite/serialization-adapters-plugin.js.map +1 -0
- package/dist/esm/vite/start-compiler-plugin/module-specifier.d.ts +3 -0
- package/dist/esm/vite/start-compiler-plugin/module-specifier.js +19 -0
- package/dist/esm/vite/start-compiler-plugin/module-specifier.js.map +1 -0
- package/dist/esm/{start-compiler-plugin → vite/start-compiler-plugin}/plugin.d.ts +4 -3
- package/dist/esm/vite/start-compiler-plugin/plugin.js +202 -0
- package/dist/esm/vite/start-compiler-plugin/plugin.js.map +1 -0
- package/dist/esm/vite/start-manifest-plugin/normalized-client-build.d.ts +6 -0
- package/dist/esm/vite/start-manifest-plugin/normalized-client-build.js +81 -0
- package/dist/esm/vite/start-manifest-plugin/normalized-client-build.js.map +1 -0
- package/dist/esm/vite/start-manifest-plugin/plugin.d.ts +6 -0
- package/dist/esm/{start-manifest-plugin → vite/start-manifest-plugin}/plugin.js +14 -9
- package/dist/esm/vite/start-manifest-plugin/plugin.js.map +1 -0
- package/dist/esm/{start-router-plugin → vite/start-router-plugin}/plugin.d.ts +3 -2
- package/dist/esm/{start-router-plugin → vite/start-router-plugin}/plugin.js +14 -37
- package/dist/esm/vite/start-router-plugin/plugin.js.map +1 -0
- package/dist/esm/vite/types.d.ts +15 -0
- package/package.json +36 -25
- package/src/config-context.ts +138 -0
- package/src/constants.ts +7 -3
- package/src/index.ts +5 -5
- package/src/planning.ts +151 -0
- package/src/schema.ts +93 -93
- package/src/serialization-adapters-module.ts +82 -0
- package/src/{start-compiler-plugin → start-compiler}/compiler.ts +67 -61
- package/src/start-compiler/config.ts +73 -0
- package/src/{start-compiler-plugin → start-compiler}/handleCreateServerFn.ts +14 -41
- package/src/start-compiler/host.ts +80 -0
- package/src/start-compiler/load-module.ts +31 -0
- package/src/start-compiler/server-fn-resolver-module.ts +129 -0
- package/src/{start-compiler-plugin → start-compiler}/types.ts +5 -0
- package/src/start-manifest-plugin/manifestBuilder.ts +65 -107
- package/src/start-router-plugin/route-tree-footer.ts +99 -0
- package/src/types.ts +53 -10
- package/src/{dev-server-plugin → vite/dev-server-plugin}/plugin.ts +7 -6
- package/src/{output-directory.ts → vite/output-directory.ts} +2 -2
- package/src/vite/planning.ts +234 -0
- package/src/vite/plugin.ts +276 -0
- package/src/vite/plugins.ts +81 -0
- package/src/{post-server-build.ts → vite/post-server-build.ts} +4 -6
- package/src/{prerender.ts → vite/prerender.ts} +21 -46
- package/src/{preview-server-plugin → vite/preview-server-plugin}/plugin.ts +2 -2
- package/src/vite/schema.ts +30 -0
- package/src/vite/serialization-adapters-plugin.ts +69 -0
- package/src/vite/start-compiler-plugin/module-specifier.ts +31 -0
- package/src/vite/start-compiler-plugin/plugin.ts +345 -0
- package/src/vite/start-manifest-plugin/normalized-client-build.ts +131 -0
- package/src/{start-manifest-plugin → vite/start-manifest-plugin}/plugin.ts +21 -13
- package/src/{start-router-plugin → vite/start-router-plugin}/plugin.ts +14 -80
- package/src/vite/types.ts +18 -0
- package/LICENSE +0 -21
- package/dist/esm/dev-server-plugin/dev-styles.js.map +0 -1
- package/dist/esm/dev-server-plugin/extract-html-scripts.js.map +0 -1
- package/dist/esm/dev-server-plugin/plugin.d.ts +0 -6
- package/dist/esm/dev-server-plugin/plugin.js.map +0 -1
- package/dist/esm/load-env-plugin/plugin.js.map +0 -1
- package/dist/esm/output-directory.js.map +0 -1
- package/dist/esm/plugin.d.ts +0 -4
- package/dist/esm/plugin.js +0 -301
- package/dist/esm/plugin.js.map +0 -1
- package/dist/esm/post-server-build.js.map +0 -1
- package/dist/esm/prerender.js.map +0 -1
- package/dist/esm/preview-server-plugin/plugin.js.map +0 -1
- package/dist/esm/start-compiler-plugin/compiler.js.map +0 -1
- package/dist/esm/start-compiler-plugin/handleClientOnlyJSX.js.map +0 -1
- package/dist/esm/start-compiler-plugin/handleCreateIsomorphicFn.js.map +0 -1
- package/dist/esm/start-compiler-plugin/handleCreateMiddleware.js.map +0 -1
- package/dist/esm/start-compiler-plugin/handleCreateServerFn.js.map +0 -1
- package/dist/esm/start-compiler-plugin/handleEnvOnly.js.map +0 -1
- package/dist/esm/start-compiler-plugin/plugin.js +0 -297
- package/dist/esm/start-compiler-plugin/plugin.js.map +0 -1
- package/dist/esm/start-compiler-plugin/utils.js.map +0 -1
- package/dist/esm/start-manifest-plugin/plugin.d.ts +0 -6
- package/dist/esm/start-manifest-plugin/plugin.js.map +0 -1
- package/dist/esm/start-router-plugin/plugin.js.map +0 -1
- package/src/plugin.ts +0 -471
- package/src/start-compiler-plugin/plugin.ts +0 -478
- /package/dist/esm/{start-compiler-plugin → start-compiler}/handleClientOnlyJSX.d.ts +0 -0
- /package/dist/esm/{start-compiler-plugin → start-compiler}/handleCreateIsomorphicFn.d.ts +0 -0
- /package/dist/esm/{start-compiler-plugin → start-compiler}/handleCreateMiddleware.d.ts +0 -0
- /package/dist/esm/{start-compiler-plugin → start-compiler}/handleCreateServerFn.d.ts +0 -0
- /package/dist/esm/{start-compiler-plugin → start-compiler}/handleEnvOnly.d.ts +0 -0
- /package/dist/esm/{start-compiler-plugin → start-compiler}/utils.d.ts +0 -0
- /package/dist/esm/{dev-server-plugin → vite/dev-server-plugin}/dev-styles.d.ts +0 -0
- /package/dist/esm/{dev-server-plugin → vite/dev-server-plugin}/extract-html-scripts.d.ts +0 -0
- /package/dist/esm/{load-env-plugin → vite/load-env-plugin}/plugin.d.ts +0 -0
- /package/dist/esm/{output-directory.d.ts → vite/output-directory.d.ts} +0 -0
- /package/dist/esm/{preview-server-plugin → vite/preview-server-plugin}/plugin.d.ts +0 -0
- /package/src/{start-compiler-plugin → start-compiler}/handleClientOnlyJSX.ts +0 -0
- /package/src/{start-compiler-plugin → start-compiler}/handleCreateIsomorphicFn.ts +0 -0
- /package/src/{start-compiler-plugin → start-compiler}/handleCreateMiddleware.ts +0 -0
- /package/src/{start-compiler-plugin → start-compiler}/handleEnvOnly.ts +0 -0
- /package/src/{start-compiler-plugin → start-compiler}/utils.ts +0 -0
- /package/src/{dev-server-plugin → vite/dev-server-plugin}/dev-styles.ts +0 -0
- /package/src/{dev-server-plugin → vite/dev-server-plugin}/extract-html-scripts.ts +0 -0
- /package/src/{load-env-plugin → vite/load-env-plugin}/plugin.ts +0 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { START_ENVIRONMENT_NAMES } from "../constants.js";
|
|
2
|
+
import { createServerFnBasePath, normalizePublicBase, shouldRewriteDevBasepath } from "../planning.js";
|
|
3
|
+
import { applyResolvedBaseAndOutput, applyResolvedRouterBasepath, createStartConfigContext } from "../config-context.js";
|
|
4
|
+
import { importProtectionPlugin } from "../import-protection-plugin/plugin.js";
|
|
5
|
+
import { startCompilerPlugin } from "./start-compiler-plugin/plugin.js";
|
|
6
|
+
import { loadEnvPlugin } from "./load-env-plugin/plugin.js";
|
|
7
|
+
import { buildStartViteEnvironments, createViteConfigPlan, createViteDefineConfig, createViteResolvedEntryAliases } from "./planning.js";
|
|
8
|
+
import { devServerPlugin } from "./dev-server-plugin/plugin.js";
|
|
9
|
+
import { getClientOutputDirectory, getServerOutputDirectory } from "./output-directory.js";
|
|
10
|
+
import { previewServerPlugin } from "./preview-server-plugin/plugin.js";
|
|
11
|
+
import { createCaptureClientBuildPlugin, createDevBaseRewritePlugin, createPostBuildPlugin } from "./plugins.js";
|
|
12
|
+
import { parseStartConfig } from "./schema.js";
|
|
13
|
+
import { startManifestPlugin } from "./start-manifest-plugin/plugin.js";
|
|
14
|
+
import { tanStackStartRouter } from "./start-router-plugin/plugin.js";
|
|
15
|
+
import { postServerBuild } from "./post-server-build.js";
|
|
16
|
+
import { serializationAdaptersPlugin } from "./serialization-adapters-plugin.js";
|
|
17
|
+
import { crawlFrameworkPkgs } from "vitefu";
|
|
18
|
+
//#region src/vite/plugin.ts
|
|
19
|
+
function tanStackStartVite(corePluginOpts, startPluginOpts) {
|
|
20
|
+
const normalizedStartPluginOpts = startPluginOpts ?? {};
|
|
21
|
+
const configContext = createStartConfigContext({
|
|
22
|
+
corePluginOpts,
|
|
23
|
+
startPluginOpts: normalizedStartPluginOpts,
|
|
24
|
+
parseConfig: parseStartConfig
|
|
25
|
+
});
|
|
26
|
+
const { getConfig, resolvedStartConfig } = configContext;
|
|
27
|
+
const serverFnProviderEnv = corePluginOpts.providerEnvironmentName;
|
|
28
|
+
const ssrIsProvider = corePluginOpts.ssrIsProvider;
|
|
29
|
+
let needsDevBaseRewrite = false;
|
|
30
|
+
const capturedClientBuild = {};
|
|
31
|
+
function getClientBuild(envName) {
|
|
32
|
+
return capturedClientBuild[envName];
|
|
33
|
+
}
|
|
34
|
+
const environments = [{
|
|
35
|
+
name: START_ENVIRONMENT_NAMES.client,
|
|
36
|
+
type: "client"
|
|
37
|
+
}, {
|
|
38
|
+
name: START_ENVIRONMENT_NAMES.server,
|
|
39
|
+
type: "server",
|
|
40
|
+
getServerFnById: corePluginOpts.ssrResolverStrategy.type === "vite-rsc-forward" ? createViteRscForwarder(corePluginOpts.ssrResolverStrategy) : void 0
|
|
41
|
+
}];
|
|
42
|
+
if (serverFnProviderEnv !== START_ENVIRONMENT_NAMES.server && !environments.find((e) => e.name === serverFnProviderEnv)) environments.push({
|
|
43
|
+
name: serverFnProviderEnv,
|
|
44
|
+
type: "server"
|
|
45
|
+
});
|
|
46
|
+
return [
|
|
47
|
+
{
|
|
48
|
+
name: "tanstack-start-core:config",
|
|
49
|
+
enforce: "pre",
|
|
50
|
+
async config(viteConfig, { command }) {
|
|
51
|
+
const publicBase = normalizePublicBase(viteConfig.base);
|
|
52
|
+
applyResolvedBaseAndOutput({
|
|
53
|
+
resolvedStartConfig,
|
|
54
|
+
root: viteConfig.root || process.cwd(),
|
|
55
|
+
publicBase,
|
|
56
|
+
clientOutputDirectory: getClientOutputDirectory(viteConfig),
|
|
57
|
+
serverOutputDirectory: getServerOutputDirectory(viteConfig)
|
|
58
|
+
});
|
|
59
|
+
const { startConfig } = getConfig();
|
|
60
|
+
const routerBasepath = applyResolvedRouterBasepath({
|
|
61
|
+
resolvedStartConfig,
|
|
62
|
+
startConfig
|
|
63
|
+
});
|
|
64
|
+
if (shouldRewriteDevBasepath({
|
|
65
|
+
command,
|
|
66
|
+
middlewareMode: Boolean(viteConfig.server?.middlewareMode),
|
|
67
|
+
routerBasepath,
|
|
68
|
+
publicBase: resolvedStartConfig.basePaths.publicBase
|
|
69
|
+
})) needsDevBaseRewrite = true;
|
|
70
|
+
const TSS_SERVER_FN_BASE = createServerFnBasePath({
|
|
71
|
+
routerBasepath,
|
|
72
|
+
serverFnBase: startConfig.serverFns.base
|
|
73
|
+
});
|
|
74
|
+
const entryAliases = createViteResolvedEntryAliases({ entryPaths: configContext.resolveEntries().entryPaths });
|
|
75
|
+
const startPackageName = `@tanstack/${corePluginOpts.framework}-start`;
|
|
76
|
+
const crawlFrameworkPkgsResult = await crawlFrameworkPkgs({
|
|
77
|
+
root: process.cwd(),
|
|
78
|
+
isBuild: command === "build",
|
|
79
|
+
isFrameworkPkgByJson(pkgJson) {
|
|
80
|
+
const peerDependencies = pkgJson["peerDependencies"];
|
|
81
|
+
if (peerDependencies) {
|
|
82
|
+
if (startPackageName in peerDependencies || "@tanstack/start-client-core" in peerDependencies) return true;
|
|
83
|
+
}
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
const viteConfigPlan = createViteConfigPlan({
|
|
88
|
+
viteConfig,
|
|
89
|
+
framework: corePluginOpts.framework,
|
|
90
|
+
entryAliases,
|
|
91
|
+
clientOutputDirectory: resolvedStartConfig.outputDirectories.client,
|
|
92
|
+
serverOutputDirectory: resolvedStartConfig.outputDirectories.server,
|
|
93
|
+
serverFnProviderEnv,
|
|
94
|
+
optimizeDepsExclude: crawlFrameworkPkgsResult.optimizeDeps.exclude,
|
|
95
|
+
noExternal: crawlFrameworkPkgsResult.ssr.noExternal.sort()
|
|
96
|
+
});
|
|
97
|
+
return {
|
|
98
|
+
appType: viteConfig.appType ?? "custom",
|
|
99
|
+
environments: viteConfigPlan.environments,
|
|
100
|
+
resolve: viteConfigPlan.resolve,
|
|
101
|
+
define: createViteDefineConfig({
|
|
102
|
+
command,
|
|
103
|
+
mode: viteConfig.mode,
|
|
104
|
+
serverFnBase: TSS_SERVER_FN_BASE,
|
|
105
|
+
routerBasepath,
|
|
106
|
+
spaEnabled: startConfig.spa?.enabled,
|
|
107
|
+
devSsrStylesEnabled: startConfig.dev.ssrStyles.enabled,
|
|
108
|
+
devSsrStylesBasepath: startConfig.dev.ssrStyles.basepath ?? resolvedStartConfig.basePaths.publicBase,
|
|
109
|
+
staticNodeEnv: startConfig.server.build.staticNodeEnv
|
|
110
|
+
}),
|
|
111
|
+
builder: {
|
|
112
|
+
sharedPlugins: true,
|
|
113
|
+
async buildApp(builder) {
|
|
114
|
+
await buildStartViteEnvironments({
|
|
115
|
+
builder,
|
|
116
|
+
providerEnvironmentName: serverFnProviderEnv,
|
|
117
|
+
ssrIsProvider
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
createPostBuildPlugin({
|
|
125
|
+
getConfig,
|
|
126
|
+
postServerBuild
|
|
127
|
+
}),
|
|
128
|
+
startCompilerPlugin({
|
|
129
|
+
framework: corePluginOpts.framework,
|
|
130
|
+
environments,
|
|
131
|
+
generateFunctionId: normalizedStartPluginOpts.serverFns?.generateFunctionId,
|
|
132
|
+
providerEnvName: serverFnProviderEnv
|
|
133
|
+
}),
|
|
134
|
+
importProtectionPlugin({
|
|
135
|
+
getConfig,
|
|
136
|
+
framework: corePluginOpts.framework,
|
|
137
|
+
environments,
|
|
138
|
+
providerEnvName: serverFnProviderEnv
|
|
139
|
+
}),
|
|
140
|
+
tanStackStartRouter(normalizedStartPluginOpts, getConfig, corePluginOpts),
|
|
141
|
+
loadEnvPlugin(),
|
|
142
|
+
startManifestPlugin({
|
|
143
|
+
getClientBuild: () => getClientBuild(START_ENVIRONMENT_NAMES.client),
|
|
144
|
+
getConfig
|
|
145
|
+
}),
|
|
146
|
+
createDevBaseRewritePlugin({
|
|
147
|
+
shouldRewriteDevBase: () => needsDevBaseRewrite,
|
|
148
|
+
resolvedStartConfig
|
|
149
|
+
}),
|
|
150
|
+
devServerPlugin({
|
|
151
|
+
getConfig,
|
|
152
|
+
devSsrStylesEnabled: normalizedStartPluginOpts.dev?.ssrStyles?.enabled ?? true,
|
|
153
|
+
installDevServerMiddleware: normalizedStartPluginOpts.vite?.installDevServerMiddleware
|
|
154
|
+
}),
|
|
155
|
+
previewServerPlugin(),
|
|
156
|
+
serializationAdaptersPlugin({ adapters: corePluginOpts.serializationAdapters }),
|
|
157
|
+
createCaptureClientBuildPlugin({ capturedClientBuild })
|
|
158
|
+
];
|
|
159
|
+
}
|
|
160
|
+
function createViteRscForwarder(strategy) {
|
|
161
|
+
return `export async function getServerFnById(id, access) {
|
|
162
|
+
const m = await import.meta.viteRsc.loadModule(${JSON.stringify(strategy.sourceEnvironmentName)}, ${JSON.stringify(strategy.sourceEntry)})
|
|
163
|
+
return m[${JSON.stringify(strategy.exportName)}](id, access)
|
|
164
|
+
}`;
|
|
165
|
+
}
|
|
166
|
+
//#endregion
|
|
167
|
+
export { tanStackStartVite };
|
|
168
|
+
|
|
169
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +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} 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 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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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { GetConfigFn, NormalizedClientBuild, ResolvedStartConfig } from '../types.js';
|
|
2
|
+
import { StartEnvironmentName } from '../constants.js';
|
|
3
|
+
import { PluginOption, ViteBuilder } from 'vite';
|
|
4
|
+
export declare function createPostBuildPlugin(opts: {
|
|
5
|
+
getConfig: GetConfigFn;
|
|
6
|
+
postServerBuild: (opts: {
|
|
7
|
+
startConfig: ReturnType<GetConfigFn>['startConfig'];
|
|
8
|
+
builder: ViteBuilder;
|
|
9
|
+
}) => Promise<void>;
|
|
10
|
+
}): PluginOption;
|
|
11
|
+
export declare function createDevBaseRewritePlugin(opts: {
|
|
12
|
+
shouldRewriteDevBase: () => boolean;
|
|
13
|
+
resolvedStartConfig: ResolvedStartConfig;
|
|
14
|
+
}): PluginOption;
|
|
15
|
+
export declare function createCaptureClientBuildPlugin(opts: {
|
|
16
|
+
capturedClientBuild: Partial<Record<StartEnvironmentName, NormalizedClientBuild>>;
|
|
17
|
+
}): PluginOption;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { START_ENVIRONMENT_NAMES } from "../constants.js";
|
|
2
|
+
import { normalizeViteClientBuild } from "./start-manifest-plugin/normalized-client-build.js";
|
|
3
|
+
//#region src/vite/plugins.ts
|
|
4
|
+
function createPostBuildPlugin(opts) {
|
|
5
|
+
return {
|
|
6
|
+
name: "tanstack-start-core:post-build",
|
|
7
|
+
enforce: "post",
|
|
8
|
+
buildApp: {
|
|
9
|
+
order: "post",
|
|
10
|
+
async handler(builder) {
|
|
11
|
+
const { startConfig } = opts.getConfig();
|
|
12
|
+
await opts.postServerBuild({
|
|
13
|
+
builder,
|
|
14
|
+
startConfig
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function createDevBaseRewritePlugin(opts) {
|
|
21
|
+
return {
|
|
22
|
+
name: "tanstack-start-core:dev-base-rewrite",
|
|
23
|
+
configureServer(server) {
|
|
24
|
+
if (!opts.shouldRewriteDevBase()) return;
|
|
25
|
+
const basePrefix = opts.resolvedStartConfig.basePaths.publicBase.replace(/\/$/, "");
|
|
26
|
+
server.middlewares.use((req, _res, next) => {
|
|
27
|
+
if (req.url && !req.url.startsWith(basePrefix)) req.url = basePrefix + req.url;
|
|
28
|
+
next();
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function createCaptureClientBuildPlugin(opts) {
|
|
34
|
+
return {
|
|
35
|
+
name: "tanstack-start:core:capture-bundle",
|
|
36
|
+
applyToEnvironment(environment) {
|
|
37
|
+
return environment.name === START_ENVIRONMENT_NAMES.client;
|
|
38
|
+
},
|
|
39
|
+
enforce: "post",
|
|
40
|
+
generateBundle(_options, bundle) {
|
|
41
|
+
const environment = this.environment.name;
|
|
42
|
+
if (environment !== START_ENVIRONMENT_NAMES.client) throw new Error(`Unexpected environment for client build capture: ${environment}`);
|
|
43
|
+
opts.capturedClientBuild[environment] = normalizeViteClientBuild(bundle);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//#endregion
|
|
48
|
+
export { createCaptureClientBuildPlugin, createDevBaseRewritePlugin, createPostBuildPlugin };
|
|
49
|
+
|
|
50
|
+
//# sourceMappingURL=plugins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugins.js","names":[],"sources":["../../../src/vite/plugins.ts"],"sourcesContent":["import { START_ENVIRONMENT_NAMES } from '../constants'\nimport { normalizeViteClientBuild } from './start-manifest-plugin/normalized-client-build'\nimport type {\n GetConfigFn,\n NormalizedClientBuild,\n ResolvedStartConfig,\n} from '../types'\nimport type { StartEnvironmentName } from '../constants'\nimport type { PluginOption, ViteBuilder } from 'vite'\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\nexport function createCaptureClientBuildPlugin(opts: {\n capturedClientBuild: Partial<\n Record<StartEnvironmentName, NormalizedClientBuild>\n >\n}): PluginOption {\n return {\n name: 'tanstack-start:core:capture-bundle',\n applyToEnvironment(environment) {\n return environment.name === START_ENVIRONMENT_NAMES.client\n },\n enforce: 'post',\n generateBundle(_options, bundle) {\n const environment = this.environment.name as StartEnvironmentName\n\n if (environment !== START_ENVIRONMENT_NAMES.client) {\n throw new Error(\n `Unexpected environment for client build capture: ${environment}`,\n )\n }\n\n opts.capturedClientBuild[environment] = normalizeViteClientBuild(bundle)\n },\n }\n}\n"],"mappings":";;;AAUA,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;;AAGH,SAAgB,+BAA+B,MAI9B;AACf,QAAO;EACL,MAAM;EACN,mBAAmB,aAAa;AAC9B,UAAO,YAAY,SAAS,wBAAwB;;EAEtD,SAAS;EACT,eAAe,UAAU,QAAQ;GAC/B,MAAM,cAAc,KAAK,YAAY;AAErC,OAAI,gBAAgB,wBAAwB,OAC1C,OAAM,IAAI,MACR,oDAAoD,cACrD;AAGH,QAAK,oBAAoB,eAAe,yBAAyB,OAAO;;EAE3E"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { buildSitemap } from "
|
|
1
|
+
import { getClientOutputDirectory } from "./output-directory.js";
|
|
2
|
+
import { buildSitemap } from "../build-sitemap.js";
|
|
3
3
|
import { prerender } from "./prerender.js";
|
|
4
4
|
import { HEADERS } from "@tanstack/start-server-core";
|
|
5
|
-
//#region src/post-server-build.ts
|
|
5
|
+
//#region src/vite/post-server-build.ts
|
|
6
6
|
async function postServerBuild({ builder, startConfig }) {
|
|
7
7
|
if (startConfig.prerender?.enabled !== false) startConfig.prerender = {
|
|
8
8
|
...startConfig.prerender,
|
|
@@ -33,7 +33,7 @@ async function postServerBuild({ builder, startConfig }) {
|
|
|
33
33
|
});
|
|
34
34
|
if (startConfig.sitemap?.enabled) buildSitemap({
|
|
35
35
|
startConfig,
|
|
36
|
-
publicDir: builder.
|
|
36
|
+
publicDir: getClientOutputDirectory(builder.config)
|
|
37
37
|
});
|
|
38
38
|
}
|
|
39
39
|
//#endregion
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-server-build.js","names":[],"sources":["../../../src/vite/post-server-build.ts"],"sourcesContent":["import { HEADERS } from '@tanstack/start-server-core'\nimport { buildSitemap } from '../build-sitemap'\nimport { prerender } from './prerender'\nimport { getClientOutputDirectory } from './output-directory'\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 // If the user has not set a prerender option, we need to set it to true\n // if the pages array is not empty and has sub options requiring for prerendering\n // If the user has explicitly set prerender.enabled, this should be respected\n if (startConfig.prerender?.enabled !== false) {\n startConfig.prerender = {\n ...startConfig.prerender,\n enabled:\n startConfig.prerender?.enabled ??\n startConfig.pages.some((d) =>\n typeof d === 'string' ? false : !!d.prerender?.enabled,\n ),\n }\n }\n\n // Setup the options for prerendering the SPA shell (i.e `src/routes/__root.tsx`)\n if (startConfig.spa?.enabled) {\n startConfig.prerender = {\n ...startConfig.prerender,\n enabled: true,\n }\n\n const maskUrl = new URL(startConfig.spa.maskPath, 'http://localhost')\n if (maskUrl.origin !== 'http://localhost') {\n throw new Error('spa.maskPath must be a path (no protocol/host)')\n }\n\n startConfig.pages.push({\n path: maskUrl.toString().replace('http://localhost', ''),\n prerender: {\n ...startConfig.spa.prerender,\n headers: {\n ...startConfig.spa.prerender.headers,\n [HEADERS.TSS_SHELL]: 'true',\n },\n },\n sitemap: {\n exclude: true,\n },\n })\n }\n\n // Run the prerendering process\n if (startConfig.prerender.enabled) {\n await prerender({\n startConfig,\n builder,\n })\n }\n\n // Run the sitemap build process\n if (startConfig.sitemap?.enabled) {\n buildSitemap({\n startConfig,\n publicDir: getClientOutputDirectory(builder.config),\n })\n }\n}\n"],"mappings":";;;;;AAOA,eAAsB,gBAAgB,EACpC,SACA,eAIC;AAID,KAAI,YAAY,WAAW,YAAY,MACrC,aAAY,YAAY;EACtB,GAAG,YAAY;EACf,SACE,YAAY,WAAW,WACvB,YAAY,MAAM,MAAM,MACtB,OAAO,MAAM,WAAW,QAAQ,CAAC,CAAC,EAAE,WAAW,QAChD;EACJ;AAIH,KAAI,YAAY,KAAK,SAAS;AAC5B,cAAY,YAAY;GACtB,GAAG,YAAY;GACf,SAAS;GACV;EAED,MAAM,UAAU,IAAI,IAAI,YAAY,IAAI,UAAU,mBAAmB;AACrE,MAAI,QAAQ,WAAW,mBACrB,OAAM,IAAI,MAAM,iDAAiD;AAGnE,cAAY,MAAM,KAAK;GACrB,MAAM,QAAQ,UAAU,CAAC,QAAQ,oBAAoB,GAAG;GACxD,WAAW;IACT,GAAG,YAAY,IAAI;IACnB,SAAS;KACP,GAAG,YAAY,IAAI,UAAU;MAC5B,QAAQ,YAAY;KACtB;IACF;GACD,SAAS,EACP,SAAS,MACV;GACF,CAAC;;AAIJ,KAAI,YAAY,UAAU,QACxB,OAAM,UAAU;EACd;EACA;EACD,CAAC;AAIJ,KAAI,YAAY,SAAS,QACvB,cAAa;EACX;EACA,WAAW,yBAAyB,QAAQ,OAAO;EACpD,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ViteBuilder } from 'vite';
|
|
2
|
-
import { TanStackStartOutputConfig } from '
|
|
2
|
+
import { TanStackStartOutputConfig } from '../schema.js';
|
|
3
3
|
export declare function prerender({ startConfig, builder, }: {
|
|
4
4
|
startConfig: TanStackStartOutputConfig;
|
|
5
5
|
builder: ViteBuilder;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { Queue } from "
|
|
1
|
+
import { VITE_ENVIRONMENT_NAMES } from "../constants.js";
|
|
2
|
+
import { createLogger } from "../utils.js";
|
|
3
|
+
import { Queue } from "../queue.js";
|
|
4
4
|
import path from "pathe";
|
|
5
5
|
import { joinURL, withBase, withTrailingSlash, withoutBase } from "ufo";
|
|
6
6
|
import { promises } from "node:fs";
|
|
7
7
|
import os from "node:os";
|
|
8
|
-
//#region src/prerender.ts
|
|
8
|
+
//#region src/vite/prerender.ts
|
|
9
9
|
async function prerender({ startConfig, builder }) {
|
|
10
10
|
const logger = createLogger("prerender");
|
|
11
11
|
logger.info("Prerendering pages...");
|
|
@@ -41,7 +41,7 @@ async function prerender({ startConfig, builder }) {
|
|
|
41
41
|
if (isRedirectResponse(response) && maxRedirects > 0) {
|
|
42
42
|
const location = response.headers.get("location");
|
|
43
43
|
if (location.startsWith("http://localhost") || location.startsWith("/")) return localFetch(location.replace("http://localhost", ""), options, maxRedirects - 1);
|
|
44
|
-
|
|
44
|
+
logger.warn(`Skipping redirect to external location: ${location}`);
|
|
45
45
|
}
|
|
46
46
|
return response;
|
|
47
47
|
}
|
|
@@ -160,11 +160,6 @@ function getResolvedUrl(previewServer) {
|
|
|
160
160
|
if (!baseUrl) throw new Error("No resolved URL is available from the Vite preview server");
|
|
161
161
|
return new URL(baseUrl);
|
|
162
162
|
}
|
|
163
|
-
/**
|
|
164
|
-
* Validates and normalizes prerender page paths to ensure they are relative
|
|
165
|
-
* (no protocol/host) and returns normalized Page objects with cleaned paths.
|
|
166
|
-
* Preserves unicode characters by decoding the pathname after URL validation.
|
|
167
|
-
*/
|
|
168
163
|
function validateAndNormalizePrerenderPages(pages, routerBaseUrl) {
|
|
169
164
|
return pages.map((page) => {
|
|
170
165
|
let url;
|
|
@@ -0,0 +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,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { VITE_ENVIRONMENT_NAMES } from "../../constants.js";
|
|
2
|
+
import { getBundlerOptions } from "../../utils.js";
|
|
3
3
|
import { getServerOutputDirectory } from "../output-directory.js";
|
|
4
4
|
import { basename, extname, join } from "pathe";
|
|
5
|
-
import { joinURL } from "ufo";
|
|
6
5
|
import { NodeRequest, sendNodeResponse } from "srvx/node";
|
|
7
6
|
import { pathToFileURL } from "node:url";
|
|
8
|
-
|
|
7
|
+
import { joinURL } from "ufo";
|
|
8
|
+
//#region src/vite/preview-server-plugin/plugin.ts
|
|
9
9
|
function previewServerPlugin() {
|
|
10
10
|
return {
|
|
11
11
|
name: "tanstack-start-core:preview-server",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","names":[],"sources":["../../../../src/vite/preview-server-plugin/plugin.ts"],"sourcesContent":["import { pathToFileURL } from 'node:url'\nimport { basename, extname, join } from 'pathe'\nimport { NodeRequest, sendNodeResponse } from 'srvx/node'\nimport { joinURL } from 'ufo'\nimport { VITE_ENVIRONMENT_NAMES } from '../../constants'\nimport { getServerOutputDirectory } from '../output-directory'\nimport { getBundlerOptions } from '../../utils'\nimport type { Plugin } from 'vite'\n\nexport function previewServerPlugin(): Plugin {\n return {\n name: 'tanstack-start-core:preview-server',\n configurePreviewServer: {\n // Run last so platform plugins (Cloudflare, Vercel, etc.) can register their handlers first\n order: 'post',\n handler(server) {\n // Return a function so Vite's internal middlewares (static files, etc.) handle requests first.\n // Our SSR handler only processes requests that nothing else handled.\n return () => {\n // Cache the server build to avoid re-importing on every request\n let serverBuild: any = null\n\n server.middlewares.use(async (req, res, next) => {\n try {\n // Lazy load server build on first request\n if (!serverBuild) {\n // Derive output filename from input\n const serverEnv =\n server.config.environments[VITE_ENVIRONMENT_NAMES.server]\n const serverInput =\n getBundlerOptions(serverEnv?.build)?.input ?? 'server'\n\n if (typeof serverInput !== 'string') {\n throw new Error('Invalid server input. Expected a string.')\n }\n\n // Get basename without extension and add .js\n const outputFilename = `${basename(serverInput, extname(serverInput))}.js`\n const serverOutputDir = getServerOutputDirectory(server.config)\n const serverEntryPath = join(serverOutputDir, outputFilename)\n const imported = await import(\n pathToFileURL(serverEntryPath).toString()\n )\n\n serverBuild = imported.default\n }\n\n // Prepend base path to request URL to match routing setup\n req.url = joinURL(server.config.base, req.url ?? '/')\n\n const webReq = new NodeRequest({ req, res })\n const webRes: Response = await serverBuild.fetch(webReq)\n\n if (webRes.headers.get('content-type')?.startsWith('text/html')) {\n res.setHeader('content-encoding', 'identity')\n }\n\n // Temporary workaround\n // Vite preview's compression middleware doesn't support flattened array headers that srvx sets\n // Call writeHead() before srvx to avoid corruption\n res.setHeaders(webRes.headers)\n res.writeHead(webRes.status, webRes.statusText)\n\n return sendNodeResponse(res, webRes)\n } catch (error) {\n next(error)\n }\n })\n }\n },\n },\n }\n}\n"],"mappings":";;;;;;;;AASA,SAAgB,sBAA8B;AAC5C,QAAO;EACL,MAAM;EACN,wBAAwB;GAEtB,OAAO;GACP,QAAQ,QAAQ;AAGd,iBAAa;KAEX,IAAI,cAAmB;AAEvB,YAAO,YAAY,IAAI,OAAO,KAAK,KAAK,SAAS;AAC/C,UAAI;AAEF,WAAI,CAAC,aAAa;QAEhB,MAAM,YACJ,OAAO,OAAO,aAAa,uBAAuB;QACpD,MAAM,cACJ,kBAAkB,WAAW,MAAM,EAAE,SAAS;AAEhD,YAAI,OAAO,gBAAgB,SACzB,OAAM,IAAI,MAAM,2CAA2C;QAI7D,MAAM,iBAAiB,GAAG,SAAS,aAAa,QAAQ,YAAY,CAAC,CAAC;AAOtE,uBAJiB,MAAM,OACrB,cAFsB,KADA,yBAAyB,OAAO,OAAO,EACjB,eAAe,CAE7B,CAAC,UAAU,GAGpB;;AAIzB,WAAI,MAAM,QAAQ,OAAO,OAAO,MAAM,IAAI,OAAO,IAAI;OAErD,MAAM,SAAS,IAAI,YAAY;QAAE;QAAK;QAAK,CAAC;OAC5C,MAAM,SAAmB,MAAM,YAAY,MAAM,OAAO;AAExD,WAAI,OAAO,QAAQ,IAAI,eAAe,EAAE,WAAW,YAAY,CAC7D,KAAI,UAAU,oBAAoB,WAAW;AAM/C,WAAI,WAAW,OAAO,QAAQ;AAC9B,WAAI,UAAU,OAAO,QAAQ,OAAO,WAAW;AAE/C,cAAO,iBAAiB,KAAK,OAAO;eAC7B,OAAO;AACd,YAAK,MAAM;;OAEb;;;GAGP;EACF"}
|