@fragments-sdk/cli 0.9.1 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/dist/bin.d.ts +1 -0
  2. package/dist/bin.js +435 -67
  3. package/dist/bin.js.map +1 -1
  4. package/dist/{chunk-BW3ZATBW.js → chunk-566BNPQZ.js} +3 -5
  5. package/dist/chunk-566BNPQZ.js.map +1 -0
  6. package/dist/{chunk-5GT62FCB.js → chunk-CAMXG5HJ.js} +5 -5
  7. package/dist/chunk-D2CDBRNU.js +2 -0
  8. package/dist/{chunk-YMPGYEWK.js → chunk-D5PYOXEI.js} +2 -2
  9. package/dist/{chunk-GF6OVPIN.js → chunk-OQO55NKV.js} +405 -34
  10. package/dist/chunk-OQO55NKV.js.map +1 -0
  11. package/dist/{chunk-TOIE7VXF.js → chunk-PW7QTQA6.js} +2 -2
  12. package/dist/{chunk-AWYCDRPG.js → chunk-WXSR2II7.js} +2 -2
  13. package/dist/chunk-WXSR2II7.js.map +1 -0
  14. package/dist/{chunk-D7372LQX.js → chunk-ZDA3PLQ6.js} +8 -12
  15. package/dist/chunk-ZDA3PLQ6.js.map +1 -0
  16. package/dist/core/index.d.ts +1 -2194
  17. package/dist/core/index.js +22 -27
  18. package/dist/{discovery-Z4RDDFVR.js → discovery-NEOY4MPN.js} +3 -3
  19. package/dist/{generate-LQA2R7FN.js → generate-BGKTKO6E.js} +5 -7
  20. package/dist/{generate-LQA2R7FN.js.map → generate-BGKTKO6E.js.map} +1 -1
  21. package/dist/index.d.ts +3 -5
  22. package/dist/index.js +7 -9
  23. package/dist/index.js.map +1 -1
  24. package/dist/{init-2GEGVIUQ.js → init-Q53R5Q2T.js} +58 -6
  25. package/dist/init-Q53R5Q2T.js.map +1 -0
  26. package/dist/mcp-bin.js +5 -8
  27. package/dist/mcp-bin.js.map +1 -1
  28. package/dist/scan-OQU7M4GH.js +14 -0
  29. package/dist/scan-generate-T5QNUG7N.js +691 -0
  30. package/dist/scan-generate-T5QNUG7N.js.map +1 -0
  31. package/dist/{service-XP2EAJXD.js → service-TQYWY65E.js} +4 -6
  32. package/dist/{static-viewer-XCS7UJTO.js → static-viewer-NUBFPKWH.js} +4 -6
  33. package/dist/{test-TD6TJNVY.js → test-2CSOSS3B.js} +4 -5
  34. package/dist/{test-TD6TJNVY.js.map → test-2CSOSS3B.js.map} +1 -1
  35. package/dist/{tokens-2EXPCVP3.js → tokens-DXEGYTOJ.js} +6 -8
  36. package/dist/{tokens-2EXPCVP3.js.map → tokens-DXEGYTOJ.js.map} +1 -1
  37. package/dist/{viewer-RFA2KVBG.js → viewer-DBEPYM3G.js} +16 -19
  38. package/dist/viewer-DBEPYM3G.js.map +1 -0
  39. package/package.json +2 -1
  40. package/src/bin.ts +33 -1
  41. package/src/build.ts +1 -1
  42. package/src/commands/__tests__/scan-generate.test.ts +308 -0
  43. package/src/commands/init.ts +72 -5
  44. package/src/commands/perf.ts +1 -1
  45. package/src/commands/scan-generate.ts +1013 -0
  46. package/src/commands/setup.ts +499 -0
  47. package/src/core/auto-props.ts +1 -1
  48. package/src/core/bundle-measurer.ts +2 -2
  49. package/src/core/config.ts +2 -3
  50. package/src/core/discovery.ts +2 -2
  51. package/src/core/generators/context.ts +1 -1
  52. package/src/core/generators/registry.ts +3 -3
  53. package/src/core/generators/typescript-extractor.ts +1 -1
  54. package/src/core/graph-extractor.ts +1 -1
  55. package/src/core/index.ts +3 -205
  56. package/src/core/loader.ts +2 -2
  57. package/src/core/parser.ts +1 -1
  58. package/src/core/previewLoader.ts +1 -1
  59. package/src/index.ts +2 -2
  60. package/src/service/snippet-validation.test.ts +1 -1
  61. package/src/service/snippet-validation.ts +2 -2
  62. package/src/viewer/__tests__/viewer-integration.test.ts +3 -9
  63. package/src/viewer/vendor/shared/src/VariantPreviewCard.module.scss +2 -10
  64. package/src/viewer/vite-plugin.ts +1 -1
  65. package/dist/chunk-AWYCDRPG.js.map +0 -1
  66. package/dist/chunk-BW3ZATBW.js.map +0 -1
  67. package/dist/chunk-D7372LQX.js.map +0 -1
  68. package/dist/chunk-EKLMXTWU.js +0 -80
  69. package/dist/chunk-EKLMXTWU.js.map +0 -1
  70. package/dist/chunk-EZYXYWNF.js +0 -131
  71. package/dist/chunk-EZYXYWNF.js.map +0 -1
  72. package/dist/chunk-GF6OVPIN.js.map +0 -1
  73. package/dist/chunk-NVSPGSKB.js +0 -203
  74. package/dist/chunk-NVSPGSKB.js.map +0 -1
  75. package/dist/defineFragment-CBMS7Bab.d.ts +0 -685
  76. package/dist/init-2GEGVIUQ.js.map +0 -1
  77. package/dist/scan-JGS65S7P.js +0 -16
  78. package/dist/storyFilters-3LUYAFZF.js +0 -15
  79. package/dist/viewer-RFA2KVBG.js.map +0 -1
  80. package/src/core/__tests__/preview-runtime.test.tsx +0 -111
  81. package/src/core/composition.test.ts +0 -262
  82. package/src/core/composition.ts +0 -318
  83. package/src/core/constants.ts +0 -114
  84. package/src/core/context.ts +0 -2
  85. package/src/core/defineFragment.ts +0 -141
  86. package/src/core/figma.ts +0 -263
  87. package/src/core/fragment-types.ts +0 -214
  88. package/src/core/performance-presets.ts +0 -142
  89. package/src/core/preview-runtime.tsx +0 -144
  90. package/src/core/schema.ts +0 -229
  91. package/src/core/storyAdapter.test.ts +0 -571
  92. package/src/core/storyAdapter.ts +0 -761
  93. package/src/core/storyFilters.test.ts +0 -350
  94. package/src/core/storyFilters.ts +0 -253
  95. package/src/core/storybook-csf.ts +0 -11
  96. package/src/core/token-parser.ts +0 -321
  97. package/src/core/token-types.ts +0 -287
  98. package/src/core/types.ts +0 -784
  99. /package/dist/{chunk-5GT62FCB.js.map → chunk-CAMXG5HJ.js.map} +0 -0
  100. /package/dist/{discovery-Z4RDDFVR.js.map → chunk-D2CDBRNU.js.map} +0 -0
  101. /package/dist/{chunk-YMPGYEWK.js.map → chunk-D5PYOXEI.js.map} +0 -0
  102. /package/dist/{chunk-TOIE7VXF.js.map → chunk-PW7QTQA6.js.map} +0 -0
  103. /package/dist/{scan-JGS65S7P.js.map → discovery-NEOY4MPN.js.map} +0 -0
  104. /package/dist/{service-XP2EAJXD.js.map → scan-OQU7M4GH.js.map} +0 -0
  105. /package/dist/{static-viewer-XCS7UJTO.js.map → service-TQYWY65E.js.map} +0 -0
  106. /package/dist/{storyFilters-3LUYAFZF.js.map → static-viewer-NUBFPKWH.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/scan-generate.ts"],"sourcesContent":["/**\n * fragments init --scan - Generate fragment files from any TypeScript component library\n *\n * Phase 2 of the Universal GenUI strategy. Scans a component directory and\n * generates .fragment.tsx files with TODO markers for uncertain fields.\n *\n * Combines:\n * - Component discovery (core/discovery.ts)\n * - Props extraction (service/enhance/props-extractor.ts)\n * - JSDoc extraction (new: TypeScript AST)\n * - Compound component detection (new: Object.assign pattern)\n * - Confidence scoring with TODO markers\n */\n\nimport { readFile, writeFile, access, mkdir } from \"node:fs/promises\";\nimport { resolve, basename, dirname, relative, join } from \"node:path\";\nimport * as ts from \"typescript\";\nimport pc from \"picocolors\";\nimport { BRAND } from \"../core/index.js\";\nimport {\n discoverAllComponents,\n type DiscoveredComponent,\n} from \"../core/node.js\";\nimport {\n extractPropsFromFile,\n convertToFragmentProps,\n type PropsExtractionResult,\n type ExtractedProp,\n} from \"../service/index.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface ScanGenerateOptions {\n /** Path to scan for components */\n scanPath: string;\n /** Output directory (default: colocated with source) */\n outputDir?: string;\n /** Overwrite existing fragment files */\n force?: boolean;\n /** Custom component file patterns */\n patterns?: string[];\n /** Skip Storybook story extraction */\n skipStorybook?: boolean;\n /** Verbose logging */\n verbose?: boolean;\n}\n\nexport interface ScanGenerateResult {\n success: boolean;\n generated: Array<{\n name: string;\n path: string;\n confidence: number;\n todoCount: number;\n }>;\n skipped: Array<{ name: string; reason: string }>;\n errors: Array<{ name: string; error: string }>;\n averageConfidence: number;\n}\n\ninterface ComponentData {\n component: DiscoveredComponent;\n props: PropsExtractionResult | null;\n jsDoc: string | null;\n compoundChildren: string[];\n storyVariants: StoryVariant[];\n}\n\ninterface StoryVariant {\n name: string;\n args: Record<string, unknown>;\n}\n\ninterface FieldConfidence {\n score: number;\n todoFields: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Main orchestrator\n// ---------------------------------------------------------------------------\n\nexport async function scanGenerate(\n options: ScanGenerateOptions\n): Promise<ScanGenerateResult> {\n const scanPath = resolve(options.scanPath);\n const generated: ScanGenerateResult[\"generated\"] = [];\n const skipped: ScanGenerateResult[\"skipped\"] = [];\n const errors: ScanGenerateResult[\"errors\"] = [];\n\n console.log(pc.cyan(`\\n${BRAND.name} Scan → Generate\\n`));\n console.log(pc.dim(`Scanning: ${scanPath}\\n`));\n\n // Phase 1: Discover components\n console.log(pc.dim(\"Phase 1: Discovering components...\"));\n\n // Use broader patterns than default — the scan path IS the component root,\n // not a project root with src/components/ inside it\n const defaultScanPatterns = [\n \"**/*.tsx\",\n \"**/*.ts\",\n ];\n\n const components = await discoverAllComponents(scanPath, {\n patterns: options.patterns || defaultScanPatterns,\n exclude: [\n \"**/*.test.*\",\n \"**/*.spec.*\",\n \"**/*.stories.*\",\n \"**/*.fragment.*\",\n \"**/*.d.ts\",\n \"**/__tests__/**\",\n \"**/__mocks__/**\",\n \"**/node_modules/**\",\n \"**/dist/**\",\n ],\n });\n\n if (components.length === 0) {\n console.log(\n pc.yellow(\"No components found. Check the path or file patterns.\")\n );\n return {\n success: false,\n generated: [],\n skipped: [],\n errors: [{ name: \"*\", error: \"No components found\" }],\n averageConfidence: 0,\n };\n }\n\n console.log(pc.green(` Found ${components.length} components`));\n\n // Phase 2: Extract data for each component\n console.log(pc.dim(\"\\nPhase 2: Extracting component metadata...\"));\n\n const componentDataList: ComponentData[] = [];\n\n for (const comp of components) {\n let propsResult: PropsExtractionResult | null = null;\n try {\n propsResult = await extractPropsFromFile(comp.sourcePath, {\n propsTypeName: `${comp.name}Props`,\n });\n } catch {\n // Props extraction can fail for complex types — continue gracefully\n }\n\n let jsDoc: string | null = null;\n try {\n jsDoc = await extractComponentJSDoc(comp.sourcePath, comp.name);\n } catch {\n // JSDoc extraction failure is non-fatal\n }\n\n let compoundChildren: string[] = [];\n try {\n compoundChildren = await detectCompoundComponents(comp.sourcePath);\n } catch {\n // Compound detection failure is non-fatal\n }\n\n let storyVariants: StoryVariant[] = [];\n if (!options.skipStorybook && comp.storyPath) {\n try {\n storyVariants = await extractStoryVariantsFromFile(comp.storyPath);\n } catch {\n // Story extraction failure is non-fatal\n }\n }\n\n componentDataList.push({\n component: comp,\n props: propsResult,\n jsDoc,\n compoundChildren,\n storyVariants,\n });\n }\n\n const propsExtracted = componentDataList.filter(\n (d) => d.props?.success && d.props.props.length > 0\n ).length;\n console.log(pc.green(` Extracted props for ${propsExtracted} components`));\n\n // Phase 3: Generate fragment files\n console.log(pc.dim(\"\\nPhase 3: Generating fragment files...\"));\n\n for (const data of componentDataList) {\n const comp = data.component;\n const componentDir = dirname(comp.sourcePath);\n const componentBaseName = basename(comp.sourcePath, \".tsx\");\n\n // Determine output path\n let fragmentDir: string;\n if (options.outputDir) {\n fragmentDir = resolve(options.outputDir, comp.name);\n await mkdir(fragmentDir, { recursive: true });\n } else {\n fragmentDir = componentDir;\n }\n\n const fragmentPath = join(\n fragmentDir,\n `${componentBaseName}${BRAND.fileExtension}`\n );\n\n // Check if fragment already exists\n let fragmentExists = false;\n try {\n await access(fragmentPath);\n fragmentExists = true;\n } catch {\n // Doesn't exist\n }\n\n if (fragmentExists && !options.force) {\n skipped.push({ name: comp.name, reason: \"Fragment already exists\" });\n if (options.verbose) {\n console.log(pc.dim(` Skipping ${comp.name} (fragment exists)`));\n }\n continue;\n }\n\n try {\n // Calculate confidence\n const confidence = calculateFieldConfidence(data);\n\n // Compute import path\n const importPath = computeImportPath(\n fragmentDir,\n comp.sourcePath,\n componentBaseName\n );\n\n // Generate the fragment file\n const content = generateFragmentWithTodos(\n comp.name,\n importPath,\n data,\n confidence\n );\n\n await writeFile(fragmentPath, content, \"utf-8\");\n\n const relPath = relative(process.cwd(), fragmentPath);\n generated.push({\n name: comp.name,\n path: relPath,\n confidence: confidence.score,\n todoCount: confidence.todoFields.length,\n });\n\n const confColor =\n confidence.score >= 70\n ? pc.green\n : confidence.score >= 40\n ? pc.yellow\n : pc.red;\n console.log(\n pc.green(` ✓ ${comp.name}`) +\n pc.dim(` (confidence: `) +\n confColor(`${confidence.score}`) +\n pc.dim(`, TODOs: ${confidence.todoFields.length})`)\n );\n } catch (e) {\n errors.push({\n name: comp.name,\n error: e instanceof Error ? e.message : String(e),\n });\n console.log(pc.red(` ✗ ${comp.name}: ${e instanceof Error ? e.message : String(e)}`));\n }\n }\n\n // Summary\n const avgConfidence =\n generated.length > 0\n ? Math.round(\n generated.reduce((sum, g) => sum + g.confidence, 0) /\n generated.length\n )\n : 0;\n\n console.log(pc.dim(\"\\n────────────────────────────────────────\"));\n console.log(pc.green(`\\n✓ Generated ${generated.length} fragment file(s)`));\n\n if (skipped.length > 0) {\n console.log(\n pc.dim(` Skipped ${skipped.length} (use --force to overwrite)`)\n );\n }\n if (errors.length > 0) {\n console.log(pc.yellow(` ${errors.length} error(s)`));\n }\n\n console.log(pc.dim(` Average confidence: ${avgConfidence}/100`));\n\n const totalTodos = generated.reduce((sum, g) => sum + g.todoCount, 0);\n if (totalTodos > 0) {\n console.log(\n pc.dim(` Total TODOs: ${totalTodos}`) +\n pc.dim(` — search for \"TODO:\" in generated files`)\n );\n }\n\n console.log();\n\n return {\n success: errors.length === 0,\n generated,\n skipped,\n errors,\n averageConfidence: avgConfidence,\n };\n}\n\n// ---------------------------------------------------------------------------\n// JSDoc Extraction\n// ---------------------------------------------------------------------------\n\n/**\n * Extract the JSDoc description from a component's exported declaration.\n * Uses TypeScript AST — no program needed, just source file parsing.\n */\nexport async function extractComponentJSDoc(\n filePath: string,\n componentName?: string\n): Promise<string | null> {\n const content = await readFile(filePath, \"utf-8\");\n return extractComponentJSDocFromSource(content, filePath, componentName);\n}\n\nexport function extractComponentJSDocFromSource(\n source: string,\n filePath: string,\n componentName?: string\n): string | null {\n const sourceFile = ts.createSourceFile(\n filePath,\n source,\n ts.ScriptTarget.ESNext,\n true,\n filePath.endsWith(\".tsx\") ? ts.ScriptKind.TSX : ts.ScriptKind.TS\n );\n\n const targetName =\n componentName || basename(filePath).replace(/\\.(tsx?|jsx?)$/, \"\");\n\n let componentDoc: string | null = null;\n let propsInterfaceDoc: string | null = null;\n\n for (const statement of sourceFile.statements) {\n // export function ComponentName(...)\n if (\n ts.isFunctionDeclaration(statement) &&\n statement.name?.text === targetName &&\n hasExportModifier(statement)\n ) {\n const doc = getLeadingJSDoc(statement, sourceFile);\n if (doc) componentDoc = doc;\n }\n\n // export const ComponentName = ...\n if (\n ts.isVariableStatement(statement) &&\n hasExportModifier(statement)\n ) {\n for (const decl of statement.declarationList.declarations) {\n if (ts.isIdentifier(decl.name) && decl.name.text === targetName) {\n const doc = getLeadingJSDoc(statement, sourceFile);\n if (doc) componentDoc = doc;\n }\n }\n }\n\n // export default function ...\n if (\n ts.isFunctionDeclaration(statement) &&\n hasDefaultExportModifier(statement)\n ) {\n const doc = getLeadingJSDoc(statement, sourceFile);\n if (doc) componentDoc = doc;\n }\n\n // Fallback: JSDoc on the {Name}Props interface\n if (\n ts.isInterfaceDeclaration(statement) &&\n (statement.name.text === `${targetName}Props` ||\n statement.name.text === `${targetName}Properties`)\n ) {\n const doc = getLeadingJSDoc(statement, sourceFile);\n if (doc) propsInterfaceDoc = doc;\n }\n }\n\n // Prefer component-level JSDoc; fall back to props interface JSDoc\n return componentDoc || propsInterfaceDoc;\n}\n\nfunction hasExportModifier(node: ts.Node): boolean {\n const modifiers = ts.canHaveModifiers(node)\n ? ts.getModifiers(node)\n : undefined;\n return modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword) ?? false;\n}\n\nfunction hasDefaultExportModifier(node: ts.Node): boolean {\n const modifiers = ts.canHaveModifiers(node)\n ? ts.getModifiers(node)\n : undefined;\n if (!modifiers) return false;\n return (\n modifiers.some((m) => m.kind === ts.SyntaxKind.ExportKeyword) &&\n modifiers.some((m) => m.kind === ts.SyntaxKind.DefaultKeyword)\n );\n}\n\nfunction getLeadingJSDoc(\n node: ts.Node,\n sourceFile: ts.SourceFile\n): string | null {\n const fullText = sourceFile.getFullText();\n const nodeStart = node.getFullStart();\n const nodePos = node.getStart(sourceFile);\n const leadingText = fullText.slice(nodeStart, nodePos);\n\n const jsDocMatch = leadingText.match(/\\/\\*\\*([\\s\\S]*?)\\*\\//);\n if (!jsDocMatch) return null;\n\n // Parse JSDoc content — extract description lines, skip tags\n const lines = jsDocMatch[1].split(\"\\n\");\n const descriptionLines: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.replace(/^\\s*\\*?\\s?/, \"\").trim();\n if (trimmed.startsWith(\"@\")) break; // Stop at first tag\n if (trimmed) descriptionLines.push(trimmed);\n }\n\n return descriptionLines.length > 0\n ? descriptionLines.join(\" \")\n : null;\n}\n\n// ---------------------------------------------------------------------------\n// Compound Component Detection\n// ---------------------------------------------------------------------------\n\n/**\n * Detect compound component patterns (Object.assign) in a source file.\n * Returns the names of sub-components found.\n */\nexport async function detectCompoundComponents(\n filePath: string\n): Promise<string[]> {\n const content = await readFile(filePath, \"utf-8\");\n return detectCompoundComponentsFromSource(content, filePath);\n}\n\nexport function detectCompoundComponentsFromSource(\n source: string,\n filePath: string\n): string[] {\n const sourceFile = ts.createSourceFile(\n filePath,\n source,\n ts.ScriptTarget.ESNext,\n true,\n filePath.endsWith(\".tsx\") ? ts.ScriptKind.TSX : ts.ScriptKind.TS\n );\n\n const subComponents: string[] = [];\n\n function visit(node: ts.Node) {\n // Look for Object.assign(Root, { Sub1, Sub2 }) or Object.assign(Root, { Sub1: SubComponent })\n if (\n ts.isCallExpression(node) &&\n ts.isPropertyAccessExpression(node.expression) &&\n ts.isIdentifier(node.expression.expression) &&\n node.expression.expression.text === \"Object\" &&\n node.expression.name.text === \"assign\" &&\n node.arguments.length >= 2\n ) {\n const secondArg = node.arguments[1];\n if (ts.isObjectLiteralExpression(secondArg)) {\n for (const prop of secondArg.properties) {\n if (ts.isShorthandPropertyAssignment(prop)) {\n subComponents.push(prop.name.text);\n } else if (\n ts.isPropertyAssignment(prop) &&\n ts.isIdentifier(prop.name)\n ) {\n subComponents.push(prop.name.text);\n }\n }\n }\n }\n\n ts.forEachChild(node, visit);\n }\n\n ts.forEachChild(sourceFile, visit);\n return subComponents;\n}\n\n// ---------------------------------------------------------------------------\n// Story Variant Extraction (lightweight, from generate.ts patterns)\n// ---------------------------------------------------------------------------\n\nasync function extractStoryVariantsFromFile(\n storyPath: string\n): Promise<StoryVariant[]> {\n const content = await readFile(storyPath, \"utf-8\");\n const variants: StoryVariant[] = [];\n\n const exportMatches = content.matchAll(\n /export\\s+const\\s+([A-Z][a-zA-Z0-9]*)\\s*[=:]/g\n );\n\n for (const match of exportMatches) {\n const name = match[1];\n if (name === \"default\" || name.endsWith(\"Args\") || name.endsWith(\"Meta\")) {\n continue;\n }\n\n const args = extractStoryArgs(content, name);\n variants.push({ name, args });\n }\n\n return variants;\n}\n\nfunction extractStoryArgs(\n content: string,\n storyName: string\n): Record<string, unknown> {\n const storyPattern = new RegExp(\n `export\\\\s+const\\\\s+${storyName}[^=]*=\\\\s*\\\\{([\\\\s\\\\S]*?)\\\\n\\\\};`\n );\n const storyMatch = content.match(storyPattern);\n if (!storyMatch) return {};\n\n const storyBody = storyMatch[1];\n const argsStart = storyBody.indexOf(\"args:\");\n if (argsStart === -1) return {};\n\n const braceStart = storyBody.indexOf(\"{\", argsStart);\n if (braceStart === -1) return {};\n\n let depth = 0;\n let braceEnd = -1;\n for (let i = braceStart; i < storyBody.length; i++) {\n if (storyBody[i] === \"{\") depth++;\n else if (storyBody[i] === \"}\") {\n depth--;\n if (depth === 0) {\n braceEnd = i;\n break;\n }\n }\n }\n if (braceEnd === -1) return {};\n\n const argsBlock = storyBody.slice(braceStart + 1, braceEnd).trim();\n return parseArgsBlock(argsBlock);\n}\n\nfunction parseArgsBlock(argsBlock: string): Record<string, unknown> {\n const args: Record<string, unknown> = {};\n const pairPattern =\n /(\\w+)\\s*:\\s*(?:['\"]([^'\"]*?)['\"]|(true|false)|(\\d+(?:\\.\\d+)?))/g;\n let pairMatch: RegExpExecArray | null;\n\n while ((pairMatch = pairPattern.exec(argsBlock)) !== null) {\n const key = pairMatch[1];\n if (pairMatch[2] !== undefined) {\n args[key] = pairMatch[2];\n } else if (pairMatch[3] !== undefined) {\n args[key] = pairMatch[3] === \"true\";\n } else if (pairMatch[4] !== undefined) {\n args[key] = Number(pairMatch[4]);\n }\n }\n\n return args;\n}\n\n// ---------------------------------------------------------------------------\n// Confidence Scoring\n// ---------------------------------------------------------------------------\n\nexport function calculateFieldConfidence(data: ComponentData): FieldConfidence {\n let score = 0;\n const todoFields: string[] = [];\n\n // Props extracted: +30\n const hasProps =\n data.props?.success && data.props.props.length > 0;\n if (hasProps) {\n score += 30;\n }\n\n // JSDoc description found: +15\n if (data.jsDoc) {\n score += 15;\n } else {\n todoFields.push(\"meta.description\");\n }\n\n // Category inferred from path/name (not fallback): +10\n const category = inferCategory(\n data.component.name,\n data.props?.success ? data.props.props : []\n );\n if (category !== \"Components\") {\n score += 10;\n } else {\n todoFields.push(\"meta.category\");\n }\n\n // Story variants found: +25\n if (data.storyVariants.length > 0) {\n score += 25;\n }\n\n // All prop types resolved (no \"custom\"): +10\n if (hasProps) {\n const allResolved = data.props!.props.every(\n (p) => p.propType.type !== \"custom\"\n );\n if (allResolved) {\n score += 10;\n }\n }\n\n // Compound component detected: +5\n if (data.compoundChildren.length > 0) {\n score += 5;\n }\n\n // Has default values: +5\n if (hasProps) {\n const hasDefaults = data.props!.props.some(\n (p) => p.defaultValue !== undefined\n );\n if (hasDefaults) {\n score += 5;\n }\n }\n\n // usage.when and usage.whenNot always get TODOs (human knowledge needed)\n todoFields.push(\"usage.when\");\n todoFields.push(\"usage.whenNot\");\n\n return { score: Math.min(score, 100), todoFields };\n}\n\n// ---------------------------------------------------------------------------\n// Category / Status / Description inference (adapted from generate.ts + scan.ts)\n// ---------------------------------------------------------------------------\n\nconst CATEGORY_PATTERNS: Record<string, string[]> = {\n Actions: [\"button\", \"action\", \"cta\", \"fab\", \"floatingaction\"],\n Forms: [\n \"form\", \"input\", \"select\", \"checkbox\", \"radio\", \"textarea\", \"field\",\n \"textfield\", \"datepicker\", \"switch\", \"slider\", \"segmented\",\n ],\n Layout: [\n \"layout\", \"container\", \"grid\", \"flex\", \"stack\", \"box\", \"divider\", \"spacer\",\n \"sidebar\",\n ],\n Navigation: [\n \"nav\", \"menu\", \"breadcrumb\", \"tab\", \"link\", \"pagination\", \"stepper\",\n \"topbar\",\n ],\n Feedback: [\n \"alert\", \"toast\", \"notification\", \"message\", \"badge\", \"indicator\",\n \"progress\", \"spinner\", \"loading\", \"loader\", \"lozenge\", \"chip\",\n ],\n \"Data Display\": [\n \"table\", \"list\", \"card\", \"avatar\", \"stat\", \"timeline\", \"tree\", \"datalist\",\n \"datacard\",\n ],\n Overlays: [\n \"modal\", \"dialog\", \"drawer\", \"popover\", \"tooltip\", \"dropdown\",\n \"slidepanel\",\n ],\n Typography: [\"text\", \"heading\", \"title\", \"label\", \"paragraph\"],\n Media: [\"image\", \"video\", \"icon\", \"carousel\"],\n};\n\nfunction inferCategory(\n componentName: string,\n props: ExtractedProp[]\n): string {\n const lower = componentName.toLowerCase();\n\n for (const [category, patterns] of Object.entries(CATEGORY_PATTERNS)) {\n for (const pattern of patterns) {\n if (lower.includes(pattern)) {\n return category;\n }\n }\n }\n\n // Prop-based fallbacks\n const propNames = new Set(props.map((p) => p.name));\n if (propNames.has(\"onClick\") || propNames.has(\"onPress\")) return \"Actions\";\n if (propNames.has(\"value\") || propNames.has(\"defaultValue\")) return \"Forms\";\n if (propNames.has(\"children\")) return \"Layout\";\n\n return \"Components\";\n}\n\nfunction inferStatus(\n filePath: string\n): \"draft\" | \"experimental\" | \"beta\" | \"stable\" | \"deprecated\" {\n const lowerPath = filePath.toLowerCase();\n if (lowerPath.includes(\"/experimental/\") || lowerPath.includes(\"/labs/\"))\n return \"experimental\";\n if (lowerPath.includes(\"/beta/\")) return \"beta\";\n if (lowerPath.includes(\"/deprecated/\") || lowerPath.includes(\"/legacy/\"))\n return \"deprecated\";\n if (lowerPath.includes(\"/draft/\") || lowerPath.includes(\"/wip/\"))\n return \"draft\";\n return \"stable\";\n}\n\nfunction inferDescription(\n componentName: string,\n props: ExtractedProp[]\n): string {\n const words = componentName\n .replace(/([A-Z])/g, \" $1\")\n .trim()\n .toLowerCase();\n\n const propNames = new Set(props.map((p) => p.name));\n const hasOnClick =\n propNames.has(\"onClick\") || propNames.has(\"onPress\");\n const hasValue =\n propNames.has(\"value\") || propNames.has(\"defaultValue\");\n const hasChildren = propNames.has(\"children\");\n\n if (hasOnClick && !hasValue)\n return `Interactive ${words} element for triggering actions`;\n if (hasValue) return `Form ${words} for user input`;\n if (hasChildren) return `Container ${words} for grouping content`;\n return `${words.charAt(0).toUpperCase() + words.slice(1)} component`;\n}\n\nfunction inferAccessibility(props: ExtractedProp[]): {\n role?: string;\n requirements?: string[];\n} {\n const propNames = new Set(props.map((p) => p.name));\n const accessibility: { role?: string; requirements?: string[] } = {};\n\n const hasOnClick =\n propNames.has(\"onClick\") || propNames.has(\"onPress\");\n const hasAriaLabel =\n propNames.has(\"ariaLabel\") || propNames.has(\"aria-label\");\n const hasDisabled = propNames.has(\"disabled\");\n const hasHref = propNames.has(\"href\");\n\n if (hasOnClick && !hasHref) accessibility.role = \"button\";\n else if (hasHref) accessibility.role = \"link\";\n\n const requirements: string[] = [];\n if (hasOnClick && !hasAriaLabel)\n requirements.push(\"Should have visible text or aria-label\");\n if (hasDisabled)\n requirements.push(\n \"Disabled state should be conveyed to assistive technology\"\n );\n if (requirements.length > 0) accessibility.requirements = requirements;\n\n return accessibility;\n}\n\n// ---------------------------------------------------------------------------\n// Import path computation\n// ---------------------------------------------------------------------------\n\nfunction computeImportPath(\n fragmentDir: string,\n sourcePath: string,\n componentBaseName: string\n): string {\n const sourceDir = dirname(sourcePath);\n\n // Colocated: fragment sits next to the source file\n if (fragmentDir === sourceDir) {\n // If source is index.tsx, import from '.'\n if (componentBaseName === \"index\") {\n return \".\";\n }\n return `./${componentBaseName}`;\n }\n\n // Different directory: compute relative path\n let rel = relative(fragmentDir, sourceDir);\n if (!rel.startsWith(\".\")) rel = `./${rel}`;\n if (componentBaseName !== \"index\") {\n rel = `${rel}/${componentBaseName}`;\n }\n return rel;\n}\n\n// ---------------------------------------------------------------------------\n// Fragment file generation with TODO markers\n// ---------------------------------------------------------------------------\n\nfunction escapeQuotes(str: string): string {\n return str.replace(/'/g, \"\\\\'\");\n}\n\nfunction generateFragmentWithTodos(\n componentName: string,\n importPath: string,\n data: ComponentData,\n confidence: FieldConfidence\n): string {\n const props = data.props?.success ? data.props.props : [];\n const isDefaultExport = data.props?.success\n ? !data.props.propsTypeName // heuristic: if no explicit props type, might be default export\n : false;\n // For scan-generated files we always use named import\n const description = data.jsDoc || inferDescription(componentName, props);\n const descriptionTodo = data.jsDoc ? \"\" : \" // TODO: Review description\";\n const category = inferCategory(componentName, props);\n const categoryTodo = category === \"Components\" ? \" // TODO: Set correct category\" : \"\";\n const status = inferStatus(data.component.sourcePath);\n const accessibility = inferAccessibility(props);\n\n // Build props block\n const propsBlock = buildPropsBlock(props);\n\n // Build accessibility block\n const accessibilityBlock = buildAccessibilityBlock(accessibility);\n\n // Build variants\n const variantsBlock = buildVariantsBlock(\n componentName,\n data.storyVariants\n );\n\n // Build compound children comment\n const compoundComment =\n data.compoundChildren.length > 0\n ? `\\n // Compound sub-components detected: ${data.compoundChildren.join(\", \")}`\n : \"\";\n\n return `// Auto-generated by fragments init --scan | Confidence: ${confidence.score}/100\n// ${confidence.todoFields.length} TODO(s) — search for \"TODO:\" and fill in human knowledge\nimport React from 'react';\nimport { defineFragment } from '@fragments-sdk/core';\nimport { ${componentName} } from '${importPath}';\n\nexport default defineFragment({\n component: ${componentName},\n${compoundComment}\n meta: {\n name: '${escapeQuotes(componentName)}',\n description: '${escapeQuotes(description)}',${descriptionTodo}\n category: '${escapeQuotes(category)}',${categoryTodo}\n status: '${status}',\n },\n\n usage: {\n when: [\n // TODO: Describe when to use ${componentName}\n ],\n whenNot: [\n // TODO: Describe when NOT to use ${componentName}\n ],\n },\n\n props: ${propsBlock},${accessibilityBlock}\n\n variants: [\n${variantsBlock}\n ],\n});\n`;\n}\n\nfunction buildPropsBlock(props: ExtractedProp[]): string {\n if (props.length === 0) return \"{}\";\n\n const lines = props.map((prop) => {\n const type = prop.propType.type;\n const parts: string[] = [` type: '${type}'`];\n\n if (prop.description) {\n parts.push(\n ` description: '${escapeQuotes(prop.description.replace(/\\n/g, \" \"))}'`\n );\n }\n\n parts.push(` required: ${prop.required}`);\n\n if (prop.defaultValue !== undefined) {\n parts.push(` default: ${JSON.stringify(prop.defaultValue)}`);\n }\n\n if (prop.enumValues && prop.enumValues.length > 0) {\n parts.push(` values: ${JSON.stringify(prop.enumValues)}`);\n }\n\n const todoComment =\n type === \"custom\" ? \" // TODO: Review type\" : \"\";\n\n return ` ${prop.name}: {\\n${parts.join(\",\\n\")},\\n },${todoComment}`;\n });\n\n return `{\\n${lines.join(\"\\n\")}\\n }`;\n}\n\nfunction buildAccessibilityBlock(accessibility: {\n role?: string;\n requirements?: string[];\n}): string {\n if (\n !accessibility.role &&\n (!accessibility.requirements || accessibility.requirements.length === 0)\n ) {\n return \"\";\n }\n\n const parts: string[] = [];\n if (accessibility.role) {\n parts.push(` role: '${accessibility.role}'`);\n }\n if (accessibility.requirements && accessibility.requirements.length > 0) {\n const reqs = accessibility.requirements\n .map((r) => `'${escapeQuotes(r)}'`)\n .join(\", \");\n parts.push(` requirements: [${reqs}]`);\n }\n\n return `\\n\\n accessibility: {\\n${parts.join(\",\\n\")},\\n },`;\n}\n\nfunction buildVariantsBlock(\n componentName: string,\n storyVariants: StoryVariant[]\n): string {\n const entries: string[] = [];\n\n // Always include a Default variant\n const hasDefault = storyVariants.some((v) => v.name === \"Default\");\n if (!hasDefault) {\n entries.push(formatVariantEntry(componentName, \"Default\", `Default ${componentName}`, {}));\n }\n\n for (const variant of storyVariants) {\n const description = variant.name.replace(/([A-Z])/g, \" $1\").trim();\n entries.push(\n formatVariantEntry(\n componentName,\n variant.name,\n `${description} ${componentName}`,\n variant.args\n )\n );\n }\n\n return entries.join(\"\\n\");\n}\n\nfunction formatVariantEntry(\n componentName: string,\n name: string,\n description: string,\n args: Record<string, unknown>\n): string {\n const jsxCode = buildJsxString(componentName, args);\n return ` {\n name: '${escapeQuotes(name)}',\n description: '${escapeQuotes(description)}',\n code: \\`${jsxCode}\\`,\n render: () => ${jsxCode},\n },`;\n}\n\nfunction buildJsxString(\n componentName: string,\n args: Record<string, unknown>\n): string {\n const { children, ...restArgs } = args;\n const propParts: string[] = [];\n\n for (const [key, value] of Object.entries(restArgs)) {\n if (typeof value === \"string\") {\n propParts.push(`${key}=\"${escapeQuotes(value)}\"`);\n } else if (typeof value === \"boolean\") {\n propParts.push(value ? key : `${key}={false}`);\n } else if (typeof value === \"number\") {\n propParts.push(`${key}={${value}}`);\n }\n }\n\n const propsStr = propParts.length > 0 ? \" \" + propParts.join(\" \") : \"\";\n\n if (typeof children === \"string\") {\n return `<${componentName}${propsStr}>${children}</${componentName}>`;\n }\n\n return `<${componentName}${propsStr} />`;\n}\n"],"mappings":"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","names":[]}
