@cementic/cementic-test 0.2.16 → 0.2.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/README.md +18 -2
- package/dist/capture.js +1 -1
- package/dist/{chunk-WUGSOKKY.js → chunk-GSQCM62X.js} +20 -6
- package/dist/chunk-GSQCM62X.js.map +1 -0
- package/dist/{chunk-PYKYHIO3.js → chunk-P6WZO7G7.js} +304 -28
- package/dist/chunk-P6WZO7G7.js.map +1 -0
- package/dist/cli.js +62 -19
- package/dist/cli.js.map +1 -1
- package/dist/gen-25TCUBSD.js +12 -0
- package/package.json +1 -1
- package/dist/chunk-PYKYHIO3.js.map +0 -1
- package/dist/chunk-WUGSOKKY.js.map +0 -1
- package/dist/gen-WYG3JOGJ.js +0 -10
- /package/dist/{gen-WYG3JOGJ.js.map → gen-25TCUBSD.js.map} +0 -0
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/gen.ts"],"sourcesContent":["import { Command } from 'commander';\nimport fg from 'fast-glob';\nimport { readFileSync, mkdirSync, writeFileSync, existsSync } from 'node:fs';\nimport { join, basename, relative, resolve } from 'node:path';\n\ntype NormalizedCase = {\n id?: string;\n title: string;\n tags?: string[];\n steps?: string[];\n step_hints?: Array<{ selector?: string }>;\n expected?: string[];\n assertion_hints?: Array<{ playwright?: string }>;\n needs_review?: boolean;\n review_reasons?: string[];\n source?: string;\n url?: string;\n};\n\ntype VarsOverrideMap = Map<string, string>;\n\ntype StepBinding = {\n kind: 'fill' | 'select';\n rawField?: string;\n fieldLabel?: string;\n value?: string;\n};\n\ntype StepVar = {\n envKey: string;\n constName: string;\n fallback: string;\n selectorHint?: string;\n selectorTarget?: string;\n fieldLabel?: string;\n};\n\ntype StepValueState = {\n declarations: StepVar[];\n byStepIndex: Map<number, StepVar>;\n fillValueBySelector: Map<string, string>;\n};\n\nfunction escapeForSingleQuotedString(value: string): string {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n}\n\nfunction escapeForRegex(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\\\/]/g, '\\\\$&');\n}\n\nfunction normalizeUrlForComparison(value?: string): string | undefined {\n if (!value) return undefined;\n try {\n return new URL(value).toString().replace(/\\/$/, '');\n } catch {\n return value.trim().replace(/\\/$/, '');\n }\n}\n\nfunction urlPatternFromAbsoluteUrl(value?: string): string | undefined {\n if (!value) return undefined;\n try {\n const parsed = new URL(value);\n const normalizedPath = `${parsed.pathname}${parsed.search}`.replace(/\\/$/, '') || '/';\n if (normalizedPath === '/') return '\\\\/';\n return normalizedPath.replace(/^\\/+/, '').split('/').map(escapeForRegex).join('\\\\/');\n } catch {\n return undefined;\n }\n}\n\nfunction pageNameToUrlPattern(value: string): string | undefined {\n const cleaned = value\n .replace(/\\b(the|a|an|user)\\b/gi, ' ')\n .replace(/\\b(page|screen)\\b/gi, ' ')\n .trim();\n const tokens = cleaned.split(/[\\s/-]+/).map(token => token.trim()).filter(Boolean);\n if (tokens.length === 0) return undefined;\n return tokens.map(token => escapeForRegex(token.toLowerCase())).join('[-_\\\\/]?');\n}\n\nfunction fieldNameFromSentence(value: string): string | undefined {\n const match =\n value.match(/\\bfor\\s+([a-zA-Z][a-zA-Z\\s-]{0,30}?)\\s+field\\b/i) ??\n value.match(/\\b([a-zA-Z][a-zA-Z\\s-]{0,30}?)\\s+field\\b/i) ??\n value.match(/\\b([a-zA-Z][a-zA-Z\\s-]{0,30}?)\\s+input\\b/i);\n return match?.[1]?.trim();\n}\n\nfunction visibleTextRegexFromPhrase(value: string): string {\n const cleaned = value\n .replace(/[\"']/g, '')\n .replace(/\\b(the|a|an|user|should|must|is|are|be|visible|shown|showing|displayed|present|appears?|rendered)\\b/gi, ' ')\n .replace(/\\b(message|text|content|heading|label)\\b/gi, ' ')\n .trim();\n const tokens = cleaned.split(/\\s+/).filter(Boolean);\n if (tokens.length === 0) return '.+';\n return tokens.map(token => escapeForRegex(token)).join('\\\\s+');\n}\n\nfunction sanitizeEnvSegment(value: string): string {\n return value\n .toUpperCase()\n .replace(/[^A-Z0-9]+/g, '_')\n .replace(/_+/g, '_')\n .replace(/^_|_$/g, '');\n}\n\nfunction normalizeOverrideKey(value: string): string {\n return sanitizeEnvSegment(value.replace(/^CT_VAR_/i, ''));\n}\n\nfunction cleanFieldLabel(value?: string): string | undefined {\n if (!value) return undefined;\n const cleaned = value\n .replace(/[.?!,:;]+$/g, '')\n .replace(/^(?:the|a|an)\\s+/i, '')\n .replace(/\\s+(?:field|input|box|area|dropdown|combobox|select|menu)\\b/gi, '')\n .trim();\n return cleaned || undefined;\n}\n\nfunction isPositionalFieldReference(value?: string): boolean {\n if (!value) return false;\n const cleaned = value.trim().toLowerCase();\n return /^(?:(?:the|a|an)\\s+)?(?:first|second|third|fourth|fifth|sixth|seventh|eighth|ninth|tenth|\\d+(?:st|nd|rd|th)?)(?:\\s+\\w+){0,2}\\s+(?:field|input|box|area|dropdown|combobox|select|menu)$/.test(cleaned);\n}\n\nfunction fieldNameToEnvSuffix(value?: string): string | undefined {\n if (!value || isPositionalFieldReference(value)) return undefined;\n const cleaned = value\n .replace(/[.?!,:;]+$/g, '')\n .replace(/^(?:the|a|an)\\s+/i, '')\n .replace(/\\b(?:field|input|box|area|dropdown|combobox|select|menu)\\b/gi, ' ')\n .trim();\n const suffix = sanitizeEnvSegment(cleaned);\n if (!suffix) return undefined;\n if (/^(?:FIELD|INPUT|BOX|AREA|DROPDOWN|COMBOBOX|SELECT|MENU)$/.test(suffix)) return undefined;\n return suffix;\n}\n\nfunction normalizeSelectorTarget(value?: string): string | undefined {\n if (!value) return undefined;\n const trimmed = value.trim();\n if (!trimmed) return undefined;\n return trimmed.replace(/^page\\./, '').replace(/\\s+/g, ' ');\n}\n\nfunction parseQuotedLiteral(value?: string): string | undefined {\n if (!value) return undefined;\n const trimmed = value.trim();\n if (trimmed.length < 2) return undefined;\n\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n try {\n return JSON.parse(trimmed);\n } catch {\n return trimmed.slice(1, -1);\n }\n }\n\n if (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\")) {\n return trimmed\n .slice(1, -1)\n .replace(/\\\\\\\\/g, '\\\\')\n .replace(/\\\\'/g, \"'\");\n }\n\n return undefined;\n}\n\nfunction unwrapStepValue(value?: string): string | undefined {\n if (!value) return undefined;\n const trimmed = value.trim();\n if (!trimmed) return undefined;\n\n const quoted = parseQuotedLiteral(trimmed);\n if (quoted !== undefined) return quoted;\n\n const inlineCode = trimmed.match(/^`([^`]+)`$/);\n if (inlineCode) return inlineCode[1].trim();\n\n return trimmed;\n}\n\nfunction selectorTargetToEnvSuffix(value?: string): string | undefined {\n const selector = normalizeSelectorTarget(value);\n if (!selector) return undefined;\n\n const quotedArg = (pattern: RegExp, group = 2): string | undefined => {\n const match = selector.match(pattern);\n return match?.[group]?.trim();\n };\n\n const locatorArg = quotedArg(/^(?:locator)\\((['\"])(.*?)\\1\\)/i);\n if (locatorArg) {\n const idMatch = locatorArg.match(/#([A-Za-z][\\w-]*)/);\n if (idMatch) return sanitizeEnvSegment(idMatch[1]);\n\n const attrMatch = locatorArg.match(/\\[(?:name|id|data-testid|aria-label)=['\"]?([^'\"\\]]+)['\"]?\\]/i);\n if (attrMatch) return sanitizeEnvSegment(attrMatch[1]);\n\n const classMatch = locatorArg.match(/\\.([A-Za-z][\\w-]*)/);\n if (classMatch) return sanitizeEnvSegment(classMatch[1]);\n\n return sanitizeEnvSegment(locatorArg.replace(/^[#.]+/, ''));\n }\n\n const labelArg =\n quotedArg(/^(?:getByLabel|getByPlaceholder|getByTestId|getByText)\\((['\"])(.*?)\\1/i) ??\n quotedArg(/^getByRole\\((['\"])(?:textbox|searchbox|combobox|spinbutton)\\1,\\s*\\{\\s*name:\\s*(['\"])(.*?)\\2/i, 3);\n if (labelArg) return fieldNameToEnvSuffix(labelArg) ?? sanitizeEnvSegment(labelArg);\n\n return undefined;\n}\n\nfunction isGenericFallbackValue(value?: string): boolean {\n if (!value) return true;\n return /^(?:value|text|input|option|selection|selected value|default)$/i.test(value.trim());\n}\n\nfunction extractCtVarTemplate(value?: string): string | undefined {\n const match = unwrapStepValue(value)?.match(/^\\$\\{(CT_VAR_[A-Z0-9_]+)\\}$/);\n return match?.[1];\n}\n\nfunction placeholderTokenFromSuffix(value?: string): string {\n const cleaned = value?.trim().replace(/^CT_VAR_/, '');\n if (!cleaned) return 'input';\n return cleaned.toLowerCase().replace(/_+/g, '-');\n}\n\nfunction inferFieldToken(rawField?: string, fieldLabel?: string, selectorTarget?: string): string {\n const suffix =\n fieldNameToEnvSuffix(rawField) ??\n fieldNameToEnvSuffix(fieldLabel) ??\n selectorTargetToEnvSuffix(selectorTarget);\n return placeholderTokenFromSuffix(suffix);\n}\n\nfunction buildFillPlaceholder(\n rawField?: string,\n fieldLabel?: string,\n selectorTarget?: string,\n): string {\n return `test-${inferFieldToken(rawField, fieldLabel, selectorTarget)}`;\n}\n\nfunction resolveLiteralFillValue(binding: StepBinding, selectorTarget?: string): string {\n const rawValue = binding.value?.trim();\n if (rawValue && !isGenericFallbackValue(rawValue) && !extractCtVarTemplate(rawValue)) {\n return rawValue;\n }\n return buildFillPlaceholder(binding.rawField, binding.fieldLabel, selectorTarget);\n}\n\nfunction exampleValueForEnvKey(envKey: string): string {\n return `your-${placeholderTokenFromSuffix(envKey)}`;\n}\n\nfunction parseStepBinding(step: string): StepBinding | undefined {\n const s = step.trim();\n\n const fillMatch = s.match(/\\b(?:fill|input|write)\\s+(?:in\\s+)?(.+?)\\s+with\\s+(['\"])(.*?)\\2/i);\n if (fillMatch) {\n return {\n kind: 'fill',\n rawField: fillMatch[1].trim(),\n fieldLabel: cleanFieldLabel(fillMatch[1]),\n value: unwrapStepValue(fillMatch[3]),\n };\n }\n\n const fillLooseMatch = s.match(/\\b(?:fill|input|write)\\s+(?:in\\s+)?(.+?)\\s+with\\s+(.+)$/i);\n if (fillLooseMatch) {\n return {\n kind: 'fill',\n rawField: fillLooseMatch[1].trim(),\n fieldLabel: cleanFieldLabel(fillLooseMatch[1]),\n value: unwrapStepValue(fillLooseMatch[2]),\n };\n }\n\n const fillWithoutValueMatch = s.match(/\\b(?:fill|input|write)\\s+(?:in\\s+)?(.+?)$/i);\n if (fillWithoutValueMatch) {\n return {\n kind: 'fill',\n rawField: fillWithoutValueMatch[1].trim(),\n fieldLabel: cleanFieldLabel(fillWithoutValueMatch[1]),\n };\n }\n\n const enterMatch = s.match(/\\b(?:enter|type)\\s+(['\"])(.*?)\\1\\s+(?:in|into)\\s+(.+)/i);\n if (enterMatch) {\n return {\n kind: 'fill',\n rawField: enterMatch[3].trim(),\n fieldLabel: cleanFieldLabel(enterMatch[3]),\n value: unwrapStepValue(enterMatch[2]),\n };\n }\n\n const enterLooseMatch = s.match(/\\b(?:enter|type)\\s+(.+?)\\s+(?:in|into)\\s+(.+)$/i);\n if (enterLooseMatch) {\n return {\n kind: 'fill',\n rawField: enterLooseMatch[2].trim(),\n fieldLabel: cleanFieldLabel(enterLooseMatch[2]),\n value: unwrapStepValue(enterLooseMatch[1]),\n };\n }\n\n const enterWithoutValueMatch = s.match(/\\b(?:enter|type)\\s+(?:in|into)\\s+(.+)/i);\n if (enterWithoutValueMatch) {\n return {\n kind: 'fill',\n rawField: enterWithoutValueMatch[1].trim(),\n fieldLabel: cleanFieldLabel(enterWithoutValueMatch[1]),\n };\n }\n\n const selectMatch = s.match(/\\b(?:select|choose|pick)\\s+(['\"])(.*?)\\1\\s+(?:from|in|into|on)\\s+(.+)/i);\n if (selectMatch) {\n return {\n kind: 'select',\n rawField: selectMatch[3].trim(),\n fieldLabel: cleanFieldLabel(selectMatch[3]),\n value: unwrapStepValue(selectMatch[2]),\n };\n }\n\n const selectLooseMatch = s.match(/\\b(?:select|choose|pick)\\s+(.+?)\\s+(?:from|in|into|on)\\s+(.+)$/i);\n if (selectLooseMatch) {\n return {\n kind: 'select',\n rawField: selectLooseMatch[2].trim(),\n fieldLabel: cleanFieldLabel(selectLooseMatch[2]),\n value: unwrapStepValue(selectLooseMatch[1]),\n };\n }\n\n const selectWithoutValueMatch = s.match(/\\b(?:select|choose|pick)\\s+(.+?)\\s+(?:dropdown|combobox|select|menu)\\b/i);\n if (selectWithoutValueMatch) {\n return {\n kind: 'select',\n rawField: selectWithoutValueMatch[1].trim(),\n fieldLabel: cleanFieldLabel(selectWithoutValueMatch[1]),\n };\n }\n\n return undefined;\n}\n\nfunction resolveStepVarOverride(\n overrides: VarsOverrideMap,\n envKey: string,\n keySuffix: string,\n rawField?: string,\n fieldLabel?: string,\n): string | undefined {\n const candidates = [envKey, keySuffix, rawField, fieldLabel];\n for (const candidate of candidates) {\n if (!candidate) continue;\n const normalized = normalizeOverrideKey(candidate);\n if (normalized && overrides.has(normalized)) return overrides.get(normalized);\n }\n return undefined;\n}\n\nfunction extractStepVars(\n steps: string[],\n stepHints: Array<{ selector?: string }> | undefined,\n assertionHints: Array<{ playwright?: string }> | undefined,\n overrides: VarsOverrideMap,\n): StepValueState {\n const declarations: StepVar[] = [];\n const byStepIndex = new Map<number, StepVar>();\n const fillValueBySelector = new Map<string, string>();\n const seen = new Map<string, StepVar>();\n let unnamedFillIndex = 0;\n let unnamedSelectIndex = 0;\n\n const assertionFallbacks = new Map<string, string>();\n for (const hint of assertionHints ?? []) {\n const parsed = parseValueAssertionHint(hint?.playwright);\n if (!parsed?.expected) continue;\n if (parsed.target) assertionFallbacks.set(parsed.target, parsed.expected);\n const envSuffix = selectorTargetToEnvSuffix(parsed.target);\n if (envSuffix) assertionFallbacks.set(`CT_VAR_${envSuffix}`, parsed.expected);\n }\n\n for (const [index, step] of steps.entries()) {\n const binding = parseStepBinding(step);\n if (!binding) continue;\n\n const selectorTarget = normalizeSelectorTarget(stepHints?.[index]?.selector);\n const keySuffix =\n fieldNameToEnvSuffix(binding.rawField) ??\n fieldNameToEnvSuffix(binding.fieldLabel) ??\n selectorTargetToEnvSuffix(selectorTarget) ??\n `${binding.kind === 'select' ? 'SELECT' : 'INPUT'}_${binding.kind === 'select' ? ++unnamedSelectIndex : ++unnamedFillIndex}`;\n const templateEnvKey = extractCtVarTemplate(binding.value);\n const envKey = templateEnvKey ?? `CT_VAR_${keySuffix}`;\n const assertionFallback =\n (selectorTarget ? assertionFallbacks.get(selectorTarget) : undefined) ??\n assertionFallbacks.get(envKey);\n const overrideValue = resolveStepVarOverride(overrides, envKey, keySuffix, binding.rawField, binding.fieldLabel);\n const fallbackFromBinding = binding.value?.trim();\n const hasRuntimeEnvValue = process.env[envKey] !== undefined;\n const shouldDeclareVariable =\n binding.kind === 'select' ||\n templateEnvKey !== undefined ||\n overrideValue !== undefined ||\n hasRuntimeEnvValue;\n\n let stepVar = shouldDeclareVariable ? seen.get(envKey) : undefined;\n if (shouldDeclareVariable && !stepVar) {\n const placeholderFallback =\n binding.kind === 'fill'\n ? buildFillPlaceholder(binding.rawField, binding.fieldLabel, selectorTarget)\n : assertionFallback ?? 'option';\n const fallback =\n overrideValue ??\n process.env[envKey] ??\n (templateEnvKey\n ? assertionFallback ?? placeholderFallback\n : ((!fallbackFromBinding || isGenericFallbackValue(fallbackFromBinding)) && assertionFallback\n ? assertionFallback\n : fallbackFromBinding)) ??\n placeholderFallback;\n\n stepVar = {\n envKey,\n constName: envKey,\n fallback,\n selectorHint: stepHints?.[index]?.selector,\n selectorTarget,\n fieldLabel: binding.fieldLabel,\n };\n seen.set(envKey, stepVar);\n declarations.push(stepVar);\n }\n\n if (stepVar) byStepIndex.set(index, stepVar);\n if (binding.kind === 'fill' && selectorTarget) {\n const expression = stepVar\n ? stepVar.constName\n : `'${escapeForSingleQuotedString(resolveLiteralFillValue(binding, selectorTarget))}'`;\n fillValueBySelector.set(selectorTarget, expression);\n }\n }\n\n return { declarations, byStepIndex, fillValueBySelector };\n}\n\nfunction buildVariableHeaderComment(stepVars: StepVar[]): string {\n if (stepVars.length === 0) return '';\n const exampleEntries = stepVars.map((stepVar) => `${stepVar.envKey}=${exampleValueForEnvKey(stepVar.envKey)}`);\n return [\n '// ── Test variables ────────────────────────────────────────────────────────────',\n '// Set these environment variables before running:',\n '//',\n ...stepVars.map((stepVar) => `// ${stepVar.envKey}=${exampleValueForEnvKey(stepVar.envKey)}`),\n '//',\n '// Or pass them inline:',\n `// ${exampleEntries.join(' ')} npx playwright test`,\n '// ─────────────────────────────────────────────────────────────────────────────',\n ].join('\\n');\n}\n\nfunction buildVariableDeclarations(stepVars: StepVar[]): string {\n if (stepVars.length === 0) return '';\n return [\n ' // Test variables',\n ...stepVars.map(\n stepVar =>\n ` const ${stepVar.constName} = process.env['${stepVar.envKey}'] ?? '${escapeForSingleQuotedString(stepVar.fallback)}';`,\n ),\n '',\n ].join('\\n');\n}\n\nfunction parseVarsOverride(raw?: string): VarsOverrideMap {\n if (!raw) return new Map();\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n console.error('❌ --vars must be a valid JSON object');\n process.exit(1);\n }\n\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n console.error('❌ --vars must be a valid JSON object');\n process.exit(1);\n }\n\n const overrides = new Map<string, string>();\n for (const [key, value] of Object.entries(parsed)) {\n const normalizedKey = normalizeOverrideKey(key);\n if (!normalizedKey) continue;\n overrides.set(normalizedKey, String(value));\n }\n return overrides;\n}\n\n// ─── Step → Playwright action ─────────────────────────────────────────────────\n\nfunction ensureStatement(value: string): string {\n const trimmed = value.trim();\n if (!trimmed) return trimmed;\n return trimmed.endsWith(';') ? trimmed : `${trimmed};`;\n}\n\nfunction phraseToRegexPattern(value: string): string {\n return value\n .trim()\n .split(/\\s+/)\n .filter(Boolean)\n .map(token => escapeForRegex(token))\n .join('\\\\s+');\n}\n\nfunction buttonNameExpressionFromStep(step: string): string {\n const quotedMatch = step.match(/[\"']([^\"']+)[\"']/);\n if (quotedMatch) return `'${escapeForSingleQuotedString(quotedMatch[1])}'`;\n\n const label = step\n .replace(/^(click|press|tap)\\s+(?:on\\s+)?(?:the\\s+)?/i, '')\n .replace(/\\b(button|btn)\\b/gi, '')\n .replace(/[.?!,:;]+$/g, '')\n .trim();\n if (!label) return `'button'`;\n\n const lowered = label.toLowerCase();\n const variants = new Set<string>();\n if (/\\b(?:login|log in|sign in|sign-in)\\b/.test(lowered)) {\n variants.add('login');\n variants.add('log in');\n variants.add('sign in');\n } else if (/\\b(?:register|sign up|sign-up|signup|create account)\\b/.test(lowered)) {\n variants.add('register');\n variants.add('sign up');\n variants.add('create account');\n } else if (/\\bcontinue\\b/.test(lowered)) {\n variants.add('continue');\n variants.add('next');\n } else {\n variants.add(label);\n }\n\n const pattern = Array.from(variants).map(phraseToRegexPattern).join('|');\n return `/${pattern}/i`;\n}\n\nfunction parseValueAssertionHint(playwright?: string): { target?: string; expected?: string } | undefined {\n const statement = ensureStatement(String(playwright ?? '').trim());\n if (!statement) return undefined;\n\n const match = statement.match(/expect\\(([\\s\\S]+)\\)\\.toHaveValue\\(([\\s\\S]+)\\)\\s*;$/);\n if (!match) return undefined;\n\n return {\n target: normalizeSelectorTarget(match[1]),\n expected: parseQuotedLiteral(match[2]),\n };\n}\n\nfunction findFillValueExpressionForTarget(\n target: string | undefined,\n stepState: StepValueState,\n): string | undefined {\n const normalizedTarget = normalizeSelectorTarget(target);\n if (!normalizedTarget) return undefined;\n\n return stepState.fillValueBySelector.get(normalizedTarget);\n}\n\nfunction rewriteValueAssertionToUseVariable(\n playwright: string,\n stepState: StepValueState,\n): string | undefined {\n const parsed = parseValueAssertionHint(playwright);\n if (!parsed?.target) return undefined;\n\n const valueExpression = findFillValueExpressionForTarget(parsed.target, stepState);\n if (!valueExpression) return undefined;\n\n return ensureStatement(`await expect(page.${parsed.target}).toHaveValue(${valueExpression})`);\n}\n\nfunction stepToPlaywright(\n step: string,\n url?: string,\n hint?: { selector?: string },\n stepVar?: StepVar,\n): string {\n const s = step.trim();\n const hintedSelector = hint?.selector ? `page.${hint.selector}` : undefined;\n const selectorTarget = normalizeSelectorTarget(hint?.selector);\n const valueExpression = (value: string): string =>\n stepVar?.constName ?? `'${escapeForSingleQuotedString(value)}'`;\n\n // Navigate\n if (/^(navigate|go to|open|visit|load)/i.test(s)) {\n const urlMatch = s.match(/https?:\\/\\/[^\\s'\"]+/) || s.match(/[\"']([^\"']+)[\"']/);\n const dest = urlMatch?.[1] ?? urlMatch?.[0] ?? url ?? '/';\n if (\n normalizeUrlForComparison(dest) &&\n normalizeUrlForComparison(dest) === normalizeUrlForComparison(url)\n ) {\n return `// navigation handled by pomPage.goto()`;\n }\n return `await page.goto('${escapeForSingleQuotedString(dest)}');`;\n }\n\n // Fill / type / enter into a field\n // Pattern: \"Fill in <field> with '<value>'\" or \"Enter '<value>' in <field>\"\n const binding = parseStepBinding(s);\n if (binding?.kind === 'fill') {\n const fallbackValue = stepVar?.fallback ?? resolveLiteralFillValue(binding, selectorTarget);\n if (hintedSelector) return `await ${hintedSelector}.fill(${valueExpression(fallbackValue)});`;\n const field = binding.fieldLabel ?? 'field';\n return `await page.getByLabel('${escapeForSingleQuotedString(field)}').fill(${valueExpression(fallbackValue)});`;\n }\n\n // Click a button\n if (/\\bclick\\b.*(button|btn|submit|sign in|log in|login|register|continue|next|save|confirm)/i.test(s)) {\n if (hintedSelector) return `await ${hintedSelector}.click();`;\n return `await page.getByRole('button', { name: ${buttonNameExpressionFromStep(s)} }).click();`;\n }\n\n // Click a link\n if (/\\bclick\\b.*(link|anchor|nav)/i.test(s)) {\n if (hintedSelector) return `await ${hintedSelector}.click();`;\n const nameMatch = s.match(/[\"']([^\"']+)[\"']/);\n const name = nameMatch?.[1] ?? s.replace(/click\\s+(the\\s+)?/i, '').trim();\n return `await page.getByRole('link', { name: '${escapeForSingleQuotedString(name)}' }).click();`;\n }\n\n // Generic click\n if (/^(click|press|tap)\\b/i.test(s)) {\n if (hintedSelector) return `await ${hintedSelector}.click();`;\n const nameMatch = s.match(/[\"']([^\"']+)[\"']/);\n if (nameMatch) return `await page.getByText('${escapeForSingleQuotedString(nameMatch[1])}').click();`;\n const target = s.replace(/^(click|press|tap)\\s+(on\\s+)?/i, '').trim();\n return `await page.getByText('${escapeForSingleQuotedString(target)}').click();`;\n }\n\n // Select dropdown\n if (binding?.kind === 'select') {\n const fallbackValue = binding.value ?? stepVar?.fallback ?? 'option';\n if (hintedSelector) return `await ${hintedSelector}.selectOption(${valueExpression(fallbackValue)});`;\n if (binding.fieldLabel) {\n return `await page.getByLabel('${escapeForSingleQuotedString(binding.fieldLabel)}').selectOption(${valueExpression(fallbackValue)});`;\n }\n return `await page.getByRole('combobox').selectOption(${valueExpression(fallbackValue)});`;\n }\n\n // Check / uncheck\n if (/\\b(uncheck|untick|disable)\\b/i.test(s)) {\n if (hintedSelector) return `await ${hintedSelector}.uncheck();`;\n const nameMatch = s.match(/[\"']([^\"']+)[\"']/);\n const name = nameMatch?.[1] ?? s.replace(/uncheck|untick|disable/gi, '').trim();\n return `await page.getByLabel('${escapeForSingleQuotedString(name)}').uncheck();`;\n }\n if (/\\b(check|tick|enable)\\b/i.test(s)) {\n if (hintedSelector) return `await ${hintedSelector}.check();`;\n const nameMatch = s.match(/[\"']([^\"']+)[\"']/);\n const name = nameMatch?.[1] ?? s.replace(/check|tick|enable/gi, '').trim();\n return `await page.getByLabel('${escapeForSingleQuotedString(name)}').check();`;\n }\n\n // Keyboard key\n if (/press.*(enter|tab|escape|esc|space|backspace)/i.test(s)) {\n const keyMatch = s.match(/enter|tab|escape|esc|space|backspace/i);\n const key = (keyMatch?.[0] ?? 'Enter');\n return `await page.keyboard.press('${key.charAt(0).toUpperCase() + key.slice(1).toLowerCase()}');`;\n }\n\n // Reload\n if (/\\b(reload|refresh)\\b/i.test(s)) {\n return `await page.reload();`;\n }\n\n // Hover\n if (/\\bhover\\b/i.test(s)) {\n if (hintedSelector) return `await ${hintedSelector}.hover();`;\n const nameMatch = s.match(/[\"']([^\"']+)[\"']/);\n const name = nameMatch?.[1] ?? s.replace(/hover\\s+(over\\s+)?/i, '').trim();\n return `await page.getByText('${escapeForSingleQuotedString(name)}').hover();`;\n }\n\n // Scroll\n if (/\\bscroll\\b/i.test(s)) {\n return `await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight));`;\n }\n\n // Fallback — preserve the step as a comment so the file is still valid\n return `// TODO: map to Playwright action → \"${s}\"`;\n}\n\n// ─── Expected result → assertion ──────────────────────────────────────────────\n\nfunction expectedToAssertion(\n expected: string,\n norm?: NormalizedCase,\n hint?: { playwright?: string },\n stepState?: StepValueState,\n): string {\n if (hint?.playwright) {\n const rewritten = stepState ? rewriteValueAssertionToUseVariable(hint.playwright, stepState) : undefined;\n return rewritten ?? ensureStatement(hint.playwright);\n }\n const s = expected.trim();\n const fieldName = fieldNameFromSentence(s);\n const currentUrlPattern = urlPatternFromAbsoluteUrl(norm?.url);\n\n // Cleared / empty field\n if (/\\b(clear|cleared|empty|blank)\\b/i.test(s) && /\\b(field|input|value)\\b/i.test(s) && fieldName) {\n return `await expect(page.getByLabel('${escapeForSingleQuotedString(fieldName)}')).toHaveValue('');`;\n }\n\n // Stayed on the same page / did not submit\n if (/\\bform\\b.*\\b(?:does not submit|doesn't submit|not submit|not submitted)\\b/i.test(s)) {\n const fallbackPattern = currentUrlPattern || 'login';\n return `await expect(page).toHaveURL(/${fallbackPattern}/); // form did not navigate`;\n }\n if (/\\b(remains?|stays?|still)\\s+on\\b/i.test(s)) {\n const pageMatch = s.match(/\\b(?:remains?|stays?|still)\\s+on\\s+(?:the\\s+)?(.+?)(?:\\s+page|\\s+screen)?$/i);\n const pagePattern = pageMatch?.[1] ? pageNameToUrlPattern(pageMatch[1]) : undefined;\n return `await expect(page).toHaveURL(/${pagePattern || currentUrlPattern || 'login'}/);`;\n }\n\n // URL / redirect check\n if (/\\b(url|redirect(?:s|ed)?|navigate(?:s|d)?|route|path)\\b/i.test(s)) {\n const pathMatch =\n s.match(/[\"'](\\/[^\"']+)[\"']/) ??\n s.match(/to\\s+(\\/[\\w/-]+)/i) ??\n s.match(/https?:\\/\\/[^\\s'\"]+/i);\n const matchedPath = pathMatch?.[1] ?? pathMatch?.[0];\n if (matchedPath) {\n const fromUrl = matchedPath.startsWith('http') ? urlPatternFromAbsoluteUrl(matchedPath) : undefined;\n const directPath = matchedPath.startsWith('/') ? matchedPath.replace(/^\\/+/, '').split('/').map(escapeForRegex).join('\\\\/') : undefined;\n const finalPattern = fromUrl ?? directPath ?? currentUrlPattern;\n if (finalPattern !== undefined) return `await expect(page).toHaveURL(/${finalPattern}/);`;\n }\n return `await expect(page).toHaveURL(/dashboard|success|home/);`;\n }\n\n // Page title\n if (/\\bpage title\\b|\\btitle should\\b|\\bdocument title\\b/i.test(s)) {\n const titleMatch = s.match(/[\"']([^\"']+)[\"']/);\n if (titleMatch) return `await expect(page).toHaveTitle('${escapeForSingleQuotedString(titleMatch[1])}');`;\n return `await expect(page).toHaveTitle(/.+/);`;\n }\n\n // Error / validation message\n if (/\\b(error|invalid|fail|incorrect|required|validation)\\b/i.test(s)) {\n const msgMatch = s.match(/[\"']([^\"']+)[\"']/);\n if (msgMatch) return `await expect(page.getByText('${escapeForSingleQuotedString(msgMatch[1])}')).toBeVisible();`;\n if (fieldName) return `await expect(page.getByText(/${escapeForRegex(fieldName)}/i)).toBeVisible();`;\n return `await expect(page.getByRole('alert')).toBeVisible();`;\n }\n\n // Success / confirmation\n if (/\\b(success|confirm|complete|thank|welcome|sent|saved)\\b/i.test(s)) {\n const msgMatch = s.match(/[\"']([^\"']+)[\"']/);\n if (msgMatch) return `await expect(page.getByText('${escapeForSingleQuotedString(msgMatch[1])}')).toBeVisible();`;\n if (/\\bwelcome\\b/i.test(s)) return `await expect(page.getByText(/welcome/i)).toBeVisible();`;\n return `await expect(page.getByRole('status')).toBeVisible();`;\n }\n\n // Not visible / hidden\n if (/\\b(not visible|hidden|disappear|removed|gone)\\b/i.test(s)) {\n const elementMatch = s.match(/[\"']([^\"']+)[\"']/);\n if (elementMatch) return `await expect(page.getByText('${escapeForSingleQuotedString(elementMatch[1])}')).not.toBeVisible();`;\n return `await expect(page.locator('.modal, [role=\"dialog\"]').first()).not.toBeVisible();`;\n }\n\n // Visible / present\n if (/\\b(visible|appear|display|show|render|present)\\b/i.test(s)) {\n const elementMatch = s.match(/[\"']([^\"']+)[\"']/);\n if (elementMatch) return `await expect(page.getByText('${escapeForSingleQuotedString(elementMatch[1])}')).toBeVisible();`;\n const subjectMatch =\n s.match(/^(?:the\\s+)?(.+?)\\s+(?:is|are|should|must|becomes?|appears?|renders?|shows?|displays?)\\b/i) ??\n s.match(/^(?:the\\s+)?(.+?)\\s+(?:visible|present)\\b/i);\n const subject = subjectMatch?.[1]?.trim();\n if (subject) {\n if (/\\bnavigation\\b.*\\bmenu\\b|\\bmenu\\b.*\\bnavigation\\b|\\bnavigation\\b/i.test(subject)) {\n return `await expect(page.getByRole('navigation')).toBeVisible();`;\n }\n return `await expect(page.getByText(/${visibleTextRegexFromPhrase(subject)}/i)).toBeVisible();`;\n }\n return `await expect(page.locator('[data-testid]').first()).toBeVisible();`;\n }\n\n // Count of items\n if (/\\b(count|number of|list of|\\d+\\s+item)\\b/i.test(s)) {\n const countMatch = s.match(/(\\d+)/);\n if (countMatch) return `await expect(page.locator('li, tr, [role=\"listitem\"]')).toHaveCount(${countMatch[1]});`;\n return `await expect(page.locator('li, tr').first()).toBeVisible();`;\n }\n\n // Enabled / disabled\n if (/\\b(enabled|clickable|active)\\b/i.test(s)) {\n return `await expect(page.getByRole('button').first()).toBeEnabled();`;\n }\n if (/\\b(disabled|inactive)\\b/i.test(s)) {\n return `await expect(page.getByRole('button').first()).toBeDisabled();`;\n }\n\n // Input value\n if (/\\b(clear|cleared|empty|blank)\\b/i.test(s) && /\\b(field|input|value)\\b/i.test(s)) {\n return `await expect(page.getByRole('textbox').first()).toHaveValue('');`;\n }\n if (/\\b(field|input|value|filled)\\b/i.test(s)) {\n const valMatch = s.match(/[\"']([^\"']+)[\"']/);\n if (valMatch) {\n const envSuffix = fieldNameToEnvSuffix(fieldName);\n const stepVar = envSuffix ? stepState?.declarations.find(candidate => candidate.envKey === `CT_VAR_${envSuffix}`) : undefined;\n if (stepVar) return `await expect(page.getByRole('textbox').first()).toHaveValue(${stepVar.constName});`;\n return `await expect(page.getByRole('textbox').first()).toHaveValue('${escapeForSingleQuotedString(valMatch[1])}');`;\n }\n return `await expect(page.getByRole('textbox').first()).not.toBeEmpty();`;\n }\n\n // Text / heading / content (broad fallback before final fallback)\n if (/\\b(text|content|label|message|heading)\\b/i.test(s)) {\n const textMatch = s.match(/[\"']([^\"']+)[\"']/);\n if (textMatch) return `await expect(page.getByText('${escapeForSingleQuotedString(textMatch[1])}')).toBeVisible();`;\n const words = s.replace(/\\b(the|should|must|contain|display|show|have|text|content)\\b/gi, '').trim();\n return `await expect(page.getByText(/${visibleTextRegexFromPhrase(words)}/i)).toBeVisible();`;\n }\n\n // Final fallback\n const cleaned = s.replace(/[\"']/g, '').trim();\n return `await expect(page.getByText(/${visibleTextRegexFromPhrase(cleaned)}/i)).toBeVisible(); // TODO: refine assertion`;\n}\n\n// ─── POM class name / filename ────────────────────────────────────────────────\n\nfunction toIdentifier(value: string, fallback = 'Landing'): string {\n const tokens = value\n .normalize('NFKD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .split(/[^a-zA-Z0-9_]+/)\n .filter(Boolean);\n\n const identifier = tokens\n .map((token) => {\n const normalized = /^[A-Z0-9_]+$/.test(token) ? token.toLowerCase() : token;\n return normalized.charAt(0).toUpperCase() + normalized.slice(1);\n })\n .join('');\n\n if (!identifier) return fallback;\n return /^[0-9]/.test(identifier) ? `Case${identifier}` : identifier;\n}\n\nfunction derivePomClassName(norm: NormalizedCase): string {\n const raw = norm.id ?? norm.title ?? 'Landing';\n const withoutNum = raw.replace(/-\\d+$/, '');\n return `${toIdentifier(withoutNum)}Page`;\n}\n\n// ─── POM class source ─────────────────────────────────────────────────────────\n\nfunction buildPomClass(className: string, norm: NormalizedCase, lang: 'ts' | 'js'): string {\n const pageUrl = norm.url ?? '/';\n const isTs = lang === 'ts';\n\n return isTs\n ? `import { Page } from '@playwright/test';\n\nexport class ${className} {\n readonly page: Page;\n\n constructor(page: Page) {\n this.page = page;\n }\n\n async goto(): Promise<void> {\n await this.page.goto('${escapeForSingleQuotedString(pageUrl)}');\n }\n\n async waitForLoad(): Promise<void> {\n await this.page.waitForLoadState('domcontentloaded');\n }\n}\n`\n : `// @ts-check\nexport class ${className} {\n /** @param {import('@playwright/test').Page} page */\n constructor(page) {\n /** @type {import('@playwright/test').Page} */\n this.page = page;\n }\n\n async goto() {\n await this.page.goto('${escapeForSingleQuotedString(pageUrl)}');\n }\n\n async waitForLoad() {\n await this.page.waitForLoadState('domcontentloaded');\n }\n}\n`;\n}\n\n// ─── Spec file source ─────────────────────────────────────────────────────────\n\nfunction buildTestTitle(norm: NormalizedCase): string {\n const idPart = norm.id ?? '';\n\n // norm.title may already include the ID prefix (e.g. \"AUTH-001 — User can log in\")\n // Strip it to avoid \"AUTH-001 — AUTH-001 — User can log in\" in the test name.\n let cleanTitle = norm.title || 'Untitled';\n if (idPart && cleanTitle.startsWith(idPart)) {\n cleanTitle = cleanTitle.slice(idPart.length).replace(/^\\s*[—\\-–]+\\s*/, '').trim();\n }\n\n const tagSuffix = (norm.tags ?? []).map(t => `@${t}`).join(' ');\n return [idPart, cleanTitle, tagSuffix].filter(Boolean).join(' — ').trim();\n}\n\nfunction buildSpecFile(\n norm: NormalizedCase,\n pomClassName: string,\n pomImportPath: string,\n overrides: VarsOverrideMap,\n): string {\n const title = buildTestTitle(norm);\n const steps = norm.steps ?? [];\n const expected = norm.expected ?? [];\n const stepVars = extractStepVars(steps, norm.step_hints, norm.assertion_hints, overrides);\n\n let importPath = pomImportPath.replace(/\\\\/g, '/');\n if (!importPath.startsWith('.')) importPath = `./${importPath}`;\n // Strip .ts extension — TypeScript resolves without it\n importPath = importPath.replace(/\\.ts$/, '');\n\n const stepLines = steps.length\n ? steps\n .map((s, index) => ` ${stepToPlaywright(s, norm.url, norm.step_hints?.[index], stepVars.byStepIndex.get(index))}`)\n .join('\\n')\n : ' // TODO: add steps';\n\n const assertionLines = expected.length\n ? expected.map((e, index) => ` ${expectedToAssertion(e, norm, norm.assertion_hints?.[index], stepVars)}`).join('\\n')\n : ' // TODO: add assertions';\n\n const reviewNote = norm.needs_review\n ? `\\n // ⚠️ Flagged for review — steps or assertions may need manual refinement\\n`\n : '';\n const variableHeader = buildVariableHeaderComment(stepVars.declarations);\n const variableHeaderBlock = variableHeader ? `${variableHeader}\\n` : '';\n const variableDeclarations = buildVariableDeclarations(stepVars.declarations);\n\n return `import { test, expect } from '@playwright/test';\nimport { ${pomClassName} } from '${importPath}';\n\n${variableHeaderBlock}test('${title}', async ({ page }) => {${reviewNote}\n const pomPage = new ${pomClassName}(page);\n\n${variableDeclarations} // ── Setup ─────────────────────────────────────────────────────────────────\n await pomPage.goto();\n await pomPage.waitForLoad();\n\n // ── Steps ─────────────────────────────────────────────────────────────────\n${stepLines}\n\n // ── Assertions ────────────────────────────────────────────────────────────\n${assertionLines}\n});\n`;\n}\n\n// ─── Main ─────────────────────────────────────────────────────────────────────\n\nexport async function gen(opts: { lang: string; out: string; vars?: string }) {\n if (opts.lang !== 'ts' && opts.lang !== 'js') {\n console.error('❌ --lang must be ts or js');\n process.exit(1);\n }\n const lang = opts.lang as 'ts' | 'js';\n const specExt = lang === 'js' ? 'spec.js' : 'spec.ts';\n const pomExt = lang === 'js' ? '.js' : '.ts';\n const varsOverride = parseVarsOverride(opts.vars);\n\n const normalized = await fg([\n '.cementic/normalized/*.json',\n '!.cementic/normalized/_index.json',\n ]);\n\n if (normalized.length === 0) {\n console.warn('⚠️ No normalized cases found in .cementic/normalized/');\n console.warn(' Run: ct normalize ./cases');\n process.exit(1);\n }\n\n const projectRoot = process.cwd();\n const testsOutDir = resolve(projectRoot, opts.out);\n const pagesOutDir = resolve(projectRoot, 'pages');\n\n mkdirSync(testsOutDir, { recursive: true });\n mkdirSync(pagesOutDir, { recursive: true });\n\n let specCount = 0;\n let pomCount = 0;\n\n for (const f of normalized) {\n const norm = JSON.parse(readFileSync(f, 'utf8')) as NormalizedCase;\n\n const pomClassName = derivePomClassName(norm);\n const pomFileName = pomClassName + pomExt;\n const pomFilePath = join(pagesOutDir, pomFileName);\n\n // Only write a POM file if one doesn't exist yet — never overwrite user edits\n if (!existsSync(pomFilePath)) {\n writeFileSync(pomFilePath, buildPomClass(pomClassName, norm, lang));\n pomCount++;\n }\n\n // Relative import from the test file location to the POM file\n const relToPages = relative(testsOutDir, pagesOutDir);\n const pomImportPath = join(relToPages, pomFileName);\n\n const stem = basename(f).replace(/\\.json$/, '').replace(/[^\\w-]+/g, '-');\n const specPath = join(testsOutDir, `${stem}.${specExt}`);\n writeFileSync(specPath, buildSpecFile(norm, pomClassName, pomImportPath, varsOverride));\n specCount++;\n }\n\n console.log(`✅ Generated ${specCount} spec file(s) → ${opts.out}/`);\n if (pomCount > 0) {\n console.log(`✅ Generated ${pomCount} POM class file(s) → pages/`);\n }\n if (pomCount === 0 && specCount > 0) {\n console.log(`ℹ️ POM classes already exist — skipped regeneration`);\n }\n}\n\nexport function genCmd() {\n const cmd = new Command('gen')\n .description('Generate Playwright POM spec + page-object files from normalized cases')\n .addHelpText('after', `\nExamples:\n $ ct gen --lang ts\n $ ct gen --lang js --out tests/e2e\n $ ct gen --lang ts --vars '{\"email\":\"admin@example.com\"}'\n`)\n .option('--lang <lang>', 'Target language (ts|js)', 'ts')\n .option('--out <dir>', 'Output directory for spec files', 'tests/generated')\n .option('--vars <json>', 'JSON object of fallback values for generated CT_VAR_* constants')\n .action(async opts => {\n await gen({ lang: opts.lang, out: opts.out, vars: opts.vars });\n });\n return cmd;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/playwright.ts","../src/core/capture.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { createRequire } from 'node:module';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\n\ntype PlaywrightPackageName = '@playwright/test' | 'playwright-core';\n\nexport type PlaywrightResolution = {\n packageName: PlaywrightPackageName;\n resolvedPath: string;\n searchRoot: string;\n chromium: any;\n};\n\nconst require = createRequire(import.meta.url);\nconst moduleDir = dirname(fileURLToPath(import.meta.url));\n\nexport async function resolvePlaywrightChromium(cwd = process.cwd()): Promise<PlaywrightResolution> {\n const searchRoots = buildSearchRoots(cwd);\n\n for (const packageName of ['@playwright/test', 'playwright-core'] as const) {\n for (const searchRoot of searchRoots) {\n const resolvedPath = resolveFromRoot(packageName, searchRoot);\n if (!resolvedPath) continue;\n\n const imported = await import(pathToFileURL(resolvedPath).href);\n const chromium = imported.chromium ?? imported.default?.chromium;\n\n if (chromium) {\n return {\n packageName,\n resolvedPath,\n searchRoot,\n chromium,\n };\n }\n }\n }\n\n throw new Error(\n 'Playwright runtime not found in this project.\\n' +\n 'Try:\\n' +\n ' npm install\\n' +\n ' npx playwright install chromium'\n );\n}\n\nfunction buildSearchRoots(cwd: string): string[] {\n const roots = [resolve(cwd)];\n const projectRoot = findNearestProjectRoot(cwd);\n\n if (projectRoot && projectRoot !== roots[0]) {\n roots.push(projectRoot);\n }\n\n roots.push(moduleDir);\n return Array.from(new Set(roots));\n}\n\nfunction findNearestProjectRoot(startDir: string): string | undefined {\n let currentDir = resolve(startDir);\n\n while (true) {\n if (existsSync(join(currentDir, 'package.json'))) {\n return currentDir;\n }\n\n const parentDir = dirname(currentDir);\n if (parentDir === currentDir) return undefined;\n currentDir = parentDir;\n }\n}\n\nfunction resolveFromRoot(packageName: PlaywrightPackageName, searchRoot: string): string | undefined {\n try {\n return require.resolve(packageName, { paths: [searchRoot] });\n } catch {\n return undefined;\n }\n}\n","import { resolvePlaywrightChromium } from './playwright.js';\n\nexport type InputDescriptor = {\n label?: string;\n placeholder?: string;\n name?: string;\n type?: string;\n testId?: string;\n};\n\nexport type PageSummary = {\n url: string;\n title?: string;\n headings: string[];\n buttons: string[];\n links: string[];\n inputs: InputDescriptor[];\n landmarks: string[];\n rawLength: number;\n};\n\nexport type CaptureMode = 'headless' | 'headed';\nexport type CaptureConfidence = 'high' | 'medium' | 'low';\nexport type CaptureCategory = 'input' | 'button' | 'link' | 'heading' | 'status';\nexport type CaptureErrorCode = 'PLAYWRIGHT_NOT_FOUND' | 'BROWSER_NOT_INSTALLED' | 'PAGE_LOAD_FAILED' | 'CAPTURE_FAILED';\nexport type InteractiveElementRole = 'button' | 'link' | 'textbox' | 'checkbox';\n\nexport type CapturedElement = {\n category: CaptureCategory;\n role: string;\n name?: string;\n selector: string;\n selectorAlt: string[];\n purpose: string;\n confidence: CaptureConfidence;\n attributes: Record<string, unknown>;\n};\n\nexport type ElementMap = {\n url: string;\n title: string;\n timestamp: string;\n mode: CaptureMode;\n summary: {\n totalElements: number;\n byCategory: Partial<Record<CaptureCategory, number>>;\n };\n elements: CapturedElement[];\n warnings: string[];\n};\n\ntype CaptureOptions = {\n headless?: boolean;\n timeoutMs?: number;\n verbose?: boolean;\n userAgent?: string;\n};\n\ntype DomButton = {\n tag: string;\n role: InteractiveElementRole;\n text?: string;\n testId?: string;\n id?: string;\n type?: string;\n disabled: boolean;\n selector?: string | null;\n cssPath?: string | null;\n};\n\ntype DomInput = {\n tag: string;\n type: string;\n label?: string;\n placeholder?: string;\n name?: string;\n id?: string;\n testId?: string;\n required: boolean;\n selector?: string | null;\n cssPath?: string | null;\n};\n\ntype DomLink = {\n tag: string;\n role: InteractiveElementRole;\n text: string;\n href?: string;\n testId?: string;\n external: boolean;\n selector: string;\n};\n\ntype DomHeading = {\n level: string;\n text: string;\n selector: string;\n};\n\ntype DomStatusRegion = {\n role: string;\n ariaLive?: string;\n text?: string;\n selector: string;\n};\n\ntype DomForm = {\n id?: string;\n label?: string;\n action?: string;\n method: string;\n fieldCount: number;\n index: number;\n};\n\ntype DomData = {\n buttons: DomButton[];\n inputs: DomInput[];\n links: DomLink[];\n headings: DomHeading[];\n landmarks: Array<{ role: string; label: string }>;\n statusRegions: DomStatusRegion[];\n forms: DomForm[];\n pageUrl: string;\n pageTitle: string;\n};\n\ntype DomElementLike = {\n tagName: string;\n textContent?: string | null;\n previousElementSibling?: DomElementLike | null;\n getAttribute(name: string): string | null;\n hasAttribute(name: string): boolean;\n closest(selector: string): DomElementLike | null;\n querySelectorAll?(selector: string): ArrayLike<DomElementLike>;\n};\n\ntype DomDocumentLike = {\n title?: string;\n querySelector(selector: string): DomElementLike | null;\n querySelectorAll(selector: string): ArrayLike<DomElementLike>;\n getElementById(id: string): DomElementLike | null;\n};\n\ntype DomWindowLike = {\n location: {\n hostname: string;\n href: string;\n };\n};\n\nconst SETTLE_MS = 1200;\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst MAX_PER_CATEGORY = 50;\n\nexport class CaptureRuntimeError extends Error {\n code: CaptureErrorCode;\n\n constructor(code: CaptureErrorCode, message: string, options?: { cause?: unknown }) {\n super(message);\n this.name = 'CaptureRuntimeError';\n this.code = code;\n if (options?.cause !== undefined) {\n (this as Error & { cause?: unknown }).cause = options.cause;\n }\n }\n}\n\nexport function inferInteractiveRole(\n tagName: string,\n attrs: { role?: string; href?: string; type?: string } = {},\n): InteractiveElementRole | undefined {\n const tag = String(tagName ?? '').trim().toLowerCase();\n const explicitRole = String(attrs.role ?? '').trim().toLowerCase();\n const type = String(attrs.type ?? '').trim().toLowerCase();\n const href = String(attrs.href ?? '').trim();\n\n if (explicitRole === 'button') return 'button';\n if (explicitRole === 'link') return 'link';\n if (explicitRole === 'textbox') return 'textbox';\n if (explicitRole === 'checkbox') return 'checkbox';\n\n if (tag === 'a' && href) return 'link';\n if (tag === 'button') return 'button';\n if (tag === 'textarea') return 'textbox';\n if (tag === 'select') return 'textbox';\n if (tag === 'input') {\n if (type === 'submit' || type === 'button' || type === 'reset' || type === 'image') return 'button';\n if (type === 'checkbox') return 'checkbox';\n return 'textbox';\n }\n\n return undefined;\n}\n\nexport async function captureElements(url: string, options: CaptureOptions = {}): Promise<ElementMap> {\n const {\n headless = true,\n timeoutMs = DEFAULT_TIMEOUT_MS,\n verbose = false,\n userAgent = 'Mozilla/5.0 (compatible; CementicTest/0.2.16 capture)',\n } = options;\n\n const chromium = await loadChromium();\n const mode: CaptureMode = headless ? 'headless' : 'headed';\n log(verbose, `\\n[capture] Starting ${mode} capture: ${url}`);\n\n let browser: any;\n\n try {\n browser = await chromium.launch({\n headless,\n slowMo: headless ? 0 : 150,\n });\n } catch (error: any) {\n throw classifyCaptureError(error);\n }\n\n const context = await browser.newContext({\n userAgent,\n viewport: { width: 1280, height: 800 },\n ignoreHTTPSErrors: true,\n });\n\n const page = await context.newPage();\n\n try {\n log(verbose, ` -> Navigating (timeout: ${timeoutMs}ms)`);\n try {\n await page.goto(url, {\n waitUntil: 'domcontentloaded',\n timeout: timeoutMs,\n });\n } catch (error: any) {\n throw new CaptureRuntimeError(\n 'PAGE_LOAD_FAILED',\n `Page load failed for ${url}. ${error?.message ?? error}`,\n { cause: error },\n );\n }\n\n log(verbose, ` -> Waiting ${SETTLE_MS}ms for page settle`);\n await page.waitForTimeout(SETTLE_MS);\n\n log(verbose, ' -> Extracting accessibility snapshot');\n const a11ySnapshot = await getAccessibilitySnapshot(page, verbose);\n\n log(verbose, ' -> Extracting DOM data');\n const domData = await page.evaluate(extractDomData);\n\n const title = await page.title();\n const finalUrl = page.url();\n const elements = buildElementMap(domData);\n const warnings = buildWarnings(elements, domData, a11ySnapshot);\n const byCategory: Partial<Record<CaptureCategory, number>> = {};\n\n for (const element of elements) {\n byCategory[element.category] = (byCategory[element.category] ?? 0) + 1;\n }\n\n const result: ElementMap = {\n url: finalUrl,\n title,\n timestamp: new Date().toISOString(),\n mode,\n summary: {\n totalElements: elements.length,\n byCategory,\n },\n elements,\n warnings,\n };\n\n log(verbose, ` -> Captured ${elements.length} testable elements from \"${title}\"`);\n return result;\n } catch (error: any) {\n throw classifyCaptureError(error);\n } finally {\n await browser?.close();\n }\n}\n\nexport function toPageSummary(elementMap: ElementMap): PageSummary {\n const inputs = elementMap.elements\n .filter((element): element is CapturedElement => element.category === 'input')\n .slice(0, 30)\n .map((element) => ({\n label: asString(element.attributes.label),\n placeholder: asString(element.attributes.placeholder),\n name: asString(element.attributes.name),\n type: asString(element.attributes.type),\n testId: asString(element.attributes.testId),\n }));\n\n return {\n url: elementMap.url,\n title: elementMap.title,\n headings: elementMap.elements\n .filter((element) => element.category === 'heading')\n .map((element) => element.name ?? '')\n .filter(Boolean)\n .slice(0, 20),\n buttons: elementMap.elements\n .filter((element) => element.category === 'button')\n .map((element) => element.name ?? '')\n .filter(Boolean)\n .slice(0, 30),\n links: elementMap.elements\n .filter((element) => element.category === 'link')\n .map((element) => element.name ?? '')\n .filter(Boolean)\n .slice(0, 50),\n inputs,\n landmarks: [],\n rawLength: elementMap.elements.length,\n };\n}\n\nasync function loadChromium(): Promise<any> {\n try {\n const resolution = await resolvePlaywrightChromium(process.cwd());\n return resolution.chromium;\n } catch (error: any) {\n throw new CaptureRuntimeError(\n 'PLAYWRIGHT_NOT_FOUND',\n error?.message ??\n 'Playwright runtime not found in this project.\\nTry:\\n npm install\\n npx playwright install chromium',\n { cause: error },\n );\n }\n}\n\nexport function extractDomDataFromEnvironment(doc: DomDocumentLike, win: DomWindowLike): DomData {\n const localMaxPerCategory = 50;\n const attr = (el: DomElementLike, name: string): string | undefined => el.getAttribute(name)?.trim() || undefined;\n const text = (el: DomElementLike | null): string | undefined => el?.textContent?.replace(/\\s+/g, ' ').trim() || undefined;\n const jsString = (value: string) => JSON.stringify(value);\n const semanticRole = (el: DomElementLike): InteractiveElementRole | undefined => inferInteractiveRole(el.tagName, {\n role: attr(el, 'role'),\n href: attr(el, 'href'),\n type: attr(el, 'type'),\n });\n\n const findLabel = (el: DomElementLike): string | undefined => {\n const id = attr(el, 'id');\n\n if (id) {\n const labelEl = doc.querySelector(`label[for=\"${id}\"]`);\n if (labelEl) return text(labelEl);\n }\n\n const ariaLabel = attr(el, 'aria-label');\n if (ariaLabel) return ariaLabel;\n\n const labelledBy = attr(el, 'aria-labelledby');\n if (labelledBy) {\n const labelEl = doc.getElementById(labelledBy);\n if (labelEl) return text(labelEl);\n }\n\n const closestLabel = el.closest('label');\n if (closestLabel) {\n const raw = text(closestLabel) || '';\n const placeholder = attr(el, 'placeholder') || '';\n return raw.replace(placeholder, '').trim() || undefined;\n }\n\n const previous = el.previousElementSibling;\n if (previous?.tagName === 'LABEL') return text(previous);\n\n return undefined;\n };\n\n const buildSelector = (el: DomElementLike, labelText?: string, buttonText?: string): string | null => {\n const testId = attr(el, 'data-testid');\n if (testId) return `getByTestId(${jsString(testId)})`;\n\n const id = attr(el, 'id');\n if (id && !id.match(/^(ember|react|vue|ng|auto|rand)/i)) {\n return `locator(${jsString(`#${id}`)})`;\n }\n\n const ariaLabel = attr(el, 'aria-label');\n if (ariaLabel) {\n const role = semanticRole(el);\n if (role === 'textbox') return `getByLabel(${jsString(ariaLabel)})`;\n if (role) {\n return `getByRole(${jsString(role)}, { name: ${jsString(ariaLabel)} })`;\n }\n }\n\n if (labelText) {\n const tag = el.tagName.toLowerCase();\n if (tag === 'input' || tag === 'textarea' || tag === 'select') {\n return `getByLabel(${jsString(labelText)})`;\n }\n }\n\n if (buttonText) {\n const role = semanticRole(el);\n if (role === 'button' || role === 'link') {\n return `getByRole(${jsString(role)}, { name: ${jsString(buttonText)} })`;\n }\n }\n\n const name = attr(el, 'name');\n if (name) return `locator(${jsString(`[name=\"${name}\"]`)})`;\n\n return null;\n };\n\n const buttons: DomButton[] = [];\n Array.from(doc.querySelectorAll('button, [role=\"button\"], input[type=\"submit\"], input[type=\"button\"]')).forEach((el) => {\n const role = semanticRole(el);\n if (role !== 'button') return;\n const buttonText = attr(el, 'aria-label') || text(el) || attr(el, 'value');\n const testId = attr(el, 'data-testid');\n const id = attr(el, 'id');\n const type = attr(el, 'type');\n const disabled = el.hasAttribute('disabled') || el.getAttribute('aria-disabled') === 'true';\n const selector = buildSelector(el, undefined, buttonText);\n\n if (buttonText || testId) {\n buttons.push({\n tag: el.tagName.toLowerCase(),\n role,\n text: buttonText,\n testId,\n id,\n type,\n disabled,\n selector,\n cssPath: testId ? `[data-testid=\"${testId}\"]` : (id ? `#${id}` : null),\n });\n }\n });\n\n const inputs: DomInput[] = [];\n Array.from(doc.querySelectorAll('input:not([type=\"hidden\"]):not([type=\"submit\"]):not([type=\"button\"]), textarea, select')).forEach((el) => {\n const label = findLabel(el);\n const placeholder = attr(el, 'placeholder');\n const name = attr(el, 'name');\n const id = attr(el, 'id');\n const type = attr(el, 'type') || el.tagName.toLowerCase();\n const testId = attr(el, 'data-testid');\n const required = el.hasAttribute('required');\n const selector = buildSelector(el, label);\n\n if (label || placeholder || name || testId || id) {\n inputs.push({\n tag: el.tagName.toLowerCase(),\n type,\n label,\n placeholder,\n name,\n id,\n testId,\n required,\n selector,\n cssPath: testId ? `[data-testid=\"${testId}\"]` : (id ? `#${id}` : (name ? `[name=\"${name}\"]` : null)),\n });\n }\n });\n\n const links: DomLink[] = [];\n Array.from(doc.querySelectorAll('a[href]')).forEach((el) => {\n const role = semanticRole(el);\n if (role !== 'link') return;\n const linkText = attr(el, 'aria-label') || text(el);\n const href = attr(el, 'href');\n const testId = attr(el, 'data-testid');\n\n if (!linkText || href === '#') return;\n\n links.push({\n tag: el.tagName.toLowerCase(),\n role,\n text: linkText,\n href,\n testId,\n external: Boolean(href?.startsWith('http') && !href.includes(win.location.hostname)),\n selector: testId\n ? `getByTestId(${jsString(testId)})`\n : `getByRole('link', { name: ${jsString(linkText)} })`,\n });\n });\n\n const headings: DomHeading[] = [];\n Array.from(doc.querySelectorAll('h1, h2, h3')).forEach((el) => {\n const headingText = text(el);\n if (headingText) {\n headings.push({\n level: el.tagName.toLowerCase(),\n text: headingText,\n selector: `getByRole('heading', { name: ${jsString(headingText)} })`,\n });\n }\n });\n\n const landmarks: Array<{ role: string; label: string }> = [];\n Array.from(doc.querySelectorAll('[role], main, nav, header, footer, aside, section[aria-label]')).forEach((el) => {\n const role = attr(el, 'role') || el.tagName.toLowerCase();\n const label = attr(el, 'aria-label') || text(el)?.slice(0, 40);\n if (role && label) landmarks.push({ role, label });\n });\n\n const statusRegions: DomStatusRegion[] = [];\n Array.from(doc.querySelectorAll('[role=\"alert\"], [role=\"status\"], [aria-live]')).forEach((el) => {\n const role = attr(el, 'role') || 'live';\n statusRegions.push({\n role,\n ariaLive: attr(el, 'aria-live'),\n text: text(el),\n selector: el.getAttribute('role')\n ? `getByRole(${jsString(role)})`\n : `locator('[aria-live]')`,\n });\n });\n\n const forms: DomForm[] = [];\n Array.from(doc.querySelectorAll('form')).forEach((form, index) => {\n forms.push({\n id: attr(form, 'id'),\n label: attr(form, 'aria-label') || attr(form, 'aria-labelledby'),\n action: attr(form, 'action'),\n method: attr(form, 'method') || 'get',\n fieldCount: Array.from(form.querySelectorAll?.('input, textarea, select') ?? []).length,\n index,\n });\n });\n\n return {\n buttons: buttons.slice(0, localMaxPerCategory),\n inputs: inputs.slice(0, localMaxPerCategory),\n links: links.slice(0, localMaxPerCategory),\n headings: headings.slice(0, 20),\n landmarks,\n statusRegions,\n forms,\n pageUrl: win.location.href,\n pageTitle: doc.title ?? '',\n };\n}\n\nfunction extractDomData(): DomData {\n return extractDomDataFromEnvironment(\n document as unknown as DomDocumentLike,\n window as unknown as DomWindowLike,\n );\n}\n\nfunction buildElementMap(domData: DomData): CapturedElement[] {\n const elements: CapturedElement[] = [];\n\n for (const input of domData.inputs) {\n const displayName = input.label || input.placeholder || input.name || input.testId;\n if (!displayName) continue;\n\n const selector = input.selector\n || (input.testId ? `getByTestId(${JSON.stringify(input.testId)})` : null)\n || (input.label ? `getByLabel(${JSON.stringify(input.label)})` : null)\n || (input.id ? `locator(${JSON.stringify(`#${input.id}`)})` : null)\n || (input.name ? `locator(${JSON.stringify(`[name=\"${input.name}\"]`)})` : null)\n || `locator(${JSON.stringify(`${input.tag}[placeholder=\"${input.placeholder ?? ''}\"]`)})`;\n\n const selectorAlt: string[] = [];\n if (input.id && !selector.includes(`#${input.id}`)) selectorAlt.push(`locator(${JSON.stringify(`#${input.id}`)})`);\n if (input.name && !selector.includes(input.name)) selectorAlt.push(`locator(${JSON.stringify(`[name=\"${input.name}\"]`)})`);\n if (input.testId && !selector.includes(input.testId)) selectorAlt.push(`getByTestId(${JSON.stringify(input.testId)})`);\n if (input.placeholder && !selector.includes(input.placeholder)) selectorAlt.push(`getByPlaceholder(${JSON.stringify(input.placeholder)})`);\n if (input.label && !selector.includes(input.label)) selectorAlt.push(`getByLabel(${JSON.stringify(input.label)})`);\n\n elements.push({\n category: 'input',\n role: input.type === 'checkbox' ? 'checkbox' : 'textbox',\n name: displayName,\n selector,\n selectorAlt,\n purpose: input.required\n ? `Required ${input.type} field - \"${displayName}\"`\n : `${input.type} field - \"${displayName}\"`,\n confidence: input.testId || input.label || input.id ? 'high' : (input.placeholder ? 'medium' : 'low'),\n attributes: {\n type: input.type,\n label: input.label,\n placeholder: input.placeholder,\n name: input.name,\n id: input.id,\n testId: input.testId,\n required: input.required,\n tag: input.tag,\n },\n });\n }\n\n for (const button of domData.buttons) {\n const buttonRole = button.role || 'button';\n const displayName = button.text || button.testId;\n if (!displayName) continue;\n\n const selector = button.selector\n || (button.testId ? `getByTestId(${JSON.stringify(button.testId)})` : null)\n || (button.text ? `getByRole(${JSON.stringify(buttonRole)}, { name: ${JSON.stringify(button.text)} })` : null)\n || (button.id ? `locator(${JSON.stringify(`#${button.id}`)})` : null)\n || (button.tag === 'button' ? `locator('button')` : `locator('[role=\"button\"]')`);\n\n const selectorAlt: string[] = [];\n if (button.id && !selector.includes(button.id)) selectorAlt.push(`locator(${JSON.stringify(`#${button.id}`)})`);\n if (button.testId && !selector.includes(button.testId)) selectorAlt.push(`getByTestId(${JSON.stringify(button.testId)})`);\n if (button.text && !selector.includes(button.text)) selectorAlt.push(`getByText(${JSON.stringify(button.text)})`);\n if (button.cssPath) selectorAlt.push(`locator(${JSON.stringify(button.cssPath)})`);\n\n elements.push({\n category: 'button',\n role: buttonRole,\n name: displayName,\n selector,\n selectorAlt,\n purpose: button.disabled\n ? `Disabled button - \"${displayName}\"`\n : button.type === 'submit'\n ? `Form submit button - \"${displayName}\"`\n : `Button - \"${displayName}\"`,\n confidence: button.testId || button.text ? 'high' : (button.id ? 'medium' : 'low'),\n attributes: {\n text: button.text,\n testId: button.testId,\n id: button.id,\n type: button.type,\n disabled: button.disabled,\n tag: button.tag,\n role: buttonRole,\n },\n });\n }\n\n for (const link of domData.links) {\n const linkRole = link.role || 'link';\n elements.push({\n category: 'link',\n role: linkRole,\n name: link.text,\n selector: link.selector,\n selectorAlt: [\n ...(link.testId ? [`getByTestId(${JSON.stringify(link.testId)})`] : []),\n `getByText(${JSON.stringify(link.text)})`,\n ],\n purpose: link.external\n ? `External link to \"${link.href}\" - \"${link.text}\"`\n : `Internal navigation link - \"${link.text}\" -> ${link.href}`,\n confidence: link.testId ? 'high' : 'medium',\n attributes: {\n text: link.text,\n href: link.href,\n testId: link.testId,\n external: link.external,\n tag: link.tag,\n role: linkRole,\n },\n });\n }\n\n for (const heading of domData.headings) {\n elements.push({\n category: 'heading',\n role: 'heading',\n name: heading.text,\n selector: heading.selector,\n selectorAlt: [`getByText(${JSON.stringify(heading.text)})`],\n purpose: `Page ${heading.level} heading - use to assert the correct page or section loaded`,\n confidence: 'medium',\n attributes: {\n level: heading.level,\n text: heading.text,\n },\n });\n }\n\n for (const status of domData.statusRegions) {\n elements.push({\n category: 'status',\n role: status.role,\n name: status.text || status.role,\n selector: status.selector,\n selectorAlt: [],\n purpose: 'Live region - use to assert error messages, success toasts, and validation feedback',\n confidence: 'medium',\n attributes: {\n role: status.role,\n ariaLive: status.ariaLive,\n currentText: status.text,\n },\n });\n }\n\n return elements;\n}\n\nfunction buildWarnings(\n elements: CapturedElement[],\n domData: DomData,\n a11ySnapshot: unknown,\n): string[] {\n const warnings: string[] = [];\n\n if (!a11ySnapshot) {\n warnings.push('Playwright accessibility snapshot was unavailable. Capture continued using DOM extraction only.');\n }\n\n const lowConfidenceInputs = elements.filter((element) => element.category === 'input' && element.confidence === 'low');\n if (lowConfidenceInputs.length > 0) {\n warnings.push(\n `${lowConfidenceInputs.length} input(s) have low-confidence selectors. Consider adding data-testid attributes to: ${lowConfidenceInputs.map((element) => element.name).filter(Boolean).join(', ')}`\n );\n }\n\n if (domData.statusRegions.length === 0) {\n warnings.push('No ARIA alert or status regions detected. Error message assertions may need manual selector adjustments after generation.');\n }\n\n for (const form of domData.forms) {\n const hasSubmit = domData.buttons.some((button) => button.type === 'submit');\n if (form.fieldCount > 0 && !hasSubmit) {\n warnings.push(\n `Form ${form.id || `#${form.index}`} has ${form.fieldCount} field(s) but no detected submit button. It may use keyboard submit or a custom handler.`\n );\n }\n }\n\n if (domData.links.length >= MAX_PER_CATEGORY) {\n warnings.push(`Link count hit the ${MAX_PER_CATEGORY} capture limit. Generation will focus on forms and buttons.`);\n }\n\n const interactive = elements.filter((element) => (\n element.category === 'button' || element.category === 'input' || element.category === 'link'\n ));\n if (interactive.length === 0) {\n warnings.push('No interactive elements detected. The page may require authentication, render later than the current settle window, or be mostly static content.');\n }\n\n return warnings;\n}\n\nfunction log(verbose: boolean, message: string): void {\n if (verbose) console.log(message);\n}\n\nasync function getAccessibilitySnapshot(page: any, verbose: boolean): Promise<unknown> {\n if (!page.accessibility || typeof page.accessibility.snapshot !== 'function') {\n log(verbose, ' -> Accessibility snapshot API unavailable; continuing with DOM-only capture');\n return null;\n }\n\n try {\n return await page.accessibility.snapshot({ interestingOnly: false });\n } catch (error: any) {\n log(verbose, ` -> Accessibility snapshot failed (${error?.message ?? error}); continuing with DOM-only capture`);\n return null;\n }\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nexport function formatCaptureFailure(error: unknown): string[] {\n const resolved = classifyCaptureError(error);\n\n if (resolved.code === 'PLAYWRIGHT_NOT_FOUND') {\n return [\n 'Playwright not resolvable.',\n 'Playwright runtime not found in this project.',\n 'Try:',\n ' npm install',\n ' npx playwright install chromium',\n ];\n }\n\n if (resolved.code === 'BROWSER_NOT_INSTALLED') {\n return [\n 'Browser not installed.',\n 'Playwright resolved, but Chromium is not installed for this project.',\n 'Try:',\n ' npx playwright install chromium',\n ];\n }\n\n if (resolved.code === 'PAGE_LOAD_FAILED') {\n return [\n 'Page load failed.',\n resolved.message,\n ];\n }\n\n return [\n 'Capture failed.',\n resolved.message,\n ];\n}\n\nfunction classifyCaptureError(error: unknown): CaptureRuntimeError {\n if (error instanceof CaptureRuntimeError) {\n return error;\n }\n\n const message = errorMessage(error);\n\n if (isBrowserInstallError(message)) {\n return new CaptureRuntimeError(\n 'BROWSER_NOT_INSTALLED',\n 'Playwright resolved, but Chromium is not installed for this project.',\n { cause: error },\n );\n }\n\n if (isPlaywrightNotFoundError(message)) {\n return new CaptureRuntimeError(\n 'PLAYWRIGHT_NOT_FOUND',\n 'Playwright runtime not found in this project.',\n { cause: error },\n );\n }\n\n return new CaptureRuntimeError('CAPTURE_FAILED', message || 'Unknown capture failure.', { cause: error });\n}\n\nfunction isBrowserInstallError(message: string): boolean {\n return /Executable doesn't exist|browserType\\.launch: Executable doesn't exist|Please run the following command|playwright install/i.test(message);\n}\n\nfunction isPlaywrightNotFoundError(message: string): boolean {\n return /Playwright runtime not found|Cannot find package ['\"](?:@playwright\\/test|playwright-core)['\"]/i.test(message);\n}\n\nfunction errorMessage(error: unknown): string {\n if (error instanceof Error) return error.message;\n return String(error ?? '');\n}\n"],"mappings":"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","names":["require"]}
|
package/dist/gen-WYG3JOGJ.js
DELETED
|
File without changes
|