@storybook-astro/framework 1.6.0-canary.2 → 1.6.0-canary.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -547,7 +547,7 @@ function isRecord3(value) {
547
547
  // src/lib/resolve-aliased-island.ts
548
548
  import { access } from "fs/promises";
549
549
  import { resolve } from "path";
550
- import { parse } from "tsconfck";
550
+ import { getTsconfig } from "get-tsconfig";
551
551
  var ALIAS_EXTS = [".tsx", ".ts", ".jsx", ".js", ".vue", ".svelte", ".mts", ".mjs"];
552
552
  async function isFile(candidate) {
553
553
  try {
@@ -561,18 +561,21 @@ async function resolveAliasedIsland(specifier, resolveFrom) {
561
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
562
  return void 0;
563
563
  }
564
- let result;
564
+ let found;
565
565
  try {
566
- result = await parse(resolve(resolveFrom, "tsconfig.json"));
566
+ found = getTsconfig(resolveFrom);
567
567
  } catch {
568
568
  return void 0;
569
569
  }
570
- const compilerOptions = result.tsconfig?.compilerOptions ?? {};
570
+ if (!found) {
571
+ return void 0;
572
+ }
573
+ const compilerOptions = found.config.compilerOptions ?? {};
571
574
  const paths = compilerOptions.paths ?? {};
572
575
  if (Object.keys(paths).length === 0) {
573
576
  return void 0;
574
577
  }
575
- const tsconfigDir = result.tsconfigFile ? resolve(result.tsconfigFile, "..") : resolveFrom;
578
+ const tsconfigDir = resolve(found.path, "..");
576
579
  const root = compilerOptions.baseUrl ? resolve(tsconfigDir, compilerOptions.baseUrl) : tsconfigDir;
577
580
  for (const [pattern, targets] of Object.entries(paths)) {
578
581
  const prefix = pattern.replace(/\*$/, "");
@@ -601,4 +604,4 @@ export {
601
604
  createAstroRenderHandler,
602
605
  resolveAliasedIsland
603
606
  };
604
- //# sourceMappingURL=chunk-A4DQ67HA.js.map
607
+ //# sourceMappingURL=chunk-RERWLIIN.js.map
@@ -1 +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":"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","names":["isRecord","isRecord"]}
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 { getTsconfig } from 'get-tsconfig';\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 // getTsconfig walks up from `resolveFrom` to the nearest tsconfig and merges\n // `extends` for us. We keep our own (deliberately lenient) path matching\n // below rather than its strict `createPathsMatcher`, which rejects the\n // non-relative-without-baseUrl paths that the Astro/Vite resolver accepts.\n let found;\n\n try {\n found = getTsconfig(resolveFrom);\n } catch {\n // Malformed tsconfig (bad JSON, circular extends). This is a last-resort\n // resolver, so swallow it rather than crash hydration.\n return undefined;\n }\n\n if (!found) {\n return undefined;\n }\n\n const compilerOptions = found.config.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 get-tsconfig reports as `found.path`).\n const tsconfigDir = resolve(found.path, '..');\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":"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","names":["isRecord","isRecord"]}
@@ -2,7 +2,7 @@ import {
2
2
  createAstroRenderHandler,
3
3
  ensureAstroPassthroughImageService,
4
4
  resolveAliasedIsland
5
- } from "./chunk-A4DQ67HA.js";
5
+ } from "./chunk-RERWLIIN.js";
6
6
  import "./chunk-ZIDMHD4S.js";
7
7
  import {
8
8
  resolveStoryModuleMock
package/dist/preset.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  resolveAliasedIsland,
8
8
  resolveSanitizationOptions,
9
9
  serializeSanitizationOptions
10
- } from "./chunk-A4DQ67HA.js";
10
+ } from "./chunk-RERWLIIN.js";
11
11
  import {
12
12
  createVirtualModule,
13
13
  loadUserAstroFonts,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@storybook-astro/framework",
3
- "version": "1.6.0-canary.2",
3
+ "version": "1.6.0-canary.3",
4
4
  "description": "Community-supported Storybook framework for Astro 5 & 6 components",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -145,10 +145,10 @@
145
145
  }
146
146
  },
147
147
  "dependencies": {
148
- "@storybook-astro/renderer": "1.6.0-canary.2",
148
+ "@storybook-astro/renderer": "1.6.0-canary.3",
149
+ "get-tsconfig": "^4.14.0",
149
150
  "hono": "^4.11.12",
150
151
  "sanitize-html": "^2.17.0",
151
- "tsconfck": "^3.1.6",
152
152
  "vite": "^6.4.1 || ^7.0.0 || ^8.0.0"
153
153
  }
154
154
  }
@@ -1,6 +1,6 @@
1
1
  import { access } from 'node:fs/promises';
2
2
  import { resolve } from 'node:path';
3
- import { parse } from 'tsconfck';
3
+ import { getTsconfig } from 'get-tsconfig';
4
4
 
5
5
  // Islands embedded in `.astro` components are frequently imported through a
6
6
  // tsconfig path alias (e.g. `@/components/Counter`). The raw aliased specifier
@@ -47,15 +47,25 @@ export async function resolveAliasedIsland(
47
47
  return undefined;
48
48
  }
49
49
 
50
- let result;
50
+ // getTsconfig walks up from `resolveFrom` to the nearest tsconfig and merges
51
+ // `extends` for us. We keep our own (deliberately lenient) path matching
52
+ // below rather than its strict `createPathsMatcher`, which rejects the
53
+ // non-relative-without-baseUrl paths that the Astro/Vite resolver accepts.
54
+ let found;
51
55
 
52
56
  try {
53
- result = await parse(resolve(resolveFrom, 'tsconfig.json'));
57
+ found = getTsconfig(resolveFrom);
54
58
  } catch {
59
+ // Malformed tsconfig (bad JSON, circular extends). This is a last-resort
60
+ // resolver, so swallow it rather than crash hydration.
55
61
  return undefined;
56
62
  }
57
63
 
58
- const compilerOptions = result.tsconfig?.compilerOptions ?? {};
64
+ if (!found) {
65
+ return undefined;
66
+ }
67
+
68
+ const compilerOptions = found.config.compilerOptions ?? {};
59
69
  const paths: Record<string, string[]> = compilerOptions.paths ?? {};
60
70
 
61
71
  if (Object.keys(paths).length === 0) {
@@ -63,10 +73,8 @@ export async function resolveAliasedIsland(
63
73
  }
64
74
 
65
75
  // tsconfig paths resolve relative to baseUrl when present, otherwise the
66
- // tsconfig directory (which tsconfck gives us as the tsconfig file's dir).
67
- const tsconfigDir = result.tsconfigFile
68
- ? resolve(result.tsconfigFile, '..')
69
- : resolveFrom;
76
+ // tsconfig directory (which get-tsconfig reports as `found.path`).
77
+ const tsconfigDir = resolve(found.path, '..');
70
78
  const root = compilerOptions.baseUrl
71
79
  ? resolve(tsconfigDir, compilerOptions.baseUrl)
72
80
  : tsconfigDir;