@@ -97,14 +97,12 @@ import {
97
97
  shutdownSharedPool,
98
98
  sleep,
99
99
  summarizePatternsForPrompt
100
- } from "./chunk-YMPGYEWK.js";
101
- import "./chunk-GF6OVPIN.js";
102
- import "./chunk-NVSPGSKB.js";
103
- import "./chunk-EZYXYWNF.js";
100
+ } from "./chunk-D5PYOXEI.js";
101
+ import "./chunk-D2CDBRNU.js";
104
102
  import {
105
103
  BRAND,
106
104
  DEFAULTS
107
- } from "./chunk-EKLMXTWU.js";
105
+ } from "./chunk-OQO55NKV.js";
108
106
  import "./chunk-Z7EY4VHE.js";
109
107
  export {
110
108
  BRAND,
@@ -208,4 +206,4 @@ export {
208
206
  sleep,
209
207
  summarizePatternsForPrompt
210
208
  };
211
- //# sourceMappingURL=service-XP2EAJXD.js.map
209
+ //# sourceMappingURL=service-TQYWY65E.js.map
@@ -2,14 +2,12 @@ import { createRequire as __banner_createRequire } from 'module'; const require
2
2
  import {
3
3
  generateStaticViewer,
4
4
  generateViewerFromJson
5
- } from "./chunk-TOIE7VXF.js";
6
- import "./chunk-GF6OVPIN.js";
7
- import "./chunk-NVSPGSKB.js";
8
- import "./chunk-EZYXYWNF.js";
9
- import "./chunk-EKLMXTWU.js";
5
+ } from "./chunk-PW7QTQA6.js";
6
+ import "./chunk-D2CDBRNU.js";
7
+ import "./chunk-OQO55NKV.js";
10
8
  import "./chunk-Z7EY4VHE.js";
