@vizejs/vite-plugin-musea 0.105.0 → 0.107.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/gallery/assets/{MonacoEditor-VccI_xm1.js → MonacoEditor-ChPO-ZtO.js} +2 -2
- package/dist/gallery/assets/{cssMode-DYl_gbi2.js → cssMode-tpEf1wjZ.js} +1 -1
- package/dist/gallery/assets/{editor.api2-C1iuJsz5.js → editor.api2-D2V4qV43.js} +1 -1
- package/dist/gallery/assets/{editor.main-CB_LUZEd.js → editor.main-B3fhJ8X5.js} +2 -2
- package/dist/gallery/assets/{freemarker2-CwuG5RrE.js → freemarker2-D9q7dgOY.js} +1 -1
- package/dist/gallery/assets/{handlebars-DQnqIqtZ.js → handlebars-dCjq6t-4.js} +1 -1
- package/dist/gallery/assets/{html-Cj3GxbMF.js → html-l0AO0O65.js} +1 -1
- package/dist/gallery/assets/{htmlMode-ckJrF6jc.js → htmlMode-DX8C44PK.js} +1 -1
- package/dist/gallery/assets/{index-6QLn8Kxp.js → index-SaDls6HF.js} +22 -22
- package/dist/gallery/assets/{javascript-DNOPgN7f.js → javascript-DwD4tp-i.js} +1 -1
- package/dist/gallery/assets/{jsonMode-BMPHk4yv.js → jsonMode-6FizhbWG.js} +1 -1
- package/dist/gallery/assets/{liquid-cUC3T7D4.js → liquid-DcyqPOD8.js} +1 -1
- package/dist/gallery/assets/{lspLanguageFeatures-DnNJLDpx.js → lspLanguageFeatures-DHY9tXb5.js} +1 -1
- package/dist/gallery/assets/{mdx-DDDAX75G.js → mdx-CwEaAM87.js} +1 -1
- package/dist/gallery/assets/{monaco.contribution-BsZfIZIS.js → monaco.contribution-DTmtm_Kx.js} +2 -2
- package/dist/gallery/assets/{python-CkEL94qN.js → python-knXrGY--.js} +1 -1
- package/dist/gallery/assets/{razor-DpH3myLF.js → razor-BM2_GyF3.js} +1 -1
- package/dist/gallery/assets/{tsMode-D4vJtygH.js → tsMode-C5FA3F_c.js} +1 -1
- package/dist/gallery/assets/{typescript-f3jEZleA.js → typescript-x3O9BFS4.js} +1 -1
- package/dist/gallery/assets/{workers-7fp33vpu.js → workers-CioQ1cEs.js} +1 -1
- package/dist/gallery/assets/{xml-CrndFNV8.js → xml-CDZz0d4E.js} +1 -1
- package/dist/gallery/assets/{yaml-BAl6eAY9.js → yaml-Dfe1aVPk.js} +1 -1
- package/dist/gallery/index.html +1 -1
- package/dist/{gallery-zu8hc8Lc.mjs → gallery-kaxHo2Kt.mjs} +10 -2
- package/dist/gallery-kaxHo2Kt.mjs.map +1 -0
- package/dist/index.mjs +14 -11
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -5
- package/dist/gallery-zu8hc8Lc.mjs.map +0 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/native-loader.ts","../src/component-source.ts","../src/utils.ts","../src/art-module.ts","../src/preview/addons.ts","../src/preview/html.ts","../src/preview/index.ts","../src/server-middleware.ts","../src/tokens/native.ts","../src/tokens/parser.ts","../src/tokens/usage.ts","../src/tokens/resolver.ts","../src/tokens/generator.ts","../src/api-tokens.ts","../src/api-routes/handler-palette.ts","../src/api-routes/handlers.ts","../src/api-routes/post-handlers.ts","../src/api-routes/index.ts","../src/manifest.ts","../src/plugin/virtual.ts","../src/plugin/index.ts","../src/index.ts"],"sourcesContent":["/**\n * Native binding loader for @vizejs/native.\n *\n * Provides lazy-loading of the native Rust-based parser and a JS fallback\n * for SFC analysis when the native `analyzeSfc` function is unavailable.\n */\n\nimport { createRequire } from \"node:module\";\n\n// Native binding types\nexport interface NativeBinding {\n parseArt: (\n source: string,\n options?: { filename?: string },\n ) => {\n filename: string;\n metadata: {\n title: string;\n description?: string;\n component?: string;\n category?: string;\n tags: string[];\n status: string;\n order?: number;\n actionEvents?: string[];\n };\n variants: Array<{\n name: string;\n template: string;\n isDefault: boolean;\n skipVrt: boolean;\n }>;\n hasScriptSetup: boolean;\n hasScript: boolean;\n styleCount: number;\n };\n artToCsf: (\n source: string,\n options?: { filename?: string },\n ) => {\n code: string;\n filename: string;\n };\n generateArtPalette?: (\n source: string,\n artOptions?: { filename?: string },\n paletteOptions?: { infer_options?: boolean; group_by_type?: boolean },\n ) => {\n title: string;\n controls: Array<{\n name: string;\n control: string;\n default_value?: unknown;\n description?: string;\n required: boolean;\n options: Array<{ label: string; value: unknown }>;\n range?: { min: number; max: number; step?: number };\n group?: string;\n }>;\n groups: string[];\n json: string;\n typescript: string;\n };\n generateArtDoc?: (\n source: string,\n artOptions?: { filename?: string },\n docOptions?: {\n include_source?: boolean;\n include_templates?: boolean;\n include_metadata?: boolean;\n },\n ) => {\n markdown: string;\n filename: string;\n title: string;\n category?: string;\n variant_count: number;\n };\n parseDesignTokensFromPath?: (path: string) => unknown;\n buildDesignTokenMap?: (categories: unknown) => Record<string, unknown>;\n resolveDesignTokenReferences?: (categories: unknown) => unknown;\n flattenDesignTokenCategories?: (categories: unknown) => unknown[];\n generateDesignTokensMarkdown?: (categories: unknown, generatedAt?: string) => string;\n validateDesignTokenReference?: (\n tokenMap: Record<string, unknown>,\n reference: string,\n selfPath?: string,\n ) => { valid: boolean; error?: string };\n findDependentDesignTokens?: (tokenMap: Record<string, unknown>, targetPath: string) => string[];\n analyzeSfc?: (\n source: string,\n options?: { filename?: string },\n ) => {\n props: Array<{\n name: string;\n type: string;\n required: boolean;\n default_value?: unknown;\n }>;\n emits: string[];\n };\n}\n\n// Lazy-load native binding\nlet native: NativeBinding | null = null;\n\nexport function loadNative(): NativeBinding {\n if (native) return native;\n\n const require = createRequire(import.meta.url);\n try {\n native = require(\"@vizejs/native\") as NativeBinding;\n return native;\n } catch (e) {\n throw new Error(\n `Failed to load @vizejs/native. Make sure it's installed and built:\\n${String(e)}`,\n );\n }\n}\n\n/**\n * JS-based fallback for SFC analysis when native `analyzeSfc` is not available.\n * Uses regex parsing to extract props and emits from Vue SFC source.\n */\nexport function analyzeSfcFallback(\n source: string,\n _options?: { filename?: string },\n): {\n props: Array<{\n name: string;\n type: string;\n required: boolean;\n default_value?: unknown;\n }>;\n emits: string[];\n} {\n try {\n const props: Array<{\n name: string;\n type: string;\n required: boolean;\n default_value?: unknown;\n }> = [];\n const emits: string[] = [];\n\n // Extract the <script setup> block\n const scriptSetupMatch = source.match(/<script\\s+[^>]*setup[^>]*>([\\s\\S]*?)<\\/script>/);\n if (!scriptSetupMatch) {\n // Try regular <script> block\n const scriptMatch = source.match(/<script[^>]*>([\\s\\S]*?)<\\/script>/);\n if (!scriptMatch) return { props: [], emits: [] };\n }\n const scriptContent = scriptSetupMatch?.[1] || \"\";\n\n // Extract defineProps type parameter\n // Handles: defineProps<{ ... }>() and defineProps<{ ... }>\n const propsMatch = scriptContent.match(/defineProps\\s*<\\s*\\{([\\s\\S]*?)\\}>\\s*\\(/);\n const propsMatch2 = scriptContent.match(/defineProps\\s*<\\s*\\{([\\s\\S]*?)\\}>/);\n const propsBody = propsMatch?.[1] || propsMatch2?.[1];\n\n if (propsBody) {\n // Parse each prop line: name?: Type; or name: Type;\n // Handle multiline JSDoc comments before props\n const lines = propsBody.split(\"\\n\");\n let i = 0;\n while (i < lines.length) {\n const line = lines[i].trim();\n // Skip JSDoc comments\n if (line.startsWith(\"/**\") || line.startsWith(\"*\") || line.startsWith(\"*/\")) {\n i++;\n continue;\n }\n\n // Match prop definition: name?: Type or name: Type\n const propMatch = line.match(/^(\\w+)(\\?)?:\\s*(.+?)(?:;?\\s*)$/);\n if (propMatch) {\n const name = propMatch[1];\n const optional = !!propMatch[2];\n let type = propMatch[3].replace(/;$/, \"\").trim();\n\n // Check for default value in destructured defineProps\n const defaultPattern = new RegExp(`\\\\b${name}\\\\s*=\\\\s*([^,}\\\\n]+)`);\n const defaultMatch = scriptContent.match(defaultPattern);\n const defaultValue = defaultMatch ? defaultMatch[1].trim() : undefined;\n\n props.push({\n name,\n type,\n required: !optional && defaultValue === undefined,\n ...(defaultValue !== undefined ? { default_value: defaultValue } : {}),\n });\n }\n i++;\n }\n }\n\n // Extract defineEmits\n const emitsMatch = scriptContent.match(/defineEmits\\s*<\\s*\\{([\\s\\S]*?)\\}>/);\n if (emitsMatch) {\n const emitsBody = emitsMatch[1];\n const emitRegex = /(\\w+)\\s*:/g;\n let match;\n while ((match = emitRegex.exec(emitsBody)) !== null) {\n emits.push(match[1]);\n }\n }\n\n return { props, emits };\n } catch {\n return { props: [], emits: [] };\n }\n}\n","import path from \"node:path\";\n\nimport { resolveInsideAny } from \"./security.js\";\nimport type { ArtFileInfo } from \"./types/index.js\";\n\nexport function allowedSourceRoots(root: string, scanRoots: string[] = []): string[] {\n return [...new Set([root, ...scanRoots].map((sourceRoot) => path.resolve(sourceRoot)))];\n}\n\nexport function resolveComponentSourcePath(\n art: ArtFileInfo,\n artPath: string,\n sourceRoots: string[],\n): string | null {\n const componentPath =\n art.isInline && art.componentPath\n ? art.componentPath\n : art.metadata.component\n ? path.isAbsolute(art.metadata.component)\n ? art.metadata.component\n : path.resolve(path.dirname(artPath), art.metadata.component)\n : null;\n\n return componentPath ? resolveInsideAny(sourceRoots, componentPath, \"component path\") : null;\n}\n","/**\n * Shared utility functions for the Musea Vite plugin.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nimport type { ArtFileInfo } from \"./types/index.js\";\nimport { loadNative } from \"./native-loader.js\";\n\nfunction normalizeGlobPath(filepath: string): string {\n return filepath.split(path.sep).join(\"/\");\n}\n\nfunction matchesPattern(file: string, pattern: string, root: string): boolean {\n const normalizedPattern = normalizeGlobPath(pattern);\n const candidate = path.isAbsolute(pattern) ? path.resolve(file) : path.relative(root, file);\n return matchGlob(candidate, normalizedPattern);\n}\n\nexport function shouldProcess(\n file: string,\n include: string[],\n exclude: string[],\n root: string,\n): boolean {\n // Check exclude patterns\n for (const pattern of exclude) {\n if (matchesPattern(file, pattern, root)) {\n return false;\n }\n }\n\n // Check include patterns\n for (const pattern of include) {\n if (matchesPattern(file, pattern, root)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function matchGlob(filepath: string, pattern: string): boolean {\n const normalizedFilepath = normalizeGlobPath(filepath);\n const normalizedPattern = normalizeGlobPath(pattern);\n\n // Simple glob matching (supports * and **)\n // Use placeholder for ** to avoid * replacement interfering\n const PLACEHOLDER = \"<<GLOBSTAR>>\";\n const SEGMENT_PLACEHOLDER = \"<<GLOBSTAR_SEGMENT>>\";\n const regex = normalizedPattern\n .replaceAll(\"**/\", SEGMENT_PLACEHOLDER)\n .replaceAll(\"**\", PLACEHOLDER)\n .replace(/[|\\\\{}()[\\]^$+?.]/g, \"\\\\$&\")\n .replace(/\\*/g, \"[^/]*\")\n .replaceAll(SEGMENT_PLACEHOLDER, \"(?:.*/)?\")\n .replaceAll(PLACEHOLDER, \".*\");\n\n return new RegExp(`^${regex}$`).test(normalizedFilepath);\n}\n\nfunction resolveScanRoot(root: string, pattern: string): string {\n const absolutePattern = path.isAbsolute(pattern) ? pattern : path.resolve(root, pattern);\n const normalizedPattern = normalizeGlobPath(absolutePattern);\n const globIndex = normalizedPattern.search(/[*[{]/);\n\n if (globIndex === -1) {\n return path.dirname(absolutePattern);\n }\n\n const staticPrefix = normalizedPattern.slice(0, globIndex);\n if (!staticPrefix) {\n return root;\n }\n\n if (staticPrefix.endsWith(\"/\")) {\n return path.resolve(staticPrefix.slice(0, -1));\n }\n\n return path.resolve(path.dirname(staticPrefix));\n}\n\nexport function resolveScanRoots(root: string, include: string[]): string[] {\n const roots = new Set<string>();\n\n for (const pattern of include) {\n roots.add(resolveScanRoot(root, pattern));\n }\n\n if (roots.size === 0) {\n roots.add(root);\n }\n\n return [...roots];\n}\n\nexport async function scanArtFiles(\n root: string,\n include: string[],\n exclude: string[],\n scanInlineArt = false,\n): Promise<string[]> {\n const files = new Set<string>();\n const scanRoots = resolveScanRoots(root, include);\n const visitedDirs = new Set<string>();\n\n async function scan(dir: string): Promise<void> {\n const resolvedDir = path.resolve(dir);\n if (visitedDirs.has(resolvedDir)) {\n return;\n }\n visitedDirs.add(resolvedDir);\n\n let entries: fs.Dirent[];\n try {\n entries = await fs.promises.readdir(resolvedDir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const fullPath = path.join(resolvedDir, entry.name);\n\n // Check exclude\n let excluded = false;\n for (const pattern of exclude) {\n if (matchesPattern(fullPath, pattern, root) || matchGlob(entry.name, pattern)) {\n excluded = true;\n break;\n }\n }\n\n if (excluded) continue;\n\n if (entry.isDirectory()) {\n await scan(fullPath);\n } else if (entry.isFile() && entry.name.endsWith(\".art.vue\")) {\n if (shouldProcess(fullPath, include, exclude, root)) {\n files.add(fullPath);\n }\n } else if (\n scanInlineArt &&\n entry.isFile() &&\n entry.name.endsWith(\".vue\") &&\n !entry.name.endsWith(\".art.vue\")\n ) {\n // Inline art: check if .vue file contains <art block\n const content = await fs.promises.readFile(fullPath, \"utf-8\");\n if (content.includes(\"<art\")) {\n files.add(fullPath);\n }\n }\n }\n }\n\n for (const scanRoot of scanRoots) {\n await scan(scanRoot);\n }\n\n return [...files];\n}\n\nexport async function generateStorybookFiles(\n artFiles: Map<string, ArtFileInfo>,\n root: string,\n outDir: string,\n): Promise<void> {\n const binding = loadNative();\n const outputDir = path.resolve(root, outDir);\n\n // Ensure output directory exists\n await fs.promises.mkdir(outputDir, { recursive: true });\n\n for (const [filePath, _art] of artFiles) {\n try {\n const source = await fs.promises.readFile(filePath, \"utf-8\");\n const csf = binding.artToCsf(source, { filename: filePath });\n\n const outputPath = path.join(outputDir, csf.filename);\n await fs.promises.writeFile(outputPath, csf.code, \"utf-8\");\n\n console.log(`[musea] Generated: ${path.relative(root, outputPath)}`);\n } catch (e) {\n console.error(`[musea] Failed to generate CSF for ${filePath}:`, e);\n }\n }\n}\n\nexport function toPascalCase(str: string): string {\n const normalized = str\n .normalize(\"NFKD\")\n .replace(/[^\\p{L}\\p{N}]+/gu, \" \")\n .trim();\n const pascal = normalized\n .split(/\\s+/)\n .filter(Boolean)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\"\");\n\n if (!pascal) {\n return \"Variant\";\n }\n\n return /^[\\p{L}_$]/u.test(pascal) ? pascal : `Variant${pascal}`;\n}\n\nexport function escapeTemplate(str: string): string {\n return str.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\").replace(/\\n/g, \"\\\\n\");\n}\n\nexport function escapeHtml(str: string): string {\n return str\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\n/**\n * Build the theme config object from plugin options for runtime injection.\n */\nexport function buildThemeConfig(\n theme?:\n | string\n | { name: string; base?: \"dark\" | \"light\"; colors: Record<string, string> }\n | Array<{ name: string; base?: \"dark\" | \"light\"; colors: Record<string, string> }>,\n):\n | {\n default: string;\n custom?: Record<string, { base?: \"dark\" | \"light\"; colors: Record<string, string> }>;\n }\n | undefined {\n if (!theme) return undefined;\n\n if (typeof theme === \"string\") {\n // 'dark' | 'light' | 'system'\n return { default: theme };\n }\n\n // Single custom theme or array of custom themes\n const themes = Array.isArray(theme) ? theme : [theme];\n const custom: Record<string, { base?: \"dark\" | \"light\"; colors: Record<string, string> }> = {};\n for (const t of themes) {\n custom[t.name] = {\n base: t.base,\n colors: t.colors as Record<string, string>,\n };\n }\n return {\n default: themes[0].name,\n custom,\n };\n}\n","/**\n * Art module generation for Musea.\n *\n * Generates the virtual ES modules that represent parsed `.art.vue` files,\n * including variant component definitions and script setup handling.\n */\n\nimport path from \"node:path\";\n\nimport { allowedSourceRoots, resolveComponentSourcePath } from \"./component-source.js\";\nimport type { ArtFileInfo } from \"./types/index.js\";\nimport { escapeHtml, toPascalCase } from \"./utils.js\";\n\n/**\n * Extract the content of the first <script setup> block from a Vue SFC source.\n */\nexport function extractScriptSetupContent(source: string): string | undefined {\n const match = source.match(/<script\\s+[^>]*setup[^>]*>([\\s\\S]*?)<\\/script>/);\n return match?.[1]?.trim();\n}\n\nfunction resolveRelativeSpecifier(specifier: string, artDir: string): string {\n if (!specifier.startsWith(\".\")) {\n return specifier;\n }\n\n return path.resolve(artDir, specifier);\n}\n\nfunction rewriteRelativeImportStatement(statement: string, artDir: string): string {\n const rewrittenFromImports = statement.replace(\n /\\bfrom\\s+(['\"])([^'\"]+)\\1/g,\n (_match, quote: string, specifier: string) =>\n `from ${quote}${resolveRelativeSpecifier(specifier, artDir)}${quote}`,\n );\n\n return rewrittenFromImports.replace(\n /^(\\s*import\\s+)(['\"])([^'\"]+)\\2(\\s*;?\\s*)$/s,\n (_match, prefix: string, quote: string, specifier: string, suffix: string) =>\n `${prefix}${quote}${resolveRelativeSpecifier(specifier, artDir)}${quote}${suffix}`,\n );\n}\n\nfunction escapeTemplateLiteral(str: string): string {\n return str.replace(/\\\\/g, \"\\\\\\\\\").replace(/`/g, \"\\\\`\").replace(/\\$/g, \"\\\\$\");\n}\n\nfunction countCharBalance(source: string, openChar: string, closeChar: string): number {\n let balance = 0;\n for (const char of source) {\n if (char === openChar) balance++;\n else if (char === closeChar) balance--;\n }\n return balance;\n}\n\nfunction isCompleteImportStatement(statement: string): boolean {\n const trimmed = statement.trim();\n if (!trimmed.startsWith(\"import \")) {\n return false;\n }\n\n if (countCharBalance(statement, \"{\", \"}\") > 0) {\n return false;\n }\n\n return (\n /^import\\s+[\\s\\S]+?\\s+from\\s+['\"][^'\"]+['\"]\\s*;?$/s.test(trimmed) ||\n /^import\\s+['\"][^'\"]+['\"]\\s*;?$/s.test(trimmed)\n );\n}\n\nfunction splitTopLevelCommaList(source: string): string[] {\n const parts: string[] = [];\n let current = \"\";\n let braceDepth = 0;\n let bracketDepth = 0;\n let parenDepth = 0;\n\n for (const char of source) {\n if (char === \",\" && braceDepth === 0 && bracketDepth === 0 && parenDepth === 0) {\n const trimmed = current.trim();\n if (trimmed) {\n parts.push(trimmed);\n }\n current = \"\";\n continue;\n }\n\n current += char;\n\n if (char === \"{\") braceDepth++;\n else if (char === \"}\") braceDepth--;\n else if (char === \"[\") bracketDepth++;\n else if (char === \"]\") bracketDepth--;\n else if (char === \"(\") parenDepth++;\n else if (char === \")\") parenDepth--;\n }\n\n const trimmed = current.trim();\n if (trimmed) {\n parts.push(trimmed);\n }\n\n return parts;\n}\n\nfunction collectImportedNames(statement: string, returnNames: Set<string>): void {\n const normalized = statement.replace(/\\s+/g, \" \").trim().replace(/;$/, \"\");\n const fromMatch = normalized.match(/^import\\s+(type\\s+)?(.+?)\\s+from\\s+['\"][^'\"]+['\"]$/);\n\n if (!fromMatch) {\n return;\n }\n\n if (fromMatch[1]) {\n return;\n }\n\n const specifiers = fromMatch[2].trim();\n const specifierParts = splitTopLevelCommaList(specifiers);\n const defaultOrNamespace = specifierParts[0]?.trim() ?? \"\";\n const trailing = specifierParts.slice(1).join(\", \").trim();\n\n if (defaultOrNamespace && !defaultOrNamespace.startsWith(\"{\")) {\n const namespaceMatch = defaultOrNamespace.match(/^\\*\\s+as\\s+([A-Za-z_$][\\w$]*)$/);\n if (namespaceMatch) {\n returnNames.add(namespaceMatch[1]);\n } else if (!defaultOrNamespace.startsWith(\"type \")) {\n returnNames.add(defaultOrNamespace);\n }\n }\n\n const namedBlock = defaultOrNamespace.startsWith(\"{\")\n ? defaultOrNamespace\n : trailing.startsWith(\"{\")\n ? trailing\n : \"\";\n\n if (!namedBlock) {\n return;\n }\n\n const namedContent = namedBlock.slice(1, -1);\n for (const part of splitTopLevelCommaList(namedContent)) {\n const trimmed = part.trim();\n if (!trimmed || trimmed.startsWith(\"type \")) {\n continue;\n }\n\n const alias = trimmed\n .split(/\\s+as\\s+/)\n .pop()\n ?.trim();\n if (alias) {\n returnNames.add(alias);\n }\n }\n}\n\nfunction collectObjectDestructuredNames(statement: string, returnNames: Set<string>): void {\n const match = statement.match(/^(?:export\\s+)?(?:const|let|var)\\s+\\{([\\s\\S]*?)\\}\\s*=/);\n if (!match) {\n return;\n }\n\n for (const part of splitTopLevelCommaList(match[1])) {\n let name = part.trim();\n if (!name) {\n continue;\n }\n\n if (name.startsWith(\"...\")) {\n name = name.slice(3).trim();\n } else if (name.includes(\":\")) {\n name = name.split(\":\").pop()!.trim();\n } else if (name.includes(\"=\")) {\n name = name.split(\"=\")[0].trim();\n }\n\n if (name.includes(\"=\")) {\n name = name.split(\"=\")[0].trim();\n }\n\n if (/^[A-Za-z_$][\\w$]*$/.test(name)) {\n returnNames.add(name);\n }\n }\n}\n\nfunction collectArrayDestructuredNames(statement: string, returnNames: Set<string>): void {\n const match = statement.match(/^(?:export\\s+)?(?:const|let|var)\\s+\\[([\\s\\S]*?)\\]\\s*=/);\n if (!match) {\n return;\n }\n\n for (const part of splitTopLevelCommaList(match[1])) {\n let name = part.trim();\n if (!name) {\n continue;\n }\n\n if (name.startsWith(\"...\")) {\n name = name.slice(3).trim();\n }\n\n if (name.includes(\"=\")) {\n name = name.split(\"=\")[0].trim();\n }\n\n if (/^[A-Za-z_$][\\w$]*$/.test(name)) {\n returnNames.add(name);\n }\n }\n}\n\nfunction collectTopLevelReturnNames(setupBody: string[], returnNames: Set<string>): void {\n let braceDepth = 0;\n\n for (let i = 0; i < setupBody.length; i++) {\n const line = setupBody[i];\n const trimmed = line.trim();\n\n if (braceDepth === 0) {\n if (/^(?:export\\s+)?(?:const|let|var)\\s+\\{/.test(trimmed)) {\n const statementLines = [line];\n let balance =\n countCharBalance(line, \"{\", \"}\") +\n countCharBalance(line, \"[\", \"]\") +\n countCharBalance(line, \"(\", \")\");\n\n while (balance > 0 && i + 1 < setupBody.length) {\n i++;\n statementLines.push(setupBody[i]);\n balance +=\n countCharBalance(setupBody[i], \"{\", \"}\") +\n countCharBalance(setupBody[i], \"[\", \"]\") +\n countCharBalance(setupBody[i], \"(\", \")\");\n }\n\n collectObjectDestructuredNames(statementLines.join(\"\\n\"), returnNames);\n continue;\n }\n\n if (/^(?:export\\s+)?(?:const|let|var)\\s+\\[/.test(trimmed)) {\n const statementLines = [line];\n let balance =\n countCharBalance(line, \"{\", \"}\") +\n countCharBalance(line, \"[\", \"]\") +\n countCharBalance(line, \"(\", \")\");\n\n while (balance > 0 && i + 1 < setupBody.length) {\n i++;\n statementLines.push(setupBody[i]);\n balance +=\n countCharBalance(setupBody[i], \"{\", \"}\") +\n countCharBalance(setupBody[i], \"[\", \"]\") +\n countCharBalance(setupBody[i], \"(\", \")\");\n }\n\n collectArrayDestructuredNames(statementLines.join(\"\\n\"), returnNames);\n continue;\n }\n\n const constMatch = trimmed.match(/^(?:export\\s+)?(?:const|let|var)\\s+([A-Za-z_$][\\w$]*)/);\n if (constMatch) {\n returnNames.add(constMatch[1]);\n }\n\n const functionMatch = trimmed.match(\n /^(?:export\\s+)?(?:async\\s+)?function\\s+([A-Za-z_$][\\w$]*)\\s*\\(/,\n );\n if (functionMatch) {\n returnNames.add(functionMatch[1]);\n }\n\n const classMatch = trimmed.match(/^(?:export\\s+)?class\\s+([A-Za-z_$][\\w$]*)\\b/);\n if (classMatch) {\n returnNames.add(classMatch[1]);\n }\n }\n\n braceDepth += countCharBalance(line, \"{\", \"}\");\n }\n}\n\n/**\n * Parse script setup content into imports and setup body.\n * Returns the import lines, setup body lines, and all identifiers to expose.\n */\nexport function parseScriptSetupForArt(content: string): {\n imports: string[];\n setupBody: string[];\n returnNames: string[];\n} {\n const lines = content.split(\"\\n\");\n const imports: string[] = [];\n const setupBody: string[] = [];\n const returnNames: Set<string> = new Set();\n let currentImport: string[] | null = null;\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (currentImport) {\n currentImport.push(line);\n const statement = currentImport.join(\"\\n\");\n if (isCompleteImportStatement(statement)) {\n imports.push(statement);\n collectImportedNames(statement, returnNames);\n currentImport = null;\n }\n continue;\n }\n\n if (trimmed.startsWith(\"import \")) {\n currentImport = [line];\n const statement = currentImport.join(\"\\n\");\n if (isCompleteImportStatement(statement)) {\n imports.push(statement);\n collectImportedNames(statement, returnNames);\n currentImport = null;\n }\n continue;\n }\n\n setupBody.push(line);\n }\n\n if (currentImport) {\n const statement = currentImport.join(\"\\n\");\n imports.push(statement);\n collectImportedNames(statement, returnNames);\n }\n\n collectTopLevelReturnNames(setupBody, returnNames);\n\n // Remove 'type' keyword imports and common Vue utilities that shouldn't be returned\n returnNames.delete(\"type\");\n\n return {\n imports,\n setupBody,\n returnNames: [...returnNames],\n };\n}\n\ninterface GenerateArtModuleOptions {\n root?: string;\n scanRoots?: string[];\n}\n\nexport function generateArtModule(\n art: ArtFileInfo,\n filePath: string,\n options: GenerateArtModuleOptions = {},\n): string {\n let componentImportPath: string | undefined;\n let componentTagName: string | undefined;\n const componentBindingName = \"__MuseaComponent\";\n\n if (art.isInline && art.componentPath) {\n // Inline art: import the host .vue file itself as the component\n componentImportPath = options.root\n ? (resolveComponentSourcePath(\n art,\n filePath,\n allowedSourceRoots(options.root, options.scanRoots ?? []),\n ) ?? undefined)\n : art.componentPath;\n componentTagName = \"MuseaComponent\";\n } else if (art.metadata.component) {\n // Traditional .art.vue: resolve component from the component attribute\n componentImportPath = options.root\n ? (resolveComponentSourcePath(\n art,\n filePath,\n allowedSourceRoots(options.root, options.scanRoots ?? []),\n ) ?? undefined)\n : path.isAbsolute(art.metadata.component)\n ? art.metadata.component\n : path.resolve(path.dirname(filePath), art.metadata.component);\n componentTagName = \"MuseaComponent\";\n }\n\n // Parse script setup if present\n const scriptSetup = art.scriptSetupContent\n ? parseScriptSetupForArt(art.scriptSetupContent)\n : null;\n\n let code = `\n// Auto-generated module for: ${path.basename(filePath)}\nimport { defineComponent, h } from 'vue';\n`;\n\n // Add script setup imports at module level\n // Resolve relative paths to absolute since this code runs inside a virtual module\n if (scriptSetup) {\n const artDir = path.dirname(filePath);\n for (const imp of scriptSetup.imports) {\n const resolved = rewriteRelativeImportStatement(imp, artDir);\n code += `${resolved}\\n`;\n }\n }\n\n if (componentImportPath && componentTagName) {\n // Only add component import if not already imported by script setup\n const alreadyImported = scriptSetup?.imports.some((imp) =>\n new RegExp(`^import\\\\s+${componentBindingName}[\\\\s,]`).test(imp.trim()),\n );\n if (!alreadyImported) {\n code += `import ${componentBindingName} from ${JSON.stringify(componentImportPath)};\\n`;\n }\n code += `export const __component__ = ${componentBindingName};\\n`;\n }\n\n code += `\nexport const metadata = ${JSON.stringify(art.metadata)};\nexport const variants = ${JSON.stringify(art.variants)};\nexport const __styles__ = ${JSON.stringify(art.styleBlocks ?? [])};\n`;\n\n // Generate variant components\n for (const variant of art.variants) {\n const variantComponentName = toPascalCase(variant.name);\n\n let template = variant.template;\n\n // Replace <Self> with the actual component name (for inline art)\n if (componentTagName) {\n template = template\n .replace(/<Self/g, `<${componentTagName}`)\n .replace(/<\\/Self>/g, `</${componentTagName}>`);\n }\n\n // Escape the template for use in a JS string\n const escapedTemplate = escapeTemplateLiteral(template);\n const escapedVariantName = escapeTemplateLiteral(escapeHtml(variant.name));\n\n // Wrap template with the variant container (no .musea-variant class -- the\n // outer mount container already carries it; duplicating causes double padding)\n const fullTemplate = `<div data-variant=\"${escapedVariantName}\">${escapedTemplate}</div>`;\n\n // Collect component names for the `components` option.\n // Runtime-compiled templates use resolveComponent() which checks the\n // `components` option, NOT setup return values.\n const componentNames = new Map<string, string>();\n if (componentTagName) componentNames.set(componentTagName, componentBindingName);\n if (scriptSetup) {\n for (const name of scriptSetup.returnNames) {\n // PascalCase names starting with uppercase are likely components\n if (/^[A-Z]/.test(name)) componentNames.set(name, name);\n }\n }\n const components =\n componentNames.size > 0\n ? ` components: { ${[...componentNames]\n .map(([name, value]) => `${JSON.stringify(name)}: ${value}`)\n .join(\", \")} },\\n`\n : \"\";\n\n const hasSetupBody = scriptSetup?.setupBody.some((line) => line.trim().length > 0) ?? false;\n\n if (scriptSetup && (hasSetupBody || scriptSetup.returnNames.length > 0)) {\n // Generate variant with setup function from art file's <script setup>\n code += `\nexport const ${variantComponentName} = defineComponent({\n name: '${variantComponentName}',\n${components} setup() {\n${scriptSetup.setupBody.map((l) => ` ${l}`).join(\"\\n\")}\n return { ${scriptSetup.returnNames.join(\", \")} };\n },\n template: \\`${fullTemplate}\\`,\n});\n`;\n } else if (componentTagName) {\n code += `\nexport const ${variantComponentName} = {\n name: '${variantComponentName}',\n${components} template: \\`${fullTemplate}\\`,\n};\n`;\n } else {\n code += `\nexport const ${variantComponentName} = {\n name: '${variantComponentName}',\n template: \\`${fullTemplate}\\`,\n};\n`;\n }\n }\n\n // Default export\n const defaultVariant = art.variants.find((v) => v.isDefault) || art.variants[0];\n if (defaultVariant) {\n code += `\nexport default ${toPascalCase(defaultVariant.name)};\n`;\n }\n\n return code;\n}\n","/**\n * Addon initialization code for Musea preview iframes.\n *\n * Contains DOM event capture, measure overlay, and message handler logic\n * injected into preview modules.\n *\n * Extracted from preview.ts to keep file sizes manageable.\n */\n\n/**\n * Addon initialization code injected into preview iframe modules.\n * Shared between generatePreviewModule and generatePreviewModuleWithProps.\n */\nexport const MUSEA_ADDONS_INIT_CODE = `\nfunction __museaInitAddons(container, variantName, extraCaptureEvents = []) {\n // === DOM event capture ===\n // Note: wheel and hover-style events are excluded by default because they are too noisy.\n const BASE_CAPTURE_EVENTS = ['click','dblclick','input','change','submit','focus','blur','keydown','keyup','mousedown','mouseup','contextmenu','pointerdown','pointerup'];\n const CAPTURE_EVENTS = [...new Set([\n ...BASE_CAPTURE_EVENTS,\n ...((Array.isArray(extraCaptureEvents) ? extraCaptureEvents : [])\n .filter((eventName) => typeof eventName === 'string')\n .map((eventName) => eventName.trim())\n .filter(Boolean))\n ])];\n for (const evt of CAPTURE_EVENTS) {\n container.addEventListener(evt, (e) => {\n // Extract raw event properties\n const rawEvent = {\n type: e.type,\n bubbles: e.bubbles,\n cancelable: e.cancelable,\n composed: e.composed,\n defaultPrevented: e.defaultPrevented,\n eventPhase: e.eventPhase,\n isTrusted: e.isTrusted,\n timeStamp: e.timeStamp,\n };\n // Mouse/Pointer event properties\n if ('clientX' in e) {\n rawEvent.clientX = e.clientX;\n rawEvent.clientY = e.clientY;\n rawEvent.screenX = e.screenX;\n rawEvent.screenY = e.screenY;\n rawEvent.pageX = e.pageX;\n rawEvent.pageY = e.pageY;\n rawEvent.offsetX = e.offsetX;\n rawEvent.offsetY = e.offsetY;\n rawEvent.button = e.button;\n rawEvent.buttons = e.buttons;\n rawEvent.altKey = e.altKey;\n rawEvent.ctrlKey = e.ctrlKey;\n rawEvent.metaKey = e.metaKey;\n rawEvent.shiftKey = e.shiftKey;\n }\n // Keyboard event properties\n if ('key' in e) {\n rawEvent.key = e.key;\n rawEvent.code = e.code;\n rawEvent.repeat = e.repeat;\n rawEvent.altKey = e.altKey;\n rawEvent.ctrlKey = e.ctrlKey;\n rawEvent.metaKey = e.metaKey;\n rawEvent.shiftKey = e.shiftKey;\n }\n // Input event properties\n if ('inputType' in e) {\n rawEvent.inputType = e.inputType;\n rawEvent.data = e.data;\n }\n // Wheel event properties\n if ('deltaX' in e) {\n rawEvent.deltaX = e.deltaX;\n rawEvent.deltaY = e.deltaY;\n rawEvent.deltaZ = e.deltaZ;\n rawEvent.deltaMode = e.deltaMode;\n }\n const payload = {\n name: e.type,\n target: e.target?.tagName,\n timestamp: Date.now(),\n source: 'dom',\n rawEvent,\n variantName\n };\n if (e.target && 'value' in e.target) {\n payload.value = e.target.value;\n }\n window.parent.postMessage({ type: 'musea:event', payload }, '*');\n }, true);\n }\n\n // === Message handler for parent commands ===\n let measureActive = false;\n let measureOverlay = null;\n let measureLabel = null;\n\n function toggleStyleById(id, enabled, css) {\n let el = document.getElementById(id);\n if (enabled) {\n if (!el) {\n el = document.createElement('style');\n el.id = id;\n el.textContent = css;\n document.head.appendChild(el);\n }\n } else {\n if (el) el.remove();\n }\n }\n\n function createMeasureOverlay() {\n if (measureOverlay) return;\n measureOverlay = document.createElement('div');\n measureOverlay.id = 'musea-measure-overlay';\n measureOverlay.style.cssText = 'position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:99999;';\n document.body.appendChild(measureOverlay);\n\n measureLabel = document.createElement('div');\n measureLabel.className = 'musea-measure-label';\n measureLabel.style.cssText = 'position:fixed;background:#333;color:#fff;font-size:11px;padding:2px 6px;border-radius:3px;pointer-events:none;z-index:100000;display:none;';\n document.body.appendChild(measureLabel);\n }\n\n function removeMeasureOverlay() {\n if (measureOverlay) { measureOverlay.remove(); measureOverlay = null; }\n if (measureLabel) { measureLabel.remove(); measureLabel = null; }\n }\n\n function onMeasureMouseMove(e) {\n if (!measureActive || !measureOverlay) return;\n const el = document.elementFromPoint(e.clientX, e.clientY);\n if (!el || el === measureOverlay || el === measureLabel) return;\n\n const rect = el.getBoundingClientRect();\n const cs = getComputedStyle(el);\n const mt = parseFloat(cs.marginTop) || 0;\n const mr = parseFloat(cs.marginRight) || 0;\n const mb = parseFloat(cs.marginBottom) || 0;\n const ml = parseFloat(cs.marginLeft) || 0;\n const bt = parseFloat(cs.borderTopWidth) || 0;\n const br = parseFloat(cs.borderRightWidth) || 0;\n const bb = parseFloat(cs.borderBottomWidth) || 0;\n const blw = parseFloat(cs.borderLeftWidth) || 0;\n const pt = parseFloat(cs.paddingTop) || 0;\n const pr = parseFloat(cs.paddingRight) || 0;\n const pb = parseFloat(cs.paddingBottom) || 0;\n const pl = parseFloat(cs.paddingLeft) || 0;\n\n const cw = rect.width - blw - br - pl - pr;\n const ch = rect.height - bt - bb - pt - pb;\n\n measureOverlay.innerHTML = ''\n // Margin\n + '<div style=\"position:fixed;background:rgba(255,165,0,0.3);'\n + 'left:' + (rect.left - ml) + 'px;top:' + (rect.top - mt) + 'px;'\n + 'width:' + (rect.width + ml + mr) + 'px;height:' + mt + 'px;\"></div>'\n + '<div style=\"position:fixed;background:rgba(255,165,0,0.3);'\n + 'left:' + (rect.left - ml) + 'px;top:' + (rect.bottom) + 'px;'\n + 'width:' + (rect.width + ml + mr) + 'px;height:' + mb + 'px;\"></div>'\n + '<div style=\"position:fixed;background:rgba(255,165,0,0.3);'\n + 'left:' + (rect.left - ml) + 'px;top:' + rect.top + 'px;'\n + 'width:' + ml + 'px;height:' + rect.height + 'px;\"></div>'\n + '<div style=\"position:fixed;background:rgba(255,165,0,0.3);'\n + 'left:' + rect.right + 'px;top:' + rect.top + 'px;'\n + 'width:' + mr + 'px;height:' + rect.height + 'px;\"></div>'\n // Border\n + '<div style=\"position:fixed;background:rgba(255,255,0,0.3);'\n + 'left:' + rect.left + 'px;top:' + rect.top + 'px;'\n + 'width:' + rect.width + 'px;height:' + bt + 'px;\"></div>'\n + '<div style=\"position:fixed;background:rgba(255,255,0,0.3);'\n + 'left:' + rect.left + 'px;top:' + (rect.bottom - bb) + 'px;'\n + 'width:' + rect.width + 'px;height:' + bb + 'px;\"></div>'\n + '<div style=\"position:fixed;background:rgba(255,255,0,0.3);'\n + 'left:' + rect.left + 'px;top:' + (rect.top + bt) + 'px;'\n + 'width:' + blw + 'px;height:' + (rect.height - bt - bb) + 'px;\"></div>'\n + '<div style=\"position:fixed;background:rgba(255,255,0,0.3);'\n + 'left:' + (rect.right - br) + 'px;top:' + (rect.top + bt) + 'px;'\n + 'width:' + br + 'px;height:' + (rect.height - bt - bb) + 'px;\"></div>'\n // Padding\n + '<div style=\"position:fixed;background:rgba(144,238,144,0.3);'\n + 'left:' + (rect.left + blw) + 'px;top:' + (rect.top + bt) + 'px;'\n + 'width:' + (rect.width - blw - br) + 'px;height:' + pt + 'px;\"></div>'\n + '<div style=\"position:fixed;background:rgba(144,238,144,0.3);'\n + 'left:' + (rect.left + blw) + 'px;top:' + (rect.bottom - bb - pb) + 'px;'\n + 'width:' + (rect.width - blw - br) + 'px;height:' + pb + 'px;\"></div>'\n + '<div style=\"position:fixed;background:rgba(144,238,144,0.3);'\n + 'left:' + (rect.left + blw) + 'px;top:' + (rect.top + bt + pt) + 'px;'\n + 'width:' + pl + 'px;height:' + (rect.height - bt - bb - pt - pb) + 'px;\"></div>'\n + '<div style=\"position:fixed;background:rgba(144,238,144,0.3);'\n + 'left:' + (rect.right - br - pr) + 'px;top:' + (rect.top + bt + pt) + 'px;'\n + 'width:' + pr + 'px;height:' + (rect.height - bt - bb - pt - pb) + 'px;\"></div>'\n // Content\n + '<div style=\"position:fixed;background:rgba(100,149,237,0.3);'\n + 'left:' + (rect.left + blw + pl) + 'px;top:' + (rect.top + bt + pt) + 'px;'\n + 'width:' + cw + 'px;height:' + ch + 'px;\"></div>';\n\n // Label\n measureLabel.textContent = Math.round(rect.width) + ' x ' + Math.round(rect.height);\n measureLabel.style.display = 'block';\n measureLabel.style.left = (rect.right + 8) + 'px';\n measureLabel.style.top = rect.top + 'px';\n }\n\n window.addEventListener('message', (e) => {\n if (!e.data?.type?.startsWith('musea:')) return;\n const { type, payload } = e.data;\n switch (type) {\n case 'musea:set-background': {\n if (payload.pattern === 'checkerboard') {\n document.body.style.background = '';\n document.body.classList.add('musea-bg-checkerboard');\n } else {\n document.body.classList.remove('musea-bg-checkerboard');\n document.body.style.background = payload.color || '';\n }\n break;\n }\n case 'musea:toggle-outline': {\n toggleStyleById('musea-outline', payload.enabled,\n '* { outline: 1px solid rgba(255, 0, 0, 0.3) !important; }');\n break;\n }\n case 'musea:toggle-measure': {\n measureActive = payload.enabled;\n if (measureActive) {\n createMeasureOverlay();\n document.addEventListener('mousemove', onMeasureMouseMove);\n } else {\n document.removeEventListener('mousemove', onMeasureMouseMove);\n removeMeasureOverlay();\n }\n break;\n }\n case 'musea:set-props': {\n // Store props for remount - handled by preview module\n if (window.__museaSetProps) {\n window.__museaSetProps(payload.props || {});\n }\n break;\n }\n case 'musea:set-slots': {\n // Store slots for remount - handled by preview module\n if (window.__museaSetSlots) {\n window.__museaSetSlots(payload.slots || {});\n }\n break;\n }\n case 'musea:run-a11y': {\n // Run axe-core a11y test\n const requestId = typeof payload?.requestId === 'string' ? payload.requestId : undefined;\n (async () => {\n try {\n // Dynamically load axe-core from local vendor route if not already loaded\n if (!window.axe) {\n const script = document.createElement('script');\n const _basePath = location.pathname.replace(/\\\\/preview$/, '');\n script.src = _basePath + '/vendor/axe-core.min.js';\n await new Promise((resolve, reject) => {\n script.onload = resolve;\n script.onerror = reject;\n document.head.appendChild(script);\n });\n }\n // Run axe-core on the .musea-variant container only (not the full document)\n const context = document.querySelector('.musea-variant') || document;\n const results = await window.axe.run(context, {\n // Run all rules without restrictions for comprehensive testing\n resultTypes: ['violations', 'incomplete', 'passes']\n });\n window.parent.postMessage({\n type: 'musea:a11y-result',\n payload: {\n requestId,\n violations: results.violations.map(v => ({\n id: v.id,\n impact: v.impact,\n description: v.description,\n helpUrl: v.helpUrl,\n nodes: v.nodes.map(n => ({\n html: n.html,\n target: n.target,\n failureSummary: n.failureSummary\n }))\n })),\n passes: results.passes.length,\n incomplete: results.incomplete.length\n }\n }, '*');\n } catch (err) {\n window.parent.postMessage({\n type: 'musea:a11y-result',\n payload: {\n requestId,\n error: err instanceof Error ? err.message : String(err),\n violations: [],\n passes: 0,\n incomplete: 0\n }\n }, '*');\n }\n })();\n break;\n }\n }\n });\n\n // Notify parent that iframe is ready\n window.parent.postMessage({ type: 'musea:ready', payload: {} }, '*');\n}\n`;\n","/**\n * Preview HTML page generation for Musea component previews.\n *\n * Generates the HTML wrapper pages that host Vue component previews\n * inside iframes.\n *\n * Extracted from preview.ts to keep file sizes manageable.\n */\n\nimport type { ArtFileInfo, ArtVariant } from \"../types/index.js\";\nimport { escapeHtml } from \"../utils.js\";\n\nexport function generatePreviewHtml(\n art: ArtFileInfo,\n variant: ArtVariant,\n _basePath: string,\n viteBase?: string,\n): string {\n // Use preview-module HTTP endpoint instead of virtual module import.\n // Virtual module imports in inline scripts require transformIndexHtml,\n // which creates malformed html-proxy URLs when the page URL has query params.\n const previewModuleUrl = `${_basePath}/preview-module?art=${encodeURIComponent(art.path)}&variant=${encodeURIComponent(variant.name)}`;\n const base = (viteBase || \"/\").replace(/\\/$/, \"\");\n\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.0\">\n <title>${escapeHtml(art.metadata.title)} - ${escapeHtml(variant.name)}</title>\n <script type=\"module\" src=\"${base}/@vite/client\"></script>\n <style>\n * { box-sizing: border-box; margin: 0; padding: 0; }\n :root {\n --musea-preview-padding: clamp(1rem, 2vw, 1.5rem);\n }\n html, body {\n width: 100%;\n height: 100%;\n }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: #ffffff;\n padding: var(--musea-preview-padding);\n overflow: auto;\n }\n .musea-variant {\n width: 100%;\n min-height: calc(100vh - (var(--musea-preview-padding) * 2));\n }\n .musea-error {\n color: #dc2626;\n background: #fef2f2;\n border: 1px solid #fecaca;\n border-radius: 8px;\n padding: 1rem;\n font-size: 0.875rem;\n max-width: 400px;\n }\n .musea-error-title {\n font-weight: 600;\n margin-bottom: 0.5rem;\n }\n .musea-error pre {\n font-family: monospace;\n font-size: 0.75rem;\n white-space: pre-wrap;\n word-break: break-all;\n margin-top: 0.5rem;\n padding: 0.5rem;\n background: #fff;\n border-radius: 4px;\n }\n .musea-loading {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n color: #6b7280;\n font-size: 0.875rem;\n }\n .musea-spinner {\n width: 20px;\n height: 20px;\n border: 2px solid #e5e7eb;\n border-top-color: #3b82f6;\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n }\n @keyframes spin { to { transform: rotate(360deg); } }\n\n /* Musea Addons: Checkerboard background for transparent mode */\n .musea-bg-checkerboard {\n background-image:\n linear-gradient(45deg, #ccc 25%, transparent 25%),\n linear-gradient(-45deg, #ccc 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, #ccc 75%),\n linear-gradient(-45deg, transparent 75%, #ccc 75%) !important;\n background-size: 20px 20px !important;\n background-position: 0 0, 0 10px, 10px -10px, -10px 0 !important;\n }\n\n /* Musea Addons: Measure label */\n .musea-measure-label {\n position: fixed;\n background: #333;\n color: #fff;\n font-size: 11px;\n padding: 2px 6px;\n border-radius: 3px;\n pointer-events: none;\n z-index: 100000;\n }\n </style>\n</head>\n<body>\n <div id=\"app\" class=\"musea-variant\" data-art=\"${escapeHtml(art.path)}\" data-variant=\"${escapeHtml(variant.name)}\">\n <div class=\"musea-loading\">\n <div class=\"musea-spinner\"></div>\n Loading component...\n </div>\n </div>\n <script type=\"module\" src=\"${previewModuleUrl}\"></script>\n</body>\n</html>`;\n}\n","/**\n * Preview module and HTML generation for Musea component previews.\n *\n * Generates the JavaScript modules that mount Vue components in preview iframes,\n * as well as the HTML wrapper pages for those previews.\n */\n\nimport type { ArtFileInfo } from \"../types/index.js\";\nimport { MUSEA_ADDONS_INIT_CODE } from \"./addons.js\";\n\nexport { generatePreviewHtml } from \"./html.js\";\n\nexport function generatePreviewModule(\n art: ArtFileInfo,\n variantComponentName: string,\n variantName: string,\n cssImports: string[] = [],\n previewSetup: string | null = null,\n): string {\n const artModuleId = `virtual:musea-art:${art.path}`;\n const artModuleIdLiteral = JSON.stringify(artModuleId);\n const variantNameLiteral = JSON.stringify(variantName);\n const variantComponentNameLiteral = JSON.stringify(variantComponentName);\n const cssImportStatements = cssImports\n .map((cssPath) => `import ${JSON.stringify(cssPath)};`)\n .join(\"\\n\");\n const setupImport = previewSetup\n ? `import __museaPreviewSetup from ${JSON.stringify(previewSetup)};`\n : \"\";\n const setupCall = previewSetup ? \"await __museaPreviewSetup(app);\" : \"\";\n const actionEvents = JSON.stringify(art.metadata.actionEvents ?? []);\n const artStyleId = `musea-art-styles-${art.path.replace(/[^\\w-]+/g, \"_\")}`;\n const artStyleIdLiteral = JSON.stringify(artStyleId);\n\n return `\n${cssImportStatements}\n${setupImport}\nimport { createApp, reactive, h } from 'vue';\nimport * as artModule from ${artModuleIdLiteral};\n\nconst container = document.getElementById('app');\n\n${MUSEA_ADDONS_INIT_CODE}\n\nlet currentApp = null;\nconst propsOverride = reactive({});\nconst slotsOverride = reactive({ default: '' });\n\nfunction ensureArtStyles(styles) {\n const styleId = ${artStyleIdLiteral};\n const existing = document.getElementById(styleId);\n\n if (!Array.isArray(styles) || styles.length === 0) {\n existing?.remove();\n return;\n }\n\n const tag = existing ?? document.createElement('style');\n tag.id = styleId;\n tag.textContent = styles.join('\\\\n\\\\n');\n\n if (!existing) {\n document.head.appendChild(tag);\n }\n}\n\nfunction renderError(title, error) {\n container.textContent = '';\n const root = document.createElement('div');\n root.className = 'musea-error';\n\n const titleEl = document.createElement('div');\n titleEl.className = 'musea-error-title';\n titleEl.textContent = title;\n root.appendChild(titleEl);\n\n const messageEl = document.createElement('div');\n messageEl.textContent = error instanceof Error ? error.message : String(error);\n root.appendChild(messageEl);\n\n const stack = error instanceof Error ? error.stack : '';\n if (stack) {\n const stackEl = document.createElement('pre');\n stackEl.textContent = stack;\n root.appendChild(stackEl);\n }\n\n container.appendChild(root);\n}\n\nwindow.__museaSetProps = (props) => {\n // Clear old keys\n for (const key of Object.keys(propsOverride)) {\n delete propsOverride[key];\n }\n Object.assign(propsOverride, props);\n};\n\nwindow.__museaSetSlots = (slots) => {\n for (const key of Object.keys(slotsOverride)) {\n delete slotsOverride[key];\n }\n Object.assign(slotsOverride, slots);\n};\n\nasync function mount() {\n try {\n // Get the specific variant component\n const VariantComponent = artModule[${variantComponentNameLiteral}];\n const RawComponent = artModule.__component__;\n\n if (!VariantComponent) {\n throw new Error('Variant component ' + ${variantComponentNameLiteral} + ' not found in art module');\n }\n\n // Create and mount the app\n const app = createApp(VariantComponent);\n ensureArtStyles(artModule.__styles__);\n ${setupCall}\n container.innerHTML = '';\n container.className = 'musea-variant';\n app.mount(container);\n currentApp = app;\n\n console.log('[musea-preview] Mounted variant:', ${variantNameLiteral});\n __museaInitAddons(container, ${variantNameLiteral}, ${actionEvents});\n\n // Override set-props to remount with raw component + props\n const TargetComponent = RawComponent || VariantComponent;\n window.__museaSetProps = (props) => {\n for (const key of Object.keys(propsOverride)) {\n delete propsOverride[key];\n }\n Object.assign(propsOverride, props);\n remountWithProps(TargetComponent);\n };\n window.__museaSetSlots = (slots) => {\n for (const key of Object.keys(slotsOverride)) {\n delete slotsOverride[key];\n }\n Object.assign(slotsOverride, slots);\n remountWithProps(TargetComponent);\n };\n } catch (error) {\n console.error('[musea-preview] Failed to mount:', error);\n renderError('Failed to render component', error);\n }\n}\n\nasync function remountWithProps(Component) {\n if (currentApp) {\n currentApp.unmount();\n }\n const app = createApp({\n setup() {\n return () => {\n const slotFns = {};\n for (const [name, content] of Object.entries(slotsOverride)) {\n if (content) slotFns[name] = () => h('span', String(content));\n }\n return h(Component, { ...propsOverride }, slotFns);\n };\n }\n });\n ensureArtStyles(artModule.__styles__);\n ${setupCall}\n container.innerHTML = '';\n app.mount(container);\n currentApp = app;\n}\n\nmount();\n`;\n}\n\nexport function generatePreviewModuleWithProps(\n art: ArtFileInfo,\n variantComponentName: string,\n variantName: string,\n propsOverride: Record<string, unknown>,\n cssImports: string[] = [],\n previewSetup: string | null = null,\n): string {\n const artModuleId = `virtual:musea-art:${art.path}`;\n const artModuleIdLiteral = JSON.stringify(artModuleId);\n const variantNameLiteral = JSON.stringify(variantName);\n const variantComponentNameLiteral = JSON.stringify(variantComponentName);\n const propsJson = JSON.stringify(propsOverride);\n const cssImportStatements = cssImports\n .map((cssPath) => `import ${JSON.stringify(cssPath)};`)\n .join(\"\\n\");\n const setupImport = previewSetup\n ? `import __museaPreviewSetup from ${JSON.stringify(previewSetup)};`\n : \"\";\n const setupCall = previewSetup ? \"await __museaPreviewSetup(app);\" : \"\";\n const actionEvents = JSON.stringify(art.metadata.actionEvents ?? []);\n const artStyleId = `musea-art-styles-${art.path.replace(/[^\\w-]+/g, \"_\")}`;\n const artStyleIdLiteral = JSON.stringify(artStyleId);\n\n return `\n${cssImportStatements}\n${setupImport}\nimport { createApp, h } from 'vue';\nimport * as artModule from ${artModuleIdLiteral};\n\nconst container = document.getElementById('app');\nconst propsOverride = ${propsJson};\n\n${MUSEA_ADDONS_INIT_CODE}\n\nfunction ensureArtStyles(styles) {\n const styleId = ${artStyleIdLiteral};\n const existing = document.getElementById(styleId);\n\n if (!Array.isArray(styles) || styles.length === 0) {\n existing?.remove();\n return;\n }\n\n const tag = existing ?? document.createElement('style');\n tag.id = styleId;\n tag.textContent = styles.join('\\\\n\\\\n');\n\n if (!existing) {\n document.head.appendChild(tag);\n }\n}\n\nfunction renderError(title, error) {\n container.textContent = '';\n const root = document.createElement('div');\n root.className = 'musea-error';\n\n const titleEl = document.createElement('div');\n titleEl.className = 'musea-error-title';\n titleEl.textContent = title;\n root.appendChild(titleEl);\n\n const messageEl = document.createElement('div');\n messageEl.textContent = error instanceof Error ? error.message : String(error);\n root.appendChild(messageEl);\n\n container.appendChild(root);\n}\n\nasync function mount() {\n try {\n const VariantComponent = artModule[${variantComponentNameLiteral}];\n if (!VariantComponent) {\n throw new Error('Variant component ' + ${variantComponentNameLiteral} + ' not found');\n }\n\n const WrappedComponent = {\n render() {\n return h(VariantComponent, propsOverride);\n }\n };\n\n const app = createApp(WrappedComponent);\n ensureArtStyles(artModule.__styles__);\n ${setupCall}\n container.innerHTML = '';\n container.className = 'musea-variant';\n app.mount(container);\n console.log('[musea-preview] Mounted variant with props override:', ${variantNameLiteral});\n __museaInitAddons(container, ${variantNameLiteral}, ${actionEvents});\n } catch (error) {\n console.error('[musea-preview] Failed to mount:', error);\n renderError('Failed to render', error);\n }\n}\n\nmount();\n`;\n}\n","/**\n * Musea dev server middleware handlers.\n *\n * Extracted from the main plugin to keep file sizes manageable.\n * Provides middleware for the gallery SPA, static assets, preview rendering,\n * and art module serving.\n */\n\nimport type { ViteDevServer } from \"vite\";\nimport { createRequire } from \"node:module\";\nimport fs from \"node:fs\";\nimport type { ServerResponse } from \"node:http\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport type { ArtFileInfo } from \"./types/index.js\";\nimport { generatePreviewModule, generatePreviewHtml } from \"./preview/index.js\";\nimport { generateArtModule } from \"./art-module.js\";\nimport {\n decodeUrlComponent,\n HttpError,\n resolveUrlPathInside,\n serializeScriptValue,\n} from \"./security.js\";\nimport { toPascalCase } from \"./utils.js\";\n\nconst moduleDir = path.dirname(fileURLToPath(import.meta.url));\nconst galleryAssetMimeTypes: Record<string, string> = {\n \".js\": \"application/javascript\",\n \".css\": \"text/css\",\n \".svg\": \"image/svg+xml\",\n \".png\": \"image/png\",\n \".ico\": \"image/x-icon\",\n \".woff2\": \"font/woff2\",\n \".woff\": \"font/woff\",\n};\n\nfunction resolveGalleryDistDir(): string {\n return path.resolve(moduleDir, \"gallery\");\n}\n\nfunction resolveGallerySourceDir(): string {\n return path.resolve(moduleDir, \"../gallery\");\n}\n\nfunction toViteFsPath(filePath: string): string {\n return encodeURI(`/@fs${filePath.split(path.sep).join(\"/\")}`);\n}\n\nfunction generateDevGlobalsScript(\n basePath: string,\n devSessionToken: string,\n themeConfig?: { default: string; custom?: Record<string, unknown> },\n): string {\n const themeScript = themeConfig\n ? `window.__MUSEA_THEME_CONFIG__=${serializeScriptValue(themeConfig)};`\n : \"\";\n return `window.__MUSEA_BASE_PATH__=${serializeScriptValue(basePath)};window.__MUSEA_SESSION_TOKEN__=${serializeScriptValue(devSessionToken)};${themeScript}`;\n}\n\nasync function tryLoadSourceGalleryHtml(\n devServer: ViteDevServer,\n url: string,\n basePath: string,\n devSessionToken: string,\n themeConfig?: { default: string; custom?: Record<string, unknown> },\n): Promise<string | null> {\n const gallerySourceDir = resolveGallerySourceDir();\n const indexHtmlPath = path.join(gallerySourceDir, \"index.html\");\n\n try {\n await fs.promises.access(indexHtmlPath);\n } catch {\n return null;\n }\n\n const sourceEntryPath = toViteFsPath(path.join(gallerySourceDir, \"main.ts\"));\n\n let html = await fs.promises.readFile(indexHtmlPath, \"utf-8\");\n html = html.replace('src=\"./main.ts\"', `src=\"${sourceEntryPath}\"`);\n html = html.replace(\n \"</head>\",\n `<script>${generateDevGlobalsScript(basePath, devSessionToken, themeConfig)}</script></head>`,\n );\n\n return devServer.transformIndexHtml(url, html);\n}\n\nasync function generateFallbackGalleryHtml(\n basePath: string,\n devSessionToken: string,\n themeConfig?: { default: string; custom?: Record<string, unknown> },\n): Promise<string> {\n const { generateGalleryHtml } = await import(\"./gallery/index.js\");\n return generateGalleryHtml(basePath, devSessionToken, themeConfig);\n}\n\nexport async function serveGalleryAsset(\n galleryDistDir: string,\n requestUrl: string,\n res: ServerResponse,\n): Promise<boolean> {\n try {\n const filePath = resolveUrlPathInside(galleryDistDir, requestUrl, \"asset path\");\n const stat = await fs.promises.stat(filePath);\n if (!stat.isFile()) {\n return false;\n }\n\n const content = await fs.promises.readFile(filePath);\n const ext = path.extname(filePath);\n res.setHeader(\"Content-Type\", galleryAssetMimeTypes[ext] || \"application/octet-stream\");\n res.setHeader(\"Cache-Control\", \"public, max-age=31536000, immutable\");\n res.end(content);\n return true;\n } catch (error) {\n if (error instanceof HttpError) {\n res.statusCode = error.status;\n res.end(error.message);\n return true;\n }\n return false;\n }\n}\n\n/** Dependencies injected from the plugin closure. */\nexport interface MiddlewareContext {\n basePath: string;\n devSessionToken: string;\n themeConfig: { default: string; custom?: Record<string, unknown> } | undefined;\n artFiles: Map<string, ArtFileInfo>;\n scanRoots: string[];\n resolvedPreviewCss: string[];\n resolvedPreviewSetup: string | null;\n}\n\n/**\n * Register all Musea middleware on the given dev server.\n *\n * This sets up:\n * - Gallery SPA route (serves built SPA or inline HTML fallback)\n * - Gallery static assets (/assets/)\n * - axe-core vendor script\n * - Preview module route\n * - VRT preview route\n * - Art module route\n */\nexport function registerMiddleware(devServer: ViteDevServer, ctx: MiddlewareContext): void {\n const { basePath, devSessionToken, themeConfig, artFiles } = ctx;\n\n // --- Gallery SPA route ---\n devServer.middlewares.use(basePath, async (req, res, next) => {\n const url = req.url || \"/\";\n\n if (\n url === \"/\" ||\n url === \"/index.html\" ||\n url.startsWith(\"/tokens\") ||\n url.startsWith(\"/component/\") ||\n url.startsWith(\"/tests\")\n ) {\n const galleryDistDir = resolveGalleryDistDir();\n const indexHtmlPath = path.join(galleryDistDir, \"index.html\");\n\n try {\n await fs.promises.access(indexHtmlPath);\n let html = await fs.promises.readFile(indexHtmlPath, \"utf-8\");\n html = html.replace(\n \"</head>\",\n `<script>${generateDevGlobalsScript(basePath, devSessionToken, themeConfig)}</script></head>`,\n );\n res.setHeader(\"Content-Type\", \"text/html\");\n res.end(html);\n return;\n } catch {\n const sourceHtml = await tryLoadSourceGalleryHtml(\n devServer,\n url,\n basePath,\n devSessionToken,\n themeConfig,\n );\n if (sourceHtml) {\n res.setHeader(\"Content-Type\", \"text/html\");\n res.end(sourceHtml);\n return;\n }\n\n const html = await generateFallbackGalleryHtml(basePath, devSessionToken, themeConfig);\n res.setHeader(\"Content-Type\", \"text/html\");\n res.end(html);\n return;\n }\n }\n\n // Serve gallery static assets (JS, CSS) from built SPA\n if (url.startsWith(\"/assets/\")) {\n if (await serveGalleryAsset(resolveGalleryDistDir(), url, res)) {\n return;\n }\n }\n\n next();\n });\n\n // --- axe-core vendor script ---\n devServer.middlewares.use(`${basePath}/vendor/axe-core.min.js`, async (_req, res, _next) => {\n try {\n const require = createRequire(import.meta.url);\n const axeCorePath = require.resolve(\"axe-core/axe.min.js\");\n const content = await fs.promises.readFile(axeCorePath, \"utf-8\");\n res.setHeader(\"Content-Type\", \"application/javascript\");\n res.setHeader(\"Cache-Control\", \"public, max-age=86400\");\n res.end(content);\n } catch {\n res.statusCode = 404;\n res.end(\"axe-core not installed\");\n }\n });\n\n // --- Preview module route ---\n devServer.middlewares.use(`${basePath}/preview-module`, async (req, res, _next) => {\n const url = new URL(req.url || \"\", `http://localhost`);\n const artPath = url.searchParams.get(\"art\");\n const variantName = url.searchParams.get(\"variant\");\n\n if (!artPath || !variantName) {\n res.statusCode = 400;\n res.end(\"Missing art or variant parameter\");\n return;\n }\n\n const art = artFiles.get(artPath);\n if (!art) {\n res.statusCode = 404;\n res.end(\"Art not found\");\n return;\n }\n\n const variant = art.variants.find((v) => v.name === variantName);\n if (!variant) {\n res.statusCode = 404;\n res.end(\"Variant not found\");\n return;\n }\n\n const variantComponentName = toPascalCase(variant.name);\n const moduleCode = generatePreviewModule(\n art,\n variantComponentName,\n variant.name,\n ctx.resolvedPreviewCss,\n ctx.resolvedPreviewSetup,\n );\n\n try {\n const result = await devServer.transformRequest(\n `virtual:musea-preview:${artPath}:${variantName}`,\n );\n if (result) {\n res.setHeader(\"Content-Type\", \"application/javascript\");\n res.setHeader(\"Cache-Control\", \"no-cache\");\n res.end(result.code);\n return;\n }\n } catch {\n // Fall through to manual response\n }\n\n res.setHeader(\"Content-Type\", \"application/javascript\");\n res.setHeader(\"Cache-Control\", \"no-cache\");\n res.end(moduleCode);\n });\n\n // --- VRT preview route ---\n devServer.middlewares.use(`${basePath}/preview`, async (req, res, _next) => {\n const url = new URL(req.url || \"\", `http://localhost`);\n const artPath = url.searchParams.get(\"art\");\n const variantName = url.searchParams.get(\"variant\");\n\n if (!artPath || !variantName) {\n res.statusCode = 400;\n res.end(\"Missing art or variant parameter\");\n return;\n }\n\n const art = artFiles.get(artPath);\n if (!art) {\n res.statusCode = 404;\n res.end(\"Art not found\");\n return;\n }\n\n const variant = art.variants.find((v) => v.name === variantName);\n if (!variant) {\n res.statusCode = 404;\n res.end(\"Variant not found\");\n return;\n }\n\n const config = devServer.config;\n const html = generatePreviewHtml(art, variant, basePath, config.base);\n res.setHeader(\"Content-Type\", \"text/html\");\n res.end(html);\n });\n\n // --- Art module route ---\n devServer.middlewares.use(`${basePath}/art`, async (req, res, next) => {\n const url = new URL(req.url || \"\", \"http://localhost\");\n let artPath: string;\n try {\n artPath = decodeUrlComponent(url.pathname.slice(1), \"art path\");\n } catch (error) {\n if (error instanceof HttpError) {\n res.statusCode = error.status;\n res.end(error.message);\n return;\n }\n throw error;\n }\n\n if (!artPath) {\n next();\n return;\n }\n\n const art = artFiles.get(artPath);\n if (!art) {\n res.statusCode = 404;\n res.end(\"Art not found: \" + artPath);\n return;\n }\n\n try {\n const virtualId = `virtual:musea-art:${artPath}`;\n const result = await devServer.transformRequest(virtualId);\n if (result) {\n res.setHeader(\"Content-Type\", \"application/javascript\");\n res.setHeader(\"Cache-Control\", \"no-cache\");\n res.end(result.code);\n } else {\n const moduleCode = generateArtModule(art, artPath, {\n root: devServer.config.root,\n scanRoots: ctx.scanRoots,\n });\n res.setHeader(\"Content-Type\", \"application/javascript\");\n res.end(moduleCode);\n }\n } catch (err) {\n console.error(\"[musea] Failed to transform art module:\", err);\n const moduleCode = generateArtModule(art, artPath, {\n root: devServer.config.root,\n scanRoots: ctx.scanRoots,\n });\n res.setHeader(\"Content-Type\", \"application/javascript\");\n res.end(moduleCode);\n }\n });\n}\n","import { loadNative } from \"../native-loader.js\";\nimport type { DesignToken, TokenCategory } from \"./parser.js\";\n\ninterface ResolvedTokensNative {\n categories: TokenCategory[];\n tokenMap: Record<string, DesignToken>;\n tokenCount: number;\n primitiveCount: number;\n semanticCount: number;\n}\n\ninterface ValidationResultNative {\n valid: boolean;\n error?: string;\n}\n\ninterface TokenNativeBinding {\n parseDesignTokensFromPath(path: string): TokenCategory[];\n buildDesignTokenMap(categories: TokenCategory[]): Record<string, DesignToken>;\n resolveDesignTokenReferences(categories: TokenCategory[]): ResolvedTokensNative;\n flattenDesignTokenCategories(categories: TokenCategory[]): unknown[];\n generateDesignTokensMarkdown(categories: TokenCategory[], generatedAt?: string): string;\n validateDesignTokenReference(\n tokenMap: Record<string, DesignToken>,\n reference: string,\n selfPath?: string,\n ): ValidationResultNative;\n findDependentDesignTokens(tokenMap: Record<string, DesignToken>, targetPath: string): string[];\n}\n\nexport function tokenNative(): TokenNativeBinding {\n return loadNative() as typeof loadNative extends () => infer T ? T & TokenNativeBinding : never;\n}\n\nexport function normalizeCategories(categories: TokenCategory[]): TokenCategory[] {\n for (const category of categories) {\n category.tokens = nullRecord(category.tokens);\n if (category.subcategories) {\n normalizeCategories(category.subcategories);\n }\n }\n return categories;\n}\n\nexport function nullRecord<T>(record: Record<string, T>): Record<string, T> {\n return Object.assign(Object.create(null) as Record<string, T>, record);\n}\n","/**\n * Token parsing utilities for Style Dictionary integration.\n *\n * Thin native binding for design token files (JSON) and directories.\n */\n\nimport { normalizeCategories, tokenNative } from \"./native.js\";\n\n/**\n * Design token value.\n */\nexport interface DesignToken {\n value: string | number;\n type?: string;\n description?: string;\n attributes?: Record<string, unknown>;\n $tier?: \"primitive\" | \"semantic\";\n $reference?: string;\n $resolvedValue?: string | number;\n}\n\n/**\n * Token category (e.g., colors, spacing, typography).\n */\nexport interface TokenCategory {\n name: string;\n tokens: Record<string, DesignToken>;\n subcategories?: TokenCategory[];\n}\n\n/**\n * Style Dictionary output format.\n */\nexport interface StyleDictionaryOutput {\n categories: TokenCategory[];\n metadata: {\n name: string;\n version?: string;\n generatedAt: string;\n };\n}\n\n/**\n * Configuration for Style Dictionary integration.\n */\nexport interface StyleDictionaryConfig {\n /**\n * Path to tokens JSON/JS file or directory.\n */\n tokensPath: string;\n\n /**\n * Output format for documentation.\n * @default 'html'\n */\n outputFormat?: \"html\" | \"json\" | \"markdown\";\n\n /**\n * Output directory for generated documentation.\n * @default '.vize/tokens'\n */\n outputDir?: string;\n\n /**\n * Custom token transformations.\n */\n transforms?: TokenTransform[];\n}\n\n/**\n * Token transformation function.\n */\nexport type TokenTransform = (token: DesignToken, path: string[]) => DesignToken;\n\n/**\n * Parse Style Dictionary tokens file or directory.\n */\nexport async function parseTokens(tokensPath: string): Promise<TokenCategory[]> {\n return normalizeCategories(tokenNative().parseDesignTokensFromPath(tokensPath));\n}\n","/**\n * Token usage scanning and value normalization.\n *\n * Scans art file `<style>` blocks for CSS property values that match\n * design token values, and provides value normalization utilities.\n */\n\nimport fs from \"node:fs\";\n\nimport type { DesignToken } from \"./parser.js\";\nimport type { TokenUsageMap } from \"./resolver.js\";\n\n/**\n * Normalize a token value for comparison.\n * - Lowercase, trim\n * - Leading-zero: `.5rem` -> `0.5rem`\n * - Short hex: `#fff` -> `#ffffff`\n */\nexport function normalizeTokenValue(value: string | number): string {\n let v = String(value).trim().toLowerCase();\n\n // Expand short hex (#abc -> #aabbcc, #abcd -> #aabbccdd)\n const shortHex = v.match(/^#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/);\n if (shortHex) {\n const [, r, g, b, a] = shortHex;\n v = a ? `#${r}${r}${g}${g}${b}${b}${a}${a}` : `#${r}${r}${g}${g}${b}${b}`;\n }\n\n // Add leading zero: `.5rem` -> `0.5rem`\n v = v.replace(/(?<![0-9])\\.(\\d)/g, \"0.$1\");\n\n return v;\n}\n\nconst STYLE_BLOCK_RE = /<style[^>]*>([\\s\\S]*?)<\\/style>/g;\nconst CSS_PROPERTY_RE = /^\\s*([\\w-]+)\\s*:\\s*(.+?)\\s*;?\\s*$/;\n\n/**\n * Scan art file sources for token value matches in `<style>` blocks.\n */\nexport function scanTokenUsage(\n artFiles: Map<string, { path: string; metadata: { title: string; category?: string } }>,\n tokenMap: Record<string, DesignToken>,\n): TokenUsageMap {\n // Build reverse lookup: normalizedValue -> tokenPath[]\n const valueLookup = new Map<string, string[]>();\n for (const [tokenPath, token] of Object.entries(tokenMap)) {\n const rawValue = token.$resolvedValue ?? token.value;\n const normalized = normalizeTokenValue(rawValue);\n if (!normalized) continue;\n const existing = valueLookup.get(normalized);\n if (existing) {\n existing.push(tokenPath);\n } else {\n valueLookup.set(normalized, [tokenPath]);\n }\n }\n\n const usageMap: TokenUsageMap = {};\n\n for (const [artPath, artInfo] of artFiles) {\n let source: string;\n try {\n source = fs.readFileSync(artPath, \"utf-8\");\n } catch {\n continue;\n }\n\n const allLines = source.split(\"\\n\");\n\n // Find style block line offsets\n const styleRegions: Array<{ startLine: number; content: string }> = [];\n let match: RegExpExecArray | null;\n STYLE_BLOCK_RE.lastIndex = 0;\n while ((match = STYLE_BLOCK_RE.exec(source)) !== null) {\n const beforeMatch = source.slice(0, match.index);\n const startTag = source.slice(match.index, match.index + match[0].indexOf(match[1]));\n const startLine = beforeMatch.split(\"\\n\").length + startTag.split(\"\\n\").length - 1;\n styleRegions.push({ startLine, content: match[1] });\n }\n\n // Scan each style block line\n for (const region of styleRegions) {\n const lines = region.content.split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const propMatch = line.match(CSS_PROPERTY_RE);\n if (!propMatch) continue;\n\n const property = propMatch[1];\n const valueStr = propMatch[2];\n\n // Split on whitespace for multi-value properties (e.g., `border: 1px solid #3b82f6`)\n const valueParts = valueStr.split(/\\s+/);\n for (const part of valueParts) {\n const normalizedPart = normalizeTokenValue(part);\n const matchingTokens = valueLookup.get(normalizedPart);\n if (!matchingTokens) continue;\n\n const lineNumber = region.startLine + i;\n const lineContent = allLines[lineNumber - 1]?.trim() ?? line.trim();\n\n for (const tokenPath of matchingTokens) {\n if (!usageMap[tokenPath]) {\n usageMap[tokenPath] = [];\n }\n\n // Find or create entry for this art file\n let entry = usageMap[tokenPath].find((e) => e.artPath === artPath);\n if (!entry) {\n entry = {\n artPath,\n artTitle: artInfo.metadata.title,\n artCategory: artInfo.metadata.category,\n matches: [],\n };\n usageMap[tokenPath].push(entry);\n }\n\n // Avoid duplicate matches on same line+property\n if (!entry.matches.some((m) => m.line === lineNumber && m.property === property)) {\n entry.matches.push({ line: lineNumber, lineContent, property });\n }\n }\n }\n }\n }\n }\n\n return usageMap;\n}\n","/**\n * Token resolution, CRUD operations, and validation.\n *\n * Handles building flat token maps from categories, resolving reference chains,\n * reading/writing raw token files, and validating semantic references.\n */\n\nimport fs from \"node:fs\";\n\nimport type { DesignToken, TokenCategory } from \"./parser.js\";\nimport { normalizeCategories, nullRecord, tokenNative } from \"./native.js\";\n\n// Re-export usage scanning and normalization from usage\nexport { normalizeTokenValue, scanTokenUsage } from \"./usage.js\";\n\n/**\n * Token usage match within a single CSS property.\n */\nexport interface TokenUsageMatch {\n line: number;\n lineContent: string;\n property: string;\n}\n\n/**\n * Token usage entry for a single art file.\n */\nexport interface TokenUsageEntry {\n artPath: string;\n artTitle: string;\n artCategory?: string;\n matches: TokenUsageMatch[];\n}\n\n/**\n * Map of token paths to their usage locations across art files.\n */\nexport type TokenUsageMap = Record<string, TokenUsageEntry[]>;\n\nconst UNSAFE_TOKEN_PATH_SEGMENTS = new Set([\"__proto__\", \"prototype\", \"constructor\"]);\n\nfunction parseTokenPath(dotPath: string): string[] {\n const parts = dotPath.split(\".\");\n if (parts.length === 0 || parts.some((part) => part.trim() === \"\")) {\n throw new Error(`Invalid token path \"${dotPath}\"`);\n }\n\n const unsafeSegment = parts.find((part) => UNSAFE_TOKEN_PATH_SEGMENTS.has(part));\n if (unsafeSegment) {\n throw new Error(`Token path segment \"${unsafeSegment}\" is not allowed`);\n }\n\n return parts;\n}\n\n/**\n * Flatten nested categories into a flat map keyed by dot-path.\n */\nexport function buildTokenMap(categories: TokenCategory[]): Record<string, DesignToken> {\n return nullRecord(tokenNative().buildDesignTokenMap(categories));\n}\n\n/**\n * Resolve references in categories, setting $tier, $reference, and $resolvedValue.\n */\nexport function resolveReferences(\n categories: TokenCategory[],\n _tokenMap: Record<string, DesignToken>,\n): void {\n const resolved = tokenNative().resolveDesignTokenReferences(categories);\n categories.splice(0, categories.length, ...normalizeCategories(resolved.categories));\n}\n\n/**\n * Read raw JSON token file.\n */\nexport async function readRawTokenFile(tokensPath: string): Promise<Record<string, unknown>> {\n const content = await fs.promises.readFile(tokensPath, \"utf-8\");\n return JSON.parse(content) as Record<string, unknown>;\n}\n\n/**\n * Write raw JSON token file atomically (write tmp, rename).\n */\nexport async function writeRawTokenFile(\n tokensPath: string,\n data: Record<string, unknown>,\n): Promise<void> {\n const tmpPath = tokensPath + \".tmp\";\n await fs.promises.writeFile(tmpPath, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n await fs.promises.rename(tmpPath, tokensPath);\n}\n\n/**\n * Set a token at a dot-separated path in the raw JSON structure.\n */\nexport function setTokenAtPath(\n data: Record<string, unknown>,\n dotPath: string,\n token: Omit<DesignToken, \"$resolvedValue\">,\n): void {\n const parts = parseTokenPath(dotPath);\n let current: Record<string, unknown> = data;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i];\n if (typeof current[key] !== \"object\" || current[key] === null) {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n\n const leafKey = parts[parts.length - 1];\n const raw: Record<string, unknown> = { value: token.value };\n if (token.type) raw.type = token.type;\n if (token.description) raw.description = token.description;\n if (token.$tier) raw.$tier = token.$tier;\n if (token.$reference) raw.$reference = token.$reference;\n if (token.attributes) raw.attributes = token.attributes;\n current[leafKey] = raw;\n}\n\n/**\n * Delete a token at a dot-separated path, cleaning empty parents.\n */\nexport function deleteTokenAtPath(data: Record<string, unknown>, dotPath: string): boolean {\n const parts = parseTokenPath(dotPath);\n const parents: Array<{ obj: Record<string, unknown>; key: string }> = [];\n let current: Record<string, unknown> = data;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i];\n if (typeof current[key] !== \"object\" || current[key] === null) {\n return false;\n }\n parents.push({ obj: current, key });\n current = current[key] as Record<string, unknown>;\n }\n\n const leafKey = parts[parts.length - 1];\n if (!(leafKey in current)) return false;\n delete current[leafKey];\n\n // Clean empty parents\n for (let i = parents.length - 1; i >= 0; i--) {\n const { obj, key } = parents[i];\n const child = obj[key] as Record<string, unknown>;\n if (Object.keys(child).length === 0) {\n delete obj[key];\n } else {\n break;\n }\n }\n\n return true;\n}\n\n/**\n * Validate that a semantic reference points to an existing token and has no cycles.\n */\nexport function validateSemanticReference(\n tokenMap: Record<string, DesignToken>,\n reference: string,\n selfPath?: string,\n): { valid: boolean; error?: string } {\n return tokenNative().validateDesignTokenReference(tokenMap, reference, selfPath);\n}\n\n/**\n * Find all tokens that reference the given path.\n */\nexport function findDependentTokens(\n tokenMap: Record<string, DesignToken>,\n targetPath: string,\n): string[] {\n return tokenNative().findDependentDesignTokens(tokenMap, targetPath);\n}\n","/**\n * Token documentation generators for Style Dictionary integration.\n *\n * Generates HTML, Markdown, and JSON documentation from parsed token categories,\n * and provides the main processStyleDictionary orchestrator function.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nimport type { TokenCategory, StyleDictionaryConfig, StyleDictionaryOutput } from \"./parser.js\";\nimport { parseTokens } from \"./parser.js\";\nimport { tokenNative } from \"./native.js\";\nimport { escapeHtml } from \"../utils.js\";\n\nconst SAFE_CSS_COLOR_PATTERN = /^(?:#[0-9a-fA-F]{3,8}|(?:rgb|hsl)a?\\(\\s*[-+.\\d,%\\s]+\\))$/;\nconst DANGEROUS_PROTOCOL_PATTERN = /\\b(javascript|vbscript):/gi;\n\nfunction escapeTokenText(value: string): string {\n return escapeHtml(value).replace(DANGEROUS_PROTOCOL_PATTERN, \"$1:\");\n}\n\nfunction safeCssColor(value: string | number, type?: string): string | null {\n if (typeof value !== \"string\") return null;\n\n const trimmed = value.trim();\n const looksLikeColor =\n type === \"color\" ||\n trimmed.startsWith(\"#\") ||\n trimmed.startsWith(\"rgb\") ||\n trimmed.startsWith(\"hsl\");\n\n return looksLikeColor && SAFE_CSS_COLOR_PATTERN.test(trimmed) ? trimmed : null;\n}\n\n/**\n * Generate HTML documentation for tokens.\n */\nexport function generateTokensHtml(categories: TokenCategory[]): string {\n const renderToken = (\n name: string,\n token: { value: string | number; type?: string; description?: string },\n ): string => {\n const color = safeCssColor(token.value, token.type);\n\n return `\n <div class=\"token\">\n <div class=\"token-preview\">\n ${color ? `<div class=\"color-swatch\" style=\"background: ${color}\"></div>` : \"\"}\n </div>\n <div class=\"token-info\">\n <div class=\"token-name\">${escapeTokenText(name)}</div>\n <div class=\"token-value\">${escapeTokenText(String(token.value))}</div>\n ${token.description ? `<div class=\"token-description\">${escapeTokenText(token.description)}</div>` : \"\"}\n </div>\n </div>\n `;\n };\n\n const renderCategory = (category: TokenCategory, level: number = 2): string => {\n const heading = `h${Math.min(level, 6)}`;\n let html = `<${heading}>${escapeTokenText(category.name)}</${heading}>`;\n html += '<div class=\"tokens-grid\">';\n\n for (const [name, token] of Object.entries(category.tokens)) {\n html += renderToken(name, token);\n }\n\n html += \"</div>\";\n\n if (category.subcategories) {\n for (const sub of category.subcategories) {\n html += renderCategory(sub, level + 1);\n }\n }\n\n return html;\n };\n\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.0\">\n <title>Design Tokens - Musea</title>\n <style>\n :root {\n --musea-bg: #0d0d0d;\n --musea-bg-secondary: #1a1815;\n --musea-text: #e6e9f0;\n --musea-text-muted: #7b8494;\n --musea-accent: #a34828;\n --musea-border: #3a3530;\n }\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body {\n font-family: 'Inter', -apple-system, sans-serif;\n background: var(--musea-bg);\n color: var(--musea-text);\n line-height: 1.6;\n padding: 2rem;\n }\n h1 { margin-bottom: 2rem; color: var(--musea-accent); }\n h2 { margin: 2rem 0 1rem; padding-bottom: 0.5rem; border-bottom: 1px solid var(--musea-border); }\n h3, h4, h5, h6 { margin: 1.5rem 0 0.75rem; }\n .tokens-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 1rem;\n margin-bottom: 1.5rem;\n }\n .token {\n background: var(--musea-bg-secondary);\n border: 1px solid var(--musea-border);\n border-radius: 8px;\n padding: 1rem;\n display: flex;\n gap: 1rem;\n align-items: center;\n }\n .token-preview {\n flex-shrink: 0;\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .color-swatch {\n width: 48px;\n height: 48px;\n border-radius: 8px;\n border: 1px solid var(--musea-border);\n }\n .token-info {\n flex: 1;\n min-width: 0;\n }\n .token-name {\n font-weight: 600;\n font-family: 'JetBrains Mono', monospace;\n font-size: 0.875rem;\n }\n .token-value {\n color: var(--musea-text-muted);\n font-family: 'JetBrains Mono', monospace;\n font-size: 0.75rem;\n word-break: break-all;\n }\n .token-description {\n color: var(--musea-text-muted);\n font-size: 0.75rem;\n margin-top: 0.25rem;\n }\n </style>\n</head>\n<body>\n <h1>Design Tokens</h1>\n ${categories.map((cat) => renderCategory(cat)).join(\"\")}\n</body>\n</html>`;\n}\n\n/**\n * Generate Markdown documentation for tokens.\n */\nexport function generateTokensMarkdown(categories: TokenCategory[]): string {\n return tokenNative().generateDesignTokensMarkdown(categories, new Date().toISOString());\n}\n\n/**\n * Style Dictionary plugin for Musea.\n * Parses tokens and generates documentation in the specified format.\n */\nexport async function processStyleDictionary(\n config: StyleDictionaryConfig,\n): Promise<StyleDictionaryOutput> {\n const categories = await parseTokens(config.tokensPath);\n const outputDir = config.outputDir ?? \".vize/tokens\";\n const outputFormat = config.outputFormat ?? \"html\";\n\n // Ensure output directory exists\n await fs.promises.mkdir(outputDir, { recursive: true });\n\n // Generate documentation\n let content: string;\n let filename: string;\n\n switch (outputFormat) {\n case \"html\":\n content = generateTokensHtml(categories);\n filename = \"tokens.html\";\n break;\n case \"markdown\":\n content = generateTokensMarkdown(categories);\n filename = \"tokens.md\";\n break;\n case \"json\":\n default:\n content = JSON.stringify({ categories }, null, 2);\n filename = \"tokens.json\";\n }\n\n const outputPath = path.join(outputDir, filename);\n await fs.promises.writeFile(outputPath, content, \"utf-8\");\n\n console.log(`[musea] Generated token documentation: ${outputPath}`);\n\n return {\n categories,\n metadata: {\n name: path.basename(config.tokensPath),\n generatedAt: new Date().toISOString(),\n },\n };\n}\n","/**\n * Musea gallery API token route handlers.\n *\n * Handles GET/POST/PUT/DELETE for /api/tokens endpoints:\n * - GET /tokens -- list all resolved design tokens\n * - GET /tokens/usage -- token usage across art files\n * - POST /tokens -- create a new token\n * - PUT /tokens -- update an existing token\n * - DELETE /tokens -- delete a token\n */\n\nimport type { ApiRoutesContext, SendJson, SendError, ReadBody } from \"./api-routes/index.js\";\nimport { HttpError, resolveInside } from \"./security.js\";\nimport {\n parseTokens,\n buildTokenMap,\n resolveReferences,\n readRawTokenFile,\n writeRawTokenFile,\n setTokenAtPath,\n deleteTokenAtPath,\n validateSemanticReference,\n findDependentTokens,\n scanTokenUsage,\n type DesignToken,\n type TokenUsageMap,\n} from \"./style-dictionary.js\";\n\nfunction resolveTokensPath(ctx: ApiRoutesContext): string {\n return resolveInside(ctx.config.root, ctx.tokensPath!, \"tokensPath\");\n}\n\nfunction sendTokenMutationError(e: unknown, sendError: SendError): void {\n if (e instanceof HttpError) {\n sendError(e.message, e.status);\n return;\n }\n\n if (e instanceof Error && /token path/i.test(e.message)) {\n sendError(e.message, 400);\n return;\n }\n\n sendError(e instanceof Error ? e.message : String(e));\n}\n\n/** GET /api/tokens/usage */\nexport async function handleTokensUsage(ctx: ApiRoutesContext, sendJson: SendJson): Promise<void> {\n if (!ctx.tokensPath) {\n sendJson({});\n return;\n }\n\n try {\n const absoluteTokensPath = resolveTokensPath(ctx);\n const categories = await parseTokens(absoluteTokensPath);\n const tokenMap = buildTokenMap(categories);\n resolveReferences(categories, tokenMap);\n const resolvedTokenMap = buildTokenMap(categories);\n const usage: TokenUsageMap = scanTokenUsage(ctx.artFiles, resolvedTokenMap);\n sendJson(usage);\n } catch (e) {\n console.error(\"[musea] Failed to scan token usage:\", e);\n sendJson({});\n }\n}\n\n/** GET /api/tokens */\nexport async function handleTokensGet(ctx: ApiRoutesContext, sendJson: SendJson): Promise<void> {\n if (!ctx.tokensPath) {\n sendJson({\n categories: [],\n tokenMap: {},\n meta: {\n filePath: \"\",\n tokenCount: 0,\n primitiveCount: 0,\n semanticCount: 0,\n },\n });\n return;\n }\n\n try {\n const absoluteTokensPath = resolveTokensPath(ctx);\n const categories = await parseTokens(absoluteTokensPath);\n const tokenMap = buildTokenMap(categories);\n resolveReferences(categories, tokenMap);\n const resolvedTokenMap = buildTokenMap(categories);\n let primitiveCount = 0;\n let semanticCount = 0;\n for (const token of Object.values(resolvedTokenMap)) {\n if (token.$tier === \"semantic\") semanticCount++;\n else primitiveCount++;\n }\n sendJson({\n categories,\n tokenMap: resolvedTokenMap,\n meta: {\n filePath: absoluteTokensPath,\n tokenCount: Object.keys(resolvedTokenMap).length,\n primitiveCount,\n semanticCount,\n },\n });\n } catch (e) {\n console.error(\"[musea] Failed to load tokens:\", e);\n sendJson({ categories: [], tokenMap: {}, error: String(e) });\n }\n}\n\n/** POST /api/tokens (create) */\nexport async function handleTokensCreate(\n ctx: ApiRoutesContext,\n readBody: ReadBody,\n sendJson: SendJson,\n sendError: SendError,\n): Promise<void> {\n if (!ctx.tokensPath) {\n sendError(\"No tokens path configured\", 400);\n return;\n }\n\n const body = await readBody();\n try {\n const { path: dotPath, token } = JSON.parse(body) as {\n path: string;\n token: Omit<DesignToken, \"$resolvedValue\">;\n };\n if (!dotPath || !token || token.value === undefined) {\n sendError(\"Missing required fields: path, token.value\", 400);\n return;\n }\n const absoluteTokensPath = resolveTokensPath(ctx);\n const rawData = await readRawTokenFile(absoluteTokensPath);\n\n const currentCategories = await parseTokens(absoluteTokensPath);\n const currentMap = buildTokenMap(currentCategories);\n if (currentMap[dotPath]) {\n sendError(`Token already exists at path \"${dotPath}\"`, 409);\n return;\n }\n\n if (token.$reference) {\n const validation = validateSemanticReference(currentMap, token.$reference, dotPath);\n if (!validation.valid) {\n sendError(validation.error!, 400);\n return;\n }\n token.value = `{${token.$reference}}`;\n token.$tier = \"semantic\";\n }\n\n setTokenAtPath(rawData, dotPath, token);\n await writeRawTokenFile(absoluteTokensPath, rawData);\n\n const categories = await parseTokens(absoluteTokensPath);\n const tokenMap = buildTokenMap(categories);\n resolveReferences(categories, tokenMap);\n const resolvedTokenMap = buildTokenMap(categories);\n sendJson({ categories, tokenMap: resolvedTokenMap }, 201);\n } catch (e) {\n sendTokenMutationError(e, sendError);\n }\n}\n\n/** PUT /api/tokens (update) */\nexport async function handleTokensUpdate(\n ctx: ApiRoutesContext,\n readBody: ReadBody,\n sendJson: SendJson,\n sendError: SendError,\n): Promise<void> {\n if (!ctx.tokensPath) {\n sendError(\"No tokens path configured\", 400);\n return;\n }\n\n const body = await readBody();\n try {\n const { path: dotPath, token } = JSON.parse(body) as {\n path: string;\n token: Omit<DesignToken, \"$resolvedValue\">;\n };\n if (!dotPath || !token || token.value === undefined) {\n sendError(\"Missing required fields: path, token.value\", 400);\n return;\n }\n const absoluteTokensPath = resolveTokensPath(ctx);\n\n if (token.$reference) {\n const currentCategories = await parseTokens(absoluteTokensPath);\n const currentMap = buildTokenMap(currentCategories);\n const validation = validateSemanticReference(currentMap, token.$reference, dotPath);\n if (!validation.valid) {\n sendError(validation.error!, 400);\n return;\n }\n token.value = `{${token.$reference}}`;\n token.$tier = \"semantic\";\n }\n\n const rawData = await readRawTokenFile(absoluteTokensPath);\n setTokenAtPath(rawData, dotPath, token);\n await writeRawTokenFile(absoluteTokensPath, rawData);\n\n const categories = await parseTokens(absoluteTokensPath);\n const tokenMap = buildTokenMap(categories);\n resolveReferences(categories, tokenMap);\n const resolvedTokenMap = buildTokenMap(categories);\n sendJson({ categories, tokenMap: resolvedTokenMap });\n } catch (e) {\n sendTokenMutationError(e, sendError);\n }\n}\n\n/** DELETE /api/tokens */\nexport async function handleTokensDelete(\n ctx: ApiRoutesContext,\n readBody: ReadBody,\n sendJson: SendJson,\n sendError: SendError,\n): Promise<void> {\n if (!ctx.tokensPath) {\n sendError(\"No tokens path configured\", 400);\n return;\n }\n\n const body = await readBody();\n try {\n const { path: dotPath } = JSON.parse(body) as { path: string };\n if (!dotPath) {\n sendError(\"Missing required field: path\", 400);\n return;\n }\n const absoluteTokensPath = resolveTokensPath(ctx);\n\n const currentCategories = await parseTokens(absoluteTokensPath);\n const currentMap = buildTokenMap(currentCategories);\n const dependents = findDependentTokens(currentMap, dotPath);\n\n const rawData = await readRawTokenFile(absoluteTokensPath);\n const deleted = deleteTokenAtPath(rawData, dotPath);\n if (!deleted) {\n sendError(`Token not found at path \"${dotPath}\"`, 404);\n return;\n }\n await writeRawTokenFile(absoluteTokensPath, rawData);\n\n const categories = await parseTokens(absoluteTokensPath);\n const tokenMap = buildTokenMap(categories);\n resolveReferences(categories, tokenMap);\n const resolvedTokenMap = buildTokenMap(categories);\n sendJson({\n categories,\n tokenMap: resolvedTokenMap,\n dependentsWarning: dependents.length > 0 ? dependents : undefined,\n });\n } catch (e) {\n sendTokenMutationError(e, sendError);\n }\n}\n","/**\n * Palette handler for the Musea gallery API.\n *\n * Handles GET /api/arts/:path/palette endpoint.\n */\n\nimport fs from \"node:fs\";\n\nimport type { ApiRoutesContext, SendJson, SendError } from \"./index.js\";\nimport { allowedSourceRoots, resolveComponentSourcePath } from \"../component-source.js\";\nimport { loadNative, analyzeSfcFallback } from \"../native-loader.js\";\nimport { decodeUrlComponent } from \"../security.js\";\n\n/** GET /api/arts/:path/palette */\nexport async function handleArtPalette(\n ctx: ApiRoutesContext,\n match: RegExpMatchArray,\n sendJson: SendJson,\n sendError: SendError,\n): Promise<void> {\n const artPath = decodeUrlComponent(match[1], \"art path\");\n const art = ctx.artFiles.get(artPath);\n if (!art) {\n sendError(\"Art not found\", 404);\n return;\n }\n\n try {\n const source = await fs.promises.readFile(artPath, \"utf-8\");\n const binding = loadNative();\n let palette: {\n title: string;\n controls: Array<{\n name: string;\n control: string;\n default_value?: unknown;\n description?: string;\n required: boolean;\n options: Array<{ label: string; value: unknown }>;\n range?: { min: number; max: number; step?: number };\n group?: string;\n }>;\n groups: string[];\n json: string;\n typescript: string;\n };\n if (binding.generateArtPalette) {\n palette = binding.generateArtPalette(source, {\n filename: artPath,\n });\n } else {\n palette = {\n title: art.metadata.title,\n controls: [],\n groups: [],\n json: \"{}\",\n typescript: \"\",\n };\n }\n\n // If the native palette returned no controls, try JS-based SFC analysis\n if (palette.controls.length === 0 && art.metadata.component) {\n const resolvedComponentPath = resolveComponentSourcePath(\n art,\n artPath,\n allowedSourceRoots(ctx.config.root, ctx.scanRoots),\n );\n if (!resolvedComponentPath) {\n sendJson(palette);\n return;\n }\n\n try {\n const componentSource = await fs.promises.readFile(resolvedComponentPath, \"utf-8\");\n const analysis = binding.analyzeSfc\n ? binding.analyzeSfc(componentSource, {\n filename: resolvedComponentPath,\n })\n : analyzeSfcFallback(componentSource, {\n filename: resolvedComponentPath,\n });\n\n if (analysis.props.length > 0) {\n palette.controls = analysis.props.map((prop) => {\n let control = \"text\";\n if (prop.type === \"boolean\") control = \"boolean\";\n else if (prop.type === \"number\") control = \"number\";\n else if (prop.type.includes(\"|\") && !prop.type.includes(\"=>\")) {\n control = \"select\";\n }\n\n const options: Array<{ label: string; value: unknown }> = [];\n if (control === \"select\") {\n const optionMatches = prop.type.match(/\"([^\"]+)\"/g);\n if (optionMatches) {\n for (const opt of optionMatches) {\n const val = opt.replace(/\"/g, \"\");\n options.push({ label: val, value: val });\n }\n }\n }\n\n return {\n name: prop.name,\n control,\n default_value:\n prop.default_value !== undefined\n ? prop.default_value === \"true\"\n ? true\n : prop.default_value === \"false\"\n ? false\n : typeof prop.default_value === \"string\" && prop.default_value.startsWith('\"')\n ? prop.default_value.replace(/^\"|\"$/g, \"\")\n : prop.default_value\n : undefined,\n description: undefined,\n required: prop.required,\n options,\n range: undefined,\n group: undefined,\n };\n });\n\n palette.json = JSON.stringify(\n { title: palette.title, controls: palette.controls },\n null,\n 2,\n );\n palette.typescript = `export interface ${palette.title}Props {\\n${palette.controls\n .map(\n (c) =>\n ` ${c.name}${c.required ? \"\" : \"?\"}: ${\n c.control === \"boolean\"\n ? \"boolean\"\n : c.control === \"number\"\n ? \"number\"\n : c.control === \"select\"\n ? c.options.map((o) => `\"${String(o.value)}\"`).join(\" | \")\n : \"string\"\n };`,\n )\n .join(\"\\n\")}\\n}\\n`;\n }\n } catch {\n // Ignore errors reading component file\n }\n }\n\n sendJson(palette);\n } catch (e) {\n sendError(e instanceof Error ? e.message : String(e));\n }\n}\n","/**\n * Individual route handler functions for the Musea gallery API.\n *\n * Extracted from api-routes.ts to keep file sizes manageable.\n * These handle GET /api/arts/:path/... sub-routes.\n */\n\nimport fs from \"node:fs\";\n\nimport type { ApiRoutesContext, SendJson, SendError } from \"./index.js\";\nimport { allowedSourceRoots, resolveComponentSourcePath } from \"../component-source.js\";\nimport { loadNative, analyzeSfcFallback } from \"../native-loader.js\";\nimport { decodeUrlComponent } from \"../security.js\";\n\nexport { handleArtPalette } from \"./handler-palette.js\";\n\n/** GET /api/arts/:path/source */\nexport async function handleArtSource(\n ctx: ApiRoutesContext,\n match: RegExpMatchArray,\n sendJson: SendJson,\n sendError: SendError,\n): Promise<void> {\n const artPath = decodeUrlComponent(match[1], \"art path\");\n const art = ctx.artFiles.get(artPath);\n if (!art) {\n sendError(\"Art not found\", 404);\n return;\n }\n\n try {\n const source = await fs.promises.readFile(artPath, \"utf-8\");\n sendJson({ source, path: artPath });\n } catch (e) {\n sendError(e instanceof Error ? e.message : String(e));\n }\n}\n\n/** GET /api/arts/:path/analysis */\nexport async function handleArtAnalysis(\n ctx: ApiRoutesContext,\n match: RegExpMatchArray,\n sendJson: SendJson,\n sendError: SendError,\n): Promise<void> {\n const artPath = decodeUrlComponent(match[1], \"art path\");\n const art = ctx.artFiles.get(artPath);\n if (!art) {\n sendError(\"Art not found\", 404);\n return;\n }\n\n try {\n const resolvedComponentPath = resolveComponentSourcePath(\n art,\n artPath,\n allowedSourceRoots(ctx.config.root, ctx.scanRoots),\n );\n\n if (resolvedComponentPath) {\n const source = await fs.promises.readFile(resolvedComponentPath, \"utf-8\");\n const binding = loadNative();\n if (binding.analyzeSfc) {\n const analysis = binding.analyzeSfc(source, {\n filename: resolvedComponentPath,\n });\n sendJson(analysis);\n } else {\n const analysis = analyzeSfcFallback(source, {\n filename: resolvedComponentPath,\n });\n sendJson(analysis);\n }\n } else {\n sendJson({ props: [], emits: [] });\n }\n } catch (e) {\n sendError(e instanceof Error ? e.message : String(e));\n }\n}\n\n/** GET /api/arts/:path/docs */\nexport async function handleArtDocs(\n ctx: ApiRoutesContext,\n match: RegExpMatchArray,\n sendJson: SendJson,\n sendError: SendError,\n): Promise<void> {\n const artPath = decodeUrlComponent(match[1], \"art path\");\n const art = ctx.artFiles.get(artPath);\n if (!art) {\n sendError(\"Art not found\", 404);\n return;\n }\n\n try {\n const source = await fs.promises.readFile(artPath, \"utf-8\");\n const binding = loadNative();\n if (binding.generateArtDoc) {\n const doc = binding.generateArtDoc(source, {\n filename: artPath,\n });\n // Replace Self with component name and format indentation\n let markdown = doc.markdown || \"\";\n const componentName = art.metadata.title || \"Component\";\n markdown = markdown\n .replace(/<Self(\\s|>|\\/)/g, `<${componentName}$1`)\n .replace(/<\\/Self>/g, `</${componentName}>`);\n // Fix indentation in code blocks\n markdown = markdown.replace(\n /```(\\w*)\\n([\\s\\S]*?)```/g,\n (_match: string, lang: string, code: string) => {\n const lines = code.split(\"\\n\");\n let minIndent = Infinity;\n for (const line of lines) {\n if (line.trim()) {\n const indent = line.match(/^(\\s*)/)?.[1].length || 0;\n minIndent = Math.min(minIndent, indent);\n }\n }\n if (minIndent === Infinity) minIndent = 0;\n let formatted: string;\n if (minIndent > 0) {\n formatted = lines.map((line: string) => line.slice(minIndent)).join(\"\\n\");\n } else {\n let restIndent = Infinity;\n for (let i = 1; i < lines.length; i++) {\n if (lines[i].trim()) {\n const indent = lines[i].match(/^(\\s*)/)?.[1].length || 0;\n restIndent = Math.min(restIndent, indent);\n }\n }\n if (restIndent === Infinity || restIndent === 0) {\n formatted = lines.join(\"\\n\");\n } else {\n formatted = lines\n .map((line: string, i: number) => (i === 0 ? line : line.slice(restIndent)))\n .join(\"\\n\");\n }\n }\n return \"```\" + lang + \"\\n\" + formatted + \"```\";\n },\n );\n sendJson({ ...doc, markdown });\n } else {\n sendJson({\n markdown: \"\",\n title: art.metadata.title,\n variant_count: art.variants.length,\n });\n }\n } catch (e) {\n sendError(e instanceof Error ? e.message : String(e));\n }\n}\n\n/** GET /api/arts/:path/variants/:name/a11y */\nexport function handleArtA11y(\n ctx: ApiRoutesContext,\n match: RegExpMatchArray,\n sendJson: SendJson,\n sendError: SendError,\n): void {\n const artPath = decodeUrlComponent(match[1], \"art path\");\n const _variantName = decodeUrlComponent(match[2], \"variant name\");\n const art = ctx.artFiles.get(artPath);\n if (!art) {\n sendError(\"Art not found\", 404);\n return;\n }\n\n // Return empty a11y results (populated after VRT --a11y run)\n sendJson({ violations: [], passes: 0, incomplete: 0 });\n}\n","/**\n * POST route handlers for the Musea gallery API.\n *\n * Handles preview-with-props, generate, and run-vrt endpoints.\n */\n\nimport type { ServerResponse } from \"node:http\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nimport type { ApiRoutesContext, SendJson, SendError } from \"./index.js\";\nimport { generatePreviewModuleWithProps } from \"../preview/index.js\";\nimport { HttpError, resolveInside } from \"../security.js\";\nimport { toPascalCase } from \"../utils.js\";\n\n/** POST /api/preview-with-props */\nexport function handlePreviewWithProps(\n ctx: ApiRoutesContext,\n body: string,\n res: ServerResponse,\n sendJson: SendJson,\n sendError: SendError,\n): void {\n try {\n const { artPath: reqArtPath, variantName, props: propsOverride } = JSON.parse(body);\n const art = ctx.artFiles.get(reqArtPath);\n if (!art) {\n sendError(\"Art not found\", 404);\n return;\n }\n\n const variant = art.variants.find((v) => v.name === variantName);\n if (!variant) {\n sendError(\"Variant not found\", 404);\n return;\n }\n\n const variantComponentName = toPascalCase(variant.name);\n const moduleCode = generatePreviewModuleWithProps(\n art,\n variantComponentName,\n variant.name,\n propsOverride,\n ctx.resolvedPreviewCss,\n ctx.resolvedPreviewSetup,\n );\n res.setHeader(\"Content-Type\", \"application/javascript\");\n res.end(moduleCode);\n } catch (e) {\n if (e instanceof HttpError) {\n sendError(e.message, e.status);\n return;\n }\n sendError(e instanceof Error ? e.message : String(e));\n }\n}\n\n/** POST /api/generate */\nexport async function handleGenerate(\n ctx: ApiRoutesContext,\n body: string,\n sendJson: SendJson,\n sendError: SendError,\n): Promise<void> {\n try {\n const { componentPath: reqComponentPath, options: autogenOptions } = JSON.parse(body);\n if (typeof reqComponentPath !== \"string\") {\n sendError(\"Missing required field: componentPath\", 400);\n return;\n }\n const { generateArtFile: genArt } = await import(\"../autogen/index.js\");\n const componentPath = resolveInside(ctx.config.root, reqComponentPath, \"componentPath\");\n const result = await genArt(componentPath, autogenOptions);\n sendJson({\n generated: true,\n componentName: result.componentName,\n variants: result.variants,\n artFileContent: result.artFileContent,\n });\n } catch (e) {\n if (e instanceof HttpError) {\n sendError(e.message, e.status);\n return;\n }\n sendError(e instanceof Error ? e.message : String(e));\n }\n}\n\n/** POST /api/run-vrt */\nexport async function handleRunVrt(\n ctx: ApiRoutesContext,\n body: string,\n sendJson: SendJson,\n sendError: SendError,\n): Promise<void> {\n try {\n const { artPath, updateSnapshots } = JSON.parse(body);\n const { MuseaVrtRunner, generateVrtJsonReport, generateVrtReport } = await import(\"../vrt.js\");\n\n const snapshotDir = path.resolve(ctx.config.root, \".vize/snapshots\");\n const reportDir = path.resolve(ctx.config.root, \".vize/reports\");\n\n const runner = new MuseaVrtRunner({ snapshotDir });\n\n const port = ctx.getDevServerPort();\n const baseUrl = `http://localhost:${port}`;\n\n let artsToTest = Array.from(ctx.artFiles.values());\n if (artPath) {\n artsToTest = artsToTest.filter((a) => a.path === artPath);\n }\n\n const { results, summary } = await (async () => {\n await runner.start();\n\n try {\n const results = await runner.runTests(artsToTest, baseUrl, {\n updateSnapshots,\n });\n const summary = runner.getSummary(results);\n return { results, summary };\n } finally {\n await runner.stop();\n }\n })();\n\n const reportBaseName = artPath ? `vrt-${path.basename(artPath, \".art.vue\")}` : \"vrt\";\n const jsonReportPath = path.join(reportDir, `${reportBaseName}-report.json`);\n const htmlReportPath = path.join(reportDir, `${reportBaseName}-report.html`);\n\n await fs.promises.mkdir(reportDir, { recursive: true });\n await fs.promises.writeFile(jsonReportPath, generateVrtJsonReport(results, summary), \"utf-8\");\n await fs.promises.writeFile(htmlReportPath, generateVrtReport(results, summary), \"utf-8\");\n\n sendJson({\n success: true,\n summary,\n results: results.map((r) => ({\n artPath: r.artPath,\n variantName: r.variantName,\n viewport: r.viewport.name,\n passed: r.passed,\n isNew: r.isNew,\n diffPercentage: r.diffPercentage,\n snapshotPath: r.snapshotPath,\n currentPath: r.currentPath,\n diffPath: r.diffPath,\n error: r.error,\n })),\n artifacts: {\n reportDir,\n htmlReportPath,\n jsonReportPath,\n snapshotDir,\n currentDir: path.join(snapshotDir, \"current\"),\n diffDir: path.join(snapshotDir, \"diff\"),\n },\n });\n } catch (e) {\n sendError(e instanceof Error ? e.message : String(e));\n }\n}\n","/**\n * Musea gallery API route handlers.\n *\n * Extracted from the main plugin to keep file sizes manageable.\n * Provides REST API endpoints consumed by the gallery UI:\n * - GET/POST/PUT/DELETE /api/tokens (delegated to api-tokens.ts)\n * - GET /api/arts, /api/arts/:path, /api/arts/:path/source, etc.\n * - POST /api/preview-with-props\n * - POST /api/generate\n * - POST /api/run-vrt\n */\n\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { ResolvedConfig } from \"vite\";\nimport fs from \"node:fs\";\n\nimport type { ArtFileInfo } from \"../types/index.js\";\nimport {\n handleTokensUsage,\n handleTokensGet,\n handleTokensCreate,\n handleTokensUpdate,\n handleTokensDelete,\n} from \"../api-tokens.js\";\nimport {\n handleArtSource,\n handleArtPalette,\n handleArtAnalysis,\n handleArtDocs,\n handleArtA11y,\n} from \"./handlers.js\";\nimport { handlePreviewWithProps, handleGenerate, handleRunVrt } from \"./post-handlers.js\";\nimport {\n collectRequestBody,\n decodeUrlComponent,\n DEFAULT_API_BODY_LIMIT_BYTES,\n HttpError,\n resolveInside,\n validateDevApiRequest,\n} from \"../security.js\";\n\n/** Dependencies injected from the plugin closure. */\nexport interface ApiRoutesContext {\n config: ResolvedConfig;\n artFiles: Map<string, ArtFileInfo>;\n scanRoots: string[];\n tokensPath: string | undefined;\n basePath: string;\n resolvedPreviewCss: string[];\n resolvedPreviewSetup: string | null;\n devSessionToken: string;\n apiBodyLimit?: number;\n processArtFile: (filePath: string) => Promise<void>;\n /** Reference to the dev server for VRT port resolution */\n getDevServerPort: () => number;\n}\n\nexport type SendJson = (data: unknown, status?: number) => void;\nexport type SendError = (message: string, status?: number) => void;\nexport type ReadBody = () => Promise<string>;\n\ntype NextFn = () => void;\n\n/**\n * Create the API middleware handler for the Musea gallery.\n *\n * Returns a Connect-compatible middleware function that handles all\n * `/api/...` sub-routes under the configured basePath.\n */\nexport function createApiMiddleware(ctx: ApiRoutesContext) {\n return async (req: IncomingMessage, res: ServerResponse, next: NextFn) => {\n const sendJson: SendJson = (data: unknown, status = 200) => {\n res.statusCode = status;\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify(data));\n };\n\n const sendError: SendError = (message: string, status = 500) => {\n sendJson({ error: message }, status);\n };\n\n const readBody: ReadBody = () =>\n collectRequestBody(req, ctx.apiBodyLimit ?? DEFAULT_API_BODY_LIMIT_BYTES);\n\n const url = req.url || \"/\";\n\n try {\n const requestError = validateDevApiRequest(req, ctx.devSessionToken);\n if (requestError) {\n sendError(requestError.message, requestError.status);\n return;\n }\n\n // --- GET /api/arts ---\n if (url === \"/arts\" && req.method === \"GET\") {\n sendJson(Array.from(ctx.artFiles.values()));\n return;\n }\n\n // --- Token routes (delegated to api-tokens.ts) ---\n if (url === \"/tokens/usage\" && req.method === \"GET\") {\n await handleTokensUsage(ctx, sendJson);\n return;\n }\n if (url === \"/tokens\" && req.method === \"GET\") {\n await handleTokensGet(ctx, sendJson);\n return;\n }\n if (url === \"/tokens\" && req.method === \"POST\") {\n await handleTokensCreate(ctx, readBody, sendJson, sendError);\n return;\n }\n if (url === \"/tokens\" && req.method === \"PUT\") {\n await handleTokensUpdate(ctx, readBody, sendJson, sendError);\n return;\n }\n if (url === \"/tokens\" && req.method === \"DELETE\") {\n await handleTokensDelete(ctx, readBody, sendJson, sendError);\n return;\n }\n\n // --- PUT /api/arts/:path/source (update art source) ---\n if (url?.startsWith(\"/arts/\") && req.method === \"PUT\") {\n const rest = url.slice(6);\n const sourceMatch = rest.match(/^(.+)\\/source$/);\n if (sourceMatch) {\n const artPath = decodeUrlComponent(sourceMatch[1], \"art path\");\n const art = ctx.artFiles.get(artPath);\n if (!art) {\n sendError(\"Art not found\", 404);\n return;\n }\n\n const safeArtPath = resolveInside(ctx.config.root, artPath, \"art path\");\n const body = await readBody();\n const { source } = JSON.parse(body) as { source: string };\n if (typeof source !== \"string\") {\n sendError(\"Missing required field: source\", 400);\n return;\n }\n await fs.promises.writeFile(safeArtPath, source, \"utf-8\");\n await ctx.processArtFile(safeArtPath);\n sendJson({ success: true });\n return;\n }\n next();\n return;\n }\n\n // --- GET /api/arts/:path/... sub-routes ---\n if (url?.startsWith(\"/arts/\") && req.method === \"GET\") {\n const rest = url.slice(6);\n\n const sourceMatch = rest.match(/^(.+)\\/source$/);\n const paletteMatch = rest.match(/^(.+)\\/palette$/);\n const analysisMatch = rest.match(/^(.+)\\/analysis$/);\n const docsMatch = rest.match(/^(.+)\\/docs$/);\n const a11yMatch = rest.match(/^(.+)\\/variants\\/([^/]+)\\/a11y$/);\n\n if (sourceMatch) {\n await handleArtSource(ctx, sourceMatch, sendJson, sendError);\n return;\n }\n\n if (paletteMatch) {\n await handleArtPalette(ctx, paletteMatch, sendJson, sendError);\n return;\n }\n\n if (analysisMatch) {\n await handleArtAnalysis(ctx, analysisMatch, sendJson, sendError);\n return;\n }\n\n if (docsMatch) {\n await handleArtDocs(ctx, docsMatch, sendJson, sendError);\n return;\n }\n\n if (a11yMatch) {\n handleArtA11y(ctx, a11yMatch, sendJson, sendError);\n return;\n }\n\n // GET /api/arts/:path (no sub-resource)\n const artPath = decodeUrlComponent(rest, \"art path\");\n const art = ctx.artFiles.get(artPath);\n if (art) {\n sendJson(art);\n } else {\n sendError(\"Art not found\", 404);\n }\n return;\n }\n\n // --- POST routes (delegated to post-handlers.ts) ---\n if (req.method === \"POST\") {\n const body = await readBody();\n\n if (url === \"/preview-with-props\") {\n handlePreviewWithProps(ctx, body, res, sendJson, sendError);\n return;\n }\n\n if (url === \"/generate\") {\n await handleGenerate(ctx, body, sendJson, sendError);\n return;\n }\n\n if (url === \"/run-vrt\") {\n await handleRunVrt(ctx, body, sendJson, sendError);\n return;\n }\n }\n\n next();\n } catch (e) {\n if (e instanceof HttpError) {\n sendError(e.message, e.status);\n return;\n }\n sendError(e instanceof Error ? e.message : String(e));\n }\n };\n}\n","/**\n * Manifest module generation for Musea.\n *\n * Generates the virtual module that exposes all discovered art files\n * as a JSON manifest.\n */\n\nimport type { ArtFileInfo } from \"./types/index.js\";\n\n/**\n * Generate the virtual manifest module code containing all art file metadata.\n */\nexport function generateManifestModule(artFiles: Map<string, ArtFileInfo>): string {\n const arts = Array.from(artFiles.values());\n return `export const arts = ${JSON.stringify(arts, null, 2)};`;\n}\n","/**\n * Virtual module handling for the Musea Vite plugin.\n *\n * Contains `resolveId`, `load`, and `handleHotUpdate` hooks that\n * manage virtual modules for gallery, manifest, preview, and art files.\n */\n\nimport path from \"node:path\";\nimport type { ModuleNode } from \"vite\";\n\nimport type { ArtFileInfo } from \"../types/index.js\";\n\nimport { generateGalleryModule } from \"../gallery/index.js\";\nimport { generatePreviewModule } from \"../preview/index.js\";\nimport { generateManifestModule } from \"../manifest.js\";\nimport { generateArtModule } from \"../art-module.js\";\nimport { toPascalCase } from \"../utils.js\";\n\n// Virtual module prefixes\nconst VIRTUAL_MUSEA_PREFIX = \"\\0musea:\";\nconst VIRTUAL_GALLERY = \"\\0musea-gallery\";\nconst VIRTUAL_MANIFEST = \"\\0musea-manifest\";\n\nexport { VIRTUAL_MUSEA_PREFIX, VIRTUAL_GALLERY, VIRTUAL_MANIFEST };\n\n/**\n * Shared state required by virtual module hooks.\n */\nexport interface VirtualModuleState {\n basePath: string;\n inlineArt: boolean;\n artFiles: Map<string, ArtFileInfo>;\n resolvedPreviewCss: string[];\n resolvedPreviewSetup: string | null;\n getConfigRoot: () => string;\n getScanRoots: () => string[];\n getServer: () => {\n moduleGraph: { getModulesByFile(id: string): Set<ModuleNode> | undefined };\n } | null;\n processArtFile: (filePath: string) => Promise<void>;\n}\n\nexport function createResolveId(state: VirtualModuleState) {\n return function resolveId(id: string): string | null {\n const root = state.getConfigRoot();\n\n if (id === VIRTUAL_GALLERY) {\n return VIRTUAL_GALLERY;\n }\n if (id === VIRTUAL_MANIFEST) {\n return VIRTUAL_MANIFEST;\n }\n // Handle virtual:musea-preview: prefix for preview modules\n if (id.startsWith(\"virtual:musea-preview:\")) {\n return \"\\0musea-preview:\" + id.slice(\"virtual:musea-preview:\".length);\n }\n // Handle virtual:musea-art: prefix for preview modules\n // Append ?musea-virtual to prevent other plugins (e.g. unplugin-vue-i18n)\n // from treating .vue-ending virtual IDs as Vue SFC files\n if (id.startsWith(\"virtual:musea-art:\")) {\n const artPath = id.slice(\"virtual:musea-art:\".length);\n if (state.artFiles.has(artPath)) {\n return \"\\0musea-art:\" + artPath + \"?musea-virtual\";\n }\n }\n if (id.endsWith(\".art.vue\")) {\n const resolved = path.resolve(root, id);\n if (state.artFiles.has(resolved)) {\n return VIRTUAL_MUSEA_PREFIX + resolved + \"?musea-virtual\";\n }\n }\n // Inline art: resolve .vue files that have <art> blocks\n if (state.inlineArt && id.endsWith(\".vue\") && !id.endsWith(\".art.vue\")) {\n const resolved = path.resolve(root, id);\n if (state.artFiles.has(resolved)) {\n return VIRTUAL_MUSEA_PREFIX + resolved + \"?musea-virtual\";\n }\n }\n return null;\n };\n}\n\nexport function createLoad(state: VirtualModuleState) {\n return function load(id: string): string | null {\n if (id === VIRTUAL_GALLERY) {\n return generateGalleryModule(state.basePath);\n }\n if (id === VIRTUAL_MANIFEST) {\n return generateManifestModule(state.artFiles);\n }\n // Handle \\0musea-preview: prefix for preview modules\n if (id.startsWith(\"\\0musea-preview:\")) {\n const rest = id.slice(\"\\0musea-preview:\".length);\n const lastColonIndex = rest.lastIndexOf(\":\");\n if (lastColonIndex !== -1) {\n const artPath = rest.slice(0, lastColonIndex);\n const variantName = rest.slice(lastColonIndex + 1);\n const art = state.artFiles.get(artPath);\n if (art) {\n const variantComponentName = toPascalCase(variantName);\n return generatePreviewModule(\n art,\n variantComponentName,\n variantName,\n state.resolvedPreviewCss,\n state.resolvedPreviewSetup,\n );\n }\n }\n }\n // Handle \\0musea-art: prefix for preview modules\n if (id.startsWith(\"\\0musea-art:\")) {\n const artPath = id.slice(\"\\0musea-art:\".length).replace(/\\?musea-virtual$/, \"\");\n const art = state.artFiles.get(artPath);\n if (art) {\n return generateArtModule(art, artPath, {\n root: state.getConfigRoot(),\n scanRoots: state.getScanRoots(),\n });\n }\n }\n if (id.startsWith(VIRTUAL_MUSEA_PREFIX)) {\n const realPath = id.slice(VIRTUAL_MUSEA_PREFIX.length).replace(/\\?musea-virtual$/, \"\");\n const art = state.artFiles.get(realPath);\n if (art) {\n return generateArtModule(art, realPath, {\n root: state.getConfigRoot(),\n scanRoots: state.getScanRoots(),\n });\n }\n }\n return null;\n };\n}\n\nexport function createHandleHotUpdate(state: VirtualModuleState) {\n return async function handleHotUpdate(ctx: { file: string }): Promise<ModuleNode[] | undefined> {\n const { file } = ctx;\n if (file.endsWith(\".art.vue\") && state.artFiles.has(file)) {\n await state.processArtFile(file);\n\n // Invalidate virtual modules\n const virtualId = VIRTUAL_MUSEA_PREFIX + file + \"?musea-virtual\";\n const server = state.getServer();\n const modules = server?.moduleGraph.getModulesByFile(virtualId);\n if (modules) {\n return [...modules];\n }\n }\n\n // Inline art: HMR for .vue files with <art> blocks\n if (\n state.inlineArt &&\n file.endsWith(\".vue\") &&\n !file.endsWith(\".art.vue\") &&\n state.artFiles.has(file)\n ) {\n await state.processArtFile(file);\n\n const virtualId = VIRTUAL_MUSEA_PREFIX + file;\n const server = state.getServer();\n const modules = server?.moduleGraph.getModulesByFile(virtualId);\n if (modules) {\n return [...modules];\n }\n }\n\n return undefined;\n };\n}\n","/**\n * Main Musea Vite plugin implementation.\n *\n * Contains the `musea()` factory function that creates the Vite plugin,\n * including dev server middleware, config resolution, and build-start scanning.\n *\n * Virtual module hooks (resolveId / load / handleHotUpdate) are extracted into\n * `virtual.ts`.\n *\n * Middleware and API route logic is extracted into:\n * - `server-middleware.ts` -- gallery SPA, preview, art module serving\n * - `api-routes.ts` -- REST API endpoints for gallery UI\n */\n\nimport type { Plugin, ViteDevServer, ResolvedConfig } from \"vite\";\nimport { transformWithEsbuild } from \"vite\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { vizeConfigStore } from \"@vizejs/vite-plugin\";\n\nimport type { MuseaOptions, ArtFileInfo, ArtMetadata } from \"../types/index.js\";\n\nimport { loadNative } from \"../native-loader.js\";\nimport { extractScriptSetupContent } from \"../art-module.js\";\nimport {\n shouldProcess,\n scanArtFiles,\n generateStorybookFiles,\n buildThemeConfig,\n resolveScanRoots,\n} from \"../utils.js\";\nimport { registerMiddleware } from \"../server-middleware.js\";\nimport { createApiMiddleware } from \"../api-routes/index.js\";\nimport { createDevSessionToken } from \"../security.js\";\nimport {\n createResolveId,\n createLoad,\n createHandleHotUpdate,\n type VirtualModuleState,\n} from \"./virtual.js\";\n\nfunction extractArtTagAttributes(source: string): Record<string, string | true> {\n const artTagMatch = source.match(/<art\\b([\\s\\S]*?)>/i);\n if (!artTagMatch) return {};\n\n const attributes: Record<string, string | true> = {};\n const attrPattern = /([^\\s=/>]+)(?:\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'))?/g;\n\n for (const match of artTagMatch[1].matchAll(attrPattern)) {\n const name = match[1];\n if (!name || name === \"/\") continue;\n attributes[name] = match[2] ?? match[3] ?? true;\n }\n\n return attributes;\n}\n\nfunction parseActionEvents(value: string | true | undefined): string[] | undefined {\n if (typeof value !== \"string\") return undefined;\n\n const events = value\n .split(\",\")\n .map((eventName) => eventName.trim().toLowerCase())\n .filter(Boolean);\n\n return events.length > 0 ? [...new Set(events)] : undefined;\n}\n\nfunction extractCustomArtMetadata(source: string): Pick<ArtMetadata, \"actionEvents\"> {\n const attrs = extractArtTagAttributes(source);\n const actionEvents = new Set(parseActionEvents(attrs[\"action-events\"]) ?? []);\n const captureMousemove = attrs[\"capture-mousemove\"];\n\n if (captureMousemove === true || captureMousemove === \"true\") {\n actionEvents.add(\"mousemove\");\n }\n\n return {\n actionEvents: actionEvents.size > 0 ? [...actionEvents] : undefined,\n };\n}\n\nfunction extractStyleBlocks(source: string): string[] {\n const styles: string[] = [];\n\n for (const match of source.matchAll(/<style\\b([^>]*)>([\\s\\S]*?)<\\/style>/gi)) {\n const attrs = match[1] ?? \"\";\n const content = match[2]?.trim();\n const lang = attrs.match(/\\blang\\s*=\\s*[\"']([^\"']+)[\"']/i)?.[1]?.toLowerCase();\n\n if (!content) {\n continue;\n }\n\n if (lang && lang !== \"css\") {\n continue;\n }\n\n styles.push(content);\n }\n\n return styles;\n}\n\n/**\n * Create Musea Vite plugin.\n */\nexport function musea(options: MuseaOptions = {}): Plugin[] {\n let include = options.include ?? [\"**/*.art.vue\"];\n let exclude = options.exclude ?? [\"node_modules/**\", \"dist/**\"];\n let basePath = options.basePath ?? \"/__musea__\";\n let storybookCompat = options.storybookCompat ?? false;\n const storybookOutDir = options.storybookOutDir ?? \".storybook/stories\";\n let inlineArt = options.inlineArt ?? false;\n const tokensPath = options.tokensPath;\n const themeConfig = buildThemeConfig(options.theme);\n const previewCss = options.previewCss ?? [];\n const previewSetup = options.previewSetup;\n const devSessionToken = createDevSessionToken();\n\n let config: ResolvedConfig;\n let server: ViteDevServer | null = null;\n const artFiles = new Map<string, ArtFileInfo>();\n let resolvedPreviewCss: string[] = [];\n let resolvedPreviewSetup: string | null = null;\n let scanRoots: string[] = [];\n\n // Shared state for virtual module hooks\n const virtualState: VirtualModuleState = {\n basePath,\n get inlineArt() {\n return inlineArt;\n },\n artFiles,\n resolvedPreviewCss,\n resolvedPreviewSetup,\n getConfigRoot: () => config.root,\n getScanRoots: () => scanRoots,\n getServer: () => server,\n processArtFile,\n };\n\n // Create virtual module hooks\n const resolveId = createResolveId(virtualState);\n const load = createLoad(virtualState);\n const handleHotUpdate = createHandleHotUpdate(virtualState);\n\n // Main plugin\n const mainPlugin: Plugin = {\n name: \"vite-plugin-musea\",\n enforce: \"pre\",\n\n config() {\n // Add Vue alias for runtime template compilation\n // This is needed because variant templates are compiled at runtime\n return {\n resolve: {\n alias: {\n vue: \"vue/dist/vue.esm-bundler.js\",\n },\n },\n };\n },\n\n configResolved(resolvedConfig) {\n config = resolvedConfig;\n\n // Merge musea config from vize.config.ts (plugin args > config file > defaults)\n const vizeConfig = vizeConfigStore.get(resolvedConfig.root);\n if (vizeConfig?.musea) {\n const mc = vizeConfig.musea;\n // Only apply config file values when plugin options were not explicitly set\n if (!options.include && mc.include) include = mc.include;\n if (!options.exclude && mc.exclude) exclude = mc.exclude;\n if (!options.basePath && mc.basePath) basePath = mc.basePath;\n if (options.storybookCompat === undefined && mc.storybookCompat !== undefined)\n storybookCompat = mc.storybookCompat;\n if (options.inlineArt === undefined && mc.inlineArt !== undefined) inlineArt = mc.inlineArt;\n }\n\n // Update virtualState.basePath in case it changed from config resolution\n virtualState.basePath = basePath;\n\n // Resolve previewCss paths to absolute paths\n resolvedPreviewCss = previewCss.map((cssPath) =>\n path.isAbsolute(cssPath) ? cssPath : path.resolve(resolvedConfig.root, cssPath),\n );\n\n // Resolve previewSetup path\n if (previewSetup) {\n resolvedPreviewSetup = path.isAbsolute(previewSetup)\n ? previewSetup\n : path.resolve(resolvedConfig.root, previewSetup);\n }\n\n // Update shared state references after resolution\n virtualState.resolvedPreviewCss = resolvedPreviewCss;\n virtualState.resolvedPreviewSetup = resolvedPreviewSetup;\n scanRoots = resolveScanRoots(resolvedConfig.root, include);\n },\n\n configureServer(devServer) {\n server = devServer;\n devServer.watcher.add(scanRoots);\n\n // Register gallery SPA, preview, and art module middleware\n registerMiddleware(devServer, {\n basePath,\n devSessionToken,\n themeConfig,\n artFiles,\n scanRoots,\n resolvedPreviewCss,\n resolvedPreviewSetup,\n });\n\n // Register API endpoints\n devServer.middlewares.use(\n `${basePath}/api`,\n createApiMiddleware({\n config,\n artFiles,\n scanRoots,\n tokensPath,\n basePath,\n resolvedPreviewCss,\n resolvedPreviewSetup,\n devSessionToken,\n processArtFile,\n getDevServerPort: () => devServer.config.server.port || 5173,\n }),\n );\n\n // Watch for Art file changes\n devServer.watcher.on(\"change\", async (file) => {\n if (file.endsWith(\".art.vue\") && shouldProcess(file, include, exclude, config.root)) {\n await processArtFile(file);\n console.log(`[musea] Reloaded: ${path.relative(config.root, file)}`);\n }\n // Inline art: re-check .vue files on change\n if (inlineArt && file.endsWith(\".vue\") && !file.endsWith(\".art.vue\")) {\n const hadArt = artFiles.has(file);\n const source = await fs.promises.readFile(file, \"utf-8\");\n if (source.includes(\"<art\")) {\n await processArtFile(file);\n console.log(`[musea] Reloaded inline art: ${path.relative(config.root, file)}`);\n } else if (hadArt) {\n artFiles.delete(file);\n console.log(`[musea] Removed inline art: ${path.relative(config.root, file)}`);\n }\n }\n });\n\n devServer.watcher.on(\"add\", async (file) => {\n if (file.endsWith(\".art.vue\") && shouldProcess(file, include, exclude, config.root)) {\n await processArtFile(file);\n console.log(`[musea] Added: ${path.relative(config.root, file)}`);\n }\n // Inline art: check new .vue files\n if (inlineArt && file.endsWith(\".vue\") && !file.endsWith(\".art.vue\")) {\n const source = await fs.promises.readFile(file, \"utf-8\");\n if (source.includes(\"<art\")) {\n await processArtFile(file);\n console.log(`[musea] Added inline art: ${path.relative(config.root, file)}`);\n }\n }\n });\n\n devServer.watcher.on(\"unlink\", (file) => {\n if (artFiles.has(file)) {\n artFiles.delete(file);\n console.log(`[musea] Removed: ${path.relative(config.root, file)}`);\n }\n });\n\n // Print Musea gallery URL after server starts\n return () => {\n devServer.httpServer?.once(\"listening\", () => {\n const address = devServer.httpServer?.address();\n if (address && typeof address === \"object\") {\n const protocol = devServer.config.server.https ? \"https\" : \"http\";\n const rawHost = address.address;\n // Normalize IPv6/IPv4 localhost addresses to \"localhost\"\n const host =\n rawHost === \"::\" ||\n rawHost === \"::1\" ||\n rawHost === \"0.0.0.0\" ||\n rawHost === \"127.0.0.1\"\n ? \"localhost\"\n : rawHost;\n const port = address.port;\n const url = `${protocol}://${host}:${port}${basePath}`;\n\n console.log();\n console.log(` \\x1b[36m➜\\x1b[0m \\x1b[1mMusea Gallery:\\x1b[0m \\x1b[36m${url}\\x1b[0m`);\n }\n });\n };\n },\n\n async buildStart() {\n // Scan for Art files\n console.log(`[musea] config.root: ${config.root}, include: ${JSON.stringify(include)}`);\n const files = await scanArtFiles(config.root, include, exclude, inlineArt);\n\n console.log(`[musea] Found ${files.length} art files`);\n\n if (server) {\n server.watcher.add(scanRoots);\n server.watcher.add(files);\n }\n\n for (const file of files) {\n await processArtFile(file);\n }\n\n // Generate Storybook CSF if enabled\n if (storybookCompat) {\n await generateStorybookFiles(artFiles, config.root, storybookOutDir);\n }\n },\n\n resolveId,\n load,\n async transform(code, id) {\n if (!id.includes(\"?musea-virtual\")) {\n return null;\n }\n\n if (!id.includes(\"musea-art:\") && !id.includes(\"\\0musea:\")) {\n return null;\n }\n\n const safeId = id\n .replaceAll(\"\\0\", \"\")\n .replace(/[^\\w./-]+/g, \"_\")\n .replace(/_+/g, \"_\");\n const loaderId = path.join(config.root, `.musea-${safeId}.ts`);\n\n return transformWithEsbuild(code, loaderId, {\n loader: \"ts\",\n format: \"esm\",\n sourcemap: config.command === \"serve\",\n target: \"esnext\",\n });\n },\n handleHotUpdate,\n };\n\n // Helper functions scoped to this plugin instance\n\n async function processArtFile(filePath: string): Promise<void> {\n try {\n const source = await fs.promises.readFile(filePath, \"utf-8\");\n const binding = loadNative();\n const parsed = binding.parseArt(source, { filename: filePath });\n const customMetadata = extractCustomArtMetadata(source);\n\n // Skip files with no variants (e.g. .vue files without <art> block)\n if (!parsed.variants || parsed.variants.length === 0) return;\n\n const isInline = !filePath.endsWith(\".art.vue\");\n\n const info: ArtFileInfo = {\n path: filePath,\n metadata: {\n title: parsed.metadata.title || (isInline ? path.basename(filePath, \".vue\") : \"\"),\n description: parsed.metadata.description,\n component: isInline ? undefined : parsed.metadata.component,\n category: parsed.metadata.category,\n tags: parsed.metadata.tags,\n status: parsed.metadata.status as \"draft\" | \"ready\" | \"deprecated\",\n order: parsed.metadata.order,\n actionEvents: customMetadata.actionEvents ?? parsed.metadata.actionEvents,\n },\n variants: parsed.variants.map((v) => ({\n name: v.name,\n template: v.template,\n isDefault: v.isDefault,\n skipVrt: v.skipVrt,\n })),\n hasScriptSetup: isInline ? false : parsed.hasScriptSetup,\n scriptSetupContent:\n !isInline && parsed.hasScriptSetup ? extractScriptSetupContent(source) : undefined,\n hasScript: parsed.hasScript,\n styleCount: parsed.styleCount,\n styleBlocks: isInline ? [] : extractStyleBlocks(source),\n isInline,\n componentPath: isInline ? filePath : undefined,\n };\n\n artFiles.set(filePath, info);\n } catch (e) {\n console.error(`[musea] Failed to process ${filePath}:`, e);\n }\n }\n\n return [mainPlugin];\n}\n","/**\n * Vite plugin for Musea - Component gallery for Vue components.\n *\n * @example\n * ```ts\n * import { defineConfig } from 'vite';\n * import { vize } from '@vizejs/vite-plugin';\n * import { musea } from '@vizejs/vite-plugin-musea';\n *\n * export default defineConfig({\n * plugins: [vize(), musea()],\n * });\n * ```\n */\n\nexport { musea } from \"./plugin/index.js\";\n\nexport type {\n MuseaOptions,\n MuseaTheme,\n MuseaThemeColors,\n ArtFileInfo,\n ArtMetadata,\n ArtVariant,\n CsfOutput,\n VrtOptions,\n ViewportConfig,\n PaletteApiResponse,\n AnalysisApiResponse,\n A11yOptions,\n A11yResult,\n CaptureConfig,\n ComparisonConfig,\n CiConfig,\n} from \"./types/index.js\";\n\nexport {\n MuseaVrtRunner,\n generateVrtReport,\n generateVrtJsonReport,\n type VrtResult,\n type VrtSummary,\n} from \"./vrt.js\";\n\nexport {\n processStyleDictionary,\n parseTokens,\n generateTokensHtml,\n generateTokensMarkdown,\n buildTokenMap,\n resolveReferences,\n scanTokenUsage,\n type DesignToken,\n type TokenCategory,\n type StyleDictionaryConfig,\n type StyleDictionaryOutput,\n type TokenUsageMap,\n} from \"./style-dictionary.js\";\n\nexport { MuseaA11yRunner, type A11ySummary } from \"./a11y/index.js\";\n\nexport {\n generateArtFile,\n writeArtFile,\n type AutogenOptions,\n type AutogenOutput,\n type PropDefinition,\n type GeneratedVariant,\n} from \"./autogen/index.js\";\n\nimport { musea } from \"./plugin/index.js\";\nexport default musea;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/native-loader.ts","../src/component-source.ts","../src/utils.ts","../src/art-module.ts","../src/preview/addons.ts","../src/preview/html.ts","../src/preview/index.ts","../src/server-middleware.ts","../src/tokens/native.ts","../src/tokens/parser.ts","../src/tokens/usage.ts","../src/tokens/resolver.ts","../src/tokens/generator.ts","../src/api-tokens.ts","../src/api-routes/handler-palette.ts","../src/api-routes/handlers.ts","../src/api-routes/post-handlers.ts","../src/api-routes/index.ts","../src/manifest.ts","../src/plugin/virtual.ts","../src/plugin/index.ts","../src/index.ts"],"sourcesContent":["/**\n * Native binding loader for @vizejs/native.\n *\n * Provides lazy-loading of the native Rust-based parser and a JS fallback\n * for SFC analysis when the native `analyzeSfc` function is unavailable.\n */\n\nimport { createRequire } from \"node:module\";\n\n// Native binding types\nexport interface NativeBinding {\n parseArt: (\n source: string,\n options?: { filename?: string },\n ) => {\n filename: string;\n metadata: {\n title: string;\n description?: string;\n component?: string;\n category?: string;\n tags: string[];\n status: string;\n order?: number;\n actionEvents?: string[];\n };\n variants: Array<{\n name: string;\n template: string;\n isDefault: boolean;\n skipVrt: boolean;\n }>;\n hasScriptSetup: boolean;\n hasScript: boolean;\n styleCount: number;\n };\n artToCsf: (\n source: string,\n options?: { filename?: string },\n ) => {\n code: string;\n filename: string;\n };\n generateArtPalette?: (\n source: string,\n artOptions?: { filename?: string },\n paletteOptions?: { infer_options?: boolean; group_by_type?: boolean },\n ) => {\n title: string;\n controls: Array<{\n name: string;\n control: string;\n default_value?: unknown;\n description?: string;\n required: boolean;\n options: Array<{ label: string; value: unknown }>;\n range?: { min: number; max: number; step?: number };\n group?: string;\n }>;\n groups: string[];\n json: string;\n typescript: string;\n };\n generateArtDoc?: (\n source: string,\n artOptions?: { filename?: string },\n docOptions?: {\n include_source?: boolean;\n include_templates?: boolean;\n include_metadata?: boolean;\n },\n ) => {\n markdown: string;\n filename: string;\n title: string;\n category?: string;\n variant_count: number;\n };\n parseDesignTokensFromPath?: (path: string) => unknown;\n buildDesignTokenMap?: (categories: unknown) => Record<string, unknown>;\n resolveDesignTokenReferences?: (categories: unknown) => unknown;\n flattenDesignTokenCategories?: (categories: unknown) => unknown[];\n generateDesignTokensMarkdown?: (categories: unknown, generatedAt?: string) => string;\n validateDesignTokenReference?: (\n tokenMap: Record<string, unknown>,\n reference: string,\n selfPath?: string,\n ) => { valid: boolean; error?: string };\n findDependentDesignTokens?: (tokenMap: Record<string, unknown>, targetPath: string) => string[];\n analyzeSfc?: (\n source: string,\n options?: { filename?: string },\n ) => {\n props: Array<{\n name: string;\n type: string;\n required: boolean;\n default_value?: unknown;\n }>;\n emits: string[];\n };\n}\n\n// Lazy-load native binding\nlet native: NativeBinding | null = null;\n\nexport function loadNative(): NativeBinding {\n if (native) return native;\n\n const require = createRequire(import.meta.url);\n try {\n native = require(\"@vizejs/native\") as NativeBinding;\n return native;\n } catch (e) {\n throw new Error(\n `Failed to load @vizejs/native. Make sure it's installed and built:\\n${String(e)}`,\n );\n }\n}\n\n/**\n * JS-based fallback for SFC analysis when native `analyzeSfc` is not available.\n * Uses regex parsing to extract props and emits from Vue SFC source.\n */\nexport function analyzeSfcFallback(\n source: string,\n _options?: { filename?: string },\n): {\n props: Array<{\n name: string;\n type: string;\n required: boolean;\n default_value?: unknown;\n }>;\n emits: string[];\n} {\n try {\n const props: Array<{\n name: string;\n type: string;\n required: boolean;\n default_value?: unknown;\n }> = [];\n const emits: string[] = [];\n\n // Extract the <script setup> block\n const scriptSetupMatch = source.match(/<script\\s+[^>]*setup[^>]*>([\\s\\S]*?)<\\/script>/);\n if (!scriptSetupMatch) {\n // Try regular <script> block\n const scriptMatch = source.match(/<script[^>]*>([\\s\\S]*?)<\\/script>/);\n if (!scriptMatch) return { props: [], emits: [] };\n }\n const scriptContent = scriptSetupMatch?.[1] || \"\";\n\n // Extract defineProps type parameter\n // Handles: defineProps<{ ... }>() and defineProps<{ ... }>\n const propsMatch = scriptContent.match(/defineProps\\s*<\\s*\\{([\\s\\S]*?)\\}>\\s*\\(/);\n const propsMatch2 = scriptContent.match(/defineProps\\s*<\\s*\\{([\\s\\S]*?)\\}>/);\n const propsBody = propsMatch?.[1] || propsMatch2?.[1];\n\n if (propsBody) {\n // Parse each prop line: name?: Type; or name: Type;\n // Handle multiline JSDoc comments before props\n const lines = propsBody.split(\"\\n\");\n let i = 0;\n while (i < lines.length) {\n const line = lines[i].trim();\n // Skip JSDoc comments\n if (line.startsWith(\"/**\") || line.startsWith(\"*\") || line.startsWith(\"*/\")) {\n i++;\n continue;\n }\n\n // Match prop definition: name?: Type or name: Type\n const propMatch = line.match(/^(\\w+)(\\?)?:\\s*(.+?)(?:;?\\s*)$/);\n if (propMatch) {\n const name = propMatch[1];\n const optional = !!propMatch[2];\n let type = propMatch[3].replace(/;$/, \"\").trim();\n\n // Check for default value in destructured defineProps\n const defaultPattern = new RegExp(`\\\\b${name}\\\\s*=\\\\s*([^,}\\\\n]+)`);\n const defaultMatch = scriptContent.match(defaultPattern);\n const defaultValue = defaultMatch ? defaultMatch[1].trim() : undefined;\n\n props.push({\n name,\n type,\n required: !optional && defaultValue === undefined,\n ...(defaultValue !== undefined ? { default_value: defaultValue } : {}),\n });\n }\n i++;\n }\n }\n\n // Extract defineEmits\n const emitsMatch = scriptContent.match(/defineEmits\\s*<\\s*\\{([\\s\\S]*?)\\}>/);\n if (emitsMatch) {\n const emitsBody = emitsMatch[1];\n const emitRegex = /(\\w+)\\s*:/g;\n let match;\n while ((match = emitRegex.exec(emitsBody)) !== null) {\n emits.push(match[1]);\n }\n }\n\n return { props, emits };\n } catch {\n return { props: [], emits: [] };\n }\n}\n","import path from \"node:path\";\n\nimport { resolveInsideAny } from \"./security.js\";\nimport type { ArtFileInfo } from \"./types/index.js\";\n\nexport function allowedSourceRoots(root: string, scanRoots: string[] = []): string[] {\n return [...new Set([root, ...scanRoots].map((sourceRoot) => path.resolve(sourceRoot)))];\n}\n\nexport function resolveComponentSourcePath(\n art: ArtFileInfo,\n artPath: string,\n sourceRoots: string[],\n): string | null {\n const componentPath =\n art.isInline && art.componentPath\n ? art.componentPath\n : art.metadata.component\n ? path.isAbsolute(art.metadata.component)\n ? art.metadata.component\n : path.resolve(path.dirname(artPath), art.metadata.component)\n : null;\n\n return componentPath ? resolveInsideAny(sourceRoots, componentPath, \"component path\") : null;\n}\n","/**\n * Shared utility functions for the Musea Vite plugin.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nimport type { ArtFileInfo } from \"./types/index.js\";\nimport { loadNative } from \"./native-loader.js\";\n\nfunction normalizeGlobPath(filepath: string): string {\n return filepath.split(path.sep).join(\"/\");\n}\n\nfunction matchesPattern(file: string, pattern: string, root: string): boolean {\n const normalizedPattern = normalizeGlobPath(pattern);\n const candidate = path.isAbsolute(pattern) ? path.resolve(file) : path.relative(root, file);\n return matchGlob(candidate, normalizedPattern);\n}\n\nexport function shouldProcess(\n file: string,\n include: string[],\n exclude: string[],\n root: string,\n): boolean {\n // Check exclude patterns\n for (const pattern of exclude) {\n if (matchesPattern(file, pattern, root)) {\n return false;\n }\n }\n\n // Check include patterns\n for (const pattern of include) {\n if (matchesPattern(file, pattern, root)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function matchGlob(filepath: string, pattern: string): boolean {\n const normalizedFilepath = normalizeGlobPath(filepath);\n const normalizedPattern = normalizeGlobPath(pattern);\n\n // Simple glob matching (supports * and **)\n // Use placeholder for ** to avoid * replacement interfering\n const PLACEHOLDER = \"<<GLOBSTAR>>\";\n const SEGMENT_PLACEHOLDER = \"<<GLOBSTAR_SEGMENT>>\";\n const regex = normalizedPattern\n .replaceAll(\"**/\", SEGMENT_PLACEHOLDER)\n .replaceAll(\"**\", PLACEHOLDER)\n .replace(/[|\\\\{}()[\\]^$+?.]/g, \"\\\\$&\")\n .replace(/\\*/g, \"[^/]*\")\n .replaceAll(SEGMENT_PLACEHOLDER, \"(?:.*/)?\")\n .replaceAll(PLACEHOLDER, \".*\");\n\n return new RegExp(`^${regex}$`).test(normalizedFilepath);\n}\n\nfunction resolveScanRoot(root: string, pattern: string): string {\n const absolutePattern = path.isAbsolute(pattern) ? pattern : path.resolve(root, pattern);\n const normalizedPattern = normalizeGlobPath(absolutePattern);\n const globIndex = normalizedPattern.search(/[*[{]/);\n\n if (globIndex === -1) {\n return path.dirname(absolutePattern);\n }\n\n const staticPrefix = normalizedPattern.slice(0, globIndex);\n if (!staticPrefix) {\n return root;\n }\n\n if (staticPrefix.endsWith(\"/\")) {\n return path.resolve(staticPrefix.slice(0, -1));\n }\n\n return path.resolve(path.dirname(staticPrefix));\n}\n\nexport function resolveScanRoots(root: string, include: string[]): string[] {\n const roots = new Set<string>();\n\n for (const pattern of include) {\n roots.add(resolveScanRoot(root, pattern));\n }\n\n if (roots.size === 0) {\n roots.add(root);\n }\n\n return [...roots];\n}\n\nexport async function scanArtFiles(\n root: string,\n include: string[],\n exclude: string[],\n scanInlineArt = false,\n): Promise<string[]> {\n const files = new Set<string>();\n const scanRoots = resolveScanRoots(root, include);\n const visitedDirs = new Set<string>();\n\n async function scan(dir: string): Promise<void> {\n const resolvedDir = path.resolve(dir);\n if (visitedDirs.has(resolvedDir)) {\n return;\n }\n visitedDirs.add(resolvedDir);\n\n let entries: fs.Dirent[];\n try {\n entries = await fs.promises.readdir(resolvedDir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const fullPath = path.join(resolvedDir, entry.name);\n\n // Check exclude\n let excluded = false;\n for (const pattern of exclude) {\n if (matchesPattern(fullPath, pattern, root) || matchGlob(entry.name, pattern)) {\n excluded = true;\n break;\n }\n }\n\n if (excluded) continue;\n\n if (entry.isDirectory()) {\n await scan(fullPath);\n } else if (entry.isFile() && entry.name.endsWith(\".art.vue\")) {\n if (shouldProcess(fullPath, include, exclude, root)) {\n files.add(fullPath);\n }\n } else if (\n scanInlineArt &&\n entry.isFile() &&\n entry.name.endsWith(\".vue\") &&\n !entry.name.endsWith(\".art.vue\")\n ) {\n // Inline art: check if .vue file contains <art block\n const content = await fs.promises.readFile(fullPath, \"utf-8\");\n if (content.includes(\"<art\")) {\n files.add(fullPath);\n }\n }\n }\n }\n\n for (const scanRoot of scanRoots) {\n await scan(scanRoot);\n }\n\n return [...files];\n}\n\nexport async function generateStorybookFiles(\n artFiles: Map<string, ArtFileInfo>,\n root: string,\n outDir: string,\n): Promise<void> {\n const binding = loadNative();\n const outputDir = path.resolve(root, outDir);\n\n // Ensure output directory exists\n await fs.promises.mkdir(outputDir, { recursive: true });\n\n for (const [filePath, _art] of artFiles) {\n try {\n const source = await fs.promises.readFile(filePath, \"utf-8\");\n const csf = binding.artToCsf(source, { filename: filePath });\n\n const outputPath = path.join(outputDir, csf.filename);\n await fs.promises.writeFile(outputPath, csf.code, \"utf-8\");\n\n console.log(`[musea] Generated: ${path.relative(root, outputPath)}`);\n } catch (e) {\n console.error(`[musea] Failed to generate CSF for ${filePath}:`, e);\n }\n }\n}\n\nexport function toPascalCase(str: string): string {\n const normalized = str\n .normalize(\"NFKD\")\n .replace(/[^\\p{L}\\p{N}]+/gu, \" \")\n .trim();\n const pascal = normalized\n .split(/\\s+/)\n .filter(Boolean)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\"\");\n\n if (!pascal) {\n return \"Variant\";\n }\n\n return /^[\\p{L}_$]/u.test(pascal) ? pascal : `Variant${pascal}`;\n}\n\nexport function escapeTemplate(str: string): string {\n return str.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\").replace(/\\n/g, \"\\\\n\");\n}\n\nexport function escapeHtml(str: string): string {\n return str\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\n/**\n * Build the theme config object from plugin options for runtime injection.\n */\nexport function buildThemeConfig(\n theme?:\n | string\n | { name: string; base?: \"dark\" | \"light\"; colors: Record<string, string> }\n | Array<{ name: string; base?: \"dark\" | \"light\"; colors: Record<string, string> }>,\n):\n | {\n default: string;\n custom?: Record<string, { base?: \"dark\" | \"light\"; colors: Record<string, string> }>;\n }\n | undefined {\n if (!theme) return undefined;\n\n if (typeof theme === \"string\") {\n // 'dark' | 'light' | 'system'\n return { default: theme };\n }\n\n // Single custom theme or array of custom themes\n const themes = Array.isArray(theme) ? theme : [theme];\n const custom: Record<string, { base?: \"dark\" | \"light\"; colors: Record<string, string> }> = {};\n for (const t of themes) {\n custom[t.name] = {\n base: t.base,\n colors: t.colors as Record<string, string>,\n };\n }\n return {\n default: themes[0].name,\n custom,\n };\n}\n","/**\n * Art module generation for Musea.\n *\n * Generates the virtual ES modules that represent parsed `.art.vue` files,\n * including variant component definitions and script setup handling.\n */\n\nimport path from \"node:path\";\n\nimport { allowedSourceRoots, resolveComponentSourcePath } from \"./component-source.js\";\nimport type { ArtFileInfo } from \"./types/index.js\";\nimport { escapeHtml, toPascalCase } from \"./utils.js\";\n\n/**\n * Extract the content of the first <script setup> block from a Vue SFC source.\n */\nexport function extractScriptSetupContent(source: string): string | undefined {\n const match = source.match(/<script\\s+[^>]*setup[^>]*>([\\s\\S]*?)<\\/script>/);\n return match?.[1]?.trim();\n}\n\nfunction resolveRelativeSpecifier(specifier: string, artDir: string): string {\n if (!specifier.startsWith(\".\")) {\n return specifier;\n }\n\n return path.resolve(artDir, specifier);\n}\n\nfunction rewriteRelativeImportStatement(statement: string, artDir: string): string {\n const rewrittenFromImports = statement.replace(\n /\\bfrom\\s+(['\"])([^'\"]+)\\1/g,\n (_match, quote: string, specifier: string) =>\n `from ${quote}${resolveRelativeSpecifier(specifier, artDir)}${quote}`,\n );\n\n return rewrittenFromImports.replace(\n /^(\\s*import\\s+)(['\"])([^'\"]+)\\2(\\s*;?\\s*)$/s,\n (_match, prefix: string, quote: string, specifier: string, suffix: string) =>\n `${prefix}${quote}${resolveRelativeSpecifier(specifier, artDir)}${quote}${suffix}`,\n );\n}\n\nfunction escapeTemplateLiteral(str: string): string {\n return str.replace(/\\\\/g, \"\\\\\\\\\").replace(/`/g, \"\\\\`\").replace(/\\$/g, \"\\\\$\");\n}\n\nfunction countCharBalance(source: string, openChar: string, closeChar: string): number {\n let balance = 0;\n for (const char of source) {\n if (char === openChar) balance++;\n else if (char === closeChar) balance--;\n }\n return balance;\n}\n\nfunction isCompleteImportStatement(statement: string): boolean {\n const trimmed = statement.trim();\n if (!trimmed.startsWith(\"import \")) {\n return false;\n }\n\n if (countCharBalance(statement, \"{\", \"}\") > 0) {\n return false;\n }\n\n return (\n /^import\\s+[\\s\\S]+?\\s+from\\s+['\"][^'\"]+['\"]\\s*;?$/s.test(trimmed) ||\n /^import\\s+['\"][^'\"]+['\"]\\s*;?$/s.test(trimmed)\n );\n}\n\nfunction splitTopLevelCommaList(source: string): string[] {\n const parts: string[] = [];\n let current = \"\";\n let braceDepth = 0;\n let bracketDepth = 0;\n let parenDepth = 0;\n\n for (const char of source) {\n if (char === \",\" && braceDepth === 0 && bracketDepth === 0 && parenDepth === 0) {\n const trimmed = current.trim();\n if (trimmed) {\n parts.push(trimmed);\n }\n current = \"\";\n continue;\n }\n\n current += char;\n\n if (char === \"{\") braceDepth++;\n else if (char === \"}\") braceDepth--;\n else if (char === \"[\") bracketDepth++;\n else if (char === \"]\") bracketDepth--;\n else if (char === \"(\") parenDepth++;\n else if (char === \")\") parenDepth--;\n }\n\n const trimmed = current.trim();\n if (trimmed) {\n parts.push(trimmed);\n }\n\n return parts;\n}\n\nfunction collectImportedNames(statement: string, returnNames: Set<string>): void {\n const normalized = statement.replace(/\\s+/g, \" \").trim().replace(/;$/, \"\");\n const fromMatch = normalized.match(/^import\\s+(type\\s+)?(.+?)\\s+from\\s+['\"][^'\"]+['\"]$/);\n\n if (!fromMatch) {\n return;\n }\n\n if (fromMatch[1]) {\n return;\n }\n\n const specifiers = fromMatch[2].trim();\n const specifierParts = splitTopLevelCommaList(specifiers);\n const defaultOrNamespace = specifierParts[0]?.trim() ?? \"\";\n const trailing = specifierParts.slice(1).join(\", \").trim();\n\n if (defaultOrNamespace && !defaultOrNamespace.startsWith(\"{\")) {\n const namespaceMatch = defaultOrNamespace.match(/^\\*\\s+as\\s+([A-Za-z_$][\\w$]*)$/);\n if (namespaceMatch) {\n returnNames.add(namespaceMatch[1]);\n } else if (!defaultOrNamespace.startsWith(\"type \")) {\n returnNames.add(defaultOrNamespace);\n }\n }\n\n const namedBlock = defaultOrNamespace.startsWith(\"{\")\n ? defaultOrNamespace\n : trailing.startsWith(\"{\")\n ? trailing\n : \"\";\n\n if (!namedBlock) {\n return;\n }\n\n const namedContent = namedBlock.slice(1, -1);\n for (const part of splitTopLevelCommaList(namedContent)) {\n const trimmed = part.trim();\n if (!trimmed || trimmed.startsWith(\"type \")) {\n continue;\n }\n\n const alias = trimmed\n .split(/\\s+as\\s+/)\n .pop()\n ?.trim();\n if (alias) {\n returnNames.add(alias);\n }\n }\n}\n\nfunction collectObjectDestructuredNames(statement: string, returnNames: Set<string>): void {\n const match = statement.match(/^(?:export\\s+)?(?:const|let|var)\\s+\\{([\\s\\S]*?)\\}\\s*=/);\n if (!match) {\n return;\n }\n\n for (const part of splitTopLevelCommaList(match[1])) {\n let name = part.trim();\n if (!name) {\n continue;\n }\n\n if (name.startsWith(\"...\")) {\n name = name.slice(3).trim();\n } else if (name.includes(\":\")) {\n name = name.split(\":\").pop()!.trim();\n } else if (name.includes(\"=\")) {\n name = name.split(\"=\")[0].trim();\n }\n\n if (name.includes(\"=\")) {\n name = name.split(\"=\")[0].trim();\n }\n\n if (/^[A-Za-z_$][\\w$]*$/.test(name)) {\n returnNames.add(name);\n }\n }\n}\n\nfunction collectArrayDestructuredNames(statement: string, returnNames: Set<string>): void {\n const match = statement.match(/^(?:export\\s+)?(?:const|let|var)\\s+\\[([\\s\\S]*?)\\]\\s*=/);\n if (!match) {\n return;\n }\n\n for (const part of splitTopLevelCommaList(match[1])) {\n let name = part.trim();\n if (!name) {\n continue;\n }\n\n if (name.startsWith(\"...\")) {\n name = name.slice(3).trim();\n }\n\n if (name.includes(\"=\")) {\n name = name.split(\"=\")[0].trim();\n }\n\n if (/^[A-Za-z_$][\\w$]*$/.test(name)) {\n returnNames.add(name);\n }\n }\n}\n\nfunction collectTopLevelReturnNames(setupBody: string[], returnNames: Set<string>): void {\n let braceDepth = 0;\n\n for (let i = 0; i < setupBody.length; i++) {\n const line = setupBody[i];\n const trimmed = line.trim();\n\n if (braceDepth === 0) {\n if (/^(?:export\\s+)?(?:const|let|var)\\s+\\{/.test(trimmed)) {\n const statementLines = [line];\n let balance =\n countCharBalance(line, \"{\", \"}\") +\n countCharBalance(line, \"[\", \"]\") +\n countCharBalance(line, \"(\", \")\");\n\n while (balance > 0 && i + 1 < setupBody.length) {\n i++;\n statementLines.push(setupBody[i]);\n balance +=\n countCharBalance(setupBody[i], \"{\", \"}\") +\n countCharBalance(setupBody[i], \"[\", \"]\") +\n countCharBalance(setupBody[i], \"(\", \")\");\n }\n\n collectObjectDestructuredNames(statementLines.join(\"\\n\"), returnNames);\n continue;\n }\n\n if (/^(?:export\\s+)?(?:const|let|var)\\s+\\[/.test(trimmed)) {\n const statementLines = [line];\n let balance =\n countCharBalance(line, \"{\", \"}\") +\n countCharBalance(line, \"[\", \"]\") +\n countCharBalance(line, \"(\", \")\");\n\n while (balance > 0 && i + 1 < setupBody.length) {\n i++;\n statementLines.push(setupBody[i]);\n balance +=\n countCharBalance(setupBody[i], \"{\", \"}\") +\n countCharBalance(setupBody[i], \"[\", \"]\") +\n countCharBalance(setupBody[i], \"(\", \")\");\n }\n\n collectArrayDestructuredNames(statementLines.join(\"\\n\"), returnNames);\n continue;\n }\n\n const constMatch = trimmed.match(/^(?:export\\s+)?(?:const|let|var)\\s+([A-Za-z_$][\\w$]*)/);\n if (constMatch) {\n returnNames.add(constMatch[1]);\n }\n\n const functionMatch = trimmed.match(\n /^(?:export\\s+)?(?:async\\s+)?function\\s+([A-Za-z_$][\\w$]*)\\s*\\(/,\n );\n if (functionMatch) {\n returnNames.add(functionMatch[1]);\n }\n\n const classMatch = trimmed.match(/^(?:export\\s+)?class\\s+([A-Za-z_$][\\w$]*)\\b/);\n if (classMatch) {\n returnNames.add(classMatch[1]);\n }\n }\n\n braceDepth += countCharBalance(line, \"{\", \"}\");\n }\n}\n\n/**\n * Parse script setup content into imports and setup body.\n * Returns the import lines, setup body lines, and all identifiers to expose.\n */\nexport function parseScriptSetupForArt(content: string): {\n imports: string[];\n setupBody: string[];\n returnNames: string[];\n} {\n const lines = content.split(\"\\n\");\n const imports: string[] = [];\n const setupBody: string[] = [];\n const returnNames: Set<string> = new Set();\n let currentImport: string[] | null = null;\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (currentImport) {\n currentImport.push(line);\n const statement = currentImport.join(\"\\n\");\n if (isCompleteImportStatement(statement)) {\n imports.push(statement);\n collectImportedNames(statement, returnNames);\n currentImport = null;\n }\n continue;\n }\n\n if (trimmed.startsWith(\"import \")) {\n currentImport = [line];\n const statement = currentImport.join(\"\\n\");\n if (isCompleteImportStatement(statement)) {\n imports.push(statement);\n collectImportedNames(statement, returnNames);\n currentImport = null;\n }\n continue;\n }\n\n setupBody.push(line);\n }\n\n if (currentImport) {\n const statement = currentImport.join(\"\\n\");\n imports.push(statement);\n collectImportedNames(statement, returnNames);\n }\n\n collectTopLevelReturnNames(setupBody, returnNames);\n\n // Remove 'type' keyword imports and common Vue utilities that shouldn't be returned\n returnNames.delete(\"type\");\n\n return {\n imports,\n setupBody,\n returnNames: [...returnNames],\n };\n}\n\ninterface GenerateArtModuleOptions {\n root?: string;\n scanRoots?: string[];\n}\n\nexport function generateArtModule(\n art: ArtFileInfo,\n filePath: string,\n options: GenerateArtModuleOptions = {},\n): string {\n let componentImportPath: string | undefined;\n let componentTagName: string | undefined;\n const componentBindingName = \"__MuseaComponent\";\n\n if (art.isInline && art.componentPath) {\n // Inline art: import the host .vue file itself as the component\n componentImportPath = options.root\n ? (resolveComponentSourcePath(\n art,\n filePath,\n allowedSourceRoots(options.root, options.scanRoots ?? []),\n ) ?? undefined)\n : art.componentPath;\n componentTagName = \"MuseaComponent\";\n } else if (art.metadata.component) {\n // Traditional .art.vue: resolve component from the component attribute\n componentImportPath = options.root\n ? (resolveComponentSourcePath(\n art,\n filePath,\n allowedSourceRoots(options.root, options.scanRoots ?? []),\n ) ?? undefined)\n : path.isAbsolute(art.metadata.component)\n ? art.metadata.component\n : path.resolve(path.dirname(filePath), art.metadata.component);\n componentTagName = \"MuseaComponent\";\n }\n\n // Parse script setup if present\n const scriptSetup = art.scriptSetupContent\n ? parseScriptSetupForArt(art.scriptSetupContent)\n : null;\n\n let code = `\n// Auto-generated module for: ${path.basename(filePath)}\nimport { defineComponent, h } from 'vue';\n`;\n\n // Add script setup imports at module level\n // Resolve relative paths to absolute since this code runs inside a virtual module\n if (scriptSetup) {\n const artDir = path.dirname(filePath);\n for (const imp of scriptSetup.imports) {\n const resolved = rewriteRelativeImportStatement(imp, artDir);\n code += `${resolved}\\n`;\n }\n }\n\n if (componentImportPath && componentTagName) {\n // Only add component import if not already imported by script setup\n const alreadyImported = scriptSetup?.imports.some((imp) =>\n new RegExp(`^import\\\\s+${componentBindingName}[\\\\s,]`).test(imp.trim()),\n );\n if (!alreadyImported) {\n code += `import ${componentBindingName} from ${JSON.stringify(componentImportPath)};\\n`;\n }\n code += `export const __component__ = ${componentBindingName};\\n`;\n }\n\n code += `\nexport const metadata = ${JSON.stringify(art.metadata)};\nexport const variants = ${JSON.stringify(art.variants)};\nexport const __styles__ = ${JSON.stringify(art.styleBlocks ?? [])};\n`;\n\n // Generate variant components\n for (const variant of art.variants) {\n const variantComponentName = toPascalCase(variant.name);\n\n let template = variant.template;\n\n // Replace <Self> with the actual component name (for inline art)\n if (componentTagName) {\n template = template\n .replace(/<Self/g, `<${componentTagName}`)\n .replace(/<\\/Self>/g, `</${componentTagName}>`);\n }\n\n // Escape the template for use in a JS string\n const escapedTemplate = escapeTemplateLiteral(template);\n const escapedVariantName = escapeTemplateLiteral(escapeHtml(variant.name));\n\n // Wrap template with the variant container (no .musea-variant class -- the\n // outer mount container already carries it; duplicating causes double padding)\n const fullTemplate = `<div data-variant=\"${escapedVariantName}\">${escapedTemplate}</div>`;\n\n // Collect component names for the `components` option.\n // Runtime-compiled templates use resolveComponent() which checks the\n // `components` option, NOT setup return values.\n const componentNames = new Map<string, string>();\n if (componentTagName) componentNames.set(componentTagName, componentBindingName);\n if (scriptSetup) {\n for (const name of scriptSetup.returnNames) {\n // PascalCase names starting with uppercase are likely components\n if (/^[A-Z]/.test(name)) componentNames.set(name, name);\n }\n }\n const components =\n componentNames.size > 0\n ? ` components: { ${[...componentNames]\n .map(([name, value]) => `${JSON.stringify(name)}: ${value}`)\n .join(\", \")} },\\n`\n : \"\";\n\n const hasSetupBody = scriptSetup?.setupBody.some((line) => line.trim().length > 0) ?? false;\n\n if (scriptSetup && (hasSetupBody || scriptSetup.returnNames.length > 0)) {\n // Generate variant with setup function from art file's <script setup>\n code += `\nexport const ${variantComponentName} = defineComponent({\n name: '${variantComponentName}',\n${components} setup() {\n${scriptSetup.setupBody.map((l) => ` ${l}`).join(\"\\n\")}\n return { ${scriptSetup.returnNames.join(\", \")} };\n },\n template: \\`${fullTemplate}\\`,\n});\n`;\n } else if (componentTagName) {\n code += `\nexport const ${variantComponentName} = {\n name: '${variantComponentName}',\n${components} template: \\`${fullTemplate}\\`,\n};\n`;\n } else {\n code += `\nexport const ${variantComponentName} = {\n name: '${variantComponentName}',\n template: \\`${fullTemplate}\\`,\n};\n`;\n }\n }\n\n // Default export\n const defaultVariant = art.variants.find((v) => v.isDefault) || art.variants[0];\n if (defaultVariant) {\n code += `\nexport default ${toPascalCase(defaultVariant.name)};\n`;\n }\n\n return code;\n}\n","/**\n * Addon initialization code for Musea preview iframes.\n *\n * Contains DOM event capture, measure overlay, and message handler logic\n * injected into preview modules.\n *\n * Extracted from preview.ts to keep file sizes manageable.\n */\n\n/**\n * Addon initialization code injected into preview iframe modules.\n * Shared between generatePreviewModule and generatePreviewModuleWithProps.\n */\nexport const MUSEA_ADDONS_INIT_CODE = `\nfunction __museaInitAddons(container, variantName, extraCaptureEvents = []) {\n // === DOM event capture ===\n // Note: wheel and hover-style events are excluded by default because they are too noisy.\n const BASE_CAPTURE_EVENTS = ['click','dblclick','input','change','submit','focus','blur','keydown','keyup','mousedown','mouseup','contextmenu','pointerdown','pointerup'];\n const CAPTURE_EVENTS = [...new Set([\n ...BASE_CAPTURE_EVENTS,\n ...((Array.isArray(extraCaptureEvents) ? extraCaptureEvents : [])\n .filter((eventName) => typeof eventName === 'string')\n .map((eventName) => eventName.trim())\n .filter(Boolean))\n ])];\n for (const evt of CAPTURE_EVENTS) {\n container.addEventListener(evt, (e) => {\n // Extract raw event properties\n const rawEvent = {\n type: e.type,\n bubbles: e.bubbles,\n cancelable: e.cancelable,\n composed: e.composed,\n defaultPrevented: e.defaultPrevented,\n eventPhase: e.eventPhase,\n isTrusted: e.isTrusted,\n timeStamp: e.timeStamp,\n };\n // Mouse/Pointer event properties\n if ('clientX' in e) {\n rawEvent.clientX = e.clientX;\n rawEvent.clientY = e.clientY;\n rawEvent.screenX = e.screenX;\n rawEvent.screenY = e.screenY;\n rawEvent.pageX = e.pageX;\n rawEvent.pageY = e.pageY;\n rawEvent.offsetX = e.offsetX;\n rawEvent.offsetY = e.offsetY;\n rawEvent.button = e.button;\n rawEvent.buttons = e.buttons;\n rawEvent.altKey = e.altKey;\n rawEvent.ctrlKey = e.ctrlKey;\n rawEvent.metaKey = e.metaKey;\n rawEvent.shiftKey = e.shiftKey;\n }\n // Keyboard event properties\n if ('key' in e) {\n rawEvent.key = e.key;\n rawEvent.code = e.code;\n rawEvent.repeat = e.repeat;\n rawEvent.altKey = e.altKey;\n rawEvent.ctrlKey = e.ctrlKey;\n rawEvent.metaKey = e.metaKey;\n rawEvent.shiftKey = e.shiftKey;\n }\n // Input event properties\n if ('inputType' in e) {\n rawEvent.inputType = e.inputType;\n rawEvent.data = e.data;\n }\n // Wheel event properties\n if ('deltaX' in e) {\n rawEvent.deltaX = e.deltaX;\n rawEvent.deltaY = e.deltaY;\n rawEvent.deltaZ = e.deltaZ;\n rawEvent.deltaMode = e.deltaMode;\n }\n const payload = {\n name: e.type,\n target: e.target?.tagName,\n timestamp: Date.now(),\n source: 'dom',\n rawEvent,\n variantName\n };\n if (e.target && 'value' in e.target) {\n payload.value = e.target.value;\n }\n window.parent.postMessage({ type: 'musea:event', payload }, '*');\n }, true);\n }\n\n // === Message handler for parent commands ===\n let measureActive = false;\n let measureOverlay = null;\n let measureLabel = null;\n\n function toggleStyleById(id, enabled, css) {\n let el = document.getElementById(id);\n if (enabled) {\n if (!el) {\n el = document.createElement('style');\n el.id = id;\n el.textContent = css;\n document.head.appendChild(el);\n }\n } else {\n if (el) el.remove();\n }\n }\n\n function createMeasureOverlay() {\n if (measureOverlay) return;\n measureOverlay = document.createElement('div');\n measureOverlay.id = 'musea-measure-overlay';\n measureOverlay.style.cssText = 'position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:99999;';\n document.body.appendChild(measureOverlay);\n\n measureLabel = document.createElement('div');\n measureLabel.className = 'musea-measure-label';\n measureLabel.style.cssText = 'position:fixed;background:#333;color:#fff;font-size:11px;padding:2px 6px;border-radius:3px;pointer-events:none;z-index:100000;display:none;';\n document.body.appendChild(measureLabel);\n }\n\n function removeMeasureOverlay() {\n if (measureOverlay) { measureOverlay.remove(); measureOverlay = null; }\n if (measureLabel) { measureLabel.remove(); measureLabel = null; }\n }\n\n function onMeasureMouseMove(e) {\n if (!measureActive || !measureOverlay) return;\n const el = document.elementFromPoint(e.clientX, e.clientY);\n if (!el || el === measureOverlay || el === measureLabel) return;\n\n const rect = el.getBoundingClientRect();\n const cs = getComputedStyle(el);\n const mt = parseFloat(cs.marginTop) || 0;\n const mr = parseFloat(cs.marginRight) || 0;\n const mb = parseFloat(cs.marginBottom) || 0;\n const ml = parseFloat(cs.marginLeft) || 0;\n const bt = parseFloat(cs.borderTopWidth) || 0;\n const br = parseFloat(cs.borderRightWidth) || 0;\n const bb = parseFloat(cs.borderBottomWidth) || 0;\n const blw = parseFloat(cs.borderLeftWidth) || 0;\n const pt = parseFloat(cs.paddingTop) || 0;\n const pr = parseFloat(cs.paddingRight) || 0;\n const pb = parseFloat(cs.paddingBottom) || 0;\n const pl = parseFloat(cs.paddingLeft) || 0;\n\n const cw = rect.width - blw - br - pl - pr;\n const ch = rect.height - bt - bb - pt - pb;\n\n measureOverlay.innerHTML = ''\n // Margin\n + '<div style=\"position:fixed;background:rgba(255,165,0,0.3);'\n + 'left:' + (rect.left - ml) + 'px;top:' + (rect.top - mt) + 'px;'\n + 'width:' + (rect.width + ml + mr) + 'px;height:' + mt + 'px;\"></div>'\n + '<div style=\"position:fixed;background:rgba(255,165,0,0.3);'\n + 'left:' + (rect.left - ml) + 'px;top:' + (rect.bottom) + 'px;'\n + 'width:' + (rect.width + ml + mr) + 'px;height:' + mb + 'px;\"></div>'\n + '<div style=\"position:fixed;background:rgba(255,165,0,0.3);'\n + 'left:' + (rect.left - ml) + 'px;top:' + rect.top + 'px;'\n + 'width:' + ml + 'px;height:' + rect.height + 'px;\"></div>'\n + '<div style=\"position:fixed;background:rgba(255,165,0,0.3);'\n + 'left:' + rect.right + 'px;top:' + rect.top + 'px;'\n + 'width:' + mr + 'px;height:' + rect.height + 'px;\"></div>'\n // Border\n + '<div style=\"position:fixed;background:rgba(255,255,0,0.3);'\n + 'left:' + rect.left + 'px;top:' + rect.top + 'px;'\n + 'width:' + rect.width + 'px;height:' + bt + 'px;\"></div>'\n + '<div style=\"position:fixed;background:rgba(255,255,0,0.3);'\n + 'left:' + rect.left + 'px;top:' + (rect.bottom - bb) + 'px;'\n + 'width:' + rect.width + 'px;height:' + bb + 'px;\"></div>'\n + '<div style=\"position:fixed;background:rgba(255,255,0,0.3);'\n + 'left:' + rect.left + 'px;top:' + (rect.top + bt) + 'px;'\n + 'width:' + blw + 'px;height:' + (rect.height - bt - bb) + 'px;\"></div>'\n + '<div style=\"position:fixed;background:rgba(255,255,0,0.3);'\n + 'left:' + (rect.right - br) + 'px;top:' + (rect.top + bt) + 'px;'\n + 'width:' + br + 'px;height:' + (rect.height - bt - bb) + 'px;\"></div>'\n // Padding\n + '<div style=\"position:fixed;background:rgba(144,238,144,0.3);'\n + 'left:' + (rect.left + blw) + 'px;top:' + (rect.top + bt) + 'px;'\n + 'width:' + (rect.width - blw - br) + 'px;height:' + pt + 'px;\"></div>'\n + '<div style=\"position:fixed;background:rgba(144,238,144,0.3);'\n + 'left:' + (rect.left + blw) + 'px;top:' + (rect.bottom - bb - pb) + 'px;'\n + 'width:' + (rect.width - blw - br) + 'px;height:' + pb + 'px;\"></div>'\n + '<div style=\"position:fixed;background:rgba(144,238,144,0.3);'\n + 'left:' + (rect.left + blw) + 'px;top:' + (rect.top + bt + pt) + 'px;'\n + 'width:' + pl + 'px;height:' + (rect.height - bt - bb - pt - pb) + 'px;\"></div>'\n + '<div style=\"position:fixed;background:rgba(144,238,144,0.3);'\n + 'left:' + (rect.right - br - pr) + 'px;top:' + (rect.top + bt + pt) + 'px;'\n + 'width:' + pr + 'px;height:' + (rect.height - bt - bb - pt - pb) + 'px;\"></div>'\n // Content\n + '<div style=\"position:fixed;background:rgba(100,149,237,0.3);'\n + 'left:' + (rect.left + blw + pl) + 'px;top:' + (rect.top + bt + pt) + 'px;'\n + 'width:' + cw + 'px;height:' + ch + 'px;\"></div>';\n\n // Label\n measureLabel.textContent = Math.round(rect.width) + ' x ' + Math.round(rect.height);\n measureLabel.style.display = 'block';\n measureLabel.style.left = (rect.right + 8) + 'px';\n measureLabel.style.top = rect.top + 'px';\n }\n\n window.addEventListener('message', (e) => {\n if (!e.data?.type?.startsWith('musea:')) return;\n const { type, payload } = e.data;\n switch (type) {\n case 'musea:set-background': {\n if (payload.pattern === 'checkerboard') {\n document.body.style.background = '';\n document.body.classList.add('musea-bg-checkerboard');\n } else {\n document.body.classList.remove('musea-bg-checkerboard');\n document.body.style.background = payload.color || '';\n }\n break;\n }\n case 'musea:toggle-outline': {\n toggleStyleById('musea-outline', payload.enabled,\n '* { outline: 1px solid rgba(255, 0, 0, 0.3) !important; }');\n break;\n }\n case 'musea:toggle-measure': {\n measureActive = payload.enabled;\n if (measureActive) {\n createMeasureOverlay();\n document.addEventListener('mousemove', onMeasureMouseMove);\n } else {\n document.removeEventListener('mousemove', onMeasureMouseMove);\n removeMeasureOverlay();\n }\n break;\n }\n case 'musea:set-props': {\n // Store props for remount - handled by preview module\n if (window.__museaSetProps) {\n window.__museaSetProps(payload.props || {});\n }\n break;\n }\n case 'musea:set-slots': {\n // Store slots for remount - handled by preview module\n if (window.__museaSetSlots) {\n window.__museaSetSlots(payload.slots || {});\n }\n break;\n }\n case 'musea:run-a11y': {\n // Run axe-core a11y test\n const requestId = typeof payload?.requestId === 'string' ? payload.requestId : undefined;\n (async () => {\n try {\n // Dynamically load axe-core from local vendor route if not already loaded\n if (!window.axe) {\n const script = document.createElement('script');\n const _basePath = location.pathname.replace(/\\\\/preview$/, '');\n script.src = _basePath + '/vendor/axe-core.min.js';\n await new Promise((resolve, reject) => {\n script.onload = resolve;\n script.onerror = reject;\n document.head.appendChild(script);\n });\n }\n // Run axe-core on the .musea-variant container only (not the full document)\n const context = document.querySelector('.musea-variant') || document;\n const results = await window.axe.run(context, {\n // Run all rules without restrictions for comprehensive testing\n resultTypes: ['violations', 'incomplete', 'passes']\n });\n window.parent.postMessage({\n type: 'musea:a11y-result',\n payload: {\n requestId,\n violations: results.violations.map(v => ({\n id: v.id,\n impact: v.impact,\n description: v.description,\n helpUrl: v.helpUrl,\n nodes: v.nodes.map(n => ({\n html: n.html,\n target: n.target,\n failureSummary: n.failureSummary\n }))\n })),\n passes: results.passes.length,\n incomplete: results.incomplete.length\n }\n }, '*');\n } catch (err) {\n window.parent.postMessage({\n type: 'musea:a11y-result',\n payload: {\n requestId,\n error: err instanceof Error ? err.message : String(err),\n violations: [],\n passes: 0,\n incomplete: 0\n }\n }, '*');\n }\n })();\n break;\n }\n }\n });\n\n // Notify parent that iframe is ready\n window.parent.postMessage({ type: 'musea:ready', payload: {} }, '*');\n}\n`;\n","/**\n * Preview HTML page generation for Musea component previews.\n *\n * Generates the HTML wrapper pages that host Vue component previews\n * inside iframes.\n *\n * Extracted from preview.ts to keep file sizes manageable.\n */\n\nimport type { ArtFileInfo, ArtVariant } from \"../types/index.js\";\nimport { escapeHtml } from \"../utils.js\";\n\nexport function generatePreviewHtml(\n art: ArtFileInfo,\n variant: ArtVariant,\n _basePath: string,\n viteBase?: string,\n): string {\n // Use preview-module HTTP endpoint instead of virtual module import.\n // Virtual module imports in inline scripts require transformIndexHtml,\n // which creates malformed html-proxy URLs when the page URL has query params.\n const previewModuleUrl = `${_basePath}/preview-module?art=${encodeURIComponent(art.path)}&variant=${encodeURIComponent(variant.name)}`;\n const base = (viteBase || \"/\").replace(/\\/$/, \"\");\n\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.0\">\n <title>${escapeHtml(art.metadata.title)} - ${escapeHtml(variant.name)}</title>\n <script type=\"module\" src=\"${base}/@vite/client\"></script>\n <style>\n * { box-sizing: border-box; margin: 0; padding: 0; }\n :root {\n --musea-preview-padding: clamp(1rem, 2vw, 1.5rem);\n }\n html, body {\n width: 100%;\n height: 100%;\n }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: #ffffff;\n padding: var(--musea-preview-padding);\n overflow: auto;\n }\n .musea-variant {\n width: 100%;\n min-height: calc(100vh - (var(--musea-preview-padding) * 2));\n }\n .musea-error {\n color: #dc2626;\n background: #fef2f2;\n border: 1px solid #fecaca;\n border-radius: 8px;\n padding: 1rem;\n font-size: 0.875rem;\n max-width: 400px;\n }\n .musea-error-title {\n font-weight: 600;\n margin-bottom: 0.5rem;\n }\n .musea-error pre {\n font-family: monospace;\n font-size: 0.75rem;\n white-space: pre-wrap;\n word-break: break-all;\n margin-top: 0.5rem;\n padding: 0.5rem;\n background: #fff;\n border-radius: 4px;\n }\n .musea-loading {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n color: #6b7280;\n font-size: 0.875rem;\n }\n .musea-spinner {\n width: 20px;\n height: 20px;\n border: 2px solid #e5e7eb;\n border-top-color: #3b82f6;\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n }\n @keyframes spin { to { transform: rotate(360deg); } }\n\n /* Musea Addons: Checkerboard background for transparent mode */\n .musea-bg-checkerboard {\n background-image:\n linear-gradient(45deg, #ccc 25%, transparent 25%),\n linear-gradient(-45deg, #ccc 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, #ccc 75%),\n linear-gradient(-45deg, transparent 75%, #ccc 75%) !important;\n background-size: 20px 20px !important;\n background-position: 0 0, 0 10px, 10px -10px, -10px 0 !important;\n }\n\n /* Musea Addons: Measure label */\n .musea-measure-label {\n position: fixed;\n background: #333;\n color: #fff;\n font-size: 11px;\n padding: 2px 6px;\n border-radius: 3px;\n pointer-events: none;\n z-index: 100000;\n }\n </style>\n</head>\n<body>\n <div id=\"app\" class=\"musea-variant\" data-art=\"${escapeHtml(art.path)}\" data-variant=\"${escapeHtml(variant.name)}\">\n <div class=\"musea-loading\">\n <div class=\"musea-spinner\"></div>\n Loading component...\n </div>\n </div>\n <script type=\"module\" src=\"${previewModuleUrl}\"></script>\n</body>\n</html>`;\n}\n","/**\n * Preview module and HTML generation for Musea component previews.\n *\n * Generates the JavaScript modules that mount Vue components in preview iframes,\n * as well as the HTML wrapper pages for those previews.\n */\n\nimport type { ArtFileInfo } from \"../types/index.js\";\nimport { MUSEA_ADDONS_INIT_CODE } from \"./addons.js\";\n\nexport { generatePreviewHtml } from \"./html.js\";\n\nexport function generatePreviewModule(\n art: ArtFileInfo,\n variantComponentName: string,\n variantName: string,\n cssImports: string[] = [],\n previewSetup: string | null = null,\n): string {\n const artModuleId = `virtual:musea-art:${art.path}`;\n const artModuleIdLiteral = JSON.stringify(artModuleId);\n const variantNameLiteral = JSON.stringify(variantName);\n const variantComponentNameLiteral = JSON.stringify(variantComponentName);\n const cssImportStatements = cssImports\n .map((cssPath) => `import ${JSON.stringify(cssPath)};`)\n .join(\"\\n\");\n const setupImport = previewSetup\n ? `import __museaPreviewSetup from ${JSON.stringify(previewSetup)};`\n : \"\";\n const setupCall = previewSetup ? \"await __museaPreviewSetup(app);\" : \"\";\n const actionEvents = JSON.stringify(art.metadata.actionEvents ?? []);\n const artStyleId = `musea-art-styles-${art.path.replace(/[^\\w-]+/g, \"_\")}`;\n const artStyleIdLiteral = JSON.stringify(artStyleId);\n\n return `\n${cssImportStatements}\n${setupImport}\nimport { createApp, reactive, h } from 'vue';\nimport * as artModule from ${artModuleIdLiteral};\n\nconst container = document.getElementById('app');\n\n${MUSEA_ADDONS_INIT_CODE}\n\nlet currentApp = null;\nconst propsOverride = reactive({});\nconst slotsOverride = reactive({ default: '' });\n\nfunction ensureArtStyles(styles) {\n const styleId = ${artStyleIdLiteral};\n const existing = document.getElementById(styleId);\n\n if (!Array.isArray(styles) || styles.length === 0) {\n existing?.remove();\n return;\n }\n\n const tag = existing ?? document.createElement('style');\n tag.id = styleId;\n tag.textContent = styles.join('\\\\n\\\\n');\n\n if (!existing) {\n document.head.appendChild(tag);\n }\n}\n\nfunction renderError(title, error) {\n container.textContent = '';\n const root = document.createElement('div');\n root.className = 'musea-error';\n\n const titleEl = document.createElement('div');\n titleEl.className = 'musea-error-title';\n titleEl.textContent = title;\n root.appendChild(titleEl);\n\n const messageEl = document.createElement('div');\n messageEl.textContent = error instanceof Error ? error.message : String(error);\n root.appendChild(messageEl);\n\n const stack = error instanceof Error ? error.stack : '';\n if (stack) {\n const stackEl = document.createElement('pre');\n stackEl.textContent = stack;\n root.appendChild(stackEl);\n }\n\n container.appendChild(root);\n}\n\nwindow.__museaSetProps = (props) => {\n // Clear old keys\n for (const key of Object.keys(propsOverride)) {\n delete propsOverride[key];\n }\n Object.assign(propsOverride, props);\n};\n\nwindow.__museaSetSlots = (slots) => {\n for (const key of Object.keys(slotsOverride)) {\n delete slotsOverride[key];\n }\n Object.assign(slotsOverride, slots);\n};\n\nasync function mount() {\n try {\n // Get the specific variant component\n const VariantComponent = artModule[${variantComponentNameLiteral}];\n const RawComponent = artModule.__component__;\n\n if (!VariantComponent) {\n throw new Error('Variant component ' + ${variantComponentNameLiteral} + ' not found in art module');\n }\n\n // Create and mount the app\n const app = createApp(VariantComponent);\n ensureArtStyles(artModule.__styles__);\n ${setupCall}\n container.innerHTML = '';\n container.className = 'musea-variant';\n app.mount(container);\n currentApp = app;\n\n console.log('[musea-preview] Mounted variant:', ${variantNameLiteral});\n __museaInitAddons(container, ${variantNameLiteral}, ${actionEvents});\n\n // Override set-props to remount with raw component + props\n const TargetComponent = RawComponent || VariantComponent;\n window.__museaSetProps = (props) => {\n for (const key of Object.keys(propsOverride)) {\n delete propsOverride[key];\n }\n Object.assign(propsOverride, props);\n remountWithProps(TargetComponent);\n };\n window.__museaSetSlots = (slots) => {\n for (const key of Object.keys(slotsOverride)) {\n delete slotsOverride[key];\n }\n Object.assign(slotsOverride, slots);\n remountWithProps(TargetComponent);\n };\n } catch (error) {\n console.error('[musea-preview] Failed to mount:', error);\n renderError('Failed to render component', error);\n }\n}\n\nasync function remountWithProps(Component) {\n if (currentApp) {\n currentApp.unmount();\n }\n const app = createApp({\n setup() {\n return () => {\n const slotFns = {};\n for (const [name, content] of Object.entries(slotsOverride)) {\n if (content) slotFns[name] = () => h('span', String(content));\n }\n return h(Component, { ...propsOverride }, slotFns);\n };\n }\n });\n ensureArtStyles(artModule.__styles__);\n ${setupCall}\n container.innerHTML = '';\n app.mount(container);\n currentApp = app;\n}\n\nmount();\n`;\n}\n\nexport function generatePreviewModuleWithProps(\n art: ArtFileInfo,\n variantComponentName: string,\n variantName: string,\n propsOverride: Record<string, unknown>,\n cssImports: string[] = [],\n previewSetup: string | null = null,\n): string {\n const artModuleId = `virtual:musea-art:${art.path}`;\n const artModuleIdLiteral = JSON.stringify(artModuleId);\n const variantNameLiteral = JSON.stringify(variantName);\n const variantComponentNameLiteral = JSON.stringify(variantComponentName);\n const propsJson = JSON.stringify(propsOverride);\n const cssImportStatements = cssImports\n .map((cssPath) => `import ${JSON.stringify(cssPath)};`)\n .join(\"\\n\");\n const setupImport = previewSetup\n ? `import __museaPreviewSetup from ${JSON.stringify(previewSetup)};`\n : \"\";\n const setupCall = previewSetup ? \"await __museaPreviewSetup(app);\" : \"\";\n const actionEvents = JSON.stringify(art.metadata.actionEvents ?? []);\n const artStyleId = `musea-art-styles-${art.path.replace(/[^\\w-]+/g, \"_\")}`;\n const artStyleIdLiteral = JSON.stringify(artStyleId);\n\n return `\n${cssImportStatements}\n${setupImport}\nimport { createApp, h } from 'vue';\nimport * as artModule from ${artModuleIdLiteral};\n\nconst container = document.getElementById('app');\nconst propsOverride = ${propsJson};\n\n${MUSEA_ADDONS_INIT_CODE}\n\nfunction ensureArtStyles(styles) {\n const styleId = ${artStyleIdLiteral};\n const existing = document.getElementById(styleId);\n\n if (!Array.isArray(styles) || styles.length === 0) {\n existing?.remove();\n return;\n }\n\n const tag = existing ?? document.createElement('style');\n tag.id = styleId;\n tag.textContent = styles.join('\\\\n\\\\n');\n\n if (!existing) {\n document.head.appendChild(tag);\n }\n}\n\nfunction renderError(title, error) {\n container.textContent = '';\n const root = document.createElement('div');\n root.className = 'musea-error';\n\n const titleEl = document.createElement('div');\n titleEl.className = 'musea-error-title';\n titleEl.textContent = title;\n root.appendChild(titleEl);\n\n const messageEl = document.createElement('div');\n messageEl.textContent = error instanceof Error ? error.message : String(error);\n root.appendChild(messageEl);\n\n container.appendChild(root);\n}\n\nasync function mount() {\n try {\n const VariantComponent = artModule[${variantComponentNameLiteral}];\n if (!VariantComponent) {\n throw new Error('Variant component ' + ${variantComponentNameLiteral} + ' not found');\n }\n\n const WrappedComponent = {\n render() {\n return h(VariantComponent, propsOverride);\n }\n };\n\n const app = createApp(WrappedComponent);\n ensureArtStyles(artModule.__styles__);\n ${setupCall}\n container.innerHTML = '';\n container.className = 'musea-variant';\n app.mount(container);\n console.log('[musea-preview] Mounted variant with props override:', ${variantNameLiteral});\n __museaInitAddons(container, ${variantNameLiteral}, ${actionEvents});\n } catch (error) {\n console.error('[musea-preview] Failed to mount:', error);\n renderError('Failed to render', error);\n }\n}\n\nmount();\n`;\n}\n","/**\n * Musea dev server middleware handlers.\n *\n * Extracted from the main plugin to keep file sizes manageable.\n * Provides middleware for the gallery SPA, static assets, preview rendering,\n * and art module serving.\n */\n\nimport type { ViteDevServer } from \"vite\";\nimport { createRequire } from \"node:module\";\nimport fs from \"node:fs\";\nimport type { ServerResponse } from \"node:http\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport type { ArtFileInfo } from \"./types/index.js\";\nimport { generatePreviewModule, generatePreviewHtml } from \"./preview/index.js\";\nimport { generateArtModule } from \"./art-module.js\";\nimport {\n decodeUrlComponent,\n HttpError,\n resolveUrlPathInside,\n serializeScriptValue,\n} from \"./security.js\";\nimport { toPascalCase } from \"./utils.js\";\n\nconst moduleDir = path.dirname(fileURLToPath(import.meta.url));\nconst galleryAssetMimeTypes: Record<string, string> = {\n \".js\": \"application/javascript\",\n \".css\": \"text/css\",\n \".svg\": \"image/svg+xml\",\n \".png\": \"image/png\",\n \".ico\": \"image/x-icon\",\n \".woff2\": \"font/woff2\",\n \".woff\": \"font/woff\",\n};\n\nfunction resolveGalleryDistDir(): string {\n return path.resolve(moduleDir, \"gallery\");\n}\n\nfunction resolveGallerySourceDir(): string {\n return path.resolve(moduleDir, \"../gallery\");\n}\n\nfunction toViteFsPath(filePath: string): string {\n return encodeURI(`/@fs${filePath.split(path.sep).join(\"/\")}`);\n}\n\nfunction generateDevGlobalsScript(\n basePath: string,\n devSessionToken: string,\n themeConfig?: { default: string; custom?: Record<string, unknown> },\n): string {\n const themeScript = themeConfig\n ? `window.__MUSEA_THEME_CONFIG__=${serializeScriptValue(themeConfig)};`\n : \"\";\n return `window.__MUSEA_BASE_PATH__=${serializeScriptValue(basePath)};window.__MUSEA_SESSION_TOKEN__=${serializeScriptValue(devSessionToken)};${themeScript}`;\n}\n\nasync function tryLoadSourceGalleryHtml(\n devServer: ViteDevServer,\n url: string,\n basePath: string,\n devSessionToken: string,\n themeConfig?: { default: string; custom?: Record<string, unknown> },\n): Promise<string | null> {\n const gallerySourceDir = resolveGallerySourceDir();\n const indexHtmlPath = path.join(gallerySourceDir, \"index.html\");\n\n try {\n await fs.promises.access(indexHtmlPath);\n } catch {\n return null;\n }\n\n const sourceEntryPath = toViteFsPath(path.join(gallerySourceDir, \"main.ts\"));\n\n let html = await fs.promises.readFile(indexHtmlPath, \"utf-8\");\n html = html.replace('src=\"./main.ts\"', `src=\"${sourceEntryPath}\"`);\n html = html.replace(\n \"</head>\",\n `<script>${generateDevGlobalsScript(basePath, devSessionToken, themeConfig)}</script></head>`,\n );\n\n return devServer.transformIndexHtml(url, html);\n}\n\nasync function generateFallbackGalleryHtml(\n basePath: string,\n devSessionToken: string,\n themeConfig?: { default: string; custom?: Record<string, unknown> },\n): Promise<string> {\n const { generateGalleryHtml } = await import(\"./gallery/index.js\");\n return generateGalleryHtml(basePath, devSessionToken, themeConfig);\n}\n\nexport async function serveGalleryAsset(\n galleryDistDir: string,\n requestUrl: string,\n res: ServerResponse,\n): Promise<boolean> {\n try {\n const filePath = resolveUrlPathInside(galleryDistDir, requestUrl, \"asset path\");\n const stat = await fs.promises.stat(filePath);\n if (!stat.isFile()) {\n return false;\n }\n\n const content = await fs.promises.readFile(filePath);\n const ext = path.extname(filePath);\n res.setHeader(\"Content-Type\", galleryAssetMimeTypes[ext] || \"application/octet-stream\");\n res.setHeader(\"Cache-Control\", \"public, max-age=31536000, immutable\");\n res.end(content);\n return true;\n } catch (error) {\n if (error instanceof HttpError) {\n res.statusCode = error.status;\n res.end(error.message);\n return true;\n }\n return false;\n }\n}\n\n/** Dependencies injected from the plugin closure. */\nexport interface MiddlewareContext {\n basePath: string;\n devSessionToken: string;\n themeConfig: { default: string; custom?: Record<string, unknown> } | undefined;\n artFiles: Map<string, ArtFileInfo>;\n scanRoots: string[];\n resolvedPreviewCss: string[];\n resolvedPreviewSetup: string | null;\n}\n\n/**\n * Register all Musea middleware on the given dev server.\n *\n * This sets up:\n * - Gallery SPA route (serves built SPA or inline HTML fallback)\n * - Gallery static assets (/assets/)\n * - axe-core vendor script\n * - Preview module route\n * - VRT preview route\n * - Art module route\n */\nexport function registerMiddleware(devServer: ViteDevServer, ctx: MiddlewareContext): void {\n const { basePath, devSessionToken, themeConfig, artFiles } = ctx;\n\n // --- Gallery SPA route ---\n devServer.middlewares.use(basePath, async (req, res, next) => {\n const url = req.url || \"/\";\n\n if (\n url === \"/\" ||\n url === \"/index.html\" ||\n url.startsWith(\"/tokens\") ||\n url.startsWith(\"/component/\") ||\n url.startsWith(\"/tests\")\n ) {\n const galleryDistDir = resolveGalleryDistDir();\n const indexHtmlPath = path.join(galleryDistDir, \"index.html\");\n\n try {\n await fs.promises.access(indexHtmlPath);\n let html = await fs.promises.readFile(indexHtmlPath, \"utf-8\");\n html = html.replace(\n \"</head>\",\n `<script>${generateDevGlobalsScript(basePath, devSessionToken, themeConfig)}</script></head>`,\n );\n res.setHeader(\"Content-Type\", \"text/html\");\n res.end(html);\n return;\n } catch {\n const sourceHtml = await tryLoadSourceGalleryHtml(\n devServer,\n url,\n basePath,\n devSessionToken,\n themeConfig,\n );\n if (sourceHtml) {\n res.setHeader(\"Content-Type\", \"text/html\");\n res.end(sourceHtml);\n return;\n }\n\n const html = await generateFallbackGalleryHtml(basePath, devSessionToken, themeConfig);\n res.setHeader(\"Content-Type\", \"text/html\");\n res.end(html);\n return;\n }\n }\n\n // Serve gallery static assets (JS, CSS) from built SPA\n if (url.startsWith(\"/assets/\")) {\n if (await serveGalleryAsset(resolveGalleryDistDir(), url, res)) {\n return;\n }\n }\n\n next();\n });\n\n // --- axe-core vendor script ---\n devServer.middlewares.use(`${basePath}/vendor/axe-core.min.js`, async (_req, res, _next) => {\n try {\n const require = createRequire(import.meta.url);\n const axeCorePath = require.resolve(\"axe-core/axe.min.js\");\n const content = await fs.promises.readFile(axeCorePath, \"utf-8\");\n res.setHeader(\"Content-Type\", \"application/javascript\");\n res.setHeader(\"Cache-Control\", \"public, max-age=86400\");\n res.end(content);\n } catch {\n res.statusCode = 404;\n res.end(\"axe-core not installed\");\n }\n });\n\n // --- Preview module route ---\n devServer.middlewares.use(`${basePath}/preview-module`, async (req, res, _next) => {\n const url = new URL(req.url || \"\", `http://localhost`);\n const artPath = url.searchParams.get(\"art\");\n const variantName = url.searchParams.get(\"variant\");\n\n if (!artPath || !variantName) {\n res.statusCode = 400;\n res.end(\"Missing art or variant parameter\");\n return;\n }\n\n const art = artFiles.get(artPath);\n if (!art) {\n res.statusCode = 404;\n res.end(\"Art not found\");\n return;\n }\n\n const variant = art.variants.find((v) => v.name === variantName);\n if (!variant) {\n res.statusCode = 404;\n res.end(\"Variant not found\");\n return;\n }\n\n const variantComponentName = toPascalCase(variant.name);\n const moduleCode = generatePreviewModule(\n art,\n variantComponentName,\n variant.name,\n ctx.resolvedPreviewCss,\n ctx.resolvedPreviewSetup,\n );\n\n try {\n const result = await devServer.transformRequest(\n `virtual:musea-preview:${artPath}:${variantName}`,\n );\n if (result) {\n res.setHeader(\"Content-Type\", \"application/javascript\");\n res.setHeader(\"Cache-Control\", \"no-cache\");\n res.end(result.code);\n return;\n }\n } catch {\n // Fall through to manual response\n }\n\n res.setHeader(\"Content-Type\", \"application/javascript\");\n res.setHeader(\"Cache-Control\", \"no-cache\");\n res.end(moduleCode);\n });\n\n // --- VRT preview route ---\n devServer.middlewares.use(`${basePath}/preview`, async (req, res, _next) => {\n const url = new URL(req.url || \"\", `http://localhost`);\n const artPath = url.searchParams.get(\"art\");\n const variantName = url.searchParams.get(\"variant\");\n\n if (!artPath || !variantName) {\n res.statusCode = 400;\n res.end(\"Missing art or variant parameter\");\n return;\n }\n\n const art = artFiles.get(artPath);\n if (!art) {\n res.statusCode = 404;\n res.end(\"Art not found\");\n return;\n }\n\n const variant = art.variants.find((v) => v.name === variantName);\n if (!variant) {\n res.statusCode = 404;\n res.end(\"Variant not found\");\n return;\n }\n\n const config = devServer.config;\n const html = generatePreviewHtml(art, variant, basePath, config.base);\n res.setHeader(\"Content-Type\", \"text/html\");\n res.end(html);\n });\n\n // --- Art module route ---\n devServer.middlewares.use(`${basePath}/art`, async (req, res, next) => {\n const url = new URL(req.url || \"\", \"http://localhost\");\n let artPath: string;\n try {\n artPath = decodeUrlComponent(url.pathname.slice(1), \"art path\");\n } catch (error) {\n if (error instanceof HttpError) {\n res.statusCode = error.status;\n res.end(error.message);\n return;\n }\n throw error;\n }\n\n if (!artPath) {\n next();\n return;\n }\n\n const art = artFiles.get(artPath);\n if (!art) {\n res.statusCode = 404;\n res.end(\"Art not found: \" + artPath);\n return;\n }\n\n try {\n const virtualId = `virtual:musea-art:${artPath}`;\n const result = await devServer.transformRequest(virtualId);\n if (result) {\n res.setHeader(\"Content-Type\", \"application/javascript\");\n res.setHeader(\"Cache-Control\", \"no-cache\");\n res.end(result.code);\n } else {\n const moduleCode = generateArtModule(art, artPath, {\n root: devServer.config.root,\n scanRoots: ctx.scanRoots,\n });\n res.setHeader(\"Content-Type\", \"application/javascript\");\n res.end(moduleCode);\n }\n } catch (err) {\n console.error(\"[musea] Failed to transform art module:\", err);\n const moduleCode = generateArtModule(art, artPath, {\n root: devServer.config.root,\n scanRoots: ctx.scanRoots,\n });\n res.setHeader(\"Content-Type\", \"application/javascript\");\n res.end(moduleCode);\n }\n });\n}\n","import { loadNative } from \"../native-loader.js\";\nimport type { DesignToken, TokenCategory } from \"./parser.js\";\n\ninterface ResolvedTokensNative {\n categories: TokenCategory[];\n tokenMap: Record<string, DesignToken>;\n tokenCount: number;\n primitiveCount: number;\n semanticCount: number;\n}\n\ninterface ValidationResultNative {\n valid: boolean;\n error?: string;\n}\n\ninterface TokenNativeBinding {\n parseDesignTokensFromPath(path: string): TokenCategory[];\n buildDesignTokenMap(categories: TokenCategory[]): Record<string, DesignToken>;\n resolveDesignTokenReferences(categories: TokenCategory[]): ResolvedTokensNative;\n flattenDesignTokenCategories(categories: TokenCategory[]): unknown[];\n generateDesignTokensMarkdown(categories: TokenCategory[], generatedAt?: string): string;\n validateDesignTokenReference(\n tokenMap: Record<string, DesignToken>,\n reference: string,\n selfPath?: string,\n ): ValidationResultNative;\n findDependentDesignTokens(tokenMap: Record<string, DesignToken>, targetPath: string): string[];\n}\n\nexport function tokenNative(): TokenNativeBinding {\n return loadNative() as typeof loadNative extends () => infer T ? T & TokenNativeBinding : never;\n}\n\nexport function normalizeCategories(categories: TokenCategory[]): TokenCategory[] {\n for (const category of categories) {\n category.tokens = nullRecord(category.tokens);\n if (category.subcategories) {\n normalizeCategories(category.subcategories);\n }\n }\n return categories;\n}\n\nexport function nullRecord<T>(record: Record<string, T>): Record<string, T> {\n return Object.assign(Object.create(null) as Record<string, T>, record);\n}\n","/**\n * Token parsing utilities for Style Dictionary integration.\n *\n * Thin native binding for design token files (JSON) and directories.\n */\n\nimport { normalizeCategories, tokenNative } from \"./native.js\";\n\n/**\n * Design token value.\n */\nexport interface DesignToken {\n value: string | number;\n type?: string;\n description?: string;\n attributes?: Record<string, unknown>;\n $tier?: \"primitive\" | \"semantic\";\n $reference?: string;\n $resolvedValue?: string | number;\n}\n\n/**\n * Token category (e.g., colors, spacing, typography).\n */\nexport interface TokenCategory {\n name: string;\n tokens: Record<string, DesignToken>;\n subcategories?: TokenCategory[];\n}\n\n/**\n * Style Dictionary output format.\n */\nexport interface StyleDictionaryOutput {\n categories: TokenCategory[];\n metadata: {\n name: string;\n version?: string;\n generatedAt: string;\n };\n}\n\n/**\n * Configuration for Style Dictionary integration.\n */\nexport interface StyleDictionaryConfig {\n /**\n * Path to tokens JSON/JS file or directory.\n */\n tokensPath: string;\n\n /**\n * Output format for documentation.\n * @default 'html'\n */\n outputFormat?: \"html\" | \"json\" | \"markdown\";\n\n /**\n * Output directory for generated documentation.\n * @default '.vize/tokens'\n */\n outputDir?: string;\n\n /**\n * Custom token transformations.\n */\n transforms?: TokenTransform[];\n}\n\n/**\n * Token transformation function.\n */\nexport type TokenTransform = (token: DesignToken, path: string[]) => DesignToken;\n\n/**\n * Parse Style Dictionary tokens file or directory.\n */\nexport async function parseTokens(tokensPath: string): Promise<TokenCategory[]> {\n return normalizeCategories(tokenNative().parseDesignTokensFromPath(tokensPath));\n}\n","/**\n * Token usage scanning and value normalization.\n *\n * Scans art file `<style>` blocks for CSS property values that match\n * design token values, and provides value normalization utilities.\n */\n\nimport fs from \"node:fs\";\n\nimport type { DesignToken } from \"./parser.js\";\nimport type { TokenUsageMap } from \"./resolver.js\";\n\n/**\n * Normalize a token value for comparison.\n * - Lowercase, trim\n * - Leading-zero: `.5rem` -> `0.5rem`\n * - Short hex: `#fff` -> `#ffffff`\n */\nexport function normalizeTokenValue(value: string | number): string {\n let v = String(value).trim().toLowerCase();\n\n // Expand short hex (#abc -> #aabbcc, #abcd -> #aabbccdd)\n const shortHex = v.match(/^#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/);\n if (shortHex) {\n const [, r, g, b, a] = shortHex;\n v = a ? `#${r}${r}${g}${g}${b}${b}${a}${a}` : `#${r}${r}${g}${g}${b}${b}`;\n }\n\n // Add leading zero: `.5rem` -> `0.5rem`\n v = v.replace(/(?<![0-9])\\.(\\d)/g, \"0.$1\");\n\n return v;\n}\n\nconst STYLE_BLOCK_RE = /<style[^>]*>([\\s\\S]*?)<\\/style>/g;\nconst CSS_PROPERTY_RE = /^\\s*([\\w-]+)\\s*:\\s*(.+?)\\s*;?\\s*$/;\n\n/**\n * Scan art file sources for token value matches in `<style>` blocks.\n */\nexport function scanTokenUsage(\n artFiles: Map<string, { path: string; metadata: { title: string; category?: string } }>,\n tokenMap: Record<string, DesignToken>,\n): TokenUsageMap {\n // Build reverse lookup: normalizedValue -> tokenPath[]\n const valueLookup = new Map<string, string[]>();\n for (const [tokenPath, token] of Object.entries(tokenMap)) {\n const rawValue = token.$resolvedValue ?? token.value;\n const normalized = normalizeTokenValue(rawValue);\n if (!normalized) continue;\n const existing = valueLookup.get(normalized);\n if (existing) {\n existing.push(tokenPath);\n } else {\n valueLookup.set(normalized, [tokenPath]);\n }\n }\n\n const usageMap: TokenUsageMap = {};\n\n for (const [artPath, artInfo] of artFiles) {\n let source: string;\n try {\n source = fs.readFileSync(artPath, \"utf-8\");\n } catch {\n continue;\n }\n\n const allLines = source.split(\"\\n\");\n\n // Find style block line offsets\n const styleRegions: Array<{ startLine: number; content: string }> = [];\n let match: RegExpExecArray | null;\n STYLE_BLOCK_RE.lastIndex = 0;\n while ((match = STYLE_BLOCK_RE.exec(source)) !== null) {\n const beforeMatch = source.slice(0, match.index);\n const startTag = source.slice(match.index, match.index + match[0].indexOf(match[1]));\n const startLine = beforeMatch.split(\"\\n\").length + startTag.split(\"\\n\").length - 1;\n styleRegions.push({ startLine, content: match[1] });\n }\n\n // Scan each style block line\n for (const region of styleRegions) {\n const lines = region.content.split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const propMatch = line.match(CSS_PROPERTY_RE);\n if (!propMatch) continue;\n\n const property = propMatch[1];\n const valueStr = propMatch[2];\n\n // Split on whitespace for multi-value properties (e.g., `border: 1px solid #3b82f6`)\n const valueParts = valueStr.split(/\\s+/);\n for (const part of valueParts) {\n const normalizedPart = normalizeTokenValue(part);\n const matchingTokens = valueLookup.get(normalizedPart);\n if (!matchingTokens) continue;\n\n const lineNumber = region.startLine + i;\n const lineContent = allLines[lineNumber - 1]?.trim() ?? line.trim();\n\n for (const tokenPath of matchingTokens) {\n if (!usageMap[tokenPath]) {\n usageMap[tokenPath] = [];\n }\n\n // Find or create entry for this art file\n let entry = usageMap[tokenPath].find((e) => e.artPath === artPath);\n if (!entry) {\n entry = {\n artPath,\n artTitle: artInfo.metadata.title,\n artCategory: artInfo.metadata.category,\n matches: [],\n };\n usageMap[tokenPath].push(entry);\n }\n\n // Avoid duplicate matches on same line+property\n if (!entry.matches.some((m) => m.line === lineNumber && m.property === property)) {\n entry.matches.push({ line: lineNumber, lineContent, property });\n }\n }\n }\n }\n }\n }\n\n return usageMap;\n}\n","/**\n * Token resolution, CRUD operations, and validation.\n *\n * Handles building flat token maps from categories, resolving reference chains,\n * reading/writing raw token files, and validating semantic references.\n */\n\nimport fs from \"node:fs\";\n\nimport type { DesignToken, TokenCategory } from \"./parser.js\";\nimport { normalizeCategories, nullRecord, tokenNative } from \"./native.js\";\n\n// Re-export usage scanning and normalization from usage\nexport { normalizeTokenValue, scanTokenUsage } from \"./usage.js\";\n\n/**\n * Token usage match within a single CSS property.\n */\nexport interface TokenUsageMatch {\n line: number;\n lineContent: string;\n property: string;\n}\n\n/**\n * Token usage entry for a single art file.\n */\nexport interface TokenUsageEntry {\n artPath: string;\n artTitle: string;\n artCategory?: string;\n matches: TokenUsageMatch[];\n}\n\n/**\n * Map of token paths to their usage locations across art files.\n */\nexport type TokenUsageMap = Record<string, TokenUsageEntry[]>;\n\nconst UNSAFE_TOKEN_PATH_SEGMENTS = new Set([\"__proto__\", \"prototype\", \"constructor\"]);\n\nfunction parseTokenPath(dotPath: string): string[] {\n const parts = dotPath.split(\".\");\n if (parts.length === 0 || parts.some((part) => part.trim() === \"\")) {\n throw new Error(`Invalid token path \"${dotPath}\"`);\n }\n\n const unsafeSegment = parts.find((part) => UNSAFE_TOKEN_PATH_SEGMENTS.has(part));\n if (unsafeSegment) {\n throw new Error(`Token path segment \"${unsafeSegment}\" is not allowed`);\n }\n\n return parts;\n}\n\n/**\n * Flatten nested categories into a flat map keyed by dot-path.\n */\nexport function buildTokenMap(categories: TokenCategory[]): Record<string, DesignToken> {\n return nullRecord(tokenNative().buildDesignTokenMap(categories));\n}\n\n/**\n * Resolve references in categories, setting $tier, $reference, and $resolvedValue.\n */\nexport function resolveReferences(\n categories: TokenCategory[],\n _tokenMap: Record<string, DesignToken>,\n): void {\n const resolved = tokenNative().resolveDesignTokenReferences(categories);\n categories.splice(0, categories.length, ...normalizeCategories(resolved.categories));\n}\n\n/**\n * Read raw JSON token file.\n */\nexport async function readRawTokenFile(tokensPath: string): Promise<Record<string, unknown>> {\n const content = await fs.promises.readFile(tokensPath, \"utf-8\");\n return JSON.parse(content) as Record<string, unknown>;\n}\n\n/**\n * Write raw JSON token file atomically (write tmp, rename).\n */\nexport async function writeRawTokenFile(\n tokensPath: string,\n data: Record<string, unknown>,\n): Promise<void> {\n const tmpPath = tokensPath + \".tmp\";\n await fs.promises.writeFile(tmpPath, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n await fs.promises.rename(tmpPath, tokensPath);\n}\n\n/**\n * Set a token at a dot-separated path in the raw JSON structure.\n */\nexport function setTokenAtPath(\n data: Record<string, unknown>,\n dotPath: string,\n token: Omit<DesignToken, \"$resolvedValue\">,\n): void {\n const parts = parseTokenPath(dotPath);\n let current: Record<string, unknown> = data;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i];\n if (typeof current[key] !== \"object\" || current[key] === null) {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n\n const leafKey = parts[parts.length - 1];\n const raw: Record<string, unknown> = { value: token.value };\n if (token.type) raw.type = token.type;\n if (token.description) raw.description = token.description;\n if (token.$tier) raw.$tier = token.$tier;\n if (token.$reference) raw.$reference = token.$reference;\n if (token.attributes) raw.attributes = token.attributes;\n current[leafKey] = raw;\n}\n\n/**\n * Delete a token at a dot-separated path, cleaning empty parents.\n */\nexport function deleteTokenAtPath(data: Record<string, unknown>, dotPath: string): boolean {\n const parts = parseTokenPath(dotPath);\n const parents: Array<{ obj: Record<string, unknown>; key: string }> = [];\n let current: Record<string, unknown> = data;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i];\n if (typeof current[key] !== \"object\" || current[key] === null) {\n return false;\n }\n parents.push({ obj: current, key });\n current = current[key] as Record<string, unknown>;\n }\n\n const leafKey = parts[parts.length - 1];\n if (!(leafKey in current)) return false;\n delete current[leafKey];\n\n // Clean empty parents\n for (let i = parents.length - 1; i >= 0; i--) {\n const { obj, key } = parents[i];\n const child = obj[key] as Record<string, unknown>;\n if (Object.keys(child).length === 0) {\n delete obj[key];\n } else {\n break;\n }\n }\n\n return true;\n}\n\n/**\n * Validate that a semantic reference points to an existing token and has no cycles.\n */\nexport function validateSemanticReference(\n tokenMap: Record<string, DesignToken>,\n reference: string,\n selfPath?: string,\n): { valid: boolean; error?: string } {\n return tokenNative().validateDesignTokenReference(tokenMap, reference, selfPath);\n}\n\n/**\n * Find all tokens that reference the given path.\n */\nexport function findDependentTokens(\n tokenMap: Record<string, DesignToken>,\n targetPath: string,\n): string[] {\n return tokenNative().findDependentDesignTokens(tokenMap, targetPath);\n}\n","/**\n * Token documentation generators for Style Dictionary integration.\n *\n * Generates HTML, Markdown, and JSON documentation from parsed token categories,\n * and provides the main processStyleDictionary orchestrator function.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nimport type { TokenCategory, StyleDictionaryConfig, StyleDictionaryOutput } from \"./parser.js\";\nimport { parseTokens } from \"./parser.js\";\nimport { tokenNative } from \"./native.js\";\nimport { escapeHtml } from \"../utils.js\";\n\nconst SAFE_CSS_COLOR_PATTERN = /^(?:#[0-9a-fA-F]{3,8}|(?:rgb|hsl)a?\\(\\s*[-+.\\d,%\\s]+\\))$/;\nconst DANGEROUS_PROTOCOL_PATTERN = /\\b(javascript|vbscript):/gi;\n\nfunction escapeTokenText(value: string): string {\n return escapeHtml(value).replace(DANGEROUS_PROTOCOL_PATTERN, \"$1:\");\n}\n\nfunction safeCssColor(value: string | number, type?: string): string | null {\n if (typeof value !== \"string\") return null;\n\n const trimmed = value.trim();\n const looksLikeColor =\n type === \"color\" ||\n trimmed.startsWith(\"#\") ||\n trimmed.startsWith(\"rgb\") ||\n trimmed.startsWith(\"hsl\");\n\n return looksLikeColor && SAFE_CSS_COLOR_PATTERN.test(trimmed) ? trimmed : null;\n}\n\n/**\n * Generate HTML documentation for tokens.\n */\nexport function generateTokensHtml(categories: TokenCategory[]): string {\n const renderToken = (\n name: string,\n token: { value: string | number; type?: string; description?: string },\n ): string => {\n const color = safeCssColor(token.value, token.type);\n\n return `\n <div class=\"token\">\n <div class=\"token-preview\">\n ${color ? `<div class=\"color-swatch\" style=\"background: ${color}\"></div>` : \"\"}\n </div>\n <div class=\"token-info\">\n <div class=\"token-name\">${escapeTokenText(name)}</div>\n <div class=\"token-value\">${escapeTokenText(String(token.value))}</div>\n ${token.description ? `<div class=\"token-description\">${escapeTokenText(token.description)}</div>` : \"\"}\n </div>\n </div>\n `;\n };\n\n const renderCategory = (category: TokenCategory, level: number = 2): string => {\n const heading = `h${Math.min(level, 6)}`;\n let html = `<${heading}>${escapeTokenText(category.name)}</${heading}>`;\n html += '<div class=\"tokens-grid\">';\n\n for (const [name, token] of Object.entries(category.tokens)) {\n html += renderToken(name, token);\n }\n\n html += \"</div>\";\n\n if (category.subcategories) {\n for (const sub of category.subcategories) {\n html += renderCategory(sub, level + 1);\n }\n }\n\n return html;\n };\n\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.0\">\n <title>Design Tokens - Musea</title>\n <style>\n :root {\n --musea-bg: #0d0d0d;\n --musea-bg-secondary: #1a1815;\n --musea-text: #e6e9f0;\n --musea-text-muted: #7b8494;\n --musea-accent: #a34828;\n --musea-border: #3a3530;\n }\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body {\n font-family: 'Inter', -apple-system, sans-serif;\n background: var(--musea-bg);\n color: var(--musea-text);\n line-height: 1.6;\n padding: 2rem;\n }\n h1 { margin-bottom: 2rem; color: var(--musea-accent); }\n h2 { margin: 2rem 0 1rem; padding-bottom: 0.5rem; border-bottom: 1px solid var(--musea-border); }\n h3, h4, h5, h6 { margin: 1.5rem 0 0.75rem; }\n .tokens-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 1rem;\n margin-bottom: 1.5rem;\n }\n .token {\n background: var(--musea-bg-secondary);\n border: 1px solid var(--musea-border);\n border-radius: 8px;\n padding: 1rem;\n display: flex;\n gap: 1rem;\n align-items: center;\n }\n .token-preview {\n flex-shrink: 0;\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .color-swatch {\n width: 48px;\n height: 48px;\n border-radius: 8px;\n border: 1px solid var(--musea-border);\n }\n .token-info {\n flex: 1;\n min-width: 0;\n }\n .token-name {\n font-weight: 600;\n font-family: 'JetBrains Mono', monospace;\n font-size: 0.875rem;\n }\n .token-value {\n color: var(--musea-text-muted);\n font-family: 'JetBrains Mono', monospace;\n font-size: 0.75rem;\n word-break: break-all;\n }\n .token-description {\n color: var(--musea-text-muted);\n font-size: 0.75rem;\n margin-top: 0.25rem;\n }\n </style>\n</head>\n<body>\n <h1>Design Tokens</h1>\n ${categories.map((cat) => renderCategory(cat)).join(\"\")}\n</body>\n</html>`;\n}\n\n/**\n * Generate Markdown documentation for tokens.\n */\nexport function generateTokensMarkdown(categories: TokenCategory[]): string {\n return tokenNative().generateDesignTokensMarkdown(categories, new Date().toISOString());\n}\n\n/**\n * Style Dictionary plugin for Musea.\n * Parses tokens and generates documentation in the specified format.\n */\nexport async function processStyleDictionary(\n config: StyleDictionaryConfig,\n): Promise<StyleDictionaryOutput> {\n const categories = await parseTokens(config.tokensPath);\n const outputDir = config.outputDir ?? \".vize/tokens\";\n const outputFormat = config.outputFormat ?? \"html\";\n\n // Ensure output directory exists\n await fs.promises.mkdir(outputDir, { recursive: true });\n\n // Generate documentation\n let content: string;\n let filename: string;\n\n switch (outputFormat) {\n case \"html\":\n content = generateTokensHtml(categories);\n filename = \"tokens.html\";\n break;\n case \"markdown\":\n content = generateTokensMarkdown(categories);\n filename = \"tokens.md\";\n break;\n case \"json\":\n default:\n content = JSON.stringify({ categories }, null, 2);\n filename = \"tokens.json\";\n }\n\n const outputPath = path.join(outputDir, filename);\n await fs.promises.writeFile(outputPath, content, \"utf-8\");\n\n console.log(`[musea] Generated token documentation: ${outputPath}`);\n\n return {\n categories,\n metadata: {\n name: path.basename(config.tokensPath),\n generatedAt: new Date().toISOString(),\n },\n };\n}\n","/**\n * Musea gallery API token route handlers.\n *\n * Handles GET/POST/PUT/DELETE for /api/tokens endpoints:\n * - GET /tokens -- list all resolved design tokens\n * - GET /tokens/usage -- token usage across art files\n * - POST /tokens -- create a new token\n * - PUT /tokens -- update an existing token\n * - DELETE /tokens -- delete a token\n */\n\nimport type { ApiRoutesContext, SendJson, SendError, ReadBody } from \"./api-routes/index.js\";\nimport { HttpError, parseJsonBody, resolveInside } from \"./security.js\";\nimport {\n parseTokens,\n buildTokenMap,\n resolveReferences,\n readRawTokenFile,\n writeRawTokenFile,\n setTokenAtPath,\n deleteTokenAtPath,\n validateSemanticReference,\n findDependentTokens,\n scanTokenUsage,\n type DesignToken,\n type TokenUsageMap,\n} from \"./style-dictionary.js\";\n\nfunction resolveTokensPath(ctx: ApiRoutesContext): string {\n return resolveInside(ctx.config.root, ctx.tokensPath!, \"tokensPath\");\n}\n\nfunction sendTokenMutationError(e: unknown, sendError: SendError): void {\n if (e instanceof HttpError) {\n sendError(e.message, e.status);\n return;\n }\n\n if (e instanceof Error && /token path/i.test(e.message)) {\n sendError(e.message, 400);\n return;\n }\n\n sendError(e instanceof Error ? e.message : String(e));\n}\n\n/** GET /api/tokens/usage */\nexport async function handleTokensUsage(ctx: ApiRoutesContext, sendJson: SendJson): Promise<void> {\n if (!ctx.tokensPath) {\n sendJson({});\n return;\n }\n\n try {\n const absoluteTokensPath = resolveTokensPath(ctx);\n const categories = await parseTokens(absoluteTokensPath);\n const tokenMap = buildTokenMap(categories);\n resolveReferences(categories, tokenMap);\n const resolvedTokenMap = buildTokenMap(categories);\n const usage: TokenUsageMap = scanTokenUsage(ctx.artFiles, resolvedTokenMap);\n sendJson(usage);\n } catch (e) {\n console.error(\"[musea] Failed to scan token usage:\", e);\n sendJson({});\n }\n}\n\n/** GET /api/tokens */\nexport async function handleTokensGet(ctx: ApiRoutesContext, sendJson: SendJson): Promise<void> {\n if (!ctx.tokensPath) {\n sendJson({\n categories: [],\n tokenMap: {},\n meta: {\n filePath: \"\",\n tokenCount: 0,\n primitiveCount: 0,\n semanticCount: 0,\n },\n });\n return;\n }\n\n try {\n const absoluteTokensPath = resolveTokensPath(ctx);\n const categories = await parseTokens(absoluteTokensPath);\n const tokenMap = buildTokenMap(categories);\n resolveReferences(categories, tokenMap);\n const resolvedTokenMap = buildTokenMap(categories);\n let primitiveCount = 0;\n let semanticCount = 0;\n for (const token of Object.values(resolvedTokenMap)) {\n if (token.$tier === \"semantic\") semanticCount++;\n else primitiveCount++;\n }\n sendJson({\n categories,\n tokenMap: resolvedTokenMap,\n meta: {\n filePath: absoluteTokensPath,\n tokenCount: Object.keys(resolvedTokenMap).length,\n primitiveCount,\n semanticCount,\n },\n });\n } catch (e) {\n console.error(\"[musea] Failed to load tokens:\", e);\n sendJson({ categories: [], tokenMap: {}, error: String(e) });\n }\n}\n\n/** POST /api/tokens (create) */\nexport async function handleTokensCreate(\n ctx: ApiRoutesContext,\n readBody: ReadBody,\n sendJson: SendJson,\n sendError: SendError,\n): Promise<void> {\n if (!ctx.tokensPath) {\n sendError(\"No tokens path configured\", 400);\n return;\n }\n\n const body = await readBody();\n try {\n const { path: dotPath, token } = parseJsonBody<{\n path: string;\n token: Omit<DesignToken, \"$resolvedValue\">;\n }>(body);\n if (!dotPath || !token || token.value === undefined) {\n sendError(\"Missing required fields: path, token.value\", 400);\n return;\n }\n const absoluteTokensPath = resolveTokensPath(ctx);\n const rawData = await readRawTokenFile(absoluteTokensPath);\n\n const currentCategories = await parseTokens(absoluteTokensPath);\n const currentMap = buildTokenMap(currentCategories);\n if (currentMap[dotPath]) {\n sendError(`Token already exists at path \"${dotPath}\"`, 409);\n return;\n }\n\n if (token.$reference) {\n const validation = validateSemanticReference(currentMap, token.$reference, dotPath);\n if (!validation.valid) {\n sendError(validation.error!, 400);\n return;\n }\n token.value = `{${token.$reference}}`;\n token.$tier = \"semantic\";\n }\n\n setTokenAtPath(rawData, dotPath, token);\n await writeRawTokenFile(absoluteTokensPath, rawData);\n\n const categories = await parseTokens(absoluteTokensPath);\n const tokenMap = buildTokenMap(categories);\n resolveReferences(categories, tokenMap);\n const resolvedTokenMap = buildTokenMap(categories);\n sendJson({ categories, tokenMap: resolvedTokenMap }, 201);\n } catch (e) {\n sendTokenMutationError(e, sendError);\n }\n}\n\n/** PUT /api/tokens (update) */\nexport async function handleTokensUpdate(\n ctx: ApiRoutesContext,\n readBody: ReadBody,\n sendJson: SendJson,\n sendError: SendError,\n): Promise<void> {\n if (!ctx.tokensPath) {\n sendError(\"No tokens path configured\", 400);\n return;\n }\n\n const body = await readBody();\n try {\n const { path: dotPath, token } = parseJsonBody<{\n path: string;\n token: Omit<DesignToken, \"$resolvedValue\">;\n }>(body);\n if (!dotPath || !token || token.value === undefined) {\n sendError(\"Missing required fields: path, token.value\", 400);\n return;\n }\n const absoluteTokensPath = resolveTokensPath(ctx);\n\n if (token.$reference) {\n const currentCategories = await parseTokens(absoluteTokensPath);\n const currentMap = buildTokenMap(currentCategories);\n const validation = validateSemanticReference(currentMap, token.$reference, dotPath);\n if (!validation.valid) {\n sendError(validation.error!, 400);\n return;\n }\n token.value = `{${token.$reference}}`;\n token.$tier = \"semantic\";\n }\n\n const rawData = await readRawTokenFile(absoluteTokensPath);\n setTokenAtPath(rawData, dotPath, token);\n await writeRawTokenFile(absoluteTokensPath, rawData);\n\n const categories = await parseTokens(absoluteTokensPath);\n const tokenMap = buildTokenMap(categories);\n resolveReferences(categories, tokenMap);\n const resolvedTokenMap = buildTokenMap(categories);\n sendJson({ categories, tokenMap: resolvedTokenMap });\n } catch (e) {\n sendTokenMutationError(e, sendError);\n }\n}\n\n/** DELETE /api/tokens */\nexport async function handleTokensDelete(\n ctx: ApiRoutesContext,\n readBody: ReadBody,\n sendJson: SendJson,\n sendError: SendError,\n): Promise<void> {\n if (!ctx.tokensPath) {\n sendError(\"No tokens path configured\", 400);\n return;\n }\n\n const body = await readBody();\n try {\n const { path: dotPath } = parseJsonBody<{ path: string }>(body);\n if (!dotPath) {\n sendError(\"Missing required field: path\", 400);\n return;\n }\n const absoluteTokensPath = resolveTokensPath(ctx);\n\n const currentCategories = await parseTokens(absoluteTokensPath);\n const currentMap = buildTokenMap(currentCategories);\n const dependents = findDependentTokens(currentMap, dotPath);\n\n const rawData = await readRawTokenFile(absoluteTokensPath);\n const deleted = deleteTokenAtPath(rawData, dotPath);\n if (!deleted) {\n sendError(`Token not found at path \"${dotPath}\"`, 404);\n return;\n }\n await writeRawTokenFile(absoluteTokensPath, rawData);\n\n const categories = await parseTokens(absoluteTokensPath);\n const tokenMap = buildTokenMap(categories);\n resolveReferences(categories, tokenMap);\n const resolvedTokenMap = buildTokenMap(categories);\n sendJson({\n categories,\n tokenMap: resolvedTokenMap,\n dependentsWarning: dependents.length > 0 ? dependents : undefined,\n });\n } catch (e) {\n sendTokenMutationError(e, sendError);\n }\n}\n","/**\n * Palette handler for the Musea gallery API.\n *\n * Handles GET /api/arts/:path/palette endpoint.\n */\n\nimport fs from \"node:fs\";\n\nimport type { ApiRoutesContext, SendJson, SendError } from \"./index.js\";\nimport { allowedSourceRoots, resolveComponentSourcePath } from \"../component-source.js\";\nimport { loadNative, analyzeSfcFallback } from \"../native-loader.js\";\nimport { decodeUrlComponent } from \"../security.js\";\n\n/** GET /api/arts/:path/palette */\nexport async function handleArtPalette(\n ctx: ApiRoutesContext,\n match: RegExpMatchArray,\n sendJson: SendJson,\n sendError: SendError,\n): Promise<void> {\n const artPath = decodeUrlComponent(match[1], \"art path\");\n const art = ctx.artFiles.get(artPath);\n if (!art) {\n sendError(\"Art not found\", 404);\n return;\n }\n\n try {\n const source = await fs.promises.readFile(artPath, \"utf-8\");\n const binding = loadNative();\n let palette: {\n title: string;\n controls: Array<{\n name: string;\n control: string;\n default_value?: unknown;\n description?: string;\n required: boolean;\n options: Array<{ label: string; value: unknown }>;\n range?: { min: number; max: number; step?: number };\n group?: string;\n }>;\n groups: string[];\n json: string;\n typescript: string;\n };\n if (binding.generateArtPalette) {\n palette = binding.generateArtPalette(source, {\n filename: artPath,\n });\n } else {\n palette = {\n title: art.metadata.title,\n controls: [],\n groups: [],\n json: \"{}\",\n typescript: \"\",\n };\n }\n\n // If the native palette returned no controls, try JS-based SFC analysis\n if (palette.controls.length === 0 && art.metadata.component) {\n const resolvedComponentPath = resolveComponentSourcePath(\n art,\n artPath,\n allowedSourceRoots(ctx.config.root, ctx.scanRoots),\n );\n if (!resolvedComponentPath) {\n sendJson(palette);\n return;\n }\n\n try {\n const componentSource = await fs.promises.readFile(resolvedComponentPath, \"utf-8\");\n const analysis = binding.analyzeSfc\n ? binding.analyzeSfc(componentSource, {\n filename: resolvedComponentPath,\n })\n : analyzeSfcFallback(componentSource, {\n filename: resolvedComponentPath,\n });\n\n if (analysis.props.length > 0) {\n palette.controls = analysis.props.map((prop) => {\n let control = \"text\";\n if (prop.type === \"boolean\") control = \"boolean\";\n else if (prop.type === \"number\") control = \"number\";\n else if (prop.type.includes(\"|\") && !prop.type.includes(\"=>\")) {\n control = \"select\";\n }\n\n const options: Array<{ label: string; value: unknown }> = [];\n if (control === \"select\") {\n const optionMatches = prop.type.match(/\"([^\"]+)\"/g);\n if (optionMatches) {\n for (const opt of optionMatches) {\n const val = opt.replace(/\"/g, \"\");\n options.push({ label: val, value: val });\n }\n }\n }\n\n return {\n name: prop.name,\n control,\n default_value:\n prop.default_value !== undefined\n ? prop.default_value === \"true\"\n ? true\n : prop.default_value === \"false\"\n ? false\n : typeof prop.default_value === \"string\" && prop.default_value.startsWith('\"')\n ? prop.default_value.replace(/^\"|\"$/g, \"\")\n : prop.default_value\n : undefined,\n description: undefined,\n required: prop.required,\n options,\n range: undefined,\n group: undefined,\n };\n });\n\n palette.json = JSON.stringify(\n { title: palette.title, controls: palette.controls },\n null,\n 2,\n );\n palette.typescript = `export interface ${palette.title}Props {\\n${palette.controls\n .map(\n (c) =>\n ` ${c.name}${c.required ? \"\" : \"?\"}: ${\n c.control === \"boolean\"\n ? \"boolean\"\n : c.control === \"number\"\n ? \"number\"\n : c.control === \"select\"\n ? c.options.map((o) => `\"${String(o.value)}\"`).join(\" | \")\n : \"string\"\n };`,\n )\n .join(\"\\n\")}\\n}\\n`;\n }\n } catch {\n // Ignore errors reading component file\n }\n }\n\n sendJson(palette);\n } catch (e) {\n sendError(e instanceof Error ? e.message : String(e));\n }\n}\n","/**\n * Individual route handler functions for the Musea gallery API.\n *\n * Extracted from api-routes.ts to keep file sizes manageable.\n * These handle GET /api/arts/:path/... sub-routes.\n */\n\nimport fs from \"node:fs\";\n\nimport type { ApiRoutesContext, SendJson, SendError } from \"./index.js\";\nimport { allowedSourceRoots, resolveComponentSourcePath } from \"../component-source.js\";\nimport { loadNative, analyzeSfcFallback } from \"../native-loader.js\";\nimport { decodeUrlComponent } from \"../security.js\";\n\nexport { handleArtPalette } from \"./handler-palette.js\";\n\n/** GET /api/arts/:path/source */\nexport async function handleArtSource(\n ctx: ApiRoutesContext,\n match: RegExpMatchArray,\n sendJson: SendJson,\n sendError: SendError,\n): Promise<void> {\n const artPath = decodeUrlComponent(match[1], \"art path\");\n const art = ctx.artFiles.get(artPath);\n if (!art) {\n sendError(\"Art not found\", 404);\n return;\n }\n\n try {\n const source = await fs.promises.readFile(artPath, \"utf-8\");\n sendJson({ source, path: artPath });\n } catch (e) {\n sendError(e instanceof Error ? e.message : String(e));\n }\n}\n\n/** GET /api/arts/:path/analysis */\nexport async function handleArtAnalysis(\n ctx: ApiRoutesContext,\n match: RegExpMatchArray,\n sendJson: SendJson,\n sendError: SendError,\n): Promise<void> {\n const artPath = decodeUrlComponent(match[1], \"art path\");\n const art = ctx.artFiles.get(artPath);\n if (!art) {\n sendError(\"Art not found\", 404);\n return;\n }\n\n try {\n const resolvedComponentPath = resolveComponentSourcePath(\n art,\n artPath,\n allowedSourceRoots(ctx.config.root, ctx.scanRoots),\n );\n\n if (resolvedComponentPath) {\n const source = await fs.promises.readFile(resolvedComponentPath, \"utf-8\");\n const binding = loadNative();\n if (binding.analyzeSfc) {\n const analysis = binding.analyzeSfc(source, {\n filename: resolvedComponentPath,\n });\n sendJson(analysis);\n } else {\n const analysis = analyzeSfcFallback(source, {\n filename: resolvedComponentPath,\n });\n sendJson(analysis);\n }\n } else {\n sendJson({ props: [], emits: [] });\n }\n } catch (e) {\n sendError(e instanceof Error ? e.message : String(e));\n }\n}\n\n/** GET /api/arts/:path/docs */\nexport async function handleArtDocs(\n ctx: ApiRoutesContext,\n match: RegExpMatchArray,\n sendJson: SendJson,\n sendError: SendError,\n): Promise<void> {\n const artPath = decodeUrlComponent(match[1], \"art path\");\n const art = ctx.artFiles.get(artPath);\n if (!art) {\n sendError(\"Art not found\", 404);\n return;\n }\n\n try {\n const source = await fs.promises.readFile(artPath, \"utf-8\");\n const binding = loadNative();\n if (binding.generateArtDoc) {\n const doc = binding.generateArtDoc(source, {\n filename: artPath,\n });\n // Replace Self with component name and format indentation\n let markdown = doc.markdown || \"\";\n const componentName = art.metadata.title || \"Component\";\n markdown = markdown\n .replace(/<Self(\\s|>|\\/)/g, `<${componentName}$1`)\n .replace(/<\\/Self>/g, `</${componentName}>`);\n // Fix indentation in code blocks\n markdown = markdown.replace(\n /```(\\w*)\\n([\\s\\S]*?)```/g,\n (_match: string, lang: string, code: string) => {\n const lines = code.split(\"\\n\");\n let minIndent = Infinity;\n for (const line of lines) {\n if (line.trim()) {\n const indent = line.match(/^(\\s*)/)?.[1].length || 0;\n minIndent = Math.min(minIndent, indent);\n }\n }\n if (minIndent === Infinity) minIndent = 0;\n let formatted: string;\n if (minIndent > 0) {\n formatted = lines.map((line: string) => line.slice(minIndent)).join(\"\\n\");\n } else {\n let restIndent = Infinity;\n for (let i = 1; i < lines.length; i++) {\n if (lines[i].trim()) {\n const indent = lines[i].match(/^(\\s*)/)?.[1].length || 0;\n restIndent = Math.min(restIndent, indent);\n }\n }\n if (restIndent === Infinity || restIndent === 0) {\n formatted = lines.join(\"\\n\");\n } else {\n formatted = lines\n .map((line: string, i: number) => (i === 0 ? line : line.slice(restIndent)))\n .join(\"\\n\");\n }\n }\n return \"```\" + lang + \"\\n\" + formatted + \"```\";\n },\n );\n sendJson({ ...doc, markdown });\n } else {\n sendJson({\n markdown: \"\",\n title: art.metadata.title,\n variant_count: art.variants.length,\n });\n }\n } catch (e) {\n sendError(e instanceof Error ? e.message : String(e));\n }\n}\n\n/** GET /api/arts/:path/variants/:name/a11y */\nexport function handleArtA11y(\n ctx: ApiRoutesContext,\n match: RegExpMatchArray,\n sendJson: SendJson,\n sendError: SendError,\n): void {\n const artPath = decodeUrlComponent(match[1], \"art path\");\n const _variantName = decodeUrlComponent(match[2], \"variant name\");\n const art = ctx.artFiles.get(artPath);\n if (!art) {\n sendError(\"Art not found\", 404);\n return;\n }\n\n // Return empty a11y results (populated after VRT --a11y run)\n sendJson({ violations: [], passes: 0, incomplete: 0 });\n}\n","/**\n * POST route handlers for the Musea gallery API.\n *\n * Handles preview-with-props, generate, and run-vrt endpoints.\n */\n\nimport type { ServerResponse } from \"node:http\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nimport type { ApiRoutesContext, SendJson, SendError } from \"./index.js\";\nimport { generatePreviewModuleWithProps } from \"../preview/index.js\";\nimport { HttpError, parseJsonBody, resolveInside } from \"../security.js\";\nimport { toPascalCase } from \"../utils.js\";\n\n/** POST /api/preview-with-props */\nexport function handlePreviewWithProps(\n ctx: ApiRoutesContext,\n body: string,\n res: ServerResponse,\n sendJson: SendJson,\n sendError: SendError,\n): void {\n try {\n const {\n artPath: reqArtPath,\n variantName,\n props: propsOverride,\n } = parseJsonBody<{\n artPath: string;\n variantName: string;\n props?: unknown;\n }>(body);\n const art = ctx.artFiles.get(reqArtPath);\n if (!art) {\n sendError(\"Art not found\", 404);\n return;\n }\n\n const variant = art.variants.find((v) => v.name === variantName);\n if (!variant) {\n sendError(\"Variant not found\", 404);\n return;\n }\n\n const variantComponentName = toPascalCase(variant.name);\n const moduleCode = generatePreviewModuleWithProps(\n art,\n variantComponentName,\n variant.name,\n propsOverride,\n ctx.resolvedPreviewCss,\n ctx.resolvedPreviewSetup,\n );\n res.setHeader(\"Content-Type\", \"application/javascript\");\n res.end(moduleCode);\n } catch (e) {\n if (e instanceof HttpError) {\n sendError(e.message, e.status);\n return;\n }\n sendError(e instanceof Error ? e.message : String(e));\n }\n}\n\n/** POST /api/generate */\nexport async function handleGenerate(\n ctx: ApiRoutesContext,\n body: string,\n sendJson: SendJson,\n sendError: SendError,\n): Promise<void> {\n try {\n const { componentPath: reqComponentPath, options: autogenOptions } = parseJsonBody<{\n componentPath?: unknown;\n options?: unknown;\n }>(body);\n if (typeof reqComponentPath !== \"string\") {\n sendError(\"Missing required field: componentPath\", 400);\n return;\n }\n const { generateArtFile: genArt } = await import(\"../autogen/index.js\");\n const componentPath = resolveInside(ctx.config.root, reqComponentPath, \"componentPath\");\n const result = await genArt(componentPath, autogenOptions);\n sendJson({\n generated: true,\n componentName: result.componentName,\n variants: result.variants,\n artFileContent: result.artFileContent,\n });\n } catch (e) {\n if (e instanceof HttpError) {\n sendError(e.message, e.status);\n return;\n }\n sendError(e instanceof Error ? e.message : String(e));\n }\n}\n\n/** POST /api/run-vrt */\nexport async function handleRunVrt(\n ctx: ApiRoutesContext,\n body: string,\n sendJson: SendJson,\n sendError: SendError,\n): Promise<void> {\n try {\n const { artPath, updateSnapshots } = parseJsonBody<{\n artPath?: string;\n updateSnapshots?: boolean;\n }>(body);\n const { MuseaVrtRunner, generateVrtJsonReport, generateVrtReport } = await import(\"../vrt.js\");\n\n const snapshotDir = path.resolve(ctx.config.root, \".vize/snapshots\");\n const reportDir = path.resolve(ctx.config.root, \".vize/reports\");\n\n const runner = new MuseaVrtRunner({ snapshotDir });\n\n const port = ctx.getDevServerPort();\n const baseUrl = `http://localhost:${port}`;\n\n let artsToTest = Array.from(ctx.artFiles.values());\n if (artPath) {\n artsToTest = artsToTest.filter((a) => a.path === artPath);\n }\n\n const { results, summary } = await (async () => {\n await runner.start();\n\n try {\n const results = await runner.runTests(artsToTest, baseUrl, {\n updateSnapshots,\n });\n const summary = runner.getSummary(results);\n return { results, summary };\n } finally {\n await runner.stop();\n }\n })();\n\n const reportBaseName =\n typeof artPath === \"string\" ? `vrt-${path.basename(artPath, \".art.vue\")}` : \"vrt\";\n const jsonReportPath = path.join(reportDir, `${reportBaseName}-report.json`);\n const htmlReportPath = path.join(reportDir, `${reportBaseName}-report.html`);\n\n await fs.promises.mkdir(reportDir, { recursive: true });\n await fs.promises.writeFile(jsonReportPath, generateVrtJsonReport(results, summary), \"utf-8\");\n await fs.promises.writeFile(htmlReportPath, generateVrtReport(results, summary), \"utf-8\");\n\n sendJson({\n success: true,\n summary,\n results: results.map((r) => ({\n artPath: r.artPath,\n variantName: r.variantName,\n viewport: r.viewport.name,\n passed: r.passed,\n isNew: r.isNew,\n diffPercentage: r.diffPercentage,\n snapshotPath: r.snapshotPath,\n currentPath: r.currentPath,\n diffPath: r.diffPath,\n error: r.error,\n })),\n artifacts: {\n reportDir,\n htmlReportPath,\n jsonReportPath,\n snapshotDir,\n currentDir: path.join(snapshotDir, \"current\"),\n diffDir: path.join(snapshotDir, \"diff\"),\n },\n });\n } catch (e) {\n if (e instanceof HttpError) {\n sendError(e.message, e.status);\n return;\n }\n sendError(e instanceof Error ? e.message : String(e));\n }\n}\n","/**\n * Musea gallery API route handlers.\n *\n * Extracted from the main plugin to keep file sizes manageable.\n * Provides REST API endpoints consumed by the gallery UI:\n * - GET/POST/PUT/DELETE /api/tokens (delegated to api-tokens.ts)\n * - GET /api/arts, /api/arts/:path, /api/arts/:path/source, etc.\n * - POST /api/preview-with-props\n * - POST /api/generate\n * - POST /api/run-vrt\n */\n\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { ResolvedConfig } from \"vite\";\nimport fs from \"node:fs\";\n\nimport type { ArtFileInfo } from \"../types/index.js\";\nimport {\n handleTokensUsage,\n handleTokensGet,\n handleTokensCreate,\n handleTokensUpdate,\n handleTokensDelete,\n} from \"../api-tokens.js\";\nimport {\n handleArtSource,\n handleArtPalette,\n handleArtAnalysis,\n handleArtDocs,\n handleArtA11y,\n} from \"./handlers.js\";\nimport { handlePreviewWithProps, handleGenerate, handleRunVrt } from \"./post-handlers.js\";\nimport {\n collectRequestBody,\n decodeUrlComponent,\n DEFAULT_API_BODY_LIMIT_BYTES,\n HttpError,\n parseJsonBody,\n resolveInside,\n validateDevApiRequest,\n} from \"../security.js\";\n\n/** Dependencies injected from the plugin closure. */\nexport interface ApiRoutesContext {\n config: ResolvedConfig;\n artFiles: Map<string, ArtFileInfo>;\n scanRoots: string[];\n tokensPath: string | undefined;\n basePath: string;\n resolvedPreviewCss: string[];\n resolvedPreviewSetup: string | null;\n devSessionToken: string;\n apiBodyLimit?: number;\n processArtFile: (filePath: string) => Promise<void>;\n /** Reference to the dev server for VRT port resolution */\n getDevServerPort: () => number;\n}\n\nexport type SendJson = (data: unknown, status?: number) => void;\nexport type SendError = (message: string, status?: number) => void;\nexport type ReadBody = () => Promise<string>;\n\ntype NextFn = () => void;\n\n/**\n * Create the API middleware handler for the Musea gallery.\n *\n * Returns a Connect-compatible middleware function that handles all\n * `/api/...` sub-routes under the configured basePath.\n */\nexport function createApiMiddleware(ctx: ApiRoutesContext) {\n return async (req: IncomingMessage, res: ServerResponse, next: NextFn) => {\n const sendJson: SendJson = (data: unknown, status = 200) => {\n res.statusCode = status;\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify(data));\n };\n\n const sendError: SendError = (message: string, status = 500) => {\n sendJson({ error: message }, status);\n };\n\n const readBody: ReadBody = () =>\n collectRequestBody(req, ctx.apiBodyLimit ?? DEFAULT_API_BODY_LIMIT_BYTES);\n\n const url = req.url || \"/\";\n\n try {\n const requestError = validateDevApiRequest(req, ctx.devSessionToken);\n if (requestError) {\n sendError(requestError.message, requestError.status);\n return;\n }\n\n // --- GET /api/arts ---\n if (url === \"/arts\" && req.method === \"GET\") {\n sendJson(Array.from(ctx.artFiles.values()));\n return;\n }\n\n // --- Token routes (delegated to api-tokens.ts) ---\n if (url === \"/tokens/usage\" && req.method === \"GET\") {\n await handleTokensUsage(ctx, sendJson);\n return;\n }\n if (url === \"/tokens\" && req.method === \"GET\") {\n await handleTokensGet(ctx, sendJson);\n return;\n }\n if (url === \"/tokens\" && req.method === \"POST\") {\n await handleTokensCreate(ctx, readBody, sendJson, sendError);\n return;\n }\n if (url === \"/tokens\" && req.method === \"PUT\") {\n await handleTokensUpdate(ctx, readBody, sendJson, sendError);\n return;\n }\n if (url === \"/tokens\" && req.method === \"DELETE\") {\n await handleTokensDelete(ctx, readBody, sendJson, sendError);\n return;\n }\n\n // --- PUT /api/arts/:path/source (update art source) ---\n if (url?.startsWith(\"/arts/\") && req.method === \"PUT\") {\n const rest = url.slice(6);\n const sourceMatch = rest.match(/^(.+)\\/source$/);\n if (sourceMatch) {\n const artPath = decodeUrlComponent(sourceMatch[1], \"art path\");\n const art = ctx.artFiles.get(artPath);\n if (!art) {\n sendError(\"Art not found\", 404);\n return;\n }\n\n const safeArtPath = resolveInside(ctx.config.root, artPath, \"art path\");\n const body = await readBody();\n const { source } = parseJsonBody<{ source: string }>(body);\n if (typeof source !== \"string\") {\n sendError(\"Missing required field: source\", 400);\n return;\n }\n await fs.promises.writeFile(safeArtPath, source, \"utf-8\");\n await ctx.processArtFile(safeArtPath);\n sendJson({ success: true });\n return;\n }\n next();\n return;\n }\n\n // --- GET /api/arts/:path/... sub-routes ---\n if (url?.startsWith(\"/arts/\") && req.method === \"GET\") {\n const rest = url.slice(6);\n\n const sourceMatch = rest.match(/^(.+)\\/source$/);\n const paletteMatch = rest.match(/^(.+)\\/palette$/);\n const analysisMatch = rest.match(/^(.+)\\/analysis$/);\n const docsMatch = rest.match(/^(.+)\\/docs$/);\n const a11yMatch = rest.match(/^(.+)\\/variants\\/([^/]+)\\/a11y$/);\n\n if (sourceMatch) {\n await handleArtSource(ctx, sourceMatch, sendJson, sendError);\n return;\n }\n\n if (paletteMatch) {\n await handleArtPalette(ctx, paletteMatch, sendJson, sendError);\n return;\n }\n\n if (analysisMatch) {\n await handleArtAnalysis(ctx, analysisMatch, sendJson, sendError);\n return;\n }\n\n if (docsMatch) {\n await handleArtDocs(ctx, docsMatch, sendJson, sendError);\n return;\n }\n\n if (a11yMatch) {\n handleArtA11y(ctx, a11yMatch, sendJson, sendError);\n return;\n }\n\n // GET /api/arts/:path (no sub-resource)\n const artPath = decodeUrlComponent(rest, \"art path\");\n const art = ctx.artFiles.get(artPath);\n if (art) {\n sendJson(art);\n } else {\n sendError(\"Art not found\", 404);\n }\n return;\n }\n\n // --- POST routes (delegated to post-handlers.ts) ---\n if (req.method === \"POST\") {\n const body = await readBody();\n\n if (url === \"/preview-with-props\") {\n handlePreviewWithProps(ctx, body, res, sendJson, sendError);\n return;\n }\n\n if (url === \"/generate\") {\n await handleGenerate(ctx, body, sendJson, sendError);\n return;\n }\n\n if (url === \"/run-vrt\") {\n await handleRunVrt(ctx, body, sendJson, sendError);\n return;\n }\n }\n\n next();\n } catch (e) {\n if (e instanceof HttpError) {\n sendError(e.message, e.status);\n return;\n }\n sendError(e instanceof Error ? e.message : String(e));\n }\n };\n}\n","/**\n * Manifest module generation for Musea.\n *\n * Generates the virtual module that exposes all discovered art files\n * as a JSON manifest.\n */\n\nimport type { ArtFileInfo } from \"./types/index.js\";\n\n/**\n * Generate the virtual manifest module code containing all art file metadata.\n */\nexport function generateManifestModule(artFiles: Map<string, ArtFileInfo>): string {\n const arts = Array.from(artFiles.values());\n return `export const arts = ${JSON.stringify(arts, null, 2)};`;\n}\n","/**\n * Virtual module handling for the Musea Vite plugin.\n *\n * Contains `resolveId`, `load`, and `handleHotUpdate` hooks that\n * manage virtual modules for gallery, manifest, preview, and art files.\n */\n\nimport path from \"node:path\";\nimport type { ModuleNode } from \"vite\";\n\nimport type { ArtFileInfo } from \"../types/index.js\";\n\nimport { generateGalleryModule } from \"../gallery/index.js\";\nimport { generatePreviewModule } from \"../preview/index.js\";\nimport { generateManifestModule } from \"../manifest.js\";\nimport { generateArtModule } from \"../art-module.js\";\nimport { toPascalCase } from \"../utils.js\";\n\n// Virtual module prefixes\nconst VIRTUAL_MUSEA_PREFIX = \"\\0musea:\";\nconst VIRTUAL_GALLERY = \"\\0musea-gallery\";\nconst VIRTUAL_MANIFEST = \"\\0musea-manifest\";\n\nexport { VIRTUAL_MUSEA_PREFIX, VIRTUAL_GALLERY, VIRTUAL_MANIFEST };\n\n/**\n * Shared state required by virtual module hooks.\n */\nexport interface VirtualModuleState {\n basePath: string;\n inlineArt: boolean;\n artFiles: Map<string, ArtFileInfo>;\n resolvedPreviewCss: string[];\n resolvedPreviewSetup: string | null;\n getConfigRoot: () => string;\n getScanRoots: () => string[];\n getServer: () => {\n moduleGraph: { getModulesByFile(id: string): Set<ModuleNode> | undefined };\n } | null;\n processArtFile: (filePath: string) => Promise<void>;\n}\n\nexport function createResolveId(state: VirtualModuleState) {\n return function resolveId(id: string): string | null {\n const root = state.getConfigRoot();\n\n if (id === VIRTUAL_GALLERY) {\n return VIRTUAL_GALLERY;\n }\n if (id === VIRTUAL_MANIFEST) {\n return VIRTUAL_MANIFEST;\n }\n // Handle virtual:musea-preview: prefix for preview modules\n if (id.startsWith(\"virtual:musea-preview:\")) {\n return \"\\0musea-preview:\" + id.slice(\"virtual:musea-preview:\".length);\n }\n // Handle virtual:musea-art: prefix for preview modules\n // Append ?musea-virtual to prevent other plugins (e.g. unplugin-vue-i18n)\n // from treating .vue-ending virtual IDs as Vue SFC files\n if (id.startsWith(\"virtual:musea-art:\")) {\n const artPath = id.slice(\"virtual:musea-art:\".length);\n if (state.artFiles.has(artPath)) {\n return \"\\0musea-art:\" + artPath + \"?musea-virtual\";\n }\n }\n if (id.endsWith(\".art.vue\")) {\n const resolved = path.resolve(root, id);\n if (state.artFiles.has(resolved)) {\n return VIRTUAL_MUSEA_PREFIX + resolved + \"?musea-virtual\";\n }\n }\n // Inline art: resolve .vue files that have <art> blocks\n if (state.inlineArt && id.endsWith(\".vue\") && !id.endsWith(\".art.vue\")) {\n const resolved = path.resolve(root, id);\n if (state.artFiles.has(resolved)) {\n return VIRTUAL_MUSEA_PREFIX + resolved + \"?musea-virtual\";\n }\n }\n return null;\n };\n}\n\nexport function createLoad(state: VirtualModuleState) {\n return function load(id: string): string | null {\n if (id === VIRTUAL_GALLERY) {\n return generateGalleryModule(state.basePath);\n }\n if (id === VIRTUAL_MANIFEST) {\n return generateManifestModule(state.artFiles);\n }\n // Handle \\0musea-preview: prefix for preview modules\n if (id.startsWith(\"\\0musea-preview:\")) {\n const rest = id.slice(\"\\0musea-preview:\".length);\n const lastColonIndex = rest.lastIndexOf(\":\");\n if (lastColonIndex !== -1) {\n const artPath = rest.slice(0, lastColonIndex);\n const variantName = rest.slice(lastColonIndex + 1);\n const art = state.artFiles.get(artPath);\n if (art) {\n const variantComponentName = toPascalCase(variantName);\n return generatePreviewModule(\n art,\n variantComponentName,\n variantName,\n state.resolvedPreviewCss,\n state.resolvedPreviewSetup,\n );\n }\n }\n }\n // Handle \\0musea-art: prefix for preview modules\n if (id.startsWith(\"\\0musea-art:\")) {\n const artPath = id.slice(\"\\0musea-art:\".length).replace(/\\?musea-virtual$/, \"\");\n const art = state.artFiles.get(artPath);\n if (art) {\n return generateArtModule(art, artPath, {\n root: state.getConfigRoot(),\n scanRoots: state.getScanRoots(),\n });\n }\n }\n if (id.startsWith(VIRTUAL_MUSEA_PREFIX)) {\n const realPath = id.slice(VIRTUAL_MUSEA_PREFIX.length).replace(/\\?musea-virtual$/, \"\");\n const art = state.artFiles.get(realPath);\n if (art) {\n return generateArtModule(art, realPath, {\n root: state.getConfigRoot(),\n scanRoots: state.getScanRoots(),\n });\n }\n }\n return null;\n };\n}\n\nexport function createHandleHotUpdate(state: VirtualModuleState) {\n return async function handleHotUpdate(ctx: { file: string }): Promise<ModuleNode[] | undefined> {\n const { file } = ctx;\n if (file.endsWith(\".art.vue\") && state.artFiles.has(file)) {\n await state.processArtFile(file);\n\n // Invalidate virtual modules\n const virtualId = VIRTUAL_MUSEA_PREFIX + file + \"?musea-virtual\";\n const server = state.getServer();\n const modules = server?.moduleGraph.getModulesByFile(virtualId);\n if (modules) {\n return [...modules];\n }\n }\n\n // Inline art: HMR for .vue files with <art> blocks\n if (\n state.inlineArt &&\n file.endsWith(\".vue\") &&\n !file.endsWith(\".art.vue\") &&\n state.artFiles.has(file)\n ) {\n await state.processArtFile(file);\n\n const virtualId = VIRTUAL_MUSEA_PREFIX + file;\n const server = state.getServer();\n const modules = server?.moduleGraph.getModulesByFile(virtualId);\n if (modules) {\n return [...modules];\n }\n }\n\n return undefined;\n };\n}\n","/**\n * Main Musea Vite plugin implementation.\n *\n * Contains the `musea()` factory function that creates the Vite plugin,\n * including dev server middleware, config resolution, and build-start scanning.\n *\n * Virtual module hooks (resolveId / load / handleHotUpdate) are extracted into\n * `virtual.ts`.\n *\n * Middleware and API route logic is extracted into:\n * - `server-middleware.ts` -- gallery SPA, preview, art module serving\n * - `api-routes.ts` -- REST API endpoints for gallery UI\n */\n\nimport type { Plugin, ViteDevServer, ResolvedConfig } from \"vite\";\nimport { transformWithEsbuild } from \"vite\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { vizeConfigStore } from \"@vizejs/vite-plugin\";\n\nimport type { MuseaOptions, ArtFileInfo, ArtMetadata } from \"../types/index.js\";\n\nimport { loadNative } from \"../native-loader.js\";\nimport { extractScriptSetupContent } from \"../art-module.js\";\nimport {\n shouldProcess,\n scanArtFiles,\n generateStorybookFiles,\n buildThemeConfig,\n resolveScanRoots,\n} from \"../utils.js\";\nimport { registerMiddleware } from \"../server-middleware.js\";\nimport { createApiMiddleware } from \"../api-routes/index.js\";\nimport { createDevSessionToken } from \"../security.js\";\nimport {\n createResolveId,\n createLoad,\n createHandleHotUpdate,\n type VirtualModuleState,\n} from \"./virtual.js\";\n\nfunction extractArtTagAttributes(source: string): Record<string, string | true> {\n const artTagMatch = source.match(/<art\\b([\\s\\S]*?)>/i);\n if (!artTagMatch) return {};\n\n const attributes: Record<string, string | true> = {};\n const attrPattern = /([^\\s=/>]+)(?:\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'))?/g;\n\n for (const match of artTagMatch[1].matchAll(attrPattern)) {\n const name = match[1];\n if (!name || name === \"/\") continue;\n attributes[name] = match[2] ?? match[3] ?? true;\n }\n\n return attributes;\n}\n\nfunction parseActionEvents(value: string | true | undefined): string[] | undefined {\n if (typeof value !== \"string\") return undefined;\n\n const events = value\n .split(\",\")\n .map((eventName) => eventName.trim().toLowerCase())\n .filter(Boolean);\n\n return events.length > 0 ? [...new Set(events)] : undefined;\n}\n\nfunction extractCustomArtMetadata(source: string): Pick<ArtMetadata, \"actionEvents\"> {\n const attrs = extractArtTagAttributes(source);\n const actionEvents = new Set(parseActionEvents(attrs[\"action-events\"]) ?? []);\n const captureMousemove = attrs[\"capture-mousemove\"];\n\n if (captureMousemove === true || captureMousemove === \"true\") {\n actionEvents.add(\"mousemove\");\n }\n\n return {\n actionEvents: actionEvents.size > 0 ? [...actionEvents] : undefined,\n };\n}\n\nfunction extractStyleBlocks(source: string): string[] {\n const styles: string[] = [];\n\n for (const match of source.matchAll(/<style\\b([^>]*)>([\\s\\S]*?)<\\/style>/gi)) {\n const attrs = match[1] ?? \"\";\n const content = match[2]?.trim();\n const lang = attrs.match(/\\blang\\s*=\\s*[\"']([^\"']+)[\"']/i)?.[1]?.toLowerCase();\n\n if (!content) {\n continue;\n }\n\n if (lang && lang !== \"css\") {\n continue;\n }\n\n styles.push(content);\n }\n\n return styles;\n}\n\n/**\n * Create Musea Vite plugin.\n */\nexport function musea(options: MuseaOptions = {}): Plugin[] {\n let include = options.include ?? [\"**/*.art.vue\"];\n let exclude = options.exclude ?? [\"node_modules/**\", \"dist/**\"];\n let basePath = options.basePath ?? \"/__musea__\";\n let storybookCompat = options.storybookCompat ?? false;\n const storybookOutDir = options.storybookOutDir ?? \".storybook/stories\";\n let inlineArt = options.inlineArt ?? false;\n const tokensPath = options.tokensPath;\n const themeConfig = buildThemeConfig(options.theme);\n const previewCss = options.previewCss ?? [];\n const previewSetup = options.previewSetup;\n const devSessionToken = createDevSessionToken();\n\n let config: ResolvedConfig;\n let server: ViteDevServer | null = null;\n const artFiles = new Map<string, ArtFileInfo>();\n let resolvedPreviewCss: string[] = [];\n let resolvedPreviewSetup: string | null = null;\n let scanRoots: string[] = [];\n\n // Shared state for virtual module hooks\n const virtualState: VirtualModuleState = {\n basePath,\n get inlineArt() {\n return inlineArt;\n },\n artFiles,\n resolvedPreviewCss,\n resolvedPreviewSetup,\n getConfigRoot: () => config.root,\n getScanRoots: () => scanRoots,\n getServer: () => server,\n processArtFile,\n };\n\n // Create virtual module hooks\n const resolveId = createResolveId(virtualState);\n const load = createLoad(virtualState);\n const handleHotUpdate = createHandleHotUpdate(virtualState);\n\n // Main plugin\n const mainPlugin: Plugin = {\n name: \"vite-plugin-musea\",\n enforce: \"pre\",\n\n config() {\n // Add Vue alias for runtime template compilation\n // This is needed because variant templates are compiled at runtime\n return {\n resolve: {\n alias: {\n vue: \"vue/dist/vue.esm-bundler.js\",\n },\n },\n };\n },\n\n configResolved(resolvedConfig) {\n config = resolvedConfig;\n\n // Merge musea config from vize.config.ts (plugin args > config file > defaults)\n const vizeConfig = vizeConfigStore.get(resolvedConfig.root);\n if (vizeConfig?.musea) {\n const mc = vizeConfig.musea;\n // Only apply config file values when plugin options were not explicitly set\n if (!options.include && mc.include) include = mc.include;\n if (!options.exclude && mc.exclude) exclude = mc.exclude;\n if (!options.basePath && mc.basePath) basePath = mc.basePath;\n if (options.storybookCompat === undefined && mc.storybookCompat !== undefined)\n storybookCompat = mc.storybookCompat;\n if (options.inlineArt === undefined && mc.inlineArt !== undefined) inlineArt = mc.inlineArt;\n }\n\n // Update virtualState.basePath in case it changed from config resolution\n virtualState.basePath = basePath;\n\n // Resolve previewCss paths to absolute paths\n resolvedPreviewCss = previewCss.map((cssPath) =>\n path.isAbsolute(cssPath) ? cssPath : path.resolve(resolvedConfig.root, cssPath),\n );\n\n // Resolve previewSetup path\n if (previewSetup) {\n resolvedPreviewSetup = path.isAbsolute(previewSetup)\n ? previewSetup\n : path.resolve(resolvedConfig.root, previewSetup);\n }\n\n // Update shared state references after resolution\n virtualState.resolvedPreviewCss = resolvedPreviewCss;\n virtualState.resolvedPreviewSetup = resolvedPreviewSetup;\n scanRoots = resolveScanRoots(resolvedConfig.root, include);\n },\n\n configureServer(devServer) {\n server = devServer;\n devServer.watcher.add(scanRoots);\n\n // Register gallery SPA, preview, and art module middleware\n registerMiddleware(devServer, {\n basePath,\n devSessionToken,\n themeConfig,\n artFiles,\n scanRoots,\n resolvedPreviewCss,\n resolvedPreviewSetup,\n });\n\n // Register API endpoints\n devServer.middlewares.use(\n `${basePath}/api`,\n createApiMiddleware({\n config,\n artFiles,\n scanRoots,\n tokensPath,\n basePath,\n resolvedPreviewCss,\n resolvedPreviewSetup,\n devSessionToken,\n processArtFile,\n getDevServerPort: () => devServer.config.server.port || 5173,\n }),\n );\n\n // Watch for Art file changes\n devServer.watcher.on(\"change\", async (file) => {\n if (file.endsWith(\".art.vue\") && shouldProcess(file, include, exclude, config.root)) {\n await processArtFile(file);\n console.log(`[musea] Reloaded: ${path.relative(config.root, file)}`);\n }\n // Inline art: re-check .vue files on change\n if (inlineArt && file.endsWith(\".vue\") && !file.endsWith(\".art.vue\")) {\n const hadArt = artFiles.has(file);\n const source = await fs.promises.readFile(file, \"utf-8\");\n if (source.includes(\"<art\")) {\n await processArtFile(file);\n console.log(`[musea] Reloaded inline art: ${path.relative(config.root, file)}`);\n } else if (hadArt) {\n artFiles.delete(file);\n console.log(`[musea] Removed inline art: ${path.relative(config.root, file)}`);\n }\n }\n });\n\n devServer.watcher.on(\"add\", async (file) => {\n if (file.endsWith(\".art.vue\") && shouldProcess(file, include, exclude, config.root)) {\n await processArtFile(file);\n console.log(`[musea] Added: ${path.relative(config.root, file)}`);\n }\n // Inline art: check new .vue files\n if (inlineArt && file.endsWith(\".vue\") && !file.endsWith(\".art.vue\")) {\n const source = await fs.promises.readFile(file, \"utf-8\");\n if (source.includes(\"<art\")) {\n await processArtFile(file);\n console.log(`[musea] Added inline art: ${path.relative(config.root, file)}`);\n }\n }\n });\n\n devServer.watcher.on(\"unlink\", (file) => {\n if (artFiles.has(file)) {\n artFiles.delete(file);\n console.log(`[musea] Removed: ${path.relative(config.root, file)}`);\n }\n });\n\n // Print Musea gallery URL after server starts\n return () => {\n devServer.httpServer?.once(\"listening\", () => {\n const address = devServer.httpServer?.address();\n if (address && typeof address === \"object\") {\n const protocol = devServer.config.server.https ? \"https\" : \"http\";\n const rawHost = address.address;\n // Normalize IPv6/IPv4 localhost addresses to \"localhost\"\n const host =\n rawHost === \"::\" ||\n rawHost === \"::1\" ||\n rawHost === \"0.0.0.0\" ||\n rawHost === \"127.0.0.1\"\n ? \"localhost\"\n : rawHost;\n const port = address.port;\n const url = `${protocol}://${host}:${port}${basePath}`;\n\n console.log();\n console.log(` \\x1b[36m➜\\x1b[0m \\x1b[1mMusea Gallery:\\x1b[0m \\x1b[36m${url}\\x1b[0m`);\n }\n });\n };\n },\n\n async buildStart() {\n // Scan for Art files\n console.log(`[musea] config.root: ${config.root}, include: ${JSON.stringify(include)}`);\n const files = await scanArtFiles(config.root, include, exclude, inlineArt);\n\n console.log(`[musea] Found ${files.length} art files`);\n\n if (server) {\n server.watcher.add(scanRoots);\n server.watcher.add(files);\n }\n\n for (const file of files) {\n await processArtFile(file);\n }\n\n // Generate Storybook CSF if enabled\n if (storybookCompat) {\n await generateStorybookFiles(artFiles, config.root, storybookOutDir);\n }\n },\n\n resolveId,\n load,\n async transform(code, id) {\n if (!id.includes(\"?musea-virtual\")) {\n return null;\n }\n\n if (!id.includes(\"musea-art:\") && !id.includes(\"\\0musea:\")) {\n return null;\n }\n\n const safeId = id\n .replaceAll(\"\\0\", \"\")\n .replace(/[^\\w./-]+/g, \"_\")\n .replace(/_+/g, \"_\");\n const loaderId = path.join(config.root, `.musea-${safeId}.ts`);\n\n return transformWithEsbuild(code, loaderId, {\n loader: \"ts\",\n format: \"esm\",\n sourcemap: config.command === \"serve\",\n target: \"esnext\",\n });\n },\n handleHotUpdate,\n };\n\n // Helper functions scoped to this plugin instance\n\n async function processArtFile(filePath: string): Promise<void> {\n try {\n const source = await fs.promises.readFile(filePath, \"utf-8\");\n const binding = loadNative();\n const parsed = binding.parseArt(source, { filename: filePath });\n const customMetadata = extractCustomArtMetadata(source);\n\n // Skip files with no variants (e.g. .vue files without <art> block)\n if (!parsed.variants || parsed.variants.length === 0) return;\n\n const isInline = !filePath.endsWith(\".art.vue\");\n\n const info: ArtFileInfo = {\n path: filePath,\n metadata: {\n title: parsed.metadata.title || (isInline ? path.basename(filePath, \".vue\") : \"\"),\n description: parsed.metadata.description,\n component: isInline ? undefined : parsed.metadata.component,\n category: parsed.metadata.category,\n tags: parsed.metadata.tags,\n status: parsed.metadata.status as \"draft\" | \"ready\" | \"deprecated\",\n order: parsed.metadata.order,\n actionEvents: customMetadata.actionEvents ?? parsed.metadata.actionEvents,\n },\n variants: parsed.variants.map((v) => ({\n name: v.name,\n template: v.template,\n isDefault: v.isDefault,\n skipVrt: v.skipVrt,\n })),\n hasScriptSetup: isInline ? false : parsed.hasScriptSetup,\n scriptSetupContent:\n !isInline && parsed.hasScriptSetup ? extractScriptSetupContent(source) : undefined,\n hasScript: parsed.hasScript,\n styleCount: parsed.styleCount,\n styleBlocks: isInline ? [] : extractStyleBlocks(source),\n isInline,\n componentPath: isInline ? filePath : undefined,\n };\n\n artFiles.set(filePath, info);\n } catch (e) {\n console.error(`[musea] Failed to process ${filePath}:`, e);\n }\n }\n\n return [mainPlugin];\n}\n","/**\n * Vite plugin for Musea - Component gallery for Vue components.\n *\n * @example\n * ```ts\n * import { defineConfig } from 'vite';\n * import { vize } from '@vizejs/vite-plugin';\n * import { musea } from '@vizejs/vite-plugin-musea';\n *\n * export default defineConfig({\n * plugins: [vize(), musea()],\n * });\n * ```\n */\n\nexport { musea } from \"./plugin/index.js\";\n\nexport type {\n MuseaOptions,\n MuseaTheme,\n MuseaThemeColors,\n ArtFileInfo,\n ArtMetadata,\n ArtVariant,\n CsfOutput,\n VrtOptions,\n ViewportConfig,\n PaletteApiResponse,\n AnalysisApiResponse,\n A11yOptions,\n A11yResult,\n CaptureConfig,\n ComparisonConfig,\n CiConfig,\n} from \"./types/index.js\";\n\nexport {\n MuseaVrtRunner,\n generateVrtReport,\n generateVrtJsonReport,\n type VrtResult,\n type VrtSummary,\n} from \"./vrt.js\";\n\nexport {\n processStyleDictionary,\n parseTokens,\n generateTokensHtml,\n generateTokensMarkdown,\n buildTokenMap,\n resolveReferences,\n scanTokenUsage,\n type DesignToken,\n type TokenCategory,\n type StyleDictionaryConfig,\n type StyleDictionaryOutput,\n type TokenUsageMap,\n} from \"./style-dictionary.js\";\n\nexport { MuseaA11yRunner, type A11ySummary } from \"./a11y/index.js\";\n\nexport {\n generateArtFile,\n writeArtFile,\n type AutogenOptions,\n type AutogenOutput,\n type PropDefinition,\n type GeneratedVariant,\n} from \"./autogen/index.js\";\n\nimport { musea } from \"./plugin/index.js\";\nexport default musea;\n"],"mappings":"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"}
|