@tanstack/start-plugin-core 1.130.3 → 1.130.5
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/cjs/dev-server-plugin/plugin.cjs +11 -11
- package/dist/cjs/dev-server-plugin/plugin.cjs.map +1 -1
- package/dist/cjs/plugin.cjs +43 -4
- package/dist/cjs/plugin.cjs.map +1 -1
- package/dist/cjs/plugin.d.cts +4 -0
- package/dist/esm/dev-server-plugin/plugin.js +11 -11
- package/dist/esm/dev-server-plugin/plugin.js.map +1 -1
- package/dist/esm/plugin.d.ts +4 -0
- package/dist/esm/plugin.js +43 -4
- package/dist/esm/plugin.js.map +1 -1
- package/package.json +6 -5
- package/src/dev-server-plugin/plugin.ts +16 -16
- package/src/plugin.ts +58 -2
|
@@ -12,12 +12,21 @@ function devServerPlugin() {
|
|
|
12
12
|
isTest = isTest ? isTest : mode === "test";
|
|
13
13
|
userConfig.appType = "custom";
|
|
14
14
|
},
|
|
15
|
-
configureServer(viteDevServer) {
|
|
15
|
+
async configureServer(viteDevServer) {
|
|
16
16
|
if (isTest) {
|
|
17
17
|
return;
|
|
18
18
|
}
|
|
19
|
-
|
|
19
|
+
const templateHtml = `<html><head></head><body></body></html>`;
|
|
20
|
+
const transformedHtml = await viteDevServer.transformIndexHtml(
|
|
21
|
+
"/",
|
|
22
|
+
templateHtml
|
|
23
|
+
);
|
|
24
|
+
const scripts = extractHtmlScripts.extractHtmlScripts(transformedHtml);
|
|
25
|
+
globalThis.TSS_INJECTED_HEAD_SCRIPTS = scripts.map((script) => script.content ?? "").join(";");
|
|
20
26
|
return () => {
|
|
27
|
+
if (viteDevServer.config.server.middlewareMode) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
21
30
|
viteDevServer.middlewares.use(async (req, res, next) => {
|
|
22
31
|
var _a;
|
|
23
32
|
if (req.originalUrl) {
|
|
@@ -31,15 +40,6 @@ function devServerPlugin() {
|
|
|
31
40
|
`Server environment ${constants.VITE_ENVIRONMENT_NAMES.server} not found`
|
|
32
41
|
);
|
|
33
42
|
}
|
|
34
|
-
if (globalThis.TSS_INJECTED_HEAD_SCRIPTS === void 0) {
|
|
35
|
-
const templateHtml = `<html><head></head><body></body></html>`;
|
|
36
|
-
const transformedHtml = await viteDevServer.transformIndexHtml(
|
|
37
|
-
req.url || "/",
|
|
38
|
-
templateHtml
|
|
39
|
-
);
|
|
40
|
-
const scripts = extractHtmlScripts.extractHtmlScripts(transformedHtml);
|
|
41
|
-
globalThis.TSS_INJECTED_HEAD_SCRIPTS = scripts.map((script) => script.content ?? "").join(";");
|
|
42
|
-
}
|
|
43
43
|
if (!vite.isRunnableDevEnvironment(serverEnv)) {
|
|
44
44
|
return next();
|
|
45
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.cjs","sources":["../../../src/dev-server-plugin/plugin.ts"],"sourcesContent":["import { createEvent, getHeader, sendWebResponse } from 'h3'\nimport { isRunnableDevEnvironment } from 'vite'\nimport { VITE_ENVIRONMENT_NAMES } from '../constants'\nimport { extractHtmlScripts } from './extract-html-scripts'\nimport type { Connect, DevEnvironment, Plugin } from 'vite'\n\n/* eslint-disable no-var */\ndeclare global {\n var TSS_INJECTED_HEAD_SCRIPTS: string | undefined\n}\n\nexport function devServerPlugin(): Plugin {\n // let config: UserConfig\n let isTest = false\n\n return {\n name: 'start-dev-ssr-plugin',\n config(userConfig, { mode }) {\n // config = userConfig\n isTest = isTest ? isTest : mode === 'test'\n // see https://vite.dev/config/shared-options.html#apptype\n // this will prevent vite from injecting middlewares that we don't want\n userConfig.appType = 'custom'\n },\n configureServer(viteDevServer) {\n if (isTest) {\n return\n }\n\n //
|
|
1
|
+
{"version":3,"file":"plugin.cjs","sources":["../../../src/dev-server-plugin/plugin.ts"],"sourcesContent":["import { createEvent, getHeader, sendWebResponse } from 'h3'\nimport { isRunnableDevEnvironment } from 'vite'\nimport { VITE_ENVIRONMENT_NAMES } from '../constants'\nimport { extractHtmlScripts } from './extract-html-scripts'\nimport type { Connect, DevEnvironment, Plugin } from 'vite'\n\n/* eslint-disable no-var */\ndeclare global {\n var TSS_INJECTED_HEAD_SCRIPTS: string | undefined\n}\n\nexport function devServerPlugin(): Plugin {\n // let config: UserConfig\n let isTest = false\n\n return {\n name: 'start-dev-ssr-plugin',\n config(userConfig, { mode }) {\n // config = userConfig\n isTest = isTest ? isTest : mode === 'test'\n // see https://vite.dev/config/shared-options.html#apptype\n // this will prevent vite from injecting middlewares that we don't want\n userConfig.appType = 'custom'\n },\n async configureServer(viteDevServer) {\n if (isTest) {\n return\n }\n\n // Extract the scripts that Vite plugins would inject into the initial HTML\n const templateHtml = `<html><head></head><body></body></html>`\n const transformedHtml = await viteDevServer.transformIndexHtml(\n '/',\n templateHtml,\n )\n const scripts = extractHtmlScripts(transformedHtml)\n globalThis.TSS_INJECTED_HEAD_SCRIPTS = scripts\n .map((script) => script.content ?? '')\n .join(';')\n\n return () => {\n // do not install middleware in middlewareMode\n if (viteDevServer.config.server.middlewareMode) {\n return\n }\n viteDevServer.middlewares.use(async (req, res, next) => {\n // Create an H3Event to have it passed into the server entry\n // i.e: event => defineEventHandler(event)\n\n // fix the request URL to match the original URL\n // otherwise, the request URL will '/index.html'\n if (req.originalUrl) {\n req.url = req.originalUrl\n }\n const event = createEvent(req, res)\n\n const serverEnv = viteDevServer.environments[\n VITE_ENVIRONMENT_NAMES.server\n ] as DevEnvironment | undefined\n\n try {\n if (!serverEnv) {\n throw new Error(\n `Server environment ${VITE_ENVIRONMENT_NAMES.server} not found`,\n )\n }\n\n if (!isRunnableDevEnvironment(serverEnv)) {\n return next()\n }\n\n // Import and resolve the request by running the server entry point\n // i.e export default defineEventHandler((event) => { ... })\n const serverEntry = await serverEnv.runner.import(\n '/~start/server-entry',\n )\n const response = await serverEntry['default'](event)\n\n return sendWebResponse(event, response)\n } catch (e) {\n console.error(e)\n viteDevServer.ssrFixStacktrace(e as Error)\n\n if (\n getHeader(event, 'content-type')?.includes('application/json')\n ) {\n return sendWebResponse(\n event,\n new Response(\n JSON.stringify(\n {\n status: 500,\n error: 'Internal Server Error',\n message:\n 'An unexpected error occurred. Please try again later.',\n timestamp: new Date().toISOString(),\n },\n null,\n 2,\n ),\n {\n status: 500,\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ),\n )\n }\n\n return sendWebResponse(\n event,\n new Response(\n `\n <!DOCTYPE html>\n <html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <title>Error</title>\n <script type=\"module\">\n import { ErrorOverlay } from '/@vite/client'\n document.body.appendChild(new ErrorOverlay(${JSON.stringify(\n prepareError(req, e),\n ).replace(/</g, '\\\\u003c')}))\n </script>\n </head>\n <body>\n </body>\n </html>\n `,\n {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n },\n ),\n )\n }\n })\n }\n },\n }\n}\n\n/**\n * Formats error for SSR message in error overlay\n * @param req\n * @param error\n * @returns\n */\nfunction prepareError(req: Connect.IncomingMessage, error: unknown) {\n const e = error as Error\n return {\n message: `An error occured while server rendering ${req.url}:\\n\\n\\t${\n typeof e === 'string' ? e : e.message\n } `,\n stack: typeof e === 'string' ? '' : e.stack,\n }\n}\n"],"names":["extractHtmlScripts","createEvent","VITE_ENVIRONMENT_NAMES","isRunnableDevEnvironment","sendWebResponse","getHeader"],"mappings":";;;;;;AAWO,SAAS,kBAA0B;AAExC,MAAI,SAAS;AAEN,SAAA;AAAA,IACL,MAAM;AAAA,IACN,OAAO,YAAY,EAAE,QAAQ;AAElB,eAAA,SAAS,SAAS,SAAS;AAGpC,iBAAW,UAAU;AAAA,IACvB;AAAA,IACA,MAAM,gBAAgB,eAAe;AACnC,UAAI,QAAQ;AACV;AAAA,MAAA;AAIF,YAAM,eAAe;AACf,YAAA,kBAAkB,MAAM,cAAc;AAAA,QAC1C;AAAA,QACA;AAAA,MACF;AACM,YAAA,UAAUA,sCAAmB,eAAe;AACvC,iBAAA,4BAA4B,QACpC,IAAI,CAAC,WAAW,OAAO,WAAW,EAAE,EACpC,KAAK,GAAG;AAEX,aAAO,MAAM;AAEP,YAAA,cAAc,OAAO,OAAO,gBAAgB;AAC9C;AAAA,QAAA;AAEF,sBAAc,YAAY,IAAI,OAAO,KAAK,KAAK,SAAS;;AAMtD,cAAI,IAAI,aAAa;AACnB,gBAAI,MAAM,IAAI;AAAA,UAAA;AAEV,gBAAA,QAAQC,GAAAA,YAAY,KAAK,GAAG;AAElC,gBAAM,YAAY,cAAc,aAC9BC,UAAAA,uBAAuB,MACzB;AAEI,cAAA;AACF,gBAAI,CAAC,WAAW;AACd,oBAAM,IAAI;AAAA,gBACR,sBAAsBA,iCAAuB,MAAM;AAAA,cACrD;AAAA,YAAA;AAGE,gBAAA,CAACC,KAAAA,yBAAyB,SAAS,GAAG;AACxC,qBAAO,KAAK;AAAA,YAAA;AAKR,kBAAA,cAAc,MAAM,UAAU,OAAO;AAAA,cACzC;AAAA,YACF;AACA,kBAAM,WAAW,MAAM,YAAY,SAAS,EAAE,KAAK;AAE5C,mBAAAC,GAAA,gBAAgB,OAAO,QAAQ;AAAA,mBAC/B,GAAG;AACV,oBAAQ,MAAM,CAAC;AACf,0BAAc,iBAAiB,CAAU;AAEzC,iBACEC,QAAAA,UAAU,OAAO,cAAc,MAA/BA,mBAAkC,SAAS,qBAC3C;AACO,qBAAAD,GAAA;AAAA,gBACL;AAAA,gBACA,IAAI;AAAA,kBACF,KAAK;AAAA,oBACH;AAAA,sBACE,QAAQ;AAAA,sBACR,OAAO;AAAA,sBACP,SACE;AAAA,sBACF,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,oBACpC;AAAA,oBACA;AAAA,oBACA;AAAA,kBACF;AAAA,kBACA;AAAA,oBACE,QAAQ;AAAA,oBACR,SAAS;AAAA,sBACP,gBAAgB;AAAA,oBAAA;AAAA,kBAClB;AAAA,gBACF;AAAA,cAEJ;AAAA,YAAA;AAGK,mBAAAA,GAAA;AAAA,cACL;AAAA,cACA,IAAI;AAAA,gBACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iEAQiD,KAAK;AAAA,kBAChD,aAAa,KAAK,CAAC;AAAA,gBAAA,EACnB,QAAQ,MAAM,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAO9B;AAAA,kBACE,QAAQ;AAAA,kBACR,SAAS;AAAA,oBACP,gBAAgB;AAAA,kBAAA;AAAA,gBAClB;AAAA,cACF;AAAA,YAEJ;AAAA,UAAA;AAAA,QACF,CACD;AAAA,MACH;AAAA,IAAA;AAAA,EAEJ;AACF;AAQA,SAAS,aAAa,KAA8B,OAAgB;AAClE,QAAM,IAAI;AACH,SAAA;AAAA,IACL,SAAS,2CAA2C,IAAI,GAAG;AAAA;AAAA,GACzD,OAAO,MAAM,WAAW,IAAI,EAAE,OAChC;AAAA,IACA,OAAO,OAAO,MAAM,WAAW,KAAK,EAAE;AAAA,EACxC;AACF;;"}
|
package/dist/cjs/plugin.cjs
CHANGED
|
@@ -6,6 +6,7 @@ const routerCore = require("@tanstack/router-core");
|
|
|
6
6
|
const startServerCore = require("@tanstack/start-server-core");
|
|
7
7
|
const serverFunctionsPlugin = require("@tanstack/server-functions-plugin");
|
|
8
8
|
const vite = require("vite");
|
|
9
|
+
const vitefu = require("vitefu");
|
|
9
10
|
const schema = require("./schema.cjs");
|
|
10
11
|
const plugin$5 = require("./nitro-plugin/plugin.cjs");
|
|
11
12
|
const plugin$3 = require("./start-manifest-plugin/plugin.cjs");
|
|
@@ -57,6 +58,38 @@ function TanStackStartVitePluginCore(opts, startConfig) {
|
|
|
57
58
|
await dummyNitroApp.close();
|
|
58
59
|
return nitroOutputPublicDir2;
|
|
59
60
|
})();
|
|
61
|
+
const startPackageName = `@tanstack/${opts.framework}-start`;
|
|
62
|
+
const routerPackageName = `@tanstack/${opts.framework}-router`;
|
|
63
|
+
const additionalOptimizeDeps = {
|
|
64
|
+
include: /* @__PURE__ */ new Set(),
|
|
65
|
+
exclude: /* @__PURE__ */ new Set()
|
|
66
|
+
};
|
|
67
|
+
const result = await vitefu.crawlFrameworkPkgs({
|
|
68
|
+
root: process.cwd(),
|
|
69
|
+
isBuild: command === "build",
|
|
70
|
+
isFrameworkPkgByJson(pkgJson) {
|
|
71
|
+
var _a2;
|
|
72
|
+
if ([routerPackageName, startPackageName].includes(pkgJson.name)) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
const peerDependencies = pkgJson["peerDependencies"];
|
|
76
|
+
if (peerDependencies) {
|
|
77
|
+
const internalResult = (_a2 = opts.crawlPackages) == null ? void 0 : _a2.call(opts, {
|
|
78
|
+
name: pkgJson.name,
|
|
79
|
+
peerDependencies
|
|
80
|
+
});
|
|
81
|
+
if (internalResult) {
|
|
82
|
+
if (internalResult === "exclude") {
|
|
83
|
+
additionalOptimizeDeps.exclude.add(pkgJson.name);
|
|
84
|
+
} else {
|
|
85
|
+
additionalOptimizeDeps.include.add(pkgJson.name);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return startPackageName in peerDependencies || routerPackageName in peerDependencies;
|
|
89
|
+
}
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
});
|
|
60
93
|
return {
|
|
61
94
|
base: viteAppBase,
|
|
62
95
|
environments: {
|
|
@@ -107,15 +140,21 @@ function TanStackStartVitePluginCore(opts, startConfig) {
|
|
|
107
140
|
noExternal: [
|
|
108
141
|
"@tanstack/start**",
|
|
109
142
|
`@tanstack/${opts.framework}-start**`,
|
|
110
|
-
...Object.values(startServerCore.VIRTUAL_MODULES)
|
|
143
|
+
...Object.values(startServerCore.VIRTUAL_MODULES),
|
|
144
|
+
startPackageName,
|
|
145
|
+
...result.ssr.noExternal.sort()
|
|
111
146
|
],
|
|
112
|
-
|
|
147
|
+
external: [...result.ssr.external.sort()],
|
|
148
|
+
dedupe: [startPackageName]
|
|
113
149
|
},
|
|
114
150
|
optimizeDeps: {
|
|
115
151
|
exclude: [
|
|
116
152
|
...Object.values(startServerCore.VIRTUAL_MODULES),
|
|
117
|
-
|
|
118
|
-
|
|
153
|
+
startPackageName,
|
|
154
|
+
...result.optimizeDeps.exclude.sort(),
|
|
155
|
+
...additionalOptimizeDeps.exclude
|
|
156
|
+
],
|
|
157
|
+
include: [...additionalOptimizeDeps.include]
|
|
119
158
|
},
|
|
120
159
|
/* prettier-ignore */
|
|
121
160
|
define: {
|
package/dist/cjs/plugin.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.cjs","sources":["../../src/plugin.ts"],"sourcesContent":["import path from 'node:path'\nimport { createNitro } from 'nitropack'\nimport { trimPathRight } from '@tanstack/router-core'\nimport { VIRTUAL_MODULES } from '@tanstack/start-server-core'\nimport { TanStackServerFnPluginEnv } from '@tanstack/server-functions-plugin'\nimport * as vite from 'vite'\nimport { createTanStackConfig } from './schema'\nimport { nitroPlugin } from './nitro-plugin/plugin'\nimport { startManifestPlugin } from './start-manifest-plugin/plugin'\nimport { startCompilerPlugin } from './start-compiler-plugin'\nimport {\n CLIENT_DIST_DIR,\n SSR_ENTRY_FILE,\n VITE_ENVIRONMENT_NAMES,\n} from './constants'\nimport { tanStackStartRouter } from './start-router-plugin/plugin'\nimport { loadEnvPlugin } from './load-env-plugin/plugin'\nimport { devServerPlugin } from './dev-server-plugin/plugin'\nimport { resolveVirtualEntriesPlugin } from './resolve-virtual-entries-plugin/plugin'\nimport type { createTanStackStartOptionsSchema } from './schema'\nimport type { PluginOption, Rollup } from 'vite'\nimport type { z } from 'zod'\nimport type { CompileStartFrameworkOptions } from './compilers'\n\nexport type TanStackStartInputConfig = z.input<\n ReturnType<typeof createTanStackStartOptionsSchema>\n>\n\nconst defaultConfig = createTanStackConfig()\nexport function getTanStackStartOptions(opts?: TanStackStartInputConfig) {\n return defaultConfig.parse(opts)\n}\n\nexport type TanStackStartOutputConfig = ReturnType<\n typeof getTanStackStartOptions\n>\n\nexport interface TanStackStartVitePluginCoreOptions {\n framework: CompileStartFrameworkOptions\n getVirtualServerRootHandler: (ctx: {\n routerFilepath: string\n serverEntryFilepath: string\n }) => string\n getVirtualServerEntry: (ctx: { routerFilepath: string }) => string\n getVirtualClientEntry: (ctx: { routerFilepath: string }) => string\n}\n// this needs to live outside of the TanStackStartVitePluginCore since it will be invoked multiple times by vite\nlet ssrBundle: Rollup.OutputBundle\n\nexport function TanStackStartVitePluginCore(\n opts: TanStackStartVitePluginCoreOptions,\n startConfig: TanStackStartOutputConfig,\n): Array<PluginOption> {\n return [\n tanStackStartRouter({\n ...startConfig.tsr,\n target: opts.framework,\n autoCodeSplitting: true,\n }),\n resolveVirtualEntriesPlugin(opts, startConfig),\n {\n name: 'tanstack-start-core:config-client',\n async config(viteConfig, { command }) {\n const viteAppBase = trimPathRight(viteConfig.base || '/')\n globalThis.TSS_APP_BASE = viteAppBase\n\n const nitroOutputPublicDir = await (async () => {\n // Create a dummy nitro app to get the resolved public output path\n const dummyNitroApp = await createNitro({\n preset: startConfig.target,\n compatibilityDate: '2024-12-01',\n })\n\n const nitroOutputPublicDir = dummyNitroApp.options.output.publicDir\n await dummyNitroApp.close()\n\n return nitroOutputPublicDir\n })()\n\n return {\n base: viteAppBase,\n environments: {\n [VITE_ENVIRONMENT_NAMES.client]: {\n consumer: 'client',\n build: {\n manifest: true,\n rollupOptions: {\n input: {\n main: getClientEntryPath(startConfig),\n },\n output: {\n dir: path.resolve(startConfig.root, CLIENT_DIST_DIR),\n },\n // TODO: this should be removed\n external: ['node:fs', 'node:path', 'node:os', 'node:crypto'],\n },\n },\n },\n [VITE_ENVIRONMENT_NAMES.server]: {\n consumer: 'server',\n build: {\n ssr: true,\n // we don't write to the file system as the below 'capture-output' plugin will\n // capture the output and write it to the virtual file system\n write: false,\n copyPublicDir: false,\n rollupOptions: {\n output: {\n entryFileNames: SSR_ENTRY_FILE,\n },\n plugins: [\n {\n name: 'capture-output',\n generateBundle(_options, bundle) {\n // TODO: can this hook be called more than once?\n ssrBundle = bundle\n },\n },\n ],\n },\n commonjsOptions: {\n include: [/node_modules/],\n },\n },\n },\n },\n resolve: {\n noExternal: [\n '@tanstack/start**',\n `@tanstack/${opts.framework}-start**`,\n ...Object.values(VIRTUAL_MODULES),\n ],\n dedupe: [`@tanstack/${opts.framework}-start`],\n },\n optimizeDeps: {\n exclude: [\n ...Object.values(VIRTUAL_MODULES),\n `@tanstack/${opts.framework}-start`,\n ],\n },\n /* prettier-ignore */\n define: {\n // define is an esbuild function that replaces the any instances of given keys with the given values\n // i.e: __FRAMEWORK_NAME__ can be replaced with JSON.stringify(\"TanStack Start\")\n // This is not the same as injecting environment variables.\n\n ...defineReplaceEnv('TSS_SERVER_FN_BASE', startConfig.serverFns.base),\n ...defineReplaceEnv('TSS_OUTPUT_PUBLIC_DIR', nitroOutputPublicDir),\n ...defineReplaceEnv('TSS_APP_BASE', viteAppBase),\n ...(command === 'serve' ? defineReplaceEnv('TSS_SHELL', startConfig.spa?.enabled ? 'true' : 'false') : {}),\n },\n }\n },\n },\n // N.B. TanStackStartCompilerPlugin must be before the TanStackServerFnPluginEnv\n startCompilerPlugin(opts.framework, {\n client: { envName: VITE_ENVIRONMENT_NAMES.client },\n server: { envName: VITE_ENVIRONMENT_NAMES.server },\n }),\n TanStackServerFnPluginEnv({\n // This is the ID that will be available to look up and import\n // our server function manifest and resolve its module\n manifestVirtualImportId: VIRTUAL_MODULES.serverFnManifest,\n client: {\n getRuntimeCode: () =>\n `import { createClientRpc } from '@tanstack/${opts.framework}-start/server-functions-client'`,\n replacer: (d) =>\n `createClientRpc('${d.functionId}', '${startConfig.serverFns.base}')`,\n envName: VITE_ENVIRONMENT_NAMES.client,\n },\n server: {\n getRuntimeCode: () =>\n `import { createServerRpc } from '@tanstack/${opts.framework}-start/server-functions-server'`,\n replacer: (d) =>\n `createServerRpc('${d.functionId}', '${startConfig.serverFns.base}', ${d.fn})`,\n envName: VITE_ENVIRONMENT_NAMES.server,\n },\n }),\n loadEnvPlugin(startConfig),\n startManifestPlugin({ clientEntry: getClientEntryPath(startConfig) }),\n devServerPlugin(),\n nitroPlugin(startConfig, () => ssrBundle),\n {\n name: 'tanstack-start:core:capture-client-bundle',\n applyToEnvironment(e) {\n return e.name === VITE_ENVIRONMENT_NAMES.client\n },\n enforce: 'post',\n generateBundle(_options, bundle) {\n globalThis.TSS_CLIENT_BUNDLE = bundle\n },\n },\n ]\n}\n\nfunction defineReplaceEnv<TKey extends string, TValue extends string>(\n key: TKey,\n value: TValue,\n): { [P in `process.env.${TKey}` | `import.meta.env.${TKey}`]: TValue } {\n return {\n [`process.env.${key}`]: JSON.stringify(value),\n [`import.meta.env.${key}`]: JSON.stringify(value),\n } as { [P in `process.env.${TKey}` | `import.meta.env.${TKey}`]: TValue }\n}\n\nconst getClientEntryPath = (startConfig: TanStackStartOutputConfig) => {\n // when the user specifies a custom client entry path, we need to resolve it\n // relative to the root of the project, keeping in mind that if not specified\n // it will be /~start/default-client-entry which is a virtual path\n // that is resolved by vite to the actual client entry path\n const entry = startConfig.clientEntryPath.startsWith(\n '/~start/default-client-entry',\n )\n ? startConfig.clientEntryPath\n : vite.normalizePath(\n path.join(\n '/@fs',\n path.resolve(startConfig.root, startConfig.clientEntryPath),\n ),\n )\n\n return entry\n}\n"],"names":["createTanStackConfig","tanStackStartRouter","resolveVirtualEntriesPlugin","trimPathRight","createNitro","nitroOutputPublicDir","VITE_ENVIRONMENT_NAMES","CLIENT_DIST_DIR","SSR_ENTRY_FILE","VIRTUAL_MODULES","startCompilerPlugin","TanStackServerFnPluginEnv","loadEnvPlugin","startManifestPlugin","devServerPlugin","nitroPlugin","vite"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.cjs","sources":["../../src/plugin.ts"],"sourcesContent":["import path from 'node:path'\nimport { createNitro } from 'nitropack'\nimport { trimPathRight } from '@tanstack/router-core'\nimport { VIRTUAL_MODULES } from '@tanstack/start-server-core'\nimport { TanStackServerFnPluginEnv } from '@tanstack/server-functions-plugin'\nimport * as vite from 'vite'\nimport { crawlFrameworkPkgs } from 'vitefu'\nimport { createTanStackConfig } from './schema'\nimport { nitroPlugin } from './nitro-plugin/plugin'\nimport { startManifestPlugin } from './start-manifest-plugin/plugin'\nimport { startCompilerPlugin } from './start-compiler-plugin'\nimport {\n CLIENT_DIST_DIR,\n SSR_ENTRY_FILE,\n VITE_ENVIRONMENT_NAMES,\n} from './constants'\nimport { tanStackStartRouter } from './start-router-plugin/plugin'\nimport { loadEnvPlugin } from './load-env-plugin/plugin'\nimport { devServerPlugin } from './dev-server-plugin/plugin'\nimport { resolveVirtualEntriesPlugin } from './resolve-virtual-entries-plugin/plugin'\nimport type { createTanStackStartOptionsSchema } from './schema'\nimport type { PluginOption, Rollup } from 'vite'\nimport type { z } from 'zod'\nimport type { CompileStartFrameworkOptions } from './compilers'\n\nexport type TanStackStartInputConfig = z.input<\n ReturnType<typeof createTanStackStartOptionsSchema>\n>\n\nconst defaultConfig = createTanStackConfig()\nexport function getTanStackStartOptions(opts?: TanStackStartInputConfig) {\n return defaultConfig.parse(opts)\n}\n\nexport type TanStackStartOutputConfig = ReturnType<\n typeof getTanStackStartOptions\n>\n\nexport interface TanStackStartVitePluginCoreOptions {\n framework: CompileStartFrameworkOptions\n getVirtualServerRootHandler: (ctx: {\n routerFilepath: string\n serverEntryFilepath: string\n }) => string\n getVirtualServerEntry: (ctx: { routerFilepath: string }) => string\n getVirtualClientEntry: (ctx: { routerFilepath: string }) => string\n crawlPackages?: (opts: {\n name: string\n peerDependencies: Record<string, any>\n }) => 'include' | 'exclude' | undefined\n}\n// this needs to live outside of the TanStackStartVitePluginCore since it will be invoked multiple times by vite\nlet ssrBundle: Rollup.OutputBundle\n\nexport function TanStackStartVitePluginCore(\n opts: TanStackStartVitePluginCoreOptions,\n startConfig: TanStackStartOutputConfig,\n): Array<PluginOption> {\n return [\n tanStackStartRouter({\n ...startConfig.tsr,\n target: opts.framework,\n autoCodeSplitting: true,\n }),\n resolveVirtualEntriesPlugin(opts, startConfig),\n {\n name: 'tanstack-start-core:config-client',\n async config(viteConfig, { command }) {\n const viteAppBase = trimPathRight(viteConfig.base || '/')\n globalThis.TSS_APP_BASE = viteAppBase\n\n const nitroOutputPublicDir = await (async () => {\n // Create a dummy nitro app to get the resolved public output path\n const dummyNitroApp = await createNitro({\n preset: startConfig.target,\n compatibilityDate: '2024-12-01',\n })\n\n const nitroOutputPublicDir = dummyNitroApp.options.output.publicDir\n await dummyNitroApp.close()\n\n return nitroOutputPublicDir\n })()\n\n const startPackageName = `@tanstack/${opts.framework}-start`\n const routerPackageName = `@tanstack/${opts.framework}-router`\n\n const additionalOptimizeDeps = {\n include: new Set<string>(),\n exclude: new Set<string>(),\n }\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 result = await crawlFrameworkPkgs({\n root: process.cwd(),\n isBuild: command === 'build',\n isFrameworkPkgByJson(pkgJson) {\n if ([routerPackageName, startPackageName].includes(pkgJson.name)) {\n return false\n }\n\n const peerDependencies = pkgJson['peerDependencies']\n\n if (peerDependencies) {\n const internalResult = opts.crawlPackages?.({\n name: pkgJson.name,\n peerDependencies,\n })\n if (internalResult) {\n if (internalResult === 'exclude') {\n additionalOptimizeDeps.exclude.add(pkgJson.name)\n } else {\n additionalOptimizeDeps.include.add(pkgJson.name)\n }\n }\n return (\n startPackageName in peerDependencies ||\n routerPackageName in peerDependencies\n )\n }\n return false\n },\n })\n\n return {\n base: viteAppBase,\n environments: {\n [VITE_ENVIRONMENT_NAMES.client]: {\n consumer: 'client',\n build: {\n manifest: true,\n rollupOptions: {\n input: {\n main: getClientEntryPath(startConfig),\n },\n output: {\n dir: path.resolve(startConfig.root, CLIENT_DIST_DIR),\n },\n // TODO: this should be removed\n external: ['node:fs', 'node:path', 'node:os', 'node:crypto'],\n },\n },\n },\n [VITE_ENVIRONMENT_NAMES.server]: {\n consumer: 'server',\n build: {\n ssr: true,\n // we don't write to the file system as the below 'capture-output' plugin will\n // capture the output and write it to the virtual file system\n write: false,\n copyPublicDir: false,\n rollupOptions: {\n output: {\n entryFileNames: SSR_ENTRY_FILE,\n },\n plugins: [\n {\n name: 'capture-output',\n generateBundle(_options, bundle) {\n // TODO: can this hook be called more than once?\n ssrBundle = bundle\n },\n },\n ],\n },\n commonjsOptions: {\n include: [/node_modules/],\n },\n },\n },\n },\n resolve: {\n noExternal: [\n '@tanstack/start**',\n `@tanstack/${opts.framework}-start**`,\n ...Object.values(VIRTUAL_MODULES),\n startPackageName,\n ...result.ssr.noExternal.sort(),\n ],\n external: [...result.ssr.external.sort()],\n dedupe: [startPackageName],\n },\n optimizeDeps: {\n exclude: [\n ...Object.values(VIRTUAL_MODULES),\n startPackageName,\n ...result.optimizeDeps.exclude.sort(),\n ...additionalOptimizeDeps.exclude,\n ],\n include: [...additionalOptimizeDeps.include],\n },\n /* prettier-ignore */\n define: {\n // define is an esbuild function that replaces the any instances of given keys with the given values\n // i.e: __FRAMEWORK_NAME__ can be replaced with JSON.stringify(\"TanStack Start\")\n // This is not the same as injecting environment variables.\n\n ...defineReplaceEnv('TSS_SERVER_FN_BASE', startConfig.serverFns.base),\n ...defineReplaceEnv('TSS_OUTPUT_PUBLIC_DIR', nitroOutputPublicDir),\n ...defineReplaceEnv('TSS_APP_BASE', viteAppBase),\n ...(command === 'serve' ? defineReplaceEnv('TSS_SHELL', startConfig.spa?.enabled ? 'true' : 'false') : {}),\n },\n }\n },\n },\n // N.B. TanStackStartCompilerPlugin must be before the TanStackServerFnPluginEnv\n startCompilerPlugin(opts.framework, {\n client: { envName: VITE_ENVIRONMENT_NAMES.client },\n server: { envName: VITE_ENVIRONMENT_NAMES.server },\n }),\n TanStackServerFnPluginEnv({\n // This is the ID that will be available to look up and import\n // our server function manifest and resolve its module\n manifestVirtualImportId: VIRTUAL_MODULES.serverFnManifest,\n client: {\n getRuntimeCode: () =>\n `import { createClientRpc } from '@tanstack/${opts.framework}-start/server-functions-client'`,\n replacer: (d) =>\n `createClientRpc('${d.functionId}', '${startConfig.serverFns.base}')`,\n envName: VITE_ENVIRONMENT_NAMES.client,\n },\n server: {\n getRuntimeCode: () =>\n `import { createServerRpc } from '@tanstack/${opts.framework}-start/server-functions-server'`,\n replacer: (d) =>\n `createServerRpc('${d.functionId}', '${startConfig.serverFns.base}', ${d.fn})`,\n envName: VITE_ENVIRONMENT_NAMES.server,\n },\n }),\n loadEnvPlugin(startConfig),\n startManifestPlugin({ clientEntry: getClientEntryPath(startConfig) }),\n devServerPlugin(),\n nitroPlugin(startConfig, () => ssrBundle),\n {\n name: 'tanstack-start:core:capture-client-bundle',\n applyToEnvironment(e) {\n return e.name === VITE_ENVIRONMENT_NAMES.client\n },\n enforce: 'post',\n generateBundle(_options, bundle) {\n globalThis.TSS_CLIENT_BUNDLE = bundle\n },\n },\n ]\n}\n\nfunction defineReplaceEnv<TKey extends string, TValue extends string>(\n key: TKey,\n value: TValue,\n): { [P in `process.env.${TKey}` | `import.meta.env.${TKey}`]: TValue } {\n return {\n [`process.env.${key}`]: JSON.stringify(value),\n [`import.meta.env.${key}`]: JSON.stringify(value),\n } as { [P in `process.env.${TKey}` | `import.meta.env.${TKey}`]: TValue }\n}\n\nconst getClientEntryPath = (startConfig: TanStackStartOutputConfig) => {\n // when the user specifies a custom client entry path, we need to resolve it\n // relative to the root of the project, keeping in mind that if not specified\n // it will be /~start/default-client-entry which is a virtual path\n // that is resolved by vite to the actual client entry path\n const entry = startConfig.clientEntryPath.startsWith(\n '/~start/default-client-entry',\n )\n ? startConfig.clientEntryPath\n : vite.normalizePath(\n path.join(\n '/@fs',\n path.resolve(startConfig.root, startConfig.clientEntryPath),\n ),\n )\n\n return entry\n}\n"],"names":["createTanStackConfig","tanStackStartRouter","resolveVirtualEntriesPlugin","trimPathRight","createNitro","nitroOutputPublicDir","crawlFrameworkPkgs","_a","VITE_ENVIRONMENT_NAMES","CLIENT_DIST_DIR","SSR_ENTRY_FILE","VIRTUAL_MODULES","startCompilerPlugin","TanStackServerFnPluginEnv","loadEnvPlugin","startManifestPlugin","devServerPlugin","nitroPlugin","vite"],"mappings":"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"}
|
package/dist/cjs/plugin.d.cts
CHANGED
|
@@ -291,5 +291,9 @@ export interface TanStackStartVitePluginCoreOptions {
|
|
|
291
291
|
getVirtualClientEntry: (ctx: {
|
|
292
292
|
routerFilepath: string;
|
|
293
293
|
}) => string;
|
|
294
|
+
crawlPackages?: (opts: {
|
|
295
|
+
name: string;
|
|
296
|
+
peerDependencies: Record<string, any>;
|
|
297
|
+
}) => 'include' | 'exclude' | undefined;
|
|
294
298
|
}
|
|
295
299
|
export declare function TanStackStartVitePluginCore(opts: TanStackStartVitePluginCoreOptions, startConfig: TanStackStartOutputConfig): Array<PluginOption>;
|
|
@@ -10,12 +10,21 @@ function devServerPlugin() {
|
|
|
10
10
|
isTest = isTest ? isTest : mode === "test";
|
|
11
11
|
userConfig.appType = "custom";
|
|
12
12
|
},
|
|
13
|
-
configureServer(viteDevServer) {
|
|
13
|
+
async configureServer(viteDevServer) {
|
|
14
14
|
if (isTest) {
|
|
15
15
|
return;
|
|
16
16
|
}
|
|
17
|
-
|
|
17
|
+
const templateHtml = `<html><head></head><body></body></html>`;
|
|
18
|
+
const transformedHtml = await viteDevServer.transformIndexHtml(
|
|
19
|
+
"/",
|
|
20
|
+
templateHtml
|
|
21
|
+
);
|
|
22
|
+
const scripts = extractHtmlScripts(transformedHtml);
|
|
23
|
+
globalThis.TSS_INJECTED_HEAD_SCRIPTS = scripts.map((script) => script.content ?? "").join(";");
|
|
18
24
|
return () => {
|
|
25
|
+
if (viteDevServer.config.server.middlewareMode) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
19
28
|
viteDevServer.middlewares.use(async (req, res, next) => {
|
|
20
29
|
var _a;
|
|
21
30
|
if (req.originalUrl) {
|
|
@@ -29,15 +38,6 @@ function devServerPlugin() {
|
|
|
29
38
|
`Server environment ${VITE_ENVIRONMENT_NAMES.server} not found`
|
|
30
39
|
);
|
|
31
40
|
}
|
|
32
|
-
if (globalThis.TSS_INJECTED_HEAD_SCRIPTS === void 0) {
|
|
33
|
-
const templateHtml = `<html><head></head><body></body></html>`;
|
|
34
|
-
const transformedHtml = await viteDevServer.transformIndexHtml(
|
|
35
|
-
req.url || "/",
|
|
36
|
-
templateHtml
|
|
37
|
-
);
|
|
38
|
-
const scripts = extractHtmlScripts(transformedHtml);
|
|
39
|
-
globalThis.TSS_INJECTED_HEAD_SCRIPTS = scripts.map((script) => script.content ?? "").join(";");
|
|
40
|
-
}
|
|
41
41
|
if (!isRunnableDevEnvironment(serverEnv)) {
|
|
42
42
|
return next();
|
|
43
43
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sources":["../../../src/dev-server-plugin/plugin.ts"],"sourcesContent":["import { createEvent, getHeader, sendWebResponse } from 'h3'\nimport { isRunnableDevEnvironment } from 'vite'\nimport { VITE_ENVIRONMENT_NAMES } from '../constants'\nimport { extractHtmlScripts } from './extract-html-scripts'\nimport type { Connect, DevEnvironment, Plugin } from 'vite'\n\n/* eslint-disable no-var */\ndeclare global {\n var TSS_INJECTED_HEAD_SCRIPTS: string | undefined\n}\n\nexport function devServerPlugin(): Plugin {\n // let config: UserConfig\n let isTest = false\n\n return {\n name: 'start-dev-ssr-plugin',\n config(userConfig, { mode }) {\n // config = userConfig\n isTest = isTest ? isTest : mode === 'test'\n // see https://vite.dev/config/shared-options.html#apptype\n // this will prevent vite from injecting middlewares that we don't want\n userConfig.appType = 'custom'\n },\n configureServer(viteDevServer) {\n if (isTest) {\n return\n }\n\n //
|
|
1
|
+
{"version":3,"file":"plugin.js","sources":["../../../src/dev-server-plugin/plugin.ts"],"sourcesContent":["import { createEvent, getHeader, sendWebResponse } from 'h3'\nimport { isRunnableDevEnvironment } from 'vite'\nimport { VITE_ENVIRONMENT_NAMES } from '../constants'\nimport { extractHtmlScripts } from './extract-html-scripts'\nimport type { Connect, DevEnvironment, Plugin } from 'vite'\n\n/* eslint-disable no-var */\ndeclare global {\n var TSS_INJECTED_HEAD_SCRIPTS: string | undefined\n}\n\nexport function devServerPlugin(): Plugin {\n // let config: UserConfig\n let isTest = false\n\n return {\n name: 'start-dev-ssr-plugin',\n config(userConfig, { mode }) {\n // config = userConfig\n isTest = isTest ? isTest : mode === 'test'\n // see https://vite.dev/config/shared-options.html#apptype\n // this will prevent vite from injecting middlewares that we don't want\n userConfig.appType = 'custom'\n },\n async configureServer(viteDevServer) {\n if (isTest) {\n return\n }\n\n // Extract the scripts that Vite plugins would inject into the initial HTML\n const templateHtml = `<html><head></head><body></body></html>`\n const transformedHtml = await viteDevServer.transformIndexHtml(\n '/',\n templateHtml,\n )\n const scripts = extractHtmlScripts(transformedHtml)\n globalThis.TSS_INJECTED_HEAD_SCRIPTS = scripts\n .map((script) => script.content ?? '')\n .join(';')\n\n return () => {\n // do not install middleware in middlewareMode\n if (viteDevServer.config.server.middlewareMode) {\n return\n }\n viteDevServer.middlewares.use(async (req, res, next) => {\n // Create an H3Event to have it passed into the server entry\n // i.e: event => defineEventHandler(event)\n\n // fix the request URL to match the original URL\n // otherwise, the request URL will '/index.html'\n if (req.originalUrl) {\n req.url = req.originalUrl\n }\n const event = createEvent(req, res)\n\n const serverEnv = viteDevServer.environments[\n VITE_ENVIRONMENT_NAMES.server\n ] as DevEnvironment | undefined\n\n try {\n if (!serverEnv) {\n throw new Error(\n `Server environment ${VITE_ENVIRONMENT_NAMES.server} not found`,\n )\n }\n\n if (!isRunnableDevEnvironment(serverEnv)) {\n return next()\n }\n\n // Import and resolve the request by running the server entry point\n // i.e export default defineEventHandler((event) => { ... })\n const serverEntry = await serverEnv.runner.import(\n '/~start/server-entry',\n )\n const response = await serverEntry['default'](event)\n\n return sendWebResponse(event, response)\n } catch (e) {\n console.error(e)\n viteDevServer.ssrFixStacktrace(e as Error)\n\n if (\n getHeader(event, 'content-type')?.includes('application/json')\n ) {\n return sendWebResponse(\n event,\n new Response(\n JSON.stringify(\n {\n status: 500,\n error: 'Internal Server Error',\n message:\n 'An unexpected error occurred. Please try again later.',\n timestamp: new Date().toISOString(),\n },\n null,\n 2,\n ),\n {\n status: 500,\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ),\n )\n }\n\n return sendWebResponse(\n event,\n new Response(\n `\n <!DOCTYPE html>\n <html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <title>Error</title>\n <script type=\"module\">\n import { ErrorOverlay } from '/@vite/client'\n document.body.appendChild(new ErrorOverlay(${JSON.stringify(\n prepareError(req, e),\n ).replace(/</g, '\\\\u003c')}))\n </script>\n </head>\n <body>\n </body>\n </html>\n `,\n {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n },\n ),\n )\n }\n })\n }\n },\n }\n}\n\n/**\n * Formats error for SSR message in error overlay\n * @param req\n * @param error\n * @returns\n */\nfunction prepareError(req: Connect.IncomingMessage, error: unknown) {\n const e = error as Error\n return {\n message: `An error occured while server rendering ${req.url}:\\n\\n\\t${\n typeof e === 'string' ? e : e.message\n } `,\n stack: typeof e === 'string' ? '' : e.stack,\n }\n}\n"],"names":[],"mappings":";;;;AAWO,SAAS,kBAA0B;AAExC,MAAI,SAAS;AAEN,SAAA;AAAA,IACL,MAAM;AAAA,IACN,OAAO,YAAY,EAAE,QAAQ;AAElB,eAAA,SAAS,SAAS,SAAS;AAGpC,iBAAW,UAAU;AAAA,IACvB;AAAA,IACA,MAAM,gBAAgB,eAAe;AACnC,UAAI,QAAQ;AACV;AAAA,MAAA;AAIF,YAAM,eAAe;AACf,YAAA,kBAAkB,MAAM,cAAc;AAAA,QAC1C;AAAA,QACA;AAAA,MACF;AACM,YAAA,UAAU,mBAAmB,eAAe;AACvC,iBAAA,4BAA4B,QACpC,IAAI,CAAC,WAAW,OAAO,WAAW,EAAE,EACpC,KAAK,GAAG;AAEX,aAAO,MAAM;AAEP,YAAA,cAAc,OAAO,OAAO,gBAAgB;AAC9C;AAAA,QAAA;AAEF,sBAAc,YAAY,IAAI,OAAO,KAAK,KAAK,SAAS;;AAMtD,cAAI,IAAI,aAAa;AACnB,gBAAI,MAAM,IAAI;AAAA,UAAA;AAEV,gBAAA,QAAQ,YAAY,KAAK,GAAG;AAElC,gBAAM,YAAY,cAAc,aAC9B,uBAAuB,MACzB;AAEI,cAAA;AACF,gBAAI,CAAC,WAAW;AACd,oBAAM,IAAI;AAAA,gBACR,sBAAsB,uBAAuB,MAAM;AAAA,cACrD;AAAA,YAAA;AAGE,gBAAA,CAAC,yBAAyB,SAAS,GAAG;AACxC,qBAAO,KAAK;AAAA,YAAA;AAKR,kBAAA,cAAc,MAAM,UAAU,OAAO;AAAA,cACzC;AAAA,YACF;AACA,kBAAM,WAAW,MAAM,YAAY,SAAS,EAAE,KAAK;AAE5C,mBAAA,gBAAgB,OAAO,QAAQ;AAAA,mBAC/B,GAAG;AACV,oBAAQ,MAAM,CAAC;AACf,0BAAc,iBAAiB,CAAU;AAEzC,iBACE,eAAU,OAAO,cAAc,MAA/B,mBAAkC,SAAS,qBAC3C;AACO,qBAAA;AAAA,gBACL;AAAA,gBACA,IAAI;AAAA,kBACF,KAAK;AAAA,oBACH;AAAA,sBACE,QAAQ;AAAA,sBACR,OAAO;AAAA,sBACP,SACE;AAAA,sBACF,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,oBACpC;AAAA,oBACA;AAAA,oBACA;AAAA,kBACF;AAAA,kBACA;AAAA,oBACE,QAAQ;AAAA,oBACR,SAAS;AAAA,sBACP,gBAAgB;AAAA,oBAAA;AAAA,kBAClB;AAAA,gBACF;AAAA,cAEJ;AAAA,YAAA;AAGK,mBAAA;AAAA,cACL;AAAA,cACA,IAAI;AAAA,gBACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iEAQiD,KAAK;AAAA,kBAChD,aAAa,KAAK,CAAC;AAAA,gBAAA,EACnB,QAAQ,MAAM,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAO9B;AAAA,kBACE,QAAQ;AAAA,kBACR,SAAS;AAAA,oBACP,gBAAgB;AAAA,kBAAA;AAAA,gBAClB;AAAA,cACF;AAAA,YAEJ;AAAA,UAAA;AAAA,QACF,CACD;AAAA,MACH;AAAA,IAAA;AAAA,EAEJ;AACF;AAQA,SAAS,aAAa,KAA8B,OAAgB;AAClE,QAAM,IAAI;AACH,SAAA;AAAA,IACL,SAAS,2CAA2C,IAAI,GAAG;AAAA;AAAA,GACzD,OAAO,MAAM,WAAW,IAAI,EAAE,OAChC;AAAA,IACA,OAAO,OAAO,MAAM,WAAW,KAAK,EAAE;AAAA,EACxC;AACF;"}
|
package/dist/esm/plugin.d.ts
CHANGED
|
@@ -291,5 +291,9 @@ export interface TanStackStartVitePluginCoreOptions {
|
|
|
291
291
|
getVirtualClientEntry: (ctx: {
|
|
292
292
|
routerFilepath: string;
|
|
293
293
|
}) => string;
|
|
294
|
+
crawlPackages?: (opts: {
|
|
295
|
+
name: string;
|
|
296
|
+
peerDependencies: Record<string, any>;
|
|
297
|
+
}) => 'include' | 'exclude' | undefined;
|
|
294
298
|
}
|
|
295
299
|
export declare function TanStackStartVitePluginCore(opts: TanStackStartVitePluginCoreOptions, startConfig: TanStackStartOutputConfig): Array<PluginOption>;
|
package/dist/esm/plugin.js
CHANGED
|
@@ -4,6 +4,7 @@ import { trimPathRight } from "@tanstack/router-core";
|
|
|
4
4
|
import { VIRTUAL_MODULES } from "@tanstack/start-server-core";
|
|
5
5
|
import { TanStackServerFnPluginEnv } from "@tanstack/server-functions-plugin";
|
|
6
6
|
import * as vite from "vite";
|
|
7
|
+
import { crawlFrameworkPkgs } from "vitefu";
|
|
7
8
|
import { createTanStackConfig } from "./schema.js";
|
|
8
9
|
import { nitroPlugin } from "./nitro-plugin/plugin.js";
|
|
9
10
|
import { startManifestPlugin } from "./start-manifest-plugin/plugin.js";
|
|
@@ -38,6 +39,38 @@ function TanStackStartVitePluginCore(opts, startConfig) {
|
|
|
38
39
|
await dummyNitroApp.close();
|
|
39
40
|
return nitroOutputPublicDir2;
|
|
40
41
|
})();
|
|
42
|
+
const startPackageName = `@tanstack/${opts.framework}-start`;
|
|
43
|
+
const routerPackageName = `@tanstack/${opts.framework}-router`;
|
|
44
|
+
const additionalOptimizeDeps = {
|
|
45
|
+
include: /* @__PURE__ */ new Set(),
|
|
46
|
+
exclude: /* @__PURE__ */ new Set()
|
|
47
|
+
};
|
|
48
|
+
const result = await crawlFrameworkPkgs({
|
|
49
|
+
root: process.cwd(),
|
|
50
|
+
isBuild: command === "build",
|
|
51
|
+
isFrameworkPkgByJson(pkgJson) {
|
|
52
|
+
var _a2;
|
|
53
|
+
if ([routerPackageName, startPackageName].includes(pkgJson.name)) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
const peerDependencies = pkgJson["peerDependencies"];
|
|
57
|
+
if (peerDependencies) {
|
|
58
|
+
const internalResult = (_a2 = opts.crawlPackages) == null ? void 0 : _a2.call(opts, {
|
|
59
|
+
name: pkgJson.name,
|
|
60
|
+
peerDependencies
|
|
61
|
+
});
|
|
62
|
+
if (internalResult) {
|
|
63
|
+
if (internalResult === "exclude") {
|
|
64
|
+
additionalOptimizeDeps.exclude.add(pkgJson.name);
|
|
65
|
+
} else {
|
|
66
|
+
additionalOptimizeDeps.include.add(pkgJson.name);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return startPackageName in peerDependencies || routerPackageName in peerDependencies;
|
|
70
|
+
}
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
});
|
|
41
74
|
return {
|
|
42
75
|
base: viteAppBase,
|
|
43
76
|
environments: {
|
|
@@ -88,15 +121,21 @@ function TanStackStartVitePluginCore(opts, startConfig) {
|
|
|
88
121
|
noExternal: [
|
|
89
122
|
"@tanstack/start**",
|
|
90
123
|
`@tanstack/${opts.framework}-start**`,
|
|
91
|
-
...Object.values(VIRTUAL_MODULES)
|
|
124
|
+
...Object.values(VIRTUAL_MODULES),
|
|
125
|
+
startPackageName,
|
|
126
|
+
...result.ssr.noExternal.sort()
|
|
92
127
|
],
|
|
93
|
-
|
|
128
|
+
external: [...result.ssr.external.sort()],
|
|
129
|
+
dedupe: [startPackageName]
|
|
94
130
|
},
|
|
95
131
|
optimizeDeps: {
|
|
96
132
|
exclude: [
|
|
97
133
|
...Object.values(VIRTUAL_MODULES),
|
|
98
|
-
|
|
99
|
-
|
|
134
|
+
startPackageName,
|
|
135
|
+
...result.optimizeDeps.exclude.sort(),
|
|
136
|
+
...additionalOptimizeDeps.exclude
|
|
137
|
+
],
|
|
138
|
+
include: [...additionalOptimizeDeps.include]
|
|
100
139
|
},
|
|
101
140
|
/* prettier-ignore */
|
|
102
141
|
define: {
|
package/dist/esm/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sources":["../../src/plugin.ts"],"sourcesContent":["import path from 'node:path'\nimport { createNitro } from 'nitropack'\nimport { trimPathRight } from '@tanstack/router-core'\nimport { VIRTUAL_MODULES } from '@tanstack/start-server-core'\nimport { TanStackServerFnPluginEnv } from '@tanstack/server-functions-plugin'\nimport * as vite from 'vite'\nimport { createTanStackConfig } from './schema'\nimport { nitroPlugin } from './nitro-plugin/plugin'\nimport { startManifestPlugin } from './start-manifest-plugin/plugin'\nimport { startCompilerPlugin } from './start-compiler-plugin'\nimport {\n CLIENT_DIST_DIR,\n SSR_ENTRY_FILE,\n VITE_ENVIRONMENT_NAMES,\n} from './constants'\nimport { tanStackStartRouter } from './start-router-plugin/plugin'\nimport { loadEnvPlugin } from './load-env-plugin/plugin'\nimport { devServerPlugin } from './dev-server-plugin/plugin'\nimport { resolveVirtualEntriesPlugin } from './resolve-virtual-entries-plugin/plugin'\nimport type { createTanStackStartOptionsSchema } from './schema'\nimport type { PluginOption, Rollup } from 'vite'\nimport type { z } from 'zod'\nimport type { CompileStartFrameworkOptions } from './compilers'\n\nexport type TanStackStartInputConfig = z.input<\n ReturnType<typeof createTanStackStartOptionsSchema>\n>\n\nconst defaultConfig = createTanStackConfig()\nexport function getTanStackStartOptions(opts?: TanStackStartInputConfig) {\n return defaultConfig.parse(opts)\n}\n\nexport type TanStackStartOutputConfig = ReturnType<\n typeof getTanStackStartOptions\n>\n\nexport interface TanStackStartVitePluginCoreOptions {\n framework: CompileStartFrameworkOptions\n getVirtualServerRootHandler: (ctx: {\n routerFilepath: string\n serverEntryFilepath: string\n }) => string\n getVirtualServerEntry: (ctx: { routerFilepath: string }) => string\n getVirtualClientEntry: (ctx: { routerFilepath: string }) => string\n}\n// this needs to live outside of the TanStackStartVitePluginCore since it will be invoked multiple times by vite\nlet ssrBundle: Rollup.OutputBundle\n\nexport function TanStackStartVitePluginCore(\n opts: TanStackStartVitePluginCoreOptions,\n startConfig: TanStackStartOutputConfig,\n): Array<PluginOption> {\n return [\n tanStackStartRouter({\n ...startConfig.tsr,\n target: opts.framework,\n autoCodeSplitting: true,\n }),\n resolveVirtualEntriesPlugin(opts, startConfig),\n {\n name: 'tanstack-start-core:config-client',\n async config(viteConfig, { command }) {\n const viteAppBase = trimPathRight(viteConfig.base || '/')\n globalThis.TSS_APP_BASE = viteAppBase\n\n const nitroOutputPublicDir = await (async () => {\n // Create a dummy nitro app to get the resolved public output path\n const dummyNitroApp = await createNitro({\n preset: startConfig.target,\n compatibilityDate: '2024-12-01',\n })\n\n const nitroOutputPublicDir = dummyNitroApp.options.output.publicDir\n await dummyNitroApp.close()\n\n return nitroOutputPublicDir\n })()\n\n return {\n base: viteAppBase,\n environments: {\n [VITE_ENVIRONMENT_NAMES.client]: {\n consumer: 'client',\n build: {\n manifest: true,\n rollupOptions: {\n input: {\n main: getClientEntryPath(startConfig),\n },\n output: {\n dir: path.resolve(startConfig.root, CLIENT_DIST_DIR),\n },\n // TODO: this should be removed\n external: ['node:fs', 'node:path', 'node:os', 'node:crypto'],\n },\n },\n },\n [VITE_ENVIRONMENT_NAMES.server]: {\n consumer: 'server',\n build: {\n ssr: true,\n // we don't write to the file system as the below 'capture-output' plugin will\n // capture the output and write it to the virtual file system\n write: false,\n copyPublicDir: false,\n rollupOptions: {\n output: {\n entryFileNames: SSR_ENTRY_FILE,\n },\n plugins: [\n {\n name: 'capture-output',\n generateBundle(_options, bundle) {\n // TODO: can this hook be called more than once?\n ssrBundle = bundle\n },\n },\n ],\n },\n commonjsOptions: {\n include: [/node_modules/],\n },\n },\n },\n },\n resolve: {\n noExternal: [\n '@tanstack/start**',\n `@tanstack/${opts.framework}-start**`,\n ...Object.values(VIRTUAL_MODULES),\n ],\n dedupe: [`@tanstack/${opts.framework}-start`],\n },\n optimizeDeps: {\n exclude: [\n ...Object.values(VIRTUAL_MODULES),\n `@tanstack/${opts.framework}-start`,\n ],\n },\n /* prettier-ignore */\n define: {\n // define is an esbuild function that replaces the any instances of given keys with the given values\n // i.e: __FRAMEWORK_NAME__ can be replaced with JSON.stringify(\"TanStack Start\")\n // This is not the same as injecting environment variables.\n\n ...defineReplaceEnv('TSS_SERVER_FN_BASE', startConfig.serverFns.base),\n ...defineReplaceEnv('TSS_OUTPUT_PUBLIC_DIR', nitroOutputPublicDir),\n ...defineReplaceEnv('TSS_APP_BASE', viteAppBase),\n ...(command === 'serve' ? defineReplaceEnv('TSS_SHELL', startConfig.spa?.enabled ? 'true' : 'false') : {}),\n },\n }\n },\n },\n // N.B. TanStackStartCompilerPlugin must be before the TanStackServerFnPluginEnv\n startCompilerPlugin(opts.framework, {\n client: { envName: VITE_ENVIRONMENT_NAMES.client },\n server: { envName: VITE_ENVIRONMENT_NAMES.server },\n }),\n TanStackServerFnPluginEnv({\n // This is the ID that will be available to look up and import\n // our server function manifest and resolve its module\n manifestVirtualImportId: VIRTUAL_MODULES.serverFnManifest,\n client: {\n getRuntimeCode: () =>\n `import { createClientRpc } from '@tanstack/${opts.framework}-start/server-functions-client'`,\n replacer: (d) =>\n `createClientRpc('${d.functionId}', '${startConfig.serverFns.base}')`,\n envName: VITE_ENVIRONMENT_NAMES.client,\n },\n server: {\n getRuntimeCode: () =>\n `import { createServerRpc } from '@tanstack/${opts.framework}-start/server-functions-server'`,\n replacer: (d) =>\n `createServerRpc('${d.functionId}', '${startConfig.serverFns.base}', ${d.fn})`,\n envName: VITE_ENVIRONMENT_NAMES.server,\n },\n }),\n loadEnvPlugin(startConfig),\n startManifestPlugin({ clientEntry: getClientEntryPath(startConfig) }),\n devServerPlugin(),\n nitroPlugin(startConfig, () => ssrBundle),\n {\n name: 'tanstack-start:core:capture-client-bundle',\n applyToEnvironment(e) {\n return e.name === VITE_ENVIRONMENT_NAMES.client\n },\n enforce: 'post',\n generateBundle(_options, bundle) {\n globalThis.TSS_CLIENT_BUNDLE = bundle\n },\n },\n ]\n}\n\nfunction defineReplaceEnv<TKey extends string, TValue extends string>(\n key: TKey,\n value: TValue,\n): { [P in `process.env.${TKey}` | `import.meta.env.${TKey}`]: TValue } {\n return {\n [`process.env.${key}`]: JSON.stringify(value),\n [`import.meta.env.${key}`]: JSON.stringify(value),\n } as { [P in `process.env.${TKey}` | `import.meta.env.${TKey}`]: TValue }\n}\n\nconst getClientEntryPath = (startConfig: TanStackStartOutputConfig) => {\n // when the user specifies a custom client entry path, we need to resolve it\n // relative to the root of the project, keeping in mind that if not specified\n // it will be /~start/default-client-entry which is a virtual path\n // that is resolved by vite to the actual client entry path\n const entry = startConfig.clientEntryPath.startsWith(\n '/~start/default-client-entry',\n )\n ? startConfig.clientEntryPath\n : vite.normalizePath(\n path.join(\n '/@fs',\n path.resolve(startConfig.root, startConfig.clientEntryPath),\n ),\n )\n\n return entry\n}\n"],"names":["nitroOutputPublicDir"],"mappings":";;;;;;;;;;;;;;;AA4BsB,qBAAqB;AAmB3C,IAAI;AAEY,SAAA,4BACd,MACA,aACqB;AACd,SAAA;AAAA,IACL,oBAAoB;AAAA,MAClB,GAAG,YAAY;AAAA,MACf,QAAQ,KAAK;AAAA,MACb,mBAAmB;AAAA,IAAA,CACpB;AAAA,IACD,4BAA4B,MAAM,WAAW;AAAA,IAC7C;AAAA,MACE,MAAM;AAAA,MACN,MAAM,OAAO,YAAY,EAAE,WAAW;;AACpC,cAAM,cAAc,cAAc,WAAW,QAAQ,GAAG;AACxD,mBAAW,eAAe;AAEpB,cAAA,uBAAuB,OAAO,YAAY;AAExC,gBAAA,gBAAgB,MAAM,YAAY;AAAA,YACtC,QAAQ,YAAY;AAAA,YACpB,mBAAmB;AAAA,UAAA,CACpB;AAEKA,gBAAAA,wBAAuB,cAAc,QAAQ,OAAO;AAC1D,gBAAM,cAAc,MAAM;AAEnBA,iBAAAA;AAAAA,QAAAA,GACN;AAEI,eAAA;AAAA,UACL,MAAM;AAAA,UACN,cAAc;AAAA,YACZ,CAAC,uBAAuB,MAAM,GAAG;AAAA,cAC/B,UAAU;AAAA,cACV,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,eAAe;AAAA,kBACb,OAAO;AAAA,oBACL,MAAM,mBAAmB,WAAW;AAAA,kBACtC;AAAA,kBACA,QAAQ;AAAA,oBACN,KAAK,KAAK,QAAQ,YAAY,MAAM,eAAe;AAAA,kBACrD;AAAA;AAAA,kBAEA,UAAU,CAAC,WAAW,aAAa,WAAW,aAAa;AAAA,gBAAA;AAAA,cAC7D;AAAA,YAEJ;AAAA,YACA,CAAC,uBAAuB,MAAM,GAAG;AAAA,cAC/B,UAAU;AAAA,cACV,OAAO;AAAA,gBACL,KAAK;AAAA;AAAA;AAAA,gBAGL,OAAO;AAAA,gBACP,eAAe;AAAA,gBACf,eAAe;AAAA,kBACb,QAAQ;AAAA,oBACN,gBAAgB;AAAA,kBAClB;AAAA,kBACA,SAAS;AAAA,oBACP;AAAA,sBACE,MAAM;AAAA,sBACN,eAAe,UAAU,QAAQ;AAEnB,oCAAA;AAAA,sBAAA;AAAA,oBACd;AAAA,kBACF;AAAA,gBAEJ;AAAA,gBACA,iBAAiB;AAAA,kBACf,SAAS,CAAC,cAAc;AAAA,gBAAA;AAAA,cAC1B;AAAA,YACF;AAAA,UAEJ;AAAA,UACA,SAAS;AAAA,YACP,YAAY;AAAA,cACV;AAAA,cACA,aAAa,KAAK,SAAS;AAAA,cAC3B,GAAG,OAAO,OAAO,eAAe;AAAA,YAClC;AAAA,YACA,QAAQ,CAAC,aAAa,KAAK,SAAS,QAAQ;AAAA,UAC9C;AAAA,UACA,cAAc;AAAA,YACZ,SAAS;AAAA,cACP,GAAG,OAAO,OAAO,eAAe;AAAA,cAChC,aAAa,KAAK,SAAS;AAAA,YAAA;AAAA,UAE/B;AAAA;AAAA,UAEA,QAAQ;AAAA;AAAA;AAAA;AAAA,YAKN,GAAG,iBAAiB,sBAAsB,YAAY,UAAU,IAAI;AAAA,YACpE,GAAG,iBAAiB,yBAAyB,oBAAoB;AAAA,YACjE,GAAG,iBAAiB,gBAAgB,WAAW;AAAA,YAC/C,GAAI,YAAY,UAAU,iBAAiB,eAAa,iBAAY,QAAZ,mBAAiB,WAAU,SAAS,OAAO,IAAI,CAAA;AAAA,UAAC;AAAA,QAE5G;AAAA,MAAA;AAAA,IAEJ;AAAA;AAAA,IAEA,oBAAoB,KAAK,WAAW;AAAA,MAClC,QAAQ,EAAE,SAAS,uBAAuB,OAAO;AAAA,MACjD,QAAQ,EAAE,SAAS,uBAAuB,OAAO;AAAA,IAAA,CAClD;AAAA,IACD,0BAA0B;AAAA;AAAA;AAAA,MAGxB,yBAAyB,gBAAgB;AAAA,MACzC,QAAQ;AAAA,QACN,gBAAgB,MACd,8CAA8C,KAAK,SAAS;AAAA,QAC9D,UAAU,CAAC,MACT,oBAAoB,EAAE,UAAU,OAAO,YAAY,UAAU,IAAI;AAAA,QACnE,SAAS,uBAAuB;AAAA,MAClC;AAAA,MACA,QAAQ;AAAA,QACN,gBAAgB,MACd,8CAA8C,KAAK,SAAS;AAAA,QAC9D,UAAU,CAAC,MACT,oBAAoB,EAAE,UAAU,OAAO,YAAY,UAAU,IAAI,MAAM,EAAE,EAAE;AAAA,QAC7E,SAAS,uBAAuB;AAAA,MAAA;AAAA,IAClC,CACD;AAAA,IACD,cAAc,WAAW;AAAA,IACzB,oBAAoB,EAAE,aAAa,mBAAmB,WAAW,GAAG;AAAA,IACpE,gBAAgB;AAAA,IAChB,YAAY,aAAa,MAAM,SAAS;AAAA,IACxC;AAAA,MACE,MAAM;AAAA,MACN,mBAAmB,GAAG;AACb,eAAA,EAAE,SAAS,uBAAuB;AAAA,MAC3C;AAAA,MACA,SAAS;AAAA,MACT,eAAe,UAAU,QAAQ;AAC/B,mBAAW,oBAAoB;AAAA,MAAA;AAAA,IACjC;AAAA,EAEJ;AACF;AAEA,SAAS,iBACP,KACA,OACsE;AAC/D,SAAA;AAAA,IACL,CAAC,eAAe,GAAG,EAAE,GAAG,KAAK,UAAU,KAAK;AAAA,IAC5C,CAAC,mBAAmB,GAAG,EAAE,GAAG,KAAK,UAAU,KAAK;AAAA,EAClD;AACF;AAEA,MAAM,qBAAqB,CAAC,gBAA2C;AAK/D,QAAA,QAAQ,YAAY,gBAAgB;AAAA,IACxC;AAAA,EAAA,IAEE,YAAY,kBACZ,KAAK;AAAA,IACH,KAAK;AAAA,MACH;AAAA,MACA,KAAK,QAAQ,YAAY,MAAM,YAAY,eAAe;AAAA,IAAA;AAAA,EAE9D;AAEG,SAAA;AACT;"}
|
|
1
|
+
{"version":3,"file":"plugin.js","sources":["../../src/plugin.ts"],"sourcesContent":["import path from 'node:path'\nimport { createNitro } from 'nitropack'\nimport { trimPathRight } from '@tanstack/router-core'\nimport { VIRTUAL_MODULES } from '@tanstack/start-server-core'\nimport { TanStackServerFnPluginEnv } from '@tanstack/server-functions-plugin'\nimport * as vite from 'vite'\nimport { crawlFrameworkPkgs } from 'vitefu'\nimport { createTanStackConfig } from './schema'\nimport { nitroPlugin } from './nitro-plugin/plugin'\nimport { startManifestPlugin } from './start-manifest-plugin/plugin'\nimport { startCompilerPlugin } from './start-compiler-plugin'\nimport {\n CLIENT_DIST_DIR,\n SSR_ENTRY_FILE,\n VITE_ENVIRONMENT_NAMES,\n} from './constants'\nimport { tanStackStartRouter } from './start-router-plugin/plugin'\nimport { loadEnvPlugin } from './load-env-plugin/plugin'\nimport { devServerPlugin } from './dev-server-plugin/plugin'\nimport { resolveVirtualEntriesPlugin } from './resolve-virtual-entries-plugin/plugin'\nimport type { createTanStackStartOptionsSchema } from './schema'\nimport type { PluginOption, Rollup } from 'vite'\nimport type { z } from 'zod'\nimport type { CompileStartFrameworkOptions } from './compilers'\n\nexport type TanStackStartInputConfig = z.input<\n ReturnType<typeof createTanStackStartOptionsSchema>\n>\n\nconst defaultConfig = createTanStackConfig()\nexport function getTanStackStartOptions(opts?: TanStackStartInputConfig) {\n return defaultConfig.parse(opts)\n}\n\nexport type TanStackStartOutputConfig = ReturnType<\n typeof getTanStackStartOptions\n>\n\nexport interface TanStackStartVitePluginCoreOptions {\n framework: CompileStartFrameworkOptions\n getVirtualServerRootHandler: (ctx: {\n routerFilepath: string\n serverEntryFilepath: string\n }) => string\n getVirtualServerEntry: (ctx: { routerFilepath: string }) => string\n getVirtualClientEntry: (ctx: { routerFilepath: string }) => string\n crawlPackages?: (opts: {\n name: string\n peerDependencies: Record<string, any>\n }) => 'include' | 'exclude' | undefined\n}\n// this needs to live outside of the TanStackStartVitePluginCore since it will be invoked multiple times by vite\nlet ssrBundle: Rollup.OutputBundle\n\nexport function TanStackStartVitePluginCore(\n opts: TanStackStartVitePluginCoreOptions,\n startConfig: TanStackStartOutputConfig,\n): Array<PluginOption> {\n return [\n tanStackStartRouter({\n ...startConfig.tsr,\n target: opts.framework,\n autoCodeSplitting: true,\n }),\n resolveVirtualEntriesPlugin(opts, startConfig),\n {\n name: 'tanstack-start-core:config-client',\n async config(viteConfig, { command }) {\n const viteAppBase = trimPathRight(viteConfig.base || '/')\n globalThis.TSS_APP_BASE = viteAppBase\n\n const nitroOutputPublicDir = await (async () => {\n // Create a dummy nitro app to get the resolved public output path\n const dummyNitroApp = await createNitro({\n preset: startConfig.target,\n compatibilityDate: '2024-12-01',\n })\n\n const nitroOutputPublicDir = dummyNitroApp.options.output.publicDir\n await dummyNitroApp.close()\n\n return nitroOutputPublicDir\n })()\n\n const startPackageName = `@tanstack/${opts.framework}-start`\n const routerPackageName = `@tanstack/${opts.framework}-router`\n\n const additionalOptimizeDeps = {\n include: new Set<string>(),\n exclude: new Set<string>(),\n }\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 result = await crawlFrameworkPkgs({\n root: process.cwd(),\n isBuild: command === 'build',\n isFrameworkPkgByJson(pkgJson) {\n if ([routerPackageName, startPackageName].includes(pkgJson.name)) {\n return false\n }\n\n const peerDependencies = pkgJson['peerDependencies']\n\n if (peerDependencies) {\n const internalResult = opts.crawlPackages?.({\n name: pkgJson.name,\n peerDependencies,\n })\n if (internalResult) {\n if (internalResult === 'exclude') {\n additionalOptimizeDeps.exclude.add(pkgJson.name)\n } else {\n additionalOptimizeDeps.include.add(pkgJson.name)\n }\n }\n return (\n startPackageName in peerDependencies ||\n routerPackageName in peerDependencies\n )\n }\n return false\n },\n })\n\n return {\n base: viteAppBase,\n environments: {\n [VITE_ENVIRONMENT_NAMES.client]: {\n consumer: 'client',\n build: {\n manifest: true,\n rollupOptions: {\n input: {\n main: getClientEntryPath(startConfig),\n },\n output: {\n dir: path.resolve(startConfig.root, CLIENT_DIST_DIR),\n },\n // TODO: this should be removed\n external: ['node:fs', 'node:path', 'node:os', 'node:crypto'],\n },\n },\n },\n [VITE_ENVIRONMENT_NAMES.server]: {\n consumer: 'server',\n build: {\n ssr: true,\n // we don't write to the file system as the below 'capture-output' plugin will\n // capture the output and write it to the virtual file system\n write: false,\n copyPublicDir: false,\n rollupOptions: {\n output: {\n entryFileNames: SSR_ENTRY_FILE,\n },\n plugins: [\n {\n name: 'capture-output',\n generateBundle(_options, bundle) {\n // TODO: can this hook be called more than once?\n ssrBundle = bundle\n },\n },\n ],\n },\n commonjsOptions: {\n include: [/node_modules/],\n },\n },\n },\n },\n resolve: {\n noExternal: [\n '@tanstack/start**',\n `@tanstack/${opts.framework}-start**`,\n ...Object.values(VIRTUAL_MODULES),\n startPackageName,\n ...result.ssr.noExternal.sort(),\n ],\n external: [...result.ssr.external.sort()],\n dedupe: [startPackageName],\n },\n optimizeDeps: {\n exclude: [\n ...Object.values(VIRTUAL_MODULES),\n startPackageName,\n ...result.optimizeDeps.exclude.sort(),\n ...additionalOptimizeDeps.exclude,\n ],\n include: [...additionalOptimizeDeps.include],\n },\n /* prettier-ignore */\n define: {\n // define is an esbuild function that replaces the any instances of given keys with the given values\n // i.e: __FRAMEWORK_NAME__ can be replaced with JSON.stringify(\"TanStack Start\")\n // This is not the same as injecting environment variables.\n\n ...defineReplaceEnv('TSS_SERVER_FN_BASE', startConfig.serverFns.base),\n ...defineReplaceEnv('TSS_OUTPUT_PUBLIC_DIR', nitroOutputPublicDir),\n ...defineReplaceEnv('TSS_APP_BASE', viteAppBase),\n ...(command === 'serve' ? defineReplaceEnv('TSS_SHELL', startConfig.spa?.enabled ? 'true' : 'false') : {}),\n },\n }\n },\n },\n // N.B. TanStackStartCompilerPlugin must be before the TanStackServerFnPluginEnv\n startCompilerPlugin(opts.framework, {\n client: { envName: VITE_ENVIRONMENT_NAMES.client },\n server: { envName: VITE_ENVIRONMENT_NAMES.server },\n }),\n TanStackServerFnPluginEnv({\n // This is the ID that will be available to look up and import\n // our server function manifest and resolve its module\n manifestVirtualImportId: VIRTUAL_MODULES.serverFnManifest,\n client: {\n getRuntimeCode: () =>\n `import { createClientRpc } from '@tanstack/${opts.framework}-start/server-functions-client'`,\n replacer: (d) =>\n `createClientRpc('${d.functionId}', '${startConfig.serverFns.base}')`,\n envName: VITE_ENVIRONMENT_NAMES.client,\n },\n server: {\n getRuntimeCode: () =>\n `import { createServerRpc } from '@tanstack/${opts.framework}-start/server-functions-server'`,\n replacer: (d) =>\n `createServerRpc('${d.functionId}', '${startConfig.serverFns.base}', ${d.fn})`,\n envName: VITE_ENVIRONMENT_NAMES.server,\n },\n }),\n loadEnvPlugin(startConfig),\n startManifestPlugin({ clientEntry: getClientEntryPath(startConfig) }),\n devServerPlugin(),\n nitroPlugin(startConfig, () => ssrBundle),\n {\n name: 'tanstack-start:core:capture-client-bundle',\n applyToEnvironment(e) {\n return e.name === VITE_ENVIRONMENT_NAMES.client\n },\n enforce: 'post',\n generateBundle(_options, bundle) {\n globalThis.TSS_CLIENT_BUNDLE = bundle\n },\n },\n ]\n}\n\nfunction defineReplaceEnv<TKey extends string, TValue extends string>(\n key: TKey,\n value: TValue,\n): { [P in `process.env.${TKey}` | `import.meta.env.${TKey}`]: TValue } {\n return {\n [`process.env.${key}`]: JSON.stringify(value),\n [`import.meta.env.${key}`]: JSON.stringify(value),\n } as { [P in `process.env.${TKey}` | `import.meta.env.${TKey}`]: TValue }\n}\n\nconst getClientEntryPath = (startConfig: TanStackStartOutputConfig) => {\n // when the user specifies a custom client entry path, we need to resolve it\n // relative to the root of the project, keeping in mind that if not specified\n // it will be /~start/default-client-entry which is a virtual path\n // that is resolved by vite to the actual client entry path\n const entry = startConfig.clientEntryPath.startsWith(\n '/~start/default-client-entry',\n )\n ? startConfig.clientEntryPath\n : vite.normalizePath(\n path.join(\n '/@fs',\n path.resolve(startConfig.root, startConfig.clientEntryPath),\n ),\n )\n\n return entry\n}\n"],"names":["nitroOutputPublicDir","_a"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/start-plugin-core",
|
|
3
|
-
"version": "1.130.
|
|
3
|
+
"version": "1.130.5",
|
|
4
4
|
"description": "Modern and scalable routing for React applications",
|
|
5
5
|
"author": "Tanner Linsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -61,14 +61,15 @@
|
|
|
61
61
|
"nitropack": "^2.11.12",
|
|
62
62
|
"pathe": "^2.0.3",
|
|
63
63
|
"ufo": "^1.5.4",
|
|
64
|
+
"vitefu": "^1.1.1",
|
|
64
65
|
"xmlbuilder2": "^3.1.1",
|
|
65
66
|
"zod": "^3.24.2",
|
|
66
|
-
"@tanstack/router-core": "1.130.
|
|
67
|
-
"@tanstack/router-generator": "1.130.
|
|
68
|
-
"@tanstack/router-plugin": "1.130.2",
|
|
67
|
+
"@tanstack/router-core": "1.130.5",
|
|
68
|
+
"@tanstack/router-generator": "1.130.5",
|
|
69
69
|
"@tanstack/router-utils": "1.129.7",
|
|
70
|
+
"@tanstack/router-plugin": "1.130.5",
|
|
70
71
|
"@tanstack/server-functions-plugin": "1.129.7",
|
|
71
|
-
"@tanstack/start-server-core": "1.130.
|
|
72
|
+
"@tanstack/start-server-core": "1.130.5"
|
|
72
73
|
},
|
|
73
74
|
"devDependencies": {
|
|
74
75
|
"vite": "^6.0.0"
|
|
@@ -22,14 +22,27 @@ export function devServerPlugin(): Plugin {
|
|
|
22
22
|
// this will prevent vite from injecting middlewares that we don't want
|
|
23
23
|
userConfig.appType = 'custom'
|
|
24
24
|
},
|
|
25
|
-
configureServer(viteDevServer) {
|
|
25
|
+
async configureServer(viteDevServer) {
|
|
26
26
|
if (isTest) {
|
|
27
27
|
return
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
//
|
|
31
|
-
|
|
30
|
+
// Extract the scripts that Vite plugins would inject into the initial HTML
|
|
31
|
+
const templateHtml = `<html><head></head><body></body></html>`
|
|
32
|
+
const transformedHtml = await viteDevServer.transformIndexHtml(
|
|
33
|
+
'/',
|
|
34
|
+
templateHtml,
|
|
35
|
+
)
|
|
36
|
+
const scripts = extractHtmlScripts(transformedHtml)
|
|
37
|
+
globalThis.TSS_INJECTED_HEAD_SCRIPTS = scripts
|
|
38
|
+
.map((script) => script.content ?? '')
|
|
39
|
+
.join(';')
|
|
40
|
+
|
|
32
41
|
return () => {
|
|
42
|
+
// do not install middleware in middlewareMode
|
|
43
|
+
if (viteDevServer.config.server.middlewareMode) {
|
|
44
|
+
return
|
|
45
|
+
}
|
|
33
46
|
viteDevServer.middlewares.use(async (req, res, next) => {
|
|
34
47
|
// Create an H3Event to have it passed into the server entry
|
|
35
48
|
// i.e: event => defineEventHandler(event)
|
|
@@ -52,19 +65,6 @@ export function devServerPlugin(): Plugin {
|
|
|
52
65
|
)
|
|
53
66
|
}
|
|
54
67
|
|
|
55
|
-
// Extract the scripts that Vite plugins would inject into the initial HTML
|
|
56
|
-
if (globalThis.TSS_INJECTED_HEAD_SCRIPTS === undefined) {
|
|
57
|
-
const templateHtml = `<html><head></head><body></body></html>`
|
|
58
|
-
const transformedHtml = await viteDevServer.transformIndexHtml(
|
|
59
|
-
req.url || '/',
|
|
60
|
-
templateHtml,
|
|
61
|
-
)
|
|
62
|
-
const scripts = extractHtmlScripts(transformedHtml)
|
|
63
|
-
globalThis.TSS_INJECTED_HEAD_SCRIPTS = scripts
|
|
64
|
-
.map((script) => script.content ?? '')
|
|
65
|
-
.join(';')
|
|
66
|
-
}
|
|
67
|
-
|
|
68
68
|
if (!isRunnableDevEnvironment(serverEnv)) {
|
|
69
69
|
return next()
|
|
70
70
|
}
|
package/src/plugin.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { trimPathRight } from '@tanstack/router-core'
|
|
|
4
4
|
import { VIRTUAL_MODULES } from '@tanstack/start-server-core'
|
|
5
5
|
import { TanStackServerFnPluginEnv } from '@tanstack/server-functions-plugin'
|
|
6
6
|
import * as vite from 'vite'
|
|
7
|
+
import { crawlFrameworkPkgs } from 'vitefu'
|
|
7
8
|
import { createTanStackConfig } from './schema'
|
|
8
9
|
import { nitroPlugin } from './nitro-plugin/plugin'
|
|
9
10
|
import { startManifestPlugin } from './start-manifest-plugin/plugin'
|
|
@@ -43,6 +44,10 @@ export interface TanStackStartVitePluginCoreOptions {
|
|
|
43
44
|
}) => string
|
|
44
45
|
getVirtualServerEntry: (ctx: { routerFilepath: string }) => string
|
|
45
46
|
getVirtualClientEntry: (ctx: { routerFilepath: string }) => string
|
|
47
|
+
crawlPackages?: (opts: {
|
|
48
|
+
name: string
|
|
49
|
+
peerDependencies: Record<string, any>
|
|
50
|
+
}) => 'include' | 'exclude' | undefined
|
|
46
51
|
}
|
|
47
52
|
// this needs to live outside of the TanStackStartVitePluginCore since it will be invoked multiple times by vite
|
|
48
53
|
let ssrBundle: Rollup.OutputBundle
|
|
@@ -77,6 +82,51 @@ export function TanStackStartVitePluginCore(
|
|
|
77
82
|
return nitroOutputPublicDir
|
|
78
83
|
})()
|
|
79
84
|
|
|
85
|
+
const startPackageName = `@tanstack/${opts.framework}-start`
|
|
86
|
+
const routerPackageName = `@tanstack/${opts.framework}-router`
|
|
87
|
+
|
|
88
|
+
const additionalOptimizeDeps = {
|
|
89
|
+
include: new Set<string>(),
|
|
90
|
+
exclude: new Set<string>(),
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// crawl packages that have start in "peerDependencies"
|
|
94
|
+
// see https://github.com/svitejs/vitefu/blob/d8d82fa121e3b2215ba437107093c77bde51b63b/src/index.js#L95-L101
|
|
95
|
+
|
|
96
|
+
// this is currently uncached; could be implemented similarly as vite handles lock file changes
|
|
97
|
+
// see https://github.com/vitejs/vite/blob/557f797d29422027e8c451ca50dd84bf8c41b5f0/packages/vite/src/node/optimizer/index.ts#L1282
|
|
98
|
+
|
|
99
|
+
const result = await crawlFrameworkPkgs({
|
|
100
|
+
root: process.cwd(),
|
|
101
|
+
isBuild: command === 'build',
|
|
102
|
+
isFrameworkPkgByJson(pkgJson) {
|
|
103
|
+
if ([routerPackageName, startPackageName].includes(pkgJson.name)) {
|
|
104
|
+
return false
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const peerDependencies = pkgJson['peerDependencies']
|
|
108
|
+
|
|
109
|
+
if (peerDependencies) {
|
|
110
|
+
const internalResult = opts.crawlPackages?.({
|
|
111
|
+
name: pkgJson.name,
|
|
112
|
+
peerDependencies,
|
|
113
|
+
})
|
|
114
|
+
if (internalResult) {
|
|
115
|
+
if (internalResult === 'exclude') {
|
|
116
|
+
additionalOptimizeDeps.exclude.add(pkgJson.name)
|
|
117
|
+
} else {
|
|
118
|
+
additionalOptimizeDeps.include.add(pkgJson.name)
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return (
|
|
122
|
+
startPackageName in peerDependencies ||
|
|
123
|
+
routerPackageName in peerDependencies
|
|
124
|
+
)
|
|
125
|
+
}
|
|
126
|
+
return false
|
|
127
|
+
},
|
|
128
|
+
})
|
|
129
|
+
|
|
80
130
|
return {
|
|
81
131
|
base: viteAppBase,
|
|
82
132
|
environments: {
|
|
@@ -129,14 +179,20 @@ export function TanStackStartVitePluginCore(
|
|
|
129
179
|
'@tanstack/start**',
|
|
130
180
|
`@tanstack/${opts.framework}-start**`,
|
|
131
181
|
...Object.values(VIRTUAL_MODULES),
|
|
182
|
+
startPackageName,
|
|
183
|
+
...result.ssr.noExternal.sort(),
|
|
132
184
|
],
|
|
133
|
-
|
|
185
|
+
external: [...result.ssr.external.sort()],
|
|
186
|
+
dedupe: [startPackageName],
|
|
134
187
|
},
|
|
135
188
|
optimizeDeps: {
|
|
136
189
|
exclude: [
|
|
137
190
|
...Object.values(VIRTUAL_MODULES),
|
|
138
|
-
|
|
191
|
+
startPackageName,
|
|
192
|
+
...result.optimizeDeps.exclude.sort(),
|
|
193
|
+
...additionalOptimizeDeps.exclude,
|
|
139
194
|
],
|
|
195
|
+
include: [...additionalOptimizeDeps.include],
|
|
140
196
|
},
|
|
141
197
|
/* prettier-ignore */
|
|
142
198
|
define: {
|