@weasel-js/forge 1.5.1 → 1.5.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,4 +1,4 @@
1
- import { F as FrameSetup } from '../FrameController-BPfCt4PJ.js';
1
+ import { F as FrameSetup } from '../FrameController-eZM3hlcE.js';
2
2
  import '@weasel-js/labkit/config';
3
3
  import 'react';
4
4
 
@@ -1,4 +1,4 @@
1
- import { loadStories, startFrame } from '../chunk-2MADHLRA.js';
1
+ import { loadStories, startFrame } from '../chunk-5YHEO26U.js';
2
2
  import '../chunk-2GXKNXTJ.js';
3
3
  import '../chunk-6SRQIHJQ.js';
4
4
  import { openChannel } from '../chunk-2JDYOBWM.js';
@@ -99,24 +99,31 @@ function indexProgram(program, file, autoTitle2) {
99
99
  }
100
100
  }
101
101
  let metaNode;
102
+ let metaDoc;
102
103
  const exported = [];
103
104
  for (const stmt of program.body) {
104
- if (stmt.type === "ExportDefaultDeclaration") metaNode = stmt.declaration;
105
+ if (stmt.type === "ExportDefaultDeclaration") {
106
+ metaNode = stmt.declaration;
107
+ metaDoc = docOf(stmt);
108
+ }
105
109
  if (stmt.type !== "ExportNamedDeclaration" || stmt.exportKind === "type") continue;
110
+ const doc = docOf(stmt);
106
111
  const decl = stmt.declaration;
107
112
  if (decl?.type === "VariableDeclaration") {
108
113
  for (const d of decl.declarations) {
109
- if (d.id.type === "Identifier") exported.push({ name: d.id.name, node: d.init ?? void 0 });
114
+ if (d.id.type === "Identifier") exported.push({ name: d.id.name, node: d.init ?? void 0, doc: docOf(d) ?? doc });
110
115
  }
111
116
  } else if (decl?.type === "FunctionDeclaration" && decl.id) {
112
- exported.push({ name: decl.id.name, node: void 0 });
117
+ exported.push({ name: decl.id.name, node: void 0, doc });
113
118
  }
114
119
  for (const spec of stmt.specifiers) {
115
120
  if (spec.type !== "ExportSpecifier" || spec.exportKind === "type") continue;
116
121
  const name = exportedName(spec.exported);
117
122
  const node = stmt.source ? void 0 : bindings.get(spec.local.name);
118
- if (name === "default") metaNode = node;
119
- else exported.push({ name, node });
123
+ if (name === "default") {
124
+ metaNode = node;
125
+ metaDoc ??= doc;
126
+ } else exported.push({ name, node, doc });
120
127
  }
121
128
  }
122
129
  if (!metaNode && !program.body.some(isDefaultExport)) return [];
