@storybook-astro/framework 1.2.0 → 1.3.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.
Files changed (87) hide show
  1. package/dist/{base-IRZo3zgK.d.ts → base-DT67T5pi.d.ts} +1 -0
  2. package/dist/{chunk-T7NWIO5S.js → chunk-2EABPTOY.js} +5 -5
  3. package/dist/{chunk-PJEDXZVN.js → chunk-7YBE4TTI.js} +2 -1
  4. package/dist/chunk-7YBE4TTI.js.map +1 -0
  5. package/dist/{chunk-POHTFYST.js → chunk-AYYMNFI6.js} +104 -6
  6. package/dist/chunk-AYYMNFI6.js.map +1 -0
  7. package/dist/{chunk-OUEDTRBO.js → chunk-B454DGX6.js} +259 -67
  8. package/dist/chunk-B454DGX6.js.map +1 -0
  9. package/dist/chunk-B5HHF6FC.js +116 -0
  10. package/dist/chunk-B5HHF6FC.js.map +1 -0
  11. package/dist/chunk-CU57AJUW.js +1402 -0
  12. package/dist/chunk-CU57AJUW.js.map +1 -0
  13. package/dist/{chunk-DNGQBPT7.js → chunk-PUTCAN6X.js} +5 -2
  14. package/dist/{chunk-DNGQBPT7.js.map → chunk-PUTCAN6X.js.map} +1 -1
  15. package/dist/{chunk-4SWPVM6R.js → chunk-WUTCMEF5.js} +2 -2
  16. package/dist/index.d.ts +17 -7
  17. package/dist/index.js +6 -5
  18. package/dist/index.js.map +1 -1
  19. package/dist/integrations/index.d.ts +2 -1
  20. package/dist/integrations/index.js +1 -1
  21. package/dist/middleware.js +18 -131
  22. package/dist/middleware.js.map +1 -1
  23. package/dist/{types-C-jan6Px.d.ts → preset-BvgHg2of.d.ts} +8 -11
  24. package/dist/preset.d.ts +2 -10
  25. package/dist/preset.js +5 -4
  26. package/dist/renderer/renderer-dev.js +62 -0
  27. package/dist/renderer/renderer-dev.js.map +1 -0
  28. package/dist/renderer/renderer-server.js +92 -0
  29. package/dist/renderer/renderer-server.js.map +1 -0
  30. package/dist/renderer/renderer-static.js +54 -0
  31. package/dist/renderer/renderer-static.js.map +1 -0
  32. package/dist/testing.js +12 -11
  33. package/dist/testing.js.map +1 -1
  34. package/dist/{viteStorybookAstroMiddlewarePlugin-2EFKTECT.js → viteStorybookAstroMiddlewarePlugin-UB6ZLJ4B.js} +4 -3
  35. package/dist/vitest/global-setup.js +6 -5
  36. package/dist/vitest/global-setup.js.map +1 -1
  37. package/dist/vitest/index.d.ts +1 -1
  38. package/dist/vitest/index.js +3 -3
  39. package/package.json +14 -43
  40. package/src/astroImageService.ts +57 -0
  41. package/src/astroRenderHandler.ts +205 -0
  42. package/src/importAstroConfig.ts +1 -1
  43. package/src/index.ts +2 -0
  44. package/src/integrations/alpine.ts +1 -0
  45. package/src/integrations/base.ts +6 -0
  46. package/src/lib/revive-dates.test.ts +106 -0
  47. package/src/lib/revive-dates.ts +51 -0
  48. package/src/middleware.ts +29 -200
  49. package/src/module-mocks.ts +153 -5
  50. package/src/preset.ts +38 -8
  51. package/src/productionRenderRuntime.ts +187 -0
  52. package/src/rules.test.ts +52 -4
  53. package/src/rules.ts +54 -7
  54. package/src/server/index.ts +101 -31
  55. package/src/storyRulesRuntime.ts +34 -0
  56. package/src/storySsrVite.ts +240 -0
  57. package/src/types.ts +0 -9
  58. package/src/virtual.d.ts +17 -3
  59. package/src/vite/{astroFilesVirtualModulePlugin.ts → astroFilesPlugin.ts} +4 -4
  60. package/src/vite/sanitizeConfigPlugin.ts +18 -0
  61. package/src/vite/{storybookAstroServerAuthConfigVirtualModulePlugin.test.ts → serverAuthPlugin.test.ts} +7 -10
  62. package/src/vite/{storybookAstroServerAuthConfigVirtualModulePlugin.ts → serverAuthPlugin.ts} +6 -9
  63. package/src/vite/serverRuntimePlugin.ts +109 -0
  64. package/src/vite/{storybookAstroRulesConfigVirtualModulePlugin.ts → storyRulesPlugin.ts} +6 -7
  65. package/src/vite/{createVirtualModulePlugin.test.ts → virtualModulePlugin.test.ts} +5 -5
  66. package/src/vite/{createVirtualModulePlugin.ts → virtualModulePlugin.ts} +2 -2
  67. package/src/viteAstroContainerRenderersPlugin.ts +72 -2
  68. package/src/vitePluginAstroBuildPrerender.ts +75 -646
  69. package/src/vitePluginAstroBuildServer.ts +217 -165
  70. package/src/vitePluginAstroBuildShared.test.ts +87 -0
  71. package/src/vitePluginAstroBuildShared.ts +465 -0
  72. package/src/vitePluginStoryModuleMocks.ts +29 -0
  73. package/src/viteStorybookAstroMiddlewarePlugin.ts +8 -0
  74. package/src/viteStorybookAstroRendererPlugin.ts +13 -6
  75. package/src/viteStorybookRendererFallbackPlugin.ts +2 -2
  76. package/dist/chunk-OUEDTRBO.js.map +0 -1
  77. package/dist/chunk-PBISP7PA.js +0 -1137
  78. package/dist/chunk-PBISP7PA.js.map +0 -1
  79. package/dist/chunk-PJEDXZVN.js.map +0 -1
  80. package/dist/chunk-POHTFYST.js.map +0 -1
  81. package/dist/node/index.d.ts +0 -10
  82. package/dist/node/index.js +0 -10
  83. package/dist/node/index.js.map +0 -1
  84. package/src/vite/storybookAstroSanitizationConfigVirtualModulePlugin.ts +0 -21
  85. /package/dist/{chunk-T7NWIO5S.js.map → chunk-2EABPTOY.js.map} +0 -0
  86. /package/dist/{chunk-4SWPVM6R.js.map → chunk-WUTCMEF5.js.map} +0 -0
  87. /package/dist/{viteStorybookAstroMiddlewarePlugin-2EFKTECT.js.map → viteStorybookAstroMiddlewarePlugin-UB6ZLJ4B.js.map} +0 -0
