uidex 0.5.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/README.md +3 -3
  2. package/dist/cli/cli.cjs +1542 -1227
  3. package/dist/cli/cli.cjs.map +1 -1
  4. package/dist/cloud/index.cjs +385 -175
  5. package/dist/cloud/index.cjs.map +1 -1
  6. package/dist/cloud/index.d.cts +192 -4
  7. package/dist/cloud/index.d.ts +192 -4
  8. package/dist/cloud/index.js +377 -177
  9. package/dist/cloud/index.js.map +1 -1
  10. package/dist/headless/index.cjs +116 -251
  11. package/dist/headless/index.cjs.map +1 -1
  12. package/dist/headless/index.d.cts +6 -11
  13. package/dist/headless/index.d.ts +6 -11
  14. package/dist/headless/index.js +116 -253
  15. package/dist/headless/index.js.map +1 -1
  16. package/dist/index.cjs +776 -1055
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.d.cts +152 -160
  19. package/dist/index.d.ts +152 -160
  20. package/dist/index.js +792 -1066
  21. package/dist/index.js.map +1 -1
  22. package/dist/react/index.cjs +801 -1019
  23. package/dist/react/index.cjs.map +1 -1
  24. package/dist/react/index.d.cts +102 -86
  25. package/dist/react/index.d.ts +102 -86
  26. package/dist/react/index.js +821 -1038
  27. package/dist/react/index.js.map +1 -1
  28. package/dist/scan/index.cjs +1550 -1220
  29. package/dist/scan/index.cjs.map +1 -1
  30. package/dist/scan/index.d.cts +210 -12
  31. package/dist/scan/index.d.ts +210 -12
  32. package/dist/scan/index.js +1547 -1219
  33. package/dist/scan/index.js.map +1 -1
  34. package/package.json +22 -21
  35. package/templates/claude/SKILL.md +71 -0
  36. package/templates/claude/references/audit.md +43 -0
  37. package/templates/claude/{rules.md → references/conventions.md} +25 -28
  38. package/templates/claude/audit.md +0 -43
  39. /package/templates/claude/{api.md → references/api.md} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/scanner/scan/discover.ts","../../src/scanner/scan/config.ts","../../src/scanner/scan/walk.ts","../../src/scanner/scan/extract-uidex-export.ts","../../src/scanner/scan/jsx-ancestry.ts","../../src/scanner/scan/extract.ts","../../src/scanner/scan/resolve.ts","../../src/shared/entities/types.ts","../../src/shared/entities/registry.ts","../../src/scanner/scan/routes.ts","../../src/scanner/scan/audit.ts","../../src/scanner/scan/emit.ts","../../src/scanner/scan/git.ts","../../src/scanner/scan/scaffold.ts","../../src/scanner/scan/pipeline.ts","../../src/scanner/scan/cli.ts","../../src/scanner/scan/ai/index.ts","../../src/scanner/scan/ai/providers/claude.ts","../../src/scanner/scan/ai/templates.ts","../../src/scanner/scan/ai/providers/index.ts","../../src/scanner/cli/parse-args.ts"],"sourcesContent":["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 const WELL_KNOWN_FILES = {\n page: \"uidex.page.ts\",\n feature: \"uidex.feature.ts\",\n} as const satisfies Record<\"page\" | \"feature\", string>\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 { 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 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 \"region\",\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([\n \"feature\",\n \"name\",\n \"features\",\n \"acceptance\",\n \"description\",\n ]),\n primitive: new Set([\"primitive\", \"name\", \"description\"]),\n widget: new Set([\"widget\", \"name\", \"acceptance\", \"description\"]),\n region: new Set([\"region\", \"name\", \"description\"]),\n flow: new Set([\"flow\", \"notFlow\", \"name\", \"description\"]),\n}\n\nconst FALSEABLE: ReadonlySet<MetadataExportKind> = new Set([\n \"page\",\n \"feature\",\n \"primitive\",\n \"region\",\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\" || kind === \"feature\"\n ? readStringArrayField(byKey, \"features\")\n : 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 * 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 \"../../shared/entities\"\nimport { DEFAULT_CONVENTIONS, WELL_KNOWN_FILES } 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 routeDir = path.posix.dirname(route.file)\n const wellKnownPath = `${routeDir}/${WELL_KNOWN_FILES.page}`\n const wellKnownExp = exportFor(wellKnownPath, \"page\")\n const routeExp = exportFor(route.file, \"page\")\n\n const exp = wellKnownExp ?? routeExp\n const locFile = wellKnownExp ? wellKnownPath : route.file\n\n if (wellKnownExp) handledPageFiles.add(wellKnownPath)\n handledPageFiles.add(route.file)\n\n if (wellKnownExp && routeExp) {\n diagnostics.push({\n code: \"competing-uidex-export\",\n severity: \"warning\",\n message: `Page metadata declared in both ${wellKnownPath} and ${route.file}; ${wellKnownPath} takes precedence.`,\n file: route.file,\n line: routeExp.loc.line,\n hint: `Remove the export from ${route.file} or delete ${wellKnownPath}.`,\n })\n }\n\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: locFile, line: exp?.loc.line },\n ...(meta ? { meta } : {}),\n }\n registry.add(page)\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 featureExportFilesByDir = new Map<\n string,\n Array<{ file: string; exp: MetadataExport }>\n >()\n const wellKnownFeatureFileByDir = new Map<string, string>()\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 isWellKnown =\n path.posix.basename(ef.file.displayPath) === WELL_KNOWN_FILES.feature\n if (isWellKnown) wellKnownFeatureFileByDir.set(dir, ef.file.displayPath)\n const exp = exportFor(ef.file.displayPath, \"feature\")\n if (exp) {\n if (exp.id === false) suppressedFeatureDirs.add(dir)\n else {\n let arr = featureExportFilesByDir.get(dir)\n if (!arr) {\n arr = []\n featureExportFilesByDir.set(dir, arr)\n }\n arr.push({ file: ef.file.displayPath, exp })\n }\n }\n }\n for (const dir of conventionalFeatureDirs) {\n if (suppressedFeatureDirs.has(dir)) continue\n const allExports = featureExportFilesByDir.get(dir) ?? []\n const wellKnownPath = wellKnownFeatureFileByDir.get(dir)\n const wellKnownEntry = wellKnownPath\n ? allExports.find((e) => e.file === wellKnownPath)\n : undefined\n\n let exp: MetadataExport | undefined\n if (wellKnownEntry) {\n exp = wellKnownEntry.exp\n for (const other of allExports) {\n if (other.file === wellKnownEntry.file) continue\n diagnostics.push({\n code: \"competing-uidex-export\",\n severity: \"warning\",\n message: `Feature metadata declared in both ${wellKnownEntry.file} and ${other.file}; ${wellKnownEntry.file} takes precedence.`,\n file: other.file,\n line: other.exp.loc.line,\n hint: `Remove the export from ${other.file} or delete ${wellKnownEntry.file}.`,\n })\n }\n } else if (allExports.length > 0) {\n exp = allExports[0].exp\n }\n\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 for (const ef of ctx.extracted) {\n const exp = exportFor(ef.file.displayPath, \"region\")\n if (!exp) continue\n if (exp.id === false) continue\n if (typeof exp.id === \"string\" && !registry.get(\"region\", exp.id)) {\n const meta = buildMetaFromExport(exp)\n const region: Region = {\n kind: \"region\",\n id: exp.id,\n loc: { file: ef.file.displayPath, line: exp.loc.line },\n ...(meta ? { meta } : {}),\n }\n registry.add(region)\n }\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 scope = computeScope(file)\n const primitive: Primitive = {\n kind: \"primitive\",\n id: exp.id,\n loc: { file, line: exp.loc.line },\n ...(scope ? { scopes: [scope] } : {}),\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 domScope = computeScope(p.file)\n const primitive: Primitive = {\n kind: \"primitive\",\n id: p.id,\n loc: { file: p.file, line: p.line },\n ...(domScope ? { scopes: [domScope] } : {}),\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 convScope = computeScope(file)\n const meta = metaWithComposes(\"primitive\", name)\n const primitive: Primitive = {\n kind: \"primitive\",\n id: name,\n loc: { file },\n ...(convScope ? { scopes: [convScope] } : {}),\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 steps: base.steps,\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 | null {\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 null\n}\n\n// -------- flow extraction (re-used lightweight variant) --------\n\ninterface FlowFixtureCall {\n id: string\n action?: 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 steps: touches\n .filter((t) => t.action)\n .map((t) => ({ entityId: t.id, action: t.action })),\n })\n }\n return flows\n}\n\nfunction captureUidexIds(body: string): FlowFixtureCall[] {\n const out: FlowFixtureCall[] = []\n const re =\n /uidex\\(\\s*(?:'([^']+)'|\"([^\"]+)\"|`([^`$]+)`)\\s*\\)(?:\\.(\\w+)\\s*\\()?/g\n let m: RegExpExecArray | null\n while ((m = re.exec(body)) !== null) {\n out.push({ id: m[1] || m[2] || m[3], action: m[4] })\n }\n return out\n}\n\nfunction dedupe<T>(arr: T[]): T[] {\n return Array.from(new Set(arr))\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 FlowStep {\n entityId: string\n action?: string\n}\n\nexport interface Flow {\n kind: \"flow\"\n id: string\n loc: Location\n touches: string[]\n steps: FlowStep[]\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 ReportRecord {\n id: string\n entity?: string\n reporter?: { id?: string; email?: string; name?: string }\n title?: string\n body: string\n type: string\n severity: string\n status: string\n labels?: string[]\n url: string\n route?: string\n pageTitle?: string\n screenshot?: string\n createdAt: string\n}\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 setReports(\n kind: EntityKind,\n id: string,\n reports: readonly ReportRecord[]\n ): void\n getReports(kind: EntityKind, id: string): readonly ReportRecord[]\n listReportKeys(): readonly string[]\n archiveReport?: (reportId: string, reason?: string) => void | Promise<void>\n onReportsChange(cb: () => void): () => void\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 const reports = new Map<string, readonly ReportRecord[]>()\n const reportsCbs = new Set<() => void>()\n\n const setReports = (\n kind: EntityKind,\n id: string,\n records: readonly ReportRecord[]\n ): void => {\n reports.set(`${kind}:${id}`, records)\n for (const cb of reportsCbs) cb()\n }\n\n const getReports = (kind: EntityKind, id: string): readonly ReportRecord[] =>\n reports.get(`${kind}:${id}`) ?? []\n\n const listReportKeys = (): readonly string[] => Array.from(reports.keys())\n\n const onReportsChange = (cb: () => void): (() => void) => {\n reportsCbs.add(cb)\n return () => reportsCbs.delete(cb)\n }\n\n return {\n add,\n get,\n list,\n query,\n byScope,\n touchedBy,\n setReports,\n getReports,\n listReportKeys,\n onReportsChange,\n }\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 path from \"node:path\"\nimport type { Entity, Registry } from \"../../shared/entities\"\nimport { entityKey } from \"../../shared/entities\"\nimport { WELL_KNOWN_FILES } from \"./config\"\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 // ---- Prefer well-known file (uidex.page.ts / uidex.feature.ts) ----\n if (lint) {\n const scannedPaths = new Set(files.map((f) => f.displayPath))\n for (const ef of extracted) {\n if (!ef.metadata) continue\n for (const m of ef.metadata) {\n if (m.kind !== \"page\" && m.kind !== \"feature\") continue\n if (typeof m.id !== \"string\") continue\n const filePath = ef.file.displayPath\n const wellKnownName = WELL_KNOWN_FILES[m.kind]\n if (path.posix.basename(filePath) === wellKnownName) continue\n const dir = path.posix.dirname(filePath)\n const wellKnownPath =\n dir === \".\" ? wellKnownName : `${dir}/${wellKnownName}`\n if (scannedPaths.has(wellKnownPath)) continue\n const kindLabel = m.kind === \"page\" ? \"Page\" : \"Feature\"\n diagnostics.push({\n code: \"prefer-well-known-file\",\n severity: \"info\",\n message: `${kindLabel} \"${m.id}\" metadata lives on ${filePath}; prefer ${wellKnownPath}`,\n file: filePath,\n line: m.loc.line,\n entity: { kind: m.kind, id: m.id },\n hint: `Move the \\`export const uidex\\` block to ${wellKnownPath} and remove it from ${filePath}.`,\n })\n }\n }\n }\n\n // ---- Dynamic data-uidex* attribute (expression instead of string literal) ----\n if (lint) {\n const dynamicAttrRe =\n /\\bdata-uidex(?:-(region|widget|primitive))?\\s*=\\s*\\{/g\n for (const f of files) {\n let m: RegExpExecArray | null\n dynamicAttrRe.lastIndex = 0\n while ((m = dynamicAttrRe.exec(f.content)) !== null) {\n const kind = m[1] ?? \"element\"\n let line = 1\n for (let i = 0; i < m.index; i++) if (f.content[i] === \"\\n\") line++\n const attrName = m[1] ? `data-uidex-${m[1]}` : \"data-uidex\"\n diagnostics.push({\n code: \"dynamic-attr\",\n severity: \"warning\",\n message: `\\`${attrName}={…}\\` uses a dynamic expression; the scanner cannot resolve the ${kind} id statically`,\n file: f.displayPath,\n line,\n hint: dynamicAttrHint(kind),\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 tagRe = /<(button|a|input|select|textarea)(?=[\\s/>])/g\n let m: RegExpExecArray | null\n while ((m = tagRe.exec(f.content)) !== null) {\n const afterTag = m.index + m[0].length\n const closeIdx = findJsxOpeningEnd(f.content, afterTag)\n if (closeIdx === -1) continue\n const attrs = f.content.slice(afterTag, closeIdx)\n if (attrs.includes(\"data-uidex\")) continue\n let line = 1\n for (let i = 0; i < m.index; i++) if (f.content[i] === \"\\n\") line++\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\n // Build lookup: file displayPath → declared feature cross-references\n const declaredFeatures = new Map<string, ReadonlySet<string>>()\n for (const ef of extracted) {\n if (!ef.metadata) continue\n for (const m of ef.metadata) {\n if (m.features && m.features.length > 0) {\n declaredFeatures.set(ef.file.displayPath, new Set(m.features))\n }\n }\n }\n\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]\n if (!scope) continue\n const [kind, id] = scope.split(\":\")\n const importerSegments = f.displayPath.split(\"/\")\n\n // Same scope directory — not a leak\n if (\n importerSegments.includes(id) &&\n importerSegments.includes(kind + \"s\")\n ) {\n continue\n }\n\n // Route-feature affinity: a page whose path contains the feature\n // id is the feature's UI surface (e.g. app/editor/page-config/page.tsx\n // importing from feature:page-config)\n if (kind === \"feature\" && importerSegments.includes(id)) continue\n\n // Declared cross-reference: the importer's `export const uidex`\n // lists this feature in its `features` array\n if (\n kind === \"feature\" &&\n declaredFeatures.get(f.displayPath)?.has(id)\n ) {\n continue\n }\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 // ---- 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\n/**\n * Walk from `start` (just after the tag name) to find the closing `>` or `/>` of a\n * JSX opening element, skipping over quoted strings and `{…}` expression blocks that\n * may contain `>` characters (arrow functions, generics, comparisons).\n */\nfunction findJsxOpeningEnd(src: string, start: number): number {\n let i = start\n while (i < src.length) {\n const ch = src[i]\n if (ch === \">\" || (ch === \"/\" && src[i + 1] === \">\")) return i\n if (ch === '\"' || ch === \"'\" || ch === \"`\") {\n i = skipString(src, i)\n } else if (ch === \"{\") {\n i = skipBraces(src, i)\n } else {\n i++\n }\n }\n return -1\n}\n\nfunction skipString(src: string, start: number): number {\n const quote = src[start]\n let i = start + 1\n while (i < src.length) {\n if (src[i] === \"\\\\\" && quote !== \"`\") {\n i += 2\n continue\n }\n if (quote === \"`\" && src[i] === \"$\" && src[i + 1] === \"{\") {\n i = skipBraces(src, i + 1)\n continue\n }\n if (src[i] === quote) return i + 1\n i++\n }\n return i\n}\n\nfunction skipBraces(src: string, start: number): number {\n let depth = 1\n let i = start + 1\n while (i < src.length && depth > 0) {\n const ch = src[i]\n if (ch === \"{\") {\n depth++\n i++\n } else if (ch === \"}\") {\n depth--\n i++\n } else if (ch === '\"' || ch === \"'\" || ch === \"`\") {\n i = skipString(src, i)\n } else {\n i++\n }\n }\n return i\n}\n\nfunction dynamicAttrHint(kind: string): string {\n if (kind === \"region\") {\n return (\n `Use a string literal: \\`data-uidex-region=\"id\"\\`, or declare the ` +\n `region via \\`export const uidex = { region: \"id\" } as const satisfies ` +\n `Uidex.Region\\` on the file that passes the region value`\n )\n }\n return (\n `The scanner requires string-literal attribute values. If this ` +\n `component forwards the annotation via a prop, restructure so the ` +\n `caller provides the annotated element directly (e.g. via a slot or ` +\n `render prop) with a string-literal \\`data-uidex\\` attribute`\n )\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 \"../../shared/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(\" features?: readonly FeatureId[]\")\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 Region {\")\n lines.push(\" region: RegionId | false\")\n lines.push(\" name?: 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 { 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 fs from \"node:fs\"\nimport * as path from \"node:path\"\nimport type { Registry } from \"../../shared/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 * as fs from \"node:fs\"\nimport * as path from \"node:path\"\nimport type { Registry } from \"../../shared/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","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\nimport { parseArgs } from \"../cli/parse-args\"\n\ntype Flags = Record<string, string | boolean>\n\nexport async function run(opts: CliOptions): Promise<CliResult> {\n const cwd = opts.cwd ?? process.cwd()\n const { positional, flags } = parseArgs(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 \" api <METHOD> <PATH> Call the uidex API\",\n \" api --list Show available API routes\",\n \" api login Authenticate via browser\",\n \" api login --token <tok> Store an auth token directly\",\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 { dest: \".claude/commands/uidex/api.md\", template: \"claude/api.md\" },\n]\n\nexport const claudeProvider: AiProvider = {\n id: \"claude\",\n label: \"Claude Code\",\n description:\n \"Adds .claude/rules/uidex.md, /uidex:audit, and /uidex:api slash commands.\",\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","export function parseArgs(args: string[]): {\n positional: string[]\n flags: Record<string, string | boolean>\n} {\n const positional: string[] = []\n const flags: Record<string, string | boolean> = {}\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"],"mappings":"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","names":["path","fs","path","out","p","out","out","out","path","out","out","resolve","p","path","summary","p","baseName","out","skipString","out","fs","path","fs","path","resolve","fs","path","fs","path","fs","path","p","result","helpText","out"]}