@@ -124,14 +131,19 @@ function indexProgram(program, file, autoTitle2) {
124
131
  const title = stringProp(meta, "title") ?? autoTitle2;
125
132
  const include = storyFilter(meta, "includeStories");
126
133
  const exclude = storyFilter(meta, "excludeStories");
127
- return exported.filter(({ name }) => name !== "__namedExportsOrder").filter(({ name }) => (!include || include(name)) && (!exclude || !exclude(name))).map(({ name, node }) => {
134
+ const componentNode = prop(meta, "component");
135
+ const componentName = componentNode?.type === "Identifier" ? componentNode.name : void 0;
136
+ return exported.filter(({ name }) => name !== "__namedExportsOrder").filter(({ name }) => (!include || include(name)) && (!exclude || !exclude(name))).map(({ name, node, doc }) => {
128
137
  const spec = objectOf(node, bindings, wrappers);
129
138
  return {
130
139
  id: storyId(title, name),
131
140
  title,
132
141
  name: stringProp(spec, "name") ?? stringProp(spec, "storyName") ?? storyNameFromExport(name),
133
142
  exportName: name,
134
- file
143
+ file,
144
+ ...doc === void 0 ? {} : { description: doc },
145
+ ...metaDoc === void 0 ? {} : { componentDescription: metaDoc },
146
+ ...componentName === void 0 ? {} : { componentName }
135
147
  };
136
148
  });
137
149
  }
@@ -139,6 +151,13 @@ function isDefaultExport(stmt) {
139
151
  if (stmt.type === "ExportDefaultDeclaration") return true;
140
152
  return stmt.type === "ExportNamedDeclaration" && stmt.specifiers.some((s) => s.type === "ExportSpecifier" && exportedName(s.exported) === "default");
141
153
  }
154
+ function docOf(node) {
155
+ const comments = node.leadingComments;
156
+ const last = comments?.[comments.length - 1];
157
+ if (last?.type !== "CommentBlock" || !last.value.startsWith("*")) return void 0;
158
+ const text = last.value.slice(1).split("\n").map((line) => line.replace(/^\s*\*/, "").trim()).join("\n").trim();
159
+ return text || void 0;
160
+ }
142
161
  function exportedName(node) {
143
162
  return node.type === "Identifier" ? node.name : node.value;
144
163
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/vite/html.ts","../../src/vite/build.ts","../../src/vite/autoTitle.ts","../../src/vite/indexFile.ts","../../src/vite/storybookShims.ts","../../src/vite/plugin.ts","../../src/vite/forgeTest.ts"],"names":["autoTitle","PAGES","fileURLToPath","dirname","join","relative","files","resolve","sep","matchesGlob"],"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';\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 { storyId, storyNameFromExport } from '../story/ids';\nimport type { IndexEntry } from '../story/types';\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 const exported: { name: string; node: t.Node | undefined }[] = [];\n for (const stmt of program.body) {\n if (stmt.type === 'ExportDefaultDeclaration') metaNode = stmt.declaration;\n if (stmt.type !== 'ExportNamedDeclaration' || stmt.exportKind === 'type') continue;\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 });\n }\n } else if (decl?.type === 'FunctionDeclaration' && decl.id) {\n exported.push({ name: decl.id.name, node: undefined });\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(spec.local.name);\n if (name === 'default') metaNode = node;\n else exported.push({ name, node });\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\n return exported\n .filter(({ name }) => name !== '__namedExportsOrder')\n .filter(({ name }) => (!include || include(name)) && (!exclude || !exclude(name)))\n .map(({ name, node }) => {\n const spec = objectOf(node, bindings, wrappers);\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 };\n });\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\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 } 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';\nimport { hoistPages, writePages } from './build';\nimport { autoTitle } from './autoTitle';\nimport { html } from './html';\nimport { indexFile } from './indexFile';\nimport { storybookShims } from './storybookShims';\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', '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\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 .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\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 config from 'virtual:forge/shell-config.js';\n\nconst workshop = mountWorkshop({\n index,\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`,\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`,\n };\n\n function reindex(server: ViteDevServer, file: string, event: 'add' | 'change' | 'unlink'): void {\n const current = files();\n if (event === 'change' && !current.has(file)) return;\n if (event === 'add' && !matches(file)) return;\n if (event === 'unlink' && !current.has(file)) return;\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;\n }\n }\n const next = index();\n if (JSON.stringify(next) === before) return;\n\n for (const env of Object.values(server.environments)) {\n for (const name of ['index.js', 'importers.js']) {\n const mod = env.moduleGraph.getModuleById(`\\0${PREFIX}${name}`);\n if (mod) env.moduleGraph.invalidateModule(mod);\n }\n }\n server.ws.send({ type: 'custom', event: 'forge:index', data: next });\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 },\n resolveId(id) {\n return id.startsWith(PREFIX) && MODULES.has(id.slice(PREFIX.length)) ? `\\0${id}` : undefined;\n },\n load(id) {\n if (!id.startsWith(`\\0${PREFIX}`)) return undefined;\n return modules[id.slice(PREFIX.length + 1)]?.();\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, (file) => reindex(server, resolve(file), event));\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';\nimport { indexFile } from './indexFile';\nimport { storybookShims } from './storybookShims';\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 `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 ...entries.map(\n (entry) => `__forge_test(${q(entry.name)}, () => __forge_run(${q(entry.exportName)}), __forge_timeout);`,\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/indexFile.ts","../../src/vite/storybookShims.ts","../../src/vite/plugin.ts","../../src/vite/forgeTest.ts"],"names":["autoTitle","PAGES","fileURLToPath","dirname","join","relative","files","resolve","sep","matchesGlob"],"mappings":";;;;;;;AAIO,SAAS,IAAA,CAAK,KAAA,EAAe,IAAA,GAA0B,OAAA,EAAiB;AAC7E,EAAA,MAAM,MAAM,CAAA,EAAG,IAAA,KAAS,UAAU,OAAA,GAAU,EAAE,iBAAiB,KAAK,CAAA,CAAA;AACpE,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAAA,EASwB,GAAG,CAAA;AAAA;AAAA;AAAA,CAAA;AAIpC;;;ACfA,IAAM,GAAA,GAAM,qBAAA;AAGZ,IAAM,KAAA,GAAgC,EAAE,KAAA,EAAO,gBAAA,EAAkB,OAAO,gBAAA,EAAiB;AAGlF,SAAS,WAAW,IAAA,EAAsC;AAC/D,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,EAAM,GAAG,CAAA;AAC1B,EAAA,SAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAClC,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,QAAQ,KAAK,CAAA,CAAE,IAAI,CAAC,CAAC,IAAA,EAAM,KAAK,CAAA,KAAM;AAC3C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,EAAK,CAAA,EAAG,IAAI,CAAA,KAAA,CAAO,CAAA;AACrC,MAAA,aAAA,CAAc,IAAA,EAAM,IAAA,CAAK,KAAA,EAAO,OAAO,CAAC,CAAA;AACxC,MAAA,OAAO,CAAC,MAAM,IAAI,CAAA;AAAA,IACpB,CAAC;AAAA,GACH;AACF;AAGA,IAAM,EAAA,GAAK,CAAC,MAAA,KAAA,CACT,OAAO,WAAW,QAAA,GAAW,MAAA,GAAS,IAAI,WAAA,GAAc,MAAA,CAAO,MAAM,CAAA,EAAG,OAAA,CAAQ,mCAAmC,MAAM,CAAA;AAGrH,SAAS,UAAA,CACd,QACA,IAAA,EACM;AACN,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AACrC,IAAA,MAAM,IAAA,GAAO,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,IAAI,CAAA,KAAA,CAAA;AAC3B,IAAA,MAAM,KAAA,GAAQ,OAAO,IAAI,CAAA;AACzB,IAAA,IAAI,KAAA,EAAO,IAAA,KAAS,OAAA,IAAW,KAAA,CAAM,WAAW,MAAA,EAAW;AAC3D,IAAA,OAAO,OAAO,IAAI,CAAA;AAClB,IAAA,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,CAAA,EAAG,IAAI,CAAA,KAAA,CAAA,EAAS,MAAA,EAAQ,EAAA,CAAG,KAAA,CAAM,MAAM,CAAA,EAAG,CAAA;AAAA,EAC5E;AACF;ACjCA,IAAM,KAAA,GAAQ,CAAC,IAAA,KAAyB,IAAA,CAAK,MAAM,GAAG,CAAA,CAAE,KAAK,GAAG,CAAA;AAGhE,IAAM,MAAA,GAAS,CAAC,IAAA,KAA0B,mBAAA,CAAoB,KAAK,IAAI,CAAA,GAAI,IAAA,GAAO,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA;AAGpF,SAAS,cAAc,OAAA,EAAyB;AACrD,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA;AAClC,EAAA,MAAM,KAAA,GAAQ,SAAS,SAAA,CAAU,CAAC,YAAY,qBAAA,CAAsB,IAAA,CAAK,OAAO,CAAC,CAAA;AACjF,EAAA,OAAO,KAAA,KAAU,EAAA,GAAK,OAAA,CAAQ,OAAO,CAAA,GAAI,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC5E;AAGA,SAAS,WAAW,KAAA,EAA2B;AAC7C,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACnC,EAAA,IAAI,IAAA,KAAS,QAAW,OAAO,KAAA;AAC/B,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,uCAAA,EAAyC,EAAE,CAAA;AACzE,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,CAAC,QAAQ,CAAA;AACxC,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACzC,EAAA,IAAI,YAAY,UAAA,IAAc,QAAA,CAAS,WAAA,EAAY,KAAM,WAAW,WAAA,EAAY,EAAG,OAAO,CAAC,GAAG,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,GAAG,QAAQ,CAAA;AAC1H,EAAA,IAAI,QAAA,KAAa,8BAAA,CAA+B,IAAA,CAAK,IAAI,CAAA,IAAK,UAAA,CAAW,IAAA,CAAK,QAAQ,CAAA,CAAA,EAAI,OAAO,KAAA,CAAM,KAAA,CAAM,GAAG,EAAE,CAAA;AAClH,EAAA,OAAO,CAAC,GAAG,KAAA,CAAM,MAAM,CAAA,EAAG,EAAE,GAAG,QAAQ,CAAA;AACzC;AAEA,IAAM,YAAY,CAAC,UAAA,EAAoB,cACrC,UAAA,CAAW,UAAA,CAAW,QAAQ,SAAA,EAAW,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AAM5E,SAAS,SAAA,CAAU,IAAA,EAAc,IAAA,EAAc,OAAA,EAAoC;AACxF,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,CAAS,IAAA,EAAM,IAAI,CAAC,CAAA;AACvC,EAAA,MAAM,UAAA,GAAa,OAAO,IAAI,CAAA;AAC9B,EAAA,KAAA,MAAW,WAAW,OAAA,EAAS;AAC7B,IAAA,IAAI,CAAC,YAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,OAAA,EAAS,EAAE,CAAC,CAAA,EAAG;AACtD,IAAA,MAAM,YAAY,MAAA,CAAO,KAAA,CAAM,QAAA,CAAS,IAAA,EAAM,QAAQ,IAAA,EAAM,aAAA,CAAc,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AACxG,IAAA,OAAO,SAAA,CAAU,YAAY,SAAS,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,SAAA,CAAU,YAAY,GAAG,CAAA;AAClC;ACrCO,SAAS,SAAA,CAAU,IAAA,EAAc,IAAA,EAAcA,UAAAA,EAAiC;AACrF,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAA0B,CAAC,YAAA,EAAc,mBAAA,EAAqB,GAAI,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,GAAK,CAAC,KAAK,CAAA,GAAc,EAAG,CAAA;AACzH,IAAA,OAAO,YAAA,CAAa,KAAA,CAAM,IAAA,EAAM,EAAE,UAAA,EAAY,QAAA,EAAU,OAAA,EAAS,CAAA,CAAE,OAAA,EAAS,IAAA,EAAMA,UAAS,CAAA;AAAA,EAC7F,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,eAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA,EAAI,EAAE,KAAA,EAAO,KAAK,CAAA;AAAA,EAChG;AACF;AAEA,SAAS,YAAA,CAAa,OAAA,EAAoB,IAAA,EAAcA,UAAAA,EAAiC;AACvF,EAAA,MAAM,QAAA,uBAAyB,GAAA,EAAI;AACnC,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,EAAA,KAAA,MAAW,IAAA,IAAQ,QAAQ,IAAA,EAAM;AAC/B,IAAA,IAAI,KAAK,IAAA,KAAS,mBAAA,IAAuB,IAAA,CAAK,MAAA,CAAO,UAAU,kBAAA,EAAoB;AACjF,MAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,UAAA,EAAY;AAClC,QAAA,IAAI,IAAA,CAAK,IAAA,KAAS,iBAAA,IAAqB,CAAC,MAAA,EAAQ,OAAO,CAAA,CAAE,QAAA,CAAS,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAC,CAAA,EAAG;AAC9F,UAAA,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,KAAS,wBAAA,GAA2B,KAAK,WAAA,GAAc,IAAA;AACzE,IAAA,IAAI,IAAA,EAAM,SAAS,qBAAA,EAAuB;AACxC,MAAA,KAAA,MAAW,KAAK,IAAA,CAAK,YAAA,EAAc,IAAI,CAAA,CAAE,GAAG,IAAA,KAAS,YAAA,IAAgB,CAAA,CAAE,IAAA,WAAe,GAAA,CAAI,CAAA,CAAE,EAAA,CAAG,IAAA,EAAM,EAAE,IAAI,CAAA;AAAA,IAC7G;AAAA,EACF;AAEA,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,OAAA;AACJ,EAAA,MAAM,WAAkF,EAAC;AACzF,EAAA,KAAA,MAAW,IAAA,IAAQ,QAAQ,IAAA,EAAM;AAC/B,IAAA,IAAI,IAAA,CAAK,SAAS,0BAAA,EAA4B;AAC5C,MAAA,QAAA,GAAW,IAAA,CAAK,WAAA;AAChB,MAAA,OAAA,GAAU,MAAM,IAAI,CAAA;AAAA,IACtB;AACA,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,wBAAA,IAA4B,IAAA,CAAK,eAAe,MAAA,EAAQ;AAC1E,IAAA,MAAM,GAAA,GAAM,MAAM,IAAI,CAAA;AACtB,IAAA,MAAM,OAAO,IAAA,CAAK,WAAA;AAClB,IAAA,IAAI,IAAA,EAAM,SAAS,qBAAA,EAAuB;AACxC,MAAA,KAAA,MAAW,CAAA,IAAK,KAAK,YAAA,EAAc;AACjC,QAAA,IAAI,CAAA,CAAE,GAAG,IAAA,KAAS,YAAA,WAAuB,IAAA,CAAK,EAAE,MAAM,CAAA,CAAE,EAAA,CAAG,MAAM,IAAA,EAAM,CAAA,CAAE,QAAQ,MAAA,EAAW,GAAA,EAAK,MAAM,CAAC,CAAA,IAAK,KAAK,CAAA;AAAA,MACpH;AAAA,IACF,CAAA,MAAA,IAAW,IAAA,EAAM,IAAA,KAAS,qBAAA,IAAyB,KAAK,EAAA,EAAI;AAC1D,MAAA,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,CAAK,GAAG,IAAA,EAAM,IAAA,EAAM,MAAA,EAAW,GAAA,EAAK,CAAA;AAAA,IAC5D;AACA,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,UAAA,EAAY;AAClC,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,iBAAA,IAAqB,IAAA,CAAK,eAAe,MAAA,EAAQ;AACnE,MAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA;AACvC,MAAA,MAAM,IAAA,GAAO,KAAK,MAAA,GAAS,MAAA,GAAY,SAAS,GAAA,CAAI,IAAA,CAAK,MAAM,IAAI,CAAA;AACnE,MAAA,IAAI,SAAS,SAAA,EAAW;AACtB,QAAA,QAAA,GAAW,IAAA;AACX,QAAA,OAAA,KAAY,GAAA;AAAA,MACd,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,EAAM,KAAK,CAAA;AAAA,IAC1C;AAAA,EACF;AACA,EAAA,IAAI,CAAC,YAAY,CAAC,OAAA,CAAQ,KAAK,IAAA,CAAK,eAAe,CAAA,EAAG,OAAO,EAAC;AAE9D,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,QAAA,EAAU,QAAA,EAAU,QAAQ,CAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,OAAO,CAAA,IAAKA,UAAAA;AAC3C,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,IAAA,EAAM,gBAAgB,CAAA;AAClD,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,IAAA,EAAM,gBAAgB,CAAA;AAClD,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,IAAA,EAAM,WAAW,CAAA;AAC5C,EAAA,MAAM,aAAA,GAAgB,aAAA,EAAe,IAAA,KAAS,YAAA,GAAe,cAAc,IAAA,GAAO,MAAA;AAElF,EAAA,OAAO,QAAA,CACJ,MAAA,CAAO,CAAC,EAAE,MAAK,KAAM,IAAA,KAAS,qBAAqB,CAAA,CACnD,MAAA,CAAO,CAAC,EAAE,IAAA,QAAY,CAAC,OAAA,IAAW,OAAA,CAAQ,IAAI,CAAA,MAAO,CAAC,OAAA,IAAW,CAAC,QAAQ,IAAI,CAAA,CAAE,CAAA,CAChF,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,IAAA,EAAM,KAAI,KAAM;AAC5B,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,EAAM,QAAA,EAAU,QAAQ,CAAA;AAC9C,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA;AAAA,MACvB,KAAA;AAAA,MACA,IAAA,EAAM,UAAA,CAAW,IAAA,EAAM,MAAM,CAAA,IAAK,WAAW,IAAA,EAAM,WAAW,CAAA,IAAK,mBAAA,CAAoB,IAAI,CAAA;AAAA,MAC3F,UAAA,EAAY,IAAA;AAAA,MACZ,IAAA;AAAA,MACA,GAAI,GAAA,KAAQ,MAAA,GAAY,EAAC,GAAI,EAAE,aAAa,GAAA,EAAI;AAAA,MAChD,GAAI,OAAA,KAAY,MAAA,GAAY,EAAC,GAAI,EAAE,sBAAsB,OAAA,EAAQ;AAAA,MACjE,GAAI,aAAA,KAAkB,MAAA,GAAY,EAAC,GAAI,EAAE,aAAA;AAAc,KACzD;AAAA,EACF,CAAC,CAAA;AACL;AAEA,SAAS,gBAAgB,IAAA,EAA4B;AACnD,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,0BAAA,EAA4B,OAAO,IAAA;AACrD,EAAA,OACE,IAAA,CAAK,IAAA,KAAS,wBAAA,IACd,IAAA,CAAK,WAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,iBAAA,IAAqB,YAAA,CAAa,CAAA,CAAE,QAAQ,MAAM,SAAS,CAAA;AAEtG;AAOA,SAAS,MAAM,IAAA,EAAkC;AAC/C,EAAA,MAAM,WAAW,IAAA,CAAK,eAAA;AACtB,EAAA,MAAM,IAAA,GAAO,QAAA,GAAW,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AAC3C,EAAA,IAAI,IAAA,EAAM,SAAS,cAAA,IAAkB,CAAC,KAAK,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG,OAAO,MAAA;AACzE,EAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CACf,KAAA,CAAM,CAAC,CAAA,CACP,KAAA,CAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,CAAE,IAAA,EAAM,CAAA,CAC/C,IAAA,CAAK,IAAI,CAAA,CACT,IAAA,EAAK;AACR,EAAA,OAAO,IAAA,IAAQ,MAAA;AACjB;AAEA,SAAS,aAAa,IAAA,EAA8C;AAClE,EAAA,OAAO,IAAA,CAAK,IAAA,KAAS,YAAA,GAAe,IAAA,CAAK,OAAO,IAAA,CAAK,KAAA;AACvD;AAGA,SAAS,QAAA,CAAS,IAAA,EAA0B,QAAA,EAAoB,QAAA,EAAuB,QAAQ,CAAA,EAA8B;AAC3H,EAAA,IAAI,CAAC,IAAA,IAAQ,KAAA,GAAQ,EAAA,EAAI,OAAO,IAAA;AAChC,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,kBAAA;AACH,MAAA,OAAO,IAAA;AAAA,IACT,KAAK,uBAAA;AAAA,IACL,KAAK,gBAAA;AAAA,IACL,KAAK,iBAAA;AAAA,IACL,KAAK,qBAAA;AAAA,IACL,KAAK,yBAAA;AACH,MAAA,OAAO,SAAS,IAAA,CAAK,UAAA,EAAY,QAAA,EAAU,QAAA,EAAU,QAAQ,CAAC,CAAA;AAAA,IAChE,KAAK,gBAAA;AACH,MAAA,OAAO,KAAK,MAAA,CAAO,IAAA,KAAS,gBAAgB,QAAA,CAAS,GAAA,CAAI,KAAK,MAAA,CAAO,IAAI,IACrE,QAAA,CAAS,IAAA,CAAK,UAAU,CAAC,CAAA,EAAG,UAAU,QAAA,EAAU,KAAA,GAAQ,CAAC,CAAA,GACzD,IAAA;AAAA,IACN,KAAK,YAAA;AACH,MAAA,OAAO,QAAA,CAAS,SAAS,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG,QAAA,EAAU,QAAA,EAAU,KAAA,GAAQ,CAAC,CAAA;AAAA,IACxE;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;AAEA,SAAS,IAAA,CAAK,KAAgC,GAAA,EAAiC;AAC7E,EAAA,KAAA,MAAW,CAAA,IAAK,GAAA,EAAK,UAAA,IAAc,EAAC,EAAG;AACrC,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,gBAAA,IAAoB,CAAA,CAAE,QAAA,EAAU;AAC/C,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,IAAA,KAAS,eAAe,CAAA,CAAE,GAAA,CAAI,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,IAAA,KAAS,eAAA,GAAkB,CAAA,CAAE,IAAI,KAAA,GAAQ,IAAA;AACvG,IAAA,IAAI,IAAA,KAAS,GAAA,EAAK,OAAO,CAAA,CAAE,KAAA;AAAA,EAC7B;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,UAAA,CAAW,KAAgC,GAAA,EAAiC;AACnF,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,EAAK,GAAG,CAAA;AAC3B,EAAA,OAAO,KAAA,EAAO,IAAA,KAAS,eAAA,GAAkB,KAAA,CAAM,KAAA,GAAQ,MAAA;AACzD;AAGA,SAAS,WAAA,CAAY,KAAgC,GAAA,EAAiD;AACpG,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,EAAK,GAAG,CAAA;AAC3B,EAAA,IAAI,KAAA,EAAO,SAAS,eAAA,EAAiB;AACnC,IAAA,MAAM,EAAA,GAAK,IAAI,MAAA,CAAO,KAAA,CAAM,OAAA,EAAS,MAAM,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAC,CAAA;AACrE,IAAA,OAAO,CAAC,IAAA,KAAS,EAAA,CAAG,IAAA,CAAK,IAAI,CAAA;AAAA,EAC/B;AACA,EAAA,IAAI,KAAA,EAAO,IAAA,KAAS,iBAAA,IAAqB,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,EAAG,IAAA,KAAS,eAAe,CAAA,EAAG;AACjG,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,KAAA,CAAM,QAAA,CAAS,IAAI,CAAC,CAAA,KAAO,CAAA,CAAsB,KAAK,CAAC,CAAA;AAC7E,IAAA,OAAO,CAAC,IAAA,KAAS,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,IAAA;AACT;ACpKA,IAAM,KAAA,GAAgD;AAAA,EACpD,CAAC,8BAA8B,8BAA8B,CAAA;AAAA,EAC7D,CAAC,uBAAuB,uBAAuB;AACjD,CAAA;AAGO,SAAS,cAAA,GAAyB;AAEvC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,6BAAA;AAAA,IACN,OAAA,EAAS,KAAA;AAAA,IACT,UAAU,EAAA,EAAI;AACZ,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAC,OAAO,CAAA,KAAM,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAC,CAAA;AACtD,MAAA,IAAI,CAAC,KAAK,OAAO,MAAA;AACjB,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA,EAAG,EAAE,QAAA,EAAU,IAAA,EAAM,CAAA;AAAA,IAChF;AAAA,GACF;AACF;;;ACCA,IAAM,MAAA,GAAS,gBAAA;AACf,IAAM,OAAA,mBAAU,IAAI,GAAA,CAAI,CAAC,UAAA,EAAY,gBAAgB,iBAAA,EAAmB,iBAAA,EAAmB,gBAAA,EAAkB,gBAAgB,CAAC,CAAA;AAC9H,IAAMC,SAAgC,EAAE,GAAA,EAAK,kBAAkB,aAAA,EAAe,gBAAA,EAAkB,eAAe,gBAAA,EAAiB;AAGhI,SAAS,UAAA,GAAuB;AAC9B,EAAA,MAAM,IAAA,GAAOC,aAAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAC1C,EAAA,KAAA,IAAS,GAAA,GAAMC,OAAAA,CAAQ,IAAI,CAAA,EAAG,GAAA,KAAQA,OAAAA,CAAQ,GAAG,CAAA,EAAG,GAAA,GAAMA,OAAAA,CAAQ,GAAG,CAAA,EAAG;AACtE,IAAA,MAAM,QAAA,GAAWC,IAAAA,CAAK,GAAA,EAAK,cAAc,CAAA;AACzC,IAAA,IAAI,CAAC,UAAA,CAAW,QAAQ,CAAA,IAAM,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,QAAA,EAAU,MAAM,CAAC,CAAA,CAAwB,IAAA,KAAS,kBAAA,EAAoB;AAC1H,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,CAACC,QAAAA,CAASD,IAAAA,CAAK,GAAA,EAAK,KAAK,CAAA,EAAG,IAAI,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA;AAChE,IAAA,OAAO,CAAC,OAAA,EAAS,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,KAAA,KAAUA,IAAAA,CAAK,GAAA,EAAK,MAAA,GAAS,OAAO,KAAK,CAAA,SAAA,CAAA,GAAc,CAAA,KAAA,EAAQ,KAAK,WAAW,CAAC,CAAA;AAAA,EACjH;AACA,EAAA,OAAO,EAAC;AACV;AAEO,SAAS,MAAM,OAAA,EAAiC;AACrD,EAAA,IAAI,IAAA,GAAO,QAAQ,GAAA,EAAI;AACvB,EAAA,IAAI,IAAA,GAAO,GAAA;AACX,EAAA,IAAI,MAAA,GAA2C,IAAA;AAC/C,EAAA,IAAI,MAAA;AAEJ,EAAA,MAAM,OAAO,MAAgB;AAC3B,IAAA,MAAME,MAAAA,GAAQ,QAAQ,OAAA,CAAQ,OAAA;AAAA,MAAQ,CAAC,OAAA,KACrC,QAAA,CAAS,OAAA,EAAS,EAAE,GAAA,EAAK,IAAA,EAAM,OAAA,EAAS,CAAC,IAAA,KAAS,QAAA,CAAS,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,cAAA,EAAgB,CAAA,CAC1F,GAAA,CAAI,CAAC,CAAA,KAAMC,OAAAA,CAAQ,IAAA,EAAM,CAAC,CAAC,CAAA,CAC3B,IAAA;AAAK,KACV;AACA,IAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAID,MAAK,CAAC,CAAA;AAAA,EAC3B,CAAA;AACA,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KAA0B;AACzC,IAAA,MAAM,IAAA,GAAOD,SAAS,IAAA,EAAM,IAAI,EAAE,KAAA,CAAMG,GAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACrD,IAAA,OAAO,CAAC,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,SAAS,cAAc,CAAA,IAAK,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAC,OAAA,KAAYC,WAAAA,CAAY,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,EAClH,CAAA;AACA,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAAiB,SAAA,CAAU,aAAa,IAAA,EAAM,MAAM,CAAA,EAAG,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,OAAA,CAAQ,OAAO,CAAC,CAAA;AACjH,EAAA,MAAM,QAAA,GAAW,CAAC,GAAA,KAAiB,MAAA,EAAQ,KAAA,CAAM,CAAA,QAAA,EAAW,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAE9G,EAAA,MAAM,QAAQ,MAAiC;AAC7C,IAAA,MAAA,KAAW,IAAI,GAAA;AAAA,MACb,IAAA,EAAK,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS;AACnB,QAAA,IAAI;AACF,UAAA,OAAO,CAAC,IAAA,EAAM,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,QAC1B,SAAS,GAAA,EAAK;AACZ,UAAA,QAAA,CAAS,GAAG,CAAA;AACZ,UAAA,OAAO,CAAC,IAAA,EAAM,EAAE,CAAA;AAAA,QAClB;AAAA,MACF,CAAC;AAAA,KACH;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,KAAA,GAAQ,MAAM,CAAC,GAAG,OAAM,CAAE,MAAA,EAAQ,CAAA,CAAE,IAAA,EAAK;AAE/C,EAAA,MAAM,YAAA,GAAe,CAAC,IAAA,KACpB,IAAA,GAAO,CAAA,wBAAA,EAA2B,IAAA,CAAK,SAAA,CAAUF,OAAAA,CAAQ,IAAA,EAAM,IAAI,CAAC,CAAC,CAAA;AAAA,CAAA,GAAQ,sBAAA;AAE/E,EAAA,MAAM,OAAA,GAAwC;AAAA,IAC5C,YAAY,MAAM,CAAA,eAAA,EAAkB,KAAK,SAAA,CAAU,KAAA,EAAO,CAAC,CAAA;AAAA,CAAA;AAAA,IAC3D,gBAAgB,MAAM;AACpB,MAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,KAAA,EAAO,CAAA,CACtB,MAAA,CAAO,CAAC,GAAG,OAAO,CAAA,KAAM,QAAQ,MAAA,GAAS,CAAC,CAAA,CAC1C,GAAA,CAAI,CAAC,CAAC,IAAI,CAAA,KAAM,KAAK,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA,eAAA,EAAkB,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA,EAAA,CAAI,CAAA;AACtF,MAAA,OAAO,CAAA;AAAA,EAAqB,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA,CAAA;AAAA,IAC9C,CAAA;AAAA,IACA,iBAAA,EAAmB,MAAM,YAAA,CAAa,OAAA,CAAQ,WAAW,CAAA;AAAA,IACzD,iBAAA,EAAmB,MAAM,YAAA,CAAa,OAAA,CAAQ,WAAW,CAAA;AAAA,IACzD,kBAAkB,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,YAAA,EASd,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,IAAI,YAAY,CAAC,CAAA;AAAA,WAAA,EACpC,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,OAAO,CAAC,CAAA;AAAA;AAAA;AAAA,CAAA;AAAA,IAIxC,kBAAkB,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,GAQ1B;AAEA,EAAA,SAAS,OAAA,CAAQ,MAAA,EAAuB,IAAA,EAAc,KAAA,EAA0C;AAC9F,IAAA,MAAM,UAAU,KAAA,EAAM;AACtB,IAAA,IAAI,UAAU,QAAA,IAAY,CAAC,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,EAAG;AAC9C,IAAA,IAAI,KAAA,KAAU,KAAA,IAAS,CAAC,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvC,IAAA,IAAI,UAAU,QAAA,IAAY,CAAC,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,EAAG;AAE9C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,CAAA;AACrC,IAAA,IAAI,UAAU,QAAA,EAAU;AACtB,MAAA,OAAA,CAAQ,OAAO,IAAI,CAAA;AAAA,IACrB,CAAA,MAAO;AACL,MAAA,IAAI;AACF,QAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,MAC9B,SAAS,GAAA,EAAK;AACZ,QAAA,QAAA,CAAS,GAAG,CAAA;AACZ,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,OAAO,KAAA,EAAM;AACnB,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,KAAM,MAAA,EAAQ;AAErC,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,YAAY,CAAA,EAAG;AACpD,MAAA,KAAA,MAAW,IAAA,IAAQ,CAAC,UAAA,EAAY,cAAc,CAAA,EAAG;AAC/C,QAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAY,aAAA,CAAc,KAAK,MAAM,CAAA,EAAG,IAAI,CAAA,CAAE,CAAA;AAC9D,QAAA,IAAI,GAAA,EAAK,GAAA,CAAI,WAAA,CAAY,gBAAA,CAAiB,GAAG,CAAA;AAAA,MAC/C;AAAA,IACF;AACA,IAAA,MAAA,CAAO,EAAA,CAAG,KAAK,EAAE,IAAA,EAAM,UAAU,KAAA,EAAO,aAAA,EAAe,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,EACrE;AAEA,EAAA,OAAO;AAAA,IACL,GAAI,QAAQ,cAAA,KAAmB,KAAA,GAAQ,EAAC,GAAI,CAAC,gBAAgB,CAAA;AAAA,IAC7D;AAAA,MACE,IAAA,EAAM,aAAA;AAAA,MACN,MAAA,CAAO,MAAA,EAAQ,EAAE,OAAA,EAAQ,EAAG;AAC1B,QAAA,MAAM,KAAKA,OAAAA,CAAQ,MAAA,CAAO,IAAA,IAAQ,OAAA,CAAQ,KAAK,CAAA;AAE/C,QAAA,MAAM,OAAA,GAAU;AAAA,UACd,GAAG,OAAA,CAAQ,OAAA;AAAA,UACX,GAAG,CAAC,OAAA,CAAQ,aAAa,OAAA,CAAQ,WAAW,EAAE,OAAA,CAAQ,CAAC,IAAA,KAAU,IAAA,GAAO,CAACA,OAAAA,CAAQ,EAAA,EAAI,IAAI,CAAC,CAAA,GAAI,EAAG,CAAA;AAAA,UACjG,GAAG,UAAA;AAAW,SAChB;AACA,QAAA,MAAM,YAAA,GAAe,EAAE,OAAA,EAAQ;AAC/B,QAAA,IAAI,OAAA,KAAY,OAAA,EAAS,OAAO,EAAE,YAAA,EAAa;AAC/C,QAAA,OAAO,EAAE,YAAA,EAAc,KAAA,EAAO,EAAE,eAAA,EAAiB,EAAE,KAAA,EAAO,UAAA,CAAW,EAAE,CAAA,EAAE,EAAE,EAAE;AAAA,MAC/E,CAAA;AAAA,MACA,cAAA,EAAgB;AAAA,QACd,KAAA,EAAO,MAAA;AAAA,QACP,OAAA,CAAQ,GAAG,MAAA,EAAQ;AACjB,UAAA,UAAA,CAAW,QAAQ,CAAC,IAAA,KAAS,IAAA,CAAK,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,QAClD;AAAA,OACF;AAAA,MACA,eAAe,MAAA,EAAQ;AACrB,QAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AACd,QAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AACd,QAAA,MAAA,GAAS,MAAA,CAAO,MAAA;AAChB,QAAA,MAAA,GAAS,IAAA;AAAA,MACX,CAAA;AAAA,MACA,UAAU,EAAA,EAAI;AACZ,QAAA,OAAO,EAAA,CAAG,UAAA,CAAW,MAAM,CAAA,IAAK,QAAQ,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,MAAA,CAAO,MAAM,CAAC,CAAA,GAAI,CAAA,EAAA,EAAK,EAAE,CAAA,CAAA,GAAK,MAAA;AAAA,MACrF,CAAA;AAAA,MACA,KAAK,EAAA,EAAI;AACP,QAAA,IAAI,CAAC,EAAA,CAAG,UAAA,CAAW,KAAK,MAAM,CAAA,CAAE,GAAG,OAAO,MAAA;AAC1C,QAAA,OAAO,QAAQ,EAAA,CAAG,KAAA,CAAM,OAAO,MAAA,GAAS,CAAC,CAAC,CAAA,IAAI;AAAA,MAChD,CAAA;AAAA,MACA,gBAAgB,MAAA,EAAQ;AACtB,QAAA,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAC,GAAG,OAAM,CAAE,IAAA,EAAM,CAAC,CAAA;AACtC,QAAA,KAAA,MAAW,KAAA,IAAS,CAAC,KAAA,EAAO,QAAA,EAAU,QAAQ,CAAA,EAAY;AACxD,UAAA,MAAA,CAAO,OAAA,CAAQ,EAAA,CAAG,KAAA,EAAO,CAAC,IAAA,KAAS,OAAA,CAAQ,MAAA,EAAQA,OAAAA,CAAQ,IAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,QAC1E;AACA,QAAA,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,CAAC,GAAA,EAAK,KAAK,IAAA,KAAS;AACzC,UAAA,MAAM,GAAA,GAAM,IAAI,GAAA,IAAO,GAAA;AACvB,UAAA,MAAM,OAAO,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,GAAA;AAClC,UAAA,MAAM,MAAA,GAAS,KAAK,QAAA,CAAS,GAAG,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,IAAA;AACxD,UAAA,MAAM,IAAA,GAAO,IAAA,KAAS,MAAA,GAAS,GAAA,GAAM,KAAK,UAAA,CAAW,CAAA,EAAG,MAAM,CAAA,CAAA,CAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,GAAI,IAAA;AACjG,UAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,KAAW,KAAA,IAAS,SAAS,IAAA,GAAON,MAAAA,CAAM,IAAI,CAAA,GAAI,MAAA;AACpE,UAAA,IAAI,CAAC,KAAA,EAAO,OAAO,IAAA,EAAK;AACxB,UAAA,MAAA,CAAO,kBAAA,CAAmB,GAAA,EAAK,IAAA,CAAK,KAAK,CAAC,CAAA,CAAE,IAAA;AAAA,YAC1C,CAAC,GAAA,KAAQ;AACP,cAAA,GAAA,CAAI,UAAA,GAAa,GAAA;AACjB,cAAA,GAAA,CAAI,SAAA,CAAU,gBAAgB,WAAW,CAAA;AACzC,cAAA,GAAA,CAAI,IAAI,GAAG,CAAA;AAAA,YACb,CAAA;AAAA,YACA,CAAC,GAAA,KAAiB,IAAA,CAAK,GAAG;AAAA,WAC5B;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAAA;AACF,GACF;AACF;AC1LA,IAAM,UAAA,GAAa,IAAA;AAMZ,SAAS,UAAU,OAAA,EAAqC;AAC7D,EAAA,IAAI,IAAA,GAAO,QAAQ,GAAA,EAAI;AAEvB,EAAA,MAAM,OAAA,GAAU,CAAC,EAAA,KAAwB;AACvC,IAAA,IAAI,EAAA,CAAG,WAAW,IAAI,CAAA,IAAK,GAAG,QAAA,CAAS,GAAG,GAAG,OAAO,KAAA;AACpD,IAAA,MAAM,IAAA,GAAOI,SAAS,IAAA,EAAM,EAAE,EAAE,KAAA,CAAMG,GAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACnD,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,QAAA,CAAS,cAAc,CAAA,EAAG,OAAO,KAAA;AAC/E,IAAA,OAAO,OAAA,CAAQ,QAAQ,IAAA,CAAK,CAAC,YAAYC,WAAAA,CAAY,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,EACrE,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,GAAI,QAAQ,cAAA,KAAmB,KAAA,GAAQ,EAAC,GAAI,CAAC,gBAAgB,CAAA;AAAA,IAC7D;AAAA,MACE,IAAA,EAAM,kBAAA;AAAA,MACN,OAAA,EAAS,KAAA;AAAA,MACT,eAAe,MAAA,EAAQ;AACrB,QAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AAAA,MAChB,CAAA;AAAA,MACA,SAAA,CAAU,MAAM,EAAA,EAAI;AAClB,QAAA,IAAI,CAAC,OAAA,CAAQ,EAAE,CAAA,EAAG,OAAO,MAAA;AACzB,QAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,EAAA,EAAI,IAAA,EAAM,QAAQ,OAAO,CAAA;AACjD,QAAA,MAAM,OAAA,GAAU,SAAA,CAAU,IAAA,EAAM,EAAA,EAAI,KAAK,CAAA;AACzC,QAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AACjC,QAAA,MAAM,CAAA,GAAI,CAAC,KAAA,KAAkB,IAAA,CAAK,UAAU,KAAK,CAAA;AAGjD,QAAA,MAAM,KAAA,GAAQ;AAAA,UACZ,EAAA;AAAA,UACA,CAAA,8CAAA,CAAA;AAAA,UACA,CAAA,sDAAA,CAAA;AAAA,UACA,CAAA,qEAAA,CAAA;AAAA,UACA,CAAA,oCAAA,CAAA;AAAA,UACA,GAAI,OAAA,CAAQ,WAAA,GAAc,CAAC,oCAAoC,CAAA,CAAEF,OAAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,WAAW,CAAC,CAAC,CAAA,CAAA,CAAG,IAAI,EAAC;AAAA,UAC5G,CAAA,qBAAA,EAAwB,CAAA,CAAE,EAAE,CAAC,CAAA,CAAA,CAAA;AAAA,UAC7B,CAAA,sBAAA,EAAyB,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,UACjC,2BAA2B,UAAU,CAAA,CAAA,CAAA;AAAA,UACrC,2BAAA;AAAA,UACA,CAAA,SAAA,EAAY,OAAA,CAAQ,WAAA,GAAc,sBAAA,GAAyB,WAAW,CAAA,CAAA,CAAA;AAAA,UACtE,sEAAA;AAAA,UACA,IAAA;AAAA,UACA,yKAAA;AAAA,UACA,GAAG,OAAA,CAAQ,GAAA;AAAA,YACT,CAAC,KAAA,KAAU,CAAA,aAAA,EAAgB,CAAA,CAAE,KAAA,CAAM,IAAI,CAAC,CAAA,oBAAA,EAAuB,CAAA,CAAE,KAAA,CAAM,UAAU,CAAC,CAAA,oBAAA;AAAA;AACpF,SACF;AACA,QAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,IAAI;AAAA,EAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA,EAAM,KAAK,IAAA,EAAK;AAAA,MAC7D;AAAA;AACF,GACF;AACF","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';\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 { storyId, storyNameFromExport } from '../story/ids';\nimport type { IndexEntry } from '../story/types';\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(spec.local.name);\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\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 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 };\n });\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 } 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';\nimport { hoistPages, writePages } from './build';\nimport { autoTitle } from './autoTitle';\nimport { html } from './html';\nimport { indexFile } from './indexFile';\nimport { storybookShims } from './storybookShims';\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', '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\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 .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\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 config from 'virtual:forge/shell-config.js';\n\nconst workshop = mountWorkshop({\n index,\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`,\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`,\n };\n\n function reindex(server: ViteDevServer, file: string, event: 'add' | 'change' | 'unlink'): void {\n const current = files();\n if (event === 'change' && !current.has(file)) return;\n if (event === 'add' && !matches(file)) return;\n if (event === 'unlink' && !current.has(file)) return;\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;\n }\n }\n const next = index();\n if (JSON.stringify(next) === before) return;\n\n for (const env of Object.values(server.environments)) {\n for (const name of ['index.js', 'importers.js']) {\n const mod = env.moduleGraph.getModuleById(`\\0${PREFIX}${name}`);\n if (mod) env.moduleGraph.invalidateModule(mod);\n }\n }\n server.ws.send({ type: 'custom', event: 'forge:index', data: next });\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 },\n resolveId(id) {\n return id.startsWith(PREFIX) && MODULES.has(id.slice(PREFIX.length)) ? `\\0${id}` : undefined;\n },\n load(id) {\n if (!id.startsWith(`\\0${PREFIX}`)) return undefined;\n return modules[id.slice(PREFIX.length + 1)]?.();\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, (file) => reindex(server, resolve(file), event));\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';\nimport { indexFile } from './indexFile';\nimport { storybookShims } from './storybookShims';\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 `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 ...entries.map(\n (entry) => `__forge_test(${q(entry.name)}, () => __forge_run(${q(entry.exportName)}), __forge_timeout);`,\n ),\n ];\n return { code: `${code}\\n${lines.join('\\n')}\\n`, map: null };\n },\n },\n ];\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weasel-js/forge",
3
- "version": "1.5.1",
3
+ "version": "1.5.2",
4
4
  "description": "A component workshop on labkit: stories in isolated frames, controls and state in lab trials.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -69,7 +69,7 @@
69
69
  "@testing-library/dom": "^10.4.0",
70
70
  "@testing-library/user-event": "^14.6.1",
71
71
  "@vitest/expect": "^4.1.6",
72
- "@weasel-js/theme": "1.5.1",
72
+ "@weasel-js/theme": "1.5.2",
73
73
  "axe-core": "^4.13.0",
74
74
  "chai": "^6.2.2"
75
75
  },
@@ -77,8 +77,8 @@
77
77
  "@babel/types": "^7.29.0"
78
78
  },
79
79
  "peerDependencies": {
80
- "@weasel-js/core": "1.5.1",
81
- "@weasel-js/labkit": "1.5.1",
80
+ "@weasel-js/core": "1.5.2",
81
+ "@weasel-js/labkit": "1.5.2",
82
82
  "react": "^19.0.0",
83
83
  "react-dom": "^19.0.0",
84
84
  "vite": "^8.0.0",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/frame/a11y.ts","../src/frame/cssVars.ts","../src/frame/capture.ts","../src/frame/StoryHost.tsx","../src/frame/FrameController.tsx","../src/csf/isPlainObject.ts","../src/csf/argsToSchema.ts","../src/csf/loadCsfModule.tsx","../src/story/native.ts","../src/frame/mountFrame.tsx"],"names":["jsx","config","value","f"],"mappings":"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","file":"chunk-2MADHLRA.js","sourcesContent":["import type { A11yFinding, A11yReport } from '../protocol/messages';\n\n/** The shape of `axe.run`'s answer this module reads. */\ninterface AxeResult {\n violations: readonly AxeFinding[];\n incomplete: readonly AxeFinding[];\n passes: readonly unknown[];\n inapplicable: readonly unknown[];\n}\ninterface AxeFinding {\n id: string;\n impact?: string | null;\n help: string;\n helpUrl: string;\n description: string;\n nodes: readonly { target: readonly unknown[]; html: string; failureSummary?: string }[];\n}\ninterface AxeModule {\n run(context: Element, options?: unknown): Promise<AxeResult>;\n}\n\nconst IMPACTS = new Set(['minor', 'moderate', 'serious', 'critical']);\n\nfunction finding(from: AxeFinding): A11yFinding {\n const impact = from.impact ?? '';\n return {\n id: from.id,\n impact: IMPACTS.has(impact) ? (impact as A11yFinding['impact']) : null,\n help: from.help,\n helpUrl: from.helpUrl,\n description: from.description,\n nodes: from.nodes.map((node) => ({\n // An axe target entry is a selector, or an array of them for an element inside a shadow root.\n target: node.target.map((part) => (Array.isArray(part) ? part.join(' ') : String(part))),\n html: node.html,\n ...(node.failureSummary === undefined ? {} : { failureSummary: node.failureSummary }),\n })),\n };\n}\n\nlet loading: Promise<AxeModule> | null = null;\n\n/** axe is ~500 KB, so a frame that is never audited never pays for it. */\nfunction loadAxe(): Promise<AxeModule> {\n loading ??= import('axe-core').then((mod) => (mod as unknown as { default?: AxeModule }).default ?? (mod as unknown as AxeModule));\n return loading;\n}\n\n/** Runs axe over `element` and reduces its answer to what crosses the frame's channel. */\nexport async function runAxe(element: Element): Promise<A11yReport> {\n const axe = await loadAxe();\n const result = await axe.run(element);\n return {\n violations: result.violations.map(finding),\n incomplete: result.incomplete.map(finding),\n passes: result.passes.length,\n inapplicable: result.inapplicable.length,\n };\n}\n","import type { CssVarReport } from '../protocol/messages';\n\nconst VAR_REF = /var\\(\\s*(--[\\w-]+)/g;\n\nfunction collect(text: string, names: Set<string>): void {\n if (!text.includes('var(')) return;\n for (const [, name] of text.matchAll(VAR_REF)) names.add(name!);\n}\n\n/** A grouping rule's text holds its children's; an `@import` holds only its URL, so its sheet is read too. */\nfunction walkRules(sheet: CSSStyleSheet, names: Set<string>): void {\n let rules: CSSRuleList;\n try {\n rules = sheet.cssRules;\n } catch {\n // A cross-origin sheet refuses to be read.\n return;\n }\n for (const rule of Array.from(rules)) {\n const imported = (rule as CSSRule & { styleSheet?: CSSStyleSheet | null }).styleSheet;\n if (imported) walkRules(imported, names);\n else collect(rule.cssText, names);\n }\n}\n\n/**\n * Every custom property the document references with `var()`, from inline styles and stylesheet rules — computed\n * styles have already substituted the reference away. Values resolve on `:root`, or else on the first element that\n * declares one.\n */\nexport function scanCssVars(doc: Document, overridden: (name: string) => boolean = () => false): CssVarReport[] {\n const names = new Set<string>();\n for (const el of Array.from(doc.querySelectorAll('[style]'))) collect(el.getAttribute('style') ?? '', names);\n for (const sheet of Array.from(doc.styleSheets)) walkRules(sheet, names);\n\n const values = resolveValues(doc, names);\n return [...names]\n .sort()\n .map((name) => ({ name, value: values.get(name) ?? '', overridden: overridden(name) }));\n}\n\nfunction resolveValues(doc: Document, names: Iterable<string>): Map<string, string> {\n const view = doc.defaultView;\n const values = new Map<string, string>();\n if (!view) return values;\n const root = view.getComputedStyle(doc.documentElement);\n const missing: string[] = [];\n for (const name of names) {\n const value = root.getPropertyValue(name).trim();\n if (value) values.set(name, value);\n else missing.push(name);\n }\n for (const el of missing.length > 0 ? Array.from((doc.body ?? doc.documentElement).querySelectorAll('*')) : []) {\n const style = view.getComputedStyle(el);\n for (let i = missing.length - 1; i >= 0; i--) {\n const value = style.getPropertyValue(missing[i]!).trim();\n if (!value) continue;\n values.set(missing[i]!, value);\n missing.splice(i, 1);\n }\n if (missing.length === 0) break;\n }\n return values;\n}\n\n/** One custom property's value, resolved the way `scanCssVars` resolves each. */\nexport function resolveCssVar(doc: Document, name: string): string {\n return resolveValues(doc, [name]).get(name) ?? '';\n}\n\nexport interface Overrides {\n set(name: string, value: string | null): void;\n has(name: string): boolean;\n /** Whether `node` is the override style element or inside it. */\n owns(node: Node): boolean;\n dispose(): void;\n}\n\n/**\n * Custom property overrides as one rule on `scope`, kept last in `<head>`. `:not(#fg-overrides)` adds an ID's weight\n * without `!important`, so the rule outranks a theme's attribute selectors; a stylesheet that lands after it sends\n * the element back to the end.\n */\nexport function createOverrides(doc: Document, scope = ':root'): Overrides {\n const values = new Map<string, string>();\n const style = doc.createElement('style');\n style.setAttribute('data-fg-overrides', '');\n\n // Another instance's style counts as last place too, or two instances would take turns moving forever.\n const keepLast = () => {\n if (style.parentNode === doc.head) {\n let next = style.nextElementSibling;\n while (next?.hasAttribute('data-fg-overrides')) next = next.nextElementSibling;\n if (next === null) return;\n }\n doc.head.append(style);\n };\n const write = () => {\n const decls = [...values].map(([name, value]) => ` ${name}: ${value};`);\n style.textContent = decls.length > 0 ? `:is(${scope}):not(#fg-overrides) {\\n${decls.join('\\n')}\\n}\\n` : '';\n };\n\n keepLast();\n const observer = typeof MutationObserver === 'undefined' ? null : new MutationObserver(keepLast);\n observer?.observe(doc.head, { childList: true });\n\n return {\n set(name, value) {\n if (value === null) values.delete(name);\n else values.set(name, value);\n write();\n },\n has: (name) => values.has(name),\n owns: (node) => style.contains(node),\n dispose() {\n observer?.disconnect();\n style.remove();\n },\n };\n}\n","import type { CapturedPicture } from '../protocol/messages';\nimport { scanCssVars } from './cssVars';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\n/** Every rule the document can read. A cross-origin sheet refuses, and is skipped. */\nfunction documentCss(doc: Document): string {\n const out: string[] = [];\n for (const sheet of Array.from(doc.styleSheets)) {\n try {\n for (const rule of Array.from(sheet.cssRules)) out.push(rule.cssText);\n } catch {\n // A cross-origin sheet refuses to be read.\n }\n }\n return out.join('\\n');\n}\n\n/**\n * The story's own subtree as an SVG picture: the DOM inside a `<foreignObject>`, with the document's\n * stylesheets beside it.\n *\n * The capture root is a `<div>`, so nothing a rule hangs off `:root`, `html` or `body` reaches the story —\n * hence the custom properties restated on the root, which is what theme tokens travel by.\n */\nexport function captureElement(element: HTMLElement): Extract<CapturedPicture, { kind: 'svg' }> {\n const doc = element.ownerDocument;\n const rect = element.getBoundingClientRect();\n const w = Math.max(1, Math.ceil(rect.width));\n const h = Math.max(1, Math.ceil(rect.height));\n\n const root = doc.createElement('div');\n root.setAttribute('data-fg-capture', '');\n const tokens = scanCssVars(doc)\n .filter((v) => v.value)\n .map((v) => `${v.name}: ${v.value};`)\n .join('');\n const style = doc.createElement('style');\n style.textContent = `${documentCss(doc)}\\n[data-fg-capture]{${tokens}}`;\n root.append(style, element.cloneNode(true));\n\n // XML, not HTML: an `<svg>` base is re-parsed as XML, where `<br>` and friends have to be closed.\n const inner = new XMLSerializer().serializeToString(root);\n return {\n kind: 'svg',\n markup: `<svg xmlns=\"${SVG_NS}\" width=\"${w}\" height=\"${h}\" viewBox=\"0 0 ${w} ${h}\"><foreignObject x=\"0\" y=\"0\" width=\"${w}\" height=\"${h}\">${inner}</foreignObject></svg>`,\n };\n}\n","import { Component, type ReactNode } from 'react';\nimport type { Decorator, LoadedStory, StoryContext } from '../story/types';\n\nexport interface StoryHostProps {\n story: LoadedStory;\n ctx: StoryContext;\n /** Outermost decorators, from the frame setup. */\n decorators: readonly Decorator[];\n /** A change clears a caught error, so new input retries the render. */\n resetKey: number;\n onError: (error: unknown) => void;\n}\n\nfunction RenderStory({ story, ctx }: { story: LoadedStory; ctx: StoryContext }): ReactNode {\n return story.render(ctx);\n}\n\nfunction Decorated({ story, ctx, decorators }: Omit<StoryHostProps, 'resetKey' | 'onError'>): ReactNode {\n let inner: () => ReactNode = () => <RenderStory story={story} ctx={ctx} />;\n for (const decorate of [...story.decorators, ...decorators]) {\n const wrapped = inner;\n inner = () => decorate(wrapped, ctx);\n }\n return inner();\n}\n\ninterface BoundaryState {\n error: unknown;\n failed: boolean;\n resetKey: number;\n}\n\nexport class StoryHost extends Component<StoryHostProps, BoundaryState> {\n override state: BoundaryState = { error: null, failed: false, resetKey: this.props.resetKey };\n\n static getDerivedStateFromProps(props: StoryHostProps, state: BoundaryState): Partial<BoundaryState> | null {\n return props.resetKey === state.resetKey ? null : { error: null, failed: false, resetKey: props.resetKey };\n }\n\n static getDerivedStateFromError(error: unknown): Partial<BoundaryState> {\n return { error, failed: true };\n }\n\n override componentDidCatch(error: unknown): void {\n this.props.onError(error);\n }\n\n override render(): ReactNode {\n if (this.state.failed) {\n const { error } = this.state;\n return <pre className=\"fg-frame__fault\">{error instanceof Error ? error.message : String(error)}</pre>;\n }\n const { story, ctx, decorators } = this.props;\n return <Decorated story={story} ctx={ctx} decorators={decorators} />;\n }\n}\n","import { flushSync } from 'react-dom';\nimport { createRoot } from 'react-dom/client';\nimport type { Channel } from '../protocol/channel';\nimport {\n type CssVarReport,\n type FaultPhase,\n type FromFrame,\n type Globals,\n stableStringify,\n type ToFrame,\n} from '../protocol/messages';\nimport { answerSchema, describeSchema } from '../protocol/schema';\nimport type { Decorator, LoadedStory, StoryContext } from '../story/types';\nimport { runAxe } from './a11y';\nimport { captureElement } from './capture';\nimport { createOverrides, resolveCssVar, scanCssVars } from './cssVars';\nimport { StoryHost } from './StoryHost';\n\nexport interface FrameSetup {\n /** Wraps every story, outermost; receives the globals. From the frame config (`frameConfig`). */\n decorators?: Decorator[];\n /** Applies globals to the frame document — theme mode, fonts. */\n applyGlobals?: (globals: Globals, root: HTMLElement) => void;\n /**\n * The elements a CSS variable override is declared on; `:root` by default. An override has to be declared on\n * whichever element declares the token itself — a theme wrapper, say — or that element's own value wins.\n */\n cssVarsScope?: string;\n /** Project-wide CSF parameters, Storybook's preview `parameters`: under each meta's and story's. */\n parameters?: Record<string, unknown>;\n}\n\nexport interface StartFrameOptions {\n story: LoadedStory;\n channel: Channel<ToFrame, FromFrame>;\n container: HTMLElement;\n setup?: FrameSetup;\n}\n\nconst VARS_SETTLE_MS = 100;\n\nfunction fault(phase: FaultPhase, error: unknown, seq?: number): FromFrame {\n return {\n type: 'fault',\n phase,\n message: error instanceof Error ? error.message : String(error),\n ...(error instanceof Error && error.stack ? { stack: error.stack } : {}),\n ...(seq === undefined ? {} : { seq }),\n };\n}\n\n/** Sends `ready`, then renders the story on `init` and keeps it in step. Returns a stop function. */\nexport function startFrame({ story, channel, container, setup = {} }: StartFrameOptions): () => void {\n const { send } = channel;\n send({ type: 'ready', schema: describeSchema(story.config), layout: story.layout, viewport: story.viewport });\n\n const wrapper = document.createElement('div');\n wrapper.className = `fg-frame fg-frame--${story.layout}`;\n container.append(wrapper);\n const root = createRoot(wrapper);\n const decorators = setup.decorators ?? [];\n\n let initialized = false;\n let rendered = false;\n let config: unknown;\n let state: unknown = null;\n let globals: Globals = {};\n let answeredKey: string | null = null;\n let resetKey = 0;\n let seq = 0;\n\n const overrides = createOverrides(document, setup.cssVarsScope);\n let lastVars: CssVarReport[] | null = null;\n let reported: string | null = null;\n const publishVars = (vars: CssVarReport[]) => {\n lastVars = vars;\n const key = JSON.stringify(vars);\n if (key === reported) return;\n reported = key;\n send({ type: 'vars', vars });\n };\n const reportVars = () => publishVars(scanCssVars(document, overrides.has));\n const ownMutation = (record: MutationRecord) =>\n overrides.owns(record.target) ||\n (record.type === 'childList' &&\n [...record.addedNodes, ...record.removedNodes].length > 0 &&\n [...record.addedNodes, ...record.removedNodes].every(overrides.owns));\n let settleTimer: ReturnType<typeof setTimeout> | undefined;\n const mutations =\n typeof MutationObserver === 'undefined'\n ? null\n : new MutationObserver((records) => {\n if (records.every(ownMutation)) return;\n clearTimeout(settleTimer);\n settleTimer = setTimeout(reportVars, VARS_SETTLE_MS);\n });\n // Every attribute, not just style and class: a stylesheet can select on any of them, `[data-wzl-mode]` included.\n mutations?.observe(document.documentElement, { subtree: true, childList: true, characterData: true, attributes: true });\n\n const setConfig = (path: string, value: unknown) => send({ type: 'setConfig', path, value });\n const setState = (next: unknown) => {\n state = typeof next === 'function' ? (next as (prev: unknown) => unknown)(state) : next;\n send({ type: 'setState', state });\n render();\n };\n\n const render = () => {\n const ctx: StoryContext = { config, setConfig, state, setState, globals, title: story.title, name: story.name };\n const at = seq;\n root.render(\n <StoryHost\n story={story}\n ctx={ctx}\n decorators={decorators}\n resetKey={resetKey}\n onError={(error) => send(fault('render', error, at))}\n />,\n );\n const key = stableStringify(config);\n if (key !== answeredKey) {\n answeredKey = key;\n send({ type: 'answers', answers: { configKey: key, ...answerSchema(story.config, config) } });\n }\n };\n\n // Input from the trial commits synchronously, so a `play` that follows sees the rendered story. A throw while\n // applying it faults like a render would; otherwise the trial would wait on a frame that never answers.\n const input = (apply: () => void) => {\n seq += 1;\n try {\n apply();\n if (!initialized) return;\n resetKey += 1;\n flushSync(render);\n } catch (error) {\n send(fault('render', error, seq));\n return;\n }\n if (!rendered) {\n rendered = true;\n send({ type: 'rendered' });\n }\n reportVars();\n };\n\n const play = async () => {\n try {\n await story.play?.({ canvasElement: wrapper, config, globals });\n send({ type: 'played', ok: true });\n } catch (error) {\n send({ type: 'played', ok: false, message: error instanceof Error ? error.message : String(error) });\n send(fault('play', error));\n }\n };\n\n const audit = async (id: string) => {\n try {\n send({ type: 'a11y', id, ok: true, report: await runAxe(wrapper) });\n } catch (error) {\n send({ type: 'a11y', id, ok: false, message: error instanceof Error ? error.message : String(error) });\n }\n };\n\n const picture = (id: string) => {\n try {\n send({ type: 'capture', id, ok: true, picture: captureElement(wrapper) });\n } catch (error) {\n send({ type: 'capture', id, ok: false, message: error instanceof Error ? error.message : String(error) });\n }\n };\n\n const off = channel.on((msg) => {\n switch (msg.type) {\n case 'init':\n input(() => {\n initialized = true;\n config = msg.config;\n globals = msg.globals;\n state = msg.state;\n if (state === null && story.initialState) {\n state = story.initialState(config);\n send({ type: 'setState', state });\n }\n setup.applyGlobals?.(globals, document.documentElement);\n });\n break;\n case 'config':\n input(() => {\n config = msg.config;\n });\n break;\n case 'state':\n input(() => {\n state = msg.state;\n });\n break;\n case 'globals':\n input(() => {\n globals = msg.globals;\n setup.applyGlobals?.(globals, document.documentElement);\n });\n break;\n case 'vars.set': {\n overrides.set(msg.name, msg.value);\n const at = lastVars?.findIndex((v) => v.name === msg.name) ?? -1;\n if (!lastVars || at < 0) break;\n const vars = lastVars.slice();\n vars[at] = { name: msg.name, value: resolveCssVar(document, msg.name), overridden: overrides.has(msg.name) };\n publishVars(vars);\n break;\n }\n case 'play':\n void play();\n break;\n case 'a11y.run':\n void audit(msg.id);\n break;\n case 'capture.run':\n picture(msg.id);\n break;\n }\n });\n\n const observer =\n typeof ResizeObserver === 'undefined'\n ? null\n : new ResizeObserver(() => {\n const { width, height } = wrapper.getBoundingClientRect();\n send({ type: 'size', width: Math.ceil(width), height: Math.ceil(height) });\n });\n observer?.observe(wrapper);\n\n return () => {\n off();\n observer?.disconnect();\n mutations?.disconnect();\n clearTimeout(settleTimer);\n overrides.dispose();\n root.unmount();\n wrapper.remove();\n };\n}\n\n/** Reports an import failure — there is no story to start. */\nexport function reportImportFault(channel: Channel<ToFrame, FromFrame>, error: unknown): void {\n channel.send(fault('import', error));\n}\n","export const isPlainObject = (value: unknown): value is Record<string, unknown> =>\n !!value && typeof value === 'object' && Object.getPrototypeOf(value) === Object.prototype;\n","import { type ConfigNode, type ConfigSchema, type ConfigShape, f } from '@weasel-js/labkit/config';\nimport { isPlainObject } from './isPlainObject';\nimport { portSafePart } from './portSafe';\n\n/** Storybook's conditional control: shown only while an arg, or a global, meets the test. */\nexport type ArgCondition = ({ arg: string } | { global: string }) & {\n truthy?: boolean;\n exists?: boolean;\n eq?: unknown;\n neq?: unknown;\n};\n\n/** A CSF `argTypes` entry, as far as forge reads it. */\nexport interface ArgType {\n name?: string;\n description?: string;\n control?: string | false | { type?: string; min?: number; max?: number; step?: number };\n options?: readonly unknown[];\n table?: { disable?: boolean };\n if?: ArgCondition;\n}\n\ninterface Leaf extends ConfigNode<unknown> {\n hidden(): Leaf;\n describe(description: string): Leaf;\n label(name: string): Leaf;\n showIf(predicate: (config: Record<string, unknown>) => boolean): Leaf;\n}\n\ninterface Control {\n type: string | undefined;\n min?: number;\n max?: number;\n step?: number;\n}\n\nfunction controlOf(argType: ArgType): Control | false {\n const { control } = argType;\n if (control === false) return false;\n if (typeof control === 'string') return { type: control };\n return { type: control?.type, min: control?.min, max: control?.max, step: control?.step };\n}\n\nfunction stringOptions(argType: ArgType): string[] | null {\n const opts = argType.options;\n return opts && opts.length > 0 && opts.every((o) => typeof o === 'string') ? (opts as string[]) : null;\n}\n\nfunction inferred(value: unknown): Leaf | null {\n switch (typeof value) {\n case 'number':\n return f.number(value);\n case 'boolean':\n return f.boolean(value);\n case 'string':\n return f.string(value);\n default:\n return Array.isArray(value) || isPlainObject(value) ? f.custom('json', value) : null;\n }\n}\n\nfunction bounded(node: ReturnType<typeof f.number>, control: Control) {\n let out = node;\n if (control.min !== undefined && control.max !== undefined) out = out.range(control.min, control.max);\n if (control.step !== undefined) out = out.step(control.step);\n return out;\n}\n\nfunction controlled(control: Control, argType: ArgType, has: boolean, value: unknown): Leaf | null {\n const options = stringOptions(argType);\n // Storybook passes an argTypes-only key as undefined, so the component's own default applies.\n const def = <T>() => (has ? value : undefined) as T;\n switch (control.type) {\n case 'number': {\n const node = bounded(f.number(def()), control);\n return control.min !== undefined && control.max !== undefined ? node.input() : node;\n }\n case 'range':\n case 'slider':\n return has ? bounded(f.number(def()), control).slider() : null;\n case 'boolean':\n return f.boolean(def());\n case 'switch':\n return f.boolean(def()).toggle();\n case 'text':\n case 'textarea':\n return f.string(def());\n case 'select':\n case 'radio':\n case 'inline-radio':\n case undefined: {\n if (!options) return control.type === undefined && has ? inferred(value) : null;\n const node = f.enum(def<string>(), options);\n return control.type === 'radio' || control.type === 'inline-radio' ? node.radio() : node;\n }\n case 'object':\n return has ? f.custom('json', value) : null;\n default:\n return has ? inferred(value) : null;\n }\n}\n\n/** The config predicate for an `if`; null for a condition on a global, which a story's config does not hold. */\nfunction conditionOf(condition: ArgCondition): ((config: Record<string, unknown>) => boolean) | null {\n if (!('arg' in condition)) return null;\n const { arg } = condition;\n return (config) => {\n const value = config[arg];\n if (condition.exists !== undefined) return (value !== undefined) === condition.exists;\n if ('eq' in condition) return Object.is(value, condition.eq);\n if ('neq' in condition) return !Object.is(value, condition.neq);\n return Boolean(value) === (condition.truthy ?? true);\n };\n}\n\n/** `parameters.controls.matchers`: arg names that pick a control when the arg's argType names none. */\nexport interface ControlMatchers {\n color?: RegExp;\n /** labkit has no date leaf, so a date match keeps the leaf its value infers. */\n date?: RegExp;\n}\n\n/** Storybook's rule: a string arg with no control or options whose name matches `color` gets a color picker. */\nfunction matched(key: string, value: unknown, argType: ArgType | undefined, matchers: ControlMatchers): Leaf | null {\n if (typeof value !== 'string' || argType?.control !== undefined || stringOptions(argType ?? {})) return null;\n return matchers.color?.test(key) ? f.color(value) : null;\n}\n\n/** A labkit schema for a CSF story's args, refined by its `argTypes`. */\nexport function argsToSchema(\n args: Readonly<Record<string, unknown>>,\n argTypes: Readonly<Record<string, ArgType | undefined>>,\n matchers: ControlMatchers = {},\n): ConfigSchema<unknown> {\n const nodes: Record<string, Leaf> = {};\n for (const key of new Set([...Object.keys(args), ...Object.keys(argTypes)])) {\n const has = key in args;\n // A control carries only what crosses the port; the frame puts the rest back from `args` (`withUnsent`).\n const part = has ? portSafePart(args[key]) : null;\n if (has && !part) continue;\n const value = part?.value;\n const argType = argTypes[key];\n const control = argType ? controlOf(argType) : false;\n\n let node: Leaf | null =\n (has ? matched(key, value, argType, matchers) : null) ??\n (control ? controlled(control, argType ?? {}, has, value) : has ? inferred(value) : null);\n if (!node) continue;\n if (argType && (argType.control === false || argType.table?.disable)) node = node.hidden();\n if (argType?.description) node = node.describe(argType.description);\n if (argType?.name) node = node.label(argType.name);\n const shownWhen = argType?.if ? conditionOf(argType.if) : null;\n if (shownWhen) node = node.showIf(shownWhen);\n nodes[key] = node;\n }\n return f.schema(nodes as ConfigShape);\n}\n","import {\n type ComponentType,\n createContext,\n createElement,\n type Dispatch,\n type ReactNode,\n type SetStateAction,\n useContext,\n useEffect,\n useState,\n} from 'react';\nimport type { Globals, Layout, Viewport } from '../protocol/messages';\nimport { storyId, storyNameFromExport } from '../story/ids';\nimport type { Decorator, LoadedStory, PlayContext, StoryContext } from '../story/types';\nimport { type ArgsScope, ArgsContext, appliedLocal, coverOf, type LocalArgs } from './argsContext';\nimport { type ArgType, argsToSchema, type ControlMatchers } from './argsToSchema';\nimport { isPlainObject } from './isPlainObject';\nimport { withUnsent } from './portSafe';\n\ntype Args = Record<string, unknown>;\ntype CsfContext = {\n args: Args;\n globals: Globals;\n parameters: Record<string, unknown>;\n title: string;\n name: string;\n id: string;\n viewMode: 'story';\n};\ntype CsfRender = (args: Args, context: CsfContext) => ReactNode;\ntype CsfDecorator = (Story: ComponentType, context: CsfContext) => ReactNode;\ntype CsfPlay = (context: CsfContext & { canvasElement: HTMLElement; step: CsfStep }) => void | Promise<void>;\ntype CsfStep = (label: string, fn: () => void | Promise<void>) => Promise<void>;\n\ninterface Annotations {\n title?: string;\n name?: string;\n storyName?: string;\n component?: ComponentType<Args>;\n args?: Args;\n argTypes?: Record<string, ArgType>;\n parameters?: Record<string, unknown>;\n globals?: Record<string, unknown>;\n decorators?: CsfDecorator | CsfDecorator[];\n render?: CsfRender;\n play?: CsfPlay;\n includeStories?: string[] | RegExp;\n excludeStories?: string[] | RegExp;\n}\n\nconst LAYOUTS: readonly Layout[] = ['centered', 'padded', 'fullscreen'];\n\nconst asArray = <T,>(value: T | T[] | undefined): T[] => (value === undefined ? [] : Array.isArray(value) ? value : [value]);\n\n/** Storybook's `deleteUndefined`, which its args store applies after every update. */\nconst withoutUndefined = (args: Args): Args =>\n Object.fromEntries(Object.entries(args).filter(([, value]) => value !== undefined));\n\n/** Storybook's `matches` from `isExportStory`. */\nconst matches = (key: string, filter: string[] | RegExp) =>\n Array.isArray(filter) ? filter.includes(key) : key.match(filter) !== null;\n\n/** Storybook's `combineParameters`: plain objects merge deeply, anything else is replaced. */\nfunction combineParameters(...sources: (Record<string, unknown> | undefined)[]): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const source of sources) {\n for (const [key, value] of Object.entries(source ?? {})) {\n if (value === undefined) continue;\n out[key] = isPlainObject(value) && isPlainObject(out[key]) ? combineParameters(out[key], value) : value;\n }\n }\n return out;\n}\n\nfunction resolveViewport(parameters: Record<string, unknown>, globals: Record<string, unknown>): Viewport | null {\n const selected = globals.viewport as { value?: string; isRotated?: boolean } | undefined;\n const options = (parameters.viewport as { options?: Record<string, { styles?: { width?: string; height?: string } }> } | undefined)\n ?.options;\n const styles = selected?.value ? options?.[selected.value]?.styles : undefined;\n const px = (v: string | undefined) => (v && /^\\d+(\\.\\d+)?px$/.test(v) ? Number.parseFloat(v) : Number.NaN);\n const width = px(styles?.width);\n const height = px(styles?.height);\n if (Number.isNaN(width) || Number.isNaN(height)) return null;\n return selected?.isRotated ? { width: height, height: width } : { width, height };\n}\n\nconst InnerStory = createContext<(() => ReactNode) | null>(null);\n\nfunction Story(): ReactNode {\n return useContext(InnerStory)?.() ?? null;\n}\n\nfunction Call({ fn }: { fn: () => ReactNode }): ReactNode {\n return fn();\n}\n\ninterface StoryLocals {\n story: string;\n local: LocalArgs;\n setLocal: Dispatch<SetStateAction<LocalArgs>>;\n}\n\nconst LocalArgsContext = createContext<StoryLocals | null>(null);\n\n/** The outermost scope of a story holds its frame-local args, so its decorators and render share them. */\nfunction Scoped({\n id,\n build,\n fn,\n}: {\n id: string;\n build: (local: StoryLocals) => [ArgsScope, CsfContext];\n fn: (context: CsfContext) => ReactNode;\n}): ReactNode {\n const outer = useContext(LocalArgsContext);\n const [local, setLocal] = useState<LocalArgs>({});\n const shared = outer?.story === id ? outer : { story: id, local, setLocal };\n const [scope, context] = build(shared);\n const { config } = scope;\n const prune = shared.setLocal;\n // An entry config has moved past must not come back if config later returns to the value it covered.\n useEffect(() => {\n prune((prev) => {\n const kept = Object.entries(prev).filter(([key, entry]) => coverOf(config[key]) === entry.over);\n return kept.length === Object.keys(prev).length ? prev : Object.fromEntries(kept);\n });\n }, [config, prune]);\n return createElement(\n LocalArgsContext.Provider,\n { value: shared },\n createElement(ArgsContext.Provider, { value: scope }, createElement(Call, { fn: () => fn(context) })),\n );\n}\n\n/**\n * Normalizes a Component Story Format module. `autoTitle` titles the stories when the meta names no title;\n * `parameters` are the project's, under the meta's and each story's.\n */\nexport function loadCsfModule(\n mod: Record<string, unknown>,\n autoTitle: string,\n projectParameters: Record<string, unknown> = {},\n): LoadedStory[] {\n const meta = (isPlainObject(mod.default) ? mod.default : {}) as Annotations;\n const title = meta.title ?? autoTitle;\n const stories: LoadedStory[] = [];\n\n for (const [exportName, value] of Object.entries(mod)) {\n if (exportName === 'default' || exportName === '__namedExportsOrder' || exportName === '__esModule') continue;\n if (meta.includeStories && !matches(exportName, meta.includeStories)) continue;\n if (meta.excludeStories && matches(exportName, meta.excludeStories)) continue;\n if (!value || (typeof value !== 'object' && typeof value !== 'function')) continue;\n\n // A CSF 2 function export hoists its annotations onto itself.\n const spec: Annotations = typeof value === 'function' ? { ...value, render: value as CsfRender } : (value as Annotations);\n const id = storyId(title, exportName);\n const name = spec.name || spec.storyName || storyNameFromExport(exportName);\n const args = { ...meta.args, ...spec.args };\n const parameters = combineParameters(projectParameters, meta.parameters, spec.parameters);\n const matchers = (parameters.controls as { matchers?: ControlMatchers } | undefined)?.matchers;\n const config = argsToSchema(\n args,\n combineParameters(meta.argTypes, spec.argTypes) as Record<string, ArgType>,\n isPlainObject(matchers) ? matchers : {},\n );\n const defaults = config.defaults() as Args;\n const storyGlobals = { ...meta.globals, ...spec.globals };\n const component = meta.component;\n const renderFn: CsfRender | undefined =\n spec.render ?? meta.render ?? (component ? (a) => createElement(component, a) : undefined);\n\n const withArgs = (config: Args): Args =>\n Object.fromEntries(\n Object.entries(withoutUndefined(config)).map(([key, value]) => [key, key in args ? withUnsent(value, args[key]) : value]),\n );\n const csfContext = (config: unknown, globals: Globals, local: LocalArgs = {}): CsfContext => ({\n args: withoutUndefined({ ...args, ...withArgs(config as Args), ...appliedLocal(local, config as Args) }),\n globals,\n parameters,\n title,\n name,\n id,\n viewMode: 'story',\n });\n const scoped = (ctx: StoryContext, fn: (context: CsfContext) => ReactNode): ReactNode =>\n createElement(Scoped, {\n id,\n build: ({ local, setLocal }: StoryLocals): [ArgsScope, CsfContext] => {\n const context = csfContext(ctx.config, ctx.globals, local);\n const scope: ArgsScope = {\n args: context.args,\n config: ctx.config as Args,\n defaults,\n original: args,\n setConfig: ctx.setConfig,\n setLocal,\n };\n return [scope, context];\n },\n fn,\n });\n\n const adapt =\n (decorator: CsfDecorator): Decorator =>\n (inner, ctx) =>\n createElement(\n InnerStory.Provider,\n { value: inner },\n scoped(ctx, (context) => decorator(Story, context)),\n );\n\n const layout = parameters.layout as Layout | undefined;\n const play = spec.play ?? meta.play;\n\n stories.push({\n id,\n title,\n name,\n exportName,\n config,\n initialState: null,\n render: (ctx) => {\n if (!renderFn) return null;\n return scoped(ctx, (context) => renderFn(context.args, context));\n },\n decorators: [...asArray(spec.decorators), ...asArray(meta.decorators)].map(adapt),\n layout: layout && LAYOUTS.includes(layout) ? layout : 'padded',\n viewport: resolveViewport(parameters, storyGlobals),\n play: play\n ? ({ canvasElement, config, globals }: PlayContext) =>\n play({ ...csfContext(config, globals), canvasElement, step: async (_label, fn) => fn() })\n : null,\n });\n }\n return stories;\n}\n","import { f } from '@weasel-js/labkit/config';\nimport { isNative } from './define';\nimport { storyId, storyNameFromExport } from './ids';\nimport type { LoadedStory, MetaSpec, StorySpec } from './types';\n\n/** Normalizes a module written with `meta` and `story`; exports that are not stories are skipped. */\n/** `autoTitle` titles the stories when the meta names no title. */\nexport function loadNativeModule(mod: Record<string, unknown>, autoTitle: string): LoadedStory[] {\n const metaSpec: MetaSpec = isNative(mod.default, 'meta') ? (mod.default as MetaSpec) : {};\n const title = metaSpec.title ?? autoTitle;\n const stories: LoadedStory[] = [];\n for (const [exportName, value] of Object.entries(mod)) {\n if (exportName === 'default' || !isNative(value, 'story')) continue;\n const spec = value as StorySpec<unknown, unknown>;\n stories.push({\n id: storyId(title, exportName),\n title,\n name: spec.name ?? storyNameFromExport(exportName),\n exportName,\n config: spec.config ?? f.schema({}),\n initialState: spec.state ?? null,\n render: spec.render,\n decorators: [...(spec.decorators ?? []), ...(metaSpec.decorators ?? [])],\n layout: spec.layout ?? metaSpec.layout ?? 'centered',\n viewport: spec.viewport ?? null,\n play: spec.play ?? null,\n });\n }\n return stories;\n}\n","import { loadCsfModule } from '../csf/loadCsfModule';\nimport { openChannel } from '../protocol/channel';\nimport { type FromFrame, PORT_HANDOFF, type ToFrame } from '../protocol/messages';\nimport { isNative } from '../story/define';\nimport { loadNativeModule } from '../story/native';\nimport type { LoadedStory } from '../story/types';\nimport { type FrameSetup, reportImportFault, startFrame } from './FrameController';\n\nexport interface FrameImporters {\n [file: string]: () => Promise<Record<string, unknown>>;\n}\n\nexport interface FrameIndexEntry {\n id: string;\n /** The story's title as indexed, which titles the file's stories when its meta names none. */\n title: string;\n file: string;\n exportName: string;\n}\n\nexport interface MountFrameOptions {\n index: readonly FrameIndexEntry[];\n importers: FrameImporters;\n setup?: FrameSetup;\n load?: (mod: Record<string, unknown>, autoTitle: string, parameters?: Record<string, unknown>) => LoadedStory[];\n}\n\n/**\n * The default `load`: a module whose default export is a forge `meta` is native, anything else is CSF under\n * `parameters`. `autoTitle` titles the stories when the meta names no title.\n */\nexport function loadStories(\n mod: Record<string, unknown>,\n autoTitle: string,\n parameters?: Record<string, unknown>,\n): LoadedStory[] {\n return isNative(mod.default, 'meta')\n ? loadNativeModule(mod, autoTitle)\n : loadCsfModule(mod, autoTitle, parameters);\n}\n\nfunction waitForPort(): Promise<MessagePort> {\n return new Promise((resolve) => {\n const onMessage = (event: MessageEvent) => {\n const data = event.data as { type?: unknown } | null;\n const port = event.ports[0];\n if (event.origin !== location.origin || event.source !== window.parent) return;\n if (typeof data !== 'object' || data === null || data.type !== PORT_HANDOFF || !port) return;\n window.removeEventListener('message', onMessage);\n resolve(port);\n };\n window.addEventListener('message', onMessage);\n });\n}\n\n/** The frame document's entry: takes the shell's port, loads the story named by the hash, and starts it. */\nexport async function mountFrame(options: MountFrameOptions): Promise<void> {\n const channel = openChannel<ToFrame, FromFrame>(await waitForPort());\n const id = location.hash.slice(1);\n try {\n const entry = options.index.find((e) => e.id === id);\n if (!entry) throw new Error(`No story with id \"${id}\"`);\n const importer = options.importers[entry.file];\n if (!importer) throw new Error(`No importer for ${entry.file}`);\n const mod = await importer();\n const stories = (options.load ?? loadStories)(mod, entry.title, options.setup?.parameters);\n const story = stories.find((s) => s.exportName === entry.exportName);\n if (!story) throw new Error(`${entry.file} has no story export \"${entry.exportName}\"`);\n startFrame({ story, channel, container: document.getElementById('root') ?? document.body, setup: options.setup });\n } catch (error) {\n reportImportFault(channel, error);\n }\n}\n"]}