@@ -1,3 +1,9 @@
1
+ import {
2
+ createInlineStoryModuleMock,
3
+ createPathStoryModuleMock,
4
+ withStoryModuleMocks
5
+ } from "./chunk-B5HHF6FC.js";
6
+
1
7
  // src/rules.ts
2
8
  import { dirname, isAbsolute, resolve } from "path";
3
9
  function defineStoryRules(config) {
@@ -13,17 +19,36 @@ async function selectStoryRules(input) {
13
19
  }
14
20
  const uses = Array.isArray(rule.use) ? rule.use : [rule.use];
15
21
  for (const use of uses) {
22
+ const pendingModuleMocks = [];
16
23
  if (typeof use !== "function") {
17
24
  throw new Error('Each story rule "use" entry must be a function.');
18
25
  }
19
26
  const cleanup = await use({
20
27
  story,
21
- mock: (specifier, replacement) => {
28
+ mock: ((specifier, replacementOrFactory) => {
22
29
  const normalizedSpecifier = normalizeMockSpecifier(specifier);
23
- const normalizedReplacement = normalizeMockReplacement(replacement, input.configFilePath);
24
- selection.moduleMocks.set(normalizedSpecifier, normalizedReplacement);
25
- }
30
+ if (typeof replacementOrFactory === "function") {
31
+ pendingModuleMocks.push(
32
+ Promise.resolve(replacementOrFactory()).then((exportsObject) => {
33
+ selection.moduleMocks.set(
34
+ normalizedSpecifier,
35
+ createInlineStoryModuleMock(normalizeMockFactoryResult(exportsObject))
36
+ );
37
+ return void 0;
38
+ })
39
+ );
40
+ return;
41
+ }
42
+ const normalizedReplacement = normalizeMockReplacement(
43
+ replacementOrFactory,
44
+ input.configFilePath
45
+ );
46
+ selection.moduleMocks.set(normalizedSpecifier, createPathStoryModuleMock(normalizedReplacement));
47
+ })
26
48
  });
49
+ if (pendingModuleMocks.length > 0) {
50
+ await Promise.all(pendingModuleMocks);
51
+ }
27
52
  if (cleanup !== void 0) {
28
53
  if (typeof cleanup !== "function") {
29
54
  throw new Error('Story rule "use" must return either nothing or a cleanup function.');
@@ -210,6 +235,12 @@ function normalizeMockReplacement(value, configFilePath) {
210
235
  }
211
236
  return normalizedValue;
212
237
  }
238
+ function normalizeMockFactoryResult(value) {
239
+ if (!isRecord(value)) {
240
+ throw new Error("Story rule mock factory must return an object of module exports.");
241
+ }
242
+ return value;
243
+ }
213
244
  function slugify(input) {
214
245
  return input.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
215
246
  }
@@ -232,55 +263,6 @@ function isRecord(value) {
232
263
  return !Array.isArray(value);
233
264
  }
234
265
 
235
- // src/lib/passthrough-image-service.ts
236
- function installPassthroughImageService() {
237
- if (!globalThis.astroAsset) {
238
- globalThis.astroAsset = {};
239
- }
240
- globalThis.astroAsset.imageService = {
241
- propertiesToHash: ["src"],
242
- validateOptions(options) {
243
- return options;
244
- },
245
- getURL(options) {
246
- const src = options.src;
247
- if (src != null && typeof src === "object" && "src" in src && typeof src.src === "string") {
248
- return src.src;
249
- }
250
- return typeof src === "string" ? src : "";
251
- },
252
- getHTMLAttributes(options) {
253
- const {
254
- src,
255
- width,
256
- height,
257
- format: _format,
258
- quality: _quality,
259
- densities: _densities,
260
- widths: _widths,
261
- formats: _formats,
262
- layout: _layout,
263
- priority: _priority,
264
- fit: _fit,
265
- position: _position,
266
- background: _background,
267
- ...attrs
268
- } = options;
269
- const srcObj = src != null && typeof src === "object" ? src : null;
270
- return {
271
- ...attrs,
272
- width: width ?? srcObj?.width,
273
- height: height ?? srcObj?.height,
274
- loading: attrs.loading ?? "lazy",
275
- decoding: attrs.decoding ?? "async"
276
- };
277
- },
278
- getSrcSet() {
279
- return [];
280
- }
281
- };
282
- }
283
-
284
266
  // src/lib/sanitization.ts
285
267
  import sanitizeHtml from "sanitize-html";
286
268
  var DEFAULT_SANITIZE_HTML_OPTIONS = {
@@ -595,25 +577,235 @@ function isRecord2(value) {
595
577
  return prototype === Object.prototype || prototype === null;
596
578
  }
597
579
 
598
- // src/module-mocks.ts
599
- import { AsyncLocalStorage } from "async_hooks";
600
- var moduleMockStorage = new AsyncLocalStorage();
601
- async function withStoryModuleMocks(moduleMocks, callback) {
602
- return moduleMockStorage.run(moduleMocks, callback);
580
+ // src/lib/revive-dates.ts
581
+ var ISO_DATE_PATTERN = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
582
+ function reviveDateStrings(args) {
583
+ const revived = {};
584
+ for (const [key, value] of Object.entries(args)) {
585
+ revived[key] = reviveValue(value);
586
+ }
587
+ return revived;
588
+ }
589
+ function reviveValue(value) {
590
+ if (typeof value === "string" && ISO_DATE_PATTERN.test(value)) {
591
+ const date = new Date(value);
592
+ if (!Number.isNaN(date.getTime())) {
593
+ return date;
594
+ }
595
+ return value;
596
+ }
597
+ if (Array.isArray(value)) {
598
+ return value.map(reviveValue);
599
+ }
600
+ if (isRecord3(value)) {
601
+ return reviveDateStrings(value);
602
+ }
603
+ return value;
604
+ }
605
+ function isRecord3(value) {
606
+ return typeof value === "object" && value !== null && !Array.isArray(value);
607
+ }
608
+
609
+ // src/storyRulesRuntime.ts
610
+ async function runWithStoryRules(options, callback) {
611
+ const rulesConfigModule = options.resolveRulesConfigModule ? await options.resolveRulesConfigModule() : void 0;
612
+ const selectedRules = await selectStoryRules({
613
+ configModule: rulesConfigModule,
614
+ configFilePath: options.rulesConfigFilePath,
615
+ story: options.story
616
+ });
617
+ if (selectedRules.moduleMocks.size > 0) {
618
+ options.invalidateModuleGraph?.();
619
+ }
620
+ return withStoryRuleCleanups(selectedRules.cleanups, async () => {
621
+ return withStoryModuleMocks(selectedRules.moduleMocks, async () => callback(selectedRules));
622
+ });
623
+ }
624
+
625
+ // src/astroRenderHandler.ts
626
+ function createAstroRenderHandler(options) {
627
+ const sanitizationOptions = resolveSanitizationOptions(options.sanitization);
628
+ const componentCache = /* @__PURE__ */ new Map();
629
+ let renderQueue = Promise.resolve(void 0);
630
+ async function loadPatchedComponent(componentId, useCache = true) {
631
+ if (!useCache) {
632
+ const { default: component } = await options.loadModule(componentId);
633
+ return patchCreateAstroCompat(component);
634
+ }
635
+ if (!componentCache.has(componentId)) {
636
+ componentCache.set(
637
+ componentId,
638
+ (async () => {
639
+ const { default: component } = await options.loadModule(componentId);
640
+ return patchCreateAstroCompat(component);
641
+ })()
642
+ );
643
+ }
644
+ const cachedComponent = componentCache.get(componentId);
645
+ if (!cachedComponent) {
646
+ throw new Error(`Failed to load Astro component: ${componentId}`);
647
+ }
648
+ try {
649
+ return await cachedComponent;
650
+ } catch (error) {
651
+ componentCache.delete(componentId);
652
+ throw error;
653
+ }
654
+ }
655
+ return async function handler(data) {
656
+ const executeRender = async () => {
657
+ return runWithStoryRules(
658
+ {
659
+ story: data.story,
660
+ rulesConfigFilePath: options.rulesConfigFilePath,
661
+ resolveRulesConfigModule: options.resolveRulesConfigModule,
662
+ invalidateModuleGraph: options.invalidateModuleGraph
663
+ },
664
+ async (selectedRules) => {
665
+ const patchedComponent = await loadPatchedComponent(
666
+ data.component,
667
+ selectedRules.moduleMocks.size === 0
668
+ );
669
+ const processedArgs = await processImageMetadata(data.args ?? {});
670
+ const revivedArgs = reviveDateStrings(processedArgs);
671
+ const sanitizedPayload = sanitizeRenderPayload(
672
+ {
673
+ args: revivedArgs,
674
+ slots: data.slots ?? {}
675
+ },
676
+ sanitizationOptions
677
+ );
678
+ return options.container.renderToString(
679
+ patchedComponent,
680
+ {
681
+ props: sanitizedPayload.args,
682
+ slots: sanitizedPayload.slots
683
+ }
684
+ );
685
+ }
686
+ );
687
+ };
688
+ const resultPromise = renderQueue.then(executeRender, executeRender);
689
+ renderQueue = resultPromise.then(
690
+ () => void 0,
691
+ () => void 0
692
+ );
693
+ return resultPromise;
694
+ };
603
695
  }
604
- function resolveStoryModuleMock(specifier) {
605
- return moduleMockStorage.getStore()?.get(specifier);
696
+ function patchCreateAstroCompat(component) {
697
+ if (typeof component !== "function") {
698
+ throw new Error("Expected Astro component factory to be a function.");
699
+ }
700
+ const originalComponent = component;
701
+ const wrapped = ((result, props, slots) => {
702
+ if (result && typeof result.createAstro === "function") {
703
+ const originalCreateAstro = result.createAstro;
704
+ const runtimeExpectsAstroGlobal = originalCreateAstro.length >= 3;
705
+ result.createAstro = (...args) => {
706
+ if (args.length === 3 && !runtimeExpectsAstroGlobal) {
707
+ return originalCreateAstro(args[1], args[2]);
708
+ }
709
+ return originalCreateAstro(...args);
710
+ };
711
+ }
712
+ return originalComponent(result, props, slots);
713
+ });
714
+ wrapped.isAstroComponentFactory = originalComponent.isAstroComponentFactory;
715
+ wrapped.moduleId = originalComponent.moduleId;
716
+ wrapped.propagation = originalComponent.propagation;
717
+ return wrapped;
718
+ }
719
+ async function processImageMetadata(args) {
720
+ const processed = {};
721
+ for (const [key, value] of Object.entries(args)) {
722
+ if (isImageMetadata(value)) {
723
+ processed[key] = value;
724
+ continue;
725
+ }
726
+ if (Array.isArray(value)) {
727
+ processed[key] = await Promise.all(
728
+ value.map(async (item) => {
729
+ if (isImageMetadata(item)) {
730
+ return item;
731
+ }
732
+ if (isRecord4(item)) {
733
+ return processImageMetadata(item);
734
+ }
735
+ return item;
736
+ })
737
+ );
738
+ continue;
739
+ }
740
+ if (isRecord4(value)) {
741
+ processed[key] = await processImageMetadata(value);
742
+ continue;
743
+ }
744
+ processed[key] = value;
745
+ }
746
+ return processed;
747
+ }
748
+ function isImageMetadata(value) {
749
+ return isRecord4(value) && typeof value.src === "string" && ("width" in value || "height" in value || "format" in value);
750
+ }
751
+ function isRecord4(value) {
752
+ return typeof value === "object" && value !== null;
753
+ }
754
+
755
+ // src/astroImageService.ts
756
+ function ensureAstroPassthroughImageService() {
757
+ if (!globalThis.astroAsset) {
758
+ globalThis.astroAsset = {};
759
+ }
760
+ globalThis.astroAsset.imageService = {
761
+ propertiesToHash: ["src"],
762
+ validateOptions(options) {
763
+ return options;
764
+ },
765
+ getURL(options) {
766
+ const src = options.src;
767
+ if (src != null && typeof src === "object" && "src" in src && typeof src.src === "string") {
768
+ return src.src;
769
+ }
770
+ return typeof src === "string" ? src : "";
771
+ },
772
+ getHTMLAttributes(options) {
773
+ const {
774
+ src,
775
+ width,
776
+ height,
777
+ format,
778
+ quality,
779
+ densities,
780
+ widths,
781
+ formats,
782
+ layout,
783
+ priority,
784
+ fit,
785
+ position,
786
+ background,
787
+ ...attrs
788
+ } = options;
789
+ const srcObject = src != null && typeof src === "object" ? src : null;
790
+ return {
791
+ ...attrs,
792
+ width: width ?? srcObject?.width,
793
+ height: height ?? srcObject?.height,
794
+ loading: attrs.loading ?? "lazy",
795
+ decoding: attrs.decoding ?? "async"
796
+ };
797
+ },
798
+ getSrcSet() {
799
+ return [];
800
+ }
801
+ };
606
802
  }
607
803
 
608
804
  export {
609
805
  defineStoryRules,
610
- selectStoryRules,
611
- withStoryRuleCleanups,
612
- installPassthroughImageService,
613
806
  resolveSanitizationOptions,
614
- sanitizeRenderPayload,
615
807
  serializeSanitizationOptions,
616
- withStoryModuleMocks,
617
- resolveStoryModuleMock
808
+ createAstroRenderHandler,
809
+ ensureAstroPassthroughImageService
618
810
  };
619
- //# sourceMappingURL=chunk-OUEDTRBO.js.map
811
+ //# sourceMappingURL=chunk-B454DGX6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/rules.ts","../src/lib/sanitization.ts","../src/lib/revive-dates.ts","../src/storyRulesRuntime.ts","../src/astroRenderHandler.ts","../src/astroImageService.ts"],"sourcesContent":["import { dirname, isAbsolute, resolve } from 'node:path';\nimport {\n createInlineStoryModuleMock,\n createPathStoryModuleMock,\n type StoryModuleMockEntry,\n type StoryModuleMockFactoryResult\n} from './module-mocks.ts';\nimport type { RenderStoryInput } from './types.ts';\n\nexport type StoryRuleCleanup = () => void | Promise<void>;\ntype StoryRuleUseResult = void | StoryRuleCleanup | Promise<void | StoryRuleCleanup>;\n\nexport type StoryRuleMockFactory =\n () => StoryModuleMockFactoryResult | Promise<StoryModuleMockFactoryResult>;\n\nexport type StoryRuleMock = {\n (specifier: string, replacement: string): void;\n (specifier: string, factory: StoryRuleMockFactory): void;\n};\n\nexport type StoryRuleUseContext = {\n story: StoryRuleStory;\n mock: StoryRuleMock;\n};\n\nexport type StoryRuleUse = (context: StoryRuleUseContext) => StoryRuleUseResult;\n\nexport type StoryRule = {\n match: string | string[];\n use: StoryRuleUse | StoryRuleUse[];\n};\n\nexport type StoryRulesConfig = {\n rules: StoryRule[];\n};\n\nexport type StoryRuleStory = {\n id: string;\n title?: string;\n name?: string;\n keys: string[];\n};\n\nexport type StoryRuleSelectionInput = {\n configModule: unknown;\n configFilePath?: string;\n story?: RenderStoryInput;\n};\n\nexport type StoryRuleSelection = {\n moduleMocks: Map<string, StoryModuleMockEntry>;\n cleanups: StoryRuleCleanup[];\n};\n\ntype MutableStoryRuleSelection = {\n moduleMocks: Map<string, StoryModuleMockEntry>;\n cleanups: StoryRuleCleanup[];\n};\n\nexport function defineStoryRules(config: StoryRulesConfig): StoryRulesConfig {\n return config;\n}\n\nexport async function selectStoryRules(\n input: StoryRuleSelectionInput\n): Promise<StoryRuleSelection> {\n const config = normalizeRulesConfig(input.configModule);\n const story = normalizeStory(input.story);\n const selection = createEmptySelection();\n\n for (const rule of config.rules) {\n if (!isStoryRuleMatch(rule.match, story)) {\n continue;\n }\n\n const uses = Array.isArray(rule.use) ? rule.use : [rule.use];\n\n for (const use of uses) {\n const pendingModuleMocks: Promise<void>[] = [];\n\n if (typeof use !== 'function') {\n throw new Error('Each story rule \"use\" entry must be a function.');\n }\n\n const cleanup = await use({\n story,\n mock: ((specifier, replacementOrFactory) => {\n const normalizedSpecifier = normalizeMockSpecifier(specifier);\n\n if (typeof replacementOrFactory === 'function') {\n pendingModuleMocks.push(\n Promise.resolve(replacementOrFactory()).then((exportsObject) => {\n selection.moduleMocks.set(\n normalizedSpecifier,\n createInlineStoryModuleMock(normalizeMockFactoryResult(exportsObject))\n );\n\n return undefined;\n })\n );\n\n return;\n }\n\n const normalizedReplacement = normalizeMockReplacement(\n replacementOrFactory,\n input.configFilePath\n );\n\n selection.moduleMocks.set(normalizedSpecifier, createPathStoryModuleMock(normalizedReplacement));\n }) as StoryRuleMock\n });\n\n if (pendingModuleMocks.length > 0) {\n await Promise.all(pendingModuleMocks);\n }\n\n if (cleanup !== undefined) {\n if (typeof cleanup !== 'function') {\n throw new Error('Story rule \"use\" must return either nothing or a cleanup function.');\n }\n\n selection.cleanups.push(cleanup);\n }\n }\n }\n\n return selection;\n}\n\nexport async function withStoryRuleCleanups<T>(\n cleanups: StoryRuleCleanup[],\n callback: () => Promise<T>\n): Promise<T> {\n let result: T | undefined;\n let callbackError: unknown;\n\n try {\n result = await callback();\n } catch (error) {\n callbackError = error;\n }\n\n try {\n await runStoryRuleCleanups(cleanups);\n } catch (cleanupError) {\n if (callbackError) {\n throw new AggregateError(\n [callbackError, cleanupError],\n 'Story rule execution and cleanup both failed.'\n );\n }\n\n throw cleanupError;\n }\n\n if (callbackError) {\n throw callbackError;\n }\n\n return result as T;\n}\n\nexport async function runStoryRuleCleanups(cleanups: StoryRuleCleanup[]): Promise<void> {\n const errors: unknown[] = [];\n\n for (let index = cleanups.length - 1; index >= 0; index -= 1) {\n try {\n await cleanups[index]();\n } catch (error) {\n errors.push(error);\n }\n }\n\n if (errors.length === 1) {\n throw errors[0];\n }\n\n if (errors.length > 1) {\n throw new AggregateError(errors, 'Story rule cleanup failed.');\n }\n}\n\nfunction normalizeRulesConfig(configModule: unknown): StoryRulesConfig {\n const configExport = getRulesConfigExport(configModule);\n\n if (configExport === undefined || configExport === null) {\n return {\n rules: []\n };\n }\n\n if (!isRecord(configExport)) {\n throw new Error(\n 'Story rules config must export an object with a \"rules\" array via a default export or named export.'\n );\n }\n\n const rules = configExport.rules;\n\n if (rules === undefined) {\n return {\n rules: []\n };\n }\n\n if (!Array.isArray(rules)) {\n throw new Error('Story rules config \"rules\" must be an array.');\n }\n\n return {\n rules: rules as StoryRule[]\n };\n}\n\nfunction getRulesConfigExport(configModule: unknown): unknown {\n if (!isRecord(configModule)) {\n return configModule;\n }\n\n if ('default' in configModule && configModule.default !== undefined) {\n return configModule.default;\n }\n\n if ('rules' in configModule) {\n return {\n rules: configModule.rules\n };\n }\n\n return undefined;\n}\n\nfunction normalizeStory(story?: RenderStoryInput): StoryRuleStory {\n const id = normalizeStoryId(story?.id);\n const title = normalizeOptionalString(story?.title);\n const name = normalizeOptionalString(story?.name);\n const keys = Array.from(resolveStoryKeys({ id, title, name }));\n\n return {\n id,\n title,\n name,\n keys\n };\n}\n\nfunction resolveStoryKeys(story: { id: string; title?: string; name?: string }) {\n const keys = new Set<string>();\n\n keys.add('');\n\n const storyId = story.id;\n const idPath = storyId ? storyId.replaceAll('--', '/') : '';\n\n if (storyId) {\n keys.add(storyId);\n keys.add(`/story/${storyId}`);\n }\n\n if (idPath) {\n keys.add(idPath);\n keys.add(`/story/${idPath}`);\n }\n\n const titlePath = story.title\n ? story.title\n .split('/')\n .map((segment) => slugify(segment))\n .filter(Boolean)\n .join('/')\n : '';\n\n const storyNamePath = story.name ? slugify(story.name) : '';\n\n if (titlePath && storyNamePath) {\n const composedPath = `${titlePath}/${storyNamePath}`;\n\n keys.add(composedPath);\n keys.add(`/story/${composedPath}`);\n }\n\n return keys;\n}\n\nfunction isStoryRuleMatch(match: string | string[], story: StoryRuleStory): boolean {\n const patterns = Array.isArray(match) ? match : [match];\n\n return patterns.some((pattern) => {\n if (typeof pattern !== 'string') {\n throw new Error('Story rule \"match\" must be a string or an array of strings.');\n }\n\n const normalizedPattern = pattern.trim();\n\n if (!normalizedPattern) {\n throw new Error('Story rule \"match\" cannot be empty.');\n }\n\n return story.keys.some((key) => isWildcardMatch(normalizedPattern, key));\n });\n}\n\nfunction isWildcardMatch(pattern: string, candidate: string): boolean {\n const escapedPattern = escapeRegExp(pattern).replaceAll('*', '.*');\n const regex = new RegExp(`^${escapedPattern}$`);\n\n return regex.test(candidate);\n}\n\nfunction normalizeStoryId(id?: string): string {\n const value = normalizeOptionalString(id) ?? '';\n\n if (!value) {\n return '';\n }\n\n return value.startsWith('/story/') ? value.slice('/story/'.length) : value;\n}\n\nfunction normalizeOptionalString(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n\n const normalizedValue = value.trim();\n\n return normalizedValue || undefined;\n}\n\nfunction normalizeMockSpecifier(value: unknown): string {\n if (typeof value !== 'string') {\n throw new Error('Story rule mock specifier must be a string.');\n }\n\n const normalizedValue = value.trim();\n\n if (!normalizedValue) {\n throw new Error('Story rule mock specifier cannot be empty.');\n }\n\n return normalizedValue;\n}\n\nfunction normalizeMockReplacement(value: unknown, configFilePath?: string): string {\n if (typeof value !== 'string') {\n throw new Error('Story rule mock replacement must be a string.');\n }\n\n const normalizedValue = value.trim();\n\n if (!normalizedValue) {\n throw new Error('Story rule mock replacement cannot be empty.');\n }\n\n if (isAbsolute(normalizedValue)) {\n return toPosixPath(normalizedValue);\n }\n\n if (normalizedValue.startsWith('.')) {\n if (!configFilePath) {\n throw new Error(\n 'Story rule mock replacement uses a relative path, but rules config path is unavailable.'\n );\n }\n\n return toPosixPath(resolve(dirname(configFilePath), normalizedValue));\n }\n\n return normalizedValue;\n}\n\nfunction normalizeMockFactoryResult(value: unknown): StoryModuleMockFactoryResult {\n if (!isRecord(value)) {\n throw new Error('Story rule mock factory must return an object of module exports.');\n }\n\n return value;\n}\n\nfunction slugify(input: string): string {\n return input\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\nfunction createEmptySelection(): MutableStoryRuleSelection {\n return {\n moduleMocks: new Map(),\n cleanups: []\n };\n}\n\nfunction toPosixPath(input: string): string {\n return input.replaceAll('\\\\', '/');\n}\n\nfunction escapeRegExp(input: string) {\n return input.replace(/[|\\\\{}()[\\]^$+?.]/g, '\\\\$&');\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n return !Array.isArray(value);\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","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"],"mappings":"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","names":["isRecord","isRecord","isRecord"]}
@@ -0,0 +1,116 @@
1
+ // src/module-mocks.ts
2
+ var STORYBOOK_ASTRO_GET_MOCK_EXPORT = "__STORYBOOK_ASTRO_GET_STORY_MODULE_MOCK_EXPORT__";
3
+ var STORYBOOK_ASTRO_INLINE_MODULE_PREFIX = "virtual:storybook-astro-inline-module:";
4
+ var moduleMocksGlobal = globalThis;
5
+ var moduleMockState = moduleMocksGlobal.__STORYBOOK_ASTRO_STORY_MODULE_MOCK_STATE__ ?? (moduleMocksGlobal.__STORYBOOK_ASTRO_STORY_MODULE_MOCK_STATE__ = {
6
+ activeModuleMocksStack: [],
7
+ inlineModuleExports: /* @__PURE__ */ new Map(),
8
+ inlineModuleSequence: 0
9
+ });
10
+ if (typeof moduleMocksGlobal[STORYBOOK_ASTRO_GET_MOCK_EXPORT] !== "function") {
11
+ moduleMocksGlobal[STORYBOOK_ASTRO_GET_MOCK_EXPORT] = getStoryModuleMockExport;
12
+ }
13
+ async function withStoryModuleMocks(moduleMocks, callback) {
14
+ moduleMockState.activeModuleMocksStack.push(moduleMocks);
15
+ try {
16
+ return await callback();
17
+ } finally {
18
+ moduleMockState.activeModuleMocksStack.pop();
19
+ cleanupInlineModuleMocks(moduleMocks);
20
+ }
21
+ }
22
+ function resolveStoryModuleMock(specifier) {
23
+ return getActiveModuleMocks()?.get(specifier)?.replacement;
24
+ }
25
+ function createPathStoryModuleMock(replacement) {
26
+ return {
27
+ replacement
28
+ };
29
+ }
30
+ function createInlineStoryModuleMock(exportsObject) {
31
+ const inlineModuleId = `storybook-astro-inline-module:${moduleMockState.inlineModuleSequence}`;
32
+ moduleMockState.inlineModuleSequence += 1;
33
+ moduleMockState.inlineModuleExports.set(inlineModuleId, exportsObject);
34
+ return {
35
+ replacement: `${STORYBOOK_ASTRO_INLINE_MODULE_PREFIX}${inlineModuleId}`,
36
+ inlineModuleId
37
+ };
38
+ }
39
+ function loadStoryInlineModule(resolvedId) {
40
+ const inlineModuleId = normalizeInlineModuleId(resolvedId);
41
+ if (!inlineModuleId) {
42
+ return void 0;
43
+ }
44
+ const exportsObject = moduleMockState.inlineModuleExports.get(inlineModuleId);
45
+ if (!exportsObject) {
46
+ return void 0;
47
+ }
48
+ return createInlineModuleSource(inlineModuleId, exportsObject);
49
+ }
50
+ function cleanupInlineModuleMocks(moduleMocks) {
51
+ for (const mockEntry of moduleMocks.values()) {
52
+ if (mockEntry.inlineModuleId) {
53
+ moduleMockState.inlineModuleExports.delete(mockEntry.inlineModuleId);
54
+ }
55
+ }
56
+ }
57
+ function getActiveModuleMocks() {
58
+ return moduleMockState.activeModuleMocksStack[moduleMockState.activeModuleMocksStack.length - 1];
59
+ }
60
+ function getStoryModuleMockExport(moduleId, exportName) {
61
+ const exportsObject = moduleMockState.inlineModuleExports.get(moduleId);
62
+ if (!exportsObject) {
63
+ throw new Error(`Inline story module mock is unavailable: ${moduleId}`);
64
+ }
65
+ return exportsObject[exportName];
66
+ }
67
+ function createInlineModuleSource(inlineModuleId, exportsObject) {
68
+ const exportNames = Object.keys(exportsObject);
69
+ const sourceLines = [
70
+ `const getStoryModuleMockExport = globalThis.${STORYBOOK_ASTRO_GET_MOCK_EXPORT};`,
71
+ "if (typeof getStoryModuleMockExport !== 'function') {",
72
+ " throw new Error('Inline story module mock helper is unavailable.');",
73
+ "}",
74
+ ""
75
+ ];
76
+ if (Object.prototype.hasOwnProperty.call(exportsObject, "default")) {
77
+ sourceLines.push(
78
+ `export default getStoryModuleMockExport(${JSON.stringify(inlineModuleId)}, 'default');`
79
+ );
80
+ }
81
+ for (const exportName of exportNames) {
82
+ if (exportName === "default") {
83
+ continue;
84
+ }
85
+ assertValidExportName(exportName);
86
+ sourceLines.push(
87
+ `export const ${exportName} = getStoryModuleMockExport(${JSON.stringify(inlineModuleId)}, ${JSON.stringify(exportName)});`
88
+ );
89
+ }
90
+ if (sourceLines[sourceLines.length - 1] === "") {
91
+ sourceLines.push("export {};");
92
+ }
93
+ return sourceLines.join("\n");
94
+ }
95
+ function assertValidExportName(exportName) {
96
+ if (!/^[$A-Z_a-z][$\w]*$/u.test(exportName)) {
97
+ throw new Error(`Story module mock export name is invalid: ${exportName}`);
98
+ }
99
+ }
100
+ function normalizeInlineModuleId(resolvedId) {
101
+ const normalizedId = resolvedId.startsWith("\0") ? resolvedId.slice(1) : resolvedId;
102
+ if (!normalizedId.startsWith(STORYBOOK_ASTRO_INLINE_MODULE_PREFIX)) {
103
+ return void 0;
104
+ }
105
+ return normalizedId.slice(STORYBOOK_ASTRO_INLINE_MODULE_PREFIX.length);
106
+ }
107
+
108
+ export {
109
+ STORYBOOK_ASTRO_INLINE_MODULE_PREFIX,
110
+ withStoryModuleMocks,
111
+ resolveStoryModuleMock,
112
+ createPathStoryModuleMock,
113
+ createInlineStoryModuleMock,
114
+ loadStoryInlineModule
115
+ };
116
+ //# sourceMappingURL=chunk-B5HHF6FC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/module-mocks.ts"],"sourcesContent":["const STORYBOOK_ASTRO_GET_MOCK_EXPORT = '__STORYBOOK_ASTRO_GET_STORY_MODULE_MOCK_EXPORT__';\n\nexport const STORYBOOK_ASTRO_INLINE_MODULE_PREFIX = 'virtual:storybook-astro-inline-module:';\n\nexport type StoryModuleMockEntry = {\n replacement: string;\n inlineModuleId?: string;\n};\n\nexport type StoryModuleMockFactoryResult = Record<string, unknown>;\n\nexport type StoryModuleMocks = Map<string, StoryModuleMockEntry>;\n\ntype StoryModuleMocksGlobal = typeof globalThis & {\n __STORYBOOK_ASTRO_STORY_MODULE_MOCK_STATE__?: {\n activeModuleMocksStack: StoryModuleMocks[];\n inlineModuleExports: Map<string, StoryModuleMockFactoryResult>;\n inlineModuleSequence: number;\n };\n __STORYBOOK_ASTRO_GET_STORY_MODULE_MOCK_EXPORT__?: (moduleId: string, exportName: string) => unknown;\n};\n\nconst moduleMocksGlobal = globalThis as StoryModuleMocksGlobal;\n\nconst moduleMockState =\n moduleMocksGlobal.__STORYBOOK_ASTRO_STORY_MODULE_MOCK_STATE__ ??\n (moduleMocksGlobal.__STORYBOOK_ASTRO_STORY_MODULE_MOCK_STATE__ = {\n activeModuleMocksStack: [],\n inlineModuleExports: new Map<string, StoryModuleMockFactoryResult>(),\n inlineModuleSequence: 0\n });\n\nif (typeof moduleMocksGlobal[STORYBOOK_ASTRO_GET_MOCK_EXPORT] !== 'function') {\n moduleMocksGlobal[STORYBOOK_ASTRO_GET_MOCK_EXPORT] = getStoryModuleMockExport;\n}\n\nexport async function withStoryModuleMocks<T>(\n moduleMocks: StoryModuleMocks,\n callback: () => Promise<T>\n): Promise<T> {\n moduleMockState.activeModuleMocksStack.push(moduleMocks);\n\n try {\n return await callback();\n } finally {\n moduleMockState.activeModuleMocksStack.pop();\n cleanupInlineModuleMocks(moduleMocks);\n }\n}\n\nexport function resolveStoryModuleMock(specifier: string): string | undefined {\n return getActiveModuleMocks()?.get(specifier)?.replacement;\n}\n\nexport function createPathStoryModuleMock(replacement: string): StoryModuleMockEntry {\n return {\n replacement\n };\n}\n\nexport function createInlineStoryModuleMock(\n exportsObject: StoryModuleMockFactoryResult\n): StoryModuleMockEntry {\n const inlineModuleId = `storybook-astro-inline-module:${moduleMockState.inlineModuleSequence}`;\n\n moduleMockState.inlineModuleSequence += 1;\n moduleMockState.inlineModuleExports.set(inlineModuleId, exportsObject);\n\n return {\n replacement: `${STORYBOOK_ASTRO_INLINE_MODULE_PREFIX}${inlineModuleId}`,\n inlineModuleId\n };\n}\n\nexport function loadStoryInlineModule(resolvedId: string): string | undefined {\n const inlineModuleId = normalizeInlineModuleId(resolvedId);\n\n if (!inlineModuleId) {\n return undefined;\n }\n\n const exportsObject = moduleMockState.inlineModuleExports.get(inlineModuleId);\n\n if (!exportsObject) {\n return undefined;\n }\n\n return createInlineModuleSource(inlineModuleId, exportsObject);\n}\n\nfunction cleanupInlineModuleMocks(moduleMocks: StoryModuleMocks) {\n for (const mockEntry of moduleMocks.values()) {\n if (mockEntry.inlineModuleId) {\n moduleMockState.inlineModuleExports.delete(mockEntry.inlineModuleId);\n }\n }\n}\n\nfunction getActiveModuleMocks(): StoryModuleMocks | undefined {\n return moduleMockState.activeModuleMocksStack[moduleMockState.activeModuleMocksStack.length - 1];\n}\n\nfunction getStoryModuleMockExport(moduleId: string, exportName: string): unknown {\n const exportsObject = moduleMockState.inlineModuleExports.get(moduleId);\n\n if (!exportsObject) {\n throw new Error(`Inline story module mock is unavailable: ${moduleId}`);\n }\n\n return exportsObject[exportName];\n}\n\nfunction createInlineModuleSource(\n inlineModuleId: string,\n exportsObject: StoryModuleMockFactoryResult\n): string {\n const exportNames = Object.keys(exportsObject);\n const sourceLines = [\n `const getStoryModuleMockExport = globalThis.${STORYBOOK_ASTRO_GET_MOCK_EXPORT};`,\n \"if (typeof getStoryModuleMockExport !== 'function') {\",\n \" throw new Error('Inline story module mock helper is unavailable.');\",\n '}',\n ''\n ];\n\n if (Object.prototype.hasOwnProperty.call(exportsObject, 'default')) {\n sourceLines.push(\n `export default getStoryModuleMockExport(${JSON.stringify(inlineModuleId)}, 'default');`\n );\n }\n\n for (const exportName of exportNames) {\n if (exportName === 'default') {\n continue;\n }\n\n assertValidExportName(exportName);\n sourceLines.push(\n `export const ${exportName} = getStoryModuleMockExport(${JSON.stringify(inlineModuleId)}, ${JSON.stringify(exportName)});`\n );\n }\n\n if (sourceLines[sourceLines.length - 1] === '') {\n sourceLines.push('export {};');\n }\n\n return sourceLines.join('\\n');\n}\n\nfunction assertValidExportName(exportName: string) {\n if (!/^[$A-Z_a-z][$\\w]*$/u.test(exportName)) {\n throw new Error(`Story module mock export name is invalid: ${exportName}`);\n }\n}\n\nfunction normalizeInlineModuleId(resolvedId: string): string | undefined {\n const normalizedId = resolvedId.startsWith('\\0') ? resolvedId.slice(1) : resolvedId;\n\n if (!normalizedId.startsWith(STORYBOOK_ASTRO_INLINE_MODULE_PREFIX)) {\n return undefined;\n }\n\n return normalizedId.slice(STORYBOOK_ASTRO_INLINE_MODULE_PREFIX.length);\n}\n"],"mappings":"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","names":[]}