@tanstack/start-plugin-core 1.132.0-alpha.9 → 1.132.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/constants.d.ts +2 -1
- package/dist/esm/constants.js +3 -2
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/create-server-fn-plugin/compiler.d.ts +8 -5
- package/dist/esm/create-server-fn-plugin/compiler.js +74 -46
- package/dist/esm/create-server-fn-plugin/compiler.js.map +1 -1
- package/dist/esm/create-server-fn-plugin/handleCreateMiddleware.d.ts +5 -0
- package/dist/esm/{start-compiler-plugin/middleware.js → create-server-fn-plugin/handleCreateMiddleware.js} +11 -11
- package/dist/esm/create-server-fn-plugin/handleCreateMiddleware.js.map +1 -0
- package/dist/esm/create-server-fn-plugin/handleCreateServerFn.js +8 -8
- package/dist/esm/create-server-fn-plugin/handleCreateServerFn.js.map +1 -1
- package/dist/esm/create-server-fn-plugin/plugin.d.ts +1 -1
- package/dist/esm/create-server-fn-plugin/plugin.js +22 -7
- package/dist/esm/create-server-fn-plugin/plugin.js.map +1 -1
- package/dist/esm/dev-server-plugin/plugin.d.ts +4 -2
- package/dist/esm/dev-server-plugin/plugin.js +6 -2
- package/dist/esm/dev-server-plugin/plugin.js.map +1 -1
- package/dist/esm/plugin.d.ts +12 -6
- package/dist/esm/plugin.js +54 -65
- package/dist/esm/plugin.js.map +1 -1
- package/dist/esm/resolve-entries.d.ts +0 -1
- package/dist/esm/resolve-entries.js +1 -1
- package/dist/esm/resolve-entries.js.map +1 -1
- package/dist/esm/schema.d.ts +375 -308
- package/dist/esm/schema.js +23 -11
- package/dist/esm/schema.js.map +1 -1
- package/dist/esm/start-compiler-plugin/compilers.js +17 -49
- package/dist/esm/start-compiler-plugin/compilers.js.map +1 -1
- package/dist/esm/start-compiler-plugin/constants.d.ts +1 -1
- package/dist/esm/start-compiler-plugin/constants.js +1 -5
- package/dist/esm/start-compiler-plugin/constants.js.map +1 -1
- package/dist/esm/start-router-plugin/constants.d.ts +1 -0
- package/dist/esm/start-router-plugin/constants.js +5 -0
- package/dist/esm/start-router-plugin/constants.js.map +1 -0
- package/dist/esm/start-router-plugin/generator-plugins/routes-manifest-plugin.js +3 -9
- package/dist/esm/start-router-plugin/generator-plugins/routes-manifest-plugin.js.map +1 -1
- package/dist/esm/start-router-plugin/plugin.d.ts +3 -2
- package/dist/esm/start-router-plugin/plugin.js +191 -31
- package/dist/esm/start-router-plugin/plugin.js.map +1 -1
- package/dist/esm/start-router-plugin/pruneServerOnlySubtrees.d.ts +8 -0
- package/dist/esm/start-router-plugin/pruneServerOnlySubtrees.js +34 -0
- package/dist/esm/start-router-plugin/pruneServerOnlySubtrees.js.map +1 -0
- package/package.json +8 -8
- package/src/constants.ts +3 -2
- package/src/create-server-fn-plugin/compiler.ts +99 -57
- package/src/{start-compiler-plugin/middleware.ts → create-server-fn-plugin/handleCreateMiddleware.ts} +15 -12
- package/src/create-server-fn-plugin/handleCreateServerFn.ts +11 -8
- package/src/create-server-fn-plugin/plugin.ts +24 -9
- package/src/dev-server-plugin/plugin.ts +6 -3
- package/src/plugin.ts +76 -84
- package/src/resolve-entries.ts +1 -2
- package/src/schema.ts +31 -14
- package/src/start-compiler-plugin/compilers.ts +18 -51
- package/src/start-compiler-plugin/constants.ts +0 -4
- package/src/start-router-plugin/constants.ts +1 -0
- package/src/start-router-plugin/generator-plugins/routes-manifest-plugin.ts +3 -9
- package/src/start-router-plugin/plugin.ts +233 -45
- package/src/start-router-plugin/pruneServerOnlySubtrees.ts +51 -0
- package/dist/esm/debug.js +0 -5
- package/dist/esm/debug.js.map +0 -1
- package/dist/esm/start-compiler-plugin/middleware.d.ts +0 -4
- package/dist/esm/start-compiler-plugin/middleware.js.map +0 -1
- package/dist/esm/start-compiler-plugin/serverFileRoute.d.ts +0 -4
- package/dist/esm/start-compiler-plugin/serverFileRoute.js +0 -38
- package/dist/esm/start-compiler-plugin/serverFileRoute.js.map +0 -1
- package/dist/esm/start-router-plugin/generator-plugins/server-routes-plugin.d.ts +0 -2
- package/dist/esm/start-router-plugin/generator-plugins/server-routes-plugin.js +0 -119
- package/dist/esm/start-router-plugin/generator-plugins/server-routes-plugin.js.map +0 -1
- package/dist/esm/start-router-plugin/route-tree-client-plugin.d.ts +0 -6
- package/dist/esm/start-router-plugin/route-tree-client-plugin.js +0 -56
- package/dist/esm/start-router-plugin/route-tree-client-plugin.js.map +0 -1
- package/dist/esm/start-router-plugin/virtual-route-tree-plugin.d.ts +0 -3
- package/dist/esm/start-router-plugin/virtual-route-tree-plugin.js +0 -29
- package/dist/esm/start-router-plugin/virtual-route-tree-plugin.js.map +0 -1
- package/src/start-compiler-plugin/serverFileRoute.ts +0 -59
- package/src/start-router-plugin/generator-plugins/server-routes-plugin.ts +0 -138
- package/src/start-router-plugin/route-tree-client-plugin.ts +0 -77
- package/src/start-router-plugin/virtual-route-tree-plugin.ts +0 -29
package/dist/esm/schema.js
CHANGED
|
@@ -1,21 +1,31 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
import { getConfig, configSchema } from "@tanstack/router-
|
|
4
|
-
const tsrConfig = configSchema.omit({ autoCodeSplitting: true }).partial();
|
|
5
|
-
function parseStartConfig(opts) {
|
|
3
|
+
import { getConfig, configSchema } from "@tanstack/router-plugin";
|
|
4
|
+
const tsrConfig = configSchema.omit({ autoCodeSplitting: true, target: true, verboseFileRoutes: true }).partial();
|
|
5
|
+
function parseStartConfig(opts, corePluginOpts, root) {
|
|
6
6
|
const options = tanstackStartOptionsSchema.parse(opts);
|
|
7
7
|
const srcDirectory = options.srcDirectory;
|
|
8
|
-
const routesDirectory =
|
|
9
|
-
|
|
8
|
+
const routesDirectory = path.resolve(
|
|
9
|
+
srcDirectory,
|
|
10
|
+
options.router.routesDirectory ?? "routes"
|
|
11
|
+
);
|
|
12
|
+
const generatedRouteTree = path.resolve(
|
|
13
|
+
srcDirectory,
|
|
14
|
+
options.router.generatedRouteTree ?? "routeTree.gen.ts"
|
|
15
|
+
);
|
|
10
16
|
return {
|
|
11
17
|
...options,
|
|
12
18
|
router: {
|
|
13
19
|
...options.router,
|
|
14
|
-
...getConfig(
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
20
|
+
...getConfig(
|
|
21
|
+
{
|
|
22
|
+
...options.router,
|
|
23
|
+
routesDirectory,
|
|
24
|
+
generatedRouteTree
|
|
25
|
+
},
|
|
26
|
+
root
|
|
27
|
+
),
|
|
28
|
+
target: corePluginOpts.framework
|
|
19
29
|
}
|
|
20
30
|
};
|
|
21
31
|
}
|
|
@@ -82,8 +92,10 @@ const pageSchema = pageBaseSchema.extend({
|
|
|
82
92
|
});
|
|
83
93
|
const tanstackStartOptionsSchema = z.object({
|
|
84
94
|
srcDirectory: z.string().optional().default("src"),
|
|
95
|
+
start: z.object({
|
|
96
|
+
entry: z.string().optional()
|
|
97
|
+
}).optional().default({}),
|
|
85
98
|
router: z.object({
|
|
86
|
-
// TODO this will move to 'start' once we have `createStart`
|
|
87
99
|
entry: z.string().optional()
|
|
88
100
|
}).and(tsrConfig.optional().default({})).optional().default({}),
|
|
89
101
|
client: z.object({
|
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 { z } from 'zod'\nimport { configSchema, getConfig } from '@tanstack/router-
|
|
1
|
+
{"version":3,"file":"schema.js","sources":["../../src/schema.ts"],"sourcesContent":["import path from 'node:path'\nimport { z } from 'zod'\nimport { configSchema, getConfig } from '@tanstack/router-plugin'\nimport type { TanStackStartVitePluginCoreOptions } from './plugin'\n\nconst tsrConfig = configSchema\n .omit({ autoCodeSplitting: true, target: true, verboseFileRoutes: true })\n .partial()\n\nexport function parseStartConfig(\n opts: z.input<typeof tanstackStartOptionsSchema>,\n corePluginOpts: TanStackStartVitePluginCoreOptions,\n root: string,\n) {\n const options = tanstackStartOptionsSchema.parse(opts)\n\n const srcDirectory = options.srcDirectory\n\n const routesDirectory = path.resolve(\n srcDirectory,\n options.router.routesDirectory ?? 'routes',\n )\n\n const generatedRouteTree = path.resolve(\n srcDirectory,\n options.router.generatedRouteTree ?? 'routeTree.gen.ts',\n )\n\n return {\n ...options,\n router: {\n ...options.router,\n ...getConfig(\n {\n ...options.router,\n routesDirectory,\n generatedRouteTree,\n },\n root,\n ),\n target: corePluginOpts.framework,\n },\n }\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\nconst pageSchema = pageBaseSchema.extend({\n prerender: pagePrerenderOptionsSchema.optional(),\n})\n\nconst tanstackStartOptionsSchema = z\n .object({\n srcDirectory: z.string().optional().default('src'),\n start: z\n .object({\n entry: z.string().optional(),\n })\n .optional()\n .default({}),\n router: z\n .object({\n entry: z.string().optional(),\n })\n .and(tsrConfig.optional().default({}))\n .optional()\n .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 vite: z\n .object({ installDevServerMiddleware: z.boolean().optional() })\n .optional(),\n })\n .optional()\n .default({})\n\nexport type Page = z.infer<typeof pageSchema>\n\nexport type TanStackStartInputConfig = z.input<\n typeof tanstackStartOptionsSchema\n>\nexport type TanStackStartOutputConfig = ReturnType<typeof parseStartConfig>\n"],"names":[],"mappings":"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"}
|
|
@@ -3,65 +3,33 @@ import * as t from "@babel/types";
|
|
|
3
3
|
import { findReferencedIdentifiers, deadCodeElimination } from "babel-dead-code-elimination";
|
|
4
4
|
import { parseAst, generateFromAst } from "@tanstack/router-utils";
|
|
5
5
|
import { transformFuncs } from "./constants.js";
|
|
6
|
-
import { handleCreateServerFileRouteCallExpressionFactory } from "./serverFileRoute.js";
|
|
7
6
|
import { handleCreateIsomorphicFnCallExpression } from "./isomorphicFn.js";
|
|
8
|
-
import { handleCreateMiddlewareCallExpression } from "./middleware.js";
|
|
9
7
|
import { handleCreateClientOnlyFnCallExpression, handleCreateServerOnlyFnCallExpression } from "./envOnly.js";
|
|
10
|
-
const getIdentifiers = (framework) => ({
|
|
11
|
-
createServerRootRoute: {
|
|
12
|
-
name: "createServerRootRoute",
|
|
13
|
-
handleCallExpression: handleCreateServerFileRouteCallExpressionFactory(
|
|
14
|
-
framework,
|
|
15
|
-
"createServerRootRoute"
|
|
16
|
-
),
|
|
17
|
-
paths: []
|
|
18
|
-
},
|
|
19
|
-
createServerRoute: {
|
|
20
|
-
name: "createServerRoute",
|
|
21
|
-
handleCallExpression: handleCreateServerFileRouteCallExpressionFactory(
|
|
22
|
-
framework,
|
|
23
|
-
"createServerRoute"
|
|
24
|
-
),
|
|
25
|
-
paths: []
|
|
26
|
-
},
|
|
27
|
-
createServerFileRoute: {
|
|
28
|
-
name: "createServerFileRoute",
|
|
29
|
-
handleCallExpression: handleCreateServerFileRouteCallExpressionFactory(
|
|
30
|
-
framework,
|
|
31
|
-
"createServerFileRoute"
|
|
32
|
-
),
|
|
33
|
-
paths: []
|
|
34
|
-
},
|
|
35
|
-
createMiddleware: {
|
|
36
|
-
name: "createMiddleware",
|
|
37
|
-
handleCallExpression: handleCreateMiddlewareCallExpression,
|
|
38
|
-
paths: []
|
|
39
|
-
},
|
|
40
|
-
createServerOnlyFn: {
|
|
41
|
-
name: "createServerOnlyFn",
|
|
42
|
-
handleCallExpression: handleCreateServerOnlyFnCallExpression,
|
|
43
|
-
paths: []
|
|
44
|
-
},
|
|
45
|
-
createClientOnlyFn: {
|
|
46
|
-
name: "createClientOnlyFn",
|
|
47
|
-
handleCallExpression: handleCreateClientOnlyFnCallExpression,
|
|
48
|
-
paths: []
|
|
49
|
-
},
|
|
50
|
-
createIsomorphicFn: {
|
|
51
|
-
name: "createIsomorphicFn",
|
|
52
|
-
handleCallExpression: handleCreateIsomorphicFnCallExpression,
|
|
53
|
-
paths: []
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
8
|
function compileStartOutputFactory(framework) {
|
|
57
9
|
return function compileStartOutput(opts) {
|
|
10
|
+
const identifiers = {
|
|
11
|
+
createServerOnlyFn: {
|
|
12
|
+
name: "createServerOnlyFn",
|
|
13
|
+
handleCallExpression: handleCreateServerOnlyFnCallExpression,
|
|
14
|
+
paths: []
|
|
15
|
+
},
|
|
16
|
+
createClientOnlyFn: {
|
|
17
|
+
name: "createClientOnlyFn",
|
|
18
|
+
handleCallExpression: handleCreateClientOnlyFnCallExpression,
|
|
19
|
+
paths: []
|
|
20
|
+
},
|
|
21
|
+
createIsomorphicFn: {
|
|
22
|
+
name: "createIsomorphicFn",
|
|
23
|
+
handleCallExpression: handleCreateIsomorphicFnCallExpression,
|
|
24
|
+
paths: []
|
|
25
|
+
}
|
|
26
|
+
};
|
|
58
27
|
const ast = parseAst(opts);
|
|
59
28
|
const doDce = opts.dce ?? true;
|
|
60
29
|
const refIdents = doDce ? findReferencedIdentifiers(ast) : void 0;
|
|
61
30
|
babel.traverse(ast, {
|
|
62
31
|
Program: {
|
|
63
32
|
enter(programPath) {
|
|
64
|
-
const identifiers = getIdentifiers(framework);
|
|
65
33
|
programPath.traverse({
|
|
66
34
|
ImportDeclaration: (path) => {
|
|
67
35
|
if (path.node.source.value !== `@tanstack/${framework}-start`) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compilers.js","sources":["../../../src/start-compiler-plugin/compilers.ts"],"sourcesContent":["import * as babel from '@babel/core'\nimport * as t from '@babel/types'\n\nimport {\n deadCodeElimination,\n findReferencedIdentifiers,\n} from 'babel-dead-code-elimination'\nimport { generateFromAst, parseAst } from '@tanstack/router-utils'\nimport { transformFuncs } from './constants'\nimport {
|
|
1
|
+
{"version":3,"file":"compilers.js","sources":["../../../src/start-compiler-plugin/compilers.ts"],"sourcesContent":["import * as babel from '@babel/core'\nimport * as t from '@babel/types'\n\nimport {\n deadCodeElimination,\n findReferencedIdentifiers,\n} from 'babel-dead-code-elimination'\nimport { generateFromAst, parseAst } from '@tanstack/router-utils'\nimport { transformFuncs } from './constants'\nimport { handleCreateIsomorphicFnCallExpression } from './isomorphicFn'\nimport {\n handleCreateClientOnlyFnCallExpression,\n handleCreateServerOnlyFnCallExpression,\n} from './envOnly'\nimport type { GeneratorResult, ParseAstOptions } from '@tanstack/router-utils'\n\nexport type CompileStartFrameworkOptions = 'react' | 'solid'\n\ntype Identifiers = { [K in (typeof transformFuncs)[number]]: IdentifierConfig }\n\nexport function compileStartOutputFactory(\n framework: CompileStartFrameworkOptions,\n) {\n return function compileStartOutput(opts: CompileOptions): GeneratorResult {\n const identifiers: Identifiers = {\n createServerOnlyFn: {\n name: 'createServerOnlyFn',\n handleCallExpression: handleCreateServerOnlyFnCallExpression,\n paths: [],\n },\n createClientOnlyFn: {\n name: 'createClientOnlyFn',\n handleCallExpression: handleCreateClientOnlyFnCallExpression,\n paths: [],\n },\n createIsomorphicFn: {\n name: 'createIsomorphicFn',\n handleCallExpression: handleCreateIsomorphicFnCallExpression,\n paths: [],\n },\n }\n\n const ast = parseAst(opts)\n\n const doDce = opts.dce ?? true\n // find referenced identifiers *before* we transform anything\n const refIdents = doDce ? findReferencedIdentifiers(ast) : undefined\n\n babel.traverse(ast, {\n Program: {\n enter(programPath) {\n programPath.traverse({\n ImportDeclaration: (path) => {\n if (path.node.source.value !== `@tanstack/${framework}-start`) {\n return\n }\n\n // handle a destructured imports being renamed like \"import { createServerFn as myCreateServerFn } from '@tanstack/react-start';\"\n path.node.specifiers.forEach((specifier) => {\n transformFuncs.forEach((identifierKey) => {\n const identifier = identifiers[identifierKey]\n\n if (\n specifier.type === 'ImportSpecifier' &&\n specifier.imported.type === 'Identifier'\n ) {\n if (specifier.imported.name === identifierKey) {\n identifier.name = specifier.local.name\n }\n }\n\n // handle namespace imports like \"import * as TanStackStart from '@tanstack/react-start';\"\n if (specifier.type === 'ImportNamespaceSpecifier') {\n identifier.name = `${specifier.local.name}.${identifierKey}`\n }\n })\n })\n },\n CallExpression: (path) => {\n transformFuncs.forEach((identifierKey) => {\n // Check to see if the call expression is a call to the\n // identifiers[identifierKey].name\n if (\n t.isIdentifier(path.node.callee) &&\n path.node.callee.name === identifiers[identifierKey].name\n ) {\n // The identifier could be a call to the original function\n // in the source code. If this is case, we need to ignore it.\n // Check the scope to see if the identifier is a function declaration.\n // if it is, then we can ignore it.\n\n if (\n path.scope.getBinding(identifiers[identifierKey].name)?.path\n .node.type === 'FunctionDeclaration'\n ) {\n return\n }\n\n return identifiers[identifierKey].paths.push(path)\n }\n\n // handle namespace imports like \"import * as TanStackStart from '@tanstack/react-start';\"\n // which are then called like \"TanStackStart.createServerFn()\"\n if (t.isMemberExpression(path.node.callee)) {\n if (\n t.isIdentifier(path.node.callee.object) &&\n t.isIdentifier(path.node.callee.property)\n ) {\n const callname = [\n path.node.callee.object.name,\n path.node.callee.property.name,\n ].join('.')\n\n if (callname === identifiers[identifierKey].name) {\n identifiers[identifierKey].paths.push(path)\n }\n }\n }\n\n return\n })\n },\n })\n\n transformFuncs.forEach((identifierKey) => {\n identifiers[identifierKey].paths.forEach((path) => {\n identifiers[identifierKey].handleCallExpression(\n path as babel.NodePath<t.CallExpression>,\n opts,\n )\n })\n })\n },\n },\n })\n\n if (doDce) {\n deadCodeElimination(ast, refIdents)\n }\n\n return generateFromAst(ast, {\n sourceMaps: true,\n sourceFileName: opts.filename,\n filename: opts.filename,\n })\n }\n}\n\nexport type CompileOptions = ParseAstOptions & {\n env: 'server' | 'client'\n dce?: boolean\n filename: string\n}\n\nexport type IdentifierConfig = {\n name: string\n handleCallExpression: (\n path: babel.NodePath<t.CallExpression>,\n opts: CompileOptions,\n ) => void\n paths: Array<babel.NodePath>\n}\n"],"names":[],"mappings":";;;;;;;AAoBO,SAAS,0BACd,WACA;AACA,SAAO,SAAS,mBAAmB,MAAuC;AACxE,UAAM,cAA2B;AAAA,MAC/B,oBAAoB;AAAA,QAClB,MAAM;AAAA,QACN,sBAAsB;AAAA,QACtB,OAAO,CAAA;AAAA,MAAC;AAAA,MAEV,oBAAoB;AAAA,QAClB,MAAM;AAAA,QACN,sBAAsB;AAAA,QACtB,OAAO,CAAA;AAAA,MAAC;AAAA,MAEV,oBAAoB;AAAA,QAClB,MAAM;AAAA,QACN,sBAAsB;AAAA,QACtB,OAAO,CAAA;AAAA,MAAC;AAAA,IACV;AAGF,UAAM,MAAM,SAAS,IAAI;AAEzB,UAAM,QAAQ,KAAK,OAAO;AAE1B,UAAM,YAAY,QAAQ,0BAA0B,GAAG,IAAI;AAE3D,UAAM,SAAS,KAAK;AAAA,MAClB,SAAS;AAAA,QACP,MAAM,aAAa;AACjB,sBAAY,SAAS;AAAA,YACnB,mBAAmB,CAAC,SAAS;AAC3B,kBAAI,KAAK,KAAK,OAAO,UAAU,aAAa,SAAS,UAAU;AAC7D;AAAA,cACF;AAGA,mBAAK,KAAK,WAAW,QAAQ,CAAC,cAAc;AAC1C,+BAAe,QAAQ,CAAC,kBAAkB;AACxC,wBAAM,aAAa,YAAY,aAAa;AAE5C,sBACE,UAAU,SAAS,qBACnB,UAAU,SAAS,SAAS,cAC5B;AACA,wBAAI,UAAU,SAAS,SAAS,eAAe;AAC7C,iCAAW,OAAO,UAAU,MAAM;AAAA,oBACpC;AAAA,kBACF;AAGA,sBAAI,UAAU,SAAS,4BAA4B;AACjD,+BAAW,OAAO,GAAG,UAAU,MAAM,IAAI,IAAI,aAAa;AAAA,kBAC5D;AAAA,gBACF,CAAC;AAAA,cACH,CAAC;AAAA,YACH;AAAA,YACA,gBAAgB,CAAC,SAAS;AACxB,6BAAe,QAAQ,CAAC,kBAAkB;AAGxC,oBACE,EAAE,aAAa,KAAK,KAAK,MAAM,KAC/B,KAAK,KAAK,OAAO,SAAS,YAAY,aAAa,EAAE,MACrD;AAMA,sBACE,KAAK,MAAM,WAAW,YAAY,aAAa,EAAE,IAAI,GAAG,KACrD,KAAK,SAAS,uBACjB;AACA;AAAA,kBACF;AAEA,yBAAO,YAAY,aAAa,EAAE,MAAM,KAAK,IAAI;AAAA,gBACnD;AAIA,oBAAI,EAAE,mBAAmB,KAAK,KAAK,MAAM,GAAG;AAC1C,sBACE,EAAE,aAAa,KAAK,KAAK,OAAO,MAAM,KACtC,EAAE,aAAa,KAAK,KAAK,OAAO,QAAQ,GACxC;AACA,0BAAM,WAAW;AAAA,sBACf,KAAK,KAAK,OAAO,OAAO;AAAA,sBACxB,KAAK,KAAK,OAAO,SAAS;AAAA,oBAAA,EAC1B,KAAK,GAAG;AAEV,wBAAI,aAAa,YAAY,aAAa,EAAE,MAAM;AAChD,kCAAY,aAAa,EAAE,MAAM,KAAK,IAAI;AAAA,oBAC5C;AAAA,kBACF;AAAA,gBACF;AAEA;AAAA,cACF,CAAC;AAAA,YACH;AAAA,UAAA,CACD;AAED,yBAAe,QAAQ,CAAC,kBAAkB;AACxC,wBAAY,aAAa,EAAE,MAAM,QAAQ,CAAC,SAAS;AACjD,0BAAY,aAAa,EAAE;AAAA,gBACzB;AAAA,gBACA;AAAA,cAAA;AAAA,YAEJ,CAAC;AAAA,UACH,CAAC;AAAA,QACH;AAAA,MAAA;AAAA,IACF,CACD;AAED,QAAI,OAAO;AACT,0BAAoB,KAAK,SAAS;AAAA,IACpC;AAEA,WAAO,gBAAgB,KAAK;AAAA,MAC1B,YAAY;AAAA,MACZ,gBAAgB,KAAK;AAAA,MACrB,UAAU,KAAK;AAAA,IAAA,CAChB;AAAA,EACH;AACF;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const transformFuncs: readonly ["
|
|
1
|
+
export declare const transformFuncs: readonly ["createServerOnlyFn", "createClientOnlyFn", "createIsomorphicFn"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sources":["../../../src/start-compiler-plugin/constants.ts"],"sourcesContent":["export const transformFuncs = [\n '
|
|
1
|
+
{"version":3,"file":"constants.js","sources":["../../../src/start-compiler-plugin/constants.ts"],"sourcesContent":["export const transformFuncs = [\n 'createServerOnlyFn',\n 'createClientOnlyFn',\n 'createIsomorphicFn',\n] as const\n"],"names":[],"mappings":"AAAO,MAAM,iBAAiB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AACF;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const SERVER_PROP = "server";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sources":["../../../src/start-router-plugin/constants.ts"],"sourcesContent":["export const SERVER_PROP = 'server'\n"],"names":[],"mappings":"AAAO,MAAM,cAAc;"}
|
|
@@ -2,20 +2,14 @@ import { rootRouteId } from "@tanstack/router-core";
|
|
|
2
2
|
function routesManifestPlugin() {
|
|
3
3
|
return {
|
|
4
4
|
name: "routes-manifest-plugin",
|
|
5
|
-
|
|
6
|
-
const routeTree = routeTrees.find((tree) => tree.exportName === "Route");
|
|
7
|
-
if (!routeTree) {
|
|
8
|
-
throw new Error(
|
|
9
|
-
'No route tree found with export name "Route". Please ensure your routes are correctly defined.'
|
|
10
|
-
);
|
|
11
|
-
}
|
|
5
|
+
onRouteTreeChanged: ({ routeTree, rootRouteNode, routeNodes }) => {
|
|
12
6
|
const routesManifest = {
|
|
13
7
|
[rootRouteId]: {
|
|
14
8
|
filePath: rootRouteNode.fullPath,
|
|
15
|
-
children: routeTree.
|
|
9
|
+
children: routeTree.map((d) => d.routePath)
|
|
16
10
|
},
|
|
17
11
|
...Object.fromEntries(
|
|
18
|
-
|
|
12
|
+
routeNodes.map((d) => {
|
|
19
13
|
const filePathId = d.routePath;
|
|
20
14
|
return [
|
|
21
15
|
filePathId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes-manifest-plugin.js","sources":["../../../../src/start-router-plugin/generator-plugins/routes-manifest-plugin.ts"],"sourcesContent":["import { rootRouteId } from '@tanstack/router-core'\n\nimport type { GeneratorPlugin } from '@tanstack/router-generator'\n\n/**\n * this plugin builds the routes manifest and stores it on globalThis\n * so that it can be accessed later (e.g. from a vite plugin)\n */\nexport function routesManifestPlugin(): GeneratorPlugin {\n return {\n name: 'routes-manifest-plugin',\n
|
|
1
|
+
{"version":3,"file":"routes-manifest-plugin.js","sources":["../../../../src/start-router-plugin/generator-plugins/routes-manifest-plugin.ts"],"sourcesContent":["import { rootRouteId } from '@tanstack/router-core'\n\nimport type { GeneratorPlugin } from '@tanstack/router-generator'\n\n/**\n * this plugin builds the routes manifest and stores it on globalThis\n * so that it can be accessed later (e.g. from a vite plugin)\n */\nexport function routesManifestPlugin(): GeneratorPlugin {\n return {\n name: 'routes-manifest-plugin',\n onRouteTreeChanged: ({ routeTree, rootRouteNode, routeNodes }) => {\n const routesManifest = {\n [rootRouteId]: {\n filePath: rootRouteNode.fullPath,\n children: routeTree.map((d) => d.routePath),\n },\n ...Object.fromEntries(\n routeNodes.map((d) => {\n const filePathId = d.routePath\n\n return [\n filePathId,\n {\n filePath: d.fullPath,\n parent: d.parent?.routePath ? d.parent.routePath : undefined,\n children: d.children?.map((childRoute) => childRoute.routePath),\n },\n ]\n }),\n ),\n }\n\n globalThis.TSS_ROUTES_MANIFEST = { routes: routesManifest }\n },\n }\n}\n"],"names":[],"mappings":";AAQO,SAAS,uBAAwC;AACtD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,oBAAoB,CAAC,EAAE,WAAW,eAAe,iBAAiB;AAChE,YAAM,iBAAiB;AAAA,QACrB,CAAC,WAAW,GAAG;AAAA,UACb,UAAU,cAAc;AAAA,UACxB,UAAU,UAAU,IAAI,CAAC,MAAM,EAAE,SAAS;AAAA,QAAA;AAAA,QAE5C,GAAG,OAAO;AAAA,UACR,WAAW,IAAI,CAAC,MAAM;AACpB,kBAAM,aAAa,EAAE;AAErB,mBAAO;AAAA,cACL;AAAA,cACA;AAAA,gBACE,UAAU,EAAE;AAAA,gBACZ,QAAQ,EAAE,QAAQ,YAAY,EAAE,OAAO,YAAY;AAAA,gBACnD,UAAU,EAAE,UAAU,IAAI,CAAC,eAAe,WAAW,SAAS;AAAA,cAAA;AAAA,YAChE;AAAA,UAEJ,CAAC;AAAA,QAAA;AAAA,MACH;AAGF,iBAAW,sBAAsB,EAAE,QAAQ,eAAA;AAAA,IAC7C;AAAA,EAAA;AAEJ;"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import { PluginOption } from 'vite';
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import { TanStackStartInputConfig } from '../schema.js';
|
|
3
|
+
import { GetConfigFn, TanStackStartVitePluginCoreOptions } from '../plugin.js';
|
|
4
|
+
export declare function tanStackStartRouter(startPluginOpts: TanStackStartInputConfig, getConfig: GetConfigFn, corePluginOpts: TanStackStartVitePluginCoreOptions): Array<PluginOption>;
|
|
@@ -1,42 +1,202 @@
|
|
|
1
1
|
import { tanstackRouterGenerator, tanStackRouterCodeSplitter, tanstackRouterAutoImport } from "@tanstack/router-plugin/vite";
|
|
2
|
+
import { normalizePath } from "vite";
|
|
3
|
+
import path from "pathe";
|
|
2
4
|
import { VITE_ENVIRONMENT_NAMES } from "../constants.js";
|
|
3
|
-
import { routeTreeClientPlugin } from "./route-tree-client-plugin.js";
|
|
4
|
-
import { virtualRouteTreePlugin } from "./virtual-route-tree-plugin.js";
|
|
5
5
|
import { routesManifestPlugin } from "./generator-plugins/routes-manifest-plugin.js";
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
6
|
+
import { pruneServerOnlySubtrees } from "./pruneServerOnlySubtrees.js";
|
|
7
|
+
import { SERVER_PROP } from "./constants.js";
|
|
8
|
+
function isServerOnlyNode(node) {
|
|
9
|
+
if (!node?.createFileRouteProps) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
return node.createFileRouteProps.has(SERVER_PROP) && node.createFileRouteProps.size === 1;
|
|
13
|
+
}
|
|
14
|
+
function moduleDeclaration({
|
|
15
|
+
startFilePath,
|
|
16
|
+
routerFilePath,
|
|
17
|
+
corePluginOpts,
|
|
18
|
+
generatedRouteTreePath
|
|
19
|
+
}) {
|
|
20
|
+
function getImportPath(absolutePath) {
|
|
21
|
+
let relativePath = path.relative(
|
|
22
|
+
path.dirname(generatedRouteTreePath),
|
|
23
|
+
absolutePath
|
|
24
|
+
);
|
|
25
|
+
if (!relativePath.startsWith(".")) {
|
|
26
|
+
relativePath = "./" + relativePath;
|
|
27
|
+
}
|
|
28
|
+
relativePath = relativePath.split(path.sep).join("/");
|
|
29
|
+
return relativePath;
|
|
30
|
+
}
|
|
31
|
+
const result = [
|
|
32
|
+
`import type { getRouter } from '${getImportPath(routerFilePath)}'`
|
|
33
|
+
];
|
|
34
|
+
if (startFilePath) {
|
|
35
|
+
result.push(
|
|
36
|
+
`import type { startInstance } from '${getImportPath(startFilePath)}'`
|
|
37
|
+
);
|
|
38
|
+
} else {
|
|
39
|
+
result.push(
|
|
40
|
+
`import type { createStart } from '@tanstack/${corePluginOpts.framework}-start'`
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
result.push(
|
|
44
|
+
`declare module '@tanstack/${corePluginOpts.framework}-start' {
|
|
45
|
+
interface Register {
|
|
46
|
+
router: Awaited<ReturnType<typeof getRouter>>`
|
|
47
|
+
);
|
|
48
|
+
if (startFilePath) {
|
|
49
|
+
result.push(
|
|
50
|
+
` config: Awaited<ReturnType<typeof startInstance.getOptions>>`
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
result.push(` }
|
|
54
|
+
}`);
|
|
55
|
+
return result.join("\n");
|
|
56
|
+
}
|
|
57
|
+
function tanStackStartRouter(startPluginOpts, getConfig, corePluginOpts) {
|
|
58
|
+
const getGeneratedRouteTreePath = () => {
|
|
59
|
+
const { startConfig } = getConfig();
|
|
60
|
+
return path.resolve(startConfig.router.generatedRouteTree);
|
|
61
|
+
};
|
|
62
|
+
let clientEnvironment = null;
|
|
63
|
+
function invalidate() {
|
|
64
|
+
if (!clientEnvironment) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const mod = clientEnvironment.moduleGraph.getModuleById(
|
|
68
|
+
getGeneratedRouteTreePath()
|
|
69
|
+
);
|
|
70
|
+
if (mod) {
|
|
71
|
+
clientEnvironment.moduleGraph.invalidateModule(mod);
|
|
72
|
+
}
|
|
73
|
+
clientEnvironment.hot.send({ type: "full-reload", path: "*" });
|
|
74
|
+
}
|
|
75
|
+
let generatorInstance = null;
|
|
76
|
+
const clientTreeGeneratorPlugin = {
|
|
77
|
+
name: "start-client-tree-plugin",
|
|
78
|
+
init({ generator }) {
|
|
79
|
+
generatorInstance = generator;
|
|
80
|
+
},
|
|
81
|
+
afterTransform({ node, prevNode }) {
|
|
82
|
+
if (isServerOnlyNode(node) !== isServerOnlyNode(prevNode)) {
|
|
83
|
+
invalidate();
|
|
14
84
|
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
let routeTreeFileFooter = null;
|
|
88
|
+
function getRouteTreeFileFooter() {
|
|
89
|
+
if (routeTreeFileFooter) {
|
|
90
|
+
return routeTreeFileFooter;
|
|
91
|
+
}
|
|
92
|
+
const { startConfig, resolvedStartConfig } = getConfig();
|
|
93
|
+
const ogRouteTreeFileFooter = startConfig.router.routeTreeFileFooter;
|
|
94
|
+
if (ogRouteTreeFileFooter) {
|
|
95
|
+
if (Array.isArray(ogRouteTreeFileFooter)) {
|
|
96
|
+
routeTreeFileFooter = ogRouteTreeFileFooter;
|
|
97
|
+
} else {
|
|
98
|
+
routeTreeFileFooter = ogRouteTreeFileFooter();
|
|
25
99
|
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
100
|
+
}
|
|
101
|
+
routeTreeFileFooter = [
|
|
102
|
+
moduleDeclaration({
|
|
103
|
+
generatedRouteTreePath: getGeneratedRouteTreePath(),
|
|
104
|
+
corePluginOpts,
|
|
105
|
+
startFilePath: resolvedStartConfig.startFilePath,
|
|
106
|
+
routerFilePath: resolvedStartConfig.routerFilePath
|
|
107
|
+
}),
|
|
108
|
+
...routeTreeFileFooter ?? []
|
|
109
|
+
];
|
|
110
|
+
return routeTreeFileFooter;
|
|
111
|
+
}
|
|
112
|
+
let resolvedGeneratedRouteTreePath = null;
|
|
113
|
+
const clientTreePlugin = {
|
|
114
|
+
name: "tanstack-start:route-tree-client-plugin",
|
|
115
|
+
enforce: "pre",
|
|
116
|
+
applyToEnvironment: (env) => env.name === VITE_ENVIRONMENT_NAMES.client,
|
|
117
|
+
configureServer(server) {
|
|
118
|
+
clientEnvironment = server.environments[VITE_ENVIRONMENT_NAMES.client];
|
|
119
|
+
},
|
|
120
|
+
config() {
|
|
121
|
+
resolvedGeneratedRouteTreePath = normalizePath(
|
|
122
|
+
getGeneratedRouteTreePath()
|
|
123
|
+
);
|
|
124
|
+
clientTreePlugin.load.filter = {
|
|
125
|
+
id: { include: new RegExp(resolvedGeneratedRouteTreePath) }
|
|
126
|
+
};
|
|
127
|
+
},
|
|
128
|
+
load: {
|
|
129
|
+
filter: {
|
|
130
|
+
// this will be set in the config hook above since it relies on `config` hook being called first
|
|
32
131
|
},
|
|
33
|
-
|
|
34
|
-
|
|
132
|
+
async handler() {
|
|
133
|
+
if (!generatorInstance) {
|
|
134
|
+
throw new Error("Generator instance not initialized");
|
|
135
|
+
}
|
|
136
|
+
const crawlingResult = await generatorInstance.getCrawlingResult();
|
|
137
|
+
if (!crawlingResult) {
|
|
138
|
+
throw new Error("Crawling result not available");
|
|
139
|
+
}
|
|
140
|
+
const prunedAcc = pruneServerOnlySubtrees(crawlingResult);
|
|
141
|
+
const acc = {
|
|
142
|
+
...crawlingResult.acc,
|
|
143
|
+
...prunedAcc
|
|
144
|
+
};
|
|
145
|
+
const buildResult = generatorInstance.buildRouteTree({
|
|
146
|
+
...crawlingResult,
|
|
147
|
+
acc,
|
|
148
|
+
config: {
|
|
149
|
+
// importRoutesUsingAbsolutePaths: true,
|
|
150
|
+
// addExtensions: true,
|
|
151
|
+
disableTypes: true,
|
|
152
|
+
enableRouteTreeFormatting: false,
|
|
153
|
+
routeTreeFileHeader: [],
|
|
154
|
+
routeTreeFileFooter: []
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
return { code: buildResult.routeTreeContent, map: null };
|
|
35
158
|
}
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
return [
|
|
162
|
+
clientTreePlugin,
|
|
163
|
+
tanstackRouterGenerator(() => {
|
|
164
|
+
const routerConfig = getConfig().startConfig.router;
|
|
165
|
+
return {
|
|
166
|
+
...routerConfig,
|
|
167
|
+
target: corePluginOpts.framework,
|
|
168
|
+
routeTreeFileFooter: getRouteTreeFileFooter,
|
|
169
|
+
plugins: [clientTreeGeneratorPlugin, routesManifestPlugin()]
|
|
170
|
+
};
|
|
171
|
+
}),
|
|
172
|
+
tanStackRouterCodeSplitter(() => {
|
|
173
|
+
const routerConfig = getConfig().startConfig.router;
|
|
174
|
+
return {
|
|
175
|
+
...routerConfig,
|
|
176
|
+
codeSplittingOptions: {
|
|
177
|
+
...routerConfig.codeSplittingOptions,
|
|
178
|
+
deleteNodes: ["ssr", "server"],
|
|
179
|
+
addHmr: true
|
|
180
|
+
},
|
|
181
|
+
plugin: {
|
|
182
|
+
vite: { environmentName: VITE_ENVIRONMENT_NAMES.client }
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
}),
|
|
186
|
+
tanStackRouterCodeSplitter(() => {
|
|
187
|
+
const routerConfig = getConfig().startConfig.router;
|
|
188
|
+
return {
|
|
189
|
+
...routerConfig,
|
|
190
|
+
codeSplittingOptions: {
|
|
191
|
+
...routerConfig.codeSplittingOptions,
|
|
192
|
+
addHmr: false
|
|
193
|
+
},
|
|
194
|
+
plugin: {
|
|
195
|
+
vite: { environmentName: VITE_ENVIRONMENT_NAMES.server }
|
|
196
|
+
}
|
|
197
|
+
};
|
|
36
198
|
}),
|
|
37
|
-
tanstackRouterAutoImport(
|
|
38
|
-
routeTreeClientPlugin(config),
|
|
39
|
-
virtualRouteTreePlugin(config)
|
|
199
|
+
tanstackRouterAutoImport(startPluginOpts?.router)
|
|
40
200
|
];
|
|
41
201
|
}
|
|
42
202
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sources":["../../../src/start-router-plugin/plugin.ts"],"sourcesContent":["/*\nwhat is this plugin doing, especially compared to one already existing in the @tanstack/router-plugin package?\n\nit configures:\n1. the generator to generate both the render-route-tree as well as the server-route-tree\n2. the code-splitter plugin, so it could possibly be enabled per environment (e.g. disable on the server)\n3. the auto import plugin for both environments\n4. the route tree client plugin, which removes the server part from the generated route tree\n5. the virtual route tree plugin, which provides the route tree to the server\n*/\n\nimport {\n tanStackRouterCodeSplitter,\n tanstackRouterAutoImport,\n tanstackRouterGenerator,\n} from '@tanstack/router-plugin/vite'\nimport { VITE_ENVIRONMENT_NAMES } from '../constants'\nimport { routeTreeClientPlugin } from './route-tree-client-plugin'\nimport { virtualRouteTreePlugin } from './virtual-route-tree-plugin'\nimport { routesManifestPlugin } from './generator-plugins/routes-manifest-plugin'\nimport { serverRoutesPlugin } from './generator-plugins/server-routes-plugin'\nimport type { PluginOption } from 'vite'\nimport type { Config } from '@tanstack/router-plugin'\n\nexport function tanStackStartRouter(config: Config): Array<PluginOption> {\n return [\n tanstackRouterGenerator({\n ...config,\n plugins: [serverRoutesPlugin(), routesManifestPlugin()],\n plugin: {\n vite: { environmentName: VITE_ENVIRONMENT_NAMES.client },\n },\n }),\n tanStackRouterCodeSplitter({\n ...config,\n codeSplittingOptions: {\n ...config.codeSplittingOptions,\n deleteNodes: ['ssr'],\n addHmr: true,\n },\n plugin: {\n vite: { environmentName: VITE_ENVIRONMENT_NAMES.client },\n },\n }),\n tanStackRouterCodeSplitter({\n ...config,\n codeSplittingOptions: {\n ...config.codeSplittingOptions,\n addHmr: false,\n },\n plugin: {\n vite: { environmentName: VITE_ENVIRONMENT_NAMES.server },\n },\n }),\n tanstackRouterAutoImport(config),\n routeTreeClientPlugin(config),\n virtualRouteTreePlugin(config),\n ]\n}\n"],"names":[],"mappings":";;;;;;AAwBO,SAAS,oBAAoB,QAAqC;AACvE,SAAO;AAAA,IACL,wBAAwB;AAAA,MACtB,GAAG;AAAA,MACH,SAAS,CAAC,sBAAsB,sBAAsB;AAAA,MACtD,QAAQ;AAAA,QACN,MAAM,EAAE,iBAAiB,uBAAuB,OAAA;AAAA,MAAO;AAAA,IACzD,CACD;AAAA,IACD,2BAA2B;AAAA,MACzB,GAAG;AAAA,MACH,sBAAsB;AAAA,QACpB,GAAG,OAAO;AAAA,QACV,aAAa,CAAC,KAAK;AAAA,QACnB,QAAQ;AAAA,MAAA;AAAA,MAEV,QAAQ;AAAA,QACN,MAAM,EAAE,iBAAiB,uBAAuB,OAAA;AAAA,MAAO;AAAA,IACzD,CACD;AAAA,IACD,2BAA2B;AAAA,MACzB,GAAG;AAAA,MACH,sBAAsB;AAAA,QACpB,GAAG,OAAO;AAAA,QACV,QAAQ;AAAA,MAAA;AAAA,MAEV,QAAQ;AAAA,QACN,MAAM,EAAE,iBAAiB,uBAAuB,OAAA;AAAA,MAAO;AAAA,IACzD,CACD;AAAA,IACD,yBAAyB,MAAM;AAAA,IAC/B,sBAAsB,MAAM;AAAA,IAC5B,uBAAuB,MAAM;AAAA,EAAA;AAEjC;"}
|
|
1
|
+
{"version":3,"file":"plugin.js","sources":["../../../src/start-router-plugin/plugin.ts"],"sourcesContent":["import {\n tanStackRouterCodeSplitter,\n tanstackRouterAutoImport,\n tanstackRouterGenerator,\n} from '@tanstack/router-plugin/vite'\nimport { normalizePath } from 'vite'\nimport path from 'pathe'\nimport { VITE_ENVIRONMENT_NAMES } from '../constants'\nimport { routesManifestPlugin } from './generator-plugins/routes-manifest-plugin'\nimport { pruneServerOnlySubtrees } from './pruneServerOnlySubtrees'\nimport { SERVER_PROP } from './constants'\nimport type {\n Generator,\n GeneratorPlugin,\n RouteNode,\n} from '@tanstack/router-generator'\nimport type { DevEnvironment, Plugin, PluginOption } from 'vite'\nimport type { TanStackStartInputConfig } from '../schema'\nimport type { GetConfigFn, TanStackStartVitePluginCoreOptions } from '../plugin'\n\nfunction isServerOnlyNode(node: RouteNode | undefined) {\n if (!node?.createFileRouteProps) {\n return false\n }\n return (\n node.createFileRouteProps.has(SERVER_PROP) &&\n node.createFileRouteProps.size === 1\n )\n}\n\nfunction moduleDeclaration({\n startFilePath,\n routerFilePath,\n corePluginOpts,\n generatedRouteTreePath,\n}: {\n startFilePath: string | undefined\n routerFilePath: string\n corePluginOpts: TanStackStartVitePluginCoreOptions\n generatedRouteTreePath: string\n}): string {\n function getImportPath(absolutePath: string) {\n let relativePath = path.relative(\n path.dirname(generatedRouteTreePath),\n absolutePath,\n )\n\n if (!relativePath.startsWith('.')) {\n relativePath = './' + relativePath\n }\n\n // convert to POSIX-style for ESM imports (important on Windows)\n relativePath = relativePath.split(path.sep).join('/')\n return relativePath\n }\n\n const result: Array<string> = [\n `import type { getRouter } from '${getImportPath(routerFilePath)}'`,\n ]\n if (startFilePath) {\n result.push(\n `import type { startInstance } from '${getImportPath(startFilePath)}'`,\n )\n }\n // make sure we import something from start to get the server route declaration merge\n else {\n result.push(\n `import type { createStart } from '@tanstack/${corePluginOpts.framework}-start'`,\n )\n }\n result.push(\n `declare module '@tanstack/${corePluginOpts.framework}-start' {\n interface Register {\n router: Awaited<ReturnType<typeof getRouter>>`,\n )\n if (startFilePath) {\n result.push(\n ` config: Awaited<ReturnType<typeof startInstance.getOptions>>`,\n )\n }\n result.push(` }\n}`)\n\n return result.join('\\n')\n}\n\nexport function tanStackStartRouter(\n startPluginOpts: TanStackStartInputConfig,\n getConfig: GetConfigFn,\n corePluginOpts: TanStackStartVitePluginCoreOptions,\n): Array<PluginOption> {\n const getGeneratedRouteTreePath = () => {\n const { startConfig } = getConfig()\n return path.resolve(startConfig.router.generatedRouteTree)\n }\n\n let clientEnvironment: DevEnvironment | null = null\n function invalidate() {\n if (!clientEnvironment) {\n return\n }\n\n const mod = clientEnvironment.moduleGraph.getModuleById(\n getGeneratedRouteTreePath(),\n )\n if (mod) {\n clientEnvironment.moduleGraph.invalidateModule(mod)\n }\n clientEnvironment.hot.send({ type: 'full-reload', path: '*' })\n }\n\n let generatorInstance: Generator | null = null\n\n const clientTreeGeneratorPlugin: GeneratorPlugin = {\n name: 'start-client-tree-plugin',\n init({ generator }) {\n generatorInstance = generator\n },\n afterTransform({ node, prevNode }) {\n if (isServerOnlyNode(node) !== isServerOnlyNode(prevNode)) {\n invalidate()\n }\n },\n }\n\n let routeTreeFileFooter: Array<string> | null = null\n\n function getRouteTreeFileFooter() {\n if (routeTreeFileFooter) {\n return routeTreeFileFooter\n }\n const { startConfig, resolvedStartConfig } = getConfig()\n const ogRouteTreeFileFooter = startConfig.router.routeTreeFileFooter\n if (ogRouteTreeFileFooter) {\n if (Array.isArray(ogRouteTreeFileFooter)) {\n routeTreeFileFooter = ogRouteTreeFileFooter\n } else {\n routeTreeFileFooter = ogRouteTreeFileFooter()\n }\n }\n routeTreeFileFooter = [\n moduleDeclaration({\n generatedRouteTreePath: getGeneratedRouteTreePath(),\n corePluginOpts,\n startFilePath: resolvedStartConfig.startFilePath,\n routerFilePath: resolvedStartConfig.routerFilePath,\n }),\n ...(routeTreeFileFooter ?? []),\n ]\n return routeTreeFileFooter\n }\n\n let resolvedGeneratedRouteTreePath: string | null = null\n const clientTreePlugin: Plugin = {\n name: 'tanstack-start:route-tree-client-plugin',\n enforce: 'pre',\n applyToEnvironment: (env) => env.name === VITE_ENVIRONMENT_NAMES.client,\n configureServer(server) {\n clientEnvironment = server.environments[VITE_ENVIRONMENT_NAMES.client]\n },\n config() {\n type LoadObjectHook = Extract<\n typeof clientTreePlugin.load,\n { filter?: unknown }\n >\n resolvedGeneratedRouteTreePath = normalizePath(\n getGeneratedRouteTreePath(),\n )\n ;(clientTreePlugin.load as LoadObjectHook).filter = {\n id: { include: new RegExp(resolvedGeneratedRouteTreePath) },\n }\n },\n\n load: {\n filter: {\n // this will be set in the config hook above since it relies on `config` hook being called first\n },\n async handler() {\n if (!generatorInstance) {\n throw new Error('Generator instance not initialized')\n }\n const crawlingResult = await generatorInstance.getCrawlingResult()\n if (!crawlingResult) {\n throw new Error('Crawling result not available')\n }\n const prunedAcc = pruneServerOnlySubtrees(crawlingResult)\n const acc = {\n ...crawlingResult.acc,\n ...prunedAcc,\n }\n const buildResult = generatorInstance.buildRouteTree({\n ...crawlingResult,\n acc,\n config: {\n // importRoutesUsingAbsolutePaths: true,\n // addExtensions: true,\n disableTypes: true,\n enableRouteTreeFormatting: false,\n routeTreeFileHeader: [],\n routeTreeFileFooter: [],\n },\n })\n return { code: buildResult.routeTreeContent, map: null }\n },\n },\n }\n return [\n clientTreePlugin,\n tanstackRouterGenerator(() => {\n const routerConfig = getConfig().startConfig.router\n return {\n ...routerConfig,\n target: corePluginOpts.framework,\n routeTreeFileFooter: getRouteTreeFileFooter,\n plugins: [clientTreeGeneratorPlugin, routesManifestPlugin()],\n }\n }),\n tanStackRouterCodeSplitter(() => {\n const routerConfig = getConfig().startConfig.router\n return {\n ...routerConfig,\n codeSplittingOptions: {\n ...routerConfig.codeSplittingOptions,\n deleteNodes: ['ssr', 'server'],\n addHmr: true,\n },\n plugin: {\n vite: { environmentName: VITE_ENVIRONMENT_NAMES.client },\n },\n }\n }),\n tanStackRouterCodeSplitter(() => {\n const routerConfig = getConfig().startConfig.router\n return {\n ...routerConfig,\n codeSplittingOptions: {\n ...routerConfig.codeSplittingOptions,\n addHmr: false,\n },\n plugin: {\n vite: { environmentName: VITE_ENVIRONMENT_NAMES.server },\n },\n }\n }),\n tanstackRouterAutoImport(startPluginOpts?.router),\n ]\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { HandleNodeAccumulator, RouteNode } from '@tanstack/router-generator';
|
|
2
|
+
export declare function pruneServerOnlySubtrees({ rootRouteNode, acc, }: {
|
|
3
|
+
rootRouteNode: RouteNode;
|
|
4
|
+
acc: HandleNodeAccumulator;
|
|
5
|
+
}): {
|
|
6
|
+
routeTree: RouteNode[];
|
|
7
|
+
routeNodes: RouteNode[];
|
|
8
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { SERVER_PROP } from "./constants.js";
|
|
2
|
+
function pruneServerOnlySubtrees({
|
|
3
|
+
rootRouteNode,
|
|
4
|
+
acc
|
|
5
|
+
}) {
|
|
6
|
+
const routeNodes = [];
|
|
7
|
+
const routeTree = prune({ ...rootRouteNode, children: acc.routeTree }, routeNodes)?.children || [];
|
|
8
|
+
routeNodes.pop();
|
|
9
|
+
return {
|
|
10
|
+
routeTree,
|
|
11
|
+
routeNodes
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function prune(node, collectedRouteNodes) {
|
|
15
|
+
const newChildren = [];
|
|
16
|
+
let allChildrenServerOnly = true;
|
|
17
|
+
for (const child of node.children || []) {
|
|
18
|
+
const newChild = prune(child, collectedRouteNodes);
|
|
19
|
+
if (newChild) {
|
|
20
|
+
newChildren.push(newChild);
|
|
21
|
+
allChildrenServerOnly = false;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const allServerOnly = node.createFileRouteProps?.has(SERVER_PROP) && node.createFileRouteProps.size === 1 && allChildrenServerOnly;
|
|
25
|
+
if (allServerOnly) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
collectedRouteNodes.push(node);
|
|
29
|
+
return { ...node, children: newChildren };
|
|
30
|
+
}
|
|
31
|
+
export {
|
|
32
|
+
pruneServerOnlySubtrees
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=pruneServerOnlySubtrees.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pruneServerOnlySubtrees.js","sources":["../../../src/start-router-plugin/pruneServerOnlySubtrees.ts"],"sourcesContent":["import { SERVER_PROP } from './constants'\nimport type {\n HandleNodeAccumulator,\n RouteNode,\n} from '@tanstack/router-generator'\n\nexport function pruneServerOnlySubtrees({\n rootRouteNode,\n acc,\n}: {\n rootRouteNode: RouteNode\n acc: HandleNodeAccumulator\n}) {\n const routeNodes: Array<RouteNode> = []\n const routeTree =\n prune({ ...rootRouteNode, children: acc.routeTree }, routeNodes)\n ?.children || []\n // remove root node from routeNodes\n routeNodes.pop()\n return {\n routeTree,\n routeNodes,\n }\n}\nfunction prune(\n node: RouteNode,\n collectedRouteNodes: Array<RouteNode>,\n): RouteNode | null {\n const newChildren: Array<RouteNode> = []\n let allChildrenServerOnly = true\n\n for (const child of node.children || []) {\n const newChild = prune(child, collectedRouteNodes)\n if (newChild) {\n newChildren.push(newChild)\n // at least one child survived pruning\n allChildrenServerOnly = false\n }\n }\n\n const allServerOnly =\n node.createFileRouteProps?.has(SERVER_PROP) &&\n node.createFileRouteProps.size === 1 &&\n allChildrenServerOnly\n // prune this subtree\n if (allServerOnly) {\n return null\n }\n collectedRouteNodes.push(node)\n return { ...node, children: newChildren }\n}\n"],"names":[],"mappings":";AAMO,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AACF,GAGG;AACD,QAAM,aAA+B,CAAA;AACrC,QAAM,YACJ,MAAM,EAAE,GAAG,eAAe,UAAU,IAAI,UAAA,GAAa,UAAU,GAC3D,YAAY,CAAA;AAElB,aAAW,IAAA;AACX,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EAAA;AAEJ;AACA,SAAS,MACP,MACA,qBACkB;AAClB,QAAM,cAAgC,CAAA;AACtC,MAAI,wBAAwB;AAE5B,aAAW,SAAS,KAAK,YAAY,CAAA,GAAI;AACvC,UAAM,WAAW,MAAM,OAAO,mBAAmB;AACjD,QAAI,UAAU;AACZ,kBAAY,KAAK,QAAQ;AAEzB,8BAAwB;AAAA,IAC1B;AAAA,EACF;AAEA,QAAM,gBACJ,KAAK,sBAAsB,IAAI,WAAW,KAC1C,KAAK,qBAAqB,SAAS,KACnC;AAEF,MAAI,eAAe;AACjB,WAAO;AAAA,EACT;AACA,sBAAoB,KAAK,IAAI;AAC7B,SAAO,EAAE,GAAG,MAAM,UAAU,YAAA;AAC9B;"}
|