uidex 0.2.4 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +253 -353
- package/dist/cli/cli.cjs +3243 -0
- package/dist/cli/cli.cjs.map +1 -0
- package/dist/cloud/index.cjs +149 -0
- package/dist/cloud/index.cjs.map +1 -0
- package/dist/cloud/index.d.cts +108 -0
- package/dist/cloud/index.d.ts +108 -0
- package/dist/cloud/index.js +120 -0
- package/dist/cloud/index.js.map +1 -0
- package/dist/headless/index.cjs +3580 -0
- package/dist/headless/index.cjs.map +1 -0
- package/dist/headless/index.d.cts +214 -0
- package/dist/headless/index.d.ts +214 -0
- package/dist/headless/index.js +3562 -0
- package/dist/headless/index.js.map +1 -0
- package/dist/index.cjs +6902 -9801
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +901 -146
- package/dist/index.d.ts +901 -146
- package/dist/index.js +6896 -9805
- package/dist/index.js.map +1 -1
- package/dist/playwright/index.cjs +164 -24
- package/dist/playwright/index.cjs.map +1 -1
- package/dist/playwright/index.d.cts +30 -53
- package/dist/playwright/index.d.ts +30 -53
- package/dist/playwright/index.js +148 -21
- package/dist/playwright/index.js.map +1 -1
- package/dist/playwright/reporter.cjs +62 -28
- package/dist/playwright/reporter.cjs.map +1 -1
- package/dist/playwright/reporter.d.cts +24 -12
- package/dist/playwright/reporter.d.ts +24 -12
- package/dist/playwright/reporter.js +62 -28
- package/dist/playwright/reporter.js.map +1 -1
- package/dist/react/index.cjs +6936 -9808
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +673 -146
- package/dist/react/index.d.ts +673 -146
- package/dist/react/index.js +6980 -9811
- package/dist/react/index.js.map +1 -1
- package/dist/scan/index.cjs +3281 -0
- package/dist/scan/index.cjs.map +1 -0
- package/dist/scan/index.d.cts +373 -0
- package/dist/scan/index.d.ts +373 -0
- package/dist/scan/index.js +3224 -0
- package/dist/scan/index.js.map +1 -0
- package/package.json +71 -65
- package/templates/claude/audit.md +37 -0
- package/templates/claude/rules.md +212 -0
- package/claude/audit-command.md +0 -46
- package/claude/rules.md +0 -167
- package/dist/api/index.cjs +0 -254
- package/dist/api/index.cjs.map +0 -1
- package/dist/api/index.d.cts +0 -236
- package/dist/api/index.d.ts +0 -236
- package/dist/api/index.js +0 -226
- package/dist/api/index.js.map +0 -1
- package/dist/core/index.cjs +0 -11045
- package/dist/core/index.cjs.map +0 -1
- package/dist/core/index.d.cts +0 -424
- package/dist/core/index.d.ts +0 -424
- package/dist/core/index.global.js +0 -66516
- package/dist/core/index.global.js.map +0 -1
- package/dist/core/index.js +0 -10995
- package/dist/core/index.js.map +0 -1
- package/dist/core/style.css +0 -1529
- package/dist/scripts/cli.cjs +0 -3904
- package/uidex.schema.json +0 -93
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/scan/cli.ts","../../src/scan/ai/index.ts","../../src/scan/ai/providers/claude.ts","../../src/scan/ai/templates.ts","../../src/scan/ai/providers/index.ts","../../src/scan/discover.ts","../../src/scan/config.ts","../../src/scan/pipeline.ts","../../src/entities/types.ts","../../src/entities/registry.ts","../../src/scan/audit.ts","../../src/scan/emit.ts","../../src/scan/extract-uidex-export.ts","../../src/scan/jsx-ancestry.ts","../../src/scan/extract.ts","../../src/scan/git.ts","../../src/scan/resolve.ts","../../src/scan/routes.ts","../../src/scan/walk.ts","../../src/scan/scaffold.ts","../../src/cli/cli.ts"],"sourcesContent":["import * as fs from \"node:fs\"\nimport * as path from \"node:path\"\nimport { runAiCommand } from \"./ai\"\nimport { discover, CONFIG_FILENAME } from \"./discover\"\nimport { runScan, writeScanResult } from \"./pipeline\"\nimport { scaffoldWidgetSpec } from \"./scaffold\"\nimport type { AuditSummary, UidexConfig } from \"./types\"\n\nexport interface CliResult {\n exitCode: number\n stdout: string\n stderr: string\n}\n\nexport interface CliOptions {\n argv: string[]\n cwd?: string\n}\n\ntype Flags = Record<string, string | boolean>\n\nfunction parseFlags(args: string[]): { positional: string[]; flags: Flags } {\n const positional: string[] = []\n const flags: Flags = {}\n for (let i = 0; i < args.length; i++) {\n const a = args[i]\n if (a.startsWith(\"--\")) {\n const eq = a.indexOf(\"=\")\n if (eq !== -1) {\n flags[a.slice(2, eq)] = a.slice(eq + 1)\n } else {\n const next = args[i + 1]\n if (next && !next.startsWith(\"--\")) {\n flags[a.slice(2)] = next\n i++\n } else {\n flags[a.slice(2)] = true\n }\n }\n } else {\n positional.push(a)\n }\n }\n return { positional, flags }\n}\n\nexport async function run(opts: CliOptions): Promise<CliResult> {\n const cwd = opts.cwd ?? process.cwd()\n const { positional, flags } = parseFlags(opts.argv)\n const command = positional[0] ?? \"help\"\n\n const writer = createWriter()\n\n try {\n switch (command) {\n case \"help\":\n case \"--help\":\n case \"-h\":\n writer.out(helpText())\n return writer.result(0)\n\n case \"init\":\n return runInit(cwd, writer)\n\n case \"scan\":\n return runScanCommand(cwd, flags, writer)\n\n case \"scaffold\":\n return runScaffold(cwd, positional.slice(1), flags, writer)\n\n case \"ai\": {\n const result = await runAiCommand({\n cwd,\n argv: opts.argv.slice(1),\n })\n if (result.stdout) writer.out(result.stdout.replace(/\\n$/, \"\"))\n if (result.stderr) writer.err(result.stderr.replace(/\\n$/, \"\"))\n return writer.result(result.exitCode)\n }\n\n default:\n writer.err(`Unknown command: ${command}`)\n writer.err(helpText())\n return writer.result(1)\n }\n } catch (e) {\n writer.err(e instanceof Error ? e.message : String(e))\n return writer.result(1)\n }\n}\n\nfunction helpText(): string {\n return [\n \"uidex — scanner CLI\",\n \"\",\n \"Commands:\",\n \" init Create a .uidex.json\",\n \" scan [flags] Run the scanner pipeline\",\n \" scaffold widget <id> Emit a Playwright spec from a widget's acceptance\",\n \" ai <install|uninstall|providers> Manage AI assistant integrations\",\n \"\",\n \"Flags:\",\n \" --check Verify the on-disk gen file matches a fresh scan; exit non-zero on drift (read-only)\",\n \" --lint Run lint diagnostics (missing annotations, scope leak, legacy JSDoc)\",\n \" --audit Equivalent to --check --lint (read-only)\",\n \" --json Emit JSON diagnostics on stdout\",\n \" --force (scaffold) overwrite existing spec\",\n \"\",\n ].join(\"\\n\")\n}\n\nfunction runInit(cwd: string, w: ReturnType<typeof createWriter>): CliResult {\n const configPath = path.join(cwd, CONFIG_FILENAME)\n if (fs.existsSync(configPath)) {\n w.err(`.uidex.json already exists at ${configPath}`)\n return w.result(1)\n }\n const config: UidexConfig = {\n $schema: \"https://uidex.dev/schema/v2.json\",\n sources: [{ rootDir: \"src\" }],\n output: \"src/uidex.gen.ts\",\n }\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + \"\\n\", \"utf8\")\n w.out(`Created ${configPath}`)\n\n const gitignorePath = path.join(cwd, \".gitignore\")\n const entry = \"*.gen.ts\"\n if (fs.existsSync(gitignorePath)) {\n const existing = fs.readFileSync(gitignorePath, \"utf8\")\n const hasEntry = existing.split(\"\\n\").some((line) => line.trim() === entry)\n if (!hasEntry) {\n const needsNewline = existing.length > 0 && !existing.endsWith(\"\\n\")\n fs.appendFileSync(\n gitignorePath,\n `${needsNewline ? \"\\n\" : \"\"}${entry}\\n`,\n \"utf8\"\n )\n w.out(`Appended ${entry} to ${gitignorePath}`)\n }\n } else {\n fs.writeFileSync(gitignorePath, `${entry}\\n`, \"utf8\")\n w.out(`Created ${gitignorePath} with ${entry}`)\n }\n return w.result(0)\n}\n\nfunction runScanCommand(\n cwd: string,\n flags: Flags,\n w: ReturnType<typeof createWriter>\n): CliResult {\n const check = Boolean(flags.check || flags.audit)\n const lint = Boolean(flags.lint || flags.audit)\n const asJson = Boolean(flags.json)\n\n const configs = discover({ cwd })\n if (configs.length === 0) {\n w.err(`No ${CONFIG_FILENAME} found under ${cwd}`)\n return w.result(1)\n }\n\n const results = runScan({ cwd, check, lint, configs })\n\n if (!check) {\n for (const r of results) writeScanResult(r)\n }\n\n const allDiagnostics = results.flatMap((r) => r.audit?.diagnostics ?? [])\n const summary = results.reduce(\n (acc, r) => {\n acc.errors += r.audit?.summary.errors ?? 0\n acc.warnings += r.audit?.summary.warnings ?? 0\n return acc\n },\n { errors: 0, warnings: 0 }\n )\n\n if (asJson) {\n const out: AuditSummary = { diagnostics: allDiagnostics, summary }\n w.out(JSON.stringify(out, null, 2))\n } else {\n for (const r of results) {\n if (check) {\n w.out(`Checked ${r.outputPath}`)\n } else {\n w.out(`Wrote ${r.outputPath}`)\n }\n for (const d of r.audit?.diagnostics ?? []) {\n const loc = d.file ? `${d.file}${d.line ? `:${d.line}` : \"\"}` : \"\"\n const stream = d.severity === \"error\" ? w.err : w.out\n stream(`${d.severity.toUpperCase()} [${d.code}] ${loc} ${d.message}`)\n if (d.hint) stream(` hint: ${d.hint}`)\n }\n }\n if (check || lint) {\n w.out(`${summary.errors} error(s), ${summary.warnings} warning(s)`)\n }\n }\n\n const exit = summary.errors > 0 ? 1 : 0\n return w.result(exit)\n}\n\nfunction runScaffold(\n cwd: string,\n args: string[],\n flags: Flags,\n w: ReturnType<typeof createWriter>\n): CliResult {\n const [kind, id] = args\n if (kind !== \"widget\" || !id) {\n w.err(\"Usage: uidex scaffold widget <id> [--force]\")\n return w.result(1)\n }\n\n const results = runScan({ cwd })\n for (const r of results) {\n const widget = r.registry.get(\"widget\", id)\n if (!widget) continue\n const outDir = path.resolve(r.configDir, \"e2e\")\n const result = scaffoldWidgetSpec({\n registry: r.registry,\n widgetId: id,\n outDir,\n force: Boolean(flags.force),\n })\n if (result.skipped) {\n w.err(result.reason ?? \"skipped\")\n return w.result(1)\n }\n w.out(`Wrote ${result.outputPath}`)\n return w.result(0)\n }\n\n w.err(`Widget \"${id}\" not found in registry`)\n return w.result(1)\n}\n\nfunction createWriter() {\n let stdout = \"\"\n let stderr = \"\"\n return {\n out(msg: string) {\n stdout += msg + \"\\n\"\n },\n err(msg: string) {\n stderr += msg + \"\\n\"\n },\n result(exitCode: number): CliResult {\n return { exitCode, stdout, stderr }\n },\n }\n}\n","import * as p from \"@clack/prompts\"\nimport { PROVIDERS, getProvider } from \"./providers\"\nimport type { AiProvider, FileChange, InstallResult } from \"./types\"\n\nexport interface AiCommandOptions {\n cwd: string\n argv: string[]\n /**\n * Optional non-interactive mode. When set, prompts are skipped and the\n * provider id must come from `--provider` (or be the only registered one).\n */\n nonInteractive?: boolean\n /** Hooks for tests / programmatic use. Replaces clack prompts. */\n prompt?: {\n selectProvider?: (providers: AiProvider[]) => Promise<string | null>\n }\n}\n\nexport interface AiCommandResult {\n exitCode: number\n stdout: string\n stderr: string\n}\n\nexport async function runAiCommand(\n opts: AiCommandOptions\n): Promise<AiCommandResult> {\n const { cwd, argv } = opts\n const sub = argv[0]\n\n if (!sub || sub === \"--help\" || sub === \"-h\" || sub === \"help\") {\n return out(0, helpText())\n }\n\n if (sub === \"providers\") {\n return out(\n 0,\n PROVIDERS.map((pr) => ` ${pr.id.padEnd(10)} ${pr.label}`).join(\"\\n\") +\n \"\\n\"\n )\n }\n\n if (sub !== \"install\" && sub !== \"uninstall\") {\n return err(1, `Unknown ai subcommand: ${sub}\\n\\n${helpText()}`)\n }\n\n const flags = parseFlags(argv.slice(1))\n const provider = await selectProvider(opts, flags.provider)\n if (!provider) return out(0, \"Cancelled.\\n\")\n\n if (sub === \"install\") {\n const result = await provider.install({\n cwd,\n force: flags.force === true,\n })\n return out(0, formatChanges(provider, \"Installed\", result))\n }\n\n // uninstall\n const result = await provider.uninstall({ cwd })\n return out(0, formatChanges(provider, \"Uninstalled\", result))\n}\n\nasync function selectProvider(\n opts: AiCommandOptions,\n explicit: string | undefined\n): Promise<AiProvider | null> {\n if (explicit) {\n const found = getProvider(explicit)\n if (!found) {\n throw new Error(\n `Unknown provider: ${explicit}. Run 'uidex ai providers' to list.`\n )\n }\n return found\n }\n\n if (PROVIDERS.length === 1) return PROVIDERS[0]\n\n if (opts.nonInteractive) {\n throw new Error(\n \"Multiple providers available; pass --provider <id> in non-interactive mode.\"\n )\n }\n\n if (opts.prompt?.selectProvider) {\n const id = await opts.prompt.selectProvider(PROVIDERS)\n return id ? (getProvider(id) ?? null) : null\n }\n\n const choice = await p.select({\n message: \"Which AI assistant?\",\n options: PROVIDERS.map((pr) => ({\n value: pr.id,\n label: pr.label,\n hint: pr.description,\n })),\n })\n if (p.isCancel(choice)) return null\n return getProvider(choice as string) ?? null\n}\n\ninterface Flags {\n provider?: string\n force?: boolean\n}\n\nfunction parseFlags(args: string[]): Flags {\n const flags: Flags = {}\n for (let i = 0; i < args.length; i++) {\n const a = args[i]\n if (a === \"--force\") flags.force = true\n else if (a === \"--provider\" || a === \"-p\") flags.provider = args[++i]\n else if (a.startsWith(\"--provider=\")) flags.provider = a.slice(11)\n }\n return flags\n}\n\nfunction formatChanges(\n provider: AiProvider,\n verb: string,\n result: InstallResult\n): string {\n const lines: string[] = [`${verb} ${provider.label}:`]\n for (const c of result.changes) lines.push(` ${describe(c)}`)\n return lines.join(\"\\n\") + \"\\n\"\n}\n\nfunction describe(c: FileChange): string {\n switch (c.action) {\n case \"created\":\n return `+ ${c.path}`\n case \"overwritten\":\n return `~ ${c.path}`\n case \"removed\":\n return `- ${c.path}`\n case \"skipped\":\n return `· ${c.path}${c.reason ? ` (${c.reason})` : \"\"}`\n }\n}\n\nfunction helpText(): string {\n return [\n \"uidex ai — install AI assistant integrations\",\n \"\",\n \"Subcommands:\",\n \" install Install an AI integration into the current repo\",\n \" uninstall Remove an AI integration from the current repo\",\n \" providers List available providers\",\n \"\",\n \"Flags:\",\n \" --provider <id>, -p Skip the prompt and pick a provider by id\",\n \" --force (install) overwrite existing files\",\n \"\",\n ].join(\"\\n\")\n}\n\nfunction out(exitCode: number, stdout: string): AiCommandResult {\n return { exitCode, stdout, stderr: \"\" }\n}\n\nfunction err(exitCode: number, stderr: string): AiCommandResult {\n return { exitCode, stdout: \"\", stderr }\n}\n","import * as fs from \"node:fs\"\nimport * as path from \"node:path\"\nimport { readTemplate } from \"../templates\"\nimport type {\n AiProvider,\n FileChange,\n InstallOptions,\n InstallResult,\n UninstallOptions,\n UninstallResult,\n} from \"../types\"\n\nconst CLAUDE_FILES: { dest: string; template: string }[] = [\n { dest: \".claude/rules/uidex.md\", template: \"claude/rules.md\" },\n { dest: \".claude/commands/uidex/audit.md\", template: \"claude/audit.md\" },\n]\n\nexport const claudeProvider: AiProvider = {\n id: \"claude\",\n label: \"Claude Code\",\n description:\n \"Adds .claude/rules/uidex.md and the /uidex:audit slash command.\",\n\n async install({ cwd, force }: InstallOptions): Promise<InstallResult> {\n const changes: FileChange[] = []\n\n for (const file of CLAUDE_FILES) {\n const dest = path.join(cwd, file.dest)\n const exists = fs.existsSync(dest)\n\n if (exists && !force) {\n changes.push({\n path: file.dest,\n action: \"skipped\",\n reason: \"exists (use --force to overwrite)\",\n })\n continue\n }\n\n fs.mkdirSync(path.dirname(dest), { recursive: true })\n fs.writeFileSync(dest, readTemplate(file.template))\n changes.push({\n path: file.dest,\n action: exists ? \"overwritten\" : \"created\",\n })\n }\n\n return { changes }\n },\n\n async uninstall({ cwd }: UninstallOptions): Promise<UninstallResult> {\n const changes: FileChange[] = []\n\n for (const file of CLAUDE_FILES) {\n const dest = path.join(cwd, file.dest)\n if (!fs.existsSync(dest)) {\n changes.push({ path: file.dest, action: \"skipped\", reason: \"absent\" })\n continue\n }\n fs.unlinkSync(dest)\n changes.push({ path: file.dest, action: \"removed\" })\n }\n\n // Best-effort cleanup of empty directories we may have created.\n cleanupEmpty(path.join(cwd, \".claude/commands/uidex\"))\n cleanupEmpty(path.join(cwd, \".claude/commands\"))\n cleanupEmpty(path.join(cwd, \".claude/rules\"))\n\n return { changes }\n },\n}\n\nfunction cleanupEmpty(dir: string): void {\n try {\n const entries = fs.readdirSync(dir)\n if (entries.length === 0) fs.rmdirSync(dir)\n } catch {\n /* directory missing or non-empty — ignore */\n }\n}\n","import * as fs from \"node:fs\"\nimport * as path from \"node:path\"\n\n/**\n * Resolves a path inside the package's templates/ directory.\n *\n * In production the bin runs from `dist/cli/cli.cjs`, so templates live\n * at `../../templates/<rel>`. In tests we run via tsx from\n * `src/scan/ai/`, which resolves through `../../../templates`.\n */\nexport function templatePath(rel: string): string {\n const candidates = [\n path.resolve(__dirname, \"../../templates\", rel), // dist/cli/cli.cjs → ../../templates\n path.resolve(__dirname, \"../../../templates\", rel), // src/scan/ai/foo.ts → ../../../templates\n ]\n for (const c of candidates) {\n try {\n fs.accessSync(c, fs.constants.R_OK)\n return c\n } catch {\n continue\n }\n }\n throw new Error(\n `uidex: template not found: ${rel}. Looked in:\\n ${candidates.join(\"\\n \")}`\n )\n}\n\nexport function readTemplate(rel: string): string {\n return fs.readFileSync(templatePath(rel), \"utf8\")\n}\n","import type { AiProvider } from \"../types\"\nimport { claudeProvider } from \"./claude\"\n\nexport const PROVIDERS: AiProvider[] = [claudeProvider]\n\nexport function getProvider(id: string): AiProvider | undefined {\n return PROVIDERS.find((p) => p.id === id)\n}\n","import * as fs from \"node:fs\"\nimport * as path from \"node:path\"\nimport { parseConfig } from \"./config\"\nimport type { DiscoveredConfig } from \"./types\"\n\nexport const CONFIG_FILENAME = \".uidex.json\"\n\nconst SKIP_DIRS = new Set([\n \"node_modules\",\n \".git\",\n \"dist\",\n \"build\",\n \".next\",\n \".turbo\",\n \".cache\",\n \"coverage\",\n])\n\nconst MAX_DEPTH = 4\n\nexport interface DiscoverOptions {\n cwd?: string\n maxDepth?: number\n}\n\nfunction tryReadConfig(configPath: string): DiscoveredConfig | null {\n let source: string\n try {\n source = fs.readFileSync(configPath, \"utf8\")\n } catch {\n return null\n }\n return {\n configPath,\n configDir: path.dirname(configPath),\n config: parseConfig(source),\n }\n}\n\nexport function discover(options: DiscoverOptions = {}): DiscoveredConfig[] {\n const cwd = options.cwd ?? process.cwd()\n const maxDepth = options.maxDepth ?? MAX_DEPTH\n\n const rootMatch = tryReadConfig(path.join(cwd, CONFIG_FILENAME))\n if (rootMatch) return [rootMatch]\n\n const results: DiscoveredConfig[] = []\n const queue: Array<[string, number]> = [[cwd, 0]]\n\n while (queue.length > 0) {\n const [dir, depth] = queue.shift()!\n let entries: fs.Dirent[]\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true })\n } catch {\n continue\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue\n if (SKIP_DIRS.has(entry.name)) continue\n if (entry.name.startsWith(\".\")) continue\n\n const childDir = path.join(dir, entry.name)\n const candidate = tryReadConfig(path.join(childDir, CONFIG_FILENAME))\n\n if (candidate) {\n results.push(candidate)\n continue\n }\n\n if (depth + 1 < maxDepth) {\n queue.push([childDir, depth + 1])\n }\n }\n }\n\n return results.sort((a, b) => a.configPath.localeCompare(b.configPath))\n}\n","import type { TypeMode, UidexConfig } from \"./types\"\n\nexport const DEFAULT_TYPE_MODE: TypeMode = \"strict\"\n\nexport class ConfigError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"ConfigError\"\n }\n}\n\nconst LEGACY_KEYS = new Set([\n \"scanner\",\n \"defaults\",\n \"colors\",\n \"components\",\n \"triggerElement\",\n \"devtools\",\n])\n\nconst ALLOWED_TOP_LEVEL_KEYS = new Set([\n \"$schema\",\n \"sources\",\n \"exclude\",\n \"output\",\n \"flows\",\n \"typeMode\",\n \"audit\",\n \"conventions\",\n])\n\nconst ALLOWED_TYPE_MODES = new Set<TypeMode>([\"strict\", \"loose\"])\n\nconst ALLOWED_SOURCE_KEYS = new Set([\"rootDir\", \"include\", \"exclude\", \"prefix\"])\n\nconst ALLOWED_CONVENTIONS_KEYS = new Set([\n \"primitives\",\n \"features\",\n \"pages\",\n \"flows\",\n \"regions\",\n])\n\nconst ALLOWED_AUDIT_KEYS = new Set([\"scopeLeak\", \"coverage\", \"acceptance\"])\n\nfunction fail(msg: string): never {\n throw new ConfigError(`Invalid .uidex.json: ${msg}`)\n}\n\nfunction assertObject(\n value: unknown,\n path: string\n): asserts value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n fail(`${path} must be an object`)\n }\n}\n\nfunction assertStringArray(\n value: unknown,\n path: string\n): asserts value is string[] {\n if (!Array.isArray(value) || !value.every((v) => typeof v === \"string\")) {\n fail(`${path} must be a string[]`)\n }\n}\n\nexport function validateConfig(raw: unknown): UidexConfig {\n assertObject(raw, \"root\")\n\n for (const key of Object.keys(raw)) {\n if (LEGACY_KEYS.has(key)) {\n fail(\n `legacy nested key \"${key}\" is not supported; v2 uses a flat schema (sources[], output, flows, audit, conventions)`\n )\n }\n if (!ALLOWED_TOP_LEVEL_KEYS.has(key)) {\n fail(`unknown top-level key \"${key}\"`)\n }\n }\n\n if (!(\"sources\" in raw)) {\n fail(\n `required key \"sources\" is missing (must be an array with at least one entry)`\n )\n }\n\n const sources = raw.sources\n if (!Array.isArray(sources) || sources.length === 0) {\n fail(`\"sources\" must be a non-empty array`)\n }\n\n const validatedSources = sources.map((src, i) => {\n assertObject(src, `sources[${i}]`)\n for (const key of Object.keys(src)) {\n if (!ALLOWED_SOURCE_KEYS.has(key)) {\n fail(`unknown key \"${key}\" in sources[${i}]`)\n }\n }\n if (typeof src.rootDir !== \"string\" || src.rootDir.length === 0) {\n fail(`sources[${i}].rootDir must be a non-empty string`)\n }\n if (src.include !== undefined)\n assertStringArray(src.include, `sources[${i}].include`)\n if (src.exclude !== undefined)\n assertStringArray(src.exclude, `sources[${i}].exclude`)\n if (src.prefix !== undefined && typeof src.prefix !== \"string\") {\n fail(`sources[${i}].prefix must be a string`)\n }\n return src as unknown as UidexConfig[\"sources\"][number]\n })\n\n if (typeof raw.output !== \"string\" || raw.output.length === 0) {\n fail(`\"output\" must be a non-empty string`)\n }\n\n if (raw.exclude !== undefined) assertStringArray(raw.exclude, `exclude`)\n if (raw.flows !== undefined) assertStringArray(raw.flows, `flows`)\n\n if (raw.typeMode !== undefined) {\n if (\n typeof raw.typeMode !== \"string\" ||\n !ALLOWED_TYPE_MODES.has(raw.typeMode as TypeMode)\n ) {\n fail(`\"typeMode\" must be \"strict\" or \"loose\"`)\n }\n }\n\n if (raw.audit !== undefined) {\n assertObject(raw.audit, \"audit\")\n for (const key of Object.keys(raw.audit)) {\n if (!ALLOWED_AUDIT_KEYS.has(key)) fail(`unknown key \"${key}\" in audit`)\n const v = (raw.audit as Record<string, unknown>)[key]\n if (typeof v !== \"boolean\") fail(`audit.${key} must be a boolean`)\n }\n }\n\n if (raw.conventions !== undefined) {\n assertObject(raw.conventions, \"conventions\")\n const c = raw.conventions as Record<string, unknown>\n for (const key of Object.keys(c)) {\n if (!ALLOWED_CONVENTIONS_KEYS.has(key)) {\n fail(`unknown key \"${key}\" in conventions`)\n }\n }\n if (c.primitives !== undefined && c.primitives !== false) {\n assertStringArray(c.primitives, \"conventions.primitives\")\n }\n if (\n c.features !== undefined &&\n c.features !== false &&\n typeof c.features !== \"string\"\n ) {\n fail(`conventions.features must be a string or false`)\n }\n if (c.pages !== undefined && c.pages !== false && c.pages !== \"auto\") {\n fail(`conventions.pages must be \"auto\" or false`)\n }\n if (c.flows !== undefined && c.flows !== false) {\n assertStringArray(c.flows, \"conventions.flows\")\n }\n if (\n c.regions !== undefined &&\n c.regions !== false &&\n c.regions !== \"landmarks\"\n ) {\n fail(`conventions.regions must be \"landmarks\" or false`)\n }\n }\n\n return {\n $schema: typeof raw.$schema === \"string\" ? raw.$schema : undefined,\n sources: validatedSources,\n exclude: raw.exclude as string[] | undefined,\n output: raw.output,\n flows: raw.flows as string[] | undefined,\n typeMode: (raw.typeMode as TypeMode | undefined) ?? DEFAULT_TYPE_MODE,\n audit: raw.audit as UidexConfig[\"audit\"],\n conventions: raw.conventions as UidexConfig[\"conventions\"],\n }\n}\n\nexport function parseConfig(json: string): UidexConfig {\n let raw: unknown\n try {\n raw = JSON.parse(json)\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e)\n throw new ConfigError(`Invalid .uidex.json: JSON parse error: ${msg}`)\n }\n return validateConfig(raw)\n}\n\nexport const DEFAULT_CONVENTIONS: Required<\n Pick<\n NonNullable<UidexConfig[\"conventions\"]>,\n \"primitives\" | \"features\" | \"pages\" | \"flows\" | \"regions\"\n >\n> = {\n primitives: [\"src/ui/**\", \"src/components/ui/**\"],\n features: \"src/features/*\",\n pages: \"auto\",\n flows: [\"e2e/**/*.spec.ts\"],\n regions: \"landmarks\",\n}\n","import * as fs from \"node:fs\"\nimport * as path from \"node:path\"\nimport type { Registry } from \"../entities\"\nimport { audit } from \"./audit\"\nimport { discover } from \"./discover\"\nimport { emit } from \"./emit\"\nimport { extract } from \"./extract\"\nimport { resolveGitContext } from \"./git\"\nimport { resolve } from \"./resolve\"\nimport type {\n AuditSummary,\n DiscoveredConfig,\n GitContext,\n UidexConfig,\n} from \"./types\"\nimport { walk } from \"./walk\"\n\nexport interface RunScanOptions {\n cwd?: string\n check?: boolean\n lint?: boolean\n configs?: DiscoveredConfig[]\n}\n\nexport interface ScanResult {\n config: UidexConfig\n configDir: string\n registry: Registry\n gitContext: GitContext\n audit?: AuditSummary\n generated: string\n outputPath: string\n}\n\nexport function runScan(opts: RunScanOptions = {}): ScanResult[] {\n const cwd = opts.cwd ?? process.cwd()\n const configs = opts.configs ?? discover({ cwd })\n if (configs.length === 0) {\n throw new Error(`No .uidex.json found starting from ${cwd}`)\n }\n\n return configs.map((dc) => runOne(dc, opts))\n}\n\nfunction runOne(dc: DiscoveredConfig, opts: RunScanOptions): ScanResult {\n const { config, configDir } = dc\n\n const sourceFiles = walk(config.sources, {\n cwd: configDir,\n globalExcludes: config.exclude,\n })\n\n const extracted = extract(sourceFiles)\n\n const flowFiles = config.flows\n ? walk(\n config.flows.map((glob) => ({ rootDir: \".\", include: [glob] })),\n { cwd: configDir, includeTests: true }\n )\n : []\n const extractedFlows = extract(flowFiles)\n\n const resolved = resolve({\n config,\n extracted,\n flowFiles: extractedFlows,\n })\n\n const gitContext = resolveGitContext({ cwd: configDir })\n\n const generated = emit({\n registry: resolved.registry,\n gitContext,\n typeMode: config.typeMode,\n })\n\n const outputPath = path.resolve(configDir, config.output)\n const outputRel = config.output\n\n let existingOnDisk: string | null = null\n if (opts.check) {\n try {\n existingOnDisk = fs.readFileSync(outputPath, \"utf8\")\n } catch {\n existingOnDisk = null\n }\n }\n\n let auditResult: AuditSummary | undefined\n if (opts.check || opts.lint || resolved.diagnostics.length > 0) {\n auditResult = audit({\n registry: resolved.registry,\n extracted,\n files: sourceFiles,\n config,\n check: opts.check,\n lint: opts.lint,\n resolveDiagnostics: resolved.diagnostics,\n generated,\n existingOnDisk,\n outputPath: outputRel,\n })\n }\n\n return {\n config,\n configDir,\n registry: resolved.registry,\n gitContext,\n audit: auditResult,\n generated,\n outputPath,\n }\n}\n\nexport function writeScanResult(result: ScanResult): void {\n fs.mkdirSync(path.dirname(result.outputPath), { recursive: true })\n fs.writeFileSync(result.outputPath, result.generated, \"utf8\")\n}\n","export const ENTITY_KINDS = [\n \"route\",\n \"page\",\n \"feature\",\n \"widget\",\n \"region\",\n \"element\",\n \"primitive\",\n \"flow\",\n] as const\n\nexport type EntityKind = (typeof ENTITY_KINDS)[number]\n\nexport type Scope = string\n\nexport interface Location {\n file: string\n line?: number\n column?: number\n}\n\nexport interface EntityRef {\n kind: EntityKind\n id: string\n}\n\nexport interface Metadata {\n name?: string\n description?: string\n acceptance?: string[]\n notes?: string\n composes?: EntityRef[]\n flows?: readonly string[]\n features?: string[]\n widgets?: string[]\n}\n\ninterface EntityWithMetaBase {\n id: string\n loc?: Location\n scopes?: Scope[]\n meta?: Metadata\n}\n\nexport interface Route {\n kind: \"route\"\n path: string\n page: string\n}\n\nexport interface Flow {\n kind: \"flow\"\n id: string\n loc: Location\n touches: string[]\n}\n\nexport interface Page extends EntityWithMetaBase {\n kind: \"page\"\n}\n\nexport interface Feature extends EntityWithMetaBase {\n kind: \"feature\"\n}\n\nexport interface Widget extends EntityWithMetaBase {\n kind: \"widget\"\n}\n\nexport interface Region extends EntityWithMetaBase {\n kind: \"region\"\n}\n\nexport interface Element extends EntityWithMetaBase {\n kind: \"element\"\n}\n\nexport interface Primitive extends EntityWithMetaBase {\n kind: \"primitive\"\n}\n\nexport type Entity =\n | Route\n | Page\n | Feature\n | Widget\n | Region\n | Element\n | Primitive\n | Flow\n\nexport type EntityByKind<K extends EntityKind> = Extract<Entity, { kind: K }>\n\nexport type MetaEntityKind = Exclude<EntityKind, \"route\" | \"flow\">\n\nexport function isMetaKind(kind: EntityKind): kind is MetaEntityKind {\n return kind !== \"route\" && kind !== \"flow\"\n}\n\nexport function isMetaEntity(\n entity: Entity\n): entity is Extract<Entity, { kind: MetaEntityKind }> {\n return isMetaKind(entity.kind)\n}\n\nexport function entityKey(entity: Entity): string {\n return entity.kind === \"route\" ? entity.path : entity.id\n}\n\nexport function sameRef(a: EntityRef | null, b: EntityRef | null): boolean {\n if (a === b) return true\n if (a === null || b === null) return false\n return a.kind === b.kind && a.id === b.id\n}\n\nexport class UnknownEntityKindError extends Error {\n readonly kind: string\n constructor(kind: string) {\n super(`Unknown entity kind: ${kind}`)\n this.name = \"UnknownEntityKindError\"\n this.kind = kind\n }\n}\n\nconst KIND_SET: ReadonlySet<string> = new Set<string>(ENTITY_KINDS)\n\nexport function assertEntityKind(kind: string): asserts kind is EntityKind {\n if (!KIND_SET.has(kind)) throw new UnknownEntityKindError(kind)\n}\n","import {\n assertEntityKind,\n entityKey,\n isMetaEntity,\n isMetaKind,\n type Entity,\n type EntityByKind,\n type EntityKind,\n type Flow,\n type Metadata,\n type Scope,\n} from \"./types\"\n\nexport interface Registry {\n add(entity: Entity): void\n get<K extends EntityKind>(kind: K, id: string): EntityByKind<K> | undefined\n list<K extends EntityKind>(kind: K): ReadonlyArray<EntityByKind<K>>\n query(predicate: (entity: Entity) => boolean): Entity[]\n byScope(scope: Scope): Entity[]\n touchedBy(flowId: string): Entity[]\n}\n\ntype KindStore = {\n [K in EntityKind]: Map<string, EntityByKind<K>>\n}\n\nfunction emptyStore(): KindStore {\n return {\n route: new Map(),\n page: new Map(),\n feature: new Map(),\n widget: new Map(),\n region: new Map(),\n element: new Map(),\n primitive: new Map(),\n flow: new Map(),\n }\n}\n\nfunction computeFlowIds(flows: Iterable<Flow>, targetId: string): string[] {\n const ids: string[] = []\n for (const flow of flows) {\n if (flow.touches.includes(targetId)) ids.push(flow.id)\n }\n return ids\n}\n\nfunction freezeEntity<E extends Entity>(entity: E, flows: Iterable<Flow>): E {\n if (!isMetaKind(entity.kind)) return entity\n const withMeta = entity as Extract<Entity, { meta?: Metadata }>\n if (withMeta.meta === undefined) return entity\n const computedFlows = Object.freeze(computeFlowIds(flows, withMeta.id))\n const mergedMeta: Metadata = { ...withMeta.meta, flows: computedFlows }\n return { ...entity, meta: Object.freeze(mergedMeta) } as E\n}\n\nexport function createRegistry(): Registry {\n const store = emptyStore()\n let flowsCache: Flow[] | null = null\n\n const getFlows = (): Flow[] => {\n if (flowsCache === null) flowsCache = Array.from(store.flow.values())\n return flowsCache\n }\n\n const add = (entity: Entity): void => {\n assertEntityKind(entity.kind)\n const key = entityKey(entity)\n ;(store[entity.kind] as Map<string, Entity>).set(key, entity)\n flowsCache = null\n }\n\n const get = <K extends EntityKind>(\n kind: K,\n id: string\n ): EntityByKind<K> | undefined => {\n assertEntityKind(kind)\n const raw = store[kind].get(id) as EntityByKind<K> | undefined\n if (raw === undefined) return undefined\n return freezeEntity(raw, getFlows())\n }\n\n const list = <K extends EntityKind>(\n kind: K\n ): ReadonlyArray<EntityByKind<K>> => {\n assertEntityKind(kind)\n const flows = getFlows()\n return Array.from(store[kind].values(), (e) =>\n freezeEntity(e as EntityByKind<K>, flows)\n )\n }\n\n const allEntities = function* (): Generator<Entity> {\n for (const kind of Object.keys(store) as EntityKind[]) {\n for (const entity of store[kind].values()) {\n yield entity as Entity\n }\n }\n }\n\n const query = (predicate: (entity: Entity) => boolean): Entity[] => {\n const flows = getFlows()\n const result: Entity[] = []\n for (const entity of allEntities()) {\n if (predicate(entity)) result.push(freezeEntity(entity, flows))\n }\n return result\n }\n\n const byScope = (scope: Scope): Entity[] =>\n query(\n (entity) =>\n \"scopes\" in entity &&\n Array.isArray(entity.scopes) &&\n entity.scopes.includes(scope)\n )\n\n const touchedBy = (flowId: string): Entity[] => {\n const flow = store.flow.get(flowId)\n if (flow === undefined) return []\n const ids = new Set(flow.touches)\n return query((entity) => {\n if (!isMetaEntity(entity)) return false\n return ids.has(entity.id)\n })\n }\n\n return { add, get, list, query, byScope, touchedBy }\n}\n","import type { Entity, Registry } from \"../entities\"\nimport { entityKey } from \"../entities\"\nimport type {\n Annotation,\n AuditSummary,\n Diagnostic,\n ExtractedFile,\n ScannedFile,\n UidexConfig,\n} from \"./types\"\n\nexport interface AuditOptions {\n registry: Registry\n extracted: ExtractedFile[]\n files: ScannedFile[]\n config: UidexConfig\n check?: boolean\n lint?: boolean\n resolveDiagnostics?: Diagnostic[]\n /** Freshly-emitted gen-file bytes, required for --check. */\n generated?: string\n /** On-disk contents of the gen file at scan time; `null` if the file does not exist. */\n existingOnDisk?: string | null\n /** Relative path of the configured `output` file; used in diagnostics. */\n outputPath?: string\n}\n\nconst MARKER_FILENAMES = [\"UIDEX_PAGE.md\", \"UIDEX_FEATURE.md\"]\n\nexport function audit(opts: AuditOptions): AuditSummary {\n const diagnostics: Diagnostic[] = []\n const { registry, extracted, files, config } = opts\n const check = opts.check ?? false\n const lint = opts.lint ?? false\n const acceptanceEnabled = config.audit?.acceptance ?? true\n const scopeLeakEnabled = config.audit?.scopeLeak ?? true\n const coverageEnabled = config.audit?.coverage ?? true\n\n // Always surface resolve-time diagnostics (widget cross-validation errors\n // etc.) — these are not gated on --check/--lint because they reflect\n // malformed source the scanner cannot silently register.\n if (opts.resolveDiagnostics) diagnostics.push(...opts.resolveDiagnostics)\n\n // ---- Orphan marker MD files ----\n if (check) {\n for (const f of files) {\n const base = f.displayPath.split(\"/\").pop() ?? \"\"\n if (MARKER_FILENAMES.includes(base)) {\n diagnostics.push({\n code: \"marker-md-ignored\",\n severity: \"warning\",\n message: `Marker file \"${base}\" is ignored in v2; migrate to \\`export const uidex\\``,\n file: f.displayPath,\n })\n }\n }\n }\n\n // ---- Stale gen file (--check) ----\n if (check && opts.generated !== undefined) {\n const outRel = opts.outputPath ?? config.output\n const fresh = normalizeLineEndings(opts.generated)\n if (opts.existingOnDisk === null || opts.existingOnDisk === undefined) {\n diagnostics.push({\n code: \"gen-missing\",\n severity: \"error\",\n message: `Generated file \"${outRel}\" does not exist on disk; run \\`uidex scan\\` and commit the result`,\n file: outRel,\n hint: \"Run `uidex scan` (without --check) to regenerate\",\n })\n } else {\n const existing = normalizeLineEndings(opts.existingOnDisk)\n if (existing !== fresh) {\n const changed = diffEntities(existing, opts.generated, registry)\n const summary = formatChangedSummary(changed)\n diagnostics.push({\n code: \"gen-stale\",\n severity: \"error\",\n message: `Generated file \"${outRel}\" is stale${summary ? `; ${summary}` : \"\"}`,\n file: outRel,\n hint: \"Run `uidex scan` (without --check) to regenerate and commit the result\",\n })\n }\n }\n }\n\n // ---- Legacy JSDoc tags (replaces @acceptance-orphan and friends) ----\n if (lint) {\n for (const ef of extracted) {\n for (const a of ef.annotations) {\n const migration = legacyJsdocMigration(a)\n if (!migration) continue\n diagnostics.push({\n code: \"legacy-jsdoc\",\n severity: \"warning\",\n message: migration.message,\n file: a.file,\n line: a.line,\n hint: migration.hint,\n })\n }\n }\n }\n\n // ---- Acceptance coverage ----\n if (lint && acceptanceEnabled) {\n for (const kind of [\"widget\", \"feature\", \"page\"] as const) {\n for (const e of registry.list(kind)) {\n const criteria = e.meta?.acceptance ?? []\n if (criteria.length === 0) {\n if (kind === \"widget\") {\n diagnostics.push({\n code: \"widget-missing-acceptance\",\n severity: \"warning\",\n message: `Widget \"${e.id}\" has no acceptance metadata; add \\`export const uidex = { widget: \"${e.id}\", acceptance: [...] }\\` at the widget's definition site`,\n file: e.loc?.file,\n line: e.loc?.line,\n entity: { kind, id: e.id },\n hint: `Adding acceptance criteria allows \\`uidex scaffold widget ${e.id}\\` to generate a Playwright spec`,\n })\n }\n continue\n }\n const flowIds = (e.meta?.flows ?? []) as readonly string[]\n if (flowIds.length === 0) {\n const hint =\n kind === \"widget\"\n ? `uidex scaffold widget ${e.id}`\n : `Add a Playwright flow under e2e/** that touches ${kind} \"${e.id}\" (tag the describe with @uidex:flow)`\n for (const c of criteria) {\n diagnostics.push({\n code: \"acceptance-uncovered\",\n severity: \"warning\",\n message: `${kind} \"${e.id}\" has acceptance criterion not covered by any flow: \"${c}\"`,\n file: e.loc?.file,\n line: e.loc?.line,\n entity: { kind, id: e.id },\n hint,\n })\n }\n }\n }\n }\n }\n\n // ---- Missing element annotation candidates (interactive elements without data-uidex) ----\n if (lint) {\n for (const f of files) {\n const lines = f.content.split(\"\\n\")\n const candidateRe = /<(button|a|input|select|textarea)(?=[\\s/>])([^>]*)>/g\n let m: RegExpExecArray | null\n while ((m = candidateRe.exec(f.content)) !== null) {\n const attrs = m[2]\n if (attrs && attrs.includes(\"data-uidex\")) continue\n const idx = m.index\n let line = 1\n for (let i = 0; i < idx; i++) if (f.content[i] === \"\\n\") line++\n void lines\n diagnostics.push({\n code: \"missing-element-annotation\",\n severity: \"info\",\n message: `Interactive <${m[1].toLowerCase()}> without data-uidex annotation`,\n file: f.displayPath,\n line,\n })\n }\n }\n }\n\n // ---- Scope leak (primitives used outside their scope) ----\n if (lint && scopeLeakEnabled) {\n const primitives = registry.list(\"primitive\")\n const byName = new Map<string, (typeof primitives)[number]>()\n for (const p of primitives) byName.set(p.id, p)\n for (const f of files) {\n const importRe = /import\\s+(?:[^'\"]+)\\s+from\\s+['\"]([^'\"]+)['\"]/g\n let m: RegExpExecArray | null\n while ((m = importRe.exec(f.content)) !== null) {\n const spec = m[1]\n const baseName = spec.split(\"/\").pop() ?? \"\"\n const primitive = byName.get(\n baseName\n .replace(/\\.(tsx|ts|jsx|js|mjs|cjs)$/, \"\")\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .toLowerCase()\n )\n if (!primitive) continue\n const scope = primitive.scopes?.[0] ?? \"global\"\n if (scope === \"global\") continue\n const [kind, id] = scope.split(\":\")\n const importerSegments = f.displayPath.split(\"/\")\n if (\n !importerSegments.includes(id) ||\n !importerSegments.includes(kind + \"s\")\n ) {\n diagnostics.push({\n code: \"scope-leak\",\n severity: \"warning\",\n message: `Primitive \"${primitive.id}\" is scoped to ${scope} but is imported from ${f.displayPath}`,\n file: f.displayPath,\n })\n }\n }\n }\n }\n\n // ---- Coverage (entities referenced in flows must exist) ----\n if (lint && coverageEnabled) {\n for (const flow of registry.list(\"flow\")) {\n for (const touchedId of flow.touches) {\n const found =\n registry.get(\"element\", touchedId) ??\n registry.get(\"widget\", touchedId) ??\n registry.get(\"region\", touchedId)\n if (!found) {\n diagnostics.push({\n code: \"unknown-reference\",\n severity: \"warning\",\n message: `Flow \"${flow.id}\" references unknown entity \"${touchedId}\"`,\n file: flow.loc.file,\n line: flow.loc.line,\n })\n }\n }\n }\n }\n\n const summary = {\n errors: diagnostics.filter((d) => d.severity === \"error\").length,\n warnings: diagnostics.filter((d) => d.severity === \"warning\").length,\n }\n\n return { diagnostics, summary }\n}\n\nfunction legacyJsdocMigration(\n a: Annotation\n): { message: string; hint: string } | null {\n const quote = (s: string) => JSON.stringify(s)\n const arr = (xs: string[] | undefined): string =>\n xs && xs.length > 0 ? `[${xs.map(quote).join(\", \")}]` : \"\"\n\n const entityHint = (\n kind: \"page\" | \"feature\" | \"widget\"\n ): { message: string; hint: string } => {\n const uidexKind = (kind.charAt(0).toUpperCase() + kind.slice(1)) as\n | \"Page\"\n | \"Feature\"\n | \"Widget\"\n const parts = [`${kind}: ${quote(a.id)}`]\n if (a.acceptance?.length) parts.push(`acceptance: ${arr(a.acceptance)}`)\n return {\n message: `Legacy JSDoc tag \\`@uidex ${kind} ${a.id}\\` is no longer recognised; migrate to \\`export const uidex\\``,\n hint: `Replace with: export const uidex = { ${parts.join(\", \")} } as const satisfies Uidex.${uidexKind}`,\n }\n }\n\n switch (a.kind) {\n case \"page-doc\":\n return entityHint(\"page\")\n case \"feature-doc\":\n return entityHint(\"feature\")\n case \"widget-doc\":\n return entityHint(\"widget\")\n case \"not-flow\":\n return {\n message: `Legacy JSDoc tag \\`@uidex:not-flow\\` is no longer recognised; migrate to \\`export const uidex\\``,\n hint: `Replace with: export const uidex = { notFlow: true } as const satisfies Uidex.NotFlow`,\n }\n case \"orphan-acceptance\":\n return {\n message: `Legacy JSDoc tag \\`@acceptance\\` is no longer recognised; migrate to the \\`acceptance\\` field on \\`export const uidex\\``,\n hint: `Replace with: export const uidex = { /* kind */, acceptance: ${arr(a.acceptance)} } as const`,\n }\n default:\n return null\n }\n}\n\nfunction normalizeLineEndings(s: string): string {\n return s.replace(/\\r\\n/g, \"\\n\")\n}\n\ninterface EntityChange {\n added: string[]\n removed: string[]\n modified: string[]\n}\n\nfunction formatChangedSummary(change: EntityChange): string {\n const parts: string[] = []\n const fmt = (kind: string, names: string[]) => {\n if (names.length === 0) return\n const preview = names.slice(0, 3).join(\", \")\n const suffix = names.length > 3 ? ` (+${names.length - 3} more)` : \"\"\n parts.push(`${kind}: ${preview}${suffix}`)\n }\n fmt(\"added\", change.added)\n fmt(\"removed\", change.removed)\n fmt(\"modified\", change.modified)\n return parts.join(\"; \")\n}\n\nfunction diffEntities(\n existing: string,\n generated: string,\n registry: Registry\n): EntityChange {\n const oldEntities = extractEntitiesArray(existing)\n const newEntities = extractEntitiesArray(generated) ?? freshEntities(registry)\n\n const added: string[] = []\n const removed: string[] = []\n const modified: string[] = []\n\n if (!oldEntities) {\n for (const e of newEntities) added.push(labelFor(e))\n return { added, removed, modified }\n }\n\n const oldByKey = new Map<string, Entity>()\n for (const e of oldEntities) oldByKey.set(entityKey(e) + \"@\" + e.kind, e)\n const newByKey = new Map<string, Entity>()\n for (const e of newEntities) newByKey.set(entityKey(e) + \"@\" + e.kind, e)\n\n for (const [k, e] of newByKey) {\n const prev = oldByKey.get(k)\n if (!prev) {\n added.push(labelFor(e))\n } else if (stableStringify(prev) !== stableStringify(e)) {\n modified.push(labelFor(e))\n }\n }\n for (const [k, e] of oldByKey) {\n if (!newByKey.has(k)) removed.push(labelFor(e))\n }\n\n return { added, removed, modified }\n}\n\nfunction labelFor(e: Entity): string {\n return `${e.kind} \"${entityKey(e)}\"`\n}\n\nfunction freshEntities(registry: Registry): Entity[] {\n const kinds = [\n \"route\",\n \"page\",\n \"feature\",\n \"widget\",\n \"region\",\n \"element\",\n \"primitive\",\n \"flow\",\n ] as const\n const out: Entity[] = []\n for (const k of kinds) out.push(...(registry.list(k) as Entity[]))\n return out\n}\n\nfunction extractEntitiesArray(source: string): Entity[] | null {\n const marker = \"export const entities: ReadonlyArray<Entity> = \"\n const idx = source.indexOf(marker)\n if (idx === -1) return null\n const start = source.indexOf(\"[\", idx)\n if (start === -1) return null\n let depth = 0\n let inStr: string | null = null\n let escaped = false\n for (let i = start; i < source.length; i++) {\n const c = source[i]\n if (inStr) {\n if (escaped) {\n escaped = false\n } else if (c === \"\\\\\") {\n escaped = true\n } else if (c === inStr) {\n inStr = null\n }\n continue\n }\n if (c === '\"' || c === \"'\") {\n inStr = c\n continue\n }\n if (c === \"[\") depth++\n else if (c === \"]\") {\n depth--\n if (depth === 0) {\n const json = source.slice(start, i + 1)\n try {\n return JSON.parse(json) as Entity[]\n } catch {\n return null\n }\n }\n }\n }\n return null\n}\n\nfunction stableStringify(value: unknown): string {\n return JSON.stringify(value, stableReplacer)\n}\n\nfunction stableReplacer(_key: string, value: unknown): unknown {\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n const sorted: Record<string, unknown> = {}\n for (const k of Object.keys(value as Record<string, unknown>).sort()) {\n sorted[k] = (value as Record<string, unknown>)[k]\n }\n return sorted\n }\n return value\n}\n","import type { Entity, Registry } from \"../entities\"\nimport type { GitContext, TypeMode } from \"./types\"\n\nexport interface EmitOptions {\n registry: Registry\n gitContext?: GitContext\n /** The import source for `createUidex` in the generated preconfigured export. */\n uidexImport?: string\n /** Controls id-union emission: \"strict\" emits literal unions, \"loose\" emits `string`. */\n typeMode?: TypeMode\n}\n\nfunction sortById<T extends { id: string }>(arr: readonly T[]): T[] {\n return [...arr].sort((a, b) => a.id.localeCompare(b.id))\n}\n\nfunction jsonStable(value: unknown, indent = 2): string {\n return JSON.stringify(value, replacerSorted, indent)\n}\n\nfunction replacerSorted(_key: string, value: unknown): unknown {\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n const sorted: Record<string, unknown> = {}\n for (const k of Object.keys(value as Record<string, unknown>).sort()) {\n sorted[k] = (value as Record<string, unknown>)[k]\n }\n return sorted\n }\n return value\n}\n\nfunction emitIdUnion(name: string, ids: string[], typeMode: TypeMode): string {\n if (typeMode === \"loose\") return `export type ${name} = string\\n`\n if (ids.length === 0) return `export type ${name} = never\\n`\n const sorted = [...ids].sort()\n const body = sorted.map((id) => ` | ${JSON.stringify(id)}`).join(\"\\n\")\n return `export type ${name} =\\n${body}\\n`\n}\n\nexport function emit(opts: EmitOptions): string {\n const {\n registry,\n gitContext,\n uidexImport = \"uidex\",\n typeMode = \"strict\",\n } = opts\n\n const routes = [...registry.list(\"route\")].sort((a, b) =>\n a.path.localeCompare(b.path)\n )\n const pages = sortById(registry.list(\"page\"))\n const features = sortById(registry.list(\"feature\"))\n const widgets = sortById(registry.list(\"widget\"))\n const regions = sortById(registry.list(\"region\"))\n const elements = sortById(registry.list(\"element\"))\n const primitives = sortById(registry.list(\"primitive\"))\n const flows = sortById(registry.list(\"flow\"))\n\n const lines: string[] = []\n lines.push(\"// THIS FILE IS AUTO-GENERATED BY `uidex scan`. DO NOT EDIT.\")\n lines.push(\"/* eslint-disable */\")\n lines.push(`import { createUidex } from ${JSON.stringify(uidexImport)}`)\n lines.push(\n `import type { Entity, Registry } from ${JSON.stringify(uidexImport)}`\n )\n lines.push(\"\")\n lines.push(\"// ---- id unions ----\")\n lines.push(\n emitIdUnion(\n \"PageId\",\n pages.map((e) => e.id),\n typeMode\n )\n )\n lines.push(\n emitIdUnion(\n \"FeatureId\",\n features.map((e) => e.id),\n typeMode\n )\n )\n lines.push(\n emitIdUnion(\n \"WidgetId\",\n widgets.map((e) => e.id),\n typeMode\n )\n )\n lines.push(\n emitIdUnion(\n \"RegionId\",\n regions.map((e) => e.id),\n typeMode\n )\n )\n lines.push(\n emitIdUnion(\n \"ElementId\",\n elements.map((e) => e.id),\n typeMode\n )\n )\n lines.push(\n emitIdUnion(\n \"PrimitiveId\",\n primitives.map((e) => e.id),\n typeMode\n )\n )\n lines.push(\n emitIdUnion(\n \"FlowId\",\n flows.map((e) => e.id),\n typeMode\n )\n )\n lines.push(\n emitIdUnion(\n \"RouteId\",\n routes.map((e) => e.path),\n typeMode\n )\n )\n lines.push(\"\")\n lines.push(\"// ---- authoring-surface shape types ----\")\n lines.push(\"export namespace Uidex {\")\n lines.push(\" export interface Page {\")\n lines.push(\" page: PageId | false\")\n lines.push(\" name?: string\")\n lines.push(\" features?: readonly FeatureId[]\")\n lines.push(\" widgets?: readonly WidgetId[]\")\n lines.push(\" acceptance?: readonly string[]\")\n lines.push(\" description?: string\")\n lines.push(\" }\")\n lines.push(\" export interface Feature {\")\n lines.push(\" feature: FeatureId | false\")\n lines.push(\" name?: string\")\n lines.push(\" acceptance?: readonly string[]\")\n lines.push(\" description?: string\")\n lines.push(\" }\")\n lines.push(\" export interface Primitive {\")\n lines.push(\" primitive: PrimitiveId\")\n lines.push(\" name?: string\")\n lines.push(\" description?: string\")\n lines.push(\" }\")\n lines.push(\" export interface Widget {\")\n lines.push(\" widget: WidgetId\")\n lines.push(\" name?: string\")\n lines.push(\" acceptance?: readonly string[]\")\n lines.push(\" description?: string\")\n lines.push(\" }\")\n lines.push(\" export interface Flow {\")\n lines.push(\" flow: FlowId\")\n lines.push(\" name?: string\")\n lines.push(\" description?: string\")\n lines.push(\" }\")\n lines.push(\" export interface NotFlow {\")\n lines.push(\" notFlow: true\")\n lines.push(\" }\")\n lines.push(\"}\")\n lines.push(\"\")\n lines.push(\"// ---- entities ----\")\n const allEntities: Entity[] = [\n ...routes,\n ...pages,\n ...features,\n ...widgets,\n ...regions,\n ...elements,\n ...primitives,\n ...flows,\n ]\n lines.push(\n `export const entities: ReadonlyArray<Entity> = ${jsonStable(allEntities)}`\n )\n lines.push(\"\")\n lines.push(\"// ---- git context ----\")\n const gc: GitContext = gitContext ?? { branch: null, commit: null, pr: null }\n lines.push(`export const gitContext = ${jsonStable(gc)} as const`)\n lines.push(\"\")\n lines.push(\"// ---- registry factory ----\")\n lines.push(\"export function loadRegistry(target: Registry): Registry {\")\n lines.push(\" for (const entity of entities) target.add(entity)\")\n lines.push(\" return target\")\n lines.push(\"}\")\n lines.push(\"\")\n lines.push(\"// ---- preconfigured uidex instance ----\")\n lines.push(\"export const uidex = createUidex()\")\n lines.push(\"for (const entity of entities) uidex.registry.add(entity)\")\n lines.push(\"\")\n return lines.join(\"\\n\")\n}\n","import type {\n Diagnostic,\n MetadataExport,\n MetadataExportKind,\n ScannedFile,\n} from \"./types\"\n\ninterface SourcePos {\n offset: number\n line: number\n column: number\n}\n\ntype LitValue =\n | { kind: \"string\"; value: string; pos: SourcePos }\n | { kind: \"number\"; value: number; pos: SourcePos }\n | { kind: \"boolean\"; value: boolean; pos: SourcePos }\n | { kind: \"null\"; pos: SourcePos }\n | { kind: \"array\"; items: LitValue[]; pos: SourcePos }\n | { kind: \"object\"; entries: Array<[string, LitValue]>; pos: SourcePos }\n\nexport interface UidexExportExtractResult {\n exports: MetadataExport[]\n diagnostics: Diagnostic[]\n}\n\nconst KIND_DISCRIMINATORS = [\n \"page\",\n \"feature\",\n \"primitive\",\n \"widget\",\n \"flow\",\n \"notFlow\",\n] as const\ntype Discriminator = (typeof KIND_DISCRIMINATORS)[number]\n\nconst ALLOWED_FIELDS: Record<MetadataExportKind, ReadonlySet<string>> = {\n page: new Set([\n \"page\",\n \"name\",\n \"features\",\n \"widgets\",\n \"acceptance\",\n \"description\",\n ]),\n feature: new Set([\"feature\", \"name\", \"acceptance\", \"description\"]),\n primitive: new Set([\"primitive\", \"name\", \"description\"]),\n widget: new Set([\"widget\", \"name\", \"acceptance\", \"description\"]),\n flow: new Set([\"flow\", \"notFlow\", \"name\", \"description\"]),\n}\n\nconst FALSEABLE: ReadonlySet<MetadataExportKind> = new Set([\n \"page\",\n \"feature\",\n \"primitive\",\n])\n\nclass ExtractError extends Error {\n code: string\n hint?: string\n pos: SourcePos\n constructor(code: string, message: string, pos: SourcePos, hint?: string) {\n super(message)\n this.code = code\n this.pos = pos\n this.hint = hint\n }\n}\n\nexport function extractUidexExports(\n file: ScannedFile\n): UidexExportExtractResult {\n const exports: MetadataExport[] = []\n const diagnostics: Diagnostic[] = []\n const { content, displayPath } = file\n\n for (const header of findExportHeaders(content)) {\n try {\n const value = parseExpression(content, header.exprStart)\n const metadata = buildMetadata(\n value,\n displayPath,\n header.headerPos,\n diagnostics\n )\n exports.push(metadata)\n } catch (e) {\n if (e instanceof ExtractError) {\n diagnostics.push({\n code: e.code,\n severity: \"error\",\n message: e.message,\n file: displayPath,\n line: e.pos.line,\n hint: e.hint,\n })\n } else {\n throw e\n }\n }\n }\n\n return { exports, diagnostics }\n}\n\n/* ---------- header scanning ---------- */\n\ninterface Header {\n headerPos: SourcePos\n exprStart: number\n}\n\nconst HEADER_RE =\n /(?:^|\\n)[\\t ]*export\\s+const\\s+uidex\\b(?:\\s*:\\s*[^=\\n]+?)?\\s*=\\s*/g\n\nfunction findExportHeaders(content: string): Header[] {\n const out: Header[] = []\n HEADER_RE.lastIndex = 0\n let m: RegExpExecArray | null\n while ((m = HEADER_RE.exec(content)) !== null) {\n const leadingNewline = m[0].startsWith(\"\\n\") ? 1 : 0\n const headerOffset = m.index + leadingNewline\n const exprStart = m.index + m[0].length\n if (isInsideCommentOrString(content, headerOffset)) continue\n out.push({\n headerPos: posAt(content, headerOffset),\n exprStart,\n })\n }\n return out\n}\n\nfunction isInsideCommentOrString(content: string, target: number): boolean {\n let i = 0\n let inLineComment = false\n let inBlockComment = false\n let stringDelim: string | null = null\n let inTemplate = false\n let templateDepth = 0\n while (i < target) {\n const c = content[i]\n const n = content[i + 1]\n if (inLineComment) {\n if (c === \"\\n\") inLineComment = false\n i++\n continue\n }\n if (inBlockComment) {\n if (c === \"*\" && n === \"/\") {\n inBlockComment = false\n i += 2\n continue\n }\n i++\n continue\n }\n if (stringDelim !== null) {\n if (c === \"\\\\\") {\n i += 2\n continue\n }\n if (c === stringDelim) stringDelim = null\n i++\n continue\n }\n if (inTemplate) {\n if (c === \"\\\\\") {\n i += 2\n continue\n }\n if (c === \"$\" && n === \"{\") {\n templateDepth++\n i += 2\n continue\n }\n if (c === \"`\" && templateDepth === 0) {\n inTemplate = false\n i++\n continue\n }\n if (templateDepth > 0 && c === \"}\") {\n templateDepth--\n i++\n continue\n }\n i++\n continue\n }\n if (c === \"/\" && n === \"/\") {\n inLineComment = true\n i += 2\n continue\n }\n if (c === \"/\" && n === \"*\") {\n inBlockComment = true\n i += 2\n continue\n }\n if (c === '\"' || c === \"'\") {\n stringDelim = c\n i++\n continue\n }\n if (c === \"`\") {\n inTemplate = true\n i++\n continue\n }\n i++\n }\n return inLineComment || inBlockComment || stringDelim !== null || inTemplate\n}\n\n/* ---------- tokenizer ---------- */\n\ntype TokenKind =\n | \"lbrace\"\n | \"rbrace\"\n | \"lbracket\"\n | \"rbracket\"\n | \"lparen\"\n | \"rparen\"\n | \"comma\"\n | \"colon\"\n | \"spread\"\n | \"string\"\n | \"template\"\n | \"number\"\n | \"ident\"\n | \"punct\"\n | \"eof\"\n\ninterface Token {\n kind: TokenKind\n value: string\n pos: SourcePos\n end: number\n}\n\nclass Tokenizer {\n private pos: number\n private line: number\n private lineStart: number\n constructor(\n private readonly src: string,\n start: number\n ) {\n this.pos = start\n // Compute line and lineStart for the starting offset.\n let line = 1\n let lineStart = 0\n for (let i = 0; i < start; i++) {\n if (src[i] === \"\\n\") {\n line++\n lineStart = i + 1\n }\n }\n this.line = line\n this.lineStart = lineStart\n }\n\n private currentPos(): SourcePos {\n return {\n offset: this.pos,\n line: this.line,\n column: this.pos - this.lineStart + 1,\n }\n }\n\n private advance(n = 1): void {\n for (let i = 0; i < n; i++) {\n if (this.pos < this.src.length && this.src[this.pos] === \"\\n\") {\n this.line++\n this.lineStart = this.pos + 1\n }\n this.pos++\n }\n }\n\n private skipTrivia(): void {\n while (this.pos < this.src.length) {\n const c = this.src[this.pos]\n const n = this.src[this.pos + 1]\n if (c === \" \" || c === \"\\t\" || c === \"\\r\" || c === \"\\n\") {\n this.advance()\n continue\n }\n if (c === \"/\" && n === \"/\") {\n while (this.pos < this.src.length && this.src[this.pos] !== \"\\n\") {\n this.advance()\n }\n continue\n }\n if (c === \"/\" && n === \"*\") {\n this.advance(2)\n while (this.pos < this.src.length) {\n if (this.src[this.pos] === \"*\" && this.src[this.pos + 1] === \"/\") {\n this.advance(2)\n break\n }\n this.advance()\n }\n continue\n }\n break\n }\n }\n\n next(): Token {\n this.skipTrivia()\n if (this.pos >= this.src.length) {\n return { kind: \"eof\", value: \"\", pos: this.currentPos(), end: this.pos }\n }\n const pos = this.currentPos()\n const c = this.src[this.pos]\n // Single-char punctuation.\n switch (c) {\n case \"{\":\n this.advance()\n return { kind: \"lbrace\", value: c, pos, end: this.pos }\n case \"}\":\n this.advance()\n return { kind: \"rbrace\", value: c, pos, end: this.pos }\n case \"[\":\n this.advance()\n return { kind: \"lbracket\", value: c, pos, end: this.pos }\n case \"]\":\n this.advance()\n return { kind: \"rbracket\", value: c, pos, end: this.pos }\n case \"(\":\n this.advance()\n return { kind: \"lparen\", value: c, pos, end: this.pos }\n case \")\":\n this.advance()\n return { kind: \"rparen\", value: c, pos, end: this.pos }\n case \",\":\n this.advance()\n return { kind: \"comma\", value: c, pos, end: this.pos }\n case \":\":\n this.advance()\n return { kind: \"colon\", value: c, pos, end: this.pos }\n }\n if (\n c === \".\" &&\n this.src[this.pos + 1] === \".\" &&\n this.src[this.pos + 2] === \".\"\n ) {\n this.advance(3)\n return { kind: \"spread\", value: \"...\", pos, end: this.pos }\n }\n if (c === '\"' || c === \"'\") {\n return this.readString(pos, c)\n }\n if (c === \"`\") {\n return this.readTemplate(pos)\n }\n if (isDigit(c) || (c === \"-\" && isDigit(this.src[this.pos + 1]))) {\n return this.readNumber(pos)\n }\n if (isIdentStart(c)) {\n return this.readIdent(pos)\n }\n // Any other punctuation: emit as punct so the parser can reject.\n this.advance()\n return { kind: \"punct\", value: c, pos, end: this.pos }\n }\n\n private readString(pos: SourcePos, delim: string): Token {\n this.advance() // opening quote\n let value = \"\"\n while (this.pos < this.src.length) {\n const c = this.src[this.pos]\n if (c === \"\\\\\") {\n const esc = this.src[this.pos + 1]\n this.advance(2)\n value += decodeEscape(esc)\n continue\n }\n if (c === delim) {\n this.advance()\n return { kind: \"string\", value, pos, end: this.pos }\n }\n if (c === \"\\n\") {\n // Unterminated string: treat as punct for the parser to reject.\n return { kind: \"punct\", value: delim, pos, end: this.pos }\n }\n value += c\n this.advance()\n }\n return { kind: \"punct\", value: delim, pos, end: this.pos }\n }\n\n private readTemplate(pos: SourcePos): Token {\n this.advance() // opening backtick\n let value = \"\"\n let hasExpression = false\n while (this.pos < this.src.length) {\n const c = this.src[this.pos]\n const n = this.src[this.pos + 1]\n if (c === \"\\\\\") {\n const esc = this.src[this.pos + 1]\n this.advance(2)\n value += decodeEscape(esc)\n continue\n }\n if (c === \"$\" && n === \"{\") {\n hasExpression = true\n // Consume until matching `}`, tracking nested braces.\n this.advance(2)\n let depth = 1\n while (this.pos < this.src.length && depth > 0) {\n const ch = this.src[this.pos]\n if (ch === \"{\") depth++\n else if (ch === \"}\") depth--\n this.advance()\n }\n continue\n }\n if (c === \"`\") {\n this.advance()\n if (hasExpression) {\n return { kind: \"template\", value, pos, end: this.pos }\n }\n return { kind: \"string\", value, pos, end: this.pos }\n }\n value += c\n this.advance()\n }\n return { kind: \"template\", value, pos, end: this.pos }\n }\n\n private readNumber(pos: SourcePos): Token {\n const start = this.pos\n if (this.src[this.pos] === \"-\") this.advance()\n while (this.pos < this.src.length && isDigit(this.src[this.pos])) {\n this.advance()\n }\n if (this.src[this.pos] === \".\") {\n this.advance()\n while (this.pos < this.src.length && isDigit(this.src[this.pos])) {\n this.advance()\n }\n }\n if (this.src[this.pos] === \"e\" || this.src[this.pos] === \"E\") {\n this.advance()\n if (this.src[this.pos] === \"+\" || this.src[this.pos] === \"-\") {\n this.advance()\n }\n while (this.pos < this.src.length && isDigit(this.src[this.pos])) {\n this.advance()\n }\n }\n const value = this.src.slice(start, this.pos)\n return { kind: \"number\", value, pos, end: this.pos }\n }\n\n private readIdent(pos: SourcePos): Token {\n const start = this.pos\n while (this.pos < this.src.length && isIdentPart(this.src[this.pos])) {\n this.advance()\n }\n const value = this.src.slice(start, this.pos)\n return { kind: \"ident\", value, pos, end: this.pos }\n }\n}\n\nfunction isDigit(c: string | undefined): boolean {\n return c !== undefined && c >= \"0\" && c <= \"9\"\n}\nfunction isIdentStart(c: string | undefined): boolean {\n if (c === undefined) return false\n return (\n (c >= \"a\" && c <= \"z\") || (c >= \"A\" && c <= \"Z\") || c === \"_\" || c === \"$\"\n )\n}\nfunction isIdentPart(c: string | undefined): boolean {\n return isIdentStart(c) || isDigit(c)\n}\nfunction decodeEscape(esc: string | undefined): string {\n switch (esc) {\n case \"n\":\n return \"\\n\"\n case \"t\":\n return \"\\t\"\n case \"r\":\n return \"\\r\"\n case \"\\\\\":\n return \"\\\\\"\n case \"'\":\n return \"'\"\n case '\"':\n return '\"'\n case \"`\":\n return \"`\"\n case \"0\":\n return \"\\0\"\n case \"b\":\n return \"\\b\"\n case \"f\":\n return \"\\f\"\n case \"v\":\n return \"\\v\"\n default:\n return esc ?? \"\"\n }\n}\n\n/* ---------- parser ---------- */\n\nfunction parseExpression(content: string, start: number): LitValue {\n const tokenizer = new Tokenizer(content, start)\n const parser = new Parser(tokenizer)\n const value = parser.parseValue()\n parser.consumeTrailingAssertions()\n return value\n}\n\nclass Parser {\n private lookahead: Token | null = null\n constructor(private readonly tok: Tokenizer) {}\n\n private peek(): Token {\n if (this.lookahead === null) this.lookahead = this.tok.next()\n return this.lookahead\n }\n private consume(): Token {\n const t = this.peek()\n this.lookahead = null\n return t\n }\n\n parseValue(): LitValue {\n const t = this.peek()\n switch (t.kind) {\n case \"lbrace\":\n return this.parseObject()\n case \"lbracket\":\n return this.parseArray()\n case \"string\":\n this.consume()\n return { kind: \"string\", value: t.value, pos: t.pos }\n case \"template\":\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n \"Template literal with expression parts is not allowed in `export const uidex`; use a plain string literal.\",\n t.pos\n )\n case \"number\": {\n this.consume()\n const n = Number(t.value)\n if (!Number.isFinite(n)) {\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n `Invalid numeric literal \"${t.value}\" in \\`export const uidex\\`.`,\n t.pos\n )\n }\n return { kind: \"number\", value: n, pos: t.pos }\n }\n case \"ident\":\n if (t.value === \"true\" || t.value === \"false\") {\n this.consume()\n return {\n kind: \"boolean\",\n value: t.value === \"true\",\n pos: t.pos,\n }\n }\n if (t.value === \"null\") {\n this.consume()\n return { kind: \"null\", pos: t.pos }\n }\n if (t.value === \"undefined\") {\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n \"`undefined` is not allowed as a value in `export const uidex`; omit the field instead.\",\n t.pos\n )\n }\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n `Identifier reference \"${t.value}\" is not allowed in \\`export const uidex\\`; the right-hand side must be a plain literal.`,\n t.pos\n )\n case \"spread\":\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n \"Spread (`...`) is not allowed in `export const uidex`; the right-hand side must be a plain literal.\",\n t.pos\n )\n case \"lparen\":\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n \"Parenthesised or grouped expressions are not allowed in `export const uidex`.\",\n t.pos\n )\n case \"punct\":\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n `Unexpected token \"${t.value}\" in \\`export const uidex\\`.`,\n t.pos\n )\n case \"eof\":\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n \"Expected a value for `export const uidex` but reached end of file.\",\n t.pos\n )\n default:\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n `Unexpected token in \\`export const uidex\\`.`,\n t.pos\n )\n }\n }\n\n private parseObject(): LitValue {\n const open = this.consume() // {\n const entries: Array<[string, LitValue]> = []\n const seen = new Set<string>()\n while (true) {\n const t = this.peek()\n if (t.kind === \"rbrace\") {\n this.consume()\n break\n }\n if (t.kind === \"spread\") {\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n \"Spread (`...`) is not allowed inside `export const uidex`.\",\n t.pos\n )\n }\n if (t.kind === \"lbracket\") {\n // Computed key: must be a string literal only.\n this.consume()\n const keyTok = this.peek()\n if (keyTok.kind !== \"string\") {\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n \"Computed property keys must be string literals in `export const uidex`.\",\n keyTok.pos\n )\n }\n this.consume()\n const close = this.peek()\n if (close.kind !== \"rbracket\") {\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n \"Expected `]` after computed property key.\",\n close.pos\n )\n }\n this.consume()\n const colon = this.peek()\n if (colon.kind !== \"colon\") {\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n \"Expected `:` after computed property key.\",\n colon.pos\n )\n }\n this.consume()\n const value = this.parseValue()\n this.recordEntry(entries, seen, keyTok.value, value, keyTok.pos)\n } else if (t.kind === \"ident\" || t.kind === \"string\") {\n const keyTok = this.consume()\n const next = this.peek()\n if (next.kind === \"colon\") {\n this.consume()\n const value = this.parseValue()\n this.recordEntry(entries, seen, keyTok.value, value, keyTok.pos)\n } else {\n // Shorthand property or invalid syntax. Either way, disallow.\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n keyTok.kind === \"ident\"\n ? `Shorthand property \"${keyTok.value}\" is not allowed; write \"${keyTok.value}: ...\" with a literal value.`\n : \"Expected `:` after property key.\",\n keyTok.pos\n )\n }\n } else if (t.kind === \"number\") {\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n \"Numeric property keys are not allowed in `export const uidex`.\",\n t.pos\n )\n } else {\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n `Unexpected token \"${t.value}\" inside object.`,\n t.pos\n )\n }\n // After a property, expect `,` or `}`.\n const after = this.peek()\n if (after.kind === \"comma\") {\n this.consume()\n continue\n }\n if (after.kind === \"rbrace\") {\n this.consume()\n break\n }\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n `Expected \\`,\\` or \\`}\\`, got \"${after.value}\".`,\n after.pos\n )\n }\n return { kind: \"object\", entries, pos: open.pos }\n }\n\n private recordEntry(\n entries: Array<[string, LitValue]>,\n seen: Set<string>,\n key: string,\n value: LitValue,\n pos: SourcePos\n ): void {\n if (seen.has(key)) {\n throw new ExtractError(\n \"uidex-export-duplicate-field\",\n `Duplicate field \"${key}\" in \\`export const uidex\\`.`,\n pos\n )\n }\n seen.add(key)\n entries.push([key, value])\n }\n\n private parseArray(): LitValue {\n const open = this.consume() // [\n const items: LitValue[] = []\n while (true) {\n const t = this.peek()\n if (t.kind === \"rbracket\") {\n this.consume()\n break\n }\n if (t.kind === \"spread\") {\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n \"Spread (`...`) is not allowed inside `export const uidex`.\",\n t.pos\n )\n }\n const value = this.parseValue()\n if (value.kind === \"object\") {\n // Object literals allowed inside arrays.\n }\n items.push(value)\n const after = this.peek()\n if (after.kind === \"comma\") {\n this.consume()\n continue\n }\n if (after.kind === \"rbracket\") {\n this.consume()\n break\n }\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n `Expected \\`,\\` or \\`]\\`, got \"${after.value}\".`,\n after.pos\n )\n }\n return { kind: \"array\", items, pos: open.pos }\n }\n\n consumeTrailingAssertions(): void {\n // Optionally consume `as const` then `satisfies X` — we do not validate\n // the type expression after `satisfies`; the parser simply stops reading.\n const first = this.peek()\n if (first.kind === \"ident\" && first.value === \"as\") {\n this.consume()\n const next = this.peek()\n if (next.kind === \"ident\" && next.value === \"const\") {\n this.consume()\n } else {\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n \"Only `as const` is allowed after the `export const uidex` value.\",\n next.pos\n )\n }\n }\n const maybeSatisfies = this.peek()\n if (\n maybeSatisfies.kind === \"ident\" &&\n maybeSatisfies.value === \"satisfies\"\n ) {\n // Stop here; anything after `satisfies` is a type expression that we\n // deliberately do not evaluate.\n return\n }\n // Trailing content beyond the value is OK as long as it's statement\n // boundary or subsequent top-level code.\n }\n}\n\n/* ---------- metadata building ---------- */\n\nfunction buildMetadata(\n value: LitValue,\n file: string,\n headerPos: SourcePos,\n diagnostics: Diagnostic[]\n): MetadataExport {\n if (value.kind !== \"object\") {\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n \"`export const uidex` must be assigned an object literal.\",\n value.pos\n )\n }\n\n const byKey = new Map<string, LitValue>()\n for (const [k, v] of value.entries) byKey.set(k, v)\n\n const presentKinds = KIND_DISCRIMINATORS.filter((k) =>\n byKey.has(k)\n ) as Discriminator[]\n if (presentKinds.length === 0) {\n throw new ExtractError(\n \"uidex-export-missing-kind\",\n \"`export const uidex` must declare one of: \" +\n KIND_DISCRIMINATORS.join(\", \") +\n \".\",\n value.pos\n )\n }\n if (presentKinds.length > 1) {\n throw new ExtractError(\n \"uidex-export-ambiguous-kind\",\n `\\`export const uidex\\` declares multiple kinds (${presentKinds.join(\n \", \"\n )}); exactly one kind discriminator is allowed per module.`,\n value.pos\n )\n }\n\n const discriminator = presentKinds[0]\n // notFlow is the only discriminator that maps to `flow` kind.\n const kind: MetadataExportKind =\n discriminator === \"notFlow\" ? \"flow\" : discriminator\n\n const allowed = ALLOWED_FIELDS[kind]\n for (const [k] of value.entries) {\n if (!allowed.has(k)) {\n const fieldVal = byKey.get(k)!\n throw new ExtractError(\n \"uidex-export-unknown-field\",\n `Unknown field \"${k}\" in \\`export const uidex\\` for kind \"${kind}\". Allowed: ${Array.from(\n allowed\n )\n .sort()\n .join(\", \")}.`,\n fieldVal.pos\n )\n }\n }\n\n // Parse required id and optional fields.\n const idField: string = discriminator === \"notFlow\" ? \"flow\" : discriminator\n const idValue = byKey.get(discriminator)\n let id: string | false\n if (discriminator === \"notFlow\") {\n const v = idValue!\n if (v.kind !== \"boolean\" || v.value !== true) {\n throw new ExtractError(\n \"uidex-export-invalid-field\",\n \"`notFlow` must be `true`.\",\n v.pos\n )\n }\n // A flow-kind export with notFlow:true has no id — represent as false.\n id = false\n } else {\n id = readIdField(idValue!, kind, idField)\n }\n\n const acceptance = readStringArrayField(byKey, \"acceptance\")\n const description = readStringField(byKey, \"description\")\n const name = readStringField(byKey, \"name\")\n if (name === \"\") {\n const pos = byKey.get(\"name\")!.pos\n diagnostics.push({\n code: \"uidex-export-empty-name\",\n severity: \"info\",\n message: \"`name` is an empty string; treating as unset.\",\n file,\n line: pos.line,\n })\n }\n const features =\n kind === \"page\" ? readStringArrayField(byKey, \"features\") : undefined\n const widgets =\n kind === \"page\" ? readStringArrayField(byKey, \"widgets\") : undefined\n const notFlow =\n kind === \"flow\" && discriminator === \"notFlow\" ? true : undefined\n\n const metadata: MetadataExport = {\n source: \"ts-export\",\n kind,\n id,\n loc: {\n file,\n line: headerPos.line,\n column: headerPos.column,\n },\n }\n if (name) metadata.name = name\n if (acceptance) metadata.acceptance = acceptance\n if (description) metadata.description = description\n if (features) metadata.features = features\n if (widgets) metadata.widgets = widgets\n if (notFlow) metadata.notFlow = true\n return metadata\n}\n\nfunction readIdField(\n value: LitValue,\n kind: MetadataExportKind,\n fieldName: string\n): string | false {\n if (value.kind === \"string\") {\n if (value.value.length === 0) {\n throw new ExtractError(\n \"uidex-export-invalid-field\",\n `\\`${fieldName}\\` must be a non-empty string.`,\n value.pos\n )\n }\n return value.value\n }\n if (value.kind === \"boolean\" && value.value === false) {\n if (!FALSEABLE.has(kind)) {\n throw new ExtractError(\n \"uidex-export-invalid-field\",\n `\\`${fieldName}: false\\` is only valid for page, feature, and primitive kinds.`,\n value.pos\n )\n }\n return false\n }\n throw new ExtractError(\n \"uidex-export-invalid-field\",\n `\\`${fieldName}\\` must be a string${\n FALSEABLE.has(kind) ? \" or `false`\" : \"\"\n }.`,\n value.pos\n )\n}\n\nfunction readStringField(\n byKey: Map<string, LitValue>,\n name: string\n): string | undefined {\n const v = byKey.get(name)\n if (!v) return undefined\n if (v.kind !== \"string\") {\n throw new ExtractError(\n \"uidex-export-invalid-field\",\n `\\`${name}\\` must be a string.`,\n v.pos\n )\n }\n return v.value\n}\n\nfunction readStringArrayField(\n byKey: Map<string, LitValue>,\n name: string\n): string[] | undefined {\n const v = byKey.get(name)\n if (!v) return undefined\n if (v.kind !== \"array\") {\n throw new ExtractError(\n \"uidex-export-invalid-field\",\n `\\`${name}\\` must be an array of strings.`,\n v.pos\n )\n }\n const out: string[] = []\n for (const item of v.items) {\n if (item.kind !== \"string\") {\n throw new ExtractError(\n \"uidex-export-invalid-field\",\n `\\`${name}\\` must contain only string literals.`,\n item.pos\n )\n }\n out.push(item.value)\n }\n return out\n}\n\n/* ---------- utilities ---------- */\n\nfunction posAt(content: string, offset: number): SourcePos {\n let line = 1\n let lineStart = 0\n for (let i = 0; i < offset && i < content.length; i++) {\n if (content[i] === \"\\n\") {\n line++\n lineStart = i + 1\n }\n }\n return { offset, line, column: offset - lineStart + 1 }\n}\n","import type { AnnotationAncestor, DomAttrKind } from \"./types\"\n\n/**\n * Walks JSX/TSX source and emits each `data-uidex*` attribute occurrence\n * paired with its JSX ancestor chain (outermost to innermost).\n *\n * Implementation note: a small state machine that tokenises JSX open/close/self\n * tags while skipping string literals, template literals, comments, and JSX\n * expression blocks. Intended to be \"good enough\" for well-formatted React\n * source — not a full TS/JSX parser. Malformed or exotic constructs yield\n * empty ancestry rather than wrong ancestry.\n */\n\nconst DATA_ATTR_RE =\n /\\bdata-uidex(?:-(region|widget|primitive))?\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/g\n\nexport interface DataAttrOccurrence {\n kind: DomAttrKind\n id: string\n line: number\n ancestors: AnnotationAncestor[]\n}\n\nfunction parseDataAttrs(tagSource: string): AnnotationAncestor[] {\n if (!tagSource.includes(\"data-uidex\")) return []\n const out: AnnotationAncestor[] = []\n for (const m of tagSource.matchAll(DATA_ATTR_RE)) {\n const kind = (m[1] ?? \"element\") as DomAttrKind\n const id = m[2] ?? m[3]\n if (id) out.push({ kind, id })\n }\n return out\n}\n\nexport function collectJSXAncestry(content: string): DataAttrOccurrence[] {\n if (!content.includes(\"data-uidex\")) return []\n\n const out: DataAttrOccurrence[] = []\n const ancestors: AnnotationAncestor[] = []\n // Each open tag pushes {tagName, pushed: #attrs added}; close pops the\n // nearest matching frame and shrinks `ancestors` back to its pre-push size.\n const stack: Array<{ tagName: string; pushed: number }> = []\n\n const N = content.length\n let i = 0\n let line = 1\n\n const advanceLines = (from: number, to: number): void => {\n for (let k = from; k < to; k++) {\n if (content.charCodeAt(k) === 10) line++\n }\n }\n\n while (i < N) {\n const c = content[i]\n\n if (c === \"\\n\") {\n line++\n i++\n continue\n }\n if (c === \"/\" && content[i + 1] === \"/\") {\n while (i < N && content[i] !== \"\\n\") i++\n continue\n }\n if (c === \"/\" && content[i + 1] === \"*\") {\n const end = content.indexOf(\"*/\", i + 2)\n const next = end === -1 ? N : end + 2\n advanceLines(i, next)\n i = next\n continue\n }\n if (c === '\"' || c === \"'\") {\n const next = skipString(content, i, c)\n advanceLines(i, next)\n i = next\n continue\n }\n if (c === \"`\") {\n const next = skipTemplate(content, i)\n advanceLines(i, next)\n i = next\n continue\n }\n if (c === \"<\") {\n const nextCh = content[i + 1]\n if (nextCh === \"/\") {\n const end = content.indexOf(\">\", i)\n if (end === -1) break\n const tagName =\n content.slice(i + 2, end).match(/^\\s*([\\w.-]*)/)?.[1] ?? \"\"\n if (tagName) {\n for (let k = stack.length - 1; k >= 0; k--) {\n if (stack[k].tagName === tagName) {\n for (let j = stack.length - 1; j >= k; j--) {\n ancestors.length -= stack[j].pushed\n }\n stack.length = k\n break\n }\n }\n }\n advanceLines(i, end + 1)\n i = end + 1\n continue\n }\n if (nextCh && /[A-Za-z_]/.test(nextCh)) {\n const end = findTagEnd(content, i + 1)\n if (end === -1) break\n const tagSource = content.slice(i, end + 1)\n const tagName = tagSource.match(/^<\\s*([\\w.-]*)/)?.[1] ?? \"\"\n const isSelf = content[end - 1] === \"/\"\n if (tagName) {\n const attrs = parseDataAttrs(tagSource)\n // Emit occurrences using the *current* ancestor snapshot (copy so\n // subsequent mutations don't rewrite history).\n if (attrs.length > 0) {\n const snapshot = ancestors.slice()\n for (const a of attrs) {\n out.push({ kind: a.kind, id: a.id, line, ancestors: snapshot })\n }\n }\n if (!isSelf) {\n for (const a of attrs) ancestors.push(a)\n stack.push({ tagName, pushed: attrs.length })\n }\n }\n advanceLines(i, end + 1)\n i = end + 1\n continue\n }\n }\n i++\n }\n\n return out\n}\n\nfunction skipString(content: string, start: number, quote: string): number {\n const N = content.length\n let i = start + 1\n while (i < N) {\n const c = content[i]\n if (c === \"\\\\\") {\n i += 2\n continue\n }\n if (c === quote) return i + 1\n i++\n }\n return N\n}\n\nfunction skipTemplate(content: string, start: number): number {\n const N = content.length\n let i = start + 1\n while (i < N) {\n const c = content[i]\n if (c === \"\\\\\") {\n i += 2\n continue\n }\n if (c === \"`\") return i + 1\n if (c === \"$\" && content[i + 1] === \"{\") {\n i += 2\n let depth = 1\n while (i < N && depth > 0) {\n const cj = content[i]\n if (cj === '\"' || cj === \"'\") {\n i = skipString(content, i, cj)\n continue\n }\n if (cj === \"`\") {\n i = skipTemplate(content, i)\n continue\n }\n if (cj === \"{\") depth++\n else if (cj === \"}\") depth--\n i++\n }\n continue\n }\n i++\n }\n return N\n}\n\nfunction findTagEnd(content: string, start: number): number {\n const N = content.length\n let i = start\n while (i < N) {\n const c = content[i]\n if (c === '\"' || c === \"'\") {\n i = skipString(content, i, c)\n continue\n }\n if (c === \"`\") {\n i = skipTemplate(content, i)\n continue\n }\n if (c === \"{\") {\n let depth = 1\n i++\n while (i < N && depth > 0) {\n const cj = content[i]\n if (cj === '\"' || cj === \"'\") {\n i = skipString(content, i, cj)\n continue\n }\n if (cj === \"`\") {\n i = skipTemplate(content, i)\n continue\n }\n if (cj === \"{\") depth++\n else if (cj === \"}\") depth--\n i++\n }\n continue\n }\n if (c === \">\") return i\n i++\n }\n return -1\n}\n","import { extractUidexExports } from \"./extract-uidex-export\"\nimport { collectJSXAncestry } from \"./jsx-ancestry\"\nimport type { Annotation, ExtractedFile, ScannedFile } from \"./types\"\n\nconst JSDOC_BLOCK = /\\/\\*\\*([\\s\\S]*?)\\*\\//g\n\nfunction lineAt(content: string, index: number): number {\n let line = 1\n for (let i = 0; i < index && i < content.length; i++) {\n if (content[i] === \"\\n\") line++\n }\n return line\n}\n\nfunction parseJSDoc(block: string): {\n kind: \"page\" | \"feature\" | \"widget\" | null\n id: string | null\n description: string\n acceptance: string[]\n notFlow: boolean\n} {\n const lines = block\n .split(\"\\n\")\n .map((l) => l.replace(/^\\s*\\*\\s?/, \"\").replace(/^\\s*\\/?\\*+/, \"\"))\n let kind: \"page\" | \"feature\" | \"widget\" | null = null\n let id: string | null = null\n const acceptance: string[] = []\n const desc: string[] = []\n let notFlow = false\n\n for (const raw of lines) {\n const line = raw.trim()\n if (!line) continue\n const uidex = line.match(\n /^@uidex\\s+(page|feature|widget)\\s+(\\S+)(?:\\s+-\\s+(.+))?/\n )\n if (uidex) {\n kind = uidex[1] as \"page\" | \"feature\" | \"widget\"\n id = uidex[2]\n if (uidex[3]) desc.push(uidex[3].trim())\n continue\n }\n if (/^@uidex:not-flow\\b/.test(line)) {\n notFlow = true\n continue\n }\n const accept = line.match(/^@acceptance\\s+(.+)$/)\n if (accept) {\n acceptance.push(accept[1].trim())\n continue\n }\n if (line.startsWith(\"@\")) continue\n desc.push(line)\n }\n\n return {\n kind,\n id,\n description: desc.join(\" \").trim(),\n acceptance,\n notFlow,\n }\n}\n\nexport function extract(files: ScannedFile[]): ExtractedFile[] {\n return files.map((file) => {\n const { exports, diagnostics } = extractUidexExports(file)\n const out: ExtractedFile = {\n file,\n annotations: extractOne(file),\n }\n if (exports.length > 0) out.metadata = exports\n if (diagnostics.length > 0) out.diagnostics = diagnostics\n return out\n })\n}\n\nfunction extractOne(file: ScannedFile): Annotation[] {\n const annotations: Annotation[] = []\n const { content, displayPath } = file\n\n for (const occ of collectJSXAncestry(content)) {\n annotations.push({\n kind: occ.kind,\n id: occ.id,\n file: displayPath,\n line: occ.line,\n ...(occ.ancestors.length > 0 ? { ancestors: occ.ancestors } : {}),\n })\n }\n\n JSDOC_BLOCK.lastIndex = 0\n let jm: RegExpExecArray | null\n while ((jm = JSDOC_BLOCK.exec(content)) !== null) {\n const parsed = parseJSDoc(jm[1])\n const line = lineAt(content, jm.index)\n if (parsed.notFlow) {\n annotations.push({ kind: \"not-flow\", id: \"\", file: displayPath, line })\n }\n if (parsed.kind && parsed.id) {\n const kind: Annotation[\"kind\"] =\n parsed.kind === \"page\"\n ? \"page-doc\"\n : parsed.kind === \"feature\"\n ? \"feature-doc\"\n : \"widget-doc\"\n annotations.push({\n kind,\n id: parsed.id,\n file: displayPath,\n line,\n description: parsed.description || undefined,\n acceptance: parsed.acceptance.length ? parsed.acceptance : undefined,\n })\n } else if (parsed.acceptance.length > 0) {\n annotations.push({\n kind: \"orphan-acceptance\",\n id: \"\",\n file: displayPath,\n line,\n acceptance: parsed.acceptance,\n })\n }\n }\n\n return annotations\n}\n","import { execSync } from \"node:child_process\"\nimport type { GitContext } from \"./types\"\n\nexport interface GitResolveOptions {\n cwd?: string\n env?: NodeJS.ProcessEnv\n}\n\nfunction runGit(args: string[], cwd: string): string | null {\n try {\n const out = execSync(`git ${args.join(\" \")}`, {\n cwd,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n encoding: \"utf8\",\n })\n return out.trim() || null\n } catch {\n return null\n }\n}\n\nexport function resolveGitContext(opts: GitResolveOptions = {}): GitContext {\n const cwd = opts.cwd ?? process.cwd()\n const env = opts.env ?? process.env\n\n const branch =\n env.GITHUB_HEAD_REF ||\n env.GITHUB_REF_NAME ||\n env.BUILDKITE_BRANCH ||\n env.CI_COMMIT_REF_NAME ||\n env.BITBUCKET_BRANCH ||\n runGit([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], cwd) ||\n null\n\n const commit =\n env.GITHUB_SHA ||\n env.BUILDKITE_COMMIT ||\n env.CI_COMMIT_SHA ||\n env.BITBUCKET_COMMIT ||\n runGit([\"rev-parse\", \"HEAD\"], cwd) ||\n null\n\n const pr =\n env.PR_NUMBER ||\n env.GITHUB_PR_NUMBER ||\n parseGitHubRef(env.GITHUB_REF) ||\n env.BUILDKITE_PULL_REQUEST ||\n env.CI_MERGE_REQUEST_IID ||\n env.BITBUCKET_PR_ID ||\n null\n\n return {\n branch: branch || null,\n commit: commit || null,\n pr: pr && pr !== \"false\" ? String(pr) : null,\n }\n}\n\nfunction parseGitHubRef(ref: string | undefined): string | null {\n if (!ref) return null\n const m = ref.match(/^refs\\/pull\\/(\\d+)\\/merge$/)\n return m ? m[1] : null\n}\n","import * as path from \"node:path\"\nimport {\n createRegistry,\n type Entity,\n type EntityRef,\n type Feature,\n type Flow,\n type Metadata,\n type Page,\n type Primitive,\n type Region,\n type Registry,\n type Widget,\n type Element as UidexElement,\n} from \"../entities\"\nimport { DEFAULT_CONVENTIONS } from \"./config\"\nimport { detectRoutes } from \"./routes\"\nimport { globToRegExp } from \"./walk\"\nimport type {\n Annotation,\n ConventionsConfig,\n DetectedRoute,\n Diagnostic,\n DomAttrKind,\n ExtractedFile,\n MetadataExport,\n ScannedFile,\n UidexConfig,\n} from \"./types\"\n\nconst DOM_ATTR_KINDS: ReadonlySet<Annotation[\"kind\"]> = new Set([\n \"element\",\n \"region\",\n \"widget\",\n \"primitive\",\n])\n\nexport interface ResolveContext {\n config: UidexConfig\n extracted: ExtractedFile[]\n flowFiles?: ExtractedFile[]\n}\n\nexport interface ResolveOutput {\n registry: Registry\n entities: Entity[]\n routes: DetectedRoute[]\n diagnostics: Diagnostic[]\n}\n\nfunction resolveConventions(c: ConventionsConfig | undefined): {\n primitives: string[] | false\n features: string | false\n pages: \"auto\" | false\n flows: string[] | false\n regions: \"landmarks\" | false\n} {\n return {\n primitives:\n c?.primitives === undefined\n ? DEFAULT_CONVENTIONS.primitives\n : c.primitives,\n features:\n c?.features === undefined ? DEFAULT_CONVENTIONS.features : c.features,\n pages: c?.pages === undefined ? DEFAULT_CONVENTIONS.pages : c.pages,\n flows: c?.flows === undefined ? DEFAULT_CONVENTIONS.flows : c.flows,\n regions: c?.regions === undefined ? DEFAULT_CONVENTIONS.regions : c.regions,\n }\n}\n\nfunction kebab(str: string): string {\n return str\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/[_\\s]+/g, \"-\")\n .replace(/[^a-zA-Z0-9-]/g, \"\")\n .toLowerCase()\n}\n\nfunction baseName(file: string): string {\n const b = path.posix.basename(file)\n return b.replace(/\\.(tsx|ts|jsx|js|mjs|cjs)$/, \"\")\n}\n\nconst LANDMARK_RE =\n /<(header|nav|main|aside|footer)(\\s[^>]*)?>|role=[\"']region[\"']/gi\n\nfunction extractLandmarks(\n file: ScannedFile\n): Array<{ tag: string; line: number }> {\n const out: Array<{ tag: string; line: number }> = []\n LANDMARK_RE.lastIndex = 0\n let m: RegExpExecArray | null\n while ((m = LANDMARK_RE.exec(file.content)) !== null) {\n const tag = m[1] ?? \"region\"\n const line = 1 + file.content.slice(0, m.index).split(\"\\n\").length - 1\n out.push({ tag, line })\n }\n return out\n}\n\nfunction fileMatchesAny(displayPath: string, patterns: string[]): boolean {\n return patterns.some((g) => globToRegExp(g).test(displayPath))\n}\n\nfunction buildMetaFromExport(exp: MetadataExport): Metadata | undefined {\n const meta: Metadata = {}\n if (exp.name) meta.name = exp.name\n if (exp.description) meta.description = exp.description\n if (exp.acceptance?.length) meta.acceptance = exp.acceptance\n if (exp.features?.length) meta.features = exp.features\n if (exp.widgets?.length) meta.widgets = exp.widgets\n return Object.keys(meta).length > 0 ? meta : undefined\n}\n\n/**\n * Resolve annotations + conventions into a typed Registry.\n * Precedence: configuration > `export const uidex` > DOM attribute > convention.\n */\nexport function resolve(ctx: ResolveContext): ResolveOutput {\n const conventions = resolveConventions(ctx.config.conventions)\n const registry = createRegistry()\n const diagnostics: Diagnostic[] = []\n\n // Index per-file exports by kind. Multiple kinds in one file are\n // disallowed by extract, so a file has at most one export per kind.\n const exportsByFile = new Map<string, Map<string, MetadataExport>>()\n for (const ef of ctx.extracted) {\n if (!ef.metadata) continue\n const map = new Map<string, MetadataExport>()\n for (const m of ef.metadata) map.set(m.kind, m)\n exportsByFile.set(ef.file.displayPath, map)\n }\n function exportFor(\n file: string,\n kind: MetadataExport[\"kind\"]\n ): MetadataExport | undefined {\n return exportsByFile.get(file)?.get(kind)\n }\n\n const allAnnotations: Annotation[] = []\n for (const ef of ctx.extracted) {\n for (const a of ef.annotations) allAnnotations.push(a)\n }\n\n // Parent → ordered, deduped direct-child refs. The parent key is\n // `kind:id` of the innermost JSX ancestor carrying a `data-uidex*`\n // attribute. Used to emit `meta.composes` on containers below.\n const directChildren = new Map<string, EntityRef[]>()\n const seenPerParent = new Map<string, Set<string>>()\n for (const ann of allAnnotations) {\n if (!DOM_ATTR_KINDS.has(ann.kind)) continue\n const parent = ann.ancestors?.[ann.ancestors.length - 1]\n if (!parent) continue\n const pk = `${parent.kind}:${parent.id}`\n const childKey = `${ann.kind}:${ann.id}`\n let seen = seenPerParent.get(pk)\n if (!seen) {\n seen = new Set()\n seenPerParent.set(pk, seen)\n }\n if (seen.has(childKey)) continue\n seen.add(childKey)\n let arr = directChildren.get(pk)\n if (!arr) {\n arr = []\n directChildren.set(pk, arr)\n }\n arr.push({ kind: ann.kind as DomAttrKind, id: ann.id })\n }\n\n function metaWithComposes(\n kind: \"widget\" | \"region\" | \"primitive\",\n id: string,\n base?: Metadata\n ): Metadata | undefined {\n const composes = directChildren.get(`${kind}:${id}`)\n if (!composes || composes.length === 0) return base\n return { ...(base ?? {}), composes }\n }\n\n // ---------- pages ----------\n const routes: DetectedRoute[] =\n conventions.pages === \"auto\"\n ? detectRoutes(ctx.extracted.map((e) => e.file))\n : []\n\n const handledPageFiles = new Set<string>()\n for (const route of routes) {\n const exp = exportFor(route.file, \"page\")\n if (exp && exp.id === false) continue\n const effectiveId = exp && typeof exp.id === \"string\" ? exp.id : route.id\n const meta = exp ? buildMetaFromExport(exp) : undefined\n registry.add({ kind: \"route\", path: route.path, page: effectiveId })\n const page: Page = {\n kind: \"page\",\n id: effectiveId,\n loc: { file: route.file, line: exp?.loc.line },\n ...(meta ? { meta } : {}),\n }\n registry.add(page)\n handledPageFiles.add(route.file)\n }\n\n // Page exports in non-conventional locations.\n for (const ef of ctx.extracted) {\n const exp = exportFor(ef.file.displayPath, \"page\")\n if (!exp || typeof exp.id !== \"string\") continue\n if (handledPageFiles.has(ef.file.displayPath)) continue\n const meta = buildMetaFromExport(exp)\n registry.add({\n kind: \"page\",\n id: exp.id,\n loc: { file: ef.file.displayPath, line: exp.loc.line },\n ...(meta ? { meta } : {}),\n })\n }\n\n // ---------- features ----------\n const featureGlob =\n typeof conventions.features === \"string\" ? conventions.features : null\n const conventionalFeatureDirs = new Set<string>()\n const featureExportsByDir = new Map<string, MetadataExport>()\n const suppressedFeatureDirs = new Set<string>()\n\n if (featureGlob) {\n const re = globToRegExp(featureGlob + \"/**\")\n for (const ef of ctx.extracted) {\n if (!re.test(ef.file.displayPath)) continue\n const dir = extractFeatureDir(ef.file.displayPath, featureGlob)\n if (!dir) continue\n conventionalFeatureDirs.add(dir)\n const exp = exportFor(ef.file.displayPath, \"feature\")\n if (exp) {\n if (exp.id === false) suppressedFeatureDirs.add(dir)\n else if (!featureExportsByDir.has(dir))\n featureExportsByDir.set(dir, exp)\n }\n }\n for (const dir of conventionalFeatureDirs) {\n if (suppressedFeatureDirs.has(dir)) continue\n const exp = featureExportsByDir.get(dir)\n const id =\n exp && typeof exp.id === \"string\" ? exp.id : path.posix.basename(dir)\n const meta = exp ? buildMetaFromExport(exp) : undefined\n const feature: Feature = {\n kind: \"feature\",\n id,\n loc: exp ? { file: exp.loc.file, line: exp.loc.line } : { file: dir },\n ...(meta ? { meta } : {}),\n }\n registry.add(feature)\n }\n }\n\n // Feature exports at non-conventional paths.\n for (const ef of ctx.extracted) {\n const exp = exportFor(ef.file.displayPath, \"feature\")\n if (!exp || typeof exp.id !== \"string\") continue\n if (featureGlob) {\n const dir = extractFeatureDir(ef.file.displayPath, featureGlob)\n if (dir && conventionalFeatureDirs.has(dir)) continue\n }\n const meta = buildMetaFromExport(exp)\n registry.add({\n kind: \"feature\",\n id: exp.id,\n loc: { file: ef.file.displayPath, line: exp.loc.line },\n ...(meta ? { meta } : {}),\n })\n }\n\n // ---------- widgets ----------\n const widgetDomByFile = new Map<string, Annotation[]>()\n for (const a of allAnnotations) {\n if (a.kind !== \"widget\") continue\n const list = widgetDomByFile.get(a.file) ?? []\n list.push(a)\n widgetDomByFile.set(a.file, list)\n }\n const widgetFiles = new Set<string>([\n ...widgetDomByFile.keys(),\n ...[...exportsByFile.entries()]\n .filter(([, kinds]) => kinds.has(\"widget\"))\n .map(([file]) => file),\n ])\n for (const file of widgetFiles) {\n const domAnnotations = widgetDomByFile.get(file) ?? []\n const exp = exportFor(file, \"widget\")\n if (exp && typeof exp.id === \"string\") {\n const exportId = exp.id\n const domIds = domAnnotations.map((a) => a.id)\n if (domAnnotations.length === 0) {\n diagnostics.push({\n code: \"widget-missing-dom\",\n severity: \"error\",\n message: `Widget \"${exportId}\" declared via export const uidex but no data-uidex-widget=\"${exportId}\" attribute found in the same file`,\n file,\n line: exp.loc.line,\n entity: { kind: \"widget\", id: exportId },\n hint: `Add \\`<... data-uidex-widget=\"${exportId}\">\\` at the widget's DOM root`,\n })\n continue\n }\n if (!domIds.includes(exportId)) {\n const domList = domIds.map((i) => `\"${i}\"`).join(\", \")\n diagnostics.push({\n code: \"widget-id-mismatch\",\n severity: \"error\",\n message: `Widget id mismatch in ${file}: export declares \"${exportId}\" but data-uidex-widget attribute(s) are [${domList}]`,\n file,\n line: exp.loc.line,\n entity: { kind: \"widget\", id: exportId },\n hint: `Update either the export or the DOM attribute so both sides use the same id`,\n })\n continue\n }\n const match = domAnnotations.find((a) => a.id === exportId)!\n const meta = metaWithComposes(\n \"widget\",\n exportId,\n buildMetaFromExport(exp)\n )\n const widget: Widget = {\n kind: \"widget\",\n id: exportId,\n loc: { file, line: match.line },\n ...(meta ? { meta } : {}),\n }\n registry.add(widget)\n } else {\n for (const a of domAnnotations) {\n const meta = metaWithComposes(\"widget\", a.id)\n const widget: Widget = {\n kind: \"widget\",\n id: a.id,\n loc: { file: a.file, line: a.line },\n ...(meta ? { meta } : {}),\n }\n registry.add(widget)\n }\n }\n }\n\n // ---------- regions ----------\n if (conventions.regions === \"landmarks\") {\n for (const ef of ctx.extracted) {\n for (const lm of extractLandmarks(ef.file)) {\n const id = kebab(`${lm.tag}`)\n if (!registry.get(\"region\", id)) {\n const meta = metaWithComposes(\"region\", id)\n const region: Region = {\n kind: \"region\",\n id,\n loc: { file: ef.file.displayPath, line: lm.line },\n ...(meta ? { meta } : {}),\n }\n registry.add(region)\n }\n }\n }\n }\n for (const r of allAnnotations.filter((a) => a.kind === \"region\")) {\n const meta = metaWithComposes(\"region\", r.id)\n const region: Region = {\n kind: \"region\",\n id: r.id,\n loc: { file: r.file, line: r.line },\n ...(meta ? { meta } : {}),\n }\n registry.add(region)\n }\n\n // ---------- primitives ----------\n const primitiveConventions = conventions.primitives\n for (const ef of ctx.extracted) {\n const file = ef.file.displayPath\n const exp = exportFor(file, \"primitive\")\n if (exp && exp.id === false) continue // suppression\n if (exp && typeof exp.id === \"string\") {\n const meta = metaWithComposes(\n \"primitive\",\n exp.id,\n buildMetaFromExport(exp)\n )\n const primitive: Primitive = {\n kind: \"primitive\",\n id: exp.id,\n loc: { file, line: exp.loc.line },\n scopes: [computeScope(file)],\n ...(meta ? { meta } : {}),\n }\n registry.add(primitive)\n continue\n }\n const domPrimitives = allAnnotations.filter(\n (a) => a.kind === \"primitive\" && a.file === file\n )\n if (domPrimitives.length > 0) {\n for (const p of domPrimitives) {\n const meta = metaWithComposes(\"primitive\", p.id)\n const primitive: Primitive = {\n kind: \"primitive\",\n id: p.id,\n loc: { file: p.file, line: p.line },\n scopes: [computeScope(p.file)],\n ...(meta ? { meta } : {}),\n }\n registry.add(primitive)\n }\n continue\n }\n if (primitiveConventions && fileMatchesAny(file, primitiveConventions)) {\n const name = kebab(baseName(file))\n if (!name) continue\n const scope = computeScope(file)\n const meta = metaWithComposes(\"primitive\", name)\n const primitive: Primitive = {\n kind: \"primitive\",\n id: name,\n loc: { file },\n scopes: [scope],\n ...(meta ? { meta } : {}),\n }\n registry.add(primitive)\n }\n }\n\n // ---------- elements (annotation-only) ----------\n for (const e of allAnnotations.filter((a) => a.kind === \"element\")) {\n const element: UidexElement = {\n kind: \"element\",\n id: e.id,\n loc: { file: e.file, line: e.line },\n }\n registry.add(element)\n }\n\n // ---------- flows ----------\n if (ctx.flowFiles && conventions.flows) {\n for (const ff of ctx.flowFiles) {\n const notFlowExport = (ff.metadata ?? []).find(\n (m) => m.kind === \"flow\" && m.notFlow === true\n )\n if (notFlowExport) continue\n const flowExport = (ff.metadata ?? []).find(\n (m) => m.kind === \"flow\" && typeof m.id === \"string\"\n )\n const derived = extractFlowsFromSource(ff.file)\n if (\n flowExport &&\n typeof flowExport.id === \"string\" &&\n derived.length === 1\n ) {\n const base = derived[0]\n const flow: Flow = {\n kind: \"flow\",\n id: flowExport.id,\n loc: base.loc,\n touches: base.touches,\n }\n registry.add(flow)\n } else {\n for (const flow of derived) registry.add(flow)\n }\n }\n }\n\n const entities: Entity[] = []\n for (const kind of [\n \"route\",\n \"page\",\n \"feature\",\n \"widget\",\n \"region\",\n \"element\",\n \"primitive\",\n \"flow\",\n ] as const) {\n entities.push(...registry.list(kind))\n }\n\n return { registry, entities, routes, diagnostics }\n}\n\nfunction extractFeatureDir(\n displayPath: string,\n featureGlob: string\n): string | null {\n // featureGlob like \"src/features/*\"\n const parts = featureGlob.split(\"/\")\n const starIdx = parts.indexOf(\"*\")\n if (starIdx === -1) return null\n const prefixParts = parts.slice(0, starIdx)\n const pathParts = displayPath.split(\"/\")\n for (let i = 0; i < prefixParts.length; i++) {\n if (pathParts[i] !== prefixParts[i]) return null\n }\n if (pathParts.length <= starIdx) return null\n return pathParts.slice(0, starIdx + 1).join(\"/\")\n}\n\nfunction computeScope(displayPath: string): string {\n // naive: derive from containing feature or page directory\n const parts = displayPath.split(\"/\")\n const featureIdx = parts.indexOf(\"features\")\n if (featureIdx !== -1 && parts[featureIdx + 1]) {\n return `feature:${parts[featureIdx + 1]}`\n }\n const pagesIdx = parts.indexOf(\"pages\")\n if (pagesIdx !== -1 && parts[pagesIdx + 1]) {\n return `page:${parts[pagesIdx + 1]}`\n }\n return \"global\"\n}\n\n// -------- flow extraction (re-used lightweight variant) --------\n\ninterface FlowFixtureCall {\n id: string\n}\n\nfunction extractFlowsFromSource(file: ScannedFile): Flow[] {\n const flows: Flow[] = []\n const source = file.content\n const describeRe =\n /test\\.describe\\(\\s*(?:'([^']*)'|\"([^\"]*)\")\\s*,\\s*\\{[^}]*tag:\\s*(?:'@uidex:flow'|\"@uidex:flow\"|\\[[^\\]]*@uidex:flow[^\\]]*\\])[^}]*\\}/g\n\n let m: RegExpExecArray | null\n while ((m = describeRe.exec(source)) !== null) {\n const title = m[1] ?? m[2]\n const id = kebab(title)\n const line = 1 + source.slice(0, m.index).split(\"\\n\").length - 1\n const after = source.slice(m.index + m[0].length)\n const arrow = after.match(/=>\\s*\\{/)\n if (!arrow || arrow.index === undefined) continue\n const bodyStart = m.index + m[0].length + arrow.index + arrow[0].length\n let depth = 1\n let bodyEnd = -1\n for (let i = bodyStart; i < source.length; i++) {\n if (source[i] === \"{\") depth++\n else if (source[i] === \"}\") {\n depth--\n if (depth === 0) {\n bodyEnd = i\n break\n }\n }\n }\n if (bodyEnd === -1) continue\n const body = source.slice(bodyStart, bodyEnd)\n const touches = captureUidexIds(body)\n flows.push({\n kind: \"flow\",\n id,\n loc: { file: file.displayPath, line },\n touches: dedupe(touches.map((t) => t.id)),\n })\n }\n return flows\n}\n\nfunction captureUidexIds(body: string): FlowFixtureCall[] {\n const out: FlowFixtureCall[] = []\n const re = /uidex\\(\\s*(?:'([^']+)'|\"([^\"]+)\"|`([^`$]+)`)\\s*\\)/g\n let m: RegExpExecArray | null\n while ((m = re.exec(body)) !== null) {\n out.push({ id: m[1] || m[2] || m[3] })\n }\n return out\n}\n\nfunction dedupe<T>(arr: T[]): T[] {\n return Array.from(new Set(arr))\n}\n","import type { DetectedRoute, ScannedFile } from \"./types\"\n\nconst PAGE_BASENAME = /^page\\.(tsx|ts|jsx|js|mjs|cjs)$/\nconst PAGES_ROUTER_BASENAME = /\\.(tsx|ts|jsx|js|mjs|cjs)$/\nconst ROUTE_BASENAME = /^route\\.(tsx|ts|jsx|js|mjs|cjs)$/\n\n/**\n * Detect framework-aware routes:\n * - Next.js App Router: `**\\/app/**\\/page.tsx` -> `/segments`\n * - Next.js Pages Router: `**\\/pages/**\\/*.tsx` -> `/segments` (excludes _app, _document, api/)\n * - Vite + React Router / TanStack Router:\n * `**\\/routes/**\\/*.tsx` -> `/segments`\n */\nexport function detectRoutes(files: ScannedFile[]): DetectedRoute[] {\n const out: DetectedRoute[] = []\n const seen = new Set<string>()\n\n for (const f of files) {\n const rel = f.displayPath\n const parts = rel.split(\"/\")\n const base = parts[parts.length - 1]\n\n // Next.js App Router: segments after `app/` including page.tsx\n const appIdx = parts.indexOf(\"app\")\n if (appIdx !== -1 && PAGE_BASENAME.test(base)) {\n const routeSegments = parts.slice(appIdx + 1, parts.length - 1)\n const routePath = formatNextAppPath(routeSegments)\n push(out, seen, routePath, f.displayPath)\n continue\n }\n if (appIdx !== -1 && ROUTE_BASENAME.test(base)) {\n // app router \"route handler\" (API) — skip, not a page\n continue\n }\n\n // Next.js Pages Router\n const pagesIdx = parts.indexOf(\"pages\")\n if (pagesIdx !== -1 && PAGES_ROUTER_BASENAME.test(base)) {\n const segs = parts.slice(pagesIdx + 1)\n // skip pages/api\n if (segs[0] === \"api\") continue\n const last = segs[segs.length - 1]\n if (last.startsWith(\"_\")) continue\n const normalized = [\n ...segs.slice(0, -1),\n base.replace(/\\.[^.]+$/, \"\"),\n ].filter((s) => s !== \"index\")\n const routePath = formatNextAppPath(normalized)\n push(out, seen, routePath, f.displayPath)\n continue\n }\n\n // Vite React Router / TanStack Router: `routes/`\n const routesIdx = parts.indexOf(\"routes\")\n if (routesIdx !== -1 && PAGES_ROUTER_BASENAME.test(base)) {\n const segs = parts.slice(routesIdx + 1)\n const last = segs[segs.length - 1]\n if (last.startsWith(\"_\")) continue\n const normalized = [\n ...segs.slice(0, -1),\n base.replace(/\\.[^.]+$/, \"\"),\n ].filter((s) => s !== \"index\" && s !== \"__root\")\n const routePath = formatNextAppPath(normalized)\n push(out, seen, routePath, f.displayPath)\n continue\n }\n }\n\n return out.sort((a, b) => a.path.localeCompare(b.path))\n}\n\nfunction push(\n out: DetectedRoute[],\n seen: Set<string>,\n routePath: string,\n file: string\n): void {\n if (seen.has(routePath)) return\n seen.add(routePath)\n out.push({ id: pathToId(routePath), path: routePath, file })\n}\n\nfunction formatNextAppPath(segments: string[]): string {\n // Drop route groups like \"(marketing)\"\n const kept = segments.filter((s) => !(s.startsWith(\"(\") && s.endsWith(\")\")))\n if (kept.length === 0) return \"/\"\n return \"/\" + kept.join(\"/\")\n}\n\nexport function pathToId(routePath: string): string {\n if (routePath === \"/\") return \"root\"\n return routePath\n .replace(/^\\/+/, \"\")\n .replace(/\\[\\.{3}([^\\]]+)\\]/g, \"$1\")\n .replace(/\\[([^\\]]+)\\]/g, \"$1\")\n .replace(/\\//g, \"-\")\n .replace(/[^a-zA-Z0-9-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n}\n","import * as fs from \"node:fs\"\nimport * as path from \"node:path\"\nimport type { ScannedFile, SourceConfig } from \"./types\"\n\nconst DEFAULT_INCLUDES = [\"**/*.{ts,tsx,js,jsx,mjs,cjs}\"]\nconst BASE_EXCLUDES = [\n \"**/node_modules/**\",\n \"**/dist/**\",\n \"**/build/**\",\n \"**/.next/**\",\n \"**/*.gen.ts\",\n]\nconst TEST_EXCLUDES = [\n \"**/*.test.ts\",\n \"**/*.test.tsx\",\n \"**/*.spec.ts\",\n \"**/*.spec.tsx\",\n]\nconst DEFAULT_EXCLUDES = [...BASE_EXCLUDES, ...TEST_EXCLUDES]\n\n/**\n * Translate a glob to a RegExp. Supports `**`, `*`, `?`, and `{a,b,c}` alternation.\n * The produced pattern matches the full relative path with forward slashes.\n */\nexport function globToRegExp(glob: string): RegExp {\n let i = 0\n let out = \"\"\n while (i < glob.length) {\n const c = glob[i]\n if (c === \"*\" && glob[i + 1] === \"*\") {\n // `**/` → matches zero or more path segments\n if (glob[i + 2] === \"/\") {\n out += \"(?:.*/)?\"\n i += 3\n continue\n }\n out += \".*\"\n i += 2\n continue\n }\n if (c === \"*\") {\n out += \"[^/]*\"\n i++\n continue\n }\n if (c === \"?\") {\n out += \"[^/]\"\n i++\n continue\n }\n if (c === \"{\") {\n const end = glob.indexOf(\"}\", i)\n if (end === -1) {\n out += \"\\\\{\"\n i++\n continue\n }\n const parts = glob\n .slice(i + 1, end)\n .split(\",\")\n .map((p) => p.replace(/[.+^$()|\\\\]/g, \"\\\\$&\"))\n out += `(?:${parts.join(\"|\")})`\n i = end + 1\n continue\n }\n if (/[.+^$()|\\\\]/.test(c)) {\n out += \"\\\\\" + c\n i++\n continue\n }\n out += c\n i++\n }\n return new RegExp(`^${out}$`)\n}\n\nfunction toPosix(p: string): string {\n return p.split(path.sep).join(\"/\")\n}\n\nfunction matchesAny(rel: string, patterns: string[]): boolean {\n return patterns.some((g) => globToRegExp(g).test(rel))\n}\n\nexport interface WalkOptions {\n cwd: string\n globalExcludes?: string[]\n /**\n * When true, do not auto-exclude `*.spec.{ts,tsx}` and `*.test.{ts,tsx}`.\n * Used by flow-file walking, where spec files are the targets.\n */\n includeTests?: boolean\n}\n\nexport function walk(\n sources: SourceConfig[],\n options: WalkOptions\n): ScannedFile[] {\n const { cwd, globalExcludes = [], includeTests = false } = options\n const out: ScannedFile[] = []\n const baseDefaults = includeTests ? BASE_EXCLUDES : DEFAULT_EXCLUDES\n\n for (const source of sources) {\n const includes = source.include?.length ? source.include : DEFAULT_INCLUDES\n const excludes = [\n ...baseDefaults,\n ...globalExcludes,\n ...(source.exclude ?? []),\n ]\n const absRoot = path.resolve(cwd, source.rootDir)\n\n for (const filePath of walkDir(absRoot, absRoot)) {\n const rel = toPosix(path.relative(absRoot, filePath))\n if (matchesAny(rel, excludes)) continue\n if (!matchesAny(rel, includes)) continue\n\n let content: string\n try {\n content = fs.readFileSync(filePath, \"utf8\")\n } catch {\n continue\n }\n\n const relFromCwd = toPosix(path.relative(cwd, filePath))\n const displayPath = source.prefix\n ? `${source.prefix.replace(/\\/$/, \"\")}/${rel}`\n : relFromCwd\n\n out.push({\n sourcePath: filePath,\n relativePath: rel,\n displayPath,\n content,\n })\n }\n }\n\n return out.sort((a, b) => a.displayPath.localeCompare(b.displayPath))\n}\n\nfunction* walkDir(root: string, dir: string): Generator<string> {\n let entries: fs.Dirent[]\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true })\n } catch {\n return\n }\n for (const entry of entries) {\n const full = path.join(dir, entry.name)\n if (entry.isDirectory()) {\n if (\n entry.name === \"node_modules\" ||\n entry.name === \"dist\" ||\n entry.name === \".git\" ||\n entry.name === \"build\" ||\n entry.name === \".next\"\n ) {\n continue\n }\n yield* walkDir(root, full)\n } else if (entry.isFile()) {\n yield full\n }\n }\n}\n","import * as fs from \"node:fs\"\nimport * as path from \"node:path\"\nimport type { Registry } from \"../entities\"\n\nexport interface ScaffoldOptions {\n registry: Registry\n widgetId: string\n outDir: string\n force?: boolean\n fixtureImport?: string\n}\n\nexport interface ScaffoldResult {\n outputPath: string\n written: boolean\n skipped: boolean\n reason?: string\n}\n\nexport function scaffoldWidgetSpec(opts: ScaffoldOptions): ScaffoldResult {\n const {\n registry,\n widgetId,\n outDir,\n force = false,\n fixtureImport = \"./fixtures\",\n } = opts\n const widget = registry.get(\"widget\", widgetId)\n if (!widget) {\n throw new Error(`Widget \"${widgetId}\" not found in registry`)\n }\n\n const criteria = widget.meta?.acceptance ?? []\n const filename = `widget-${widgetId}.spec.ts`\n const outputPath = path.resolve(outDir, filename)\n\n if (fs.existsSync(outputPath) && !force) {\n return {\n outputPath,\n written: false,\n skipped: true,\n reason: `spec already exists at ${outputPath}; pass --force to overwrite`,\n }\n }\n\n const content = renderSpec({\n widgetId,\n criteria,\n fixtureImport,\n })\n\n fs.mkdirSync(path.dirname(outputPath), { recursive: true })\n fs.writeFileSync(outputPath, content, \"utf8\")\n\n return { outputPath, written: true, skipped: false }\n}\n\nfunction renderSpec(args: {\n widgetId: string\n criteria: readonly string[]\n fixtureImport: string\n}): string {\n const lines: string[] = []\n lines.push(\n `import { test, expect } from ${JSON.stringify(args.fixtureImport)}`\n )\n lines.push(\"\")\n lines.push(\n `test.describe(${JSON.stringify(args.widgetId)}, { tag: \"@uidex:flow\" }, () => {`\n )\n if (args.criteria.length === 0) {\n lines.push(` test(\"TODO: add acceptance criteria\", async () => {`)\n lines.push(` // TODO`)\n lines.push(` })`)\n } else {\n for (const criterion of args.criteria) {\n lines.push(` test(${JSON.stringify(criterion)}, async ({ uidex }) => {`)\n lines.push(` // TODO: implement criterion`)\n lines.push(` void uidex`)\n lines.push(` expect(true).toBe(true)`)\n lines.push(` })`)\n lines.push(\"\")\n }\n }\n lines.push(\"})\")\n lines.push(\"\")\n return lines.join(\"\\n\")\n}\n","import { run } from \"../scan/cli\"\n\nrun({ argv: process.argv.slice(2) }).then(\n (result) => {\n if (result.stdout) process.stdout.write(result.stdout)\n if (result.stderr) process.stderr.write(result.stderr)\n process.exit(result.exitCode)\n },\n (error) => {\n process.stderr.write(\n (error instanceof Error ? error.message : String(error)) + \"\\n\"\n )\n process.exit(1)\n }\n)\n"],"mappings":"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","names":["fs","path","fs","path","p","result","fs","path","path","fs","path","summary","p","baseName","out","exports","out","out","exports","out","out","path","out","fs","path","out","p","out","resolve","p","resolve","fs","path","parseFlags","helpText","out"]}
|