@tanstack/start-plugin-core 1.169.1 → 1.169.3
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/rsbuild/normalized-client-build.js +9 -1
- package/dist/esm/rsbuild/normalized-client-build.js.map +1 -1
- package/dist/esm/rsbuild/plugin.js +4 -1
- package/dist/esm/rsbuild/plugin.js.map +1 -1
- package/dist/esm/rsbuild/schema.d.ts +8 -0
- package/dist/esm/rsbuild/virtual-modules.js +14 -13
- package/dist/esm/rsbuild/virtual-modules.js.map +1 -1
- package/dist/esm/schema.d.ts +25 -0
- package/dist/esm/schema.js +4 -1
- package/dist/esm/schema.js.map +1 -1
- package/dist/esm/start-manifest-plugin/inlineCss.d.ts +6 -0
- package/dist/esm/start-manifest-plugin/inlineCss.js +59 -0
- package/dist/esm/start-manifest-plugin/inlineCss.js.map +1 -0
- package/dist/esm/start-manifest-plugin/manifestBuilder.d.ts +4 -0
- package/dist/esm/start-manifest-plugin/manifestBuilder.js +32 -2
- package/dist/esm/start-manifest-plugin/manifestBuilder.js.map +1 -1
- package/dist/esm/types.d.ts +1 -0
- package/dist/esm/vite/planning.d.ts +3 -0
- package/dist/esm/vite/planning.js +1 -0
- package/dist/esm/vite/planning.js.map +1 -1
- package/dist/esm/vite/plugin.js +1 -0
- package/dist/esm/vite/plugin.js.map +1 -1
- package/dist/esm/vite/schema.d.ts +8 -0
- package/dist/esm/vite/start-manifest-plugin/normalized-client-build.js +11 -1
- package/dist/esm/vite/start-manifest-plugin/normalized-client-build.js.map +1 -1
- package/dist/esm/vite/start-manifest-plugin/plugin.js +2 -1
- package/dist/esm/vite/start-manifest-plugin/plugin.js.map +1 -1
- package/package.json +8 -7
- package/src/rsbuild/normalized-client-build.ts +14 -0
- package/src/rsbuild/plugin.ts +7 -0
- package/src/rsbuild/virtual-modules.ts +15 -5
- package/src/schema.ts +6 -0
- package/src/start-manifest-plugin/inlineCss.ts +93 -0
- package/src/start-manifest-plugin/manifestBuilder.ts +72 -2
- package/src/types.ts +1 -0
- package/src/vite/planning.ts +5 -0
- package/src/vite/plugin.ts +2 -0
- package/src/vite/start-manifest-plugin/normalized-client-build.ts +19 -0
- package/src/vite/start-manifest-plugin/plugin.ts +2 -1
package/dist/esm/schema.d.ts
CHANGED
|
@@ -173,6 +173,7 @@ export declare function parseStartConfig(opts: z.input<typeof tanstackStartOptio
|
|
|
173
173
|
server: {
|
|
174
174
|
build: {
|
|
175
175
|
staticNodeEnv: boolean;
|
|
176
|
+
inlineCss: boolean;
|
|
176
177
|
};
|
|
177
178
|
entry?: string | undefined;
|
|
178
179
|
};
|
|
@@ -1191,20 +1192,30 @@ export declare const tanstackStartOptionsObjectSchema: z.ZodObject<{
|
|
|
1191
1192
|
entry: z.ZodOptional<z.ZodString>;
|
|
1192
1193
|
build: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
1193
1194
|
staticNodeEnv: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
1195
|
+
/**
|
|
1196
|
+
* Inline route CSS into the server-rendered HTML response.
|
|
1197
|
+
*
|
|
1198
|
+
* @experimental This option is experimental!
|
|
1199
|
+
*/
|
|
1200
|
+
inlineCss: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
1194
1201
|
}, "strip", z.ZodTypeAny, {
|
|
1195
1202
|
staticNodeEnv: boolean;
|
|
1203
|
+
inlineCss: boolean;
|
|
1196
1204
|
}, {
|
|
1197
1205
|
staticNodeEnv?: boolean | undefined;
|
|
1206
|
+
inlineCss?: boolean | undefined;
|
|
1198
1207
|
}>>>;
|
|
1199
1208
|
}, "strip", z.ZodTypeAny, {
|
|
1200
1209
|
build: {
|
|
1201
1210
|
staticNodeEnv: boolean;
|
|
1211
|
+
inlineCss: boolean;
|
|
1202
1212
|
};
|
|
1203
1213
|
entry?: string | undefined;
|
|
1204
1214
|
}, {
|
|
1205
1215
|
entry?: string | undefined;
|
|
1206
1216
|
build?: {
|
|
1207
1217
|
staticNodeEnv?: boolean | undefined;
|
|
1218
|
+
inlineCss?: boolean | undefined;
|
|
1208
1219
|
} | undefined;
|
|
1209
1220
|
}>>>;
|
|
1210
1221
|
serverFns: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
@@ -3373,6 +3384,7 @@ export declare const tanstackStartOptionsObjectSchema: z.ZodObject<{
|
|
|
3373
3384
|
server: {
|
|
3374
3385
|
build: {
|
|
3375
3386
|
staticNodeEnv: boolean;
|
|
3387
|
+
inlineCss: boolean;
|
|
3376
3388
|
};
|
|
3377
3389
|
entry?: string | undefined;
|
|
3378
3390
|
};
|
|
@@ -3699,6 +3711,7 @@ export declare const tanstackStartOptionsObjectSchema: z.ZodObject<{
|
|
|
3699
3711
|
entry?: string | undefined;
|
|
3700
3712
|
build?: {
|
|
3701
3713
|
staticNodeEnv?: boolean | undefined;
|
|
3714
|
+
inlineCss?: boolean | undefined;
|
|
3702
3715
|
} | undefined;
|
|
3703
3716
|
} | undefined;
|
|
3704
3717
|
srcDirectory?: string | undefined;
|
|
@@ -4225,20 +4238,30 @@ export declare const tanstackStartOptionsSchema: z.ZodDefault<z.ZodOptional<z.Zo
|
|
|
4225
4238
|
entry: z.ZodOptional<z.ZodString>;
|
|
4226
4239
|
build: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
4227
4240
|
staticNodeEnv: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
4241
|
+
/**
|
|
4242
|
+
* Inline route CSS into the server-rendered HTML response.
|
|
4243
|
+
*
|
|
4244
|
+
* @experimental This option is experimental!
|
|
4245
|
+
*/
|
|
4246
|
+
inlineCss: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
4228
4247
|
}, "strip", z.ZodTypeAny, {
|
|
4229
4248
|
staticNodeEnv: boolean;
|
|
4249
|
+
inlineCss: boolean;
|
|
4230
4250
|
}, {
|
|
4231
4251
|
staticNodeEnv?: boolean | undefined;
|
|
4252
|
+
inlineCss?: boolean | undefined;
|
|
4232
4253
|
}>>>;
|
|
4233
4254
|
}, "strip", z.ZodTypeAny, {
|
|
4234
4255
|
build: {
|
|
4235
4256
|
staticNodeEnv: boolean;
|
|
4257
|
+
inlineCss: boolean;
|
|
4236
4258
|
};
|
|
4237
4259
|
entry?: string | undefined;
|
|
4238
4260
|
}, {
|
|
4239
4261
|
entry?: string | undefined;
|
|
4240
4262
|
build?: {
|
|
4241
4263
|
staticNodeEnv?: boolean | undefined;
|
|
4264
|
+
inlineCss?: boolean | undefined;
|
|
4242
4265
|
} | undefined;
|
|
4243
4266
|
}>>>;
|
|
4244
4267
|
serverFns: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
@@ -6407,6 +6430,7 @@ export declare const tanstackStartOptionsSchema: z.ZodDefault<z.ZodOptional<z.Zo
|
|
|
6407
6430
|
server: {
|
|
6408
6431
|
build: {
|
|
6409
6432
|
staticNodeEnv: boolean;
|
|
6433
|
+
inlineCss: boolean;
|
|
6410
6434
|
};
|
|
6411
6435
|
entry?: string | undefined;
|
|
6412
6436
|
};
|
|
@@ -6733,6 +6757,7 @@ export declare const tanstackStartOptionsSchema: z.ZodDefault<z.ZodOptional<z.Zo
|
|
|
6733
6757
|
entry?: string | undefined;
|
|
6734
6758
|
build?: {
|
|
6735
6759
|
staticNodeEnv?: boolean | undefined;
|
|
6760
|
+
inlineCss?: boolean | undefined;
|
|
6736
6761
|
} | undefined;
|
|
6737
6762
|
} | undefined;
|
|
6738
6763
|
srcDirectory?: string | undefined;
|
package/dist/esm/schema.js
CHANGED
|
@@ -129,7 +129,10 @@ var tanstackStartOptionsObjectSchema = z.object({
|
|
|
129
129
|
}).optional().default({}),
|
|
130
130
|
server: z.object({
|
|
131
131
|
entry: z.string().optional(),
|
|
132
|
-
build: z.object({
|
|
132
|
+
build: z.object({
|
|
133
|
+
staticNodeEnv: z.boolean().optional().default(true),
|
|
134
|
+
inlineCss: z.boolean().optional().default(false)
|
|
135
|
+
}).optional().default({})
|
|
133
136
|
}).optional().default({}),
|
|
134
137
|
serverFns: z.object({
|
|
135
138
|
base: z.string().optional().default("/_serverFn"),
|
package/dist/esm/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","names":[],"sources":["../../src/schema.ts"],"sourcesContent":["import path from 'node:path'\nimport { z } from 'zod'\nimport { configSchema, getConfig } from '@tanstack/router-plugin'\nimport type { CompileStartFrameworkOptions } from './types'\n\nconst tsrConfig = configSchema\n .omit({ autoCodeSplitting: true, target: true })\n .partial()\n\n// --- Import Protection Schema ---\n\nconst patternSchema = z.union([z.string(), z.instanceof(RegExp)])\n\nconst importProtectionBehaviorSchema = z.enum(['error', 'mock'])\n\nconst importProtectionEnvRulesSchema = z.object({\n specifiers: z.array(patternSchema).optional(),\n files: z.array(patternSchema).optional(),\n excludeFiles: z.array(patternSchema).optional(),\n})\n\nconst importProtectionOptionsSchema = z\n .object({\n enabled: z.boolean().optional(),\n behavior: z\n .union([\n importProtectionBehaviorSchema,\n z.object({\n dev: importProtectionBehaviorSchema.optional(),\n build: importProtectionBehaviorSchema.optional(),\n }),\n ])\n .optional(),\n /**\n * In `behavior: 'mock'`, control whether mocked imports emit a runtime\n * console diagnostic when accessed.\n *\n * - 'error': console.error(new Error(...)) (default)\n * - 'warn': console.warn(new Error(...))\n * - 'off': disable runtime diagnostics\n */\n mockAccess: z.enum(['error', 'warn', 'off']).optional(),\n onViolation: z\n .function()\n .args(z.any())\n .returns(\n z.union([\n z.boolean(),\n z.void(),\n z.promise(z.union([z.boolean(), z.void()])),\n ]),\n )\n .optional(),\n include: z.array(patternSchema).optional(),\n exclude: z.array(patternSchema).optional(),\n client: importProtectionEnvRulesSchema.optional(),\n server: importProtectionEnvRulesSchema.optional(),\n ignoreImporters: z.array(patternSchema).optional(),\n maxTraceDepth: z.number().optional(),\n log: z.enum(['once', 'always']).optional(),\n })\n .optional()\n\nexport function parseStartConfig(\n opts: z.input<typeof tanstackStartOptionsSchema>,\n corePluginOpts: { framework: CompileStartFrameworkOptions },\n root: string,\n) {\n const options = tanstackStartOptionsSchema.parse(opts)\n\n const srcDirectory = options.srcDirectory\n\n const routesDirectory = path.resolve(\n root,\n srcDirectory,\n options.router.routesDirectory ?? 'routes',\n )\n\n const generatedRouteTree = path.resolve(\n root,\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\nexport const tanstackStartOptionsObjectSchema = z.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 basepath: 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 build: z\n .object({\n staticNodeEnv: z.boolean().optional().default(true),\n })\n .optional()\n .default({}),\n })\n .optional()\n .default({}),\n serverFns: z\n .object({\n base: z.string().optional().default('/_serverFn'),\n generateFunctionId: z\n .function()\n .args(\n z.object({\n filename: z.string(),\n functionName: z.string(),\n }),\n )\n .returns(z.string().optional())\n .optional(),\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 autoStaticPathsDiscovery: z.boolean().optional(),\n maxRedirects: z.number().min(0).optional(),\n })\n .and(pagePrerenderOptionsSchema.optional())\n .optional(),\n dev: z\n .object({\n ssrStyles: z\n .object({\n enabled: z.boolean().optional().default(true),\n basepath: z.string().optional(),\n })\n .optional()\n .default({}),\n })\n .optional()\n .default({}),\n spa: spaSchema.optional(),\n importProtection: importProtectionOptionsSchema,\n})\n\nexport const tanstackStartOptionsSchema = tanstackStartOptionsObjectSchema\n .optional()\n .default({})\n\nexport type Page = z.infer<typeof pageSchema>\n\ntype TanStackStartOptionsInput = NonNullable<\n z.input<typeof tanstackStartOptionsSchema>\n>\n\nexport type TanStackStartInputConfig = TanStackStartOptionsInput\nexport type TanStackStartOutputConfig = ReturnType<typeof parseStartConfig>\n\nexport type ImportProtectionBehavior = z.infer<\n typeof importProtectionBehaviorSchema\n>\nexport type ImportProtectionEnvRules = z.infer<\n typeof importProtectionEnvRulesSchema\n>\nexport type ImportProtectionOptions = z.input<\n typeof importProtectionOptionsSchema\n>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schema.js","names":[],"sources":["../../src/schema.ts"],"sourcesContent":["import path from 'node:path'\nimport { z } from 'zod'\nimport { configSchema, getConfig } from '@tanstack/router-plugin'\nimport type { CompileStartFrameworkOptions } from './types'\n\nconst tsrConfig = configSchema\n .omit({ autoCodeSplitting: true, target: true })\n .partial()\n\n// --- Import Protection Schema ---\n\nconst patternSchema = z.union([z.string(), z.instanceof(RegExp)])\n\nconst importProtectionBehaviorSchema = z.enum(['error', 'mock'])\n\nconst importProtectionEnvRulesSchema = z.object({\n specifiers: z.array(patternSchema).optional(),\n files: z.array(patternSchema).optional(),\n excludeFiles: z.array(patternSchema).optional(),\n})\n\nconst importProtectionOptionsSchema = z\n .object({\n enabled: z.boolean().optional(),\n behavior: z\n .union([\n importProtectionBehaviorSchema,\n z.object({\n dev: importProtectionBehaviorSchema.optional(),\n build: importProtectionBehaviorSchema.optional(),\n }),\n ])\n .optional(),\n /**\n * In `behavior: 'mock'`, control whether mocked imports emit a runtime\n * console diagnostic when accessed.\n *\n * - 'error': console.error(new Error(...)) (default)\n * - 'warn': console.warn(new Error(...))\n * - 'off': disable runtime diagnostics\n */\n mockAccess: z.enum(['error', 'warn', 'off']).optional(),\n onViolation: z\n .function()\n .args(z.any())\n .returns(\n z.union([\n z.boolean(),\n z.void(),\n z.promise(z.union([z.boolean(), z.void()])),\n ]),\n )\n .optional(),\n include: z.array(patternSchema).optional(),\n exclude: z.array(patternSchema).optional(),\n client: importProtectionEnvRulesSchema.optional(),\n server: importProtectionEnvRulesSchema.optional(),\n ignoreImporters: z.array(patternSchema).optional(),\n maxTraceDepth: z.number().optional(),\n log: z.enum(['once', 'always']).optional(),\n })\n .optional()\n\nexport function parseStartConfig(\n opts: z.input<typeof tanstackStartOptionsSchema>,\n corePluginOpts: { framework: CompileStartFrameworkOptions },\n root: string,\n) {\n const options = tanstackStartOptionsSchema.parse(opts)\n\n const srcDirectory = options.srcDirectory\n\n const routesDirectory = path.resolve(\n root,\n srcDirectory,\n options.router.routesDirectory ?? 'routes',\n )\n\n const generatedRouteTree = path.resolve(\n root,\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\nexport const tanstackStartOptionsObjectSchema = z.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 basepath: 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 build: z\n .object({\n staticNodeEnv: z.boolean().optional().default(true),\n /**\n * Inline route CSS into the server-rendered HTML response.\n *\n * @experimental This option is experimental!\n */\n inlineCss: z.boolean().optional().default(false),\n })\n .optional()\n .default({}),\n })\n .optional()\n .default({}),\n serverFns: z\n .object({\n base: z.string().optional().default('/_serverFn'),\n generateFunctionId: z\n .function()\n .args(\n z.object({\n filename: z.string(),\n functionName: z.string(),\n }),\n )\n .returns(z.string().optional())\n .optional(),\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 autoStaticPathsDiscovery: z.boolean().optional(),\n maxRedirects: z.number().min(0).optional(),\n })\n .and(pagePrerenderOptionsSchema.optional())\n .optional(),\n dev: z\n .object({\n ssrStyles: z\n .object({\n enabled: z.boolean().optional().default(true),\n basepath: z.string().optional(),\n })\n .optional()\n .default({}),\n })\n .optional()\n .default({}),\n spa: spaSchema.optional(),\n importProtection: importProtectionOptionsSchema,\n})\n\nexport const tanstackStartOptionsSchema = tanstackStartOptionsObjectSchema\n .optional()\n .default({})\n\nexport type Page = z.infer<typeof pageSchema>\n\ntype TanStackStartOptionsInput = NonNullable<\n z.input<typeof tanstackStartOptionsSchema>\n>\n\nexport type TanStackStartInputConfig = TanStackStartOptionsInput\nexport type TanStackStartOutputConfig = ReturnType<typeof parseStartConfig>\n\nexport type ImportProtectionBehavior = z.infer<\n typeof importProtectionBehaviorSchema\n>\nexport type ImportProtectionEnvRules = z.infer<\n typeof importProtectionEnvRulesSchema\n>\nexport type ImportProtectionOptions = z.input<\n typeof importProtectionOptionsSchema\n>\n"],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { transform } from "lightningcss";
|
|
2
|
+
//#region src/start-manifest-plugin/inlineCss.ts
|
|
3
|
+
var cssUrlPattern = /url\(\s*(?:"([^"]*)"|'([^']*)'|([^)"']*?))\s*\)|@import\s+(?:url\(\s*(?:"([^"]*)"|'([^']*)'|([^)"']*?))\s*\)|"([^"]*)"|'([^']*)')/gi;
|
|
4
|
+
function isRelativeCssUrl(url) {
|
|
5
|
+
if (!url) return false;
|
|
6
|
+
if (url.startsWith("#")) return false;
|
|
7
|
+
if (url.startsWith("/")) return false;
|
|
8
|
+
if (/^[a-z][a-z\d+.-]*:/i.test(url)) return false;
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
function shouldRebaseInlineCssUrls(css) {
|
|
12
|
+
cssUrlPattern.lastIndex = 0;
|
|
13
|
+
for (const match of css.matchAll(cssUrlPattern)) if (isRelativeCssUrl((match[1] ?? match[2] ?? match[3] ?? match[4] ?? match[5] ?? match[6] ?? match[7] ?? match[8] ?? "").trim())) return true;
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
function rebaseCssUrl(url, cssHref) {
|
|
17
|
+
if (!isRelativeCssUrl(url)) return url;
|
|
18
|
+
const fakeOrigin = "http://tanstack.local";
|
|
19
|
+
const resolved = new URL(url, new URL(cssHref, fakeOrigin));
|
|
20
|
+
if (resolved.origin === fakeOrigin) return `${resolved.pathname}${resolved.search}${resolved.hash}`;
|
|
21
|
+
return resolved.href;
|
|
22
|
+
}
|
|
23
|
+
function rebaseInlineCssUrls(options) {
|
|
24
|
+
const css = options.css.trim();
|
|
25
|
+
if (!shouldRebaseInlineCssUrls(css)) return css;
|
|
26
|
+
const result = transform({
|
|
27
|
+
filename: options.cssHref,
|
|
28
|
+
code: Buffer.from(css),
|
|
29
|
+
minify: true,
|
|
30
|
+
visitor: {
|
|
31
|
+
Url(url) {
|
|
32
|
+
return {
|
|
33
|
+
...url,
|
|
34
|
+
url: rebaseCssUrl(url.url, options.cssHref)
|
|
35
|
+
};
|
|
36
|
+
},
|
|
37
|
+
Rule: { import(rule) {
|
|
38
|
+
return {
|
|
39
|
+
...rule,
|
|
40
|
+
value: {
|
|
41
|
+
...rule.value,
|
|
42
|
+
url: rebaseCssUrl(rule.value.url, options.cssHref)
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
} }
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
return Buffer.from(result.code).toString("utf8");
|
|
49
|
+
}
|
|
50
|
+
function getCssAssetSource(source) {
|
|
51
|
+
if (typeof source === "string") return source;
|
|
52
|
+
if (source instanceof Uint8Array) return Buffer.from(source).toString("utf8");
|
|
53
|
+
if (source == null) return void 0;
|
|
54
|
+
return String(source);
|
|
55
|
+
}
|
|
56
|
+
//#endregion
|
|
57
|
+
export { getCssAssetSource, rebaseInlineCssUrls };
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=inlineCss.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inlineCss.js","names":[],"sources":["../../../src/start-manifest-plugin/inlineCss.ts"],"sourcesContent":["import { transform } from 'lightningcss'\n\nconst cssUrlPattern =\n /url\\(\\s*(?:\"([^\"]*)\"|'([^']*)'|([^)\"']*?))\\s*\\)|@import\\s+(?:url\\(\\s*(?:\"([^\"]*)\"|'([^']*)'|([^)\"']*?))\\s*\\)|\"([^\"]*)\"|'([^']*)')/gi\n\nfunction isRelativeCssUrl(url: string) {\n if (!url) return false\n if (url.startsWith('#')) return false\n if (url.startsWith('/')) return false\n if (/^[a-z][a-z\\d+.-]*:/i.test(url)) return false\n return true\n}\n\nexport function shouldRebaseInlineCssUrls(css: string) {\n cssUrlPattern.lastIndex = 0\n\n for (const match of css.matchAll(cssUrlPattern)) {\n const url = (\n match[1] ??\n match[2] ??\n match[3] ??\n match[4] ??\n match[5] ??\n match[6] ??\n match[7] ??\n match[8] ??\n ''\n ).trim()\n\n if (isRelativeCssUrl(url)) {\n return true\n }\n }\n\n return false\n}\n\nfunction rebaseCssUrl(url: string, cssHref: string) {\n if (!isRelativeCssUrl(url)) {\n return url\n }\n\n const fakeOrigin = 'http://tanstack.local'\n const resolved = new URL(url, new URL(cssHref, fakeOrigin))\n\n if (resolved.origin === fakeOrigin) {\n return `${resolved.pathname}${resolved.search}${resolved.hash}`\n }\n\n return resolved.href\n}\n\nexport function rebaseInlineCssUrls(options: { css: string; cssHref: string }) {\n const css = options.css.trim()\n\n if (!shouldRebaseInlineCssUrls(css)) {\n return css\n }\n\n const result = transform({\n filename: options.cssHref,\n code: Buffer.from(css),\n minify: true,\n visitor: {\n Url(url) {\n return {\n ...url,\n url: rebaseCssUrl(url.url, options.cssHref),\n }\n },\n Rule: {\n import(rule: any) {\n return {\n ...rule,\n value: {\n ...rule.value,\n url: rebaseCssUrl(rule.value.url, options.cssHref),\n },\n }\n },\n },\n },\n })\n\n return Buffer.from(result.code).toString('utf8')\n}\n\nexport function getCssAssetSource(source: unknown) {\n if (typeof source === 'string') return source\n if (source instanceof Uint8Array) return Buffer.from(source).toString('utf8')\n if (source == null) return undefined\n return String(source)\n}\n"],"mappings":";;AAEA,IAAM,gBACJ;AAEF,SAAS,iBAAiB,KAAa;AACrC,KAAI,CAAC,IAAK,QAAO;AACjB,KAAI,IAAI,WAAW,IAAI,CAAE,QAAO;AAChC,KAAI,IAAI,WAAW,IAAI,CAAE,QAAO;AAChC,KAAI,sBAAsB,KAAK,IAAI,CAAE,QAAO;AAC5C,QAAO;;AAGT,SAAgB,0BAA0B,KAAa;AACrD,eAAc,YAAY;AAE1B,MAAK,MAAM,SAAS,IAAI,SAAS,cAAc,CAa7C,KAAI,kBAXF,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,IACA,MAAM,CAEiB,CACvB,QAAO;AAIX,QAAO;;AAGT,SAAS,aAAa,KAAa,SAAiB;AAClD,KAAI,CAAC,iBAAiB,IAAI,CACxB,QAAO;CAGT,MAAM,aAAa;CACnB,MAAM,WAAW,IAAI,IAAI,KAAK,IAAI,IAAI,SAAS,WAAW,CAAC;AAE3D,KAAI,SAAS,WAAW,WACtB,QAAO,GAAG,SAAS,WAAW,SAAS,SAAS,SAAS;AAG3D,QAAO,SAAS;;AAGlB,SAAgB,oBAAoB,SAA2C;CAC7E,MAAM,MAAM,QAAQ,IAAI,MAAM;AAE9B,KAAI,CAAC,0BAA0B,IAAI,CACjC,QAAO;CAGT,MAAM,SAAS,UAAU;EACvB,UAAU,QAAQ;EAClB,MAAM,OAAO,KAAK,IAAI;EACtB,QAAQ;EACR,SAAS;GACP,IAAI,KAAK;AACP,WAAO;KACL,GAAG;KACH,KAAK,aAAa,IAAI,KAAK,QAAQ,QAAQ;KAC5C;;GAEH,MAAM,EACJ,OAAO,MAAW;AAChB,WAAO;KACL,GAAG;KACH,OAAO;MACL,GAAG,KAAK;MACR,KAAK,aAAa,KAAK,MAAM,KAAK,QAAQ,QAAQ;MACnD;KACF;MAEJ;GACF;EACF,CAAC;AAEF,QAAO,OAAO,KAAK,OAAO,KAAK,CAAC,SAAS,OAAO;;AAGlD,SAAgB,kBAAkB,QAAiB;AACjD,KAAI,OAAO,WAAW,SAAU,QAAO;AACvC,KAAI,kBAAkB,WAAY,QAAO,OAAO,KAAK,OAAO,CAAC,SAAS,OAAO;AAC7E,KAAI,UAAU,KAAM,QAAO,KAAA;AAC3B,QAAO,OAAO,OAAO"}
|
|
@@ -21,6 +21,9 @@ interface ManifestAssetResolvers {
|
|
|
21
21
|
export interface StartManifest {
|
|
22
22
|
routes: Record<string, RouteTreeRoute>;
|
|
23
23
|
clientEntry: string;
|
|
24
|
+
inlineCss?: {
|
|
25
|
+
styles: Record<string, string>;
|
|
26
|
+
};
|
|
24
27
|
}
|
|
25
28
|
export declare function appendUniqueStrings(target: Array<string> | undefined, source: Array<string>): string[] | undefined;
|
|
26
29
|
export declare function appendUniqueAssets(target: Array<RouterManagedTag> | undefined, source: Array<RouterManagedTag>): RouterManagedTag[] | undefined;
|
|
@@ -28,6 +31,7 @@ export declare function buildStartManifest(options: {
|
|
|
28
31
|
clientBuild: NormalizedClientBuild;
|
|
29
32
|
routeTreeRoutes: RouteTreeRoutes;
|
|
30
33
|
basePath: string;
|
|
34
|
+
inlineCss?: boolean;
|
|
31
35
|
additionalRouteAssets?: Partial<Record<string, ReadonlyArray<RouterManagedTag>>>;
|
|
32
36
|
}): StartManifest;
|
|
33
37
|
export declare function serializeStartManifest(startManifest: StartManifest): string;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { rebaseInlineCssUrls } from "./inlineCss.js";
|
|
1
2
|
import "../vite/start-manifest-plugin/normalized-client-build.js";
|
|
2
|
-
import { resolveManifestAssetLink, rootRouteId } from "@tanstack/router-core";
|
|
3
|
+
import { getStylesheetHref, resolveManifestAssetLink, rootRouteId } from "@tanstack/router-core";
|
|
3
4
|
import { joinURL } from "ufo";
|
|
4
5
|
import { serialize } from "seroval";
|
|
5
6
|
//#region src/start-manifest-plugin/manifestBuilder.ts
|
|
@@ -69,10 +70,16 @@ function buildStartManifest(options) {
|
|
|
69
70
|
const hasPreloads = route.preloads && route.preloads.length > 0;
|
|
70
71
|
if (!hasAssets && !hasPreloads) delete routes[routeId];
|
|
71
72
|
}
|
|
72
|
-
|
|
73
|
+
const result = {
|
|
73
74
|
routes,
|
|
74
75
|
clientEntry: assetResolvers.getAssetPath(scannedChunks.entryChunk.fileName)
|
|
75
76
|
};
|
|
77
|
+
if (options.inlineCss) result.inlineCss = buildInlineCssManifestData({
|
|
78
|
+
routes,
|
|
79
|
+
basePath: options.basePath,
|
|
80
|
+
cssContentByFileName: options.clientBuild.cssContentByFileName
|
|
81
|
+
});
|
|
82
|
+
return result;
|
|
76
83
|
}
|
|
77
84
|
function serializeStartManifest(startManifest) {
|
|
78
85
|
return serialize(startManifest);
|
|
@@ -162,6 +169,29 @@ function createChunkCssAssetCollector(options) {
|
|
|
162
169
|
};
|
|
163
170
|
return { getChunkCssAssets };
|
|
164
171
|
}
|
|
172
|
+
function buildInlineCssManifestData(options) {
|
|
173
|
+
const stylesheetHrefs = /* @__PURE__ */ new Set();
|
|
174
|
+
for (const route of Object.values(options.routes)) for (const asset of route.assets ?? []) {
|
|
175
|
+
const href = getStylesheetHref(asset);
|
|
176
|
+
if (href) stylesheetHrefs.add(href);
|
|
177
|
+
}
|
|
178
|
+
if (stylesheetHrefs.size === 0) return { styles: {} };
|
|
179
|
+
if (!options.cssContentByFileName) throw new Error("TanStack Start inlineCss is enabled, but the client build did not provide CSS content");
|
|
180
|
+
const { getAssetPath } = createManifestAssetResolvers(options.basePath);
|
|
181
|
+
const styles = {};
|
|
182
|
+
const missingHrefs = new Set(stylesheetHrefs);
|
|
183
|
+
for (const [cssFile, css] of options.cssContentByFileName) {
|
|
184
|
+
const cssHref = getAssetPath(cssFile);
|
|
185
|
+
if (!stylesheetHrefs.has(cssHref)) continue;
|
|
186
|
+
styles[cssHref] = rebaseInlineCssUrls({
|
|
187
|
+
css,
|
|
188
|
+
cssHref
|
|
189
|
+
});
|
|
190
|
+
missingHrefs.delete(cssHref);
|
|
191
|
+
}
|
|
192
|
+
if (missingHrefs.size > 0) throw new Error(`TanStack Start inlineCss could not find CSS content for: ${Array.from(missingHrefs).join(", ")}`);
|
|
193
|
+
return { styles };
|
|
194
|
+
}
|
|
165
195
|
function buildRouteManifestRoutes(options) {
|
|
166
196
|
const routes = {};
|
|
167
197
|
const getChunkCssAssets = createChunkCssAssetCollector({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifestBuilder.js","names":[],"sources":["../../../src/start-manifest-plugin/manifestBuilder.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/prefer-for-of */\nimport { serialize } from 'seroval'\nimport { joinURL } from 'ufo'\nimport { resolveManifestAssetLink, rootRouteId } from '@tanstack/router-core'\nimport {\n getRouteFilePathsFromModuleIds,\n normalizeViteClientBuild,\n normalizeViteClientChunk,\n} from '../vite/start-manifest-plugin/normalized-client-build'\nimport type { ManifestAssetLink, RouterManagedTag } from '@tanstack/router-core'\nimport type { NormalizedClientBuild, NormalizedClientChunk } from '../types'\n\nconst VISITING_CHUNK = 1\n\ntype RouteTreeRoute = {\n filePath?: string\n preloads?: Array<string>\n assets?: Array<RouterManagedTag>\n children?: Array<string>\n}\n\ntype RouteTreeRoutes = Record<string, RouteTreeRoute>\n\ninterface ScannedClientChunks {\n entryChunk: NormalizedClientChunk\n chunksByFileName: ReadonlyMap<string, NormalizedClientChunk>\n routeChunksByFilePath: ReadonlyMap<string, Array<NormalizedClientChunk>>\n}\n\ninterface ManifestAssetResolvers {\n getAssetPath: (fileName: string) => string\n getChunkPreloads: (chunk: NormalizedClientChunk) => Array<string>\n getStylesheetAsset: (cssFile: string) => RouterManagedTag\n}\n\ntype DedupeRoute = {\n preloads?: Array<ManifestAssetLink>\n assets?: Array<RouterManagedTag>\n children?: Array<string>\n}\n\nexport interface StartManifest {\n routes: Record<string, RouteTreeRoute>\n clientEntry: string\n}\n\nexport function appendUniqueStrings(\n target: Array<string> | undefined,\n source: Array<string>,\n) {\n // Similar to Set.prototype.union, but for ordered arrays.\n // It preserves first-seen order and returns the original target array when\n // source contributes no new values, which avoids extra allocations.\n if (source.length === 0) {\n return target\n }\n\n if (!target || target.length === 0) {\n return source\n }\n\n const seen = new Set(target)\n let result: Array<string> | undefined\n\n for (const value of source) {\n if (seen.has(value)) {\n continue\n }\n\n seen.add(value)\n if (!result) {\n result = target.slice()\n }\n result.push(value)\n }\n\n return result ?? target\n}\n\nexport function appendUniqueAssets(\n target: Array<RouterManagedTag> | undefined,\n source: Array<RouterManagedTag>,\n) {\n // Same semantics as appendUniqueStrings, but uniqueness is based on the\n // serialized asset identity instead of object reference.\n if (source.length === 0) {\n return target\n }\n\n if (!target || target.length === 0) {\n return source\n }\n\n const seen = new Set(target.map(getAssetIdentity))\n let result: Array<RouterManagedTag> | undefined\n\n for (const asset of source) {\n const identity = getAssetIdentity(asset)\n if (seen.has(identity)) {\n continue\n }\n\n seen.add(identity)\n if (!result) {\n result = target.slice()\n }\n result.push(asset)\n }\n\n return result ?? target\n}\n\nfunction getAssetIdentity(asset: RouterManagedTag) {\n return JSON.stringify({\n tag: asset.tag,\n attrs: normalizeAssetAttrs(asset.attrs),\n children: 'children' in asset ? (asset.children ?? null) : null,\n })\n}\n\nfunction normalizeAssetAttrs(attrs: Record<string, any> | undefined) {\n if (!attrs) {\n return null\n }\n\n const entries = Object.entries(attrs)\n if (entries.length === 0) {\n return null\n }\n\n entries.sort(([left], [right]) => left.localeCompare(right))\n return Object.fromEntries(entries)\n}\n\nfunction mergeRouteChunkData(options: {\n route: RouteTreeRoute\n chunk: NormalizedClientChunk\n getChunkCssAssets: (chunk: NormalizedClientChunk) => Array<RouterManagedTag>\n getChunkPreloads: (chunk: NormalizedClientChunk) => Array<string>\n}) {\n const chunkAssets = options.getChunkCssAssets(options.chunk)\n const chunkPreloads = options.getChunkPreloads(options.chunk)\n\n options.route.assets = appendUniqueAssets(options.route.assets, chunkAssets)\n options.route.preloads = appendUniqueStrings(\n options.route.preloads,\n chunkPreloads,\n )\n}\n\nexport function buildStartManifest(options: {\n clientBuild: NormalizedClientBuild\n routeTreeRoutes: RouteTreeRoutes\n basePath: string\n additionalRouteAssets?: Partial<\n Record<string, ReadonlyArray<RouterManagedTag>>\n >\n}): StartManifest {\n const scannedChunks = scanClientChunks(options.clientBuild)\n const assetResolvers = createManifestAssetResolvers(options.basePath)\n\n const routes = buildRouteManifestRoutes({\n routeTreeRoutes: options.routeTreeRoutes,\n routeChunksByFilePath: scannedChunks.routeChunksByFilePath,\n chunksByFileName: scannedChunks.chunksByFileName,\n entryChunk: scannedChunks.entryChunk,\n assetResolvers,\n additionalRouteAssets: options.additionalRouteAssets,\n })\n\n dedupeNestedRouteManifestEntries(rootRouteId, routes[rootRouteId]!, routes)\n\n // Prune routes with no assets or preloads from the manifest\n for (const routeId of Object.keys(routes)) {\n const route = routes[routeId]!\n const hasAssets = route.assets && route.assets.length > 0\n const hasPreloads = route.preloads && route.preloads.length > 0\n if (!hasAssets && !hasPreloads) {\n delete routes[routeId]\n }\n }\n\n return {\n routes,\n clientEntry: assetResolvers.getAssetPath(scannedChunks.entryChunk.fileName),\n }\n}\n\nexport function serializeStartManifest(startManifest: StartManifest) {\n return serialize(startManifest)\n}\n\nexport function scanClientChunks(\n clientBuild: NormalizedClientBuild,\n): ScannedClientChunks {\n const entryChunk = clientBuild.chunksByFileName.get(\n clientBuild.entryChunkFileName,\n )\n\n if (!entryChunk) {\n throw new Error(`Missing entry chunk: ${clientBuild.entryChunkFileName}`)\n }\n\n const routeChunksByFilePath = new Map<string, Array<NormalizedClientChunk>>()\n\n for (const chunk of clientBuild.chunksByFileName.values()) {\n if (chunk.routeFilePaths.length > 0) {\n for (const routeFilePath of chunk.routeFilePaths) {\n let chunks = routeChunksByFilePath.get(routeFilePath)\n if (chunks === undefined) {\n chunks = []\n routeChunksByFilePath.set(routeFilePath, chunks)\n }\n chunks.push(chunk)\n }\n }\n }\n\n return {\n entryChunk,\n chunksByFileName: clientBuild.chunksByFileName,\n routeChunksByFilePath,\n }\n}\n\nexport function createManifestAssetResolvers(\n basePath: string,\n): ManifestAssetResolvers {\n const assetPathByFileName = new Map<string, string>()\n const stylesheetAssetByFileName = new Map<string, RouterManagedTag>()\n const preloadsByChunk = new Map<NormalizedClientChunk, Array<string>>()\n\n const getAssetPath = (fileName: string) => {\n const cachedPath = assetPathByFileName.get(fileName)\n if (cachedPath) {\n return cachedPath\n }\n\n const assetPath = joinURL(basePath, fileName)\n assetPathByFileName.set(fileName, assetPath)\n return assetPath\n }\n\n const getStylesheetAsset = (cssFile: string) => {\n const cachedAsset = stylesheetAssetByFileName.get(cssFile)\n if (cachedAsset) {\n return cachedAsset\n }\n\n const href = getAssetPath(cssFile)\n const asset = {\n tag: 'link',\n attrs: {\n rel: 'stylesheet',\n href,\n type: 'text/css',\n },\n } satisfies RouterManagedTag\n\n stylesheetAssetByFileName.set(cssFile, asset)\n return asset\n }\n\n const getChunkPreloads = (chunk: NormalizedClientChunk) => {\n const cachedPreloads = preloadsByChunk.get(chunk)\n if (cachedPreloads) {\n return cachedPreloads\n }\n\n const preloads = [getAssetPath(chunk.fileName)]\n\n for (let i = 0; i < chunk.imports.length; i++) {\n preloads.push(getAssetPath(chunk.imports[i]!))\n }\n\n preloadsByChunk.set(chunk, preloads)\n return preloads\n }\n\n return {\n getAssetPath,\n getChunkPreloads,\n getStylesheetAsset,\n }\n}\n\nexport function createChunkCssAssetCollector(options: {\n chunksByFileName: ReadonlyMap<string, NormalizedClientChunk>\n getStylesheetAsset: (cssFile: string) => RouterManagedTag\n}) {\n const assetsByChunk = new Map<\n NormalizedClientChunk,\n Array<RouterManagedTag>\n >()\n const stateByChunk = new Map<NormalizedClientChunk, number>()\n\n const appendAsset = (\n assets: Array<RouterManagedTag>,\n seenAssets: Set<RouterManagedTag>,\n asset: RouterManagedTag,\n ) => {\n if (seenAssets.has(asset)) {\n return\n }\n\n seenAssets.add(asset)\n assets.push(asset)\n }\n\n const getChunkCssAssets = (\n chunk: NormalizedClientChunk,\n ): Array<RouterManagedTag> => {\n const cachedAssets = assetsByChunk.get(chunk)\n if (cachedAssets) {\n return cachedAssets\n }\n\n if (stateByChunk.get(chunk) === VISITING_CHUNK) {\n return []\n }\n stateByChunk.set(chunk, VISITING_CHUNK)\n\n const assets: Array<RouterManagedTag> = []\n const seenAssets = new Set<RouterManagedTag>()\n\n for (let i = 0; i < chunk.imports.length; i++) {\n const importedChunk = options.chunksByFileName.get(chunk.imports[i]!)\n if (!importedChunk) {\n continue\n }\n\n const importedAssets = getChunkCssAssets(importedChunk)\n for (let j = 0; j < importedAssets.length; j++) {\n appendAsset(assets, seenAssets, importedAssets[j]!)\n }\n }\n\n for (const cssFile of chunk.css) {\n appendAsset(assets, seenAssets, options.getStylesheetAsset(cssFile))\n }\n\n stateByChunk.delete(chunk)\n assetsByChunk.set(chunk, assets)\n return assets\n }\n\n return { getChunkCssAssets }\n}\n\nexport function buildRouteManifestRoutes(options: {\n routeTreeRoutes: RouteTreeRoutes\n routeChunksByFilePath: ReadonlyMap<\n string,\n ReadonlyArray<NormalizedClientChunk>\n >\n chunksByFileName: ReadonlyMap<string, NormalizedClientChunk>\n entryChunk: NormalizedClientChunk\n assetResolvers: ManifestAssetResolvers\n additionalRouteAssets?: Partial<\n Record<string, ReadonlyArray<RouterManagedTag>>\n >\n}) {\n const routes: Record<string, RouteTreeRoute> = {}\n const getChunkCssAssets = createChunkCssAssetCollector({\n chunksByFileName: options.chunksByFileName,\n getStylesheetAsset: options.assetResolvers.getStylesheetAsset,\n }).getChunkCssAssets\n\n for (const [routeId, route] of Object.entries(options.routeTreeRoutes)) {\n if (!route.filePath) {\n if (routeId === rootRouteId) {\n routes[routeId] = route\n continue\n }\n\n throw new Error(`expected filePath to be set for ${routeId}`)\n }\n\n const chunks = options.routeChunksByFilePath.get(route.filePath)\n if (!chunks) {\n routes[routeId] = route\n continue\n }\n\n const existing = routes[routeId]\n const targetRoute = (routes[routeId] = existing ? existing : { ...route })\n\n for (const chunk of chunks) {\n mergeRouteChunkData({\n route: targetRoute,\n chunk,\n getChunkCssAssets,\n getChunkPreloads: options.assetResolvers.getChunkPreloads,\n })\n }\n }\n\n const rootRoute = (routes[rootRouteId] = routes[rootRouteId] || {})\n mergeRouteChunkData({\n route: rootRoute,\n chunk: options.entryChunk,\n getChunkCssAssets,\n getChunkPreloads: options.assetResolvers.getChunkPreloads,\n })\n\n if (options.additionalRouteAssets) {\n for (const [routeId, assets] of Object.entries(\n options.additionalRouteAssets,\n )) {\n if (!assets || assets.length === 0) {\n continue\n }\n\n if (!(routeId in options.routeTreeRoutes)) {\n throw new Error(\n `expected additionalRouteAssets routeId to exist in routeTreeRoutes: ${routeId}`,\n )\n }\n\n const route = (routes[routeId] = routes[routeId] || {})\n route.assets = appendUniqueAssets(route.assets, [...assets])\n }\n }\n\n return routes\n}\n\nexport {\n getRouteFilePathsFromModuleIds,\n normalizeViteClientBuild,\n normalizeViteClientChunk,\n}\n\nfunction dedupeNestedRouteManifestEntries(\n routeId: string,\n route: DedupeRoute,\n routesById: Record<string, DedupeRoute>,\n seenPreloads = new Set<string>(),\n seenAssets = new Set<string>(),\n) {\n let routePreloads = route.preloads\n let routeAssets = route.assets\n\n if (routePreloads && routePreloads.length > 0) {\n let dedupedPreloads: Array<ManifestAssetLink> | undefined\n\n for (let i = 0; i < routePreloads.length; i++) {\n const preload = routePreloads[i]!\n const preloadHref = resolveManifestAssetLink(preload).href\n\n if (seenPreloads.has(preloadHref)) {\n if (dedupedPreloads === undefined) {\n dedupedPreloads = routePreloads.slice(0, i)\n }\n continue\n }\n\n seenPreloads.add(preloadHref)\n\n if (dedupedPreloads) {\n dedupedPreloads.push(preload)\n }\n }\n\n if (dedupedPreloads) {\n routePreloads = dedupedPreloads\n route.preloads = dedupedPreloads\n }\n }\n\n if (routeAssets && routeAssets.length > 0) {\n let dedupedAssets: Array<RouterManagedTag> | undefined\n\n for (let i = 0; i < routeAssets.length; i++) {\n const asset = routeAssets[i]!\n const identity = getAssetIdentity(asset)\n\n if (seenAssets.has(identity)) {\n if (dedupedAssets === undefined) {\n dedupedAssets = routeAssets.slice(0, i)\n }\n continue\n }\n\n seenAssets.add(identity)\n\n if (dedupedAssets) {\n dedupedAssets.push(asset)\n }\n }\n\n if (dedupedAssets) {\n routeAssets = dedupedAssets\n route.assets = dedupedAssets\n }\n }\n\n if (route.children) {\n for (const childRouteId of route.children) {\n const childRoute = routesById[childRouteId]\n\n if (!childRoute) {\n throw new Error(\n `Route tree references child route ${childRouteId} from ${routeId}, but no route entry was found`,\n )\n }\n\n dedupeNestedRouteManifestEntries(\n childRouteId,\n childRoute,\n routesById,\n seenPreloads,\n seenAssets,\n )\n }\n }\n\n if (routePreloads) {\n for (let i = routePreloads.length - 1; i >= 0; i--) {\n seenPreloads.delete(resolveManifestAssetLink(routePreloads[i]!).href)\n }\n }\n\n if (routeAssets) {\n for (let i = routeAssets.length - 1; i >= 0; i--) {\n seenAssets.delete(getAssetIdentity(routeAssets[i]!))\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"manifestBuilder.js","names":[],"sources":["../../../src/start-manifest-plugin/manifestBuilder.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/prefer-for-of */\nimport { serialize } from 'seroval'\nimport { joinURL } from 'ufo'\nimport {\n getStylesheetHref,\n resolveManifestAssetLink,\n rootRouteId,\n} from '@tanstack/router-core'\nimport {\n getRouteFilePathsFromModuleIds,\n normalizeViteClientBuild,\n normalizeViteClientChunk,\n} from '../vite/start-manifest-plugin/normalized-client-build'\nimport { rebaseInlineCssUrls } from './inlineCss'\nimport type { ManifestAssetLink, RouterManagedTag } from '@tanstack/router-core'\nimport type { NormalizedClientBuild, NormalizedClientChunk } from '../types'\n\nconst VISITING_CHUNK = 1\n\ntype RouteTreeRoute = {\n filePath?: string\n preloads?: Array<string>\n assets?: Array<RouterManagedTag>\n children?: Array<string>\n}\n\ntype RouteTreeRoutes = Record<string, RouteTreeRoute>\n\ninterface ScannedClientChunks {\n entryChunk: NormalizedClientChunk\n chunksByFileName: ReadonlyMap<string, NormalizedClientChunk>\n routeChunksByFilePath: ReadonlyMap<string, Array<NormalizedClientChunk>>\n}\n\ninterface ManifestAssetResolvers {\n getAssetPath: (fileName: string) => string\n getChunkPreloads: (chunk: NormalizedClientChunk) => Array<string>\n getStylesheetAsset: (cssFile: string) => RouterManagedTag\n}\n\ntype DedupeRoute = {\n preloads?: Array<ManifestAssetLink>\n assets?: Array<RouterManagedTag>\n children?: Array<string>\n}\n\nexport interface StartManifest {\n routes: Record<string, RouteTreeRoute>\n clientEntry: string\n inlineCss?: {\n styles: Record<string, string>\n }\n}\n\nexport function appendUniqueStrings(\n target: Array<string> | undefined,\n source: Array<string>,\n) {\n // Similar to Set.prototype.union, but for ordered arrays.\n // It preserves first-seen order and returns the original target array when\n // source contributes no new values, which avoids extra allocations.\n if (source.length === 0) {\n return target\n }\n\n if (!target || target.length === 0) {\n return source\n }\n\n const seen = new Set(target)\n let result: Array<string> | undefined\n\n for (const value of source) {\n if (seen.has(value)) {\n continue\n }\n\n seen.add(value)\n if (!result) {\n result = target.slice()\n }\n result.push(value)\n }\n\n return result ?? target\n}\n\nexport function appendUniqueAssets(\n target: Array<RouterManagedTag> | undefined,\n source: Array<RouterManagedTag>,\n) {\n // Same semantics as appendUniqueStrings, but uniqueness is based on the\n // serialized asset identity instead of object reference.\n if (source.length === 0) {\n return target\n }\n\n if (!target || target.length === 0) {\n return source\n }\n\n const seen = new Set(target.map(getAssetIdentity))\n let result: Array<RouterManagedTag> | undefined\n\n for (const asset of source) {\n const identity = getAssetIdentity(asset)\n if (seen.has(identity)) {\n continue\n }\n\n seen.add(identity)\n if (!result) {\n result = target.slice()\n }\n result.push(asset)\n }\n\n return result ?? target\n}\n\nfunction getAssetIdentity(asset: RouterManagedTag) {\n return JSON.stringify({\n tag: asset.tag,\n attrs: normalizeAssetAttrs(asset.attrs),\n children: 'children' in asset ? (asset.children ?? null) : null,\n })\n}\n\nfunction normalizeAssetAttrs(attrs: Record<string, any> | undefined) {\n if (!attrs) {\n return null\n }\n\n const entries = Object.entries(attrs)\n if (entries.length === 0) {\n return null\n }\n\n entries.sort(([left], [right]) => left.localeCompare(right))\n return Object.fromEntries(entries)\n}\n\nfunction mergeRouteChunkData(options: {\n route: RouteTreeRoute\n chunk: NormalizedClientChunk\n getChunkCssAssets: (chunk: NormalizedClientChunk) => Array<RouterManagedTag>\n getChunkPreloads: (chunk: NormalizedClientChunk) => Array<string>\n}) {\n const chunkAssets = options.getChunkCssAssets(options.chunk)\n const chunkPreloads = options.getChunkPreloads(options.chunk)\n\n options.route.assets = appendUniqueAssets(options.route.assets, chunkAssets)\n options.route.preloads = appendUniqueStrings(\n options.route.preloads,\n chunkPreloads,\n )\n}\n\nexport function buildStartManifest(options: {\n clientBuild: NormalizedClientBuild\n routeTreeRoutes: RouteTreeRoutes\n basePath: string\n inlineCss?: boolean\n additionalRouteAssets?: Partial<\n Record<string, ReadonlyArray<RouterManagedTag>>\n >\n}): StartManifest {\n const scannedChunks = scanClientChunks(options.clientBuild)\n const assetResolvers = createManifestAssetResolvers(options.basePath)\n\n const routes = buildRouteManifestRoutes({\n routeTreeRoutes: options.routeTreeRoutes,\n routeChunksByFilePath: scannedChunks.routeChunksByFilePath,\n chunksByFileName: scannedChunks.chunksByFileName,\n entryChunk: scannedChunks.entryChunk,\n assetResolvers,\n additionalRouteAssets: options.additionalRouteAssets,\n })\n\n dedupeNestedRouteManifestEntries(rootRouteId, routes[rootRouteId]!, routes)\n\n // Prune routes with no assets or preloads from the manifest\n for (const routeId of Object.keys(routes)) {\n const route = routes[routeId]!\n const hasAssets = route.assets && route.assets.length > 0\n const hasPreloads = route.preloads && route.preloads.length > 0\n if (!hasAssets && !hasPreloads) {\n delete routes[routeId]\n }\n }\n\n const result: StartManifest = {\n routes,\n clientEntry: assetResolvers.getAssetPath(scannedChunks.entryChunk.fileName),\n }\n\n if (options.inlineCss) {\n result.inlineCss = buildInlineCssManifestData({\n routes,\n basePath: options.basePath,\n cssContentByFileName: options.clientBuild.cssContentByFileName,\n })\n }\n\n return result\n}\n\nexport function serializeStartManifest(startManifest: StartManifest) {\n return serialize(startManifest)\n}\n\nexport function scanClientChunks(\n clientBuild: NormalizedClientBuild,\n): ScannedClientChunks {\n const entryChunk = clientBuild.chunksByFileName.get(\n clientBuild.entryChunkFileName,\n )\n\n if (!entryChunk) {\n throw new Error(`Missing entry chunk: ${clientBuild.entryChunkFileName}`)\n }\n\n const routeChunksByFilePath = new Map<string, Array<NormalizedClientChunk>>()\n\n for (const chunk of clientBuild.chunksByFileName.values()) {\n if (chunk.routeFilePaths.length > 0) {\n for (const routeFilePath of chunk.routeFilePaths) {\n let chunks = routeChunksByFilePath.get(routeFilePath)\n if (chunks === undefined) {\n chunks = []\n routeChunksByFilePath.set(routeFilePath, chunks)\n }\n chunks.push(chunk)\n }\n }\n }\n\n return {\n entryChunk,\n chunksByFileName: clientBuild.chunksByFileName,\n routeChunksByFilePath,\n }\n}\n\nexport function createManifestAssetResolvers(\n basePath: string,\n): ManifestAssetResolvers {\n const assetPathByFileName = new Map<string, string>()\n const stylesheetAssetByFileName = new Map<string, RouterManagedTag>()\n const preloadsByChunk = new Map<NormalizedClientChunk, Array<string>>()\n\n const getAssetPath = (fileName: string) => {\n const cachedPath = assetPathByFileName.get(fileName)\n if (cachedPath) {\n return cachedPath\n }\n\n const assetPath = joinURL(basePath, fileName)\n assetPathByFileName.set(fileName, assetPath)\n return assetPath\n }\n\n const getStylesheetAsset = (cssFile: string) => {\n const cachedAsset = stylesheetAssetByFileName.get(cssFile)\n if (cachedAsset) {\n return cachedAsset\n }\n\n const href = getAssetPath(cssFile)\n const asset = {\n tag: 'link',\n attrs: {\n rel: 'stylesheet',\n href,\n type: 'text/css',\n },\n } satisfies RouterManagedTag\n\n stylesheetAssetByFileName.set(cssFile, asset)\n return asset\n }\n\n const getChunkPreloads = (chunk: NormalizedClientChunk) => {\n const cachedPreloads = preloadsByChunk.get(chunk)\n if (cachedPreloads) {\n return cachedPreloads\n }\n\n const preloads = [getAssetPath(chunk.fileName)]\n\n for (let i = 0; i < chunk.imports.length; i++) {\n preloads.push(getAssetPath(chunk.imports[i]!))\n }\n\n preloadsByChunk.set(chunk, preloads)\n return preloads\n }\n\n return {\n getAssetPath,\n getChunkPreloads,\n getStylesheetAsset,\n }\n}\n\nexport function createChunkCssAssetCollector(options: {\n chunksByFileName: ReadonlyMap<string, NormalizedClientChunk>\n getStylesheetAsset: (cssFile: string) => RouterManagedTag\n}) {\n const assetsByChunk = new Map<\n NormalizedClientChunk,\n Array<RouterManagedTag>\n >()\n const stateByChunk = new Map<NormalizedClientChunk, number>()\n\n const appendAsset = (\n assets: Array<RouterManagedTag>,\n seenAssets: Set<RouterManagedTag>,\n asset: RouterManagedTag,\n ) => {\n if (seenAssets.has(asset)) {\n return\n }\n\n seenAssets.add(asset)\n assets.push(asset)\n }\n\n const getChunkCssAssets = (\n chunk: NormalizedClientChunk,\n ): Array<RouterManagedTag> => {\n const cachedAssets = assetsByChunk.get(chunk)\n if (cachedAssets) {\n return cachedAssets\n }\n\n if (stateByChunk.get(chunk) === VISITING_CHUNK) {\n return []\n }\n stateByChunk.set(chunk, VISITING_CHUNK)\n\n const assets: Array<RouterManagedTag> = []\n const seenAssets = new Set<RouterManagedTag>()\n\n for (let i = 0; i < chunk.imports.length; i++) {\n const importedChunk = options.chunksByFileName.get(chunk.imports[i]!)\n if (!importedChunk) {\n continue\n }\n\n const importedAssets = getChunkCssAssets(importedChunk)\n for (let j = 0; j < importedAssets.length; j++) {\n appendAsset(assets, seenAssets, importedAssets[j]!)\n }\n }\n\n for (const cssFile of chunk.css) {\n appendAsset(assets, seenAssets, options.getStylesheetAsset(cssFile))\n }\n\n stateByChunk.delete(chunk)\n assetsByChunk.set(chunk, assets)\n return assets\n }\n\n return { getChunkCssAssets }\n}\n\nfunction buildInlineCssManifestData(options: {\n routes: Record<string, RouteTreeRoute>\n basePath: string\n cssContentByFileName: ReadonlyMap<string, string> | undefined\n}): StartManifest['inlineCss'] {\n const stylesheetHrefs = new Set<string>()\n\n for (const route of Object.values(options.routes)) {\n for (const asset of route.assets ?? []) {\n const href = getStylesheetHref(asset)\n if (href) {\n stylesheetHrefs.add(href)\n }\n }\n }\n\n if (stylesheetHrefs.size === 0) {\n return { styles: {} }\n }\n\n if (!options.cssContentByFileName) {\n throw new Error(\n 'TanStack Start inlineCss is enabled, but the client build did not provide CSS content',\n )\n }\n\n const { getAssetPath } = createManifestAssetResolvers(options.basePath)\n const styles: Record<string, string> = {}\n const missingHrefs = new Set(stylesheetHrefs)\n\n for (const [cssFile, css] of options.cssContentByFileName) {\n const cssHref = getAssetPath(cssFile)\n if (!stylesheetHrefs.has(cssHref)) {\n continue\n }\n\n styles[cssHref] = rebaseInlineCssUrls({ css, cssHref })\n missingHrefs.delete(cssHref)\n }\n\n if (missingHrefs.size > 0) {\n throw new Error(\n `TanStack Start inlineCss could not find CSS content for: ${Array.from(\n missingHrefs,\n ).join(', ')}`,\n )\n }\n\n return { styles }\n}\n\nexport function buildRouteManifestRoutes(options: {\n routeTreeRoutes: RouteTreeRoutes\n routeChunksByFilePath: ReadonlyMap<\n string,\n ReadonlyArray<NormalizedClientChunk>\n >\n chunksByFileName: ReadonlyMap<string, NormalizedClientChunk>\n entryChunk: NormalizedClientChunk\n assetResolvers: ManifestAssetResolvers\n additionalRouteAssets?: Partial<\n Record<string, ReadonlyArray<RouterManagedTag>>\n >\n}) {\n const routes: Record<string, RouteTreeRoute> = {}\n const getChunkCssAssets = createChunkCssAssetCollector({\n chunksByFileName: options.chunksByFileName,\n getStylesheetAsset: options.assetResolvers.getStylesheetAsset,\n }).getChunkCssAssets\n\n for (const [routeId, route] of Object.entries(options.routeTreeRoutes)) {\n if (!route.filePath) {\n if (routeId === rootRouteId) {\n routes[routeId] = route\n continue\n }\n\n throw new Error(`expected filePath to be set for ${routeId}`)\n }\n\n const chunks = options.routeChunksByFilePath.get(route.filePath)\n if (!chunks) {\n routes[routeId] = route\n continue\n }\n\n const existing = routes[routeId]\n const targetRoute = (routes[routeId] = existing ? existing : { ...route })\n\n for (const chunk of chunks) {\n mergeRouteChunkData({\n route: targetRoute,\n chunk,\n getChunkCssAssets,\n getChunkPreloads: options.assetResolvers.getChunkPreloads,\n })\n }\n }\n\n const rootRoute = (routes[rootRouteId] = routes[rootRouteId] || {})\n mergeRouteChunkData({\n route: rootRoute,\n chunk: options.entryChunk,\n getChunkCssAssets,\n getChunkPreloads: options.assetResolvers.getChunkPreloads,\n })\n\n if (options.additionalRouteAssets) {\n for (const [routeId, assets] of Object.entries(\n options.additionalRouteAssets,\n )) {\n if (!assets || assets.length === 0) {\n continue\n }\n\n if (!(routeId in options.routeTreeRoutes)) {\n throw new Error(\n `expected additionalRouteAssets routeId to exist in routeTreeRoutes: ${routeId}`,\n )\n }\n\n const route = (routes[routeId] = routes[routeId] || {})\n route.assets = appendUniqueAssets(route.assets, [...assets])\n }\n }\n\n return routes\n}\n\nexport {\n getRouteFilePathsFromModuleIds,\n normalizeViteClientBuild,\n normalizeViteClientChunk,\n}\n\nfunction dedupeNestedRouteManifestEntries(\n routeId: string,\n route: DedupeRoute,\n routesById: Record<string, DedupeRoute>,\n seenPreloads = new Set<string>(),\n seenAssets = new Set<string>(),\n) {\n let routePreloads = route.preloads\n let routeAssets = route.assets\n\n if (routePreloads && routePreloads.length > 0) {\n let dedupedPreloads: Array<ManifestAssetLink> | undefined\n\n for (let i = 0; i < routePreloads.length; i++) {\n const preload = routePreloads[i]!\n const preloadHref = resolveManifestAssetLink(preload).href\n\n if (seenPreloads.has(preloadHref)) {\n if (dedupedPreloads === undefined) {\n dedupedPreloads = routePreloads.slice(0, i)\n }\n continue\n }\n\n seenPreloads.add(preloadHref)\n\n if (dedupedPreloads) {\n dedupedPreloads.push(preload)\n }\n }\n\n if (dedupedPreloads) {\n routePreloads = dedupedPreloads\n route.preloads = dedupedPreloads\n }\n }\n\n if (routeAssets && routeAssets.length > 0) {\n let dedupedAssets: Array<RouterManagedTag> | undefined\n\n for (let i = 0; i < routeAssets.length; i++) {\n const asset = routeAssets[i]!\n const identity = getAssetIdentity(asset)\n\n if (seenAssets.has(identity)) {\n if (dedupedAssets === undefined) {\n dedupedAssets = routeAssets.slice(0, i)\n }\n continue\n }\n\n seenAssets.add(identity)\n\n if (dedupedAssets) {\n dedupedAssets.push(asset)\n }\n }\n\n if (dedupedAssets) {\n routeAssets = dedupedAssets\n route.assets = dedupedAssets\n }\n }\n\n if (route.children) {\n for (const childRouteId of route.children) {\n const childRoute = routesById[childRouteId]\n\n if (!childRoute) {\n throw new Error(\n `Route tree references child route ${childRouteId} from ${routeId}, but no route entry was found`,\n )\n }\n\n dedupeNestedRouteManifestEntries(\n childRouteId,\n childRoute,\n routesById,\n seenPreloads,\n seenAssets,\n )\n }\n }\n\n if (routePreloads) {\n for (let i = routePreloads.length - 1; i >= 0; i--) {\n seenPreloads.delete(resolveManifestAssetLink(routePreloads[i]!).href)\n }\n }\n\n if (routeAssets) {\n for (let i = routeAssets.length - 1; i >= 0; i--) {\n seenAssets.delete(getAssetIdentity(routeAssets[i]!))\n }\n }\n}\n"],"mappings":"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"}
|
package/dist/esm/types.d.ts
CHANGED
|
@@ -37,6 +37,7 @@ export interface NormalizedClientBuild {
|
|
|
37
37
|
chunksByFileName: ReadonlyMap<string, NormalizedClientChunk>;
|
|
38
38
|
chunkFileNamesByRouteFilePath: ReadonlyMap<string, ReadonlyArray<string>>;
|
|
39
39
|
cssFilesBySourcePath: ReadonlyMap<string, ReadonlyArray<string>>;
|
|
40
|
+
cssContentByFileName?: ReadonlyMap<string, string>;
|
|
40
41
|
}
|
|
41
42
|
export interface TanStackStartCoreOptions {
|
|
42
43
|
framework: CompileStartFrameworkOptions;
|
|
@@ -82,9 +82,12 @@ export declare function createViteDefineConfig(opts: {
|
|
|
82
82
|
spaEnabled: boolean | undefined;
|
|
83
83
|
devSsrStylesEnabled: boolean;
|
|
84
84
|
devSsrStylesBasepath: string;
|
|
85
|
+
inlineCssEnabled: boolean;
|
|
85
86
|
staticNodeEnv: boolean;
|
|
86
87
|
}): {
|
|
87
88
|
'process.env.NODE_ENV'?: string | undefined;
|
|
89
|
+
"process.env.TSS_INLINE_CSS_ENABLED": "true" | "false";
|
|
90
|
+
"import.meta.env.TSS_INLINE_CSS_ENABLED": "true" | "false";
|
|
88
91
|
"process.env.TSS_DEV_SSR_STYLES_BASEPATH": string;
|
|
89
92
|
"import.meta.env.TSS_DEV_SSR_STYLES_BASEPATH": string;
|
|
90
93
|
"process.env.TSS_DEV_SSR_STYLES_ENABLED": "true" | "false";
|
|
@@ -84,6 +84,7 @@ function createViteDefineConfig(opts) {
|
|
|
84
84
|
...defineReplaceEnv("TSS_DEV_SERVER", opts.command === "serve" ? "true" : "false"),
|
|
85
85
|
...defineReplaceEnv("TSS_DEV_SSR_STYLES_ENABLED", opts.devSsrStylesEnabled ? "true" : "false"),
|
|
86
86
|
...defineReplaceEnv("TSS_DEV_SSR_STYLES_BASEPATH", opts.devSsrStylesBasepath),
|
|
87
|
+
...defineReplaceEnv("TSS_INLINE_CSS_ENABLED", opts.inlineCssEnabled ? "true" : "false"),
|
|
87
88
|
...opts.command === "build" && opts.staticNodeEnv ? { "process.env.NODE_ENV": JSON.stringify(process.env.NODE_ENV || opts.mode || "production") } : {}
|
|
88
89
|
};
|
|
89
90
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"planning.js","names":[],"sources":["../../../src/vite/planning.ts"],"sourcesContent":["import { normalizePath } from 'vite'\nimport { join } from 'pathe'\nimport { escapePath } from 'tinyglobby'\nimport { ENTRY_POINTS, START_ENVIRONMENT_NAMES } from '../constants'\nimport { getBundlerOptions } from '../utils'\nimport type { CompileStartFrameworkOptions } from '../types'\nimport type { ResolvedStartEntryPlan } from '../planning'\nimport type * as vite from 'vite'\n\nexport interface ViteResolvedEntryAliases {\n client: string\n server: string\n start: string\n router: string\n alias: Record<(typeof ENTRY_POINTS)[keyof typeof ENTRY_POINTS], string>\n}\n\nexport function createViteResolvedEntryAliases(opts: {\n entryPaths: ResolvedStartEntryPlan['entryPaths']\n}): ViteResolvedEntryAliases {\n const client = normalizePath(opts.entryPaths.client)\n const server = normalizePath(opts.entryPaths.server)\n const start = normalizePath(opts.entryPaths.start)\n const router = normalizePath(opts.entryPaths.router)\n\n return {\n client,\n server,\n start,\n router,\n alias: {\n [ENTRY_POINTS.client]: client,\n [ENTRY_POINTS.server]: server,\n [ENTRY_POINTS.start]: start,\n [ENTRY_POINTS.router]: router,\n },\n }\n}\n\nexport function createViteConfigPlan(opts: {\n viteConfig: vite.UserConfig\n framework: CompileStartFrameworkOptions\n entryAliases: ViteResolvedEntryAliases\n clientOutputDirectory: string\n serverOutputDirectory: string\n serverFnProviderEnv: string\n optimizeDepsExclude: Array<string>\n noExternal: Array<string>\n}) {\n return {\n environments: {\n [START_ENVIRONMENT_NAMES.client]: {\n consumer: 'client',\n build: (() => {\n const bundlerOptions = {\n input: {\n index: ENTRY_POINTS.client,\n },\n }\n return {\n rollupOptions: bundlerOptions,\n rolldownOptions: bundlerOptions,\n outDir: opts.clientOutputDirectory,\n }\n })(),\n optimizeDeps: {\n exclude: opts.optimizeDepsExclude,\n entries: escapeEntries([\n opts.entryAliases.client,\n opts.entryAliases.router,\n ]),\n },\n },\n [START_ENVIRONMENT_NAMES.server]: {\n consumer: 'server',\n build: {\n ssr: true,\n ...(() => {\n const bundlerOptions = {\n input:\n getBundlerOptions(\n opts.viteConfig.environments?.[START_ENVIRONMENT_NAMES.server]\n ?.build,\n )?.input ?? opts.entryAliases.server,\n }\n return {\n rollupOptions: bundlerOptions,\n rolldownOptions: bundlerOptions,\n }\n })(),\n outDir: opts.serverOutputDirectory,\n commonjsOptions: {\n include: [/node_modules/],\n },\n copyPublicDir:\n opts.viteConfig.environments?.[START_ENVIRONMENT_NAMES.server]\n ?.build?.copyPublicDir ?? false,\n },\n optimizeDeps: {\n entries: escapeEntries([\n opts.entryAliases.server,\n opts.entryAliases.start,\n opts.entryAliases.router,\n ]),\n },\n },\n ...(opts.serverFnProviderEnv !== START_ENVIRONMENT_NAMES.server && {\n [opts.serverFnProviderEnv]: {\n build: {\n outDir: join(opts.serverOutputDirectory, opts.serverFnProviderEnv),\n },\n optimizeDeps: {\n entries: escapeEntries([opts.entryAliases.router]),\n },\n },\n }),\n },\n resolve: {\n noExternal: [\n '@tanstack/start**',\n `@tanstack/${opts.framework}-start**`,\n ...opts.noExternal,\n ],\n alias: {\n ...opts.entryAliases.alias,\n },\n },\n } satisfies Pick<vite.UserConfig, 'environments' | 'resolve'>\n}\n\nexport function createViteDefineConfig(opts: {\n command: 'serve' | 'build'\n mode: string | undefined\n serverFnBase: string\n routerBasepath: string\n spaEnabled: boolean | undefined\n devSsrStylesEnabled: boolean\n devSsrStylesBasepath: string\n staticNodeEnv: boolean\n}) {\n return {\n ...defineReplaceEnv('TSS_SERVER_FN_BASE', opts.serverFnBase),\n ...defineReplaceEnv('TSS_ROUTER_BASEPATH', opts.routerBasepath),\n ...(opts.command === 'serve'\n ? defineReplaceEnv('TSS_SHELL', opts.spaEnabled ? 'true' : 'false')\n : {}),\n ...defineReplaceEnv(\n 'TSS_DEV_SERVER',\n opts.command === 'serve' ? 'true' : 'false',\n ),\n ...defineReplaceEnv(\n 'TSS_DEV_SSR_STYLES_ENABLED',\n opts.devSsrStylesEnabled ? 'true' : 'false',\n ),\n ...defineReplaceEnv(\n 'TSS_DEV_SSR_STYLES_BASEPATH',\n opts.devSsrStylesBasepath,\n ),\n ...(opts.command === 'build' && opts.staticNodeEnv\n ? {\n 'process.env.NODE_ENV': JSON.stringify(\n process.env.NODE_ENV || opts.mode || 'production',\n ),\n }\n : {}),\n } satisfies NonNullable<vite.UserConfig['define']>\n}\n\nexport async function buildStartViteEnvironments(opts: {\n builder: vite.ViteBuilder\n providerEnvironmentName: string\n ssrIsProvider: boolean\n}) {\n const client = getRequiredBuilderEnvironment(\n opts.builder,\n START_ENVIRONMENT_NAMES.client,\n 'Client environment not found',\n )\n const server = getRequiredBuilderEnvironment(\n opts.builder,\n START_ENVIRONMENT_NAMES.server,\n 'SSR environment not found',\n )\n\n if (!client.isBuilt) {\n await opts.builder.build(client)\n }\n\n if (!server.isBuilt) {\n await opts.builder.build(server)\n }\n\n if (opts.ssrIsProvider) {\n return\n }\n\n const providerEnv = getRequiredBuilderEnvironment(\n opts.builder,\n opts.providerEnvironmentName,\n `Provider environment \"${opts.providerEnvironmentName}\" not found`,\n )\n\n if (!providerEnv.isBuilt) {\n await opts.builder.build(providerEnv)\n }\n}\n\nfunction escapeEntries(entries: Array<string>) {\n return entries.map((entry) => escapePath(entry))\n}\n\nfunction defineReplaceEnv<TKey extends string, TValue extends string>(\n key: TKey,\n value: TValue,\n): { [P in `process.env.${TKey}` | `import.meta.env.${TKey}`]: TValue } {\n return {\n [`process.env.${key}`]: JSON.stringify(value),\n [`import.meta.env.${key}`]: JSON.stringify(value),\n } as { [P in `process.env.${TKey}` | `import.meta.env.${TKey}`]: TValue }\n}\n\nfunction getRequiredBuilderEnvironment(\n builder: vite.ViteBuilder,\n environmentName: string,\n errorMessage: string,\n) {\n const environment = builder.environments[environmentName]\n\n if (!environment) {\n throw new Error(errorMessage)\n }\n\n return environment\n}\n"],"mappings":";;;;;;AAiBA,SAAgB,+BAA+B,MAElB;CAC3B,MAAM,SAAS,cAAc,KAAK,WAAW,OAAO;CACpD,MAAM,SAAS,cAAc,KAAK,WAAW,OAAO;CACpD,MAAM,QAAQ,cAAc,KAAK,WAAW,MAAM;CAClD,MAAM,SAAS,cAAc,KAAK,WAAW,OAAO;AAEpD,QAAO;EACL;EACA;EACA;EACA;EACA,OAAO;IACJ,aAAa,SAAS;IACtB,aAAa,SAAS;IACtB,aAAa,QAAQ;IACrB,aAAa,SAAS;GACxB;EACF;;AAGH,SAAgB,qBAAqB,MASlC;AACD,QAAO;EACL,cAAc;IACX,wBAAwB,SAAS;IAChC,UAAU;IACV,cAAc;KACZ,MAAM,iBAAiB,EACrB,OAAO,EACL,OAAO,aAAa,QACrB,EACF;AACD,YAAO;MACL,eAAe;MACf,iBAAiB;MACjB,QAAQ,KAAK;MACd;QACC;IACJ,cAAc;KACZ,SAAS,KAAK;KACd,SAAS,cAAc,CACrB,KAAK,aAAa,QAClB,KAAK,aAAa,OACnB,CAAC;KACH;IACF;IACA,wBAAwB,SAAS;IAChC,UAAU;IACV,OAAO;KACL,KAAK;KACL,UAAU;MACR,MAAM,iBAAiB,EACrB,OACE,kBACE,KAAK,WAAW,eAAe,wBAAwB,SACnD,MACL,EAAE,SAAS,KAAK,aAAa,QACjC;AACD,aAAO;OACL,eAAe;OACf,iBAAiB;OAClB;SACC;KACJ,QAAQ,KAAK;KACb,iBAAiB,EACf,SAAS,CAAC,eAAe,EAC1B;KACD,eACE,KAAK,WAAW,eAAe,wBAAwB,SACnD,OAAO,iBAAiB;KAC/B;IACD,cAAc,EACZ,SAAS,cAAc;KACrB,KAAK,aAAa;KAClB,KAAK,aAAa;KAClB,KAAK,aAAa;KACnB,CAAC,EACH;IACF;GACD,GAAI,KAAK,wBAAwB,wBAAwB,UAAU,GAChE,KAAK,sBAAsB;IAC1B,OAAO,EACL,QAAQ,KAAK,KAAK,uBAAuB,KAAK,oBAAoB,EACnE;IACD,cAAc,EACZ,SAAS,cAAc,CAAC,KAAK,aAAa,OAAO,CAAC,EACnD;IACF,EACF;GACF;EACD,SAAS;GACP,YAAY;IACV;IACA,aAAa,KAAK,UAAU;IAC5B,GAAG,KAAK;IACT;GACD,OAAO,EACL,GAAG,KAAK,aAAa,OACtB;GACF;EACF;;AAGH,SAAgB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"planning.js","names":[],"sources":["../../../src/vite/planning.ts"],"sourcesContent":["import { normalizePath } from 'vite'\nimport { join } from 'pathe'\nimport { escapePath } from 'tinyglobby'\nimport { ENTRY_POINTS, START_ENVIRONMENT_NAMES } from '../constants'\nimport { getBundlerOptions } from '../utils'\nimport type { CompileStartFrameworkOptions } from '../types'\nimport type { ResolvedStartEntryPlan } from '../planning'\nimport type * as vite from 'vite'\n\nexport interface ViteResolvedEntryAliases {\n client: string\n server: string\n start: string\n router: string\n alias: Record<(typeof ENTRY_POINTS)[keyof typeof ENTRY_POINTS], string>\n}\n\nexport function createViteResolvedEntryAliases(opts: {\n entryPaths: ResolvedStartEntryPlan['entryPaths']\n}): ViteResolvedEntryAliases {\n const client = normalizePath(opts.entryPaths.client)\n const server = normalizePath(opts.entryPaths.server)\n const start = normalizePath(opts.entryPaths.start)\n const router = normalizePath(opts.entryPaths.router)\n\n return {\n client,\n server,\n start,\n router,\n alias: {\n [ENTRY_POINTS.client]: client,\n [ENTRY_POINTS.server]: server,\n [ENTRY_POINTS.start]: start,\n [ENTRY_POINTS.router]: router,\n },\n }\n}\n\nexport function createViteConfigPlan(opts: {\n viteConfig: vite.UserConfig\n framework: CompileStartFrameworkOptions\n entryAliases: ViteResolvedEntryAliases\n clientOutputDirectory: string\n serverOutputDirectory: string\n serverFnProviderEnv: string\n optimizeDepsExclude: Array<string>\n noExternal: Array<string>\n}) {\n return {\n environments: {\n [START_ENVIRONMENT_NAMES.client]: {\n consumer: 'client',\n build: (() => {\n const bundlerOptions = {\n input: {\n index: ENTRY_POINTS.client,\n },\n }\n return {\n rollupOptions: bundlerOptions,\n rolldownOptions: bundlerOptions,\n outDir: opts.clientOutputDirectory,\n }\n })(),\n optimizeDeps: {\n exclude: opts.optimizeDepsExclude,\n entries: escapeEntries([\n opts.entryAliases.client,\n opts.entryAliases.router,\n ]),\n },\n },\n [START_ENVIRONMENT_NAMES.server]: {\n consumer: 'server',\n build: {\n ssr: true,\n ...(() => {\n const bundlerOptions = {\n input:\n getBundlerOptions(\n opts.viteConfig.environments?.[START_ENVIRONMENT_NAMES.server]\n ?.build,\n )?.input ?? opts.entryAliases.server,\n }\n return {\n rollupOptions: bundlerOptions,\n rolldownOptions: bundlerOptions,\n }\n })(),\n outDir: opts.serverOutputDirectory,\n commonjsOptions: {\n include: [/node_modules/],\n },\n copyPublicDir:\n opts.viteConfig.environments?.[START_ENVIRONMENT_NAMES.server]\n ?.build?.copyPublicDir ?? false,\n },\n optimizeDeps: {\n entries: escapeEntries([\n opts.entryAliases.server,\n opts.entryAliases.start,\n opts.entryAliases.router,\n ]),\n },\n },\n ...(opts.serverFnProviderEnv !== START_ENVIRONMENT_NAMES.server && {\n [opts.serverFnProviderEnv]: {\n build: {\n outDir: join(opts.serverOutputDirectory, opts.serverFnProviderEnv),\n },\n optimizeDeps: {\n entries: escapeEntries([opts.entryAliases.router]),\n },\n },\n }),\n },\n resolve: {\n noExternal: [\n '@tanstack/start**',\n `@tanstack/${opts.framework}-start**`,\n ...opts.noExternal,\n ],\n alias: {\n ...opts.entryAliases.alias,\n },\n },\n } satisfies Pick<vite.UserConfig, 'environments' | 'resolve'>\n}\n\nexport function createViteDefineConfig(opts: {\n command: 'serve' | 'build'\n mode: string | undefined\n serverFnBase: string\n routerBasepath: string\n spaEnabled: boolean | undefined\n devSsrStylesEnabled: boolean\n devSsrStylesBasepath: string\n inlineCssEnabled: boolean\n staticNodeEnv: boolean\n}) {\n return {\n ...defineReplaceEnv('TSS_SERVER_FN_BASE', opts.serverFnBase),\n ...defineReplaceEnv('TSS_ROUTER_BASEPATH', opts.routerBasepath),\n ...(opts.command === 'serve'\n ? defineReplaceEnv('TSS_SHELL', opts.spaEnabled ? 'true' : 'false')\n : {}),\n ...defineReplaceEnv(\n 'TSS_DEV_SERVER',\n opts.command === 'serve' ? 'true' : 'false',\n ),\n ...defineReplaceEnv(\n 'TSS_DEV_SSR_STYLES_ENABLED',\n opts.devSsrStylesEnabled ? 'true' : 'false',\n ),\n ...defineReplaceEnv(\n 'TSS_DEV_SSR_STYLES_BASEPATH',\n opts.devSsrStylesBasepath,\n ),\n ...defineReplaceEnv(\n 'TSS_INLINE_CSS_ENABLED',\n opts.inlineCssEnabled ? 'true' : 'false',\n ),\n ...(opts.command === 'build' && opts.staticNodeEnv\n ? {\n 'process.env.NODE_ENV': JSON.stringify(\n process.env.NODE_ENV || opts.mode || 'production',\n ),\n }\n : {}),\n } satisfies NonNullable<vite.UserConfig['define']>\n}\n\nexport async function buildStartViteEnvironments(opts: {\n builder: vite.ViteBuilder\n providerEnvironmentName: string\n ssrIsProvider: boolean\n}) {\n const client = getRequiredBuilderEnvironment(\n opts.builder,\n START_ENVIRONMENT_NAMES.client,\n 'Client environment not found',\n )\n const server = getRequiredBuilderEnvironment(\n opts.builder,\n START_ENVIRONMENT_NAMES.server,\n 'SSR environment not found',\n )\n\n if (!client.isBuilt) {\n await opts.builder.build(client)\n }\n\n if (!server.isBuilt) {\n await opts.builder.build(server)\n }\n\n if (opts.ssrIsProvider) {\n return\n }\n\n const providerEnv = getRequiredBuilderEnvironment(\n opts.builder,\n opts.providerEnvironmentName,\n `Provider environment \"${opts.providerEnvironmentName}\" not found`,\n )\n\n if (!providerEnv.isBuilt) {\n await opts.builder.build(providerEnv)\n }\n}\n\nfunction escapeEntries(entries: Array<string>) {\n return entries.map((entry) => escapePath(entry))\n}\n\nfunction defineReplaceEnv<TKey extends string, TValue extends string>(\n key: TKey,\n value: TValue,\n): { [P in `process.env.${TKey}` | `import.meta.env.${TKey}`]: TValue } {\n return {\n [`process.env.${key}`]: JSON.stringify(value),\n [`import.meta.env.${key}`]: JSON.stringify(value),\n } as { [P in `process.env.${TKey}` | `import.meta.env.${TKey}`]: TValue }\n}\n\nfunction getRequiredBuilderEnvironment(\n builder: vite.ViteBuilder,\n environmentName: string,\n errorMessage: string,\n) {\n const environment = builder.environments[environmentName]\n\n if (!environment) {\n throw new Error(errorMessage)\n }\n\n return environment\n}\n"],"mappings":"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"}
|
package/dist/esm/vite/plugin.js
CHANGED
|
@@ -102,6 +102,7 @@ function tanStackStartVite(corePluginOpts, startPluginOpts) {
|
|
|
102
102
|
spaEnabled: startConfig.spa?.enabled,
|
|
103
103
|
devSsrStylesEnabled: startConfig.dev.ssrStyles.enabled,
|
|
104
104
|
devSsrStylesBasepath: startConfig.dev.ssrStyles.basepath ?? resolvedStartConfig.basePaths.publicBase,
|
|
105
|
+
inlineCssEnabled: command === "build" && startConfig.server.build.inlineCss,
|
|
105
106
|
staticNodeEnv: startConfig.server.build.staticNodeEnv
|
|
106
107
|
}),
|
|
107
108
|
builder: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","names":[],"sources":["../../../src/vite/plugin.ts"],"sourcesContent":["import { crawlFrameworkPkgs } from 'vitefu'\nimport {\n applyResolvedBaseAndOutput,\n applyResolvedRouterBasepath,\n createStartConfigContext,\n} from '../config-context'\nimport { START_ENVIRONMENT_NAMES } from '../constants'\nimport {\n createServerFnBasePath,\n normalizePublicBase,\n shouldRewriteDevBasepath,\n} from '../planning'\nimport { importProtectionPlugin } from './import-protection-plugin/plugin'\nimport { startCompilerPlugin } from './start-compiler-plugin/plugin'\nimport { loadEnvPlugin } from './load-env-plugin/plugin'\nimport {\n buildStartViteEnvironments,\n createViteConfigPlan,\n createViteDefineConfig,\n createViteResolvedEntryAliases,\n} from './planning'\nimport { devServerPlugin } from './dev-server-plugin/plugin'\nimport { previewServerPlugin } from './preview-server-plugin/plugin'\nimport {\n createDevBaseRewritePlugin,\n createPostBuildPlugin,\n createVirtualClientEntryPlugin,\n} from './plugins'\nimport { parseStartConfig } from './schema'\nimport { startManifestPlugin } from './start-manifest-plugin/plugin'\nimport { tanStackStartRouter } from './start-router-plugin/plugin'\nimport {\n getClientOutputDirectory,\n getServerOutputDirectory,\n} from './output-directory'\nimport { postServerBuild } from './post-server-build'\nimport { serializationAdaptersPlugin } from './serialization-adapters-plugin'\nimport type {\n TanStackStartVitePluginCoreOptions,\n ViteRscForwardSsrResolverStrategy,\n} from './types'\nimport type { TanStackStartViteInputConfig } from './schema'\nimport type { PluginOption } from 'vite'\n\nexport function tanStackStartVite(\n corePluginOpts: TanStackStartVitePluginCoreOptions,\n startPluginOpts: TanStackStartViteInputConfig | undefined,\n): Array<PluginOption> {\n const normalizedStartPluginOpts = startPluginOpts ?? {}\n\n const configContext = createStartConfigContext({\n corePluginOpts,\n startPluginOpts: normalizedStartPluginOpts,\n parseConfig: parseStartConfig,\n })\n const { getConfig, resolvedStartConfig } = configContext\n const serverFnProviderEnv = corePluginOpts.providerEnvironmentName\n const ssrIsProvider = corePluginOpts.ssrIsProvider\n\n // When the router basepath and vite base are misaligned during dev,\n // we install a URL rewrite middleware instead of erroring.\n let needsDevBaseRewrite = false\n\n const environments: Array<{\n name: string\n type: 'client' | 'server'\n getServerFnById?: string\n }> = [\n { name: START_ENVIRONMENT_NAMES.client, type: 'client' },\n {\n name: START_ENVIRONMENT_NAMES.server,\n type: 'server',\n getServerFnById:\n corePluginOpts.ssrResolverStrategy.type === 'vite-rsc-forward'\n ? createViteRscForwarder(corePluginOpts.ssrResolverStrategy)\n : undefined,\n },\n ]\n if (\n serverFnProviderEnv !== START_ENVIRONMENT_NAMES.server &&\n !environments.find((e) => e.name === serverFnProviderEnv)\n ) {\n environments.push({\n name: serverFnProviderEnv,\n type: 'server',\n })\n }\n return [\n {\n name: 'tanstack-start-core:config',\n enforce: 'pre',\n async config(viteConfig, { command }) {\n const publicBase = normalizePublicBase(viteConfig.base)\n applyResolvedBaseAndOutput({\n resolvedStartConfig,\n root: viteConfig.root || process.cwd(),\n publicBase,\n clientOutputDirectory: getClientOutputDirectory(viteConfig),\n serverOutputDirectory: getServerOutputDirectory(viteConfig),\n })\n const { startConfig } = getConfig()\n const routerBasepath = applyResolvedRouterBasepath({\n resolvedStartConfig,\n startConfig,\n })\n\n if (\n shouldRewriteDevBasepath({\n command,\n middlewareMode: Boolean(viteConfig.server?.middlewareMode),\n routerBasepath,\n publicBase: resolvedStartConfig.basePaths.publicBase,\n })\n ) {\n // The router basepath and vite base are misaligned.\n // Instead of erroring, we install a dev-server middleware that\n // rewrites incoming request URLs to prepend the vite base prefix.\n // This allows users to have e.g. base: '/_ui/' for asset URLs\n // while keeping router basepath at '/' for page navigation.\n needsDevBaseRewrite = true\n }\n\n const TSS_SERVER_FN_BASE = createServerFnBasePath({\n routerBasepath,\n serverFnBase: startConfig.serverFns.base,\n })\n const resolvedEntryPlan = configContext.resolveEntries()\n\n const entryAliases = createViteResolvedEntryAliases({\n entryPaths: resolvedEntryPlan.entryPaths,\n })\n\n const startPackageName =\n `@tanstack/${corePluginOpts.framework}-start` as const\n\n // crawl packages that have start in \"peerDependencies\"\n // see https://github.com/svitejs/vitefu/blob/d8d82fa121e3b2215ba437107093c77bde51b63b/src/index.js#L95-L101\n\n // this is currently uncached; could be implemented similarly as vite handles lock file changes\n // see https://github.com/vitejs/vite/blob/557f797d29422027e8c451ca50dd84bf8c41b5f0/packages/vite/src/node/optimizer/index.ts#L1282\n\n const crawlFrameworkPkgsResult = await crawlFrameworkPkgs({\n root: process.cwd(),\n isBuild: command === 'build',\n isFrameworkPkgByJson(pkgJson) {\n const peerDependencies = pkgJson['peerDependencies']\n\n if (peerDependencies) {\n if (\n startPackageName in peerDependencies ||\n '@tanstack/start-client-core' in peerDependencies\n ) {\n return true\n }\n }\n\n return false\n },\n })\n\n const viteConfigPlan = createViteConfigPlan({\n viteConfig,\n framework: corePluginOpts.framework,\n entryAliases,\n clientOutputDirectory: resolvedStartConfig.outputDirectories.client,\n serverOutputDirectory: resolvedStartConfig.outputDirectories.server,\n serverFnProviderEnv,\n optimizeDepsExclude: crawlFrameworkPkgsResult.optimizeDeps.exclude,\n noExternal: crawlFrameworkPkgsResult.ssr.noExternal.sort(),\n })\n\n return {\n // see https://vite.dev/config/shared-options.html#apptype\n // this will prevent vite from injecting middlewares that we don't want\n appType: viteConfig.appType ?? 'custom',\n environments: viteConfigPlan.environments,\n resolve: viteConfigPlan.resolve,\n define: createViteDefineConfig({\n command,\n mode: viteConfig.mode,\n serverFnBase: TSS_SERVER_FN_BASE,\n routerBasepath,\n spaEnabled: startConfig.spa?.enabled,\n devSsrStylesEnabled: startConfig.dev.ssrStyles.enabled,\n devSsrStylesBasepath:\n startConfig.dev.ssrStyles.basepath ??\n resolvedStartConfig.basePaths.publicBase,\n staticNodeEnv: startConfig.server.build.staticNodeEnv,\n }),\n builder: {\n sharedPlugins: true,\n async buildApp(builder) {\n await buildStartViteEnvironments({\n builder,\n providerEnvironmentName: serverFnProviderEnv,\n ssrIsProvider,\n })\n },\n },\n }\n },\n },\n createPostBuildPlugin({\n getConfig,\n postServerBuild,\n }),\n // Server function plugin handles:\n // 1. Identifying createServerFn().handler() calls\n // 2. Extracting server functions to separate modules\n // 3. Replacing call sites with RPC stubs\n // 4. Generating the server function manifest\n // Also handles createIsomorphicFn, createServerOnlyFn, createClientOnlyFn, createMiddleware\n startCompilerPlugin({\n framework: corePluginOpts.framework,\n environments,\n generateFunctionId:\n normalizedStartPluginOpts.serverFns?.generateFunctionId,\n providerEnvName: serverFnProviderEnv,\n }),\n importProtectionPlugin({\n getConfig,\n framework: corePluginOpts.framework,\n environments,\n providerEnvName: serverFnProviderEnv,\n }),\n tanStackStartRouter(normalizedStartPluginOpts, getConfig, corePluginOpts),\n loadEnvPlugin(),\n createVirtualClientEntryPlugin({\n getClientEntry: () => configContext.resolveEntries().entryPaths.client,\n }),\n startManifestPlugin({\n getConfig,\n }),\n // When the vite base and router basepath are misaligned (e.g. base: '/_ui/', basepath: '/'),\n // install a middleware that rewrites incoming request URLs to prepend the vite base prefix.\n // This allows Vite's internal base middleware to accept the requests, then strips the prefix\n // before passing to the SSR handler.\n // Registered BEFORE devServerPlugin so this middleware is added to the Connect stack first,\n // ensuring all subsequent middlewares (CSS, SSR, etc.) see the rewritten URL.\n createDevBaseRewritePlugin({\n shouldRewriteDevBase: () => needsDevBaseRewrite,\n resolvedStartConfig,\n }),\n devServerPlugin({\n getConfig,\n devSsrStylesEnabled:\n normalizedStartPluginOpts.dev?.ssrStyles?.enabled ?? true,\n installDevServerMiddleware:\n normalizedStartPluginOpts.vite?.installDevServerMiddleware,\n }),\n previewServerPlugin(),\n serializationAdaptersPlugin({\n adapters: corePluginOpts.serializationAdapters,\n }),\n ]\n}\n\nfunction createViteRscForwarder(strategy: ViteRscForwardSsrResolverStrategy) {\n return `export async function getServerFnById(id, access) {\n const m = await import.meta.viteRsc.loadModule(${JSON.stringify(strategy.sourceEnvironmentName)}, ${JSON.stringify(strategy.sourceEntry)})\n return m[${JSON.stringify(strategy.exportName)}](id, access)\n}`\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.js","names":[],"sources":["../../../src/vite/plugin.ts"],"sourcesContent":["import { crawlFrameworkPkgs } from 'vitefu'\nimport {\n applyResolvedBaseAndOutput,\n applyResolvedRouterBasepath,\n createStartConfigContext,\n} from '../config-context'\nimport { START_ENVIRONMENT_NAMES } from '../constants'\nimport {\n createServerFnBasePath,\n normalizePublicBase,\n shouldRewriteDevBasepath,\n} from '../planning'\nimport { importProtectionPlugin } from './import-protection-plugin/plugin'\nimport { startCompilerPlugin } from './start-compiler-plugin/plugin'\nimport { loadEnvPlugin } from './load-env-plugin/plugin'\nimport {\n buildStartViteEnvironments,\n createViteConfigPlan,\n createViteDefineConfig,\n createViteResolvedEntryAliases,\n} from './planning'\nimport { devServerPlugin } from './dev-server-plugin/plugin'\nimport { previewServerPlugin } from './preview-server-plugin/plugin'\nimport {\n createDevBaseRewritePlugin,\n createPostBuildPlugin,\n createVirtualClientEntryPlugin,\n} from './plugins'\nimport { parseStartConfig } from './schema'\nimport { startManifestPlugin } from './start-manifest-plugin/plugin'\nimport { tanStackStartRouter } from './start-router-plugin/plugin'\nimport {\n getClientOutputDirectory,\n getServerOutputDirectory,\n} from './output-directory'\nimport { postServerBuild } from './post-server-build'\nimport { serializationAdaptersPlugin } from './serialization-adapters-plugin'\nimport type {\n TanStackStartVitePluginCoreOptions,\n ViteRscForwardSsrResolverStrategy,\n} from './types'\nimport type { TanStackStartViteInputConfig } from './schema'\nimport type { PluginOption } from 'vite'\n\nexport function tanStackStartVite(\n corePluginOpts: TanStackStartVitePluginCoreOptions,\n startPluginOpts: TanStackStartViteInputConfig | undefined,\n): Array<PluginOption> {\n const normalizedStartPluginOpts = startPluginOpts ?? {}\n\n const configContext = createStartConfigContext({\n corePluginOpts,\n startPluginOpts: normalizedStartPluginOpts,\n parseConfig: parseStartConfig,\n })\n const { getConfig, resolvedStartConfig } = configContext\n const serverFnProviderEnv = corePluginOpts.providerEnvironmentName\n const ssrIsProvider = corePluginOpts.ssrIsProvider\n\n // When the router basepath and vite base are misaligned during dev,\n // we install a URL rewrite middleware instead of erroring.\n let needsDevBaseRewrite = false\n\n const environments: Array<{\n name: string\n type: 'client' | 'server'\n getServerFnById?: string\n }> = [\n { name: START_ENVIRONMENT_NAMES.client, type: 'client' },\n {\n name: START_ENVIRONMENT_NAMES.server,\n type: 'server',\n getServerFnById:\n corePluginOpts.ssrResolverStrategy.type === 'vite-rsc-forward'\n ? createViteRscForwarder(corePluginOpts.ssrResolverStrategy)\n : undefined,\n },\n ]\n if (\n serverFnProviderEnv !== START_ENVIRONMENT_NAMES.server &&\n !environments.find((e) => e.name === serverFnProviderEnv)\n ) {\n environments.push({\n name: serverFnProviderEnv,\n type: 'server',\n })\n }\n return [\n {\n name: 'tanstack-start-core:config',\n enforce: 'pre',\n async config(viteConfig, { command }) {\n const publicBase = normalizePublicBase(viteConfig.base)\n applyResolvedBaseAndOutput({\n resolvedStartConfig,\n root: viteConfig.root || process.cwd(),\n publicBase,\n clientOutputDirectory: getClientOutputDirectory(viteConfig),\n serverOutputDirectory: getServerOutputDirectory(viteConfig),\n })\n const { startConfig } = getConfig()\n const routerBasepath = applyResolvedRouterBasepath({\n resolvedStartConfig,\n startConfig,\n })\n\n if (\n shouldRewriteDevBasepath({\n command,\n middlewareMode: Boolean(viteConfig.server?.middlewareMode),\n routerBasepath,\n publicBase: resolvedStartConfig.basePaths.publicBase,\n })\n ) {\n // The router basepath and vite base are misaligned.\n // Instead of erroring, we install a dev-server middleware that\n // rewrites incoming request URLs to prepend the vite base prefix.\n // This allows users to have e.g. base: '/_ui/' for asset URLs\n // while keeping router basepath at '/' for page navigation.\n needsDevBaseRewrite = true\n }\n\n const TSS_SERVER_FN_BASE = createServerFnBasePath({\n routerBasepath,\n serverFnBase: startConfig.serverFns.base,\n })\n const resolvedEntryPlan = configContext.resolveEntries()\n\n const entryAliases = createViteResolvedEntryAliases({\n entryPaths: resolvedEntryPlan.entryPaths,\n })\n\n const startPackageName =\n `@tanstack/${corePluginOpts.framework}-start` as const\n\n // crawl packages that have start in \"peerDependencies\"\n // see https://github.com/svitejs/vitefu/blob/d8d82fa121e3b2215ba437107093c77bde51b63b/src/index.js#L95-L101\n\n // this is currently uncached; could be implemented similarly as vite handles lock file changes\n // see https://github.com/vitejs/vite/blob/557f797d29422027e8c451ca50dd84bf8c41b5f0/packages/vite/src/node/optimizer/index.ts#L1282\n\n const crawlFrameworkPkgsResult = await crawlFrameworkPkgs({\n root: process.cwd(),\n isBuild: command === 'build',\n isFrameworkPkgByJson(pkgJson) {\n const peerDependencies = pkgJson['peerDependencies']\n\n if (peerDependencies) {\n if (\n startPackageName in peerDependencies ||\n '@tanstack/start-client-core' in peerDependencies\n ) {\n return true\n }\n }\n\n return false\n },\n })\n\n const viteConfigPlan = createViteConfigPlan({\n viteConfig,\n framework: corePluginOpts.framework,\n entryAliases,\n clientOutputDirectory: resolvedStartConfig.outputDirectories.client,\n serverOutputDirectory: resolvedStartConfig.outputDirectories.server,\n serverFnProviderEnv,\n optimizeDepsExclude: crawlFrameworkPkgsResult.optimizeDeps.exclude,\n noExternal: crawlFrameworkPkgsResult.ssr.noExternal.sort(),\n })\n\n return {\n // see https://vite.dev/config/shared-options.html#apptype\n // this will prevent vite from injecting middlewares that we don't want\n appType: viteConfig.appType ?? 'custom',\n environments: viteConfigPlan.environments,\n resolve: viteConfigPlan.resolve,\n define: createViteDefineConfig({\n command,\n mode: viteConfig.mode,\n serverFnBase: TSS_SERVER_FN_BASE,\n routerBasepath,\n spaEnabled: startConfig.spa?.enabled,\n devSsrStylesEnabled: startConfig.dev.ssrStyles.enabled,\n devSsrStylesBasepath:\n startConfig.dev.ssrStyles.basepath ??\n resolvedStartConfig.basePaths.publicBase,\n inlineCssEnabled:\n command === 'build' && startConfig.server.build.inlineCss,\n staticNodeEnv: startConfig.server.build.staticNodeEnv,\n }),\n builder: {\n sharedPlugins: true,\n async buildApp(builder) {\n await buildStartViteEnvironments({\n builder,\n providerEnvironmentName: serverFnProviderEnv,\n ssrIsProvider,\n })\n },\n },\n }\n },\n },\n createPostBuildPlugin({\n getConfig,\n postServerBuild,\n }),\n // Server function plugin handles:\n // 1. Identifying createServerFn().handler() calls\n // 2. Extracting server functions to separate modules\n // 3. Replacing call sites with RPC stubs\n // 4. Generating the server function manifest\n // Also handles createIsomorphicFn, createServerOnlyFn, createClientOnlyFn, createMiddleware\n startCompilerPlugin({\n framework: corePluginOpts.framework,\n environments,\n generateFunctionId:\n normalizedStartPluginOpts.serverFns?.generateFunctionId,\n providerEnvName: serverFnProviderEnv,\n }),\n importProtectionPlugin({\n getConfig,\n framework: corePluginOpts.framework,\n environments,\n providerEnvName: serverFnProviderEnv,\n }),\n tanStackStartRouter(normalizedStartPluginOpts, getConfig, corePluginOpts),\n loadEnvPlugin(),\n createVirtualClientEntryPlugin({\n getClientEntry: () => configContext.resolveEntries().entryPaths.client,\n }),\n startManifestPlugin({\n getConfig,\n }),\n // When the vite base and router basepath are misaligned (e.g. base: '/_ui/', basepath: '/'),\n // install a middleware that rewrites incoming request URLs to prepend the vite base prefix.\n // This allows Vite's internal base middleware to accept the requests, then strips the prefix\n // before passing to the SSR handler.\n // Registered BEFORE devServerPlugin so this middleware is added to the Connect stack first,\n // ensuring all subsequent middlewares (CSS, SSR, etc.) see the rewritten URL.\n createDevBaseRewritePlugin({\n shouldRewriteDevBase: () => needsDevBaseRewrite,\n resolvedStartConfig,\n }),\n devServerPlugin({\n getConfig,\n devSsrStylesEnabled:\n normalizedStartPluginOpts.dev?.ssrStyles?.enabled ?? true,\n installDevServerMiddleware:\n normalizedStartPluginOpts.vite?.installDevServerMiddleware,\n }),\n previewServerPlugin(),\n serializationAdaptersPlugin({\n adapters: corePluginOpts.serializationAdapters,\n }),\n ]\n}\n\nfunction createViteRscForwarder(strategy: ViteRscForwardSsrResolverStrategy) {\n return `export async function getServerFnById(id, access) {\n const m = await import.meta.viteRsc.loadModule(${JSON.stringify(strategy.sourceEnvironmentName)}, ${JSON.stringify(strategy.sourceEntry)})\n return m[${JSON.stringify(strategy.exportName)}](id, access)\n}`\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AA4CA,SAAgB,kBACd,gBACA,iBACqB;CACrB,MAAM,4BAA4B,mBAAmB,EAAE;CAEvD,MAAM,gBAAgB,yBAAyB;EAC7C;EACA,iBAAiB;EACjB,aAAa;EACd,CAAC;CACF,MAAM,EAAE,WAAW,wBAAwB;CAC3C,MAAM,sBAAsB,eAAe;CAC3C,MAAM,gBAAgB,eAAe;CAIrC,IAAI,sBAAsB;CAE1B,MAAM,eAID,CACH;EAAE,MAAM,wBAAwB;EAAQ,MAAM;EAAU,EACxD;EACE,MAAM,wBAAwB;EAC9B,MAAM;EACN,iBACE,eAAe,oBAAoB,SAAS,qBACxC,uBAAuB,eAAe,oBAAoB,GAC1D,KAAA;EACP,CACF;AACD,KACE,wBAAwB,wBAAwB,UAChD,CAAC,aAAa,MAAM,MAAM,EAAE,SAAS,oBAAoB,CAEzD,cAAa,KAAK;EAChB,MAAM;EACN,MAAM;EACP,CAAC;AAEJ,QAAO;EACL;GACE,MAAM;GACN,SAAS;GACT,MAAM,OAAO,YAAY,EAAE,WAAW;IACpC,MAAM,aAAa,oBAAoB,WAAW,KAAK;AACvD,+BAA2B;KACzB;KACA,MAAM,WAAW,QAAQ,QAAQ,KAAK;KACtC;KACA,uBAAuB,yBAAyB,WAAW;KAC3D,uBAAuB,yBAAyB,WAAW;KAC5D,CAAC;IACF,MAAM,EAAE,gBAAgB,WAAW;IACnC,MAAM,iBAAiB,4BAA4B;KACjD;KACA;KACD,CAAC;AAEF,QACE,yBAAyB;KACvB;KACA,gBAAgB,QAAQ,WAAW,QAAQ,eAAe;KAC1D;KACA,YAAY,oBAAoB,UAAU;KAC3C,CAAC,CAOF,uBAAsB;IAGxB,MAAM,qBAAqB,uBAAuB;KAChD;KACA,cAAc,YAAY,UAAU;KACrC,CAAC;IAGF,MAAM,eAAe,+BAA+B,EAClD,YAHwB,cAAc,gBAAgB,CAGxB,YAC/B,CAAC;IAEF,MAAM,mBACJ,aAAa,eAAe,UAAU;IAQxC,MAAM,2BAA2B,MAAM,mBAAmB;KACxD,MAAM,QAAQ,KAAK;KACnB,SAAS,YAAY;KACrB,qBAAqB,SAAS;MAC5B,MAAM,mBAAmB,QAAQ;AAEjC,UAAI;WAEA,oBAAoB,oBACpB,iCAAiC,iBAEjC,QAAO;;AAIX,aAAO;;KAEV,CAAC;IAEF,MAAM,iBAAiB,qBAAqB;KAC1C;KACA,WAAW,eAAe;KAC1B;KACA,uBAAuB,oBAAoB,kBAAkB;KAC7D,uBAAuB,oBAAoB,kBAAkB;KAC7D;KACA,qBAAqB,yBAAyB,aAAa;KAC3D,YAAY,yBAAyB,IAAI,WAAW,MAAM;KAC3D,CAAC;AAEF,WAAO;KAGL,SAAS,WAAW,WAAW;KAC/B,cAAc,eAAe;KAC7B,SAAS,eAAe;KACxB,QAAQ,uBAAuB;MAC7B;MACA,MAAM,WAAW;MACjB,cAAc;MACd;MACA,YAAY,YAAY,KAAK;MAC7B,qBAAqB,YAAY,IAAI,UAAU;MAC/C,sBACE,YAAY,IAAI,UAAU,YAC1B,oBAAoB,UAAU;MAChC,kBACE,YAAY,WAAW,YAAY,OAAO,MAAM;MAClD,eAAe,YAAY,OAAO,MAAM;MACzC,CAAC;KACF,SAAS;MACP,eAAe;MACf,MAAM,SAAS,SAAS;AACtB,aAAM,2BAA2B;QAC/B;QACA,yBAAyB;QACzB;QACD,CAAC;;MAEL;KACF;;GAEJ;EACD,sBAAsB;GACpB;GACA;GACD,CAAC;EAOF,oBAAoB;GAClB,WAAW,eAAe;GAC1B;GACA,oBACE,0BAA0B,WAAW;GACvC,iBAAiB;GAClB,CAAC;EACF,uBAAuB;GACrB;GACA,WAAW,eAAe;GAC1B;GACA,iBAAiB;GAClB,CAAC;EACF,oBAAoB,2BAA2B,WAAW,eAAe;EACzE,eAAe;EACf,+BAA+B,EAC7B,sBAAsB,cAAc,gBAAgB,CAAC,WAAW,QACjE,CAAC;EACF,oBAAoB,EAClB,WACD,CAAC;EAOF,2BAA2B;GACzB,4BAA4B;GAC5B;GACD,CAAC;EACF,gBAAgB;GACd;GACA,qBACE,0BAA0B,KAAK,WAAW,WAAW;GACvD,4BACE,0BAA0B,MAAM;GACnC,CAAC;EACF,qBAAqB;EACrB,4BAA4B,EAC1B,UAAU,eAAe,uBAC1B,CAAC;EACH;;AAGH,SAAS,uBAAuB,UAA6C;AAC3E,QAAO;mDAC0C,KAAK,UAAU,SAAS,sBAAsB,CAAC,IAAI,KAAK,UAAU,SAAS,YAAY,CAAC;aAC9H,KAAK,UAAU,SAAS,WAAW,CAAC"}
|