elit 3.3.3 → 3.3.4

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 (143) hide show
  1. package/dist/build.d.mts +1 -1
  2. package/dist/build.js +1 -0
  3. package/dist/build.js.map +1 -0
  4. package/dist/build.mjs +1 -0
  5. package/dist/build.mjs.map +1 -0
  6. package/dist/chokidar.js +1 -0
  7. package/dist/chokidar.js.map +1 -0
  8. package/dist/chokidar.mjs +1 -0
  9. package/dist/chokidar.mjs.map +1 -0
  10. package/dist/cli.js +4687 -34
  11. package/dist/config.d.mts +3 -1
  12. package/dist/config.d.ts +3 -1
  13. package/dist/config.d.ts.map +1 -1
  14. package/dist/config.js +1 -0
  15. package/dist/config.js.map +1 -0
  16. package/dist/config.mjs +1 -0
  17. package/dist/config.mjs.map +1 -0
  18. package/dist/coverage.d.mts +85 -0
  19. package/dist/coverage.d.ts +76 -0
  20. package/dist/coverage.d.ts.map +1 -0
  21. package/dist/coverage.js +1549 -0
  22. package/dist/coverage.js.map +1 -0
  23. package/dist/coverage.mjs +1520 -0
  24. package/dist/coverage.mjs.map +1 -0
  25. package/dist/database.d.mts +31 -6
  26. package/dist/database.d.ts +31 -6
  27. package/dist/database.d.ts.map +1 -1
  28. package/dist/database.js +60 -33
  29. package/dist/database.js.map +1 -0
  30. package/dist/database.mjs +60 -33
  31. package/dist/database.mjs.map +1 -0
  32. package/dist/dom.js +1 -0
  33. package/dist/dom.js.map +1 -0
  34. package/dist/dom.mjs +1 -0
  35. package/dist/dom.mjs.map +1 -0
  36. package/dist/el.js +1 -0
  37. package/dist/el.js.map +1 -0
  38. package/dist/el.mjs +1 -0
  39. package/dist/el.mjs.map +1 -0
  40. package/dist/fs.js +1 -0
  41. package/dist/fs.js.map +1 -0
  42. package/dist/fs.mjs +1 -0
  43. package/dist/fs.mjs.map +1 -0
  44. package/dist/hmr.js +1 -0
  45. package/dist/hmr.js.map +1 -0
  46. package/dist/hmr.mjs +1 -0
  47. package/dist/hmr.mjs.map +1 -0
  48. package/dist/http.js +1 -0
  49. package/dist/http.js.map +1 -0
  50. package/dist/http.mjs +1 -0
  51. package/dist/http.mjs.map +1 -0
  52. package/dist/https.d.mts +1 -1
  53. package/dist/https.js +1 -0
  54. package/dist/https.js.map +1 -0
  55. package/dist/https.mjs +1 -0
  56. package/dist/https.mjs.map +1 -0
  57. package/dist/index.d.mts +1 -1
  58. package/dist/index.js +1 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/index.mjs +1 -0
  61. package/dist/index.mjs.map +1 -0
  62. package/dist/mime-types.js +1 -0
  63. package/dist/mime-types.js.map +1 -0
  64. package/dist/mime-types.mjs +1 -0
  65. package/dist/mime-types.mjs.map +1 -0
  66. package/dist/path.js +1 -0
  67. package/dist/path.js.map +1 -0
  68. package/dist/path.mjs +1 -0
  69. package/dist/path.mjs.map +1 -0
  70. package/dist/router.js +1 -0
  71. package/dist/router.js.map +1 -0
  72. package/dist/router.mjs +1 -0
  73. package/dist/router.mjs.map +1 -0
  74. package/dist/runtime.js +1 -0
  75. package/dist/runtime.js.map +1 -0
  76. package/dist/runtime.mjs +1 -0
  77. package/dist/runtime.mjs.map +1 -0
  78. package/dist/{server-Cz3z-5ls.d.mts → server-BFTzgJpO.d.mts} +62 -1
  79. package/dist/{server-BG2CaVMh.d.ts → server-CIXtexNS.d.ts} +62 -1
  80. package/dist/server.d.mts +1 -1
  81. package/dist/server.d.ts +9 -0
  82. package/dist/server.d.ts.map +1 -1
  83. package/dist/server.js +12 -0
  84. package/dist/server.js.map +1 -0
  85. package/dist/server.mjs +12 -0
  86. package/dist/server.mjs.map +1 -0
  87. package/dist/state.d.mts +1 -1
  88. package/dist/state.js +1 -0
  89. package/dist/state.js.map +1 -0
  90. package/dist/state.mjs +1 -0
  91. package/dist/state.mjs.map +1 -0
  92. package/dist/style.js +1 -0
  93. package/dist/style.js.map +1 -0
  94. package/dist/style.mjs +1 -0
  95. package/dist/style.mjs.map +1 -0
  96. package/dist/test-globals.d.ts +184 -0
  97. package/dist/test-reporter.d.mts +77 -0
  98. package/dist/test-reporter.d.ts +73 -0
  99. package/dist/test-reporter.d.ts.map +1 -0
  100. package/dist/test-reporter.js +726 -0
  101. package/dist/test-reporter.js.map +1 -0
  102. package/dist/test-reporter.mjs +696 -0
  103. package/dist/test-reporter.mjs.map +1 -0
  104. package/dist/test-runtime.d.mts +122 -0
  105. package/dist/test-runtime.d.ts +120 -0
  106. package/dist/test-runtime.d.ts.map +1 -0
  107. package/dist/test-runtime.js +1292 -0
  108. package/dist/test-runtime.js.map +1 -0
  109. package/dist/test-runtime.mjs +1269 -0
  110. package/dist/test-runtime.mjs.map +1 -0
  111. package/dist/test.d.mts +39 -0
  112. package/dist/test.d.ts +38 -0
  113. package/dist/test.d.ts.map +1 -0
  114. package/dist/test.js +4966 -0
  115. package/dist/test.js.map +1 -0
  116. package/dist/test.mjs +4944 -0
  117. package/dist/test.mjs.map +1 -0
  118. package/dist/types.d.mts +62 -1
  119. package/dist/types.d.ts +52 -0
  120. package/dist/types.d.ts.map +1 -1
  121. package/dist/types.js +1 -0
  122. package/dist/types.js.map +1 -0
  123. package/dist/types.mjs +1 -0
  124. package/dist/types.mjs.map +1 -0
  125. package/dist/ws.js +1 -0
  126. package/dist/ws.js.map +1 -0
  127. package/dist/ws.mjs +1 -0
  128. package/dist/ws.mjs.map +1 -0
  129. package/dist/wss.js +1 -0
  130. package/dist/wss.js.map +1 -0
  131. package/dist/wss.mjs +1 -0
  132. package/dist/wss.mjs.map +1 -0
  133. package/package.json +37 -5
  134. package/src/cli.ts +165 -1
  135. package/src/config.ts +3 -1
  136. package/src/coverage.ts +1479 -0
  137. package/src/database.ts +71 -35
  138. package/src/server.ts +12 -0
  139. package/src/test-globals.d.ts +184 -0
  140. package/src/test-reporter.ts +609 -0
  141. package/src/test-runtime.ts +1359 -0
  142. package/src/test.ts +368 -0
  143. package/src/types.ts +59 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/test-reporter.ts","../src/runtime.ts","../src/path.ts"],"sourcesContent":["/**\n * Jest-style Reporters for Elit Test Framework\n *\n * Provides beautiful Jest-compatible output formats:\n * - Default reporter with colored output\n * - Dot reporter for CI/CD\n * - JSON reporter for machine parsing\n */\n\nimport type { TestResult } from './test-runtime';\nimport { relative } from './path';\n\n// ANSI color codes\nconst colors = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n};\n\n// ============================================================================\n// Helper Functions (safe from ReDoS)\n// ============================================================================\n\n/**\n * Extract argument from function call using safe string operations\n * Example: extractArg(\".toBe('value')\", \"toBe\") returns \"'value'\"\n */\nfunction extractArg(code: string, functionName: string): string | null {\n const searchStr = `.${functionName}(`;\n const startIndex = code.indexOf(searchStr);\n if (startIndex === -1) return null;\n\n let parenCount = 0;\n let inString = false;\n let stringChar = '';\n let argStart = startIndex + searchStr.length;\n\n for (let i = argStart; i < code.length; i++) {\n const char = code[i];\n\n if (!inString) {\n if (char === '(') parenCount++;\n else if (char === ')') {\n parenCount--;\n if (parenCount < 0) {\n return code.slice(argStart, i);\n }\n } else if (char === '\"' || char === \"'\" || char === '`') {\n inString = true;\n stringChar = char;\n }\n } else {\n if (char === '\\\\' && i + 1 < code.length) {\n i++; // Skip escaped character\n } else if (char === stringChar) {\n inString = false;\n }\n }\n }\n\n return null;\n}\n\n/**\n * Extract received value from error message using safe string operations\n */\nfunction extractReceivedValue(errorMsg: string): string | null {\n const receivedIndex = errorMsg.indexOf('Received:');\n if (receivedIndex === -1) return null;\n\n const afterReceived = errorMsg.slice(receivedIndex + 9).trimStart();\n const newlineIndex = afterReceived.indexOf('\\n');\n if (newlineIndex !== -1) {\n return afterReceived.slice(0, newlineIndex).trimEnd();\n }\n return afterReceived.trimEnd();\n}\n\n/**\n * Check if a string is quoted and extract quote and content\n * Returns null if not quoted\n */\nfunction parseQuotedString(str: string): { quote: string; content: string } | null {\n if (str.length < 2) return null;\n const firstChar = str[0];\n const lastChar = str[str.length - 1];\n\n if ((firstChar === '\"' || firstChar === \"'\" || firstChar === '`') &&\n firstChar === lastChar) {\n return {\n quote: firstChar,\n content: str.slice(1, -1)\n };\n }\n return null;\n}\n\n/**\n * Strip quotes from a string (first and last matching quotes)\n */\nfunction stripQuotes(str: string): string {\n if (str.length < 2) return str;\n const firstChar = str[0];\n const lastChar = str[str.length - 1];\n\n if ((firstChar === '\"' || firstChar === \"'\" || firstChar === '`') &&\n firstChar === lastChar) {\n return str.slice(1, -1);\n }\n return str;\n}\n\n// ============================================================================\n// Default Jest-style Reporter\n// ============================================================================\n\nexport interface TestReporterOptions {\n verbose?: boolean;\n colors?: boolean;\n}\n\nexport class TestReporter {\n private options: TestReporterOptions;\n private startTime: number = 0;\n private currentFile: string | undefined = undefined;\n private fileTestCount: number = 0;\n private totalFiles: number = 0;\n\n constructor(options: TestReporterOptions = {}) {\n this.options = {\n verbose: false,\n colors: true,\n ...options,\n };\n }\n\n private c(color: keyof typeof colors, text: string): string {\n return this.options.colors !== false ? colors[color] + text + colors.reset : text;\n }\n\n onRunStart(files: string[]) {\n this.startTime = Date.now();\n this.totalFiles = files.length;\n console.log(`\\n${this.c('bold', 'Test Files')}: ${files.length}`);\n console.log(`${this.c('dim', '─'.repeat(50))}\\n`);\n }\n\n onTestResult(result: TestResult) {\n // Format file path as relative with forward slashes (safe from ReDoS)\n const filePath = result.file\n ? relative(process.cwd(), result.file).split('\\\\').join('/')\n : undefined;\n\n // Print file header when file changes\n if (filePath !== this.currentFile) {\n // Print count for previous file if any tests ran\n if (this.currentFile && this.fileTestCount > 0) {\n console.log('');\n }\n\n this.currentFile = filePath;\n this.fileTestCount = 0;\n\n if (filePath) {\n console.log(`${this.c('cyan', '●')} ${this.c('bold', filePath)}`);\n console.log(`${this.c('dim', '┄'.repeat(50))}`);\n }\n }\n\n this.fileTestCount++;\n\n if (result.status === 'pass') {\n console.log(` ${this.c('green', '✓')} ${this.c('dim', result.suite + ' > ')}${result.name} ${this.c('dim', `(${result.duration}ms)`)}`);\n } else if (result.status === 'fail') {\n console.log(` ${this.c('red', '✕')} ${this.c('dim', result.suite + ' > ')}${result.name}`);\n if (result.error) {\n // Show file path with line number\n const filePath = result.file;\n if (filePath) {\n // Convert to relative path from current working directory (safe from ReDoS)\n const relativePath = relative(process.cwd(), filePath).split('\\\\').join('/');\n const lineSuffix = result.lineNumber ? `:${result.lineNumber}` : '';\n console.log(` ${this.c('cyan', `📄 ${relativePath}${lineSuffix}`)}`);\n }\n\n // Format error message to highlight Expected/Received\n const lines = result.error.message.split('\\n');\n for (const line of lines) {\n if (line.includes('Expected:')) {\n console.log(` ${this.c('green', 'Expected:')} ${line.trim().replace('Expected:', '').trim()}`);\n } else if (line.includes('Received:')) {\n console.log(` ${this.c('red', 'Received:')} ${line.trim().replace('Received:', '').trim()}`);\n } else {\n console.log(` ${this.c('red', line.trim())}`);\n }\n }\n\n // Show code snippet with suggestion if available\n if (result.codeSnippet) {\n // Generate suggestion based on the error type\n let suggestion = '';\n const code = result.codeSnippet;\n\n // Extract the actual (received) value from the error message (safe from ReDoS)\n const errorMsg = result.error?.message || '';\n const receivedValue = extractReceivedValue(errorMsg);\n\n // Common patterns for suggestions (safe from ReDoS)\n // Order matters: check longer patterns first to avoid false matches\n if (code.includes('.toBeGreaterThanOrEqual(')) {\n const currentValue = extractArg(code, 'toBeGreaterThanOrEqual');\n if (currentValue && receivedValue) {\n const actualValue = Number(receivedValue);\n if (!isNaN(actualValue)) {\n suggestion = code.replace(\n `.toBeGreaterThanOrEqual(${currentValue})`,\n `.toBeGreaterThanOrEqual(${actualValue})`\n );\n }\n }\n } else if (code.includes('.toBeGreaterThan(')) {\n const currentValue = extractArg(code, 'toBeGreaterThan');\n if (currentValue && receivedValue) {\n const actualValue = Number(receivedValue);\n if (!isNaN(actualValue)) {\n suggestion = code.replace(\n `.toBeGreaterThan(${currentValue})`,\n `.toBeGreaterThan(${actualValue - 1})`\n );\n }\n }\n } else if (code.includes('.toBeLessThanOrEqual(')) {\n const currentValue = extractArg(code, 'toBeLessThanOrEqual');\n if (currentValue && receivedValue) {\n const actualValue = Number(receivedValue);\n if (!isNaN(actualValue)) {\n suggestion = code.replace(\n `.toBeLessThanOrEqual(${currentValue})`,\n `.toBeLessThanOrEqual(${actualValue})`\n );\n }\n }\n } else if (code.includes('.toBeLessThan(')) {\n const currentValue = extractArg(code, 'toBeLessThan');\n if (currentValue && receivedValue) {\n const actualValue = Number(receivedValue);\n if (!isNaN(actualValue)) {\n suggestion = code.replace(\n `.toBeLessThan(${currentValue})`,\n `.toBeLessThan(${actualValue + 1})`\n );\n }\n }\n } else if (code.includes('.toStrictEqual(')) {\n const expectedValue = extractArg(code, 'toStrictEqual');\n if (expectedValue && receivedValue) {\n const quoted = parseQuotedString(expectedValue);\n if (quoted) {\n const strippedReceived = stripQuotes(receivedValue);\n suggestion = code.replace(\n `.toStrictEqual(${expectedValue})`,\n `.toStrictEqual(${quoted.quote}${strippedReceived}${quoted.quote})`\n );\n } else {\n suggestion = code.replace(\n `.toStrictEqual(${expectedValue})`,\n `.toStrictEqual(${receivedValue})`\n );\n }\n }\n } else if (code.includes('.toEqual(')) {\n const expectedValue = extractArg(code, 'toEqual');\n if (expectedValue && receivedValue) {\n const quoted = parseQuotedString(expectedValue);\n if (quoted) {\n const strippedReceived = stripQuotes(receivedValue);\n suggestion = code.replace(\n `.toEqual(${expectedValue})`,\n `.toEqual(${quoted.quote}${strippedReceived}${quoted.quote})`\n );\n } else {\n suggestion = code.replace(\n `.toEqual(${expectedValue})`,\n `.toEqual(${receivedValue})`\n );\n }\n }\n } else if (code.includes('.toMatch(')) {\n const expectedPattern = extractArg(code, 'toMatch');\n if (expectedPattern && receivedValue) {\n const quoted = parseQuotedString(expectedPattern);\n if (quoted) {\n const strippedReceived = stripQuotes(receivedValue);\n suggestion = code.replace(\n `.toMatch(${expectedPattern})`,\n `.toMatch(${quoted.quote}${strippedReceived}${quoted.quote})`\n );\n }\n }\n } else if (code.includes('.toContain(')) {\n const expectedValue = extractArg(code, 'toContain');\n if (expectedValue && receivedValue) {\n const quoted = parseQuotedString(expectedValue);\n if (quoted) {\n const strippedReceived = stripQuotes(receivedValue);\n suggestion = code.replace(\n `.toContain(${expectedValue})`,\n `.toContain(${quoted.quote}${strippedReceived}${quoted.quote})`\n );\n } else {\n suggestion = code.replace(\n `.toContain(${expectedValue})`,\n `.toContain(${receivedValue})`\n );\n }\n }\n } else if (code.includes('.toHaveLength(')) {\n const expectedLength = extractArg(code, 'toHaveLength');\n if (expectedLength && receivedValue) {\n const actualLength = Number(receivedValue);\n if (!isNaN(actualLength)) {\n suggestion = code.replace(\n `.toHaveLength(${expectedLength})`,\n `.toHaveLength(${actualLength})`\n );\n }\n }\n } else if (code.includes('.toBe(')) {\n const expectedValue = extractArg(code, 'toBe');\n if (expectedValue) {\n if (receivedValue) {\n const quoted = parseQuotedString(expectedValue);\n if (quoted) {\n const strippedReceived = stripQuotes(receivedValue);\n suggestion = code.replace(\n `.toBe(${expectedValue})`,\n `.toBe(${quoted.quote}${strippedReceived}${quoted.quote})`\n );\n } else {\n suggestion = code.replace(\n `.toBe(${expectedValue})`,\n `.toBe(${receivedValue})`\n );\n }\n } else if (expectedValue.includes(\"'\") || expectedValue.includes('\"')) {\n suggestion = code.replace('.toBe(', '.toEqual(');\n }\n }\n } else if (code.includes('.toBeDefined()')) {\n // Suggest removing or changing to different assertion\n suggestion = code.replace('.toBeDefined()', '.toBeTruthy()');\n } else if (code.includes('.toBeNull()')) {\n // Suggest checking for undefined instead\n suggestion = code.replace('.toBeNull()', '.toBeUndefined()');\n } else if (code.includes('.toBeUndefined()')) {\n // Suggest checking for null instead\n suggestion = code.replace('.toBeUndefined()', '.toBeNull()');\n } else if (code.includes('.toBeTruthy()')) {\n // Suggest checking for defined instead\n suggestion = code.replace('.toBeTruthy()', '.toBeDefined()');\n } else if (code.includes('.toBeFalsy()')) {\n // Suggest checking for undefined or null\n suggestion = code.replace('.toBeFalsy()', '.toBeUndefined()');\n }\n\n console.log(` ${this.c('dim', 'Code:')}`);\n console.log(` ${this.c('dim', code)}`);\n if (suggestion && suggestion !== code) {\n console.log(` ${this.c('yellow', 'example →')} ${this.c('green', suggestion)}`);\n }\n }\n\n if (this.options.verbose && result.error.stack) {\n const stack = result.error.stack.split('\\n').slice(1, 3).join('\\n');\n console.log(` ${this.c('dim', stack)}`);\n }\n }\n } else if (result.status === 'skip') {\n console.log(` ${this.c('yellow', '○')} ${this.c('dim', result.suite + ' > ')}${result.name} ${this.c('yellow', '(skipped)')}`);\n } else if (result.status === 'todo') {\n console.log(` ${this.c('cyan', '○')} ${this.c('dim', result.suite + ' > ')}${result.name} ${this.c('cyan', '(todo)')}`);\n }\n }\n\n onRunEnd(results: TestResult[]) {\n const duration = Date.now() - this.startTime;\n const passed = results.filter(r => r.status === 'pass').length;\n const failed = results.filter(r => r.status === 'fail').length;\n const skipped = results.filter(r => r.status === 'skip').length;\n const total = results.length;\n\n // Add blank line after last file's tests\n if (this.currentFile && this.fileTestCount > 0) {\n console.log('');\n }\n\n console.log(`${this.c('dim', '─'.repeat(50))}`);\n\n // Jest-style summary\n console.log('');\n console.log(`${this.c('bold', 'Test Suites:')} ${this.c('green', `${this.totalFiles} passed`)}${this.c('dim', `, ${this.totalFiles} total`)}`);\n console.log(`${this.c('bold', 'Tests:')} ${this.c('green', `${passed} passed`)}${failed > 0 ? `, ${this.c('red', `${failed} failed`)}` : ''}${skipped > 0 ? `, ${this.c('yellow', `${skipped} skipped`)}` : ''}${this.c('dim', `, ${total} total`)}`);\n console.log(`${this.c('bold', 'Snapshots:')} ${this.c('dim', '0 total')}`);\n console.log(`${this.c('bold', 'Time:')} ${this.c('dim', `${(duration / 1000).toFixed(2)}s`)}`);\n console.log('');\n }\n}\n\n// ============================================================================\n// Dot Reporter (minimal output for CI)\n// ============================================================================\n\nexport class DotReporter {\n private passed = 0;\n private failed = 0;\n private skipped = 0;\n private todo = 0;\n private lineLength = 0;\n\n onRunStart(files: string[]) {\n console.log(`\\n ${files.length} test files\\n`);\n }\n\n onTestResult(result: TestResult) {\n const symbol = result.status === 'pass' ? '.' :\n result.status === 'fail' ? this.c('red', 'F') :\n result.status === 'skip' ? this.c('yellow', 'o') :\n this.c('cyan', 'o');\n\n process.stdout.write(symbol);\n this.lineLength++;\n\n if (result.status === 'pass') this.passed++;\n else if (result.status === 'fail') this.failed++;\n else if (result.status === 'skip') this.skipped++;\n else if (result.status === 'todo') this.todo++;\n\n // Wrap every 50 characters\n if (this.lineLength >= 50) {\n process.stdout.write('\\n ');\n this.lineLength = 0;\n }\n }\n\n onRunEnd(_results: TestResult[]) {\n console.log(`\\n\\n ${this.c('green', this.passed + ' passed')} ${this.c('dim', '·')} ${this.c('red', this.failed + ' failed')} ${this.c('dim', '·')} ${this.c('yellow', this.skipped + ' skipped')}\\n`);\n }\n\n private c(color: keyof typeof colors, text: string): string {\n return colors[color] + text + colors.reset;\n }\n}\n\n// ============================================================================\n// JSON Reporter (machine-readable)\n// ============================================================================\n\nexport interface JsonTestResult {\n status: 'passed' | 'failed' | 'skipped' | 'todo';\n name: string;\n suite: string;\n duration: number;\n error?: {\n message: string;\n stack?: string;\n };\n}\n\nexport interface JsonReport {\n summary: {\n total: number;\n passed: number;\n failed: number;\n skipped: number;\n todo: number;\n duration: number;\n };\n tests: JsonTestResult[];\n}\n\nexport class JsonReporter {\n private startTime: number = 0;\n private results: TestResult[] = [];\n\n onRunStart(_files: string[]) {\n this.startTime = Date.now();\n this.results = [];\n }\n\n onTestResult(result: TestResult) {\n this.results.push(result);\n }\n\n onRunEnd(results: TestResult[]) {\n const report: JsonReport = {\n summary: {\n total: results.length,\n passed: results.filter(r => r.status === 'pass').length,\n failed: results.filter(r => r.status === 'fail').length,\n skipped: results.filter(r => r.status === 'skip').length,\n todo: results.filter(r => r.status === 'todo').length,\n duration: Date.now() - this.startTime,\n },\n tests: results.map(r => ({\n status: r.status === 'pass' ? 'passed' : r.status === 'fail' ? 'failed' : r.status === 'skip' ? 'skipped' : 'todo',\n name: r.name,\n suite: r.suite,\n duration: r.duration,\n error: r.error ? {\n message: r.error.message,\n stack: r.error.stack,\n } : undefined,\n })),\n };\n\n console.log(JSON.stringify(report, null, 2));\n }\n}\n\n// ============================================================================\n// Verbose Reporter (detailed output)\n// ============================================================================\n\nexport class VerboseReporter {\n private currentSuite: string = '';\n\n onRunStart(_files: string[]) {\n console.log(`\\n${colors.cyan}Running tests${colors.reset}\\n`);\n }\n\n onTestResult(result: TestResult) {\n // Print suite name when it changes\n if (result.suite !== this.currentSuite) {\n this.currentSuite = result.suite;\n console.log(`\\n${colors.dim}${result.suite}${colors.reset}`);\n }\n\n const icon = result.status === 'pass' ? colors.green + ' ✓' :\n result.status === 'fail' ? colors.red + ' ✕' :\n result.status === 'skip' ? colors.yellow + ' ⊘' :\n colors.cyan + ' ○';\n\n console.log(`${icon}${colors.reset} ${result.name}${colors.dim} (${result.duration}ms)${colors.reset}`);\n\n if (result.status === 'fail' && result.error) {\n console.log(`\\n${colors.red} ${result.error.message}${colors.reset}`);\n if (result.error.stack) {\n const lines = result.error.stack.split('\\n').slice(1, 4);\n lines.forEach(line => console.log(`${colors.dim} ${line}${colors.reset}`));\n }\n }\n }\n\n onRunEnd(results: TestResult[]) {\n const passed = results.filter(r => r.status === 'pass').length;\n const failed = results.filter(r => r.status === 'fail').length;\n const skipped = results.filter(r => r.status === 'skip').length;\n\n console.log(`\\n${colors.dim}${'─'.repeat(50)}${colors.reset}\\n`);\n\n if (failed === 0) {\n console.log(`${colors.green}All tests passed!${colors.reset}`);\n console.log(`${colors.dim}${passed} tests${colors.reset}\\n`);\n } else {\n console.log(`${colors.red}${failed} tests failed${colors.reset}`);\n console.log(`${colors.green}${passed} tests passed${colors.reset}`);\n if (skipped > 0) {\n console.log(`${colors.yellow}${skipped} tests skipped${colors.reset}`);\n }\n console.log('');\n }\n }\n}\n\n// ============================================================================\n// Utility function to format error stacks\n// ============================================================================\n\nexport function formatErrorStack(error: Error): string {\n if (!error.stack) return error.message;\n\n const lines = error.stack.split('\\n');\n let formatted = `${error.message}\\n`;\n\n // Skip the first line (error message) and format the rest\n for (const line of lines.slice(1, 6)) {\n formatted += ` ${line.trim()}\\n`;\n }\n\n return formatted;\n}\n\n// ============================================================================\n// Progress bar for watch mode\n// ============================================================================\n\nexport function formatProgress(current: number, total: number): string {\n const percentage = Math.floor((current / total) * 100);\n const filled = Math.floor(percentage / 2);\n const empty = 50 - filled;\n const bar = '█'.repeat(filled) + '░'.repeat(empty);\n return `[${bar}] ${percentage}% (${current}/${total})`;\n}\n","/**\n * Runtime detection and global type declarations\n * Shared across all modules for consistency\n */\n\n/**\n * Runtime detection (cached at module load)\n */\nexport const runtime = (() => {\n // @ts-ignore - Deno global\n if (typeof Deno !== 'undefined') return 'deno';\n // @ts-ignore - Bun global\n if (typeof Bun !== 'undefined') return 'bun';\n return 'node';\n})() as 'node' | 'bun' | 'deno';\n\nexport const isNode = runtime === 'node';\nexport const isBun = runtime === 'bun';\nexport const isDeno = runtime === 'deno';\n\n// Global declarations for runtime-specific APIs\ndeclare global {\n // @ts-ignore - Bun global\n const Bun: {\n build(options: {\n entrypoints: string[];\n outdir?: string;\n target?: string;\n format?: string;\n minify?: boolean;\n sourcemap?: string;\n external?: string[];\n naming?: string;\n plugins?: any[];\n define?: Record<string, string>;\n }): Promise<{\n success: boolean;\n outputs: Array<{ path: string; size: number }>;\n logs: any[];\n }>;\n Transpiler: new (options?: {\n loader?: string;\n target?: string;\n minify?: boolean;\n }) => {\n transform(code: string, loader?: string): Promise<string>;\n transformSync(code: string, loader?: string): string;\n };\n file(path: string): {\n size: number;\n arrayBuffer(): ArrayBuffer | Promise<ArrayBuffer>;\n exists(): Promise<boolean>;\n };\n write(path: string, data: string | Buffer | Uint8Array): Promise<void>;\n } | undefined;\n\n // @ts-ignore - Deno global\n const Deno: {\n emit(rootSpecifier: string | URL, options?: {\n bundle?: 'module' | 'classic';\n check?: boolean;\n compilerOptions?: any;\n importMap?: string;\n importMapPath?: string;\n sources?: Record<string, string>;\n }): Promise<{\n files: Record<string, string>;\n diagnostics: any[];\n }>;\n writeTextFile(path: string, data: string): Promise<void>;\n readFile(path: string): Promise<Uint8Array>;\n readFileSync(path: string): Uint8Array;\n writeFile(path: string, data: Uint8Array): Promise<void>;\n writeFileSync(path: string, data: Uint8Array): void;\n stat(path: string): Promise<any>;\n statSync(path: string): any;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n mkdirSync(path: string, options?: { recursive?: boolean }): void;\n readDir(path: string): AsyncIterable<any>;\n readDirSync(path: string): Iterable<any>;\n remove(path: string, options?: { recursive?: boolean }): Promise<void>;\n removeSync(path: string, options?: { recursive?: boolean }): void;\n rename(oldPath: string, newPath: string): Promise<void>;\n renameSync(oldPath: string, newPath: string): void;\n copyFile(src: string, dest: string): Promise<void>;\n copyFileSync(src: string, dest: string): void;\n realPath(path: string): Promise<string>;\n realPathSync(path: string): string;\n watchFs(paths: string | string[]): AsyncIterable<{\n kind: string;\n paths: string[];\n }>;\n build: {\n os: string;\n };\n } | undefined;\n}\n","/**\n * Path module with unified API across runtimes\n * Pure implementation without external dependencies\n * Compatible with Node.js 'path' module API\n * Works on Node.js, Bun, and Deno\n */\n\nimport { isBun, isDeno, isNode, runtime } from './runtime';\n\n/**\n * Helper: Get path separator for platform (eliminates duplication in separator logic)\n */\nfunction getSeparator(isWin: boolean): string {\n return isWin ? '\\\\' : '/';\n}\n\n/**\n * Helper: Get current working directory (eliminates duplication in resolvePaths)\n */\nfunction getCwd(): string {\n if (isNode || isBun) {\n return process.cwd();\n } else if (isDeno) {\n // @ts-ignore\n return Deno.cwd();\n }\n return '/';\n}\n\n/**\n * Helper: Find last separator index (eliminates duplication in getExtname and getBasename)\n */\nfunction findLastSeparator(path: string): number {\n return Math.max(path.lastIndexOf('/'), path.lastIndexOf('\\\\'));\n}\n\n/**\n * Helper: Create path operation object (eliminates duplication in posix and win32)\n */\nfunction createPathOps(isWin: boolean) {\n return {\n sep: getSeparator(isWin),\n delimiter: isWin ? ';' : ':',\n normalize: (path: string) => normalizePath(path, isWin),\n join: (...paths: string[]) => joinPaths(paths, isWin),\n resolve: (...paths: string[]) => resolvePaths(paths, isWin),\n isAbsolute: (path: string) => isWin ? isAbsoluteWin(path) : isAbsolutePosix(path),\n relative: (from: string, to: string) => relativePath(from, to, isWin),\n dirname: (path: string) => getDirname(path, isWin),\n basename: (path: string, ext?: string) => getBasename(path, ext, isWin),\n extname: (path: string) => getExtname(path),\n parse: (path: string) => parsePath(path, isWin),\n format: (pathObject: FormatInputPathObject) => formatPath(pathObject, isWin)\n };\n}\n\n/**\n * Helper: Check if path is absolute (POSIX)\n */\nfunction isAbsolutePosix(path: string): boolean {\n return path.length > 0 && path[0] === '/';\n}\n\n/**\n * Helper: Check if path is absolute (Windows)\n */\nfunction isAbsoluteWin(path: string): boolean {\n const len = path.length;\n if (len === 0) return false;\n\n const code = path.charCodeAt(0);\n if (code === 47 /* / */ || code === 92 /* \\ */) {\n return true;\n }\n\n // Check for drive letter\n if ((code >= 65 && code <= 90) || (code >= 97 && code <= 122)) {\n if (len > 2 && path.charCodeAt(1) === 58 /* : */) {\n const code2 = path.charCodeAt(2);\n if (code2 === 47 /* / */ || code2 === 92 /* \\ */) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Platform detection\n */\nconst isWindows = (() => {\n if (isNode) {\n return process.platform === 'win32';\n } else if (isDeno) {\n // @ts-ignore\n return Deno.build.os === 'windows';\n }\n // Bun uses process.platform like Node\n return typeof process !== 'undefined' && process.platform === 'win32';\n})();\n\n/**\n * Path separator\n */\nexport const sep = isWindows ? '\\\\' : '/';\n\n/**\n * Path delimiter\n */\nexport const delimiter = isWindows ? ';' : ':';\n\n/**\n * POSIX path operations\n */\nconst posix = createPathOps(false);\n\n/**\n * Windows path operations\n */\nconst win32 = createPathOps(true);\n\n/**\n * Path object interface\n */\nexport interface ParsedPath {\n root: string;\n dir: string;\n base: string;\n ext: string;\n name: string;\n}\n\nexport interface FormatInputPathObject {\n root?: string;\n dir?: string;\n base?: string;\n ext?: string;\n name?: string;\n}\n\n/**\n * Normalize a path\n */\nfunction normalizePath(path: string, isWin: boolean): string {\n if (path.length === 0) return '.';\n\n const separator = getSeparator(isWin);\n const isAbsolute = isWin ? isAbsoluteWin(path) : isAbsolutePosix(path);\n const trailingSeparator = path[path.length - 1] === separator || (isWin && path[path.length - 1] === '/');\n\n // Normalize slashes\n let normalized = path.replace(isWin ? /[\\/\\\\]+/g : /\\/+/g, separator);\n\n // Split path\n const parts = normalized.split(separator);\n const result: string[] = [];\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n\n if (part === '' || part === '.') {\n if (i === 0 && isAbsolute) result.push('');\n continue;\n }\n\n if (part === '..') {\n if (result.length > 0 && result[result.length - 1] !== '..') {\n if (!(result.length === 1 && result[0] === '')) {\n result.pop();\n }\n } else if (!isAbsolute) {\n result.push('..');\n }\n } else {\n result.push(part);\n }\n }\n\n let final = result.join(separator);\n\n if (final.length === 0) {\n return isAbsolute ? separator : '.';\n }\n\n if (trailingSeparator && final[final.length - 1] !== separator) {\n final += separator;\n }\n\n return final;\n}\n\n/**\n * Join paths\n */\nfunction joinPaths(paths: string[], isWin: boolean): string {\n if (paths.length === 0) return '.';\n\n const separator = getSeparator(isWin);\n let joined = '';\n for (let i = 0; i < paths.length; i++) {\n const path = paths[i];\n if (path && path.length > 0) {\n if (joined.length === 0) {\n joined = path;\n } else {\n joined += separator + path;\n }\n }\n }\n\n if (joined.length === 0) return '.';\n\n return normalizePath(joined, isWin);\n}\n\n/**\n * Resolve paths to absolute path\n */\nfunction resolvePaths(paths: string[], isWin: boolean): string {\n const separator = getSeparator(isWin);\n let resolved = '';\n let isAbsolute = false;\n\n for (let i = paths.length - 1; i >= 0 && !isAbsolute; i--) {\n const path = paths[i];\n if (path && path.length > 0) {\n resolved = path + (resolved.length > 0 ? separator + resolved : '');\n isAbsolute = isWin ? isAbsoluteWin(resolved) : isAbsolutePosix(resolved);\n }\n }\n\n if (!isAbsolute) {\n const cwd = getCwd();\n resolved = cwd + (resolved.length > 0 ? separator + resolved : '');\n }\n\n return normalizePath(resolved, isWin);\n}\n\n/**\n * Get relative path\n */\nfunction relativePath(from: string, to: string, isWin: boolean): string {\n from = resolvePaths([from], isWin);\n to = resolvePaths([to], isWin);\n\n if (from === to) return '';\n\n const separator = getSeparator(isWin);\n const fromParts = from.split(separator).filter(p => p.length > 0);\n const toParts = to.split(separator).filter(p => p.length > 0);\n\n let commonLength = 0;\n const minLength = Math.min(fromParts.length, toParts.length);\n\n for (let i = 0; i < minLength; i++) {\n if (fromParts[i] === toParts[i]) {\n commonLength++;\n } else {\n break;\n }\n }\n\n const upCount = fromParts.length - commonLength;\n const result: string[] = [];\n\n for (let i = 0; i < upCount; i++) {\n result.push('..');\n }\n\n for (let i = commonLength; i < toParts.length; i++) {\n result.push(toParts[i]);\n }\n\n return result.join(separator) || '.';\n}\n\n/**\n * Get directory name\n */\nfunction getDirname(path: string, isWin: boolean): string {\n if (path.length === 0) return '.';\n\n const separator = getSeparator(isWin);\n const normalized = normalizePath(path, isWin);\n const lastSepIndex = normalized.lastIndexOf(separator);\n\n if (lastSepIndex === -1) return '.';\n if (lastSepIndex === 0) return separator;\n\n return normalized.slice(0, lastSepIndex);\n}\n\n/**\n * Get base name\n */\nfunction getBasename(path: string, ext?: string, isWin?: boolean): string {\n if (path.length === 0) return '';\n\n const lastSepIndex = isWin ? findLastSeparator(path) : path.lastIndexOf('/');\n let base = lastSepIndex === -1 ? path : path.slice(lastSepIndex + 1);\n\n if (ext && base.endsWith(ext)) {\n base = base.slice(0, base.length - ext.length);\n }\n\n return base;\n}\n\n/**\n * Get extension name\n */\nfunction getExtname(path: string): string {\n const lastDotIndex = path.lastIndexOf('.');\n const lastSepIndex = findLastSeparator(path);\n\n if (lastDotIndex === -1 || lastDotIndex < lastSepIndex || lastDotIndex === path.length - 1) {\n return '';\n }\n\n return path.slice(lastDotIndex);\n}\n\n/**\n * Parse path into components\n */\nfunction parsePath(path: string, isWin: boolean): ParsedPath {\n let root = '';\n if (isWin) {\n // Check for Windows drive letter\n if (path.length >= 2 && path[1] === ':') {\n root = path.slice(0, 2);\n if (path.length > 2 && (path[2] === '\\\\' || path[2] === '/')) {\n root += '\\\\';\n }\n } else if (path[0] === '\\\\' || path[0] === '/') {\n root = '\\\\';\n }\n } else {\n if (path[0] === '/') {\n root = '/';\n }\n }\n\n const dir = getDirname(path, isWin);\n const base = getBasename(path, undefined, isWin);\n const ext = getExtname(path);\n const name = ext ? base.slice(0, base.length - ext.length) : base;\n\n return { root, dir, base, ext, name };\n}\n\n/**\n * Format path from components\n */\nfunction formatPath(pathObject: FormatInputPathObject, isWin: boolean): string {\n const separator = getSeparator(isWin);\n const dir = pathObject.dir || pathObject.root || '';\n const base = pathObject.base || ((pathObject.name || '') + (pathObject.ext || ''));\n\n if (!dir) return base;\n if (dir === pathObject.root) return dir + base;\n\n return dir + separator + base;\n}\n\n/**\n * Normalize a path (platform-specific)\n */\nexport function normalize(path: string): string {\n return normalizePath(path, isWindows);\n}\n\n/**\n * Join paths (platform-specific)\n */\nexport function join(...paths: string[]): string {\n return joinPaths(paths, isWindows);\n}\n\n/**\n * Resolve paths to absolute path (platform-specific)\n */\nexport function resolve(...paths: string[]): string {\n return resolvePaths(paths, isWindows);\n}\n\n/**\n * Check if path is absolute (platform-specific)\n */\nexport function isAbsolute(path: string): boolean {\n return isWindows ? win32.isAbsolute(path) : posix.isAbsolute(path);\n}\n\n/**\n * Get relative path (platform-specific)\n */\nexport function relative(from: string, to: string): string {\n return relativePath(from, to, isWindows);\n}\n\n/**\n * Get directory name (platform-specific)\n */\nexport function dirname(path: string): string {\n return getDirname(path, isWindows);\n}\n\n/**\n * Get base name (platform-specific)\n */\nexport function basename(path: string, ext?: string): string {\n return getBasename(path, ext, isWindows);\n}\n\n/**\n * Get extension name\n */\nexport function extname(path: string): string {\n return getExtname(path);\n}\n\n/**\n * Parse path into components (platform-specific)\n */\nexport function parse(path: string): ParsedPath {\n return parsePath(path, isWindows);\n}\n\n/**\n * Format path from components (platform-specific)\n */\nexport function format(pathObject: FormatInputPathObject): string {\n return formatPath(pathObject, isWindows);\n}\n\n/**\n * Convert to namespaced path (Windows only)\n */\nexport function toNamespacedPath(path: string): string {\n if (!isWindows || path.length === 0) return path;\n\n const resolved = resolve(path);\n\n if (resolved.length >= 3) {\n if (resolved[0] === '\\\\') {\n // UNC path\n if (resolved[1] === '\\\\' && resolved[2] !== '?') {\n return '\\\\\\\\?\\\\UNC\\\\' + resolved.slice(2);\n }\n } else if (resolved[1] === ':' && resolved[2] === '\\\\') {\n // Drive letter\n return '\\\\\\\\?\\\\' + resolved;\n }\n }\n\n return path;\n}\n\n/**\n * Get current runtime\n */\nexport function getRuntime(): 'node' | 'bun' | 'deno' {\n return runtime;\n}\n\n/**\n * Export POSIX and Win32 implementations\n */\nexport { posix, win32 };\n\n/**\n * Default export\n */\nexport default {\n sep,\n delimiter,\n normalize,\n join,\n resolve,\n isAbsolute,\n relative,\n dirname,\n basename,\n extname,\n parse,\n format,\n toNamespacedPath,\n posix,\n win32,\n getRuntime,\n};\n"],"mappings":"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","names":["filePath","relativePath"]}