@tanstack/start-plugin-core 1.130.2 → 1.130.4
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/nitro-plugin/plugin.cjs +4 -3
- package/dist/cjs/nitro-plugin/plugin.cjs.map +1 -1
- package/dist/cjs/nitro-plugin/prerender.cjs +1 -7
- package/dist/cjs/nitro-plugin/prerender.cjs.map +1 -1
- package/dist/cjs/plugin.cjs +44 -5
- package/dist/cjs/plugin.cjs.map +1 -1
- package/dist/cjs/plugin.d.cts +4 -4
- package/dist/cjs/schema.cjs +1 -2
- package/dist/cjs/schema.cjs.map +1 -1
- package/dist/cjs/schema.d.cts +0 -99
- package/dist/esm/dev-server-plugin/plugin.js +11 -11
- package/dist/esm/dev-server-plugin/plugin.js.map +1 -1
- package/dist/esm/nitro-plugin/plugin.js +4 -3
- package/dist/esm/nitro-plugin/plugin.js.map +1 -1
- package/dist/esm/nitro-plugin/prerender.js +1 -7
- package/dist/esm/nitro-plugin/prerender.js.map +1 -1
- package/dist/esm/plugin.d.ts +4 -4
- package/dist/esm/plugin.js +44 -5
- package/dist/esm/plugin.js.map +1 -1
- package/dist/esm/schema.d.ts +0 -99
- package/dist/esm/schema.js +1 -2
- package/dist/esm/schema.js.map +1 -1
- package/package.json +5 -4
- package/src/dev-server-plugin/plugin.ts +16 -16
- package/src/nitro-plugin/plugin.ts +4 -3
- package/src/nitro-plugin/prerender.ts +3 -8
- package/src/plugin.ts +59 -3
- package/src/schema.ts +0 -1
|
@@ -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;;"}
|
|
@@ -4,6 +4,7 @@ const path = require("node:path");
|
|
|
4
4
|
const node_fs = require("node:fs");
|
|
5
5
|
const nitropack = require("nitropack");
|
|
6
6
|
const pathe = require("pathe");
|
|
7
|
+
const startServerCore = require("@tanstack/start-server-core");
|
|
7
8
|
const constants = require("../constants.cjs");
|
|
8
9
|
const buildSitemap = require("./build-sitemap.cjs");
|
|
9
10
|
const prerender = require("./prerender.cjs");
|
|
@@ -114,9 +115,9 @@ async function buildNitroApp(builder, nitro, options) {
|
|
|
114
115
|
path: maskUrl.toString().replace("http://localhost", ""),
|
|
115
116
|
prerender: {
|
|
116
117
|
...options.spa.prerender,
|
|
117
|
-
|
|
118
|
-
...options.spa.prerender.
|
|
119
|
-
|
|
118
|
+
headers: {
|
|
119
|
+
...options.spa.prerender.headers,
|
|
120
|
+
[startServerCore.HEADERS.TSS_SHELL]: "true"
|
|
120
121
|
}
|
|
121
122
|
},
|
|
122
123
|
sitemap: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.cjs","sources":["../../../src/nitro-plugin/plugin.ts"],"sourcesContent":["import path from 'node:path'\nimport { rmSync } from 'node:fs'\nimport { build, copyPublicAssets, createNitro, prepare } from 'nitropack'\nimport { dirname, resolve } from 'pathe'\nimport {\n CLIENT_DIST_DIR,\n SSR_ENTRY_FILE,\n VITE_ENVIRONMENT_NAMES,\n} from '../constants'\nimport { buildSitemap } from './build-sitemap'\nimport { prerender } from './prerender'\nimport type {\n EnvironmentOptions,\n PluginOption,\n Rollup,\n ViteBuilder,\n} from 'vite'\nimport type { Nitro, NitroConfig } from 'nitropack'\nimport type { TanStackStartOutputConfig } from '../plugin'\n\nexport function nitroPlugin(\n options: TanStackStartOutputConfig,\n getSsrBundle: () => Rollup.OutputBundle,\n): Array<PluginOption> {\n const buildPreset =\n process.env['START_TARGET'] ?? (options.target as string | undefined)\n return [\n {\n name: 'tanstack-vite-plugin-nitro',\n configEnvironment(name) {\n if (name === VITE_ENVIRONMENT_NAMES.server) {\n return {\n build: {\n commonjsOptions: {\n include: [],\n },\n ssr: true,\n sourcemap: true,\n rollupOptions: {\n input: '/~start/server-entry',\n },\n },\n } satisfies EnvironmentOptions\n }\n\n return null\n },\n config() {\n return {\n builder: {\n sharedPlugins: true,\n async buildApp(builder) {\n const client = builder.environments[VITE_ENVIRONMENT_NAMES.client]\n const server = builder.environments[VITE_ENVIRONMENT_NAMES.server]\n\n if (!client) {\n throw new Error('Client environment not found')\n }\n\n if (!server) {\n throw new Error('SSR environment not found')\n }\n\n // Build the client bundle\n // i.e client entry file with `hydrateRoot(...)`\n const clientOutputDir = resolve(options.root, CLIENT_DIST_DIR)\n rmSync(clientOutputDir, { recursive: true, force: true })\n await builder.build(client)\n\n // Build the SSR bundle\n await builder.build(server)\n\n const nitroConfig: NitroConfig = {\n dev: false,\n // TODO: do we need this? should this be made configurable?\n compatibilityDate: '2024-11-19',\n logLevel: 3,\n preset: buildPreset,\n baseURL: globalThis.TSS_APP_BASE,\n publicAssets: [\n {\n dir: path.resolve(options.root, CLIENT_DIST_DIR),\n baseURL: '/',\n maxAge: 31536000, // 1 year\n },\n ],\n typescript: {\n generateTsConfig: false,\n },\n prerender: undefined,\n renderer: SSR_ENTRY_FILE,\n plugins: [], // Nitro's plugins\n appConfigFiles: [],\n scanDirs: [],\n imports: false, // unjs/unimport for global/magic imports\n rollupConfig: {\n plugins: [virtualBundlePlugin(getSsrBundle())],\n },\n virtual: {\n // This is Nitro's way of defining virtual modules\n // Should we define the ones for TanStack Start's here as well?\n },\n }\n\n const nitro = await createNitro(nitroConfig)\n\n await buildNitroApp(builder, nitro, options)\n },\n },\n }\n },\n },\n ]\n}\n\n/**\n * Correctly co-ordinates the nitro app build process to make sure that the\n * app is built, while also correctly handling the prerendering and sitemap\n * generation and including their outputs in the final build.\n */\nasync function buildNitroApp(\n builder: ViteBuilder,\n nitro: Nitro,\n options: TanStackStartOutputConfig,\n) {\n // Cleans the public and server directories for a fresh build\n // i.e the `.output/public` and `.output/server` directories\n await prepare(nitro)\n\n // Creates the `.output/public` directory and copies the public assets\n await copyPublicAssets(nitro)\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 (options.prerender?.enabled !== false) {\n options.prerender = {\n ...options.prerender,\n enabled:\n options.prerender?.enabled ??\n options.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 (options.spa?.enabled) {\n options.prerender = {\n ...options.prerender,\n enabled: true,\n }\n\n const maskUrl = new URL(options.spa.maskPath, 'http://localhost')\n\n options.pages.push({\n path: maskUrl.toString().replace('http://localhost', ''),\n prerender: {\n ...options.spa.prerender,\n env: {\n ...options.spa.prerender.env,\n TSS_SPA_MODE: 'true',\n },\n },\n sitemap: {\n exclude: true,\n },\n })\n }\n\n // Run the prerendering process\n if (options.prerender.enabled) {\n await prerender({\n options,\n nitro,\n builder,\n })\n }\n\n // Run the sitemap build process\n if (options.pages.length) {\n buildSitemap({\n options,\n publicDir: nitro.options.output.publicDir,\n })\n }\n\n // Build the nitro app\n // We only build the nitro app, once we've prepared the public assets,\n // prerendered the pages and built the sitemap.\n // If we try to do this earlier, then the public assets may not be available\n // in the production build.\n await build(nitro)\n\n // Close the nitro instance\n await nitro.close()\n nitro.logger.success(\n 'Client and Server bundles for TanStack Start have been successfully built.',\n )\n}\n\ntype NitroRollupPluginOption = NonNullable<\n NitroConfig['rollupConfig']\n>['plugins']\n\nfunction virtualBundlePlugin(\n ssrBundle: Rollup.OutputBundle,\n): NitroRollupPluginOption {\n type VirtualModule = { code: string; map: string | null }\n const _modules = new Map<string, VirtualModule>()\n\n // group chunks and source maps\n for (const [fileName, content] of Object.entries(ssrBundle)) {\n if (content.type === 'chunk') {\n const virtualModule: VirtualModule = {\n code: content.code,\n map: null,\n }\n const maybeMap = ssrBundle[`${fileName}.map`]\n if (maybeMap && maybeMap.type === 'asset') {\n virtualModule.map = maybeMap.source as string\n }\n _modules.set(fileName, virtualModule)\n _modules.set(resolve(fileName), virtualModule)\n }\n }\n\n return {\n name: 'virtual-bundle',\n resolveId(id, importer) {\n if (_modules.has(id)) {\n return resolve(id)\n }\n\n if (importer) {\n const resolved = resolve(dirname(importer), id)\n if (_modules.has(resolved)) {\n return resolved\n }\n }\n return null\n },\n load(id) {\n const m = _modules.get(id)\n if (!m) {\n return null\n }\n return m\n },\n }\n}\n"],"names":["VITE_ENVIRONMENT_NAMES","resolve","CLIENT_DIST_DIR","rmSync","SSR_ENTRY_FILE","createNitro","prepare","copyPublicAssets","_a","prerender","buildSitemap","build","dirname"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.cjs","sources":["../../../src/nitro-plugin/plugin.ts"],"sourcesContent":["import path from 'node:path'\nimport { rmSync } from 'node:fs'\nimport { build, copyPublicAssets, createNitro, prepare } from 'nitropack'\nimport { dirname, resolve } from 'pathe'\nimport { HEADERS } from '@tanstack/start-server-core'\nimport {\n CLIENT_DIST_DIR,\n SSR_ENTRY_FILE,\n VITE_ENVIRONMENT_NAMES,\n} from '../constants'\nimport { buildSitemap } from './build-sitemap'\nimport { prerender } from './prerender'\nimport type {\n EnvironmentOptions,\n PluginOption,\n Rollup,\n ViteBuilder,\n} from 'vite'\nimport type { Nitro, NitroConfig } from 'nitropack'\nimport type { TanStackStartOutputConfig } from '../plugin'\n\nexport function nitroPlugin(\n options: TanStackStartOutputConfig,\n getSsrBundle: () => Rollup.OutputBundle,\n): Array<PluginOption> {\n const buildPreset =\n process.env['START_TARGET'] ?? (options.target as string | undefined)\n return [\n {\n name: 'tanstack-vite-plugin-nitro',\n configEnvironment(name) {\n if (name === VITE_ENVIRONMENT_NAMES.server) {\n return {\n build: {\n commonjsOptions: {\n include: [],\n },\n ssr: true,\n sourcemap: true,\n rollupOptions: {\n input: '/~start/server-entry',\n },\n },\n } satisfies EnvironmentOptions\n }\n\n return null\n },\n config() {\n return {\n builder: {\n sharedPlugins: true,\n async buildApp(builder) {\n const client = builder.environments[VITE_ENVIRONMENT_NAMES.client]\n const server = builder.environments[VITE_ENVIRONMENT_NAMES.server]\n\n if (!client) {\n throw new Error('Client environment not found')\n }\n\n if (!server) {\n throw new Error('SSR environment not found')\n }\n\n // Build the client bundle\n // i.e client entry file with `hydrateRoot(...)`\n const clientOutputDir = resolve(options.root, CLIENT_DIST_DIR)\n rmSync(clientOutputDir, { recursive: true, force: true })\n await builder.build(client)\n\n // Build the SSR bundle\n await builder.build(server)\n\n const nitroConfig: NitroConfig = {\n dev: false,\n // TODO: do we need this? should this be made configurable?\n compatibilityDate: '2024-11-19',\n logLevel: 3,\n preset: buildPreset,\n baseURL: globalThis.TSS_APP_BASE,\n publicAssets: [\n {\n dir: path.resolve(options.root, CLIENT_DIST_DIR),\n baseURL: '/',\n maxAge: 31536000, // 1 year\n },\n ],\n typescript: {\n generateTsConfig: false,\n },\n prerender: undefined,\n renderer: SSR_ENTRY_FILE,\n plugins: [], // Nitro's plugins\n appConfigFiles: [],\n scanDirs: [],\n imports: false, // unjs/unimport for global/magic imports\n rollupConfig: {\n plugins: [virtualBundlePlugin(getSsrBundle())],\n },\n virtual: {\n // This is Nitro's way of defining virtual modules\n // Should we define the ones for TanStack Start's here as well?\n },\n }\n\n const nitro = await createNitro(nitroConfig)\n\n await buildNitroApp(builder, nitro, options)\n },\n },\n }\n },\n },\n ]\n}\n\n/**\n * Correctly co-ordinates the nitro app build process to make sure that the\n * app is built, while also correctly handling the prerendering and sitemap\n * generation and including their outputs in the final build.\n */\nasync function buildNitroApp(\n builder: ViteBuilder,\n nitro: Nitro,\n options: TanStackStartOutputConfig,\n) {\n // Cleans the public and server directories for a fresh build\n // i.e the `.output/public` and `.output/server` directories\n await prepare(nitro)\n\n // Creates the `.output/public` directory and copies the public assets\n await copyPublicAssets(nitro)\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 (options.prerender?.enabled !== false) {\n options.prerender = {\n ...options.prerender,\n enabled:\n options.prerender?.enabled ??\n options.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 (options.spa?.enabled) {\n options.prerender = {\n ...options.prerender,\n enabled: true,\n }\n\n const maskUrl = new URL(options.spa.maskPath, 'http://localhost')\n\n options.pages.push({\n path: maskUrl.toString().replace('http://localhost', ''),\n prerender: {\n ...options.spa.prerender,\n headers: {\n ...options.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 (options.prerender.enabled) {\n await prerender({\n options,\n nitro,\n builder,\n })\n }\n\n // Run the sitemap build process\n if (options.pages.length) {\n buildSitemap({\n options,\n publicDir: nitro.options.output.publicDir,\n })\n }\n\n // Build the nitro app\n // We only build the nitro app, once we've prepared the public assets,\n // prerendered the pages and built the sitemap.\n // If we try to do this earlier, then the public assets may not be available\n // in the production build.\n await build(nitro)\n\n // Close the nitro instance\n await nitro.close()\n nitro.logger.success(\n 'Client and Server bundles for TanStack Start have been successfully built.',\n )\n}\n\ntype NitroRollupPluginOption = NonNullable<\n NitroConfig['rollupConfig']\n>['plugins']\n\nfunction virtualBundlePlugin(\n ssrBundle: Rollup.OutputBundle,\n): NitroRollupPluginOption {\n type VirtualModule = { code: string; map: string | null }\n const _modules = new Map<string, VirtualModule>()\n\n // group chunks and source maps\n for (const [fileName, content] of Object.entries(ssrBundle)) {\n if (content.type === 'chunk') {\n const virtualModule: VirtualModule = {\n code: content.code,\n map: null,\n }\n const maybeMap = ssrBundle[`${fileName}.map`]\n if (maybeMap && maybeMap.type === 'asset') {\n virtualModule.map = maybeMap.source as string\n }\n _modules.set(fileName, virtualModule)\n _modules.set(resolve(fileName), virtualModule)\n }\n }\n\n return {\n name: 'virtual-bundle',\n resolveId(id, importer) {\n if (_modules.has(id)) {\n return resolve(id)\n }\n\n if (importer) {\n const resolved = resolve(dirname(importer), id)\n if (_modules.has(resolved)) {\n return resolved\n }\n }\n return null\n },\n load(id) {\n const m = _modules.get(id)\n if (!m) {\n return null\n }\n return m\n },\n }\n}\n"],"names":["VITE_ENVIRONMENT_NAMES","resolve","CLIENT_DIST_DIR","rmSync","SSR_ENTRY_FILE","createNitro","prepare","copyPublicAssets","_a","HEADERS","prerender","buildSitemap","build","dirname"],"mappings":"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"}
|
|
@@ -65,6 +65,7 @@ async function prerender({
|
|
|
65
65
|
const serverEntrypoint = node_url.pathToFileURL(
|
|
66
66
|
path.resolve(path.join(nodeNitro.options.output.serverDir, serverFilename))
|
|
67
67
|
).toString();
|
|
68
|
+
process.env.TSS_PRERENDERING = "true";
|
|
68
69
|
const { closePrerenderer, localFetch } = await import(serverEntrypoint);
|
|
69
70
|
try {
|
|
70
71
|
const pages = await prerenderPages();
|
|
@@ -118,12 +119,6 @@ async function prerender({
|
|
|
118
119
|
const retries = retriesByPath.get(page.path) || 0;
|
|
119
120
|
try {
|
|
120
121
|
const encodedRoute = encodeURI(page.path);
|
|
121
|
-
const originalEnv = { ...process.env };
|
|
122
|
-
process.env = {
|
|
123
|
-
...originalEnv,
|
|
124
|
-
TSS_PRERENDERING: "true",
|
|
125
|
-
...prerenderOptions.env || {}
|
|
126
|
-
};
|
|
127
122
|
const res = await localFetch(
|
|
128
123
|
ufo.withBase(encodedRoute, nodeNitro.options.baseURL),
|
|
129
124
|
{
|
|
@@ -133,7 +128,6 @@ async function prerender({
|
|
|
133
128
|
}
|
|
134
129
|
}
|
|
135
130
|
);
|
|
136
|
-
process.env = originalEnv;
|
|
137
131
|
if (!res.ok) {
|
|
138
132
|
throw new Error(`Failed to fetch ${page.path}: ${res.statusText}`, {
|
|
139
133
|
cause: res
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prerender.cjs","sources":["../../../src/nitro-plugin/prerender.ts"],"sourcesContent":["import { promises as fsp } from 'node:fs'\nimport { pathToFileURL } from 'node:url'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { getRollupConfig } from 'nitropack/rollup'\nimport { build as buildNitro, createNitro } from 'nitropack'\nimport { joinURL, withBase, withoutBase } from 'ufo'\nimport { VITE_ENVIRONMENT_NAMES } from '../constants'\nimport { createLogger } from '../utils'\nimport { Queue } from './queue'\nimport type { ViteBuilder } from 'vite'\nimport type { $Fetch, Nitro } from 'nitropack'\nimport type { TanStackStartOutputConfig } from '../plugin'\nimport type { Page } from '../schema'\n\nexport async function prerender({\n options,\n nitro,\n builder,\n}: {\n options: TanStackStartOutputConfig\n nitro: Nitro\n builder: ViteBuilder\n}) {\n const logger = createLogger('prerender')\n logger.info('Prerendering pages...')\n\n // If prerender is enabled but no pages are provided, default to prerendering the root page\n if (options.prerender?.enabled && !options.pages.length) {\n options.pages = [\n {\n path: '/',\n },\n ]\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 prerenderOutputDir = path.resolve(\n options.root,\n '.tanstack',\n 'start',\n 'build',\n 'prerenderer',\n )\n\n const nodeNitro = await createNitro({\n ...nitro.options._config,\n preset: 'nitro-prerender',\n logLevel: 0,\n output: {\n dir: prerenderOutputDir,\n serverDir: path.resolve(prerenderOutputDir, 'server'),\n publicDir: path.resolve(prerenderOutputDir, 'public'),\n },\n })\n\n const nodeNitroRollupOptions = getRollupConfig(nodeNitro)\n\n const build = serverEnv.config.build\n\n build.outDir = prerenderOutputDir\n\n build.rollupOptions = {\n ...build.rollupOptions,\n ...nodeNitroRollupOptions,\n output: {\n ...build.rollupOptions.output,\n ...nodeNitroRollupOptions.output,\n sourcemap: undefined,\n },\n }\n\n await buildNitro(nodeNitro)\n\n // Import renderer entry\n const serverFilename =\n typeof nodeNitroRollupOptions.output.entryFileNames === 'string'\n ? nodeNitroRollupOptions.output.entryFileNames\n : 'index.mjs'\n\n const serverEntrypoint = pathToFileURL(\n path.resolve(path.join(nodeNitro.options.output.serverDir, serverFilename)),\n ).toString()\n\n const { closePrerenderer, localFetch } = (await import(serverEntrypoint)) as {\n closePrerenderer: () => void\n localFetch: $Fetch\n }\n\n try {\n // Crawl all pages\n const pages = await prerenderPages()\n\n logger.info(`Prerendered ${pages.length} pages:`)\n pages.forEach((page) => {\n logger.info(`- ${page}`)\n })\n\n // TODO: Write the prerendered pages to the output directory\n } catch (error) {\n logger.error(error)\n } finally {\n // Ensure server is always closed\n // server.process.kill()\n closePrerenderer()\n }\n\n function extractLinks(html: string): Array<string> {\n const linkRegex = /<a[^>]+href=[\"']([^\"']+)[\"'][^>]*>/g\n const links: Array<string> = []\n let match\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() {\n const seen = new Set<string>()\n const retriesByPath = new Map<string, number>()\n const concurrency = options.prerender?.concurrency ?? os.cpus().length\n logger.info(`Concurrency: ${concurrency}`)\n const queue = new Queue({ concurrency })\n\n options.pages.forEach((page) => addCrawlPageTask(page))\n\n await queue.start()\n\n return Array.from(seen)\n\n function addCrawlPageTask(page: Page) {\n // Was the page already seen?\n if (seen.has(page.path)) return\n\n // Add the page to the seen set\n seen.add(page.path)\n\n if (page.fromCrawl) {\n options.pages.push(page)\n }\n\n // If not enabled, skip\n if (!(page.prerender?.enabled ?? true)) return\n\n // If there is a filter link, check if the page should be prerendered\n if (options.prerender?.filter && !options.prerender.filter(page)) return\n\n // Resolve the merged default and page-specific prerender options\n const prerenderOptions = {\n ...options.prerender,\n ...page.prerender,\n }\n\n // Add the task\n queue.add(async () => {\n logger.info(`Crawling: ${page.path}`)\n const retries = retriesByPath.get(page.path) || 0\n try {\n // Fetch the route\n const encodedRoute = encodeURI(page.path)\n\n const originalEnv = { ...process.env }\n\n process.env = {\n ...originalEnv,\n TSS_PRERENDERING: 'true',\n ...(prerenderOptions.env || {}),\n }\n const res = await localFetch<Response>(\n withBase(encodedRoute, nodeNitro.options.baseURL),\n {\n headers: {\n ...prerenderOptions.headers,\n 'x-nitro-prerender': encodedRoute,\n },\n },\n )\n process.env = originalEnv\n if (!res.ok) {\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 // Guess route type and populate fileName\n const contentType = res.headers.get('content-type') || ''\n const isImplicitHTML =\n !cleanPagePath.endsWith('.html') && contentType.includes('html')\n // &&\n // !JsonSigRx.test(dataBuff.subarray(0, 32).toString('utf8'))\n const routeWithIndex = cleanPagePath.endsWith('/')\n ? cleanPagePath + 'index'\n : cleanPagePath\n\n const htmlPath =\n cleanPagePath.endsWith('/') || prerenderOptions.autoSubfolderIndex\n ? joinURL(cleanPagePath, 'index.html')\n : cleanPagePath + '.html'\n\n const filename = withoutBase(\n isImplicitHTML ? htmlPath : routeWithIndex,\n nitro.options.baseURL,\n )\n\n const html = await res.text()\n\n const filepath = path.join(nitro.options.output.publicDir, filename)\n\n await fsp.mkdir(path.dirname(filepath), {\n recursive: true,\n })\n\n await fsp.writeFile(filepath, html)\n\n const newPage = await prerenderOptions.onSuccess?.({ page, html })\n\n if (newPage) {\n Object.assign(page, newPage)\n }\n\n // Find new links\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 {\n throw error\n }\n }\n })\n }\n }\n}\n"],"names":["createLogger","VITE_ENVIRONMENT_NAMES","createNitro","getRollupConfig","buildNitro","pathToFileURL","_a","queue","Queue","withBase","joinURL","withoutBase","fsp"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"prerender.cjs","sources":["../../../src/nitro-plugin/prerender.ts"],"sourcesContent":["import { promises as fsp } from 'node:fs'\nimport { pathToFileURL } from 'node:url'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { getRollupConfig } from 'nitropack/rollup'\nimport { build as buildNitro, createNitro } from 'nitropack'\nimport { joinURL, withBase, withoutBase } from 'ufo'\nimport { VITE_ENVIRONMENT_NAMES } from '../constants'\nimport { createLogger } from '../utils'\nimport { Queue } from './queue'\nimport type { ViteBuilder } from 'vite'\nimport type { $Fetch, Nitro } from 'nitropack'\nimport type { TanStackStartOutputConfig } from '../plugin'\nimport type { Page } from '../schema'\n\nexport async function prerender({\n options,\n nitro,\n builder,\n}: {\n options: TanStackStartOutputConfig\n nitro: Nitro\n builder: ViteBuilder\n}) {\n const logger = createLogger('prerender')\n logger.info('Prerendering pages...')\n\n // If prerender is enabled but no pages are provided, default to prerendering the root page\n if (options.prerender?.enabled && !options.pages.length) {\n options.pages = [\n {\n path: '/',\n },\n ]\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 prerenderOutputDir = path.resolve(\n options.root,\n '.tanstack',\n 'start',\n 'build',\n 'prerenderer',\n )\n\n const nodeNitro = await createNitro({\n ...nitro.options._config,\n preset: 'nitro-prerender',\n logLevel: 0,\n output: {\n dir: prerenderOutputDir,\n serverDir: path.resolve(prerenderOutputDir, 'server'),\n publicDir: path.resolve(prerenderOutputDir, 'public'),\n },\n })\n\n const nodeNitroRollupOptions = getRollupConfig(nodeNitro)\n\n const build = serverEnv.config.build\n\n build.outDir = prerenderOutputDir\n\n build.rollupOptions = {\n ...build.rollupOptions,\n ...nodeNitroRollupOptions,\n output: {\n ...build.rollupOptions.output,\n ...nodeNitroRollupOptions.output,\n sourcemap: undefined,\n },\n }\n\n await buildNitro(nodeNitro)\n\n // Import renderer entry\n const serverFilename =\n typeof nodeNitroRollupOptions.output.entryFileNames === 'string'\n ? nodeNitroRollupOptions.output.entryFileNames\n : 'index.mjs'\n\n const serverEntrypoint = pathToFileURL(\n path.resolve(path.join(nodeNitro.options.output.serverDir, serverFilename)),\n ).toString()\n\n process.env.TSS_PRERENDERING = 'true'\n\n const { closePrerenderer, localFetch } = (await import(serverEntrypoint)) as {\n closePrerenderer: () => void\n localFetch: $Fetch\n }\n\n try {\n // Crawl all pages\n const pages = await prerenderPages()\n\n logger.info(`Prerendered ${pages.length} pages:`)\n pages.forEach((page) => {\n logger.info(`- ${page}`)\n })\n\n // TODO: Write the prerendered pages to the output directory\n } catch (error) {\n logger.error(error)\n } finally {\n // Ensure server is always closed\n // server.process.kill()\n closePrerenderer()\n }\n\n function extractLinks(html: string): Array<string> {\n const linkRegex = /<a[^>]+href=[\"']([^\"']+)[\"'][^>]*>/g\n const links: Array<string> = []\n let match\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() {\n const seen = new Set<string>()\n const retriesByPath = new Map<string, number>()\n const concurrency = options.prerender?.concurrency ?? os.cpus().length\n logger.info(`Concurrency: ${concurrency}`)\n const queue = new Queue({ concurrency })\n\n options.pages.forEach((page) => addCrawlPageTask(page))\n\n await queue.start()\n\n return Array.from(seen)\n\n function addCrawlPageTask(page: Page) {\n // Was the page already seen?\n if (seen.has(page.path)) return\n\n // Add the page to the seen set\n seen.add(page.path)\n\n if (page.fromCrawl) {\n options.pages.push(page)\n }\n\n // If not enabled, skip\n if (!(page.prerender?.enabled ?? true)) return\n\n // If there is a filter link, check if the page should be prerendered\n if (options.prerender?.filter && !options.prerender.filter(page)) return\n\n // Resolve the merged default and page-specific prerender options\n const prerenderOptions = {\n ...options.prerender,\n ...page.prerender,\n }\n\n // Add the task\n queue.add(async () => {\n logger.info(`Crawling: ${page.path}`)\n const retries = retriesByPath.get(page.path) || 0\n try {\n // Fetch the route\n const encodedRoute = encodeURI(page.path)\n\n const res = await localFetch<Response>(\n withBase(encodedRoute, nodeNitro.options.baseURL),\n {\n headers: {\n ...prerenderOptions.headers,\n 'x-nitro-prerender': encodedRoute,\n },\n },\n )\n\n if (!res.ok) {\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 // Guess route type and populate fileName\n const contentType = res.headers.get('content-type') || ''\n const isImplicitHTML =\n !cleanPagePath.endsWith('.html') && contentType.includes('html')\n // &&\n // !JsonSigRx.test(dataBuff.subarray(0, 32).toString('utf8'))\n const routeWithIndex = cleanPagePath.endsWith('/')\n ? cleanPagePath + 'index'\n : cleanPagePath\n\n const htmlPath =\n cleanPagePath.endsWith('/') || prerenderOptions.autoSubfolderIndex\n ? joinURL(cleanPagePath, 'index.html')\n : cleanPagePath + '.html'\n\n const filename = withoutBase(\n isImplicitHTML ? htmlPath : routeWithIndex,\n nitro.options.baseURL,\n )\n\n const html = await res.text()\n\n const filepath = path.join(nitro.options.output.publicDir, filename)\n\n await fsp.mkdir(path.dirname(filepath), {\n recursive: true,\n })\n\n await fsp.writeFile(filepath, html)\n\n const newPage = await prerenderOptions.onSuccess?.({ page, html })\n\n if (newPage) {\n Object.assign(page, newPage)\n }\n\n // Find new links\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 {\n throw error\n }\n }\n })\n }\n }\n}\n"],"names":["createLogger","VITE_ENVIRONMENT_NAMES","createNitro","getRollupConfig","buildNitro","pathToFileURL","_a","queue","Queue","withBase","joinURL","withoutBase","fsp"],"mappings":";;;;;;;;;;;;AAeA,eAAsB,UAAU;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,GAIG;;AACK,QAAA,SAASA,mBAAa,WAAW;AACvC,SAAO,KAAK,uBAAuB;AAGnC,QAAI,aAAQ,cAAR,mBAAmB,YAAW,CAAC,QAAQ,MAAM,QAAQ;AACvD,YAAQ,QAAQ;AAAA,MACd;AAAA,QACE,MAAM;AAAA,MAAA;AAAA,IAEV;AAAA,EAAA;AAGF,QAAM,YAAY,QAAQ,aAAaC,UAAAA,uBAAuB,MAAM;AAEpE,MAAI,CAAC,WAAW;AACd,UAAM,IAAI;AAAA,MACR,WAAWA,iCAAuB,MAAM;AAAA,IAC1C;AAAA,EAAA;AAGF,QAAM,qBAAqB,KAAK;AAAA,IAC9B,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEM,QAAA,YAAY,MAAMC,sBAAY;AAAA,IAClC,GAAG,MAAM,QAAQ;AAAA,IACjB,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,QAAQ;AAAA,MACN,KAAK;AAAA,MACL,WAAW,KAAK,QAAQ,oBAAoB,QAAQ;AAAA,MACpD,WAAW,KAAK,QAAQ,oBAAoB,QAAQ;AAAA,IAAA;AAAA,EACtD,CACD;AAEK,QAAA,yBAAyBC,uBAAgB,SAAS;AAElD,QAAA,QAAQ,UAAU,OAAO;AAE/B,QAAM,SAAS;AAEf,QAAM,gBAAgB;AAAA,IACpB,GAAG,MAAM;AAAA,IACT,GAAG;AAAA,IACH,QAAQ;AAAA,MACN,GAAG,MAAM,cAAc;AAAA,MACvB,GAAG,uBAAuB;AAAA,MAC1B,WAAW;AAAA,IAAA;AAAA,EAEf;AAEA,QAAMC,UAAAA,MAAW,SAAS;AAGpB,QAAA,iBACJ,OAAO,uBAAuB,OAAO,mBAAmB,WACpD,uBAAuB,OAAO,iBAC9B;AAEN,QAAM,mBAAmBC,SAAA;AAAA,IACvB,KAAK,QAAQ,KAAK,KAAK,UAAU,QAAQ,OAAO,WAAW,cAAc,CAAC;AAAA,IAC1E,SAAS;AAEX,UAAQ,IAAI,mBAAmB;AAE/B,QAAM,EAAE,kBAAkB,eAAgB,MAAM,OAAO;AAKnD,MAAA;AAEI,UAAA,QAAQ,MAAM,eAAe;AAEnC,WAAO,KAAK,eAAe,MAAM,MAAM,SAAS;AAC1C,UAAA,QAAQ,CAAC,SAAS;AACf,aAAA,KAAK,KAAK,IAAI,EAAE;AAAA,IAAA,CACxB;AAAA,WAGM,OAAO;AACd,WAAO,MAAM,KAAK;AAAA,EAAA,UAClB;AAGiB,qBAAA;AAAA,EAAA;AAGnB,WAAS,aAAa,MAA6B;AACjD,UAAM,YAAY;AAClB,UAAM,QAAuB,CAAC;AAC1B,QAAA;AAEJ,YAAQ,QAAQ,UAAU,KAAK,IAAI,OAAO,MAAM;AACxC,YAAA,OAAO,MAAM,CAAC;AAChB,UAAA,SAAS,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,IAAI,IAAI;AAC3D,cAAM,KAAK,IAAI;AAAA,MAAA;AAAA,IACjB;AAGK,WAAA;AAAA,EAAA;AAGT,iBAAe,iBAAiB;;AACxB,UAAA,2BAAW,IAAY;AACvB,UAAA,oCAAoB,IAAoB;AAC9C,UAAM,gBAAcC,MAAA,QAAQ,cAAR,gBAAAA,IAAmB,gBAAe,GAAG,OAAO;AACzD,WAAA,KAAK,gBAAgB,WAAW,EAAE;AACzC,UAAMC,UAAQ,IAAIC,YAAM,EAAE,aAAa;AAEvC,YAAQ,MAAM,QAAQ,CAAC,SAAS,iBAAiB,IAAI,CAAC;AAEtD,UAAMD,QAAM,MAAM;AAEX,WAAA,MAAM,KAAK,IAAI;AAEtB,aAAS,iBAAiB,MAAY;;AAEpC,UAAI,KAAK,IAAI,KAAK,IAAI,EAAG;AAGpB,WAAA,IAAI,KAAK,IAAI;AAElB,UAAI,KAAK,WAAW;AACV,gBAAA,MAAM,KAAK,IAAI;AAAA,MAAA;AAIzB,UAAI,IAAED,MAAA,KAAK,cAAL,gBAAAA,IAAgB,YAAW,MAAO;AAGpC,YAAA,aAAQ,cAAR,mBAAmB,WAAU,CAAC,QAAQ,UAAU,OAAO,IAAI,EAAG;AAGlE,YAAM,mBAAmB;AAAA,QACvB,GAAG,QAAQ;AAAA,QACX,GAAG,KAAK;AAAA,MACV;AAGAC,cAAM,IAAI,YAAY;;AACpB,eAAO,KAAK,aAAa,KAAK,IAAI,EAAE;AACpC,cAAM,UAAU,cAAc,IAAI,KAAK,IAAI,KAAK;AAC5C,YAAA;AAEI,gBAAA,eAAe,UAAU,KAAK,IAAI;AAExC,gBAAM,MAAM,MAAM;AAAA,YAChBE,IAAAA,SAAS,cAAc,UAAU,QAAQ,OAAO;AAAA,YAChD;AAAA,cACE,SAAS;AAAA,gBACP,GAAG,iBAAiB;AAAA,gBACpB,qBAAqB;AAAA,cAAA;AAAA,YACvB;AAAA,UAEJ;AAEI,cAAA,CAAC,IAAI,IAAI;AACL,kBAAA,IAAI,MAAM,mBAAmB,KAAK,IAAI,KAAK,IAAI,UAAU,IAAI;AAAA,cACjE,OAAO;AAAA,YAAA,CACR;AAAA,UAAA;AAGG,gBAAA,iBACJ,iBAAiB,cAAc,KAAK,MACpC,MAAM,MAAM,EAAE,CAAC;AAGjB,gBAAM,cAAc,IAAI,QAAQ,IAAI,cAAc,KAAK;AACjD,gBAAA,iBACJ,CAAC,cAAc,SAAS,OAAO,KAAK,YAAY,SAAS,MAAM;AAGjE,gBAAM,iBAAiB,cAAc,SAAS,GAAG,IAC7C,gBAAgB,UAChB;AAEE,gBAAA,WACJ,cAAc,SAAS,GAAG,KAAK,iBAAiB,qBAC5CC,IAAQ,QAAA,eAAe,YAAY,IACnC,gBAAgB;AAEtB,gBAAM,WAAWC,IAAA;AAAA,YACf,iBAAiB,WAAW;AAAA,YAC5B,MAAM,QAAQ;AAAA,UAChB;AAEM,gBAAA,OAAO,MAAM,IAAI,KAAK;AAE5B,gBAAM,WAAW,KAAK,KAAK,MAAM,QAAQ,OAAO,WAAW,QAAQ;AAEnE,gBAAMC,QAAI,SAAA,MAAM,KAAK,QAAQ,QAAQ,GAAG;AAAA,YACtC,WAAW;AAAA,UAAA,CACZ;AAEK,gBAAAA,iBAAI,UAAU,UAAU,IAAI;AAElC,gBAAM,UAAU,QAAMN,MAAA,iBAAiB,cAAjB,gBAAAA,IAAA,uBAA6B,EAAE,MAAM;AAE3D,cAAI,SAAS;AACJ,mBAAA,OAAO,MAAM,OAAO;AAAA,UAAA;AAIzB,cAAA,iBAAiB,cAAc,MAAM;AACjC,kBAAA,QAAQ,aAAa,IAAI;AAC/B,uBAAW,QAAQ,OAAO;AACxB,+BAAiB,EAAE,MAAM,MAAM,WAAW,MAAM;AAAA,YAAA;AAAA,UAClD;AAAA,iBAEK,OAAO;AACV,cAAA,WAAW,iBAAiB,cAAc,IAAI;AAChD,mBAAO,KAAK,gCAAgC,KAAK,IAAI,WAAW;AAChE,kBAAM,IAAI;AAAA,cAAQ,CAAC,YACjB,WAAW,SAAS,iBAAiB,UAAU;AAAA,YACjD;AACA,0BAAc,IAAI,KAAK,MAAM,UAAU,CAAC;AACxC,6BAAiB,IAAI;AAAA,UAAA,OAChB;AACC,kBAAA;AAAA,UAAA;AAAA,QACR;AAAA,MACF,CACD;AAAA,IAAA;AAAA,EACH;AAEJ;;"}
|
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: {
|
|
@@ -125,7 +164,7 @@ function TanStackStartVitePluginCore(opts, startConfig) {
|
|
|
125
164
|
...defineReplaceEnv("TSS_SERVER_FN_BASE", startConfig.serverFns.base),
|
|
126
165
|
...defineReplaceEnv("TSS_OUTPUT_PUBLIC_DIR", nitroOutputPublicDir),
|
|
127
166
|
...defineReplaceEnv("TSS_APP_BASE", viteAppBase),
|
|
128
|
-
...command === "serve" ? defineReplaceEnv("
|
|
167
|
+
...command === "serve" ? defineReplaceEnv("TSS_SHELL", ((_a = startConfig.spa) == null ? void 0 : _a.enabled) ? "true" : "false") : {}
|
|
129
168
|
}
|
|
130
169
|
};
|
|
131
170
|
}
|
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_SPA_MODE', 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
|
@@ -93,7 +93,6 @@ export declare function getTanStackStartOptions(opts?: TanStackStartInputConfig)
|
|
|
93
93
|
html: string;
|
|
94
94
|
}, ...args: unknown[]) => any) | undefined;
|
|
95
95
|
headers?: Record<string, string> | undefined;
|
|
96
|
-
env?: Record<string, string> | undefined;
|
|
97
96
|
} | undefined;
|
|
98
97
|
sitemap?: {
|
|
99
98
|
exclude?: boolean | undefined;
|
|
@@ -162,7 +161,6 @@ export declare function getTanStackStartOptions(opts?: TanStackStartInputConfig)
|
|
|
162
161
|
html: string;
|
|
163
162
|
}, ...args: unknown[]) => any) | undefined;
|
|
164
163
|
headers?: Record<string, string> | undefined;
|
|
165
|
-
env?: Record<string, string> | undefined;
|
|
166
164
|
} | undefined;
|
|
167
165
|
sitemap?: {
|
|
168
166
|
exclude?: boolean | undefined;
|
|
@@ -230,7 +228,6 @@ export declare function getTanStackStartOptions(opts?: TanStackStartInputConfig)
|
|
|
230
228
|
html: string;
|
|
231
229
|
}, ...args: unknown[]) => any) | undefined;
|
|
232
230
|
headers?: Record<string, string> | undefined;
|
|
233
|
-
env?: Record<string, string> | undefined;
|
|
234
231
|
}) | undefined;
|
|
235
232
|
sitemap?: {
|
|
236
233
|
enabled: boolean;
|
|
@@ -276,7 +273,6 @@ export declare function getTanStackStartOptions(opts?: TanStackStartInputConfig)
|
|
|
276
273
|
html: string;
|
|
277
274
|
}, ...args: unknown[]) => any) | undefined;
|
|
278
275
|
headers?: Record<string, string> | undefined;
|
|
279
|
-
env?: Record<string, string> | undefined;
|
|
280
276
|
};
|
|
281
277
|
enabled: boolean;
|
|
282
278
|
maskPath: string;
|
|
@@ -295,5 +291,9 @@ export interface TanStackStartVitePluginCoreOptions {
|
|
|
295
291
|
getVirtualClientEntry: (ctx: {
|
|
296
292
|
routerFilepath: string;
|
|
297
293
|
}) => string;
|
|
294
|
+
crawlPackages?: (opts: {
|
|
295
|
+
name: string;
|
|
296
|
+
peerDependencies: Record<string, any>;
|
|
297
|
+
}) => 'include' | 'exclude' | undefined;
|
|
298
298
|
}
|
|
299
299
|
export declare function TanStackStartVitePluginCore(opts: TanStackStartVitePluginCoreOptions, startConfig: TanStackStartOutputConfig): Array<PluginOption>;
|
package/dist/cjs/schema.cjs
CHANGED
|
@@ -136,8 +136,7 @@ const pagePrerenderOptionsSchema = zod.z.object({
|
|
|
136
136
|
html: zod.z.string()
|
|
137
137
|
})
|
|
138
138
|
).returns(zod.z.any()).optional(),
|
|
139
|
-
headers: zod.z.record(zod.z.string(), zod.z.string()).optional()
|
|
140
|
-
env: zod.z.record(zod.z.string(), zod.z.string()).optional()
|
|
139
|
+
headers: zod.z.record(zod.z.string(), zod.z.string()).optional()
|
|
141
140
|
});
|
|
142
141
|
const spaSchema = zod.z.object({
|
|
143
142
|
enabled: zod.z.boolean().optional().default(true),
|
package/dist/cjs/schema.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.cjs","sources":["../../src/schema.ts"],"sourcesContent":["import path from 'node:path'\nimport { existsSync } from 'node:fs'\nimport { z } from 'zod'\nimport { configSchema, getConfig } from '@tanstack/router-generator'\nimport type { NitroConfig } from 'nitropack'\n\nconst tsrConfig = configSchema\n .omit({ autoCodeSplitting: true })\n .partial()\n .extend({\n srcDirectory: z.string().optional().default('src'),\n })\n\nexport function createTanStackConfig<\n TFrameworkPlugin extends Record<string, unknown>,\n>(frameworkPlugin?: TFrameworkPlugin) {\n const schema = createTanStackStartOptionsSchema(frameworkPlugin)\n\n return {\n schema,\n parse: (opts?: z.input<typeof schema>) => {\n const options = schema.parse(opts)\n\n const srcDirectory = options.tsr.srcDirectory\n\n const routesDirectory =\n options.tsr.routesDirectory ?? path.join(srcDirectory, 'routes')\n\n const generatedRouteTree =\n options.tsr.generatedRouteTree ??\n path.join(srcDirectory, 'routeTree.gen.ts')\n\n const clientEntryPath = (() => {\n if (options.client.entry) {\n return path.join(srcDirectory, options.client.entry)\n }\n\n if (existsSync(path.join(srcDirectory, 'client.tsx'))) {\n return path.join(srcDirectory, 'client.tsx')\n }\n\n return '/~start/default-client-entry'\n })()\n\n const serverEntryPath = (() => {\n if (options.server.entry) {\n return path.join(srcDirectory, options.server.entry)\n }\n\n if (existsSync(path.join(srcDirectory, 'server.tsx'))) {\n return path.join(srcDirectory, 'server.tsx')\n }\n\n if (existsSync(path.join(srcDirectory, 'server.ts'))) {\n return path.join(srcDirectory, 'server.ts')\n }\n\n if (existsSync(path.join(srcDirectory, 'server.js'))) {\n return path.join(srcDirectory, 'server.js')\n }\n\n return '/~start/default-server-entry'\n })()\n\n return {\n ...options,\n tsr: {\n ...options.tsr,\n ...getConfig({\n ...options.tsr,\n routesDirectory,\n generatedRouteTree,\n }),\n },\n clientEntryPath,\n serverEntryPath,\n }\n },\n }\n}\n\nexport function createTanStackStartOptionsSchema(\n frameworkPlugin: Record<string, unknown> = {},\n) {\n return z\n .object({\n root: z.string().optional().default(process.cwd()),\n target: z.custom<NitroConfig['preset']>().optional(),\n ...frameworkPlugin,\n tsr: tsrConfig.optional().default({}),\n client: z\n .object({\n entry: z.string().optional(),\n base: z.string().optional().default('/_build'),\n })\n .optional()\n .default({}),\n server: z\n .object({\n entry: z.string().optional(),\n })\n .optional()\n .default({}),\n serverFns: z\n .object({\n base: z.string().optional().default('/_serverFn'),\n })\n .optional()\n .default({}),\n public: z\n .object({\n dir: z.string().optional().default('public'),\n base: z.string().optional().default('/'),\n })\n .optional()\n .default({}),\n pages: z.array(pageSchema).optional().default([]),\n sitemap: z\n .object({\n enabled: z.boolean().optional().default(true),\n host: z.string().optional(),\n outputPath: z.string().optional().default('sitemap.xml'),\n })\n .optional(),\n prerender: z\n .object({\n enabled: z.boolean().optional(),\n concurrency: z.number().optional(),\n filter: z.function().args(pageSchema).returns(z.any()).optional(),\n failOnError: z.boolean().optional(),\n })\n .and(pagePrerenderOptionsSchema.optional())\n .optional(),\n spa: spaSchema.optional(),\n })\n .optional()\n .default({})\n}\n\nconst pageSitemapOptionsSchema = z.object({\n exclude: z.boolean().optional(),\n priority: z.number().min(0).max(1).optional(),\n changefreq: z\n .enum(['always', 'hourly', 'daily', 'weekly', 'monthly', 'yearly', 'never'])\n .optional(),\n lastmod: z.union([z.string(), z.date()]).optional(),\n alternateRefs: z\n .array(\n z.object({\n href: z.string(),\n hreflang: z.string(),\n }),\n )\n .optional(),\n images: z\n .array(\n z.object({\n loc: z.string(),\n caption: z.string().optional(),\n title: z.string().optional(),\n }),\n )\n .optional(),\n news: z\n .object({\n publication: z.object({\n name: z.string(),\n language: z.string(),\n }),\n publicationDate: z.union([z.string(), z.date()]),\n title: z.string(),\n })\n .optional(),\n})\n\nconst pageBaseSchema = z.object({\n path: z.string(),\n sitemap: pageSitemapOptionsSchema.optional(),\n fromCrawl: z.boolean().optional(),\n})\n\nconst pagePrerenderOptionsSchema = z.object({\n enabled: z.boolean().optional(),\n outputPath: z.string().optional(),\n autoSubfolderIndex: z.boolean().optional(),\n crawlLinks: z.boolean().optional(),\n retryCount: z.number().optional(),\n retryDelay: z.number().optional(),\n onSuccess: z\n .function()\n .args(\n z.object({\n page: pageBaseSchema,\n html: z.string(),\n }),\n )\n .returns(z.any())\n .optional(),\n headers: z.record(z.string(), z.string()).optional(),\n env: z.record(z.string(), z.string()).optional(),\n})\n\nconst spaSchema = z.object({\n enabled: z.boolean().optional().default(true),\n maskPath: z.string().optional().default('/'),\n prerender: pagePrerenderOptionsSchema\n .optional()\n .default({})\n .transform((opts) => ({\n outputPath: opts.outputPath ?? '/_shell',\n crawlLinks: false,\n retryCount: 0,\n ...opts,\n enabled: true,\n })),\n})\n\nexport const pageSchema = pageBaseSchema.extend({\n prerender: pagePrerenderOptionsSchema.optional(),\n})\n\nexport type Page = z.infer<typeof pageSchema>\n"],"names":["configSchema","z","existsSync","getConfig"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schema.cjs","sources":["../../src/schema.ts"],"sourcesContent":["import path from 'node:path'\nimport { existsSync } from 'node:fs'\nimport { z } from 'zod'\nimport { configSchema, getConfig } from '@tanstack/router-generator'\nimport type { NitroConfig } from 'nitropack'\n\nconst tsrConfig = configSchema\n .omit({ autoCodeSplitting: true })\n .partial()\n .extend({\n srcDirectory: z.string().optional().default('src'),\n })\n\nexport function createTanStackConfig<\n TFrameworkPlugin extends Record<string, unknown>,\n>(frameworkPlugin?: TFrameworkPlugin) {\n const schema = createTanStackStartOptionsSchema(frameworkPlugin)\n\n return {\n schema,\n parse: (opts?: z.input<typeof schema>) => {\n const options = schema.parse(opts)\n\n const srcDirectory = options.tsr.srcDirectory\n\n const routesDirectory =\n options.tsr.routesDirectory ?? path.join(srcDirectory, 'routes')\n\n const generatedRouteTree =\n options.tsr.generatedRouteTree ??\n path.join(srcDirectory, 'routeTree.gen.ts')\n\n const clientEntryPath = (() => {\n if (options.client.entry) {\n return path.join(srcDirectory, options.client.entry)\n }\n\n if (existsSync(path.join(srcDirectory, 'client.tsx'))) {\n return path.join(srcDirectory, 'client.tsx')\n }\n\n return '/~start/default-client-entry'\n })()\n\n const serverEntryPath = (() => {\n if (options.server.entry) {\n return path.join(srcDirectory, options.server.entry)\n }\n\n if (existsSync(path.join(srcDirectory, 'server.tsx'))) {\n return path.join(srcDirectory, 'server.tsx')\n }\n\n if (existsSync(path.join(srcDirectory, 'server.ts'))) {\n return path.join(srcDirectory, 'server.ts')\n }\n\n if (existsSync(path.join(srcDirectory, 'server.js'))) {\n return path.join(srcDirectory, 'server.js')\n }\n\n return '/~start/default-server-entry'\n })()\n\n return {\n ...options,\n tsr: {\n ...options.tsr,\n ...getConfig({\n ...options.tsr,\n routesDirectory,\n generatedRouteTree,\n }),\n },\n clientEntryPath,\n serverEntryPath,\n }\n },\n }\n}\n\nexport function createTanStackStartOptionsSchema(\n frameworkPlugin: Record<string, unknown> = {},\n) {\n return z\n .object({\n root: z.string().optional().default(process.cwd()),\n target: z.custom<NitroConfig['preset']>().optional(),\n ...frameworkPlugin,\n tsr: tsrConfig.optional().default({}),\n client: z\n .object({\n entry: z.string().optional(),\n base: z.string().optional().default('/_build'),\n })\n .optional()\n .default({}),\n server: z\n .object({\n entry: z.string().optional(),\n })\n .optional()\n .default({}),\n serverFns: z\n .object({\n base: z.string().optional().default('/_serverFn'),\n })\n .optional()\n .default({}),\n public: z\n .object({\n dir: z.string().optional().default('public'),\n base: z.string().optional().default('/'),\n })\n .optional()\n .default({}),\n pages: z.array(pageSchema).optional().default([]),\n sitemap: z\n .object({\n enabled: z.boolean().optional().default(true),\n host: z.string().optional(),\n outputPath: z.string().optional().default('sitemap.xml'),\n })\n .optional(),\n prerender: z\n .object({\n enabled: z.boolean().optional(),\n concurrency: z.number().optional(),\n filter: z.function().args(pageSchema).returns(z.any()).optional(),\n failOnError: z.boolean().optional(),\n })\n .and(pagePrerenderOptionsSchema.optional())\n .optional(),\n spa: spaSchema.optional(),\n })\n .optional()\n .default({})\n}\n\nconst pageSitemapOptionsSchema = z.object({\n exclude: z.boolean().optional(),\n priority: z.number().min(0).max(1).optional(),\n changefreq: z\n .enum(['always', 'hourly', 'daily', 'weekly', 'monthly', 'yearly', 'never'])\n .optional(),\n lastmod: z.union([z.string(), z.date()]).optional(),\n alternateRefs: z\n .array(\n z.object({\n href: z.string(),\n hreflang: z.string(),\n }),\n )\n .optional(),\n images: z\n .array(\n z.object({\n loc: z.string(),\n caption: z.string().optional(),\n title: z.string().optional(),\n }),\n )\n .optional(),\n news: z\n .object({\n publication: z.object({\n name: z.string(),\n language: z.string(),\n }),\n publicationDate: z.union([z.string(), z.date()]),\n title: z.string(),\n })\n .optional(),\n})\n\nconst pageBaseSchema = z.object({\n path: z.string(),\n sitemap: pageSitemapOptionsSchema.optional(),\n fromCrawl: z.boolean().optional(),\n})\n\nconst pagePrerenderOptionsSchema = z.object({\n enabled: z.boolean().optional(),\n outputPath: z.string().optional(),\n autoSubfolderIndex: z.boolean().optional(),\n crawlLinks: z.boolean().optional(),\n retryCount: z.number().optional(),\n retryDelay: z.number().optional(),\n onSuccess: z\n .function()\n .args(\n z.object({\n page: pageBaseSchema,\n html: z.string(),\n }),\n )\n .returns(z.any())\n .optional(),\n headers: z.record(z.string(), z.string()).optional(),\n})\n\nconst spaSchema = z.object({\n enabled: z.boolean().optional().default(true),\n maskPath: z.string().optional().default('/'),\n prerender: pagePrerenderOptionsSchema\n .optional()\n .default({})\n .transform((opts) => ({\n outputPath: opts.outputPath ?? '/_shell',\n crawlLinks: false,\n retryCount: 0,\n ...opts,\n enabled: true,\n })),\n})\n\nexport const pageSchema = pageBaseSchema.extend({\n prerender: pagePrerenderOptionsSchema.optional(),\n})\n\nexport type Page = z.infer<typeof pageSchema>\n"],"names":["configSchema","z","existsSync","getConfig"],"mappings":"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"}
|