@inertiajs/vite 3.0.0-beta.1 → 3.0.0-beta.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/index.js +28 -13
- package/dist/index.js.map +2 -2
- package/package.json +2 -2
- package/types/astUtils.d.ts +9 -2
package/dist/index.js
CHANGED
|
@@ -119,24 +119,38 @@ var ParsedCode = class _ParsedCode {
|
|
|
119
119
|
return name ? { name, config: frameworks2[name] } : null;
|
|
120
120
|
}
|
|
121
121
|
/**
|
|
122
|
-
* Find a top-level `createInertiaApp()` expression statement
|
|
123
|
-
*
|
|
122
|
+
* Find a top-level `createInertiaApp()` expression statement, ignoring any
|
|
123
|
+
* `await`, `void`, or `.then()`/`.catch()` wrappers around it.
|
|
124
|
+
*
|
|
125
|
+
* Does not match `export default createInertiaApp()`.
|
|
124
126
|
*/
|
|
125
127
|
get inertiaStatement() {
|
|
126
128
|
for (const node of this.ast.body) {
|
|
127
129
|
if (node.type !== "ExpressionStatement") {
|
|
128
130
|
continue;
|
|
129
131
|
}
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
132
|
+
const call = this.unwrapInertiaCall(node.expression);
|
|
133
|
+
if (call) {
|
|
134
|
+
const statement = node;
|
|
135
|
+
return { statement, call };
|
|
134
136
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
137
|
+
}
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Unwrap an expression to find a `createInertiaApp()` call inside it.
|
|
142
|
+
* Strips away `await`, `void`, and `.then()`/`.catch()` chains.
|
|
143
|
+
*/
|
|
144
|
+
unwrapInertiaCall(node) {
|
|
145
|
+
if ((node.type === "UnaryExpression" || node.type === "AwaitExpression") && node.argument) {
|
|
146
|
+
return this.unwrapInertiaCall(node.argument);
|
|
147
|
+
}
|
|
148
|
+
if (node.type === "CallExpression") {
|
|
149
|
+
if (this.isInertiaCall(node)) {
|
|
150
|
+
return node;
|
|
151
|
+
}
|
|
152
|
+
if (node.callee.type === "MemberExpression") {
|
|
153
|
+
return this.unwrapInertiaCall(node.callee.object);
|
|
140
154
|
}
|
|
141
155
|
}
|
|
142
156
|
return null;
|
|
@@ -369,7 +383,7 @@ function collectCSSFromModuleGraph(server, entry) {
|
|
|
369
383
|
}
|
|
370
384
|
const origin = resolveDevServerOrigin(server);
|
|
371
385
|
const base = server.config.base || "/";
|
|
372
|
-
const basePrefix = base === "/" ? "" : base;
|
|
386
|
+
const basePrefix = base === "/" ? "" : base.replace(/\/$/, "");
|
|
373
387
|
return cssModules.map(({ url, id }) => {
|
|
374
388
|
const href = `${origin}${basePrefix}${url}`;
|
|
375
389
|
const devId = id ? ` data-vite-dev-id="${id}"` : "";
|
|
@@ -390,6 +404,7 @@ function collectCSSModules(entryModule) {
|
|
|
390
404
|
visited.add(mod);
|
|
391
405
|
if (isCSSRequest(mod.url)) {
|
|
392
406
|
cssModules.push({ url: mod.url, id: mod.id });
|
|
407
|
+
return;
|
|
393
408
|
}
|
|
394
409
|
for (const imported of mod.importedModules) {
|
|
395
410
|
traverse(imported);
|
|
@@ -404,7 +419,7 @@ function isCSSRequest(url) {
|
|
|
404
419
|
}
|
|
405
420
|
function resolveDevServerOrigin(server) {
|
|
406
421
|
if (server.resolvedUrls?.local[0]) {
|
|
407
|
-
return server.resolvedUrls.local[0].
|
|
422
|
+
return new URL(server.resolvedUrls.local[0]).origin;
|
|
408
423
|
}
|
|
409
424
|
const protocol = server.config.server.https ? "https" : "http";
|
|
410
425
|
const port = server.config.server.port ?? 5173;
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts", "../src/frameworks/react.ts", "../src/frameworks/svelte.ts", "../src/frameworks/vue.ts", "../src/frameworks/index.ts", "../src/astUtils.ts", "../src/pagesTransform.ts", "../src/ssr.ts", "../src/css.ts", "../src/ssrTransform.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Inertia.js Vite Plugin\n *\n * This plugin provides two main features:\n *\n * 1. **Pages shorthand** - Transforms `pages: './Pages'` into a full `resolve` function\n * that uses `import.meta.glob` to load page components. This saves users from writing\n * boilerplate glob code in every project.\n *\n * 2. **SSR dev server** - During development, wraps the SSR entry file with server bootstrap\n * code and exposes an HTTP endpoint that Laravel can call to render pages server-side.\n * This eliminates the need to run a separate Node.js SSR server during development.\n *\n * The plugin is framework-agnostic - it detects which Inertia adapter (Vue, React, Svelte)\n * is being used by looking at import statements, then applies the appropriate transforms.\n * Custom frameworks can be added via the `frameworks` option.\n */\n\nimport { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport type { Plugin } from 'vite'\nimport { defaultFrameworks } from './frameworks/index'\nimport { transformPageResolution } from './pagesTransform'\nimport { handleSSRRequest, InertiaSSROptions, resolveSSREntry, SSR_ENDPOINT, SSR_ENTRY_CANDIDATES } from './ssr'\nimport { findInertiaAppExport, wrapWithServerBootstrap } from './ssrTransform'\nimport type { FrameworkConfig } from './types'\n\nexport type { FrameworkConfig, SSRTemplate } from './types'\nexport { InertiaSSROptions }\n\nexport interface InertiaPluginOptions {\n /**\n * SSR configuration. Pass a string for the entry path, an object for\n * additional options, or `false` to disable SSR entirely. Auto-detected\n * when not specified from:\n * - resources/js/ssr.{ts,tsx,js,jsx}\n * - src/ssr.{ts,tsx,js,jsx}\n * - resources/js/app.{ts,tsx,js,jsx}\n * - src/app.{ts,tsx,js,jsx}\n */\n ssr?: string | false | InertiaSSROptions\n\n /**\n * Custom framework configurations. Use this to add support for frameworks\n * beyond the built-in Vue, React, and Svelte adapters.\n *\n * @example\n * ```ts\n * inertia({\n * frameworks: {\n * package: '@inertiajs/solid',\n * extensions: ['.tsx', '.jsx'],\n * extractDefault: true,\n * ssr: (configureCall, options) => `\n * import createServer from '@inertiajs/solid/server'\n * const render = await ${configureCall}\n * createServer((page) => render(page)${options})\n * `,\n * }\n * })\n * ```\n */\n frameworks?: FrameworkConfig | FrameworkConfig[]\n}\n\n/**\n * Normalize the frameworks option into a record keyed by package name.\n */\nfunction toFrameworkRecord(input?: FrameworkConfig | FrameworkConfig[]): Record<string, FrameworkConfig> {\n if (!input) {\n return {}\n }\n\n const configs = Array.isArray(input) ? input : [input]\n\n return Object.fromEntries(configs.map((config) => [config.package, config]))\n}\n\nexport default function inertia(options: InertiaPluginOptions = {}): Plugin {\n const ssrDisabled = options.ssr === false\n const ssr = typeof options.ssr === 'string' ? { entry: options.ssr } : options.ssr || {}\n const frameworks = { ...defaultFrameworks, ...toFrameworkRecord(options.frameworks) }\n\n let entry: string | null = null\n\n return {\n name: '@inertiajs/vite',\n\n config(config, env) {\n if (ssrDisabled || !env.isSsrBuild) {\n return\n }\n\n const root = config.root ?? process.cwd()\n const ssrEntry = ssr.entry ?? SSR_ENTRY_CANDIDATES.find((candidate) => existsSync(resolve(root, candidate)))\n\n return {\n build: {\n sourcemap: ssr.sourcemap !== false ? (config.build?.sourcemap ?? true) : undefined,\n rollupOptions: ssrEntry\n ? {\n input: config.build?.rollupOptions?.input ?? ssrEntry,\n }\n : undefined,\n },\n }\n },\n\n configResolved(config) {\n if (ssrDisabled) {\n return\n }\n\n entry = resolveSSREntry(ssr, config)\n\n if (entry && config.build?.ssr) {\n config.logger.info(`Inertia SSR entry: ${entry}`)\n }\n },\n\n transform(code, id, options) {\n if (!/\\.[jt]sx?$/.test(id)) {\n return null\n }\n\n let result = code\n\n if (!ssrDisabled && options?.ssr && findInertiaAppExport(result)) {\n result =\n wrapWithServerBootstrap(\n result,\n { port: ssr.port, cluster: ssr.cluster, handleErrors: ssr.handleErrors },\n frameworks,\n ) ?? result\n }\n\n return transformPageResolution(result, frameworks) ?? (result !== code ? result : null)\n },\n\n configureServer(server) {\n if (!entry) {\n return\n }\n\n server.middlewares.use(SSR_ENDPOINT, async (req, res, next) => {\n if (req.method !== 'POST') {\n return next()\n }\n\n await handleSSRRequest(server, entry!, req, res, ssr.handleErrors ?? true)\n })\n\n server.config.logger.info(`Inertia SSR dev endpoint: ${SSR_ENDPOINT}`)\n },\n }\n}\n", "/**\n * React Framework Configuration\n *\n * This file defines how the Vite plugin handles React applications.\n * It serves as a reference for creating custom framework configurations.\n *\n * The SSR template shows what the plugin generates. For a user's SSR entry:\n *\n * ```js\n * import { createInertiaApp } from '@inertiajs/react'\n *\n * createInertiaApp({\n * resolve: (name) => resolvePageComponent(name),\n * })\n * ```\n *\n * In production, the plugin transforms it to:\n *\n * ```js\n * import { createInertiaApp } from '@inertiajs/react'\n * import createServer from '@inertiajs/react/server'\n * import { renderToString } from 'react-dom/server'\n *\n * const render = await createInertiaApp({\n * resolve: (name) => resolvePageComponent(name),\n * })\n *\n * createServer((page) => render(page, renderToString))\n * ```\n *\n * In development, it exports the render function directly for the Vite dev server.\n */\n\nimport type { FrameworkConfig } from '../types'\n\nexport const config: FrameworkConfig = {\n // Package name used to detect React usage via import statements\n package: '@inertiajs/react',\n\n // React components can use either .tsx (TypeScript) or .jsx\n // The plugin tries .tsx first, then falls back to .jsx\n extensions: ['.tsx', '.jsx'],\n\n // React components are exported as `export default`, so we need to extract .default\n extractDefault: true,\n\n // SSR template that wraps the createInertiaApp call with server bootstrap code\n // Uses import.meta.env.PROD to skip the standalone server in dev mode\n ssr: (configureCall, options) => `\nimport createServer from '@inertiajs/react/server'\nimport { renderToString } from 'react-dom/server'\n\nconst render = await ${configureCall}\n\nconst renderPage = (page) => render(page, renderToString)\n\nif (import.meta.env.PROD) {\n createServer(renderPage${options})\n}\n\nexport default renderPage\n`,\n}\n", "/**\n * Svelte Framework Configuration\n *\n * This file defines how the Vite plugin handles Svelte applications.\n * It serves as a reference for creating custom framework configurations.\n *\n * The SSR template shows what the plugin generates. For a user's SSR entry:\n *\n * ```js\n * import { createInertiaApp } from '@inertiajs/svelte'\n *\n * createInertiaApp({\n * resolve: (name) => resolvePageComponent(name),\n * })\n * ```\n *\n * The plugin transforms it to:\n *\n * ```js\n * import { createInertiaApp } from '@inertiajs/svelte'\n * import createServer from '@inertiajs/svelte/server'\n * import { render } from 'svelte/server'\n *\n * const ssr = await createInertiaApp({\n * resolve: (name) => resolvePageComponent(name),\n * })\n *\n * const renderPage = (page) => ssr(page, render)\n *\n * // Only start server in production\n * if (import.meta.env.PROD) {\n * createServer(renderPage)\n * }\n *\n * export default renderPage\n * ```\n */\n\nimport type { FrameworkConfig } from '../types'\n\nexport const config: FrameworkConfig = {\n // Package name used to detect Svelte usage via import statements\n package: '@inertiajs/svelte',\n\n // Svelte components use .svelte extension\n extensions: ['.svelte'],\n\n // Svelte components ARE the module - no .default extraction needed\n // This is different from Vue/React where components use `export default`\n extractDefault: false,\n\n // SSR template that wraps the createInertiaApp call with server bootstrap code\n // Uses import.meta.env.PROD to skip the standalone server in dev mode\n // Note: Svelte uses a different variable name (ssr) and render function import\n ssr: (configureCall, options) => `\nimport createServer from '@inertiajs/svelte/server'\nimport { render } from 'svelte/server'\n\nconst ssr = await ${configureCall}\n\nconst renderPage = (page) => ssr(page, render)\n\nif (import.meta.env.PROD) {\n createServer(renderPage${options})\n}\n\nexport default renderPage\n`,\n}\n", "/**\n * Vue Framework Configuration\n *\n * This file defines how the Vite plugin handles Vue applications.\n * It serves as a reference for creating custom framework configurations.\n *\n * The SSR template shows what the plugin generates. For a user's SSR entry:\n *\n * ```js\n * import { createInertiaApp } from '@inertiajs/vue3'\n *\n * createInertiaApp({\n * resolve: (name) => resolvePageComponent(name),\n * })\n * ```\n *\n * The plugin transforms it to:\n *\n * ```js\n * import { createInertiaApp } from '@inertiajs/vue3'\n * import createServer from '@inertiajs/vue3/server'\n * import { renderToString } from 'vue/server-renderer'\n *\n * const render = await createInertiaApp({\n * resolve: (name) => resolvePageComponent(name),\n * })\n *\n * const renderPage = (page) => render(page, renderToString)\n *\n * // Only start server in production\n * if (import.meta.env.PROD) {\n * createServer(renderPage)\n * }\n *\n * export default renderPage\n * ```\n */\n\nimport type { FrameworkConfig } from '../types'\n\nexport const config: FrameworkConfig = {\n // Package name used to detect Vue usage via import statements\n package: '@inertiajs/vue3',\n\n // Vue single-file components use .vue extension\n extensions: ['.vue'],\n\n // Vue components are exported as `export default`, so we need to extract .default\n extractDefault: true,\n\n // SSR template that wraps the createInertiaApp call with server bootstrap code\n // Uses import.meta.env.PROD to skip the standalone server in dev mode\n ssr: (configureCall, options) => `\nimport createServer from '@inertiajs/vue3/server'\nimport { renderToString } from 'vue/server-renderer'\n\nconst render = await ${configureCall}\n\nconst renderPage = (page) => render(page, renderToString)\n\nif (import.meta.env.PROD) {\n createServer(renderPage${options})\n}\n\nexport default renderPage\n`,\n}\n", "/**\n * Framework Registry\n *\n * This module exports the default framework configurations for Vue, React, and Svelte.\n * The plugin uses this registry to detect which framework is being used and apply\n * the appropriate transforms.\n *\n * Custom frameworks can be added via the `frameworks` plugin option, which will\n * be merged with these defaults (custom configs override defaults with the same package name).\n */\n\nimport type { FrameworkConfig } from '../types'\nimport { config as react } from './react'\nimport { config as svelte } from './svelte'\nimport { config as vue } from './vue'\n\n/**\n * Array of all built-in framework configurations.\n * Order doesn't matter - detection is based on import statements.\n */\nconst frameworks: FrameworkConfig[] = [vue, react, svelte]\n\n/**\n * Framework configs keyed by package name for efficient lookup.\n *\n * Example:\n * {\n * '@inertiajs/vue3': { package: '@inertiajs/vue3', extensions: ['.vue'], ... },\n * '@inertiajs/react': { package: '@inertiajs/react', extensions: ['.tsx', '.jsx'], ... },\n * '@inertiajs/svelte': { package: '@inertiajs/svelte', extensions: ['.svelte'], ... }\n * }\n */\nexport const defaultFrameworks: Record<string, FrameworkConfig> = Object.fromEntries(\n frameworks.map((config) => [config.package, config]),\n)\n", "/**\n * AST Utilities for Inertia Code Transforms\n *\n * Parses JavaScript/TypeScript code using Vite's built-in `parseAst` (Rollup's parser)\n * and provides methods to find Inertia-specific patterns like `createInertiaApp()` calls,\n * framework detection, and property extraction.\n */\n\nimport type {\n CallExpression,\n ExpressionStatement,\n Identifier,\n ObjectExpression,\n Program,\n Property,\n SimpleCallExpression,\n} from 'estree'\nimport { parseAst } from 'vite'\nimport type { FrameworkConfig } from './types'\n\n/**\n * ESTree nodes augmented with the `start`/`end` positions Rollup's parser adds.\n */\nexport type NodeWithPos<T> = T & { start: number; end: number }\n\nconst INERTIA_APP_FUNCTION = 'createInertiaApp'\nconst CREATE_SERVER_FUNCTION = 'createServer'\n\n/** A top-level `createInertiaApp()` expression statement with position info. */\nexport interface InertiaStatement {\n statement: NodeWithPos<ExpressionStatement>\n call: NodeWithPos<SimpleCallExpression>\n}\n\n/** Position info for the first argument of a `createInertiaApp()` call. */\nexport interface InertiaCallOptions {\n start: number\n end: number\n isEmpty: boolean\n}\n\n/** Wraps a parsed AST with methods to find Inertia-specific patterns. */\nexport class ParsedCode {\n private constructor(private ast: Program) {}\n\n /** Returns null if parsing fails (e.g. non-JS file content). */\n static from(code: string): ParsedCode | null {\n try {\n return new ParsedCode(parseAst(code))\n } catch {\n return null\n }\n }\n\n get importSources(): string[] {\n const sources: string[] = []\n\n for (const node of this.ast.body) {\n if (node.type === 'ImportDeclaration') {\n sources.push(node.source.value as string)\n }\n }\n\n return sources\n }\n\n detectFramework(frameworks: Record<string, FrameworkConfig>): { name: string; config: FrameworkConfig } | null {\n const name = this.importSources.find((source) => source in frameworks)\n\n return name ? { name, config: frameworks[name] } : null\n }\n\n /**\n * Find a top-level `createInertiaApp()` expression statement.\n * Only matches bare calls, not `export default createInertiaApp()`.\n */\n get inertiaStatement(): InertiaStatement | null {\n for (const node of this.ast.body) {\n if (node.type !== 'ExpressionStatement') {\n continue\n }\n\n const statement = node as NodeWithPos<ExpressionStatement>\n let expr = statement.expression as { type: string; argument?: unknown; start: number; end: number }\n\n // Handle `await createInertiaApp()` - unwrap the await to get the call\n if (expr.type === 'AwaitExpression') {\n expr = expr.argument as typeof expr\n }\n\n if (expr.type === 'CallExpression') {\n const call = expr as NodeWithPos<SimpleCallExpression>\n\n if (this.isInertiaCall(call)) {\n return { statement, call }\n }\n }\n }\n\n return null\n }\n\n /** Find a top-level `createServer()` call (not nested in exports). */\n get createServerStatement(): NodeWithPos<ExpressionStatement> | null {\n for (const node of this.ast.body) {\n if (node.type !== 'ExpressionStatement') {\n continue\n }\n\n const statement = node as NodeWithPos<ExpressionStatement>\n const expr = statement.expression\n\n if (expr.type === 'CallExpression') {\n const call = expr as SimpleCallExpression\n\n if (call.callee.type === 'Identifier' && (call.callee as Identifier).name === CREATE_SERVER_FUNCTION) {\n return statement\n }\n }\n }\n\n return null\n }\n\n /**\n * Find all `createInertiaApp()` calls, including those nested inside exports.\n */\n get inertiaCalls(): CallExpression[] {\n const calls: CallExpression[] = []\n\n this.walkAst(this.ast, (node) => {\n if (node.type === 'CallExpression' && this.isInertiaCall(node as CallExpression)) {\n calls.push(node as CallExpression)\n }\n })\n\n return calls\n }\n\n get pagesProperty(): NodeWithPos<Property> | null {\n for (const call of this.inertiaCalls) {\n if (call.arguments.length === 0 || call.arguments[0].type !== 'ObjectExpression') {\n continue\n }\n\n // Look for a `pages` property in the options object\n for (const prop of (call.arguments[0] as ObjectExpression).properties) {\n if (prop.type !== 'Property' || prop.key.type !== 'Identifier' || prop.key.name !== 'pages') {\n continue\n }\n\n return prop as NodeWithPos<Property>\n }\n }\n\n return null\n }\n\n /** Find a `createInertiaApp()` call that has no `pages` or `resolve` property yet. */\n get callWithoutResolver(): { callEnd: number; options?: InertiaCallOptions } | null {\n for (const call of this.inertiaCalls) {\n const callWithPos = call as NodeWithPos<CallExpression>\n\n // Empty call: createInertiaApp()\n if (call.arguments.length === 0) {\n return { callEnd: callWithPos.end }\n }\n\n // Non-object argument - can't inject resolver\n if (call.arguments[0].type !== 'ObjectExpression') {\n continue\n }\n\n const obj = call.arguments[0] as NodeWithPos<ObjectExpression>\n\n const hasResolver = obj.properties.some(\n (p) =>\n p.type === 'Property' && p.key.type === 'Identifier' && (p.key.name === 'pages' || p.key.name === 'resolve'),\n )\n\n if (hasResolver) {\n continue\n }\n\n return {\n callEnd: callWithPos.end,\n options: { start: obj.start, end: obj.end, isEmpty: obj.properties.length === 0 },\n }\n }\n\n return null\n }\n\n private isInertiaCall(node: CallExpression | SimpleCallExpression): boolean {\n return node.callee.type === 'Identifier' && (node.callee as Identifier).name === INERTIA_APP_FUNCTION\n }\n\n private walkAst(node: unknown, callback: (node: { type: string }) => void): void {\n if (!node || typeof node !== 'object') {\n return\n }\n\n if ('type' in node) {\n callback(node as { type: string })\n }\n\n for (const value of Object.values(node as Record<string, unknown>)) {\n if (Array.isArray(value)) {\n for (const item of value) {\n this.walkAst(item, callback)\n }\n } else {\n this.walkAst(value, callback)\n }\n }\n }\n}\n\n/**\n * Supports regular strings and simple template literals without expressions.\n */\nexport function extractString(node: Property['value']): string | undefined {\n if (node.type === 'Literal' && typeof node.value === 'string') {\n return node.value\n }\n\n // Template literal without expressions: `./Pages`\n if (node.type === 'TemplateLiteral' && node.expressions.length === 0) {\n return node.quasis[0].value.cooked ?? node.quasis[0].value.raw\n }\n\n return undefined\n}\n\n/** Each element is passed through `extractString`, non-strings are skipped. */\nexport function extractStringArray(node: Property['value']): string[] | undefined {\n if (node.type !== 'ArrayExpression') {\n return undefined\n }\n\n const strings = node.elements\n .map((el) => (el ? extractString(el as Property['value']) : undefined))\n .filter((s): s is string => s !== undefined)\n\n return strings.length > 0 ? strings : undefined\n}\n\nexport function extractBoolean(node: Property['value']): boolean | undefined {\n if (node.type === 'Literal' && typeof node.value === 'boolean') {\n return node.value\n }\n\n return undefined\n}\n", "/**\n * Pages Transform\n *\n * This module transforms the `pages` shorthand into a full `resolve` function.\n * Instead of writing verbose glob code in every project, users can simply write:\n *\n * ```js\n * createInertiaApp({ pages: './Pages' })\n * ```\n *\n * Which gets transformed into:\n *\n * ```js\n * createInertiaApp({\n * resolve: async (name, page) => {\n * const pages = import.meta.glob('./Pages/*.vue')\n * const module = await (pages[`./Pages/${name}.vue`])?.()\n * if (!module) throw new Error(`Page not found: ${name}`)\n * return module.default ?? module\n * }\n * })\n * ```\n *\n * The transform also supports advanced configuration:\n *\n * ```js\n * createInertiaApp({\n * pages: {\n * path: './Pages',\n * extension: '.tsx',\n * lazy: true,\n * transform: (name, page) => name.replace('/', '-')\n * }\n * })\n * ```\n */\n\nimport type { Property } from 'estree'\nimport { type NodeWithPos, ParsedCode, extractBoolean, extractString, extractStringArray } from './astUtils'\nimport type { FrameworkConfig } from './types'\n\n/** Returns the transformed code, or null if no transformation was needed. */\nexport function transformPageResolution(code: string, frameworks: Record<string, FrameworkConfig>): string | null {\n if (!code.includes('InertiaApp')) {\n return null\n }\n\n const parsed = ParsedCode.from(code)\n\n if (!parsed) {\n return null\n }\n\n const framework = parsed.detectFramework(frameworks)\n\n if (!framework) {\n return null\n }\n\n const extensions = framework.config.extensions\n const extractDefault = framework.config.extractDefault ?? true\n\n if (parsed.pagesProperty) {\n return replacePages(code, parsed.pagesProperty, extensions, extractDefault)\n }\n\n if (parsed.callWithoutResolver) {\n return injectResolver(code, parsed.callWithoutResolver, extensions, extractDefault)\n }\n\n return null\n}\n\n/**\n * Replace the `pages` property with a generated `resolve` function.\n *\n * Input: `{ pages: './Pages', title: t => t }`\n * Output: `{ resolve: async (name, page) => { ... }, title: t => t }`\n */\nfunction replacePages(\n code: string,\n property: NodeWithPos<Property>,\n defaultExtensions: string[],\n extractDefault: boolean,\n): string {\n const config = extractPagesConfig(property.value, code)\n\n if (!config) {\n return code\n }\n\n const extensions = config.extensions\n ? Array.isArray(config.extensions)\n ? config.extensions\n : [config.extensions]\n : defaultExtensions\n\n const eager = !(config.lazy ?? true)\n\n const resolver = config.directory\n ? buildResolver(config.directory.replace(/\\/$/, ''), extensions, extractDefault, eager, config.transform)\n : buildDefaultResolver(extensions, extractDefault, eager)\n\n return code.slice(0, property.start) + resolver + code.slice(property.end)\n}\n\n/**\n * Inject a default resolver into a call that doesn't have one.\n *\n * Handles three cases:\n * 1. Empty call: `createInertiaApp()` becomes `createInertiaApp({ resolve: ... })`\n * 2. Empty object: `createInertiaApp({})` becomes `createInertiaApp({ resolve: ... })`\n * 3. Other options: `createInertiaApp({a})` becomes `createInertiaApp({ resolve: ..., a})`\n */\nfunction injectResolver(\n code: string,\n call: { callEnd: number; options?: { start: number; end: number; isEmpty: boolean } },\n extensions: string[],\n extractDefault: boolean,\n): string {\n const resolver = buildDefaultResolver(extensions, extractDefault)\n\n if (!call.options) {\n return code.slice(0, call.callEnd - 1) + `{ ${resolver} })` + code.slice(call.callEnd)\n }\n\n if (call.options.isEmpty) {\n return code.slice(0, call.options.start) + `{ ${resolver} }` + code.slice(call.options.end)\n }\n\n return code.slice(0, call.options.start + 1) + ` ${resolver},` + code.slice(call.options.start + 1)\n}\n\n/** The parsed representation of a `pages` property value. */\ninterface PagesConfig {\n directory?: string\n extensions?: string | string[]\n transform?: string\n lazy?: boolean\n}\n\n/**\n * Extract configuration from the `pages` property value.\n *\n * Supports two formats:\n * 1. String: `pages: './Pages'`\n * 2. Object: `pages: { path: './Pages', extension: '.vue', lazy: true, transform: fn }`\n */\nfunction extractPagesConfig(node: Property['value'], code: string): PagesConfig | null {\n const str = extractString(node)\n\n if (str) {\n return { directory: str }\n }\n\n if (node.type !== 'ObjectExpression') {\n return null\n }\n\n let directory: string | undefined\n let extensions: string | string[] | undefined\n let transform: string | undefined\n let lazy: boolean | undefined\n\n for (const prop of node.properties) {\n if (prop.type !== 'Property' || prop.key.type !== 'Identifier') {\n continue\n }\n\n const key = prop.key.name\n const value = prop.value as NodeWithPos<Property['value']>\n\n if (key === 'path') {\n directory = extractString(value)\n } else if (key === 'extension') {\n extensions = extractString(value) ?? extractStringArray(value)\n } else if (key === 'transform') {\n transform = code.slice(value.start, value.end)\n } else if (key === 'lazy') {\n lazy = extractBoolean(value)\n }\n }\n\n return { directory, extensions, transform, lazy }\n}\n\nfunction buildResolver(\n directories: string | string[],\n extensions: string[],\n extractDefault: boolean,\n eager: boolean,\n transform?: string,\n): string {\n const dirs = Array.isArray(directories) ? directories : [directories]\n\n const globs = dirs.map((d) => buildGlob(d, extensions))\n const glob = globs.length === 1 ? `'${globs[0]}'` : `['${globs.join(\"', '\")}']`\n\n const nameVar = transform ? 'resolvedName' : 'name'\n const lookup = dirs.flatMap((d) => extensions.map((ext) => `pages[\\`${d}/\\${${nameVar}}${ext}\\`]`)).join(' || ')\n\n const transformLine = transform ? `const resolvedName = (${transform})(name, page)\\n ` : ''\n\n const returnValue = extractDefault ? 'module.default ?? module' : 'module'\n\n const globOptions = `, { eager: ${eager} }`\n const moduleLookup = eager ? lookup : `await (${lookup})?.()`\n\n return `resolve: async (name, page) => {\n ${transformLine}const pages = import.meta.glob(${glob}${globOptions})\n const module = ${moduleLookup}\n if (!module) throw new Error(\\`Page not found: \\${name}\\`)\n return ${returnValue}\n }`\n}\n\nfunction buildDefaultResolver(extensions: string[], extractDefault: boolean, eager: boolean = false): string {\n return buildResolver(['./pages', './Pages'], extensions, extractDefault, eager)\n}\n\nfunction buildGlob(directory: string, extensions: string[]): string {\n const ext = extensions.length === 1 ? extensions[0] : `{${extensions.join(',')}}`\n\n return `${directory}/**/*${ext}`\n}\n", "/**\n * SSR Dev Server\n *\n * This module handles SSR rendering during development. Instead of running\n * a separate Node.js SSR server, the Vite dev server exposes an HTTP endpoint\n * that Laravel can call to render pages server-side.\n *\n * How it works:\n * 1. Laravel detects that the Vite dev server is running\n * 2. Laravel POSTs the page data to `/__inertia_ssr`\n * 3. This module loads the SSR entry file via Vite's SSR module loader\n * 4. The entry file's default export is called with the page data\n * 5. The rendered HTML is returned to Laravel\n *\n * This approach provides:\n * - Hot Module Replacement (HMR) for SSR code during development\n * - No need to restart a separate SSR server when code changes\n * - Automatic TypeScript/JSX transformation via Vite\n */\n\nimport { classifySSRError, formatConsoleError } from '@inertiajs/core/ssrErrors'\nimport { existsSync } from 'node:fs'\nimport type { IncomingMessage, ServerResponse } from 'node:http'\nimport { resolve } from 'node:path'\nimport type { ResolvedConfig, ViteDevServer } from 'vite'\nimport { collectCSSFromModuleGraph } from './css'\n\n/** Options for the SSR dev server and production builds. */\nexport interface InertiaSSROptions {\n /**\n * Path to the SSR entry file. Auto-detected when not specified.\n */\n entry?: string\n\n /**\n * Port number for the SSR server (used in production builds).\n */\n port?: number\n\n /**\n * Enable cluster mode for the SSR server (used in production builds).\n */\n cluster?: boolean\n\n /**\n * When enabled, SSR errors are formatted with hints instead of thrown raw.\n * Defaults to true.\n */\n handleErrors?: boolean\n\n /**\n * Enable sourcemaps for SSR builds so error stacks map to original files.\n * Defaults to true.\n */\n sourcemap?: boolean\n}\n\nexport const SSR_ENDPOINT = '/__inertia_ssr'\n\nexport const SSR_ENTRY_CANDIDATES = [\n 'resources/js/ssr.ts',\n 'resources/js/ssr.tsx',\n 'resources/js/ssr.js',\n 'resources/js/ssr.jsx',\n 'src/ssr.ts',\n 'src/ssr.tsx',\n 'src/ssr.js',\n 'src/ssr.jsx',\n 'resources/js/app.ts',\n 'resources/js/app.tsx',\n 'resources/js/app.js',\n 'resources/js/app.jsx',\n 'src/app.ts',\n 'src/app.tsx',\n 'src/app.js',\n 'src/app.jsx',\n]\n\nexport function resolveSSREntry(options: InertiaSSROptions, config: ResolvedConfig): string | null {\n if (options.entry) {\n if (existsSync(resolve(config.root, options.entry))) {\n return options.entry\n }\n\n config.logger.warn(`Inertia SSR entry not found: ${options.entry}`)\n\n return null\n }\n\n return SSR_ENTRY_CANDIDATES.find((path) => existsSync(resolve(config.root, path))) ?? null\n}\n\nexport async function handleSSRRequest(\n server: ViteDevServer,\n entry: string,\n req: IncomingMessage,\n res: ServerResponse,\n handleErrors: boolean = true,\n): Promise<void> {\n let component: string | undefined\n let url: string | undefined\n\n // We temporarily override console.warn to suppress Vue's verbose component\n // trace warnings during SSR, and show our own cleaner error output instead.\n const originalWarn = console.warn\n const suppressedWarnings: string[] = []\n\n console.warn = (...args: unknown[]) => {\n const message = args[0]?.toString() ?? ''\n\n if (message.includes('[Vue warn]') || message.includes('at <')) {\n if (handleErrors) {\n suppressedWarnings.push(args.map(String).join(' '))\n }\n\n return\n }\n\n originalWarn.apply(console, args)\n }\n\n try {\n const page = await readRequestBody<{ component: string; url: string }>(req)\n component = page.component\n url = page.url\n const start = performance.now()\n\n const render = await loadRenderFunction(server, entry)\n const result = await render(page)\n\n if (!result || typeof result.body !== 'string') {\n throw new Error(`SSR render must return { head: string[], body: string }`)\n }\n\n const cssLinks = collectCSSFromModuleGraph(server, entry)\n result.head = [...cssLinks, ...result.head]\n\n logSSRRequest(server, page.component, start)\n\n res.setHeader('Content-Type', 'application/json')\n res.end(JSON.stringify(result))\n } catch (error) {\n handleSSRError(server, res, error as Error, component, url, handleErrors, suppressedWarnings)\n } finally {\n console.warn = originalWarn\n }\n}\n\nasync function loadRenderFunction(\n server: ViteDevServer,\n entry: string,\n): Promise<(page: unknown) => Promise<{ head: string[]; body: string }>> {\n const module = await server.ssrLoadModule(entry)\n const render = await Promise.resolve(module.default)\n\n if (typeof render !== 'function') {\n throw new Error(`SSR entry \"${entry}\" must export a render function`)\n }\n\n return render\n}\n\nfunction readRequestBody<T>(req: IncomingMessage): Promise<T> {\n return new Promise((resolve, reject) => {\n let data = ''\n\n req.on('data', (chunk) => (data += chunk))\n\n req.on('end', () => {\n if (!data.trim()) {\n reject(new Error('Request body is empty'))\n return\n }\n\n try {\n resolve(JSON.parse(data))\n } catch (error) {\n reject(new Error(`Invalid JSON in request body: ${error instanceof Error ? error.message : 'Unknown error'}`))\n }\n })\n\n req.on('error', reject)\n })\n}\n\n/**\n * Log an SSR request to the Vite dev server console.\n *\n * Output format: `2024-01-15 10:30:45 SSR Users/Index 12.34ms`\n */\nfunction logSSRRequest(server: ViteDevServer, component: string, start: number): void {\n const duration = (performance.now() - start).toFixed(2)\n const timestamp = new Date().toISOString().replace('T', ' ').slice(0, 19)\n\n server.config.logger.info(`\\x1b[32m${timestamp}\\x1b[0m SSR ${component} \\x1b[90m${duration}ms\\x1b[0m`)\n}\n\nfunction handleSSRError(\n server: ViteDevServer,\n res: ServerResponse,\n error: Error,\n component?: string,\n url?: string,\n handleErrors: boolean = true,\n suppressedWarnings: string[] = [],\n): void {\n server.ssrFixStacktrace(error)\n\n if (!handleErrors) {\n throw error\n }\n\n const classified = classifySSRError(error, component, url)\n\n server.config.logger.error(formatConsoleError(classified, server.config.root, handleErrors, suppressedWarnings))\n\n res.setHeader('Content-Type', 'application/json')\n res.statusCode = 500\n res.end(JSON.stringify(classified))\n}\n", "/**\n * SSR CSS Collection\n *\n * Collects CSS dependencies from Vite's module graph to prevent FOUC\n * (Flash of Unstyled Content) during SSR development.\n *\n * In dev mode, Vite normally injects CSS via JavaScript on the client side.\n * When SSR is enabled, the server-rendered HTML arrives before any JS executes,\n * causing unstyled content to flash briefly. This module traverses the SSR\n * environment's module graph starting from the entry to find all CSS\n * dependencies, then generates <link> tags so the browser fetches styles\n * immediately with the initial HTML.\n *\n * The generated <link> tags include `data-vite-dev-id` attributes so Vite's\n * client JS can deduplicate them and avoid injecting duplicate <style> tags.\n */\n\nimport { resolve } from 'node:path'\nimport type { EnvironmentModuleNode, ViteDevServer } from 'vite'\n\nexport function collectCSSFromModuleGraph(server: ViteDevServer, entry: string): string[] {\n const entryModule = resolveEntryModule(server, entry)\n\n if (!entryModule) {\n return []\n }\n\n const cssModules = collectCSSModules(entryModule)\n\n if (cssModules.length === 0) {\n return []\n }\n\n const origin = resolveDevServerOrigin(server)\n const base = server.config.base || '/'\n const basePrefix = base === '/' ? '' : base\n\n return cssModules.map(({ url, id }) => {\n const href = `${origin}${basePrefix}${url}`\n const devId = id ? ` data-vite-dev-id=\"${id}\"` : ''\n\n return `<link rel=\"stylesheet\" href=\"${href}\"${devId}>`\n })\n}\n\nfunction resolveEntryModule(server: ViteDevServer, entry: string): EnvironmentModuleNode | undefined {\n const resolvedEntry = resolve(server.config.root, entry)\n\n return server.environments.ssr.moduleGraph.getModuleById(resolvedEntry)\n}\n\nfunction collectCSSModules(entryModule: EnvironmentModuleNode): { url: string; id: string | null }[] {\n const cssModules: { url: string; id: string | null }[] = []\n const visited = new Set<EnvironmentModuleNode>()\n\n function traverse(mod: EnvironmentModuleNode): void {\n if (visited.has(mod)) {\n return\n }\n\n visited.add(mod)\n\n if (isCSSRequest(mod.url)) {\n cssModules.push({ url: mod.url, id: mod.id })\n }\n\n for (const imported of mod.importedModules) {\n traverse(imported)\n }\n }\n\n traverse(entryModule)\n\n return cssModules\n}\n\nconst CSS_EXTENSIONS = /\\.(css|less|sass|scss|styl|stylus|pcss|postcss|sss)(?:$|\\?)/\n\nfunction isCSSRequest(url: string): boolean {\n return CSS_EXTENSIONS.test(url)\n}\n\nfunction resolveDevServerOrigin(server: ViteDevServer): string {\n if (server.resolvedUrls?.local[0]) {\n return server.resolvedUrls.local[0].replace(/\\/$/, '')\n }\n\n const protocol = server.config.server.https ? 'https' : 'http'\n const port = server.config.server.port ?? 5173\n\n return `${protocol}://localhost:${port}`\n}\n", "/**\n * SSR Transform\n *\n * Transforms the SSR entry file by wrapping `createInertiaApp()` with\n * framework-specific server bootstrap code, so users don't need to\n * write the boilerplate manually.\n */\n\nimport { ParsedCode } from './astUtils'\nimport type { FrameworkConfig, SSROptions } from './types'\n\n/**\n * Returns empty string if no options, otherwise `, {\"port\":13715}`.\n */\nfunction formatSSROptions(options: SSROptions): string {\n const entries = Object.entries(options).filter(([, v]) => v !== undefined)\n\n return entries.length > 0 ? `, ${JSON.stringify(Object.fromEntries(entries))}` : ''\n}\n\n/**\n * Quick check for a top-level call that needs SSR wrapping.\n */\nexport function findInertiaAppExport(code: string): boolean {\n const parsed = ParsedCode.from(code)\n return !!(parsed?.inertiaStatement || parsed?.createServerStatement)\n}\n\n/**\n * Wrap `createInertiaApp()` or `createServer()` with the framework's SSR bootstrap.\n */\nexport function wrapWithServerBootstrap(\n code: string,\n options: SSROptions,\n frameworks: Record<string, FrameworkConfig>,\n): string | null {\n const parsed = ParsedCode.from(code)\n\n if (!parsed) {\n return null\n }\n\n if (parsed.inertiaStatement) {\n const framework = parsed.detectFramework(frameworks)\n\n if (!framework?.config.ssr) {\n return null\n }\n\n const { statement, call } = parsed.inertiaStatement\n const configureCall = code.slice(call.start, call.end)\n const ssrCode = framework.config.ssr(configureCall, formatSSROptions(options)).trim()\n\n return code.slice(0, statement.start) + ssrCode + code.slice(statement.end)\n }\n\n if (parsed.createServerStatement) {\n const statement = parsed.createServerStatement\n const args = (statement.expression as unknown as { arguments: Array<{ start: number; end: number }> }).arguments\n const callback = code.slice(args[0].start, args[0].end)\n const trailingArgs = code.slice(args[0].end, args[args.length - 1].end)\n\n const replacement = `const renderPage = ${callback}\n\nif (import.meta.env.PROD) {\n createServer(renderPage${trailingArgs})\n}\n\nexport default renderPage`\n\n return code.slice(0, statement.start) + replacement + code.slice(statement.end)\n }\n\n return null\n}\n"],
|
|
5
|
-
"mappings": ";AAkBA,SAAS,cAAAA,mBAAkB;AAC3B,SAAS,WAAAC,gBAAe;;;ACgBjB,IAAM,SAA0B;AAAA;AAAA,EAErC,SAAS;AAAA;AAAA;AAAA,EAIT,YAAY,CAAC,QAAQ,MAAM;AAAA;AAAA,EAG3B,gBAAgB;AAAA;AAAA;AAAA,EAIhB,KAAK,CAAC,eAAe,YAAY;AAAA;AAAA;AAAA;AAAA,uBAIZ,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,2BAKT,OAAO;AAAA;AAAA;AAAA;AAAA;AAKlC;;;ACtBO,IAAMC,UAA0B;AAAA;AAAA,EAErC,SAAS;AAAA;AAAA,EAGT,YAAY,CAAC,SAAS;AAAA;AAAA;AAAA,EAItB,gBAAgB;AAAA;AAAA;AAAA;AAAA,EAKhB,KAAK,CAAC,eAAe,YAAY;AAAA;AAAA;AAAA;AAAA,oBAIf,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,2BAKN,OAAO;AAAA;AAAA;AAAA;AAAA;AAKlC;;;AC5BO,IAAMC,UAA0B;AAAA;AAAA,EAErC,SAAS;AAAA;AAAA,EAGT,YAAY,CAAC,MAAM;AAAA;AAAA,EAGnB,gBAAgB;AAAA;AAAA;AAAA,EAIhB,KAAK,CAAC,eAAe,YAAY;AAAA;AAAA;AAAA;AAAA,uBAIZ,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,2BAKT,OAAO;AAAA;AAAA;AAAA;AAAA;AAKlC;;;AC9CA,IAAM,aAAgC,CAACC,SAAK,QAAOA,OAAM;AAYlD,IAAM,oBAAqD,OAAO;AAAA,EACvE,WAAW,IAAI,CAACA,YAAW,CAACA,QAAO,SAASA,OAAM,CAAC;AACrD;;;ACjBA,SAAS,gBAAgB;AAQzB,IAAM,uBAAuB;AAC7B,IAAM,yBAAyB;AAgBxB,IAAM,aAAN,MAAM,YAAW;AAAA,EACd,YAAoB,KAAc;AAAd;AAAA,EAAe;AAAA;AAAA,EAG3C,OAAO,KAAK,MAAiC;AAC3C,QAAI;AACF,aAAO,IAAI,YAAW,SAAS,IAAI,CAAC;AAAA,IACtC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,IAAI,gBAA0B;AAC5B,UAAM,UAAoB,CAAC;AAE3B,eAAW,QAAQ,KAAK,IAAI,MAAM;AAChC,UAAI,KAAK,SAAS,qBAAqB;AACrC,gBAAQ,KAAK,KAAK,OAAO,KAAe;AAAA,MAC1C;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgBC,aAA+F;AAC7G,UAAM,OAAO,KAAK,cAAc,KAAK,CAAC,WAAW,UAAUA,WAAU;AAErE,WAAO,OAAO,EAAE,MAAM,QAAQA,YAAW,IAAI,EAAE,IAAI;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,mBAA4C;AAC9C,eAAW,QAAQ,KAAK,IAAI,MAAM;AAChC,UAAI,KAAK,SAAS,uBAAuB;AACvC;AAAA,MACF;AAEA,YAAM,YAAY;AAClB,UAAI,OAAO,UAAU;AAGrB,UAAI,KAAK,SAAS,mBAAmB;AACnC,eAAO,KAAK;AAAA,MACd;AAEA,UAAI,KAAK,SAAS,kBAAkB;AAClC,cAAM,OAAO;AAEb,YAAI,KAAK,cAAc,IAAI,GAAG;AAC5B,iBAAO,EAAE,WAAW,KAAK;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,IAAI,wBAAiE;AACnE,eAAW,QAAQ,KAAK,IAAI,MAAM;AAChC,UAAI,KAAK,SAAS,uBAAuB;AACvC;AAAA,MACF;AAEA,YAAM,YAAY;AAClB,YAAM,OAAO,UAAU;AAEvB,UAAI,KAAK,SAAS,kBAAkB;AAClC,cAAM,OAAO;AAEb,YAAI,KAAK,OAAO,SAAS,gBAAiB,KAAK,OAAsB,SAAS,wBAAwB;AACpG,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,eAAiC;AACnC,UAAM,QAA0B,CAAC;AAEjC,SAAK,QAAQ,KAAK,KAAK,CAAC,SAAS;AAC/B,UAAI,KAAK,SAAS,oBAAoB,KAAK,cAAc,IAAsB,GAAG;AAChF,cAAM,KAAK,IAAsB;AAAA,MACnC;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,gBAA8C;AAChD,eAAW,QAAQ,KAAK,cAAc;AACpC,UAAI,KAAK,UAAU,WAAW,KAAK,KAAK,UAAU,CAAC,EAAE,SAAS,oBAAoB;AAChF;AAAA,MACF;AAGA,iBAAW,QAAS,KAAK,UAAU,CAAC,EAAuB,YAAY;AACrE,YAAI,KAAK,SAAS,cAAc,KAAK,IAAI,SAAS,gBAAgB,KAAK,IAAI,SAAS,SAAS;AAC3F;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,IAAI,sBAAgF;AAClF,eAAW,QAAQ,KAAK,cAAc;AACpC,YAAM,cAAc;AAGpB,UAAI,KAAK,UAAU,WAAW,GAAG;AAC/B,eAAO,EAAE,SAAS,YAAY,IAAI;AAAA,MACpC;AAGA,UAAI,KAAK,UAAU,CAAC,EAAE,SAAS,oBAAoB;AACjD;AAAA,MACF;AAEA,YAAM,MAAM,KAAK,UAAU,CAAC;AAE5B,YAAM,cAAc,IAAI,WAAW;AAAA,QACjC,CAAC,MACC,EAAE,SAAS,cAAc,EAAE,IAAI,SAAS,iBAAiB,EAAE,IAAI,SAAS,WAAW,EAAE,IAAI,SAAS;AAAA,MACtG;AAEA,UAAI,aAAa;AACf;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS,YAAY;AAAA,QACrB,SAAS,EAAE,OAAO,IAAI,OAAO,KAAK,IAAI,KAAK,SAAS,IAAI,WAAW,WAAW,EAAE;AAAA,MAClF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,cAAc,MAAsD;AAC1E,WAAO,KAAK,OAAO,SAAS,gBAAiB,KAAK,OAAsB,SAAS;AAAA,EACnF;AAAA,EAEQ,QAAQ,MAAe,UAAkD;AAC/E,QAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC;AAAA,IACF;AAEA,QAAI,UAAU,MAAM;AAClB,eAAS,IAAwB;AAAA,IACnC;AAEA,eAAW,SAAS,OAAO,OAAO,IAA+B,GAAG;AAClE,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,mBAAW,QAAQ,OAAO;AACxB,eAAK,QAAQ,MAAM,QAAQ;AAAA,QAC7B;AAAA,MACF,OAAO;AACL,aAAK,QAAQ,OAAO,QAAQ;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,cAAc,MAA6C;AACzE,MAAI,KAAK,SAAS,aAAa,OAAO,KAAK,UAAU,UAAU;AAC7D,WAAO,KAAK;AAAA,EACd;AAGA,MAAI,KAAK,SAAS,qBAAqB,KAAK,YAAY,WAAW,GAAG;AACpE,WAAO,KAAK,OAAO,CAAC,EAAE,MAAM,UAAU,KAAK,OAAO,CAAC,EAAE,MAAM;AAAA,EAC7D;AAEA,SAAO;AACT;AAGO,SAAS,mBAAmB,MAA+C;AAChF,MAAI,KAAK,SAAS,mBAAmB;AACnC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,KAAK,SAClB,IAAI,CAAC,OAAQ,KAAK,cAAc,EAAuB,IAAI,MAAU,EACrE,OAAO,CAAC,MAAmB,MAAM,MAAS;AAE7C,SAAO,QAAQ,SAAS,IAAI,UAAU;AACxC;AAEO,SAAS,eAAe,MAA8C;AAC3E,MAAI,KAAK,SAAS,aAAa,OAAO,KAAK,UAAU,WAAW;AAC9D,WAAO,KAAK;AAAA,EACd;AAEA,SAAO;AACT;;;ACnNO,SAAS,wBAAwB,MAAcC,aAA4D;AAChH,MAAI,CAAC,KAAK,SAAS,YAAY,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,WAAW,KAAK,IAAI;AAEnC,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,OAAO,gBAAgBA,WAAU;AAEnD,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,UAAU,OAAO;AACpC,QAAM,iBAAiB,UAAU,OAAO,kBAAkB;AAE1D,MAAI,OAAO,eAAe;AACxB,WAAO,aAAa,MAAM,OAAO,eAAe,YAAY,cAAc;AAAA,EAC5E;AAEA,MAAI,OAAO,qBAAqB;AAC9B,WAAO,eAAe,MAAM,OAAO,qBAAqB,YAAY,cAAc;AAAA,EACpF;AAEA,SAAO;AACT;AAQA,SAAS,aACP,MACA,UACA,mBACA,gBACQ;AACR,QAAMC,UAAS,mBAAmB,SAAS,OAAO,IAAI;AAEtD,MAAI,CAACA,SAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,aAAaA,QAAO,aACtB,MAAM,QAAQA,QAAO,UAAU,IAC7BA,QAAO,aACP,CAACA,QAAO,UAAU,IACpB;AAEJ,QAAM,QAAQ,EAAEA,QAAO,QAAQ;AAE/B,QAAM,WAAWA,QAAO,YACpB,cAAcA,QAAO,UAAU,QAAQ,OAAO,EAAE,GAAG,YAAY,gBAAgB,OAAOA,QAAO,SAAS,IACtG,qBAAqB,YAAY,gBAAgB,KAAK;AAE1D,SAAO,KAAK,MAAM,GAAG,SAAS,KAAK,IAAI,WAAW,KAAK,MAAM,SAAS,GAAG;AAC3E;AAUA,SAAS,eACP,MACA,MACA,YACA,gBACQ;AACR,QAAM,WAAW,qBAAqB,YAAY,cAAc;AAEhE,MAAI,CAAC,KAAK,SAAS;AACjB,WAAO,KAAK,MAAM,GAAG,KAAK,UAAU,CAAC,IAAI,KAAK,QAAQ,QAAQ,KAAK,MAAM,KAAK,OAAO;AAAA,EACvF;AAEA,MAAI,KAAK,QAAQ,SAAS;AACxB,WAAO,KAAK,MAAM,GAAG,KAAK,QAAQ,KAAK,IAAI,KAAK,QAAQ,OAAO,KAAK,MAAM,KAAK,QAAQ,GAAG;AAAA,EAC5F;AAEA,SAAO,KAAK,MAAM,GAAG,KAAK,QAAQ,QAAQ,CAAC,IAAI,IAAI,QAAQ,MAAM,KAAK,MAAM,KAAK,QAAQ,QAAQ,CAAC;AACpG;AAiBA,SAAS,mBAAmB,MAAyB,MAAkC;AACrF,QAAM,MAAM,cAAc,IAAI;AAE9B,MAAI,KAAK;AACP,WAAO,EAAE,WAAW,IAAI;AAAA,EAC1B;AAEA,MAAI,KAAK,SAAS,oBAAoB;AACpC,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,aAAW,QAAQ,KAAK,YAAY;AAClC,QAAI,KAAK,SAAS,cAAc,KAAK,IAAI,SAAS,cAAc;AAC9D;AAAA,IACF;AAEA,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,QAAQ,KAAK;AAEnB,QAAI,QAAQ,QAAQ;AAClB,kBAAY,cAAc,KAAK;AAAA,IACjC,WAAW,QAAQ,aAAa;AAC9B,mBAAa,cAAc,KAAK,KAAK,mBAAmB,KAAK;AAAA,IAC/D,WAAW,QAAQ,aAAa;AAC9B,kBAAY,KAAK,MAAM,MAAM,OAAO,MAAM,GAAG;AAAA,IAC/C,WAAW,QAAQ,QAAQ;AACzB,aAAO,eAAe,KAAK;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO,EAAE,WAAW,YAAY,WAAW,KAAK;AAClD;AAEA,SAAS,cACP,aACA,YACA,gBACA,OACA,WACQ;AACR,QAAM,OAAO,MAAM,QAAQ,WAAW,IAAI,cAAc,CAAC,WAAW;AAEpE,QAAM,QAAQ,KAAK,IAAI,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC;AACtD,QAAM,OAAO,MAAM,WAAW,IAAI,IAAI,MAAM,CAAC,CAAC,MAAM,KAAK,MAAM,KAAK,MAAM,CAAC;AAE3E,QAAM,UAAU,YAAY,iBAAiB;AAC7C,QAAM,SAAS,KAAK,QAAQ,CAAC,MAAM,WAAW,IAAI,CAAC,QAAQ,WAAW,CAAC,OAAO,OAAO,IAAI,GAAG,KAAK,CAAC,EAAE,KAAK,MAAM;AAE/G,QAAM,gBAAgB,YAAY,yBAAyB,SAAS;AAAA,QAAwB;AAE5F,QAAM,cAAc,iBAAiB,6BAA6B;AAElE,QAAM,cAAc,cAAc,KAAK;AACvC,QAAM,eAAe,QAAQ,SAAS,UAAU,MAAM;AAEtD,SAAO;AAAA,MACH,aAAa,kCAAkC,IAAI,GAAG,WAAW;AAAA,qBAClD,YAAY;AAAA;AAAA,aAEpB,WAAW;AAAA;AAExB;AAEA,SAAS,qBAAqB,YAAsB,gBAAyB,QAAiB,OAAe;AAC3G,SAAO,cAAc,CAAC,WAAW,SAAS,GAAG,YAAY,gBAAgB,KAAK;AAChF;AAEA,SAAS,UAAU,WAAmB,YAA8B;AAClE,QAAM,MAAM,WAAW,WAAW,IAAI,WAAW,CAAC,IAAI,IAAI,WAAW,KAAK,GAAG,CAAC;AAE9E,SAAO,GAAG,SAAS,QAAQ,GAAG;AAChC;;;AC5MA,SAAS,kBAAkB,0BAA0B;AACrD,SAAS,kBAAkB;AAE3B,SAAS,WAAAC,gBAAe;;;ACNxB,SAAS,eAAe;AAGjB,SAAS,0BAA0B,QAAuB,OAAyB;AACxF,QAAM,cAAc,mBAAmB,QAAQ,KAAK;AAEpD,MAAI,CAAC,aAAa;AAChB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,aAAa,kBAAkB,WAAW;AAEhD,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,SAAS,uBAAuB,MAAM;AAC5C,QAAM,OAAO,OAAO,OAAO,QAAQ;AACnC,QAAM,aAAa,SAAS,MAAM,KAAK;AAEvC,SAAO,WAAW,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM;AACrC,UAAM,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,GAAG;AACzC,UAAM,QAAQ,KAAK,sBAAsB,EAAE,MAAM;AAEjD,WAAO,gCAAgC,IAAI,IAAI,KAAK;AAAA,EACtD,CAAC;AACH;AAEA,SAAS,mBAAmB,QAAuB,OAAkD;AACnG,QAAM,gBAAgB,QAAQ,OAAO,OAAO,MAAM,KAAK;AAEvD,SAAO,OAAO,aAAa,IAAI,YAAY,cAAc,aAAa;AACxE;AAEA,SAAS,kBAAkB,aAA0E;AACnG,QAAM,aAAmD,CAAC;AAC1D,QAAM,UAAU,oBAAI,IAA2B;AAE/C,WAAS,SAAS,KAAkC;AAClD,QAAI,QAAQ,IAAI,GAAG,GAAG;AACpB;AAAA,IACF;AAEA,YAAQ,IAAI,GAAG;AAEf,QAAI,aAAa,IAAI,GAAG,GAAG;AACzB,iBAAW,KAAK,EAAE,KAAK,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC;AAAA,IAC9C;AAEA,eAAW,YAAY,IAAI,iBAAiB;AAC1C,eAAS,QAAQ;AAAA,IACnB;AAAA,EACF;AAEA,WAAS,WAAW;AAEpB,SAAO;AACT;AAEA,IAAM,iBAAiB;AAEvB,SAAS,aAAa,KAAsB;AAC1C,SAAO,eAAe,KAAK,GAAG;AAChC;AAEA,SAAS,uBAAuB,QAA+B;AAC7D,MAAI,OAAO,cAAc,MAAM,CAAC,GAAG;AACjC,WAAO,OAAO,aAAa,MAAM,CAAC,EAAE,QAAQ,OAAO,EAAE;AAAA,EACvD;AAEA,QAAM,WAAW,OAAO,OAAO,OAAO,QAAQ,UAAU;AACxD,QAAM,OAAO,OAAO,OAAO,OAAO,QAAQ;AAE1C,SAAO,GAAG,QAAQ,gBAAgB,IAAI;AACxC;;;ADlCO,IAAM,eAAe;AAErB,IAAM,uBAAuB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,gBAAgB,SAA4BC,SAAuC;AACjG,MAAI,QAAQ,OAAO;AACjB,QAAI,WAAWC,SAAQD,QAAO,MAAM,QAAQ,KAAK,CAAC,GAAG;AACnD,aAAO,QAAQ;AAAA,IACjB;AAEA,IAAAA,QAAO,OAAO,KAAK,gCAAgC,QAAQ,KAAK,EAAE;AAElE,WAAO;AAAA,EACT;AAEA,SAAO,qBAAqB,KAAK,CAAC,SAAS,WAAWC,SAAQD,QAAO,MAAM,IAAI,CAAC,CAAC,KAAK;AACxF;AAEA,eAAsB,iBACpB,QACA,OACA,KACA,KACA,eAAwB,MACT;AACf,MAAI;AACJ,MAAI;AAIJ,QAAM,eAAe,QAAQ;AAC7B,QAAM,qBAA+B,CAAC;AAEtC,UAAQ,OAAO,IAAI,SAAoB;AACrC,UAAM,UAAU,KAAK,CAAC,GAAG,SAAS,KAAK;AAEvC,QAAI,QAAQ,SAAS,YAAY,KAAK,QAAQ,SAAS,MAAM,GAAG;AAC9D,UAAI,cAAc;AAChB,2BAAmB,KAAK,KAAK,IAAI,MAAM,EAAE,KAAK,GAAG,CAAC;AAAA,MACpD;AAEA;AAAA,IACF;AAEA,iBAAa,MAAM,SAAS,IAAI;AAAA,EAClC;AAEA,MAAI;AACF,UAAM,OAAO,MAAM,gBAAoD,GAAG;AAC1E,gBAAY,KAAK;AACjB,UAAM,KAAK;AACX,UAAM,QAAQ,YAAY,IAAI;AAE9B,UAAM,SAAS,MAAM,mBAAmB,QAAQ,KAAK;AACrD,UAAM,SAAS,MAAM,OAAO,IAAI;AAEhC,QAAI,CAAC,UAAU,OAAO,OAAO,SAAS,UAAU;AAC9C,YAAM,IAAI,MAAM,yDAAyD;AAAA,IAC3E;AAEA,UAAM,WAAW,0BAA0B,QAAQ,KAAK;AACxD,WAAO,OAAO,CAAC,GAAG,UAAU,GAAG,OAAO,IAAI;AAE1C,kBAAc,QAAQ,KAAK,WAAW,KAAK;AAE3C,QAAI,UAAU,gBAAgB,kBAAkB;AAChD,QAAI,IAAI,KAAK,UAAU,MAAM,CAAC;AAAA,EAChC,SAAS,OAAO;AACd,mBAAe,QAAQ,KAAK,OAAgB,WAAW,KAAK,cAAc,kBAAkB;AAAA,EAC9F,UAAE;AACA,YAAQ,OAAO;AAAA,EACjB;AACF;AAEA,eAAe,mBACb,QACA,OACuE;AACvE,QAAM,SAAS,MAAM,OAAO,cAAc,KAAK;AAC/C,QAAM,SAAS,MAAM,QAAQ,QAAQ,OAAO,OAAO;AAEnD,MAAI,OAAO,WAAW,YAAY;AAChC,UAAM,IAAI,MAAM,cAAc,KAAK,iCAAiC;AAAA,EACtE;AAEA,SAAO;AACT;AAEA,SAAS,gBAAmB,KAAkC;AAC5D,SAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,QAAI,OAAO;AAEX,QAAI,GAAG,QAAQ,CAAC,UAAW,QAAQ,KAAM;AAEzC,QAAI,GAAG,OAAO,MAAM;AAClB,UAAI,CAAC,KAAK,KAAK,GAAG;AAChB,eAAO,IAAI,MAAM,uBAAuB,CAAC;AACzC;AAAA,MACF;AAEA,UAAI;AACF,QAAAA,SAAQ,KAAK,MAAM,IAAI,CAAC;AAAA,MAC1B,SAAS,OAAO;AACd,eAAO,IAAI,MAAM,iCAAiC,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE,CAAC;AAAA,MAC/G;AAAA,IACF,CAAC;AAED,QAAI,GAAG,SAAS,MAAM;AAAA,EACxB,CAAC;AACH;AAOA,SAAS,cAAc,QAAuB,WAAmB,OAAqB;AACpF,QAAM,YAAY,YAAY,IAAI,IAAI,OAAO,QAAQ,CAAC;AACtD,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,KAAK,GAAG,EAAE,MAAM,GAAG,EAAE;AAExE,SAAO,OAAO,OAAO,KAAK,WAAW,SAAS,eAAe,SAAS,YAAY,QAAQ,WAAW;AACvG;AAEA,SAAS,eACP,QACA,KACA,OACA,WACA,KACA,eAAwB,MACxB,qBAA+B,CAAC,GAC1B;AACN,SAAO,iBAAiB,KAAK;AAE7B,MAAI,CAAC,cAAc;AACjB,UAAM;AAAA,EACR;AAEA,QAAM,aAAa,iBAAiB,OAAO,WAAW,GAAG;AAEzD,SAAO,OAAO,OAAO,MAAM,mBAAmB,YAAY,OAAO,OAAO,MAAM,cAAc,kBAAkB,CAAC;AAE/G,MAAI,UAAU,gBAAgB,kBAAkB;AAChD,MAAI,aAAa;AACjB,MAAI,IAAI,KAAK,UAAU,UAAU,CAAC;AACpC;;;AE7MA,SAAS,iBAAiB,SAA6B;AACrD,QAAM,UAAU,OAAO,QAAQ,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,MAAM,MAAS;AAEzE,SAAO,QAAQ,SAAS,IAAI,KAAK,KAAK,UAAU,OAAO,YAAY,OAAO,CAAC,CAAC,KAAK;AACnF;AAKO,SAAS,qBAAqB,MAAuB;AAC1D,QAAM,SAAS,WAAW,KAAK,IAAI;AACnC,SAAO,CAAC,EAAE,QAAQ,oBAAoB,QAAQ;AAChD;AAKO,SAAS,wBACd,MACA,SACAC,aACe;AACf,QAAM,SAAS,WAAW,KAAK,IAAI;AAEnC,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,kBAAkB;AAC3B,UAAM,YAAY,OAAO,gBAAgBA,WAAU;AAEnD,QAAI,CAAC,WAAW,OAAO,KAAK;AAC1B,aAAO;AAAA,IACT;AAEA,UAAM,EAAE,WAAW,KAAK,IAAI,OAAO;AACnC,UAAM,gBAAgB,KAAK,MAAM,KAAK,OAAO,KAAK,GAAG;AACrD,UAAM,UAAU,UAAU,OAAO,IAAI,eAAe,iBAAiB,OAAO,CAAC,EAAE,KAAK;AAEpF,WAAO,KAAK,MAAM,GAAG,UAAU,KAAK,IAAI,UAAU,KAAK,MAAM,UAAU,GAAG;AAAA,EAC5E;AAEA,MAAI,OAAO,uBAAuB;AAChC,UAAM,YAAY,OAAO;AACzB,UAAM,OAAQ,UAAU,WAA+E;AACvG,UAAM,WAAW,KAAK,MAAM,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC,EAAE,GAAG;AACtD,UAAM,eAAe,KAAK,MAAM,KAAK,CAAC,EAAE,KAAK,KAAK,KAAK,SAAS,CAAC,EAAE,GAAG;AAEtE,UAAM,cAAc,sBAAsB,QAAQ;AAAA;AAAA;AAAA,2BAG3B,YAAY;AAAA;AAAA;AAAA;AAKnC,WAAO,KAAK,MAAM,GAAG,UAAU,KAAK,IAAI,cAAc,KAAK,MAAM,UAAU,GAAG;AAAA,EAChF;AAEA,SAAO;AACT;;;ATNA,SAAS,kBAAkB,OAA8E;AACvG,MAAI,CAAC,OAAO;AACV,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,UAAU,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AAErD,SAAO,OAAO,YAAY,QAAQ,IAAI,CAACC,YAAW,CAACA,QAAO,SAASA,OAAM,CAAC,CAAC;AAC7E;AAEe,SAAR,QAAyB,UAAgC,CAAC,GAAW;AAC1E,QAAM,cAAc,QAAQ,QAAQ;AACpC,QAAM,MAAM,OAAO,QAAQ,QAAQ,WAAW,EAAE,OAAO,QAAQ,IAAI,IAAI,QAAQ,OAAO,CAAC;AACvF,QAAMC,cAAa,EAAE,GAAG,mBAAmB,GAAG,kBAAkB,QAAQ,UAAU,EAAE;AAEpF,MAAI,QAAuB;AAE3B,SAAO;AAAA,IACL,MAAM;AAAA,IAEN,OAAOD,SAAQ,KAAK;AAClB,UAAI,eAAe,CAAC,IAAI,YAAY;AAClC;AAAA,MACF;AAEA,YAAM,OAAOA,QAAO,QAAQ,QAAQ,IAAI;AACxC,YAAM,WAAW,IAAI,SAAS,qBAAqB,KAAK,CAAC,cAAcE,YAAWC,SAAQ,MAAM,SAAS,CAAC,CAAC;AAE3G,aAAO;AAAA,QACL,OAAO;AAAA,UACL,WAAW,IAAI,cAAc,QAASH,QAAO,OAAO,aAAa,OAAQ;AAAA,UACzE,eAAe,WACX;AAAA,YACE,OAAOA,QAAO,OAAO,eAAe,SAAS;AAAA,UAC/C,IACA;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,IAEA,eAAeA,SAAQ;AACrB,UAAI,aAAa;AACf;AAAA,MACF;AAEA,cAAQ,gBAAgB,KAAKA,OAAM;AAEnC,UAAI,SAASA,QAAO,OAAO,KAAK;AAC9B,QAAAA,QAAO,OAAO,KAAK,sBAAsB,KAAK,EAAE;AAAA,MAClD;AAAA,IACF;AAAA,IAEA,UAAU,MAAM,IAAII,UAAS;AAC3B,UAAI,CAAC,aAAa,KAAK,EAAE,GAAG;AAC1B,eAAO;AAAA,MACT;AAEA,UAAI,SAAS;AAEb,UAAI,CAAC,eAAeA,UAAS,OAAO,qBAAqB,MAAM,GAAG;AAChE,iBACE;AAAA,UACE;AAAA,UACA,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,SAAS,cAAc,IAAI,aAAa;AAAA,UACvEH;AAAA,QACF,KAAK;AAAA,MACT;AAEA,aAAO,wBAAwB,QAAQA,WAAU,MAAM,WAAW,OAAO,SAAS;AAAA,IACpF;AAAA,IAEA,gBAAgB,QAAQ;AACtB,UAAI,CAAC,OAAO;AACV;AAAA,MACF;AAEA,aAAO,YAAY,IAAI,cAAc,OAAO,KAAK,KAAK,SAAS;AAC7D,YAAI,IAAI,WAAW,QAAQ;AACzB,iBAAO,KAAK;AAAA,QACd;AAEA,cAAM,iBAAiB,QAAQ,OAAQ,KAAK,KAAK,IAAI,gBAAgB,IAAI;AAAA,MAC3E,CAAC;AAED,aAAO,OAAO,OAAO,KAAK,6BAA6B,YAAY,EAAE;AAAA,IACvE;AAAA,EACF;AACF;",
|
|
4
|
+
"sourcesContent": ["/**\n * Inertia.js Vite Plugin\n *\n * This plugin provides two main features:\n *\n * 1. **Pages shorthand** - Transforms `pages: './Pages'` into a full `resolve` function\n * that uses `import.meta.glob` to load page components. This saves users from writing\n * boilerplate glob code in every project.\n *\n * 2. **SSR dev server** - During development, wraps the SSR entry file with server bootstrap\n * code and exposes an HTTP endpoint that Laravel can call to render pages server-side.\n * This eliminates the need to run a separate Node.js SSR server during development.\n *\n * The plugin is framework-agnostic - it detects which Inertia adapter (Vue, React, Svelte)\n * is being used by looking at import statements, then applies the appropriate transforms.\n * Custom frameworks can be added via the `frameworks` option.\n */\n\nimport { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport type { Plugin } from 'vite'\nimport { defaultFrameworks } from './frameworks/index'\nimport { transformPageResolution } from './pagesTransform'\nimport { handleSSRRequest, InertiaSSROptions, resolveSSREntry, SSR_ENDPOINT, SSR_ENTRY_CANDIDATES } from './ssr'\nimport { findInertiaAppExport, wrapWithServerBootstrap } from './ssrTransform'\nimport type { FrameworkConfig } from './types'\n\nexport type { FrameworkConfig, SSRTemplate } from './types'\nexport { InertiaSSROptions }\n\nexport interface InertiaPluginOptions {\n /**\n * SSR configuration. Pass a string for the entry path, an object for\n * additional options, or `false` to disable SSR entirely. Auto-detected\n * when not specified from:\n * - resources/js/ssr.{ts,tsx,js,jsx}\n * - src/ssr.{ts,tsx,js,jsx}\n * - resources/js/app.{ts,tsx,js,jsx}\n * - src/app.{ts,tsx,js,jsx}\n */\n ssr?: string | false | InertiaSSROptions\n\n /**\n * Custom framework configurations. Use this to add support for frameworks\n * beyond the built-in Vue, React, and Svelte adapters.\n *\n * @example\n * ```ts\n * inertia({\n * frameworks: {\n * package: '@inertiajs/solid',\n * extensions: ['.tsx', '.jsx'],\n * extractDefault: true,\n * ssr: (configureCall, options) => `\n * import createServer from '@inertiajs/solid/server'\n * const render = await ${configureCall}\n * createServer((page) => render(page)${options})\n * `,\n * }\n * })\n * ```\n */\n frameworks?: FrameworkConfig | FrameworkConfig[]\n}\n\n/**\n * Normalize the frameworks option into a record keyed by package name.\n */\nfunction toFrameworkRecord(input?: FrameworkConfig | FrameworkConfig[]): Record<string, FrameworkConfig> {\n if (!input) {\n return {}\n }\n\n const configs = Array.isArray(input) ? input : [input]\n\n return Object.fromEntries(configs.map((config) => [config.package, config]))\n}\n\nexport default function inertia(options: InertiaPluginOptions = {}): Plugin {\n const ssrDisabled = options.ssr === false\n const ssr = typeof options.ssr === 'string' ? { entry: options.ssr } : options.ssr || {}\n const frameworks = { ...defaultFrameworks, ...toFrameworkRecord(options.frameworks) }\n\n let entry: string | null = null\n\n return {\n name: '@inertiajs/vite',\n\n config(config, env) {\n if (ssrDisabled || !env.isSsrBuild) {\n return\n }\n\n const root = config.root ?? process.cwd()\n const ssrEntry = ssr.entry ?? SSR_ENTRY_CANDIDATES.find((candidate) => existsSync(resolve(root, candidate)))\n\n return {\n build: {\n sourcemap: ssr.sourcemap !== false ? (config.build?.sourcemap ?? true) : undefined,\n rollupOptions: ssrEntry\n ? {\n input: config.build?.rollupOptions?.input ?? ssrEntry,\n }\n : undefined,\n },\n }\n },\n\n configResolved(config) {\n if (ssrDisabled) {\n return\n }\n\n entry = resolveSSREntry(ssr, config)\n\n if (entry && config.build?.ssr) {\n config.logger.info(`Inertia SSR entry: ${entry}`)\n }\n },\n\n transform(code, id, options) {\n if (!/\\.[jt]sx?$/.test(id)) {\n return null\n }\n\n let result = code\n\n if (!ssrDisabled && options?.ssr && findInertiaAppExport(result)) {\n result =\n wrapWithServerBootstrap(\n result,\n { port: ssr.port, cluster: ssr.cluster, handleErrors: ssr.handleErrors },\n frameworks,\n ) ?? result\n }\n\n return transformPageResolution(result, frameworks) ?? (result !== code ? result : null)\n },\n\n configureServer(server) {\n if (!entry) {\n return\n }\n\n server.middlewares.use(SSR_ENDPOINT, async (req, res, next) => {\n if (req.method !== 'POST') {\n return next()\n }\n\n await handleSSRRequest(server, entry!, req, res, ssr.handleErrors ?? true)\n })\n\n server.config.logger.info(`Inertia SSR dev endpoint: ${SSR_ENDPOINT}`)\n },\n }\n}\n", "/**\n * React Framework Configuration\n *\n * This file defines how the Vite plugin handles React applications.\n * It serves as a reference for creating custom framework configurations.\n *\n * The SSR template shows what the plugin generates. For a user's SSR entry:\n *\n * ```js\n * import { createInertiaApp } from '@inertiajs/react'\n *\n * createInertiaApp({\n * resolve: (name) => resolvePageComponent(name),\n * })\n * ```\n *\n * In production, the plugin transforms it to:\n *\n * ```js\n * import { createInertiaApp } from '@inertiajs/react'\n * import createServer from '@inertiajs/react/server'\n * import { renderToString } from 'react-dom/server'\n *\n * const render = await createInertiaApp({\n * resolve: (name) => resolvePageComponent(name),\n * })\n *\n * createServer((page) => render(page, renderToString))\n * ```\n *\n * In development, it exports the render function directly for the Vite dev server.\n */\n\nimport type { FrameworkConfig } from '../types'\n\nexport const config: FrameworkConfig = {\n // Package name used to detect React usage via import statements\n package: '@inertiajs/react',\n\n // React components can use either .tsx (TypeScript) or .jsx\n // The plugin tries .tsx first, then falls back to .jsx\n extensions: ['.tsx', '.jsx'],\n\n // React components are exported as `export default`, so we need to extract .default\n extractDefault: true,\n\n // SSR template that wraps the createInertiaApp call with server bootstrap code\n // Uses import.meta.env.PROD to skip the standalone server in dev mode\n ssr: (configureCall, options) => `\nimport createServer from '@inertiajs/react/server'\nimport { renderToString } from 'react-dom/server'\n\nconst render = await ${configureCall}\n\nconst renderPage = (page) => render(page, renderToString)\n\nif (import.meta.env.PROD) {\n createServer(renderPage${options})\n}\n\nexport default renderPage\n`,\n}\n", "/**\n * Svelte Framework Configuration\n *\n * This file defines how the Vite plugin handles Svelte applications.\n * It serves as a reference for creating custom framework configurations.\n *\n * The SSR template shows what the plugin generates. For a user's SSR entry:\n *\n * ```js\n * import { createInertiaApp } from '@inertiajs/svelte'\n *\n * createInertiaApp({\n * resolve: (name) => resolvePageComponent(name),\n * })\n * ```\n *\n * The plugin transforms it to:\n *\n * ```js\n * import { createInertiaApp } from '@inertiajs/svelte'\n * import createServer from '@inertiajs/svelte/server'\n * import { render } from 'svelte/server'\n *\n * const ssr = await createInertiaApp({\n * resolve: (name) => resolvePageComponent(name),\n * })\n *\n * const renderPage = (page) => ssr(page, render)\n *\n * // Only start server in production\n * if (import.meta.env.PROD) {\n * createServer(renderPage)\n * }\n *\n * export default renderPage\n * ```\n */\n\nimport type { FrameworkConfig } from '../types'\n\nexport const config: FrameworkConfig = {\n // Package name used to detect Svelte usage via import statements\n package: '@inertiajs/svelte',\n\n // Svelte components use .svelte extension\n extensions: ['.svelte'],\n\n // Svelte components ARE the module - no .default extraction needed\n // This is different from Vue/React where components use `export default`\n extractDefault: false,\n\n // SSR template that wraps the createInertiaApp call with server bootstrap code\n // Uses import.meta.env.PROD to skip the standalone server in dev mode\n // Note: Svelte uses a different variable name (ssr) and render function import\n ssr: (configureCall, options) => `\nimport createServer from '@inertiajs/svelte/server'\nimport { render } from 'svelte/server'\n\nconst ssr = await ${configureCall}\n\nconst renderPage = (page) => ssr(page, render)\n\nif (import.meta.env.PROD) {\n createServer(renderPage${options})\n}\n\nexport default renderPage\n`,\n}\n", "/**\n * Vue Framework Configuration\n *\n * This file defines how the Vite plugin handles Vue applications.\n * It serves as a reference for creating custom framework configurations.\n *\n * The SSR template shows what the plugin generates. For a user's SSR entry:\n *\n * ```js\n * import { createInertiaApp } from '@inertiajs/vue3'\n *\n * createInertiaApp({\n * resolve: (name) => resolvePageComponent(name),\n * })\n * ```\n *\n * The plugin transforms it to:\n *\n * ```js\n * import { createInertiaApp } from '@inertiajs/vue3'\n * import createServer from '@inertiajs/vue3/server'\n * import { renderToString } from 'vue/server-renderer'\n *\n * const render = await createInertiaApp({\n * resolve: (name) => resolvePageComponent(name),\n * })\n *\n * const renderPage = (page) => render(page, renderToString)\n *\n * // Only start server in production\n * if (import.meta.env.PROD) {\n * createServer(renderPage)\n * }\n *\n * export default renderPage\n * ```\n */\n\nimport type { FrameworkConfig } from '../types'\n\nexport const config: FrameworkConfig = {\n // Package name used to detect Vue usage via import statements\n package: '@inertiajs/vue3',\n\n // Vue single-file components use .vue extension\n extensions: ['.vue'],\n\n // Vue components are exported as `export default`, so we need to extract .default\n extractDefault: true,\n\n // SSR template that wraps the createInertiaApp call with server bootstrap code\n // Uses import.meta.env.PROD to skip the standalone server in dev mode\n ssr: (configureCall, options) => `\nimport createServer from '@inertiajs/vue3/server'\nimport { renderToString } from 'vue/server-renderer'\n\nconst render = await ${configureCall}\n\nconst renderPage = (page) => render(page, renderToString)\n\nif (import.meta.env.PROD) {\n createServer(renderPage${options})\n}\n\nexport default renderPage\n`,\n}\n", "/**\n * Framework Registry\n *\n * This module exports the default framework configurations for Vue, React, and Svelte.\n * The plugin uses this registry to detect which framework is being used and apply\n * the appropriate transforms.\n *\n * Custom frameworks can be added via the `frameworks` plugin option, which will\n * be merged with these defaults (custom configs override defaults with the same package name).\n */\n\nimport type { FrameworkConfig } from '../types'\nimport { config as react } from './react'\nimport { config as svelte } from './svelte'\nimport { config as vue } from './vue'\n\n/**\n * Array of all built-in framework configurations.\n * Order doesn't matter - detection is based on import statements.\n */\nconst frameworks: FrameworkConfig[] = [vue, react, svelte]\n\n/**\n * Framework configs keyed by package name for efficient lookup.\n *\n * Example:\n * {\n * '@inertiajs/vue3': { package: '@inertiajs/vue3', extensions: ['.vue'], ... },\n * '@inertiajs/react': { package: '@inertiajs/react', extensions: ['.tsx', '.jsx'], ... },\n * '@inertiajs/svelte': { package: '@inertiajs/svelte', extensions: ['.svelte'], ... }\n * }\n */\nexport const defaultFrameworks: Record<string, FrameworkConfig> = Object.fromEntries(\n frameworks.map((config) => [config.package, config]),\n)\n", "/**\n * AST Utilities for Inertia Code Transforms\n *\n * Parses JavaScript/TypeScript code using Vite's built-in `parseAst` (Rollup's parser)\n * and provides methods to find Inertia-specific patterns like `createInertiaApp()` calls,\n * framework detection, and property extraction.\n */\n\nimport type {\n CallExpression,\n ExpressionStatement,\n Identifier,\n Node,\n ObjectExpression,\n Program,\n Property,\n SimpleCallExpression,\n} from 'estree'\nimport { parseAst } from 'vite'\nimport type { FrameworkConfig } from './types'\n\n/**\n * ESTree nodes augmented with the `start`/`end` positions Rollup's parser adds.\n */\nexport type NodeWithPos<T> = T & { start: number; end: number }\n\nconst INERTIA_APP_FUNCTION = 'createInertiaApp'\nconst CREATE_SERVER_FUNCTION = 'createServer'\n\n/** A top-level `createInertiaApp()` expression statement with position info. */\nexport interface InertiaStatement {\n statement: NodeWithPos<ExpressionStatement>\n call: NodeWithPos<SimpleCallExpression>\n}\n\n/** Position info for the first argument of a `createInertiaApp()` call. */\nexport interface InertiaCallOptions {\n start: number\n end: number\n isEmpty: boolean\n}\n\n/** Wraps a parsed AST with methods to find Inertia-specific patterns. */\nexport class ParsedCode {\n private constructor(private ast: Program) {}\n\n /** Returns null if parsing fails (e.g. non-JS file content). */\n static from(code: string): ParsedCode | null {\n try {\n return new ParsedCode(parseAst(code))\n } catch {\n return null\n }\n }\n\n get importSources(): string[] {\n const sources: string[] = []\n\n for (const node of this.ast.body) {\n if (node.type === 'ImportDeclaration') {\n sources.push(node.source.value as string)\n }\n }\n\n return sources\n }\n\n detectFramework(frameworks: Record<string, FrameworkConfig>): { name: string; config: FrameworkConfig } | null {\n const name = this.importSources.find((source) => source in frameworks)\n\n return name ? { name, config: frameworks[name] } : null\n }\n\n /**\n * Find a top-level `createInertiaApp()` expression statement, ignoring any\n * `await`, `void`, or `.then()`/`.catch()` wrappers around it.\n *\n * Does not match `export default createInertiaApp()`.\n */\n get inertiaStatement(): InertiaStatement | null {\n for (const node of this.ast.body) {\n if (node.type !== 'ExpressionStatement') {\n continue\n }\n\n const call = this.unwrapInertiaCall(node.expression)\n\n if (call) {\n const statement = node as NodeWithPos<ExpressionStatement>\n\n return { statement, call }\n }\n }\n\n return null\n }\n\n /**\n * Unwrap an expression to find a `createInertiaApp()` call inside it.\n * Strips away `await`, `void`, and `.then()`/`.catch()` chains.\n */\n private unwrapInertiaCall(node: Node): NodeWithPos<SimpleCallExpression> | null {\n // void createInertiaApp(...) / await createInertiaApp(...)\n if ((node.type === 'UnaryExpression' || node.type === 'AwaitExpression') && node.argument) {\n return this.unwrapInertiaCall(node.argument)\n }\n\n if (node.type === 'CallExpression') {\n if (this.isInertiaCall(node)) {\n return node as NodeWithPos<SimpleCallExpression>\n }\n\n // createInertiaApp({}).then(...).catch(...)\n if (node.callee.type === 'MemberExpression') {\n return this.unwrapInertiaCall(node.callee.object)\n }\n }\n\n return null\n }\n\n /** Find a top-level `createServer()` call (not nested in exports). */\n get createServerStatement(): NodeWithPos<ExpressionStatement> | null {\n for (const node of this.ast.body) {\n if (node.type !== 'ExpressionStatement') {\n continue\n }\n\n const statement = node as NodeWithPos<ExpressionStatement>\n const expr = statement.expression\n\n if (expr.type === 'CallExpression') {\n const call = expr as SimpleCallExpression\n\n if (call.callee.type === 'Identifier' && (call.callee as Identifier).name === CREATE_SERVER_FUNCTION) {\n return statement\n }\n }\n }\n\n return null\n }\n\n /**\n * Find all `createInertiaApp()` calls, including those nested inside exports.\n */\n get inertiaCalls(): CallExpression[] {\n const calls: CallExpression[] = []\n\n this.walkAst(this.ast, (node) => {\n if (node.type === 'CallExpression' && this.isInertiaCall(node as CallExpression)) {\n calls.push(node as CallExpression)\n }\n })\n\n return calls\n }\n\n get pagesProperty(): NodeWithPos<Property> | null {\n for (const call of this.inertiaCalls) {\n if (call.arguments.length === 0 || call.arguments[0].type !== 'ObjectExpression') {\n continue\n }\n\n // Look for a `pages` property in the options object\n for (const prop of (call.arguments[0] as ObjectExpression).properties) {\n if (prop.type !== 'Property' || prop.key.type !== 'Identifier' || prop.key.name !== 'pages') {\n continue\n }\n\n return prop as NodeWithPos<Property>\n }\n }\n\n return null\n }\n\n /** Find a `createInertiaApp()` call that has no `pages` or `resolve` property yet. */\n get callWithoutResolver(): { callEnd: number; options?: InertiaCallOptions } | null {\n for (const call of this.inertiaCalls) {\n const callWithPos = call as NodeWithPos<CallExpression>\n\n // Empty call: createInertiaApp()\n if (call.arguments.length === 0) {\n return { callEnd: callWithPos.end }\n }\n\n // Non-object argument - can't inject resolver\n if (call.arguments[0].type !== 'ObjectExpression') {\n continue\n }\n\n const obj = call.arguments[0] as NodeWithPos<ObjectExpression>\n\n const hasResolver = obj.properties.some(\n (p) =>\n p.type === 'Property' && p.key.type === 'Identifier' && (p.key.name === 'pages' || p.key.name === 'resolve'),\n )\n\n if (hasResolver) {\n continue\n }\n\n return {\n callEnd: callWithPos.end,\n options: { start: obj.start, end: obj.end, isEmpty: obj.properties.length === 0 },\n }\n }\n\n return null\n }\n\n private isInertiaCall(node: CallExpression | SimpleCallExpression): boolean {\n return node.callee.type === 'Identifier' && (node.callee as Identifier).name === INERTIA_APP_FUNCTION\n }\n\n private walkAst(node: unknown, callback: (node: { type: string }) => void): void {\n if (!node || typeof node !== 'object') {\n return\n }\n\n if ('type' in node) {\n callback(node as { type: string })\n }\n\n for (const value of Object.values(node as Record<string, unknown>)) {\n if (Array.isArray(value)) {\n for (const item of value) {\n this.walkAst(item, callback)\n }\n } else {\n this.walkAst(value, callback)\n }\n }\n }\n}\n\n/**\n * Supports regular strings and simple template literals without expressions.\n */\nexport function extractString(node: Property['value']): string | undefined {\n if (node.type === 'Literal' && typeof node.value === 'string') {\n return node.value\n }\n\n // Template literal without expressions: `./Pages`\n if (node.type === 'TemplateLiteral' && node.expressions.length === 0) {\n return node.quasis[0].value.cooked ?? node.quasis[0].value.raw\n }\n\n return undefined\n}\n\n/** Each element is passed through `extractString`, non-strings are skipped. */\nexport function extractStringArray(node: Property['value']): string[] | undefined {\n if (node.type !== 'ArrayExpression') {\n return undefined\n }\n\n const strings = node.elements\n .map((el) => (el ? extractString(el as Property['value']) : undefined))\n .filter((s): s is string => s !== undefined)\n\n return strings.length > 0 ? strings : undefined\n}\n\nexport function extractBoolean(node: Property['value']): boolean | undefined {\n if (node.type === 'Literal' && typeof node.value === 'boolean') {\n return node.value\n }\n\n return undefined\n}\n", "/**\n * Pages Transform\n *\n * This module transforms the `pages` shorthand into a full `resolve` function.\n * Instead of writing verbose glob code in every project, users can simply write:\n *\n * ```js\n * createInertiaApp({ pages: './Pages' })\n * ```\n *\n * Which gets transformed into:\n *\n * ```js\n * createInertiaApp({\n * resolve: async (name, page) => {\n * const pages = import.meta.glob('./Pages/*.vue')\n * const module = await (pages[`./Pages/${name}.vue`])?.()\n * if (!module) throw new Error(`Page not found: ${name}`)\n * return module.default ?? module\n * }\n * })\n * ```\n *\n * The transform also supports advanced configuration:\n *\n * ```js\n * createInertiaApp({\n * pages: {\n * path: './Pages',\n * extension: '.tsx',\n * lazy: true,\n * transform: (name, page) => name.replace('/', '-')\n * }\n * })\n * ```\n */\n\nimport type { Property } from 'estree'\nimport { type NodeWithPos, ParsedCode, extractBoolean, extractString, extractStringArray } from './astUtils'\nimport type { FrameworkConfig } from './types'\n\n/** Returns the transformed code, or null if no transformation was needed. */\nexport function transformPageResolution(code: string, frameworks: Record<string, FrameworkConfig>): string | null {\n if (!code.includes('InertiaApp')) {\n return null\n }\n\n const parsed = ParsedCode.from(code)\n\n if (!parsed) {\n return null\n }\n\n const framework = parsed.detectFramework(frameworks)\n\n if (!framework) {\n return null\n }\n\n const extensions = framework.config.extensions\n const extractDefault = framework.config.extractDefault ?? true\n\n if (parsed.pagesProperty) {\n return replacePages(code, parsed.pagesProperty, extensions, extractDefault)\n }\n\n if (parsed.callWithoutResolver) {\n return injectResolver(code, parsed.callWithoutResolver, extensions, extractDefault)\n }\n\n return null\n}\n\n/**\n * Replace the `pages` property with a generated `resolve` function.\n *\n * Input: `{ pages: './Pages', title: t => t }`\n * Output: `{ resolve: async (name, page) => { ... }, title: t => t }`\n */\nfunction replacePages(\n code: string,\n property: NodeWithPos<Property>,\n defaultExtensions: string[],\n extractDefault: boolean,\n): string {\n const config = extractPagesConfig(property.value, code)\n\n if (!config) {\n return code\n }\n\n const extensions = config.extensions\n ? Array.isArray(config.extensions)\n ? config.extensions\n : [config.extensions]\n : defaultExtensions\n\n const eager = !(config.lazy ?? true)\n\n const resolver = config.directory\n ? buildResolver(config.directory.replace(/\\/$/, ''), extensions, extractDefault, eager, config.transform)\n : buildDefaultResolver(extensions, extractDefault, eager)\n\n return code.slice(0, property.start) + resolver + code.slice(property.end)\n}\n\n/**\n * Inject a default resolver into a call that doesn't have one.\n *\n * Handles three cases:\n * 1. Empty call: `createInertiaApp()` becomes `createInertiaApp({ resolve: ... })`\n * 2. Empty object: `createInertiaApp({})` becomes `createInertiaApp({ resolve: ... })`\n * 3. Other options: `createInertiaApp({a})` becomes `createInertiaApp({ resolve: ..., a})`\n */\nfunction injectResolver(\n code: string,\n call: { callEnd: number; options?: { start: number; end: number; isEmpty: boolean } },\n extensions: string[],\n extractDefault: boolean,\n): string {\n const resolver = buildDefaultResolver(extensions, extractDefault)\n\n if (!call.options) {\n return code.slice(0, call.callEnd - 1) + `{ ${resolver} })` + code.slice(call.callEnd)\n }\n\n if (call.options.isEmpty) {\n return code.slice(0, call.options.start) + `{ ${resolver} }` + code.slice(call.options.end)\n }\n\n return code.slice(0, call.options.start + 1) + ` ${resolver},` + code.slice(call.options.start + 1)\n}\n\n/** The parsed representation of a `pages` property value. */\ninterface PagesConfig {\n directory?: string\n extensions?: string | string[]\n transform?: string\n lazy?: boolean\n}\n\n/**\n * Extract configuration from the `pages` property value.\n *\n * Supports two formats:\n * 1. String: `pages: './Pages'`\n * 2. Object: `pages: { path: './Pages', extension: '.vue', lazy: true, transform: fn }`\n */\nfunction extractPagesConfig(node: Property['value'], code: string): PagesConfig | null {\n const str = extractString(node)\n\n if (str) {\n return { directory: str }\n }\n\n if (node.type !== 'ObjectExpression') {\n return null\n }\n\n let directory: string | undefined\n let extensions: string | string[] | undefined\n let transform: string | undefined\n let lazy: boolean | undefined\n\n for (const prop of node.properties) {\n if (prop.type !== 'Property' || prop.key.type !== 'Identifier') {\n continue\n }\n\n const key = prop.key.name\n const value = prop.value as NodeWithPos<Property['value']>\n\n if (key === 'path') {\n directory = extractString(value)\n } else if (key === 'extension') {\n extensions = extractString(value) ?? extractStringArray(value)\n } else if (key === 'transform') {\n transform = code.slice(value.start, value.end)\n } else if (key === 'lazy') {\n lazy = extractBoolean(value)\n }\n }\n\n return { directory, extensions, transform, lazy }\n}\n\nfunction buildResolver(\n directories: string | string[],\n extensions: string[],\n extractDefault: boolean,\n eager: boolean,\n transform?: string,\n): string {\n const dirs = Array.isArray(directories) ? directories : [directories]\n\n const globs = dirs.map((d) => buildGlob(d, extensions))\n const glob = globs.length === 1 ? `'${globs[0]}'` : `['${globs.join(\"', '\")}']`\n\n const nameVar = transform ? 'resolvedName' : 'name'\n const lookup = dirs.flatMap((d) => extensions.map((ext) => `pages[\\`${d}/\\${${nameVar}}${ext}\\`]`)).join(' || ')\n\n const transformLine = transform ? `const resolvedName = (${transform})(name, page)\\n ` : ''\n\n const returnValue = extractDefault ? 'module.default ?? module' : 'module'\n\n const globOptions = `, { eager: ${eager} }`\n const moduleLookup = eager ? lookup : `await (${lookup})?.()`\n\n return `resolve: async (name, page) => {\n ${transformLine}const pages = import.meta.glob(${glob}${globOptions})\n const module = ${moduleLookup}\n if (!module) throw new Error(\\`Page not found: \\${name}\\`)\n return ${returnValue}\n }`\n}\n\nfunction buildDefaultResolver(extensions: string[], extractDefault: boolean, eager: boolean = false): string {\n return buildResolver(['./pages', './Pages'], extensions, extractDefault, eager)\n}\n\nfunction buildGlob(directory: string, extensions: string[]): string {\n const ext = extensions.length === 1 ? extensions[0] : `{${extensions.join(',')}}`\n\n return `${directory}/**/*${ext}`\n}\n", "/**\n * SSR Dev Server\n *\n * This module handles SSR rendering during development. Instead of running\n * a separate Node.js SSR server, the Vite dev server exposes an HTTP endpoint\n * that Laravel can call to render pages server-side.\n *\n * How it works:\n * 1. Laravel detects that the Vite dev server is running\n * 2. Laravel POSTs the page data to `/__inertia_ssr`\n * 3. This module loads the SSR entry file via Vite's SSR module loader\n * 4. The entry file's default export is called with the page data\n * 5. The rendered HTML is returned to Laravel\n *\n * This approach provides:\n * - Hot Module Replacement (HMR) for SSR code during development\n * - No need to restart a separate SSR server when code changes\n * - Automatic TypeScript/JSX transformation via Vite\n */\n\nimport { classifySSRError, formatConsoleError } from '@inertiajs/core/ssrErrors'\nimport { existsSync } from 'node:fs'\nimport type { IncomingMessage, ServerResponse } from 'node:http'\nimport { resolve } from 'node:path'\nimport type { ResolvedConfig, ViteDevServer } from 'vite'\nimport { collectCSSFromModuleGraph } from './css'\n\n/** Options for the SSR dev server and production builds. */\nexport interface InertiaSSROptions {\n /**\n * Path to the SSR entry file. Auto-detected when not specified.\n */\n entry?: string\n\n /**\n * Port number for the SSR server (used in production builds).\n */\n port?: number\n\n /**\n * Enable cluster mode for the SSR server (used in production builds).\n */\n cluster?: boolean\n\n /**\n * When enabled, SSR errors are formatted with hints instead of thrown raw.\n * Defaults to true.\n */\n handleErrors?: boolean\n\n /**\n * Enable sourcemaps for SSR builds so error stacks map to original files.\n * Defaults to true.\n */\n sourcemap?: boolean\n}\n\nexport const SSR_ENDPOINT = '/__inertia_ssr'\n\nexport const SSR_ENTRY_CANDIDATES = [\n 'resources/js/ssr.ts',\n 'resources/js/ssr.tsx',\n 'resources/js/ssr.js',\n 'resources/js/ssr.jsx',\n 'src/ssr.ts',\n 'src/ssr.tsx',\n 'src/ssr.js',\n 'src/ssr.jsx',\n 'resources/js/app.ts',\n 'resources/js/app.tsx',\n 'resources/js/app.js',\n 'resources/js/app.jsx',\n 'src/app.ts',\n 'src/app.tsx',\n 'src/app.js',\n 'src/app.jsx',\n]\n\nexport function resolveSSREntry(options: InertiaSSROptions, config: ResolvedConfig): string | null {\n if (options.entry) {\n if (existsSync(resolve(config.root, options.entry))) {\n return options.entry\n }\n\n config.logger.warn(`Inertia SSR entry not found: ${options.entry}`)\n\n return null\n }\n\n return SSR_ENTRY_CANDIDATES.find((path) => existsSync(resolve(config.root, path))) ?? null\n}\n\nexport async function handleSSRRequest(\n server: ViteDevServer,\n entry: string,\n req: IncomingMessage,\n res: ServerResponse,\n handleErrors: boolean = true,\n): Promise<void> {\n let component: string | undefined\n let url: string | undefined\n\n // We temporarily override console.warn to suppress Vue's verbose component\n // trace warnings during SSR, and show our own cleaner error output instead.\n const originalWarn = console.warn\n const suppressedWarnings: string[] = []\n\n console.warn = (...args: unknown[]) => {\n const message = args[0]?.toString() ?? ''\n\n if (message.includes('[Vue warn]') || message.includes('at <')) {\n if (handleErrors) {\n suppressedWarnings.push(args.map(String).join(' '))\n }\n\n return\n }\n\n originalWarn.apply(console, args)\n }\n\n try {\n const page = await readRequestBody<{ component: string; url: string }>(req)\n component = page.component\n url = page.url\n const start = performance.now()\n\n const render = await loadRenderFunction(server, entry)\n const result = await render(page)\n\n if (!result || typeof result.body !== 'string') {\n throw new Error(`SSR render must return { head: string[], body: string }`)\n }\n\n const cssLinks = collectCSSFromModuleGraph(server, entry)\n result.head = [...cssLinks, ...result.head]\n\n logSSRRequest(server, page.component, start)\n\n res.setHeader('Content-Type', 'application/json')\n res.end(JSON.stringify(result))\n } catch (error) {\n handleSSRError(server, res, error as Error, component, url, handleErrors, suppressedWarnings)\n } finally {\n console.warn = originalWarn\n }\n}\n\nasync function loadRenderFunction(\n server: ViteDevServer,\n entry: string,\n): Promise<(page: unknown) => Promise<{ head: string[]; body: string }>> {\n const module = await server.ssrLoadModule(entry)\n const render = await Promise.resolve(module.default)\n\n if (typeof render !== 'function') {\n throw new Error(`SSR entry \"${entry}\" must export a render function`)\n }\n\n return render\n}\n\nfunction readRequestBody<T>(req: IncomingMessage): Promise<T> {\n return new Promise((resolve, reject) => {\n let data = ''\n\n req.on('data', (chunk) => (data += chunk))\n\n req.on('end', () => {\n if (!data.trim()) {\n reject(new Error('Request body is empty'))\n return\n }\n\n try {\n resolve(JSON.parse(data))\n } catch (error) {\n reject(new Error(`Invalid JSON in request body: ${error instanceof Error ? error.message : 'Unknown error'}`))\n }\n })\n\n req.on('error', reject)\n })\n}\n\n/**\n * Log an SSR request to the Vite dev server console.\n *\n * Output format: `2024-01-15 10:30:45 SSR Users/Index 12.34ms`\n */\nfunction logSSRRequest(server: ViteDevServer, component: string, start: number): void {\n const duration = (performance.now() - start).toFixed(2)\n const timestamp = new Date().toISOString().replace('T', ' ').slice(0, 19)\n\n server.config.logger.info(`\\x1b[32m${timestamp}\\x1b[0m SSR ${component} \\x1b[90m${duration}ms\\x1b[0m`)\n}\n\nfunction handleSSRError(\n server: ViteDevServer,\n res: ServerResponse,\n error: Error,\n component?: string,\n url?: string,\n handleErrors: boolean = true,\n suppressedWarnings: string[] = [],\n): void {\n server.ssrFixStacktrace(error)\n\n if (!handleErrors) {\n throw error\n }\n\n const classified = classifySSRError(error, component, url)\n\n server.config.logger.error(formatConsoleError(classified, server.config.root, handleErrors, suppressedWarnings))\n\n res.setHeader('Content-Type', 'application/json')\n res.statusCode = 500\n res.end(JSON.stringify(classified))\n}\n", "/**\n * SSR CSS Collection\n *\n * Collects CSS dependencies from Vite's module graph to prevent FOUC\n * (Flash of Unstyled Content) during SSR development.\n *\n * In dev mode, Vite normally injects CSS via JavaScript on the client side.\n * When SSR is enabled, the server-rendered HTML arrives before any JS executes,\n * causing unstyled content to flash briefly. This module traverses the SSR\n * environment's module graph starting from the entry to find all CSS\n * dependencies, then generates <link> tags so the browser fetches styles\n * immediately with the initial HTML.\n *\n * The generated <link> tags include `data-vite-dev-id` attributes so Vite's\n * client JS can deduplicate them and avoid injecting duplicate <style> tags.\n */\n\nimport { resolve } from 'node:path'\nimport type { EnvironmentModuleNode, ViteDevServer } from 'vite'\n\nexport function collectCSSFromModuleGraph(server: ViteDevServer, entry: string): string[] {\n const entryModule = resolveEntryModule(server, entry)\n\n if (!entryModule) {\n return []\n }\n\n const cssModules = collectCSSModules(entryModule)\n\n if (cssModules.length === 0) {\n return []\n }\n\n const origin = resolveDevServerOrigin(server)\n const base = server.config.base || '/'\n const basePrefix = base === '/' ? '' : base.replace(/\\/$/, '')\n\n return cssModules.map(({ url, id }) => {\n const href = `${origin}${basePrefix}${url}`\n const devId = id ? ` data-vite-dev-id=\"${id}\"` : ''\n\n return `<link rel=\"stylesheet\" href=\"${href}\"${devId}>`\n })\n}\n\nfunction resolveEntryModule(server: ViteDevServer, entry: string): EnvironmentModuleNode | undefined {\n const resolvedEntry = resolve(server.config.root, entry)\n\n return server.environments.ssr.moduleGraph.getModuleById(resolvedEntry)\n}\n\nfunction collectCSSModules(entryModule: EnvironmentModuleNode): { url: string; id: string | null }[] {\n const cssModules: { url: string; id: string | null }[] = []\n const visited = new Set<EnvironmentModuleNode>()\n\n function traverse(mod: EnvironmentModuleNode): void {\n if (visited.has(mod)) {\n return\n }\n\n visited.add(mod)\n\n if (isCSSRequest(mod.url)) {\n cssModules.push({ url: mod.url, id: mod.id })\n return\n }\n\n for (const imported of mod.importedModules) {\n traverse(imported)\n }\n }\n\n traverse(entryModule)\n\n return cssModules\n}\n\nconst CSS_EXTENSIONS = /\\.(css|less|sass|scss|styl|stylus|pcss|postcss|sss)(?:$|\\?)/\n\nfunction isCSSRequest(url: string): boolean {\n return CSS_EXTENSIONS.test(url)\n}\n\nfunction resolveDevServerOrigin(server: ViteDevServer): string {\n if (server.resolvedUrls?.local[0]) {\n return new URL(server.resolvedUrls.local[0]).origin\n }\n\n const protocol = server.config.server.https ? 'https' : 'http'\n const port = server.config.server.port ?? 5173\n\n return `${protocol}://localhost:${port}`\n}\n", "/**\n * SSR Transform\n *\n * Transforms the SSR entry file by wrapping `createInertiaApp()` with\n * framework-specific server bootstrap code, so users don't need to\n * write the boilerplate manually.\n */\n\nimport { ParsedCode } from './astUtils'\nimport type { FrameworkConfig, SSROptions } from './types'\n\n/**\n * Returns empty string if no options, otherwise `, {\"port\":13715}`.\n */\nfunction formatSSROptions(options: SSROptions): string {\n const entries = Object.entries(options).filter(([, v]) => v !== undefined)\n\n return entries.length > 0 ? `, ${JSON.stringify(Object.fromEntries(entries))}` : ''\n}\n\n/**\n * Quick check for a top-level call that needs SSR wrapping.\n */\nexport function findInertiaAppExport(code: string): boolean {\n const parsed = ParsedCode.from(code)\n return !!(parsed?.inertiaStatement || parsed?.createServerStatement)\n}\n\n/**\n * Wrap `createInertiaApp()` or `createServer()` with the framework's SSR bootstrap.\n */\nexport function wrapWithServerBootstrap(\n code: string,\n options: SSROptions,\n frameworks: Record<string, FrameworkConfig>,\n): string | null {\n const parsed = ParsedCode.from(code)\n\n if (!parsed) {\n return null\n }\n\n if (parsed.inertiaStatement) {\n const framework = parsed.detectFramework(frameworks)\n\n if (!framework?.config.ssr) {\n return null\n }\n\n const { statement, call } = parsed.inertiaStatement\n const configureCall = code.slice(call.start, call.end)\n const ssrCode = framework.config.ssr(configureCall, formatSSROptions(options)).trim()\n\n return code.slice(0, statement.start) + ssrCode + code.slice(statement.end)\n }\n\n if (parsed.createServerStatement) {\n const statement = parsed.createServerStatement\n const args = (statement.expression as unknown as { arguments: Array<{ start: number; end: number }> }).arguments\n const callback = code.slice(args[0].start, args[0].end)\n const trailingArgs = code.slice(args[0].end, args[args.length - 1].end)\n\n const replacement = `const renderPage = ${callback}\n\nif (import.meta.env.PROD) {\n createServer(renderPage${trailingArgs})\n}\n\nexport default renderPage`\n\n return code.slice(0, statement.start) + replacement + code.slice(statement.end)\n }\n\n return null\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["existsSync", "resolve", "config", "config", "config", "frameworks", "frameworks", "config", "resolve", "config", "resolve", "frameworks", "config", "frameworks", "existsSync", "resolve", "options"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@inertiajs/vite",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.3",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Vite plugin for Inertia.js with SSR dev mode support.",
|
|
6
6
|
"contributors": [
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
}
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@inertiajs/core": "3.0.0-beta.
|
|
32
|
+
"@inertiajs/core": "3.0.0-beta.3"
|
|
33
33
|
},
|
|
34
34
|
"peerDependencies": {
|
|
35
35
|
"vite": "^6.0.0 || ^7.0.0"
|
package/types/astUtils.d.ts
CHANGED
|
@@ -37,10 +37,17 @@ export declare class ParsedCode {
|
|
|
37
37
|
config: FrameworkConfig;
|
|
38
38
|
} | null;
|
|
39
39
|
/**
|
|
40
|
-
* Find a top-level `createInertiaApp()` expression statement
|
|
41
|
-
*
|
|
40
|
+
* Find a top-level `createInertiaApp()` expression statement, ignoring any
|
|
41
|
+
* `await`, `void`, or `.then()`/`.catch()` wrappers around it.
|
|
42
|
+
*
|
|
43
|
+
* Does not match `export default createInertiaApp()`.
|
|
42
44
|
*/
|
|
43
45
|
get inertiaStatement(): InertiaStatement | null;
|
|
46
|
+
/**
|
|
47
|
+
* Unwrap an expression to find a `createInertiaApp()` call inside it.
|
|
48
|
+
* Strips away `await`, `void`, and `.then()`/`.catch()` chains.
|
|
49
|
+
*/
|
|
50
|
+
private unwrapInertiaCall;
|
|
44
51
|
/** Find a top-level `createServer()` call (not nested in exports). */
|
|
45
52
|
get createServerStatement(): NodeWithPos<ExpressionStatement> | null;
|
|
46
53
|
/**
|