1
+ {"version":3,"sources":["../../src/scanner/scan/discover.ts","../../src/scanner/scan/config.ts","../../src/scanner/scan/walk.ts","../../src/scanner/scan/ast.ts","../../src/scanner/scan/extract-uidex-export.ts","../../src/scanner/scan/flow-facts.ts","../../src/scanner/scan/jsx-ancestry.ts","../../src/scanner/scan/extract.ts","../../src/scanner/scan/resolve.ts","../../src/shared/entities/types.ts","../../src/shared/entities/registry.ts","../../src/scanner/scan/routes.ts","../../src/scanner/scan/audit.ts","../../src/scanner/scan/emit.ts","../../src/scanner/scan/git.ts","../../src/scanner/scan/scaffold.ts","../../src/scanner/scan/pipeline.ts","../../src/scanner/scan/fix.ts","../../src/scanner/scan/rename.ts","../../src/scanner/scan/cli.ts","../../src/scanner/scan/ai/index.ts","../../src/scanner/scan/ai/providers/claude.ts","../../src/scanner/scan/ai/templates.ts","../../src/scanner/scan/ai/providers/index.ts","../../src/scanner/cli/parse-args.ts"],"sourcesContent":["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 { UidexConfig } from \"./types\"\n\nexport const WELL_KNOWN_FILES = {\n page: \"uidex.page.ts\",\n feature: \"uidex.feature.ts\",\n} as const satisfies Record<\"page\" | \"feature\", string>\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 \"audit\",\n \"conventions\",\n])\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.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 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 { 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 path from \"node:path\"\nimport { parseSync } from \"oxc-parser\"\nimport type { Program } from \"oxc-parser\"\nimport type { ScannedFile } from \"./types\"\n\n/**\n * Shared parse layer for the scanner. Each file is parsed exactly once in\n * the extract phase; the resulting AST never leaves it (ExtractedFile must\n * stay JSON-serializable for the bundler-plugin watchers).\n *\n * oxc spans are UTF-16 code-unit offsets, i.e. they index directly into the\n * JS source string (verified against oxc-parser@0.135.0).\n */\nexport interface ParsedComment {\n type: \"Line\" | \"Block\"\n value: string\n start: number\n end: number\n}\n\nexport interface ParsedSource {\n /** null when parsing failed catastrophically — callers degrade to empty facts */\n program: Program | null\n /** true when oxc reported recoverable errors (program is still usable) */\n hasErrors: boolean\n /** all comments in source order; empty when parsing failed */\n comments: ParsedComment[]\n /** offset → 1-based line */\n lineAt(offset: number): number\n}\n\ntype Lang = \"js\" | \"jsx\" | \"ts\" | \"tsx\"\n\nfunction langFor(sourcePath: string): Lang {\n switch (path.extname(sourcePath)) {\n case \".tsx\":\n return \"tsx\"\n case \".ts\":\n case \".mts\":\n case \".cts\":\n return \"ts\"\n default:\n // .js/.jsx/.mjs/.cjs — JSX-in-.js is common in React repos, and jsx\n // is a superset of what the scanner needs from plain js.\n return \"jsx\"\n }\n}\n\nfunction makeLineAt(content: string): (offset: number) => number {\n // Offsets of each line start; binary-searched per lookup.\n const starts = [0]\n for (let i = 0; i < content.length; i++) {\n if (content[i] === \"\\n\") starts.push(i + 1)\n }\n return (offset) => {\n let lo = 0\n let hi = starts.length - 1\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1\n if (starts[mid] <= offset) lo = mid\n else hi = mid - 1\n }\n return lo + 1\n }\n}\n\nexport function parseSource(file: ScannedFile): ParsedSource {\n const lineAt = makeLineAt(file.content)\n try {\n const result = parseSync(file.sourcePath, file.content, {\n lang: langFor(file.sourcePath),\n sourceType: \"module\",\n })\n return {\n program: result.program,\n hasErrors: result.errors.length > 0,\n comments: (result.comments ?? []) as ParsedComment[],\n lineAt,\n }\n } catch {\n // Same contract as the old state machine: malformed input yields no\n // facts rather than wrong facts.\n return { program: null, hasErrors: true, comments: [], lineAt }\n }\n}\n\nexport interface AstNode {\n type: string\n start: number\n end: number\n [key: string]: unknown\n}\n\nfunction isNode(value: unknown): value is AstNode {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { type?: unknown }).type === \"string\"\n )\n}\n\n/**\n * Depth-first walk over every AST node. `visit` may return `false` to skip\n * the node's children. Hand-rolled (recurse into any object/array value\n * carrying a `type`) so we don't depend on oxc's Visitor API surface.\n */\nexport function walkAst(\n root: unknown,\n visit: (node: AstNode) => boolean | undefined\n): void {\n if (!isNode(root)) return\n if (visit(root) === false) return\n for (const key of Object.keys(root)) {\n if (key === \"type\" || key === \"start\" || key === \"end\") continue\n const value = root[key]\n if (Array.isArray(value)) {\n for (const item of value) walkAst(item, visit)\n } else if (isNode(value)) {\n walkAst(value, visit)\n }\n }\n}\n\n/**\n * Strips TypeScript expression wrappers (`as`, `satisfies`, `!`, parens) so\n * callers see the underlying expression.\n */\nexport function unwrapTsExpression(expr: AstNode): AstNode {\n let node = expr\n for (;;) {\n switch (node.type) {\n case \"TSAsExpression\":\n case \"TSSatisfiesExpression\":\n case \"TSNonNullExpression\":\n case \"TSTypeAssertion\":\n case \"ParenthesizedExpression\": {\n const inner = node.expression\n if (!isNode(inner)) return node\n node = inner\n break\n }\n default:\n return node\n }\n }\n}\n","import { parseSource, unwrapTsExpression } from \"./ast\"\nimport type { AstNode, ParsedSource } from \"./ast\"\nimport type {\n Diagnostic,\n MetadataExport,\n MetadataExportKind,\n ScannedFile,\n Span,\n} from \"./types\"\n\n/**\n * Reads `export const uidex = <literal>` blocks from the shared oxc AST.\n * Only plain literals are accepted (objects / arrays / strings / numbers /\n * booleans / null, with optional `as const` / `satisfies` wrappers); anything\n * computed is rejected with an error diagnostic. Spans are recorded on the\n * extracted metadata so `--fix` codemods and `uidex rename` can edit source.\n */\n\ninterface SourcePos {\n offset: number\n line: number\n column: number\n}\n\ninterface LitEntry {\n key: string\n value: LitValue\n keyPos: SourcePos\n /** whole-property span, extended over one adjacent comma (removal-ready) */\n span: Span\n}\n\ntype LitValue =\n | { kind: \"string\"; value: string; pos: SourcePos; span: Span }\n | { kind: \"number\"; value: number; pos: SourcePos; span: Span }\n | { kind: \"boolean\"; value: boolean; pos: SourcePos; span: Span }\n | { kind: \"null\"; pos: SourcePos; span: Span }\n | { kind: \"array\"; items: LitValue[]; pos: SourcePos; span: Span }\n | { kind: \"object\"; entries: LitEntry[]; pos: SourcePos; span: Span }\n\nexport interface UidexExportExtractResult {\n exports: MetadataExport[]\n diagnostics: Diagnostic[]\n}\n\nconst KIND_DISCRIMINATORS = [\n \"page\",\n \"feature\",\n \"primitive\",\n \"widget\",\n \"region\",\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([\n \"feature\",\n \"name\",\n \"features\",\n \"acceptance\",\n \"description\",\n ]),\n primitive: new Set([\"primitive\", \"name\", \"description\"]),\n widget: new Set([\"widget\", \"name\", \"acceptance\", \"description\"]),\n region: new Set([\"region\", \"name\", \"description\"]),\n flow: new Set([\"flow\", \"notFlow\", \"name\", \"description\"]),\n}\n\nconst FALSEABLE: ReadonlySet<MetadataExportKind> = new Set([\n \"page\",\n \"feature\",\n \"primitive\",\n \"region\",\n])\n\n/** Expected `satisfies Uidex.<X>` type name per discriminator. */\nconst SATISFIES_NAMES: Record<Discriminator, string> = {\n page: \"Page\",\n feature: \"Feature\",\n primitive: \"Primitive\",\n widget: \"Widget\",\n region: \"Region\",\n flow: \"Flow\",\n notFlow: \"NotFlow\",\n}\nconst KNOWN_SATISFIES = new Set(Object.values(SATISFIES_NAMES))\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 parsed?: ParsedSource\n): UidexExportExtractResult {\n const exports: MetadataExport[] = []\n const diagnostics: Diagnostic[] = []\n const { content, displayPath } = file\n const p = parsed ?? parseSource(file)\n if (p.program === null) return { exports, diagnostics }\n\n for (const stmt of p.program.body as unknown as AstNode[]) {\n if (stmt.type !== \"ExportNamedDeclaration\") continue\n const decl = stmt.declaration as AstNode | null | undefined\n if (!isNode(decl) || decl.type !== \"VariableDeclaration\") continue\n if (decl.kind !== \"const\") continue\n for (const declarator of (decl.declarations as AstNode[] | undefined) ??\n []) {\n const id = declarator.id as AstNode | undefined\n if (!id || id.type !== \"Identifier\" || String(id.name) !== \"uidex\") {\n continue\n }\n const headerPos = posAt(content, stmt.start, p)\n try {\n const init = declarator.init as AstNode | null | undefined\n if (!isNode(init)) {\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n \"`export const uidex` must be assigned an object literal.\",\n headerPos\n )\n }\n const value = toLitValue(unwrapTsExpression(init), content, p)\n const metadata = buildMetadata(\n value,\n displayPath,\n file.sourcePath,\n headerPos,\n diagnostics\n )\n metadata.span = statementSpan(stmt, content)\n checkSatisfies(init, metadata, displayPath, p, diagnostics)\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\n return { exports, diagnostics }\n}\n\n/* ---------- AST → LitValue ---------- */\n\nfunction toLitValue(node: AstNode, content: string, p: ParsedSource): LitValue {\n const unwrapped = unwrapTsExpression(node)\n const pos = posAt(content, unwrapped.start, p)\n const span: Span = { start: unwrapped.start, end: unwrapped.end }\n\n switch (unwrapped.type) {\n case \"Literal\": {\n const v = unwrapped.value\n if (typeof v === \"string\") return { kind: \"string\", value: v, pos, span }\n if (typeof v === \"number\") {\n if (!Number.isFinite(v)) {\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n `Invalid numeric literal in \\`export const uidex\\`.`,\n pos\n )\n }\n return { kind: \"number\", value: v, pos, span }\n }\n if (typeof v === \"boolean\") {\n return { kind: \"boolean\", value: v, pos, span }\n }\n if (v === null && unwrapped.raw === \"null\") {\n return { kind: \"null\", pos, span }\n }\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n `Unsupported literal in \\`export const uidex\\`; only strings, numbers, booleans, and null are allowed.`,\n pos\n )\n }\n case \"UnaryExpression\": {\n // Negative numbers parse as unary minus on a numeric literal.\n const arg = unwrapped.argument as AstNode | undefined\n if (\n unwrapped.operator === \"-\" &&\n isNode(arg) &&\n arg.type === \"Literal\" &&\n typeof arg.value === \"number\"\n ) {\n return { kind: \"number\", value: -(arg.value as number), pos, span }\n }\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n \"Unary expressions are not allowed in `export const uidex`.\",\n pos\n )\n }\n case \"TemplateLiteral\": {\n const expressions = (unwrapped.expressions as AstNode[] | undefined) ?? []\n if (expressions.length > 0) {\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 pos\n )\n }\n const quasis = (unwrapped.quasis as AstNode[] | undefined) ?? []\n const cooked =\n (quasis[0]?.value as { cooked?: string } | undefined)?.cooked ?? \"\"\n return { kind: \"string\", value: cooked, pos, span }\n }\n case \"Identifier\": {\n const name = String(unwrapped.name)\n if (name === \"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 pos\n )\n }\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n `Identifier reference \"${name}\" is not allowed in \\`export const uidex\\`; the right-hand side must be a plain literal.`,\n pos\n )\n }\n case \"ObjectExpression\":\n return objectLit(unwrapped, content, p, pos, span)\n case \"ArrayExpression\":\n return arrayLit(unwrapped, content, p, pos, span)\n case \"SpreadElement\":\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 pos\n )\n case \"CallExpression\":\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n \"Function calls are not allowed in `export const uidex`; the right-hand side must be a plain literal.\",\n pos\n )\n case \"ConditionalExpression\":\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n \"Conditional expressions are not allowed in `export const uidex`; the right-hand side must be a plain literal.\",\n pos\n )\n default:\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n `Computed expressions are not allowed in \\`export const uidex\\`; the right-hand side must be a plain literal.`,\n pos\n )\n }\n}\n\nfunction objectLit(\n node: AstNode,\n content: string,\n p: ParsedSource,\n pos: SourcePos,\n span: Span\n): LitValue {\n const entries: LitEntry[] = []\n const seen = new Set<string>()\n for (const prop of (node.properties as AstNode[] | undefined) ?? []) {\n if (prop.type === \"SpreadElement\") {\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n \"Spread (`...`) is not allowed inside `export const uidex`.\",\n posAt(content, prop.start, p)\n )\n }\n if (prop.type !== \"Property\") {\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n \"Unexpected member inside `export const uidex` object.\",\n posAt(content, prop.start, p)\n )\n }\n const keyNode = prop.key as AstNode\n const keyPos = posAt(content, keyNode.start, p)\n if (prop.shorthand) {\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n `Shorthand property \"${String(keyNode.name)}\" is not allowed; write \"${String(keyNode.name)}: ...\" with a literal value.`,\n keyPos\n )\n }\n let key: string\n if (prop.computed) {\n if (keyNode.type !== \"Literal\" || typeof keyNode.value !== \"string\") {\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n \"Computed property keys must be string literals in `export const uidex`.\",\n keyPos\n )\n }\n key = keyNode.value\n } else if (keyNode.type === \"Identifier\") {\n key = String(keyNode.name)\n } else if (\n keyNode.type === \"Literal\" &&\n typeof keyNode.value === \"string\"\n ) {\n key = keyNode.value\n } else {\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n \"Numeric property keys are not allowed in `export const uidex`.\",\n keyPos\n )\n }\n if (seen.has(key)) {\n throw new ExtractError(\n \"uidex-export-duplicate-field\",\n `Duplicate field \"${key}\" in \\`export const uidex\\`.`,\n keyPos\n )\n }\n seen.add(key)\n const value = toLitValue(prop.value as AstNode, content, p)\n entries.push({\n key,\n value,\n keyPos,\n span: removalSpan(content, prop.start, prop.end),\n })\n }\n return { kind: \"object\", entries, pos, span }\n}\n\nfunction arrayLit(\n node: AstNode,\n content: string,\n p: ParsedSource,\n pos: SourcePos,\n span: Span\n): LitValue {\n const items: LitValue[] = []\n for (const el of (node.elements as Array<AstNode | null> | undefined) ?? []) {\n if (el === null) {\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n \"Array holes are not allowed in `export const uidex`.\",\n pos\n )\n }\n if (el.type === \"SpreadElement\") {\n throw new ExtractError(\n \"uidex-export-invalid-literal\",\n \"Spread (`...`) is not allowed inside `export const uidex`.\",\n posAt(content, el.start, p)\n )\n }\n items.push(toLitValue(el, content, p))\n }\n return { kind: \"array\", items, pos, span }\n}\n\n/* ---------- satisfies cross-check ---------- */\n\n/**\n * When the export is written `satisfies Uidex.<X>` and X is one of the known\n * kind names, warn if it contradicts the declared discriminator. Unknown or\n * unqualified type names are left alone — they may be project aliases.\n */\nfunction checkSatisfies(\n init: AstNode,\n metadata: MetadataExport,\n file: string,\n p: ParsedSource,\n diagnostics: Diagnostic[]\n): void {\n let node: AstNode | undefined = init\n let satisfiesType: AstNode | undefined\n while (isNode(node)) {\n if (node.type === \"TSSatisfiesExpression\") {\n satisfiesType = node.typeAnnotation as AstNode | undefined\n break\n }\n if (\n node.type === \"TSAsExpression\" ||\n node.type === \"TSNonNullExpression\" ||\n node.type === \"TSTypeAssertion\" ||\n node.type === \"ParenthesizedExpression\"\n ) {\n node = node.expression as AstNode | undefined\n continue\n }\n break\n }\n if (!isNode(satisfiesType) || satisfiesType.type !== \"TSTypeReference\") return\n const typeName = satisfiesType.typeName as AstNode | undefined\n if (!isNode(typeName) || typeName.type !== \"TSQualifiedName\") return\n const left = typeName.left as AstNode | undefined\n const right = typeName.right as AstNode | undefined\n if (!isNode(left) || left.type !== \"Identifier\" || left.name !== \"Uidex\") {\n return\n }\n if (!isNode(right) || right.type !== \"Identifier\") return\n const actual = String(right.name)\n if (!KNOWN_SATISFIES.has(actual)) return\n\n const discriminator: Discriminator = metadata.notFlow\n ? \"notFlow\"\n : (metadata.kind as Discriminator)\n const expected = SATISFIES_NAMES[discriminator]\n if (actual === expected) return\n diagnostics.push({\n code: \"uidex-export-satisfies-mismatch\",\n severity: \"warning\",\n message: `\\`export const uidex\\` declares kind \"${discriminator}\" but is annotated \\`satisfies Uidex.${actual}\\`; expected \\`Uidex.${expected}\\`.`,\n file,\n line: p.lineAt(satisfiesType.start),\n hint: `Change the annotation to \\`satisfies Uidex.${expected}\\` or fix the kind discriminator.`,\n })\n}\n\n/* ---------- metadata building ---------- */\n\nfunction buildMetadata(\n value: LitValue,\n file: string,\n sourcePath: 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, LitEntry>()\n for (const entry of value.entries) byKey.set(entry.key, entry)\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 entry of value.entries) {\n if (!allowed.has(entry.key)) {\n throw new ExtractError(\n \"uidex-export-unknown-field\",\n `Unknown field \"${entry.key}\" in \\`export const uidex\\` for kind \"${kind}\". Allowed: ${Array.from(\n allowed\n )\n .sort()\n .join(\", \")}.`,\n entry.value.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)!.value\n let id: string | false\n if (discriminator === \"notFlow\") {\n if (idValue.kind !== \"boolean\" || idValue.value !== true) {\n throw new ExtractError(\n \"uidex-export-invalid-field\",\n \"`notFlow` must be `true`.\",\n idValue.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\")?.values\n const description = readStringField(byKey, \"description\")\n const name = readStringField(byKey, \"name\")\n if (name === \"\") {\n const entry = byKey.get(\"name\")!\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: entry.value.pos.line,\n fix: {\n description: \"Remove the empty `name` field\",\n edits: [\n {\n path: sourcePath,\n start: entry.span.start,\n end: entry.span.end,\n replacement: \"\",\n },\n ],\n },\n })\n }\n const featuresField =\n kind === \"page\" || kind === \"feature\"\n ? readStringArrayField(byKey, \"features\")\n : undefined\n const widgetsField =\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 (featuresField) {\n metadata.features = featuresField.values\n metadata.featureSpans = featuresField.spans\n }\n if (widgetsField) {\n metadata.widgets = widgetsField.values\n metadata.widgetSpans = widgetsField.spans\n }\n if (notFlow) metadata.notFlow = true\n if (typeof id === \"string\" && idValue.kind === \"string\") {\n metadata.idSpan = idValue.span\n }\n const fieldSpans: Record<string, Span> = {}\n for (const entry of value.entries) fieldSpans[entry.key] = entry.span\n metadata.fieldSpans = fieldSpans\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, LitEntry>,\n name: string\n): string | undefined {\n const entry = byKey.get(name)\n if (!entry) return undefined\n if (entry.value.kind !== \"string\") {\n throw new ExtractError(\n \"uidex-export-invalid-field\",\n `\\`${name}\\` must be a string.`,\n entry.value.pos\n )\n }\n return entry.value.value\n}\n\nfunction readStringArrayField(\n byKey: Map<string, LitEntry>,\n name: string\n): { values: string[]; spans: Span[] } | undefined {\n const entry = byKey.get(name)\n if (!entry) return undefined\n if (entry.value.kind !== \"array\") {\n throw new ExtractError(\n \"uidex-export-invalid-field\",\n `\\`${name}\\` must be an array of strings.`,\n entry.value.pos\n )\n }\n const values: string[] = []\n const spans: Span[] = []\n for (const item of entry.value.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 values.push(item.value)\n spans.push(item.span)\n }\n return { values, spans }\n}\n\n/* ---------- utilities ---------- */\n\nfunction posAt(content: string, offset: number, p: ParsedSource): SourcePos {\n const lineStart = content.lastIndexOf(\"\\n\", offset - 1) + 1\n return { offset, line: p.lineAt(offset), column: offset - lineStart + 1 }\n}\n\n/**\n * Extends a property span over one adjacent comma (trailing preferred) so\n * deleting the span removes the property without leaving a dangling comma.\n */\nfunction removalSpan(content: string, start: number, end: number): Span {\n let e = end\n while (e < content.length && /[ \\t]/.test(content[e])) e++\n if (content[e] === \",\") return { start, end: e + 1 }\n let s = start\n while (s > 0 && /[\\s]/.test(content[s - 1])) s--\n if (content[s - 1] === \",\") return { start: s - 1, end }\n return { start, end }\n}\n\n/**\n * Span of the whole export statement, extended over a trailing semicolon and\n * the line break that follows it, so deleting the span removes the line.\n */\nfunction statementSpan(stmt: AstNode, content: string): Span {\n let end = stmt.end\n while (end < content.length && /[ \\t]/.test(content[end])) end++\n if (content[end] === \";\") end++\n while (end < content.length && /[ \\t]/.test(content[end])) end++\n if (content[end] === \"\\r\") end++\n if (content[end] === \"\\n\") end++\n return { start: stmt.start, end }\n}\n\nfunction isNode(value: unknown): value is AstNode {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { type?: unknown }).type === \"string\"\n )\n}\n","import { walkAst } from \"./ast\"\nimport type { AstNode, ParsedSource } from \"./ast\"\nimport type { DynamicFlowCallFact, FlowCallFact, FlowFact } from \"./types\"\n\n/**\n * Extracts tagged flow describes (`test.describe(\"...\", { tag: \"@uidex:flow\" },\n * fn)`) and the `uidex(\"id\")` calls inside them from the parsed AST.\n *\n * Only statically analysable calls are captured: the describe title must be a\n * string literal and `uidex(...)` arguments must be string literals or\n * expressionless template literals. A chained method that is immediately\n * invoked (`uidex(\"x\").fill(...)`) contributes that method name as the call's\n * action.\n */\nexport function collectFlowFacts(\n parsed: ParsedSource,\n content: string\n): FlowFact[] {\n if (parsed.program === null || !content.includes(\"test.describe\")) {\n return []\n }\n\n const facts: FlowFact[] = []\n walkAst(parsed.program, (node) => {\n if (node.type !== \"CallExpression\") return undefined\n const fact = readTaggedDescribe(node, parsed)\n if (fact) facts.push(fact)\n return undefined\n })\n return facts\n}\n\nfunction readTaggedDescribe(\n call: AstNode,\n parsed: ParsedSource\n): FlowFact | null {\n const callee = call.callee as AstNode | undefined\n if (\n !callee ||\n callee.type !== \"MemberExpression\" ||\n !isIdentifier(callee.object, \"test\") ||\n !isIdentifier(callee.property, \"describe\")\n ) {\n return null\n }\n const args = (call.arguments as AstNode[] | undefined) ?? []\n const title = stringLiteralValue(args[0])\n if (title === null) return null\n if (!hasFlowTag(args[1])) return null\n\n const body = args[2]\n const { calls, dynamicCalls } = body\n ? collectUidexCalls(body, parsed)\n : { calls: [], dynamicCalls: [] }\n return {\n title,\n line: parsed.lineAt(call.start),\n calls,\n ...(dynamicCalls.length > 0 ? { dynamicCalls } : {}),\n }\n}\n\nfunction hasFlowTag(node: AstNode | undefined): boolean {\n if (!node || node.type !== \"ObjectExpression\") return false\n for (const prop of (node.properties as AstNode[] | undefined) ?? []) {\n if (prop.type !== \"Property\") continue\n const key = prop.key as AstNode | undefined\n const keyName =\n key?.type === \"Identifier\"\n ? String(key.name)\n : key?.type === \"Literal\"\n ? String(key.value)\n : null\n if (keyName !== \"tag\") continue\n const value = prop.value as AstNode | undefined\n if (!value) return false\n if (stringLiteralValue(value) === \"@uidex:flow\") return true\n if (value.type === \"ArrayExpression\") {\n for (const el of (value.elements as AstNode[] | undefined) ?? []) {\n if (el && stringLiteralValue(el) === \"@uidex:flow\") return true\n }\n }\n return false\n }\n return false\n}\n\nfunction collectUidexCalls(\n body: AstNode,\n parsed: ParsedSource\n): { calls: FlowCallFact[]; dynamicCalls: DynamicFlowCallFact[] } {\n const calls: FlowCallFact[] = []\n const dynamicCalls: DynamicFlowCallFact[] = []\n // Chained calls record the inner uidex(...) node here so the DFS doesn't\n // record it a second time when it reaches it.\n const claimed = new Set<AstNode>()\n\n const record = (node: AstNode, action?: string): void => {\n if (claimed.has(node)) return\n claimed.add(node)\n const resolved = uidexCallId(node)\n if (resolved === null) {\n // A uidex(...) call whose argument is not a static string literal —\n // invisible to the registry, so coverage silently shrinks. Surfaced\n // as a dynamic-flow-reference lint by the audit.\n dynamicCalls.push({ line: parsed.lineAt(node.start) })\n return\n }\n calls.push({\n id: resolved.id,\n ...(action ? { action } : {}),\n line: parsed.lineAt(node.start),\n span: resolved.span,\n })\n }\n\n walkAst(body, (node) => {\n if (node.type !== \"CallExpression\") return undefined\n\n // uidex(\"id\").action(...) — outer call whose callee member chain starts\n // at a uidex(...) call.\n const callee = node.callee as AstNode | undefined\n if (callee?.type === \"MemberExpression\") {\n const inner = callee.object as AstNode | undefined\n if (inner && isUidexCall(inner)) {\n const property = callee.property as AstNode | undefined\n const action =\n property?.type === \"Identifier\" ? String(property.name) : undefined\n record(inner, action)\n }\n return undefined\n }\n\n // Bare uidex(\"id\") call (or one reached before any chain claimed it).\n if (isUidexCall(node)) record(node)\n return undefined\n })\n\n return { calls, dynamicCalls }\n}\n\n/** True when the node is a `uidex(...)` call with at least one argument. */\nfunction isUidexCall(node: AstNode): boolean {\n if (node.type !== \"CallExpression\") return false\n if (!isIdentifier(node.callee, \"uidex\")) return false\n return ((node.arguments as AstNode[] | undefined) ?? []).length >= 1\n}\n\n/** Returns the static id (and its literal span) of a `uidex(\"...\")` call, else null. */\nfunction uidexCallId(\n node: AstNode\n): { id: string; span: { start: number; end: number } } | null {\n const args = (node.arguments as AstNode[] | undefined) ?? []\n const arg = args[0]\n const id = stringLiteralValue(arg)\n if (id === null) return null\n return { id, span: { start: arg.start, end: arg.end } }\n}\n\nfunction stringLiteralValue(node: AstNode | undefined | null): string | null {\n if (!node) return null\n if (node.type === \"Literal\" && typeof node.value === \"string\") {\n return node.value.length > 0 ? node.value : null\n }\n if (node.type === \"TemplateLiteral\") {\n const expressions = (node.expressions as AstNode[] | undefined) ?? []\n if (expressions.length > 0) return null\n const quasis = (node.quasis as AstNode[] | undefined) ?? []\n const cooked = (quasis[0]?.value as { cooked?: string } | undefined)?.cooked\n return cooked && cooked.length > 0 ? cooked : null\n }\n return null\n}\n\nfunction isIdentifier(node: unknown, name: string): boolean {\n return (\n typeof node === \"object\" &&\n node !== null &&\n (node as AstNode).type === \"Identifier\" &&\n String((node as AstNode).name) === name\n )\n}\n","import { unwrapTsExpression, walkAst } from \"./ast\"\nimport type { AstNode, ParsedSource } from \"./ast\"\nimport type {\n AnnotationAncestor,\n DomAttrKind,\n DynamicAttrFact,\n InteractiveElementFact,\n LandmarkFact,\n Span,\n} from \"./types\"\n\n/**\n * Walks the parsed JSX AST and emits each `data-uidex*` attribute occurrence\n * paired with its JSX ancestor chain (outermost to innermost).\n *\n * Ancestry follows the AST: conditional JSX (`{cond && <div/>}`), `.map()`\n * callbacks, fragments, and JSX nested in attribute expressions all\n * contribute correct chains. A file that failed to parse (`program: null`)\n * yields no occurrences — empty ancestry rather than wrong ancestry.\n */\n\nconst ATTR_NAME_RE = /^data-uidex(?:-(region|widget|primitive))?$/\n\nexport interface DataAttrOccurrence {\n kind: DomAttrKind\n id: string\n line: number\n ancestors: AnnotationAncestor[]\n /** span of the value string literal, when the value is a single plain literal */\n span?: Span\n}\n\nexport interface JSXFacts {\n occurrences: DataAttrOccurrence[]\n /** data-uidex* attributes whose value could not be resolved statically */\n dynamicAttrs: DynamicAttrFact[]\n /** interactive host elements with no data-uidex* attribute at all */\n unannotatedInteractive: InteractiveElementFact[]\n /** HTML5 landmark elements (auto-registered as regions by convention) */\n landmarks: LandmarkFact[]\n}\n\n/** Host tags the audit nudges toward `data-uidex` annotation. */\nconst INTERACTIVE_TAGS = new Set([\"button\", \"a\", \"input\", \"select\", \"textarea\"])\n\n/** Host tags that auto-register as regions (HTML5 landmarks). */\nconst LANDMARK_TAGS = new Set([\"header\", \"nav\", \"main\", \"aside\", \"footer\"])\n\ninterface ResolvedAttr {\n kind: DomAttrKind\n id: string\n /** offset of the attribute node, for line reporting */\n start: number\n /** patterns (template-derived ids containing `*`) sort after static ids */\n isPattern: boolean\n /** span of the value literal, when the value is a single plain literal */\n span?: Span\n}\n\nfunction attrKind(node: AstNode): DomAttrKind | null {\n const name = node.name as AstNode | undefined\n if (!name || name.type !== \"JSXIdentifier\") return null\n const m = ATTR_NAME_RE.exec(String(name.name))\n if (!m) return null\n return (m[1] ?? \"element\") as DomAttrKind\n}\n\n/**\n * Same-file `const name = \"literal\"` bindings, used to resolve identifier\n * references in attribute values. Names bound more than once are dropped —\n * the scanner only inlines unambiguous constants.\n */\nfunction collectConstStrings(program: AstNode): Map<string, string> {\n const consts = new Map<string, string>()\n const seen = new Set<string>()\n walkAst(program, (node) => {\n if (node.type !== \"VariableDeclaration\" || node.kind !== \"const\") {\n return undefined\n }\n for (const decl of (node.declarations as AstNode[] | undefined) ?? []) {\n const id = decl.id as AstNode | undefined\n if (!id || id.type !== \"Identifier\") continue\n const name = String(id.name)\n if (seen.has(name)) {\n consts.delete(name)\n continue\n }\n seen.add(name)\n const init = decl.init as AstNode | undefined\n if (!init) continue\n const value = staticString(unwrapTsExpression(init))\n if (value !== null) consts.set(name, value)\n }\n return undefined\n })\n return consts\n}\n\n/** A plain string literal or expressionless template literal, else null. */\nfunction staticString(node: AstNode): string | null {\n if (node.type === \"Literal\" && typeof node.value === \"string\") {\n return node.value\n }\n if (node.type === \"TemplateLiteral\") {\n const expressions = (node.expressions as AstNode[] | undefined) ?? []\n if (expressions.length > 0) return null\n const quasis = (node.quasis as AstNode[] | undefined) ?? []\n return (quasis[0]?.value as { cooked?: string } | undefined)?.cooked ?? \"\"\n }\n return null\n}\n\ntype EvalResult =\n /** every branch resolved; ids may contain `*` wildcards (patterns) */\n { resolved: true; ids: string[] } | { resolved: false }\n\nconst UNRESOLVED: EvalResult = { resolved: false }\n\n/**\n * Static-id evaluator for data-uidex attribute expressions.\n *\n * - string literal / expressionless template → that id\n * - template with expressions → resolvable parts inline, opaque parts\n * become `*`; the result is a pattern id (requires ≥1 static char)\n * - identifier → unambiguous same-file `const name = \"literal\"`\n * - ternary → union of both branches (both must resolve)\n */\nfunction evalIdExpression(\n expr: AstNode,\n consts: Map<string, string>\n): EvalResult {\n const node = unwrapTsExpression(expr)\n\n const literal = staticString(node)\n if (literal !== null) {\n return literal.length > 0 ? { resolved: true, ids: [literal] } : UNRESOLVED\n }\n\n if (node.type === \"TemplateLiteral\") {\n const quasis = (node.quasis as AstNode[] | undefined) ?? []\n const expressions = (node.expressions as AstNode[] | undefined) ?? []\n let out = \"\"\n for (let i = 0; i < quasis.length; i++) {\n out += (quasis[i].value as { cooked?: string } | undefined)?.cooked ?? \"\"\n if (i < expressions.length) {\n const part = evalIdExpression(expressions[i], consts)\n out += part.resolved && part.ids.length === 1 ? part.ids[0] : \"*\"\n }\n }\n out = out.replace(/\\*{2,}/g, \"*\")\n if (!out.includes(\"*\")) {\n return out.length > 0 ? { resolved: true, ids: [out] } : UNRESOLVED\n }\n // A bare `*` (no static text at all) matches everything — useless as a\n // pattern, so it stays a dynamic attribute.\n return out.replace(/\\*/g, \"\").length > 0\n ? { resolved: true, ids: [out] }\n : UNRESOLVED\n }\n\n if (node.type === \"Identifier\") {\n const value = consts.get(String(node.name))\n return value !== undefined && value.length > 0\n ? { resolved: true, ids: [value] }\n : UNRESOLVED\n }\n\n if (node.type === \"ConditionalExpression\") {\n const left = evalIdExpression(node.consequent as AstNode, consts)\n const right = evalIdExpression(node.alternate as AstNode, consts)\n if (!left.resolved || !right.resolved) return UNRESOLVED\n return { resolved: true, ids: [...new Set([...left.ids, ...right.ids])] }\n }\n\n return UNRESOLVED\n}\n\nfunction collectElementAttrs(\n opening: AstNode,\n consts: Map<string, string>,\n dynamicAttrs: DynamicAttrFact[],\n lineAt: (offset: number) => number\n): ResolvedAttr[] {\n const statics: ResolvedAttr[] = []\n const patterns: ResolvedAttr[] = []\n const attributes = (opening.attributes as AstNode[] | undefined) ?? []\n for (const attr of attributes) {\n if (attr.type !== \"JSXAttribute\") continue\n const kind = attrKind(attr)\n if (!kind) continue\n const value = attr.value as AstNode | null | undefined\n if (!value) continue\n\n let result: EvalResult = UNRESOLVED\n let valueSpan: Span | undefined\n if (value.type === \"Literal\") {\n const v = staticString(value)\n result =\n v !== null && v.length > 0 ? { resolved: true, ids: [v] } : UNRESOLVED\n if (result.resolved) valueSpan = { start: value.start, end: value.end }\n } else if (value.type === \"JSXExpressionContainer\") {\n const expr = value.expression as AstNode | undefined\n if (expr && expr.type !== \"JSXEmptyExpression\") {\n result = evalIdExpression(expr, consts)\n const inner = unwrapTsExpression(expr)\n if (result.resolved && staticString(inner) !== null) {\n valueSpan = { start: inner.start, end: inner.end }\n }\n }\n if (!result.resolved) {\n dynamicAttrs.push({\n kind,\n attrName: kind === \"element\" ? \"data-uidex\" : `data-uidex-${kind}`,\n line: lineAt(attr.start),\n })\n continue\n }\n }\n\n if (!result.resolved) continue\n for (const id of result.ids) {\n const resolved: ResolvedAttr = {\n kind,\n id,\n start: attr.start,\n isPattern: id.includes(\"*\"),\n // Only a single plain string literal is renameable in place.\n ...(result.ids.length === 1 && valueSpan ? { span: valueSpan } : {}),\n }\n if (resolved.isPattern) patterns.push(resolved)\n else statics.push(resolved)\n }\n }\n // Static ids before patterns, matching the registration order entities\n // historically appeared in.\n return [...statics, ...patterns]\n}\n\nexport function collectJSXFacts(parsed: ParsedSource): JSXFacts {\n const occurrences: DataAttrOccurrence[] = []\n const dynamicAttrs: DynamicAttrFact[] = []\n const unannotatedInteractive: InteractiveElementFact[] = []\n const landmarks: LandmarkFact[] = []\n // Files with no data-uidex content can still contain unannotated\n // interactive elements, so only a failed parse short-circuits.\n if (parsed.program === null) {\n return { occurrences, dynamicAttrs, unannotatedInteractive, landmarks }\n }\n\n const consts = collectConstStrings(parsed.program as unknown as AstNode)\n const ancestors: AnnotationAncestor[] = []\n\n const visit = (node: unknown): void => {\n if (!isNode(node)) return\n\n if (node.type === \"JSXElement\") {\n const opening = node.openingElement as AstNode\n const attrs = collectElementAttrs(\n opening,\n consts,\n dynamicAttrs,\n parsed.lineAt\n )\n const interactive = readInteractive(node, parsed.lineAt)\n if (interactive) unannotatedInteractive.push(interactive)\n if (attrs.length > 0) {\n const snapshot = ancestors.slice()\n for (const a of attrs) {\n occurrences.push({\n kind: a.kind,\n id: a.id,\n line: parsed.lineAt(a.start),\n ancestors: snapshot,\n ...(a.span ? { span: a.span } : {}),\n })\n }\n }\n let pushed = attrs.length\n for (const a of attrs) ancestors.push({ kind: a.kind, id: a.id })\n // Landmarks register as convention regions; they join the ancestry so\n // child data-uidex elements compose onto them, unless the element also\n // carries an explicit data-uidex-region (which takes precedence and is\n // already on the stack).\n const landmark = readLandmark(opening, parsed.lineAt)\n if (landmark) {\n landmarks.push(landmark)\n if (!attrs.some((a) => a.kind === \"region\")) {\n ancestors.push({ kind: \"region\", id: landmark.tag })\n pushed++\n }\n }\n // Children, plus JSX nested inside attribute expressions (render\n // props), inherit this element's ancestry.\n visitChildren(opening)\n for (const child of (node.children as AstNode[] | undefined) ?? []) {\n visit(child)\n }\n const closing = node.closingElement\n if (isNode(closing)) visitChildren(closing)\n ancestors.length -= pushed\n return\n }\n\n visitChildren(node)\n }\n\n const visitChildren = (node: AstNode): void => {\n for (const key of Object.keys(node)) {\n if (key === \"type\" || key === \"start\" || key === \"end\") continue\n const value = node[key]\n if (Array.isArray(value)) {\n for (const item of value) visit(item)\n } else {\n visit(value)\n }\n }\n }\n\n visit(parsed.program)\n return { occurrences, dynamicAttrs, unannotatedInteractive, landmarks }\n}\n\n/**\n * Returns a fact when the opening element is an HTML5 landmark tag or\n * carries `role=\"region\"`. The fact's `tag` doubles as the convention\n * region id (\"header\", \"nav\", …, or \"region\" for role-based landmarks).\n */\nfunction readLandmark(\n opening: AstNode,\n lineAt: (offset: number) => number\n): LandmarkFact | null {\n const name = opening.name as AstNode | undefined\n if (!name || name.type !== \"JSXIdentifier\") return null\n const tag = String(name.name)\n if (LANDMARK_TAGS.has(tag)) {\n return { tag, line: lineAt(opening.start) }\n }\n for (const attr of (opening.attributes as AstNode[] | undefined) ?? []) {\n if (attr.type !== \"JSXAttribute\") continue\n const attrName = attr.name as AstNode | undefined\n if (!attrName || String(attrName.name) !== \"role\") continue\n const value = attr.value as AstNode | null | undefined\n if (value && value.type === \"Literal\" && value.value === \"region\") {\n return { tag: \"region\", line: lineAt(opening.start) }\n }\n }\n return null\n}\n\n/**\n * Returns a fact when the opening element is an interactive host tag with no\n * data-uidex* attribute of any form (static, pattern, or dynamic). Captures\n * the attribute-insertion offset and a static name hint so `--fix` can\n * deterministically generate a `data-uidex` id.\n */\nfunction readInteractive(\n element: AstNode,\n lineAt: (offset: number) => number\n): InteractiveElementFact | null {\n const opening = element.openingElement as AstNode\n const name = opening.name as AstNode | undefined\n if (!name || name.type !== \"JSXIdentifier\") return null\n const tag = String(name.name)\n if (!INTERACTIVE_TAGS.has(tag)) return null\n let hasSpread = false\n for (const attr of (opening.attributes as AstNode[] | undefined) ?? []) {\n if (attr.type === \"JSXSpreadAttribute\") {\n hasSpread = true\n continue\n }\n if (attr.type === \"JSXAttribute\" && attrKind(attr) !== null) return null\n }\n const nameHint = interactiveNameHint(element, opening)\n return {\n tag,\n line: lineAt(opening.start),\n hasSpread,\n nameEnd: name.end as number,\n ...(nameHint ? { nameHint } : {}),\n }\n}\n\n/** Static string value of a named attribute on the opening element, or null. */\nfunction staticAttrValue(opening: AstNode, attrName: string): string | null {\n for (const attr of (opening.attributes as AstNode[] | undefined) ?? []) {\n if (attr.type !== \"JSXAttribute\") continue\n const n = attr.name as AstNode | undefined\n if (!n || String(n.name) !== attrName) continue\n const value = attr.value as AstNode | null | undefined\n if (!value) return null\n if (value.type === \"Literal\") return staticString(value)\n if (value.type === \"JSXExpressionContainer\") {\n const expr = value.expression as AstNode | undefined\n return expr ? staticString(unwrapTsExpression(expr)) : null\n }\n return null\n }\n return null\n}\n\n/** Concatenated static JSXText children, whitespace-collapsed and trimmed. */\nfunction staticChildText(element: AstNode): string {\n const parts: string[] = []\n for (const child of (element.children as AstNode[] | undefined) ?? []) {\n if (child.type === \"JSXText\") {\n parts.push(String((child as { value?: unknown }).value ?? \"\"))\n }\n }\n return parts.join(\" \").replace(/\\s+/g, \" \").trim()\n}\n\n/**\n * Best static label for an interactive element, used to derive a `data-uidex`\n * id: accessible name first (aria-label), then visible text, then descriptive\n * attributes. Returns undefined when nothing statically usable exists.\n */\nfunction interactiveNameHint(\n element: AstNode,\n opening: AstNode\n): string | undefined {\n const ariaLabel = staticAttrValue(opening, \"aria-label\")\n if (ariaLabel) return ariaLabel\n const text = staticChildText(element)\n if (text) return text\n for (const attr of [\"title\", \"name\", \"placeholder\"]) {\n const v = staticAttrValue(opening, attr)\n if (v) return v\n }\n return undefined\n}\n\nfunction isNode(value: unknown): value is AstNode {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { type?: unknown }).type === \"string\"\n )\n}\n","import { parseSource } from \"./ast\"\nimport type { AstNode, ParsedSource } from \"./ast\"\nimport { extractUidexExports } from \"./extract-uidex-export\"\nimport { collectFlowFacts } from \"./flow-facts\"\nimport { collectJSXFacts } from \"./jsx-ancestry\"\nimport type {\n Annotation,\n Diagnostic,\n ExtractedFile,\n ImportFact,\n ScannedFile,\n} from \"./types\"\n\n/**\n * A fatal oxc failure (throw, or an empty program body alongside reported\n * errors — oxc's signature for unrecoverable input, e.g. a syntax error or a\n * Flow-typed .js file) means every AST-derived fact for the file is silently\n * empty. Surface that instead of letting the file's ids vanish from the gen\n * file with no trace. Recoverable errors keep a usable program and stay quiet.\n */\nfunction parseFailureDiagnostic(\n file: ScannedFile,\n parsed: ParsedSource\n): Diagnostic | null {\n const fatal =\n parsed.program === null ||\n (parsed.hasErrors && parsed.program.body.length === 0)\n if (!fatal) return null\n return {\n code: \"parse-error\",\n severity: \"warning\",\n message:\n \"File could not be parsed — data-uidex attributes and flow facts in it were skipped, and their ids will drop out of the gen file\",\n file: file.displayPath,\n line: 1,\n hint: \"Fix the file's syntax (or exclude it from .uidex.json sources) so the scanner can read its annotations\",\n }\n}\n\nexport function extract(files: ScannedFile[]): ExtractedFile[] {\n return files.map((file) => {\n // One parse per file; every AST-derived fact comes out of this pass and\n // the program itself never leaves the extract phase.\n const parsed = parseSource(file)\n const { exports, diagnostics } = extractUidexExports(file, parsed)\n const parseFailure = parseFailureDiagnostic(file, parsed)\n if (parseFailure) diagnostics.push(parseFailure)\n const out: ExtractedFile = { file, annotations: [] }\n out.annotations = extractOne(file, parsed, out)\n if (exports.length > 0) out.metadata = exports\n if (diagnostics.length > 0) out.diagnostics = diagnostics\n const flows = collectFlowFacts(parsed, file.content)\n if (flows.length > 0) out.flows = flows\n const imports = collectImportFacts(parsed)\n if (imports.length > 0) out.imports = imports\n return out\n })\n}\n\nfunction extractOne(\n file: ScannedFile,\n parsed: ParsedSource,\n out: ExtractedFile\n): Annotation[] {\n const annotations: Annotation[] = []\n const { displayPath } = file\n\n const jsx = collectJSXFacts(parsed)\n if (jsx.dynamicAttrs.length > 0) out.dynamicAttrs = jsx.dynamicAttrs\n if (jsx.unannotatedInteractive.length > 0) {\n out.unannotatedInteractive = jsx.unannotatedInteractive\n }\n if (jsx.landmarks.length > 0) out.landmarks = jsx.landmarks\n for (const occ of jsx.occurrences) {\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 ...(occ.span ? { span: occ.span } : {}),\n })\n }\n\n return annotations\n}\n\n/**\n * Static import bindings from the top-level program body: `import` and\n * re-export (`export … from`) statements. Dynamic `import()` and `require()`\n * are intentionally out of scope — the scope-leak check is about module\n * dependency structure, which those don't declare statically.\n */\nfunction collectImportFacts(parsed: ParsedSource): ImportFact[] {\n if (parsed.program === null) return []\n const out: ImportFact[] = []\n for (const stmt of parsed.program.body as unknown as AstNode[]) {\n let source: AstNode | null | undefined\n let isTypeOnly = false\n const names: string[] = []\n if (stmt.type === \"ImportDeclaration\") {\n source = stmt.source as AstNode | undefined\n isTypeOnly = stmt.importKind === \"type\"\n for (const spec of (stmt.specifiers as AstNode[] | undefined) ?? []) {\n const local = spec.local as AstNode | undefined\n if (local && local.type === \"Identifier\") {\n names.push(String(local.name))\n }\n }\n } else if (\n (stmt.type === \"ExportNamedDeclaration\" ||\n stmt.type === \"ExportAllDeclaration\") &&\n stmt.source\n ) {\n source = stmt.source as AstNode\n isTypeOnly = stmt.exportKind === \"type\"\n } else {\n continue\n }\n if (!source || source.type !== \"Literal\") continue\n if (typeof source.value !== \"string\") continue\n out.push({\n specifier: source.value,\n line: parsed.lineAt(stmt.start),\n span: { start: stmt.start, end: stmt.end },\n isTypeOnly,\n names,\n })\n }\n return out\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 \"../../shared/entities\"\nimport { DEFAULT_CONVENTIONS, WELL_KNOWN_FILES } 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 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\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 routeDir = path.posix.dirname(route.file)\n const wellKnownPath = `${routeDir}/${WELL_KNOWN_FILES.page}`\n const wellKnownExp = exportFor(wellKnownPath, \"page\")\n const routeExp = exportFor(route.file, \"page\")\n\n const exp = wellKnownExp ?? routeExp\n const locFile = wellKnownExp ? wellKnownPath : route.file\n\n if (wellKnownExp) handledPageFiles.add(wellKnownPath)\n handledPageFiles.add(route.file)\n\n if (wellKnownExp && routeExp) {\n diagnostics.push({\n code: \"competing-uidex-export\",\n severity: \"warning\",\n message: `Page metadata declared in both ${wellKnownPath} and ${route.file}; ${wellKnownPath} takes precedence.`,\n file: route.file,\n line: routeExp.loc.line,\n hint: `Remove the export from ${route.file} or delete ${wellKnownPath}.`,\n })\n }\n\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: locFile, line: exp?.loc.line },\n ...(meta ? { meta } : {}),\n }\n registry.add(page)\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 featureExportFilesByDir = new Map<\n string,\n Array<{ file: string; exp: MetadataExport }>\n >()\n const wellKnownFeatureFileByDir = new Map<string, string>()\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 isWellKnown =\n path.posix.basename(ef.file.displayPath) === WELL_KNOWN_FILES.feature\n if (isWellKnown) wellKnownFeatureFileByDir.set(dir, ef.file.displayPath)\n const exp = exportFor(ef.file.displayPath, \"feature\")\n if (exp) {\n if (exp.id === false) suppressedFeatureDirs.add(dir)\n else {\n let arr = featureExportFilesByDir.get(dir)\n if (!arr) {\n arr = []\n featureExportFilesByDir.set(dir, arr)\n }\n arr.push({ file: ef.file.displayPath, exp })\n }\n }\n }\n for (const dir of conventionalFeatureDirs) {\n if (suppressedFeatureDirs.has(dir)) continue\n const allExports = featureExportFilesByDir.get(dir) ?? []\n const wellKnownPath = wellKnownFeatureFileByDir.get(dir)\n const wellKnownEntry = wellKnownPath\n ? allExports.find((e) => e.file === wellKnownPath)\n : undefined\n\n let exp: MetadataExport | undefined\n if (wellKnownEntry) {\n exp = wellKnownEntry.exp\n for (const other of allExports) {\n if (other.file === wellKnownEntry.file) continue\n diagnostics.push({\n code: \"competing-uidex-export\",\n severity: \"warning\",\n message: `Feature metadata declared in both ${wellKnownEntry.file} and ${other.file}; ${wellKnownEntry.file} takes precedence.`,\n file: other.file,\n line: other.exp.loc.line,\n hint: `Remove the export from ${other.file} or delete ${wellKnownEntry.file}.`,\n })\n }\n } else if (allExports.length > 0) {\n exp = allExports[0].exp\n }\n\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 // Landmark facts come from the JSX AST (extract phase), so a `<header>`\n // inside a string or comment never registers, and landmark regions\n // participate in ancestry/composes like attribute regions do.\n if (conventions.regions === \"landmarks\") {\n for (const ef of ctx.extracted) {\n for (const lm of ef.landmarks ?? []) {\n const id = 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 for (const ef of ctx.extracted) {\n const exp = exportFor(ef.file.displayPath, \"region\")\n if (!exp) continue\n if (exp.id === false) continue\n if (typeof exp.id === \"string\" && !registry.get(\"region\", exp.id)) {\n const meta = buildMetaFromExport(exp)\n const region: Region = {\n kind: \"region\",\n id: exp.id,\n loc: { file: ef.file.displayPath, line: exp.loc.line },\n ...(meta ? { meta } : {}),\n }\n registry.add(region)\n }\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 scope = computeScope(file)\n const primitive: Primitive = {\n kind: \"primitive\",\n id: exp.id,\n loc: { file, line: exp.loc.line },\n ...(scope ? { scopes: [scope] } : {}),\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 domScope = computeScope(p.file)\n const primitive: Primitive = {\n kind: \"primitive\",\n id: p.id,\n loc: { file: p.file, line: p.line },\n ...(domScope ? { scopes: [domScope] } : {}),\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 convScope = computeScope(file)\n const meta = metaWithComposes(\"primitive\", name)\n const primitive: Primitive = {\n kind: \"primitive\",\n id: name,\n loc: { file },\n ...(convScope ? { scopes: [convScope] } : {}),\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 = flowsFromFacts(ff)\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 steps: base.steps,\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 | null {\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 null\n}\n\n// -------- flow derivation from extract-phase facts --------\n\nfunction flowsFromFacts(ff: ExtractedFile): Flow[] {\n return (ff.flows ?? []).map((fact) => ({\n kind: \"flow\",\n id: kebab(fact.title),\n loc: { file: ff.file.displayPath, line: fact.line },\n touches: dedupe(fact.calls.map((c) => c.id)),\n steps: fact.calls\n .filter((c) => c.action)\n .map((c) => ({ entityId: c.id, action: c.action })),\n }))\n}\n\nfunction dedupe<T>(arr: T[]): T[] {\n return Array.from(new Set(arr))\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 FlowStep {\n entityId: string\n action?: string\n}\n\nexport interface Flow {\n kind: \"flow\"\n id: string\n loc: Location\n touches: string[]\n steps: FlowStep[]\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 ReportRecord {\n id: string\n entity?: string\n reporter?: { id?: string; email?: string; name?: string }\n title?: string\n body: string\n type: string\n severity: string\n status: string\n labels?: string[]\n url: string\n route?: string\n pageTitle?: string\n screenshot?: string\n createdAt: string\n}\n\nexport interface Registry {\n add(entity: Entity): void\n get<K extends EntityKind>(kind: K, id: string): EntityByKind<K> | undefined\n matchPattern<K extends EntityKind>(\n kind: K,\n id: string\n ): 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 setReports(\n kind: EntityKind,\n id: string,\n reports: readonly ReportRecord[]\n ): void\n getReports(kind: EntityKind, id: string): readonly ReportRecord[]\n listReportKeys(): readonly string[]\n closeReport?: (reportId: string, status?: string) => void | Promise<void>\n onReportsChange(cb: () => void): () => void\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 const patternCache = new Map<\n EntityKind,\n Array<{ segments: string[]; staticLength: number; entity: Entity }>\n >()\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 patternCache.delete(entity.kind)\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 interface PatternEntry<K extends EntityKind> {\n /** static parts of the key around `*` wildcards, e.g. \"a-*-b\" → [\"a-\", \"-b\"] */\n segments: string[]\n staticLength: number\n entity: EntityByKind<K>\n }\n\n const getPatternsForKind = <K extends EntityKind>(\n kind: K\n ): Array<PatternEntry<K>> => {\n const cached = patternCache.get(kind)\n if (cached !== undefined) return cached as Array<PatternEntry<K>>\n const patterns: Array<PatternEntry<K>> = []\n for (const [key, entity] of store[kind]) {\n if (key.includes(\"*\")) {\n const segments = key.split(\"*\")\n patterns.push({\n segments,\n staticLength: segments.reduce((n, s) => n + s.length, 0),\n entity: entity as EntityByKind<K>,\n })\n }\n }\n patternCache.set(\n kind,\n patterns as Array<{\n segments: string[]\n staticLength: number\n entity: Entity\n }>\n )\n return patterns\n }\n\n // First segment anchored at the start, last at the end, middles matched\n // left-to-right; each `*` matches any run of characters (including none).\n const matchesSegments = (segments: string[], id: string): boolean => {\n const first = segments[0]\n const last = segments[segments.length - 1]\n if (!id.startsWith(first)) return false\n let pos = first.length\n for (let i = 1; i < segments.length - 1; i++) {\n const idx = id.indexOf(segments[i], pos)\n if (idx === -1) return false\n pos = idx + segments[i].length\n }\n return id.endsWith(last) && id.length - last.length >= pos\n }\n\n const matchPattern = <K extends EntityKind>(\n kind: K,\n id: string\n ): EntityByKind<K> | undefined => {\n assertEntityKind(kind)\n const patterns = getPatternsForKind(kind)\n if (patterns.length === 0) return undefined\n let best: PatternEntry<K> | undefined\n for (const entry of patterns) {\n if (\n matchesSegments(entry.segments, id) &&\n (best === undefined || entry.staticLength > best.staticLength)\n ) {\n best = entry\n }\n }\n if (best === undefined) return undefined\n return freezeEntity(best.entity, 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 const reports = new Map<string, readonly ReportRecord[]>()\n const reportsCbs = new Set<() => void>()\n\n const setReports = (\n kind: EntityKind,\n id: string,\n records: readonly ReportRecord[]\n ): void => {\n reports.set(`${kind}:${id}`, records)\n for (const cb of reportsCbs) cb()\n }\n\n const getReports = (kind: EntityKind, id: string): readonly ReportRecord[] =>\n reports.get(`${kind}:${id}`) ?? []\n\n const listReportKeys = (): readonly string[] => Array.from(reports.keys())\n\n const onReportsChange = (cb: () => void): (() => void) => {\n reportsCbs.add(cb)\n return () => reportsCbs.delete(cb)\n }\n\n return {\n add,\n get,\n matchPattern,\n list,\n query,\n byScope,\n touchedBy,\n setReports,\n getReports,\n listReportKeys,\n onReportsChange,\n }\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 path from \"node:path\"\nimport type { Entity, Registry } from \"../../shared/entities\"\nimport { entityKey } from \"../../shared/entities\"\nimport { WELL_KNOWN_FILES } from \"./config\"\nimport type {\n AuditSummary,\n Diagnostic,\n ExtractedFile,\n InteractiveElementFact,\n ScannedFile,\n UidexConfig,\n} from \"./types\"\n\nexport interface AuditOptions {\n registry: Registry\n extracted: ExtractedFile[]\n files: ScannedFile[]\n /** Extract output for flow spec files; enables per-call reference checks. */\n flowExtracted?: ExtractedFile[]\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\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 // Extract-phase diagnostics (malformed `export const uidex` blocks,\n // parse-error files whose annotations were skipped) are equally ungated:\n // each one means source the scanner could not read.\n for (const ef of extracted) {\n if (ef.diagnostics) diagnostics.push(...ef.diagnostics)\n }\n for (const ef of opts.flowExtracted ?? []) {\n if (ef.diagnostics) diagnostics.push(...ef.diagnostics)\n }\n\n // ---- Stale gen file (--check) ----\n if (check && opts.generated !== undefined) {\n const outRel = opts.outputPath ?? config.output\n const fresh = normalizeForCheck(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 = normalizeForCheck(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 // ---- 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 // ---- Prefer well-known file (uidex.page.ts / uidex.feature.ts) ----\n if (lint) {\n const scannedPaths = new Set(files.map((f) => f.displayPath))\n for (const ef of extracted) {\n if (!ef.metadata) continue\n for (const m of ef.metadata) {\n if (m.kind !== \"page\" && m.kind !== \"feature\") continue\n if (typeof m.id !== \"string\") continue\n const filePath = ef.file.displayPath\n const wellKnownName = WELL_KNOWN_FILES[m.kind]\n if (path.posix.basename(filePath) === wellKnownName) continue\n const dir = path.posix.dirname(filePath)\n const wellKnownPath =\n dir === \".\" ? wellKnownName : `${dir}/${wellKnownName}`\n if (scannedPaths.has(wellKnownPath)) continue\n const kindLabel = m.kind === \"page\" ? \"Page\" : \"Feature\"\n diagnostics.push({\n code: \"prefer-well-known-file\",\n severity: \"info\",\n message: `${kindLabel} \"${m.id}\" metadata lives on ${filePath}; prefer ${wellKnownPath}`,\n file: filePath,\n line: m.loc.line,\n entity: { kind: m.kind, id: m.id },\n hint: `Move the \\`export const uidex\\` block to ${wellKnownPath} and remove it from ${filePath}.`,\n })\n }\n }\n }\n\n // ---- Dynamic data-uidex* attribute (expression instead of string literal) ----\n // Extract is the single source of truth for what resolves statically:\n // anything its evaluator could not turn into an id or pattern arrives here\n // as a DynamicAttrFact, so audit can never disagree with registration.\n if (lint) {\n for (const ef of extracted) {\n for (const fact of ef.dynamicAttrs ?? []) {\n diagnostics.push({\n code: \"dynamic-attr\",\n severity: \"warning\",\n message: `\\`${fact.attrName}={…}\\` uses a dynamic expression; the scanner cannot resolve the ${fact.kind} id statically`,\n file: ef.file.displayPath,\n line: fact.line,\n hint: dynamicAttrHint(fact.kind),\n })\n }\n }\n }\n\n // ---- Missing element annotation candidates (interactive elements without data-uidex) ----\n // Each generated id is deterministic (from the element's accessible name or\n // visible text) and deduped against ids already in the registry and ones\n // generated earlier this pass, so `--fix` can annotate the whole tree without\n // collisions. `--fix` only writes the attribute when it is absent, so the id\n // becomes a normal source literal and never churns on re-scan.\n if (lint) {\n const usedElementIds = new Set(registry.list(\"element\").map((e) => e.id))\n for (const ef of extracted) {\n for (const fact of ef.unannotatedInteractive ?? []) {\n if (fact.hasSpread) {\n // The spread may legitimately deliver the annotation via props, so\n // this supersedes missing-element-annotation rather than stacking.\n diagnostics.push({\n code: \"spread-attr\",\n severity: \"info\",\n message: `Interactive <${fact.tag}> spreads dynamic props and has no static data-uidex attribute; if the annotation is forwarded via props the scanner cannot register it`,\n file: ef.file.displayPath,\n line: fact.line,\n hint: \"Prefer a string-literal data-uidex on the element itself, or annotate at the call site.\",\n })\n } else {\n const id = uniqueElementId(fact, usedElementIds)\n usedElementIds.add(id)\n diagnostics.push({\n code: \"missing-element-annotation\",\n severity: \"info\",\n message: `Interactive <${fact.tag}> without data-uidex annotation`,\n file: ef.file.displayPath,\n line: fact.line,\n hint: `Add \\`data-uidex=\"${id}\"\\` (or run \\`uidex scan --fix\\`).`,\n fix: {\n description: `Add data-uidex=\"${id}\" to <${fact.tag}>`,\n edits: [\n {\n path: ef.file.sourcePath,\n start: fact.nameEnd,\n end: fact.nameEnd,\n replacement: ` data-uidex=\"${id}\"`,\n },\n ],\n },\n })\n }\n }\n }\n }\n\n // ---- Scope leak (primitives used outside their scope) ----\n // Import facts come from the AST (extract phase): real import/export-from\n // statements only — nothing inside comments or strings — with type-only\n // imports excluded (a type dependency is not a runtime leak).\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\n // Build lookup: file displayPath → declared feature cross-references\n const declaredFeatures = new Map<string, ReadonlySet<string>>()\n for (const ef of extracted) {\n if (!ef.metadata) continue\n for (const m of ef.metadata) {\n if (m.features && m.features.length > 0) {\n declaredFeatures.set(ef.file.displayPath, new Set(m.features))\n }\n }\n }\n\n for (const ef of extracted) {\n const displayPath = ef.file.displayPath\n for (const imp of ef.imports ?? []) {\n if (imp.isTypeOnly) continue\n const baseName = imp.specifier.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]\n if (!scope) continue\n const [kind, id] = scope.split(\":\")\n const importerSegments = displayPath.split(\"/\")\n\n // Same scope directory — not a leak\n if (\n importerSegments.includes(id) &&\n importerSegments.includes(kind + \"s\")\n ) {\n continue\n }\n\n // Route-feature affinity: a page whose path contains the feature\n // id is the feature's UI surface (e.g. app/editor/page-config/page.tsx\n // importing from feature:page-config)\n if (kind === \"feature\" && importerSegments.includes(id)) continue\n\n // Declared cross-reference: the importer's `export const uidex`\n // lists this feature in its `features` array\n if (kind === \"feature\" && declaredFeatures.get(displayPath)?.has(id)) {\n continue\n }\n\n diagnostics.push({\n code: \"scope-leak\",\n severity: \"warning\",\n message: `Primitive \"${primitive.id}\" is scoped to ${scope} but is imported from ${displayPath}`,\n file: displayPath,\n line: imp.line,\n })\n }\n }\n }\n\n // ---- Coverage (entities referenced in flows must exist) ----\n if (lint && coverageEnabled) {\n // Per-call lines from the flow specs' extract facts, keyed by the\n // describe location (id-independent, so flowExport renames still match).\n const factsByLoc = new Map<string, Map<string, number>>()\n for (const ef of opts.flowExtracted ?? []) {\n for (const fact of ef.flows ?? []) {\n const lines = new Map<string, number>()\n for (const call of fact.calls) {\n if (!lines.has(call.id)) lines.set(call.id, call.line)\n }\n factsByLoc.set(`${ef.file.displayPath}:${fact.line}`, lines)\n }\n }\n\n for (const flow of registry.list(\"flow\")) {\n const callLines = factsByLoc.get(`${flow.loc.file}:${flow.loc.line}`)\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 registry.matchPattern(\"element\", touchedId) ??\n registry.matchPattern(\"widget\", touchedId) ??\n registry.matchPattern(\"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 // Point at the uidex() call itself when the spec facts are\n // available; the describe line is the fallback.\n line: callLines?.get(touchedId) ?? flow.loc.line,\n })\n }\n }\n }\n }\n\n // ---- Duplicate ids (same kind+id annotated in more than one file) ----\n // The registry is last-writer-wins, so a cross-file duplicate silently\n // collapses to one entity while the runtime has two DOM matches. Widget and\n // primitive duplicates are definition collisions (warning); element/region\n // duplicates are sometimes intentional (responsive variants), so info.\n if (lint) {\n const occurrences = new Map<string, Array<{ file: string; line: number }>>()\n for (const ef of extracted) {\n for (const a of ef.annotations) {\n if (\n a.kind !== \"element\" &&\n a.kind !== \"region\" &&\n a.kind !== \"widget\" &&\n a.kind !== \"primitive\"\n ) {\n continue\n }\n const key = `${a.kind}:${a.id}`\n let list = occurrences.get(key)\n if (!list) {\n list = []\n occurrences.set(key, list)\n }\n list.push({ file: a.file, line: a.line })\n }\n }\n for (const [key, list] of occurrences) {\n const filesSeen = new Set(list.map((o) => o.file))\n if (filesSeen.size < 2) continue\n const [kind, id] = key.split(/:(.*)/s) as [string, string]\n const others = list\n .slice(1)\n .map((o) => `${o.file}:${o.line}`)\n .join(\", \")\n diagnostics.push({\n code: \"duplicate-id\",\n severity:\n kind === \"widget\" || kind === \"primitive\" ? \"warning\" : \"info\",\n message: `${kind} id \"${id}\" is declared in ${filesSeen.size} files (also at ${others}); the registry keeps only one entry`,\n file: list[0].file,\n line: list[0].line,\n entity: { kind: kind as \"element\", id },\n hint:\n kind === \"element\" || kind === \"region\"\n ? \"If these are variants of the same logical element this is fine; otherwise rename one (`uidex rename` updates flow references too).\"\n : \"Rename one of the definitions; two definitions with the same id silently merge.\",\n })\n }\n }\n\n // ---- Dynamic uidex() references in tagged flows ----\n // Flow ids must be string literals; a dynamic argument silently drops out\n // of `touches`, shrinking coverage with no trace. Mirror of dynamic-attr.\n if (lint && coverageEnabled) {\n for (const ef of opts.flowExtracted ?? []) {\n for (const fact of ef.flows ?? []) {\n for (const dyn of fact.dynamicCalls ?? []) {\n diagnostics.push({\n code: \"dynamic-flow-reference\",\n severity: \"warning\",\n message: `\\`uidex(…)\\` call in flow \"${fact.title}\" uses a dynamic expression; the id is invisible to coverage and registry validation`,\n file: ef.file.displayPath,\n line: dyn.line,\n hint: \"Use a string-literal id (component ids inside uidex() must be statically analysable).\",\n })\n }\n }\n }\n }\n\n // ---- Declared cross-references must exist ----\n // `features:` / `widgets:` arrays are tsc-checked at the `satisfies` site,\n // but a runtime audit still catches refs the author never typechecked.\n // Mirror the flow unknown-reference check for metadata exports.\n if (lint && coverageEnabled) {\n for (const ef of extracted) {\n if (!ef.metadata) continue\n for (const m of ef.metadata) {\n const check = (\n refKind: \"feature\" | \"widget\",\n ids: readonly string[] | undefined,\n spans: ReadonlyArray<{ start: number }> | undefined\n ) => {\n for (let i = 0; i < (ids?.length ?? 0); i++) {\n const refId = ids![i]\n const found =\n registry.get(refKind, refId) ??\n registry.matchPattern(refKind, refId)\n if (found) continue\n diagnostics.push({\n code: \"unknown-reference\",\n severity: \"warning\",\n message: `\\`export const uidex\\` in ${ef.file.displayPath} references unknown ${refKind} \"${refId}\"`,\n file: ef.file.displayPath,\n line: spans?.[i]\n ? lineOfOffset(ef.file.content, spans[i].start)\n : m.loc.line,\n hint: `No ${refKind} with id \"${refId}\" exists in the registry; fix the reference or add the ${refKind}.`,\n })\n }\n }\n check(\"feature\", m.features, m.featureSpans)\n check(\"widget\", m.widgets, m.widgetSpans)\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 lineOfOffset(content: string, offset: number): number {\n let line = 1\n for (let i = 0; i < offset && i < content.length; i++) {\n if (content[i] === \"\\n\") line++\n }\n return line\n}\n\n/** Fallback ids by tag when the element carries no static name hint. */\nconst TAG_FALLBACK_ID: Record<string, string> = {\n a: \"link\",\n button: \"button\",\n input: \"input\",\n select: \"select\",\n textarea: \"textarea\",\n}\n\nfunction kebabId(str: string): string {\n return str\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/[^a-zA-Z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .toLowerCase()\n}\n\n/** Deterministic kebab id from an element's name hint, capped at five words. */\nfunction deriveElementId(fact: InteractiveElementFact): string {\n const fromHint = fact.nameHint ? kebabId(fact.nameHint) : \"\"\n const capped = fromHint.split(\"-\").filter(Boolean).slice(0, 5).join(\"-\")\n return capped || TAG_FALLBACK_ID[fact.tag] || fact.tag\n}\n\n/** `deriveElementId`, made unique by suffixing `-2`, `-3`, … on collision. */\nfunction uniqueElementId(\n fact: InteractiveElementFact,\n used: ReadonlySet<string>\n): string {\n const base = deriveElementId(fact)\n if (!used.has(base)) return base\n for (let n = 2; ; n++) {\n const candidate = `${base}-${n}`\n if (!used.has(candidate)) return candidate\n }\n}\n\nfunction normalizeLineEndings(s: string): string {\n return s.replace(/\\r\\n/g, \"\\n\")\n}\n\n/**\n * Normalization for the staleness comparison. Besides line endings, the\n * embedded `gitContext` block is neutralized: it records the commit the file\n * was generated at, which is by construction one commit behind once the file\n * itself is committed — comparing it would make `--check` fail on every\n * freshly committed gen file.\n */\nfunction normalizeForCheck(s: string): string {\n return normalizeLineEndings(s).replace(\n /export const gitContext = \\{[\\s\\S]*?\\} as const/,\n \"export const gitContext = {} as const\"\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 dynamicAttrHint(kind: string): string {\n if (kind === \"region\") {\n return (\n `Use a string literal: \\`data-uidex-region=\"id\"\\`, or declare the ` +\n `region via \\`export const uidex = { region: \"id\" } as const satisfies ` +\n `Uidex.Region\\` on the file that passes the region value`\n )\n }\n return (\n `The scanner resolves string literals, same-file const references, ` +\n `ternaries with literal branches, and template literals with static ` +\n `text (dynamic parts become \\`*\\` patterns). If this component forwards ` +\n `the annotation via a prop, restructure so the caller provides the ` +\n `annotated element directly (e.g. via a slot or render prop)`\n )\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 \"../../shared/entities\"\nimport type { GitContext } 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}\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[]): string {\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 { registry, gitContext, uidexImport = \"uidex\" } = 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 )\n )\n lines.push(\n emitIdUnion(\n \"FeatureId\",\n features.map((e) => e.id)\n )\n )\n lines.push(\n emitIdUnion(\n \"WidgetId\",\n widgets.map((e) => e.id)\n )\n )\n lines.push(\n emitIdUnion(\n \"RegionId\",\n regions.map((e) => e.id)\n )\n )\n lines.push(\n emitIdUnion(\n \"ElementId\",\n elements.map((e) => e.id)\n )\n )\n lines.push(\n emitIdUnion(\n \"PrimitiveId\",\n primitives.map((e) => e.id)\n )\n )\n lines.push(\n emitIdUnion(\n \"FlowId\",\n flows.map((e) => e.id)\n )\n )\n lines.push(\n emitIdUnion(\n \"RouteId\",\n routes.map((e) => e.path)\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(\" features?: readonly FeatureId[]\")\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 Region {\")\n lines.push(\" region: RegionId | false\")\n lines.push(\" name?: 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 { 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 fs from \"node:fs\"\nimport * as path from \"node:path\"\nimport type { Registry } from \"../../shared/entities\"\n\nexport type ScaffoldKind = \"widget\" | \"page\" | \"feature\"\n\nexport interface ScaffoldSpecOptions {\n registry: Registry\n kind: ScaffoldKind\n id: string\n outDir: string\n force?: boolean\n fixtureImport?: string\n}\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 return scaffoldSpec({\n registry: opts.registry,\n kind: \"widget\",\n id: opts.widgetId,\n outDir: opts.outDir,\n force: opts.force,\n fixtureImport: opts.fixtureImport,\n })\n}\n\n/**\n * Emits a tagged Playwright stub from an entity's declared acceptance\n * criteria — one `test()` per criterion. Widgets keep the historical\n * `widget-<id>.spec.ts` name; pages and features emit `flow-<id>.spec.ts`\n * per the one-tagged-describe-per-flow-spec convention.\n */\nexport function scaffoldSpec(opts: ScaffoldSpecOptions): ScaffoldResult {\n const {\n registry,\n kind,\n id,\n outDir,\n force = false,\n fixtureImport = \"./fixtures\",\n } = opts\n const entity = registry.get(kind, id)\n if (!entity) {\n throw new Error(`${capitalize(kind)} \"${id}\" not found in registry`)\n }\n\n const criteria = entity.meta?.acceptance ?? []\n const filename =\n kind === \"widget\" ? `widget-${id}.spec.ts` : `flow-${id}.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({ id, criteria, fixtureImport })\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 capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n\nfunction renderSpec(args: {\n id: 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.id)}, { 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 * as fs from \"node:fs\"\nimport * as path from \"node:path\"\nimport type { Registry } from \"../../shared/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 })\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 const hasExtractDiagnostics = [...extracted, ...extractedFlows].some(\n (ef) => (ef.diagnostics?.length ?? 0) > 0\n )\n let auditResult: AuditSummary | undefined\n if (\n opts.check ||\n opts.lint ||\n resolved.diagnostics.length > 0 ||\n hasExtractDiagnostics\n ) {\n auditResult = audit({\n registry: resolved.registry,\n extracted,\n files: sourceFiles,\n flowExtracted: extractedFlows,\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","import * as fs from \"node:fs\"\nimport * as path from \"node:path\"\nimport type { Diagnostic, FixEdit } from \"./types\"\n\n/**\n * Applies the machine-generated fixes attached to diagnostics.\n *\n * Edits are offset-based against the content the scanner read, so this must\n * run before anything else touches the files. Within a file, edits apply\n * last-to-first; an edit overlapping one already applied is skipped. Identical\n * edits are deduped — two fixes in one file emitting the same edit collapse to\n * one application.\n */\n\nexport interface AppliedFix {\n code: string\n description: string\n file?: string\n}\n\nexport interface ApplyFixesResult {\n applied: AppliedFix[]\n /** fixes skipped because of overlapping edits or existing target files */\n skipped: Array<AppliedFix & { reason: string }>\n}\n\ninterface FixEntry {\n code: string\n description: string\n file?: string\n edits: FixEdit[]\n createFiles: Array<{ path: string; content: string }>\n deleteFiles: string[]\n skippedReason?: string\n}\n\nexport function applyFixes(diagnostics: Diagnostic[]): ApplyFixesResult {\n const entries: FixEntry[] = []\n for (const d of diagnostics) {\n if (!d.fix) continue\n entries.push({\n code: d.code,\n description: d.fix.description,\n file: d.file,\n edits: d.fix.edits ?? [],\n createFiles: d.fix.createFiles ?? [],\n deleteFiles: d.fix.deleteFiles ?? [],\n })\n }\n if (entries.length === 0) return { applied: [], skipped: [] }\n\n // Collect edits per file, deduping identical ones across fixes.\n const seenEdits = new Set<string>()\n const editsByFile = new Map<string, Array<FixEdit & { entry: FixEntry }>>()\n for (const entry of entries) {\n for (const edit of entry.edits) {\n const key = `${edit.path}:${edit.start}:${edit.end}:${edit.replacement}`\n if (seenEdits.has(key)) continue\n seenEdits.add(key)\n let list = editsByFile.get(edit.path)\n if (!list) {\n list = []\n editsByFile.set(edit.path, list)\n }\n list.push({ ...edit, entry })\n }\n }\n\n for (const [filePath, edits] of editsByFile) {\n let content: string\n try {\n content = fs.readFileSync(filePath, \"utf8\")\n } catch {\n for (const e of edits) e.entry.skippedReason ??= \"file is unreadable\"\n continue\n }\n // Resolve overlaps first-in-file-wins, then apply last-to-first so\n // earlier offsets stay valid.\n edits.sort((a, b) => a.start - b.start || a.end - b.end)\n const kept: typeof edits = []\n let prevEnd = -1\n for (const edit of edits) {\n if (edit.start < prevEnd) {\n edit.entry.skippedReason ??= \"overlapping edit\"\n continue\n }\n kept.push(edit)\n prevEnd = edit.end\n }\n for (let i = kept.length - 1; i >= 0; i--) {\n const edit = kept[i]\n content =\n content.slice(0, edit.start) +\n edit.replacement +\n content.slice(edit.end)\n }\n if (kept.length > 0) fs.writeFileSync(filePath, content, \"utf8\")\n }\n\n for (const entry of entries) {\n if (entry.skippedReason) continue\n for (const create of entry.createFiles) {\n if (fs.existsSync(create.path)) {\n entry.skippedReason = `${path.basename(create.path)} already exists`\n continue\n }\n fs.mkdirSync(path.dirname(create.path), { recursive: true })\n fs.writeFileSync(create.path, create.content, \"utf8\")\n }\n if (entry.skippedReason) continue\n for (const del of entry.deleteFiles) {\n try {\n fs.unlinkSync(del)\n } catch {\n // already gone — the goal state is reached\n }\n }\n }\n\n const applied: AppliedFix[] = []\n const skipped: Array<AppliedFix & { reason: string }> = []\n for (const entry of entries) {\n const summary: AppliedFix = {\n code: entry.code,\n description: entry.description,\n file: entry.file,\n }\n if (entry.skippedReason) {\n skipped.push({ ...summary, reason: entry.skippedReason })\n } else {\n applied.push(summary)\n }\n }\n return { applied, skipped }\n}\n","import { discover } from \"./discover\"\nimport { extract } from \"./extract\"\nimport { applyFixes } from \"./fix\"\nimport { runScan, writeScanResult } from \"./pipeline\"\nimport { walk } from \"./walk\"\nimport type { FixEdit } from \"./types\"\n\n/**\n * Cross-file id rename. The registry knows every reference surface for an\n * id — the DOM attribute, `uidex(\"…\")` calls in flow specs, the widget\n * export's discriminator, and `widgets:` arrays — so the rename rewrites all\n * of them in one pass and regenerates the gen file. Occurrences the scanner\n * can't edit mechanically (const indirection, ternaries, patterns) are\n * reported for manual follow-up instead of being guessed at.\n */\n\nexport type RenameKind = \"element\" | \"widget\" | \"region\"\n\nexport interface RenameOptions {\n cwd: string\n kind: RenameKind\n oldId: string\n newId: string\n /** allow renaming onto an id that already exists */\n force?: boolean\n}\n\nexport interface RenameResult {\n /** number of source edits applied */\n edits: number\n /** occurrences that need a human (no static literal to rewrite) */\n manual: Array<{ file: string; line: number; reason: string }>\n errors: string[]\n}\n\nconst ID_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/\n\nexport function renameEntity(opts: RenameOptions): RenameResult {\n const { cwd, kind, oldId, newId, force = false } = opts\n const manual: RenameResult[\"manual\"] = []\n const errors: string[] = []\n\n if (!ID_RE.test(newId)) {\n return {\n edits: 0,\n manual,\n errors: [`New id \"${newId}\" is not kebab-case`],\n }\n }\n\n const configs = discover({ cwd })\n if (configs.length === 0) {\n return { edits: 0, manual, errors: [`No .uidex.json found under ${cwd}`] }\n }\n\n const edits: FixEdit[] = []\n\n for (const dc of configs) {\n const { config, configDir } = dc\n const sourceFiles = walk(config.sources, {\n cwd: configDir,\n globalExcludes: config.exclude,\n })\n const extracted = extract(sourceFiles)\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 // Existence / collision checks against the live registry.\n const scan = runScan({ cwd: configDir, configs: [dc] })[0]\n const registry = scan.registry\n if (!registry.get(kind, oldId)) {\n if (registry.matchPattern(kind, oldId)) {\n errors.push(\n `${kind} \"${oldId}\" only matches via a pattern id; pattern-backed ids cannot be renamed mechanically`\n )\n } else {\n errors.push(`${kind} \"${oldId}\" not found in registry`)\n }\n continue\n }\n if (registry.get(kind, newId) && !force) {\n errors.push(\n `${kind} \"${newId}\" already exists; pass --force to merge the ids`\n )\n continue\n }\n\n const quoteAs = (content: string, start: number): string => {\n const q = content[start]\n return q === '\"' || q === \"'\" || q === \"`\"\n ? `${q}${newId}${q}`\n : `\"${newId}\"`\n }\n\n // 1. DOM attribute occurrences.\n for (const ef of extracted) {\n for (const a of ef.annotations) {\n if (a.kind !== kind || a.id !== oldId) continue\n if (a.span) {\n edits.push({\n path: ef.file.sourcePath,\n start: a.span.start,\n end: a.span.end,\n replacement: quoteAs(ef.file.content, a.span.start),\n })\n } else {\n manual.push({\n file: a.file,\n line: a.line,\n reason:\n \"attribute value is not a plain string literal (const reference, ternary, or template)\",\n })\n }\n }\n\n // 2. Metadata exports: the widget discriminator and widgets: arrays.\n for (const m of ef.metadata ?? []) {\n if (kind === \"widget\" && m.kind === \"widget\" && m.id === oldId) {\n if (m.idSpan) {\n edits.push({\n path: ef.file.sourcePath,\n start: m.idSpan.start,\n end: m.idSpan.end,\n replacement: quoteAs(ef.file.content, m.idSpan.start),\n })\n } else {\n manual.push({\n file: ef.file.displayPath,\n line: m.loc.line ?? 1,\n reason: \"widget export id is not a plain string literal\",\n })\n }\n }\n if (kind === \"widget\" && m.widgets) {\n for (let i = 0; i < m.widgets.length; i++) {\n if (m.widgets[i] !== oldId) continue\n const span = m.widgetSpans?.[i]\n if (span) {\n edits.push({\n path: ef.file.sourcePath,\n start: span.start,\n end: span.end,\n replacement: quoteAs(ef.file.content, span.start),\n })\n }\n }\n }\n }\n }\n\n // 3. uidex(\"…\") calls in flow specs.\n for (const ef of extractedFlows) {\n for (const fact of ef.flows ?? []) {\n for (const call of fact.calls) {\n if (call.id !== oldId) continue\n if (call.span) {\n edits.push({\n path: ef.file.sourcePath,\n start: call.span.start,\n end: call.span.end,\n replacement: quoteAs(ef.file.content, call.span.start),\n })\n } else {\n manual.push({\n file: ef.file.displayPath,\n line: call.line,\n reason: \"uidex() argument is not a plain string literal\",\n })\n }\n }\n }\n }\n }\n\n if (errors.length > 0) {\n return { edits: 0, manual, errors }\n }\n if (edits.length === 0 && manual.length === 0) {\n return {\n edits: 0,\n manual,\n errors: [\n `${kind} \"${oldId}\" has no editable occurrences (convention-derived ids like landmarks cannot be renamed)`,\n ],\n }\n }\n\n const result = applyFixes([\n {\n code: \"rename\",\n severity: \"info\",\n message: \"\",\n fix: {\n description: `Rename ${kind} \"${oldId}\" to \"${newId}\"`,\n edits,\n },\n },\n ])\n if (result.skipped.length > 0) {\n errors.push(`Some edits were skipped: ${result.skipped[0].reason}`)\n }\n\n // Regenerate the gen file on the renamed tree.\n for (const r of runScan({ cwd })) writeScanResult(r)\n\n return { edits: edits.length, manual, errors }\n}\n","import * as fs from \"node:fs\"\nimport * as path from \"node:path\"\nimport { runAiCommand } from \"./ai\"\nimport { discover, CONFIG_FILENAME } from \"./discover\"\nimport { applyFixes } from \"./fix\"\nimport type { AppliedFix } from \"./fix\"\nimport { runScan, writeScanResult } from \"./pipeline\"\nimport { renameEntity } from \"./rename\"\nimport type { RenameKind } from \"./rename\"\nimport { scaffoldSpec } from \"./scaffold\"\nimport type { ScaffoldKind } from \"./scaffold\"\nimport type { Diagnostic, 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\nimport { parseArgs } from \"../cli/parse-args\"\n\ntype Flags = Record<string, string | boolean>\n\nexport async function run(opts: CliOptions): Promise<CliResult> {\n const cwd = opts.cwd ?? process.cwd()\n const { positional, flags } = parseArgs(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 \"rename\":\n return runRename(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|page|feature> <id> Emit a Playwright spec from declared acceptance\",\n \" rename <element|widget|region> <old-id> <new-id> Rename an id everywhere (DOM attr, flows, exports)\",\n \" ai <install|uninstall|providers> Manage AI assistant integrations\",\n \" api <METHOD> <PATH> Call the uidex API\",\n \" api --list Show available API routes\",\n \" api login Authenticate via browser\",\n \" api login --token <tok> Store an auth token directly\",\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, duplicate ids, coverage)\",\n \" --audit Equivalent to --check --lint (read-only)\",\n \" --fix Apply machine-generated fixes (add data-uidex to unannotated interactive elements, drop empty names), then rescan and write\",\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 fix = Boolean(flags.fix)\n // --fix re-scans and writes the gen file after applying fixes, so the\n // read-only --check pass is meaningless alongside it.\n const check = !fix && Boolean(flags.check || flags.audit)\n const lint = Boolean(flags.lint || flags.audit || fix)\n const asJson = Boolean(flags.json)\n\n let 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 let fixed: AppliedFix[] = []\n let fixSkipped: Array<AppliedFix & { reason: string }> = []\n if (fix) {\n // Discovery pass: check+lint so every fixable diagnostic is produced.\n const discovery = runScan({ cwd, check: true, lint: true, configs })\n const result = applyFixes(\n discovery.flatMap((r) => r.audit?.diagnostics ?? [])\n )\n fixed = result.applied\n fixSkipped = result.skipped\n // Fixes may create or delete files; re-discover before the real pass.\n configs = discover({ cwd })\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 = {\n diagnostics: allDiagnostics.map(jsonDiagnostic),\n summary,\n ...(fix ? { fixed, fixSkipped } : {}),\n }\n w.out(JSON.stringify(out, null, 2))\n } else {\n for (const f of fixed) {\n w.out(`FIXED [${f.code}] ${f.file ?? \"\"} ${f.description}`)\n }\n for (const s of fixSkipped) {\n w.out(\n `SKIPPED [${s.code}] ${s.file ?? \"\"} ${s.description} (${s.reason})`\n )\n }\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 const fixable = d.fix && !fix ? \" [fixable: run with --fix]\" : \"\"\n stream(\n `${d.severity.toUpperCase()} [${d.code}] ${loc} ${d.message}${fixable}`\n )\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\n/** Diagnostics serialized for --json: `fix` (absolute paths) → `fixable`. */\nfunction jsonDiagnostic(d: Diagnostic): Omit<Diagnostic, \"fix\"> & {\n fixable?: boolean\n} {\n const { fix, ...rest } = d\n return fix ? { ...rest, fixable: true } : rest\n}\n\nconst SCAFFOLD_KINDS = new Set<string>([\"widget\", \"page\", \"feature\"])\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 || !SCAFFOLD_KINDS.has(kind) || !id) {\n w.err(\"Usage: uidex scaffold <widget|page|feature> <id> [--force]\")\n return w.result(1)\n }\n const scaffoldKind = kind as ScaffoldKind\n\n const results = runScan({ cwd })\n for (const r of results) {\n const entity = r.registry.get(scaffoldKind, id)\n if (!entity) continue\n const outDir = path.resolve(r.configDir, \"e2e\")\n const result = scaffoldSpec({\n registry: r.registry,\n kind: scaffoldKind,\n 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(\n `${scaffoldKind.charAt(0).toUpperCase() + scaffoldKind.slice(1)} \"${id}\" not found in registry`\n )\n return w.result(1)\n}\n\nconst RENAME_KINDS = new Set<string>([\"element\", \"widget\", \"region\"])\n\nfunction runRename(\n cwd: string,\n args: string[],\n flags: Flags,\n w: ReturnType<typeof createWriter>\n): CliResult {\n const [kind, oldId, newId] = args\n if (!kind || !RENAME_KINDS.has(kind) || !oldId || !newId) {\n w.err(\n \"Usage: uidex rename <element|widget|region> <old-id> <new-id> [--force]\"\n )\n return w.result(1)\n }\n\n const result = renameEntity({\n cwd,\n kind: kind as RenameKind,\n oldId,\n newId,\n force: Boolean(flags.force),\n })\n\n for (const e of result.errors) w.err(e)\n for (const m of result.manual) {\n w.err(`MANUAL ${m.file}:${m.line} — ${m.reason}`)\n }\n if (result.errors.length > 0) return w.result(1)\n\n w.out(\n `Renamed ${kind} \"${oldId}\" → \"${newId}\" (${result.edits} edit(s)); gen file regenerated`\n )\n if (result.manual.length > 0) {\n w.err(\n `${result.manual.length} occurrence(s) need manual follow-up (listed above)`\n )\n return w.result(1)\n }\n return w.result(0)\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 SKILL_FILES: { dest: string; template: string }[] = [\n { dest: \".claude/skills/uidex/SKILL.md\", template: \"claude/SKILL.md\" },\n {\n dest: \".claude/skills/uidex/references/conventions.md\",\n template: \"claude/references/conventions.md\",\n },\n {\n dest: \".claude/skills/uidex/references/audit.md\",\n template: \"claude/references/audit.md\",\n },\n {\n dest: \".claude/skills/uidex/references/api.md\",\n template: \"claude/references/api.md\",\n },\n]\n\nconst LEGACY_FILES = [\n \".claude/rules/uidex.md\",\n \".claude/commands/uidex/audit.md\",\n \".claude/commands/uidex/api.md\",\n]\n\nexport const claudeProvider: AiProvider = {\n id: \"claude\",\n label: \"Claude Code\",\n description:\n \"Adds .claude/skills/uidex/ skill with conventions, audit, and API references.\",\n\n async install({ cwd, force }: InstallOptions): Promise<InstallResult> {\n const changes: FileChange[] = []\n\n for (const file of SKILL_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 for (const rel of LEGACY_FILES) {\n const dest = path.join(cwd, rel)\n if (fs.existsSync(dest)) {\n fs.unlinkSync(dest)\n changes.push({ path: rel, action: \"removed\" })\n }\n }\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 async uninstall({ cwd }: UninstallOptions): Promise<UninstallResult> {\n const changes: FileChange[] = []\n\n for (const file of SKILL_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 cleanupEmpty(path.join(cwd, \".claude/skills/uidex/references\"))\n cleanupEmpty(path.join(cwd, \".claude/skills/uidex\"))\n cleanupEmpty(path.join(cwd, \".claude/skills\"))\n\n for (const rel of LEGACY_FILES) {\n const dest = path.join(cwd, rel)\n if (fs.existsSync(dest)) {\n fs.unlinkSync(dest)\n changes.push({ path: rel, action: \"removed\" })\n }\n }\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/scanner/scan/ai → ../../../../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","export function parseArgs(args: string[]): {\n positional: string[]\n flags: Record<string, string | boolean>\n} {\n const positional: string[] = []\n const flags: Record<string, string | boolean> = {}\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"],"mappings":";AAAA,YAAY,QAAQ;AACpB,YAAY,UAAU;;;ACCf,IAAM,mBAAmB;AAAA,EAC9B,MAAM;AAAA,EACN,SAAS;AACX;AAEO,IAAM,cAAN,cAA0B,MAAM;AAAA,EACrC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEA,IAAM,cAAc,oBAAI,IAAI;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,yBAAyB,oBAAI,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,sBAAsB,oBAAI,IAAI,CAAC,WAAW,WAAW,WAAW,QAAQ,CAAC;AAE/E,IAAM,2BAA2B,oBAAI,IAAI;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,qBAAqB,oBAAI,IAAI,CAAC,aAAa,YAAY,YAAY,CAAC;AAE1E,SAAS,KAAK,KAAoB;AAChC,QAAM,IAAI,YAAY,wBAAwB,GAAG,EAAE;AACrD;AAEA,SAAS,aACP,OACAA,QAC0C;AAC1C,MAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AACvE,SAAK,GAAGA,MAAI,oBAAoB;AAAA,EAClC;AACF;AAEA,SAAS,kBACP,OACAA,QAC2B;AAC3B,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,CAAC,MAAM,MAAM,CAAC,MAAM,OAAO,MAAM,QAAQ,GAAG;AACvE,SAAK,GAAGA,MAAI,qBAAqB;AAAA,EACnC;AACF;AAEO,SAAS,eAAe,KAA2B;AACxD,eAAa,KAAK,MAAM;AAExB,aAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,QAAI,YAAY,IAAI,GAAG,GAAG;AACxB;AAAA,QACE,sBAAsB,GAAG;AAAA,MAC3B;AAAA,IACF;AACA,QAAI,CAAC,uBAAuB,IAAI,GAAG,GAAG;AACpC,WAAK,0BAA0B,GAAG,GAAG;AAAA,IACvC;AAAA,EACF;AAEA,MAAI,EAAE,aAAa,MAAM;AACvB;AAAA,MACE;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,IAAI;AACpB,MAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW,GAAG;AACnD,SAAK,qCAAqC;AAAA,EAC5C;AAEA,QAAM,mBAAmB,QAAQ,IAAI,CAAC,KAAK,MAAM;AAC/C,iBAAa,KAAK,WAAW,CAAC,GAAG;AACjC,eAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,UAAI,CAAC,oBAAoB,IAAI,GAAG,GAAG;AACjC,aAAK,gBAAgB,GAAG,gBAAgB,CAAC,GAAG;AAAA,MAC9C;AAAA,IACF;AACA,QAAI,OAAO,IAAI,YAAY,YAAY,IAAI,QAAQ,WAAW,GAAG;AAC/D,WAAK,WAAW,CAAC,sCAAsC;AAAA,IACzD;AACA,QAAI,IAAI,YAAY;AAClB,wBAAkB,IAAI,SAAS,WAAW,CAAC,WAAW;AACxD,QAAI,IAAI,YAAY;AAClB,wBAAkB,IAAI,SAAS,WAAW,CAAC,WAAW;AACxD,QAAI,IAAI,WAAW,UAAa,OAAO,IAAI,WAAW,UAAU;AAC9D,WAAK,WAAW,CAAC,2BAA2B;AAAA,IAC9C;AACA,WAAO;AAAA,EACT,CAAC;AAED,MAAI,OAAO,IAAI,WAAW,YAAY,IAAI,OAAO,WAAW,GAAG;AAC7D,SAAK,qCAAqC;AAAA,EAC5C;AAEA,MAAI,IAAI,YAAY,OAAW,mBAAkB,IAAI,SAAS,SAAS;AACvE,MAAI,IAAI,UAAU,OAAW,mBAAkB,IAAI,OAAO,OAAO;AAEjE,MAAI,IAAI,UAAU,QAAW;AAC3B,iBAAa,IAAI,OAAO,OAAO;AAC/B,eAAW,OAAO,OAAO,KAAK,IAAI,KAAK,GAAG;AACxC,UAAI,CAAC,mBAAmB,IAAI,GAAG,EAAG,MAAK,gBAAgB,GAAG,YAAY;AACtE,YAAM,IAAK,IAAI,MAAkC,GAAG;AACpD,UAAI,OAAO,MAAM,UAAW,MAAK,SAAS,GAAG,oBAAoB;AAAA,IACnE;AAAA,EACF;AAEA,MAAI,IAAI,gBAAgB,QAAW;AACjC,iBAAa,IAAI,aAAa,aAAa;AAC3C,UAAM,IAAI,IAAI;AACd,eAAW,OAAO,OAAO,KAAK,CAAC,GAAG;AAChC,UAAI,CAAC,yBAAyB,IAAI,GAAG,GAAG;AACtC,aAAK,gBAAgB,GAAG,kBAAkB;AAAA,MAC5C;AAAA,IACF;AACA,QAAI,EAAE,eAAe,UAAa,EAAE,eAAe,OAAO;AACxD,wBAAkB,EAAE,YAAY,wBAAwB;AAAA,IAC1D;AACA,QACE,EAAE,aAAa,UACf,EAAE,aAAa,SACf,OAAO,EAAE,aAAa,UACtB;AACA,WAAK,gDAAgD;AAAA,IACvD;AACA,QAAI,EAAE,UAAU,UAAa,EAAE,UAAU,SAAS,EAAE,UAAU,QAAQ;AACpE,WAAK,2CAA2C;AAAA,IAClD;AACA,QAAI,EAAE,UAAU,UAAa,EAAE,UAAU,OAAO;AAC9C,wBAAkB,EAAE,OAAO,mBAAmB;AAAA,IAChD;AACA,QACE,EAAE,YAAY,UACd,EAAE,YAAY,SACd,EAAE,YAAY,aACd;AACA,WAAK,kDAAkD;AAAA,IACzD;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU;AAAA,IACzD,SAAS;AAAA,IACT,SAAS,IAAI;AAAA,IACb,QAAQ,IAAI;AAAA,IACZ,OAAO,IAAI;AAAA,IACX,OAAO,IAAI;AAAA,IACX,aAAa,IAAI;AAAA,EACnB;AACF;AAEO,SAAS,YAAY,MAA2B;AACrD,MAAI;AACJ,MAAI;AACF,UAAM,KAAK,MAAM,IAAI;AAAA,EACvB,SAAS,GAAG;AACV,UAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACrD,UAAM,IAAI,YAAY,0CAA0C,GAAG,EAAE;AAAA,EACvE;AACA,SAAO,eAAe,GAAG;AAC3B;AAEO,IAAM,sBAKT;AAAA,EACF,YAAY,CAAC,aAAa,sBAAsB;AAAA,EAChD,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO,CAAC,kBAAkB;AAAA,EAC1B,SAAS;AACX;;;AD7LO,IAAM,kBAAkB;AAE/B,IAAM,YAAY,oBAAI,IAAI;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,YAAY;AAOlB,SAAS,cAAc,YAA6C;AAClE,MAAI;AACJ,MAAI;AACF,aAAY,gBAAa,YAAY,MAAM;AAAA,EAC7C,QAAQ;AACN,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL;AAAA,IACA,WAAgB,aAAQ,UAAU;AAAA,IAClC,QAAQ,YAAY,MAAM;AAAA,EAC5B;AACF;AAEO,SAAS,SAAS,UAA2B,CAAC,GAAuB;AAC1E,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;AACvC,QAAM,WAAW,QAAQ,YAAY;AAErC,QAAM,YAAY,cAAmB,UAAK,KAAK,eAAe,CAAC;AAC/D,MAAI,UAAW,QAAO,CAAC,SAAS;AAEhC,QAAM,UAA8B,CAAC;AACrC,QAAM,QAAiC,CAAC,CAAC,KAAK,CAAC,CAAC;AAEhD,SAAO,MAAM,SAAS,GAAG;AACvB,UAAM,CAAC,KAAK,KAAK,IAAI,MAAM,MAAM;AACjC,QAAI;AACJ,QAAI;AACF,gBAAa,eAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,IACvD,QAAQ;AACN;AAAA,IACF;AAEA,eAAW,SAAS,SAAS;AAC3B,UAAI,CAAC,MAAM,YAAY,EAAG;AAC1B,UAAI,UAAU,IAAI,MAAM,IAAI,EAAG;AAC/B,UAAI,MAAM,KAAK,WAAW,GAAG,EAAG;AAEhC,YAAM,WAAgB,UAAK,KAAK,MAAM,IAAI;AAC1C,YAAM,YAAY,cAAmB,UAAK,UAAU,eAAe,CAAC;AAEpE,UAAI,WAAW;AACb,gBAAQ,KAAK,SAAS;AACtB;AAAA,MACF;AAEA,UAAI,QAAQ,IAAI,UAAU;AACxB,cAAM,KAAK,CAAC,UAAU,QAAQ,CAAC,CAAC;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAEA,SAAO,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,cAAc,EAAE,UAAU,CAAC;AACxE;;;AE9EA,YAAYC,SAAQ;AACpB,YAAYC,WAAU;AAGtB,IAAM,mBAAmB,CAAC,8BAA8B;AACxD,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,mBAAmB,CAAC,GAAG,eAAe,GAAG,aAAa;AAMrD,SAAS,aAAa,MAAsB;AACjD,MAAI,IAAI;AACR,MAAIC,OAAM;AACV,SAAO,IAAI,KAAK,QAAQ;AACtB,UAAM,IAAI,KAAK,CAAC;AAChB,QAAI,MAAM,OAAO,KAAK,IAAI,CAAC,MAAM,KAAK;AAEpC,UAAI,KAAK,IAAI,CAAC,MAAM,KAAK;AACvB,QAAAA,QAAO;AACP,aAAK;AACL;AAAA,MACF;AACA,MAAAA,QAAO;AACP,WAAK;AACL;AAAA,IACF;AACA,QAAI,MAAM,KAAK;AACb,MAAAA,QAAO;AACP;AACA;AAAA,IACF;AACA,QAAI,MAAM,KAAK;AACb,MAAAA,QAAO;AACP;AACA;AAAA,IACF;AACA,QAAI,MAAM,KAAK;AACb,YAAM,MAAM,KAAK,QAAQ,KAAK,CAAC;AAC/B,UAAI,QAAQ,IAAI;AACd,QAAAA,QAAO;AACP;AACA;AAAA,MACF;AACA,YAAM,QAAQ,KACX,MAAM,IAAI,GAAG,GAAG,EAChB,MAAM,GAAG,EACT,IAAI,CAACC,OAAMA,GAAE,QAAQ,gBAAgB,MAAM,CAAC;AAC/C,MAAAD,QAAO,MAAM,MAAM,KAAK,GAAG,CAAC;AAC5B,UAAI,MAAM;AACV;AAAA,IACF;AACA,QAAI,cAAc,KAAK,CAAC,GAAG;AACzB,MAAAA,QAAO,OAAO;AACd;AACA;AAAA,IACF;AACA,IAAAA,QAAO;AACP;AAAA,EACF;AACA,SAAO,IAAI,OAAO,IAAIA,IAAG,GAAG;AAC9B;AAEA,SAAS,QAAQC,IAAmB;AAClC,SAAOA,GAAE,MAAW,SAAG,EAAE,KAAK,GAAG;AACnC;AAEA,SAAS,WAAW,KAAa,UAA6B;AAC5D,SAAO,SAAS,KAAK,CAAC,MAAM,aAAa,CAAC,EAAE,KAAK,GAAG,CAAC;AACvD;AAYO,SAAS,KACd,SACA,SACe;AACf,QAAM,EAAE,KAAK,iBAAiB,CAAC,GAAG,eAAe,MAAM,IAAI;AAC3D,QAAMD,OAAqB,CAAC;AAC5B,QAAM,eAAe,eAAe,gBAAgB;AAEpD,aAAW,UAAU,SAAS;AAC5B,UAAM,WAAW,OAAO,SAAS,SAAS,OAAO,UAAU;AAC3D,UAAM,WAAW;AAAA,MACf,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAI,OAAO,WAAW,CAAC;AAAA,IACzB;AACA,UAAM,UAAe,cAAQ,KAAK,OAAO,OAAO;AAEhD,eAAW,YAAY,QAAQ,SAAS,OAAO,GAAG;AAChD,YAAM,MAAM,QAAa,eAAS,SAAS,QAAQ,CAAC;AACpD,UAAI,WAAW,KAAK,QAAQ,EAAG;AAC/B,UAAI,CAAC,WAAW,KAAK,QAAQ,EAAG;AAEhC,UAAI;AACJ,UAAI;AACF,kBAAa,iBAAa,UAAU,MAAM;AAAA,MAC5C,QAAQ;AACN;AAAA,MACF;AAEA,YAAM,aAAa,QAAa,eAAS,KAAK,QAAQ,CAAC;AACvD,YAAM,cAAc,OAAO,SACvB,GAAG,OAAO,OAAO,QAAQ,OAAO,EAAE,CAAC,IAAI,GAAG,KAC1C;AAEJ,MAAAA,KAAI,KAAK;AAAA,QACP,YAAY;AAAA,QACZ,cAAc;AAAA,QACd;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAOA,KAAI,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,cAAc,EAAE,WAAW,CAAC;AACtE;AAEA,UAAU,QAAQ,MAAc,KAAgC;AAC9D,MAAI;AACJ,MAAI;AACF,cAAa,gBAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,EACvD,QAAQ;AACN;AAAA,EACF;AACA,aAAW,SAAS,SAAS;AAC3B,UAAM,OAAY,WAAK,KAAK,MAAM,IAAI;AACtC,QAAI,MAAM,YAAY,GAAG;AACvB,UACE,MAAM,SAAS,kBACf,MAAM,SAAS,UACf,MAAM,SAAS,UACf,MAAM,SAAS,WACf,MAAM,SAAS,SACf;AACA;AAAA,MACF;AACA,aAAO,QAAQ,MAAM,IAAI;AAAA,IAC3B,WAAW,MAAM,OAAO,GAAG;AACzB,YAAM;AAAA,IACR;AAAA,EACF;AACF;;;ACpKA,YAAYE,WAAU;AACtB,SAAS,iBAAiB;AAgC1B,SAAS,QAAQ,YAA0B;AACzC,UAAa,cAAQ,UAAU,GAAG;AAAA,IAChC,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AAGE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,WAAW,SAA6C;AAE/D,QAAM,SAAS,CAAC,CAAC;AACjB,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,QAAI,QAAQ,CAAC,MAAM,KAAM,QAAO,KAAK,IAAI,CAAC;AAAA,EAC5C;AACA,SAAO,CAAC,WAAW;AACjB,QAAI,KAAK;AACT,QAAI,KAAK,OAAO,SAAS;AACzB,WAAO,KAAK,IAAI;AACd,YAAM,MAAO,KAAK,KAAK,KAAM;AAC7B,UAAI,OAAO,GAAG,KAAK,OAAQ,MAAK;AAAA,UAC3B,MAAK,MAAM;AAAA,IAClB;AACA,WAAO,KAAK;AAAA,EACd;AACF;AAEO,SAAS,YAAY,MAAiC;AAC3D,QAAM,SAAS,WAAW,KAAK,OAAO;AACtC,MAAI;AACF,UAAM,SAAS,UAAU,KAAK,YAAY,KAAK,SAAS;AAAA,MACtD,MAAM,QAAQ,KAAK,UAAU;AAAA,MAC7B,YAAY;AAAA,IACd,CAAC;AACD,WAAO;AAAA,MACL,SAAS,OAAO;AAAA,MAChB,WAAW,OAAO,OAAO,SAAS;AAAA,MAClC,UAAW,OAAO,YAAY,CAAC;AAAA,MAC/B;AAAA,IACF;AAAA,EACF,QAAQ;AAGN,WAAO,EAAE,SAAS,MAAM,WAAW,MAAM,UAAU,CAAC,GAAG,OAAO;AAAA,EAChE;AACF;AASA,SAAS,OAAO,OAAkC;AAChD,SACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAQ,MAA6B,SAAS;AAElD;AAOO,SAAS,QACd,MACA,OACM;AACN,MAAI,CAAC,OAAO,IAAI,EAAG;AACnB,MAAI,MAAM,IAAI,MAAM,MAAO;AAC3B,aAAW,OAAO,OAAO,KAAK,IAAI,GAAG;AACnC,QAAI,QAAQ,UAAU,QAAQ,WAAW,QAAQ,MAAO;AACxD,UAAM,QAAQ,KAAK,GAAG;AACtB,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,iBAAW,QAAQ,MAAO,SAAQ,MAAM,KAAK;AAAA,IAC/C,WAAW,OAAO,KAAK,GAAG;AACxB,cAAQ,OAAO,KAAK;AAAA,IACtB;AAAA,EACF;AACF;AAMO,SAAS,mBAAmB,MAAwB;AACzD,MAAI,OAAO;AACX,aAAS;AACP,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,2BAA2B;AAC9B,cAAM,QAAQ,KAAK;AACnB,YAAI,CAAC,OAAO,KAAK,EAAG,QAAO;AAC3B,eAAO;AACP;AAAA,MACF;AAAA,MACA;AACE,eAAO;AAAA,IACX;AAAA,EACF;AACF;;;ACpGA,IAAM,sBAAsB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,IAAM,iBAAkE;AAAA,EACtE,MAAM,oBAAI,IAAI;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAAA,EACD,SAAS,oBAAI,IAAI;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAAA,EACD,WAAW,oBAAI,IAAI,CAAC,aAAa,QAAQ,aAAa,CAAC;AAAA,EACvD,QAAQ,oBAAI,IAAI,CAAC,UAAU,QAAQ,cAAc,aAAa,CAAC;AAAA,EAC/D,QAAQ,oBAAI,IAAI,CAAC,UAAU,QAAQ,aAAa,CAAC;AAAA,EACjD,MAAM,oBAAI,IAAI,CAAC,QAAQ,WAAW,QAAQ,aAAa,CAAC;AAC1D;AAEA,IAAM,YAA6C,oBAAI,IAAI;AAAA,EACzD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGD,IAAM,kBAAiD;AAAA,EACrD,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AACX;AACA,IAAM,kBAAkB,IAAI,IAAI,OAAO,OAAO,eAAe,CAAC;AAE9D,IAAM,eAAN,cAA2B,MAAM;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY,MAAc,SAAiB,KAAgB,MAAe;AACxE,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,MAAM;AACX,SAAK,OAAO;AAAA,EACd;AACF;AAEO,SAAS,oBACd,MACA,QAC0B;AAC1B,QAAM,UAA4B,CAAC;AACnC,QAAM,cAA4B,CAAC;AACnC,QAAM,EAAE,SAAS,YAAY,IAAI;AACjC,QAAMC,KAAI,UAAU,YAAY,IAAI;AACpC,MAAIA,GAAE,YAAY,KAAM,QAAO,EAAE,SAAS,YAAY;AAEtD,aAAW,QAAQA,GAAE,QAAQ,MAA8B;AACzD,QAAI,KAAK,SAAS,yBAA0B;AAC5C,UAAM,OAAO,KAAK;AAClB,QAAI,CAACC,QAAO,IAAI,KAAK,KAAK,SAAS,sBAAuB;AAC1D,QAAI,KAAK,SAAS,QAAS;AAC3B,eAAW,cAAe,KAAK,gBAC7B,CAAC,GAAG;AACJ,YAAM,KAAK,WAAW;AACtB,UAAI,CAAC,MAAM,GAAG,SAAS,gBAAgB,OAAO,GAAG,IAAI,MAAM,SAAS;AAClE;AAAA,MACF;AACA,YAAM,YAAY,MAAM,SAAS,KAAK,OAAOD,EAAC;AAC9C,UAAI;AACF,cAAM,OAAO,WAAW;AACxB,YAAI,CAACC,QAAO,IAAI,GAAG;AACjB,gBAAM,IAAI;AAAA,YACR;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AACA,cAAM,QAAQ,WAAW,mBAAmB,IAAI,GAAG,SAASD,EAAC;AAC7D,cAAM,WAAW;AAAA,UACf;AAAA,UACA;AAAA,UACA,KAAK;AAAA,UACL;AAAA,UACA;AAAA,QACF;AACA,iBAAS,OAAO,cAAc,MAAM,OAAO;AAC3C,uBAAe,MAAM,UAAU,aAAaA,IAAG,WAAW;AAC1D,gBAAQ,KAAK,QAAQ;AAAA,MACvB,SAAS,GAAG;AACV,YAAI,aAAa,cAAc;AAC7B,sBAAY,KAAK;AAAA,YACf,MAAM,EAAE;AAAA,YACR,UAAU;AAAA,YACV,SAAS,EAAE;AAAA,YACX,MAAM;AAAA,YACN,MAAM,EAAE,IAAI;AAAA,YACZ,MAAM,EAAE;AAAA,UACV,CAAC;AAAA,QACH,OAAO;AACL,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,YAAY;AAChC;AAIA,SAAS,WAAW,MAAe,SAAiBA,IAA2B;AAC7E,QAAM,YAAY,mBAAmB,IAAI;AACzC,QAAM,MAAM,MAAM,SAAS,UAAU,OAAOA,EAAC;AAC7C,QAAM,OAAa,EAAE,OAAO,UAAU,OAAO,KAAK,UAAU,IAAI;AAEhE,UAAQ,UAAU,MAAM;AAAA,IACtB,KAAK,WAAW;AACd,YAAM,IAAI,UAAU;AACpB,UAAI,OAAO,MAAM,SAAU,QAAO,EAAE,MAAM,UAAU,OAAO,GAAG,KAAK,KAAK;AACxE,UAAI,OAAO,MAAM,UAAU;AACzB,YAAI,CAAC,OAAO,SAAS,CAAC,GAAG;AACvB,gBAAM,IAAI;AAAA,YACR;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AACA,eAAO,EAAE,MAAM,UAAU,OAAO,GAAG,KAAK,KAAK;AAAA,MAC/C;AACA,UAAI,OAAO,MAAM,WAAW;AAC1B,eAAO,EAAE,MAAM,WAAW,OAAO,GAAG,KAAK,KAAK;AAAA,MAChD;AACA,UAAI,MAAM,QAAQ,UAAU,QAAQ,QAAQ;AAC1C,eAAO,EAAE,MAAM,QAAQ,KAAK,KAAK;AAAA,MACnC;AACA,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,mBAAmB;AAEtB,YAAM,MAAM,UAAU;AACtB,UACE,UAAU,aAAa,OACvBC,QAAO,GAAG,KACV,IAAI,SAAS,aACb,OAAO,IAAI,UAAU,UACrB;AACA,eAAO,EAAE,MAAM,UAAU,OAAO,CAAE,IAAI,OAAkB,KAAK,KAAK;AAAA,MACpE;AACA,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,mBAAmB;AACtB,YAAM,cAAe,UAAU,eAAyC,CAAC;AACzE,UAAI,YAAY,SAAS,GAAG;AAC1B,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,YAAM,SAAU,UAAU,UAAoC,CAAC;AAC/D,YAAM,SACH,OAAO,CAAC,GAAG,OAA2C,UAAU;AACnE,aAAO,EAAE,MAAM,UAAU,OAAO,QAAQ,KAAK,KAAK;AAAA,IACpD;AAAA,IACA,KAAK,cAAc;AACjB,YAAM,OAAO,OAAO,UAAU,IAAI;AAClC,UAAI,SAAS,aAAa;AACxB,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,YAAM,IAAI;AAAA,QACR;AAAA,QACA,yBAAyB,IAAI;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK;AACH,aAAO,UAAU,WAAW,SAASD,IAAG,KAAK,IAAI;AAAA,IACnD,KAAK;AACH,aAAO,SAAS,WAAW,SAASA,IAAG,KAAK,IAAI;AAAA,IAClD,KAAK;AACH,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,KAAK;AACH,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,KAAK;AACH,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACE,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,EACJ;AACF;AAEA,SAAS,UACP,MACA,SACAA,IACA,KACA,MACU;AACV,QAAM,UAAsB,CAAC;AAC7B,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,QAAS,KAAK,cAAwC,CAAC,GAAG;AACnE,QAAI,KAAK,SAAS,iBAAiB;AACjC,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA,MAAM,SAAS,KAAK,OAAOA,EAAC;AAAA,MAC9B;AAAA,IACF;AACA,QAAI,KAAK,SAAS,YAAY;AAC5B,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA,MAAM,SAAS,KAAK,OAAOA,EAAC;AAAA,MAC9B;AAAA,IACF;AACA,UAAM,UAAU,KAAK;AACrB,UAAM,SAAS,MAAM,SAAS,QAAQ,OAAOA,EAAC;AAC9C,QAAI,KAAK,WAAW;AAClB,YAAM,IAAI;AAAA,QACR;AAAA,QACA,uBAAuB,OAAO,QAAQ,IAAI,CAAC,4BAA4B,OAAO,QAAQ,IAAI,CAAC;AAAA,QAC3F;AAAA,MACF;AAAA,IACF;AACA,QAAI;AACJ,QAAI,KAAK,UAAU;AACjB,UAAI,QAAQ,SAAS,aAAa,OAAO,QAAQ,UAAU,UAAU;AACnE,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,YAAM,QAAQ;AAAA,IAChB,WAAW,QAAQ,SAAS,cAAc;AACxC,YAAM,OAAO,QAAQ,IAAI;AAAA,IAC3B,WACE,QAAQ,SAAS,aACjB,OAAO,QAAQ,UAAU,UACzB;AACA,YAAM,QAAQ;AAAA,IAChB,OAAO;AACL,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QAAI,KAAK,IAAI,GAAG,GAAG;AACjB,YAAM,IAAI;AAAA,QACR;AAAA,QACA,oBAAoB,GAAG;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AACA,SAAK,IAAI,GAAG;AACZ,UAAM,QAAQ,WAAW,KAAK,OAAkB,SAASA,EAAC;AAC1D,YAAQ,KAAK;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM,YAAY,SAAS,KAAK,OAAO,KAAK,GAAG;AAAA,IACjD,CAAC;AAAA,EACH;AACA,SAAO,EAAE,MAAM,UAAU,SAAS,KAAK,KAAK;AAC9C;AAEA,SAAS,SACP,MACA,SACAA,IACA,KACA,MACU;AACV,QAAM,QAAoB,CAAC;AAC3B,aAAW,MAAO,KAAK,YAAkD,CAAC,GAAG;AAC3E,QAAI,OAAO,MAAM;AACf,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QAAI,GAAG,SAAS,iBAAiB;AAC/B,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA,MAAM,SAAS,GAAG,OAAOA,EAAC;AAAA,MAC5B;AAAA,IACF;AACA,UAAM,KAAK,WAAW,IAAI,SAASA,EAAC,CAAC;AAAA,EACvC;AACA,SAAO,EAAE,MAAM,SAAS,OAAO,KAAK,KAAK;AAC3C;AASA,SAAS,eACP,MACA,UACA,MACAA,IACA,aACM;AACN,MAAI,OAA4B;AAChC,MAAI;AACJ,SAAOC,QAAO,IAAI,GAAG;AACnB,QAAI,KAAK,SAAS,yBAAyB;AACzC,sBAAgB,KAAK;AACrB;AAAA,IACF;AACA,QACE,KAAK,SAAS,oBACd,KAAK,SAAS,yBACd,KAAK,SAAS,qBACd,KAAK,SAAS,2BACd;AACA,aAAO,KAAK;AACZ;AAAA,IACF;AACA;AAAA,EACF;AACA,MAAI,CAACA,QAAO,aAAa,KAAK,cAAc,SAAS,kBAAmB;AACxE,QAAM,WAAW,cAAc;AAC/B,MAAI,CAACA,QAAO,QAAQ,KAAK,SAAS,SAAS,kBAAmB;AAC9D,QAAM,OAAO,SAAS;AACtB,QAAM,QAAQ,SAAS;AACvB,MAAI,CAACA,QAAO,IAAI,KAAK,KAAK,SAAS,gBAAgB,KAAK,SAAS,SAAS;AACxE;AAAA,EACF;AACA,MAAI,CAACA,QAAO,KAAK,KAAK,MAAM,SAAS,aAAc;AACnD,QAAM,SAAS,OAAO,MAAM,IAAI;AAChC,MAAI,CAAC,gBAAgB,IAAI,MAAM,EAAG;AAElC,QAAM,gBAA+B,SAAS,UAC1C,YACC,SAAS;AACd,QAAM,WAAW,gBAAgB,aAAa;AAC9C,MAAI,WAAW,SAAU;AACzB,cAAY,KAAK;AAAA,IACf,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS,yCAAyC,aAAa,wCAAwC,MAAM,wBAAwB,QAAQ;AAAA,IAC7I;AAAA,IACA,MAAMD,GAAE,OAAO,cAAc,KAAK;AAAA,IAClC,MAAM,8CAA8C,QAAQ;AAAA,EAC9D,CAAC;AACH;AAIA,SAAS,cACP,OACA,MACA,YACA,WACA,aACgB;AAChB,MAAI,MAAM,SAAS,UAAU;AAC3B,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA,MAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,QAAQ,oBAAI,IAAsB;AACxC,aAAW,SAAS,MAAM,QAAS,OAAM,IAAI,MAAM,KAAK,KAAK;AAE7D,QAAM,eAAe,oBAAoB;AAAA,IAAO,CAAC,MAC/C,MAAM,IAAI,CAAC;AAAA,EACb;AACA,MAAI,aAAa,WAAW,GAAG;AAC7B,UAAM,IAAI;AAAA,MACR;AAAA,MACA,+CACE,oBAAoB,KAAK,IAAI,IAC7B;AAAA,MACF,MAAM;AAAA,IACR;AAAA,EACF;AACA,MAAI,aAAa,SAAS,GAAG;AAC3B,UAAM,IAAI;AAAA,MACR;AAAA,MACA,mDAAmD,aAAa;AAAA,QAC9D;AAAA,MACF,CAAC;AAAA,MACD,MAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,gBAAgB,aAAa,CAAC;AAEpC,QAAM,OACJ,kBAAkB,YAAY,SAAS;AAEzC,QAAM,UAAU,eAAe,IAAI;AACnC,aAAW,SAAS,MAAM,SAAS;AACjC,QAAI,CAAC,QAAQ,IAAI,MAAM,GAAG,GAAG;AAC3B,YAAM,IAAI;AAAA,QACR;AAAA,QACA,kBAAkB,MAAM,GAAG,yCAAyC,IAAI,eAAe,MAAM;AAAA,UAC3F;AAAA,QACF,EACG,KAAK,EACL,KAAK,IAAI,CAAC;AAAA,QACb,MAAM,MAAM;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAGA,QAAM,UAAkB,kBAAkB,YAAY,SAAS;AAC/D,QAAM,UAAU,MAAM,IAAI,aAAa,EAAG;AAC1C,MAAI;AACJ,MAAI,kBAAkB,WAAW;AAC/B,QAAI,QAAQ,SAAS,aAAa,QAAQ,UAAU,MAAM;AACxD,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,SAAK;AAAA,EACP,OAAO;AACL,SAAK,YAAY,SAAS,MAAM,OAAO;AAAA,EACzC;AAEA,QAAM,aAAa,qBAAqB,OAAO,YAAY,GAAG;AAC9D,QAAM,cAAc,gBAAgB,OAAO,aAAa;AACxD,QAAM,OAAO,gBAAgB,OAAO,MAAM;AAC1C,MAAI,SAAS,IAAI;AACf,UAAM,QAAQ,MAAM,IAAI,MAAM;AAC9B,gBAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT;AAAA,MACA,MAAM,MAAM,MAAM,IAAI;AAAA,MACtB,KAAK;AAAA,QACH,aAAa;AAAA,QACb,OAAO;AAAA,UACL;AAAA,YACE,MAAM;AAAA,YACN,OAAO,MAAM,KAAK;AAAA,YAClB,KAAK,MAAM,KAAK;AAAA,YAChB,aAAa;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACA,QAAM,gBACJ,SAAS,UAAU,SAAS,YACxB,qBAAqB,OAAO,UAAU,IACtC;AACN,QAAM,eACJ,SAAS,SAAS,qBAAqB,OAAO,SAAS,IAAI;AAC7D,QAAM,UACJ,SAAS,UAAU,kBAAkB,YAAY,OAAO;AAE1D,QAAM,WAA2B;AAAA,IAC/B,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,KAAK;AAAA,MACH;AAAA,MACA,MAAM,UAAU;AAAA,MAChB,QAAQ,UAAU;AAAA,IACpB;AAAA,EACF;AACA,MAAI,KAAM,UAAS,OAAO;AAC1B,MAAI,WAAY,UAAS,aAAa;AACtC,MAAI,YAAa,UAAS,cAAc;AACxC,MAAI,eAAe;AACjB,aAAS,WAAW,cAAc;AAClC,aAAS,eAAe,cAAc;AAAA,EACxC;AACA,MAAI,cAAc;AAChB,aAAS,UAAU,aAAa;AAChC,aAAS,cAAc,aAAa;AAAA,EACtC;AACA,MAAI,QAAS,UAAS,UAAU;AAChC,MAAI,OAAO,OAAO,YAAY,QAAQ,SAAS,UAAU;AACvD,aAAS,SAAS,QAAQ;AAAA,EAC5B;AACA,QAAM,aAAmC,CAAC;AAC1C,aAAW,SAAS,MAAM,QAAS,YAAW,MAAM,GAAG,IAAI,MAAM;AACjE,WAAS,aAAa;AACtB,SAAO;AACT;AAEA,SAAS,YACP,OACA,MACA,WACgB;AAChB,MAAI,MAAM,SAAS,UAAU;AAC3B,QAAI,MAAM,MAAM,WAAW,GAAG;AAC5B,YAAM,IAAI;AAAA,QACR;AAAA,QACA,KAAK,SAAS;AAAA,QACd,MAAM;AAAA,MACR;AAAA,IACF;AACA,WAAO,MAAM;AAAA,EACf;AACA,MAAI,MAAM,SAAS,aAAa,MAAM,UAAU,OAAO;AACrD,QAAI,CAAC,UAAU,IAAI,IAAI,GAAG;AACxB,YAAM,IAAI;AAAA,QACR;AAAA,QACA,KAAK,SAAS;AAAA,QACd,MAAM;AAAA,MACR;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,QAAM,IAAI;AAAA,IACR;AAAA,IACA,KAAK,SAAS,sBACZ,UAAU,IAAI,IAAI,IAAI,gBAAgB,EACxC;AAAA,IACA,MAAM;AAAA,EACR;AACF;AAEA,SAAS,gBACP,OACA,MACoB;AACpB,QAAM,QAAQ,MAAM,IAAI,IAAI;AAC5B,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,MAAM,MAAM,SAAS,UAAU;AACjC,UAAM,IAAI;AAAA,MACR;AAAA,MACA,KAAK,IAAI;AAAA,MACT,MAAM,MAAM;AAAA,IACd;AAAA,EACF;AACA,SAAO,MAAM,MAAM;AACrB;AAEA,SAAS,qBACP,OACA,MACiD;AACjD,QAAM,QAAQ,MAAM,IAAI,IAAI;AAC5B,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,MAAM,MAAM,SAAS,SAAS;AAChC,UAAM,IAAI;AAAA,MACR;AAAA,MACA,KAAK,IAAI;AAAA,MACT,MAAM,MAAM;AAAA,IACd;AAAA,EACF;AACA,QAAM,SAAmB,CAAC;AAC1B,QAAM,QAAgB,CAAC;AACvB,aAAW,QAAQ,MAAM,MAAM,OAAO;AACpC,QAAI,KAAK,SAAS,UAAU;AAC1B,YAAM,IAAI;AAAA,QACR;AAAA,QACA,KAAK,IAAI;AAAA,QACT,KAAK;AAAA,MACP;AAAA,IACF;AACA,WAAO,KAAK,KAAK,KAAK;AACtB,UAAM,KAAK,KAAK,IAAI;AAAA,EACtB;AACA,SAAO,EAAE,QAAQ,MAAM;AACzB;AAIA,SAAS,MAAM,SAAiB,QAAgBA,IAA4B;AAC1E,QAAM,YAAY,QAAQ,YAAY,MAAM,SAAS,CAAC,IAAI;AAC1D,SAAO,EAAE,QAAQ,MAAMA,GAAE,OAAO,MAAM,GAAG,QAAQ,SAAS,YAAY,EAAE;AAC1E;AAMA,SAAS,YAAY,SAAiB,OAAe,KAAmB;AACtE,MAAI,IAAI;AACR,SAAO,IAAI,QAAQ,UAAU,QAAQ,KAAK,QAAQ,CAAC,CAAC,EAAG;AACvD,MAAI,QAAQ,CAAC,MAAM,IAAK,QAAO,EAAE,OAAO,KAAK,IAAI,EAAE;AACnD,MAAI,IAAI;AACR,SAAO,IAAI,KAAK,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,EAAG;AAC7C,MAAI,QAAQ,IAAI,CAAC,MAAM,IAAK,QAAO,EAAE,OAAO,IAAI,GAAG,IAAI;AACvD,SAAO,EAAE,OAAO,IAAI;AACtB;AAMA,SAAS,cAAc,MAAe,SAAuB;AAC3D,MAAI,MAAM,KAAK;AACf,SAAO,MAAM,QAAQ,UAAU,QAAQ,KAAK,QAAQ,GAAG,CAAC,EAAG;AAC3D,MAAI,QAAQ,GAAG,MAAM,IAAK;AAC1B,SAAO,MAAM,QAAQ,UAAU,QAAQ,KAAK,QAAQ,GAAG,CAAC,EAAG;AAC3D,MAAI,QAAQ,GAAG,MAAM,KAAM;AAC3B,MAAI,QAAQ,GAAG,MAAM,KAAM;AAC3B,SAAO,EAAE,OAAO,KAAK,OAAO,IAAI;AAClC;AAEA,SAASC,QAAO,OAAkC;AAChD,SACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAQ,MAA6B,SAAS;AAElD;;;ACtrBO,SAAS,iBACd,QACA,SACY;AACZ,MAAI,OAAO,YAAY,QAAQ,CAAC,QAAQ,SAAS,eAAe,GAAG;AACjE,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,QAAoB,CAAC;AAC3B,UAAQ,OAAO,SAAS,CAAC,SAAS;AAChC,QAAI,KAAK,SAAS,iBAAkB,QAAO;AAC3C,UAAM,OAAO,mBAAmB,MAAM,MAAM;AAC5C,QAAI,KAAM,OAAM,KAAK,IAAI;AACzB,WAAO;AAAA,EACT,CAAC;AACD,SAAO;AACT;AAEA,SAAS,mBACP,MACA,QACiB;AACjB,QAAM,SAAS,KAAK;AACpB,MACE,CAAC,UACD,OAAO,SAAS,sBAChB,CAAC,aAAa,OAAO,QAAQ,MAAM,KACnC,CAAC,aAAa,OAAO,UAAU,UAAU,GACzC;AACA,WAAO;AAAA,EACT;AACA,QAAM,OAAQ,KAAK,aAAuC,CAAC;AAC3D,QAAM,QAAQ,mBAAmB,KAAK,CAAC,CAAC;AACxC,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,CAAC,WAAW,KAAK,CAAC,CAAC,EAAG,QAAO;AAEjC,QAAM,OAAO,KAAK,CAAC;AACnB,QAAM,EAAE,OAAO,aAAa,IAAI,OAC5B,kBAAkB,MAAM,MAAM,IAC9B,EAAE,OAAO,CAAC,GAAG,cAAc,CAAC,EAAE;AAClC,SAAO;AAAA,IACL;AAAA,IACA,MAAM,OAAO,OAAO,KAAK,KAAK;AAAA,IAC9B;AAAA,IACA,GAAI,aAAa,SAAS,IAAI,EAAE,aAAa,IAAI,CAAC;AAAA,EACpD;AACF;AAEA,SAAS,WAAW,MAAoC;AACtD,MAAI,CAAC,QAAQ,KAAK,SAAS,mBAAoB,QAAO;AACtD,aAAW,QAAS,KAAK,cAAwC,CAAC,GAAG;AACnE,QAAI,KAAK,SAAS,WAAY;AAC9B,UAAM,MAAM,KAAK;AACjB,UAAM,UACJ,KAAK,SAAS,eACV,OAAO,IAAI,IAAI,IACf,KAAK,SAAS,YACZ,OAAO,IAAI,KAAK,IAChB;AACR,QAAI,YAAY,MAAO;AACvB,UAAM,QAAQ,KAAK;AACnB,QAAI,CAAC,MAAO,QAAO;AACnB,QAAI,mBAAmB,KAAK,MAAM,cAAe,QAAO;AACxD,QAAI,MAAM,SAAS,mBAAmB;AACpC,iBAAW,MAAO,MAAM,YAAsC,CAAC,GAAG;AAChE,YAAI,MAAM,mBAAmB,EAAE,MAAM,cAAe,QAAO;AAAA,MAC7D;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,kBACP,MACA,QACgE;AAChE,QAAM,QAAwB,CAAC;AAC/B,QAAM,eAAsC,CAAC;AAG7C,QAAM,UAAU,oBAAI,IAAa;AAEjC,QAAM,SAAS,CAAC,MAAe,WAA0B;AACvD,QAAI,QAAQ,IAAI,IAAI,EAAG;AACvB,YAAQ,IAAI,IAAI;AAChB,UAAM,WAAW,YAAY,IAAI;AACjC,QAAI,aAAa,MAAM;AAIrB,mBAAa,KAAK,EAAE,MAAM,OAAO,OAAO,KAAK,KAAK,EAAE,CAAC;AACrD;AAAA,IACF;AACA,UAAM,KAAK;AAAA,MACT,IAAI,SAAS;AAAA,MACb,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,MAC3B,MAAM,OAAO,OAAO,KAAK,KAAK;AAAA,MAC9B,MAAM,SAAS;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,UAAQ,MAAM,CAAC,SAAS;AACtB,QAAI,KAAK,SAAS,iBAAkB,QAAO;AAI3C,UAAM,SAAS,KAAK;AACpB,QAAI,QAAQ,SAAS,oBAAoB;AACvC,YAAM,QAAQ,OAAO;AACrB,UAAI,SAAS,YAAY,KAAK,GAAG;AAC/B,cAAM,WAAW,OAAO;AACxB,cAAM,SACJ,UAAU,SAAS,eAAe,OAAO,SAAS,IAAI,IAAI;AAC5D,eAAO,OAAO,MAAM;AAAA,MACtB;AACA,aAAO;AAAA,IACT;AAGA,QAAI,YAAY,IAAI,EAAG,QAAO,IAAI;AAClC,WAAO;AAAA,EACT,CAAC;AAED,SAAO,EAAE,OAAO,aAAa;AAC/B;AAGA,SAAS,YAAY,MAAwB;AAC3C,MAAI,KAAK,SAAS,iBAAkB,QAAO;AAC3C,MAAI,CAAC,aAAa,KAAK,QAAQ,OAAO,EAAG,QAAO;AAChD,UAAS,KAAK,aAAuC,CAAC,GAAG,UAAU;AACrE;AAGA,SAAS,YACP,MAC6D;AAC7D,QAAM,OAAQ,KAAK,aAAuC,CAAC;AAC3D,QAAM,MAAM,KAAK,CAAC;AAClB,QAAM,KAAK,mBAAmB,GAAG;AACjC,MAAI,OAAO,KAAM,QAAO;AACxB,SAAO,EAAE,IAAI,MAAM,EAAE,OAAO,IAAI,OAAO,KAAK,IAAI,IAAI,EAAE;AACxD;AAEA,SAAS,mBAAmB,MAAiD;AAC3E,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,KAAK,SAAS,aAAa,OAAO,KAAK,UAAU,UAAU;AAC7D,WAAO,KAAK,MAAM,SAAS,IAAI,KAAK,QAAQ;AAAA,EAC9C;AACA,MAAI,KAAK,SAAS,mBAAmB;AACnC,UAAM,cAAe,KAAK,eAAyC,CAAC;AACpE,QAAI,YAAY,SAAS,EAAG,QAAO;AACnC,UAAM,SAAU,KAAK,UAAoC,CAAC;AAC1D,UAAM,SAAU,OAAO,CAAC,GAAG,OAA2C;AACtE,WAAO,UAAU,OAAO,SAAS,IAAI,SAAS;AAAA,EAChD;AACA,SAAO;AACT;AAEA,SAAS,aAAa,MAAe,MAAuB;AAC1D,SACE,OAAO,SAAS,YAChB,SAAS,QACR,KAAiB,SAAS,gBAC3B,OAAQ,KAAiB,IAAI,MAAM;AAEvC;;;AChKA,IAAM,eAAe;AAsBrB,IAAM,mBAAmB,oBAAI,IAAI,CAAC,UAAU,KAAK,SAAS,UAAU,UAAU,CAAC;AAG/E,IAAM,gBAAgB,oBAAI,IAAI,CAAC,UAAU,OAAO,QAAQ,SAAS,QAAQ,CAAC;AAa1E,SAAS,SAAS,MAAmC;AACnD,QAAM,OAAO,KAAK;AAClB,MAAI,CAAC,QAAQ,KAAK,SAAS,gBAAiB,QAAO;AACnD,QAAM,IAAI,aAAa,KAAK,OAAO,KAAK,IAAI,CAAC;AAC7C,MAAI,CAAC,EAAG,QAAO;AACf,SAAQ,EAAE,CAAC,KAAK;AAClB;AAOA,SAAS,oBAAoB,SAAuC;AAClE,QAAM,SAAS,oBAAI,IAAoB;AACvC,QAAM,OAAO,oBAAI,IAAY;AAC7B,UAAQ,SAAS,CAAC,SAAS;AACzB,QAAI,KAAK,SAAS,yBAAyB,KAAK,SAAS,SAAS;AAChE,aAAO;AAAA,IACT;AACA,eAAW,QAAS,KAAK,gBAA0C,CAAC,GAAG;AACrE,YAAM,KAAK,KAAK;AAChB,UAAI,CAAC,MAAM,GAAG,SAAS,aAAc;AACrC,YAAM,OAAO,OAAO,GAAG,IAAI;AAC3B,UAAI,KAAK,IAAI,IAAI,GAAG;AAClB,eAAO,OAAO,IAAI;AAClB;AAAA,MACF;AACA,WAAK,IAAI,IAAI;AACb,YAAM,OAAO,KAAK;AAClB,UAAI,CAAC,KAAM;AACX,YAAM,QAAQ,aAAa,mBAAmB,IAAI,CAAC;AACnD,UAAI,UAAU,KAAM,QAAO,IAAI,MAAM,KAAK;AAAA,IAC5C;AACA,WAAO;AAAA,EACT,CAAC;AACD,SAAO;AACT;AAGA,SAAS,aAAa,MAA8B;AAClD,MAAI,KAAK,SAAS,aAAa,OAAO,KAAK,UAAU,UAAU;AAC7D,WAAO,KAAK;AAAA,EACd;AACA,MAAI,KAAK,SAAS,mBAAmB;AACnC,UAAM,cAAe,KAAK,eAAyC,CAAC;AACpE,QAAI,YAAY,SAAS,EAAG,QAAO;AACnC,UAAM,SAAU,KAAK,UAAoC,CAAC;AAC1D,WAAQ,OAAO,CAAC,GAAG,OAA2C,UAAU;AAAA,EAC1E;AACA,SAAO;AACT;AAMA,IAAM,aAAyB,EAAE,UAAU,MAAM;AAWjD,SAAS,iBACP,MACA,QACY;AACZ,QAAM,OAAO,mBAAmB,IAAI;AAEpC,QAAM,UAAU,aAAa,IAAI;AACjC,MAAI,YAAY,MAAM;AACpB,WAAO,QAAQ,SAAS,IAAI,EAAE,UAAU,MAAM,KAAK,CAAC,OAAO,EAAE,IAAI;AAAA,EACnE;AAEA,MAAI,KAAK,SAAS,mBAAmB;AACnC,UAAM,SAAU,KAAK,UAAoC,CAAC;AAC1D,UAAM,cAAe,KAAK,eAAyC,CAAC;AACpE,QAAIC,OAAM;AACV,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,MAAAA,QAAQ,OAAO,CAAC,EAAE,OAA2C,UAAU;AACvE,UAAI,IAAI,YAAY,QAAQ;AAC1B,cAAM,OAAO,iBAAiB,YAAY,CAAC,GAAG,MAAM;AACpD,QAAAA,QAAO,KAAK,YAAY,KAAK,IAAI,WAAW,IAAI,KAAK,IAAI,CAAC,IAAI;AAAA,MAChE;AAAA,IACF;AACA,IAAAA,OAAMA,KAAI,QAAQ,WAAW,GAAG;AAChC,QAAI,CAACA,KAAI,SAAS,GAAG,GAAG;AACtB,aAAOA,KAAI,SAAS,IAAI,EAAE,UAAU,MAAM,KAAK,CAACA,IAAG,EAAE,IAAI;AAAA,IAC3D;AAGA,WAAOA,KAAI,QAAQ,OAAO,EAAE,EAAE,SAAS,IACnC,EAAE,UAAU,MAAM,KAAK,CAACA,IAAG,EAAE,IAC7B;AAAA,EACN;AAEA,MAAI,KAAK,SAAS,cAAc;AAC9B,UAAM,QAAQ,OAAO,IAAI,OAAO,KAAK,IAAI,CAAC;AAC1C,WAAO,UAAU,UAAa,MAAM,SAAS,IACzC,EAAE,UAAU,MAAM,KAAK,CAAC,KAAK,EAAE,IAC/B;AAAA,EACN;AAEA,MAAI,KAAK,SAAS,yBAAyB;AACzC,UAAM,OAAO,iBAAiB,KAAK,YAAuB,MAAM;AAChE,UAAM,QAAQ,iBAAiB,KAAK,WAAsB,MAAM;AAChE,QAAI,CAAC,KAAK,YAAY,CAAC,MAAM,SAAU,QAAO;AAC9C,WAAO,EAAE,UAAU,MAAM,KAAK,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,KAAK,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC,EAAE;AAAA,EAC1E;AAEA,SAAO;AACT;AAEA,SAAS,oBACP,SACA,QACA,cACA,QACgB;AAChB,QAAM,UAA0B,CAAC;AACjC,QAAM,WAA2B,CAAC;AAClC,QAAM,aAAc,QAAQ,cAAwC,CAAC;AACrE,aAAW,QAAQ,YAAY;AAC7B,QAAI,KAAK,SAAS,eAAgB;AAClC,UAAM,OAAO,SAAS,IAAI;AAC1B,QAAI,CAAC,KAAM;AACX,UAAM,QAAQ,KAAK;AACnB,QAAI,CAAC,MAAO;AAEZ,QAAI,SAAqB;AACzB,QAAI;AACJ,QAAI,MAAM,SAAS,WAAW;AAC5B,YAAM,IAAI,aAAa,KAAK;AAC5B,eACE,MAAM,QAAQ,EAAE,SAAS,IAAI,EAAE,UAAU,MAAM,KAAK,CAAC,CAAC,EAAE,IAAI;AAC9D,UAAI,OAAO,SAAU,aAAY,EAAE,OAAO,MAAM,OAAO,KAAK,MAAM,IAAI;AAAA,IACxE,WAAW,MAAM,SAAS,0BAA0B;AAClD,YAAM,OAAO,MAAM;AACnB,UAAI,QAAQ,KAAK,SAAS,sBAAsB;AAC9C,iBAAS,iBAAiB,MAAM,MAAM;AACtC,cAAM,QAAQ,mBAAmB,IAAI;AACrC,YAAI,OAAO,YAAY,aAAa,KAAK,MAAM,MAAM;AACnD,sBAAY,EAAE,OAAO,MAAM,OAAO,KAAK,MAAM,IAAI;AAAA,QACnD;AAAA,MACF;AACA,UAAI,CAAC,OAAO,UAAU;AACpB,qBAAa,KAAK;AAAA,UAChB;AAAA,UACA,UAAU,SAAS,YAAY,eAAe,cAAc,IAAI;AAAA,UAChE,MAAM,OAAO,KAAK,KAAK;AAAA,QACzB,CAAC;AACD;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,OAAO,SAAU;AACtB,eAAW,MAAM,OAAO,KAAK;AAC3B,YAAM,WAAyB;AAAA,QAC7B;AAAA,QACA;AAAA,QACA,OAAO,KAAK;AAAA,QACZ,WAAW,GAAG,SAAS,GAAG;AAAA;AAAA,QAE1B,GAAI,OAAO,IAAI,WAAW,KAAK,YAAY,EAAE,MAAM,UAAU,IAAI,CAAC;AAAA,MACpE;AACA,UAAI,SAAS,UAAW,UAAS,KAAK,QAAQ;AAAA,UACzC,SAAQ,KAAK,QAAQ;AAAA,IAC5B;AAAA,EACF;AAGA,SAAO,CAAC,GAAG,SAAS,GAAG,QAAQ;AACjC;AAEO,SAAS,gBAAgB,QAAgC;AAC9D,QAAM,cAAoC,CAAC;AAC3C,QAAM,eAAkC,CAAC;AACzC,QAAM,yBAAmD,CAAC;AAC1D,QAAM,YAA4B,CAAC;AAGnC,MAAI,OAAO,YAAY,MAAM;AAC3B,WAAO,EAAE,aAAa,cAAc,wBAAwB,UAAU;AAAA,EACxE;AAEA,QAAM,SAAS,oBAAoB,OAAO,OAA6B;AACvE,QAAM,YAAkC,CAAC;AAEzC,QAAM,QAAQ,CAAC,SAAwB;AACrC,QAAI,CAACC,QAAO,IAAI,EAAG;AAEnB,QAAI,KAAK,SAAS,cAAc;AAC9B,YAAM,UAAU,KAAK;AACrB,YAAM,QAAQ;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO;AAAA,MACT;AACA,YAAM,cAAc,gBAAgB,MAAM,OAAO,MAAM;AACvD,UAAI,YAAa,wBAAuB,KAAK,WAAW;AACxD,UAAI,MAAM,SAAS,GAAG;AACpB,cAAM,WAAW,UAAU,MAAM;AACjC,mBAAW,KAAK,OAAO;AACrB,sBAAY,KAAK;AAAA,YACf,MAAM,EAAE;AAAA,YACR,IAAI,EAAE;AAAA,YACN,MAAM,OAAO,OAAO,EAAE,KAAK;AAAA,YAC3B,WAAW;AAAA,YACX,GAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;AAAA,UACnC,CAAC;AAAA,QACH;AAAA,MACF;AACA,UAAI,SAAS,MAAM;AACnB,iBAAW,KAAK,MAAO,WAAU,KAAK,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,GAAG,CAAC;AAKhE,YAAM,WAAW,aAAa,SAAS,OAAO,MAAM;AACpD,UAAI,UAAU;AACZ,kBAAU,KAAK,QAAQ;AACvB,YAAI,CAAC,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ,GAAG;AAC3C,oBAAU,KAAK,EAAE,MAAM,UAAU,IAAI,SAAS,IAAI,CAAC;AACnD;AAAA,QACF;AAAA,MACF;AAGA,oBAAc,OAAO;AACrB,iBAAW,SAAU,KAAK,YAAsC,CAAC,GAAG;AAClE,cAAM,KAAK;AAAA,MACb;AACA,YAAM,UAAU,KAAK;AACrB,UAAIA,QAAO,OAAO,EAAG,eAAc,OAAO;AAC1C,gBAAU,UAAU;AACpB;AAAA,IACF;AAEA,kBAAc,IAAI;AAAA,EACpB;AAEA,QAAM,gBAAgB,CAAC,SAAwB;AAC7C,eAAW,OAAO,OAAO,KAAK,IAAI,GAAG;AACnC,UAAI,QAAQ,UAAU,QAAQ,WAAW,QAAQ,MAAO;AACxD,YAAM,QAAQ,KAAK,GAAG;AACtB,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,mBAAW,QAAQ,MAAO,OAAM,IAAI;AAAA,MACtC,OAAO;AACL,cAAM,KAAK;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO,OAAO;AACpB,SAAO,EAAE,aAAa,cAAc,wBAAwB,UAAU;AACxE;AAOA,SAAS,aACP,SACA,QACqB;AACrB,QAAM,OAAO,QAAQ;AACrB,MAAI,CAAC,QAAQ,KAAK,SAAS,gBAAiB,QAAO;AACnD,QAAM,MAAM,OAAO,KAAK,IAAI;AAC5B,MAAI,cAAc,IAAI,GAAG,GAAG;AAC1B,WAAO,EAAE,KAAK,MAAM,OAAO,QAAQ,KAAK,EAAE;AAAA,EAC5C;AACA,aAAW,QAAS,QAAQ,cAAwC,CAAC,GAAG;AACtE,QAAI,KAAK,SAAS,eAAgB;AAClC,UAAM,WAAW,KAAK;AACtB,QAAI,CAAC,YAAY,OAAO,SAAS,IAAI,MAAM,OAAQ;AACnD,UAAM,QAAQ,KAAK;AACnB,QAAI,SAAS,MAAM,SAAS,aAAa,MAAM,UAAU,UAAU;AACjE,aAAO,EAAE,KAAK,UAAU,MAAM,OAAO,QAAQ,KAAK,EAAE;AAAA,IACtD;AAAA,EACF;AACA,SAAO;AACT;AAQA,SAAS,gBACP,SACA,QAC+B;AAC/B,QAAM,UAAU,QAAQ;AACxB,QAAM,OAAO,QAAQ;AACrB,MAAI,CAAC,QAAQ,KAAK,SAAS,gBAAiB,QAAO;AACnD,QAAM,MAAM,OAAO,KAAK,IAAI;AAC5B,MAAI,CAAC,iBAAiB,IAAI,GAAG,EAAG,QAAO;AACvC,MAAI,YAAY;AAChB,aAAW,QAAS,QAAQ,cAAwC,CAAC,GAAG;AACtE,QAAI,KAAK,SAAS,sBAAsB;AACtC,kBAAY;AACZ;AAAA,IACF;AACA,QAAI,KAAK,SAAS,kBAAkB,SAAS,IAAI,MAAM,KAAM,QAAO;AAAA,EACtE;AACA,QAAM,WAAW,oBAAoB,SAAS,OAAO;AACrD,SAAO;AAAA,IACL;AAAA,IACA,MAAM,OAAO,QAAQ,KAAK;AAAA,IAC1B;AAAA,IACA,SAAS,KAAK;AAAA,IACd,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,EACjC;AACF;AAGA,SAAS,gBAAgB,SAAkB,UAAiC;AAC1E,aAAW,QAAS,QAAQ,cAAwC,CAAC,GAAG;AACtE,QAAI,KAAK,SAAS,eAAgB;AAClC,UAAM,IAAI,KAAK;AACf,QAAI,CAAC,KAAK,OAAO,EAAE,IAAI,MAAM,SAAU;AACvC,UAAM,QAAQ,KAAK;AACnB,QAAI,CAAC,MAAO,QAAO;AACnB,QAAI,MAAM,SAAS,UAAW,QAAO,aAAa,KAAK;AACvD,QAAI,MAAM,SAAS,0BAA0B;AAC3C,YAAM,OAAO,MAAM;AACnB,aAAO,OAAO,aAAa,mBAAmB,IAAI,CAAC,IAAI;AAAA,IACzD;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAGA,SAAS,gBAAgB,SAA0B;AACjD,QAAM,QAAkB,CAAC;AACzB,aAAW,SAAU,QAAQ,YAAsC,CAAC,GAAG;AACrE,QAAI,MAAM,SAAS,WAAW;AAC5B,YAAM,KAAK,OAAQ,MAA8B,SAAS,EAAE,CAAC;AAAA,IAC/D;AAAA,EACF;AACA,SAAO,MAAM,KAAK,GAAG,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACnD;AAOA,SAAS,oBACP,SACA,SACoB;AACpB,QAAM,YAAY,gBAAgB,SAAS,YAAY;AACvD,MAAI,UAAW,QAAO;AACtB,QAAM,OAAO,gBAAgB,OAAO;AACpC,MAAI,KAAM,QAAO;AACjB,aAAW,QAAQ,CAAC,SAAS,QAAQ,aAAa,GAAG;AACnD,UAAM,IAAI,gBAAgB,SAAS,IAAI;AACvC,QAAI,EAAG,QAAO;AAAA,EAChB;AACA,SAAO;AACT;AAEA,SAASA,QAAO,OAAkC;AAChD,SACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAQ,MAA6B,SAAS;AAElD;;;ACjaA,SAAS,uBACP,MACA,QACmB;AACnB,QAAM,QACJ,OAAO,YAAY,QAClB,OAAO,aAAa,OAAO,QAAQ,KAAK,WAAW;AACtD,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SACE;AAAA,IACF,MAAM,KAAK;AAAA,IACX,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACF;AAEO,SAAS,QAAQ,OAAuC;AAC7D,SAAO,MAAM,IAAI,CAAC,SAAS;AAGzB,UAAM,SAAS,YAAY,IAAI;AAC/B,UAAM,EAAE,SAAS,YAAY,IAAI,oBAAoB,MAAM,MAAM;AACjE,UAAM,eAAe,uBAAuB,MAAM,MAAM;AACxD,QAAI,aAAc,aAAY,KAAK,YAAY;AAC/C,UAAMC,OAAqB,EAAE,MAAM,aAAa,CAAC,EAAE;AACnD,IAAAA,KAAI,cAAc,WAAW,MAAM,QAAQA,IAAG;AAC9C,QAAI,QAAQ,SAAS,EAAG,CAAAA,KAAI,WAAW;AACvC,QAAI,YAAY,SAAS,EAAG,CAAAA,KAAI,cAAc;AAC9C,UAAM,QAAQ,iBAAiB,QAAQ,KAAK,OAAO;AACnD,QAAI,MAAM,SAAS,EAAG,CAAAA,KAAI,QAAQ;AAClC,UAAM,UAAU,mBAAmB,MAAM;AACzC,QAAI,QAAQ,SAAS,EAAG,CAAAA,KAAI,UAAU;AACtC,WAAOA;AAAA,EACT,CAAC;AACH;AAEA,SAAS,WACP,MACA,QACAA,MACc;AACd,QAAM,cAA4B,CAAC;AACnC,QAAM,EAAE,YAAY,IAAI;AAExB,QAAM,MAAM,gBAAgB,MAAM;AAClC,MAAI,IAAI,aAAa,SAAS,EAAG,CAAAA,KAAI,eAAe,IAAI;AACxD,MAAI,IAAI,uBAAuB,SAAS,GAAG;AACzC,IAAAA,KAAI,yBAAyB,IAAI;AAAA,EACnC;AACA,MAAI,IAAI,UAAU,SAAS,EAAG,CAAAA,KAAI,YAAY,IAAI;AAClD,aAAW,OAAO,IAAI,aAAa;AACjC,gBAAY,KAAK;AAAA,MACf,MAAM,IAAI;AAAA,MACV,IAAI,IAAI;AAAA,MACR,MAAM;AAAA,MACN,MAAM,IAAI;AAAA,MACV,GAAI,IAAI,UAAU,SAAS,IAAI,EAAE,WAAW,IAAI,UAAU,IAAI,CAAC;AAAA,MAC/D,GAAI,IAAI,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;AAAA,IACvC,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAQA,SAAS,mBAAmB,QAAoC;AAC9D,MAAI,OAAO,YAAY,KAAM,QAAO,CAAC;AACrC,QAAMA,OAAoB,CAAC;AAC3B,aAAW,QAAQ,OAAO,QAAQ,MAA8B;AAC9D,QAAI;AACJ,QAAI,aAAa;AACjB,UAAM,QAAkB,CAAC;AACzB,QAAI,KAAK,SAAS,qBAAqB;AACrC,eAAS,KAAK;AACd,mBAAa,KAAK,eAAe;AACjC,iBAAW,QAAS,KAAK,cAAwC,CAAC,GAAG;AACnE,cAAM,QAAQ,KAAK;AACnB,YAAI,SAAS,MAAM,SAAS,cAAc;AACxC,gBAAM,KAAK,OAAO,MAAM,IAAI,CAAC;AAAA,QAC/B;AAAA,MACF;AAAA,IACF,YACG,KAAK,SAAS,4BACb,KAAK,SAAS,2BAChB,KAAK,QACL;AACA,eAAS,KAAK;AACd,mBAAa,KAAK,eAAe;AAAA,IACnC,OAAO;AACL;AAAA,IACF;AACA,QAAI,CAAC,UAAU,OAAO,SAAS,UAAW;AAC1C,QAAI,OAAO,OAAO,UAAU,SAAU;AACtC,IAAAA,KAAI,KAAK;AAAA,MACP,WAAW,OAAO;AAAA,MAClB,MAAM,OAAO,OAAO,KAAK,KAAK;AAAA,MAC9B,MAAM,EAAE,OAAO,KAAK,OAAO,KAAK,KAAK,IAAI;AAAA,MACzC;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAOA;AACT;;;AClIA,YAAYC,WAAU;;;ACAf,IAAM,eAAe;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AA4FO,SAAS,WAAW,MAA0C;AACnE,SAAO,SAAS,WAAW,SAAS;AACtC;AAEO,SAAS,aACd,QACqD;AACrD,SAAO,WAAW,OAAO,IAAI;AAC/B;AAEO,SAAS,UAAU,QAAwB;AAChD,SAAO,OAAO,SAAS,UAAU,OAAO,OAAO,OAAO;AACxD;AAQO,IAAM,yBAAN,cAAqC,MAAM;AAAA,EACvC;AAAA,EACT,YAAY,MAAc;AACxB,UAAM,wBAAwB,IAAI,EAAE;AACpC,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACd;AACF;AAEA,IAAM,WAAgC,IAAI,IAAY,YAAY;AAE3D,SAAS,iBAAiB,MAA0C;AACzE,MAAI,CAAC,SAAS,IAAI,IAAI,EAAG,OAAM,IAAI,uBAAuB,IAAI;AAChE;;;AC9EA,SAAS,aAAwB;AAC/B,SAAO;AAAA,IACL,OAAO,oBAAI,IAAI;AAAA,IACf,MAAM,oBAAI,IAAI;AAAA,IACd,SAAS,oBAAI,IAAI;AAAA,IACjB,QAAQ,oBAAI,IAAI;AAAA,IAChB,QAAQ,oBAAI,IAAI;AAAA,IAChB,SAAS,oBAAI,IAAI;AAAA,IACjB,WAAW,oBAAI,IAAI;AAAA,IACnB,MAAM,oBAAI,IAAI;AAAA,EAChB;AACF;AAEA,SAAS,eAAe,OAAuB,UAA4B;AACzE,QAAM,MAAgB,CAAC;AACvB,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,QAAQ,SAAS,QAAQ,EAAG,KAAI,KAAK,KAAK,EAAE;AAAA,EACvD;AACA,SAAO;AACT;AAEA,SAAS,aAA+B,QAAW,OAA0B;AAC3E,MAAI,CAAC,WAAW,OAAO,IAAI,EAAG,QAAO;AACrC,QAAM,WAAW;AACjB,MAAI,SAAS,SAAS,OAAW,QAAO;AACxC,QAAM,gBAAgB,OAAO,OAAO,eAAe,OAAO,SAAS,EAAE,CAAC;AACtE,QAAM,aAAuB,EAAE,GAAG,SAAS,MAAM,OAAO,cAAc;AACtE,SAAO,EAAE,GAAG,QAAQ,MAAM,OAAO,OAAO,UAAU,EAAE;AACtD;AAEO,SAAS,iBAA2B;AACzC,QAAM,QAAQ,WAAW;AACzB,MAAI,aAA4B;AAChC,QAAM,eAAe,oBAAI,IAGvB;AAEF,QAAM,WAAW,MAAc;AAC7B,QAAI,eAAe,KAAM,cAAa,MAAM,KAAK,MAAM,KAAK,OAAO,CAAC;AACpE,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,CAAC,WAAyB;AACpC,qBAAiB,OAAO,IAAI;AAC5B,UAAM,MAAM,UAAU,MAAM;AAC3B,IAAC,MAAM,OAAO,IAAI,EAA0B,IAAI,KAAK,MAAM;AAC5D,iBAAa;AACb,iBAAa,OAAO,OAAO,IAAI;AAAA,EACjC;AAEA,QAAM,MAAM,CACV,MACA,OACgC;AAChC,qBAAiB,IAAI;AACrB,UAAM,MAAM,MAAM,IAAI,EAAE,IAAI,EAAE;AAC9B,QAAI,QAAQ,OAAW,QAAO;AAC9B,WAAO,aAAa,KAAK,SAAS,CAAC;AAAA,EACrC;AASA,QAAM,qBAAqB,CACzB,SAC2B;AAC3B,UAAM,SAAS,aAAa,IAAI,IAAI;AACpC,QAAI,WAAW,OAAW,QAAO;AACjC,UAAM,WAAmC,CAAC;AAC1C,eAAW,CAAC,KAAK,MAAM,KAAK,MAAM,IAAI,GAAG;AACvC,UAAI,IAAI,SAAS,GAAG,GAAG;AACrB,cAAM,WAAW,IAAI,MAAM,GAAG;AAC9B,iBAAS,KAAK;AAAA,UACZ;AAAA,UACA,cAAc,SAAS,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC;AAAA,UACvD;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AACA,iBAAa;AAAA,MACX;AAAA,MACA;AAAA,IAKF;AACA,WAAO;AAAA,EACT;AAIA,QAAM,kBAAkB,CAAC,UAAoB,OAAwB;AACnE,UAAM,QAAQ,SAAS,CAAC;AACxB,UAAM,OAAO,SAAS,SAAS,SAAS,CAAC;AACzC,QAAI,CAAC,GAAG,WAAW,KAAK,EAAG,QAAO;AAClC,QAAI,MAAM,MAAM;AAChB,aAAS,IAAI,GAAG,IAAI,SAAS,SAAS,GAAG,KAAK;AAC5C,YAAM,MAAM,GAAG,QAAQ,SAAS,CAAC,GAAG,GAAG;AACvC,UAAI,QAAQ,GAAI,QAAO;AACvB,YAAM,MAAM,SAAS,CAAC,EAAE;AAAA,IAC1B;AACA,WAAO,GAAG,SAAS,IAAI,KAAK,GAAG,SAAS,KAAK,UAAU;AAAA,EACzD;AAEA,QAAM,eAAe,CACnB,MACA,OACgC;AAChC,qBAAiB,IAAI;AACrB,UAAM,WAAW,mBAAmB,IAAI;AACxC,QAAI,SAAS,WAAW,EAAG,QAAO;AAClC,QAAI;AACJ,eAAW,SAAS,UAAU;AAC5B,UACE,gBAAgB,MAAM,UAAU,EAAE,MACjC,SAAS,UAAa,MAAM,eAAe,KAAK,eACjD;AACA,eAAO;AAAA,MACT;AAAA,IACF;AACA,QAAI,SAAS,OAAW,QAAO;AAC/B,WAAO,aAAa,KAAK,QAAQ,SAAS,CAAC;AAAA,EAC7C;AAEA,QAAM,OAAO,CACX,SACmC;AACnC,qBAAiB,IAAI;AACrB,UAAM,QAAQ,SAAS;AACvB,WAAO,MAAM;AAAA,MAAK,MAAM,IAAI,EAAE,OAAO;AAAA,MAAG,CAAC,MACvC,aAAa,GAAsB,KAAK;AAAA,IAC1C;AAAA,EACF;AAEA,QAAM,cAAc,aAAgC;AAClD,eAAW,QAAQ,OAAO,KAAK,KAAK,GAAmB;AACrD,iBAAW,UAAU,MAAM,IAAI,EAAE,OAAO,GAAG;AACzC,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,CAAC,cAAqD;AAClE,UAAM,QAAQ,SAAS;AACvB,UAAM,SAAmB,CAAC;AAC1B,eAAW,UAAU,YAAY,GAAG;AAClC,UAAI,UAAU,MAAM,EAAG,QAAO,KAAK,aAAa,QAAQ,KAAK,CAAC;AAAA,IAChE;AACA,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,CAAC,UACf;AAAA,IACE,CAAC,WACC,YAAY,UACZ,MAAM,QAAQ,OAAO,MAAM,KAC3B,OAAO,OAAO,SAAS,KAAK;AAAA,EAChC;AAEF,QAAM,YAAY,CAAC,WAA6B;AAC9C,UAAM,OAAO,MAAM,KAAK,IAAI,MAAM;AAClC,QAAI,SAAS,OAAW,QAAO,CAAC;AAChC,UAAM,MAAM,IAAI,IAAI,KAAK,OAAO;AAChC,WAAO,MAAM,CAAC,WAAW;AACvB,UAAI,CAAC,aAAa,MAAM,EAAG,QAAO;AAClC,aAAO,IAAI,IAAI,OAAO,EAAE;AAAA,IAC1B,CAAC;AAAA,EACH;AAEA,QAAM,UAAU,oBAAI,IAAqC;AACzD,QAAM,aAAa,oBAAI,IAAgB;AAEvC,QAAM,aAAa,CACjB,MACA,IACA,YACS;AACT,YAAQ,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,OAAO;AACpC,eAAW,MAAM,WAAY,IAAG;AAAA,EAClC;AAEA,QAAM,aAAa,CAAC,MAAkB,OACpC,QAAQ,IAAI,GAAG,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC;AAEnC,QAAM,iBAAiB,MAAyB,MAAM,KAAK,QAAQ,KAAK,CAAC;AAEzE,QAAM,kBAAkB,CAAC,OAAiC;AACxD,eAAW,IAAI,EAAE;AACjB,WAAO,MAAM,WAAW,OAAO,EAAE;AAAA,EACnC;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACxQA,IAAM,gBAAgB;AACtB,IAAM,wBAAwB;AAC9B,IAAM,iBAAiB;AAShB,SAAS,aAAa,OAAuC;AAClE,QAAMC,OAAuB,CAAC;AAC9B,QAAM,OAAO,oBAAI,IAAY;AAE7B,aAAW,KAAK,OAAO;AACrB,UAAM,MAAM,EAAE;AACd,UAAM,QAAQ,IAAI,MAAM,GAAG;AAC3B,UAAM,OAAO,MAAM,MAAM,SAAS,CAAC;AAGnC,UAAM,SAAS,MAAM,QAAQ,KAAK;AAClC,QAAI,WAAW,MAAM,cAAc,KAAK,IAAI,GAAG;AAC7C,YAAM,gBAAgB,MAAM,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC;AAC9D,YAAM,YAAY,kBAAkB,aAAa;AACjD,WAAKA,MAAK,MAAM,WAAW,EAAE,WAAW;AACxC;AAAA,IACF;AACA,QAAI,WAAW,MAAM,eAAe,KAAK,IAAI,GAAG;AAE9C;AAAA,IACF;AAGA,UAAM,WAAW,MAAM,QAAQ,OAAO;AACtC,QAAI,aAAa,MAAM,sBAAsB,KAAK,IAAI,GAAG;AACvD,YAAM,OAAO,MAAM,MAAM,WAAW,CAAC;AAErC,UAAI,KAAK,CAAC,MAAM,MAAO;AACvB,YAAM,OAAO,KAAK,KAAK,SAAS,CAAC;AACjC,UAAI,KAAK,WAAW,GAAG,EAAG;AAC1B,YAAM,aAAa;AAAA,QACjB,GAAG,KAAK,MAAM,GAAG,EAAE;AAAA,QACnB,KAAK,QAAQ,YAAY,EAAE;AAAA,MAC7B,EAAE,OAAO,CAAC,MAAM,MAAM,OAAO;AAC7B,YAAM,YAAY,kBAAkB,UAAU;AAC9C,WAAKA,MAAK,MAAM,WAAW,EAAE,WAAW;AACxC;AAAA,IACF;AAGA,UAAM,YAAY,MAAM,QAAQ,QAAQ;AACxC,QAAI,cAAc,MAAM,sBAAsB,KAAK,IAAI,GAAG;AACxD,YAAM,OAAO,MAAM,MAAM,YAAY,CAAC;AACtC,YAAM,OAAO,KAAK,KAAK,SAAS,CAAC;AACjC,UAAI,KAAK,WAAW,GAAG,EAAG;AAC1B,YAAM,aAAa;AAAA,QACjB,GAAG,KAAK,MAAM,GAAG,EAAE;AAAA,QACnB,KAAK,QAAQ,YAAY,EAAE;AAAA,MAC7B,EAAE,OAAO,CAAC,MAAM,MAAM,WAAW,MAAM,QAAQ;AAC/C,YAAM,YAAY,kBAAkB,UAAU;AAC9C,WAAKA,MAAK,MAAM,WAAW,EAAE,WAAW;AACxC;AAAA,IACF;AAAA,EACF;AAEA,SAAOA,KAAI,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AACxD;AAEA,SAAS,KACPA,MACA,MACA,WACA,MACM;AACN,MAAI,KAAK,IAAI,SAAS,EAAG;AACzB,OAAK,IAAI,SAAS;AAClB,EAAAA,KAAI,KAAK,EAAE,IAAI,SAAS,SAAS,GAAG,MAAM,WAAW,KAAK,CAAC;AAC7D;AAEA,SAAS,kBAAkB,UAA4B;AAErD,QAAM,OAAO,SAAS,OAAO,CAAC,MAAM,EAAE,EAAE,WAAW,GAAG,KAAK,EAAE,SAAS,GAAG,EAAE;AAC3E,MAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,SAAO,MAAM,KAAK,KAAK,GAAG;AAC5B;AAEO,SAAS,SAAS,WAA2B;AAClD,MAAI,cAAc,IAAK,QAAO;AAC9B,SAAO,UACJ,QAAQ,QAAQ,EAAE,EAClB,QAAQ,sBAAsB,IAAI,EAClC,QAAQ,iBAAiB,IAAI,EAC7B,QAAQ,OAAO,GAAG,EAClB,QAAQ,kBAAkB,GAAG,EAC7B,QAAQ,OAAO,GAAG,EAClB,QAAQ,UAAU,EAAE;AACzB;;;AHtEA,IAAM,iBAAkD,oBAAI,IAAI;AAAA,EAC9D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAeD,SAAS,mBAAmB,GAM1B;AACA,SAAO;AAAA,IACL,YACE,GAAG,eAAe,SACd,oBAAoB,aACpB,EAAE;AAAA,IACR,UACE,GAAG,aAAa,SAAY,oBAAoB,WAAW,EAAE;AAAA,IAC/D,OAAO,GAAG,UAAU,SAAY,oBAAoB,QAAQ,EAAE;AAAA,IAC9D,OAAO,GAAG,UAAU,SAAY,oBAAoB,QAAQ,EAAE;AAAA,IAC9D,SAAS,GAAG,YAAY,SAAY,oBAAoB,UAAU,EAAE;AAAA,EACtE;AACF;AAEA,SAAS,MAAM,KAAqB;AAClC,SAAO,IACJ,QAAQ,sBAAsB,OAAO,EACrC,QAAQ,WAAW,GAAG,EACtB,QAAQ,kBAAkB,EAAE,EAC5B,YAAY;AACjB;AAEA,SAAS,SAAS,MAAsB;AACtC,QAAM,IAAS,YAAM,SAAS,IAAI;AAClC,SAAO,EAAE,QAAQ,8BAA8B,EAAE;AACnD;AAEA,SAAS,eAAe,aAAqB,UAA6B;AACxE,SAAO,SAAS,KAAK,CAAC,MAAM,aAAa,CAAC,EAAE,KAAK,WAAW,CAAC;AAC/D;AAEA,SAAS,oBAAoB,KAA2C;AACtE,QAAM,OAAiB,CAAC;AACxB,MAAI,IAAI,KAAM,MAAK,OAAO,IAAI;AAC9B,MAAI,IAAI,YAAa,MAAK,cAAc,IAAI;AAC5C,MAAI,IAAI,YAAY,OAAQ,MAAK,aAAa,IAAI;AAClD,MAAI,IAAI,UAAU,OAAQ,MAAK,WAAW,IAAI;AAC9C,MAAI,IAAI,SAAS,OAAQ,MAAK,UAAU,IAAI;AAC5C,SAAO,OAAO,KAAK,IAAI,EAAE,SAAS,IAAI,OAAO;AAC/C;AAMO,SAASC,SAAQ,KAAoC;AAC1D,QAAM,cAAc,mBAAmB,IAAI,OAAO,WAAW;AAC7D,QAAM,WAAW,eAAe;AAChC,QAAM,cAA4B,CAAC;AAInC,QAAM,gBAAgB,oBAAI,IAAyC;AACnE,aAAW,MAAM,IAAI,WAAW;AAC9B,QAAI,CAAC,GAAG,SAAU;AAClB,UAAM,MAAM,oBAAI,IAA4B;AAC5C,eAAW,KAAK,GAAG,SAAU,KAAI,IAAI,EAAE,MAAM,CAAC;AAC9C,kBAAc,IAAI,GAAG,KAAK,aAAa,GAAG;AAAA,EAC5C;AACA,WAAS,UACP,MACA,MAC4B;AAC5B,WAAO,cAAc,IAAI,IAAI,GAAG,IAAI,IAAI;AAAA,EAC1C;AAEA,QAAM,iBAA+B,CAAC;AACtC,aAAW,MAAM,IAAI,WAAW;AAC9B,eAAW,KAAK,GAAG,YAAa,gBAAe,KAAK,CAAC;AAAA,EACvD;AAKA,QAAM,iBAAiB,oBAAI,IAAyB;AACpD,QAAM,gBAAgB,oBAAI,IAAyB;AACnD,aAAW,OAAO,gBAAgB;AAChC,QAAI,CAAC,eAAe,IAAI,IAAI,IAAI,EAAG;AACnC,UAAM,SAAS,IAAI,YAAY,IAAI,UAAU,SAAS,CAAC;AACvD,QAAI,CAAC,OAAQ;AACb,UAAM,KAAK,GAAG,OAAO,IAAI,IAAI,OAAO,EAAE;AACtC,UAAM,WAAW,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE;AACtC,QAAI,OAAO,cAAc,IAAI,EAAE;AAC/B,QAAI,CAAC,MAAM;AACT,aAAO,oBAAI,IAAI;AACf,oBAAc,IAAI,IAAI,IAAI;AAAA,IAC5B;AACA,QAAI,KAAK,IAAI,QAAQ,EAAG;AACxB,SAAK,IAAI,QAAQ;AACjB,QAAI,MAAM,eAAe,IAAI,EAAE;AAC/B,QAAI,CAAC,KAAK;AACR,YAAM,CAAC;AACP,qBAAe,IAAI,IAAI,GAAG;AAAA,IAC5B;AACA,QAAI,KAAK,EAAE,MAAM,IAAI,MAAqB,IAAI,IAAI,GAAG,CAAC;AAAA,EACxD;AAEA,WAAS,iBACP,MACA,IACA,MACsB;AACtB,UAAM,WAAW,eAAe,IAAI,GAAG,IAAI,IAAI,EAAE,EAAE;AACnD,QAAI,CAAC,YAAY,SAAS,WAAW,EAAG,QAAO;AAC/C,WAAO,EAAE,GAAI,QAAQ,CAAC,GAAI,SAAS;AAAA,EACrC;AAGA,QAAM,SACJ,YAAY,UAAU,SAClB,aAAa,IAAI,UAAU,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAC7C,CAAC;AAEP,QAAM,mBAAmB,oBAAI,IAAY;AACzC,aAAW,SAAS,QAAQ;AAC1B,UAAM,WAAgB,YAAM,QAAQ,MAAM,IAAI;AAC9C,UAAM,gBAAgB,GAAG,QAAQ,IAAI,iBAAiB,IAAI;AAC1D,UAAM,eAAe,UAAU,eAAe,MAAM;AACpD,UAAM,WAAW,UAAU,MAAM,MAAM,MAAM;AAE7C,UAAM,MAAM,gBAAgB;AAC5B,UAAM,UAAU,eAAe,gBAAgB,MAAM;AAErD,QAAI,aAAc,kBAAiB,IAAI,aAAa;AACpD,qBAAiB,IAAI,MAAM,IAAI;AAE/B,QAAI,gBAAgB,UAAU;AAC5B,kBAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,kCAAkC,aAAa,QAAQ,MAAM,IAAI,KAAK,aAAa;AAAA,QAC5F,MAAM,MAAM;AAAA,QACZ,MAAM,SAAS,IAAI;AAAA,QACnB,MAAM,0BAA0B,MAAM,IAAI,cAAc,aAAa;AAAA,MACvE,CAAC;AAAA,IACH;AAEA,QAAI,OAAO,IAAI,OAAO,MAAO;AAC7B,UAAM,cAAc,OAAO,OAAO,IAAI,OAAO,WAAW,IAAI,KAAK,MAAM;AACvE,UAAM,OAAO,MAAM,oBAAoB,GAAG,IAAI;AAC9C,aAAS,IAAI,EAAE,MAAM,SAAS,MAAM,MAAM,MAAM,MAAM,YAAY,CAAC;AACnE,UAAM,OAAa;AAAA,MACjB,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,KAAK,EAAE,MAAM,SAAS,MAAM,KAAK,IAAI,KAAK;AAAA,MAC1C,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,IACzB;AACA,aAAS,IAAI,IAAI;AAAA,EACnB;AAGA,aAAW,MAAM,IAAI,WAAW;AAC9B,UAAM,MAAM,UAAU,GAAG,KAAK,aAAa,MAAM;AACjD,QAAI,CAAC,OAAO,OAAO,IAAI,OAAO,SAAU;AACxC,QAAI,iBAAiB,IAAI,GAAG,KAAK,WAAW,EAAG;AAC/C,UAAM,OAAO,oBAAoB,GAAG;AACpC,aAAS,IAAI;AAAA,MACX,MAAM;AAAA,MACN,IAAI,IAAI;AAAA,MACR,KAAK,EAAE,MAAM,GAAG,KAAK,aAAa,MAAM,IAAI,IAAI,KAAK;AAAA,MACrD,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,IACzB,CAAC;AAAA,EACH;AAGA,QAAM,cACJ,OAAO,YAAY,aAAa,WAAW,YAAY,WAAW;AACpE,QAAM,0BAA0B,oBAAI,IAAY;AAChD,QAAM,0BAA0B,oBAAI,IAGlC;AACF,QAAM,4BAA4B,oBAAI,IAAoB;AAC1D,QAAM,wBAAwB,oBAAI,IAAY;AAE9C,MAAI,aAAa;AACf,UAAM,KAAK,aAAa,cAAc,KAAK;AAC3C,eAAW,MAAM,IAAI,WAAW;AAC9B,UAAI,CAAC,GAAG,KAAK,GAAG,KAAK,WAAW,EAAG;AACnC,YAAM,MAAM,kBAAkB,GAAG,KAAK,aAAa,WAAW;AAC9D,UAAI,CAAC,IAAK;AACV,8BAAwB,IAAI,GAAG;AAC/B,YAAM,cACC,YAAM,SAAS,GAAG,KAAK,WAAW,MAAM,iBAAiB;AAChE,UAAI,YAAa,2BAA0B,IAAI,KAAK,GAAG,KAAK,WAAW;AACvE,YAAM,MAAM,UAAU,GAAG,KAAK,aAAa,SAAS;AACpD,UAAI,KAAK;AACP,YAAI,IAAI,OAAO,MAAO,uBAAsB,IAAI,GAAG;AAAA,aAC9C;AACH,cAAI,MAAM,wBAAwB,IAAI,GAAG;AACzC,cAAI,CAAC,KAAK;AACR,kBAAM,CAAC;AACP,oCAAwB,IAAI,KAAK,GAAG;AAAA,UACtC;AACA,cAAI,KAAK,EAAE,MAAM,GAAG,KAAK,aAAa,IAAI,CAAC;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AACA,eAAW,OAAO,yBAAyB;AACzC,UAAI,sBAAsB,IAAI,GAAG,EAAG;AACpC,YAAM,aAAa,wBAAwB,IAAI,GAAG,KAAK,CAAC;AACxD,YAAM,gBAAgB,0BAA0B,IAAI,GAAG;AACvD,YAAM,iBAAiB,gBACnB,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,aAAa,IAC/C;AAEJ,UAAI;AACJ,UAAI,gBAAgB;AAClB,cAAM,eAAe;AACrB,mBAAW,SAAS,YAAY;AAC9B,cAAI,MAAM,SAAS,eAAe,KAAM;AACxC,sBAAY,KAAK;AAAA,YACf,MAAM;AAAA,YACN,UAAU;AAAA,YACV,SAAS,qCAAqC,eAAe,IAAI,QAAQ,MAAM,IAAI,KAAK,eAAe,IAAI;AAAA,YAC3G,MAAM,MAAM;AAAA,YACZ,MAAM,MAAM,IAAI,IAAI;AAAA,YACpB,MAAM,0BAA0B,MAAM,IAAI,cAAc,eAAe,IAAI;AAAA,UAC7E,CAAC;AAAA,QACH;AAAA,MACF,WAAW,WAAW,SAAS,GAAG;AAChC,cAAM,WAAW,CAAC,EAAE;AAAA,MACtB;AAEA,YAAM,KACJ,OAAO,OAAO,IAAI,OAAO,WAAW,IAAI,KAAU,YAAM,SAAS,GAAG;AACtE,YAAM,OAAO,MAAM,oBAAoB,GAAG,IAAI;AAC9C,YAAM,UAAmB;AAAA,QACvB,MAAM;AAAA,QACN;AAAA,QACA,KAAK,MAAM,EAAE,MAAM,IAAI,IAAI,MAAM,MAAM,IAAI,IAAI,KAAK,IAAI,EAAE,MAAM,IAAI;AAAA,QACpE,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,MACzB;AACA,eAAS,IAAI,OAAO;AAAA,IACtB;AAAA,EACF;AAGA,aAAW,MAAM,IAAI,WAAW;AAC9B,UAAM,MAAM,UAAU,GAAG,KAAK,aAAa,SAAS;AACpD,QAAI,CAAC,OAAO,OAAO,IAAI,OAAO,SAAU;AACxC,QAAI,aAAa;AACf,YAAM,MAAM,kBAAkB,GAAG,KAAK,aAAa,WAAW;AAC9D,UAAI,OAAO,wBAAwB,IAAI,GAAG,EAAG;AAAA,IAC/C;AACA,UAAM,OAAO,oBAAoB,GAAG;AACpC,aAAS,IAAI;AAAA,MACX,MAAM;AAAA,MACN,IAAI,IAAI;AAAA,MACR,KAAK,EAAE,MAAM,GAAG,KAAK,aAAa,MAAM,IAAI,IAAI,KAAK;AAAA,MACrD,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,IACzB,CAAC;AAAA,EACH;AAGA,QAAM,kBAAkB,oBAAI,IAA0B;AACtD,aAAW,KAAK,gBAAgB;AAC9B,QAAI,EAAE,SAAS,SAAU;AACzB,UAAM,OAAO,gBAAgB,IAAI,EAAE,IAAI,KAAK,CAAC;AAC7C,SAAK,KAAK,CAAC;AACX,oBAAgB,IAAI,EAAE,MAAM,IAAI;AAAA,EAClC;AACA,QAAM,cAAc,oBAAI,IAAY;AAAA,IAClC,GAAG,gBAAgB,KAAK;AAAA,IACxB,GAAG,CAAC,GAAG,cAAc,QAAQ,CAAC,EAC3B,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,EACzC,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI;AAAA,EACzB,CAAC;AACD,aAAW,QAAQ,aAAa;AAC9B,UAAM,iBAAiB,gBAAgB,IAAI,IAAI,KAAK,CAAC;AACrD,UAAM,MAAM,UAAU,MAAM,QAAQ;AACpC,QAAI,OAAO,OAAO,IAAI,OAAO,UAAU;AACrC,YAAM,WAAW,IAAI;AACrB,YAAM,SAAS,eAAe,IAAI,CAAC,MAAM,EAAE,EAAE;AAC7C,UAAI,eAAe,WAAW,GAAG;AAC/B,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,WAAW,QAAQ,+DAA+D,QAAQ;AAAA,UACnG;AAAA,UACA,MAAM,IAAI,IAAI;AAAA,UACd,QAAQ,EAAE,MAAM,UAAU,IAAI,SAAS;AAAA,UACvC,MAAM,iCAAiC,QAAQ;AAAA,QACjD,CAAC;AACD;AAAA,MACF;AACA,UAAI,CAAC,OAAO,SAAS,QAAQ,GAAG;AAC9B,cAAM,UAAU,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI;AACrD,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,yBAAyB,IAAI,sBAAsB,QAAQ,6CAA6C,OAAO;AAAA,UACxH;AAAA,UACA,MAAM,IAAI,IAAI;AAAA,UACd,QAAQ,EAAE,MAAM,UAAU,IAAI,SAAS;AAAA,UACvC,MAAM;AAAA,QACR,CAAC;AACD;AAAA,MACF;AACA,YAAM,QAAQ,eAAe,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ;AAC1D,YAAM,OAAO;AAAA,QACX;AAAA,QACA;AAAA,QACA,oBAAoB,GAAG;AAAA,MACzB;AACA,YAAM,SAAiB;AAAA,QACrB,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,KAAK,EAAE,MAAM,MAAM,MAAM,KAAK;AAAA,QAC9B,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,MACzB;AACA,eAAS,IAAI,MAAM;AAAA,IACrB,OAAO;AACL,iBAAW,KAAK,gBAAgB;AAC9B,cAAM,OAAO,iBAAiB,UAAU,EAAE,EAAE;AAC5C,cAAM,SAAiB;AAAA,UACrB,MAAM;AAAA,UACN,IAAI,EAAE;AAAA,UACN,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,KAAK;AAAA,UAClC,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,QACzB;AACA,iBAAS,IAAI,MAAM;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAMA,MAAI,YAAY,YAAY,aAAa;AACvC,eAAW,MAAM,IAAI,WAAW;AAC9B,iBAAW,MAAM,GAAG,aAAa,CAAC,GAAG;AACnC,cAAM,KAAK,GAAG;AACd,YAAI,CAAC,SAAS,IAAI,UAAU,EAAE,GAAG;AAC/B,gBAAM,OAAO,iBAAiB,UAAU,EAAE;AAC1C,gBAAM,SAAiB;AAAA,YACrB,MAAM;AAAA,YACN;AAAA,YACA,KAAK,EAAE,MAAM,GAAG,KAAK,aAAa,MAAM,GAAG,KAAK;AAAA,YAChD,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,UACzB;AACA,mBAAS,IAAI,MAAM;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,aAAW,KAAK,eAAe,OAAO,CAAC,MAAM,EAAE,SAAS,QAAQ,GAAG;AACjE,UAAM,OAAO,iBAAiB,UAAU,EAAE,EAAE;AAC5C,UAAM,SAAiB;AAAA,MACrB,MAAM;AAAA,MACN,IAAI,EAAE;AAAA,MACN,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,KAAK;AAAA,MAClC,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,IACzB;AACA,aAAS,IAAI,MAAM;AAAA,EACrB;AACA,aAAW,MAAM,IAAI,WAAW;AAC9B,UAAM,MAAM,UAAU,GAAG,KAAK,aAAa,QAAQ;AACnD,QAAI,CAAC,IAAK;AACV,QAAI,IAAI,OAAO,MAAO;AACtB,QAAI,OAAO,IAAI,OAAO,YAAY,CAAC,SAAS,IAAI,UAAU,IAAI,EAAE,GAAG;AACjE,YAAM,OAAO,oBAAoB,GAAG;AACpC,YAAM,SAAiB;AAAA,QACrB,MAAM;AAAA,QACN,IAAI,IAAI;AAAA,QACR,KAAK,EAAE,MAAM,GAAG,KAAK,aAAa,MAAM,IAAI,IAAI,KAAK;AAAA,QACrD,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,MACzB;AACA,eAAS,IAAI,MAAM;AAAA,IACrB;AAAA,EACF;AAGA,QAAM,uBAAuB,YAAY;AACzC,aAAW,MAAM,IAAI,WAAW;AAC9B,UAAM,OAAO,GAAG,KAAK;AACrB,UAAM,MAAM,UAAU,MAAM,WAAW;AACvC,QAAI,OAAO,IAAI,OAAO,MAAO;AAC7B,QAAI,OAAO,OAAO,IAAI,OAAO,UAAU;AACrC,YAAM,OAAO;AAAA,QACX;AAAA,QACA,IAAI;AAAA,QACJ,oBAAoB,GAAG;AAAA,MACzB;AACA,YAAM,QAAQ,aAAa,IAAI;AAC/B,YAAM,YAAuB;AAAA,QAC3B,MAAM;AAAA,QACN,IAAI,IAAI;AAAA,QACR,KAAK,EAAE,MAAM,MAAM,IAAI,IAAI,KAAK;AAAA,QAChC,GAAI,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;AAAA,QACnC,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,MACzB;AACA,eAAS,IAAI,SAAS;AACtB;AAAA,IACF;AACA,UAAM,gBAAgB,eAAe;AAAA,MACnC,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,SAAS;AAAA,IAC9C;AACA,QAAI,cAAc,SAAS,GAAG;AAC5B,iBAAWC,MAAK,eAAe;AAC7B,cAAM,OAAO,iBAAiB,aAAaA,GAAE,EAAE;AAC/C,cAAM,WAAW,aAAaA,GAAE,IAAI;AACpC,cAAM,YAAuB;AAAA,UAC3B,MAAM;AAAA,UACN,IAAIA,GAAE;AAAA,UACN,KAAK,EAAE,MAAMA,GAAE,MAAM,MAAMA,GAAE,KAAK;AAAA,UAClC,GAAI,WAAW,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;AAAA,UACzC,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,QACzB;AACA,iBAAS,IAAI,SAAS;AAAA,MACxB;AACA;AAAA,IACF;AACA,QAAI,wBAAwB,eAAe,MAAM,oBAAoB,GAAG;AACtE,YAAM,OAAO,MAAM,SAAS,IAAI,CAAC;AACjC,UAAI,CAAC,KAAM;AACX,YAAM,YAAY,aAAa,IAAI;AACnC,YAAM,OAAO,iBAAiB,aAAa,IAAI;AAC/C,YAAM,YAAuB;AAAA,QAC3B,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,KAAK,EAAE,KAAK;AAAA,QACZ,GAAI,YAAY,EAAE,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;AAAA,QAC3C,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,MACzB;AACA,eAAS,IAAI,SAAS;AAAA,IACxB;AAAA,EACF;AAGA,aAAW,KAAK,eAAe,OAAO,CAAC,MAAM,EAAE,SAAS,SAAS,GAAG;AAClE,UAAM,UAAwB;AAAA,MAC5B,MAAM;AAAA,MACN,IAAI,EAAE;AAAA,MACN,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,KAAK;AAAA,IACpC;AACA,aAAS,IAAI,OAAO;AAAA,EACtB;AAGA,MAAI,IAAI,aAAa,YAAY,OAAO;AACtC,eAAW,MAAM,IAAI,WAAW;AAC9B,YAAM,iBAAiB,GAAG,YAAY,CAAC,GAAG;AAAA,QACxC,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,YAAY;AAAA,MAC5C;AACA,UAAI,cAAe;AACnB,YAAM,cAAc,GAAG,YAAY,CAAC,GAAG;AAAA,QACrC,CAAC,MAAM,EAAE,SAAS,UAAU,OAAO,EAAE,OAAO;AAAA,MAC9C;AACA,YAAM,UAAU,eAAe,EAAE;AACjC,UACE,cACA,OAAO,WAAW,OAAO,YACzB,QAAQ,WAAW,GACnB;AACA,cAAM,OAAO,QAAQ,CAAC;AACtB,cAAM,OAAa;AAAA,UACjB,MAAM;AAAA,UACN,IAAI,WAAW;AAAA,UACf,KAAK,KAAK;AAAA,UACV,SAAS,KAAK;AAAA,UACd,OAAO,KAAK;AAAA,QACd;AACA,iBAAS,IAAI,IAAI;AAAA,MACnB,OAAO;AACL,mBAAW,QAAQ,QAAS,UAAS,IAAI,IAAI;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAqB,CAAC;AAC5B,aAAW,QAAQ;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAY;AACV,aAAS,KAAK,GAAG,SAAS,KAAK,IAAI,CAAC;AAAA,EACtC;AAEA,SAAO,EAAE,UAAU,UAAU,QAAQ,YAAY;AACnD;AAEA,SAAS,kBACP,aACA,aACe;AAEf,QAAM,QAAQ,YAAY,MAAM,GAAG;AACnC,QAAM,UAAU,MAAM,QAAQ,GAAG;AACjC,MAAI,YAAY,GAAI,QAAO;AAC3B,QAAM,cAAc,MAAM,MAAM,GAAG,OAAO;AAC1C,QAAM,YAAY,YAAY,MAAM,GAAG;AACvC,WAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AAC3C,QAAI,UAAU,CAAC,MAAM,YAAY,CAAC,EAAG,QAAO;AAAA,EAC9C;AACA,MAAI,UAAU,UAAU,QAAS,QAAO;AACxC,SAAO,UAAU,MAAM,GAAG,UAAU,CAAC,EAAE,KAAK,GAAG;AACjD;AAEA,SAAS,aAAa,aAAoC;AACxD,QAAM,QAAQ,YAAY,MAAM,GAAG;AACnC,QAAM,aAAa,MAAM,QAAQ,UAAU;AAC3C,MAAI,eAAe,MAAM,MAAM,aAAa,CAAC,GAAG;AAC9C,WAAO,WAAW,MAAM,aAAa,CAAC,CAAC;AAAA,EACzC;AACA,QAAM,WAAW,MAAM,QAAQ,OAAO;AACtC,MAAI,aAAa,MAAM,MAAM,WAAW,CAAC,GAAG;AAC1C,WAAO,QAAQ,MAAM,WAAW,CAAC,CAAC;AAAA,EACpC;AACA,SAAO;AACT;AAIA,SAAS,eAAe,IAA2B;AACjD,UAAQ,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,UAAU;AAAA,IACrC,MAAM;AAAA,IACN,IAAI,MAAM,KAAK,KAAK;AAAA,IACpB,KAAK,EAAE,MAAM,GAAG,KAAK,aAAa,MAAM,KAAK,KAAK;AAAA,IAClD,SAAS,OAAO,KAAK,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAAA,IAC3C,OAAO,KAAK,MACT,OAAO,CAAC,MAAM,EAAE,MAAM,EACtB,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,QAAQ,EAAE,OAAO,EAAE;AAAA,EACtD,EAAE;AACJ;AAEA,SAAS,OAAU,KAAe;AAChC,SAAO,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC;AAChC;;;AI7kBA,YAAYC,WAAU;AA+Bf,SAAS,MAAM,MAAkC;AACtD,QAAM,cAA4B,CAAC;AACnC,QAAM,EAAE,UAAU,WAAW,OAAO,OAAO,IAAI;AAC/C,QAAM,QAAQ,KAAK,SAAS;AAC5B,QAAM,OAAO,KAAK,QAAQ;AAC1B,QAAM,oBAAoB,OAAO,OAAO,cAAc;AACtD,QAAM,mBAAmB,OAAO,OAAO,aAAa;AACpD,QAAM,kBAAkB,OAAO,OAAO,YAAY;AAKlD,MAAI,KAAK,mBAAoB,aAAY,KAAK,GAAG,KAAK,kBAAkB;AAKxE,aAAW,MAAM,WAAW;AAC1B,QAAI,GAAG,YAAa,aAAY,KAAK,GAAG,GAAG,WAAW;AAAA,EACxD;AACA,aAAW,MAAM,KAAK,iBAAiB,CAAC,GAAG;AACzC,QAAI,GAAG,YAAa,aAAY,KAAK,GAAG,GAAG,WAAW;AAAA,EACxD;AAGA,MAAI,SAAS,KAAK,cAAc,QAAW;AACzC,UAAM,SAAS,KAAK,cAAc,OAAO;AACzC,UAAM,QAAQ,kBAAkB,KAAK,SAAS;AAC9C,QAAI,KAAK,mBAAmB,QAAQ,KAAK,mBAAmB,QAAW;AACrE,kBAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,mBAAmB,MAAM;AAAA,QAClC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAAA,IACH,OAAO;AACL,YAAM,WAAW,kBAAkB,KAAK,cAAc;AACtD,UAAI,aAAa,OAAO;AACtB,cAAM,UAAU,aAAa,UAAU,KAAK,WAAW,QAAQ;AAC/D,cAAMC,WAAU,qBAAqB,OAAO;AAC5C,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,mBAAmB,MAAM,aAAaA,WAAU,KAAKA,QAAO,KAAK,EAAE;AAAA,UAC5E,MAAM;AAAA,UACN,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,MAAI,QAAQ,mBAAmB;AAC7B,eAAW,QAAQ,CAAC,UAAU,WAAW,MAAM,GAAY;AACzD,iBAAW,KAAK,SAAS,KAAK,IAAI,GAAG;AACnC,cAAM,WAAW,EAAE,MAAM,cAAc,CAAC;AACxC,YAAI,SAAS,WAAW,GAAG;AACzB,cAAI,SAAS,UAAU;AACrB,wBAAY,KAAK;AAAA,cACf,MAAM;AAAA,cACN,UAAU;AAAA,cACV,SAAS,WAAW,EAAE,EAAE,uEAAuE,EAAE,EAAE;AAAA,cACnG,MAAM,EAAE,KAAK;AAAA,cACb,MAAM,EAAE,KAAK;AAAA,cACb,QAAQ,EAAE,MAAM,IAAI,EAAE,GAAG;AAAA,cACzB,MAAM,6DAA6D,EAAE,EAAE;AAAA,YACzE,CAAC;AAAA,UACH;AACA;AAAA,QACF;AACA,cAAM,UAAW,EAAE,MAAM,SAAS,CAAC;AACnC,YAAI,QAAQ,WAAW,GAAG;AACxB,gBAAM,OACJ,SAAS,WACL,yBAAyB,EAAE,EAAE,KAC7B,mDAAmD,IAAI,KAAK,EAAE,EAAE;AACtE,qBAAW,KAAK,UAAU;AACxB,wBAAY,KAAK;AAAA,cACf,MAAM;AAAA,cACN,UAAU;AAAA,cACV,SAAS,GAAG,IAAI,KAAK,EAAE,EAAE,wDAAwD,CAAC;AAAA,cAClF,MAAM,EAAE,KAAK;AAAA,cACb,MAAM,EAAE,KAAK;AAAA,cACb,QAAQ,EAAE,MAAM,IAAI,EAAE,GAAG;AAAA,cACzB;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,MAAM;AACR,UAAM,eAAe,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC;AAC5D,eAAW,MAAM,WAAW;AAC1B,UAAI,CAAC,GAAG,SAAU;AAClB,iBAAW,KAAK,GAAG,UAAU;AAC3B,YAAI,EAAE,SAAS,UAAU,EAAE,SAAS,UAAW;AAC/C,YAAI,OAAO,EAAE,OAAO,SAAU;AAC9B,cAAM,WAAW,GAAG,KAAK;AACzB,cAAM,gBAAgB,iBAAiB,EAAE,IAAI;AAC7C,YAAS,YAAM,SAAS,QAAQ,MAAM,cAAe;AACrD,cAAM,MAAW,YAAM,QAAQ,QAAQ;AACvC,cAAM,gBACJ,QAAQ,MAAM,gBAAgB,GAAG,GAAG,IAAI,aAAa;AACvD,YAAI,aAAa,IAAI,aAAa,EAAG;AACrC,cAAM,YAAY,EAAE,SAAS,SAAS,SAAS;AAC/C,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,GAAG,SAAS,KAAK,EAAE,EAAE,uBAAuB,QAAQ,YAAY,aAAa;AAAA,UACtF,MAAM;AAAA,UACN,MAAM,EAAE,IAAI;AAAA,UACZ,QAAQ,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,GAAG;AAAA,UACjC,MAAM,4CAA4C,aAAa,uBAAuB,QAAQ;AAAA,QAChG,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAMA,MAAI,MAAM;AACR,eAAW,MAAM,WAAW;AAC1B,iBAAW,QAAQ,GAAG,gBAAgB,CAAC,GAAG;AACxC,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,KAAK,KAAK,QAAQ,yEAAoE,KAAK,IAAI;AAAA,UACxG,MAAM,GAAG,KAAK;AAAA,UACd,MAAM,KAAK;AAAA,UACX,MAAM,gBAAgB,KAAK,IAAI;AAAA,QACjC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAQA,MAAI,MAAM;AACR,UAAM,iBAAiB,IAAI,IAAI,SAAS,KAAK,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AACxE,eAAW,MAAM,WAAW;AAC1B,iBAAW,QAAQ,GAAG,0BAA0B,CAAC,GAAG;AAClD,YAAI,KAAK,WAAW;AAGlB,sBAAY,KAAK;AAAA,YACf,MAAM;AAAA,YACN,UAAU;AAAA,YACV,SAAS,gBAAgB,KAAK,GAAG;AAAA,YACjC,MAAM,GAAG,KAAK;AAAA,YACd,MAAM,KAAK;AAAA,YACX,MAAM;AAAA,UACR,CAAC;AAAA,QACH,OAAO;AACL,gBAAM,KAAK,gBAAgB,MAAM,cAAc;AAC/C,yBAAe,IAAI,EAAE;AACrB,sBAAY,KAAK;AAAA,YACf,MAAM;AAAA,YACN,UAAU;AAAA,YACV,SAAS,gBAAgB,KAAK,GAAG;AAAA,YACjC,MAAM,GAAG,KAAK;AAAA,YACd,MAAM,KAAK;AAAA,YACX,MAAM,qBAAqB,EAAE;AAAA,YAC7B,KAAK;AAAA,cACH,aAAa,mBAAmB,EAAE,SAAS,KAAK,GAAG;AAAA,cACnD,OAAO;AAAA,gBACL;AAAA,kBACE,MAAM,GAAG,KAAK;AAAA,kBACd,OAAO,KAAK;AAAA,kBACZ,KAAK,KAAK;AAAA,kBACV,aAAa,gBAAgB,EAAE;AAAA,gBACjC;AAAA,cACF;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAMA,MAAI,QAAQ,kBAAkB;AAC5B,UAAM,aAAa,SAAS,KAAK,WAAW;AAC5C,UAAM,SAAS,oBAAI,IAAyC;AAC5D,eAAWC,MAAK,WAAY,QAAO,IAAIA,GAAE,IAAIA,EAAC;AAG9C,UAAM,mBAAmB,oBAAI,IAAiC;AAC9D,eAAW,MAAM,WAAW;AAC1B,UAAI,CAAC,GAAG,SAAU;AAClB,iBAAW,KAAK,GAAG,UAAU;AAC3B,YAAI,EAAE,YAAY,EAAE,SAAS,SAAS,GAAG;AACvC,2BAAiB,IAAI,GAAG,KAAK,aAAa,IAAI,IAAI,EAAE,QAAQ,CAAC;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AAEA,eAAW,MAAM,WAAW;AAC1B,YAAM,cAAc,GAAG,KAAK;AAC5B,iBAAW,OAAO,GAAG,WAAW,CAAC,GAAG;AAClC,YAAI,IAAI,WAAY;AACpB,cAAMC,YAAW,IAAI,UAAU,MAAM,GAAG,EAAE,IAAI,KAAK;AACnD,cAAM,YAAY,OAAO;AAAA,UACvBA,UACG,QAAQ,8BAA8B,EAAE,EACxC,QAAQ,sBAAsB,OAAO,EACrC,YAAY;AAAA,QACjB;AACA,YAAI,CAAC,UAAW;AAChB,cAAM,QAAQ,UAAU,SAAS,CAAC;AAClC,YAAI,CAAC,MAAO;AACZ,cAAM,CAAC,MAAM,EAAE,IAAI,MAAM,MAAM,GAAG;AAClC,cAAM,mBAAmB,YAAY,MAAM,GAAG;AAG9C,YACE,iBAAiB,SAAS,EAAE,KAC5B,iBAAiB,SAAS,OAAO,GAAG,GACpC;AACA;AAAA,QACF;AAKA,YAAI,SAAS,aAAa,iBAAiB,SAAS,EAAE,EAAG;AAIzD,YAAI,SAAS,aAAa,iBAAiB,IAAI,WAAW,GAAG,IAAI,EAAE,GAAG;AACpE;AAAA,QACF;AAEA,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,cAAc,UAAU,EAAE,kBAAkB,KAAK,yBAAyB,WAAW;AAAA,UAC9F,MAAM;AAAA,UACN,MAAM,IAAI;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,MAAI,QAAQ,iBAAiB;AAG3B,UAAM,aAAa,oBAAI,IAAiC;AACxD,eAAW,MAAM,KAAK,iBAAiB,CAAC,GAAG;AACzC,iBAAW,QAAQ,GAAG,SAAS,CAAC,GAAG;AACjC,cAAM,QAAQ,oBAAI,IAAoB;AACtC,mBAAW,QAAQ,KAAK,OAAO;AAC7B,cAAI,CAAC,MAAM,IAAI,KAAK,EAAE,EAAG,OAAM,IAAI,KAAK,IAAI,KAAK,IAAI;AAAA,QACvD;AACA,mBAAW,IAAI,GAAG,GAAG,KAAK,WAAW,IAAI,KAAK,IAAI,IAAI,KAAK;AAAA,MAC7D;AAAA,IACF;AAEA,eAAW,QAAQ,SAAS,KAAK,MAAM,GAAG;AACxC,YAAM,YAAY,WAAW,IAAI,GAAG,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE;AACpE,iBAAW,aAAa,KAAK,SAAS;AACpC,cAAM,QACJ,SAAS,IAAI,WAAW,SAAS,KACjC,SAAS,IAAI,UAAU,SAAS,KAChC,SAAS,IAAI,UAAU,SAAS,KAChC,SAAS,aAAa,WAAW,SAAS,KAC1C,SAAS,aAAa,UAAU,SAAS,KACzC,SAAS,aAAa,UAAU,SAAS;AAC3C,YAAI,CAAC,OAAO;AACV,sBAAY,KAAK;AAAA,YACf,MAAM;AAAA,YACN,UAAU;AAAA,YACV,SAAS,SAAS,KAAK,EAAE,gCAAgC,SAAS;AAAA,YAClE,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA,YAGf,MAAM,WAAW,IAAI,SAAS,KAAK,KAAK,IAAI;AAAA,UAC9C,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAOA,MAAI,MAAM;AACR,UAAM,cAAc,oBAAI,IAAmD;AAC3E,eAAW,MAAM,WAAW;AAC1B,iBAAW,KAAK,GAAG,aAAa;AAC9B,YACE,EAAE,SAAS,aACX,EAAE,SAAS,YACX,EAAE,SAAS,YACX,EAAE,SAAS,aACX;AACA;AAAA,QACF;AACA,cAAM,MAAM,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE;AAC7B,YAAI,OAAO,YAAY,IAAI,GAAG;AAC9B,YAAI,CAAC,MAAM;AACT,iBAAO,CAAC;AACR,sBAAY,IAAI,KAAK,IAAI;AAAA,QAC3B;AACA,aAAK,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,KAAK,CAAC;AAAA,MAC1C;AAAA,IACF;AACA,eAAW,CAAC,KAAK,IAAI,KAAK,aAAa;AACrC,YAAM,YAAY,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AACjD,UAAI,UAAU,OAAO,EAAG;AACxB,YAAM,CAAC,MAAM,EAAE,IAAI,IAAI,MAAM,QAAQ;AACrC,YAAM,SAAS,KACZ,MAAM,CAAC,EACP,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,EAChC,KAAK,IAAI;AACZ,kBAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,UACE,SAAS,YAAY,SAAS,cAAc,YAAY;AAAA,QAC1D,SAAS,GAAG,IAAI,QAAQ,EAAE,oBAAoB,UAAU,IAAI,mBAAmB,MAAM;AAAA,QACrF,MAAM,KAAK,CAAC,EAAE;AAAA,QACd,MAAM,KAAK,CAAC,EAAE;AAAA,QACd,QAAQ,EAAE,MAAyB,GAAG;AAAA,QACtC,MACE,SAAS,aAAa,SAAS,WAC3B,uIACA;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAKA,MAAI,QAAQ,iBAAiB;AAC3B,eAAW,MAAM,KAAK,iBAAiB,CAAC,GAAG;AACzC,iBAAW,QAAQ,GAAG,SAAS,CAAC,GAAG;AACjC,mBAAW,OAAO,KAAK,gBAAgB,CAAC,GAAG;AACzC,sBAAY,KAAK;AAAA,YACf,MAAM;AAAA,YACN,UAAU;AAAA,YACV,SAAS,mCAA8B,KAAK,KAAK;AAAA,YACjD,MAAM,GAAG,KAAK;AAAA,YACd,MAAM,IAAI;AAAA,YACV,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAMA,MAAI,QAAQ,iBAAiB;AAC3B,eAAW,MAAM,WAAW;AAC1B,UAAI,CAAC,GAAG,SAAU;AAClB,iBAAW,KAAK,GAAG,UAAU;AAC3B,cAAMC,SAAQ,CACZ,SACA,KACA,UACG;AACH,mBAAS,IAAI,GAAG,KAAK,KAAK,UAAU,IAAI,KAAK;AAC3C,kBAAM,QAAQ,IAAK,CAAC;AACpB,kBAAM,QACJ,SAAS,IAAI,SAAS,KAAK,KAC3B,SAAS,aAAa,SAAS,KAAK;AACtC,gBAAI,MAAO;AACX,wBAAY,KAAK;AAAA,cACf,MAAM;AAAA,cACN,UAAU;AAAA,cACV,SAAS,6BAA6B,GAAG,KAAK,WAAW,uBAAuB,OAAO,KAAK,KAAK;AAAA,cACjG,MAAM,GAAG,KAAK;AAAA,cACd,MAAM,QAAQ,CAAC,IACX,aAAa,GAAG,KAAK,SAAS,MAAM,CAAC,EAAE,KAAK,IAC5C,EAAE,IAAI;AAAA,cACV,MAAM,MAAM,OAAO,aAAa,KAAK,0DAA0D,OAAO;AAAA,YACxG,CAAC;AAAA,UACH;AAAA,QACF;AACA,QAAAA,OAAM,WAAW,EAAE,UAAU,EAAE,YAAY;AAC3C,QAAAA,OAAM,UAAU,EAAE,SAAS,EAAE,WAAW;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU;AAAA,IACd,QAAQ,YAAY,OAAO,CAAC,MAAM,EAAE,aAAa,OAAO,EAAE;AAAA,IAC1D,UAAU,YAAY,OAAO,CAAC,MAAM,EAAE,aAAa,SAAS,EAAE;AAAA,EAChE;AAEA,SAAO,EAAE,aAAa,QAAQ;AAChC;AAEA,SAAS,aAAa,SAAiB,QAAwB;AAC7D,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,UAAU,IAAI,QAAQ,QAAQ,KAAK;AACrD,QAAI,QAAQ,CAAC,MAAM,KAAM;AAAA,EAC3B;AACA,SAAO;AACT;AAGA,IAAM,kBAA0C;AAAA,EAC9C,GAAG;AAAA,EACH,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AACZ;AAEA,SAAS,QAAQ,KAAqB;AACpC,SAAO,IACJ,QAAQ,sBAAsB,OAAO,EACrC,QAAQ,kBAAkB,GAAG,EAC7B,QAAQ,YAAY,EAAE,EACtB,YAAY;AACjB;AAGA,SAAS,gBAAgB,MAAsC;AAC7D,QAAM,WAAW,KAAK,WAAW,QAAQ,KAAK,QAAQ,IAAI;AAC1D,QAAM,SAAS,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AACvE,SAAO,UAAU,gBAAgB,KAAK,GAAG,KAAK,KAAK;AACrD;AAGA,SAAS,gBACP,MACA,MACQ;AACR,QAAM,OAAO,gBAAgB,IAAI;AACjC,MAAI,CAAC,KAAK,IAAI,IAAI,EAAG,QAAO;AAC5B,WAAS,IAAI,KAAK,KAAK;AACrB,UAAM,YAAY,GAAG,IAAI,IAAI,CAAC;AAC9B,QAAI,CAAC,KAAK,IAAI,SAAS,EAAG,QAAO;AAAA,EACnC;AACF;AAEA,SAAS,qBAAqB,GAAmB;AAC/C,SAAO,EAAE,QAAQ,SAAS,IAAI;AAChC;AASA,SAAS,kBAAkB,GAAmB;AAC5C,SAAO,qBAAqB,CAAC,EAAE;AAAA,IAC7B;AAAA,IACA;AAAA,EACF;AACF;AAQA,SAAS,qBAAqB,QAA8B;AAC1D,QAAM,QAAkB,CAAC;AACzB,QAAM,MAAM,CAAC,MAAc,UAAoB;AAC7C,QAAI,MAAM,WAAW,EAAG;AACxB,UAAM,UAAU,MAAM,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI;AAC3C,UAAM,SAAS,MAAM,SAAS,IAAI,MAAM,MAAM,SAAS,CAAC,WAAW;AACnE,UAAM,KAAK,GAAG,IAAI,KAAK,OAAO,GAAG,MAAM,EAAE;AAAA,EAC3C;AACA,MAAI,SAAS,OAAO,KAAK;AACzB,MAAI,WAAW,OAAO,OAAO;AAC7B,MAAI,YAAY,OAAO,QAAQ;AAC/B,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,aACP,UACA,WACA,UACc;AACd,QAAM,cAAc,qBAAqB,QAAQ;AACjD,QAAM,cAAc,qBAAqB,SAAS,KAAK,cAAc,QAAQ;AAE7E,QAAM,QAAkB,CAAC;AACzB,QAAM,UAAoB,CAAC;AAC3B,QAAM,WAAqB,CAAC;AAE5B,MAAI,CAAC,aAAa;AAChB,eAAW,KAAK,YAAa,OAAM,KAAK,SAAS,CAAC,CAAC;AACnD,WAAO,EAAE,OAAO,SAAS,SAAS;AAAA,EACpC;AAEA,QAAM,WAAW,oBAAI,IAAoB;AACzC,aAAW,KAAK,YAAa,UAAS,IAAI,UAAU,CAAC,IAAI,MAAM,EAAE,MAAM,CAAC;AACxE,QAAM,WAAW,oBAAI,IAAoB;AACzC,aAAW,KAAK,YAAa,UAAS,IAAI,UAAU,CAAC,IAAI,MAAM,EAAE,MAAM,CAAC;AAExE,aAAW,CAAC,GAAG,CAAC,KAAK,UAAU;AAC7B,UAAM,OAAO,SAAS,IAAI,CAAC;AAC3B,QAAI,CAAC,MAAM;AACT,YAAM,KAAK,SAAS,CAAC,CAAC;AAAA,IACxB,WAAW,gBAAgB,IAAI,MAAM,gBAAgB,CAAC,GAAG;AACvD,eAAS,KAAK,SAAS,CAAC,CAAC;AAAA,IAC3B;AAAA,EACF;AACA,aAAW,CAAC,GAAG,CAAC,KAAK,UAAU;AAC7B,QAAI,CAAC,SAAS,IAAI,CAAC,EAAG,SAAQ,KAAK,SAAS,CAAC,CAAC;AAAA,EAChD;AAEA,SAAO,EAAE,OAAO,SAAS,SAAS;AACpC;AAEA,SAAS,SAAS,GAAmB;AACnC,SAAO,GAAG,EAAE,IAAI,KAAK,UAAU,CAAC,CAAC;AACnC;AAEA,SAAS,cAAc,UAA8B;AACnD,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAMC,OAAgB,CAAC;AACvB,aAAW,KAAK,MAAO,CAAAA,KAAI,KAAK,GAAI,SAAS,KAAK,CAAC,CAAc;AACjE,SAAOA;AACT;AAEA,SAAS,qBAAqB,QAAiC;AAC7D,QAAM,SAAS;AACf,QAAM,MAAM,OAAO,QAAQ,MAAM;AACjC,MAAI,QAAQ,GAAI,QAAO;AACvB,QAAM,QAAQ,OAAO,QAAQ,KAAK,GAAG;AACrC,MAAI,UAAU,GAAI,QAAO;AACzB,MAAI,QAAQ;AACZ,MAAI,QAAuB;AAC3B,MAAI,UAAU;AACd,WAAS,IAAI,OAAO,IAAI,OAAO,QAAQ,KAAK;AAC1C,UAAM,IAAI,OAAO,CAAC;AAClB,QAAI,OAAO;AACT,UAAI,SAAS;AACX,kBAAU;AAAA,MACZ,WAAW,MAAM,MAAM;AACrB,kBAAU;AAAA,MACZ,WAAW,MAAM,OAAO;AACtB,gBAAQ;AAAA,MACV;AACA;AAAA,IACF;AACA,QAAI,MAAM,OAAO,MAAM,KAAK;AAC1B,cAAQ;AACR;AAAA,IACF;AACA,QAAI,MAAM,IAAK;AAAA,aACN,MAAM,KAAK;AAClB;AACA,UAAI,UAAU,GAAG;AACf,cAAM,OAAO,OAAO,MAAM,OAAO,IAAI,CAAC;AACtC,YAAI;AACF,iBAAO,KAAK,MAAM,IAAI;AAAA,QACxB,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAsB;AAC7C,MAAI,SAAS,UAAU;AACrB,WACE;AAAA,EAIJ;AACA,SACE;AAMJ;AAEA,SAAS,gBAAgB,OAAwB;AAC/C,SAAO,KAAK,UAAU,OAAO,cAAc;AAC7C;AAEA,SAAS,eAAe,MAAc,OAAyB;AAC7D,MAAI,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AAC/D,UAAM,SAAkC,CAAC;AACzC,eAAW,KAAK,OAAO,KAAK,KAAgC,EAAE,KAAK,GAAG;AACpE,aAAO,CAAC,IAAK,MAAkC,CAAC;AAAA,IAClD;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;ACnoBA,SAAS,SAAmC,KAAwB;AAClE,SAAO,CAAC,GAAG,GAAG,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC;AACzD;AAEA,SAAS,WAAW,OAAgB,SAAS,GAAW;AACtD,SAAO,KAAK,UAAU,OAAO,gBAAgB,MAAM;AACrD;AAEA,SAAS,eAAe,MAAc,OAAyB;AAC7D,MAAI,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AAC/D,UAAM,SAAkC,CAAC;AACzC,eAAW,KAAK,OAAO,KAAK,KAAgC,EAAE,KAAK,GAAG;AACpE,aAAO,CAAC,IAAK,MAAkC,CAAC;AAAA,IAClD;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,YAAY,MAAc,KAAuB;AACxD,MAAI,IAAI,WAAW,EAAG,QAAO,eAAe,IAAI;AAAA;AAChD,QAAM,SAAS,CAAC,GAAG,GAAG,EAAE,KAAK;AAC7B,QAAM,OAAO,OAAO,IAAI,CAAC,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC,EAAE,EAAE,KAAK,IAAI;AACtE,SAAO,eAAe,IAAI;AAAA,EAAO,IAAI;AAAA;AACvC;AAEO,SAAS,KAAK,MAA2B;AAC9C,QAAM,EAAE,UAAU,YAAY,cAAc,QAAQ,IAAI;AAExD,QAAM,SAAS,CAAC,GAAG,SAAS,KAAK,OAAO,CAAC,EAAE;AAAA,IAAK,CAAC,GAAG,MAClD,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,EAC7B;AACA,QAAM,QAAQ,SAAS,SAAS,KAAK,MAAM,CAAC;AAC5C,QAAM,WAAW,SAAS,SAAS,KAAK,SAAS,CAAC;AAClD,QAAM,UAAU,SAAS,SAAS,KAAK,QAAQ,CAAC;AAChD,QAAM,UAAU,SAAS,SAAS,KAAK,QAAQ,CAAC;AAChD,QAAM,WAAW,SAAS,SAAS,KAAK,SAAS,CAAC;AAClD,QAAM,aAAa,SAAS,SAAS,KAAK,WAAW,CAAC;AACtD,QAAM,QAAQ,SAAS,SAAS,KAAK,MAAM,CAAC;AAE5C,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,8DAA8D;AACzE,QAAM,KAAK,sBAAsB;AACjC,QAAM,KAAK,+BAA+B,KAAK,UAAU,WAAW,CAAC,EAAE;AACvE,QAAM;AAAA,IACJ,yCAAyC,KAAK,UAAU,WAAW,CAAC;AAAA,EACtE;AACA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,wBAAwB;AACnC,QAAM;AAAA,IACJ;AAAA,MACE;AAAA,MACA,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IACvB;AAAA,EACF;AACA,QAAM;AAAA,IACJ;AAAA,MACE;AAAA,MACA,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IAC1B;AAAA,EACF;AACA,QAAM;AAAA,IACJ;AAAA,MACE;AAAA,MACA,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IACzB;AAAA,EACF;AACA,QAAM;AAAA,IACJ;AAAA,MACE;AAAA,MACA,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IACzB;AAAA,EACF;AACA,QAAM;AAAA,IACJ;AAAA,MACE;AAAA,MACA,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IAC1B;AAAA,EACF;AACA,QAAM;AAAA,IACJ;AAAA,MACE;AAAA,MACA,WAAW,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IAC5B;AAAA,EACF;AACA,QAAM;AAAA,IACJ;AAAA,MACE;AAAA,MACA,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IACvB;AAAA,EACF;AACA,QAAM;AAAA,IACJ;AAAA,MACE;AAAA,MACA,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IAC1B;AAAA,EACF;AACA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,4CAA4C;AACvD,QAAM,KAAK,0BAA0B;AACrC,QAAM,KAAK,2BAA2B;AACtC,QAAM,KAAK,0BAA0B;AACrC,QAAM,KAAK,mBAAmB;AAC9B,QAAM,KAAK,qCAAqC;AAChD,QAAM,KAAK,mCAAmC;AAC9C,QAAM,KAAK,oCAAoC;AAC/C,QAAM,KAAK,0BAA0B;AACrC,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,8BAA8B;AACzC,QAAM,KAAK,gCAAgC;AAC3C,QAAM,KAAK,mBAAmB;AAC9B,QAAM,KAAK,qCAAqC;AAChD,QAAM,KAAK,oCAAoC;AAC/C,QAAM,KAAK,0BAA0B;AACrC,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,gCAAgC;AAC3C,QAAM,KAAK,4BAA4B;AACvC,QAAM,KAAK,mBAAmB;AAC9B,QAAM,KAAK,0BAA0B;AACrC,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,6BAA6B;AACxC,QAAM,KAAK,sBAAsB;AACjC,QAAM,KAAK,mBAAmB;AAC9B,QAAM,KAAK,oCAAoC;AAC/C,QAAM,KAAK,0BAA0B;AACrC,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,6BAA6B;AACxC,QAAM,KAAK,8BAA8B;AACzC,QAAM,KAAK,mBAAmB;AAC9B,QAAM,KAAK,0BAA0B;AACrC,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,2BAA2B;AACtC,QAAM,KAAK,kBAAkB;AAC7B,QAAM,KAAK,mBAAmB;AAC9B,QAAM,KAAK,0BAA0B;AACrC,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,8BAA8B;AACzC,QAAM,KAAK,mBAAmB;AAC9B,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,GAAG;AACd,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,uBAAuB;AAClC,QAAM,cAAwB;AAAA,IAC5B,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,QAAM;AAAA,IACJ,kDAAkD,WAAW,WAAW,CAAC;AAAA,EAC3E;AACA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,0BAA0B;AACrC,QAAM,KAAiB,cAAc,EAAE,QAAQ,MAAM,QAAQ,MAAM,IAAI,KAAK;AAC5E,QAAM,KAAK,6BAA6B,WAAW,EAAE,CAAC,WAAW;AACjE,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,+BAA+B;AAC1C,QAAM,KAAK,4DAA4D;AACvE,QAAM,KAAK,qDAAqD;AAChE,QAAM,KAAK,iBAAiB;AAC5B,QAAM,KAAK,GAAG;AACd,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,2CAA2C;AACtD,QAAM,KAAK,oCAAoC;AAC/C,QAAM,KAAK,2DAA2D;AACtE,QAAM,KAAK,EAAE;AACb,SAAO,MAAM,KAAK,IAAI;AACxB;;;ACrLA,SAAS,gBAAgB;AAQzB,SAAS,OAAO,MAAgB,KAA4B;AAC1D,MAAI;AACF,UAAMC,OAAM,SAAS,OAAO,KAAK,KAAK,GAAG,CAAC,IAAI;AAAA,MAC5C;AAAA,MACA,OAAO,CAAC,UAAU,QAAQ,QAAQ;AAAA,MAClC,UAAU;AAAA,IACZ,CAAC;AACD,WAAOA,KAAI,KAAK,KAAK;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,kBAAkB,OAA0B,CAAC,GAAe;AAC1E,QAAM,MAAM,KAAK,OAAO,QAAQ,IAAI;AACpC,QAAM,MAAM,KAAK,OAAO,QAAQ;AAEhC,QAAM,SACJ,IAAI,mBACJ,IAAI,mBACJ,IAAI,oBACJ,IAAI,sBACJ,IAAI,oBACJ,OAAO,CAAC,aAAa,gBAAgB,MAAM,GAAG,GAAG,KACjD;AAEF,QAAM,SACJ,IAAI,cACJ,IAAI,oBACJ,IAAI,iBACJ,IAAI,oBACJ,OAAO,CAAC,aAAa,MAAM,GAAG,GAAG,KACjC;AAEF,QAAM,KACJ,IAAI,aACJ,IAAI,oBACJ,eAAe,IAAI,UAAU,KAC7B,IAAI,0BACJ,IAAI,wBACJ,IAAI,mBACJ;AAEF,SAAO;AAAA,IACL,QAAQ,UAAU;AAAA,IAClB,QAAQ,UAAU;AAAA,IAClB,IAAI,MAAM,OAAO,UAAU,OAAO,EAAE,IAAI;AAAA,EAC1C;AACF;AAEA,SAAS,eAAe,KAAwC;AAC9D,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,IAAI,IAAI,MAAM,4BAA4B;AAChD,SAAO,IAAI,EAAE,CAAC,IAAI;AACpB;;;AC9DA,YAAYC,SAAQ;AACpB,YAAYC,WAAU;AA6Bf,SAAS,mBAAmB,MAAuC;AACxE,SAAO,aAAa;AAAA,IAClB,UAAU,KAAK;AAAA,IACf,MAAM;AAAA,IACN,IAAI,KAAK;AAAA,IACT,QAAQ,KAAK;AAAA,IACb,OAAO,KAAK;AAAA,IACZ,eAAe,KAAK;AAAA,EACtB,CAAC;AACH;AAQO,SAAS,aAAa,MAA2C;AACtE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,gBAAgB;AAAA,EAClB,IAAI;AACJ,QAAM,SAAS,SAAS,IAAI,MAAM,EAAE;AACpC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,GAAG,WAAW,IAAI,CAAC,KAAK,EAAE,yBAAyB;AAAA,EACrE;AAEA,QAAM,WAAW,OAAO,MAAM,cAAc,CAAC;AAC7C,QAAM,WACJ,SAAS,WAAW,UAAU,EAAE,aAAa,QAAQ,EAAE;AACzD,QAAM,aAAkB,cAAQ,QAAQ,QAAQ;AAEhD,MAAO,eAAW,UAAU,KAAK,CAAC,OAAO;AACvC,WAAO;AAAA,MACL;AAAA,MACA,SAAS;AAAA,MACT,SAAS;AAAA,MACT,QAAQ,0BAA0B,UAAU;AAAA,IAC9C;AAAA,EACF;AAEA,QAAM,UAAU,WAAW,EAAE,IAAI,UAAU,cAAc,CAAC;AAE1D,EAAG,cAAe,cAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC1D,EAAG,kBAAc,YAAY,SAAS,MAAM;AAE5C,SAAO,EAAE,YAAY,SAAS,MAAM,SAAS,MAAM;AACrD;AAEA,SAAS,WAAW,GAAmB;AACrC,SAAO,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC;AAC9C;AAEA,SAAS,WAAW,MAIT;AACT,QAAM,QAAkB,CAAC;AACzB,QAAM;AAAA,IACJ,gCAAgC,KAAK,UAAU,KAAK,aAAa,CAAC;AAAA,EACpE;AACA,QAAM,KAAK,EAAE;AACb,QAAM;AAAA,IACJ,iBAAiB,KAAK,UAAU,KAAK,EAAE,CAAC;AAAA,EAC1C;AACA,MAAI,KAAK,SAAS,WAAW,GAAG;AAC9B,UAAM,KAAK,uDAAuD;AAClE,UAAM,KAAK,aAAa;AACxB,UAAM,KAAK,MAAM;AAAA,EACnB,OAAO;AACL,eAAW,aAAa,KAAK,UAAU;AACrC,YAAM,KAAK,UAAU,KAAK,UAAU,SAAS,CAAC,0BAA0B;AACxE,YAAM,KAAK,kCAAkC;AAC7C,YAAM,KAAK,gBAAgB;AAC3B,YAAM,KAAK,6BAA6B;AACxC,YAAM,KAAK,MAAM;AACjB,YAAM,KAAK,EAAE;AAAA,IACf;AAAA,EACF;AACA,QAAM,KAAK,IAAI;AACf,QAAM,KAAK,EAAE;AACb,SAAO,MAAM,KAAK,IAAI;AACxB;;;ACrHA,YAAYC,SAAQ;AACpB,YAAYC,WAAU;AAiCf,SAAS,QAAQ,OAAuB,CAAC,GAAiB;AAC/D,QAAM,MAAM,KAAK,OAAO,QAAQ,IAAI;AACpC,QAAM,UAAU,KAAK,WAAW,SAAS,EAAE,IAAI,CAAC;AAChD,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,IAAI,MAAM,sCAAsC,GAAG,EAAE;AAAA,EAC7D;AAEA,SAAO,QAAQ,IAAI,CAAC,OAAO,OAAO,IAAI,IAAI,CAAC;AAC7C;AAEA,SAAS,OAAO,IAAsB,MAAkC;AACtE,QAAM,EAAE,QAAQ,UAAU,IAAI;AAE9B,QAAM,cAAc,KAAK,OAAO,SAAS;AAAA,IACvC,KAAK;AAAA,IACL,gBAAgB,OAAO;AAAA,EACzB,CAAC;AAED,QAAM,YAAY,QAAQ,WAAW;AAErC,QAAM,YAAY,OAAO,QACrB;AAAA,IACE,OAAO,MAAM,IAAI,CAAC,UAAU,EAAE,SAAS,KAAK,SAAS,CAAC,IAAI,EAAE,EAAE;AAAA,IAC9D,EAAE,KAAK,WAAW,cAAc,KAAK;AAAA,EACvC,IACA,CAAC;AACL,QAAM,iBAAiB,QAAQ,SAAS;AAExC,QAAM,WAAWC,SAAQ;AAAA,IACvB;AAAA,IACA;AAAA,IACA,WAAW;AAAA,EACb,CAAC;AAED,QAAM,aAAa,kBAAkB,EAAE,KAAK,UAAU,CAAC;AAEvD,QAAM,YAAY,KAAK;AAAA,IACrB,UAAU,SAAS;AAAA,IACnB;AAAA,EACF,CAAC;AAED,QAAM,aAAkB,cAAQ,WAAW,OAAO,MAAM;AACxD,QAAM,YAAY,OAAO;AAEzB,MAAI,iBAAgC;AACpC,MAAI,KAAK,OAAO;AACd,QAAI;AACF,uBAAoB,iBAAa,YAAY,MAAM;AAAA,IACrD,QAAQ;AACN,uBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,wBAAwB,CAAC,GAAG,WAAW,GAAG,cAAc,EAAE;AAAA,IAC9D,CAAC,QAAQ,GAAG,aAAa,UAAU,KAAK;AAAA,EAC1C;AACA,MAAI;AACJ,MACE,KAAK,SACL,KAAK,QACL,SAAS,YAAY,SAAS,KAC9B,uBACA;AACA,kBAAc,MAAM;AAAA,MAClB,UAAU,SAAS;AAAA,MACnB;AAAA,MACA,OAAO;AAAA,MACP,eAAe;AAAA,MACf;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,MACX,oBAAoB,SAAS;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU,SAAS;AAAA,IACnB;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,gBAAgB,QAA0B;AACxD,EAAG,cAAe,cAAQ,OAAO,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AACjE,EAAG,kBAAc,OAAO,YAAY,OAAO,WAAW,MAAM;AAC9D;;;AC9HA,YAAYC,SAAQ;AACpB,YAAYC,WAAU;AAmCf,SAAS,WAAW,aAA6C;AACtE,QAAM,UAAsB,CAAC;AAC7B,aAAW,KAAK,aAAa;AAC3B,QAAI,CAAC,EAAE,IAAK;AACZ,YAAQ,KAAK;AAAA,MACX,MAAM,EAAE;AAAA,MACR,aAAa,EAAE,IAAI;AAAA,MACnB,MAAM,EAAE;AAAA,MACR,OAAO,EAAE,IAAI,SAAS,CAAC;AAAA,MACvB,aAAa,EAAE,IAAI,eAAe,CAAC;AAAA,MACnC,aAAa,EAAE,IAAI,eAAe,CAAC;AAAA,IACrC,CAAC;AAAA,EACH;AACA,MAAI,QAAQ,WAAW,EAAG,QAAO,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC,EAAE;AAG5D,QAAM,YAAY,oBAAI,IAAY;AAClC,QAAM,cAAc,oBAAI,IAAkD;AAC1E,aAAW,SAAS,SAAS;AAC3B,eAAW,QAAQ,MAAM,OAAO;AAC9B,YAAM,MAAM,GAAG,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,KAAK,GAAG,IAAI,KAAK,WAAW;AACtE,UAAI,UAAU,IAAI,GAAG,EAAG;AACxB,gBAAU,IAAI,GAAG;AACjB,UAAI,OAAO,YAAY,IAAI,KAAK,IAAI;AACpC,UAAI,CAAC,MAAM;AACT,eAAO,CAAC;AACR,oBAAY,IAAI,KAAK,MAAM,IAAI;AAAA,MACjC;AACA,WAAK,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC;AAAA,IAC9B;AAAA,EACF;AAEA,aAAW,CAAC,UAAU,KAAK,KAAK,aAAa;AAC3C,QAAI;AACJ,QAAI;AACF,gBAAa,iBAAa,UAAU,MAAM;AAAA,IAC5C,QAAQ;AACN,iBAAW,KAAK,MAAO,GAAE,MAAM,kBAAkB;AACjD;AAAA,IACF;AAGA,UAAM,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG;AACvD,UAAM,OAAqB,CAAC;AAC5B,QAAI,UAAU;AACd,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,QAAQ,SAAS;AACxB,aAAK,MAAM,kBAAkB;AAC7B;AAAA,MACF;AACA,WAAK,KAAK,IAAI;AACd,gBAAU,KAAK;AAAA,IACjB;AACA,aAAS,IAAI,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK;AACzC,YAAM,OAAO,KAAK,CAAC;AACnB,gBACE,QAAQ,MAAM,GAAG,KAAK,KAAK,IAC3B,KAAK,cACL,QAAQ,MAAM,KAAK,GAAG;AAAA,IAC1B;AACA,QAAI,KAAK,SAAS,EAAG,CAAG,kBAAc,UAAU,SAAS,MAAM;AAAA,EACjE;AAEA,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,cAAe;AACzB,eAAW,UAAU,MAAM,aAAa;AACtC,UAAO,eAAW,OAAO,IAAI,GAAG;AAC9B,cAAM,gBAAgB,GAAQ,eAAS,OAAO,IAAI,CAAC;AACnD;AAAA,MACF;AACA,MAAG,cAAe,cAAQ,OAAO,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC3D,MAAG,kBAAc,OAAO,MAAM,OAAO,SAAS,MAAM;AAAA,IACtD;AACA,QAAI,MAAM,cAAe;AACzB,eAAW,OAAO,MAAM,aAAa;AACnC,UAAI;AACF,QAAG,eAAW,GAAG;AAAA,MACnB,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAwB,CAAC;AAC/B,QAAM,UAAkD,CAAC;AACzD,aAAW,SAAS,SAAS;AAC3B,UAAM,UAAsB;AAAA,MAC1B,MAAM,MAAM;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,MAAM,MAAM;AAAA,IACd;AACA,QAAI,MAAM,eAAe;AACvB,cAAQ,KAAK,EAAE,GAAG,SAAS,QAAQ,MAAM,cAAc,CAAC;AAAA,IAC1D,OAAO;AACL,cAAQ,KAAK,OAAO;AAAA,IACtB;AAAA,EACF;AACA,SAAO,EAAE,SAAS,QAAQ;AAC5B;;;ACnGA,IAAM,QAAQ;AAEP,SAAS,aAAa,MAAmC;AAC9D,QAAM,EAAE,KAAK,MAAM,OAAO,OAAO,QAAQ,MAAM,IAAI;AACnD,QAAM,SAAiC,CAAC;AACxC,QAAM,SAAmB,CAAC;AAE1B,MAAI,CAAC,MAAM,KAAK,KAAK,GAAG;AACtB,WAAO;AAAA,MACL,OAAO;AAAA,MACP;AAAA,MACA,QAAQ,CAAC,WAAW,KAAK,qBAAqB;AAAA,IAChD;AAAA,EACF;AAEA,QAAM,UAAU,SAAS,EAAE,IAAI,CAAC;AAChC,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,EAAE,OAAO,GAAG,QAAQ,QAAQ,CAAC,8BAA8B,GAAG,EAAE,EAAE;AAAA,EAC3E;AAEA,QAAM,QAAmB,CAAC;AAE1B,aAAW,MAAM,SAAS;AACxB,UAAM,EAAE,QAAQ,UAAU,IAAI;AAC9B,UAAM,cAAc,KAAK,OAAO,SAAS;AAAA,MACvC,KAAK;AAAA,MACL,gBAAgB,OAAO;AAAA,IACzB,CAAC;AACD,UAAM,YAAY,QAAQ,WAAW;AACrC,UAAM,YAAY,OAAO,QACrB;AAAA,MACE,OAAO,MAAM,IAAI,CAAC,UAAU,EAAE,SAAS,KAAK,SAAS,CAAC,IAAI,EAAE,EAAE;AAAA,MAC9D,EAAE,KAAK,WAAW,cAAc,KAAK;AAAA,IACvC,IACA,CAAC;AACL,UAAM,iBAAiB,QAAQ,SAAS;AAGxC,UAAM,OAAO,QAAQ,EAAE,KAAK,WAAW,SAAS,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AACzD,UAAM,WAAW,KAAK;AACtB,QAAI,CAAC,SAAS,IAAI,MAAM,KAAK,GAAG;AAC9B,UAAI,SAAS,aAAa,MAAM,KAAK,GAAG;AACtC,eAAO;AAAA,UACL,GAAG,IAAI,KAAK,KAAK;AAAA,QACnB;AAAA,MACF,OAAO;AACL,eAAO,KAAK,GAAG,IAAI,KAAK,KAAK,yBAAyB;AAAA,MACxD;AACA;AAAA,IACF;AACA,QAAI,SAAS,IAAI,MAAM,KAAK,KAAK,CAAC,OAAO;AACvC,aAAO;AAAA,QACL,GAAG,IAAI,KAAK,KAAK;AAAA,MACnB;AACA;AAAA,IACF;AAEA,UAAM,UAAU,CAAC,SAAiB,UAA0B;AAC1D,YAAM,IAAI,QAAQ,KAAK;AACvB,aAAO,MAAM,OAAO,MAAM,OAAO,MAAM,MACnC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,KAChB,IAAI,KAAK;AAAA,IACf;AAGA,eAAW,MAAM,WAAW;AAC1B,iBAAW,KAAK,GAAG,aAAa;AAC9B,YAAI,EAAE,SAAS,QAAQ,EAAE,OAAO,MAAO;AACvC,YAAI,EAAE,MAAM;AACV,gBAAM,KAAK;AAAA,YACT,MAAM,GAAG,KAAK;AAAA,YACd,OAAO,EAAE,KAAK;AAAA,YACd,KAAK,EAAE,KAAK;AAAA,YACZ,aAAa,QAAQ,GAAG,KAAK,SAAS,EAAE,KAAK,KAAK;AAAA,UACpD,CAAC;AAAA,QACH,OAAO;AACL,iBAAO,KAAK;AAAA,YACV,MAAM,EAAE;AAAA,YACR,MAAM,EAAE;AAAA,YACR,QACE;AAAA,UACJ,CAAC;AAAA,QACH;AAAA,MACF;AAGA,iBAAW,KAAK,GAAG,YAAY,CAAC,GAAG;AACjC,YAAI,SAAS,YAAY,EAAE,SAAS,YAAY,EAAE,OAAO,OAAO;AAC9D,cAAI,EAAE,QAAQ;AACZ,kBAAM,KAAK;AAAA,cACT,MAAM,GAAG,KAAK;AAAA,cACd,OAAO,EAAE,OAAO;AAAA,cAChB,KAAK,EAAE,OAAO;AAAA,cACd,aAAa,QAAQ,GAAG,KAAK,SAAS,EAAE,OAAO,KAAK;AAAA,YACtD,CAAC;AAAA,UACH,OAAO;AACL,mBAAO,KAAK;AAAA,cACV,MAAM,GAAG,KAAK;AAAA,cACd,MAAM,EAAE,IAAI,QAAQ;AAAA,cACpB,QAAQ;AAAA,YACV,CAAC;AAAA,UACH;AAAA,QACF;AACA,YAAI,SAAS,YAAY,EAAE,SAAS;AAClC,mBAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,QAAQ,KAAK;AACzC,gBAAI,EAAE,QAAQ,CAAC,MAAM,MAAO;AAC5B,kBAAM,OAAO,EAAE,cAAc,CAAC;AAC9B,gBAAI,MAAM;AACR,oBAAM,KAAK;AAAA,gBACT,MAAM,GAAG,KAAK;AAAA,gBACd,OAAO,KAAK;AAAA,gBACZ,KAAK,KAAK;AAAA,gBACV,aAAa,QAAQ,GAAG,KAAK,SAAS,KAAK,KAAK;AAAA,cAClD,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,eAAW,MAAM,gBAAgB;AAC/B,iBAAW,QAAQ,GAAG,SAAS,CAAC,GAAG;AACjC,mBAAW,QAAQ,KAAK,OAAO;AAC7B,cAAI,KAAK,OAAO,MAAO;AACvB,cAAI,KAAK,MAAM;AACb,kBAAM,KAAK;AAAA,cACT,MAAM,GAAG,KAAK;AAAA,cACd,OAAO,KAAK,KAAK;AAAA,cACjB,KAAK,KAAK,KAAK;AAAA,cACf,aAAa,QAAQ,GAAG,KAAK,SAAS,KAAK,KAAK,KAAK;AAAA,YACvD,CAAC;AAAA,UACH,OAAO;AACL,mBAAO,KAAK;AAAA,cACV,MAAM,GAAG,KAAK;AAAA,cACd,MAAM,KAAK;AAAA,cACX,QAAQ;AAAA,YACV,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO,EAAE,OAAO,GAAG,QAAQ,OAAO;AAAA,EACpC;AACA,MAAI,MAAM,WAAW,KAAK,OAAO,WAAW,GAAG;AAC7C,WAAO;AAAA,MACL,OAAO;AAAA,MACP;AAAA,MACA,QAAQ;AAAA,QACN,GAAG,IAAI,KAAK,KAAK;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,WAAW;AAAA,IACxB;AAAA,MACE,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,KAAK;AAAA,QACH,aAAa,UAAU,IAAI,KAAK,KAAK,SAAS,KAAK;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,WAAO,KAAK,4BAA4B,OAAO,QAAQ,CAAC,EAAE,MAAM,EAAE;AAAA,EACpE;AAGA,aAAW,KAAK,QAAQ,EAAE,IAAI,CAAC,EAAG,iBAAgB,CAAC;AAEnD,SAAO,EAAE,OAAO,MAAM,QAAQ,QAAQ,OAAO;AAC/C;;;ACnNA,YAAYC,SAAQ;AACpB,YAAYC,YAAU;;;ACDtB,YAAY,OAAO;;;ACAnB,YAAYC,SAAQ;AACpB,YAAYC,YAAU;;;ACDtB,YAAYC,SAAQ;AACpB,YAAYC,WAAU;AASf,SAAS,aAAa,KAAqB;AAChD,QAAM,aAAa;AAAA,IACZ,cAAQ,WAAW,mBAAmB,GAAG;AAAA;AAAA,IACzC,cAAQ,WAAW,yBAAyB,GAAG;AAAA;AAAA,EACtD;AACA,aAAW,KAAK,YAAY;AAC1B,QAAI;AACF,MAAG,eAAW,GAAM,cAAU,IAAI;AAClC,aAAO;AAAA,IACT,QAAQ;AACN;AAAA,IACF;AAAA,EACF;AACA,QAAM,IAAI;AAAA,IACR,8BAA8B,GAAG;AAAA,IAAmB,WAAW,KAAK,MAAM,CAAC;AAAA,EAC7E;AACF;AAEO,SAAS,aAAa,KAAqB;AAChD,SAAU,iBAAa,aAAa,GAAG,GAAG,MAAM;AAClD;;;ADlBA,IAAM,cAAoD;AAAA,EACxD,EAAE,MAAM,iCAAiC,UAAU,kBAAkB;AAAA,EACrE;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AACF;AAEA,IAAM,eAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,iBAA6B;AAAA,EACxC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,aACE;AAAA,EAEF,MAAM,QAAQ,EAAE,KAAK,MAAM,GAA2C;AACpE,UAAM,UAAwB,CAAC;AAE/B,eAAW,QAAQ,aAAa;AAC9B,YAAM,OAAY,YAAK,KAAK,KAAK,IAAI;AACrC,YAAM,SAAY,eAAW,IAAI;AAEjC,UAAI,UAAU,CAAC,OAAO;AACpB,gBAAQ,KAAK;AAAA,UACX,MAAM,KAAK;AAAA,UACX,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV,CAAC;AACD;AAAA,MACF;AAEA,MAAG,cAAe,eAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACpD,MAAG,kBAAc,MAAM,aAAa,KAAK,QAAQ,CAAC;AAClD,cAAQ,KAAK;AAAA,QACX,MAAM,KAAK;AAAA,QACX,QAAQ,SAAS,gBAAgB;AAAA,MACnC,CAAC;AAAA,IACH;AAEA,eAAW,OAAO,cAAc;AAC9B,YAAM,OAAY,YAAK,KAAK,GAAG;AAC/B,UAAO,eAAW,IAAI,GAAG;AACvB,QAAG,eAAW,IAAI;AAClB,gBAAQ,KAAK,EAAE,MAAM,KAAK,QAAQ,UAAU,CAAC;AAAA,MAC/C;AAAA,IACF;AACA,iBAAkB,YAAK,KAAK,wBAAwB,CAAC;AACrD,iBAAkB,YAAK,KAAK,kBAAkB,CAAC;AAC/C,iBAAkB,YAAK,KAAK,eAAe,CAAC;AAE5C,WAAO,EAAE,QAAQ;AAAA,EACnB;AAAA,EAEA,MAAM,UAAU,EAAE,IAAI,GAA+C;AACnE,UAAM,UAAwB,CAAC;AAE/B,eAAW,QAAQ,aAAa;AAC9B,YAAM,OAAY,YAAK,KAAK,KAAK,IAAI;AACrC,UAAI,CAAI,eAAW,IAAI,GAAG;AACxB,gBAAQ,KAAK,EAAE,MAAM,KAAK,MAAM,QAAQ,WAAW,QAAQ,SAAS,CAAC;AACrE;AAAA,MACF;AACA,MAAG,eAAW,IAAI;AAClB,cAAQ,KAAK,EAAE,MAAM,KAAK,MAAM,QAAQ,UAAU,CAAC;AAAA,IACrD;AAEA,iBAAkB,YAAK,KAAK,iCAAiC,CAAC;AAC9D,iBAAkB,YAAK,KAAK,sBAAsB,CAAC;AACnD,iBAAkB,YAAK,KAAK,gBAAgB,CAAC;AAE7C,eAAW,OAAO,cAAc;AAC9B,YAAM,OAAY,YAAK,KAAK,GAAG;AAC/B,UAAO,eAAW,IAAI,GAAG;AACvB,QAAG,eAAW,IAAI;AAClB,gBAAQ,KAAK,EAAE,MAAM,KAAK,QAAQ,UAAU,CAAC;AAAA,MAC/C;AAAA,IACF;AACA,iBAAkB,YAAK,KAAK,wBAAwB,CAAC;AACrD,iBAAkB,YAAK,KAAK,kBAAkB,CAAC;AAC/C,iBAAkB,YAAK,KAAK,eAAe,CAAC;AAE5C,WAAO,EAAE,QAAQ;AAAA,EACnB;AACF;AAEA,SAAS,aAAa,KAAmB;AACvC,MAAI;AACF,UAAM,UAAa,gBAAY,GAAG;AAClC,QAAI,QAAQ,WAAW,EAAG,CAAG,cAAU,GAAG;AAAA,EAC5C,QAAQ;AAAA,EAER;AACF;;;AElHO,IAAM,YAA0B,CAAC,cAAc;AAE/C,SAAS,YAAY,IAAoC;AAC9D,SAAO,UAAU,KAAK,CAACC,OAAMA,GAAE,OAAO,EAAE;AAC1C;;;AHiBA,eAAsB,aACpB,MAC0B;AAC1B,QAAM,EAAE,KAAK,KAAK,IAAI;AACtB,QAAM,MAAM,KAAK,CAAC;AAElB,MAAI,CAAC,OAAO,QAAQ,YAAY,QAAQ,QAAQ,QAAQ,QAAQ;AAC9D,WAAO,IAAI,GAAG,SAAS,CAAC;AAAA,EAC1B;AAEA,MAAI,QAAQ,aAAa;AACvB,WAAO;AAAA,MACL;AAAA,MACA,UAAU,IAAI,CAAC,OAAO,KAAK,GAAG,GAAG,OAAO,EAAE,CAAC,IAAI,GAAG,KAAK,EAAE,EAAE,KAAK,IAAI,IAClE;AAAA,IACJ;AAAA,EACF;AAEA,MAAI,QAAQ,aAAa,QAAQ,aAAa;AAC5C,WAAO,IAAI,GAAG,0BAA0B,GAAG;AAAA;AAAA,EAAO,SAAS,CAAC,EAAE;AAAA,EAChE;AAEA,QAAM,QAAQ,WAAW,KAAK,MAAM,CAAC,CAAC;AACtC,QAAM,WAAW,MAAM,eAAe,MAAM,MAAM,QAAQ;AAC1D,MAAI,CAAC,SAAU,QAAO,IAAI,GAAG,cAAc;AAE3C,MAAI,QAAQ,WAAW;AACrB,UAAMC,UAAS,MAAM,SAAS,QAAQ;AAAA,MACpC;AAAA,MACA,OAAO,MAAM,UAAU;AAAA,IACzB,CAAC;AACD,WAAO,IAAI,GAAG,cAAc,UAAU,aAAaA,OAAM,CAAC;AAAA,EAC5D;AAGA,QAAM,SAAS,MAAM,SAAS,UAAU,EAAE,IAAI,CAAC;AAC/C,SAAO,IAAI,GAAG,cAAc,UAAU,eAAe,MAAM,CAAC;AAC9D;AAEA,eAAe,eACb,MACA,UAC4B;AAC5B,MAAI,UAAU;AACZ,UAAM,QAAQ,YAAY,QAAQ;AAClC,QAAI,CAAC,OAAO;AACV,YAAM,IAAI;AAAA,QACR,qBAAqB,QAAQ;AAAA,MAC/B;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,WAAW,EAAG,QAAO,UAAU,CAAC;AAE9C,MAAI,KAAK,gBAAgB;AACvB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,KAAK,QAAQ,gBAAgB;AAC/B,UAAM,KAAK,MAAM,KAAK,OAAO,eAAe,SAAS;AACrD,WAAO,KAAM,YAAY,EAAE,KAAK,OAAQ;AAAA,EAC1C;AAEA,QAAM,SAAS,MAAQ,SAAO;AAAA,IAC5B,SAAS;AAAA,IACT,SAAS,UAAU,IAAI,CAAC,QAAQ;AAAA,MAC9B,OAAO,GAAG;AAAA,MACV,OAAO,GAAG;AAAA,MACV,MAAM,GAAG;AAAA,IACX,EAAE;AAAA,EACJ,CAAC;AACD,MAAM,WAAS,MAAM,EAAG,QAAO;AAC/B,SAAO,YAAY,MAAgB,KAAK;AAC1C;AAOA,SAAS,WAAW,MAAuB;AACzC,QAAM,QAAe,CAAC;AACtB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,IAAI,KAAK,CAAC;AAChB,QAAI,MAAM,UAAW,OAAM,QAAQ;AAAA,aAC1B,MAAM,gBAAgB,MAAM,KAAM,OAAM,WAAW,KAAK,EAAE,CAAC;AAAA,aAC3D,EAAE,WAAW,aAAa,EAAG,OAAM,WAAW,EAAE,MAAM,EAAE;AAAA,EACnE;AACA,SAAO;AACT;AAEA,SAAS,cACP,UACA,MACA,QACQ;AACR,QAAM,QAAkB,CAAC,GAAG,IAAI,IAAI,SAAS,KAAK,GAAG;AACrD,aAAW,KAAK,OAAO,QAAS,OAAM,KAAK,KAAK,SAAS,CAAC,CAAC,EAAE;AAC7D,SAAO,MAAM,KAAK,IAAI,IAAI;AAC5B;AAEA,SAAS,SAAS,GAAuB;AACvC,UAAQ,EAAE,QAAQ;AAAA,IAChB,KAAK;AACH,aAAO,KAAK,EAAE,IAAI;AAAA,IACpB,KAAK;AACH,aAAO,KAAK,EAAE,IAAI;AAAA,IACpB,KAAK;AACH,aAAO,KAAK,EAAE,IAAI;AAAA,IACpB,KAAK;AACH,aAAO,QAAK,EAAE,IAAI,GAAG,EAAE,SAAS,MAAM,EAAE,MAAM,MAAM,EAAE;AAAA,EAC1D;AACF;AAEA,SAAS,WAAmB;AAC1B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,IAAI,UAAkB,QAAiC;AAC9D,SAAO,EAAE,UAAU,QAAQ,QAAQ,GAAG;AACxC;AAEA,SAAS,IAAI,UAAkB,QAAiC;AAC9D,SAAO,EAAE,UAAU,QAAQ,IAAI,OAAO;AACxC;;;AInKO,SAAS,UAAU,MAGxB;AACA,QAAM,aAAuB,CAAC;AAC9B,QAAM,QAA0C,CAAC;AACjD,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,IAAI,KAAK,CAAC;AAChB,QAAI,EAAE,WAAW,IAAI,GAAG;AACtB,YAAM,KAAK,EAAE,QAAQ,GAAG;AACxB,UAAI,OAAO,IAAI;AACb,cAAM,EAAE,MAAM,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,CAAC;AAAA,MACxC,OAAO;AACL,cAAM,OAAO,KAAK,IAAI,CAAC;AACvB,YAAI,QAAQ,CAAC,KAAK,WAAW,IAAI,GAAG;AAClC,gBAAM,EAAE,MAAM,CAAC,CAAC,IAAI;AACpB;AAAA,QACF,OAAO;AACL,gBAAM,EAAE,MAAM,CAAC,CAAC,IAAI;AAAA,QACtB;AAAA,MACF;AAAA,IACF,OAAO;AACL,iBAAW,KAAK,CAAC;AAAA,IACnB;AAAA,EACF;AACA,SAAO,EAAE,YAAY,MAAM;AAC7B;;;ALEA,eAAsB,IAAI,MAAsC;AAC9D,QAAM,MAAM,KAAK,OAAO,QAAQ,IAAI;AACpC,QAAM,EAAE,YAAY,MAAM,IAAI,UAAU,KAAK,IAAI;AACjD,QAAM,UAAU,WAAW,CAAC,KAAK;AAEjC,QAAM,SAAS,aAAa;AAE5B,MAAI;AACF,YAAQ,SAAS;AAAA,MACf,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO,IAAIC,UAAS,CAAC;AACrB,eAAO,OAAO,OAAO,CAAC;AAAA,MAExB,KAAK;AACH,eAAO,QAAQ,KAAK,MAAM;AAAA,MAE5B,KAAK;AACH,eAAO,eAAe,KAAK,OAAO,MAAM;AAAA,MAE1C,KAAK;AACH,eAAO,YAAY,KAAK,WAAW,MAAM,CAAC,GAAG,OAAO,MAAM;AAAA,MAE5D,KAAK;AACH,eAAO,UAAU,KAAK,WAAW,MAAM,CAAC,GAAG,OAAO,MAAM;AAAA,MAE1D,KAAK,MAAM;AACT,cAAM,SAAS,MAAM,aAAa;AAAA,UAChC;AAAA,UACA,MAAM,KAAK,KAAK,MAAM,CAAC;AAAA,QACzB,CAAC;AACD,YAAI,OAAO,OAAQ,QAAO,IAAI,OAAO,OAAO,QAAQ,OAAO,EAAE,CAAC;AAC9D,YAAI,OAAO,OAAQ,QAAO,IAAI,OAAO,OAAO,QAAQ,OAAO,EAAE,CAAC;AAC9D,eAAO,OAAO,OAAO,OAAO,QAAQ;AAAA,MACtC;AAAA,MAEA;AACE,eAAO,IAAI,oBAAoB,OAAO,EAAE;AACxC,eAAO,IAAIA,UAAS,CAAC;AACrB,eAAO,OAAO,OAAO,CAAC;AAAA,IAC1B;AAAA,EACF,SAAS,GAAG;AACV,WAAO,IAAI,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AACrD,WAAO,OAAO,OAAO,CAAC;AAAA,EACxB;AACF;AAEA,SAASA,YAAmB;AAC1B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,QAAQ,KAAa,GAA+C;AAC3E,QAAM,aAAkB,YAAK,KAAK,eAAe;AACjD,MAAO,eAAW,UAAU,GAAG;AAC7B,MAAE,IAAI,iCAAiC,UAAU,EAAE;AACnD,WAAO,EAAE,OAAO,CAAC;AAAA,EACnB;AACA,QAAM,SAAsB;AAAA,IAC1B,SAAS;AAAA,IACT,SAAS,CAAC,EAAE,SAAS,MAAM,CAAC;AAAA,IAC5B,QAAQ;AAAA,EACV;AACA,EAAG,kBAAc,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,MAAM,MAAM;AAC3E,IAAE,IAAI,WAAW,UAAU,EAAE;AAE7B,QAAM,gBAAqB,YAAK,KAAK,YAAY;AACjD,QAAM,QAAQ;AACd,MAAO,eAAW,aAAa,GAAG;AAChC,UAAM,WAAc,iBAAa,eAAe,MAAM;AACtD,UAAM,WAAW,SAAS,MAAM,IAAI,EAAE,KAAK,CAAC,SAAS,KAAK,KAAK,MAAM,KAAK;AAC1E,QAAI,CAAC,UAAU;AACb,YAAM,eAAe,SAAS,SAAS,KAAK,CAAC,SAAS,SAAS,IAAI;AACnE,MAAG;AAAA,QACD;AAAA,QACA,GAAG,eAAe,OAAO,EAAE,GAAG,KAAK;AAAA;AAAA,QACnC;AAAA,MACF;AACA,QAAE,IAAI,YAAY,KAAK,OAAO,aAAa,EAAE;AAAA,IAC/C;AAAA,EACF,OAAO;AACL,IAAG,kBAAc,eAAe,GAAG,KAAK;AAAA,GAAM,MAAM;AACpD,MAAE,IAAI,WAAW,aAAa,SAAS,KAAK,EAAE;AAAA,EAChD;AACA,SAAO,EAAE,OAAO,CAAC;AACnB;AAEA,SAAS,eACP,KACA,OACA,GACW;AACX,QAAM,MAAM,QAAQ,MAAM,GAAG;AAG7B,QAAM,QAAQ,CAAC,OAAO,QAAQ,MAAM,SAAS,MAAM,KAAK;AACxD,QAAM,OAAO,QAAQ,MAAM,QAAQ,MAAM,SAAS,GAAG;AACrD,QAAM,SAAS,QAAQ,MAAM,IAAI;AAEjC,MAAI,UAAU,SAAS,EAAE,IAAI,CAAC;AAC9B,MAAI,QAAQ,WAAW,GAAG;AACxB,MAAE,IAAI,MAAM,eAAe,gBAAgB,GAAG,EAAE;AAChD,WAAO,EAAE,OAAO,CAAC;AAAA,EACnB;AAEA,MAAI,QAAsB,CAAC;AAC3B,MAAI,aAAqD,CAAC;AAC1D,MAAI,KAAK;AAEP,UAAM,YAAY,QAAQ,EAAE,KAAK,OAAO,MAAM,MAAM,MAAM,QAAQ,CAAC;AACnE,UAAM,SAAS;AAAA,MACb,UAAU,QAAQ,CAAC,MAAM,EAAE,OAAO,eAAe,CAAC,CAAC;AAAA,IACrD;AACA,YAAQ,OAAO;AACf,iBAAa,OAAO;AAEpB,cAAU,SAAS,EAAE,IAAI,CAAC;AAAA,EAC5B;AAEA,QAAM,UAAU,QAAQ,EAAE,KAAK,OAAO,MAAM,QAAQ,CAAC;AAErD,MAAI,CAAC,OAAO;AACV,eAAW,KAAK,QAAS,iBAAgB,CAAC;AAAA,EAC5C;AAEA,QAAM,iBAAiB,QAAQ,QAAQ,CAAC,MAAM,EAAE,OAAO,eAAe,CAAC,CAAC;AACxE,QAAM,UAAU,QAAQ;AAAA,IACtB,CAAC,KAAK,MAAM;AACV,UAAI,UAAU,EAAE,OAAO,QAAQ,UAAU;AACzC,UAAI,YAAY,EAAE,OAAO,QAAQ,YAAY;AAC7C,aAAO;AAAA,IACT;AAAA,IACA,EAAE,QAAQ,GAAG,UAAU,EAAE;AAAA,EAC3B;AAEA,MAAI,QAAQ;AACV,UAAMC,OAAM;AAAA,MACV,aAAa,eAAe,IAAI,cAAc;AAAA,MAC9C;AAAA,MACA,GAAI,MAAM,EAAE,OAAO,WAAW,IAAI,CAAC;AAAA,IACrC;AACA,MAAE,IAAI,KAAK,UAAUA,MAAK,MAAM,CAAC,CAAC;AAAA,EACpC,OAAO;AACL,eAAW,KAAK,OAAO;AACrB,QAAE,IAAI,UAAU,EAAE,IAAI,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE;AAAA,IAC5D;AACA,eAAW,KAAK,YAAY;AAC1B,QAAE;AAAA,QACA,YAAY,EAAE,IAAI,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,KAAK,EAAE,MAAM;AAAA,MACnE;AAAA,IACF;AACA,eAAW,KAAK,SAAS;AACvB,UAAI,OAAO;AACT,UAAE,IAAI,WAAW,EAAE,UAAU,EAAE;AAAA,MACjC,OAAO;AACL,UAAE,IAAI,SAAS,EAAE,UAAU,EAAE;AAAA,MAC/B;AACA,iBAAW,KAAK,EAAE,OAAO,eAAe,CAAC,GAAG;AAC1C,cAAM,MAAM,EAAE,OAAO,GAAG,EAAE,IAAI,GAAG,EAAE,OAAO,IAAI,EAAE,IAAI,KAAK,EAAE,KAAK;AAChE,cAAM,SAAS,EAAE,aAAa,UAAU,EAAE,MAAM,EAAE;AAClD,cAAM,UAAU,EAAE,OAAO,CAAC,MAAM,+BAA+B;AAC/D;AAAA,UACE,GAAG,EAAE,SAAS,YAAY,CAAC,KAAK,EAAE,IAAI,KAAK,GAAG,IAAI,EAAE,OAAO,GAAG,OAAO;AAAA,QACvE;AACA,YAAI,EAAE,KAAM,QAAO,WAAW,EAAE,IAAI,EAAE;AAAA,MACxC;AAAA,IACF;AACA,QAAI,SAAS,MAAM;AACjB,QAAE,IAAI,GAAG,QAAQ,MAAM,cAAc,QAAQ,QAAQ,aAAa;AAAA,IACpE;AAAA,EACF;AAEA,QAAM,OAAO,QAAQ,SAAS,IAAI,IAAI;AACtC,SAAO,EAAE,OAAO,IAAI;AACtB;AAGA,SAAS,eAAe,GAEtB;AACA,QAAM,EAAE,KAAK,GAAG,KAAK,IAAI;AACzB,SAAO,MAAM,EAAE,GAAG,MAAM,SAAS,KAAK,IAAI;AAC5C;AAEA,IAAM,iBAAiB,oBAAI,IAAY,CAAC,UAAU,QAAQ,SAAS,CAAC;AAEpE,SAAS,YACP,KACA,MACA,OACA,GACW;AACX,QAAM,CAAC,MAAM,EAAE,IAAI;AACnB,MAAI,CAAC,QAAQ,CAAC,eAAe,IAAI,IAAI,KAAK,CAAC,IAAI;AAC7C,MAAE,IAAI,4DAA4D;AAClE,WAAO,EAAE,OAAO,CAAC;AAAA,EACnB;AACA,QAAM,eAAe;AAErB,QAAM,UAAU,QAAQ,EAAE,IAAI,CAAC;AAC/B,aAAW,KAAK,SAAS;AACvB,UAAM,SAAS,EAAE,SAAS,IAAI,cAAc,EAAE;AAC9C,QAAI,CAAC,OAAQ;AACb,UAAM,SAAc,eAAQ,EAAE,WAAW,KAAK;AAC9C,UAAM,SAAS,aAAa;AAAA,MAC1B,UAAU,EAAE;AAAA,MACZ,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,OAAO,QAAQ,MAAM,KAAK;AAAA,IAC5B,CAAC;AACD,QAAI,OAAO,SAAS;AAClB,QAAE,IAAI,OAAO,UAAU,SAAS;AAChC,aAAO,EAAE,OAAO,CAAC;AAAA,IACnB;AACA,MAAE,IAAI,SAAS,OAAO,UAAU,EAAE;AAClC,WAAO,EAAE,OAAO,CAAC;AAAA,EACnB;AAEA,IAAE;AAAA,IACA,GAAG,aAAa,OAAO,CAAC,EAAE,YAAY,IAAI,aAAa,MAAM,CAAC,CAAC,KAAK,EAAE;AAAA,EACxE;AACA,SAAO,EAAE,OAAO,CAAC;AACnB;AAEA,IAAM,eAAe,oBAAI,IAAY,CAAC,WAAW,UAAU,QAAQ,CAAC;AAEpE,SAAS,UACP,KACA,MACA,OACA,GACW;AACX,QAAM,CAAC,MAAM,OAAO,KAAK,IAAI;AAC7B,MAAI,CAAC,QAAQ,CAAC,aAAa,IAAI,IAAI,KAAK,CAAC,SAAS,CAAC,OAAO;AACxD,MAAE;AAAA,MACA;AAAA,IACF;AACA,WAAO,EAAE,OAAO,CAAC;AAAA,EACnB;AAEA,QAAM,SAAS,aAAa;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,QAAQ,MAAM,KAAK;AAAA,EAC5B,CAAC;AAED,aAAW,KAAK,OAAO,OAAQ,GAAE,IAAI,CAAC;AACtC,aAAW,KAAK,OAAO,QAAQ;AAC7B,MAAE,IAAI,UAAU,EAAE,IAAI,IAAI,EAAE,IAAI,WAAM,EAAE,MAAM,EAAE;AAAA,EAClD;AACA,MAAI,OAAO,OAAO,SAAS,EAAG,QAAO,EAAE,OAAO,CAAC;AAE/C,IAAE;AAAA,IACA,WAAW,IAAI,KAAK,KAAK,aAAQ,KAAK,MAAM,OAAO,KAAK;AAAA,EAC1D;AACA,MAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,MAAE;AAAA,MACA,GAAG,OAAO,OAAO,MAAM;AAAA,IACzB;AACA,WAAO,EAAE,OAAO,CAAC;AAAA,EACnB;AACA,SAAO,EAAE,OAAO,CAAC;AACnB;AAEA,SAAS,eAAe;AACtB,MAAI,SAAS;AACb,MAAI,SAAS;AACb,SAAO;AAAA,IACL,IAAI,KAAa;AACf,gBAAU,MAAM;AAAA,IAClB;AAAA,IACA,IAAI,KAAa;AACf,gBAAU,MAAM;AAAA,IAClB;AAAA,IACA,OAAO,UAA6B;AAClC,aAAO,EAAE,UAAU,QAAQ,OAAO;AAAA,IACpC;AAAA,EACF;AACF;","names":["path","fs","path","out","p","path","p","isNode","out","isNode","out","path","out","resolve","p","path","summary","p","baseName","check","out","out","fs","path","fs","path","resolve","fs","path","fs","path","fs","path","fs","path","p","result","helpText","out"]}