@fragments-sdk/cli 0.3.3 → 0.4.1
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/bin.js +18 -13
- package/dist/bin.js.map +1 -1
- package/dist/{chunk-PMGI7ATF.js → chunk-5CKYLCJH.js} +58 -2
- package/dist/chunk-5CKYLCJH.js.map +1 -0
- package/dist/{chunk-MUZ6CM66.js → chunk-5ZYEOHYK.js} +13 -11
- package/dist/chunk-5ZYEOHYK.js.map +1 -0
- package/dist/{chunk-XHNKNI6J.js → chunk-AW7MWOUH.js} +9 -1
- package/dist/chunk-AW7MWOUH.js.map +1 -0
- package/dist/{chunk-LY2CFFPY.js → chunk-G3M3MPQ6.js} +14 -3
- package/dist/chunk-G3M3MPQ6.js.map +1 -0
- package/dist/{chunk-3OTEW66K.js → chunk-J4SI5RIH.js} +4 -4
- package/dist/{chunk-BSCG3IP7.js → chunk-NOTYONHY.js} +2 -2
- package/dist/{chunk-D6VXWI45.js → chunk-ZFKGX3QK.js} +8 -6
- package/dist/chunk-ZFKGX3QK.js.map +1 -0
- package/dist/{core-DWKLGY4N.js → core-LNXDLXDP.js} +5 -3
- package/dist/{generate-3LBZANQ3.js → generate-OIXXHOWR.js} +4 -4
- package/dist/index.d.ts +16 -0
- package/dist/index.js +6 -6
- package/dist/{init-NKIUCYTG.js → init-EVPXIDW4.js} +4 -4
- package/dist/mcp-bin.js +3 -3
- package/dist/mcp-bin.js.map +1 -1
- package/dist/scan-YVYD64GD.js +12 -0
- package/dist/{service-QSZMZJBJ.js → service-K52ORLCJ.js} +4 -4
- package/dist/{static-viewer-MIPGZ4Z7.js → static-viewer-JNQIHA4B.js} +4 -4
- package/dist/{test-ZCTR4LBB.js → test-USARUEFW.js} +9 -5
- package/dist/test-USARUEFW.js.map +1 -0
- package/dist/{tokens-5JQ5IOR2.js → tokens-C6YHBOQE.js} +5 -5
- package/dist/{viewer-D7QC4GM2.js → viewer-H7TVFT4E.js} +15 -15
- package/dist/{viewer-D7QC4GM2.js.map → viewer-H7TVFT4E.js.map} +1 -1
- package/package.json +2 -1
- package/src/bin.ts +7 -1
- package/src/build.ts +2 -0
- package/src/core/index.ts +4 -0
- package/src/core/parser.ts +102 -1
- package/src/core/schema.ts +11 -0
- package/src/core/storyAdapter.ts +1 -1
- package/src/core/storybook-csf.ts +11 -0
- package/src/core/types.ts +25 -1
- package/src/mcp/server.ts +1 -1
- package/src/migrate/bin.ts +7 -1
- package/src/migrate/report.ts +1 -1
- package/src/service/enhance/doc-extractor.ts +2 -2
- package/src/service/enhance/props-extractor.ts +1 -1
- package/src/service/enhance/storybook-parser.ts +1 -1
- package/src/service/figma.ts +2 -2
- package/src/service/metrics-store.ts +2 -1
- package/src/service/patch-generator.ts +2 -1
- package/src/service/report.ts +1 -1
- package/src/test/reporters/junit.ts +7 -3
- package/src/test/runner.ts +4 -4
- package/src/test/watch.ts +2 -2
- package/src/theme/__tests__/generator.test.ts +412 -0
- package/src/theme/__tests__/presets.test.ts +169 -0
- package/src/theme/__tests__/schema.test.ts +463 -0
- package/src/theme/__tests__/serializer.test.ts +326 -0
- package/src/theme/generator.ts +355 -0
- package/src/theme/index.ts +61 -0
- package/src/theme/presets.ts +189 -0
- package/src/theme/schema.ts +193 -0
- package/src/theme/serializer.ts +123 -0
- package/src/theme/types.ts +210 -0
- package/src/viewer/components/CodePanel.tsx +1 -1
- package/src/viewer/components/FigmaEmbed.tsx +1 -1
- package/src/viewer/jsx-parser.ts +2 -1
- package/src/viewer/styles/globals.css +1 -1
- package/src/viewer/utils/colorSchemes.ts +3 -3
- package/dist/chunk-D6VXWI45.js.map +0 -1
- package/dist/chunk-LY2CFFPY.js.map +0 -1
- package/dist/chunk-MUZ6CM66.js.map +0 -1
- package/dist/chunk-PMGI7ATF.js.map +0 -1
- package/dist/chunk-XHNKNI6J.js.map +0 -1
- package/dist/scan-3ZAOVO4U.js +0 -12
- package/dist/test-ZCTR4LBB.js.map +0 -1
- /package/dist/{chunk-3OTEW66K.js.map → chunk-J4SI5RIH.js.map} +0 -0
- /package/dist/{chunk-BSCG3IP7.js.map → chunk-NOTYONHY.js.map} +0 -0
- /package/dist/{core-DWKLGY4N.js.map → core-LNXDLXDP.js.map} +0 -0
- /package/dist/{generate-3LBZANQ3.js.map → generate-OIXXHOWR.js.map} +0 -0
- /package/dist/{init-NKIUCYTG.js.map → init-EVPXIDW4.js.map} +0 -0
- /package/dist/{scan-3ZAOVO4U.js.map → scan-YVYD64GD.js.map} +0 -0
- /package/dist/{service-QSZMZJBJ.js.map → service-K52ORLCJ.js.map} +0 -0
- /package/dist/{static-viewer-MIPGZ4Z7.js.map → static-viewer-JNQIHA4B.js.map} +0 -0
- /package/dist/{tokens-5JQ5IOR2.js.map → tokens-C6YHBOQE.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/config.ts","../src/core/discovery.ts","../src/core/generators/typescript-extractor.ts","../src/core/generators/registry.ts","../src/core/generators/context.ts","../src/core/loader.ts","../src/core/parser.ts","../src/core/previewLoader.ts","../src/core/importAnalyzer.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport { createJiti } from 'jiti';\nimport { BRAND } from './constants.js';\nimport type { SegmentsConfig } from './types.js';\nimport { segmentsConfigSchema } from './schema.js';\n\nconst DEFAULT_CONFIG: SegmentsConfig = {\n include: [\n `src/**/*${BRAND.fileExtension}`, // *.segment.tsx files\n 'src/**/*.stories.tsx', // Storybook stories (auto-converted)\n ],\n exclude: ['**/node_modules/**'],\n components: ['src/**/index.tsx', 'src/**/*.tsx'],\n framework: 'react',\n};\n\n/**\n * Find the config file in the current directory or parent directories.\n * Checks for both the current config file name and the legacy name.\n */\nexport function findConfigFile(startDir: string = process.cwd()): string | null {\n let currentDir = startDir;\n\n while (currentDir !== dirname(currentDir)) {\n // Check for current config file name first\n const configPath = resolve(currentDir, BRAND.configFile);\n if (existsSync(configPath)) {\n return configPath;\n }\n // Also check for legacy config file name\n const legacyConfigPath = resolve(currentDir, BRAND.legacyConfigFile);\n if (existsSync(legacyConfigPath)) {\n return legacyConfigPath;\n }\n currentDir = dirname(currentDir);\n }\n\n return null;\n}\n\n/**\n * Load and validate the config file\n */\nexport async function loadConfig(configPath?: string): Promise<{\n config: SegmentsConfig;\n configDir: string;\n}> {\n const resolvedPath = configPath ?? findConfigFile();\n\n if (!resolvedPath) {\n return {\n config: DEFAULT_CONFIG,\n configDir: process.cwd(),\n };\n }\n\n try {\n // Use jiti to load TypeScript config files\n const jiti = createJiti(import.meta.url, {\n interopDefault: true,\n });\n const rawConfig = await jiti.import(resolvedPath);\n\n const result = segmentsConfigSchema.safeParse(rawConfig);\n\n if (!result.success) {\n const errors = result.error.errors\n .map((e) => ` - ${e.path.join('.')}: ${e.message}`)\n .join('\\n');\n throw new Error(`Invalid config in ${resolvedPath}:\\n${errors}`);\n }\n\n return {\n config: { ...DEFAULT_CONFIG, ...result.data },\n configDir: dirname(resolvedPath),\n };\n } catch (error) {\n if (error instanceof Error && error.message.includes('Invalid config')) {\n throw error;\n }\n throw new Error(`Failed to load config from ${resolvedPath}: ${error}`);\n }\n}\n","import { resolve, dirname, basename } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport fg from 'fast-glob';\nimport type { SegmentsConfig } from './types.js';\nimport { BRAND } from './constants.js';\n\nexport interface DiscoveredFile {\n /** Absolute path to the file */\n absolutePath: string;\n /** Path relative to config directory */\n relativePath: string;\n}\n\n/**\n * Discovered component with source file information\n */\nexport interface DiscoveredComponent {\n /** Component name (e.g., \"Button\") */\n name: string;\n /** Absolute path to the component source file */\n sourcePath: string;\n /** Path relative to config directory */\n relativePath: string;\n /** Path to storybook file if found */\n storyPath?: string;\n}\n\n/**\n * Discover recipe files (*.recipe.ts) under the config directory\n */\nexport async function discoverRecipeFiles(\n configDir: string,\n exclude?: string[]\n): Promise<DiscoveredFile[]> {\n const pattern = `**/*${BRAND.recipeFileExtension}`;\n const files = await fg(pattern, {\n cwd: configDir,\n ignore: exclude ?? ['**/node_modules/**', '**/dist/**'],\n absolute: false,\n });\n\n return files.map((relativePath) => ({\n relativePath,\n absolutePath: resolve(configDir, relativePath),\n }));\n}\n\n/**\n * Discover segment files matching the config patterns\n */\nexport async function discoverSegmentFiles(\n config: SegmentsConfig,\n configDir: string\n): Promise<DiscoveredFile[]> {\n const files = await fg(config.include, {\n cwd: configDir,\n ignore: config.exclude ?? [],\n absolute: false,\n });\n\n return files.map((relativePath) => ({\n relativePath,\n absolutePath: resolve(configDir, relativePath),\n }));\n}\n\n/**\n * Discover component files for coverage validation\n */\nexport async function discoverComponentFiles(\n config: SegmentsConfig,\n configDir: string\n): Promise<DiscoveredFile[]> {\n if (!config.components || config.components.length === 0) {\n return [];\n }\n\n const files = await fg(config.components, {\n cwd: configDir,\n ignore: [\n ...(config.exclude ?? []),\n // Exclude segment files themselves\n ...config.include,\n // Exclude test files\n '**/*.test.*',\n '**/*.spec.*',\n '**/__tests__/**',\n ],\n absolute: false,\n });\n\n return files.map((relativePath) => ({\n relativePath,\n absolutePath: resolve(configDir, relativePath),\n }));\n}\n\n/**\n * Extract component name from file path\n */\nexport function extractComponentName(filePath: string): string {\n // Handle index.tsx files - use parent directory name\n const parts = filePath.replace(/\\\\/g, '/').split('/');\n const fileName = parts[parts.length - 1];\n\n if (fileName === 'index.tsx' || fileName === 'index.ts') {\n return parts[parts.length - 2] ?? 'Unknown';\n }\n\n // Remove extension\n return fileName.replace(/\\.(tsx?|jsx?)$/, '');\n}\n\n/**\n * Default patterns for component discovery\n */\nconst DEFAULT_COMPONENT_PATTERNS = [\n 'src/components/**/*.tsx',\n 'src/components/**/index.tsx',\n 'components/**/*.tsx',\n 'lib/components/**/*.tsx',\n 'packages/*/src/components/**/*.tsx',\n];\n\n/**\n * Patterns to exclude from component discovery\n */\nconst DEFAULT_EXCLUDE_PATTERNS = [\n '**/*.test.*',\n '**/*.spec.*',\n '**/*.stories.*',\n '**/*.story.*',\n '**/__tests__/**',\n '**/__mocks__/**',\n '**/node_modules/**',\n '**/dist/**',\n];\n\n/**\n * Discover components from source files\n *\n * This function finds React components by:\n * 1. Looking for TypeScript/TSX files in common component directories\n * 2. Filtering out test files, stories, and internal files\n * 3. Extracting component names from file names or directories\n */\nexport async function discoverComponentsFromSource(\n configDir: string,\n patterns?: string[],\n exclude?: string[]\n): Promise<DiscoveredComponent[]> {\n const searchPatterns = patterns && patterns.length > 0\n ? patterns\n : DEFAULT_COMPONENT_PATTERNS;\n\n const excludePatterns = [\n ...DEFAULT_EXCLUDE_PATTERNS,\n ...(exclude ?? []),\n ];\n\n const files = await fg(searchPatterns, {\n cwd: configDir,\n ignore: excludePatterns,\n absolute: false,\n });\n\n // Filter to only component-like files (start with uppercase)\n const componentFiles = files.filter((file) => {\n const name = extractComponentName(file);\n return /^[A-Z]/.test(name);\n });\n\n // Find associated story files\n const storyPatterns = [\n '**/*.stories.tsx',\n '**/*.stories.ts',\n '**/*.story.tsx',\n '**/*.story.ts',\n ];\n\n const storyFiles = await fg(storyPatterns, {\n cwd: configDir,\n ignore: ['**/node_modules/**', '**/dist/**'],\n absolute: false,\n });\n\n const storyMap = new Map<string, string>();\n for (const storyFile of storyFiles) {\n const name = extractComponentName(storyFile.replace(/\\.stories?\\.(tsx?|jsx?)$/, '.tsx'));\n storyMap.set(name, storyFile);\n }\n\n // Build discovered components\n const components: DiscoveredComponent[] = [];\n\n for (const file of componentFiles) {\n const name = extractComponentName(file);\n const absolutePath = resolve(configDir, file);\n\n // Look for story file\n const storyFile = storyMap.get(name);\n\n components.push({\n name,\n sourcePath: absolutePath,\n relativePath: file,\n storyPath: storyFile ? resolve(configDir, storyFile) : undefined,\n });\n }\n\n // Sort by name\n components.sort((a, b) => a.name.localeCompare(b.name));\n\n return components;\n}\n\n/**\n * Discover components from a barrel export file (index.ts)\n *\n * Parses the barrel file to find exported components.\n * This is useful for libraries that expose components through a single entry point.\n */\nexport async function discoverComponentsFromBarrel(\n barrelPath: string,\n configDir: string\n): Promise<DiscoveredComponent[]> {\n const absoluteBarrelPath = resolve(configDir, barrelPath);\n\n if (!existsSync(absoluteBarrelPath)) {\n return [];\n }\n\n const content = await readFile(absoluteBarrelPath, 'utf-8');\n const components: DiscoveredComponent[] = [];\n\n // Match export statements like:\n // export { Button } from './Button'\n // export { Card, CardHeader } from './Card'\n // export * from './Modal'\n const exportRegex = /export\\s+(?:\\*|{([^}]+)})\\s+from\\s+['\"]([^'\"]+)['\"]/g;\n\n let match;\n while ((match = exportRegex.exec(content)) !== null) {\n const exportedNames = match[1];\n const importPath = match[2];\n\n // Resolve the import path\n const barrelDir = dirname(absoluteBarrelPath);\n let resolvedPath = resolve(barrelDir, importPath);\n\n // Add extension if needed\n if (!resolvedPath.endsWith('.tsx') && !resolvedPath.endsWith('.ts')) {\n if (existsSync(`${resolvedPath}.tsx`)) {\n resolvedPath = `${resolvedPath}.tsx`;\n } else if (existsSync(`${resolvedPath}.ts`)) {\n resolvedPath = `${resolvedPath}.ts`;\n } else if (existsSync(`${resolvedPath}/index.tsx`)) {\n resolvedPath = `${resolvedPath}/index.tsx`;\n } else if (existsSync(`${resolvedPath}/index.ts`)) {\n resolvedPath = `${resolvedPath}/index.ts`;\n }\n }\n\n if (!existsSync(resolvedPath)) {\n continue;\n }\n\n if (exportedNames) {\n // Named exports: { Button, Card }\n const names = exportedNames.split(',').map((n) => n.trim().split(/\\s+as\\s+/)[0].trim());\n for (const name of names) {\n if (/^[A-Z]/.test(name)) {\n const relativePath = resolvedPath.replace(configDir + '/', '');\n components.push({\n name,\n sourcePath: resolvedPath,\n relativePath,\n });\n }\n }\n } else {\n // Star export: export * from './Component'\n const name = extractComponentName(importPath);\n if (/^[A-Z]/.test(name)) {\n const relativePath = resolvedPath.replace(configDir + '/', '');\n components.push({\n name,\n sourcePath: resolvedPath,\n relativePath,\n });\n }\n }\n }\n\n return components;\n}\n\n/**\n * Discover fragment files from installed packages that declare a \"fragments\" field\n * in their package.json. This allows consumer projects to see components from\n * installed packages (e.g. @fragments-sdk/ui) in the dev viewer.\n */\nexport async function discoverInstalledFragments(\n projectRoot: string\n): Promise<DiscoveredFile[]> {\n const pkgJsonPath = resolve(projectRoot, 'package.json');\n if (!existsSync(pkgJsonPath)) return [];\n\n const pkgJson = JSON.parse(await readFile(pkgJsonPath, 'utf-8'));\n const allDeps = { ...pkgJson.dependencies, ...pkgJson.devDependencies };\n const results: DiscoveredFile[] = [];\n\n for (const depName of Object.keys(allDeps)) {\n const depDir = resolve(projectRoot, 'node_modules', depName);\n const depPkgPath = resolve(depDir, 'package.json');\n if (!existsSync(depPkgPath)) continue;\n\n const depPkg = JSON.parse(await readFile(depPkgPath, 'utf-8'));\n if (!depPkg.fragments) continue;\n\n // Package declares fragments — scan for source fragment files\n const files = await fg(\n [`src/**/*${BRAND.fileExtension}`, 'src/**/*.stories.tsx'],\n { cwd: depDir, ignore: ['**/node_modules/**'], absolute: false }\n );\n\n for (const rel of files) {\n results.push({\n relativePath: `${depName}/${rel}`,\n absolutePath: resolve(depDir, rel),\n });\n }\n }\n\n return results;\n}\n\n/**\n * Discover all components using multiple strategies\n */\nexport async function discoverAllComponents(\n configDir: string,\n options: {\n patterns?: string[];\n exclude?: string[];\n barrelFiles?: string[];\n } = {}\n): Promise<DiscoveredComponent[]> {\n const componentsMap = new Map<string, DiscoveredComponent>();\n\n // Discover from source files\n const sourceComponents = await discoverComponentsFromSource(\n configDir,\n options.patterns,\n options.exclude\n );\n\n for (const comp of sourceComponents) {\n componentsMap.set(comp.name, comp);\n }\n\n // Discover from barrel files if specified\n if (options.barrelFiles && options.barrelFiles.length > 0) {\n for (const barrelFile of options.barrelFiles) {\n const barrelComponents = await discoverComponentsFromBarrel(barrelFile, configDir);\n for (const comp of barrelComponents) {\n // Only add if not already found\n if (!componentsMap.has(comp.name)) {\n componentsMap.set(comp.name, comp);\n }\n }\n }\n }\n\n return Array.from(componentsMap.values()).sort((a, b) => a.name.localeCompare(b.name));\n}\n","/**\n * TypeScript Props Extractor\n * Extracts prop types, default values, and JSDoc comments from React component files\n */\n\nimport ts from \"typescript\";\nimport { readFileSync } from \"node:fs\";\nimport type { RegistryPropEntry } from \"../fragment-types.js\";\n\n/**\n * Result of extracting props from a component file\n */\nexport interface ExtractedProps {\n /** Component name */\n componentName: string;\n /** Props interface name (e.g., \"ButtonProps\") */\n propsInterfaceName?: string;\n /** Extracted props */\n props: Record<string, RegistryPropEntry>;\n /** Named exports from the file */\n exports: string[];\n /** Import statements (for dependency tracking) */\n imports: string[];\n}\n\n/**\n * Extract props from a TypeScript/TSX component file\n */\nexport function extractPropsFromFile(filePath: string): ExtractedProps | null {\n const sourceText = readFileSync(filePath, \"utf-8\");\n return extractPropsFromSource(sourceText, filePath);\n}\n\n/**\n * Extract props from TypeScript source code\n */\nexport function extractPropsFromSource(\n sourceText: string,\n fileName = \"component.tsx\"\n): ExtractedProps | null {\n const sourceFile = ts.createSourceFile(\n fileName,\n sourceText,\n ts.ScriptTarget.Latest,\n true,\n fileName.endsWith(\".tsx\") ? ts.ScriptKind.TSX : ts.ScriptKind.TS\n );\n\n const result: ExtractedProps = {\n componentName: \"\",\n props: {},\n exports: [],\n imports: [],\n };\n\n // Find all exports and props interfaces\n const propsInterfaces = new Map<string, ts.InterfaceDeclaration | ts.TypeAliasDeclaration>();\n const componentExports: string[] = [];\n const importedModules: string[] = [];\n\n ts.forEachChild(sourceFile, (node) => {\n // Track imports\n if (ts.isImportDeclaration(node)) {\n const moduleSpecifier = node.moduleSpecifier;\n if (ts.isStringLiteral(moduleSpecifier)) {\n importedModules.push(moduleSpecifier.text);\n }\n }\n\n // Find interface declarations (e.g., interface ButtonProps { ... })\n if (ts.isInterfaceDeclaration(node)) {\n const name = node.name.text;\n if (name.endsWith(\"Props\")) {\n propsInterfaces.set(name, node);\n }\n }\n\n // Find type alias declarations (e.g., type ButtonProps = { ... })\n if (ts.isTypeAliasDeclaration(node)) {\n const name = node.name.text;\n if (name.endsWith(\"Props\")) {\n propsInterfaces.set(name, node);\n }\n }\n\n // Find exported functions/components\n if (ts.isFunctionDeclaration(node) && node.name) {\n const hasExport = node.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.ExportKeyword\n );\n if (hasExport) {\n componentExports.push(node.name.text);\n }\n }\n\n // Find exported variable declarations (e.g., export const Button = ...)\n if (ts.isVariableStatement(node)) {\n const hasExport = node.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.ExportKeyword\n );\n if (hasExport) {\n for (const decl of node.declarationList.declarations) {\n if (ts.isIdentifier(decl.name)) {\n componentExports.push(decl.name.text);\n }\n }\n }\n }\n\n // Find export declarations (e.g., export { Button })\n if (ts.isExportDeclaration(node) && node.exportClause) {\n if (ts.isNamedExports(node.exportClause)) {\n for (const element of node.exportClause.elements) {\n componentExports.push(element.name.text);\n }\n }\n }\n });\n\n result.exports = componentExports;\n result.imports = importedModules;\n\n // Find the main component (first PascalCase export)\n const mainComponent = componentExports.find(\n (name) => /^[A-Z]/.test(name) && !name.endsWith(\"Props\")\n );\n\n if (!mainComponent) {\n return null;\n }\n\n result.componentName = mainComponent;\n\n // Find matching props interface\n const propsInterfaceName = `${mainComponent}Props`;\n const propsInterface = propsInterfaces.get(propsInterfaceName);\n\n if (propsInterface) {\n result.propsInterfaceName = propsInterfaceName;\n result.props = extractPropsFromInterface(propsInterface, sourceFile);\n }\n\n return result;\n}\n\n/**\n * Extract props from an interface or type alias declaration\n */\nfunction extractPropsFromInterface(\n node: ts.InterfaceDeclaration | ts.TypeAliasDeclaration,\n sourceFile: ts.SourceFile\n): Record<string, RegistryPropEntry> {\n const props: Record<string, RegistryPropEntry> = {};\n\n // Handle interface declaration\n if (ts.isInterfaceDeclaration(node)) {\n for (const member of node.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText(sourceFile);\n const prop = extractPropFromMember(member, sourceFile);\n if (prop) {\n props[propName] = prop;\n }\n }\n }\n }\n\n // Handle type alias declaration\n if (ts.isTypeAliasDeclaration(node)) {\n const typeNode = node.type;\n if (ts.isTypeLiteralNode(typeNode)) {\n for (const member of typeNode.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText(sourceFile);\n const prop = extractPropFromMember(member, sourceFile);\n if (prop) {\n props[propName] = prop;\n }\n }\n }\n }\n }\n\n return props;\n}\n\n/**\n * Extract prop info from a property signature\n */\nfunction extractPropFromMember(\n member: ts.PropertySignature,\n sourceFile: ts.SourceFile\n): RegistryPropEntry | null {\n const entry: RegistryPropEntry = {};\n\n // Check if required\n entry.required = !member.questionToken;\n\n // Get type\n if (member.type) {\n const typeInfo = parseTypeNode(member.type, sourceFile);\n entry.type = typeInfo.type;\n entry.typeKind = typeInfo.typeKind;\n if (typeInfo.options) {\n entry.options = typeInfo.options;\n }\n }\n\n // Get JSDoc comment\n const jsDocComment = getJSDocComment(member);\n if (jsDocComment) {\n entry.description = jsDocComment;\n }\n\n // Get default value from JSDoc @default tag\n const defaultValue = getJSDocDefault(member);\n if (defaultValue !== undefined) {\n entry.default = defaultValue;\n }\n\n return entry;\n}\n\n/**\n * Parse a TypeScript type node into a simplified representation\n */\nfunction parseTypeNode(\n typeNode: ts.TypeNode,\n sourceFile: ts.SourceFile\n): { type: string; typeKind: RegistryPropEntry[\"typeKind\"]; options?: string[] } {\n // String\n if (typeNode.kind === ts.SyntaxKind.StringKeyword) {\n return { type: \"string\", typeKind: \"string\" };\n }\n\n // Number\n if (typeNode.kind === ts.SyntaxKind.NumberKeyword) {\n return { type: \"number\", typeKind: \"number\" };\n }\n\n // Boolean\n if (typeNode.kind === ts.SyntaxKind.BooleanKeyword) {\n return { type: \"boolean\", typeKind: \"boolean\" };\n }\n\n // Union type (string literal union for enums)\n if (ts.isUnionTypeNode(typeNode)) {\n const options: string[] = [];\n let allLiterals = true;\n\n for (const subType of typeNode.types) {\n if (ts.isLiteralTypeNode(subType)) {\n if (ts.isStringLiteral(subType.literal)) {\n options.push(subType.literal.text);\n } else if (subType.literal.kind === ts.SyntaxKind.TrueKeyword) {\n options.push(\"true\");\n } else if (subType.literal.kind === ts.SyntaxKind.FalseKeyword) {\n options.push(\"false\");\n } else {\n allLiterals = false;\n }\n } else {\n allLiterals = false;\n }\n }\n\n if (allLiterals && options.length > 0) {\n return {\n type: options.map((o) => `\"${o}\"`).join(\" | \"),\n typeKind: \"enum\",\n options,\n };\n }\n\n return {\n type: typeNode.getText(sourceFile),\n typeKind: \"union\",\n };\n }\n\n // Function type\n if (ts.isFunctionTypeNode(typeNode)) {\n return {\n type: typeNode.getText(sourceFile),\n typeKind: \"function\",\n };\n }\n\n // Array type\n if (ts.isArrayTypeNode(typeNode)) {\n return {\n type: typeNode.getText(sourceFile),\n typeKind: \"array\",\n };\n }\n\n // Type reference (e.g., ReactNode, React.ReactElement)\n if (ts.isTypeReferenceNode(typeNode)) {\n const typeName = typeNode.typeName.getText(sourceFile);\n\n // React types\n if (typeName === \"ReactNode\" || typeName === \"React.ReactNode\") {\n return { type: \"ReactNode\", typeKind: \"node\" };\n }\n if (typeName === \"ReactElement\" || typeName === \"React.ReactElement\") {\n return { type: \"ReactElement\", typeKind: \"element\" };\n }\n if (typeName === \"JSX.Element\") {\n return { type: \"JSX.Element\", typeKind: \"element\" };\n }\n\n return {\n type: typeNode.getText(sourceFile),\n typeKind: \"object\",\n };\n }\n\n // Object type literal\n if (ts.isTypeLiteralNode(typeNode)) {\n return {\n type: typeNode.getText(sourceFile),\n typeKind: \"object\",\n };\n }\n\n // Default: unknown\n return {\n type: typeNode.getText(sourceFile),\n typeKind: \"unknown\",\n };\n}\n\n/**\n * Get JSDoc comment from a node\n */\nfunction getJSDocComment(node: ts.Node): string | undefined {\n const jsDocTags = ts.getJSDocTags(node);\n const jsDoc = (node as unknown as { jsDoc?: ts.JSDoc[] }).jsDoc;\n\n if (jsDoc && jsDoc.length > 0) {\n const comment = jsDoc[0].comment;\n if (typeof comment === \"string\") {\n return comment;\n }\n if (Array.isArray(comment)) {\n return comment.map((c) => (typeof c === \"string\" ? c : c.text)).join(\"\");\n }\n }\n\n return undefined;\n}\n\n/**\n * Get @default value from JSDoc\n */\nfunction getJSDocDefault(node: ts.Node): unknown | undefined {\n const jsDocTags = ts.getJSDocTags(node);\n\n for (const tag of jsDocTags) {\n if (tag.tagName.text === \"default\") {\n const comment = tag.comment;\n if (typeof comment === \"string\") {\n // Try to parse as JSON\n try {\n return JSON.parse(comment);\n } catch {\n return comment;\n }\n }\n }\n }\n\n return undefined;\n}\n","/**\n * Registry Generator\n * Generates .fragments/registry.json and .fragments/index.json\n *\n * Philosophy: Generate only what AI agents and humans can't easily get from source.\n * - Props: AI can read TypeScript directly (skip by default)\n * - Paths: Essential for file navigation (always include)\n * - Enrichment: Human knowledge that doesn't exist elsewhere (include references)\n */\n\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { relative, dirname, basename, join } from \"node:path\";\nimport fg from \"fast-glob\";\nimport type {\n Fragment,\n FragmentRegistry,\n FragmentIndex,\n RegistryComponentEntry,\n} from \"../fragment-types.js\";\nimport { extractPropsFromFile } from \"./typescript-extractor.js\";\nimport { BRAND } from \"../constants.js\";\nimport type { RegistryOptions } from \"../types.js\";\n\n/**\n * Options for registry generation\n */\nexport interface RegistryGeneratorOptions {\n /** Project root directory */\n projectRoot: string;\n /** Glob patterns for component files */\n componentPatterns?: string[];\n /** Glob patterns for story files */\n storyPatterns?: string[];\n /** Path to .fragments directory */\n fragmentsDir?: string;\n /** Registry options from config */\n registryOptions?: RegistryOptions;\n}\n\n/**\n * Result of registry generation\n */\nexport interface RegistryGeneratorResult {\n /** Generated registry (full metadata) */\n registry: FragmentRegistry;\n /** Generated index (minimal name -> path) */\n index: FragmentIndex;\n /** Errors encountered during generation */\n errors: Array<{ file: string; error: string }>;\n /** Warnings */\n warnings: Array<{ file: string; warning: string }>;\n}\n\n/**\n * Generate a fragment registry and index by scanning the project\n */\nexport async function generateRegistry(\n options: RegistryGeneratorOptions\n): Promise<RegistryGeneratorResult> {\n const {\n projectRoot,\n componentPatterns = [\"src/**/*.tsx\", \"src/**/*.ts\"],\n storyPatterns = [\"src/**/*.stories.tsx\", \"src/**/*.stories.ts\"],\n fragmentsDir = join(projectRoot, BRAND.dataDir),\n registryOptions = {},\n } = options;\n\n const {\n requireStory = false,\n publicOnly = false,\n categoryDepth = 1,\n includeProps = false,\n embedFragments = false,\n } = registryOptions;\n\n const errors: Array<{ file: string; error: string }> = [];\n const warnings: Array<{ file: string; warning: string }> = [];\n\n // Find all story files first (for requireStory filtering)\n const storyFiles = await fg(storyPatterns, {\n cwd: projectRoot,\n ignore: [\"**/node_modules/**\"],\n absolute: true,\n });\n\n // Build a map of story files by component directory and base name\n const storyMap = new Map<string, string>();\n for (const storyPath of storyFiles) {\n const storyDir = dirname(storyPath);\n const storyBase = basename(storyPath).replace(/\\.stories\\.(tsx?|jsx?)$/, \"\");\n storyMap.set(`${storyDir}/${storyBase}`, storyPath);\n }\n\n // Find all component files\n const componentFiles = await fg(componentPatterns, {\n cwd: projectRoot,\n ignore: [\n \"**/node_modules/**\",\n \"**/*.stories.*\",\n \"**/*.test.*\",\n \"**/*.spec.*\",\n \"**/*.d.ts\",\n ],\n absolute: true,\n });\n\n // Find all fragment files\n const fragmentPattern = join(\n BRAND.dataDir,\n BRAND.componentsDir,\n `*${BRAND.fileExtension}`\n );\n const fragmentFiles = await fg(fragmentPattern, {\n cwd: projectRoot,\n absolute: true,\n });\n\n // Build fragment lookup map\n const fragmentMap = new Map<string, { path: string; fragment: Fragment }>();\n for (const fragmentPath of fragmentFiles) {\n const fragmentName = basename(fragmentPath).replace(BRAND.fileExtension, \"\");\n try {\n const content = readFileSync(fragmentPath, \"utf-8\");\n const fragment = JSON.parse(content) as Fragment;\n fragmentMap.set(fragmentName, {\n path: relative(projectRoot, fragmentPath),\n fragment,\n });\n } catch (e) {\n errors.push({\n file: fragmentPath,\n error: `Failed to parse fragment: ${e instanceof Error ? e.message : String(e)}`,\n });\n }\n }\n\n // Build component index\n const components: Record<string, RegistryComponentEntry> = {};\n const indexComponents: Record<string, string> = {};\n const categories: Record<string, string[]> = {};\n\n // Process component files\n for (const filePath of componentFiles) {\n try {\n const extracted = extractPropsFromFile(filePath);\n if (!extracted || !extracted.componentName) {\n continue;\n }\n\n const componentName = extracted.componentName;\n const relativePath = relative(projectRoot, filePath);\n\n // Check if component is exported (for publicOnly filter)\n if (publicOnly && !extracted.exports.includes(componentName)) {\n continue;\n }\n\n // Find matching story file\n const componentDir = dirname(filePath);\n const baseNameWithoutExt = basename(filePath).replace(/\\.(tsx?|jsx?)$/, \"\");\n const storyPath = storyMap.get(`${componentDir}/${baseNameWithoutExt}`);\n\n // Apply requireStory filter\n if (requireStory && !storyPath) {\n continue;\n }\n\n // Get fragment data if exists\n const fragmentData = fragmentMap.get(componentName);\n\n // Determine category from directory structure\n const category = fragmentData?.fragment?.meta?.status\n ? undefined // Don't use status as category\n : getCategoryFromPath(relativePath, categoryDepth);\n\n // Check if fragment has meaningful enrichment (not just a skeleton)\n const hasEnrichment = fragmentData\n ? hasRealEnrichment(fragmentData.fragment)\n : false;\n\n // Build minimal component entry\n const entry: RegistryComponentEntry = {\n path: relativePath,\n };\n\n // Add optional fields only if present\n if (storyPath) {\n entry.storyPath = relative(projectRoot, storyPath);\n }\n\n if (fragmentData) {\n entry.fragmentPath = fragmentData.path;\n if (hasEnrichment) {\n entry.hasEnrichment = true;\n }\n if (fragmentData.fragment.description) {\n entry.description = fragmentData.fragment.description;\n }\n if (fragmentData.fragment.meta?.status) {\n entry.status = fragmentData.fragment.meta.status;\n }\n // Only embed full fragment if explicitly requested\n if (embedFragments) {\n entry.fragment = fragmentData.fragment;\n }\n }\n\n if (category) {\n entry.category = category;\n // Add to categories index\n if (!categories[category]) {\n categories[category] = [];\n }\n categories[category].push(componentName);\n }\n\n // Only include props if explicitly requested\n if (includeProps && extracted.props) {\n entry.props = extracted.props;\n }\n\n // Only include exports if multiple exports\n if (extracted.exports.length > 1) {\n entry.exports = extracted.exports;\n }\n\n components[componentName] = entry;\n indexComponents[componentName] = relativePath;\n } catch (e) {\n errors.push({\n file: filePath,\n error: `Failed to extract component: ${e instanceof Error ? e.message : String(e)}`,\n });\n }\n }\n\n const componentCount = Object.keys(components).length;\n\n // Build registry\n const registry: FragmentRegistry = {\n $schema: \"https://fragments.dev/schema/registry-v1.json\",\n version: \"1.0\",\n generatedAt: new Date().toISOString(),\n componentCount,\n components,\n categories,\n };\n\n // Build minimal index\n const index: FragmentIndex = {\n version: \"1.0\",\n generatedAt: registry.generatedAt,\n components: indexComponents,\n categories,\n };\n\n return { registry, index, errors, warnings };\n}\n\n/**\n * Get category from file path based on directory structure\n *\n * Examples:\n * - src/components/buttons/Button.tsx -> \"buttons\"\n * - src/components/forms/inputs/TextInput.tsx -> \"forms\" (depth 1) or \"forms/inputs\" (depth 2)\n * - src/components/Button/Button.tsx -> \"Button\" (component folder)\n */\nfunction getCategoryFromPath(relativePath: string, depth: number = 1): string | undefined {\n const parts = relativePath.split(\"/\");\n const componentsIndex = parts.findIndex((p) => p === \"components\");\n\n if (componentsIndex === -1) {\n return undefined;\n }\n\n // Get the parts after \"components/\"\n const afterComponents = parts.slice(componentsIndex + 1);\n\n // If it's just components/Button.tsx, no category\n if (afterComponents.length <= 1) {\n return undefined;\n }\n\n // If it's components/Button/Button.tsx (component folder pattern), no category\n const folderName = afterComponents[0];\n const fileName = afterComponents[afterComponents.length - 1].replace(/\\.(tsx?|jsx?)$/, \"\");\n if (afterComponents.length === 2 && folderName === fileName) {\n return undefined;\n }\n\n // Get category parts based on depth\n const categoryParts = afterComponents.slice(0, Math.min(depth, afterComponents.length - 1));\n\n // Filter out component folders (where folder name matches file name)\n const lastCategoryPart = categoryParts[categoryParts.length - 1];\n if (lastCategoryPart === fileName) {\n categoryParts.pop();\n }\n\n if (categoryParts.length === 0) {\n return undefined;\n }\n\n return categoryParts.join(\"/\");\n}\n\n/**\n * Check if a fragment has meaningful enrichment beyond a skeleton\n */\nfunction hasRealEnrichment(fragment: Fragment): boolean {\n // Has description beyond just the name\n if (fragment.description && fragment.description.length > 20) {\n return true;\n }\n\n // Has usage guidelines\n if (fragment.usage?.when && fragment.usage.when.length > 0) {\n return true;\n }\n if (fragment.usage?.doNot && fragment.usage.doNot.length > 0) {\n return true;\n }\n if (fragment.usage?.patterns && fragment.usage.patterns.length > 0) {\n return true;\n }\n\n // Has accessibility info\n if (fragment.accessibility?.requirements && fragment.accessibility.requirements.length > 0) {\n return true;\n }\n\n // Has figma links\n if (fragment.figma?.nodeId || fragment.figma?.variants) {\n return true;\n }\n\n // Has related components\n if (fragment.related?.similar && fragment.related.similar.length > 0) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Resolve component name to path using registry\n */\nexport function resolveComponentPath(\n componentName: string,\n registry: FragmentRegistry\n): string | undefined {\n const entry = registry.components[componentName];\n return entry?.path;\n}\n\n/**\n * Get all components by category\n */\nexport function getComponentsByCategory(\n category: string,\n registry: FragmentRegistry\n): string[] {\n return registry.categories?.[category] || [];\n}\n","/**\n * Context.md Generator\n * Generates a consolidated AI-ready context file from the fragment registry\n *\n * Philosophy: Focus on human-authored semantic knowledge that AI can't get from source.\n * - Usage guidelines: When to use, when not to use\n * - Relationships: Similar components, alternatives\n * - Accessibility: Requirements and keyboard patterns\n * - DO NOT: Duplicate prop types (AI can read TypeScript directly)\n */\n\nimport type {\n FragmentRegistry,\n RegistryComponentEntry,\n RegistryPropEntry,\n FragmentDoNotItem,\n FragmentContextOptions,\n} from \"../fragment-types.js\";\n\n/**\n * Result of context generation\n */\nexport interface ContextGeneratorResult {\n /** Generated markdown content */\n content: string;\n /** Estimated token count */\n tokenEstimate: number;\n /** Component count */\n componentCount: number;\n}\n\n/**\n * Generate context.md from a fragment registry\n */\nexport function generateContextMd(\n registry: FragmentRegistry,\n options: FragmentContextOptions = {}\n): ContextGeneratorResult {\n const {\n format = \"markdown\",\n compact = false,\n include = { props: true, relations: true, code: false },\n } = options;\n\n if (format === \"json\") {\n return generateJsonContext(registry, include, compact);\n }\n\n return generateMarkdownContext(registry, include, compact);\n}\n\n/**\n * Generate markdown context\n */\nfunction generateMarkdownContext(\n registry: FragmentRegistry,\n include: { props?: boolean; relations?: boolean; code?: boolean },\n compact: boolean\n): ContextGeneratorResult {\n const lines: string[] = [];\n const componentNames = Object.keys(registry.components).sort();\n const componentCount = componentNames.length;\n\n // Header\n lines.push(\"# Component Library Context\");\n lines.push(`Generated: ${new Date().toISOString().split(\"T\")[0]} | Components: ${componentCount}`);\n lines.push(\"\");\n\n // Quick reference table\n lines.push(\"## Quick Reference\");\n lines.push(\"\");\n lines.push(\"| Component | Path | Category | Status |\");\n lines.push(\"|-----------|------|----------|--------|\");\n\n for (const name of componentNames) {\n const entry = registry.components[name];\n const status = entry.status || \"stable\";\n const category = entry.category || \"-\";\n lines.push(`| ${name} | ${entry.path} | ${category} | ${status} |`);\n }\n\n lines.push(\"\");\n\n // In compact mode, stop here\n if (compact) {\n const content = lines.join(\"\\n\");\n return {\n content,\n tokenEstimate: estimateTokens(content),\n componentCount,\n };\n }\n\n // Full documentation for each component\n lines.push(\"---\");\n lines.push(\"\");\n\n for (const name of componentNames) {\n const entry = registry.components[name];\n const fragment = entry.fragment;\n\n lines.push(`## ${name}`);\n lines.push(`**Path:** \\`${entry.path}\\``);\n\n if (entry.category) {\n lines.push(`**Category:** ${entry.category} | **Status:** ${entry.status || \"stable\"}`);\n }\n lines.push(\"\");\n\n // Description\n if (entry.description || fragment?.description) {\n lines.push(\"### Description\");\n lines.push(entry.description || fragment?.description || \"\");\n lines.push(\"\");\n }\n\n // Usage guidelines\n if (fragment?.usage) {\n if (fragment.usage.when && fragment.usage.when.length > 0) {\n lines.push(\"### When to Use\");\n for (const when of fragment.usage.when) {\n lines.push(`- ${when}`);\n }\n lines.push(\"\");\n }\n\n if (fragment.usage.doNot && fragment.usage.doNot.length > 0) {\n lines.push(\"### Do Not\");\n for (const doNotItem of fragment.usage.doNot) {\n if (typeof doNotItem === \"string\") {\n lines.push(`- ${doNotItem}`);\n } else {\n const item = doNotItem as FragmentDoNotItem;\n if (item.instead) {\n // Resolve component path\n const alternativePath = resolveComponentPath(item.instead, registry);\n if (alternativePath) {\n lines.push(`- ${item.text} → use **${item.instead}** (\\`${alternativePath}\\`)`);\n } else {\n lines.push(`- ${item.text} → use **${item.instead}**`);\n }\n } else {\n lines.push(`- ${item.text}`);\n }\n }\n }\n lines.push(\"\");\n }\n\n if (include.code && fragment.usage.patterns && fragment.usage.patterns.length > 0) {\n lines.push(\"### Patterns\");\n for (const pattern of fragment.usage.patterns) {\n lines.push(`**${pattern.name}**`);\n if (pattern.description) {\n lines.push(pattern.description);\n }\n lines.push(\"```tsx\");\n lines.push(pattern.code);\n lines.push(\"```\");\n lines.push(\"\");\n }\n }\n }\n\n // Props\n if (include.props && entry.props && Object.keys(entry.props).length > 0) {\n lines.push(\"### Props\");\n lines.push(\"| Prop | Type | Default | Description |\");\n lines.push(\"|------|------|---------|-------------|\");\n\n for (const [propName, prop] of Object.entries(entry.props)) {\n const type = formatPropType(prop);\n const defaultVal = prop.default !== undefined ? `\\`${JSON.stringify(prop.default)}\\`` : \"-\";\n const desc = prop.description || \"-\";\n const required = prop.required ? \" (required)\" : \"\";\n lines.push(`| ${propName}${required} | ${type} | ${defaultVal} | ${desc} |`);\n }\n lines.push(\"\");\n }\n\n // Accessibility\n if (fragment?.accessibility) {\n lines.push(\"### Accessibility\");\n if (fragment.accessibility.role) {\n lines.push(`**Role:** ${fragment.accessibility.role}`);\n }\n if (fragment.accessibility.requirements && fragment.accessibility.requirements.length > 0) {\n for (const req of fragment.accessibility.requirements) {\n lines.push(`- ${req}`);\n }\n }\n if (fragment.accessibility.keyboard) {\n lines.push(\"\");\n lines.push(\"**Keyboard:**\");\n for (const [key, action] of Object.entries(fragment.accessibility.keyboard)) {\n lines.push(`- \\`${key}\\`: ${action}`);\n }\n }\n lines.push(\"\");\n }\n\n // Related components\n if (include.relations && fragment?.related) {\n lines.push(\"### Related\");\n if (fragment.related.similar && fragment.related.similar.length > 0) {\n const resolved = fragment.related.similar.map((comp) => {\n const path = resolveComponentPath(comp, registry);\n return path ? `${comp} (\\`${path}\\`)` : comp;\n });\n lines.push(`- **Similar:** ${resolved.join(\", \")}`);\n }\n if (fragment.related.composedWith && fragment.related.composedWith.length > 0) {\n const resolved = fragment.related.composedWith.map((comp) => {\n const path = resolveComponentPath(comp, registry);\n return path ? `${comp} (\\`${path}\\`)` : comp;\n });\n lines.push(`- **Composed with:** ${resolved.join(\", \")}`);\n }\n if (fragment.related.usedIn && fragment.related.usedIn.length > 0) {\n const resolved = fragment.related.usedIn.map((comp) => {\n const path = resolveComponentPath(comp, registry);\n return path ? `${comp} (\\`${path}\\`)` : comp;\n });\n lines.push(`- **Used in:** ${resolved.join(\", \")}`);\n }\n lines.push(\"\");\n }\n\n lines.push(\"---\");\n lines.push(\"\");\n }\n\n const content = lines.join(\"\\n\");\n return {\n content,\n tokenEstimate: estimateTokens(content),\n componentCount,\n };\n}\n\n/**\n * Generate JSON context\n */\nfunction generateJsonContext(\n registry: FragmentRegistry,\n include: { props?: boolean; relations?: boolean; code?: boolean },\n compact: boolean\n): ContextGeneratorResult {\n const componentNames = Object.keys(registry.components).sort();\n const componentCount = componentNames.length;\n\n interface JsonComponent {\n path: string;\n category?: string;\n status?: string;\n description?: string;\n whenToUse?: string[];\n doNot?: Array<{ text: string; instead?: string; insteadPath?: string }>;\n props?: Record<string, {\n type: string;\n required?: boolean;\n default?: unknown;\n description?: string;\n }>;\n related?: {\n similar?: Array<{ name: string; path?: string }>;\n composedWith?: Array<{ name: string; path?: string }>;\n usedIn?: Array<{ name: string; path?: string }>;\n };\n }\n\n const components: Record<string, JsonComponent> = {};\n\n for (const name of componentNames) {\n const entry = registry.components[name];\n const fragment = entry.fragment;\n\n const component: JsonComponent = {\n path: entry.path,\n };\n\n if (entry.category) component.category = entry.category;\n if (entry.status) component.status = entry.status;\n if (entry.description || fragment?.description) {\n component.description = entry.description || fragment?.description;\n }\n\n if (!compact && fragment?.usage) {\n if (fragment.usage.when && fragment.usage.when.length > 0) {\n component.whenToUse = fragment.usage.when;\n }\n\n if (fragment.usage.doNot && fragment.usage.doNot.length > 0) {\n component.doNot = fragment.usage.doNot.map((item) => {\n if (typeof item === \"string\") {\n return { text: item };\n }\n const doNotItem = item as FragmentDoNotItem;\n const result: { text: string; instead?: string; insteadPath?: string } = {\n text: doNotItem.text,\n };\n if (doNotItem.instead) {\n result.instead = doNotItem.instead;\n result.insteadPath = resolveComponentPath(doNotItem.instead, registry);\n }\n return result;\n });\n }\n }\n\n if (!compact && include.props && entry.props) {\n component.props = {};\n for (const [propName, prop] of Object.entries(entry.props)) {\n component.props[propName] = {\n type: formatPropType(prop),\n };\n if (prop.required) component.props[propName].required = true;\n if (prop.default !== undefined) component.props[propName].default = prop.default;\n if (prop.description) component.props[propName].description = prop.description;\n }\n }\n\n if (!compact && include.relations && fragment?.related) {\n component.related = {};\n if (fragment.related.similar) {\n component.related.similar = fragment.related.similar.map((name) => ({\n name,\n path: resolveComponentPath(name, registry),\n }));\n }\n if (fragment.related.composedWith) {\n component.related.composedWith = fragment.related.composedWith.map((name) => ({\n name,\n path: resolveComponentPath(name, registry),\n }));\n }\n if (fragment.related.usedIn) {\n component.related.usedIn = fragment.related.usedIn.map((name) => ({\n name,\n path: resolveComponentPath(name, registry),\n }));\n }\n }\n\n components[name] = component;\n }\n\n const output = {\n version: \"1.0\",\n generatedAt: registry.generatedAt,\n componentCount,\n categories: registry.categories,\n components,\n };\n\n const content = JSON.stringify(output, null, 2);\n return {\n content,\n tokenEstimate: estimateTokens(content),\n componentCount,\n };\n}\n\n/**\n * Resolve component name to path\n */\nfunction resolveComponentPath(\n componentName: string,\n registry: FragmentRegistry\n): string | undefined {\n return registry.components[componentName]?.path;\n}\n\n/**\n * Format prop type for display\n */\nfunction formatPropType(prop: RegistryPropEntry): string {\n if (prop.options && prop.options.length > 0) {\n return prop.options.map((o) => `\"${o}\"`).join(\" \\\\| \");\n }\n return prop.type || \"unknown\";\n}\n\n/**\n * Estimate token count (rough: ~4 chars per token)\n */\nfunction estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n","import { writeFile, unlink } from 'node:fs/promises';\nimport { dirname, basename, join } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { build, type Plugin } from 'esbuild';\nimport type { SegmentDefinition } from './types.js';\nimport { BRAND } from './constants.js';\n\n// Inline implementation of defineSegment that will be injected into bundled files\n// This allows segment files to work without @fragments/core being installed\nconst DEFINE_SEGMENT_SHIM = `\nexport function defineSegment(def) {\n return def;\n}\nexport function defineFragment(def) {\n return def;\n}\nexport function defineRecipe(def) {\n return def;\n}\n`;\n\n/**\n * Creates an esbuild plugin that replaces @fragments/core imports with an inline shim.\n * This allows segment files to be loaded without @fragments/core being installed in the target project.\n */\nfunction createSegmentsCoreShimPlugin(): Plugin {\n return {\n name: BRAND.vitePluginNamespace,\n setup(build) {\n // Intercept @fragments/core imports\n build.onResolve({ filter: /^@fragments\\/core$/ }, (args) => {\n return {\n path: args.path,\n namespace: BRAND.vitePluginNamespace,\n };\n });\n\n // Return the shim content\n build.onLoad({ filter: /.*/, namespace: BRAND.vitePluginNamespace }, () => {\n return {\n contents: DEFINE_SEGMENT_SHIM,\n loader: 'js',\n };\n });\n },\n };\n}\n\n/**\n * Load a segment file, handling TSX/TS transformation automatically.\n * Uses esbuild to bundle and transform TypeScript/JSX before importing.\n */\nexport async function loadSegmentFile(\n absolutePath: string\n): Promise<SegmentDefinition | null> {\n const ext = absolutePath.split('.').pop()?.toLowerCase();\n const needsTransform = ext === 'tsx' || ext === 'ts' || ext === 'jsx';\n\n if (!needsTransform) {\n // Plain JS file, import directly\n const fileUrl = pathToFileURL(absolutePath).href;\n const module = await import(fileUrl);\n return module.default ?? null;\n }\n\n // Bundle the file with all its local dependencies\n const sourceDir = dirname(absolutePath);\n const baseName = basename(absolutePath, `.${ext}`);\n // Use .cjs extension to ensure CommonJS evaluation\n const tempFile = join(sourceDir, `.${baseName}.segments-temp-${Date.now()}.cjs`);\n\n try {\n // Use esbuild to bundle the segment file\n // We inject a shim for @fragments/core so it doesn't need to be installed\n // Using CommonJS format to avoid ESM/CJS interop issues with node_modules\n await build({\n entryPoints: [absolutePath],\n outfile: tempFile,\n bundle: true,\n format: 'cjs', // Use CommonJS to avoid ESM issues with lodash, etc.\n target: 'es2022',\n jsx: 'automatic',\n platform: 'node',\n plugins: [createSegmentsCoreShimPlugin()],\n // Externalize all node_modules - we only need segment metadata, not component code\n packages: 'external',\n // Also explicitly list patterns for nested imports\n external: [\n // React and its subpaths\n 'react',\n 'react-dom',\n 'react/*',\n 'react-dom/*',\n ],\n // Don't emit sourcemaps for temp files\n sourcemap: false,\n // Suppress warnings\n logLevel: 'silent',\n // Use loader to ignore style imports\n loader: {\n '.scss': 'empty',\n '.css': 'empty',\n '.svg': 'empty',\n '.png': 'empty',\n '.jpg': 'empty',\n '.jpeg': 'empty',\n '.gif': 'empty',\n '.woff': 'empty',\n '.woff2': 'empty',\n '.ttf': 'empty',\n '.eot': 'empty',\n },\n });\n\n const fileUrl = pathToFileURL(tempFile).href;\n const module = await import(fileUrl);\n return module.default ?? null;\n } finally {\n // Clean up temp file\n try {\n await unlink(tempFile);\n } catch {\n // Ignore cleanup errors\n }\n }\n}\n\n/**\n * Load multiple segment files in parallel with error handling.\n */\nexport async function loadSegmentFiles(\n absolutePaths: string[]\n): Promise<Map<string, SegmentDefinition | Error>> {\n const results = new Map<string, SegmentDefinition | Error>();\n\n await Promise.all(\n absolutePaths.map(async (path) => {\n try {\n const segment = await loadSegmentFile(path);\n if (segment) {\n results.set(path, segment);\n } else {\n results.set(path, new Error('No default export found'));\n }\n } catch (error) {\n results.set(\n path,\n error instanceof Error ? error : new Error(String(error))\n );\n }\n })\n );\n\n return results;\n}\n","/**\n * AST-Based Segment Parser\n *\n * Extracts segment metadata from .segment.tsx files WITHOUT executing them.\n * This allows `segments build` to work without any project dependencies.\n *\n * Uses TypeScript's compiler API to parse and analyze the AST.\n */\n\nimport ts from \"typescript\";\nimport type { SegmentMeta, SegmentUsage, PropDefinition } from \"./types.js\";\n\n/**\n * Parsed segment metadata (extracted statically from AST)\n */\nexport interface ParsedSegmentMetadata {\n /** Component import path (e.g., \"./Button\" or \"@/components/Button\") */\n componentImport: string | null;\n\n /** Component name as used in the file */\n componentName: string | null;\n\n /** Component metadata */\n meta: Partial<SegmentMeta>;\n\n /** Usage guidelines */\n usage: Partial<SegmentUsage>;\n\n /** Props documentation */\n props: Record<string, Partial<PropDefinition>>;\n\n /** Variant definitions */\n variants: Array<{\n name: string;\n description: string;\n code?: string;\n figma?: string;\n args?: Record<string, unknown>;\n }>;\n\n /** Related components */\n relations: Array<{\n component: string;\n relationship: string;\n note: string;\n }>;\n\n /** Parse warnings */\n warnings: string[];\n}\n\n/**\n * Parse a segment file and extract metadata without executing it.\n */\nexport function parseSegmentFile(\n fileContent: string,\n filePath?: string\n): ParsedSegmentMetadata {\n const warnings: string[] = [];\n\n // Parse the file\n const sourceFile = ts.createSourceFile(\n filePath ?? \"segment.tsx\",\n fileContent,\n ts.ScriptTarget.Latest,\n true,\n ts.ScriptKind.TSX\n );\n\n // Find imports\n const imports = extractImports(sourceFile);\n\n // Find the defineSegment call\n const defineSegmentCall = findDefineSegmentCall(sourceFile);\n\n if (!defineSegmentCall) {\n warnings.push(\"No defineSegment() call found\");\n return {\n componentImport: null,\n componentName: null,\n meta: {},\n usage: { when: [], whenNot: [] },\n props: {},\n variants: [],\n relations: [],\n warnings,\n };\n }\n\n // Extract the argument (object literal)\n const arg = defineSegmentCall.arguments[0];\n if (!arg || !ts.isObjectLiteralExpression(arg)) {\n warnings.push(\"defineSegment() argument is not an object literal\");\n return {\n componentImport: null,\n componentName: null,\n meta: {},\n usage: { when: [], whenNot: [] },\n props: {},\n variants: [],\n relations: [],\n warnings,\n };\n }\n\n // Extract component reference\n const componentProp = findProperty(arg, \"component\");\n let componentName: string | null = null;\n let componentImport: string | null = null;\n\n if (componentProp && ts.isIdentifier(componentProp)) {\n componentName = componentProp.text;\n // Find the import for this component\n componentImport = imports.get(componentName) ?? null;\n }\n\n // Extract meta\n const meta = extractMeta(arg, warnings);\n\n // Extract usage\n const usage = extractUsage(arg, warnings);\n\n // Extract props\n const props = extractProps(arg, warnings);\n\n // Extract variants\n const variants = extractVariants(arg, sourceFile, warnings);\n\n // Extract relations\n const relations = extractRelations(arg, warnings);\n\n return {\n componentImport,\n componentName,\n meta,\n usage,\n props,\n variants,\n relations,\n warnings,\n };\n}\n\n/**\n * Extract all imports from the source file.\n * Returns a map of imported name -> module path\n */\nfunction extractImports(sourceFile: ts.SourceFile): Map<string, string> {\n const imports = new Map<string, string>();\n\n ts.forEachChild(sourceFile, (node) => {\n if (ts.isImportDeclaration(node)) {\n const moduleSpecifier = node.moduleSpecifier;\n if (ts.isStringLiteral(moduleSpecifier)) {\n const modulePath = moduleSpecifier.text;\n\n // Handle named imports\n const importClause = node.importClause;\n if (importClause) {\n // Default import\n if (importClause.name) {\n imports.set(importClause.name.text, modulePath);\n }\n\n // Named imports\n const namedBindings = importClause.namedBindings;\n if (namedBindings && ts.isNamedImports(namedBindings)) {\n for (const element of namedBindings.elements) {\n imports.set(element.name.text, modulePath);\n }\n }\n }\n }\n }\n });\n\n return imports;\n}\n\n/**\n * Find the defineSegment() call in the source file.\n */\nfunction findDefineSegmentCall(\n sourceFile: ts.SourceFile\n): ts.CallExpression | null {\n let result: ts.CallExpression | null = null;\n\n function visit(node: ts.Node): void {\n if (ts.isCallExpression(node)) {\n const expression = node.expression;\n if (ts.isIdentifier(expression) && expression.text === \"defineSegment\") {\n result = node;\n return;\n }\n }\n ts.forEachChild(node, visit);\n }\n\n visit(sourceFile);\n return result;\n}\n\n/**\n * Find a property in an object literal by name.\n */\nfunction findProperty(\n obj: ts.ObjectLiteralExpression,\n name: string\n): ts.Expression | null {\n for (const prop of obj.properties) {\n if (ts.isPropertyAssignment(prop)) {\n const propName = prop.name;\n if (ts.isIdentifier(propName) && propName.text === name) {\n return prop.initializer;\n }\n }\n }\n return null;\n}\n\n/**\n * Extract meta object from defineSegment call.\n */\nfunction extractMeta(\n arg: ts.ObjectLiteralExpression,\n warnings: string[]\n): Partial<SegmentMeta> {\n const metaProp = findProperty(arg, \"meta\");\n if (!metaProp || !ts.isObjectLiteralExpression(metaProp)) {\n warnings.push(\"No meta object found\");\n return {};\n }\n\n const meta: Partial<SegmentMeta> = {};\n\n // Extract string properties\n const name = extractStringProperty(metaProp, \"name\");\n if (name) meta.name = name;\n\n const description = extractStringProperty(metaProp, \"description\");\n if (description) meta.description = description;\n\n const category = extractStringProperty(metaProp, \"category\");\n if (category) meta.category = category;\n\n const status = extractStringProperty(metaProp, \"status\") as SegmentMeta[\"status\"];\n if (status) meta.status = status;\n\n const since = extractStringProperty(metaProp, \"since\");\n if (since) meta.since = since;\n\n // Extract figma URL\n const figma = extractStringProperty(metaProp, \"figma\");\n if (figma) meta.figma = figma;\n\n // Extract tags array\n const tags = extractStringArray(metaProp, \"tags\");\n if (tags.length > 0) meta.tags = tags;\n\n return meta;\n}\n\n/**\n * Extract usage object from defineSegment call.\n */\nfunction extractUsage(\n arg: ts.ObjectLiteralExpression,\n warnings: string[]\n): Partial<SegmentUsage> {\n const usageProp = findProperty(arg, \"usage\");\n if (!usageProp || !ts.isObjectLiteralExpression(usageProp)) {\n return { when: [], whenNot: [] };\n }\n\n return {\n when: extractStringArray(usageProp, \"when\"),\n whenNot: extractStringArray(usageProp, \"whenNot\"),\n guidelines: extractStringArray(usageProp, \"guidelines\"),\n accessibility: extractStringArray(usageProp, \"accessibility\"),\n };\n}\n\n/**\n * Extract props object from defineSegment call.\n */\nfunction extractProps(\n arg: ts.ObjectLiteralExpression,\n warnings: string[]\n): Record<string, Partial<PropDefinition>> {\n const propsProp = findProperty(arg, \"props\");\n if (!propsProp || !ts.isObjectLiteralExpression(propsProp)) {\n return {};\n }\n\n const props: Record<string, Partial<PropDefinition>> = {};\n\n for (const prop of propsProp.properties) {\n if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name)) {\n const propName = prop.name.text;\n const propValue = prop.initializer;\n\n if (ts.isObjectLiteralExpression(propValue)) {\n props[propName] = extractPropDefinition(propValue);\n }\n }\n }\n\n return props;\n}\n\n/**\n * Extract a single prop definition.\n */\nfunction extractPropDefinition(\n obj: ts.ObjectLiteralExpression\n): Partial<PropDefinition> {\n const def: Partial<PropDefinition> = {};\n\n const type = extractStringProperty(obj, \"type\");\n if (type) def.type = type as PropDefinition[\"type\"];\n\n const description = extractStringProperty(obj, \"description\");\n if (description) def.description = description;\n\n const values = extractStringArray(obj, \"values\");\n if (values.length > 0) def.values = values;\n\n const required = extractBooleanProperty(obj, \"required\");\n if (required !== null) def.required = required;\n\n // Default value - try to extract as literal\n const defaultProp = findProperty(obj, \"default\");\n if (defaultProp) {\n def.default = extractLiteralValue(defaultProp);\n }\n\n const constraints = extractStringArray(obj, \"constraints\");\n if (constraints.length > 0) def.constraints = constraints;\n\n return def;\n}\n\n/**\n * Extract variants array from defineSegment call.\n */\nfunction extractVariants(\n arg: ts.ObjectLiteralExpression,\n sourceFile: ts.SourceFile,\n warnings: string[]\n): Array<{ name: string; description: string; code?: string; figma?: string; args?: Record<string, unknown> }> {\n const variantsProp = findProperty(arg, \"variants\");\n if (!variantsProp || !ts.isArrayLiteralExpression(variantsProp)) {\n return [];\n }\n\n const variants: Array<{ name: string; description: string; code?: string; figma?: string; args?: Record<string, unknown> }> = [];\n\n for (const element of variantsProp.elements) {\n if (ts.isObjectLiteralExpression(element)) {\n const name = extractStringProperty(element, \"name\");\n const description = extractStringProperty(element, \"description\");\n\n if (name) {\n const variant: { name: string; description: string; code?: string; figma?: string; args?: Record<string, unknown> } = {\n name,\n description: description ?? \"\",\n };\n\n // Try to extract code property if present\n const codeProp = findProperty(element, \"code\");\n if (codeProp && ts.isStringLiteral(codeProp)) {\n variant.code = codeProp.text;\n }\n\n // Try to extract render function and convert to code string\n const renderProp = findProperty(element, \"render\");\n if (renderProp && !variant.code) {\n variant.code = extractRenderCode(renderProp, sourceFile);\n }\n\n // Extract figma URL for variant\n const figma = extractStringProperty(element, \"figma\");\n if (figma) {\n variant.figma = figma;\n }\n\n // Extract args object for code generation\n const argsProp = findProperty(element, \"args\");\n if (argsProp && ts.isObjectLiteralExpression(argsProp)) {\n const argsValue = extractLiteralValue(argsProp);\n if (argsValue && typeof argsValue === 'object' && !Array.isArray(argsValue)) {\n variant.args = argsValue as Record<string, unknown>;\n }\n }\n\n variants.push(variant);\n }\n }\n }\n\n return variants;\n}\n\n/**\n * Extract the code from a render function.\n */\nfunction extractRenderCode(\n renderProp: ts.Expression,\n sourceFile: ts.SourceFile\n): string | undefined {\n // Handle arrow function: () => <Component />\n if (ts.isArrowFunction(renderProp)) {\n const body = renderProp.body;\n // Get the source text of the body\n const start = body.getStart(sourceFile);\n const end = body.getEnd();\n let code = sourceFile.text.substring(start, end).trim();\n\n // Remove parentheses if present\n if (code.startsWith(\"(\") && code.endsWith(\")\")) {\n code = code.slice(1, -1).trim();\n }\n\n return code;\n }\n\n return undefined;\n}\n\n/**\n * Extract relations array from defineSegment call.\n */\nfunction extractRelations(\n arg: ts.ObjectLiteralExpression,\n warnings: string[]\n): Array<{ component: string; relationship: string; note: string }> {\n const relationsProp = findProperty(arg, \"relations\");\n if (!relationsProp || !ts.isArrayLiteralExpression(relationsProp)) {\n return [];\n }\n\n const relations: Array<{ component: string; relationship: string; note: string }> = [];\n\n for (const element of relationsProp.elements) {\n if (ts.isObjectLiteralExpression(element)) {\n const component = extractStringProperty(element, \"component\");\n const relationship = extractStringProperty(element, \"relationship\");\n const note = extractStringProperty(element, \"note\");\n\n if (component && relationship) {\n relations.push({\n component,\n relationship,\n note: note ?? \"\",\n });\n }\n }\n }\n\n return relations;\n}\n\n/**\n * Extract a string property from an object literal.\n */\nfunction extractStringProperty(\n obj: ts.ObjectLiteralExpression,\n name: string\n): string | null {\n const prop = findProperty(obj, name);\n if (prop && ts.isStringLiteral(prop)) {\n return prop.text;\n }\n // Handle template literals without expressions\n if (prop && ts.isNoSubstitutionTemplateLiteral(prop)) {\n return prop.text;\n }\n return null;\n}\n\n/**\n * Extract a boolean property from an object literal.\n */\nfunction extractBooleanProperty(\n obj: ts.ObjectLiteralExpression,\n name: string\n): boolean | null {\n const prop = findProperty(obj, name);\n if (prop) {\n if (prop.kind === ts.SyntaxKind.TrueKeyword) return true;\n if (prop.kind === ts.SyntaxKind.FalseKeyword) return false;\n }\n return null;\n}\n\n/**\n * Extract a string array from an object literal.\n */\nfunction extractStringArray(\n obj: ts.ObjectLiteralExpression,\n name: string\n): string[] {\n const prop = findProperty(obj, name);\n if (!prop || !ts.isArrayLiteralExpression(prop)) {\n return [];\n }\n\n const result: string[] = [];\n for (const element of prop.elements) {\n if (ts.isStringLiteral(element)) {\n result.push(element.text);\n } else if (ts.isNoSubstitutionTemplateLiteral(element)) {\n result.push(element.text);\n }\n }\n return result;\n}\n\n/**\n * Extract a literal value from an expression.\n */\nfunction extractLiteralValue(expr: ts.Expression): unknown {\n if (ts.isStringLiteral(expr)) {\n return expr.text;\n }\n if (ts.isNumericLiteral(expr)) {\n return Number(expr.text);\n }\n if (expr.kind === ts.SyntaxKind.TrueKeyword) {\n return true;\n }\n if (expr.kind === ts.SyntaxKind.FalseKeyword) {\n return false;\n }\n if (expr.kind === ts.SyntaxKind.NullKeyword) {\n return null;\n }\n if (ts.isArrayLiteralExpression(expr)) {\n return expr.elements.map(extractLiteralValue);\n }\n if (ts.isObjectLiteralExpression(expr)) {\n const obj: Record<string, unknown> = {};\n for (const prop of expr.properties) {\n if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name)) {\n obj[prop.name.text] = extractLiteralValue(prop.initializer);\n }\n }\n return obj;\n }\n return undefined;\n}\n","/**\n * Loader for Storybook .storybook/preview.{tsx,ts,jsx,js} configuration.\n *\n * This module detects and loads Storybook preview configuration to extract:\n * - decorators: Global decorators applied to all stories\n * - parameters: Global parameters for all stories\n * - globalTypes: Global type definitions (e.g., for toolbar controls)\n * - args: Default args for all stories\n * - argTypes: Default argTypes for all stories\n * - loaders: Global loaders for all stories\n */\n\nimport { existsSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport type { PreviewConfig } from \"./storyAdapter.js\";\n\n/**\n * Possible file extensions and names for preview config\n */\nconst PREVIEW_FILES = [\n \"preview.tsx\",\n \"preview.ts\",\n \"preview.jsx\",\n \"preview.js\",\n];\n\n/**\n * Find the preview config file in a .storybook directory\n *\n * @param storybookDir - Path to the .storybook directory\n * @returns The full path to the preview file, or null if not found\n */\nexport function findPreviewConfigPath(storybookDir: string): string | null {\n for (const fileName of PREVIEW_FILES) {\n const filePath = join(storybookDir, fileName);\n if (existsSync(filePath)) {\n return filePath;\n }\n }\n return null;\n}\n\n/**\n * Find the .storybook directory starting from a project root.\n * Checks common locations.\n *\n * @param projectRoot - The project root directory\n * @returns The path to the .storybook directory, or null if not found\n */\nexport function findStorybookDir(projectRoot: string): string | null {\n const possiblePaths = [\n join(projectRoot, \".storybook\"),\n join(projectRoot, \"storybook\"),\n ];\n\n for (const dir of possiblePaths) {\n if (existsSync(dir)) {\n return dir;\n }\n }\n return null;\n}\n\n/**\n * Load and parse the Storybook preview configuration.\n *\n * This function dynamically imports the preview file and extracts\n * the relevant configuration exports.\n *\n * @param previewPath - Full path to the preview config file\n * @returns The parsed preview configuration\n */\nexport async function loadPreviewConfig(\n previewPath: string\n): Promise<PreviewConfig> {\n try {\n // Dynamic import with file:// URL for ESM compatibility\n const fileUrl = new URL(`file://${resolve(previewPath)}`);\n const module = await import(fileUrl.href);\n\n // Extract configuration from the module\n const config: PreviewConfig = {\n decorators: module.decorators ?? module.default?.decorators ?? [],\n parameters: module.parameters ?? module.default?.parameters ?? {},\n globalTypes: module.globalTypes ?? module.default?.globalTypes ?? {},\n args: module.args ?? module.default?.args ?? {},\n argTypes: module.argTypes ?? module.default?.argTypes ?? {},\n loaders: module.loaders ?? module.default?.loaders ?? [],\n };\n\n return config;\n } catch (error) {\n console.warn(\n `[Segments] Failed to load preview config from ${previewPath}:`,\n error instanceof Error ? error.message : error\n );\n return {};\n }\n}\n\n/**\n * Auto-detect and load preview configuration from a project.\n *\n * @param projectRoot - The project root directory\n * @returns The preview configuration, or empty config if not found\n */\nexport async function autoLoadPreviewConfig(\n projectRoot: string\n): Promise<PreviewConfig> {\n const storybookDir = findStorybookDir(projectRoot);\n if (!storybookDir) {\n return {};\n }\n\n const previewPath = findPreviewConfigPath(storybookDir);\n if (!previewPath) {\n return {};\n }\n\n return loadPreviewConfig(previewPath);\n}\n\n/**\n * Generate a virtual module that imports and re-exports preview config.\n * This is used in the Vite plugin to make preview config available at runtime.\n *\n * @param previewPath - Full path to the preview config file, or null\n * @returns JavaScript code for the virtual module\n */\nexport function generatePreviewModule(previewPath: string | null): string {\n if (!previewPath) {\n // No preview config found - export empty defaults\n return `\nexport const decorators = [];\nexport const parameters = {};\nexport const globalTypes = {};\nexport const args = {};\nexport const argTypes = {};\nexport const loaders = [];\n\nexport default {\n decorators,\n parameters,\n globalTypes,\n args,\n argTypes,\n loaders,\n};\n`;\n }\n\n // Import from the actual preview file and re-export\n return `\nimport * as preview from \"${previewPath}\";\n\nexport const decorators = preview.decorators ?? preview.default?.decorators ?? [];\nexport const parameters = preview.parameters ?? preview.default?.parameters ?? {};\nexport const globalTypes = preview.globalTypes ?? preview.default?.globalTypes ?? {};\nexport const args = preview.args ?? preview.default?.args ?? {};\nexport const argTypes = preview.argTypes ?? preview.default?.argTypes ?? {};\nexport const loaders = preview.loaders ?? preview.default?.loaders ?? [];\n\nexport default {\n decorators,\n parameters,\n globalTypes,\n args,\n argTypes,\n loaders,\n};\n`;\n}\n","/**\n * AST-based import analysis for detecting component relationships\n *\n * Analyzes TypeScript/JavaScript files to find which components import others,\n * providing accurate \"used by\" relationships for the component graph.\n */\n\nimport ts from 'typescript';\nimport { readFileSync } from 'node:fs';\nimport { resolve, dirname, basename } from 'node:path';\n\nexport interface ComponentImport {\n /** Name of the imported component */\n name: string;\n /** Import path (relative or package) */\n path: string;\n /** Whether this is a default import */\n isDefault: boolean;\n /** Whether this is a namespace import */\n isNamespace: boolean;\n}\n\nexport interface ImportAnalysisResult {\n /** Source file path */\n filePath: string;\n /** Component name extracted from file */\n componentName: string;\n /** List of component imports found */\n imports: ComponentImport[];\n}\n\n/**\n * Extract component name from a file path\n */\nfunction extractComponentNameFromPath(filePath: string): string {\n const fileName = basename(filePath);\n\n // Handle index.tsx files - use parent directory name\n if (fileName === 'index.tsx' || fileName === 'index.ts' || fileName === 'index.jsx' || fileName === 'index.js') {\n const parentDir = basename(dirname(filePath));\n return parentDir;\n }\n\n // Remove extension and common suffixes\n return fileName\n .replace(/\\.(tsx?|jsx?)$/, '')\n .replace(/\\.stories$/, '')\n .replace(/\\.segment$/, '')\n .replace(/\\.fragment$/, '');\n}\n\n/**\n * Check if an import path looks like a component import (not a utility/library)\n */\nfunction isComponentImportPath(importPath: string): boolean {\n // Skip node_modules packages\n if (!importPath.startsWith('.') && !importPath.startsWith('/')) {\n return false;\n }\n\n // Skip common utility/hook patterns\n const skipPatterns = [\n /\\/hooks\\//,\n /\\/utils\\//,\n /\\/helpers\\//,\n /\\/lib\\//,\n /\\/types\\//,\n /\\/constants\\//,\n /\\/styles\\//,\n /\\/context\\//,\n /\\.css$/,\n /\\.scss$/,\n /\\.less$/,\n /\\.json$/,\n ];\n\n for (const pattern of skipPatterns) {\n if (pattern.test(importPath)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Check if an imported name looks like a React component (PascalCase)\n */\nfunction isPascalCase(name: string): boolean {\n return /^[A-Z][a-zA-Z0-9]*$/.test(name);\n}\n\n/**\n * Analyze a single file for component imports\n */\nexport function analyzeFileImports(filePath: string): ImportAnalysisResult {\n const componentName = extractComponentNameFromPath(filePath);\n const imports: ComponentImport[] = [];\n\n let sourceText: string;\n try {\n sourceText = readFileSync(filePath, 'utf-8');\n } catch {\n return { filePath, componentName, imports };\n }\n\n const sourceFile = ts.createSourceFile(\n filePath,\n sourceText,\n ts.ScriptTarget.Latest,\n true,\n filePath.endsWith('.tsx') || filePath.endsWith('.jsx')\n ? ts.ScriptKind.TSX\n : ts.ScriptKind.TS\n );\n\n ts.forEachChild(sourceFile, (node) => {\n if (ts.isImportDeclaration(node)) {\n const moduleSpecifier = node.moduleSpecifier;\n if (!ts.isStringLiteral(moduleSpecifier)) return;\n\n const importPath = moduleSpecifier.text;\n\n // Skip non-component imports\n if (!isComponentImportPath(importPath)) return;\n\n const importClause = node.importClause;\n if (!importClause) return;\n\n // Default import: import Button from './Button'\n if (importClause.name) {\n const name = importClause.name.text;\n if (isPascalCase(name)) {\n imports.push({\n name,\n path: importPath,\n isDefault: true,\n isNamespace: false,\n });\n }\n }\n\n // Named imports: import { Button, Icon } from './components'\n const namedBindings = importClause.namedBindings;\n if (namedBindings) {\n if (ts.isNamedImports(namedBindings)) {\n for (const element of namedBindings.elements) {\n const name = element.name.text;\n if (isPascalCase(name)) {\n imports.push({\n name,\n path: importPath,\n isDefault: false,\n isNamespace: false,\n });\n }\n }\n } else if (ts.isNamespaceImport(namedBindings)) {\n // Namespace import: import * as Components from './components'\n // We can't reliably know what components are used without more analysis\n const name = namedBindings.name.text;\n imports.push({\n name,\n path: importPath,\n isDefault: false,\n isNamespace: true,\n });\n }\n }\n }\n });\n\n return { filePath, componentName, imports };\n}\n\n/**\n * Build a map of which components are imported by which files\n */\nexport function buildImportGraph(\n filePaths: string[]\n): Map<string, string[]> {\n // Map from component name -> list of component names that import it\n const importedBy = new Map<string, string[]>();\n\n for (const filePath of filePaths) {\n const result = analyzeFileImports(filePath);\n\n for (const imp of result.imports) {\n // Skip namespace imports for now\n if (imp.isNamespace) continue;\n\n const importedComponent = imp.name;\n const importingComponent = result.componentName;\n\n // Don't add self-references\n if (importedComponent === importingComponent) continue;\n\n const existing = importedBy.get(importedComponent) || [];\n if (!existing.includes(importingComponent)) {\n existing.push(importingComponent);\n importedBy.set(importedComponent, existing);\n }\n }\n }\n\n return importedBy;\n}\n\n/**\n * Get components that import a specific component\n */\nexport function getImportedBy(\n componentName: string,\n importGraph: Map<string, string[]>\n): string[] {\n return importGraph.get(componentName) || [];\n}\n"],"mappings":"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","names":["resolve","dirname","existsSync","resolve","existsSync","dirname","readFileSync","dirname","basename","fg","fg","dirname","basename","readFileSync","content","name","dirname","basename","join","build","dirname","basename","join","ts","existsSync","join","resolve","ts","readFileSync","dirname","basename"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/constants.ts","../src/core/schema.ts"],"sourcesContent":["/**\n * Brand constants for easy rebranding if domain availability requires it.\n * All naming throughout the codebase should reference these constants.\n */\nexport const BRAND = {\n /** Display name (e.g., \"Fragments\") */\n name: \"Fragments\",\n\n /** Lowercase name for file paths and CLI (e.g., \"fragments\") */\n nameLower: \"fragments\",\n\n /** File extension for fragment definition files (e.g., \".fragment.tsx\") */\n fileExtension: \".fragment.tsx\",\n\n /** Legacy file extension for segments (still supported for migration) */\n legacyFileExtension: \".segment.tsx\",\n\n /** JSON file extension for compiled output */\n jsonExtension: \".fragment.json\",\n\n /** Default output file name (e.g., \"fragments.json\") */\n outFile: \"fragments.json\",\n\n /** Config file name (e.g., \"fragments.config.ts\") */\n configFile: \"fragments.config.ts\",\n\n /** Legacy config file name (still supported for migration) */\n legacyConfigFile: \"segments.config.ts\",\n\n /** CLI command name (e.g., \"fragments\") */\n cliCommand: \"fragments\",\n\n /** Package scope (e.g., \"@fragments\") */\n packageScope: \"@fragments\",\n\n /** Directory for storing fragments, registry, and cache */\n dataDir: \".fragments\",\n\n /** Components subdirectory within .fragments/ */\n componentsDir: \"components\",\n\n /** Registry file name */\n registryFile: \"registry.json\",\n\n /** Context file name (AI-ready markdown) */\n contextFile: \"context.md\",\n\n /** Screenshots subdirectory */\n screenshotsDir: \"screenshots\",\n\n /** Cache subdirectory (gitignored) */\n cacheDir: \"cache\",\n\n /** Diff output subdirectory (gitignored) */\n diffDir: \"diff\",\n\n /** Manifest filename */\n manifestFile: \"manifest.json\",\n\n /** Prefix for localStorage keys (e.g., \"fragments-\") */\n storagePrefix: \"fragments-\",\n\n /** Static viewer HTML file name */\n viewerHtmlFile: \"fragments-viewer.html\",\n\n /** MCP tool name prefix (e.g., \"fragments_\") */\n mcpToolPrefix: \"fragments_\",\n\n /** File extension for recipe definition files */\n recipeFileExtension: \".recipe.ts\",\n\n /** Vite plugin namespace */\n vitePluginNamespace: \"fragments-core-shim\",\n} as const;\n\nexport type Brand = typeof BRAND;\n\n/**\n * Default configuration values for the service.\n * These can be overridden in fragments.config.ts\n */\nexport const DEFAULTS = {\n /** Default viewport dimensions */\n viewport: {\n width: 1280,\n height: 800,\n },\n\n /** Default diff threshold (percentage) */\n diffThreshold: 5,\n\n /** Browser pool size */\n poolSize: 3,\n\n /** Idle timeout before browser shutdown (ms) - 5 minutes */\n idleTimeoutMs: 5 * 60 * 1000,\n\n /** Delay after render before capture (ms) */\n captureDelayMs: 100,\n\n /** Font loading timeout (ms) */\n fontTimeoutMs: 3000,\n\n /** Default theme */\n theme: \"light\" as const,\n\n /** Dev server port */\n port: 6006,\n} as const;\n\nexport type Defaults = typeof DEFAULTS;\n","import { z } from 'zod';\n\n/**\n * Zod schemas for runtime validation of segment definitions\n */\n\n// Figma property mapping schemas\nconst figmaStringMappingSchema = z.object({\n __type: z.literal('figma-string'),\n figmaProperty: z.string().min(1),\n});\n\nconst figmaBooleanMappingSchema = z.object({\n __type: z.literal('figma-boolean'),\n figmaProperty: z.string().min(1),\n valueMapping: z.object({ true: z.unknown(), false: z.unknown() }).optional(),\n});\n\nconst figmaEnumMappingSchema = z.object({\n __type: z.literal('figma-enum'),\n figmaProperty: z.string().min(1),\n valueMapping: z.record(z.unknown()),\n});\n\nconst figmaInstanceMappingSchema = z.object({\n __type: z.literal('figma-instance'),\n figmaProperty: z.string().min(1),\n});\n\nconst figmaChildrenMappingSchema = z.object({\n __type: z.literal('figma-children'),\n layers: z.array(z.string().min(1)),\n});\n\nconst figmaTextContentMappingSchema = z.object({\n __type: z.literal('figma-text-content'),\n layer: z.string().min(1),\n});\n\nexport const figmaPropMappingSchema = z.discriminatedUnion('__type', [\n figmaStringMappingSchema,\n figmaBooleanMappingSchema,\n figmaEnumMappingSchema,\n figmaInstanceMappingSchema,\n figmaChildrenMappingSchema,\n figmaTextContentMappingSchema,\n]);\n\nexport const segmentMetaSchema = z.object({\n name: z.string().min(1),\n description: z.string().min(1),\n category: z.string().min(1),\n tags: z.array(z.string()).optional(),\n status: z.enum(['stable', 'beta', 'deprecated', 'experimental']).optional(),\n since: z.string().optional(),\n figma: z.string().url().optional(),\n figmaProps: z.record(figmaPropMappingSchema).optional(),\n});\n\nexport const segmentUsageSchema = z.object({\n when: z.array(z.string()).min(1),\n whenNot: z.array(z.string()).min(1),\n guidelines: z.array(z.string()).optional(),\n accessibility: z.array(z.string()).optional(),\n});\n\nexport const propTypeSchema: z.ZodType<string> = z.enum([\n 'string',\n 'number',\n 'boolean',\n 'enum',\n 'function',\n 'node',\n 'element',\n 'object',\n 'array',\n 'union',\n 'custom',\n]);\n\nexport const propDefinitionSchema = z.object({\n type: propTypeSchema,\n values: z.array(z.string()).readonly().optional(),\n default: z.unknown().optional(),\n description: z.string().optional(),\n required: z.boolean().optional(),\n constraints: z.array(z.string()).optional(),\n typeDetails: z.record(z.unknown()).optional(),\n});\n\nexport const relationshipTypeSchema = z.enum([\n 'alternative',\n 'sibling',\n 'parent',\n 'child',\n 'composition',\n]);\n\nexport const componentRelationSchema = z.object({\n component: z.string().min(1),\n relationship: relationshipTypeSchema,\n note: z.string().min(1),\n});\n\nexport const segmentVariantSchema = z.object({\n name: z.string().min(1),\n description: z.string().min(1),\n render: z.function().returns(z.unknown()),\n code: z.string().optional(),\n figma: z.string().url().optional(),\n});\n\n/**\n * Schema for banned patterns in codebase\n */\nexport const segmentBanSchema = z.object({\n pattern: z.string().min(1),\n message: z.string().min(1),\n});\n\n/**\n * Schema for agent-optimized contract metadata\n */\nexport const segmentContractSchema = z.object({\n propsSummary: z.array(z.string()).optional(),\n a11yRules: z.array(z.string()).optional(),\n bans: z.array(segmentBanSchema).optional(),\n scenarioTags: z.array(z.string()).optional(),\n});\n\n/**\n * Schema for provenance tracking of generated segments\n */\nexport const segmentGeneratedSchema = z.object({\n source: z.enum(['storybook', 'manual', 'ai']),\n sourceFile: z.string().optional(),\n confidence: z.number().min(0).max(1).optional(),\n timestamp: z.string().datetime().optional(),\n});\n\n/**\n * Schema for recipe definitions\n */\nexport const recipeDefinitionSchema = z.object({\n name: z.string().min(1),\n description: z.string().min(1),\n category: z.string().min(1),\n components: z.array(z.string().min(1)).min(1),\n code: z.string().min(1),\n tags: z.array(z.string()).optional(),\n});\n\nexport const segmentDefinitionSchema = z.object({\n component: z.any(), // Allow any component type (function, class, forwardRef, etc.)\n meta: segmentMetaSchema,\n usage: segmentUsageSchema,\n props: z.record(propDefinitionSchema),\n relations: z.array(componentRelationSchema).optional(),\n variants: z.array(segmentVariantSchema), // Allow empty variants array\n contract: segmentContractSchema.optional(),\n _generated: segmentGeneratedSchema.optional(),\n});\n\n/**\n * Config schema - validates required fields, passes through optional config objects.\n * Type definitions are in types.ts - schema just ensures basic structure.\n */\nexport const segmentsConfigSchema = z.object({\n include: z.array(z.string()).min(1),\n exclude: z.array(z.string()).optional(),\n components: z.array(z.string()).optional(),\n outFile: z.string().optional(),\n framework: z.enum(['react', 'vue', 'svelte']).optional(),\n figmaFile: z.string().url().optional(),\n figmaToken: z.string().optional(),\n screenshots: z.object({}).passthrough().optional(),\n service: z.object({}).passthrough().optional(),\n registry: z.object({}).passthrough().optional(),\n tokens: z.object({\n include: z.array(z.string()).min(1),\n }).passthrough().optional(),\n});\n"],"mappings":"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","names":[]}
|
package/dist/scan-3ZAOVO4U.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import {
|
|
3
|
-
scan
|
|
4
|
-
} from "./chunk-3OTEW66K.js";
|
|
5
|
-
import "./chunk-MUZ6CM66.js";
|
|
6
|
-
import "./chunk-PMGI7ATF.js";
|
|
7
|
-
import "./chunk-LY2CFFPY.js";
|
|
8
|
-
import "./chunk-XHNKNI6J.js";
|
|
9
|
-
export {
|
|
10
|
-
scan
|
|
11
|
-
};
|
|
12
|
-
//# sourceMappingURL=scan-3ZAOVO4U.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/test/index.ts","../src/test/discovery.ts","../src/test/runner.ts","../src/test/reporters/console.ts","../src/test/reporters/junit.ts","../src/test/reporters/json.ts","../src/test/watch.ts"],"sourcesContent":["/**\n * Main test command - orchestrates test discovery, execution, and reporting\n */\n\nimport { resolve, join } from 'node:path';\nimport { mkdir } from 'node:fs/promises';\nimport pc from 'picocolors';\nimport type { SegmentsConfig } from '../core/index.js';\nimport type {\n TestConfig,\n DiscoveryOptions,\n RunnerOptions,\n TestReporter,\n TestRunResult,\n} from './types.js';\nimport { discoverTests, getUniqueComponents, getUniqueTags } from './discovery.js';\nimport { runTests } from './runner.js';\nimport { createConsoleReporter } from './reporters/console.js';\nimport { createJUnitReporter } from './reporters/junit.js';\nimport { createJsonReporter } from './reporters/json.js';\nimport { startWatchMode } from './watch.js';\n\nexport interface TestCommandOptions {\n // Discovery options\n component?: string;\n tags?: string;\n grep?: string;\n exclude?: string;\n\n // Execution options\n parallel?: number;\n timeout?: number;\n retries?: number;\n bail?: boolean;\n browser?: 'chromium' | 'firefox' | 'webkit';\n headless?: boolean;\n\n // Feature flags\n a11y?: boolean;\n visual?: boolean;\n updateSnapshots?: boolean;\n watch?: boolean;\n\n // Output options\n reporters?: string;\n output?: string;\n\n // Server options\n serverUrl?: string;\n port?: number;\n\n // CI mode\n ci?: boolean;\n}\n\n/**\n * Default options\n */\nconst DEFAULT_OPTIONS = {\n parallel: 4,\n timeout: 30000,\n retries: 0,\n bail: false,\n browser: 'chromium' as const,\n headless: true,\n a11y: false,\n visual: false,\n updateSnapshots: false,\n watch: false,\n reporters: 'console',\n output: './test-results',\n port: 6006,\n ci: false,\n};\n\n/**\n * Run the test command\n */\nexport async function runTestCommand(\n config: SegmentsConfig,\n configDir: string,\n options: TestCommandOptions\n): Promise<number> {\n // Merge with defaults\n const opts = {\n ...DEFAULT_OPTIONS,\n ...options,\n };\n\n // Parse discovery options\n const discoveryOptions: DiscoveryOptions = {\n component: opts.component,\n tags: opts.tags ? opts.tags.split(',').map((t) => t.trim()) : undefined,\n grep: opts.grep,\n exclude: opts.exclude,\n };\n\n // Parse runner options\n const runnerOptions: RunnerOptions = {\n parallel: opts.parallel,\n timeout: opts.timeout,\n retries: opts.retries,\n bail: opts.bail,\n a11y: opts.a11y,\n visual: opts.visual,\n updateSnapshots: opts.updateSnapshots,\n outputDir: resolve(configDir, opts.output),\n browser: opts.browser,\n headless: opts.headless,\n serverUrl: opts.serverUrl,\n port: opts.port,\n };\n\n // In CI mode, adjust settings\n if (opts.ci) {\n runnerOptions.headless = true;\n }\n\n // Discover tests\n console.log(pc.cyan('\\nDiscovering tests...'));\n const testCases = await discoverTests(config, configDir, discoveryOptions);\n\n if (testCases.length === 0) {\n console.log(pc.yellow('No tests with play functions found'));\n\n // Show helpful info about what was searched\n const components = getUniqueComponents(testCases);\n const tags = getUniqueTags(testCases);\n\n if (discoveryOptions.component) {\n console.log(pc.dim(` Filtered by component: ${discoveryOptions.component}`));\n }\n if (discoveryOptions.tags?.length) {\n console.log(pc.dim(` Filtered by tags: ${discoveryOptions.tags.join(', ')}`));\n }\n if (discoveryOptions.grep) {\n console.log(pc.dim(` Filtered by pattern: ${discoveryOptions.grep}`));\n }\n\n console.log();\n console.log(pc.dim('Add play functions to your segment variants to enable testing.'));\n console.log();\n\n return opts.ci ? 0 : 0; // Not a failure if no tests\n }\n\n console.log(pc.dim(`Found ${testCases.length} test(s)`));\n\n // Create output directory\n await mkdir(runnerOptions.outputDir, { recursive: true });\n\n // Create reporters\n const reporters = createReporters(opts.reporters, runnerOptions.outputDir, opts.ci);\n\n // Watch mode\n if (opts.watch && !opts.ci) {\n await startWatchMode(config, configDir, runnerOptions, reporters);\n return 0;\n }\n\n // Run tests\n let result: TestRunResult;\n try {\n result = await runTests(testCases, runnerOptions, reporters);\n } catch (error) {\n console.error(pc.red('Error running tests:'), error);\n return 1;\n }\n\n // Return exit code based on results\n if (opts.ci && result.totalFailed > 0) {\n return 1;\n }\n\n return result.totalFailed > 0 ? 1 : 0;\n}\n\n/**\n * Create reporters based on configuration\n */\nfunction createReporters(\n reporterNames: string,\n outputDir: string,\n ci: boolean\n): TestReporter[] {\n const reporters: TestReporter[] = [];\n const names = reporterNames.split(',').map((n) => n.trim().toLowerCase());\n\n for (const name of names) {\n switch (name) {\n case 'console':\n reporters.push(\n createConsoleReporter({\n verbose: !ci,\n showTiming: true,\n })\n );\n break;\n\n case 'junit':\n reporters.push(\n createJUnitReporter({\n outputPath: join(outputDir, 'junit.xml'),\n suiteName: 'Segments Tests',\n })\n );\n break;\n\n case 'json':\n reporters.push(\n createJsonReporter({\n outputPath: join(outputDir, 'results.json'),\n pretty: true,\n includeSteps: true,\n includeStacks: !ci,\n })\n );\n break;\n\n default:\n console.warn(pc.yellow(`Unknown reporter: ${name}`));\n }\n }\n\n // Always include console reporter if not explicitly specified\n if (!names.includes('console') && reporters.length === 0) {\n reporters.push(createConsoleReporter({ verbose: !ci }));\n }\n\n return reporters;\n}\n\n/**\n * List available tests without running them\n */\nexport async function listTests(\n config: SegmentsConfig,\n configDir: string,\n options: Pick<TestCommandOptions, 'component' | 'tags' | 'grep' | 'exclude'>\n): Promise<void> {\n const discoveryOptions: DiscoveryOptions = {\n component: options.component,\n tags: options.tags ? options.tags.split(',').map((t) => t.trim()) : undefined,\n grep: options.grep,\n exclude: options.exclude,\n };\n\n const testCases = await discoverTests(config, configDir, discoveryOptions);\n\n console.log();\n console.log(pc.cyan(pc.bold('Available Tests')));\n console.log();\n\n if (testCases.length === 0) {\n console.log(pc.yellow('No tests with play functions found'));\n return;\n }\n\n // Group by component\n const byComponent = new Map<string, typeof testCases>();\n for (const test of testCases) {\n const existing = byComponent.get(test.component) || [];\n existing.push(test);\n byComponent.set(test.component, existing);\n }\n\n for (const [component, tests] of byComponent) {\n console.log(pc.bold(component));\n for (const test of tests) {\n const tags = test.tags.length > 0 ? pc.dim(` [${test.tags.join(', ')}]`) : '';\n console.log(` ${pc.green('›')} ${test.variant}${tags}`);\n }\n console.log();\n }\n\n console.log(pc.dim(`Total: ${testCases.length} test(s) in ${byComponent.size} component(s)`));\n console.log();\n}\n\n// Re-export types\nexport type { TestCase, TestResult, TestRunResult, TestSuite, TestReporter } from './types.js';\n","/**\n * Test discovery - finds variants with play functions\n */\n\nimport { readFile } from 'node:fs/promises';\nimport type { SegmentsConfig } from '../core/index.js';\nimport { discoverSegmentFiles, parseSegmentFile } from '../core/node.js';\nimport type { TestCase, DiscoveryOptions } from './types.js';\n\n/**\n * Discovered segment with play function metadata\n */\ninterface DiscoveredVariant {\n component: string;\n variant: string;\n tags: string[];\n hasPlayFunction: boolean;\n storyId?: string;\n sourceFile: string;\n}\n\n/**\n * Discover all variants with play functions\n */\nexport async function discoverTests(\n config: SegmentsConfig,\n configDir: string,\n options: DiscoveryOptions = {}\n): Promise<TestCase[]> {\n const files = await discoverSegmentFiles(config, configDir);\n const variants: DiscoveredVariant[] = [];\n\n for (const file of files) {\n try {\n const content = await readFile(file.absolutePath, 'utf-8');\n const parsed = parseSegmentFile(content, file.relativePath);\n\n if (!parsed.meta.name) continue;\n\n // Filter by component name if specified\n if (options.component) {\n const componentMatch = parsed.meta.name.toLowerCase().includes(options.component.toLowerCase());\n if (!componentMatch) continue;\n }\n\n // Extract tags from meta for the component\n const componentTags = parsed.meta.tags || [];\n\n for (const variant of parsed.variants) {\n // Check if variant has play function by scanning source code\n const hasPlay = hasPlayFunctionInSource(content, variant.name);\n\n if (!hasPlay) continue;\n\n // Filter by tags if specified (use component-level tags since variant tags aren't in parsed data)\n if (options.tags && options.tags.length > 0) {\n const hasMatchingTag = options.tags.some((tag: string) =>\n componentTags.some((ct: string) => ct.toLowerCase().includes(tag.toLowerCase()))\n );\n if (!hasMatchingTag) continue;\n }\n\n // Filter by grep pattern if specified\n if (options.grep) {\n const pattern = new RegExp(options.grep, 'i');\n const matchesName = pattern.test(variant.name);\n const matchesComponent = pattern.test(parsed.meta.name);\n if (!matchesName && !matchesComponent) continue;\n }\n\n // Exclude pattern\n if (options.exclude) {\n const pattern = new RegExp(options.exclude, 'i');\n const excludeName = pattern.test(variant.name);\n const excludeComponent = pattern.test(parsed.meta.name);\n if (excludeName || excludeComponent) continue;\n }\n\n variants.push({\n component: parsed.meta.name,\n variant: variant.name,\n tags: componentTags,\n hasPlayFunction: true,\n storyId: undefined, // Not available from static parsing\n sourceFile: file.relativePath,\n });\n }\n } catch {\n // Skip files that can't be parsed\n continue;\n }\n }\n\n // Convert to test cases\n return variants.map((v) => ({\n id: `${v.component}--${v.variant}`.replace(/\\s+/g, '-').toLowerCase(),\n component: v.component,\n variant: v.variant,\n tags: v.tags,\n play: null as unknown as TestCase['play'], // Play function loaded at runtime in browser\n sourceFile: v.sourceFile,\n storyId: v.storyId,\n }));\n}\n\n/**\n * Check if a variant has a play function by scanning the source code\n */\nfunction hasPlayFunctionInSource(content: string, variantName: string): boolean {\n // Look for play function patterns in the source\n // Pattern 1: play: async ({ ... }) => { ... }\n // Pattern 2: play: async function ({ ... }) { ... }\n // Pattern 3: play: playFunction (reference)\n\n // Normalize variant name for matching (handle Default, Primary, etc.)\n const patterns = [\n // Export const VariantName = { ... play: ... }\n new RegExp(`export\\\\s+const\\\\s+${escapeRegExp(variantName)}\\\\s*=\\\\s*\\\\{[^}]*\\\\bplay\\\\s*:`, 's'),\n // variants: [{ name: 'VariantName', ... play: ... }]\n new RegExp(`name\\\\s*:\\\\s*['\"\\`]${escapeRegExp(variantName)}['\"\\`][^}]*\\\\bplay\\\\s*:`, 's'),\n // In case the variant has play in its definition object\n new RegExp(`['\"\\`]${escapeRegExp(variantName)}['\"\\`]\\\\s*:\\\\s*\\\\{[^}]*\\\\bplay\\\\s*:`, 's'),\n ];\n\n return patterns.some(pattern => pattern.test(content));\n}\n\n/**\n * Escape special regex characters\n */\nfunction escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Group test cases by component\n */\nexport function groupTestsByComponent(testCases: TestCase[]): Map<string, TestCase[]> {\n const groups = new Map<string, TestCase[]>();\n\n for (const test of testCases) {\n const existing = groups.get(test.component) || [];\n existing.push(test);\n groups.set(test.component, existing);\n }\n\n return groups;\n}\n\n/**\n * Get unique tags from all test cases\n */\nexport function getUniqueTags(testCases: TestCase[]): string[] {\n const tags = new Set<string>();\n for (const test of testCases) {\n for (const tag of test.tags) {\n tags.add(tag);\n }\n }\n return Array.from(tags).sort();\n}\n\n/**\n * Get unique components from all test cases\n */\nexport function getUniqueComponents(testCases: TestCase[]): string[] {\n const components = new Set<string>();\n for (const test of testCases) {\n components.add(test.component);\n }\n return Array.from(components).sort();\n}\n","/**\n * Test runner - executes play functions in browser via Playwright\n *\n * Playwright is an optional dependency. If not installed, the test command\n * will prompt the user to install it.\n */\n\nimport type {\n TestCase,\n TestResult,\n TestSuite,\n TestRunResult,\n TestError,\n StepResult,\n A11yResult,\n A11yViolation,\n RunnerOptions,\n TestReporter,\n} from './types.js';\nimport { groupTestsByComponent } from './discovery.js';\n\n// Dynamic playwright types (since it's optional)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Browser = any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype BrowserContext = any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Page = any;\n\n/**\n * Browser pool for parallel test execution\n */\ninterface BrowserPool {\n browser: Browser;\n contexts: BrowserContextEntry[];\n}\n\ninterface BrowserContextEntry {\n id: number;\n context: BrowserContext;\n page: Page;\n busy: boolean;\n}\n\n/**\n * Run tests with the given configuration\n */\nexport async function runTests(\n testCases: TestCase[],\n options: RunnerOptions,\n reporters: TestReporter[] = []\n): Promise<TestRunResult> {\n const startTime = new Date();\n const results: TestResult[] = [];\n\n // Notify reporters of run start\n for (const reporter of reporters) {\n reporter.onRunStart?.(testCases.length);\n }\n\n // Import Playwright dynamically (optional dependency)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let playwright: any;\n try {\n playwright = await import('playwright');\n } catch {\n throw new Error(\n 'Playwright is required for running tests. Install it with: npm install -D playwright'\n );\n }\n\n // Launch browser\n const browserType = playwright[options.browser];\n const browser = await browserType.launch({\n headless: options.headless,\n });\n\n // Create browser pool for parallel execution\n const pool = await createBrowserPool(browser, options.parallel);\n\n try {\n // Determine server URL\n const serverUrl = options.serverUrl || `http://localhost:${options.port}`;\n\n // Run tests with parallelism\n if (options.parallel > 1) {\n await runTestsParallel(\n testCases,\n pool,\n serverUrl,\n options,\n reporters,\n results\n );\n } else {\n await runTestsSequential(\n testCases,\n pool.contexts[0],\n serverUrl,\n options,\n reporters,\n results\n );\n }\n } finally {\n // Cleanup browser pool\n await cleanupBrowserPool(pool);\n }\n\n const endTime = new Date();\n\n // Aggregate results into suites\n const suites = aggregateResults(results);\n\n const runResult: TestRunResult = {\n suites,\n totalTests: results.length,\n totalPassed: results.filter((r) => r.status === 'passed').length,\n totalFailed: results.filter((r) => r.status === 'failed').length,\n totalSkipped: results.filter((r) => r.status === 'skipped').length,\n totalDuration: endTime.getTime() - startTime.getTime(),\n startTime,\n endTime,\n totalA11yViolations: options.a11y\n ? results.reduce((sum, r) => sum + (r.accessibility?.violations.length || 0), 0)\n : undefined,\n };\n\n // Notify reporters of run completion\n for (const reporter of reporters) {\n await reporter.onRunComplete(runResult);\n }\n\n return runResult;\n}\n\n/**\n * Create a browser pool for parallel execution\n */\nasync function createBrowserPool(\n browser: Browser,\n parallelism: number\n): Promise<BrowserPool> {\n const contexts: BrowserContextEntry[] = [];\n\n for (let i = 0; i < parallelism; i++) {\n const context = await browser.newContext({\n viewport: { width: 1280, height: 720 },\n });\n const page = await context.newPage();\n contexts.push({ id: i, context, page, busy: false });\n }\n\n return { browser, contexts };\n}\n\n/**\n * Cleanup browser pool\n */\nasync function cleanupBrowserPool(pool: BrowserPool): Promise<void> {\n for (const entry of pool.contexts) {\n await entry.page.close();\n await entry.context.close();\n }\n await pool.browser.close();\n}\n\n/**\n * Run tests sequentially\n */\nasync function runTestsSequential(\n testCases: TestCase[],\n ctx: BrowserContextEntry,\n serverUrl: string,\n options: RunnerOptions,\n reporters: TestReporter[],\n results: TestResult[]\n): Promise<void> {\n for (const testCase of testCases) {\n // Notify reporters of test start\n for (const reporter of reporters) {\n reporter.onTestStart?.(testCase);\n }\n\n const result = await runSingleTest(testCase, ctx, serverUrl, options);\n results.push(result);\n\n // Notify reporters of test completion\n for (const reporter of reporters) {\n reporter.onTestComplete?.(result);\n }\n\n // Bail on first failure if configured\n if (options.bail && result.status === 'failed') {\n break;\n }\n }\n}\n\n/**\n * Run tests in parallel\n */\nasync function runTestsParallel(\n testCases: TestCase[],\n pool: BrowserPool,\n serverUrl: string,\n options: RunnerOptions,\n reporters: TestReporter[],\n results: TestResult[]\n): Promise<void> {\n const queue = [...testCases];\n const inFlight: Promise<void>[] = [];\n let bailTriggered = false;\n\n const acquireContext = (): BrowserContextEntry | null => {\n const available = pool.contexts.find((c) => !c.busy);\n if (available) {\n available.busy = true;\n return available;\n }\n return null;\n };\n\n const releaseContext = (ctx: BrowserContextEntry): void => {\n ctx.busy = false;\n };\n\n const runNext = async (): Promise<void> => {\n if (bailTriggered || queue.length === 0) return;\n\n const ctx = acquireContext();\n if (!ctx) return;\n\n const testCase = queue.shift()!;\n\n // Notify reporters of test start\n for (const reporter of reporters) {\n reporter.onTestStart?.(testCase);\n }\n\n try {\n const result = await runSingleTest(testCase, ctx, serverUrl, options);\n results.push(result);\n\n // Notify reporters of test completion\n for (const reporter of reporters) {\n reporter.onTestComplete?.(result);\n }\n\n // Check bail condition\n if (options.bail && result.status === 'failed') {\n bailTriggered = true;\n }\n } finally {\n releaseContext(ctx);\n // Start next test if not bailing\n if (!bailTriggered && queue.length > 0) {\n const nextPromise = runNext();\n inFlight.push(nextPromise);\n }\n }\n };\n\n // Start initial batch\n const initialBatch = Math.min(pool.contexts.length, queue.length);\n for (let i = 0; i < initialBatch; i++) {\n inFlight.push(runNext());\n }\n\n // Wait for all to complete\n await Promise.all(inFlight);\n}\n\n/**\n * Run a single test case\n */\nasync function runSingleTest(\n testCase: TestCase,\n ctx: BrowserContextEntry,\n serverUrl: string,\n options: RunnerOptions\n): Promise<TestResult> {\n const { page } = ctx;\n const startTime = performance.now();\n const steps: StepResult[] = [];\n let error: TestError | undefined;\n let status: TestResult['status'] = 'passed';\n let retryAttempt = 0;\n\n // Retry logic\n const maxAttempts = options.retries + 1;\n\n while (retryAttempt < maxAttempts) {\n try {\n // Navigate to the variant\n const url = buildVariantUrl(serverUrl, testCase);\n await page.goto(url, { waitUntil: 'networkidle' });\n\n // Wait for preview container\n await page.waitForSelector('[data-preview-container=\"true\"]', {\n timeout: options.timeout,\n });\n\n // Execute play function in browser context\n const playResult = await executePlayFunction(page, testCase, options.timeout);\n\n if (playResult.error) {\n error = playResult.error;\n status = 'failed';\n steps.push(...playResult.steps);\n\n // Retry if not last attempt\n if (retryAttempt < maxAttempts - 1) {\n retryAttempt++;\n continue;\n }\n } else {\n status = 'passed';\n steps.push(...playResult.steps);\n }\n\n break; // Success, no retry needed\n } catch (e) {\n error = {\n message: e instanceof Error ? e.message : String(e),\n stack: e instanceof Error ? e.stack : undefined,\n };\n status = 'failed';\n\n if (retryAttempt < maxAttempts - 1) {\n retryAttempt++;\n continue;\n }\n break;\n }\n }\n\n const duration = performance.now() - startTime;\n\n // Run accessibility checks if enabled\n let accessibility: A11yResult | undefined;\n if (options.a11y && status === 'passed') {\n accessibility = await runA11yChecks(page);\n }\n\n // Capture screenshot for visual regression if enabled\n let screenshotPath: string | undefined;\n if (options.visual) {\n screenshotPath = await captureScreenshot(page, testCase, options.outputDir);\n }\n\n return {\n testCase,\n status,\n duration,\n steps,\n error,\n accessibility,\n screenshotPath,\n retryAttempt: retryAttempt > 0 ? retryAttempt : undefined,\n };\n}\n\n/**\n * Build URL for a variant\n */\nfunction buildVariantUrl(serverUrl: string, testCase: TestCase): string {\n const params = new URLSearchParams({\n component: testCase.component,\n variant: testCase.variant,\n isolated: 'true',\n });\n return `${serverUrl}?${params.toString()}`;\n}\n\n/**\n * Execute play function in browser context\n */\nasync function executePlayFunction(\n page: Page,\n testCase: TestCase,\n timeout: number\n): Promise<{ steps: StepResult[]; error?: TestError }> {\n const result = await page.evaluate(\n async ({ component, variant, timeout }: { component: string; variant: string; timeout: number }) => {\n // Find the segment definition in the global registry\n const registry = (window as unknown as { __SEGMENTS_REGISTRY__?: Map<string, unknown> })\n .__SEGMENTS_REGISTRY__;\n\n if (!registry) {\n return {\n steps: [],\n error: { message: 'Segments registry not found. Make sure the viewer is loaded.' },\n };\n }\n\n const segment = registry.get(component) as {\n variants?: Array<{\n name: string;\n play?: (ctx: {\n canvasElement: HTMLElement;\n args: Record<string, unknown>;\n step: (name: string, fn: () => Promise<void>) => Promise<void>;\n }) => Promise<void>;\n }>;\n } | undefined;\n\n if (!segment) {\n return {\n steps: [],\n error: { message: `Component \"${component}\" not found in registry` },\n };\n }\n\n const variantDef = segment.variants?.find((v) => v.name === variant);\n if (!variantDef || !variantDef.play) {\n return {\n steps: [],\n error: { message: `Variant \"${variant}\" not found or has no play function` },\n };\n }\n\n // Find the preview container\n const canvasElement = document.querySelector('[data-preview-container=\"true\"]') as HTMLElement;\n if (!canvasElement) {\n return {\n steps: [],\n error: { message: 'Preview container not found' },\n };\n }\n\n // Track steps\n const steps: Array<{\n name: string;\n status: 'passed' | 'failed';\n duration: number;\n error?: { message: string };\n }> = [];\n\n const step = async (name: string, fn: () => Promise<void>): Promise<void> => {\n const stepStart = performance.now();\n try {\n await fn();\n steps.push({\n name,\n status: 'passed',\n duration: performance.now() - stepStart,\n });\n } catch (e) {\n steps.push({\n name,\n status: 'failed',\n duration: performance.now() - stepStart,\n error: { message: e instanceof Error ? e.message : String(e) },\n });\n throw e;\n }\n };\n\n // Execute with timeout\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error(`Test timed out after ${timeout}ms`)), timeout);\n });\n\n try {\n await Promise.race([\n variantDef.play({\n canvasElement,\n args: {},\n step,\n }),\n timeoutPromise,\n ]);\n\n // If no explicit steps, add one for the whole play function\n if (steps.length === 0) {\n steps.push({\n name: 'Play function',\n status: 'passed',\n duration: 0,\n });\n }\n\n return { steps, error: undefined };\n } catch (e) {\n // If no steps failed explicitly, add one\n if (!steps.some((s) => s.status === 'failed')) {\n steps.push({\n name: 'Play function',\n status: 'failed',\n duration: 0,\n error: { message: e instanceof Error ? e.message : String(e) },\n });\n }\n\n return {\n steps,\n error: { message: e instanceof Error ? e.message : String(e) },\n };\n }\n },\n { component: testCase.component, variant: testCase.variant, timeout }\n );\n\n return result as { steps: StepResult[]; error?: TestError };\n}\n\n/**\n * Run accessibility checks using axe-core\n */\nasync function runA11yChecks(page: Page): Promise<A11yResult> {\n try {\n // Inject axe-core if not already present\n await page.evaluate(() => {\n if ((window as unknown as { axe?: unknown }).axe) return;\n\n return new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n script.src = 'https://cdnjs.cloudflare.com/ajax/libs/axe-core/4.8.2/axe.min.js';\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load axe-core'));\n document.head.appendChild(script);\n });\n });\n\n // Run axe-core analysis\n const results = await page.evaluate(async () => {\n const axe = (window as unknown as { axe: { run: (el: HTMLElement) => Promise<{ violations: unknown[]; passes: unknown[] }> } }).axe;\n const container = document.querySelector('[data-preview-container=\"true\"]') as HTMLElement;\n if (!container) {\n return { violations: [], passes: 0 };\n }\n const axeResults = await axe.run(container);\n return {\n violations: axeResults.violations,\n passes: axeResults.passes.length,\n };\n });\n\n return {\n violations: results.violations as A11yViolation[],\n passes: results.passes,\n };\n } catch {\n return { violations: [], passes: 0 };\n }\n}\n\n/**\n * Capture screenshot for visual regression\n */\nasync function captureScreenshot(\n page: Page,\n testCase: TestCase,\n outputDir: string\n): Promise<string> {\n const { mkdir, writeFile } = await import('node:fs/promises');\n const { join } = await import('node:path');\n\n const screenshotsDir = join(outputDir, 'screenshots');\n await mkdir(screenshotsDir, { recursive: true });\n\n const filename = `${testCase.component}--${testCase.variant}.png`\n .replace(/\\s+/g, '-')\n .toLowerCase();\n const filepath = join(screenshotsDir, filename);\n\n const container = await page.$('[data-preview-container=\"true\"]');\n if (container) {\n const screenshot = await container.screenshot();\n await writeFile(filepath, screenshot);\n }\n\n return filepath;\n}\n\n/**\n * Aggregate test results into suites by component\n */\nfunction aggregateResults(results: TestResult[]): TestSuite[] {\n const grouped = groupTestsByComponent(results.map((r) => r.testCase));\n const suites: TestSuite[] = [];\n\n for (const [componentName, testCases] of grouped) {\n const componentResults = results.filter((r) => r.testCase.component === componentName);\n\n suites.push({\n name: componentName,\n tests: componentResults,\n duration: componentResults.reduce((sum, r) => sum + r.duration, 0),\n passed: componentResults.filter((r) => r.status === 'passed').length,\n failed: componentResults.filter((r) => r.status === 'failed').length,\n skipped: componentResults.filter((r) => r.status === 'skipped').length,\n });\n }\n\n return suites;\n}\n","/**\n * Console reporter - pretty terminal output\n */\n\nimport pc from 'picocolors';\nimport type { TestCase, TestResult, TestRunResult, TestReporter } from '../types.js';\n\nexport interface ConsoleReporterOptions {\n /** Show verbose output including all steps */\n verbose?: boolean;\n /** Show timing for each test */\n showTiming?: boolean;\n}\n\n/**\n * Create a console reporter\n */\nexport function createConsoleReporter(options: ConsoleReporterOptions = {}): TestReporter {\n const { verbose = false, showTiming = true } = options;\n\n let startTime: number;\n let testCount: number;\n let currentIndex: number;\n\n return {\n onRunStart(count: number) {\n testCount = count;\n currentIndex = 0;\n startTime = Date.now();\n\n console.log();\n console.log(pc.cyan(pc.bold('Segments Test Runner')));\n console.log(pc.dim(`Running ${count} test${count === 1 ? '' : 's'}...`));\n console.log();\n },\n\n onTestStart(testCase: TestCase) {\n currentIndex++;\n if (verbose) {\n const progress = pc.dim(`[${currentIndex}/${testCount}]`);\n console.log(`${progress} ${pc.dim('Running')} ${testCase.component} › ${testCase.variant}`);\n }\n },\n\n onTestComplete(result: TestResult) {\n const { testCase, status, duration, steps, error, accessibility } = result;\n const timing = showTiming ? pc.dim(` (${formatDuration(duration)})`) : '';\n\n const statusIcon = getStatusIcon(status);\n const testName = `${testCase.component} › ${testCase.variant}`;\n\n if (status === 'passed') {\n console.log(` ${statusIcon} ${testName}${timing}`);\n\n // Show a11y results if present\n if (accessibility && accessibility.violations.length > 0) {\n console.log(\n pc.yellow(` ⚠ ${accessibility.violations.length} accessibility violation(s)`)\n );\n }\n } else if (status === 'failed') {\n console.log(` ${statusIcon} ${pc.red(testName)}${timing}`);\n\n // Show error message\n if (error) {\n console.log(pc.red(` ${error.message}`));\n if (verbose && error.stack) {\n console.log(pc.dim(` ${error.stack.split('\\n').slice(1, 4).join('\\n ')}`));\n }\n }\n\n // Show failed steps\n if (verbose || steps.some((s) => s.status === 'failed')) {\n for (const step of steps) {\n if (step.status === 'failed') {\n console.log(pc.red(` ✗ ${step.name}`));\n if (step.error) {\n console.log(pc.red(` ${step.error.message}`));\n }\n } else if (verbose && step.status === 'passed') {\n console.log(pc.dim(` ✓ ${step.name}`));\n }\n }\n }\n\n // Show retry info\n if (result.retryAttempt) {\n console.log(pc.dim(` (failed after ${result.retryAttempt + 1} attempts)`));\n }\n } else if (status === 'skipped') {\n console.log(` ${statusIcon} ${pc.dim(testName)} ${pc.dim('(skipped)')}`);\n }\n\n // Show all steps in verbose mode\n if (verbose && status === 'passed' && steps.length > 0) {\n for (const step of steps) {\n const stepTiming = showTiming ? pc.dim(` ${formatDuration(step.duration)}`) : '';\n console.log(pc.dim(` ✓ ${step.name}${stepTiming}`));\n }\n }\n },\n\n onRunComplete(result: TestRunResult) {\n const { totalTests, totalPassed, totalFailed, totalSkipped, totalDuration, suites } = result;\n\n console.log();\n console.log(pc.dim('─'.repeat(50)));\n console.log();\n\n // Summary by suite\n if (suites.length > 1) {\n console.log(pc.bold('Test Suites:'));\n for (const suite of suites) {\n const statusIcon = suite.failed > 0 ? pc.red('✗') : pc.green('✓');\n const failedText = suite.failed > 0 ? pc.red(`${suite.failed} failed, `) : '';\n const passedText = suite.passed > 0 ? pc.green(`${suite.passed} passed`) : '';\n const skippedText = suite.skipped > 0 ? pc.dim(`, ${suite.skipped} skipped`) : '';\n console.log(` ${statusIcon} ${suite.name} (${failedText}${passedText}${skippedText})`);\n }\n console.log();\n }\n\n // Overall summary\n console.log(pc.bold('Tests:'));\n const parts: string[] = [];\n\n if (totalFailed > 0) {\n parts.push(pc.red(`${totalFailed} failed`));\n }\n if (totalPassed > 0) {\n parts.push(pc.green(`${totalPassed} passed`));\n }\n if (totalSkipped > 0) {\n parts.push(pc.dim(`${totalSkipped} skipped`));\n }\n parts.push(`${totalTests} total`);\n\n console.log(` ${parts.join(', ')}`);\n console.log(` ${pc.dim('Time:')} ${formatDuration(totalDuration)}`);\n\n // A11y summary if applicable\n if (result.totalA11yViolations !== undefined) {\n if (result.totalA11yViolations > 0) {\n console.log(\n ` ${pc.yellow('Accessibility:')} ${result.totalA11yViolations} violation(s)`\n );\n } else {\n console.log(` ${pc.green('Accessibility:')} All checks passed`);\n }\n }\n\n console.log();\n\n // Final status\n if (totalFailed > 0) {\n console.log(pc.red(pc.bold('Test run failed')));\n } else {\n console.log(pc.green(pc.bold('Test run passed')));\n }\n console.log();\n },\n };\n}\n\n/**\n * Get status icon with color\n */\nfunction getStatusIcon(status: TestResult['status']): string {\n switch (status) {\n case 'passed':\n return pc.green('✓');\n case 'failed':\n return pc.red('✗');\n case 'skipped':\n return pc.dim('○');\n default:\n return ' ';\n }\n}\n\n/**\n * Format duration in human-readable form\n */\nfunction formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${Math.round(ms)}ms`;\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(2)}s`;\n }\n const minutes = Math.floor(ms / 60000);\n const seconds = ((ms % 60000) / 1000).toFixed(1);\n return `${minutes}m ${seconds}s`;\n}\n","/**\n * JUnit XML reporter - CI/CD integration\n *\n * Generates JUnit XML format compatible with:\n * - GitHub Actions (mikepenz/action-junit-report)\n * - Jenkins\n * - GitLab CI\n * - CircleCI\n * - Azure DevOps\n */\n\nimport { writeFile, mkdir } from 'node:fs/promises';\nimport { join, dirname } from 'node:path';\nimport type { TestRunResult, TestReporter, TestResult, TestSuite } from '../types.js';\n\nexport interface JUnitReporterOptions {\n /** Output file path */\n outputPath: string;\n /** Suite name for the root element */\n suiteName?: string;\n /** Include properties in the XML */\n includeProperties?: boolean;\n}\n\n/**\n * Create a JUnit XML reporter\n */\nexport function createJUnitReporter(options: JUnitReporterOptions): TestReporter {\n const { outputPath, suiteName = 'Segments Tests', includeProperties = true } = options;\n\n return {\n async onRunComplete(result: TestRunResult) {\n const xml = generateJUnitXml(result, suiteName, includeProperties);\n\n // Ensure output directory exists\n await mkdir(dirname(outputPath), { recursive: true });\n\n // Write the XML file\n await writeFile(outputPath, xml, 'utf-8');\n },\n };\n}\n\n/**\n * Generate JUnit XML from test results\n */\nfunction generateJUnitXml(\n result: TestRunResult,\n suiteName: string,\n includeProperties: boolean\n): string {\n const lines: string[] = [];\n\n // XML declaration\n lines.push('<?xml version=\"1.0\" encoding=\"UTF-8\"?>');\n\n // Root testsuites element\n lines.push(\n `<testsuites name=\"${escapeXml(suiteName)}\" tests=\"${result.totalTests}\" failures=\"${result.totalFailed}\" skipped=\"${result.totalSkipped}\" time=\"${(result.totalDuration / 1000).toFixed(3)}\">`\n );\n\n // Generate each test suite\n for (const suite of result.suites) {\n lines.push(generateTestSuiteXml(suite, includeProperties));\n }\n\n lines.push('</testsuites>');\n\n return lines.join('\\n');\n}\n\n/**\n * Generate XML for a single test suite\n */\nfunction generateTestSuiteXml(suite: TestSuite, includeProperties: boolean): string {\n const lines: string[] = [];\n\n // Testsuite element\n lines.push(\n ` <testsuite name=\"${escapeXml(suite.name)}\" tests=\"${suite.tests.length}\" failures=\"${suite.failed}\" skipped=\"${suite.skipped}\" time=\"${(suite.duration / 1000).toFixed(3)}\">`\n );\n\n // Properties (optional)\n if (includeProperties) {\n lines.push(' <properties>');\n lines.push(` <property name=\"component\" value=\"${escapeXml(suite.name)}\"/>`);\n lines.push(' </properties>');\n }\n\n // Test cases\n for (const test of suite.tests) {\n lines.push(generateTestCaseXml(test));\n }\n\n lines.push(' </testsuite>');\n\n return lines.join('\\n');\n}\n\n/**\n * Generate XML for a single test case\n */\nfunction generateTestCaseXml(result: TestResult): string {\n const { testCase, status, duration, error, steps, accessibility } = result;\n const lines: string[] = [];\n\n const testName = testCase.variant;\n const className = testCase.component;\n const time = (duration / 1000).toFixed(3);\n\n // Opening tag\n if (status === 'passed' && !accessibility?.violations.length) {\n // Simple passed test - self-closing tag\n lines.push(` <testcase name=\"${escapeXml(testName)}\" classname=\"${escapeXml(className)}\" time=\"${time}\"/>`);\n } else {\n // Test with failure, skip, or a11y info\n lines.push(` <testcase name=\"${escapeXml(testName)}\" classname=\"${escapeXml(className)}\" time=\"${time}\">`);\n\n if (status === 'failed') {\n // Failure element\n const message = error?.message || 'Test failed';\n lines.push(` <failure message=\"${escapeXml(message)}\" type=\"AssertionError\">`);\n\n // Add detailed failure info\n const details: string[] = [];\n\n // Add step failures\n const failedSteps = steps.filter((s) => s.status === 'failed');\n if (failedSteps.length > 0) {\n details.push('Failed steps:');\n for (const step of failedSteps) {\n details.push(` - ${step.name}: ${step.error?.message || 'Failed'}`);\n }\n }\n\n // Add stack trace if available\n if (error?.stack) {\n details.push('');\n details.push('Stack trace:');\n details.push(error.stack);\n }\n\n if (details.length > 0) {\n lines.push(escapeXml(details.join('\\n')));\n }\n\n lines.push(' </failure>');\n } else if (status === 'skipped') {\n lines.push(' <skipped/>');\n }\n\n // Add system-out for accessibility violations\n if (accessibility?.violations.length) {\n lines.push(' <system-out>');\n lines.push(`Accessibility violations (${accessibility.violations.length}):`);\n for (const violation of accessibility.violations) {\n lines.push(` [${violation.impact}] ${violation.id}: ${violation.description}`);\n lines.push(` Help: ${violation.help}`);\n for (const node of violation.nodes.slice(0, 3)) {\n lines.push(` Element: ${node.html.substring(0, 100)}`);\n }\n if (violation.nodes.length > 3) {\n lines.push(` ... and ${violation.nodes.length - 3} more elements`);\n }\n }\n lines.push(' </system-out>');\n }\n\n lines.push(' </testcase>');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Escape special XML characters\n */\nfunction escapeXml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F]/g, ''); // Remove invalid XML characters\n}\n","/**\n * JSON reporter - machine-readable output\n *\n * Outputs structured JSON for:\n * - AI analysis and processing\n * - Custom dashboards\n * - Integration with other tools\n */\n\nimport { writeFile, mkdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport type { TestRunResult, TestReporter } from '../types.js';\n\nexport interface JsonReporterOptions {\n /** Output file path */\n outputPath: string;\n /** Pretty print the JSON */\n pretty?: boolean;\n /** Include full step details */\n includeSteps?: boolean;\n /** Include stack traces in errors */\n includeStacks?: boolean;\n}\n\n/**\n * JSON report structure\n */\nexport interface JsonReport {\n /** Report metadata */\n meta: {\n /** Report version */\n version: string;\n /** Test run start time */\n startTime: string;\n /** Test run end time */\n endTime: string;\n /** Total duration in milliseconds */\n duration: number;\n };\n /** Summary statistics */\n summary: {\n total: number;\n passed: number;\n failed: number;\n skipped: number;\n passRate: number;\n a11yViolations?: number;\n };\n /** Test suites with results */\n suites: Array<{\n name: string;\n tests: number;\n passed: number;\n failed: number;\n skipped: number;\n duration: number;\n results: Array<{\n id: string;\n component: string;\n variant: string;\n status: 'passed' | 'failed' | 'skipped';\n duration: number;\n steps?: Array<{\n name: string;\n status: 'passed' | 'failed' | 'skipped';\n duration: number;\n error?: string;\n }>;\n error?: {\n message: string;\n stack?: string;\n };\n accessibility?: {\n violations: number;\n passes: number;\n details?: Array<{\n id: string;\n impact: string;\n description: string;\n elements: number;\n }>;\n };\n retryAttempt?: number;\n }>;\n }>;\n}\n\n/**\n * Create a JSON reporter\n */\nexport function createJsonReporter(options: JsonReporterOptions): TestReporter {\n const { outputPath, pretty = true, includeSteps = true, includeStacks = false } = options;\n\n return {\n async onRunComplete(result: TestRunResult) {\n const report = generateJsonReport(result, includeSteps, includeStacks);\n\n // Ensure output directory exists\n await mkdir(dirname(outputPath), { recursive: true });\n\n // Write the JSON file\n const json = pretty ? JSON.stringify(report, null, 2) : JSON.stringify(report);\n await writeFile(outputPath, json, 'utf-8');\n },\n };\n}\n\n/**\n * Generate JSON report from test results\n */\nfunction generateJsonReport(\n result: TestRunResult,\n includeSteps: boolean,\n includeStacks: boolean\n): JsonReport {\n const { suites, totalTests, totalPassed, totalFailed, totalSkipped, totalDuration, startTime, endTime } = result;\n\n return {\n meta: {\n version: '1.0.0',\n startTime: startTime.toISOString(),\n endTime: endTime.toISOString(),\n duration: totalDuration,\n },\n summary: {\n total: totalTests,\n passed: totalPassed,\n failed: totalFailed,\n skipped: totalSkipped,\n passRate: totalTests > 0 ? Math.round((totalPassed / totalTests) * 100) : 0,\n a11yViolations: result.totalA11yViolations,\n },\n suites: suites.map((suite) => ({\n name: suite.name,\n tests: suite.tests.length,\n passed: suite.passed,\n failed: suite.failed,\n skipped: suite.skipped,\n duration: suite.duration,\n results: suite.tests.map((test) => {\n const resultObj: JsonReport['suites'][0]['results'][0] = {\n id: test.testCase.id,\n component: test.testCase.component,\n variant: test.testCase.variant,\n status: test.status,\n duration: test.duration,\n };\n\n // Include steps if requested\n if (includeSteps && test.steps.length > 0) {\n resultObj.steps = test.steps.map((step) => ({\n name: step.name,\n status: step.status,\n duration: step.duration,\n error: step.error?.message,\n }));\n }\n\n // Include error if present\n if (test.error) {\n resultObj.error = {\n message: test.error.message,\n stack: includeStacks ? test.error.stack : undefined,\n };\n }\n\n // Include accessibility results if present\n if (test.accessibility) {\n resultObj.accessibility = {\n violations: test.accessibility.violations.length,\n passes: test.accessibility.passes,\n details: test.accessibility.violations.map((v) => ({\n id: v.id,\n impact: v.impact,\n description: v.description,\n elements: v.nodes.length,\n })),\n };\n }\n\n // Include retry info if applicable\n if (test.retryAttempt) {\n resultObj.retryAttempt = test.retryAttempt;\n }\n\n return resultObj;\n }),\n })),\n };\n}\n","/**\n * Watch mode - file watcher with selective re-run\n */\n\nimport { watch } from 'node:fs';\nimport { resolve, relative } from 'node:path';\nimport pc from 'picocolors';\nimport type { SegmentsConfig } from '../core/index.js';\nimport { discoverSegmentFiles } from '../core/node.js';\nimport type { TestCase, RunnerOptions, TestReporter } from './types.js';\nimport { discoverTests } from './discovery.js';\nimport { runTests } from './runner.js';\n\nexport interface WatchOptions {\n /** Debounce delay in milliseconds */\n debounceMs?: number;\n /** Clear console on each run */\n clearConsole?: boolean;\n /** Run all tests initially */\n runOnStart?: boolean;\n}\n\n/**\n * Start watch mode\n */\nexport async function startWatchMode(\n config: SegmentsConfig,\n configDir: string,\n runnerOptions: RunnerOptions,\n reporters: TestReporter[],\n options: WatchOptions = {}\n): Promise<void> {\n const { debounceMs = 300, clearConsole = true, runOnStart = true } = options;\n\n let debounceTimer: NodeJS.Timeout | null = null;\n let isRunning = false;\n let pendingFiles = new Set<string>();\n\n // Get files to watch\n const segmentFiles = await discoverSegmentFiles(config, configDir);\n const watchPaths = new Set<string>();\n\n for (const file of segmentFiles) {\n watchPaths.add(file.absolutePath);\n }\n\n // Also watch the directories containing segment files\n const watchDirs = new Set<string>();\n for (const path of watchPaths) {\n const dir = resolve(path, '..');\n watchDirs.add(dir);\n }\n\n console.log();\n console.log(pc.cyan(pc.bold('Segments Test Runner - Watch Mode')));\n console.log(pc.dim(`Watching ${watchPaths.size} files in ${watchDirs.size} directories`));\n console.log(pc.dim('Press Ctrl+C to stop'));\n console.log();\n\n // Function to run tests\n const runTestsForFiles = async (changedFiles: string[]): Promise<void> => {\n if (isRunning) {\n // Queue up changed files for next run\n for (const file of changedFiles) {\n pendingFiles.add(file);\n }\n return;\n }\n\n isRunning = true;\n\n try {\n if (clearConsole) {\n console.clear();\n }\n\n console.log(pc.cyan('Changes detected, running tests...'));\n console.log(pc.dim(`Changed: ${changedFiles.map((f) => relative(configDir, f)).join(', ')}`));\n console.log();\n\n // Discover tests (filter to changed files if possible)\n const allTests = await discoverTests(config, configDir, {});\n\n // Filter to tests from changed files\n const changedRelativePaths = changedFiles.map((f) => relative(configDir, f));\n const testsToRun = changedRelativePaths.length > 0\n ? allTests.filter((t) => changedRelativePaths.some((p) => t.sourceFile.includes(p)))\n : allTests;\n\n if (testsToRun.length === 0) {\n console.log(pc.yellow('No tests found in changed files'));\n console.log();\n return;\n }\n\n // Run the tests\n await runTests(testsToRun, runnerOptions, reporters);\n } catch (error) {\n console.error(pc.red('Error running tests:'), error);\n } finally {\n isRunning = false;\n\n // Check if there are pending files to run\n if (pendingFiles.size > 0) {\n const files = Array.from(pendingFiles);\n pendingFiles.clear();\n await runTestsForFiles(files);\n }\n }\n };\n\n // Run initial tests if configured\n if (runOnStart) {\n const allTests = await discoverTests(config, configDir, {});\n if (allTests.length > 0) {\n await runTests(allTests, runnerOptions, reporters);\n } else {\n console.log(pc.yellow('No tests with play functions found'));\n }\n console.log();\n console.log(pc.dim('Watching for changes...'));\n console.log();\n }\n\n // Set up file watchers\n const watchers: ReturnType<typeof watch>[] = [];\n\n for (const dir of watchDirs) {\n try {\n const watcher = watch(dir, { recursive: false }, (eventType, filename) => {\n if (!filename) return;\n\n const fullPath = resolve(dir, filename);\n\n // Check if this is a segment file we care about\n if (!watchPaths.has(fullPath)) return;\n\n // Debounce the run\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n pendingFiles.add(fullPath);\n\n debounceTimer = setTimeout(() => {\n const files = Array.from(pendingFiles);\n pendingFiles.clear();\n runTestsForFiles(files);\n }, debounceMs);\n });\n\n watchers.push(watcher);\n } catch (error) {\n console.warn(pc.yellow(`Warning: Could not watch directory ${dir}`), error);\n }\n }\n\n // Handle process termination\n const cleanup = () => {\n console.log();\n console.log(pc.dim('Stopping watch mode...'));\n\n for (const watcher of watchers) {\n watcher.close();\n }\n\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n process.exit(0);\n };\n\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n\n // Keep process alive\n await new Promise(() => {\n // This promise never resolves, keeping the process alive\n // until terminated\n });\n}\n\n/**\n * Interactive watch mode with keyboard controls\n */\nexport async function startInteractiveWatchMode(\n config: SegmentsConfig,\n configDir: string,\n runnerOptions: RunnerOptions,\n reporters: TestReporter[]\n): Promise<void> {\n let lastFailedTests: TestCase[] = [];\n\n // Start basic watch mode\n await startWatchMode(config, configDir, runnerOptions, reporters, {\n runOnStart: true,\n clearConsole: true,\n });\n}\n"],"mappings":"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","names":["resolve","join","mkdir","pc","timeout","resolve","mkdir","writeFile","join","writeFile","mkdir","dirname","pc","pc","resolve","pc","mkdir","join"]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|