@tanstack/start-plugin-core 1.120.4-alpha.19 → 1.120.4-alpha.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/nitro/nitro-plugin.cjs +3 -3
- package/dist/cjs/nitro/nitro-plugin.cjs.map +1 -1
- package/dist/cjs/plugin.d.cts +4 -4
- package/dist/cjs/prerender.cjs +0 -8
- package/dist/cjs/prerender.cjs.map +1 -1
- package/dist/cjs/schema.cjs +3 -3
- package/dist/cjs/schema.cjs.map +1 -1
- package/dist/cjs/schema.d.cts +10 -10
- package/dist/esm/nitro/nitro-plugin.js +3 -3
- package/dist/esm/nitro/nitro-plugin.js.map +1 -1
- package/dist/esm/plugin.d.ts +4 -4
- package/dist/esm/prerender.js +0 -8
- package/dist/esm/prerender.js.map +1 -1
- package/dist/esm/schema.d.ts +10 -10
- package/dist/esm/schema.js +3 -3
- package/dist/esm/schema.js.map +1 -1
- package/package.json +4 -4
- package/src/nitro/nitro-plugin.ts +3 -3
- package/src/prerender.ts +0 -8
- package/src/schema.ts +3 -3
|
@@ -72,19 +72,19 @@ function nitroPlugin(options, getSsrBundle) {
|
|
|
72
72
|
};
|
|
73
73
|
const nitro = await nitropack.createNitro(nitroConfig);
|
|
74
74
|
await buildNitro.buildNitroEnvironment(nitro, () => nitropack.build(nitro));
|
|
75
|
-
if ((_a = options.
|
|
75
|
+
if ((_a = options.spa) == null ? void 0 : _a.enabled) {
|
|
76
76
|
options.prerender = {
|
|
77
77
|
...options.prerender,
|
|
78
78
|
enabled: true
|
|
79
79
|
};
|
|
80
80
|
const maskUrl = new URL(
|
|
81
|
-
options.
|
|
81
|
+
options.spa.maskPath,
|
|
82
82
|
"http://localhost"
|
|
83
83
|
);
|
|
84
84
|
maskUrl.searchParams.set("__TSS_SHELL", "true");
|
|
85
85
|
options.pages.push({
|
|
86
86
|
path: maskUrl.toString().replace("http://localhost", ""),
|
|
87
|
-
prerender: options.
|
|
87
|
+
prerender: options.spa.prerender,
|
|
88
88
|
sitemap: {
|
|
89
89
|
exclude: true
|
|
90
90
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nitro-plugin.cjs","sources":["../../../src/nitro/nitro-plugin.ts"],"sourcesContent":["import path from 'node:path'\nimport { rmSync } from 'node:fs'\nimport { build, createNitro } from 'nitropack'\nimport { dirname, resolve } from 'pathe'\nimport { clientDistDir, ssrEntryFile } from '../plugin'\nimport { prerender } from '../prerender'\nimport { VITE_ENVIRONMENT_NAMES } from '../constants'\nimport { devServerPlugin } from './dev-server-plugin'\nimport { buildNitroEnvironment } from './build-nitro'\nimport type { EnvironmentOptions, PluginOption, Rollup } from 'vite'\nimport type { 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\n return [\n devServerPlugin(),\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 clientEnv =\n builder.environments[VITE_ENVIRONMENT_NAMES.client]\n const serverEnv =\n builder.environments[VITE_ENVIRONMENT_NAMES.server]\n\n if (!clientEnv) {\n throw new Error('Client environment not found')\n }\n\n if (!serverEnv) {\n throw new Error('SSR environment not found')\n }\n\n const clientOutputDir = resolve(options.root, clientDistDir)\n rmSync(clientOutputDir, { recursive: true, force: true })\n await builder.build(clientEnv)\n\n await builder.build(serverEnv)\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 publicAssets: [\n {\n dir: path.resolve(options.root, clientDistDir),\n },\n ],\n typescript: {\n generateTsConfig: false,\n },\n prerender: undefined,\n renderer: ssrEntryFile,\n rollupConfig: {\n plugins: [virtualBundlePlugin(getSsrBundle())],\n },\n }\n\n const nitro = await createNitro(nitroConfig)\n\n await buildNitroEnvironment(nitro, () => build(nitro))\n\n if (options.
|
|
1
|
+
{"version":3,"file":"nitro-plugin.cjs","sources":["../../../src/nitro/nitro-plugin.ts"],"sourcesContent":["import path from 'node:path'\nimport { rmSync } from 'node:fs'\nimport { build, createNitro } from 'nitropack'\nimport { dirname, resolve } from 'pathe'\nimport { clientDistDir, ssrEntryFile } from '../plugin'\nimport { prerender } from '../prerender'\nimport { VITE_ENVIRONMENT_NAMES } from '../constants'\nimport { devServerPlugin } from './dev-server-plugin'\nimport { buildNitroEnvironment } from './build-nitro'\nimport type { EnvironmentOptions, PluginOption, Rollup } from 'vite'\nimport type { 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\n return [\n devServerPlugin(),\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 clientEnv =\n builder.environments[VITE_ENVIRONMENT_NAMES.client]\n const serverEnv =\n builder.environments[VITE_ENVIRONMENT_NAMES.server]\n\n if (!clientEnv) {\n throw new Error('Client environment not found')\n }\n\n if (!serverEnv) {\n throw new Error('SSR environment not found')\n }\n\n const clientOutputDir = resolve(options.root, clientDistDir)\n rmSync(clientOutputDir, { recursive: true, force: true })\n await builder.build(clientEnv)\n\n await builder.build(serverEnv)\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 publicAssets: [\n {\n dir: path.resolve(options.root, clientDistDir),\n },\n ],\n typescript: {\n generateTsConfig: false,\n },\n prerender: undefined,\n renderer: ssrEntryFile,\n rollupConfig: {\n plugins: [virtualBundlePlugin(getSsrBundle())],\n },\n }\n\n const nitro = await createNitro(nitroConfig)\n\n await buildNitroEnvironment(nitro, () => build(nitro))\n\n if (options.spa?.enabled) {\n options.prerender = {\n ...options.prerender,\n enabled: true,\n }\n\n const maskUrl = new URL(\n options.spa.maskPath,\n 'http://localhost',\n )\n\n maskUrl.searchParams.set('__TSS_SHELL', 'true')\n\n options.pages.push({\n path: maskUrl.toString().replace('http://localhost', ''),\n prerender: options.spa.prerender,\n sitemap: {\n exclude: true,\n },\n })\n }\n\n if (options.prerender?.enabled) {\n await prerender({\n options,\n nitro,\n builder,\n })\n }\n\n // if (nitroConfig.prerender?.routes?.length && options.sitemap) {\n // console.log('Building Sitemap...')\n // // sitemap needs to be built after all directories are built\n // await buildSitemap({\n // host: options.sitemap.host,\n // routes: nitroConfig.prerender.routes,\n // outputDir: resolve(options.root, 'dist/public'),\n // })\n // }\n\n // console.log(\n // `\\n\\n✅ Client and server bundles successfully built.`,\n // )\n },\n },\n }\n },\n },\n ]\n}\n\nfunction virtualBundlePlugin(ssrBundle: Rollup.OutputBundle): Rollup.Plugin {\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":["devServerPlugin","VITE_ENVIRONMENT_NAMES","resolve","clientDistDir","rmSync","ssrEntryFile","createNitro","buildNitroEnvironment","build","prerender","dirname"],"mappings":"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"}
|
package/dist/cjs/plugin.d.cts
CHANGED
|
@@ -1952,7 +1952,7 @@ declare const TanStackStartOptionsSchema: z.ZodDefault<z.ZodOptional<z.ZodObject
|
|
|
1952
1952
|
html: string;
|
|
1953
1953
|
}, ...args: unknown[]) => any) | undefined;
|
|
1954
1954
|
}>>>>;
|
|
1955
|
-
|
|
1955
|
+
spa: z.ZodOptional<z.ZodObject<{
|
|
1956
1956
|
enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
1957
1957
|
maskPath: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
1958
1958
|
prerender: z.ZodEffects<z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
@@ -2673,7 +2673,7 @@ declare const TanStackStartOptionsSchema: z.ZodDefault<z.ZodOptional<z.ZodObject
|
|
|
2673
2673
|
html: string;
|
|
2674
2674
|
}, ...args: unknown[]) => any) | undefined;
|
|
2675
2675
|
} | undefined;
|
|
2676
|
-
|
|
2676
|
+
spa?: {
|
|
2677
2677
|
prerender: {
|
|
2678
2678
|
enabled: boolean;
|
|
2679
2679
|
outputPath: string;
|
|
@@ -2974,7 +2974,7 @@ declare const TanStackStartOptionsSchema: z.ZodDefault<z.ZodOptional<z.ZodObject
|
|
|
2974
2974
|
} | undefined;
|
|
2975
2975
|
fromCrawl?: boolean | undefined;
|
|
2976
2976
|
})[] | undefined;
|
|
2977
|
-
|
|
2977
|
+
spa?: {
|
|
2978
2978
|
prerender?: {
|
|
2979
2979
|
enabled?: boolean | undefined;
|
|
2980
2980
|
outputPath?: string | undefined;
|
|
@@ -3279,7 +3279,7 @@ export declare function getTanStackStartOptions(opts?: TanStackStartInputConfig)
|
|
|
3279
3279
|
html: string;
|
|
3280
3280
|
}, ...args: unknown[]) => any) | undefined;
|
|
3281
3281
|
} | undefined;
|
|
3282
|
-
|
|
3282
|
+
spa?: {
|
|
3283
3283
|
prerender: {
|
|
3284
3284
|
enabled: boolean;
|
|
3285
3285
|
outputPath: string;
|
package/dist/cjs/prerender.cjs
CHANGED
|
@@ -35,14 +35,6 @@ async function prerender({
|
|
|
35
35
|
);
|
|
36
36
|
const nodeNitro = await nitropack.createNitro({
|
|
37
37
|
...nitro.options._config,
|
|
38
|
-
routeRules: {
|
|
39
|
-
// Filter out our shell redirect rule if it exists
|
|
40
|
-
...Object.fromEntries(
|
|
41
|
-
Object.entries(nitro.options._config.routeRules ?? {}).filter(
|
|
42
|
-
([_, value]) => !value.__TSS_SHELL
|
|
43
|
-
)
|
|
44
|
-
)
|
|
45
|
-
},
|
|
46
38
|
preset: "nitro-prerender",
|
|
47
39
|
logLevel: 0,
|
|
48
40
|
output: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prerender.cjs","sources":["../../src/prerender.ts"],"sourcesContent":["import { promises as fsp } from 'node:fs'\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 { Queue } from './queue'\nimport { buildNitroEnvironment } from './nitro/build-nitro'\nimport { VITE_ENVIRONMENT_NAMES } from './constants'\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 console.info('Prendering 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-start/build/prerenderer',\n )\n\n const nodeNitro = await createNitro({\n ...nitro.options._config,\n routeRules: {\n // Filter out our shell redirect rule if it exists\n ...Object.fromEntries(\n Object.entries(nitro.options._config.routeRules ?? {}).filter(\n ([_, value]) => !(value as any).__TSS_SHELL,\n ),\n ),\n },\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 buildNitroEnvironment(nodeNitro, () => 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 = path.resolve(\n path.join(nodeNitro.options.output.serverDir, serverFilename),\n )\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 console.info(`Prerendered ${pages.length} pages:`)\n pages.forEach((page) => {\n console.info(`- ${page}`)\n })\n\n // TODO: Write the prerendered pages to the output directory\n } catch (error) {\n console.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 console.info(`Concurrency: ${concurrency}`)\n const queue = new Queue({ concurrency })\n\n options.pages.forEach((_page) => {\n let page = _page as Page\n\n if (typeof _page === 'string') {\n page = { path: _page }\n }\n\n addCrawlPageTask(page)\n })\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 console.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: { 'x-nitro-prerender': encodedRoute },\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 console.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":["VITE_ENVIRONMENT_NAMES","createNitro","getRollupConfig","buildNitroEnvironment","buildNitro","_a","queue","Queue","withBase","joinURL","withoutBase","fsp"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"prerender.cjs","sources":["../../src/prerender.ts"],"sourcesContent":["import { promises as fsp } from 'node:fs'\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 { Queue } from './queue'\nimport { buildNitroEnvironment } from './nitro/build-nitro'\nimport { VITE_ENVIRONMENT_NAMES } from './constants'\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 console.info('Prendering 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-start/build/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 buildNitroEnvironment(nodeNitro, () => 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 = path.resolve(\n path.join(nodeNitro.options.output.serverDir, serverFilename),\n )\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 console.info(`Prerendered ${pages.length} pages:`)\n pages.forEach((page) => {\n console.info(`- ${page}`)\n })\n\n // TODO: Write the prerendered pages to the output directory\n } catch (error) {\n console.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 console.info(`Concurrency: ${concurrency}`)\n const queue = new Queue({ concurrency })\n\n options.pages.forEach((_page) => {\n let page = _page as Page\n\n if (typeof _page === 'string') {\n page = { path: _page }\n }\n\n addCrawlPageTask(page)\n })\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 console.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: { 'x-nitro-prerender': encodedRoute },\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 console.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":["VITE_ENVIRONMENT_NAMES","createNitro","getRollupConfig","buildNitroEnvironment","buildNitro","_a","queue","Queue","withBase","joinURL","withoutBase","fsp"],"mappings":"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"}
|
package/dist/cjs/schema.cjs
CHANGED
|
@@ -70,7 +70,7 @@ function createTanStackStartOptionsSchema(frameworkPlugin = {}) {
|
|
|
70
70
|
entry: zod.z.string().optional()
|
|
71
71
|
}).optional().default({}),
|
|
72
72
|
serverFns: zod.z.object({
|
|
73
|
-
base: zod.z.string().optional().default("/
|
|
73
|
+
base: zod.z.string().optional().default("/_serverFn")
|
|
74
74
|
}).optional().default({}),
|
|
75
75
|
public: zod.z.object({
|
|
76
76
|
dir: zod.z.string().optional().default("public"),
|
|
@@ -86,7 +86,7 @@ function createTanStackStartOptionsSchema(frameworkPlugin = {}) {
|
|
|
86
86
|
filter: zod.z.function().args(pageSchema).returns(zod.z.any()).optional(),
|
|
87
87
|
failOnError: zod.z.boolean().optional()
|
|
88
88
|
}).and(pagePrerenderOptionsSchema.optional()).optional(),
|
|
89
|
-
|
|
89
|
+
spa: spaSchema.optional()
|
|
90
90
|
}).optional().default({});
|
|
91
91
|
}
|
|
92
92
|
const pageSitemapOptionsSchema = zod.z.object({
|
|
@@ -135,7 +135,7 @@ const pagePrerenderOptionsSchema = zod.z.object({
|
|
|
135
135
|
})
|
|
136
136
|
).returns(zod.z.any()).optional()
|
|
137
137
|
});
|
|
138
|
-
const
|
|
138
|
+
const spaSchema = zod.z.object({
|
|
139
139
|
enabled: zod.z.boolean().optional().default(true),
|
|
140
140
|
maskPath: zod.z.string().optional().default("/"),
|
|
141
141
|
prerender: pagePrerenderOptionsSchema.optional().default({}).transform((opts) => ({
|
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.partial().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('/_server'),\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\n .array(z.union([z.string(), pageSchema]))\n .optional()\n .default([]),\n sitemap: pagePrerenderOptionsSchema\n .extend({\n host: z.string().optional(),\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 shell: shellSchema.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})\n\nconst shellSchema = 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.partial().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\n .array(z.union([z.string(), pageSchema]))\n .optional()\n .default([]),\n sitemap: pagePrerenderOptionsSchema\n .extend({\n host: z.string().optional(),\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})\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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"}
|
package/dist/cjs/schema.d.cts
CHANGED
|
@@ -1951,7 +1951,7 @@ export declare function createTanStackConfig<TFrameworkPlugin extends Record<str
|
|
|
1951
1951
|
html: string;
|
|
1952
1952
|
}, ...args: unknown[]) => any) | undefined;
|
|
1953
1953
|
}>>>>;
|
|
1954
|
-
|
|
1954
|
+
spa: z.ZodOptional<z.ZodObject<{
|
|
1955
1955
|
enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
1956
1956
|
maskPath: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
1957
1957
|
prerender: z.ZodEffects<z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
@@ -2672,7 +2672,7 @@ export declare function createTanStackConfig<TFrameworkPlugin extends Record<str
|
|
|
2672
2672
|
html: string;
|
|
2673
2673
|
}, ...args: unknown[]) => any) | undefined;
|
|
2674
2674
|
} | undefined;
|
|
2675
|
-
|
|
2675
|
+
spa?: {
|
|
2676
2676
|
prerender: {
|
|
2677
2677
|
enabled: boolean;
|
|
2678
2678
|
outputPath: string;
|
|
@@ -2973,7 +2973,7 @@ export declare function createTanStackConfig<TFrameworkPlugin extends Record<str
|
|
|
2973
2973
|
} | undefined;
|
|
2974
2974
|
fromCrawl?: boolean | undefined;
|
|
2975
2975
|
})[] | undefined;
|
|
2976
|
-
|
|
2976
|
+
spa?: {
|
|
2977
2977
|
prerender?: {
|
|
2978
2978
|
enabled?: boolean | undefined;
|
|
2979
2979
|
outputPath?: string | undefined;
|
|
@@ -4967,7 +4967,7 @@ export declare function createTanStackConfig<TFrameworkPlugin extends Record<str
|
|
|
4967
4967
|
html: string;
|
|
4968
4968
|
}, ...args: unknown[]) => any) | undefined;
|
|
4969
4969
|
}>>>>;
|
|
4970
|
-
|
|
4970
|
+
spa: z.ZodOptional<z.ZodObject<{
|
|
4971
4971
|
enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
4972
4972
|
maskPath: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
4973
4973
|
prerender: z.ZodEffects<z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
@@ -5688,7 +5688,7 @@ export declare function createTanStackConfig<TFrameworkPlugin extends Record<str
|
|
|
5688
5688
|
html: string;
|
|
5689
5689
|
}, ...args: unknown[]) => any) | undefined;
|
|
5690
5690
|
} | undefined;
|
|
5691
|
-
|
|
5691
|
+
spa?: {
|
|
5692
5692
|
prerender: {
|
|
5693
5693
|
enabled: boolean;
|
|
5694
5694
|
outputPath: string;
|
|
@@ -5989,7 +5989,7 @@ export declare function createTanStackConfig<TFrameworkPlugin extends Record<str
|
|
|
5989
5989
|
} | undefined;
|
|
5990
5990
|
fromCrawl?: boolean | undefined;
|
|
5991
5991
|
})[] | undefined;
|
|
5992
|
-
|
|
5992
|
+
spa?: {
|
|
5993
5993
|
prerender?: {
|
|
5994
5994
|
enabled?: boolean | undefined;
|
|
5995
5995
|
outputPath?: string | undefined;
|
|
@@ -6292,7 +6292,7 @@ export declare function createTanStackConfig<TFrameworkPlugin extends Record<str
|
|
|
6292
6292
|
html: string;
|
|
6293
6293
|
}, ...args: unknown[]) => any) | undefined;
|
|
6294
6294
|
} | undefined;
|
|
6295
|
-
|
|
6295
|
+
spa?: {
|
|
6296
6296
|
prerender: {
|
|
6297
6297
|
enabled: boolean;
|
|
6298
6298
|
outputPath: string;
|
|
@@ -8287,7 +8287,7 @@ export declare function createTanStackStartOptionsSchema(frameworkPlugin?: Recor
|
|
|
8287
8287
|
html: string;
|
|
8288
8288
|
}, ...args: unknown[]) => any) | undefined;
|
|
8289
8289
|
}>>>>;
|
|
8290
|
-
|
|
8290
|
+
spa: z.ZodOptional<z.ZodObject<{
|
|
8291
8291
|
enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
8292
8292
|
maskPath: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
8293
8293
|
prerender: z.ZodEffects<z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
@@ -9008,7 +9008,7 @@ export declare function createTanStackStartOptionsSchema(frameworkPlugin?: Recor
|
|
|
9008
9008
|
html: string;
|
|
9009
9009
|
}, ...args: unknown[]) => any) | undefined;
|
|
9010
9010
|
} | undefined;
|
|
9011
|
-
|
|
9011
|
+
spa?: {
|
|
9012
9012
|
prerender: {
|
|
9013
9013
|
enabled: boolean;
|
|
9014
9014
|
outputPath: string;
|
|
@@ -9309,7 +9309,7 @@ export declare function createTanStackStartOptionsSchema(frameworkPlugin?: Recor
|
|
|
9309
9309
|
} | undefined;
|
|
9310
9310
|
fromCrawl?: boolean | undefined;
|
|
9311
9311
|
})[] | undefined;
|
|
9312
|
-
|
|
9312
|
+
spa?: {
|
|
9313
9313
|
prerender?: {
|
|
9314
9314
|
enabled?: boolean | undefined;
|
|
9315
9315
|
outputPath?: string | undefined;
|
|
@@ -70,19 +70,19 @@ function nitroPlugin(options, getSsrBundle) {
|
|
|
70
70
|
};
|
|
71
71
|
const nitro = await createNitro(nitroConfig);
|
|
72
72
|
await buildNitroEnvironment(nitro, () => build(nitro));
|
|
73
|
-
if ((_a = options.
|
|
73
|
+
if ((_a = options.spa) == null ? void 0 : _a.enabled) {
|
|
74
74
|
options.prerender = {
|
|
75
75
|
...options.prerender,
|
|
76
76
|
enabled: true
|
|
77
77
|
};
|
|
78
78
|
const maskUrl = new URL(
|
|
79
|
-
options.
|
|
79
|
+
options.spa.maskPath,
|
|
80
80
|
"http://localhost"
|
|
81
81
|
);
|
|
82
82
|
maskUrl.searchParams.set("__TSS_SHELL", "true");
|
|
83
83
|
options.pages.push({
|
|
84
84
|
path: maskUrl.toString().replace("http://localhost", ""),
|
|
85
|
-
prerender: options.
|
|
85
|
+
prerender: options.spa.prerender,
|
|
86
86
|
sitemap: {
|
|
87
87
|
exclude: true
|
|
88
88
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nitro-plugin.js","sources":["../../../src/nitro/nitro-plugin.ts"],"sourcesContent":["import path from 'node:path'\nimport { rmSync } from 'node:fs'\nimport { build, createNitro } from 'nitropack'\nimport { dirname, resolve } from 'pathe'\nimport { clientDistDir, ssrEntryFile } from '../plugin'\nimport { prerender } from '../prerender'\nimport { VITE_ENVIRONMENT_NAMES } from '../constants'\nimport { devServerPlugin } from './dev-server-plugin'\nimport { buildNitroEnvironment } from './build-nitro'\nimport type { EnvironmentOptions, PluginOption, Rollup } from 'vite'\nimport type { 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\n return [\n devServerPlugin(),\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 clientEnv =\n builder.environments[VITE_ENVIRONMENT_NAMES.client]\n const serverEnv =\n builder.environments[VITE_ENVIRONMENT_NAMES.server]\n\n if (!clientEnv) {\n throw new Error('Client environment not found')\n }\n\n if (!serverEnv) {\n throw new Error('SSR environment not found')\n }\n\n const clientOutputDir = resolve(options.root, clientDistDir)\n rmSync(clientOutputDir, { recursive: true, force: true })\n await builder.build(clientEnv)\n\n await builder.build(serverEnv)\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 publicAssets: [\n {\n dir: path.resolve(options.root, clientDistDir),\n },\n ],\n typescript: {\n generateTsConfig: false,\n },\n prerender: undefined,\n renderer: ssrEntryFile,\n rollupConfig: {\n plugins: [virtualBundlePlugin(getSsrBundle())],\n },\n }\n\n const nitro = await createNitro(nitroConfig)\n\n await buildNitroEnvironment(nitro, () => build(nitro))\n\n if (options.
|
|
1
|
+
{"version":3,"file":"nitro-plugin.js","sources":["../../../src/nitro/nitro-plugin.ts"],"sourcesContent":["import path from 'node:path'\nimport { rmSync } from 'node:fs'\nimport { build, createNitro } from 'nitropack'\nimport { dirname, resolve } from 'pathe'\nimport { clientDistDir, ssrEntryFile } from '../plugin'\nimport { prerender } from '../prerender'\nimport { VITE_ENVIRONMENT_NAMES } from '../constants'\nimport { devServerPlugin } from './dev-server-plugin'\nimport { buildNitroEnvironment } from './build-nitro'\nimport type { EnvironmentOptions, PluginOption, Rollup } from 'vite'\nimport type { 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\n return [\n devServerPlugin(),\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 clientEnv =\n builder.environments[VITE_ENVIRONMENT_NAMES.client]\n const serverEnv =\n builder.environments[VITE_ENVIRONMENT_NAMES.server]\n\n if (!clientEnv) {\n throw new Error('Client environment not found')\n }\n\n if (!serverEnv) {\n throw new Error('SSR environment not found')\n }\n\n const clientOutputDir = resolve(options.root, clientDistDir)\n rmSync(clientOutputDir, { recursive: true, force: true })\n await builder.build(clientEnv)\n\n await builder.build(serverEnv)\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 publicAssets: [\n {\n dir: path.resolve(options.root, clientDistDir),\n },\n ],\n typescript: {\n generateTsConfig: false,\n },\n prerender: undefined,\n renderer: ssrEntryFile,\n rollupConfig: {\n plugins: [virtualBundlePlugin(getSsrBundle())],\n },\n }\n\n const nitro = await createNitro(nitroConfig)\n\n await buildNitroEnvironment(nitro, () => build(nitro))\n\n if (options.spa?.enabled) {\n options.prerender = {\n ...options.prerender,\n enabled: true,\n }\n\n const maskUrl = new URL(\n options.spa.maskPath,\n 'http://localhost',\n )\n\n maskUrl.searchParams.set('__TSS_SHELL', 'true')\n\n options.pages.push({\n path: maskUrl.toString().replace('http://localhost', ''),\n prerender: options.spa.prerender,\n sitemap: {\n exclude: true,\n },\n })\n }\n\n if (options.prerender?.enabled) {\n await prerender({\n options,\n nitro,\n builder,\n })\n }\n\n // if (nitroConfig.prerender?.routes?.length && options.sitemap) {\n // console.log('Building Sitemap...')\n // // sitemap needs to be built after all directories are built\n // await buildSitemap({\n // host: options.sitemap.host,\n // routes: nitroConfig.prerender.routes,\n // outputDir: resolve(options.root, 'dist/public'),\n // })\n // }\n\n // console.log(\n // `\\n\\n✅ Client and server bundles successfully built.`,\n // )\n },\n },\n }\n },\n },\n ]\n}\n\nfunction virtualBundlePlugin(ssrBundle: Rollup.OutputBundle): Rollup.Plugin {\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":[],"mappings":"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"}
|
package/dist/esm/plugin.d.ts
CHANGED
|
@@ -1952,7 +1952,7 @@ declare const TanStackStartOptionsSchema: z.ZodDefault<z.ZodOptional<z.ZodObject
|
|
|
1952
1952
|
html: string;
|
|
1953
1953
|
}, ...args: unknown[]) => any) | undefined;
|
|
1954
1954
|
}>>>>;
|
|
1955
|
-
|
|
1955
|
+
spa: z.ZodOptional<z.ZodObject<{
|
|
1956
1956
|
enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
1957
1957
|
maskPath: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
1958
1958
|
prerender: z.ZodEffects<z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
@@ -2673,7 +2673,7 @@ declare const TanStackStartOptionsSchema: z.ZodDefault<z.ZodOptional<z.ZodObject
|
|
|
2673
2673
|
html: string;
|
|
2674
2674
|
}, ...args: unknown[]) => any) | undefined;
|
|
2675
2675
|
} | undefined;
|
|
2676
|
-
|
|
2676
|
+
spa?: {
|
|
2677
2677
|
prerender: {
|
|
2678
2678
|
enabled: boolean;
|
|
2679
2679
|
outputPath: string;
|
|
@@ -2974,7 +2974,7 @@ declare const TanStackStartOptionsSchema: z.ZodDefault<z.ZodOptional<z.ZodObject
|
|
|
2974
2974
|
} | undefined;
|
|
2975
2975
|
fromCrawl?: boolean | undefined;
|
|
2976
2976
|
})[] | undefined;
|
|
2977
|
-
|
|
2977
|
+
spa?: {
|
|
2978
2978
|
prerender?: {
|
|
2979
2979
|
enabled?: boolean | undefined;
|
|
2980
2980
|
outputPath?: string | undefined;
|
|
@@ -3279,7 +3279,7 @@ export declare function getTanStackStartOptions(opts?: TanStackStartInputConfig)
|
|
|
3279
3279
|
html: string;
|
|
3280
3280
|
}, ...args: unknown[]) => any) | undefined;
|
|
3281
3281
|
} | undefined;
|
|
3282
|
-
|
|
3282
|
+
spa?: {
|
|
3283
3283
|
prerender: {
|
|
3284
3284
|
enabled: boolean;
|
|
3285
3285
|
outputPath: string;
|
package/dist/esm/prerender.js
CHANGED
|
@@ -33,14 +33,6 @@ async function prerender({
|
|
|
33
33
|
);
|
|
34
34
|
const nodeNitro = await createNitro({
|
|
35
35
|
...nitro.options._config,
|
|
36
|
-
routeRules: {
|
|
37
|
-
// Filter out our shell redirect rule if it exists
|
|
38
|
-
...Object.fromEntries(
|
|
39
|
-
Object.entries(nitro.options._config.routeRules ?? {}).filter(
|
|
40
|
-
([_, value]) => !value.__TSS_SHELL
|
|
41
|
-
)
|
|
42
|
-
)
|
|
43
|
-
},
|
|
44
36
|
preset: "nitro-prerender",
|
|
45
37
|
logLevel: 0,
|
|
46
38
|
output: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prerender.js","sources":["../../src/prerender.ts"],"sourcesContent":["import { promises as fsp } from 'node:fs'\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 { Queue } from './queue'\nimport { buildNitroEnvironment } from './nitro/build-nitro'\nimport { VITE_ENVIRONMENT_NAMES } from './constants'\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 console.info('Prendering 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-start/build/prerenderer',\n )\n\n const nodeNitro = await createNitro({\n ...nitro.options._config,\n routeRules: {\n // Filter out our shell redirect rule if it exists\n ...Object.fromEntries(\n Object.entries(nitro.options._config.routeRules ?? {}).filter(\n ([_, value]) => !(value as any).__TSS_SHELL,\n ),\n ),\n },\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 buildNitroEnvironment(nodeNitro, () => 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 = path.resolve(\n path.join(nodeNitro.options.output.serverDir, serverFilename),\n )\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 console.info(`Prerendered ${pages.length} pages:`)\n pages.forEach((page) => {\n console.info(`- ${page}`)\n })\n\n // TODO: Write the prerendered pages to the output directory\n } catch (error) {\n console.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 console.info(`Concurrency: ${concurrency}`)\n const queue = new Queue({ concurrency })\n\n options.pages.forEach((_page) => {\n let page = _page as Page\n\n if (typeof _page === 'string') {\n page = { path: _page }\n }\n\n addCrawlPageTask(page)\n })\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 console.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: { 'x-nitro-prerender': encodedRoute },\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 console.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":["build","buildNitro","_a","fsp"],"mappings":";;;;;;;;;AAcA,eAAsB,UAAU;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,GAIG;;AACD,UAAQ,KAAK,qBAAqB;AAGlC,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,aAAa,uBAAuB,MAAM;AAEpE,MAAI,CAAC,WAAW;AACd,UAAM,IAAI;AAAA,MACR,WAAW,uBAAuB,MAAM;AAAA,IAC1C;AAAA,EAAA;AAGF,QAAM,qBAAqB,KAAK;AAAA,IAC9B,QAAQ;AAAA,IACR;AAAA,EACF;AAEM,QAAA,YAAY,MAAM,YAAY;AAAA,IAClC,GAAG,MAAM,QAAQ;AAAA,IACjB,YAAY;AAAA;AAAA,MAEV,GAAG,OAAO;AAAA,QACR,OAAO,QAAQ,MAAM,QAAQ,QAAQ,cAAc,CAAE,CAAA,EAAE;AAAA,UACrD,CAAC,CAAC,GAAG,KAAK,MAAM,CAAE,MAAc;AAAA,QAAA;AAAA,MAClC;AAAA,IAEJ;AAAA,IACA,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,yBAAyB,gBAAgB,SAAS;AAElD,QAAAA,UAAQ,UAAU,OAAO;AAE/BA,UAAM,SAAS;AAEfA,UAAM,gBAAgB;AAAA,IACpB,GAAGA,QAAM;AAAA,IACT,GAAG;AAAA,IACH,QAAQ;AAAA,MACN,GAAGA,QAAM,cAAc;AAAA,MACvB,GAAG,uBAAuB;AAAA,MAC1B,WAAW;AAAA,IAAA;AAAA,EAEf;AAEA,QAAM,sBAAsB,WAAW,MAAMC,MAAW,SAAS,CAAC;AAG5D,QAAA,iBACJ,OAAO,uBAAuB,OAAO,mBAAmB,WACpD,uBAAuB,OAAO,iBAC9B;AAEN,QAAM,mBAAmB,KAAK;AAAA,IAC5B,KAAK,KAAK,UAAU,QAAQ,OAAO,WAAW,cAAc;AAAA,EAC9D;AAEA,QAAM,EAAE,kBAAkB,eAAgB,MAAM,OAAO;AAKnD,MAAA;AAEI,UAAA,QAAQ,MAAM,eAAe;AAEnC,YAAQ,KAAK,eAAe,MAAM,MAAM,SAAS;AAC3C,UAAA,QAAQ,CAAC,SAAS;AACd,cAAA,KAAK,KAAK,IAAI,EAAE;AAAA,IAAA,CACzB;AAAA,WAGM,OAAO;AACd,YAAQ,MAAM,KAAK;AAAA,EAAA,UACnB;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;AACxD,YAAA,KAAK,gBAAgB,WAAW,EAAE;AAC1C,UAAM,QAAQ,IAAI,MAAM,EAAE,aAAa;AAE/B,YAAA,MAAM,QAAQ,CAAC,UAAU;AAC/B,UAAI,OAAO;AAEP,UAAA,OAAO,UAAU,UAAU;AACtB,eAAA,EAAE,MAAM,MAAM;AAAA,MAAA;AAGvB,uBAAiB,IAAI;AAAA,IAAA,CACtB;AAED,UAAM,MAAM,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,IAAEA,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;AAGA,YAAM,IAAI,YAAY;;AACpB,gBAAQ,KAAK,aAAa,KAAK,IAAI,EAAE;AACrC,cAAM,UAAU,cAAc,IAAI,KAAK,IAAI,KAAK;AAC5C,YAAA;AAEI,gBAAA,eAAe,UAAU,KAAK,IAAI;AAExC,gBAAM,MAAM,MAAM;AAAA,YAChB,SAAS,cAAc,UAAU,QAAQ,OAAO;AAAA,YAChD;AAAA,cACE,SAAS,EAAE,qBAAqB,aAAa;AAAA,YAAA;AAAA,UAEjD;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,qBAC5C,QAAQ,eAAe,YAAY,IACnC,gBAAgB;AAEtB,gBAAM,WAAW;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,SAAI,MAAM,KAAK,QAAQ,QAAQ,GAAG;AAAA,YACtC,WAAW;AAAA,UAAA,CACZ;AAEK,gBAAAA,SAAI,UAAU,UAAU,IAAI;AAElC,gBAAM,UAAU,QAAMD,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,oBAAQ,KAAK,gCAAgC,KAAK,IAAI,WAAW;AACjE,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;"}
|
|
1
|
+
{"version":3,"file":"prerender.js","sources":["../../src/prerender.ts"],"sourcesContent":["import { promises as fsp } from 'node:fs'\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 { Queue } from './queue'\nimport { buildNitroEnvironment } from './nitro/build-nitro'\nimport { VITE_ENVIRONMENT_NAMES } from './constants'\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 console.info('Prendering 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-start/build/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 buildNitroEnvironment(nodeNitro, () => 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 = path.resolve(\n path.join(nodeNitro.options.output.serverDir, serverFilename),\n )\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 console.info(`Prerendered ${pages.length} pages:`)\n pages.forEach((page) => {\n console.info(`- ${page}`)\n })\n\n // TODO: Write the prerendered pages to the output directory\n } catch (error) {\n console.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 console.info(`Concurrency: ${concurrency}`)\n const queue = new Queue({ concurrency })\n\n options.pages.forEach((_page) => {\n let page = _page as Page\n\n if (typeof _page === 'string') {\n page = { path: _page }\n }\n\n addCrawlPageTask(page)\n })\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 console.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: { 'x-nitro-prerender': encodedRoute },\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 console.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":["build","buildNitro","_a","fsp"],"mappings":"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"}
|
package/dist/esm/schema.d.ts
CHANGED
|
@@ -1951,7 +1951,7 @@ export declare function createTanStackConfig<TFrameworkPlugin extends Record<str
|
|
|
1951
1951
|
html: string;
|
|
1952
1952
|
}, ...args: unknown[]) => any) | undefined;
|
|
1953
1953
|
}>>>>;
|
|
1954
|
-
|
|
1954
|
+
spa: z.ZodOptional<z.ZodObject<{
|
|
1955
1955
|
enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
1956
1956
|
maskPath: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
1957
1957
|
prerender: z.ZodEffects<z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
@@ -2672,7 +2672,7 @@ export declare function createTanStackConfig<TFrameworkPlugin extends Record<str
|
|
|
2672
2672
|
html: string;
|
|
2673
2673
|
}, ...args: unknown[]) => any) | undefined;
|
|
2674
2674
|
} | undefined;
|
|
2675
|
-
|
|
2675
|
+
spa?: {
|
|
2676
2676
|
prerender: {
|
|
2677
2677
|
enabled: boolean;
|
|
2678
2678
|
outputPath: string;
|
|
@@ -2973,7 +2973,7 @@ export declare function createTanStackConfig<TFrameworkPlugin extends Record<str
|
|
|
2973
2973
|
} | undefined;
|
|
2974
2974
|
fromCrawl?: boolean | undefined;
|
|
2975
2975
|
})[] | undefined;
|
|
2976
|
-
|
|
2976
|
+
spa?: {
|
|
2977
2977
|
prerender?: {
|
|
2978
2978
|
enabled?: boolean | undefined;
|
|
2979
2979
|
outputPath?: string | undefined;
|
|
@@ -4967,7 +4967,7 @@ export declare function createTanStackConfig<TFrameworkPlugin extends Record<str
|
|
|
4967
4967
|
html: string;
|
|
4968
4968
|
}, ...args: unknown[]) => any) | undefined;
|
|
4969
4969
|
}>>>>;
|
|
4970
|
-
|
|
4970
|
+
spa: z.ZodOptional<z.ZodObject<{
|
|
4971
4971
|
enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
4972
4972
|
maskPath: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
4973
4973
|
prerender: z.ZodEffects<z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
@@ -5688,7 +5688,7 @@ export declare function createTanStackConfig<TFrameworkPlugin extends Record<str
|
|
|
5688
5688
|
html: string;
|
|
5689
5689
|
}, ...args: unknown[]) => any) | undefined;
|
|
5690
5690
|
} | undefined;
|
|
5691
|
-
|
|
5691
|
+
spa?: {
|
|
5692
5692
|
prerender: {
|
|
5693
5693
|
enabled: boolean;
|
|
5694
5694
|
outputPath: string;
|
|
@@ -5989,7 +5989,7 @@ export declare function createTanStackConfig<TFrameworkPlugin extends Record<str
|
|
|
5989
5989
|
} | undefined;
|
|
5990
5990
|
fromCrawl?: boolean | undefined;
|
|
5991
5991
|
})[] | undefined;
|
|
5992
|
-
|
|
5992
|
+
spa?: {
|
|
5993
5993
|
prerender?: {
|
|
5994
5994
|
enabled?: boolean | undefined;
|
|
5995
5995
|
outputPath?: string | undefined;
|
|
@@ -6292,7 +6292,7 @@ export declare function createTanStackConfig<TFrameworkPlugin extends Record<str
|
|
|
6292
6292
|
html: string;
|
|
6293
6293
|
}, ...args: unknown[]) => any) | undefined;
|
|
6294
6294
|
} | undefined;
|
|
6295
|
-
|
|
6295
|
+
spa?: {
|
|
6296
6296
|
prerender: {
|
|
6297
6297
|
enabled: boolean;
|
|
6298
6298
|
outputPath: string;
|
|
@@ -8287,7 +8287,7 @@ export declare function createTanStackStartOptionsSchema(frameworkPlugin?: Recor
|
|
|
8287
8287
|
html: string;
|
|
8288
8288
|
}, ...args: unknown[]) => any) | undefined;
|
|
8289
8289
|
}>>>>;
|
|
8290
|
-
|
|
8290
|
+
spa: z.ZodOptional<z.ZodObject<{
|
|
8291
8291
|
enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
8292
8292
|
maskPath: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
8293
8293
|
prerender: z.ZodEffects<z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
@@ -9008,7 +9008,7 @@ export declare function createTanStackStartOptionsSchema(frameworkPlugin?: Recor
|
|
|
9008
9008
|
html: string;
|
|
9009
9009
|
}, ...args: unknown[]) => any) | undefined;
|
|
9010
9010
|
} | undefined;
|
|
9011
|
-
|
|
9011
|
+
spa?: {
|
|
9012
9012
|
prerender: {
|
|
9013
9013
|
enabled: boolean;
|
|
9014
9014
|
outputPath: string;
|
|
@@ -9309,7 +9309,7 @@ export declare function createTanStackStartOptionsSchema(frameworkPlugin?: Recor
|
|
|
9309
9309
|
} | undefined;
|
|
9310
9310
|
fromCrawl?: boolean | undefined;
|
|
9311
9311
|
})[] | undefined;
|
|
9312
|
-
|
|
9312
|
+
spa?: {
|
|
9313
9313
|
prerender?: {
|
|
9314
9314
|
enabled?: boolean | undefined;
|
|
9315
9315
|
outputPath?: string | undefined;
|
package/dist/esm/schema.js
CHANGED
|
@@ -68,7 +68,7 @@ function createTanStackStartOptionsSchema(frameworkPlugin = {}) {
|
|
|
68
68
|
entry: z.string().optional()
|
|
69
69
|
}).optional().default({}),
|
|
70
70
|
serverFns: z.object({
|
|
71
|
-
base: z.string().optional().default("/
|
|
71
|
+
base: z.string().optional().default("/_serverFn")
|
|
72
72
|
}).optional().default({}),
|
|
73
73
|
public: z.object({
|
|
74
74
|
dir: z.string().optional().default("public"),
|
|
@@ -84,7 +84,7 @@ function createTanStackStartOptionsSchema(frameworkPlugin = {}) {
|
|
|
84
84
|
filter: z.function().args(pageSchema).returns(z.any()).optional(),
|
|
85
85
|
failOnError: z.boolean().optional()
|
|
86
86
|
}).and(pagePrerenderOptionsSchema.optional()).optional(),
|
|
87
|
-
|
|
87
|
+
spa: spaSchema.optional()
|
|
88
88
|
}).optional().default({});
|
|
89
89
|
}
|
|
90
90
|
const pageSitemapOptionsSchema = z.object({
|
|
@@ -133,7 +133,7 @@ const pagePrerenderOptionsSchema = z.object({
|
|
|
133
133
|
})
|
|
134
134
|
).returns(z.any()).optional()
|
|
135
135
|
});
|
|
136
|
-
const
|
|
136
|
+
const spaSchema = z.object({
|
|
137
137
|
enabled: z.boolean().optional().default(true),
|
|
138
138
|
maskPath: z.string().optional().default("/"),
|
|
139
139
|
prerender: pagePrerenderOptionsSchema.optional().default({}).transform((opts) => ({
|
package/dist/esm/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","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.partial().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('/_server'),\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\n .array(z.union([z.string(), pageSchema]))\n .optional()\n .default([]),\n sitemap: pagePrerenderOptionsSchema\n .extend({\n host: z.string().optional(),\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 shell: shellSchema.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})\n\nconst shellSchema = 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":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schema.js","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.partial().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\n .array(z.union([z.string(), pageSchema]))\n .optional()\n .default([]),\n sitemap: pagePrerenderOptionsSchema\n .extend({\n host: z.string().optional(),\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})\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":[],"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.120.4-alpha.
|
|
3
|
+
"version": "1.120.4-alpha.20",
|
|
4
4
|
"description": "Modern and scalable routing for React applications",
|
|
5
5
|
"author": "Tanner Linsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -63,10 +63,10 @@
|
|
|
63
63
|
"ufo": "^1.5.4",
|
|
64
64
|
"xmlbuilder2": "^3.1.1",
|
|
65
65
|
"zod": "^3.24.2",
|
|
66
|
-
"@tanstack/router-generator": "^1.120.4-alpha.19",
|
|
67
|
-
"@tanstack/router-utils": "^1.120.4-alpha.1",
|
|
68
66
|
"@tanstack/router-core": "^1.120.4-alpha.19",
|
|
69
|
-
"@tanstack/
|
|
67
|
+
"@tanstack/router-generator": "^1.120.4-alpha.19",
|
|
68
|
+
"@tanstack/server-functions-plugin": "^1.120.4-alpha.16",
|
|
69
|
+
"@tanstack/router-utils": "^1.120.4-alpha.1"
|
|
70
70
|
},
|
|
71
71
|
"devDependencies": {
|
|
72
72
|
"vite": "^6.0.0"
|
|
@@ -89,14 +89,14 @@ export function nitroPlugin(
|
|
|
89
89
|
|
|
90
90
|
await buildNitroEnvironment(nitro, () => build(nitro))
|
|
91
91
|
|
|
92
|
-
if (options.
|
|
92
|
+
if (options.spa?.enabled) {
|
|
93
93
|
options.prerender = {
|
|
94
94
|
...options.prerender,
|
|
95
95
|
enabled: true,
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
const maskUrl = new URL(
|
|
99
|
-
options.
|
|
99
|
+
options.spa.maskPath,
|
|
100
100
|
'http://localhost',
|
|
101
101
|
)
|
|
102
102
|
|
|
@@ -104,7 +104,7 @@ export function nitroPlugin(
|
|
|
104
104
|
|
|
105
105
|
options.pages.push({
|
|
106
106
|
path: maskUrl.toString().replace('http://localhost', ''),
|
|
107
|
-
prerender: options.
|
|
107
|
+
prerender: options.spa.prerender,
|
|
108
108
|
sitemap: {
|
|
109
109
|
exclude: true,
|
|
110
110
|
},
|
package/src/prerender.ts
CHANGED
|
@@ -47,14 +47,6 @@ export async function prerender({
|
|
|
47
47
|
|
|
48
48
|
const nodeNitro = await createNitro({
|
|
49
49
|
...nitro.options._config,
|
|
50
|
-
routeRules: {
|
|
51
|
-
// Filter out our shell redirect rule if it exists
|
|
52
|
-
...Object.fromEntries(
|
|
53
|
-
Object.entries(nitro.options._config.routeRules ?? {}).filter(
|
|
54
|
-
([_, value]) => !(value as any).__TSS_SHELL,
|
|
55
|
-
),
|
|
56
|
-
),
|
|
57
|
-
},
|
|
58
50
|
preset: 'nitro-prerender',
|
|
59
51
|
logLevel: 0,
|
|
60
52
|
output: {
|
package/src/schema.ts
CHANGED
|
@@ -100,7 +100,7 @@ export function createTanStackStartOptionsSchema(
|
|
|
100
100
|
.default({}),
|
|
101
101
|
serverFns: z
|
|
102
102
|
.object({
|
|
103
|
-
base: z.string().optional().default('/
|
|
103
|
+
base: z.string().optional().default('/_serverFn'),
|
|
104
104
|
})
|
|
105
105
|
.optional()
|
|
106
106
|
.default({}),
|
|
@@ -129,7 +129,7 @@ export function createTanStackStartOptionsSchema(
|
|
|
129
129
|
})
|
|
130
130
|
.and(pagePrerenderOptionsSchema.optional())
|
|
131
131
|
.optional(),
|
|
132
|
-
|
|
132
|
+
spa: spaSchema.optional(),
|
|
133
133
|
})
|
|
134
134
|
.optional()
|
|
135
135
|
.default({})
|
|
@@ -196,7 +196,7 @@ const pagePrerenderOptionsSchema = z.object({
|
|
|
196
196
|
.optional(),
|
|
197
197
|
})
|
|
198
198
|
|
|
199
|
-
const
|
|
199
|
+
const spaSchema = z.object({
|
|
200
200
|
enabled: z.boolean().optional().default(true),
|
|
201
201
|
maskPath: z.string().optional().default('/'),
|
|
202
202
|
prerender: pagePrerenderOptionsSchema
|