@weasel-js/forge 1.7.0 → 1.7.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.
@@ -1,7 +1,8 @@
1
- import { F as FrameSetup } from '../FrameController-HEcTM04H.js';
1
+ import { F as FrameSetup } from '../FrameController-RdGggdGA.js';
2
2
  import '@weasel-js/labkit/config';
3
3
  import 'react';
4
4
 
5
+ /** Options for `runStory`. */
5
6
  interface RunStoryOptions {
6
7
  /** The frame config (`frameConfig`). */
7
8
  setup?: FrameSetup;
@@ -1,7 +1,7 @@
1
- import { StoryTrial } from '../chunk-7GQI2PDH.js';
2
- import '../chunk-LLGBNJAZ.js';
3
- import { loadStories } from '../chunk-ERRLEH6S.js';
4
- import '../chunk-2GXKNXTJ.js';
1
+ import { StoryTrial } from '../chunk-SEK6EKHO.js';
2
+ import '../chunk-JNJGIUYU.js';
3
+ import { loadStories } from '../chunk-NYBMOSSR.js';
4
+ import '../chunk-Y3WZ2EWR.js';
5
5
  import '../chunk-HRGPFQBW.js';
6
6
  import '../chunk-YKN3IAEX.js';
7
7
  import { withValueAtPath } from '@weasel-js/labkit/config';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/test/runStory.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { withValueAtPath } from '@weasel-js/labkit/config';\nimport { type RefObject, useEffect, useState } from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\nimport type { FrameSetup } from '../frame/FrameController';\nimport type { Viewport } from '../protocol/messages';\nimport { StoryTrial } from '../shell/StoryTrial';\nimport { loadStories } from '../story/load';\nimport type { LoadedStory } from '../story/types';\n\n/** Prefixes `error` with the phase it came from, keeping its stack. */\nfunction phased(phase: string, error: unknown): Error {\n const message = error instanceof Error ? error.message : String(error);\n const out = new Error(`${phase} fault: ${message}`, { cause: error });\n if (error instanceof Error && error.stack) out.stack = `${phase} fault: ${error.stack}`;\n return out;\n}\n\nconst settle = () =>\n new Promise<void>((resolve) => {\n requestAnimationFrame(() => setTimeout(resolve, 0));\n });\n\ninterface TestTrialProps {\n story: LoadedStory;\n setup: FrameSetup;\n hostRef: RefObject<HTMLElement | null>;\n /** The config in force after each commit, so `play` reads what the story last wrote. */\n onConfig: (config: unknown) => void;\n onRendered: () => void;\n onError: (error: unknown) => void;\n}\n\n/** The trial a story test runs in: its config and state, held the way a lab trial holds them. */\nfunction TestTrial({ story, setup, hostRef, onConfig, onRendered, onError }: TestTrialProps) {\n const [config, setConfigState] = useState<unknown>(() => story.config.defaults());\n const [state, setState] = useState<unknown>(null);\n useEffect(() => onConfig(config), [config, onConfig]);\n const ctx = {\n config,\n state,\n setConfig: (path: string, value: unknown) => setConfigState((prev: unknown) => withValueAtPath(prev, path, value)),\n setState,\n };\n return <StoryTrial story={story} setup={setup} ctx={ctx} hostRef={hostRef} onRendered={onRendered} onError={onError} />;\n}\n\nexport interface RunStoryOptions {\n /** The frame config (`frameConfig`). */\n setup?: FrameSetup;\n /** Resizes the page, for a story that names a viewport. Without it, stories run at whatever size the page is. */\n viewport?: (width: number, height: number) => Promise<void>;\n}\n\n/** Stops the story a timed-out test left mounted. */\nlet leftover: (() => unknown) | null = null;\n/** The page's size before any story resized it; a story with no viewport runs at this size. */\nlet pageSize: Viewport | null = null;\n\n/**\n * Renders one story in the test page the way the workshop does — defaults, no state, no globals — then plays it.\n * Throws on a render the story's boundary caught, or a play function that fails.\n */\nexport async function runStory(\n mod: Record<string, unknown>,\n exportName: string,\n file: string,\n autoTitle: string,\n { setup = {}, viewport }: RunStoryOptions = {},\n): Promise<void> {\n leftover?.();\n let story: LoadedStory | undefined;\n try {\n story = loadStories(mod, autoTitle, setup.parameters).find((s) => s.exportName === exportName);\n } catch (error) {\n throw phased('load', error);\n }\n if (!story) throw new Error(`load fault: ${file} has no story export \"${exportName}\"`);\n\n pageSize ??= { width: window.innerWidth, height: window.innerHeight };\n const size = story.viewport ?? pageSize;\n if (viewport && (window.innerWidth !== size.width || window.innerHeight !== size.height)) {\n await viewport(size.width, size.height);\n }\n\n const container = document.createElement('div');\n document.body.append(container);\n let root: Root | undefined;\n /** Returns what unmounting threw, having released everything else regardless. */\n const cleanup = (): { error: unknown } | null => {\n if (leftover === cleanup) leftover = null;\n let thrown: { error: unknown } | null = null;\n try {\n root?.unmount();\n } catch (error) {\n thrown = { error };\n } finally {\n root = undefined;\n container.remove();\n }\n return thrown;\n };\n leftover = cleanup;\n\n const hostRef: RefObject<HTMLElement | null> = { current: null };\n let config: unknown;\n let renderError: { error: unknown } | null = null;\n let markRendered: () => void = () => {};\n const rendered = new Promise<void>((resolve) => {\n markRendered = resolve;\n });\n const fail = (error: unknown) => {\n renderError ??= { error };\n // An error the boundary could not catch leaves nothing to announce `rendered`; the check below throws instead.\n markRendered();\n };\n const checkRender = () => {\n if (renderError) throw phased('render', renderError.error);\n };\n\n let failure: { error: unknown } | null = null;\n try {\n try {\n await setup.prepare?.(story);\n root = createRoot(container, { onUncaughtError: fail });\n root.render(\n <TestTrial\n story={story}\n setup={setup}\n hostRef={hostRef}\n onConfig={(next) => {\n config = next;\n }}\n onRendered={markRendered}\n onError={fail}\n />,\n );\n } catch (error) {\n throw phased('mount', error);\n }\n await rendered;\n await settle();\n checkRender();\n const host = hostRef.current;\n if (!host) throw new Error('render fault: the story host never mounted');\n if (story.play) {\n try {\n await story.play({ canvasElement: host, config, globals: {} });\n } catch (error) {\n throw phased('play', error);\n }\n await settle();\n checkRender();\n }\n } catch (error) {\n failure = { error };\n }\n const cleanupError = cleanup();\n if (failure) throw failure.error;\n if (cleanupError) throw phased('cleanup', cleanupError.error);\n}\n"]}
1
+ {"version":3,"sources":["../../src/test/runStory.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { withValueAtPath } from '@weasel-js/labkit/config';\nimport { type RefObject, useEffect, useState } from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\nimport type { FrameSetup } from '../frame/FrameController';\nimport type { Viewport } from '../protocol/messages';\nimport { StoryTrial } from '../shell/StoryTrial';\nimport { loadStories } from '../story/load';\nimport type { LoadedStory } from '../story/types';\n\n/** Prefixes `error` with the phase it came from, keeping its stack. */\nfunction phased(phase: string, error: unknown): Error {\n const message = error instanceof Error ? error.message : String(error);\n const out = new Error(`${phase} fault: ${message}`, { cause: error });\n if (error instanceof Error && error.stack) out.stack = `${phase} fault: ${error.stack}`;\n return out;\n}\n\nconst settle = () =>\n new Promise<void>((resolve) => {\n requestAnimationFrame(() => setTimeout(resolve, 0));\n });\n\ninterface TestTrialProps {\n story: LoadedStory;\n setup: FrameSetup;\n hostRef: RefObject<HTMLElement | null>;\n /** The config in force after each commit, so `play` reads what the story last wrote. */\n onConfig: (config: unknown) => void;\n onRendered: () => void;\n onError: (error: unknown) => void;\n}\n\n/** The trial a story test runs in: its config and state, held the way a lab trial holds them. */\nfunction TestTrial({ story, setup, hostRef, onConfig, onRendered, onError }: TestTrialProps) {\n const [config, setConfigState] = useState<unknown>(() => story.config.defaults());\n const [state, setState] = useState<unknown>(null);\n useEffect(() => onConfig(config), [config, onConfig]);\n const ctx = {\n config,\n state,\n setConfig: (path: string, value: unknown) => setConfigState((prev: unknown) => withValueAtPath(prev, path, value)),\n setState,\n };\n return <StoryTrial story={story} setup={setup} ctx={ctx} hostRef={hostRef} onRendered={onRendered} onError={onError} />;\n}\n\n/** Options for `runStory`. */\nexport interface RunStoryOptions {\n /** The frame config (`frameConfig`). */\n setup?: FrameSetup;\n /** Resizes the page, for a story that names a viewport. Without it, stories run at whatever size the page is. */\n viewport?: (width: number, height: number) => Promise<void>;\n}\n\n/** Stops the story a timed-out test left mounted. */\nlet leftover: (() => unknown) | null = null;\n/** The page's size before any story resized it; a story with no viewport runs at this size. */\nlet pageSize: Viewport | null = null;\n\n/**\n * Renders one story in the test page the way the workshop does — defaults, no state, no globals — then plays it.\n * Throws on a render the story's boundary caught, or a play function that fails.\n */\nexport async function runStory(\n mod: Record<string, unknown>,\n exportName: string,\n file: string,\n autoTitle: string,\n { setup = {}, viewport }: RunStoryOptions = {},\n): Promise<void> {\n leftover?.();\n let story: LoadedStory | undefined;\n try {\n story = loadStories(mod, autoTitle, setup.parameters).find((s) => s.exportName === exportName);\n } catch (error) {\n throw phased('load', error);\n }\n if (!story) throw new Error(`load fault: ${file} has no story export \"${exportName}\"`);\n\n pageSize ??= { width: window.innerWidth, height: window.innerHeight };\n const size = story.viewport ?? pageSize;\n if (viewport && (window.innerWidth !== size.width || window.innerHeight !== size.height)) {\n await viewport(size.width, size.height);\n }\n\n const container = document.createElement('div');\n document.body.append(container);\n let root: Root | undefined;\n /** Returns what unmounting threw, having released everything else regardless. */\n const cleanup = (): { error: unknown } | null => {\n if (leftover === cleanup) leftover = null;\n let thrown: { error: unknown } | null = null;\n try {\n root?.unmount();\n } catch (error) {\n thrown = { error };\n } finally {\n root = undefined;\n container.remove();\n }\n return thrown;\n };\n leftover = cleanup;\n\n const hostRef: RefObject<HTMLElement | null> = { current: null };\n let config: unknown;\n let renderError: { error: unknown } | null = null;\n let markRendered: () => void = () => {};\n const rendered = new Promise<void>((resolve) => {\n markRendered = resolve;\n });\n const fail = (error: unknown) => {\n renderError ??= { error };\n // An error the boundary could not catch leaves nothing to announce `rendered`; the check below throws instead.\n markRendered();\n };\n const checkRender = () => {\n if (renderError) throw phased('render', renderError.error);\n };\n\n let failure: { error: unknown } | null = null;\n try {\n try {\n await setup.prepare?.(story);\n root = createRoot(container, { onUncaughtError: fail });\n root.render(\n <TestTrial\n story={story}\n setup={setup}\n hostRef={hostRef}\n onConfig={(next) => {\n config = next;\n }}\n onRendered={markRendered}\n onError={fail}\n />,\n );\n } catch (error) {\n throw phased('mount', error);\n }\n await rendered;\n await settle();\n checkRender();\n const host = hostRef.current;\n if (!host) throw new Error('render fault: the story host never mounted');\n if (story.play) {\n try {\n await story.play({ canvasElement: host, config, globals: {} });\n } catch (error) {\n throw phased('play', error);\n }\n await settle();\n checkRender();\n }\n } catch (error) {\n failure = { error };\n }\n const cleanupError = cleanup();\n if (failure) throw failure.error;\n if (cleanupError) throw phased('cleanup', cleanupError.error);\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import { Plugin } from 'vite';
2
2
 
3
+ /** Options for the `forge` vite plugin. */
3
4
  interface ForgeOptions {
4
5
  /** Globs of story files, relative to the vite root. */
5
6
  stories: string[];
@@ -7,11 +8,16 @@ interface ForgeOptions {
7
8
  frameConfig?: string;
8
9
  /** Path to the shell config module, relative to the vite root. Only the workshop page imports it. Optional. */
9
10
  shellConfig?: string;
10
- /** Alias Storybook's runtime modules to forge shims (Task 13). Default true. */
11
+ /** Alias Storybook's runtime modules to forge shims. Default true. */
11
12
  storybookShims?: boolean;
12
13
  }
14
+ /**
15
+ * The vite plugin that serves the workshop: it indexes the story files, serves the workshop at `/` and the frame
16
+ * document at `/frame.html`, pushes a new index to the open page as story files change, and builds both pages.
17
+ */
13
18
  declare function forge(options: ForgeOptions): Plugin[];
14
19
 
20
+ /** Options for the `forgeTest` vite plugin. */
15
21
  interface ForgeTestOptions {
16
22
  /** Globs of story files, relative to the vite root. Each matching file becomes a test file. */
17
23
  stories: string[];
@@ -2,8 +2,8 @@ import { isGallery } from '../chunk-WEQSLPKT.js';
2
2
  import { storyNameFromExport, storyId } from '../chunk-HRGPFQBW.js';
3
3
  import { existsSync, readFileSync, mkdirSync, writeFileSync, globSync, statSync } from 'fs';
4
4
  import { resolve, sep, relative, matchesGlob, dirname, join, basename } from 'path';
5
- import { fileURLToPath } from 'url';
6
5
  import { parse } from '@babel/parser';
6
+ import { fileURLToPath } from 'url';
7
7
 
8
8
  // src/vite/html.ts
9
9
  function html(entry, mode = "serve") {
@@ -508,6 +508,18 @@ function storyFilter(obj, key) {
508
508
  }
509
509
  return null;
510
510
  }
511
+ function ownEntries(realms) {
512
+ const here = fileURLToPath(import.meta.url);
513
+ for (let dir = dirname(here); dir !== dirname(dir); dir = dirname(dir)) {
514
+ const manifest = join(dir, "package.json");
515
+ if (!existsSync(manifest) || JSON.parse(readFileSync(manifest, "utf8")).name !== "@weasel-js/forge") {
516
+ continue;
517
+ }
518
+ const source = !relative(join(dir, "src"), here).startsWith("..");
519
+ return realms.map((realm) => join(dir, source ? `src/${realm}/index.ts` : `dist/${realm}/index.js`));
520
+ }
521
+ return [];
522
+ }
511
523
  var SHIMS = [
512
524
  [/^@?storybook\/preview-api$/, "@weasel-js/forge/preview-api"],
513
525
  [/^@?storybook\/test$/, "@weasel-js/forge/play"]
@@ -528,18 +540,6 @@ function storybookShims() {
528
540
  var PREFIX = "virtual:forge/";
529
541
  var MODULES = /* @__PURE__ */ new Set(["index.js", "importers.js", "deps.js", "frame-config.js", "shell-config.js", "shell-entry.js", "frame-entry.js"]);
530
542
  var PAGES2 = { "/": "shell-entry.js", "/index.html": "shell-entry.js", "/frame.html": "frame-entry.js" };
531
- function ownEntries() {
532
- const here = fileURLToPath(import.meta.url);
533
- for (let dir = dirname(here); dir !== dirname(dir); dir = dirname(dir)) {
534
- const manifest = join(dir, "package.json");
535
- if (!existsSync(manifest) || JSON.parse(readFileSync(manifest, "utf8")).name !== "@weasel-js/forge") {
536
- continue;
537
- }
538
- const source = !relative(join(dir, "src"), here).startsWith("..");
539
- return ["shell", "frame"].map((realm) => join(dir, source ? `src/${realm}/index.ts` : `dist/${realm}/index.js`));
540
- }
541
- return [];
542
- }
543
543
  function forge(options) {
544
544
  let root = process.cwd();
545
545
  let base = "/";
@@ -686,7 +686,7 @@ import.meta.hot?.accept('virtual:forge/importers.js', () => location.reload());
686
686
  const entries = [
687
687
  ...options.stories,
688
688
  ...[options.frameConfig, options.shellConfig].flatMap((path) => path ? [resolve(at, path)] : []),
689
- ...ownEntries()
689
+ ...ownEntries(["shell", "frame"])
690
690
  ];
691
691
  const optimizeDeps = { entries };
692
692
  if (command !== "build") return { optimizeDeps };
@@ -764,6 +764,15 @@ function forgeTest(options) {
764
764
  {
765
765
  name: "weaselforge:test",
766
766
  enforce: "pre",
767
+ config(config) {
768
+ const at = resolve(config.root ?? process.cwd());
769
+ const entries = [
770
+ ...options.stories,
771
+ ...options.frameConfig ? [resolve(at, options.frameConfig)] : [],
772
+ ...ownEntries(["test"])
773
+ ];
774
+ return { optimizeDeps: { entries } };
775
+ },
767
776
  configResolved(config) {
768
777
  root = config.root;
769
778
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/vite/html.ts","../../src/vite/build.ts","../../src/vite/autoTitle.ts","../../src/vite/depGraph.ts","../../src/vite/indexFile.ts","../../src/vite/storybookShims.ts","../../src/vite/plugin.ts","../../src/vite/forgeTest.ts"],"names":["resolve","dirname","relative","sep","autoTitle","parse","forge","PAGES","fileURLToPath","join","files","matchesGlob","read"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * The document forge serves for `entry`, one of its `virtual:forge/*-entry.js` modules. A build hands the\n * bare id to its own resolver; the dev server needs the `/@id/` form a browser can request.\n */\nexport function html(entry: string, mode: 'serve' | 'build' = 'serve'): string {\n const src = `${mode === 'serve' ? '/@id/' : ''}virtual:forge/${entry}`;\n return `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>weaselforge</title>\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\" src=\"${src}\"></script>\n </body>\n</html>\n`;\n}\n","import { mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { html } from './html.ts';\n\nconst DIR = 'node_modules/.forge';\ntype Source = string | Uint8Array;\n\nconst PAGES: Record<string, string> = { index: 'shell-entry.js', frame: 'frame-entry.js' };\n\n/** Writes a build document per forge page under `<root>/node_modules/.forge`, returning them as build inputs. */\nexport function writePages(root: string): Record<string, string> {\n const dir = join(root, DIR);\n mkdirSync(dir, { recursive: true });\n return Object.fromEntries(\n Object.entries(PAGES).map(([name, entry]) => {\n const file = join(dir, `${name}.html`);\n writeFileSync(file, html(entry, 'build'));\n return [name, file];\n }),\n );\n}\n\n/** Vite wrote a relative base's urls from two directories down; the documents now sit at the output root. */\nconst up = (source: Source) =>\n (typeof source === 'string' ? source : new TextDecoder().decode(source)).replace(/(\\s(?:src|href)=\")\\.\\.\\/\\.\\.\\//g, '$1./');\n\n/** Replaces the documents vite emitted at their input path with copies at the output root. */\nexport function hoistPages(\n bundle: Record<string, { type: string; source?: Source }>,\n emit: (file: { type: 'asset'; fileName: string; source: Source }) => void,\n): void {\n for (const name of Object.keys(PAGES)) {\n const from = `${DIR}/${name}.html`;\n const asset = bundle[from];\n if (asset?.type !== 'asset' || asset.source === undefined) continue;\n delete bundle[from];\n emit({ type: 'asset', fileName: `${name}.html`, source: up(asset.source) });\n }\n}\n","import { dirname, matchesGlob, relative, resolve, sep } from 'node:path';\n\n// A port of Storybook 10.4.0's auto-title (preview-api `userOrAutoTitle`, common `normalizeStoriesEntry`)\n// for string `stories` entries, which carry no title prefix. It must agree with Storybook or ids and links diverge.\n\nconst posix = (path: string): string => path.split(sep).join('/');\n\n/** Storybook's `normalizeStoryPath`. */\nconst dotted = (path: string): string => (/^\\.{1,2}([/\\\\]|$)/.test(path) ? path : `./${path}`);\n\n/** The directory a stories glob searches from: picomatch `scan`'s `prefix + base`, or a file's directory. */\nexport function globDirectory(pattern: string): string {\n const segments = pattern.split('/');\n const magic = segments.findIndex((segment) => /^!|(^|[^\\\\])[*?[{(]/.test(segment));\n return magic === -1 ? dirname(pattern) : segments.slice(0, magic).join('/');\n}\n\n/** Storybook's `sanitize` in autoTitle: strips the extension, then collapses `Button/Button`, `index` and `stories.js`. */\nfunction titleParts(parts: string[]): string[] {\n const last = parts[parts.length - 1];\n if (last === undefined) return parts;\n const stripped = last.replace(/(?:[.](?:story|stories))?([.][^.]+)$/i, '');\n if (parts.length === 1) return [stripped];\n const nextToLast = parts[parts.length - 2];\n if (stripped && nextToLast && stripped.toLowerCase() === nextToLast.toLowerCase()) return [...parts.slice(0, -2), stripped];\n if (stripped && (/^(story|stories)([.][^.]+)$/i.test(last) || /^index$/i.test(stripped))) return parts.slice(0, -1);\n return [...parts.slice(0, -1), stripped];\n}\n\nconst titleFrom = (importPath: string, directory: string): string =>\n titleParts(importPath.replace(directory, '').split('/').filter(Boolean)).join('/');\n\n/**\n * The title Storybook gives a story file whose meta names none: its path under the directory of the first\n * `stories` glob that matches it. A file no glob matches is titled from its path under `root`.\n */\nexport function autoTitle(file: string, root: string, stories: readonly string[]): string {\n const path = posix(relative(root, file));\n const importPath = dotted(path);\n for (const pattern of stories) {\n if (!matchesGlob(path, pattern.replace(/^\\.\\//, ''))) continue;\n const directory = dotted(posix(relative(root, resolve(root, globDirectory(pattern))))).replace(/\\/$/, '');\n return titleFrom(importPath, directory);\n }\n return titleFrom(importPath, '.');\n}\n","import { type ParserPlugin, parse } from '@babel/parser';\nimport type * as t from '@babel/types';\nimport { dirname, relative, sep } from 'node:path';\nimport { isGallery } from '../story/tags.ts';\nimport type { ComponentDeps, DepGraph, IndexEntry } from '../story/types.ts';\n\n/** Resolves an import as the bundler would: an absolute file, or null for anything that is not one. */\nexport type ResolveImport = (specifier: string, importer: string) => Promise<string | null>;\n\nexport interface DepGraphOptions {\n root: string;\n read: (file: string) => string;\n}\n\nexport interface DepGraphBuilder {\n build(entries: readonly IndexEntry[], resolve: ResolveImport): Promise<DepGraph>;\n /** Drops what was read from `file`. True when the graph had read it, so the graph may have changed. */\n invalidate(file: string): boolean;\n /** Drops every cached import resolution, keeping the parsed files. */\n reset(): void;\n}\n\ninterface Import {\n spec: string;\n /** `*` for a namespace import. */\n imported: string;\n}\n\ntype Export = { kind: 'local'; local: string } | { kind: 'from'; spec: string; imported: string };\n\ninterface ModuleInfo {\n imports: Map<string, Import>;\n exports: Map<string, Export>;\n stars: string[];\n /** Per top-level binding, the names its declaration refers to. */\n refs: Map<string, Set<string>>;\n}\n\n/** A declared binding: the file declaring it and its name there. */\ntype Key = string;\nconst keyOf = (file: string, local: string): Key => `${file}#${local}`;\nconst fileOfKey = (key: Key): string => key.slice(0, key.lastIndexOf('#'));\n\nconst SCRIPT = /\\.[cm]?[jt]sx?$/;\nconst DEFAULT_LOCAL = '*default*';\n/** Keys holding types, which name no value a component could render. */\nconst TYPE_KEYS = new Set(['typeAnnotation', 'typeParameters', 'typeArguments', 'returnType', 'superTypeParameters', 'implements']);\n\n/**\n * The component graph of `entries`, derived from source: each component is the binding its story file's meta names\n * (or, when that is declared in the story file itself, the import the title's last segment names), found by\n * following imports and re-exports to the file declaring it. What a component uses is every listed component that\n * its own declaration reaches, directly or through the file's local helpers and the relative imports in its own\n * directory. Each file is read and parsed once and each import resolved once, until `invalidate` names it.\n */\nexport function createDepGraph({ root, read }: DepGraphOptions): DepGraphBuilder {\n const modules = new Map<string, ModuleInfo | null>();\n const resolutions = new Map<string, Map<string, Promise<string | null>>>();\n\n const info = (file: string): ModuleInfo | null => {\n if (!modules.has(file)) {\n let parsed: ModuleInfo | null = null;\n try {\n parsed = moduleInfo(read(file), file);\n } catch {\n parsed = null;\n }\n modules.set(file, parsed);\n }\n return modules.get(file) ?? null;\n };\n\n return {\n invalidate(file) {\n const known = modules.has(file) || resolutions.has(file);\n modules.delete(file);\n resolutions.delete(file);\n return known;\n },\n\n reset() {\n resolutions.clear();\n },\n\n async build(entries, resolve) {\n const resolveFrom = (spec: string, importer: string): Promise<string | null> => {\n let byImporter = resolutions.get(importer);\n if (!byImporter) {\n byImporter = new Map();\n resolutions.set(importer, byImporter);\n }\n let pending = byImporter.get(spec);\n if (!pending) {\n pending = resolve(spec, importer).then(\n (id) => {\n const file = id?.split('?')[0];\n return file && !file.startsWith('\\0') && SCRIPT.test(file) && !file.split(/[\\\\/]/).includes('node_modules') ? file : null;\n },\n () => null,\n );\n byImporter.set(spec, pending);\n }\n return pending;\n };\n\n /** The binding `name` exported from `file` is declared as, through re-exports. */\n const declaring = async (file: string, name: string, depth = 0): Promise<Key | null> => {\n const mod = info(file);\n if (!mod || depth > 32) return null;\n const exp = mod.exports.get(name);\n if (exp?.kind === 'local') {\n const imp = mod.imports.get(exp.local);\n return imp ? importKey(file, imp, depth + 1) : keyOf(file, exp.local);\n }\n if (exp?.kind === 'from') {\n const target = await resolveFrom(exp.spec, file);\n return target ? declaring(target, exp.imported, depth + 1) : null;\n }\n if (name === 'default') return null;\n for (const spec of mod.stars) {\n const target = await resolveFrom(spec, file);\n const found = target ? await declaring(target, name, depth + 1) : null;\n if (found) return found;\n }\n return null;\n };\n\n const importKey = async (importer: string, imp: Import, depth = 0): Promise<Key | null> => {\n if (imp.imported === '*') return null;\n const target = await resolveFrom(imp.spec, importer);\n return target ? declaring(target, imp.imported, depth) : null;\n };\n\n /** The component a story file's meta stands for. */\n const componentOf = async (entry: IndexEntry): Promise<Key | null> => {\n const mod = info(entry.file);\n if (!mod) return null;\n const byTitle = entry.title.split('/').pop()?.replace(/\\s+/g, '');\n for (const local of [entry.componentName, byTitle]) {\n const imp = local ? mod.imports.get(local) : undefined;\n const key = imp ? await importKey(entry.file, imp) : null;\n if (key) return key;\n }\n return null;\n };\n\n const titles = new Map<string, IndexEntry[]>();\n for (const entry of entries) {\n if (isGallery(entry)) continue;\n const list = titles.get(entry.title);\n if (list) list.push(entry);\n else titles.set(entry.title, [entry]);\n }\n\n const components = new Map<string, Key | null>();\n const byKey = new Map<Key, string[]>();\n for (const [title, list] of titles) {\n let key: Key | null = null;\n for (const file of new Set(list.map((e) => e.file))) {\n key = await componentOf(list.find((e) => e.file === file) as IndexEntry);\n if (key) break;\n }\n components.set(title, key);\n if (key) byKey.set(key, [...(byKey.get(key) ?? []), title]);\n }\n const componentFiles = new Set([...byKey.keys()].map(fileOfKey));\n\n /** The keys `key`'s own source reaches that are other components. */\n const reached = async (key: Key): Promise<Set<Key>> => {\n const out = new Set<Key>();\n const home = fileOfKey(key);\n const homeDir = dirname(home);\n const visited = new Set<string>();\n\n const walkFile = async (file: string, roots: readonly string[] | null): Promise<void> => {\n const mod = info(file);\n if (!mod) return;\n const locals = new Set<string>();\n if (roots === null) {\n for (const name of mod.refs.keys()) locals.add(name);\n for (const name of mod.imports.keys()) locals.add(name);\n } else {\n const queue = [...roots];\n while (queue.length > 0) {\n const name = queue.pop() as string;\n if (locals.has(name)) continue;\n locals.add(name);\n const here = keyOf(file, name);\n if (here !== key && byKey.has(here)) {\n out.add(here);\n continue;\n }\n for (const ref of mod.refs.get(name) ?? []) {\n if (mod.refs.has(ref) || mod.imports.has(ref)) queue.push(ref);\n }\n }\n }\n for (const name of locals) {\n const imp = mod.imports.get(name);\n if (!imp) continue;\n const target = await importKey(file, imp);\n if (target && byKey.has(target)) {\n if (target !== key) out.add(target);\n continue;\n }\n if (!imp.spec.startsWith('.')) continue;\n const helper = await resolveFrom(imp.spec, file);\n if (!helper || visited.has(helper) || componentFiles.has(helper)) continue;\n if (relative(homeDir, helper).startsWith('..')) continue;\n visited.add(helper);\n await walkFile(helper, null);\n }\n };\n\n visited.add(home);\n await walkFile(home, [key.slice(home.length + 1)]);\n return out;\n };\n\n const graph: DepGraph = {};\n for (const [title, key] of components) {\n graph[title] = { source: key ? relative(root, fileOfKey(key)).split(sep).join('/') : null, uses: [], usedBy: [] };\n }\n for (const [title, key] of components) {\n if (!key) continue;\n const uses = new Set<string>();\n for (const target of await reached(key)) {\n for (const other of byKey.get(target) ?? []) if (other !== title) uses.add(other);\n }\n const node = graph[title] as ComponentDeps;\n node.uses = [...uses].sort();\n for (const other of node.uses) graph[other]?.usedBy.push(title);\n }\n for (const node of Object.values(graph)) node.usedBy.sort();\n return Object.fromEntries(Object.entries(graph).sort(([a], [b]) => a.localeCompare(b)));\n },\n };\n}\n\nfunction moduleInfo(code: string, file: string): ModuleInfo {\n const plugins: ParserPlugin[] = ['typescript', 'decorators-legacy', ...(/\\.[cm]?[jt]sx$/.test(file) ? (['jsx'] as const) : [])];\n const program = parse(code, { sourceType: 'module', plugins }).program;\n const imports = new Map<string, Import>();\n const exports = new Map<string, Export>();\n const stars: string[] = [];\n const refs = new Map<string, Set<string>>();\n const declare = (name: string, node: t.Node | null | undefined) => refs.set(name, node ? namesIn(node) : new Set());\n\n const declareStatement = (decl: t.Node | null | undefined): string[] => {\n if (!decl) return [];\n switch (decl.type) {\n case 'FunctionDeclaration':\n case 'ClassDeclaration':\n if (!decl.id) return [];\n declare(decl.id.name, decl);\n return [decl.id.name];\n case 'VariableDeclaration':\n return decl.declarations.flatMap((d) => {\n if (d.id.type !== 'Identifier') return [];\n declare(d.id.name, d.init);\n return [d.id.name];\n });\n default:\n return [];\n }\n };\n\n for (const stmt of program.body) {\n switch (stmt.type) {\n case 'ImportDeclaration':\n if (stmt.importKind === 'type') break;\n for (const spec of stmt.specifiers) {\n if (spec.type === 'ImportSpecifier' && spec.importKind === 'type') continue;\n const imported =\n spec.type === 'ImportNamespaceSpecifier' ? '*' : spec.type === 'ImportDefaultSpecifier' ? 'default' : nameOf(spec.imported);\n imports.set(spec.local.name, { spec: stmt.source.value, imported });\n }\n break;\n case 'ExportNamedDeclaration':\n if (stmt.exportKind === 'type') break;\n for (const name of declareStatement(stmt.declaration)) exports.set(name, { kind: 'local', local: name });\n for (const spec of stmt.specifiers) {\n if (spec.type === 'ExportSpecifier' && spec.exportKind === 'type') continue;\n if (spec.type !== 'ExportSpecifier') continue;\n const exported = nameOf(spec.exported);\n const local = nameOf(spec.local);\n exports.set(exported, stmt.source ? { kind: 'from', spec: stmt.source.value, imported: local } : { kind: 'local', local });\n }\n break;\n case 'ExportAllDeclaration':\n if (stmt.exportKind !== 'type') stars.push(stmt.source.value);\n break;\n case 'ExportDefaultDeclaration': {\n const decl = stmt.declaration;\n const named = (decl.type === 'FunctionDeclaration' || decl.type === 'ClassDeclaration') && decl.id ? decl.id.name : null;\n if (named) declare(named, decl);\n else if (decl.type === 'Identifier') {\n exports.set('default', { kind: 'local', local: decl.name });\n break;\n } else declare(DEFAULT_LOCAL, decl);\n exports.set('default', { kind: 'local', local: named ?? DEFAULT_LOCAL });\n break;\n }\n default:\n declareStatement(stmt);\n }\n }\n return { imports, exports, stars, refs };\n}\n\nfunction nameOf(node: t.Identifier | t.StringLiteral): string {\n return node.type === 'Identifier' ? node.name : node.value;\n}\n\n/** Every identifier `node` refers to as a value, JSX tags included. Types and property names are left out. */\nfunction namesIn(node: t.Node): Set<string> {\n const out = new Set<string>();\n const walk = (value: unknown, key?: string): void => {\n if (key !== undefined && TYPE_KEYS.has(key)) return;\n if (Array.isArray(value)) {\n for (const item of value) walk(item);\n return;\n }\n if (!value || typeof value !== 'object' || typeof (value as { type?: unknown }).type !== 'string') return;\n const n = value as t.Node;\n if (n.type.startsWith('TS') && !('expression' in n)) return;\n if (n.type === 'Identifier' || n.type === 'JSXIdentifier') {\n out.add(n.name);\n return;\n }\n for (const [k, child] of Object.entries(n)) {\n if (k === 'leadingComments' || k === 'trailingComments' || k === 'innerComments' || k === 'loc') continue;\n if ((n.type === 'MemberExpression' || n.type === 'OptionalMemberExpression') && k === 'property' && !n.computed) continue;\n if (n.type === 'JSXMemberExpression' && k === 'property') continue;\n if ((n.type === 'ObjectProperty' || n.type === 'ObjectMethod' || n.type === 'ClassMethod' || n.type === 'ClassProperty') && k === 'key' && !n.computed) continue;\n if (n.type === 'JSXAttribute' && k === 'name') continue;\n walk(child, k);\n }\n };\n walk(node);\n return out;\n}\n","import { type ParserPlugin, parse } from '@babel/parser';\nimport type * as t from '@babel/types';\nimport { storyId, storyNameFromExport } from '../story/ids.ts';\nimport type { IndexEntry } from '../story/types.ts';\n\ntype Bindings = Map<string, t.Node>;\n\n/** The stories `code` declares, in source order, without running it. `file` is absolute; `autoTitle` titles a meta that names none. */\nexport function indexFile(code: string, file: string, autoTitle: string): IndexEntry[] {\n try {\n const plugins: ParserPlugin[] = ['typescript', 'decorators-legacy', ...(/\\.[jt]sx$/.test(file) ? (['jsx'] as const) : [])];\n return indexProgram(parse(code, { sourceType: 'module', plugins }).program, file, autoTitle);\n } catch (err) {\n throw new Error(`${file}: ${err instanceof Error ? err.message : String(err)}`, { cause: err });\n }\n}\n\nfunction indexProgram(program: t.Program, file: string, autoTitle: string): IndexEntry[] {\n const bindings: Bindings = new Map();\n const wrappers = new Set<string>();\n for (const stmt of program.body) {\n if (stmt.type === 'ImportDeclaration' && stmt.source.value === '@weasel-js/forge') {\n for (const spec of stmt.specifiers) {\n if (spec.type === 'ImportSpecifier' && ['meta', 'story'].includes(exportedName(spec.imported))) {\n wrappers.add(spec.local.name);\n }\n }\n }\n const decl = stmt.type === 'ExportNamedDeclaration' ? stmt.declaration : stmt;\n if (decl?.type === 'VariableDeclaration') {\n for (const d of decl.declarations) if (d.id.type === 'Identifier' && d.init) bindings.set(d.id.name, d.init);\n }\n }\n\n let metaNode: t.Node | undefined;\n let metaDoc: string | undefined;\n const exported: { name: string; node: t.Node | undefined; doc: string | undefined }[] = [];\n for (const stmt of program.body) {\n if (stmt.type === 'ExportDefaultDeclaration') {\n metaNode = stmt.declaration;\n metaDoc = docOf(stmt);\n }\n if (stmt.type !== 'ExportNamedDeclaration' || stmt.exportKind === 'type') continue;\n const doc = docOf(stmt);\n const decl = stmt.declaration;\n if (decl?.type === 'VariableDeclaration') {\n for (const d of decl.declarations) {\n if (d.id.type === 'Identifier') exported.push({ name: d.id.name, node: d.init ?? undefined, doc: docOf(d) ?? doc });\n }\n } else if (decl?.type === 'FunctionDeclaration' && decl.id) {\n exported.push({ name: decl.id.name, node: undefined, doc });\n }\n for (const spec of stmt.specifiers) {\n if (spec.type !== 'ExportSpecifier' || spec.exportKind === 'type') continue;\n const name = exportedName(spec.exported);\n const node = stmt.source ? undefined : bindings.get(exportedName(spec.local));\n if (name === 'default') {\n metaNode = node;\n metaDoc ??= doc;\n } else exported.push({ name, node, doc });\n }\n }\n if (!metaNode && !program.body.some(isDefaultExport)) return [];\n\n const meta = objectOf(metaNode, bindings, wrappers);\n const title = stringProp(meta, 'title') ?? autoTitle;\n const include = storyFilter(meta, 'includeStories');\n const exclude = storyFilter(meta, 'excludeStories');\n const componentNode = prop(meta, 'component');\n const componentName = componentNode?.type === 'Identifier' ? componentNode.name : undefined;\n const metaIsolate = isolateOf(meta, bindings, wrappers, 'default');\n const metaTags = tagsOf(meta);\n\n return exported\n .filter(({ name }) => name !== '__namedExportsOrder')\n .filter(({ name }) => (!include || include(name)) && (!exclude || !exclude(name)))\n .map(({ name, node, doc }) => {\n const spec = objectOf(node, bindings, wrappers);\n const isolate = isolateOf(spec, bindings, wrappers, name) ?? metaIsolate;\n const tags = combineTags(metaTags, tagsOf(spec));\n return {\n id: storyId(title, name),\n title,\n name: stringProp(spec, 'name') ?? stringProp(spec, 'storyName') ?? storyNameFromExport(name),\n exportName: name,\n file,\n ...(doc === undefined ? {} : { description: doc }),\n ...(metaDoc === undefined ? {} : { componentDescription: metaDoc }),\n ...(componentName === undefined ? {} : { componentName }),\n ...(isolate === undefined ? {} : { isolate }),\n ...(tags === undefined ? {} : { tags }),\n };\n });\n}\n\n/**\n * The reason `obj` isolates its story: `isolate` on a native meta or story, `parameters.forge.isolate` in CSF.\n * It must be a string literal, because the shell reads it without importing the module.\n */\nfunction isolateOf(obj: t.ObjectExpression | null, bindings: Bindings, wrappers: Set<string>, exportName: string): string | undefined {\n const parameters = objectOf(prop(obj, 'parameters'), bindings, wrappers);\n const forge = objectOf(prop(parameters, 'forge'), bindings, wrappers);\n const value = prop(obj, 'isolate') ?? prop(forge, 'isolate');\n if (value === undefined) return undefined;\n const literal = stringLiteral(value);\n if (literal === undefined) throw new Error(`${exportName}: isolate must be a string literal`);\n return literal;\n}\n\n/** `obj`'s `tags`: the string literals of an array literal. */\nfunction tagsOf(obj: t.ObjectExpression | null): string[] | undefined {\n const value = prop(obj, 'tags');\n if (value?.type !== 'ArrayExpression') return undefined;\n return value.elements.flatMap((e) => (e ? (stringLiteral(e) ?? []) : []));\n}\n\n/** A story's tags as Storybook combines them: the meta's, then its own, where `!tag` removes `tag`. */\nfunction combineTags(meta: string[] | undefined, own: string[] | undefined): string[] | undefined {\n if (meta === undefined && own === undefined) return undefined;\n const out = new Set(meta);\n for (const tag of own ?? []) {\n if (tag.startsWith('!')) out.delete(tag.slice(1));\n else out.add(tag);\n }\n return [...out];\n}\n\n/** The value of a plain string literal or an expression-free template literal. */\nfunction stringLiteral(node: t.Node): string | undefined {\n if (node.type === 'StringLiteral') return node.value;\n if (node.type === 'TemplateLiteral' && node.expressions.length === 0) return node.quasis.map((q) => q.value.cooked ?? q.value.raw).join('');\n return undefined;\n}\n\nfunction isDefaultExport(stmt: t.Statement): boolean {\n if (stmt.type === 'ExportDefaultDeclaration') return true;\n return (\n stmt.type === 'ExportNamedDeclaration' &&\n stmt.specifiers.some((s) => s.type === 'ExportSpecifier' && exportedName(s.exported) === 'default')\n );\n}\n\n/**\n * The JSDoc block immediately above `node`, as prose. A `//` comment is not\n * one: a line comment above an export is as often a note to the author as a\n * description of the story, and printing it in the dossier would be guessing.\n */\nfunction docOf(node: t.Node): string | undefined {\n const comments = node.leadingComments;\n const last = comments?.[comments.length - 1];\n if (last?.type !== 'CommentBlock' || !last.value.startsWith('*')) return undefined;\n const text = last.value\n .slice(1)\n .split('\\n')\n .map((line) => line.replace(/^\\s*\\*/, '').trim())\n .join('\\n')\n .trim();\n return text || undefined;\n}\n\nfunction exportedName(node: t.Identifier | t.StringLiteral): string {\n return node.type === 'Identifier' ? node.name : node.value;\n}\n\n/** The object literal `node` evaluates to, through casts, `meta(…)`/`story(…)` and top-level `const`s. */\nfunction objectOf(node: t.Node | undefined, bindings: Bindings, wrappers: Set<string>, depth = 0): t.ObjectExpression | null {\n if (!node || depth > 16) return null;\n switch (node.type) {\n case 'ObjectExpression':\n return node;\n case 'TSSatisfiesExpression':\n case 'TSAsExpression':\n case 'TSTypeAssertion':\n case 'TSNonNullExpression':\n case 'ParenthesizedExpression':\n return objectOf(node.expression, bindings, wrappers, depth + 1);\n case 'CallExpression':\n return node.callee.type === 'Identifier' && wrappers.has(node.callee.name)\n ? objectOf(node.arguments[0], bindings, wrappers, depth + 1)\n : null;\n case 'Identifier':\n return objectOf(bindings.get(node.name), bindings, wrappers, depth + 1);\n default:\n return null;\n }\n}\n\nfunction prop(obj: t.ObjectExpression | null, key: string): t.Node | undefined {\n for (const p of obj?.properties ?? []) {\n if (p.type !== 'ObjectProperty' || p.computed) continue;\n const name = p.key.type === 'Identifier' ? p.key.name : p.key.type === 'StringLiteral' ? p.key.value : null;\n if (name === key) return p.value;\n }\n return undefined;\n}\n\nfunction stringProp(obj: t.ObjectExpression | null, key: string): string | undefined {\n const value = prop(obj, key);\n return value?.type === 'StringLiteral' ? value.value : undefined;\n}\n\n/** `includeStories`/`excludeStories` as a predicate, when written as a string array or a regex literal. */\nfunction storyFilter(obj: t.ObjectExpression | null, key: string): ((name: string) => boolean) | null {\n const value = prop(obj, key);\n if (value?.type === 'RegExpLiteral') {\n const re = new RegExp(value.pattern, value.flags.replace(/[gy]/g, ''));\n return (name) => re.test(name);\n }\n if (value?.type === 'ArrayExpression' && value.elements.every((e) => e?.type === 'StringLiteral')) {\n const names = new Set(value.elements.map((e) => (e as t.StringLiteral).value));\n return (name) => names.has(name);\n }\n return null;\n}\n","import { fileURLToPath } from 'node:url';\nimport type { Plugin } from 'vite';\n\n/** Storybook specifiers a CSF file may import, and the forge entry each answers to. */\nconst SHIMS: readonly (readonly [RegExp, string])[] = [\n [/^@?storybook\\/preview-api$/, '@weasel-js/forge/preview-api'],\n [/^@?storybook\\/test$/, '@weasel-js/forge/play'],\n];\n\n/** Points the Storybook runtime specifiers a CSF file may carry at forge's own entries. */\nexport function storybookShims(): Plugin {\n // Resolved from forge's own location, through the app's aliases, so a monorepo reaches source and an install reaches dist.\n return {\n name: 'weaselforge:storybook-shims',\n enforce: 'pre',\n resolveId(id) {\n const hit = SHIMS.find(([pattern]) => pattern.test(id));\n if (!hit) return undefined;\n return this.resolve(hit[1], fileURLToPath(import.meta.url), { skipSelf: true });\n },\n };\n}\n","import { existsSync, globSync, readFileSync, statSync } from 'node:fs';\nimport { basename, dirname, join, matchesGlob, relative, resolve, sep } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { Logger, Plugin, ViteDevServer } from 'vite';\nimport type { IndexEntry } from '../story/types.ts';\nimport { hoistPages, writePages } from './build.ts';\nimport { autoTitle } from './autoTitle.ts';\nimport { createDepGraph, type DepGraphBuilder, type ResolveImport } from './depGraph.ts';\nimport { html } from './html.ts';\nimport { indexFile } from './indexFile.ts';\nimport { storybookShims } from './storybookShims.ts';\n\nexport interface ForgeOptions {\n /** Globs of story files, relative to the vite root. */\n stories: string[];\n /** Path to the frame config module, relative to the vite root. Only frame documents import it. Optional. */\n frameConfig?: string;\n /** Path to the shell config module, relative to the vite root. Only the workshop page imports it. Optional. */\n shellConfig?: string;\n /** Alias Storybook's runtime modules to forge shims (Task 13). Default true. */\n storybookShims?: boolean;\n}\n\nconst PREFIX = 'virtual:forge/';\nconst MODULES = new Set(['index.js', 'importers.js', 'deps.js', 'frame-config.js', 'shell-config.js', 'shell-entry.js', 'frame-entry.js']);\nconst PAGES: Record<string, string> = { '/': 'shell-entry.js', '/index.html': 'shell-entry.js', '/frame.html': 'frame-entry.js' };\n\n/** forge's shell and frame entry modules: source beside this file in a checkout, the built entries in an install. */\nfunction ownEntries(): string[] {\n const here = fileURLToPath(import.meta.url);\n for (let dir = dirname(here); dir !== dirname(dir); dir = dirname(dir)) {\n const manifest = join(dir, 'package.json');\n if (!existsSync(manifest) || (JSON.parse(readFileSync(manifest, 'utf8')) as { name?: string }).name !== '@weasel-js/forge') {\n continue;\n }\n const source = !relative(join(dir, 'src'), here).startsWith('..');\n return ['shell', 'frame'].map((realm) => join(dir, source ? `src/${realm}/index.ts` : `dist/${realm}/index.js`));\n }\n return [];\n}\n\nexport function forge(options: ForgeOptions): Plugin[] {\n let root = process.cwd();\n let base = '/';\n let byFile: Map<string, IndexEntry[]> | null = null;\n let logger: Logger | undefined;\n let deps: DepGraphBuilder | null = null;\n /** The graph last served or pushed; null until a page first asks for it, so no edit rebuilds it before then. */\n let depsSent: string | null = null;\n let depsPending: Promise<void> | null = null;\n\n const glob = (): string[] => {\n const files = options.stories.flatMap((pattern) =>\n globSync(pattern, { cwd: root, exclude: (name) => basename(String(name)) === 'node_modules' })\n .map((f) => resolve(root, f))\n // A failed story run leaves `__screenshots__/<file>.stories.tsx/` directories that match the globs.\n .filter((f) => statSync(f).isFile())\n .sort(),\n );\n return [...new Set(files)];\n };\n const matches = (file: string): boolean => {\n const path = relative(root, file).split(sep).join('/');\n return !path.split('/').includes('node_modules') && options.stories.some((pattern) => matchesGlob(path, pattern));\n };\n const read = (file: string) => indexFile(readFileSync(file, 'utf8'), file, autoTitle(file, root, options.stories));\n const logError = (err: unknown) => logger?.error(`[forge] ${err instanceof Error ? err.message : String(err)}`);\n /** A file that fails to parse stays in the map with no entries, so an edit that fixes it re-indexes it. */\n const files = (): Map<string, IndexEntry[]> => {\n byFile ??= new Map(\n glob().map((file) => {\n try {\n return [file, read(file)];\n } catch (err) {\n logError(err);\n return [file, []];\n }\n }),\n );\n return byFile;\n };\n const index = () => [...files().values()].flat();\n const depGraph = (): DepGraphBuilder => (deps ??= createDepGraph({ root, read: (file) => readFileSync(file, 'utf8') }));\n\n const configModule = (path: string | undefined) =>\n path ? `export { default } from ${JSON.stringify(resolve(root, path))};\\n` : 'export default {};\\n';\n\n const modules: Record<string, () => string> = {\n 'index.js': () => `export default ${JSON.stringify(index())};\\n`,\n 'importers.js': () => {\n const lines = [...files()]\n .filter(([, entries]) => entries.length > 0)\n .map(([file]) => ` ${JSON.stringify(file)}: () => import(${JSON.stringify(file)}),`);\n return `export default {\\n${lines.join('\\n')}\\n};\\n`;\n },\n 'frame-config.js': () => configModule(options.frameConfig),\n 'shell-config.js': () => configModule(options.shellConfig),\n 'shell-entry.js': () => `import { mountWorkshop } from '@weasel-js/forge/shell';\nimport '@weasel-js/labkit/styles.css';\nimport '@weasel-js/forge/shell.css';\nimport index from 'virtual:forge/index.js';\nimport importers from 'virtual:forge/importers.js';\nimport config from 'virtual:forge/shell-config.js';\nimport setup from 'virtual:forge/frame-config.js';\n\nconst workshop = mountWorkshop({\n index,\n importers,\n setup,\n config,\n frameUrl: ${JSON.stringify(`${base}frame.html`)},\n stories: ${JSON.stringify(options.stories)},\n});\nimport.meta.hot?.on('forge:index', (next) => workshop.setIndex(next));\n// Read from source on first request, so the graph costs nothing until the page is up.\nimport('virtual:forge/deps.js').then((m) => workshop.setDependencies(m.default));\nimport.meta.hot?.on('forge:deps', (next) => workshop.setDependencies(next));\n// A story edit reaches here as an update of the importers module, whose fresh import() URLs carry the new\n// timestamps; the file it names arrives just before, so the reload waits for the importers that can fetch it.\nconst stale = new Set();\nimport.meta.hot?.on('forge:story', ({ file }) => stale.add(file));\nimport.meta.hot?.accept('virtual:forge/importers.js', (next) => {\n if (!next) return;\n workshop.setImporters(next.default);\n for (const file of stale) workshop.reloadStory(file);\n stale.clear();\n});\n`,\n 'frame-entry.js': () => `import { mountFrame } from '@weasel-js/forge/frame';\nimport '@weasel-js/forge/frame.css';\nimport index from 'virtual:forge/index.js';\nimport importers from 'virtual:forge/importers.js';\nimport setup from 'virtual:forge/frame-config.js';\n\nmountFrame({ index, importers, setup });\n// The importers module is shared with the workshop page, which accepts a story edit in place; a frame document\n// showing the old module reloads instead, and without this the edit would dead-end here and reload every page.\nimport.meta.hot?.accept('virtual:forge/importers.js', () => location.reload());\n`,\n };\n\n const invalidate = (server: ViteDevServer, names: readonly string[]): void => {\n for (const env of Object.values(server.environments)) {\n for (const name of names) {\n const mod = env.moduleGraph.getModuleById(`\\0${PREFIX}${name}`);\n if (mod) env.moduleGraph.invalidateModule(mod);\n }\n }\n };\n\n /** Rebuilds the graph after an edit and pushes it when it changed. Edits landing while one runs share the next. */\n function redeps(server: ViteDevServer): void {\n if (depsSent === null || depsPending) return;\n const resolve: ResolveImport = async (spec, importer) =>\n (await server.environments.client.pluginContainer.resolveId(spec, importer))?.id ?? null;\n depsPending = Promise.resolve()\n .then(async () => {\n const graph = await depGraph().build(index(), resolve);\n const json = JSON.stringify(graph);\n if (json === depsSent) return;\n depsSent = json;\n invalidate(server, ['deps.js']);\n server.ws.send({ type: 'custom', event: 'forge:deps', data: graph });\n })\n .catch(logError)\n .finally(() => {\n depsPending = null;\n });\n }\n\n /** Re-reads a story file after `event`; true when the index changed. */\n function reindex(server: ViteDevServer, file: string, event: 'add' | 'change' | 'unlink'): boolean {\n const current = files();\n if (event === 'change' && current.has(file)) server.ws.send({ type: 'custom', event: 'forge:story', data: { file } });\n if (event === 'change' && !current.has(file)) return false;\n if (event === 'add' && !matches(file)) return false;\n if (event === 'unlink' && !current.has(file)) return false;\n\n const before = JSON.stringify(index());\n if (event === 'unlink') {\n current.delete(file);\n } else {\n try {\n current.set(file, read(file));\n } catch (err) {\n logError(err);\n return false;\n }\n }\n const next = index();\n if (JSON.stringify(next) === before) return false;\n\n invalidate(server, ['index.js', 'importers.js']);\n server.ws.send({ type: 'custom', event: 'forge:index', data: next });\n return true;\n }\n\n return [\n ...(options.storybookShims === false ? [] : [storybookShims()]),\n {\n name: 'weaselforge',\n config(config, { command }) {\n const at = resolve(config.root ?? process.cwd());\n // The pages are virtual, so vite's scan finds no entry of its own to crawl for dependencies.\n const entries = [\n ...options.stories,\n ...[options.frameConfig, options.shellConfig].flatMap((path) => (path ? [resolve(at, path)] : [])),\n ...ownEntries(),\n ];\n const optimizeDeps = { entries };\n if (command !== 'build') return { optimizeDeps };\n return { optimizeDeps, build: { rolldownOptions: { input: writePages(at) } } };\n },\n generateBundle: {\n order: 'post',\n handler(_, bundle) {\n hoistPages(bundle, (file) => this.emitFile(file));\n },\n },\n configResolved(config) {\n root = config.root;\n base = config.base;\n logger = config.logger;\n byFile = null;\n deps = null;\n depsSent = null;\n },\n resolveId(id) {\n return id.startsWith(PREFIX) && MODULES.has(id.slice(PREFIX.length)) ? `\\0${id}` : undefined;\n },\n async load(id) {\n if (!id.startsWith(`\\0${PREFIX}`)) return undefined;\n const name = id.slice(PREFIX.length + 1);\n if (name !== 'deps.js') return modules[name]?.();\n const graph = await depGraph().build(index(), async (spec, importer) => (await this.resolve(spec, importer))?.id ?? null);\n depsSent = JSON.stringify(graph);\n return `export default ${depsSent};\\n`;\n },\n configureServer(server) {\n server.watcher.add([...files().keys()]);\n for (const event of ['add', 'change', 'unlink'] as const) {\n server.watcher.on(event, (path) => {\n const file = resolve(path);\n const indexed = reindex(server, file, event);\n // A new file can answer an import that resolved to nothing before.\n const added = event === 'add' && /\\.[cm]?[jt]sx?$/.test(file) && !file.split(sep).includes('node_modules');\n if (added) depGraph().reset();\n const read = added || (event !== 'add' && depGraph().invalidate(file));\n if (indexed || read) redeps(server);\n });\n }\n server.middlewares.use((req, res, next) => {\n const url = req.url ?? '/';\n const path = url.split('?')[0] ?? '/';\n const prefix = base.endsWith('/') ? base.slice(0, -1) : base;\n const page = path === prefix ? '/' : path.startsWith(`${prefix}/`) ? path.slice(prefix.length) : null;\n const entry = req.method === 'GET' && page !== null ? PAGES[page] : undefined;\n if (!entry) return next();\n server.transformIndexHtml(url, html(entry)).then(\n (doc) => {\n res.statusCode = 200;\n res.setHeader('Content-Type', 'text/html');\n res.end(doc);\n },\n (err: unknown) => next(err),\n );\n });\n },\n },\n ];\n}\n","import { matchesGlob, relative, resolve, sep } from 'node:path';\nimport type { Plugin } from 'vite';\nimport { autoTitle } from './autoTitle.ts';\nimport { indexFile } from './indexFile.ts';\nimport { storybookShims } from './storybookShims.ts';\n\nexport interface ForgeTestOptions {\n /** Globs of story files, relative to the vite root. Each matching file becomes a test file. */\n stories: string[];\n /** Path to the frame config module, relative to the vite root; it sets up every story. Optional. */\n frameConfig?: string;\n /** Alias Storybook's runtime modules to forge shims. Default true. */\n storybookShims?: boolean;\n}\n\nconst TIMEOUT_MS = 15_000;\n\n/**\n * A vite plugin for vitest browser mode: every story in a matching file runs as one test, rendered and played\n * through forge's frame in the test page itself.\n */\nexport function forgeTest(options: ForgeTestOptions): Plugin[] {\n let root = process.cwd();\n\n const matches = (id: string): boolean => {\n if (id.startsWith('\\0') || id.includes('?')) return false;\n const path = relative(root, id).split(sep).join('/');\n if (path.startsWith('../') || path.split('/').includes('node_modules')) return false;\n return options.stories.some((pattern) => matchesGlob(path, pattern));\n };\n\n return [\n ...(options.storybookShims === false ? [] : [storybookShims()]),\n {\n name: 'weaselforge:test',\n enforce: 'pre',\n configResolved(config) {\n root = config.root;\n },\n transform(code, id) {\n if (!matches(id)) return undefined;\n const title = autoTitle(id, root, options.stories);\n const entries = indexFile(code, id, title);\n if (entries.length === 0) return undefined;\n const q = (value: string) => JSON.stringify(value);\n // The module comes from its own URL at test time: vitest imports a test file with a cache-busting query,\n // so a static self-import would evaluate the file a second time and register every test twice.\n const lines = [\n '',\n `import { test as __forge_test } from \"vitest\";`,\n `import { page as __forge_page } from \"vitest/browser\";`,\n `import { runStory as __forge_runStory } from \"@weasel-js/forge/test\";`,\n // shell.css draws the story host; frame.css still holds the boundary's fault rule.\n `import \"@weasel-js/forge/shell.css\";`,\n `import \"@weasel-js/forge/frame.css\";`,\n ...(options.frameConfig ? [`import __forge_frame_config from ${q(resolve(root, options.frameConfig))};`] : []),\n `const __forge_file = ${q(id)};`,\n `const __forge_title = ${q(title)};`,\n `const __forge_timeout = ${TIMEOUT_MS};`,\n 'const __forge_options = {',\n ` setup: ${options.frameConfig ? '__forge_frame_config' : 'undefined'},`,\n ' viewport: (width, height) => __forge_page.viewport(width, height),',\n '};',\n 'const __forge_run = async (exportName) => __forge_runStory(await import(/* @vite-ignore */ import.meta.url), exportName, __forge_file, __forge_title, __forge_options);',\n // An isolated story asks for a document of its own, which the test page is not; its reason goes in the name.\n ...entries.map((entry) =>\n entry.isolate === undefined\n ? `__forge_test(${q(entry.name)}, () => __forge_run(${q(entry.exportName)}), __forge_timeout);`\n : `__forge_test.skip(${q(`${entry.name} (isolated: ${entry.isolate})`)}, () => {});`,\n ),\n ];\n return { code: `${code}\\n${lines.join('\\n')}\\n`, map: null };\n },\n },\n ];\n}\n"]}
1
+ {"version":3,"sources":["../../src/vite/html.ts","../../src/vite/build.ts","../../src/vite/autoTitle.ts","../../src/vite/depGraph.ts","../../src/vite/indexFile.ts","../../src/vite/ownEntries.ts","../../src/vite/storybookShims.ts","../../src/vite/plugin.ts","../../src/vite/forgeTest.ts"],"names":["resolve","dirname","relative","sep","autoTitle","parse","forge","join","fileURLToPath","PAGES","files","matchesGlob","readFileSync","read"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * The document forge serves for `entry`, one of its `virtual:forge/*-entry.js` modules. A build hands the\n * bare id to its own resolver; the dev server needs the `/@id/` form a browser can request.\n */\nexport function html(entry: string, mode: 'serve' | 'build' = 'serve'): string {\n const src = `${mode === 'serve' ? '/@id/' : ''}virtual:forge/${entry}`;\n return `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>weaselforge</title>\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\" src=\"${src}\"></script>\n </body>\n</html>\n`;\n}\n","import { mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { html } from './html.ts';\n\nconst DIR = 'node_modules/.forge';\ntype Source = string | Uint8Array;\n\nconst PAGES: Record<string, string> = { index: 'shell-entry.js', frame: 'frame-entry.js' };\n\n/** Writes a build document per forge page under `<root>/node_modules/.forge`, returning them as build inputs. */\nexport function writePages(root: string): Record<string, string> {\n const dir = join(root, DIR);\n mkdirSync(dir, { recursive: true });\n return Object.fromEntries(\n Object.entries(PAGES).map(([name, entry]) => {\n const file = join(dir, `${name}.html`);\n writeFileSync(file, html(entry, 'build'));\n return [name, file];\n }),\n );\n}\n\n/** Vite wrote a relative base's urls from two directories down; the documents now sit at the output root. */\nconst up = (source: Source) =>\n (typeof source === 'string' ? source : new TextDecoder().decode(source)).replace(/(\\s(?:src|href)=\")\\.\\.\\/\\.\\.\\//g, '$1./');\n\n/** Replaces the documents vite emitted at their input path with copies at the output root. */\nexport function hoistPages(\n bundle: Record<string, { type: string; source?: Source }>,\n emit: (file: { type: 'asset'; fileName: string; source: Source }) => void,\n): void {\n for (const name of Object.keys(PAGES)) {\n const from = `${DIR}/${name}.html`;\n const asset = bundle[from];\n if (asset?.type !== 'asset' || asset.source === undefined) continue;\n delete bundle[from];\n emit({ type: 'asset', fileName: `${name}.html`, source: up(asset.source) });\n }\n}\n","import { dirname, matchesGlob, relative, resolve, sep } from 'node:path';\n\n// A port of Storybook 10.4.0's auto-title (preview-api `userOrAutoTitle`, common `normalizeStoriesEntry`)\n// for string `stories` entries, which carry no title prefix. It must agree with Storybook or ids and links diverge.\n\nconst posix = (path: string): string => path.split(sep).join('/');\n\n/** Storybook's `normalizeStoryPath`. */\nconst dotted = (path: string): string => (/^\\.{1,2}([/\\\\]|$)/.test(path) ? path : `./${path}`);\n\n/** The directory a stories glob searches from: picomatch `scan`'s `prefix + base`, or a file's directory. */\nexport function globDirectory(pattern: string): string {\n const segments = pattern.split('/');\n const magic = segments.findIndex((segment) => /^!|(^|[^\\\\])[*?[{(]/.test(segment));\n return magic === -1 ? dirname(pattern) : segments.slice(0, magic).join('/');\n}\n\n/** Storybook's `sanitize` in autoTitle: strips the extension, then collapses `Button/Button`, `index` and `stories.js`. */\nfunction titleParts(parts: string[]): string[] {\n const last = parts[parts.length - 1];\n if (last === undefined) return parts;\n const stripped = last.replace(/(?:[.](?:story|stories))?([.][^.]+)$/i, '');\n if (parts.length === 1) return [stripped];\n const nextToLast = parts[parts.length - 2];\n if (stripped && nextToLast && stripped.toLowerCase() === nextToLast.toLowerCase()) return [...parts.slice(0, -2), stripped];\n if (stripped && (/^(story|stories)([.][^.]+)$/i.test(last) || /^index$/i.test(stripped))) return parts.slice(0, -1);\n return [...parts.slice(0, -1), stripped];\n}\n\nconst titleFrom = (importPath: string, directory: string): string =>\n titleParts(importPath.replace(directory, '').split('/').filter(Boolean)).join('/');\n\n/**\n * The title Storybook gives a story file whose meta names none: its path under the directory of the first\n * `stories` glob that matches it. A file no glob matches is titled from its path under `root`.\n */\nexport function autoTitle(file: string, root: string, stories: readonly string[]): string {\n const path = posix(relative(root, file));\n const importPath = dotted(path);\n for (const pattern of stories) {\n if (!matchesGlob(path, pattern.replace(/^\\.\\//, ''))) continue;\n const directory = dotted(posix(relative(root, resolve(root, globDirectory(pattern))))).replace(/\\/$/, '');\n return titleFrom(importPath, directory);\n }\n return titleFrom(importPath, '.');\n}\n","import { type ParserPlugin, parse } from '@babel/parser';\nimport type * as t from '@babel/types';\nimport { dirname, relative, sep } from 'node:path';\nimport { isGallery } from '../story/tags.ts';\nimport type { ComponentDeps, DepGraph, IndexEntry } from '../story/types.ts';\n\n/** Resolves an import as the bundler would: an absolute file, or null for anything that is not one. */\nexport type ResolveImport = (specifier: string, importer: string) => Promise<string | null>;\n\nexport interface DepGraphOptions {\n root: string;\n read: (file: string) => string;\n}\n\nexport interface DepGraphBuilder {\n build(entries: readonly IndexEntry[], resolve: ResolveImport): Promise<DepGraph>;\n /** Drops what was read from `file`. True when the graph had read it, so the graph may have changed. */\n invalidate(file: string): boolean;\n /** Drops every cached import resolution, keeping the parsed files. */\n reset(): void;\n}\n\ninterface Import {\n spec: string;\n /** `*` for a namespace import. */\n imported: string;\n}\n\ntype Export = { kind: 'local'; local: string } | { kind: 'from'; spec: string; imported: string };\n\ninterface ModuleInfo {\n imports: Map<string, Import>;\n exports: Map<string, Export>;\n stars: string[];\n /** Per top-level binding, the names its declaration refers to. */\n refs: Map<string, Set<string>>;\n}\n\n/** A declared binding: the file declaring it and its name there. */\ntype Key = string;\nconst keyOf = (file: string, local: string): Key => `${file}#${local}`;\nconst fileOfKey = (key: Key): string => key.slice(0, key.lastIndexOf('#'));\n\nconst SCRIPT = /\\.[cm]?[jt]sx?$/;\nconst DEFAULT_LOCAL = '*default*';\n/** Keys holding types, which name no value a component could render. */\nconst TYPE_KEYS = new Set(['typeAnnotation', 'typeParameters', 'typeArguments', 'returnType', 'superTypeParameters', 'implements']);\n\n/**\n * The component graph of `entries`, derived from source: each component is the binding its story file's meta names\n * (or, when that is declared in the story file itself, the import the title's last segment names), found by\n * following imports and re-exports to the file declaring it. What a component uses is every listed component that\n * its own declaration reaches, directly or through the file's local helpers and the relative imports in its own\n * directory. Each file is read and parsed once and each import resolved once, until `invalidate` names it.\n */\nexport function createDepGraph({ root, read }: DepGraphOptions): DepGraphBuilder {\n const modules = new Map<string, ModuleInfo | null>();\n const resolutions = new Map<string, Map<string, Promise<string | null>>>();\n\n const info = (file: string): ModuleInfo | null => {\n if (!modules.has(file)) {\n let parsed: ModuleInfo | null = null;\n try {\n parsed = moduleInfo(read(file), file);\n } catch {\n parsed = null;\n }\n modules.set(file, parsed);\n }\n return modules.get(file) ?? null;\n };\n\n return {\n invalidate(file) {\n const known = modules.has(file) || resolutions.has(file);\n modules.delete(file);\n resolutions.delete(file);\n return known;\n },\n\n reset() {\n resolutions.clear();\n },\n\n async build(entries, resolve) {\n const resolveFrom = (spec: string, importer: string): Promise<string | null> => {\n let byImporter = resolutions.get(importer);\n if (!byImporter) {\n byImporter = new Map();\n resolutions.set(importer, byImporter);\n }\n let pending = byImporter.get(spec);\n if (!pending) {\n pending = resolve(spec, importer).then(\n (id) => {\n const file = id?.split('?')[0];\n return file && !file.startsWith('\\0') && SCRIPT.test(file) && !file.split(/[\\\\/]/).includes('node_modules') ? file : null;\n },\n () => null,\n );\n byImporter.set(spec, pending);\n }\n return pending;\n };\n\n /** The binding `name` exported from `file` is declared as, through re-exports. */\n const declaring = async (file: string, name: string, depth = 0): Promise<Key | null> => {\n const mod = info(file);\n if (!mod || depth > 32) return null;\n const exp = mod.exports.get(name);\n if (exp?.kind === 'local') {\n const imp = mod.imports.get(exp.local);\n return imp ? importKey(file, imp, depth + 1) : keyOf(file, exp.local);\n }\n if (exp?.kind === 'from') {\n const target = await resolveFrom(exp.spec, file);\n return target ? declaring(target, exp.imported, depth + 1) : null;\n }\n if (name === 'default') return null;\n for (const spec of mod.stars) {\n const target = await resolveFrom(spec, file);\n const found = target ? await declaring(target, name, depth + 1) : null;\n if (found) return found;\n }\n return null;\n };\n\n const importKey = async (importer: string, imp: Import, depth = 0): Promise<Key | null> => {\n if (imp.imported === '*') return null;\n const target = await resolveFrom(imp.spec, importer);\n return target ? declaring(target, imp.imported, depth) : null;\n };\n\n /** The component a story file's meta stands for. */\n const componentOf = async (entry: IndexEntry): Promise<Key | null> => {\n const mod = info(entry.file);\n if (!mod) return null;\n const byTitle = entry.title.split('/').pop()?.replace(/\\s+/g, '');\n for (const local of [entry.componentName, byTitle]) {\n const imp = local ? mod.imports.get(local) : undefined;\n const key = imp ? await importKey(entry.file, imp) : null;\n if (key) return key;\n }\n return null;\n };\n\n const titles = new Map<string, IndexEntry[]>();\n for (const entry of entries) {\n if (isGallery(entry)) continue;\n const list = titles.get(entry.title);\n if (list) list.push(entry);\n else titles.set(entry.title, [entry]);\n }\n\n const components = new Map<string, Key | null>();\n const byKey = new Map<Key, string[]>();\n for (const [title, list] of titles) {\n let key: Key | null = null;\n for (const file of new Set(list.map((e) => e.file))) {\n key = await componentOf(list.find((e) => e.file === file) as IndexEntry);\n if (key) break;\n }\n components.set(title, key);\n if (key) byKey.set(key, [...(byKey.get(key) ?? []), title]);\n }\n const componentFiles = new Set([...byKey.keys()].map(fileOfKey));\n\n /** The keys `key`'s own source reaches that are other components. */\n const reached = async (key: Key): Promise<Set<Key>> => {\n const out = new Set<Key>();\n const home = fileOfKey(key);\n const homeDir = dirname(home);\n const visited = new Set<string>();\n\n const walkFile = async (file: string, roots: readonly string[] | null): Promise<void> => {\n const mod = info(file);\n if (!mod) return;\n const locals = new Set<string>();\n if (roots === null) {\n for (const name of mod.refs.keys()) locals.add(name);\n for (const name of mod.imports.keys()) locals.add(name);\n } else {\n const queue = [...roots];\n while (queue.length > 0) {\n const name = queue.pop() as string;\n if (locals.has(name)) continue;\n locals.add(name);\n const here = keyOf(file, name);\n if (here !== key && byKey.has(here)) {\n out.add(here);\n continue;\n }\n for (const ref of mod.refs.get(name) ?? []) {\n if (mod.refs.has(ref) || mod.imports.has(ref)) queue.push(ref);\n }\n }\n }\n for (const name of locals) {\n const imp = mod.imports.get(name);\n if (!imp) continue;\n const target = await importKey(file, imp);\n if (target && byKey.has(target)) {\n if (target !== key) out.add(target);\n continue;\n }\n if (!imp.spec.startsWith('.')) continue;\n const helper = await resolveFrom(imp.spec, file);\n if (!helper || visited.has(helper) || componentFiles.has(helper)) continue;\n if (relative(homeDir, helper).startsWith('..')) continue;\n visited.add(helper);\n await walkFile(helper, null);\n }\n };\n\n visited.add(home);\n await walkFile(home, [key.slice(home.length + 1)]);\n return out;\n };\n\n const graph: DepGraph = {};\n for (const [title, key] of components) {\n graph[title] = { source: key ? relative(root, fileOfKey(key)).split(sep).join('/') : null, uses: [], usedBy: [] };\n }\n for (const [title, key] of components) {\n if (!key) continue;\n const uses = new Set<string>();\n for (const target of await reached(key)) {\n for (const other of byKey.get(target) ?? []) if (other !== title) uses.add(other);\n }\n const node = graph[title] as ComponentDeps;\n node.uses = [...uses].sort();\n for (const other of node.uses) graph[other]?.usedBy.push(title);\n }\n for (const node of Object.values(graph)) node.usedBy.sort();\n return Object.fromEntries(Object.entries(graph).sort(([a], [b]) => a.localeCompare(b)));\n },\n };\n}\n\nfunction moduleInfo(code: string, file: string): ModuleInfo {\n const plugins: ParserPlugin[] = ['typescript', 'decorators-legacy', ...(/\\.[cm]?[jt]sx$/.test(file) ? (['jsx'] as const) : [])];\n const program = parse(code, { sourceType: 'module', plugins }).program;\n const imports = new Map<string, Import>();\n const exports = new Map<string, Export>();\n const stars: string[] = [];\n const refs = new Map<string, Set<string>>();\n const declare = (name: string, node: t.Node | null | undefined) => refs.set(name, node ? namesIn(node) : new Set());\n\n const declareStatement = (decl: t.Node | null | undefined): string[] => {\n if (!decl) return [];\n switch (decl.type) {\n case 'FunctionDeclaration':\n case 'ClassDeclaration':\n if (!decl.id) return [];\n declare(decl.id.name, decl);\n return [decl.id.name];\n case 'VariableDeclaration':\n return decl.declarations.flatMap((d) => {\n if (d.id.type !== 'Identifier') return [];\n declare(d.id.name, d.init);\n return [d.id.name];\n });\n default:\n return [];\n }\n };\n\n for (const stmt of program.body) {\n switch (stmt.type) {\n case 'ImportDeclaration':\n if (stmt.importKind === 'type') break;\n for (const spec of stmt.specifiers) {\n if (spec.type === 'ImportSpecifier' && spec.importKind === 'type') continue;\n const imported =\n spec.type === 'ImportNamespaceSpecifier' ? '*' : spec.type === 'ImportDefaultSpecifier' ? 'default' : nameOf(spec.imported);\n imports.set(spec.local.name, { spec: stmt.source.value, imported });\n }\n break;\n case 'ExportNamedDeclaration':\n if (stmt.exportKind === 'type') break;\n for (const name of declareStatement(stmt.declaration)) exports.set(name, { kind: 'local', local: name });\n for (const spec of stmt.specifiers) {\n if (spec.type === 'ExportSpecifier' && spec.exportKind === 'type') continue;\n if (spec.type !== 'ExportSpecifier') continue;\n const exported = nameOf(spec.exported);\n const local = nameOf(spec.local);\n exports.set(exported, stmt.source ? { kind: 'from', spec: stmt.source.value, imported: local } : { kind: 'local', local });\n }\n break;\n case 'ExportAllDeclaration':\n if (stmt.exportKind !== 'type') stars.push(stmt.source.value);\n break;\n case 'ExportDefaultDeclaration': {\n const decl = stmt.declaration;\n const named = (decl.type === 'FunctionDeclaration' || decl.type === 'ClassDeclaration') && decl.id ? decl.id.name : null;\n if (named) declare(named, decl);\n else if (decl.type === 'Identifier') {\n exports.set('default', { kind: 'local', local: decl.name });\n break;\n } else declare(DEFAULT_LOCAL, decl);\n exports.set('default', { kind: 'local', local: named ?? DEFAULT_LOCAL });\n break;\n }\n default:\n declareStatement(stmt);\n }\n }\n return { imports, exports, stars, refs };\n}\n\nfunction nameOf(node: t.Identifier | t.StringLiteral): string {\n return node.type === 'Identifier' ? node.name : node.value;\n}\n\n/** Every identifier `node` refers to as a value, JSX tags included. Types and property names are left out. */\nfunction namesIn(node: t.Node): Set<string> {\n const out = new Set<string>();\n const walk = (value: unknown, key?: string): void => {\n if (key !== undefined && TYPE_KEYS.has(key)) return;\n if (Array.isArray(value)) {\n for (const item of value) walk(item);\n return;\n }\n if (!value || typeof value !== 'object' || typeof (value as { type?: unknown }).type !== 'string') return;\n const n = value as t.Node;\n if (n.type.startsWith('TS') && !('expression' in n)) return;\n if (n.type === 'Identifier' || n.type === 'JSXIdentifier') {\n out.add(n.name);\n return;\n }\n for (const [k, child] of Object.entries(n)) {\n if (k === 'leadingComments' || k === 'trailingComments' || k === 'innerComments' || k === 'loc') continue;\n if ((n.type === 'MemberExpression' || n.type === 'OptionalMemberExpression') && k === 'property' && !n.computed) continue;\n if (n.type === 'JSXMemberExpression' && k === 'property') continue;\n if ((n.type === 'ObjectProperty' || n.type === 'ObjectMethod' || n.type === 'ClassMethod' || n.type === 'ClassProperty') && k === 'key' && !n.computed) continue;\n if (n.type === 'JSXAttribute' && k === 'name') continue;\n walk(child, k);\n }\n };\n walk(node);\n return out;\n}\n","import { type ParserPlugin, parse } from '@babel/parser';\nimport type * as t from '@babel/types';\nimport { storyId, storyNameFromExport } from '../story/ids.ts';\nimport type { IndexEntry } from '../story/types.ts';\n\ntype Bindings = Map<string, t.Node>;\n\n/** The stories `code` declares, in source order, without running it. `file` is absolute; `autoTitle` titles a meta that names none. */\nexport function indexFile(code: string, file: string, autoTitle: string): IndexEntry[] {\n try {\n const plugins: ParserPlugin[] = ['typescript', 'decorators-legacy', ...(/\\.[jt]sx$/.test(file) ? (['jsx'] as const) : [])];\n return indexProgram(parse(code, { sourceType: 'module', plugins }).program, file, autoTitle);\n } catch (err) {\n throw new Error(`${file}: ${err instanceof Error ? err.message : String(err)}`, { cause: err });\n }\n}\n\nfunction indexProgram(program: t.Program, file: string, autoTitle: string): IndexEntry[] {\n const bindings: Bindings = new Map();\n const wrappers = new Set<string>();\n for (const stmt of program.body) {\n if (stmt.type === 'ImportDeclaration' && stmt.source.value === '@weasel-js/forge') {\n for (const spec of stmt.specifiers) {\n if (spec.type === 'ImportSpecifier' && ['meta', 'story'].includes(exportedName(spec.imported))) {\n wrappers.add(spec.local.name);\n }\n }\n }\n const decl = stmt.type === 'ExportNamedDeclaration' ? stmt.declaration : stmt;\n if (decl?.type === 'VariableDeclaration') {\n for (const d of decl.declarations) if (d.id.type === 'Identifier' && d.init) bindings.set(d.id.name, d.init);\n }\n }\n\n let metaNode: t.Node | undefined;\n let metaDoc: string | undefined;\n const exported: { name: string; node: t.Node | undefined; doc: string | undefined }[] = [];\n for (const stmt of program.body) {\n if (stmt.type === 'ExportDefaultDeclaration') {\n metaNode = stmt.declaration;\n metaDoc = docOf(stmt);\n }\n if (stmt.type !== 'ExportNamedDeclaration' || stmt.exportKind === 'type') continue;\n const doc = docOf(stmt);\n const decl = stmt.declaration;\n if (decl?.type === 'VariableDeclaration') {\n for (const d of decl.declarations) {\n if (d.id.type === 'Identifier') exported.push({ name: d.id.name, node: d.init ?? undefined, doc: docOf(d) ?? doc });\n }\n } else if (decl?.type === 'FunctionDeclaration' && decl.id) {\n exported.push({ name: decl.id.name, node: undefined, doc });\n }\n for (const spec of stmt.specifiers) {\n if (spec.type !== 'ExportSpecifier' || spec.exportKind === 'type') continue;\n const name = exportedName(spec.exported);\n const node = stmt.source ? undefined : bindings.get(exportedName(spec.local));\n if (name === 'default') {\n metaNode = node;\n metaDoc ??= doc;\n } else exported.push({ name, node, doc });\n }\n }\n if (!metaNode && !program.body.some(isDefaultExport)) return [];\n\n const meta = objectOf(metaNode, bindings, wrappers);\n const title = stringProp(meta, 'title') ?? autoTitle;\n const include = storyFilter(meta, 'includeStories');\n const exclude = storyFilter(meta, 'excludeStories');\n const componentNode = prop(meta, 'component');\n const componentName = componentNode?.type === 'Identifier' ? componentNode.name : undefined;\n const metaIsolate = isolateOf(meta, bindings, wrappers, 'default');\n const metaTags = tagsOf(meta);\n\n return exported\n .filter(({ name }) => name !== '__namedExportsOrder')\n .filter(({ name }) => (!include || include(name)) && (!exclude || !exclude(name)))\n .map(({ name, node, doc }) => {\n const spec = objectOf(node, bindings, wrappers);\n const isolate = isolateOf(spec, bindings, wrappers, name) ?? metaIsolate;\n const tags = combineTags(metaTags, tagsOf(spec));\n return {\n id: storyId(title, name),\n title,\n name: stringProp(spec, 'name') ?? stringProp(spec, 'storyName') ?? storyNameFromExport(name),\n exportName: name,\n file,\n ...(doc === undefined ? {} : { description: doc }),\n ...(metaDoc === undefined ? {} : { componentDescription: metaDoc }),\n ...(componentName === undefined ? {} : { componentName }),\n ...(isolate === undefined ? {} : { isolate }),\n ...(tags === undefined ? {} : { tags }),\n };\n });\n}\n\n/**\n * The reason `obj` isolates its story: `isolate` on a native meta or story, `parameters.forge.isolate` in CSF.\n * It must be a string literal, because the shell reads it without importing the module.\n */\nfunction isolateOf(obj: t.ObjectExpression | null, bindings: Bindings, wrappers: Set<string>, exportName: string): string | undefined {\n const parameters = objectOf(prop(obj, 'parameters'), bindings, wrappers);\n const forge = objectOf(prop(parameters, 'forge'), bindings, wrappers);\n const value = prop(obj, 'isolate') ?? prop(forge, 'isolate');\n if (value === undefined) return undefined;\n const literal = stringLiteral(value);\n if (literal === undefined) throw new Error(`${exportName}: isolate must be a string literal`);\n return literal;\n}\n\n/** `obj`'s `tags`: the string literals of an array literal. */\nfunction tagsOf(obj: t.ObjectExpression | null): string[] | undefined {\n const value = prop(obj, 'tags');\n if (value?.type !== 'ArrayExpression') return undefined;\n return value.elements.flatMap((e) => (e ? (stringLiteral(e) ?? []) : []));\n}\n\n/** A story's tags as Storybook combines them: the meta's, then its own, where `!tag` removes `tag`. */\nfunction combineTags(meta: string[] | undefined, own: string[] | undefined): string[] | undefined {\n if (meta === undefined && own === undefined) return undefined;\n const out = new Set(meta);\n for (const tag of own ?? []) {\n if (tag.startsWith('!')) out.delete(tag.slice(1));\n else out.add(tag);\n }\n return [...out];\n}\n\n/** The value of a plain string literal or an expression-free template literal. */\nfunction stringLiteral(node: t.Node): string | undefined {\n if (node.type === 'StringLiteral') return node.value;\n if (node.type === 'TemplateLiteral' && node.expressions.length === 0) return node.quasis.map((q) => q.value.cooked ?? q.value.raw).join('');\n return undefined;\n}\n\nfunction isDefaultExport(stmt: t.Statement): boolean {\n if (stmt.type === 'ExportDefaultDeclaration') return true;\n return (\n stmt.type === 'ExportNamedDeclaration' &&\n stmt.specifiers.some((s) => s.type === 'ExportSpecifier' && exportedName(s.exported) === 'default')\n );\n}\n\n/**\n * The JSDoc block immediately above `node`, as prose. A `//` comment is not\n * one: a line comment above an export is as often a note to the author as a\n * description of the story, and printing it in the dossier would be guessing.\n */\nfunction docOf(node: t.Node): string | undefined {\n const comments = node.leadingComments;\n const last = comments?.[comments.length - 1];\n if (last?.type !== 'CommentBlock' || !last.value.startsWith('*')) return undefined;\n const text = last.value\n .slice(1)\n .split('\\n')\n .map((line) => line.replace(/^\\s*\\*/, '').trim())\n .join('\\n')\n .trim();\n return text || undefined;\n}\n\nfunction exportedName(node: t.Identifier | t.StringLiteral): string {\n return node.type === 'Identifier' ? node.name : node.value;\n}\n\n/** The object literal `node` evaluates to, through casts, `meta(…)`/`story(…)` and top-level `const`s. */\nfunction objectOf(node: t.Node | undefined, bindings: Bindings, wrappers: Set<string>, depth = 0): t.ObjectExpression | null {\n if (!node || depth > 16) return null;\n switch (node.type) {\n case 'ObjectExpression':\n return node;\n case 'TSSatisfiesExpression':\n case 'TSAsExpression':\n case 'TSTypeAssertion':\n case 'TSNonNullExpression':\n case 'ParenthesizedExpression':\n return objectOf(node.expression, bindings, wrappers, depth + 1);\n case 'CallExpression':\n return node.callee.type === 'Identifier' && wrappers.has(node.callee.name)\n ? objectOf(node.arguments[0], bindings, wrappers, depth + 1)\n : null;\n case 'Identifier':\n return objectOf(bindings.get(node.name), bindings, wrappers, depth + 1);\n default:\n return null;\n }\n}\n\nfunction prop(obj: t.ObjectExpression | null, key: string): t.Node | undefined {\n for (const p of obj?.properties ?? []) {\n if (p.type !== 'ObjectProperty' || p.computed) continue;\n const name = p.key.type === 'Identifier' ? p.key.name : p.key.type === 'StringLiteral' ? p.key.value : null;\n if (name === key) return p.value;\n }\n return undefined;\n}\n\nfunction stringProp(obj: t.ObjectExpression | null, key: string): string | undefined {\n const value = prop(obj, key);\n return value?.type === 'StringLiteral' ? value.value : undefined;\n}\n\n/** `includeStories`/`excludeStories` as a predicate, when written as a string array or a regex literal. */\nfunction storyFilter(obj: t.ObjectExpression | null, key: string): ((name: string) => boolean) | null {\n const value = prop(obj, key);\n if (value?.type === 'RegExpLiteral') {\n const re = new RegExp(value.pattern, value.flags.replace(/[gy]/g, ''));\n return (name) => re.test(name);\n }\n if (value?.type === 'ArrayExpression' && value.elements.every((e) => e?.type === 'StringLiteral')) {\n const names = new Set(value.elements.map((e) => (e as t.StringLiteral).value));\n return (name) => names.has(name);\n }\n return null;\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join, relative } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/** Entry modules of forge's own realms: source beside this file in a checkout, the built entries in an install. */\nexport function ownEntries(realms: readonly string[]): string[] {\n const here = fileURLToPath(import.meta.url);\n for (let dir = dirname(here); dir !== dirname(dir); dir = dirname(dir)) {\n const manifest = join(dir, 'package.json');\n if (!existsSync(manifest) || (JSON.parse(readFileSync(manifest, 'utf8')) as { name?: string }).name !== '@weasel-js/forge') {\n continue;\n }\n const source = !relative(join(dir, 'src'), here).startsWith('..');\n return realms.map((realm) => join(dir, source ? `src/${realm}/index.ts` : `dist/${realm}/index.js`));\n }\n return [];\n}\n","import { fileURLToPath } from 'node:url';\nimport type { Plugin } from 'vite';\n\n/** Storybook specifiers a CSF file may import, and the forge entry each answers to. */\nconst SHIMS: readonly (readonly [RegExp, string])[] = [\n [/^@?storybook\\/preview-api$/, '@weasel-js/forge/preview-api'],\n [/^@?storybook\\/test$/, '@weasel-js/forge/play'],\n];\n\n/** Points the Storybook runtime specifiers a CSF file may carry at forge's own entries. */\nexport function storybookShims(): Plugin {\n // Resolved from forge's own location, through the app's aliases, so a monorepo reaches source and an install reaches dist.\n return {\n name: 'weaselforge:storybook-shims',\n enforce: 'pre',\n resolveId(id) {\n const hit = SHIMS.find(([pattern]) => pattern.test(id));\n if (!hit) return undefined;\n return this.resolve(hit[1], fileURLToPath(import.meta.url), { skipSelf: true });\n },\n };\n}\n","import { globSync, readFileSync, statSync } from 'node:fs';\nimport { basename, matchesGlob, relative, resolve, sep } from 'node:path';\nimport type { Logger, Plugin, ViteDevServer } from 'vite';\nimport type { IndexEntry } from '../story/types.ts';\nimport { hoistPages, writePages } from './build.ts';\nimport { autoTitle } from './autoTitle.ts';\nimport { createDepGraph, type DepGraphBuilder, type ResolveImport } from './depGraph.ts';\nimport { html } from './html.ts';\nimport { indexFile } from './indexFile.ts';\nimport { ownEntries } from './ownEntries.ts';\nimport { storybookShims } from './storybookShims.ts';\n\n/** Options for the `forge` vite plugin. */\nexport interface ForgeOptions {\n /** Globs of story files, relative to the vite root. */\n stories: string[];\n /** Path to the frame config module, relative to the vite root. Only frame documents import it. Optional. */\n frameConfig?: string;\n /** Path to the shell config module, relative to the vite root. Only the workshop page imports it. Optional. */\n shellConfig?: string;\n /** Alias Storybook's runtime modules to forge shims. Default true. */\n storybookShims?: boolean;\n}\n\nconst PREFIX = 'virtual:forge/';\nconst MODULES = new Set(['index.js', 'importers.js', 'deps.js', 'frame-config.js', 'shell-config.js', 'shell-entry.js', 'frame-entry.js']);\nconst PAGES: Record<string, string> = { '/': 'shell-entry.js', '/index.html': 'shell-entry.js', '/frame.html': 'frame-entry.js' };\n\n/**\n * The vite plugin that serves the workshop: it indexes the story files, serves the workshop at `/` and the frame\n * document at `/frame.html`, pushes a new index to the open page as story files change, and builds both pages.\n */\nexport function forge(options: ForgeOptions): Plugin[] {\n let root = process.cwd();\n let base = '/';\n let byFile: Map<string, IndexEntry[]> | null = null;\n let logger: Logger | undefined;\n let deps: DepGraphBuilder | null = null;\n /** The graph last served or pushed; null until a page first asks for it, so no edit rebuilds it before then. */\n let depsSent: string | null = null;\n let depsPending: Promise<void> | null = null;\n\n const glob = (): string[] => {\n const files = options.stories.flatMap((pattern) =>\n globSync(pattern, { cwd: root, exclude: (name) => basename(String(name)) === 'node_modules' })\n .map((f) => resolve(root, f))\n // A failed story run leaves `__screenshots__/<file>.stories.tsx/` directories that match the globs.\n .filter((f) => statSync(f).isFile())\n .sort(),\n );\n return [...new Set(files)];\n };\n const matches = (file: string): boolean => {\n const path = relative(root, file).split(sep).join('/');\n return !path.split('/').includes('node_modules') && options.stories.some((pattern) => matchesGlob(path, pattern));\n };\n const read = (file: string) => indexFile(readFileSync(file, 'utf8'), file, autoTitle(file, root, options.stories));\n const logError = (err: unknown) => logger?.error(`[forge] ${err instanceof Error ? err.message : String(err)}`);\n /** A file that fails to parse stays in the map with no entries, so an edit that fixes it re-indexes it. */\n const files = (): Map<string, IndexEntry[]> => {\n byFile ??= new Map(\n glob().map((file) => {\n try {\n return [file, read(file)];\n } catch (err) {\n logError(err);\n return [file, []];\n }\n }),\n );\n return byFile;\n };\n const index = () => [...files().values()].flat();\n const depGraph = (): DepGraphBuilder => (deps ??= createDepGraph({ root, read: (file) => readFileSync(file, 'utf8') }));\n\n const configModule = (path: string | undefined) =>\n path ? `export { default } from ${JSON.stringify(resolve(root, path))};\\n` : 'export default {};\\n';\n\n const modules: Record<string, () => string> = {\n 'index.js': () => `export default ${JSON.stringify(index())};\\n`,\n 'importers.js': () => {\n const lines = [...files()]\n .filter(([, entries]) => entries.length > 0)\n .map(([file]) => ` ${JSON.stringify(file)}: () => import(${JSON.stringify(file)}),`);\n return `export default {\\n${lines.join('\\n')}\\n};\\n`;\n },\n 'frame-config.js': () => configModule(options.frameConfig),\n 'shell-config.js': () => configModule(options.shellConfig),\n 'shell-entry.js': () => `import { mountWorkshop } from '@weasel-js/forge/shell';\nimport '@weasel-js/labkit/styles.css';\nimport '@weasel-js/forge/shell.css';\nimport index from 'virtual:forge/index.js';\nimport importers from 'virtual:forge/importers.js';\nimport config from 'virtual:forge/shell-config.js';\nimport setup from 'virtual:forge/frame-config.js';\n\nconst workshop = mountWorkshop({\n index,\n importers,\n setup,\n config,\n frameUrl: ${JSON.stringify(`${base}frame.html`)},\n stories: ${JSON.stringify(options.stories)},\n});\nimport.meta.hot?.on('forge:index', (next) => workshop.setIndex(next));\n// Read from source on first request, so the graph costs nothing until the page is up.\nimport('virtual:forge/deps.js').then((m) => workshop.setDependencies(m.default));\nimport.meta.hot?.on('forge:deps', (next) => workshop.setDependencies(next));\n// A story edit reaches here as an update of the importers module, whose fresh import() URLs carry the new\n// timestamps; the file it names arrives just before, so the reload waits for the importers that can fetch it.\nconst stale = new Set();\nimport.meta.hot?.on('forge:story', ({ file }) => stale.add(file));\nimport.meta.hot?.accept('virtual:forge/importers.js', (next) => {\n if (!next) return;\n workshop.setImporters(next.default);\n for (const file of stale) workshop.reloadStory(file);\n stale.clear();\n});\n`,\n 'frame-entry.js': () => `import { mountFrame } from '@weasel-js/forge/frame';\nimport '@weasel-js/forge/frame.css';\nimport index from 'virtual:forge/index.js';\nimport importers from 'virtual:forge/importers.js';\nimport setup from 'virtual:forge/frame-config.js';\n\nmountFrame({ index, importers, setup });\n// The importers module is shared with the workshop page, which accepts a story edit in place; a frame document\n// showing the old module reloads instead, and without this the edit would dead-end here and reload every page.\nimport.meta.hot?.accept('virtual:forge/importers.js', () => location.reload());\n`,\n };\n\n const invalidate = (server: ViteDevServer, names: readonly string[]): void => {\n for (const env of Object.values(server.environments)) {\n for (const name of names) {\n const mod = env.moduleGraph.getModuleById(`\\0${PREFIX}${name}`);\n if (mod) env.moduleGraph.invalidateModule(mod);\n }\n }\n };\n\n /** Rebuilds the graph after an edit and pushes it when it changed. Edits landing while one runs share the next. */\n function redeps(server: ViteDevServer): void {\n if (depsSent === null || depsPending) return;\n const resolve: ResolveImport = async (spec, importer) =>\n (await server.environments.client.pluginContainer.resolveId(spec, importer))?.id ?? null;\n depsPending = Promise.resolve()\n .then(async () => {\n const graph = await depGraph().build(index(), resolve);\n const json = JSON.stringify(graph);\n if (json === depsSent) return;\n depsSent = json;\n invalidate(server, ['deps.js']);\n server.ws.send({ type: 'custom', event: 'forge:deps', data: graph });\n })\n .catch(logError)\n .finally(() => {\n depsPending = null;\n });\n }\n\n /** Re-reads a story file after `event`; true when the index changed. */\n function reindex(server: ViteDevServer, file: string, event: 'add' | 'change' | 'unlink'): boolean {\n const current = files();\n if (event === 'change' && current.has(file)) server.ws.send({ type: 'custom', event: 'forge:story', data: { file } });\n if (event === 'change' && !current.has(file)) return false;\n if (event === 'add' && !matches(file)) return false;\n if (event === 'unlink' && !current.has(file)) return false;\n\n const before = JSON.stringify(index());\n if (event === 'unlink') {\n current.delete(file);\n } else {\n try {\n current.set(file, read(file));\n } catch (err) {\n logError(err);\n return false;\n }\n }\n const next = index();\n if (JSON.stringify(next) === before) return false;\n\n invalidate(server, ['index.js', 'importers.js']);\n server.ws.send({ type: 'custom', event: 'forge:index', data: next });\n return true;\n }\n\n return [\n ...(options.storybookShims === false ? [] : [storybookShims()]),\n {\n name: 'weaselforge',\n config(config, { command }) {\n const at = resolve(config.root ?? process.cwd());\n // The pages are virtual, so vite's scan finds no entry of its own to crawl for dependencies.\n const entries = [\n ...options.stories,\n ...[options.frameConfig, options.shellConfig].flatMap((path) => (path ? [resolve(at, path)] : [])),\n ...ownEntries(['shell', 'frame']),\n ];\n const optimizeDeps = { entries };\n if (command !== 'build') return { optimizeDeps };\n return { optimizeDeps, build: { rolldownOptions: { input: writePages(at) } } };\n },\n generateBundle: {\n order: 'post',\n handler(_, bundle) {\n hoistPages(bundle, (file) => this.emitFile(file));\n },\n },\n configResolved(config) {\n root = config.root;\n base = config.base;\n logger = config.logger;\n byFile = null;\n deps = null;\n depsSent = null;\n },\n resolveId(id) {\n return id.startsWith(PREFIX) && MODULES.has(id.slice(PREFIX.length)) ? `\\0${id}` : undefined;\n },\n async load(id) {\n if (!id.startsWith(`\\0${PREFIX}`)) return undefined;\n const name = id.slice(PREFIX.length + 1);\n if (name !== 'deps.js') return modules[name]?.();\n const graph = await depGraph().build(index(), async (spec, importer) => (await this.resolve(spec, importer))?.id ?? null);\n depsSent = JSON.stringify(graph);\n return `export default ${depsSent};\\n`;\n },\n configureServer(server) {\n server.watcher.add([...files().keys()]);\n for (const event of ['add', 'change', 'unlink'] as const) {\n server.watcher.on(event, (path) => {\n const file = resolve(path);\n const indexed = reindex(server, file, event);\n // A new file can answer an import that resolved to nothing before.\n const added = event === 'add' && /\\.[cm]?[jt]sx?$/.test(file) && !file.split(sep).includes('node_modules');\n if (added) depGraph().reset();\n const read = added || (event !== 'add' && depGraph().invalidate(file));\n if (indexed || read) redeps(server);\n });\n }\n server.middlewares.use((req, res, next) => {\n const url = req.url ?? '/';\n const path = url.split('?')[0] ?? '/';\n const prefix = base.endsWith('/') ? base.slice(0, -1) : base;\n const page = path === prefix ? '/' : path.startsWith(`${prefix}/`) ? path.slice(prefix.length) : null;\n const entry = req.method === 'GET' && page !== null ? PAGES[page] : undefined;\n if (!entry) return next();\n server.transformIndexHtml(url, html(entry)).then(\n (doc) => {\n res.statusCode = 200;\n res.setHeader('Content-Type', 'text/html');\n res.end(doc);\n },\n (err: unknown) => next(err),\n );\n });\n },\n },\n ];\n}\n","import { matchesGlob, relative, resolve, sep } from 'node:path';\nimport type { Plugin } from 'vite';\nimport { autoTitle } from './autoTitle.ts';\nimport { indexFile } from './indexFile.ts';\nimport { ownEntries } from './ownEntries.ts';\nimport { storybookShims } from './storybookShims.ts';\n\n/** Options for the `forgeTest` vite plugin. */\nexport interface ForgeTestOptions {\n /** Globs of story files, relative to the vite root. Each matching file becomes a test file. */\n stories: string[];\n /** Path to the frame config module, relative to the vite root; it sets up every story. Optional. */\n frameConfig?: string;\n /** Alias Storybook's runtime modules to forge shims. Default true. */\n storybookShims?: boolean;\n}\n\nconst TIMEOUT_MS = 15_000;\n\n/**\n * A vite plugin for vitest browser mode: every story in a matching file runs as one test, rendered and played\n * through forge's frame in the test page itself.\n */\nexport function forgeTest(options: ForgeTestOptions): Plugin[] {\n let root = process.cwd();\n\n const matches = (id: string): boolean => {\n if (id.startsWith('\\0') || id.includes('?')) return false;\n const path = relative(root, id).split(sep).join('/');\n if (path.startsWith('../') || path.split('/').includes('node_modules')) return false;\n return options.stories.some((pattern) => matchesGlob(path, pattern));\n };\n\n return [\n ...(options.storybookShims === false ? [] : [storybookShims()]),\n {\n name: 'weaselforge:test',\n enforce: 'pre',\n config(config) {\n const at = resolve(config.root ?? process.cwd());\n const entries = [\n ...options.stories,\n ...(options.frameConfig ? [resolve(at, options.frameConfig)] : []),\n ...ownEntries(['test']),\n ];\n return { optimizeDeps: { entries } };\n },\n configResolved(config) {\n root = config.root;\n },\n transform(code, id) {\n if (!matches(id)) return undefined;\n const title = autoTitle(id, root, options.stories);\n const entries = indexFile(code, id, title);\n if (entries.length === 0) return undefined;\n const q = (value: string) => JSON.stringify(value);\n // The module comes from its own URL at test time: vitest imports a test file with a cache-busting query,\n // so a static self-import would evaluate the file a second time and register every test twice.\n const lines = [\n '',\n `import { test as __forge_test } from \"vitest\";`,\n `import { page as __forge_page } from \"vitest/browser\";`,\n `import { runStory as __forge_runStory } from \"@weasel-js/forge/test\";`,\n // shell.css draws the story host; frame.css still holds the boundary's fault rule.\n `import \"@weasel-js/forge/shell.css\";`,\n `import \"@weasel-js/forge/frame.css\";`,\n ...(options.frameConfig ? [`import __forge_frame_config from ${q(resolve(root, options.frameConfig))};`] : []),\n `const __forge_file = ${q(id)};`,\n `const __forge_title = ${q(title)};`,\n `const __forge_timeout = ${TIMEOUT_MS};`,\n 'const __forge_options = {',\n ` setup: ${options.frameConfig ? '__forge_frame_config' : 'undefined'},`,\n ' viewport: (width, height) => __forge_page.viewport(width, height),',\n '};',\n 'const __forge_run = async (exportName) => __forge_runStory(await import(/* @vite-ignore */ import.meta.url), exportName, __forge_file, __forge_title, __forge_options);',\n // An isolated story asks for a document of its own, which the test page is not; its reason goes in the name.\n ...entries.map((entry) =>\n entry.isolate === undefined\n ? `__forge_test(${q(entry.name)}, () => __forge_run(${q(entry.exportName)}), __forge_timeout);`\n : `__forge_test.skip(${q(`${entry.name} (isolated: ${entry.isolate})`)}, () => {});`,\n ),\n ];\n return { code: `${code}\\n${lines.join('\\n')}\\n`, map: null };\n },\n },\n ];\n}\n"]}