@tanstack/start-plugin-core 1.132.0-alpha.8 → 1.132.0
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 +64 -0
- package/dist/esm/create-server-fn-plugin/compiler.js +364 -0
- package/dist/esm/create-server-fn-plugin/compiler.js.map +1 -0
- 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.d.ts +6 -0
- package/dist/esm/{start-compiler-plugin/serverFn.js → create-server-fn-plugin/handleCreateServerFn.js} +15 -17
- package/dist/esm/create-server-fn-plugin/handleCreateServerFn.js.map +1 -0
- package/dist/esm/create-server-fn-plugin/plugin.d.ts +3 -0
- package/dist/esm/create-server-fn-plugin/plugin.js +128 -0
- package/dist/esm/create-server-fn-plugin/plugin.js.map +1 -0
- 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 +56 -68
- 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 -55
- 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 -6
- package/dist/esm/start-compiler-plugin/constants.js.map +1 -1
- package/dist/esm/start-compiler-plugin/plugin.d.ts +1 -8
- package/dist/esm/start-compiler-plugin/plugin.js +6 -13
- package/dist/esm/start-compiler-plugin/plugin.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 +498 -0
- package/src/{start-compiler-plugin/middleware.ts → create-server-fn-plugin/handleCreateMiddleware.ts} +15 -12
- package/src/{start-compiler-plugin/serverFn.ts → create-server-fn-plugin/handleCreateServerFn.ts} +32 -39
- package/src/create-server-fn-plugin/plugin.ts +153 -0
- package/src/dev-server-plugin/plugin.ts +6 -3
- package/src/plugin.ts +78 -87
- package/src/resolve-entries.ts +1 -2
- package/src/schema.ts +31 -14
- package/src/start-compiler-plugin/compilers.ts +18 -57
- package/src/start-compiler-plugin/constants.ts +0 -5
- package/src/start-compiler-plugin/plugin.ts +7 -22
- 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-compiler-plugin/serverFn.d.ts +0 -4
- package/dist/esm/start-compiler-plugin/serverFn.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,71 +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
|
-
import { handleCreateServerFnCallExpression } from "./serverFn.js";
|
|
10
7
|
import { handleCreateClientOnlyFnCallExpression, handleCreateServerOnlyFnCallExpression } from "./envOnly.js";
|
|
11
|
-
const getIdentifiers = (framework) => ({
|
|
12
|
-
createServerRootRoute: {
|
|
13
|
-
name: "createServerRootRoute",
|
|
14
|
-
handleCallExpression: handleCreateServerFileRouteCallExpressionFactory(
|
|
15
|
-
framework,
|
|
16
|
-
"createServerRootRoute"
|
|
17
|
-
),
|
|
18
|
-
paths: []
|
|
19
|
-
},
|
|
20
|
-
createServerRoute: {
|
|
21
|
-
name: "createServerRoute",
|
|
22
|
-
handleCallExpression: handleCreateServerFileRouteCallExpressionFactory(
|
|
23
|
-
framework,
|
|
24
|
-
"createServerRoute"
|
|
25
|
-
),
|
|
26
|
-
paths: []
|
|
27
|
-
},
|
|
28
|
-
createServerFileRoute: {
|
|
29
|
-
name: "createServerFileRoute",
|
|
30
|
-
handleCallExpression: handleCreateServerFileRouteCallExpressionFactory(
|
|
31
|
-
framework,
|
|
32
|
-
"createServerFileRoute"
|
|
33
|
-
),
|
|
34
|
-
paths: []
|
|
35
|
-
},
|
|
36
|
-
createServerFn: {
|
|
37
|
-
name: "createServerFn",
|
|
38
|
-
handleCallExpression: handleCreateServerFnCallExpression,
|
|
39
|
-
paths: []
|
|
40
|
-
},
|
|
41
|
-
createMiddleware: {
|
|
42
|
-
name: "createMiddleware",
|
|
43
|
-
handleCallExpression: handleCreateMiddlewareCallExpression,
|
|
44
|
-
paths: []
|
|
45
|
-
},
|
|
46
|
-
createServerOnlyFn: {
|
|
47
|
-
name: "createServerOnlyFn",
|
|
48
|
-
handleCallExpression: handleCreateServerOnlyFnCallExpression,
|
|
49
|
-
paths: []
|
|
50
|
-
},
|
|
51
|
-
createClientOnlyFn: {
|
|
52
|
-
name: "createClientOnlyFn",
|
|
53
|
-
handleCallExpression: handleCreateClientOnlyFnCallExpression,
|
|
54
|
-
paths: []
|
|
55
|
-
},
|
|
56
|
-
createIsomorphicFn: {
|
|
57
|
-
name: "createIsomorphicFn",
|
|
58
|
-
handleCallExpression: handleCreateIsomorphicFnCallExpression,
|
|
59
|
-
paths: []
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
8
|
function compileStartOutputFactory(framework) {
|
|
63
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
|
+
};
|
|
64
27
|
const ast = parseAst(opts);
|
|
65
28
|
const doDce = opts.dce ?? true;
|
|
66
29
|
const refIdents = doDce ? findReferencedIdentifiers(ast) : void 0;
|
|
67
30
|
babel.traverse(ast, {
|
|
68
31
|
Program: {
|
|
69
32
|
enter(programPath) {
|
|
70
|
-
const identifiers = getIdentifiers(framework);
|
|
71
33
|
programPath.traverse({
|
|
72
34
|
ImportDeclaration: (path) => {
|
|
73
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,12 +1,7 @@
|
|
|
1
1
|
const transformFuncs = [
|
|
2
|
-
"createServerFn",
|
|
3
|
-
"createMiddleware",
|
|
4
2
|
"createServerOnlyFn",
|
|
5
3
|
"createClientOnlyFn",
|
|
6
|
-
"createIsomorphicFn"
|
|
7
|
-
"createServerRoute",
|
|
8
|
-
"createServerFileRoute",
|
|
9
|
-
"createServerRootRoute"
|
|
4
|
+
"createIsomorphicFn"
|
|
10
5
|
];
|
|
11
6
|
export {
|
|
12
7
|
transformFuncs
|
|
@@ -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;"}
|
|
@@ -3,11 +3,4 @@ import { CompileStartFrameworkOptions } from './compilers.js';
|
|
|
3
3
|
export type TanStackStartViteOptions = {
|
|
4
4
|
globalMiddlewareEntry: string;
|
|
5
5
|
};
|
|
6
|
-
export declare function startCompilerPlugin(framework: CompileStartFrameworkOptions
|
|
7
|
-
client?: {
|
|
8
|
-
envName?: string;
|
|
9
|
-
};
|
|
10
|
-
server?: {
|
|
11
|
-
envName?: string;
|
|
12
|
-
};
|
|
13
|
-
}): Plugin;
|
|
6
|
+
export declare function startCompilerPlugin(framework: CompileStartFrameworkOptions): Plugin;
|
|
@@ -19,23 +19,16 @@ function resolvePackage(packageName) {
|
|
|
19
19
|
const pkgRoot = path.dirname(require2.resolve(packageName + "/package.json"));
|
|
20
20
|
return pkgRoot;
|
|
21
21
|
}
|
|
22
|
-
function startCompilerPlugin(framework
|
|
23
|
-
const opts = {
|
|
24
|
-
client: {
|
|
25
|
-
envName: VITE_ENVIRONMENT_NAMES.client,
|
|
26
|
-
...inputOpts?.client
|
|
27
|
-
},
|
|
28
|
-
server: {
|
|
29
|
-
envName: VITE_ENVIRONMENT_NAMES.server,
|
|
30
|
-
...inputOpts?.server
|
|
31
|
-
}
|
|
32
|
-
};
|
|
22
|
+
function startCompilerPlugin(framework) {
|
|
33
23
|
const compileStartOutput = compileStartOutputFactory(framework);
|
|
34
24
|
return {
|
|
35
25
|
name: "tanstack-start-core:compiler",
|
|
36
26
|
enforce: "pre",
|
|
37
27
|
applyToEnvironment(env) {
|
|
38
|
-
return [
|
|
28
|
+
return [
|
|
29
|
+
VITE_ENVIRONMENT_NAMES.client,
|
|
30
|
+
VITE_ENVIRONMENT_NAMES.server
|
|
31
|
+
].includes(env.name);
|
|
39
32
|
},
|
|
40
33
|
transform: {
|
|
41
34
|
filter: {
|
|
@@ -74,7 +67,7 @@ function startCompilerPlugin(framework, inputOpts) {
|
|
|
74
67
|
}
|
|
75
68
|
},
|
|
76
69
|
handler(code, id) {
|
|
77
|
-
const env = this.environment.name ===
|
|
70
|
+
const env = this.environment.name === VITE_ENVIRONMENT_NAMES.client ? "client" : this.environment.name === VITE_ENVIRONMENT_NAMES.server ? "server" : (() => {
|
|
78
71
|
throw new Error(
|
|
79
72
|
`Environment ${this.environment.name} not configured`
|
|
80
73
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sources":["../../../src/start-compiler-plugin/plugin.ts"],"sourcesContent":["import { fileURLToPath, pathToFileURL } from 'node:url'\nimport { createRequire } from 'node:module'\nimport { logDiff } from '@tanstack/router-utils'\n\nimport { VIRTUAL_MODULES } from '@tanstack/start-server-core'\nimport { normalizePath } from 'vite'\nimport path from 'pathe'\nimport { VITE_ENVIRONMENT_NAMES } from '../constants'\nimport { compileStartOutputFactory } from './compilers'\nimport { transformFuncs } from './constants'\nimport type { Plugin } from 'vite'\nimport type { CompileStartFrameworkOptions } from './compilers'\n\nconst debug =\n process.env.TSR_VITE_DEBUG &&\n ['true', 'start-plugin'].includes(process.env.TSR_VITE_DEBUG)\n\nexport type TanStackStartViteOptions = {\n globalMiddlewareEntry: string\n}\n\nconst tokenRegex = new RegExp(transformFuncs.join('|'))\n\nconst require = createRequire(import.meta.url)\n\nfunction resolveRuntimeFiles(opts: { package: string; files: Array<string> }) {\n const pkgRoot = resolvePackage(opts.package)\n const basePath = path.join(pkgRoot, 'dist', 'esm')\n\n return opts.files.map((file) => normalizePath(path.join(basePath, file)))\n}\n\nfunction resolvePackage(packageName: string): string {\n const pkgRoot = path.dirname(require.resolve(packageName + '/package.json'))\n return pkgRoot\n}\n\nexport function startCompilerPlugin(\n framework: CompileStartFrameworkOptions,\n
|
|
1
|
+
{"version":3,"file":"plugin.js","sources":["../../../src/start-compiler-plugin/plugin.ts"],"sourcesContent":["import { fileURLToPath, pathToFileURL } from 'node:url'\nimport { createRequire } from 'node:module'\nimport { logDiff } from '@tanstack/router-utils'\n\nimport { VIRTUAL_MODULES } from '@tanstack/start-server-core'\nimport { normalizePath } from 'vite'\nimport path from 'pathe'\nimport { VITE_ENVIRONMENT_NAMES } from '../constants'\nimport { compileStartOutputFactory } from './compilers'\nimport { transformFuncs } from './constants'\nimport type { ViteEnvironmentNames } from '../constants'\nimport type { Plugin } from 'vite'\nimport type { CompileStartFrameworkOptions } from './compilers'\n\nconst debug =\n process.env.TSR_VITE_DEBUG &&\n ['true', 'start-plugin'].includes(process.env.TSR_VITE_DEBUG)\n\nexport type TanStackStartViteOptions = {\n globalMiddlewareEntry: string\n}\n\nconst tokenRegex = new RegExp(transformFuncs.join('|'))\n\nconst require = createRequire(import.meta.url)\n\nfunction resolveRuntimeFiles(opts: { package: string; files: Array<string> }) {\n const pkgRoot = resolvePackage(opts.package)\n const basePath = path.join(pkgRoot, 'dist', 'esm')\n\n return opts.files.map((file) => normalizePath(path.join(basePath, file)))\n}\n\nfunction resolvePackage(packageName: string): string {\n const pkgRoot = path.dirname(require.resolve(packageName + '/package.json'))\n return pkgRoot\n}\n\nexport function startCompilerPlugin(\n framework: CompileStartFrameworkOptions,\n): Plugin {\n const compileStartOutput = compileStartOutputFactory(framework)\n\n return {\n name: 'tanstack-start-core:compiler',\n enforce: 'pre',\n applyToEnvironment(env) {\n return [\n VITE_ENVIRONMENT_NAMES.client,\n VITE_ENVIRONMENT_NAMES.server,\n ].includes(env.name as ViteEnvironmentNames)\n },\n transform: {\n filter: {\n code: tokenRegex,\n id: {\n exclude: [\n VIRTUAL_MODULES.serverFnManifest,\n // N.B. the following files either just re-export or provide the runtime implementation of those functions\n // we do not want to include them in the transformation\n // however, those packages (especially start-client-core ATM) also USE these functions\n // (namely `createIsomorphicFn` in `packages/start-client-core/src/getRouterInstance.ts`) and thus need to be transformed\n ...resolveRuntimeFiles({\n package: '@tanstack/start-client-core',\n files: [\n 'index.js',\n 'createIsomorphicFn.js',\n 'envOnly.js',\n 'createServerFn.js',\n 'createMiddleware.js',\n 'serverFnFetcher.js',\n ],\n }),\n ...resolveRuntimeFiles({\n package: '@tanstack/start-server-core',\n files: [\n 'index.js',\n 'server-functions-handler.js',\n 'serverRoute.js',\n ],\n }),\n ...resolveRuntimeFiles({\n package: `@tanstack/${framework}-start-client`,\n files: ['index.js'],\n }),\n ],\n },\n },\n handler(code, id) {\n const env =\n this.environment.name === VITE_ENVIRONMENT_NAMES.client\n ? 'client'\n : this.environment.name === VITE_ENVIRONMENT_NAMES.server\n ? 'server'\n : (() => {\n throw new Error(\n `Environment ${this.environment.name} not configured`,\n )\n })()\n\n const url = pathToFileURL(id)\n url.searchParams.delete('v')\n id = fileURLToPath(url).replace(/\\\\/g, '/')\n\n if (debug) console.info(`${env} Compiling Start: `, id)\n\n const compiled = compileStartOutput({\n code,\n filename: id,\n env,\n })\n\n if (debug) {\n logDiff(code, compiled.code)\n console.log('Output:\\n', compiled.code + '\\n\\n')\n }\n\n return compiled\n },\n },\n }\n}\n"],"names":["require"],"mappings":";;;;;;;;;AAcA,MAAM,QACJ,QAAQ,IAAI,kBACZ,CAAC,QAAQ,cAAc,EAAE,SAAS,QAAQ,IAAI,cAAc;AAM9D,MAAM,aAAa,IAAI,OAAO,eAAe,KAAK,GAAG,CAAC;AAEtD,MAAMA,WAAU,cAAc,YAAY,GAAG;AAE7C,SAAS,oBAAoB,MAAiD;AAC5E,QAAM,UAAU,eAAe,KAAK,OAAO;AAC3C,QAAM,WAAW,KAAK,KAAK,SAAS,QAAQ,KAAK;AAEjD,SAAO,KAAK,MAAM,IAAI,CAAC,SAAS,cAAc,KAAK,KAAK,UAAU,IAAI,CAAC,CAAC;AAC1E;AAEA,SAAS,eAAe,aAA6B;AACnD,QAAM,UAAU,KAAK,QAAQA,SAAQ,QAAQ,cAAc,eAAe,CAAC;AAC3E,SAAO;AACT;AAEO,SAAS,oBACd,WACQ;AACR,QAAM,qBAAqB,0BAA0B,SAAS;AAE9D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,mBAAmB,KAAK;AACtB,aAAO;AAAA,QACL,uBAAuB;AAAA,QACvB,uBAAuB;AAAA,MAAA,EACvB,SAAS,IAAI,IAA4B;AAAA,IAC7C;AAAA,IACA,WAAW;AAAA,MACT,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,IAAI;AAAA,UACF,SAAS;AAAA,YACP,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,YAKhB,GAAG,oBAAoB;AAAA,cACrB,SAAS;AAAA,cACT,OAAO;AAAA,gBACL;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cAAA;AAAA,YACF,CACD;AAAA,YACD,GAAG,oBAAoB;AAAA,cACrB,SAAS;AAAA,cACT,OAAO;AAAA,gBACL;AAAA,gBACA;AAAA,gBACA;AAAA,cAAA;AAAA,YACF,CACD;AAAA,YACD,GAAG,oBAAoB;AAAA,cACrB,SAAS,aAAa,SAAS;AAAA,cAC/B,OAAO,CAAC,UAAU;AAAA,YAAA,CACnB;AAAA,UAAA;AAAA,QACH;AAAA,MACF;AAAA,MAEF,QAAQ,MAAM,IAAI;AAChB,cAAM,MACJ,KAAK,YAAY,SAAS,uBAAuB,SAC7C,WACA,KAAK,YAAY,SAAS,uBAAuB,SAC/C,YACC,MAAM;AACL,gBAAM,IAAI;AAAA,YACR,eAAe,KAAK,YAAY,IAAI;AAAA,UAAA;AAAA,QAExC,GAAA;AAER,cAAM,MAAM,cAAc,EAAE;AAC5B,YAAI,aAAa,OAAO,GAAG;AAC3B,aAAK,cAAc,GAAG,EAAE,QAAQ,OAAO,GAAG;AAE1C,YAAI,MAAO,SAAQ,KAAK,GAAG,GAAG,sBAAsB,EAAE;AAEtD,cAAM,WAAW,mBAAmB;AAAA,UAClC;AAAA,UACA,UAAU;AAAA,UACV;AAAA,QAAA,CACD;AAED,YAAI,OAAO;AACT,kBAAQ,MAAM,SAAS,IAAI;AAC3B,kBAAQ,IAAI,aAAa,SAAS,OAAO,MAAM;AAAA,QACjD;AAEA,eAAO;AAAA,MACT;AAAA,IAAA;AAAA,EACF;AAEJ;"}
|
|
@@ -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 {
|