11
9
  export {
12
10
  generateStaticViewer,
13
11
  generateViewerFromJson
14
12
  };
15
- //# sourceMappingURL=static-viewer-XCS7UJTO.js.map
13
+ //# sourceMappingURL=static-viewer-NUBFPKWH.js.map
@@ -1,12 +1,11 @@
1
1
  import { createRequire as __banner_createRequire } from 'module'; const require = __banner_createRequire(import.meta.url);
2
2
  import {
3
3
  parseFragmentFile
4
- } from "./chunk-BW3ZATBW.js";
4
+ } from "./chunk-566BNPQZ.js";
5
5
  import {
6
6
  discoverFragmentFiles
7
- } from "./chunk-AWYCDRPG.js";
8
- import "./chunk-NVSPGSKB.js";
9
- import "./chunk-EKLMXTWU.js";
7
+ } from "./chunk-WXSR2II7.js";
8
+ import "./chunk-OQO55NKV.js";
10
9
  import "./chunk-Z7EY4VHE.js";
11
10
 
12
11
  // src/test/index.ts
@@ -1072,4 +1071,4 @@ export {
1072
1071
  listTests,
1073
1072
  runTestCommand
1074
1073
  };
1075
- //# sourceMappingURL=test-TD6TJNVY.js.map
1074
+ //# sourceMappingURL=test-2CSOSS3B.js.map
@@ -1 +1 @@
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 { FragmentsConfig } 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: FragmentsConfig,\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 fragment 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: 'Fragments 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: FragmentsConfig,\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 { FragmentsConfig } from '../core/index.js';\nimport { discoverFragmentFiles, parseFragmentFile } from '../core/node.js';\nimport type { TestCase, DiscoveryOptions } from './types.js';\n\n/**\n * Discovered fragment 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: FragmentsConfig,\n configDir: string,\n options: DiscoveryOptions = {}\n): Promise<TestCase[]> {\n const files = await discoverFragmentFiles(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 = parseFragmentFile(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 \ntype Browser = any;\n \ntype BrowserContext = any;\n \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 \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 fragment definition in the global registry\n const registry = (window as unknown as { __FRAGMENTS_REGISTRY__?: Map<string, unknown> })\n .__FRAGMENTS_REGISTRY__;\n\n if (!registry) {\n return {\n steps: [],\n error: { message: 'Fragments registry not found. Make sure the viewer is loaded.' },\n };\n }\n\n const fragment = 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 (!fragment) {\n return {\n steps: [],\n error: { message: `Component \"${component}\" not found in registry` },\n };\n }\n\n const variantDef = fragment.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('Fragments 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 = 'Fragments 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 const cleaned = Array.from(str).filter((ch) => {\n const code = ch.charCodeAt(0);\n return code === 0x09 || code === 0x0A || code === 0x0D || code >= 0x20;\n }).join('');\n\n return cleaned\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\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 { FragmentsConfig } from '../core/index.js';\nimport { discoverFragmentFiles } 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: FragmentsConfig,\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 const pendingFiles = new Set<string>();\n\n // Get files to watch\n const fragmentFiles = await discoverFragmentFiles(config, configDir);\n const watchPaths = new Set<string>();\n\n for (const file of fragmentFiles) {\n watchPaths.add(file.absolutePath);\n }\n\n // Also watch the directories containing fragment 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('Fragments 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 fragment 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: FragmentsConfig,\n configDir: string,\n runnerOptions: RunnerOptions,\n reporters: TestReporter[]\n): Promise<void> {\n const 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"]}
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 { FragmentsConfig } 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: FragmentsConfig,\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 fragment 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: 'Fragments 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: FragmentsConfig,\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 { FragmentsConfig } from '../core/index.js';\nimport { discoverFragmentFiles, parseFragmentFile } from '../core/node.js';\nimport type { TestCase, DiscoveryOptions } from './types.js';\n\n/**\n * Discovered fragment 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: FragmentsConfig,\n configDir: string,\n options: DiscoveryOptions = {}\n): Promise<TestCase[]> {\n const files = await discoverFragmentFiles(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 = parseFragmentFile(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 \ntype Browser = any;\n \ntype BrowserContext = any;\n \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 \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 fragment definition in the global registry\n const registry = (window as unknown as { __FRAGMENTS_REGISTRY__?: Map<string, unknown> })\n .__FRAGMENTS_REGISTRY__;\n\n if (!registry) {\n return {\n steps: [],\n error: { message: 'Fragments registry not found. Make sure the viewer is loaded.' },\n };\n }\n\n const fragment = 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 (!fragment) {\n return {\n steps: [],\n error: { message: `Component \"${component}\" not found in registry` },\n };\n }\n\n const variantDef = fragment.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('Fragments 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 = 'Fragments 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 const cleaned = Array.from(str).filter((ch) => {\n const code = ch.charCodeAt(0);\n return code === 0x09 || code === 0x0A || code === 0x0D || code >= 0x20;\n }).join('');\n\n return cleaned\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\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 { FragmentsConfig } from '../core/index.js';\nimport { discoverFragmentFiles } 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: FragmentsConfig,\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 const pendingFiles = new Set<string>();\n\n // Get files to watch\n const fragmentFiles = await discoverFragmentFiles(config, configDir);\n const watchPaths = new Set<string>();\n\n for (const file of fragmentFiles) {\n watchPaths.add(file.absolutePath);\n }\n\n // Also watch the directories containing fragment 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('Fragments 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 fragment 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: FragmentsConfig,\n configDir: string,\n runnerOptions: RunnerOptions,\n reporters: TestReporter[]\n): Promise<void> {\n const 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"]}
@@ -1,17 +1,15 @@
1
1
  import { createRequire as __banner_createRequire } from 'module'; const require = __banner_createRequire(import.meta.url);
2
2
  import {
3
3
  loadConfig
4
- } from "./chunk-BW3ZATBW.js";
5
- import "./chunk-AWYCDRPG.js";
4
+ } from "./chunk-566BNPQZ.js";
5
+ import "./chunk-WXSR2II7.js";
6
6
  import {
7
7
  parseTokenFiles
8
- } from "./chunk-YMPGYEWK.js";
9
- import "./chunk-GF6OVPIN.js";
10
- import "./chunk-NVSPGSKB.js";
11
- import "./chunk-EZYXYWNF.js";
8
+ } from "./chunk-D5PYOXEI.js";
9
+ import "./chunk-D2CDBRNU.js";
12
10
  import {
13
11
  BRAND
14
- } from "./chunk-EKLMXTWU.js";
12
+ } from "./chunk-OQO55NKV.js";
15
13
  import "./chunk-Z7EY4VHE.js";
16
14
 
17
15
  // src/commands/tokens.ts
@@ -174,4 +172,4 @@ export {
174
172
  tokens_default as default,
175
173
  tokens
176
174
  };
177
- //# sourceMappingURL=tokens-2EXPCVP3.js.map
175
+ //# sourceMappingURL=tokens-DXEGYTOJ.js.map