@storybook-astro/framework 1.4.0-canary.1 → 1.4.0-canary.2
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/{chunk-N3WTUD2A.js → chunk-A4DQ67HA.js} +53 -2
- package/dist/chunk-A4DQ67HA.js.map +1 -0
- package/dist/{chunk-AIEYHH2G.js → chunk-BV6V2Z4X.js} +2 -2
- package/dist/{chunk-EU6E5SJE.js → chunk-VZXGPM6P.js} +3 -2
- package/dist/chunk-VZXGPM6P.js.map +1 -0
- package/dist/middleware.js +10 -2
- package/dist/middleware.js.map +1 -1
- package/dist/preset.js +24 -14
- package/dist/preset.js.map +1 -1
- package/dist/testing.js +3 -3
- package/dist/{viteStorybookAstroMiddlewarePlugin-RPIBVJAV.js → viteStorybookAstroMiddlewarePlugin-246I5D3Y.js} +2 -2
- package/dist/vitest/global-setup.js +2 -2
- package/package.json +3 -2
- package/src/lib/resolve-aliased-island.test.ts +150 -0
- package/src/lib/resolve-aliased-island.ts +97 -0
- package/src/middleware.ts +15 -0
- package/src/productionRenderRuntime.ts +2 -1
- package/src/storySsrVite.ts +11 -0
- package/src/vitePluginAstroBuildShared.test.ts +25 -6
- package/src/vitePluginAstroBuildShared.ts +25 -12
- package/src/viteStorybookAstroMiddlewarePlugin.ts +2 -1
- package/dist/chunk-EU6E5SJE.js.map +0 -1
- package/dist/chunk-N3WTUD2A.js.map +0 -1
- /package/dist/{chunk-AIEYHH2G.js.map → chunk-BV6V2Z4X.js.map} +0 -0
- /package/dist/{viteStorybookAstroMiddlewarePlugin-RPIBVJAV.js.map → viteStorybookAstroMiddlewarePlugin-246I5D3Y.js.map} +0 -0
|
@@ -544,10 +544,61 @@ function isRecord3(value) {
|
|
|
544
544
|
return typeof value === "object" && value !== null;
|
|
545
545
|
}
|
|
546
546
|
|
|
547
|
+
// src/lib/resolve-aliased-island.ts
|
|
548
|
+
import { access } from "fs/promises";
|
|
549
|
+
import { resolve } from "path";
|
|
550
|
+
import { parse } from "tsconfck";
|
|
551
|
+
var ALIAS_EXTS = [".tsx", ".ts", ".jsx", ".js", ".vue", ".svelte", ".mts", ".mjs"];
|
|
552
|
+
async function isFile(candidate) {
|
|
553
|
+
try {
|
|
554
|
+
await access(candidate);
|
|
555
|
+
return true;
|
|
556
|
+
} catch {
|
|
557
|
+
return false;
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
async function resolveAliasedIsland(specifier, resolveFrom) {
|
|
561
|
+
if (!specifier || specifier.startsWith("./") || specifier.startsWith("../") || specifier.startsWith("/") || specifier.startsWith("\0") || specifier.startsWith("virtual:") || specifier.startsWith("astro:") || specifier.startsWith("@astrojs/") || specifier.startsWith("@id/") || specifier.startsWith("/@fs/")) {
|
|
562
|
+
return void 0;
|
|
563
|
+
}
|
|
564
|
+
let result;
|
|
565
|
+
try {
|
|
566
|
+
result = await parse(resolve(resolveFrom, "tsconfig.json"));
|
|
567
|
+
} catch {
|
|
568
|
+
return void 0;
|
|
569
|
+
}
|
|
570
|
+
const compilerOptions = result.tsconfig?.compilerOptions ?? {};
|
|
571
|
+
const paths = compilerOptions.paths ?? {};
|
|
572
|
+
if (Object.keys(paths).length === 0) {
|
|
573
|
+
return void 0;
|
|
574
|
+
}
|
|
575
|
+
const tsconfigDir = result.tsconfigFile ? resolve(result.tsconfigFile, "..") : resolveFrom;
|
|
576
|
+
const root = compilerOptions.baseUrl ? resolve(tsconfigDir, compilerOptions.baseUrl) : tsconfigDir;
|
|
577
|
+
for (const [pattern, targets] of Object.entries(paths)) {
|
|
578
|
+
const prefix = pattern.replace(/\*$/, "");
|
|
579
|
+
if (!specifier.startsWith(prefix)) {
|
|
580
|
+
continue;
|
|
581
|
+
}
|
|
582
|
+
const rest = specifier.slice(prefix.length);
|
|
583
|
+
for (const target of targets) {
|
|
584
|
+
const resolvedTarget = target.replace(/\*$/, "");
|
|
585
|
+
const base = resolve(root, resolvedTarget, rest);
|
|
586
|
+
const candidates = [base, ...ALIAS_EXTS.map((ext) => `${base}${ext}`)];
|
|
587
|
+
for (const candidate of candidates) {
|
|
588
|
+
if (await isFile(candidate)) {
|
|
589
|
+
return candidate.replace(/\\/g, "/");
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
return void 0;
|
|
595
|
+
}
|
|
596
|
+
|
|
547
597
|
export {
|
|
548
598
|
ensureAstroPassthroughImageService,
|
|
549
599
|
resolveSanitizationOptions,
|
|
550
600
|
serializeSanitizationOptions,
|
|
551
|
-
createAstroRenderHandler
|
|
601
|
+
createAstroRenderHandler,
|
|
602
|
+
resolveAliasedIsland
|
|
552
603
|
};
|
|
553
|
-
//# sourceMappingURL=chunk-
|
|
604
|
+
//# sourceMappingURL=chunk-A4DQ67HA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/astroImageService.ts","../src/lib/sanitization.ts","../src/lib/revive-dates.ts","../src/storyRulesRuntime.ts","../src/astroRenderHandler.ts","../src/lib/resolve-aliased-island.ts"],"sourcesContent":["export function ensureAstroPassthroughImageService() {\n if (!globalThis.astroAsset) {\n (globalThis as Record<string, unknown>).astroAsset = {};\n }\n\n (globalThis.astroAsset as Record<string, unknown>).imageService = {\n propertiesToHash: ['src'],\n validateOptions(options: Record<string, unknown>) {\n return options;\n },\n getURL(options: { src: unknown }) {\n const src = options.src;\n\n if (\n src != null &&\n typeof src === 'object' &&\n 'src' in src &&\n typeof (src as Record<string, unknown>).src === 'string'\n ) {\n return (src as Record<string, unknown>).src as string;\n }\n\n return typeof src === 'string' ? src : '';\n },\n getHTMLAttributes(options: Record<string, unknown>) {\n const {\n src,\n width,\n height,\n format,\n quality,\n densities,\n widths,\n formats,\n layout,\n priority,\n fit,\n position,\n background,\n ...attrs\n } = options;\n const srcObject =\n src != null && typeof src === 'object' ? (src as Record<string, unknown>) : null;\n\n return {\n ...attrs,\n width: width ?? srcObject?.width,\n height: height ?? srcObject?.height,\n loading: (attrs.loading as string | undefined) ?? 'lazy',\n decoding: (attrs.decoding as string | undefined) ?? 'async'\n };\n },\n getSrcSet() {\n return [];\n }\n };\n}\n","import sanitizeHtml from 'sanitize-html';\nimport type { IOptions } from 'sanitize-html';\n\ntype SanitizationPayload = {\n args: Record<string, unknown>;\n slots: Record<string, unknown>;\n};\n\nexport type SanitizationOptions = {\n enabled?: boolean;\n args?: string[];\n slots?: string[];\n sanitizeHtml?: IOptions;\n};\n\nexport type ResolvedSanitizationOptions = {\n enabled: boolean;\n args: string[];\n slots: string[];\n sanitizeHtml: IOptions;\n};\n\nconst DEFAULT_SANITIZE_HTML_OPTIONS: IOptions = {\n allowedTags: [\n 'a',\n 'abbr',\n 'b',\n 'blockquote',\n 'br',\n 'caption',\n 'cite',\n 'code',\n 'col',\n 'colgroup',\n 'dd',\n 'details',\n 'dfn',\n 'div',\n 'dl',\n 'dt',\n 'em',\n 'figcaption',\n 'figure',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'hr',\n 'i',\n 'img',\n 'kbd',\n 'li',\n 'mark',\n 'ol',\n 'p',\n 'pre',\n 'q',\n 'rp',\n 'rt',\n 'ruby',\n 's',\n 'samp',\n 'small',\n 'span',\n 'strong',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'tfoot',\n 'th',\n 'thead',\n 'time',\n 'tr',\n 'u',\n 'ul',\n 'var',\n 'wbr'\n ],\n allowedAttributes: {\n '*': [\n 'aria-describedby',\n 'aria-hidden',\n 'aria-label',\n 'aria-labelledby',\n 'class',\n 'id',\n 'lang',\n 'role',\n 'title'\n ],\n a: ['href', 'name', 'target', 'rel'],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height', 'loading', 'decoding'],\n td: ['colspan', 'rowspan'],\n th: ['colspan', 'rowspan', 'scope'],\n time: ['datetime']\n },\n allowedSchemes: ['http', 'https', 'mailto', 'tel', 'data'],\n allowedSchemesByTag: {\n a: ['http', 'https', 'mailto', 'tel'],\n img: ['http', 'https', 'data']\n },\n allowedSchemesAppliedToAttributes: ['href', 'src', 'cite', 'srcset'],\n allowProtocolRelative: false,\n disallowedTagsMode: 'discard',\n enforceHtmlBoundary: true,\n parseStyleAttributes: false\n};\n\nexport function resolveSanitizationOptions(options?: SanitizationOptions): ResolvedSanitizationOptions {\n if (!options) {\n return {\n enabled: true,\n args: [],\n slots: ['**'],\n sanitizeHtml: mergeSanitizeHtmlOptions()\n };\n }\n\n const enabled = options.enabled ?? true;\n const args = normalizePathList(options.args, 'framework.options.sanitization.args');\n const slots =\n options.slots === undefined\n ? ['**']\n : normalizePathList(options.slots, 'framework.options.sanitization.slots');\n\n return {\n enabled,\n args,\n slots,\n sanitizeHtml: mergeSanitizeHtmlOptions(options.sanitizeHtml)\n };\n}\n\nexport function sanitizeRenderPayload(\n payload: SanitizationPayload,\n options: ResolvedSanitizationOptions\n): SanitizationPayload {\n if (!options.enabled) {\n return payload;\n }\n\n const sanitizedArgs =\n options.args.length > 0\n ? sanitizeRecord(payload.args, options.args, options.sanitizeHtml)\n : payload.args;\n\n const sanitizedSlots =\n options.slots.length > 0\n ? sanitizeRecord(payload.slots, options.slots, options.sanitizeHtml)\n : payload.slots;\n\n return {\n args: sanitizedArgs,\n slots: sanitizedSlots\n };\n}\n\nexport function serializeSanitizationOptions(options?: SanitizationOptions): string {\n if (!options) {\n return 'undefined';\n }\n\n assertNoFunctions(options.sanitizeHtml, 'framework.options.sanitization.sanitizeHtml');\n\n const state = {\n seen: new WeakSet<object>()\n };\n\n return serializeValue(options, 'framework.options.sanitization', state);\n}\n\nfunction mergeSanitizeHtmlOptions(userOptions?: IOptions): IOptions {\n const merged: IOptions = {\n ...DEFAULT_SANITIZE_HTML_OPTIONS,\n ...userOptions\n };\n\n if (\n isRecord(DEFAULT_SANITIZE_HTML_OPTIONS.allowedAttributes) &&\n isRecord(userOptions?.allowedAttributes)\n ) {\n merged.allowedAttributes = {\n ...DEFAULT_SANITIZE_HTML_OPTIONS.allowedAttributes,\n ...userOptions.allowedAttributes\n };\n }\n\n if (isRecord(userOptions?.allowedClasses)) {\n merged.allowedClasses = {\n ...(isRecord(DEFAULT_SANITIZE_HTML_OPTIONS.allowedClasses)\n ? DEFAULT_SANITIZE_HTML_OPTIONS.allowedClasses\n : {}),\n ...userOptions.allowedClasses\n };\n }\n\n if (isRecord(userOptions?.allowedStyles)) {\n merged.allowedStyles = {\n ...(isRecord(DEFAULT_SANITIZE_HTML_OPTIONS.allowedStyles)\n ? DEFAULT_SANITIZE_HTML_OPTIONS.allowedStyles\n : {}),\n ...userOptions.allowedStyles\n };\n }\n\n return merged;\n}\n\nfunction normalizePathList(value: unknown, path: string): string[] {\n if (value === undefined) {\n return [];\n }\n\n if (!Array.isArray(value)) {\n throw new Error(`${path} must be an array of dot-path patterns.`);\n }\n\n const unique = new Set<string>();\n\n value.forEach((entry, index) => {\n if (typeof entry !== 'string') {\n throw new Error(`${path}[${index}] must be a string.`);\n }\n\n const normalized = entry.trim();\n\n if (!normalized) {\n throw new Error(`${path}[${index}] cannot be an empty string.`);\n }\n\n unique.add(normalized);\n });\n\n return Array.from(unique);\n}\n\nfunction sanitizeRecord(\n record: Record<string, unknown>,\n patterns: string[],\n options: IOptions\n): Record<string, unknown> {\n const sanitized: Record<string, unknown> = {};\n\n Object.entries(record).forEach(([key, value]) => {\n sanitized[key] = sanitizeValue(value, key, patterns, options);\n });\n\n return sanitized;\n}\n\nfunction sanitizeValue(\n value: unknown,\n currentPath: string,\n patterns: string[],\n options: IOptions\n): unknown {\n if (typeof value === 'string') {\n if (shouldSanitizePath(currentPath, patterns)) {\n return sanitizeHtml(value, options);\n }\n\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item, index) => {\n const nextPath = `${currentPath}.${index}`;\n\n return sanitizeValue(item, nextPath, patterns, options);\n });\n }\n\n if (isRecord(value)) {\n const sanitized: Record<string, unknown> = {};\n\n Object.entries(value).forEach(([key, nestedValue]) => {\n const nextPath = `${currentPath}.${key}`;\n\n sanitized[key] = sanitizeValue(nestedValue, nextPath, patterns, options);\n });\n\n return sanitized;\n }\n\n return value;\n}\n\nfunction shouldSanitizePath(path: string, patterns: string[]): boolean {\n return patterns.some((pattern) => matchesPathPattern(path, pattern));\n}\n\nfunction matchesPathPattern(path: string, pattern: string): boolean {\n const pathSegments = path.split('.');\n const patternSegments = pattern.split('.');\n\n return matchSegments(pathSegments, patternSegments);\n}\n\nfunction serializeValue(value: unknown, path: string, state: { seen: WeakSet<object> }): string {\n if (value === null) {\n return 'null';\n }\n\n if (value === undefined) {\n return 'undefined';\n }\n\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return JSON.stringify(value);\n }\n\n if (value instanceof RegExp) {\n return value.toString();\n }\n\n if (Array.isArray(value)) {\n const serializedItems = value.map((item, index) =>\n serializeValue(item, `${path}[${index}]`, state)\n );\n\n return `[${serializedItems.join(', ')}]`;\n }\n\n if (isRecord(value)) {\n if (state.seen.has(value)) {\n throw new Error(`${path} contains a circular reference.`);\n }\n\n state.seen.add(value);\n\n const serializedEntries = Object.entries(value)\n .filter(([, nestedValue]) => nestedValue !== undefined)\n .map(([key, nestedValue]) => {\n const serializedNestedValue = serializeValue(nestedValue, `${path}.${key}`, state);\n\n return `${JSON.stringify(key)}: ${serializedNestedValue}`;\n });\n\n return `{ ${serializedEntries.join(', ')} }`;\n }\n\n throw new Error(\n `${path} contains an unsupported value of type ${typeof value}. ` +\n 'Only plain objects, arrays, primitives, and regular expressions are supported.'\n );\n}\n\nfunction assertNoFunctions(value: unknown, path: string): void {\n const state = {\n seen: new WeakSet<object>()\n };\n\n assertNoFunctionsRecursive(value, path, state);\n}\n\nfunction assertNoFunctionsRecursive(\n value: unknown,\n path: string,\n state: { seen: WeakSet<object> }\n): void {\n if (typeof value === 'function') {\n throw new Error(\n `${path} cannot contain functions. ` +\n 'Function-valued sanitization hooks are not supported in framework options.'\n );\n }\n\n if (Array.isArray(value)) {\n value.forEach((item, index) => {\n assertNoFunctionsRecursive(item, `${path}[${index}]`, state);\n });\n\n return;\n }\n\n if (isRecord(value)) {\n if (state.seen.has(value)) {\n return;\n }\n\n state.seen.add(value);\n\n Object.entries(value).forEach(([key, nestedValue]) => {\n assertNoFunctionsRecursive(nestedValue, `${path}.${key}`, state);\n });\n }\n}\n\nfunction matchSegments(pathSegments: string[], patternSegments: string[]): boolean {\n if (patternSegments.length === 0) {\n return pathSegments.length === 0;\n }\n\n const [patternHead, ...patternTail] = patternSegments;\n\n if (patternHead === '**') {\n if (patternTail.length === 0) {\n return true;\n }\n\n for (let index = 0; index <= pathSegments.length; index += 1) {\n const remainingPath = pathSegments.slice(index);\n\n if (matchSegments(remainingPath, patternTail)) {\n return true;\n }\n }\n\n return false;\n }\n\n if (pathSegments.length === 0) {\n return false;\n }\n\n const [pathHead, ...pathTail] = pathSegments;\n\n if (patternHead === '*' || patternHead === pathHead) {\n return matchSegments(pathTail, patternTail);\n }\n\n return false;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n if (Array.isArray(value) || value instanceof RegExp) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n\n return prototype === Object.prototype || prototype === null;\n}\n","/**\n * Revives Date objects that were lost during JSON serialization.\n *\n * When story args travel over Vite HMR (dev) or HTTP (server mode), Date\n * values are serialized by JSON.stringify into ISO 8601 strings like\n * \"2025-04-12T00:00:00.000Z\". This function walks the args tree and\n * converts those strings back into Date objects so Astro components\n * receive the types they expect.\n *\n * Only the exact format produced by Date.toJSON() is matched\n * (YYYY-MM-DDTHH:mm:ss.sssZ) to minimize false positives.\n */\n\n// Matches the exact output of Date.toJSON() / JSON.stringify(date).\nconst ISO_DATE_PATTERN = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/;\n\nexport function reviveDateStrings(args: Record<string, unknown>): Record<string, unknown> {\n const revived: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(args)) {\n revived[key] = reviveValue(value);\n }\n\n return revived;\n}\n\nfunction reviveValue(value: unknown): unknown {\n if (typeof value === 'string' && ISO_DATE_PATTERN.test(value)) {\n const date = new Date(value);\n\n if (!Number.isNaN(date.getTime())) {\n return date;\n }\n\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map(reviveValue);\n }\n\n if (isRecord(value)) {\n return reviveDateStrings(value);\n }\n\n return value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import { withStoryModuleMocks } from './module-mocks.ts';\nimport { selectStoryRules, withStoryRuleCleanups, type StoryRuleSelection } from './rules.ts';\nimport type { RenderStoryInput } from './types.ts';\n\nexport type ResolveRulesConfigModule = () => unknown | Promise<unknown>;\n\ntype RunWithStoryRulesOptions = {\n story?: RenderStoryInput;\n rulesConfigFilePath?: string;\n resolveRulesConfigModule?: ResolveRulesConfigModule;\n invalidateModuleGraph?: () => void;\n};\n\nexport async function runWithStoryRules<T>(\n options: RunWithStoryRulesOptions,\n callback: (selection: StoryRuleSelection) => Promise<T>\n): Promise<T> {\n const rulesConfigModule = options.resolveRulesConfigModule\n ? await options.resolveRulesConfigModule()\n : undefined;\n const selectedRules = await selectStoryRules({\n configModule: rulesConfigModule,\n configFilePath: options.rulesConfigFilePath,\n story: options.story\n });\n\n if (selectedRules.moduleMocks.size > 0) {\n options.invalidateModuleGraph?.();\n }\n\n return withStoryRuleCleanups(selectedRules.cleanups, async () => {\n return withStoryModuleMocks(selectedRules.moduleMocks, async () => callback(selectedRules));\n });\n}\n","import type { experimental_AstroContainer as AstroContainer } from 'astro/container';\nimport type { SanitizationOptions } from './lib/sanitization.ts';\nimport { resolveSanitizationOptions, sanitizeRenderPayload } from './lib/sanitization.ts';\nimport { reviveDateStrings } from './lib/revive-dates.ts';\nimport { runWithStoryRules, type ResolveRulesConfigModule } from './storyRulesRuntime.ts';\nimport type { RenderStoryInput } from './types.ts';\n\ntype AstroCreateResult = {\n createAstro?: (...args: unknown[]) => unknown;\n};\n\ntype AstroComponentFactory = ((\n result: AstroCreateResult,\n props: unknown,\n slots: unknown\n) => unknown) & {\n isAstroComponentFactory?: boolean;\n moduleId?: string;\n propagation?: unknown;\n};\n\nexport type HandlerProps = {\n component: string;\n args?: Record<string, unknown>;\n slots?: Record<string, unknown>;\n story?: RenderStoryInput;\n};\n\ntype CreateAstroRenderHandlerOptions = {\n container: Awaited<ReturnType<typeof AstroContainer.create>>;\n sanitization?: SanitizationOptions;\n rulesConfigFilePath?: string;\n resolveRulesConfigModule?: ResolveRulesConfigModule;\n loadModule: (id: string) => Promise<{ default: unknown }>;\n invalidateModuleGraph?: () => void;\n};\n\nexport function createAstroRenderHandler(options: CreateAstroRenderHandlerOptions) {\n const sanitizationOptions = resolveSanitizationOptions(options.sanitization);\n const componentCache = new Map<string, Promise<AstroComponentFactory>>();\n let renderQueue = Promise.resolve<void>(undefined);\n\n async function loadPatchedComponent(componentId: string, useCache = true) {\n if (!useCache) {\n const { default: component } = await options.loadModule(componentId);\n\n return patchCreateAstroCompat(component);\n }\n\n if (!componentCache.has(componentId)) {\n componentCache.set(\n componentId,\n (async () => {\n const { default: component } = await options.loadModule(componentId);\n\n return patchCreateAstroCompat(component);\n })()\n );\n }\n\n const cachedComponent = componentCache.get(componentId);\n\n if (!cachedComponent) {\n throw new Error(`Failed to load Astro component: ${componentId}`);\n }\n\n try {\n return await cachedComponent;\n } catch (error) {\n componentCache.delete(componentId);\n throw error;\n }\n }\n\n return async function handler(data: HandlerProps) {\n const executeRender = async () => {\n return runWithStoryRules(\n {\n story: data.story,\n rulesConfigFilePath: options.rulesConfigFilePath,\n resolveRulesConfigModule: options.resolveRulesConfigModule,\n invalidateModuleGraph: options.invalidateModuleGraph\n },\n async (selectedRules) => {\n const patchedComponent = await loadPatchedComponent(\n data.component,\n selectedRules.moduleMocks.size === 0\n );\n const processedArgs = await processImageMetadata(data.args ?? {});\n const revivedArgs = reviveDateStrings(processedArgs);\n const sanitizedPayload = sanitizeRenderPayload(\n {\n args: revivedArgs,\n slots: data.slots ?? {}\n },\n sanitizationOptions\n );\n\n return options.container.renderToString(\n patchedComponent as Parameters<typeof options.container.renderToString>[0],\n {\n props: sanitizedPayload.args,\n slots: sanitizedPayload.slots\n }\n );\n }\n );\n };\n\n const resultPromise = renderQueue.then(executeRender, executeRender);\n\n renderQueue = resultPromise.then(\n () => undefined,\n () => undefined\n );\n\n return resultPromise;\n };\n}\n\nexport function patchCreateAstroCompat(component: unknown): AstroComponentFactory {\n if (typeof component !== 'function') {\n throw new Error('Expected Astro component factory to be a function.');\n }\n\n const originalComponent = component as AstroComponentFactory;\n const wrapped = ((result: AstroCreateResult, props: unknown, slots: unknown) => {\n if (result && typeof result.createAstro === 'function') {\n const originalCreateAstro = result.createAstro;\n const runtimeExpectsAstroGlobal = originalCreateAstro.length >= 3;\n\n result.createAstro = (...args: unknown[]) => {\n if (args.length === 3 && !runtimeExpectsAstroGlobal) {\n return originalCreateAstro(args[1], args[2]);\n }\n\n return originalCreateAstro(...args);\n };\n }\n\n return originalComponent(result, props, slots);\n }) as AstroComponentFactory;\n\n wrapped.isAstroComponentFactory = originalComponent.isAstroComponentFactory;\n wrapped.moduleId = originalComponent.moduleId;\n wrapped.propagation = originalComponent.propagation;\n\n return wrapped;\n}\n\nasync function processImageMetadata(\n args: Record<string, unknown>\n): Promise<Record<string, unknown>> {\n const processed: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(args)) {\n if (isImageMetadata(value)) {\n // Keep ImageMetadata as an object so Astro's image pipeline still\n // recognizes it as an imported image and skips local path validation.\n processed[key] = value;\n\n continue;\n }\n\n if (Array.isArray(value)) {\n processed[key] = await Promise.all(\n value.map(async (item) => {\n if (isImageMetadata(item)) {\n return item;\n }\n\n if (isRecord(item)) {\n return processImageMetadata(item);\n }\n\n return item;\n })\n );\n\n continue;\n }\n\n if (isRecord(value)) {\n processed[key] = await processImageMetadata(value);\n\n continue;\n }\n\n processed[key] = value;\n }\n\n return processed;\n}\n\nfunction isImageMetadata(value: unknown): value is Record<string, unknown> {\n return (\n isRecord(value) &&\n typeof value.src === 'string' &&\n ('width' in value || 'height' in value || 'format' in value)\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n","import { access } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { parse } from 'tsconfck';\n\n// Islands embedded in `.astro` components are frequently imported through a\n// tsconfig path alias (e.g. `@/components/Counter`). The raw aliased specifier\n// is baked into `<astro-island component-url>` and `import()`d verbatim, so it\n// must be turned into an on-disk path before it can hydrate. This helper is\n// used as a last resort after the existing resolution has already had its\n// chance.\n\nconst ALIAS_EXTS = ['.tsx', '.ts', '.jsx', '.js', '.vue', '.svelte', '.mts', '.mjs'];\n\nasync function isFile(candidate: string): Promise<boolean> {\n try {\n await access(candidate);\n\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Resolves a tsconfig-aliased island specifier (e.g. `@/components/Counter`)\n * to an absolute on-disk file path, or `undefined` when it is not a tsconfig\n * alias or no matching file exists. Already-resolvable specifiers are skipped\n * so this runs only as a genuine last resort.\n */\nexport async function resolveAliasedIsland(\n specifier: string,\n resolveFrom: string\n): Promise<string | undefined> {\n // Skip specifiers the existing resolution can already handle.\n if (\n !specifier ||\n specifier.startsWith('./') ||\n specifier.startsWith('../') ||\n specifier.startsWith('/') ||\n specifier.startsWith('\\0') ||\n specifier.startsWith('virtual:') ||\n specifier.startsWith('astro:') ||\n specifier.startsWith('@astrojs/') ||\n specifier.startsWith('@id/') ||\n specifier.startsWith('/@fs/')\n ) {\n return undefined;\n }\n\n let result;\n\n try {\n result = await parse(resolve(resolveFrom, 'tsconfig.json'));\n } catch {\n return undefined;\n }\n\n const compilerOptions = result.tsconfig?.compilerOptions ?? {};\n const paths: Record<string, string[]> = compilerOptions.paths ?? {};\n\n if (Object.keys(paths).length === 0) {\n return undefined;\n }\n\n // tsconfig paths resolve relative to baseUrl when present, otherwise the\n // tsconfig directory (which tsconfck gives us as the tsconfig file's dir).\n const tsconfigDir = result.tsconfigFile\n ? resolve(result.tsconfigFile, '..')\n : resolveFrom;\n const root = compilerOptions.baseUrl\n ? resolve(tsconfigDir, compilerOptions.baseUrl)\n : tsconfigDir;\n\n for (const [pattern, targets] of Object.entries(paths)) {\n const prefix = pattern.replace(/\\*$/, '');\n\n if (!specifier.startsWith(prefix)) {\n continue;\n }\n\n const rest = specifier.slice(prefix.length);\n\n for (const target of targets) {\n const resolvedTarget = target.replace(/\\*$/, '');\n const base = resolve(root, resolvedTarget, rest);\n const candidates = [base, ...ALIAS_EXTS.map((ext) => `${base}${ext}`)];\n\n for (const candidate of candidates) {\n if (await isFile(candidate)) {\n return candidate.replace(/\\\\/g, '/');\n }\n }\n }\n }\n\n return undefined;\n}\n"],"mappings":";;;;;;;;;AAAO,SAAS,qCAAqC;AACnD,MAAI,CAAC,WAAW,YAAY;AAC1B,IAAC,WAAuC,aAAa,CAAC;AAAA,EACxD;AAEA,EAAC,WAAW,WAAuC,eAAe;AAAA,IAChE,kBAAkB,CAAC,KAAK;AAAA,IACxB,gBAAgB,SAAkC;AAChD,aAAO;AAAA,IACT;AAAA,IACA,OAAO,SAA2B;AAChC,YAAM,MAAM,QAAQ;AAEpB,UACE,OAAO,QACP,OAAO,QAAQ,YACf,SAAS,OACT,OAAQ,IAAgC,QAAQ,UAChD;AACA,eAAQ,IAAgC;AAAA,MAC1C;AAEA,aAAO,OAAO,QAAQ,WAAW,MAAM;AAAA,IACzC;AAAA,IACA,kBAAkB,SAAkC;AAClD,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAG;AAAA,MACL,IAAI;AACJ,YAAM,YACJ,OAAO,QAAQ,OAAO,QAAQ,WAAY,MAAkC;AAE9E,aAAO;AAAA,QACL,GAAG;AAAA,QACH,OAAO,SAAS,WAAW;AAAA,QAC3B,QAAQ,UAAU,WAAW;AAAA,QAC7B,SAAU,MAAM,WAAkC;AAAA,QAClD,UAAW,MAAM,YAAmC;AAAA,MACtD;AAAA,IACF;AAAA,IACA,YAAY;AACV,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AACF;;;ACxDA,OAAO,kBAAkB;AAsBzB,IAAM,gCAA0C;AAAA,EAC9C,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,mBAAmB;AAAA,IACjB,KAAK;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,GAAG,CAAC,QAAQ,QAAQ,UAAU,KAAK;AAAA,IACnC,KAAK,CAAC,OAAO,UAAU,OAAO,SAAS,SAAS,UAAU,WAAW,UAAU;AAAA,IAC/E,IAAI,CAAC,WAAW,SAAS;AAAA,IACzB,IAAI,CAAC,WAAW,WAAW,OAAO;AAAA,IAClC,MAAM,CAAC,UAAU;AAAA,EACnB;AAAA,EACA,gBAAgB,CAAC,QAAQ,SAAS,UAAU,OAAO,MAAM;AAAA,EACzD,qBAAqB;AAAA,IACnB,GAAG,CAAC,QAAQ,SAAS,UAAU,KAAK;AAAA,IACpC,KAAK,CAAC,QAAQ,SAAS,MAAM;AAAA,EAC/B;AAAA,EACA,mCAAmC,CAAC,QAAQ,OAAO,QAAQ,QAAQ;AAAA,EACnE,uBAAuB;AAAA,EACvB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,sBAAsB;AACxB;AAEO,SAAS,2BAA2B,SAA4D;AACrG,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM,CAAC;AAAA,MACP,OAAO,CAAC,IAAI;AAAA,MACZ,cAAc,yBAAyB;AAAA,IACzC;AAAA,EACF;AAEA,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,OAAO,kBAAkB,QAAQ,MAAM,qCAAqC;AAClF,QAAM,QACJ,QAAQ,UAAU,SACd,CAAC,IAAI,IACL,kBAAkB,QAAQ,OAAO,sCAAsC;AAE7E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,yBAAyB,QAAQ,YAAY;AAAA,EAC7D;AACF;AAEO,SAAS,sBACd,SACA,SACqB;AACrB,MAAI,CAAC,QAAQ,SAAS;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,gBACJ,QAAQ,KAAK,SAAS,IAClB,eAAe,QAAQ,MAAM,QAAQ,MAAM,QAAQ,YAAY,IAC/D,QAAQ;AAEd,QAAM,iBACJ,QAAQ,MAAM,SAAS,IACnB,eAAe,QAAQ,OAAO,QAAQ,OAAO,QAAQ,YAAY,IACjE,QAAQ;AAEd,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AACF;AAEO,SAAS,6BAA6B,SAAuC;AAClF,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,oBAAkB,QAAQ,cAAc,6CAA6C;AAErF,QAAM,QAAQ;AAAA,IACZ,MAAM,oBAAI,QAAgB;AAAA,EAC5B;AAEA,SAAO,eAAe,SAAS,kCAAkC,KAAK;AACxE;AAEA,SAAS,yBAAyB,aAAkC;AAClE,QAAM,SAAmB;AAAA,IACvB,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAEA,MACE,SAAS,8BAA8B,iBAAiB,KACxD,SAAS,aAAa,iBAAiB,GACvC;AACA,WAAO,oBAAoB;AAAA,MACzB,GAAG,8BAA8B;AAAA,MACjC,GAAG,YAAY;AAAA,IACjB;AAAA,EACF;AAEA,MAAI,SAAS,aAAa,cAAc,GAAG;AACzC,WAAO,iBAAiB;AAAA,MACtB,GAAI,SAAS,8BAA8B,cAAc,IACrD,8BAA8B,iBAC9B,CAAC;AAAA,MACL,GAAG,YAAY;AAAA,IACjB;AAAA,EACF;AAEA,MAAI,SAAS,aAAa,aAAa,GAAG;AACxC,WAAO,gBAAgB;AAAA,MACrB,GAAI,SAAS,8BAA8B,aAAa,IACpD,8BAA8B,gBAC9B,CAAC;AAAA,MACL,GAAG,YAAY;AAAA,IACjB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAgB,MAAwB;AACjE,MAAI,UAAU,QAAW;AACvB,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,UAAM,IAAI,MAAM,GAAG,IAAI,yCAAyC;AAAA,EAClE;AAEA,QAAM,SAAS,oBAAI,IAAY;AAE/B,QAAM,QAAQ,CAAC,OAAO,UAAU;AAC9B,QAAI,OAAO,UAAU,UAAU;AAC7B,YAAM,IAAI,MAAM,GAAG,IAAI,IAAI,KAAK,qBAAqB;AAAA,IACvD;AAEA,UAAM,aAAa,MAAM,KAAK;AAE9B,QAAI,CAAC,YAAY;AACf,YAAM,IAAI,MAAM,GAAG,IAAI,IAAI,KAAK,8BAA8B;AAAA,IAChE;AAEA,WAAO,IAAI,UAAU;AAAA,EACvB,CAAC;AAED,SAAO,MAAM,KAAK,MAAM;AAC1B;AAEA,SAAS,eACP,QACA,UACA,SACyB;AACzB,QAAM,YAAqC,CAAC;AAE5C,SAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC/C,cAAU,GAAG,IAAI,cAAc,OAAO,KAAK,UAAU,OAAO;AAAA,EAC9D,CAAC;AAED,SAAO;AACT;AAEA,SAAS,cACP,OACA,aACA,UACA,SACS;AACT,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,mBAAmB,aAAa,QAAQ,GAAG;AAC7C,aAAO,aAAa,OAAO,OAAO;AAAA,IACpC;AAEA,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,MAAM,UAAU;AAChC,YAAM,WAAW,GAAG,WAAW,IAAI,KAAK;AAExC,aAAO,cAAc,MAAM,UAAU,UAAU,OAAO;AAAA,IACxD,CAAC;AAAA,EACH;AAEA,MAAI,SAAS,KAAK,GAAG;AACnB,UAAM,YAAqC,CAAC;AAE5C,WAAO,QAAQ,KAAK,EAAE,QAAQ,CAAC,CAAC,KAAK,WAAW,MAAM;AACpD,YAAM,WAAW,GAAG,WAAW,IAAI,GAAG;AAEtC,gBAAU,GAAG,IAAI,cAAc,aAAa,UAAU,UAAU,OAAO;AAAA,IACzE,CAAC;AAED,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,MAAc,UAA6B;AACrE,SAAO,SAAS,KAAK,CAAC,YAAY,mBAAmB,MAAM,OAAO,CAAC;AACrE;AAEA,SAAS,mBAAmB,MAAc,SAA0B;AAClE,QAAM,eAAe,KAAK,MAAM,GAAG;AACnC,QAAM,kBAAkB,QAAQ,MAAM,GAAG;AAEzC,SAAO,cAAc,cAAc,eAAe;AACpD;AAEA,SAAS,eAAe,OAAgB,MAAc,OAA0C;AAC9F,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW;AACxF,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B;AAEA,MAAI,iBAAiB,QAAQ;AAC3B,WAAO,MAAM,SAAS;AAAA,EACxB;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,kBAAkB,MAAM;AAAA,MAAI,CAAC,MAAM,UACvC,eAAe,MAAM,GAAG,IAAI,IAAI,KAAK,KAAK,KAAK;AAAA,IACjD;AAEA,WAAO,IAAI,gBAAgB,KAAK,IAAI,CAAC;AAAA,EACvC;AAEA,MAAI,SAAS,KAAK,GAAG;AACnB,QAAI,MAAM,KAAK,IAAI,KAAK,GAAG;AACzB,YAAM,IAAI,MAAM,GAAG,IAAI,iCAAiC;AAAA,IAC1D;AAEA,UAAM,KAAK,IAAI,KAAK;AAEpB,UAAM,oBAAoB,OAAO,QAAQ,KAAK,EAC3C,OAAO,CAAC,CAAC,EAAE,WAAW,MAAM,gBAAgB,MAAS,EACrD,IAAI,CAAC,CAAC,KAAK,WAAW,MAAM;AAC3B,YAAM,wBAAwB,eAAe,aAAa,GAAG,IAAI,IAAI,GAAG,IAAI,KAAK;AAEjF,aAAO,GAAG,KAAK,UAAU,GAAG,CAAC,KAAK,qBAAqB;AAAA,IACzD,CAAC;AAEH,WAAO,KAAK,kBAAkB,KAAK,IAAI,CAAC;AAAA,EAC1C;AAEA,QAAM,IAAI;AAAA,IACR,GAAG,IAAI,0CAA0C,OAAO,KAAK;AAAA,EAE/D;AACF;AAEA,SAAS,kBAAkB,OAAgB,MAAoB;AAC7D,QAAM,QAAQ;AAAA,IACZ,MAAM,oBAAI,QAAgB;AAAA,EAC5B;AAEA,6BAA2B,OAAO,MAAM,KAAK;AAC/C;AAEA,SAAS,2BACP,OACA,MACA,OACM;AACN,MAAI,OAAO,UAAU,YAAY;AAC/B,UAAM,IAAI;AAAA,MACR,GAAG,IAAI;AAAA,IAET;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,QAAQ,CAAC,MAAM,UAAU;AAC7B,iCAA2B,MAAM,GAAG,IAAI,IAAI,KAAK,KAAK,KAAK;AAAA,IAC7D,CAAC;AAED;AAAA,EACF;AAEA,MAAI,SAAS,KAAK,GAAG;AACnB,QAAI,MAAM,KAAK,IAAI,KAAK,GAAG;AACzB;AAAA,IACF;AAEA,UAAM,KAAK,IAAI,KAAK;AAEpB,WAAO,QAAQ,KAAK,EAAE,QAAQ,CAAC,CAAC,KAAK,WAAW,MAAM;AACpD,iCAA2B,aAAa,GAAG,IAAI,IAAI,GAAG,IAAI,KAAK;AAAA,IACjE,CAAC;AAAA,EACH;AACF;AAEA,SAAS,cAAc,cAAwB,iBAAoC;AACjF,MAAI,gBAAgB,WAAW,GAAG;AAChC,WAAO,aAAa,WAAW;AAAA,EACjC;AAEA,QAAM,CAAC,aAAa,GAAG,WAAW,IAAI;AAEtC,MAAI,gBAAgB,MAAM;AACxB,QAAI,YAAY,WAAW,GAAG;AAC5B,aAAO;AAAA,IACT;AAEA,aAAS,QAAQ,GAAG,SAAS,aAAa,QAAQ,SAAS,GAAG;AAC5D,YAAM,gBAAgB,aAAa,MAAM,KAAK;AAE9C,UAAI,cAAc,eAAe,WAAW,GAAG;AAC7C,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,UAAU,GAAG,QAAQ,IAAI;AAEhC,MAAI,gBAAgB,OAAO,gBAAgB,UAAU;AACnD,WAAO,cAAc,UAAU,WAAW;AAAA,EAC5C;AAEA,SAAO;AACT;AAEA,SAAS,SAAS,OAAkD;AAClE,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,KAAK,KAAK,iBAAiB,QAAQ;AACnD,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,OAAO,eAAe,KAAK;AAE7C,SAAO,cAAc,OAAO,aAAa,cAAc;AACzD;;;AC3aA,IAAM,mBAAmB;AAElB,SAAS,kBAAkB,MAAwD;AACxF,QAAM,UAAmC,CAAC;AAE1C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,YAAQ,GAAG,IAAI,YAAY,KAAK;AAAA,EAClC;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,OAAyB;AAC5C,MAAI,OAAO,UAAU,YAAY,iBAAiB,KAAK,KAAK,GAAG;AAC7D,UAAM,OAAO,IAAI,KAAK,KAAK;AAE3B,QAAI,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,GAAG;AACjC,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,WAAW;AAAA,EAC9B;AAEA,MAAIA,UAAS,KAAK,GAAG;AACnB,WAAO,kBAAkB,KAAK;AAAA,EAChC;AAEA,SAAO;AACT;AAEA,SAASA,UAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;ACrCA,eAAsB,kBACpB,SACA,UACY;AACZ,QAAM,oBAAoB,QAAQ,2BAC9B,MAAM,QAAQ,yBAAyB,IACvC;AACJ,QAAM,gBAAgB,MAAM,iBAAiB;AAAA,IAC3C,cAAc;AAAA,IACd,gBAAgB,QAAQ;AAAA,IACxB,OAAO,QAAQ;AAAA,EACjB,CAAC;AAED,MAAI,cAAc,YAAY,OAAO,GAAG;AACtC,YAAQ,wBAAwB;AAAA,EAClC;AAEA,SAAO,sBAAsB,cAAc,UAAU,YAAY;AAC/D,WAAO,qBAAqB,cAAc,aAAa,YAAY,SAAS,aAAa,CAAC;AAAA,EAC5F,CAAC;AACH;;;ACIO,SAAS,yBAAyB,SAA0C;AACjF,QAAM,sBAAsB,2BAA2B,QAAQ,YAAY;AAC3E,QAAM,iBAAiB,oBAAI,IAA4C;AACvE,MAAI,cAAc,QAAQ,QAAc,MAAS;AAEjD,iBAAe,qBAAqB,aAAqB,WAAW,MAAM;AACxE,QAAI,CAAC,UAAU;AACb,YAAM,EAAE,SAAS,UAAU,IAAI,MAAM,QAAQ,WAAW,WAAW;AAEnE,aAAO,uBAAuB,SAAS;AAAA,IACzC;AAEA,QAAI,CAAC,eAAe,IAAI,WAAW,GAAG;AACpC,qBAAe;AAAA,QACb;AAAA,SACC,YAAY;AACX,gBAAM,EAAE,SAAS,UAAU,IAAI,MAAM,QAAQ,WAAW,WAAW;AAEnE,iBAAO,uBAAuB,SAAS;AAAA,QACzC,GAAG;AAAA,MACL;AAAA,IACF;AAEA,UAAM,kBAAkB,eAAe,IAAI,WAAW;AAEtD,QAAI,CAAC,iBAAiB;AACpB,YAAM,IAAI,MAAM,mCAAmC,WAAW,EAAE;AAAA,IAClE;AAEA,QAAI;AACF,aAAO,MAAM;AAAA,IACf,SAAS,OAAO;AACd,qBAAe,OAAO,WAAW;AACjC,YAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO,eAAe,QAAQ,MAAoB;AAChD,UAAM,gBAAgB,YAAY;AAChC,aAAO;AAAA,QACL;AAAA,UACE,OAAO,KAAK;AAAA,UACZ,qBAAqB,QAAQ;AAAA,UAC7B,0BAA0B,QAAQ;AAAA,UAClC,uBAAuB,QAAQ;AAAA,QACjC;AAAA,QACA,OAAO,kBAAkB;AACvB,gBAAM,mBAAmB,MAAM;AAAA,YAC7B,KAAK;AAAA,YACL,cAAc,YAAY,SAAS;AAAA,UACrC;AACA,gBAAM,gBAAgB,MAAM,qBAAqB,KAAK,QAAQ,CAAC,CAAC;AAChE,gBAAM,cAAc,kBAAkB,aAAa;AACnD,gBAAM,mBAAmB;AAAA,YACvB;AAAA,cACE,MAAM;AAAA,cACN,OAAO,KAAK,SAAS,CAAC;AAAA,YACxB;AAAA,YACA;AAAA,UACF;AAEA,iBAAO,QAAQ,UAAU;AAAA,YACvB;AAAA,YACA;AAAA,cACE,OAAO,iBAAiB;AAAA,cACxB,OAAO,iBAAiB;AAAA,YAC1B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,gBAAgB,YAAY,KAAK,eAAe,aAAa;AAEnE,kBAAc,cAAc;AAAA,MAC1B,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAEA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,uBAAuB,WAA2C;AAChF,MAAI,OAAO,cAAc,YAAY;AACnC,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AAEA,QAAM,oBAAoB;AAC1B,QAAM,WAAW,CAAC,QAA2B,OAAgB,UAAmB;AAC9E,QAAI,UAAU,OAAO,OAAO,gBAAgB,YAAY;AACtD,YAAM,sBAAsB,OAAO;AACnC,YAAM,4BAA4B,oBAAoB,UAAU;AAEhE,aAAO,cAAc,IAAI,SAAoB;AAC3C,YAAI,KAAK,WAAW,KAAK,CAAC,2BAA2B;AACnD,iBAAO,oBAAoB,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AAAA,QAC7C;AAEA,eAAO,oBAAoB,GAAG,IAAI;AAAA,MACpC;AAAA,IACF;AAEA,WAAO,kBAAkB,QAAQ,OAAO,KAAK;AAAA,EAC/C;AAEA,UAAQ,0BAA0B,kBAAkB;AACpD,UAAQ,WAAW,kBAAkB;AACrC,UAAQ,cAAc,kBAAkB;AAExC,SAAO;AACT;AAEA,eAAe,qBACb,MACkC;AAClC,QAAM,YAAqC,CAAC;AAE5C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,QAAI,gBAAgB,KAAK,GAAG;AAG1B,gBAAU,GAAG,IAAI;AAEjB;AAAA,IACF;AAEA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,gBAAU,GAAG,IAAI,MAAM,QAAQ;AAAA,QAC7B,MAAM,IAAI,OAAO,SAAS;AACxB,cAAI,gBAAgB,IAAI,GAAG;AACzB,mBAAO;AAAA,UACT;AAEA,cAAIC,UAAS,IAAI,GAAG;AAClB,mBAAO,qBAAqB,IAAI;AAAA,UAClC;AAEA,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAEA;AAAA,IACF;AAEA,QAAIA,UAAS,KAAK,GAAG;AACnB,gBAAU,GAAG,IAAI,MAAM,qBAAqB,KAAK;AAEjD;AAAA,IACF;AAEA,cAAU,GAAG,IAAI;AAAA,EACnB;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAkD;AACzE,SACEA,UAAS,KAAK,KACd,OAAO,MAAM,QAAQ,aACpB,WAAW,SAAS,YAAY,SAAS,YAAY;AAE1D;AAEA,SAASA,UAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;;;AC5MA,SAAS,cAAc;AACvB,SAAS,eAAe;AACxB,SAAS,aAAa;AAStB,IAAM,aAAa,CAAC,QAAQ,OAAO,QAAQ,OAAO,QAAQ,WAAW,QAAQ,MAAM;AAEnF,eAAe,OAAO,WAAqC;AACzD,MAAI;AACF,UAAM,OAAO,SAAS;AAEtB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAQA,eAAsB,qBACpB,WACA,aAC6B;AAE7B,MACE,CAAC,aACD,UAAU,WAAW,IAAI,KACzB,UAAU,WAAW,KAAK,KAC1B,UAAU,WAAW,GAAG,KACxB,UAAU,WAAW,IAAI,KACzB,UAAU,WAAW,UAAU,KAC/B,UAAU,WAAW,QAAQ,KAC7B,UAAU,WAAW,WAAW,KAChC,UAAU,WAAW,MAAM,KAC3B,UAAU,WAAW,OAAO,GAC5B;AACA,WAAO;AAAA,EACT;AAEA,MAAI;AAEJ,MAAI;AACF,aAAS,MAAM,MAAM,QAAQ,aAAa,eAAe,CAAC;AAAA,EAC5D,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,OAAO,UAAU,mBAAmB,CAAC;AAC7D,QAAM,QAAkC,gBAAgB,SAAS,CAAC;AAElE,MAAI,OAAO,KAAK,KAAK,EAAE,WAAW,GAAG;AACnC,WAAO;AAAA,EACT;AAIA,QAAM,cAAc,OAAO,eACvB,QAAQ,OAAO,cAAc,IAAI,IACjC;AACJ,QAAM,OAAO,gBAAgB,UACzB,QAAQ,aAAa,gBAAgB,OAAO,IAC5C;AAEJ,aAAW,CAAC,SAAS,OAAO,KAAK,OAAO,QAAQ,KAAK,GAAG;AACtD,UAAM,SAAS,QAAQ,QAAQ,OAAO,EAAE;AAExC,QAAI,CAAC,UAAU,WAAW,MAAM,GAAG;AACjC;AAAA,IACF;AAEA,UAAM,OAAO,UAAU,MAAM,OAAO,MAAM;AAE1C,eAAW,UAAU,SAAS;AAC5B,YAAM,iBAAiB,OAAO,QAAQ,OAAO,EAAE;AAC/C,YAAM,OAAO,QAAQ,MAAM,gBAAgB,IAAI;AAC/C,YAAM,aAAa,CAAC,MAAM,GAAG,WAAW,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,GAAG,EAAE,CAAC;AAErE,iBAAW,aAAa,YAAY;AAClC,YAAI,MAAM,OAAO,SAAS,GAAG;AAC3B,iBAAO,UAAU,QAAQ,OAAO,GAAG;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;","names":["isRecord","isRecord"]}
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
import {
|
|
5
5
|
createViteServer,
|
|
6
6
|
ssrLoadModuleWithFsFallback
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-VZXGPM6P.js";
|
|
8
8
|
|
|
9
9
|
// src/testing/renderer-daemon.ts
|
|
10
10
|
import { createServer as createHttpServer } from "http";
|
|
@@ -217,4 +217,4 @@ export {
|
|
|
217
217
|
startTestingRendererDaemon,
|
|
218
218
|
renderViaTestingRendererDaemon
|
|
219
219
|
};
|
|
220
|
-
//# sourceMappingURL=chunk-
|
|
220
|
+
//# sourceMappingURL=chunk-BV6V2Z4X.js.map
|
|
@@ -594,7 +594,8 @@ async function vitePluginStorybookAstroMiddleware(options) {
|
|
|
594
594
|
},
|
|
595
595
|
loadModule: (id) => ssrLoadModuleWithFsFallback(viteServer, id, {
|
|
596
596
|
fixStacktrace: true
|
|
597
|
-
})
|
|
597
|
+
}),
|
|
598
|
+
resolveFrom
|
|
598
599
|
});
|
|
599
600
|
let handlerPromise = createHandler();
|
|
600
601
|
const resetHandler = () => {
|
|
@@ -755,4 +756,4 @@ export {
|
|
|
755
756
|
vitePluginStorybookAstroMiddleware,
|
|
756
757
|
createViteServer
|
|
757
758
|
};
|
|
758
|
-
//# sourceMappingURL=chunk-
|
|
759
|
+
//# sourceMappingURL=chunk-VZXGPM6P.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/viteStorybookAstroMiddlewarePlugin.ts","../src/vite/virtualModulePlugin.ts","../src/viteAstroContainerRenderersPlugin.ts","../src/vitePluginAstroFonts.ts","../src/vitePluginAstroIntegrationOptsFallback.ts","../src/vitePluginAstroVueFallback.ts","../src/vitePluginAstroRoutesFallback.ts","../src/vitePluginStoryModuleMocks.ts","../src/lib/ssr-load-module-with-fs-fallback.ts","../src/rules-options.ts","../src/loadUserAstroConfig.ts"],"sourcesContent":["import { createRequire } from 'node:module';\nimport { fileURLToPath } from 'node:url';\nimport type { ServerResponse } from 'node:http';\nimport { createServer, createLogger, type Connect, type PluginOption, type ViteDevServer } from 'vite';\nimport type { RenderRequestMessage, RenderResponseMessage } from '@storybook-astro/renderer/types';\nimport type { FrameworkOptions } from './types.ts';\nimport type { Integration } from './integrations/index.ts';\nimport { importAstroConfig } from './importAstroConfig.ts';\nimport { viteAstroContainerRenderersPlugin } from './viteAstroContainerRenderersPlugin.ts';\nimport { vitePluginAstroFonts } from './vitePluginAstroFonts.ts';\nimport { vitePluginAstroIntegrationOptsFallback } from './vitePluginAstroIntegrationOptsFallback.ts';\nimport { vitePluginAstroVueFallback } from './vitePluginAstroVueFallback.ts';\nimport { vitePluginAstroRoutesFallback } from './vitePluginAstroRoutesFallback.ts';\nimport { vitePluginStoryModuleMocks } from './vitePluginStoryModuleMocks.ts';\nimport { ssrLoadModuleWithFsFallback } from './lib/ssr-load-module-with-fs-fallback.ts';\nimport { resolveRulesConfigFilePath } from './rules-options.ts';\nimport { loadUserAstroIntegrations } from './loadUserAstroConfig.ts';\n\nexport async function vitePluginStorybookAstroMiddleware(options: FrameworkOptions) {\n // The internal Vite server is created lazily inside configureServer (dev-only).\n // During builds, configureServer never fires, so no server is created.\n let viteServer: ViteDevServer | null = null;\n\n const resolveFrom = options.resolveFrom ?? process.cwd();\n\n const vitePlugin = {\n name: 'storybook-astro-middleware-plugin',\n async configureServer(server) {\n viteServer = await createViteServer(options.integrations ?? [], resolveFrom, options.fonts);\n const storyRulesConfigFilePath = resolveRulesConfigFilePath(options.storyRules, resolveFrom);\n\n const filePath = fileURLToPath(new URL('./middleware', import.meta.url));\n const middleware = await viteServer.ssrLoadModule(filePath, {\n fixStacktrace: true\n });\n\n const createHandler = () => middleware.handlerFactory(options.integrations ?? [], {\n sanitization: options.sanitization,\n rulesConfigFilePath: storyRulesConfigFilePath,\n resolveRulesConfigModule: () =>\n loadRulesConfigModule(viteServer!, storyRulesConfigFilePath),\n invalidateModuleGraph: () => {\n viteServer?.moduleGraph.invalidateAll();\n },\n loadModule: (id: string) =>\n ssrLoadModuleWithFsFallback(viteServer!, id, {\n fixStacktrace: true\n }),\n resolveFrom\n });\n\n let handlerPromise = createHandler();\n\n const resetHandler = () => {\n handlerPromise = createHandler();\n };\n\n server.watcher.on('add', resetHandler);\n server.watcher.on('change', resetHandler);\n server.watcher.on('unlink', resetHandler);\n viteServer.watcher.on('add', resetHandler);\n viteServer.watcher.on('change', resetHandler);\n viteServer.watcher.on('unlink', resetHandler);\n\n server.ws.on('astro:render:request', async (data: RenderRequestMessage['data']) => {\n try {\n const handler = await handlerPromise;\n const html = await handler(data);\n\n server.ws.send('astro:render:response', {\n html,\n id: data.id\n } satisfies RenderResponseMessage['data']);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n const errorStack = err instanceof Error ? err.stack : '';\n\n console.error('[storybook-astro] Render error:', errorMessage);\n if (errorStack) {console.error(errorStack);}\n server.ws.send('astro:render:response', {\n id: data.id,\n html:\n '<div style=\"background: #d73838; padding: 12px; color: #f0f0f0; font-family: monospace; border-radius: 4px\">' +\n '<strong>Error rendering Astro component</strong><br/>' +\n '<pre style=\"white-space: pre-wrap; margin-top: 8px; font-size: 12px\">' +\n errorMessage.replace(/</g, '<').replace(/>/g, '>') +\n '</pre></div>'\n } satisfies RenderResponseMessage['data']);\n }\n });\n }\n } satisfies PluginOption;\n\n // Create asset serving plugin (only active in dev when viteServer exists)\n const assetServingPlugin = {\n name: 'storybook-astro-assets',\n configureServer(server: ViteDevServer) {\n server.middlewares.use('/_image', (req: Connect.IncomingMessage, res: ServerResponse, next: Connect.NextFunction) => {\n if (!viteServer) {\n next();\n\n return;\n }\n // Forward the request to the Astro vite server\n viteServer.middlewares.handle(req, res, (err?: unknown) => {\n if (err) {\n console.error('Asset serving error:', err);\n next();\n }\n });\n });\n }\n };\n\n // The extracted CSS plugins from Astro's internal Vite server cause Vue SFC\n // <style> blocks to be double-processed (once by these plugins, once by\n // Storybook's built-in CSS plugins), resulting in PostCSS errors.\n //\n // Solution: Don't extract Astro's CSS plugins. Storybook's built-in CSS\n // plugins handle both Vue styles AND Astro style sub-modules (which are\n // standard CSS imports like `Component.astro?astro&type=style&index=0&lang.css`).\n //\n // The Astro internal server's CSS plugins are only needed for SSR rendering\n // within that server - they don't need to be shared with Storybook's server.\n return {\n vitePlugin,\n viteConfig: {\n plugins: [\n assetServingPlugin\n ].filter(Boolean)\n }\n };\n}\n\n/**\n * Creates a Vite logger that silences known benign warnings emitted by Astro's\n * Vite plugin in the SSR server context:\n * - \"Missing pages directory\" — Storybook and test contexts have no src/pages.\n * - \"points to missing source files\" — Sourcemap gaps in the `entities` package.\n */\nfunction createSsrServerLogger() {\n const logger = createLogger();\n const originalWarn = logger.warn.bind(logger);\n\n logger.warn = (msg, options) => {\n if (\n msg.includes('Missing pages directory') ||\n msg.includes('points to missing source files') ||\n msg.includes('Failed to load source map for')\n ) {\n return;\n }\n\n originalWarn(msg, options);\n };\n\n return logger;\n}\n\nexport async function createViteServer(\n integrations: Integration[],\n resolveFrom = process.cwd(),\n fonts?: FrameworkOptions['fonts']\n) {\n const { getViteConfig, passthroughImageService } = await importAstroConfig(resolveFrom);\n const safeIntegrations = integrations ?? [];\n const projectAstroResolutionPlugin = createProjectAstroResolutionPlugin(resolveFrom);\n\n const frameworkIntegrations = await Promise.all(\n safeIntegrations.map((integration) => integration.loadIntegration(resolveFrom))\n );\n\n const userIntegrations = await loadUserAstroIntegrations(resolveFrom);\n const frameworkNames = new Set(frameworkIntegrations.map(i => i.name));\n const extraIntegrations = userIntegrations.filter(i => !frameworkNames.has(i.name));\n\n const config = await getViteConfig(\n { root: resolveFrom },\n {\n configFile: false,\n integrations: [...frameworkIntegrations, ...extraIntegrations],\n // Use the passthrough image service so nested components that use <Image>\n // from astro:assets render as plain <img> tags without triggering image\n // optimization (which fails in the Storybook SSR context).\n image: { service: passthroughImageService() }\n }\n )({ mode: 'development', command: 'serve' });\n\n const viteServer = await createServer({\n configFile: false,\n ...config,\n customLogger: createSsrServerLogger(),\n plugins: [\n projectAstroResolutionPlugin,\n // Fallbacks must come first to intercept before Astro's plugins\n vitePluginAstroFonts({ fonts, root: resolveFrom }),\n vitePluginAstroIntegrationOptsFallback(),\n vitePluginAstroVueFallback(),\n vitePluginAstroRoutesFallback(),\n vitePluginStoryModuleMocks(),\n ...(config.plugins?.filter(Boolean) ?? []),\n viteAstroContainerRenderersPlugin(safeIntegrations)\n ]\n });\n\n // Initialize the server's plugin container to ensure all plugins are ready.\n // Without this, some plugins (like vite:css) may have uninitialized state\n // when ssrLoadModule is called.\n await viteServer.pluginContainer.buildStart({});\n\n return viteServer;\n}\n\nfunction createProjectAstroResolutionPlugin(resolveFrom: string): PluginOption {\n const require = createRequire(import.meta.url);\n\n return {\n name: 'storybook-astro:resolve-project-astro',\n enforce: 'pre',\n resolveId(id: string) {\n if (id !== 'astro' && !id.startsWith('astro/')) {\n return null;\n }\n\n try {\n return require.resolve(id, {\n paths: [resolveFrom]\n });\n } catch {\n return null;\n }\n }\n } satisfies PluginOption;\n}\n\nasync function loadRulesConfigModule(viteServer: ViteDevServer, configFilePath?: string) {\n if (!configFilePath) {\n return undefined;\n }\n\n try {\n return await ssrLoadModuleWithFsFallback(viteServer, configFilePath, {\n fixStacktrace: true\n });\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n\n throw new Error(\n `Unable to load framework.options.storyRules config module at ${configFilePath}: ${reason}`\n );\n }\n}\n","import type { Plugin } from 'vite';\n\ntype CreateVirtualModuleOptions = {\n pluginName: string;\n virtualModuleId: string;\n load: (id: string) => string | Promise<string> | undefined;\n};\n\nexport function createVirtualModule(options: CreateVirtualModuleOptions): Plugin {\n const resolvedVirtualModuleId = `\\0${options.virtualModuleId}`;\n\n return {\n name: options.pluginName,\n resolveId(id) {\n if (id === options.virtualModuleId) {\n return resolvedVirtualModuleId;\n }\n },\n async load(id) {\n if (id === resolvedVirtualModuleId) {\n return options.load(id);\n }\n }\n } satisfies Plugin;\n}\n","import type { Integration } from './integrations/index.ts';\nimport { createVirtualModule } from './vite/virtualModulePlugin.ts';\n\ntype PluginOptions = {\n mode?: 'development' | 'production';\n staticModuleMap?: Record<string, string>;\n};\n\nexport function viteAstroContainerRenderersPlugin(\n integrations: Integration[],\n options: PluginOptions = {}\n) {\n const safeIntegrations = integrations ?? [];\n const mode = options.mode ?? 'development';\n const staticModuleMap = options.staticModuleMap ?? {};\n\n return createVirtualModule({\n pluginName: 'storybook-astro:container-renderers',\n virtualModuleId: 'virtual:astro-container-renderers',\n load() {\n const importStatements = buildImportStatements(safeIntegrations);\n const browserModuleResolverHelpers =\n mode === 'development' ? buildBrowserModuleResolverHelpers() : '';\n const clientModuleEntrypoints =\n mode === 'development' ? buildClientModuleEntrypoints(safeIntegrations) : '[]';\n const clientResolvers =\n mode === 'development'\n ? safeIntegrations\n .filter((integration) => typeof integration.resolveClient === 'function')\n .map((integration) =>\n integration.resolveClient.toString().replace(/^resolveClient/, 'function')\n )\n .join(',\\n')\n : '';\n\n return `\n ${importStatements}\n ${browserModuleResolverHelpers}\n\n export function addRenderers(container) {\n ${safeIntegrations.map((integration) => buildServerRenderer(integration) + '\\n' + buildClientRenderer(integration)).join('\\n')}\n }\n\n const staticClientModules = ${JSON.stringify(staticModuleMap, null, 2)};\n const clientModuleEntrypoints = ${clientModuleEntrypoints};\n\n const clientModulesResolvers = [\n ${clientResolvers}\n ];\n\n export function resolveClientModules(specifier) {\n if (Object.hasOwn(staticClientModules, specifier)) {\n return staticClientModules[specifier];\n }\n\n const normalizedSpecifier = specifier.replace(/\\\\\\\\/g, '/').replace(/\\\\?.*$/, '');\n\n if (Object.hasOwn(staticClientModules, normalizedSpecifier)) {\n return staticClientModules[normalizedSpecifier];\n }\n\n for (const entrypoint of clientModuleEntrypoints) {\n if (normalizedSpecifier === entrypoint || normalizedSpecifier.startsWith(entrypoint)) {\n return storybookAstroResolveBrowserModulePath(normalizedSpecifier);\n }\n }\n\n for (const resolver of clientModulesResolvers) {\n const resolution = resolver(specifier);\n\n if (resolution) {\n return resolution;\n }\n }\n }\n `;\n }\n });\n}\n\nfunction buildClientModuleEntrypoints(integrations: Integration[]) {\n return JSON.stringify(\n Array.from(\n new Set(\n integrations\n .map((integration) => integration.renderer.client?.entrypoint)\n .filter((entrypoint): entrypoint is string => Boolean(entrypoint))\n )\n )\n );\n}\n\nfunction buildBrowserModuleResolverHelpers() {\n return `\n import path from 'node:path';\n import { createRequire } from 'node:module';\n import { pathToFileURL } from 'node:url';\n\n function storybookAstroToFileHref(filePath) {\n return pathToFileURL(filePath).href;\n }\n\n function storybookAstroResolveFrom(moduleName, fromDirectory) {\n const fromFile = path.join(fromDirectory, '__storybook_astro_resolve__.js');\n\n return createRequire(storybookAstroToFileHref(fromFile)).resolve(moduleName);\n }\n\n function storybookAstroResolveFromCandidates(moduleName, primaryDirectory) {\n const directories = [primaryDirectory, process.env.INIT_CWD].filter(Boolean);\n const visited = new Set();\n let lastError;\n\n for (const directory of directories) {\n if (visited.has(directory)) {\n continue;\n }\n\n visited.add(directory);\n\n try {\n return storybookAstroResolveFrom(moduleName, directory);\n } catch (error) {\n lastError = error;\n }\n }\n\n throw lastError;\n }\n\n function storybookAstroResolveBrowserModulePath(moduleName, resolveFrom = process.cwd()) {\n const resolvedPath = storybookAstroResolveFromCandidates(moduleName, resolveFrom).replace(/\\\\\\\\/g, '/');\n\n return '/@fs/' + resolvedPath;\n }\n `;\n}\n\nfunction buildImportStatements(integrations: Integration[]) {\n return integrations\n .filter((integration) => integration.renderer.server)\n .map(\n (integration) =>\n `import ${integration.name}Renderer from '${integration.renderer.server?.entrypoint}';`\n )\n .join('\\n');\n}\n\nfunction buildServerRenderer(integration: Integration) {\n const serverRenderer = integration.renderer.server;\n\n if (!serverRenderer) {\n return '';\n }\n\n if (integration.name === 'solid') {\n return `\n container.addServerRenderer({\n name: '${serverRenderer.name}',\n renderer: {\n ...${integration.name}Renderer,\n name: '${serverRenderer.name}'\n }\n });\n `;\n }\n\n return `\n container.addServerRenderer({\n name: '${serverRenderer.name}',\n renderer: ${integration.name}Renderer\n });\n `;\n}\n\nfunction buildClientRenderer(integration: Integration) {\n const clientRenderer = integration.renderer.client;\n\n if (clientRenderer) {\n return `\n container.addClientRenderer({\n name: '${clientRenderer.name}',\n entrypoint: '${clientRenderer.entrypoint}'\n });\n `;\n }\n\n return '';\n}\n","import { pathToFileURL } from 'node:url';\nimport type { Plugin } from 'vite';\n\n// We avoid a hard import of `astro/assets/fonts/types` here because consumers\n// using older Astro versions without the new fonts API would fail to install.\n// The provider interface we rely on is small and stable enough to type locally.\nexport interface StorybookFontProvider {\n name: string;\n init?: (context: { storage: FontStorage; root: URL }) => Promise<void> | void;\n resolveFont: (options: {\n familyName: string;\n weights: string[];\n styles: string[];\n subsets: string[];\n formats: string[];\n }) => Promise<{ fonts: FontFaceData[] } | undefined> | { fonts: FontFaceData[] } | undefined;\n}\n\nexport interface FontFaceData {\n src: Array<{ url?: string; name?: string; format?: string; tech?: string }>;\n weight?: string | number | [number, number];\n style?: string;\n display?: string;\n unicodeRange?: string[];\n featureSettings?: string;\n variationSettings?: string;\n}\n\nexport interface StorybookFontFamily {\n name: string;\n cssVariable: string;\n provider: StorybookFontProvider;\n weights?: Array<string | number>;\n styles?: string[];\n subsets?: string[];\n formats?: string[];\n fallbacks?: string[];\n display?: string;\n}\n\ninterface FontStorage {\n getItem: <T = unknown>(key: string, init?: () => Promise<T> | T) => Promise<T | null>;\n setItem: (key: string, value: unknown) => Promise<void> | void;\n}\n\ninterface ResolvedFontData {\n componentEntries: Array<[string, { css: string; preloads: never[] }]>;\n fontDataByCssVariable: Record<\n string,\n Array<{\n src: Array<{ url: string; format?: string; tech?: string }>;\n weight?: string;\n style?: string;\n }>\n >;\n}\n\nconst DEFAULTS = {\n weights: ['400'],\n styles: ['normal', 'italic'],\n subsets: ['latin'],\n formats: ['woff2'],\n fallbacks: ['sans-serif']\n} as const;\n\nconst VIRTUAL_INTERNAL_ID = 'virtual:astro:assets/fonts/internal';\nconst VIRTUAL_RUNTIME_ID = 'virtual:astro:assets/fonts/runtime';\nconst VIRTUAL_RUNTIME_RESOLVER_ID = 'virtual:astro:assets/fonts/runtime/font-file-url-resolver';\nconst PACKAGE_RUNTIME_IDS = ['astro/assets/fonts/runtime', 'astro/assets/fonts/runtime.js'];\n\nconst RUNTIME_STUB = `\nexport const fontData = {};\nexport function createGetFontData(fontsMod) {\n return fontsMod?.fontDataByCssVariable ?? {};\n}\nexport const experimental_getFontFileURL = () => undefined;\n`;\n\nconst RESOLVER_STUB = `\nexport const runtimeFontFileUrlResolver = { resolve: () => undefined };\n`;\n\n/**\n * Resolves Astro's font Provider API for Storybook by reading the user's\n * configured font families, calling each provider to produce @font-face data,\n * and emitting CSS through Astro's font virtual modules.\n *\n * Lightweight first cut: generates @font-face declarations and a CSS variable\n * binding to the family name plus fallbacks. Does not handle preload links,\n * Capsize-optimized fallback metrics, or build-time font file emission — those\n * paths fall back to remote URLs returned by the provider directly.\n *\n * If no families are provided, the plugin emits no-op stubs so Astro's\n * font virtual modules still resolve in projects that don't configure fonts.\n */\nexport function vitePluginAstroFonts(\n options: {\n fonts?: StorybookFontFamily[];\n root?: string;\n } = {}\n): Plugin {\n const families = options.fonts ?? [];\n const rootDir = options.root ?? process.cwd();\n const root = pathToFileURL(rootDir.endsWith('/') ? rootDir : rootDir + '/');\n\n let resolved: ResolvedFontData | null = null;\n let resolvePromise: Promise<ResolvedFontData> | null = null;\n\n const ensureResolved = async () => {\n if (!resolvePromise) {\n resolvePromise = resolveAllFamilies(families, root);\n }\n\n resolved = await resolvePromise;\n\n return resolved;\n };\n\n return {\n name: 'storybook-astro-fonts',\n enforce: 'pre',\n\n async buildStart() {\n await ensureResolved();\n },\n\n resolveId(id) {\n if (id === VIRTUAL_INTERNAL_ID) {\n return '\\0' + VIRTUAL_INTERNAL_ID;\n }\n if (id === VIRTUAL_RUNTIME_ID) {\n return '\\0' + VIRTUAL_RUNTIME_ID;\n }\n if (id === VIRTUAL_RUNTIME_RESOLVER_ID) {\n return '\\0' + VIRTUAL_RUNTIME_RESOLVER_ID;\n }\n if (PACKAGE_RUNTIME_IDS.includes(id)) {\n return '\\0storybook:astro-fonts-runtime';\n }\n\n return undefined;\n },\n\n async load(id) {\n if (id === '\\0' + VIRTUAL_INTERNAL_ID) {\n const data = resolved ?? (await ensureResolved());\n\n return {\n code:\n `export const componentDataByCssVariable = new Map(${JSON.stringify(data.componentEntries)});\\n` +\n `export const fontDataByCssVariable = ${JSON.stringify(data.fontDataByCssVariable)};\\n`\n };\n }\n if (id === '\\0' + VIRTUAL_RUNTIME_ID || id === '\\0storybook:astro-fonts-runtime') {\n return { code: RUNTIME_STUB };\n }\n if (id === '\\0' + VIRTUAL_RUNTIME_RESOLVER_ID) {\n return { code: RESOLVER_STUB };\n }\n\n return undefined;\n }\n };\n}\n\nasync function resolveAllFamilies(\n families: StorybookFontFamily[],\n root: URL\n): Promise<ResolvedFontData> {\n const componentEntries: ResolvedFontData['componentEntries'] = [];\n const fontDataByCssVariable: ResolvedFontData['fontDataByCssVariable'] = {};\n const storage = createMemoryStorage();\n\n for (const family of families) {\n try {\n if (family.provider.init) {\n await family.provider.init({ storage, root });\n }\n const result = await family.provider.resolveFont({\n familyName: family.name,\n weights: (family.weights ?? DEFAULTS.weights).map(String),\n styles: family.styles ?? [...DEFAULTS.styles],\n subsets: family.subsets ?? [...DEFAULTS.subsets],\n formats: family.formats ?? [...DEFAULTS.formats]\n });\n const faces = result?.fonts ?? [];\n\n if (faces.length === 0) {\n continue;\n }\n\n componentEntries.push([\n family.cssVariable,\n { css: buildFamilyCss(family, faces), preloads: [] }\n ]);\n fontDataByCssVariable[family.cssVariable] = faces.map(toFontData);\n } catch (err) {\n // Swallow per-family errors so one bad family doesn't break the rest.\n // Errors surface as the family simply not rendering, matching Astro's\n // behavior when a provider can't resolve a font.\n console.warn(\n `[storybook-astro-fonts] Failed to resolve font family \"${family.name}\":`,\n err instanceof Error ? err.message : err\n );\n }\n }\n\n return { componentEntries, fontDataByCssVariable };\n}\n\nexport function buildFamilyCss(family: StorybookFontFamily, faces: FontFaceData[]): string {\n const fallbacks = family.fallbacks ?? [...DEFAULTS.fallbacks];\n const familyList = [JSON.stringify(family.name), ...fallbacks].join(', ');\n const faceBlocks = faces.map((face) => buildFontFaceBlock(family, face)).join('\\n');\n const rootRule = `:root { ${family.cssVariable}: ${familyList}; }`;\n\n return `${faceBlocks}\\n${rootRule}`;\n}\n\nfunction buildFontFaceBlock(family: StorybookFontFamily, face: FontFaceData): string {\n const src = face.src\n .map((source) => {\n if (source.url) {\n const format = source.format ? ` format(${JSON.stringify(source.format)})` : '';\n const tech = source.tech ? ` tech(${source.tech})` : '';\n\n return `url(${JSON.stringify(source.url)})${format}${tech}`;\n }\n if (source.name) {\n return `local(${JSON.stringify(source.name)})`;\n }\n\n return '';\n })\n .filter(Boolean)\n .join(', ');\n\n const descriptors: string[] = [\n `font-family: ${JSON.stringify(family.name)};`,\n `src: ${src};`,\n `font-display: ${family.display ?? 'swap'};`\n ];\n\n if (face.weight !== undefined) {\n const weight = Array.isArray(face.weight) ? face.weight.join(' ') : String(face.weight);\n\n descriptors.push(`font-weight: ${weight};`);\n }\n if (face.style) {\n descriptors.push(`font-style: ${face.style};`);\n }\n if (face.unicodeRange?.length) {\n descriptors.push(`unicode-range: ${face.unicodeRange.join(', ')};`);\n }\n if (face.featureSettings) {\n descriptors.push(`font-feature-settings: ${face.featureSettings};`);\n }\n if (face.variationSettings) {\n descriptors.push(`font-variation-settings: ${face.variationSettings};`);\n }\n\n return `@font-face { ${descriptors.join(' ')} }`;\n}\n\nfunction toFontData(face: FontFaceData) {\n return {\n src: face.src\n .filter((source) => source.url)\n .map((source) => ({ url: source.url!, format: source.format, tech: source.tech })),\n weight:\n face.weight !== undefined\n ? Array.isArray(face.weight)\n ? face.weight.join(' ')\n : String(face.weight)\n : undefined,\n style: face.style\n };\n}\n\nfunction createMemoryStorage(): FontStorage {\n const store = new Map<string, unknown>();\n\n return {\n async getItem(key, init) {\n if (store.has(key)) {\n return store.get(key) as never;\n }\n if (init) {\n const value = await init();\n\n store.set(key, value);\n\n return value as never;\n }\n\n return null;\n },\n async setItem(key, value) {\n store.set(key, value);\n }\n };\n}\n","import type { Plugin } from 'vite';\n\nconst OPTS_STUB = 'export default {}';\n\nconst VIRTUAL_IDS = ['astro:react:opts', 'astro:preact:opts'];\n\nexport function vitePluginAstroIntegrationOptsFallback(): Plugin {\n const resolvedIds = new Map(VIRTUAL_IDS.map((id) => [id, `\\0${id}`]));\n const resolvedIdSet = new Set(resolvedIds.values());\n\n return {\n name: 'storybook-astro-integration-opts-fallback',\n enforce: 'pre',\n\n resolveId(id) {\n return resolvedIds.get(id);\n },\n\n load(id) {\n if (resolvedIdSet.has(id)) {\n return { code: OPTS_STUB };\n }\n }\n };\n}\n","import type { Plugin } from 'vite';\n\nconst VUE_APP_STUB = `\nexport const setup = () => {};\n`;\n\n// Different versions of @astrojs/vue use different virtual module names\nconst VIRTUAL_IDS = ['virtual:astro:vue-app', 'virtual:@astrojs/vue/app'];\n\n/**\n * Provides fallback resolution for @astrojs/vue's virtual module\n * in Storybook's SSR Vite server.\n *\n * @astrojs/vue's server.js imports a virtual module to get a setup function\n * for configuring the Vue app instance. The virtual module name varies by version:\n * - v6.0.0-beta.1: \"virtual:astro:vue-app\"\n * - Later versions: \"virtual:@astrojs/vue/app\"\n *\n * The Vite plugin that normally creates this virtual module may not run in\n * Storybook's SSR context, so this plugin stubs it with a no-op setup function\n * (the default behavior when no appEntrypoint is configured).\n */\nexport function vitePluginAstroVueFallback(): Plugin {\n const resolvedIds = new Map(VIRTUAL_IDS.map((id) => [id, '\\0' + id]));\n const resolvedIdSet = new Set(resolvedIds.values());\n\n return {\n name: 'storybook-astro-vue-fallback',\n // Must run before vite:resolve to intercept virtual modules\n // before Vite tries to resolve them as Node package imports\n enforce: 'pre',\n\n resolveId(id) {\n const resolved = resolvedIds.get(id);\n\n if (resolved) {\n return resolved;\n }\n },\n\n load(id) {\n if (resolvedIdSet.has(id)) {\n return { code: VUE_APP_STUB };\n }\n }\n };\n}\n","import type { Plugin } from 'vite';\n\nconst ROUTES_STUB = `\nexport const routes = [];\n`;\n\n/**\n * Provides fallback resolution for Astro's routes virtual module\n * in Storybook's SSR Vite server.\n *\n * In Astro 6, the manifest and app entrypoints import from \"virtual:astro:routes\"\n * to get route data. In Storybook's context, there are no routes, so this plugin\n * stubs the virtual module with an empty routes array.\n */\nexport function vitePluginAstroRoutesFallback(): Plugin {\n const VIRTUAL_ID = 'virtual:astro:routes';\n const RESOLVED_VIRTUAL_ID = '\\0' + VIRTUAL_ID;\n\n return {\n name: 'storybook-astro-routes-fallback',\n // Must run before vite:resolve to intercept virtual modules\n // before Vite tries to resolve them as Node package imports\n enforce: 'pre',\n\n resolveId(id) {\n if (id === VIRTUAL_ID) {\n return RESOLVED_VIRTUAL_ID;\n }\n },\n\n load(id) {\n if (id === RESOLVED_VIRTUAL_ID) {\n return { code: ROUTES_STUB };\n }\n }\n };\n}\n","import type { PluginOption } from 'vite';\nimport {\n loadStoryInlineModule,\n resolveStoryModuleMock,\n STORYBOOK_ASTRO_INLINE_MODULE_PREFIX\n} from './module-mocks.ts';\n\nexport function vitePluginStoryModuleMocks(): PluginOption {\n return {\n name: 'storybook-astro:story-module-mocks',\n enforce: 'pre',\n resolveId(id) {\n if (id.startsWith(STORYBOOK_ASTRO_INLINE_MODULE_PREFIX)) {\n return `\\0${id}`;\n }\n\n const mockedModule = resolveStoryModuleMock(id);\n\n if (mockedModule) {\n return mockedModule;\n }\n\n return null;\n },\n load(id) {\n return loadStoryInlineModule(id);\n }\n } satisfies PluginOption;\n}\n","import type { ViteDevServer } from 'vite';\n\ntype SsrLoadModuleOptions = {\n fixStacktrace?: boolean;\n};\n\nexport async function ssrLoadModuleWithFsFallback<TModule = unknown>(\n viteServer: Pick<ViteDevServer, 'ssrLoadModule'>,\n id: string,\n options?: SsrLoadModuleOptions\n) {\n const ids = [id];\n\n if (id.startsWith('/') && !id.startsWith('/@fs/')) {\n ids.push(`/@fs${id}`);\n }\n\n let lastError: unknown;\n\n for (const candidate of ids) {\n try {\n return await viteServer.ssrLoadModule(candidate, options) as TModule;\n } catch (error) {\n lastError = error;\n }\n }\n\n throw lastError;\n}\n","import { existsSync, statSync } from 'node:fs';\nimport { extname, resolve } from 'node:path';\n\nexport type StoryRulesOptions =\n | string\n | {\n configFile: string;\n };\n\nexport function resolveRulesConfigFilePath(\n options?: StoryRulesOptions,\n resolveFrom = process.cwd()\n): string | undefined {\n if (options === undefined) {\n return undefined;\n }\n\n const configFile = normalizeConfigFileOption(options);\n const resolvedConfigFilePath = resolve(resolveFrom, configFile);\n const normalizedConfigFilePath = resolveConfigFilePath(resolvedConfigFilePath);\n\n if (!normalizedConfigFilePath) {\n throw new Error(\n `framework.options.storyRules config file was not found: ${resolvedConfigFilePath}. ` +\n 'Provide an existing path in framework.options.storyRules.'\n );\n }\n\n return normalizedConfigFilePath;\n}\n\nfunction normalizeConfigFileOption(options: StoryRulesOptions): string {\n const configFile =\n typeof options === 'string'\n ? options\n : typeof options === 'object' && options !== null\n ? options.configFile\n : undefined;\n\n if (typeof configFile !== 'string') {\n throw new Error(\n 'framework.options.storyRules must be either a string path or an object with a string configFile.'\n );\n }\n\n const normalizedConfigFile = configFile.trim();\n\n if (!normalizedConfigFile) {\n throw new Error('framework.options.storyRules config file path cannot be empty.');\n }\n\n return normalizedConfigFile;\n}\n\nfunction resolveConfigFilePath(filePath: string): string | undefined {\n if (existsSync(filePath)) {\n const fileStats = statSync(filePath);\n\n if (fileStats.isFile()) {\n return filePath;\n }\n }\n\n if (extname(filePath)) {\n return undefined;\n }\n\n const extensions = ['.ts', '.mts', '.cts', '.js', '.mjs', '.cjs'];\n\n for (const extension of extensions) {\n const candidateFilePath = `${filePath}${extension}`;\n\n if (existsSync(candidateFilePath)) {\n return candidateFilePath;\n }\n }\n\n for (const extension of extensions) {\n const candidateFilePath = resolve(filePath, `index${extension}`);\n\n if (existsSync(candidateFilePath)) {\n return candidateFilePath;\n }\n }\n\n return undefined;\n}\n","import { loadConfigFromFile } from 'vite';\nimport { existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { AstroIntegration } from 'astro';\n\nconst CONFIG_FILENAMES = [\n 'astro.config.ts',\n 'astro.config.mjs',\n 'astro.config.js',\n 'astro.config.cjs',\n];\n\n/**\n * Loads integrations declared in the user's astro.config.* so that any Vite\n * plugins they register (e.g. astro-icon's virtual:astro-icon resolver) are\n * present in both the main Storybook Vite server and the internal Astro SSR\n * server. Returns an empty array on any failure so the calling code can\n * continue with only the framework-level integrations.\n */\nexport async function loadUserAstroIntegrations(resolveFrom: string): Promise<AstroIntegration[]> {\n const configFile = CONFIG_FILENAMES.find(name => existsSync(resolve(resolveFrom, name)));\n\n if (!configFile) {\n return [];\n }\n\n try {\n const result = await loadConfigFromFile(\n { command: 'serve', mode: 'development' },\n configFile,\n resolveFrom\n );\n\n if (!result?.config) {\n return [];\n }\n\n const config = result.config as { integrations?: unknown };\n const raw = config.integrations;\n\n if (!raw) {\n return [];\n }\n\n // Astro allows nested arrays from conditional spreads (e.g. ...whenX(() => mdx()))\n const flat = (Array.isArray(raw) ? raw : [raw]).flat(Infinity);\n\n return flat.filter(\n (i): i is AstroIntegration => Boolean(i) && typeof i === 'object' && 'name' in i && 'hooks' in i\n );\n } catch (err) {\n console.warn(\n '[storybook-astro] Could not load astro.config to discover integrations:',\n err instanceof Error ? err.message : String(err)\n );\n\n return [];\n }\n}\n"],"mappings":";;;;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAE9B,SAAS,cAAc,oBAAyE;;;ACKzF,SAAS,oBAAoB,SAA6C;AAC/E,QAAM,0BAA0B,KAAK,QAAQ,eAAe;AAE5D,SAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd,UAAU,IAAI;AACZ,UAAI,OAAO,QAAQ,iBAAiB;AAClC,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,MAAM,KAAK,IAAI;AACb,UAAI,OAAO,yBAAyB;AAClC,eAAO,QAAQ,KAAK,EAAE;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACF;;;AChBO,SAAS,kCACd,cACA,UAAyB,CAAC,GAC1B;AACA,QAAM,mBAAmB,gBAAgB,CAAC;AAC1C,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,kBAAkB,QAAQ,mBAAmB,CAAC;AAEpD,SAAO,oBAAoB;AAAA,IACzB,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,OAAO;AACL,YAAM,mBAAmB,sBAAsB,gBAAgB;AAC/D,YAAM,+BACJ,SAAS,gBAAgB,kCAAkC,IAAI;AACjE,YAAM,0BACJ,SAAS,gBAAgB,6BAA6B,gBAAgB,IAAI;AAC5E,YAAM,kBACJ,SAAS,gBACL,iBACG,OAAO,CAAC,gBAAgB,OAAO,YAAY,kBAAkB,UAAU,EACvE;AAAA,QAAI,CAAC,gBACJ,YAAY,cAAc,SAAS,EAAE,QAAQ,kBAAkB,UAAU;AAAA,MAC3E,EACC,KAAK,KAAK,IACb;AAEN,aAAO;AAAA,UACH,gBAAgB;AAAA,UAChB,4BAA4B;AAAA;AAAA;AAAA,YAG1B,iBAAiB,IAAI,CAAC,gBAAgB,oBAAoB,WAAW,IAAI,OAAO,oBAAoB,WAAW,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,sCAGlG,KAAK,UAAU,iBAAiB,MAAM,CAAC,CAAC;AAAA,0CACpC,uBAAuB;AAAA;AAAA;AAAA,YAGrD,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA6BvB;AAAA,EACF,CAAC;AACH;AAEA,SAAS,6BAA6B,cAA6B;AACjE,SAAO,KAAK;AAAA,IACV,MAAM;AAAA,MACJ,IAAI;AAAA,QACF,aACG,IAAI,CAAC,gBAAgB,YAAY,SAAS,QAAQ,UAAU,EAC5D,OAAO,CAAC,eAAqC,QAAQ,UAAU,CAAC;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,oCAAoC;AAC3C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2CT;AAEA,SAAS,sBAAsB,cAA6B;AAC1D,SAAO,aACJ,OAAO,CAAC,gBAAgB,YAAY,SAAS,MAAM,EACnD;AAAA,IACC,CAAC,gBACC,UAAU,YAAY,IAAI,kBAAkB,YAAY,SAAS,QAAQ,UAAU;AAAA,EACvF,EACC,KAAK,IAAI;AACd;AAEA,SAAS,oBAAoB,aAA0B;AACrD,QAAM,iBAAiB,YAAY,SAAS;AAE5C,MAAI,CAAC,gBAAgB;AACnB,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,SAAS,SAAS;AAChC,WAAO;AAAA;AAAA,iBAEM,eAAe,IAAI;AAAA;AAAA,eAErB,YAAY,IAAI;AAAA,mBACZ,eAAe,IAAI;AAAA;AAAA;AAAA;AAAA,EAIpC;AAEA,SAAO;AAAA;AAAA,eAEM,eAAe,IAAI;AAAA,kBAChB,YAAY,IAAI;AAAA;AAAA;AAGlC;AAEA,SAAS,oBAAoB,aAA0B;AACrD,QAAM,iBAAiB,YAAY,SAAS;AAE5C,MAAI,gBAAgB;AAClB,WAAO;AAAA;AAAA,iBAEM,eAAe,IAAI;AAAA,uBACb,eAAe,UAAU;AAAA;AAAA;AAAA,EAG9C;AAEA,SAAO;AACT;;;AC5LA,SAAS,qBAAqB;AAyD9B,IAAM,WAAW;AAAA,EACf,SAAS,CAAC,KAAK;AAAA,EACf,QAAQ,CAAC,UAAU,QAAQ;AAAA,EAC3B,SAAS,CAAC,OAAO;AAAA,EACjB,SAAS,CAAC,OAAO;AAAA,EACjB,WAAW,CAAC,YAAY;AAC1B;AAEA,IAAM,sBAAsB;AAC5B,IAAM,qBAAqB;AAC3B,IAAM,8BAA8B;AACpC,IAAM,sBAAsB,CAAC,8BAA8B,+BAA+B;AAE1F,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQrB,IAAM,gBAAgB;AAAA;AAAA;AAiBf,SAAS,qBACd,UAGI,CAAC,GACG;AACR,QAAM,WAAW,QAAQ,SAAS,CAAC;AACnC,QAAM,UAAU,QAAQ,QAAQ,QAAQ,IAAI;AAC5C,QAAM,OAAO,cAAc,QAAQ,SAAS,GAAG,IAAI,UAAU,UAAU,GAAG;AAE1E,MAAI,WAAoC;AACxC,MAAI,iBAAmD;AAEvD,QAAM,iBAAiB,YAAY;AACjC,QAAI,CAAC,gBAAgB;AACnB,uBAAiB,mBAAmB,UAAU,IAAI;AAAA,IACpD;AAEA,eAAW,MAAM;AAEjB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IAET,MAAM,aAAa;AACjB,YAAM,eAAe;AAAA,IACvB;AAAA,IAEA,UAAU,IAAI;AACZ,UAAI,OAAO,qBAAqB;AAC9B,eAAO,OAAO;AAAA,MAChB;AACA,UAAI,OAAO,oBAAoB;AAC7B,eAAO,OAAO;AAAA,MAChB;AACA,UAAI,OAAO,6BAA6B;AACtC,eAAO,OAAO;AAAA,MAChB;AACA,UAAI,oBAAoB,SAAS,EAAE,GAAG;AACpC,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAAA,IAEA,MAAM,KAAK,IAAI;AACb,UAAI,OAAO,OAAO,qBAAqB;AACrC,cAAM,OAAO,YAAa,MAAM,eAAe;AAE/C,eAAO;AAAA,UACL,MACE,qDAAqD,KAAK,UAAU,KAAK,gBAAgB,CAAC;AAAA,uCAClD,KAAK,UAAU,KAAK,qBAAqB,CAAC;AAAA;AAAA,QACtF;AAAA,MACF;AACA,UAAI,OAAO,OAAO,sBAAsB,OAAO,mCAAmC;AAChF,eAAO,EAAE,MAAM,aAAa;AAAA,MAC9B;AACA,UAAI,OAAO,OAAO,6BAA6B;AAC7C,eAAO,EAAE,MAAM,cAAc;AAAA,MAC/B;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,eAAe,mBACb,UACA,MAC2B;AAC3B,QAAM,mBAAyD,CAAC;AAChE,QAAM,wBAAmE,CAAC;AAC1E,QAAM,UAAU,oBAAoB;AAEpC,aAAW,UAAU,UAAU;AAC7B,QAAI;AACF,UAAI,OAAO,SAAS,MAAM;AACxB,cAAM,OAAO,SAAS,KAAK,EAAE,SAAS,KAAK,CAAC;AAAA,MAC9C;AACA,YAAM,SAAS,MAAM,OAAO,SAAS,YAAY;AAAA,QAC/C,YAAY,OAAO;AAAA,QACnB,UAAU,OAAO,WAAW,SAAS,SAAS,IAAI,MAAM;AAAA,QACxD,QAAQ,OAAO,UAAU,CAAC,GAAG,SAAS,MAAM;AAAA,QAC5C,SAAS,OAAO,WAAW,CAAC,GAAG,SAAS,OAAO;AAAA,QAC/C,SAAS,OAAO,WAAW,CAAC,GAAG,SAAS,OAAO;AAAA,MACjD,CAAC;AACD,YAAM,QAAQ,QAAQ,SAAS,CAAC;AAEhC,UAAI,MAAM,WAAW,GAAG;AACtB;AAAA,MACF;AAEA,uBAAiB,KAAK;AAAA,QACpB,OAAO;AAAA,QACP,EAAE,KAAK,eAAe,QAAQ,KAAK,GAAG,UAAU,CAAC,EAAE;AAAA,MACrD,CAAC;AACD,4BAAsB,OAAO,WAAW,IAAI,MAAM,IAAI,UAAU;AAAA,IAClE,SAAS,KAAK;AAIZ,cAAQ;AAAA,QACN,0DAA0D,OAAO,IAAI;AAAA,QACrE,eAAe,QAAQ,IAAI,UAAU;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,kBAAkB,sBAAsB;AACnD;AAEO,SAAS,eAAe,QAA6B,OAA+B;AACzF,QAAM,YAAY,OAAO,aAAa,CAAC,GAAG,SAAS,SAAS;AAC5D,QAAM,aAAa,CAAC,KAAK,UAAU,OAAO,IAAI,GAAG,GAAG,SAAS,EAAE,KAAK,IAAI;AACxE,QAAM,aAAa,MAAM,IAAI,CAAC,SAAS,mBAAmB,QAAQ,IAAI,CAAC,EAAE,KAAK,IAAI;AAClF,QAAM,WAAW,WAAW,OAAO,WAAW,KAAK,UAAU;AAE7D,SAAO,GAAG,UAAU;AAAA,EAAK,QAAQ;AACnC;AAEA,SAAS,mBAAmB,QAA6B,MAA4B;AACnF,QAAM,MAAM,KAAK,IACd,IAAI,CAAC,WAAW;AACf,QAAI,OAAO,KAAK;AACd,YAAM,SAAS,OAAO,SAAS,WAAW,KAAK,UAAU,OAAO,MAAM,CAAC,MAAM;AAC7E,YAAM,OAAO,OAAO,OAAO,SAAS,OAAO,IAAI,MAAM;AAErD,aAAO,OAAO,KAAK,UAAU,OAAO,GAAG,CAAC,IAAI,MAAM,GAAG,IAAI;AAAA,IAC3D;AACA,QAAI,OAAO,MAAM;AACf,aAAO,SAAS,KAAK,UAAU,OAAO,IAAI,CAAC;AAAA,IAC7C;AAEA,WAAO;AAAA,EACT,CAAC,EACA,OAAO,OAAO,EACd,KAAK,IAAI;AAEZ,QAAM,cAAwB;AAAA,IAC5B,gBAAgB,KAAK,UAAU,OAAO,IAAI,CAAC;AAAA,IAC3C,QAAQ,GAAG;AAAA,IACX,iBAAiB,OAAO,WAAW,MAAM;AAAA,EAC3C;AAEA,MAAI,KAAK,WAAW,QAAW;AAC7B,UAAM,SAAS,MAAM,QAAQ,KAAK,MAAM,IAAI,KAAK,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,MAAM;AAEtF,gBAAY,KAAK,gBAAgB,MAAM,GAAG;AAAA,EAC5C;AACA,MAAI,KAAK,OAAO;AACd,gBAAY,KAAK,eAAe,KAAK,KAAK,GAAG;AAAA,EAC/C;AACA,MAAI,KAAK,cAAc,QAAQ;AAC7B,gBAAY,KAAK,kBAAkB,KAAK,aAAa,KAAK,IAAI,CAAC,GAAG;AAAA,EACpE;AACA,MAAI,KAAK,iBAAiB;AACxB,gBAAY,KAAK,0BAA0B,KAAK,eAAe,GAAG;AAAA,EACpE;AACA,MAAI,KAAK,mBAAmB;AAC1B,gBAAY,KAAK,4BAA4B,KAAK,iBAAiB,GAAG;AAAA,EACxE;AAEA,SAAO,gBAAgB,YAAY,KAAK,GAAG,CAAC;AAC9C;AAEA,SAAS,WAAW,MAAoB;AACtC,SAAO;AAAA,IACL,KAAK,KAAK,IACP,OAAO,CAAC,WAAW,OAAO,GAAG,EAC7B,IAAI,CAAC,YAAY,EAAE,KAAK,OAAO,KAAM,QAAQ,OAAO,QAAQ,MAAM,OAAO,KAAK,EAAE;AAAA,IACnF,QACE,KAAK,WAAW,SACZ,MAAM,QAAQ,KAAK,MAAM,IACvB,KAAK,OAAO,KAAK,GAAG,IACpB,OAAO,KAAK,MAAM,IACpB;AAAA,IACN,OAAO,KAAK;AAAA,EACd;AACF;AAEA,SAAS,sBAAmC;AAC1C,QAAM,QAAQ,oBAAI,IAAqB;AAEvC,SAAO;AAAA,IACL,MAAM,QAAQ,KAAK,MAAM;AACvB,UAAI,MAAM,IAAI,GAAG,GAAG;AAClB,eAAO,MAAM,IAAI,GAAG;AAAA,MACtB;AACA,UAAI,MAAM;AACR,cAAM,QAAQ,MAAM,KAAK;AAEzB,cAAM,IAAI,KAAK,KAAK;AAEpB,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAAA,IACA,MAAM,QAAQ,KAAK,OAAO;AACxB,YAAM,IAAI,KAAK,KAAK;AAAA,IACtB;AAAA,EACF;AACF;;;AC3SA,IAAM,YAAY;AAElB,IAAM,cAAc,CAAC,oBAAoB,mBAAmB;AAErD,SAAS,yCAAiD;AAC/D,QAAM,cAAc,IAAI,IAAI,YAAY,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,EAAE,EAAE,CAAC,CAAC;AACpE,QAAM,gBAAgB,IAAI,IAAI,YAAY,OAAO,CAAC;AAElD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IAET,UAAU,IAAI;AACZ,aAAO,YAAY,IAAI,EAAE;AAAA,IAC3B;AAAA,IAEA,KAAK,IAAI;AACP,UAAI,cAAc,IAAI,EAAE,GAAG;AACzB,eAAO,EAAE,MAAM,UAAU;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF;;;ACtBA,IAAM,eAAe;AAAA;AAAA;AAKrB,IAAMA,eAAc,CAAC,yBAAyB,0BAA0B;AAejE,SAAS,6BAAqC;AACnD,QAAM,cAAc,IAAI,IAAIA,aAAY,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;AACpE,QAAM,gBAAgB,IAAI,IAAI,YAAY,OAAO,CAAC;AAElD,SAAO;AAAA,IACL,MAAM;AAAA;AAAA;AAAA,IAGN,SAAS;AAAA,IAET,UAAU,IAAI;AACZ,YAAM,WAAW,YAAY,IAAI,EAAE;AAEnC,UAAI,UAAU;AACZ,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IAEA,KAAK,IAAI;AACP,UAAI,cAAc,IAAI,EAAE,GAAG;AACzB,eAAO,EAAE,MAAM,aAAa;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AACF;;;AC5CA,IAAM,cAAc;AAAA;AAAA;AAYb,SAAS,gCAAwC;AACtD,QAAM,aAAa;AACnB,QAAM,sBAAsB,OAAO;AAEnC,SAAO;AAAA,IACL,MAAM;AAAA;AAAA;AAAA,IAGN,SAAS;AAAA,IAET,UAAU,IAAI;AACZ,UAAI,OAAO,YAAY;AACrB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IAEA,KAAK,IAAI;AACP,UAAI,OAAO,qBAAqB;AAC9B,eAAO,EAAE,MAAM,YAAY;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AACF;;;AC7BO,SAAS,6BAA2C;AACzD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU,IAAI;AACZ,UAAI,GAAG,WAAW,oCAAoC,GAAG;AACvD,eAAO,KAAK,EAAE;AAAA,MAChB;AAEA,YAAM,eAAe,uBAAuB,EAAE;AAE9C,UAAI,cAAc;AAChB,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAAA,IACA,KAAK,IAAI;AACP,aAAO,sBAAsB,EAAE;AAAA,IACjC;AAAA,EACF;AACF;;;ACtBA,eAAsB,4BACpB,YACA,IACA,SACA;AACA,QAAM,MAAM,CAAC,EAAE;AAEf,MAAI,GAAG,WAAW,GAAG,KAAK,CAAC,GAAG,WAAW,OAAO,GAAG;AACjD,QAAI,KAAK,OAAO,EAAE,EAAE;AAAA,EACtB;AAEA,MAAI;AAEJ,aAAW,aAAa,KAAK;AAC3B,QAAI;AACF,aAAO,MAAM,WAAW,cAAc,WAAW,OAAO;AAAA,IAC1D,SAAS,OAAO;AACd,kBAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM;AACR;;;AC5BA,SAAS,YAAY,gBAAgB;AACrC,SAAS,SAAS,eAAe;AAQ1B,SAAS,2BACd,SACA,cAAc,QAAQ,IAAI,GACN;AACpB,MAAI,YAAY,QAAW;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,0BAA0B,OAAO;AACpD,QAAM,yBAAyB,QAAQ,aAAa,UAAU;AAC9D,QAAM,2BAA2B,sBAAsB,sBAAsB;AAE7E,MAAI,CAAC,0BAA0B;AAC7B,UAAM,IAAI;AAAA,MACR,2DAA2D,sBAAsB;AAAA,IAEnF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,0BAA0B,SAAoC;AACrE,QAAM,aACJ,OAAO,YAAY,WACf,UACA,OAAO,YAAY,YAAY,YAAY,OACzC,QAAQ,aACR;AAER,MAAI,OAAO,eAAe,UAAU;AAClC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,uBAAuB,WAAW,KAAK;AAE7C,MAAI,CAAC,sBAAsB;AACzB,UAAM,IAAI,MAAM,gEAAgE;AAAA,EAClF;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,UAAsC;AACnE,MAAI,WAAW,QAAQ,GAAG;AACxB,UAAM,YAAY,SAAS,QAAQ;AAEnC,QAAI,UAAU,OAAO,GAAG;AACtB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,QAAQ,QAAQ,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,CAAC,OAAO,QAAQ,QAAQ,OAAO,QAAQ,MAAM;AAEhE,aAAW,aAAa,YAAY;AAClC,UAAM,oBAAoB,GAAG,QAAQ,GAAG,SAAS;AAEjD,QAAI,WAAW,iBAAiB,GAAG;AACjC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,aAAW,aAAa,YAAY;AAClC,UAAM,oBAAoB,QAAQ,UAAU,QAAQ,SAAS,EAAE;AAE/D,QAAI,WAAW,iBAAiB,GAAG;AACjC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;;;ACtFA,SAAS,0BAA0B;AACnC,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,WAAAC,gBAAe;AAGxB,IAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AASA,eAAsB,0BAA0B,aAAkD;AAChG,QAAM,aAAa,iBAAiB,KAAK,UAAQD,YAAWC,SAAQ,aAAa,IAAI,CAAC,CAAC;AAEvF,MAAI,CAAC,YAAY;AACf,WAAO,CAAC;AAAA,EACV;AAEA,MAAI;AACF,UAAM,SAAS,MAAM;AAAA,MACnB,EAAE,SAAS,SAAS,MAAM,cAAc;AAAA,MACxC;AAAA,MACA;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ,QAAQ;AACnB,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,SAAS,OAAO;AACtB,UAAM,MAAM,OAAO;AAEnB,QAAI,CAAC,KAAK;AACR,aAAO,CAAC;AAAA,IACV;AAGA,UAAM,QAAQ,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,KAAK,QAAQ;AAE7D,WAAO,KAAK;AAAA,MACV,CAAC,MAA6B,QAAQ,CAAC,KAAK,OAAO,MAAM,YAAY,UAAU,KAAK,WAAW;AAAA,IACjG;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ;AAAA,MACN;AAAA,MACA,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IACjD;AAEA,WAAO,CAAC;AAAA,EACV;AACF;;;AVxCA,eAAsB,mCAAmC,SAA2B;AAGlF,MAAI,aAAmC;AAEvC,QAAM,cAAc,QAAQ,eAAe,QAAQ,IAAI;AAEvD,QAAM,aAAa;AAAA,IACjB,MAAM;AAAA,IACN,MAAM,gBAAgB,QAAQ;AAC5B,mBAAa,MAAM,iBAAiB,QAAQ,gBAAgB,CAAC,GAAG,aAAa,QAAQ,KAAK;AAC1F,YAAM,2BAA2B,2BAA2B,QAAQ,YAAY,WAAW;AAE3F,YAAM,WAAW,cAAc,IAAI,IAAI,gBAAgB,YAAY,GAAG,CAAC;AACvE,YAAM,aAAa,MAAM,WAAW,cAAc,UAAU;AAAA,QAC1D,eAAe;AAAA,MACjB,CAAC;AAED,YAAM,gBAAgB,MAAM,WAAW,eAAe,QAAQ,gBAAgB,CAAC,GAAG;AAAA,QAChF,cAAc,QAAQ;AAAA,QACtB,qBAAqB;AAAA,QACrB,0BAA0B,MACxB,sBAAsB,YAAa,wBAAwB;AAAA,QAC7D,uBAAuB,MAAM;AAC3B,sBAAY,YAAY,cAAc;AAAA,QACxC;AAAA,QACA,YAAY,CAAC,OACX,4BAA4B,YAAa,IAAI;AAAA,UAC3C,eAAe;AAAA,QACjB,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAED,UAAI,iBAAiB,cAAc;AAEnC,YAAM,eAAe,MAAM;AACzB,yBAAiB,cAAc;AAAA,MACjC;AAEA,aAAO,QAAQ,GAAG,OAAO,YAAY;AACrC,aAAO,QAAQ,GAAG,UAAU,YAAY;AACxC,aAAO,QAAQ,GAAG,UAAU,YAAY;AACxC,iBAAW,QAAQ,GAAG,OAAO,YAAY;AACzC,iBAAW,QAAQ,GAAG,UAAU,YAAY;AAC5C,iBAAW,QAAQ,GAAG,UAAU,YAAY;AAE5C,aAAO,GAAG,GAAG,wBAAwB,OAAO,SAAuC;AACjF,YAAI;AACF,gBAAM,UAAU,MAAM;AACtB,gBAAM,OAAO,MAAM,QAAQ,IAAI;AAE/B,iBAAO,GAAG,KAAK,yBAAyB;AAAA,YACtC;AAAA,YACA,IAAI,KAAK;AAAA,UACX,CAAyC;AAAA,QAC3C,SAAS,KAAK;AACZ,gBAAM,eAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AACpE,gBAAM,aAAa,eAAe,QAAQ,IAAI,QAAQ;AAEtD,kBAAQ,MAAM,mCAAmC,YAAY;AAC7D,cAAI,YAAY;AAAC,oBAAQ,MAAM,UAAU;AAAA,UAAE;AAC3C,iBAAO,GAAG,KAAK,yBAAyB;AAAA,YACtC,IAAI,KAAK;AAAA,YACT,MACE,2OAGA,aAAa,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,MAAM,IACvD;AAAA,UACJ,CAAyC;AAAA,QAC3C;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,qBAAqB;AAAA,IACzB,MAAM;AAAA,IACN,gBAAgB,QAAuB;AACrC,aAAO,YAAY,IAAI,WAAW,CAAC,KAA8B,KAAqB,SAA+B;AACnH,YAAI,CAAC,YAAY;AACf,eAAK;AAEL;AAAA,QACF;AAEA,mBAAW,YAAY,OAAO,KAAK,KAAK,CAAC,QAAkB;AACzD,cAAI,KAAK;AACP,oBAAQ,MAAM,wBAAwB,GAAG;AACzC,iBAAK;AAAA,UACP;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF;AAYA,SAAO;AAAA,IACL;AAAA,IACA,YAAY;AAAA,MACV,SAAS;AAAA,QACP;AAAA,MACF,EAAE,OAAO,OAAO;AAAA,IAClB;AAAA,EACF;AACF;AAQA,SAAS,wBAAwB;AAC/B,QAAM,SAAS,aAAa;AAC5B,QAAM,eAAe,OAAO,KAAK,KAAK,MAAM;AAE5C,SAAO,OAAO,CAAC,KAAK,YAAY;AAC9B,QACE,IAAI,SAAS,yBAAyB,KACtC,IAAI,SAAS,gCAAgC,KAC7C,IAAI,SAAS,+BAA+B,GAC5C;AACA;AAAA,IACF;AAEA,iBAAa,KAAK,OAAO;AAAA,EAC3B;AAEA,SAAO;AACT;AAEA,eAAsB,iBACpB,cACA,cAAc,QAAQ,IAAI,GAC1B,OACA;AACA,QAAM,EAAE,eAAe,wBAAwB,IAAI,MAAM,kBAAkB,WAAW;AACtF,QAAM,mBAAmB,gBAAgB,CAAC;AAC1C,QAAM,+BAA+B,mCAAmC,WAAW;AAEnF,QAAM,wBAAwB,MAAM,QAAQ;AAAA,IAC1C,iBAAiB,IAAI,CAAC,gBAAgB,YAAY,gBAAgB,WAAW,CAAC;AAAA,EAChF;AAEA,QAAM,mBAAmB,MAAM,0BAA0B,WAAW;AACpE,QAAM,iBAAiB,IAAI,IAAI,sBAAsB,IAAI,OAAK,EAAE,IAAI,CAAC;AACrE,QAAM,oBAAoB,iBAAiB,OAAO,OAAK,CAAC,eAAe,IAAI,EAAE,IAAI,CAAC;AAElF,QAAM,SAAS,MAAM;AAAA,IACnB,EAAE,MAAM,YAAY;AAAA,IACpB;AAAA,MACE,YAAY;AAAA,MACZ,cAAc,CAAC,GAAG,uBAAuB,GAAG,iBAAiB;AAAA;AAAA;AAAA;AAAA,MAI7D,OAAO,EAAE,SAAS,wBAAwB,EAAE;AAAA,IAC9C;AAAA,EACF,EAAE,EAAE,MAAM,eAAe,SAAS,QAAQ,CAAC;AAE3C,QAAM,aAAa,MAAM,aAAa;AAAA,IACpC,YAAY;AAAA,IACZ,GAAG;AAAA,IACH,cAAc,sBAAsB;AAAA,IACpC,SAAS;AAAA,MACP;AAAA;AAAA,MAEA,qBAAqB,EAAE,OAAO,MAAM,YAAY,CAAC;AAAA,MACjD,uCAAuC;AAAA,MACvC,2BAA2B;AAAA,MAC3B,8BAA8B;AAAA,MAC9B,2BAA2B;AAAA,MAC3B,GAAI,OAAO,SAAS,OAAO,OAAO,KAAK,CAAC;AAAA,MACxC,kCAAkC,gBAAgB;AAAA,IACpD;AAAA,EACF,CAAC;AAKD,QAAM,WAAW,gBAAgB,WAAW,CAAC,CAAC;AAE9C,SAAO;AACT;AAEA,SAAS,mCAAmC,aAAmC;AAC7E,QAAMC,WAAU,cAAc,YAAY,GAAG;AAE7C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU,IAAY;AACpB,UAAI,OAAO,WAAW,CAAC,GAAG,WAAW,QAAQ,GAAG;AAC9C,eAAO;AAAA,MACT;AAEA,UAAI;AACF,eAAOA,SAAQ,QAAQ,IAAI;AAAA,UACzB,OAAO,CAAC,WAAW;AAAA,QACrB,CAAC;AAAA,MACH,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,sBAAsB,YAA2B,gBAAyB;AACvF,MAAI,CAAC,gBAAgB;AACnB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,WAAO,MAAM,4BAA4B,YAAY,gBAAgB;AAAA,MACnE,eAAe;AAAA,IACjB,CAAC;AAAA,EACH,SAAS,OAAO;AACd,UAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAEpE,UAAM,IAAI;AAAA,MACR,gEAAgE,cAAc,KAAK,MAAM;AAAA,IAC3F;AAAA,EACF;AACF;","names":["VIRTUAL_IDS","existsSync","resolve","require"]}
|
package/dist/middleware.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createAstroRenderHandler,
|
|
3
|
-
ensureAstroPassthroughImageService
|
|
4
|
-
|
|
3
|
+
ensureAstroPassthroughImageService,
|
|
4
|
+
resolveAliasedIsland
|
|
5
|
+
} from "./chunk-A4DQ67HA.js";
|
|
5
6
|
import "./chunk-ZIDMHD4S.js";
|
|
6
7
|
import {
|
|
7
8
|
resolveStoryModuleMock
|
|
@@ -31,6 +32,13 @@ async function handlerFactory(_integrations, options) {
|
|
|
31
32
|
if (resolution) {
|
|
32
33
|
return resolution;
|
|
33
34
|
}
|
|
35
|
+
const aliasedIsland = await resolveAliasedIsland(
|
|
36
|
+
specifier,
|
|
37
|
+
options?.resolveFrom ?? process.cwd()
|
|
38
|
+
);
|
|
39
|
+
if (aliasedIsland) {
|
|
40
|
+
return `/@fs/${aliasedIsland}`;
|
|
41
|
+
}
|
|
34
42
|
return specifier;
|
|
35
43
|
}
|
|
36
44
|
});
|
package/dist/middleware.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/middleware.ts"],"sourcesContent":["/// <reference path=\"./virtual.d.ts\" />\n\nimport { pathToFileURL } from 'node:url';\nimport { experimental_AstroContainer as AstroContainer } from 'astro/container';\nimport { ensureAstroPassthroughImageService } from './astroImageService.ts';\nimport { createAstroRenderHandler, type HandlerProps } from './astroRenderHandler.ts';\nimport type { Integration } from './integrations/index.ts';\nimport type { SanitizationOptions } from './lib/sanitization.ts';\nimport { resolveStoryModuleMock } from './module-mocks.ts';\nimport { addRenderers, resolveClientModules } from 'virtual:astro-container-renderers';\n\ntype ResolveRulesConfigModule = () => unknown | Promise<unknown>;\n\ntype HandlerFactoryOptions = {\n sanitization?: SanitizationOptions;\n rulesConfigFilePath?: string;\n resolveRulesConfigModule?: ResolveRulesConfigModule;\n loadModule?: (id: string) => Promise<{ default: unknown }>;\n invalidateModuleGraph?: () => void;\n resolveModule?: (specifier: string) => string | undefined;\n};\n\nexport type { HandlerProps };\n\nexport async function handlerFactory(\n _integrations: Integration[],\n options?: HandlerFactoryOptions\n) {\n ensureAstroPassthroughImageService();\n\n const container = await AstroContainer.create({\n resolve: async (specifier) => {\n const mockedModule = resolveStoryModuleMock(specifier);\n\n if (mockedModule) {\n return mockedModule;\n }\n\n const customResolution = options?.resolveModule?.(specifier);\n\n if (customResolution) {\n return customResolution;\n }\n\n if (specifier.startsWith('astro:scripts')) {\n return `/@id/${specifier}`;\n }\n\n const resolution = resolveClientModules(specifier);\n\n if (resolution) {\n return resolution;\n }\n\n return specifier;\n }\n });\n\n addRenderers(container);\n\n const loadModule =\n options?.loadModule ??\n ((id: string) => {\n const normalizedId = /^[a-zA-Z]:[/\\\\]/.test(id) ? pathToFileURL(id).href : id;\n\n return import(/* @vite-ignore */ normalizedId);\n });\n\n return createAstroRenderHandler({\n container,\n sanitization: options?.sanitization,\n rulesConfigFilePath: options?.rulesConfigFilePath,\n resolveRulesConfigModule: options?.resolveRulesConfigModule,\n loadModule,\n invalidateModuleGraph: options?.invalidateModuleGraph\n });\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/middleware.ts"],"sourcesContent":["/// <reference path=\"./virtual.d.ts\" />\n\nimport { pathToFileURL } from 'node:url';\nimport { experimental_AstroContainer as AstroContainer } from 'astro/container';\nimport { ensureAstroPassthroughImageService } from './astroImageService.ts';\nimport { createAstroRenderHandler, type HandlerProps } from './astroRenderHandler.ts';\nimport type { Integration } from './integrations/index.ts';\nimport type { SanitizationOptions } from './lib/sanitization.ts';\nimport { resolveAliasedIsland } from './lib/resolve-aliased-island.ts';\nimport { resolveStoryModuleMock } from './module-mocks.ts';\nimport { addRenderers, resolveClientModules } from 'virtual:astro-container-renderers';\n\ntype ResolveRulesConfigModule = () => unknown | Promise<unknown>;\n\ntype HandlerFactoryOptions = {\n sanitization?: SanitizationOptions;\n rulesConfigFilePath?: string;\n resolveRulesConfigModule?: ResolveRulesConfigModule;\n loadModule?: (id: string) => Promise<{ default: unknown }>;\n invalidateModuleGraph?: () => void;\n resolveModule?: (specifier: string) => string | undefined;\n resolveFrom?: string;\n};\n\nexport type { HandlerProps };\n\nexport async function handlerFactory(\n _integrations: Integration[],\n options?: HandlerFactoryOptions\n) {\n ensureAstroPassthroughImageService();\n\n const container = await AstroContainer.create({\n resolve: async (specifier) => {\n const mockedModule = resolveStoryModuleMock(specifier);\n\n if (mockedModule) {\n return mockedModule;\n }\n\n const customResolution = options?.resolveModule?.(specifier);\n\n if (customResolution) {\n return customResolution;\n }\n\n if (specifier.startsWith('astro:scripts')) {\n return `/@id/${specifier}`;\n }\n\n const resolution = resolveClientModules(specifier);\n\n if (resolution) {\n return resolution;\n }\n\n // Last resort: an island imported via a tsconfig path alias (e.g. `@/...`)\n // has its raw aliased specifier baked into the island's component-url.\n // Resolve it to an on-disk file and hand back a `/@fs/` URL the dev Vite\n // server can serve so the island still hydrates.\n const aliasedIsland = await resolveAliasedIsland(\n specifier,\n options?.resolveFrom ?? process.cwd()\n );\n\n if (aliasedIsland) {\n return `/@fs/${aliasedIsland}`;\n }\n\n return specifier;\n }\n });\n\n addRenderers(container);\n\n const loadModule =\n options?.loadModule ??\n ((id: string) => {\n const normalizedId = /^[a-zA-Z]:[/\\\\]/.test(id) ? pathToFileURL(id).href : id;\n\n return import(/* @vite-ignore */ normalizedId);\n });\n\n return createAstroRenderHandler({\n container,\n sanitization: options?.sanitization,\n rulesConfigFilePath: options?.rulesConfigFilePath,\n resolveRulesConfigModule: options?.resolveRulesConfigModule,\n loadModule,\n invalidateModuleGraph: options?.invalidateModuleGraph\n });\n}\n"],"mappings":";;;;;;;;;;;;AAEA,SAAS,qBAAqB;AAC9B,SAAS,+BAA+B,sBAAsB;AAO9D,SAAS,cAAc,4BAA4B;AAgBnD,eAAsB,eACpB,eACA,SACA;AACA,qCAAmC;AAEnC,QAAM,YAAY,MAAM,eAAe,OAAO;AAAA,IAC5C,SAAS,OAAO,cAAc;AAC5B,YAAM,eAAe,uBAAuB,SAAS;AAErD,UAAI,cAAc;AAChB,eAAO;AAAA,MACT;AAEA,YAAM,mBAAmB,SAAS,gBAAgB,SAAS;AAE3D,UAAI,kBAAkB;AACpB,eAAO;AAAA,MACT;AAEA,UAAI,UAAU,WAAW,eAAe,GAAG;AACzC,eAAO,QAAQ,SAAS;AAAA,MAC1B;AAEA,YAAM,aAAa,qBAAqB,SAAS;AAEjD,UAAI,YAAY;AACd,eAAO;AAAA,MACT;AAMA,YAAM,gBAAgB,MAAM;AAAA,QAC1B;AAAA,QACA,SAAS,eAAe,QAAQ,IAAI;AAAA,MACtC;AAEA,UAAI,eAAe;AACjB,eAAO,QAAQ,aAAa;AAAA,MAC9B;AAEA,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,eAAa,SAAS;AAEtB,QAAM,aACJ,SAAS,eACR,CAAC,OAAe;AACf,UAAM,eAAe,kBAAkB,KAAK,EAAE,IAAI,cAAc,EAAE,EAAE,OAAO;AAE3E,WAAO;AAAA;AAAA,MAA0B;AAAA;AAAA,EACnC;AAEF,SAAO,yBAAyB;AAAA,IAC9B;AAAA,IACA,cAAc,SAAS;AAAA,IACvB,qBAAqB,SAAS;AAAA,IAC9B,0BAA0B,SAAS;AAAA,IACnC;AAAA,IACA,uBAAuB,SAAS;AAAA,EAClC,CAAC;AACH;","names":[]}
|
package/dist/preset.js
CHANGED
|
@@ -4,9 +4,10 @@ import {
|
|
|
4
4
|
import {
|
|
5
5
|
createAstroRenderHandler,
|
|
6
6
|
ensureAstroPassthroughImageService,
|
|
7
|
+
resolveAliasedIsland,
|
|
7
8
|
resolveSanitizationOptions,
|
|
8
9
|
serializeSanitizationOptions
|
|
9
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-A4DQ67HA.js";
|
|
10
11
|
import {
|
|
11
12
|
createVirtualModule,
|
|
12
13
|
loadUserAstroIntegrations,
|
|
@@ -19,7 +20,7 @@ import {
|
|
|
19
20
|
vitePluginAstroVueFallback,
|
|
20
21
|
vitePluginStoryModuleMocks,
|
|
21
22
|
vitePluginStorybookAstroMiddleware
|
|
22
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-VZXGPM6P.js";
|
|
23
24
|
import {
|
|
24
25
|
importAstroConfig
|
|
25
26
|
} from "./chunk-PUTCAN6X.js";
|
|
@@ -140,7 +141,10 @@ async function emitBuildEntrypoints(options) {
|
|
|
140
141
|
});
|
|
141
142
|
}
|
|
142
143
|
async function emitHydratedComponentEntriesFromAstroFile(options) {
|
|
143
|
-
const hydratedComponentPaths = await collectHydratedComponentPaths(
|
|
144
|
+
const hydratedComponentPaths = await collectHydratedComponentPaths(
|
|
145
|
+
options.astroFilePath,
|
|
146
|
+
options.resolveFrom
|
|
147
|
+
);
|
|
144
148
|
for (const resolvedImportPath of hydratedComponentPaths) {
|
|
145
149
|
if (options.componentEntrypointRefs.has(resolvedImportPath)) {
|
|
146
150
|
continue;
|
|
@@ -153,11 +157,11 @@ async function emitHydratedComponentEntriesFromAstroFile(options) {
|
|
|
153
157
|
options.componentEntrypointRefs.set(resolvedImportPath, fileReferenceId);
|
|
154
158
|
}
|
|
155
159
|
}
|
|
156
|
-
async function collectHydratedComponentPaths(astroFilePath) {
|
|
157
|
-
const
|
|
160
|
+
async function collectHydratedComponentPaths(astroFilePath, resolveFrom) {
|
|
161
|
+
const allImportSpecifiers = await readAllImportSpecifiers(astroFilePath);
|
|
158
162
|
const hydratedComponentPaths = [];
|
|
159
|
-
for (const specifier of
|
|
160
|
-
const resolvedImportPath = await resolveLocalImportPath(astroFilePath, specifier);
|
|
163
|
+
for (const specifier of allImportSpecifiers) {
|
|
164
|
+
const resolvedImportPath = specifier.startsWith(".") ? await resolveLocalImportPath(astroFilePath, specifier) : await resolveAliasedIsland(specifier, resolveFrom);
|
|
161
165
|
if (!resolvedImportPath) {
|
|
162
166
|
continue;
|
|
163
167
|
}
|
|
@@ -333,18 +337,19 @@ async function copyLocalRuntimeDependencies(sourcePath, options, copiedFiles) {
|
|
|
333
337
|
await copyLocalRuntimeDependencies(resolvedDependency, options, copiedFiles);
|
|
334
338
|
}
|
|
335
339
|
}
|
|
336
|
-
|
|
340
|
+
var IMPORT_RE = /(?:import|export)\s+(?:[^'"`]*?\s+from\s+)?['"`]([^'"`]+)['"`]|import\(\s*['"`]([^'"`]+)['"`]\s*\)/g;
|
|
341
|
+
async function readAllImportSpecifiers(filePath) {
|
|
337
342
|
if (!/\.(astro|[cm]?[jt]sx?|vue|svelte)$/.test(filePath)) {
|
|
338
343
|
return [];
|
|
339
344
|
}
|
|
340
345
|
const source = await readFile(filePath, "utf-8");
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
);
|
|
344
|
-
return Array.from(matches, (match) => match[1] ?? match[2]).filter(
|
|
345
|
-
(specifier) => Boolean(specifier) && specifier.startsWith(".")
|
|
346
|
+
return Array.from(source.matchAll(IMPORT_RE), (match) => match[1] ?? match[2]).filter(
|
|
347
|
+
(specifier) => Boolean(specifier)
|
|
346
348
|
);
|
|
347
349
|
}
|
|
350
|
+
async function readLocalImportSpecifiers(filePath) {
|
|
351
|
+
return (await readAllImportSpecifiers(filePath)).filter((s) => s.startsWith("."));
|
|
352
|
+
}
|
|
348
353
|
async function resolveLocalImportPath(importerPath, specifier) {
|
|
349
354
|
const basePath = resolve(dirname(importerPath), specifier);
|
|
350
355
|
const candidates = [
|
|
@@ -472,6 +477,10 @@ async function createProductionAstroContainer(options) {
|
|
|
472
477
|
if (resolution) {
|
|
473
478
|
return resolution;
|
|
474
479
|
}
|
|
480
|
+
const abs = await resolveAliasedIsland(specifier, options.resolveFrom);
|
|
481
|
+
if (abs) {
|
|
482
|
+
return options.resolveClientModule(abs) ?? specifier;
|
|
483
|
+
}
|
|
475
484
|
return specifier;
|
|
476
485
|
}
|
|
477
486
|
});
|
|
@@ -574,7 +583,8 @@ async function createProductionRenderRuntime(options) {
|
|
|
574
583
|
const astroContainer = await createProductionAstroContainer({
|
|
575
584
|
integrations: options.integrations,
|
|
576
585
|
resolveClientModule,
|
|
577
|
-
viteServer
|
|
586
|
+
viteServer,
|
|
587
|
+
resolveFrom: options.resolveFrom
|
|
578
588
|
});
|
|
579
589
|
const loadModule = async (moduleId) => {
|
|
580
590
|
return await viteServer.ssrLoadModule(
|