@drzl/cli 4.19.0 → 4.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../generator-trpc/dist/index.js","../../generator-json-schema/dist/index.js","../../generator-effect/dist/index.js","../src/cli.ts","../src/validation-options.ts","../src/json-schema-options.ts","../src/config.ts","../src/trpc-options.ts","../src/doctor.ts","../src/drift.ts","../src/generator-loader.ts","../src/sponsor.ts","../src/version.ts"],"sourcesContent":["// src/index.ts\nimport {\n formatCode,\n importSpecifier,\n resolveAffix,\n resolveConfiguredImport,\n schemaName\n} from \"@drzl/validation-core\";\nvar TRPC_MAJOR = 11;\nvar q = (v) => JSON.stringify(v);\nvar LIB_IMPORTS = {\n zod: \"import { z } from 'zod';\",\n valibot: \"import * as v from 'valibot';\",\n arktype: \"import { type } from 'arktype';\"\n};\nvar LIB_USAGE = {\n zod: /\\bz\\./,\n valibot: /\\bv\\./,\n arktype: /\\btype\\(/\n};\nvar LIBS = {\n zod: {\n number: \"z.number()\",\n string: \"z.string()\",\n boolean: \"z.boolean()\",\n date: \"z.date()\",\n unknown: \"z.unknown()\",\n tuple: (n) => `z.tuple([${Array.from({ length: n }, () => \"z.number()\").join(\", \")}])`,\n numberObject: (fields) => `z.object({ ${fields.map((f) => `${f}: z.number()`).join(\", \")} })`,\n enum: (vals) => `z.enum([${vals.map(q).join(\", \")}] as const)`,\n nullable: (b) => `${b}.nullable()`,\n optional: (b) => `${b}.optional()`,\n object: (body) => `z.object({\n${body}\n})`,\n objectInline: (body) => `z.object({ ${body} })`,\n partialUpdate: (s) => `${s}.partial()`,\n arrayOf: (s) => `z.array(${s})`,\n nullableOf: (s) => `${s}.nullable()`,\n booleanSchema: \"z.boolean()\"\n },\n valibot: {\n number: \"v.number()\",\n string: \"v.string()\",\n boolean: \"v.boolean()\",\n date: \"v.date()\",\n unknown: \"v.unknown()\",\n tuple: (n) => `v.tuple([${Array.from({ length: n }, () => \"v.number()\").join(\", \")}])`,\n numberObject: (fields) => `v.object({ ${fields.map((f) => `${f}: v.number()`).join(\", \")} })`,\n enum: (vals) => `v.picklist([${vals.map(q).join(\", \")}] as const)`,\n nullable: (b) => `v.nullable(${b})`,\n optional: (b) => `v.optional(${b})`,\n object: (body) => `v.object({\n${body}\n})`,\n objectInline: (body) => `v.object({ ${body} })`,\n arrayOf: (s) => `v.array(${s})`,\n nullableOf: (s) => `v.nullable(${s})`,\n booleanSchema: \"v.boolean()\"\n },\n arktype: {\n number: \"number\",\n string: \"string\",\n boolean: \"boolean\",\n date: \"Date\",\n unknown: \"unknown\",\n // The surrounding encode adds the quotes, so the union is built with the inner quoting\n // ArkType expects. Emitting `'${...}'` here produces `''admin' | 'user''`, which does not parse.\n enum: (vals) => vals.map((x) => `'${x.replace(/'/g, \"\\\\'\")}'`).join(\" | \"),\n nullable: (b) => `(${b} | null)`,\n optional: (b) => `${b}?`,\n object: (body) => `type({\n${body}\n})`,\n objectInline: (body) => `type({ ${body} })`,\n fieldIsString: true,\n arrayOf: (s) => `${s}.array()`,\n nullableOf: (s) => `${s}.or('null')`,\n booleanSchema: `type('boolean')`\n }\n};\nfunction isWide(column) {\n if (column.enumValues && column.enumValues.length) return false;\n if (column.shape?.kind === \"tuple\" || column.shape?.kind === \"numberObject\") return false;\n return ![\"number\", \"string\", \"boolean\", \"Date\"].includes(column.tsType);\n}\nfunction mapExpr(column, lib, mode) {\n const d = LIBS[lib];\n let base = (() => {\n if (column.enumValues && column.enumValues.length) return d.enum(column.enumValues);\n if (column.shape?.kind === \"tuple\" && d.tuple) return d.tuple(column.shape.length);\n if (column.shape?.kind === \"numberObject\" && d.numberObject) {\n return d.numberObject(column.shape.fields);\n }\n switch (column.tsType) {\n case \"number\":\n return d.number;\n case \"string\":\n return d.string;\n case \"boolean\":\n return d.boolean;\n case \"Date\":\n return d.date;\n default:\n return d.unknown;\n }\n })();\n if (column.nullable) base = d.nullable(base);\n if (mode !== \"select\") {\n const optional = mode === \"update\" || column.nullable || column.hasDefault;\n if (optional) base = d.optional(base);\n }\n return base;\n}\nfunction field(column, lib, mode) {\n const d = LIBS[lib];\n const expr = mapExpr(column, lib, mode);\n return `${objectKey(column.name)}: ${d.fieldIsString ? JSON.stringify(expr) : expr}`;\n}\nfunction objectKey(name) {\n return isIdent(name) ? name : JSON.stringify(name);\n}\nfunction renderSchema(table, lib, mode) {\n const d = LIBS[lib];\n const cols = table.columns.filter((c) => mode === \"select\" ? true : !c.isGenerated);\n const body = cols.map((c) => ` ${field(c, lib, mode)},`).join(\"\\n\");\n const schema = d.object(body);\n return mode === \"update\" && d.partialUpdate ? d.partialUpdate(schema) : schema;\n}\nfunction toCase(s, c) {\n if (!c) return s;\n const parts = s.replace(/([a-z0-9])([A-Z])/g, \"$1 $2\").replace(/[_-]/g, \" \").split(/\\s+/);\n if (c === \"camel\") {\n return parts.map(\n (p, i) => i === 0 ? p.toLowerCase() : p.charAt(0).toUpperCase() + p.slice(1).toLowerCase()\n ).join(\"\");\n }\n if (c === \"kebab\") return parts.map((p) => p.toLowerCase()).join(\"-\");\n if (c === \"snake\") return parts.map((p) => p.toLowerCase()).join(\"_\");\n return s;\n}\nvar cap = (s) => s.charAt(0).toUpperCase() + s.slice(1);\nvar singularize = (s) => s.endsWith(\"ies\") ? s.slice(0, -3) + \"y\" : s.endsWith(\"s\") ? s.slice(0, -1) : s;\nvar isIdent = (s) => /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(s);\nvar BASE_MODULE = \"trpc\";\nfunction keyColumns(table) {\n const names = table.primaryKey?.columns ?? [];\n if (!names.length) return null;\n const cols = names.map((n) => table.columns.find((c) => c.name === n));\n if (cols.some((c) => !c)) return null;\n return cols;\n}\nvar TRPCGenerator = class {\n constructor(analysis) {\n this.analysis = analysis;\n }\n async generate(opts) {\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n const out = path.resolve(process.cwd(), opts.outputDir);\n const ctx = {\n out,\n services: path.resolve(process.cwd(), opts.servicesDir ?? \"src/services\")\n };\n await fs.mkdir(out, { recursive: true });\n const files = [];\n const write = async (filePath, content) => {\n const formatted = await formatCode(\n buildHeader(opts.outputHeader) + content,\n filePath,\n opts.format\n );\n await fs.writeFile(filePath, formatted, \"utf8\");\n files.push(filePath);\n };\n const basePath = path.join(out, `${BASE_MODULE}.ts`);\n await write(basePath, renderBase(opts));\n const routers = [];\n const total = this.analysis.tables.length;\n let index = 0;\n for (const table of this.analysis.tables) {\n const base = `${table.tsName}${opts.naming?.routerSuffix ?? \"\"}`;\n const filePath = path.join(out, `${toCase(base, opts.naming?.procedureCase)}.ts`);\n if (filePath === basePath) {\n throw new Error(\n `@drzl/generator-trpc: the router for table \"${table.name}\" would be written to ${filePath}, which is the shared tRPC base module this generator also writes. Set naming.routerSuffix to move it out of the way.`\n );\n }\n await write(filePath, renderRouter(table, opts, ctx));\n routers.push({ table, filePath, exportName: routerExportName(table, opts.naming) });\n index++;\n opts.onProgress?.({ index, total, table: table.name, filePath });\n }\n await write(path.join(out, \"index.ts\"), renderBarrel(routers, ctx, path, opts));\n return { files };\n }\n};\nvar index_default = TRPCGenerator;\nfunction renderBase(opts) {\n const injection = opts.databaseInjection?.enabled === true;\n const dbType = opts.databaseInjection?.databaseType ?? \"unknown\";\n const typeImport = opts.databaseInjection?.databaseTypeImport ? `import type { ${opts.databaseInjection.databaseTypeImport.name} } from '${opts.databaseInjection.databaseTypeImport.from}';\n` : \"\";\n const trpcImport = injection ? `import { initTRPC, TRPCError } from '@trpc/server';` : `import { initTRPC } from '@trpc/server';`;\n const context = injection ? `/**\n * What your \\`createContext\\` hands every procedure.\n *\n * \\`db\\` is optional here and required by \\`dbProcedure\\` below. That split is what lets an adapter\n * build a context without a handle, for a health check or a public route, while every generated\n * procedure still sees one that is present.\n */\nexport interface Context {\n db?: ${dbType};\n}` : `/**\n * What your \\`createContext\\` hands every procedure. Nothing generated reads it, so it is left\n * open; narrow it to the shape your own context really has.\n */\nexport type Context = Record<string, unknown>;`;\n const middleware = injection ? `\n/**\n * The builder every generated procedure is built from: it refuses to run without a database\n * handle, and narrows \\`ctx.db\\` from optional to present for everything downstream.\n */\nexport const dbProcedure = t.procedure.use(async ({ ctx, next }) => {\n if (!ctx.db) {\n throw new TRPCError({\n code: 'INTERNAL_SERVER_ERROR',\n message: 'No database handle on the tRPC context. Provide one from createContext.',\n });\n }\n return next({ ctx: { db: ctx.db } });\n});\n` : \"\";\n return `// Generated by @drzl/generator-trpc\n// The shared tRPC base. Every generated router imports from here.\n${trpcImport}\n${typeImport}\n${context}\n\nconst t = initTRPC.context<Context>().create();\n\nexport const router = t.router;\nexport const mergeRouters = t.mergeRouters;\nexport const middleware = t.middleware;\n/** Needed to call this router in-process, from a test or from SSR. */\nexport const createCallerFactory = t.createCallerFactory;\nexport const publicProcedure = t.procedure;\n${middleware}`;\n}\nfunction renderRouter(table, opts, ctx) {\n const lib = opts.validation?.library ?? \"zod\";\n const d = LIBS[lib];\n const service = opts.template === \"service\";\n const injection = opts.databaseInjection?.enabled === true;\n const builder = injection ? \"dbProcedure\" : \"publicProcedure\";\n const insertName = `Insert${table.tsName}Schema`;\n const updateName = `Update${table.tsName}Schema`;\n const selectName = `Select${table.tsName}Schema`;\n const writable = !table.readOnly;\n const key = keyColumns(table);\n const Service = `${cap(singularize(table.tsName))}Service`;\n const serviceKeyable = !!key && key.length === 1 && key[0].tsType === \"number\";\n const keyArg = key && key.length === 1 ? `input.${key[0].name}` : \"\";\n const dbArg = injection ? \"ctx.db, \" : \"\";\n const wiredParams = injection ? \"{ ctx, input }\" : \"{ input }\";\n const procedures = [];\n const notImplemented = (what) => `throw new Error('Not implemented: ${what} ${table.tsName}.');`;\n procedures.push({\n name: \"list\",\n kind: \"query\",\n output: d.arrayOf(selectName),\n params: service && injection ? \"{ ctx }\" : \"\",\n body: service ? [`return await ${Service}.getAll(${injection ? \"ctx.db\" : \"\"});`] : [\"return [];\"]\n });\n const keyInput = key ? d.objectInline(key.map((c) => field(c, lib, \"select\")).join(\", \")) : void 0;\n if (key && keyInput) {\n const wired = service && serviceKeyable;\n procedures.push({\n name: \"byId\",\n kind: \"query\",\n input: keyInput,\n output: d.nullableOf(selectName),\n params: wired ? wiredParams : \"{ input: _input }\",\n body: wired ? [`return await ${Service}.getById(${dbArg}${keyArg});`] : service ? [serviceKeyNote(table), notImplemented(\"byId\")] : [\"return null;\"]\n });\n if (writable) {\n const updateInput = d.objectInline(\n [...key.map((c) => field(c, lib, \"select\")), `data: ${updateName}`].join(\", \")\n );\n procedures.push({\n name: \"update\",\n kind: \"mutation\",\n input: updateInput,\n output: selectName,\n params: wired ? wiredParams : \"{ input: _input }\",\n body: wired ? [`return await ${Service}.update(${dbArg}${keyArg}, input.data);`] : service ? [serviceKeyNote(table), notImplemented(\"update\")] : [notImplemented(\"update\")]\n });\n procedures.push({\n name: \"delete\",\n kind: \"mutation\",\n input: keyInput,\n output: d.booleanSchema,\n params: wired ? wiredParams : \"{ input: _input }\",\n body: wired ? [`return await ${Service}.delete(${dbArg}${keyArg});`] : service ? [serviceKeyNote(table), notImplemented(\"delete\")] : [\"return true;\"]\n });\n }\n }\n if (writable) {\n procedures.push({\n name: \"create\",\n kind: \"mutation\",\n input: insertName,\n output: selectName,\n params: service ? wiredParams : \"{ input: _input }\",\n body: service ? [`return await ${Service}.create(${dbArg}input);`] : [notImplemented(\"create\")]\n });\n }\n if (opts.includeRelations) {\n const taken = new Set(procedures.map((p) => p.name));\n procedures.push(...relationProcedures(table, lib, selectName, taken, service));\n }\n const order = [\"list\", \"byId\", \"create\", \"update\", \"delete\"];\n const rank = (n) => order.indexOf(n) === -1 ? order.length : order.indexOf(n);\n procedures.sort((a, b) => rank(a.name) - rank(b.name));\n const routerName = routerExportName(table, opts.naming);\n const entries = procedures.map((p) => {\n const rawKey = toCase(p.name, opts.naming?.procedureCase);\n const propKey = isIdent(rawKey) ? rawKey : JSON.stringify(rawKey);\n return [\n ` ${propKey}: ${builder}`,\n ...p.input ? [` .input(${p.input})`] : [],\n ` .output(${p.output})`,\n ` .${p.kind}(async (${p.params}) => {`,\n ...p.body.map((line) => ` ${line}`),\n ` }),`\n ].join(\"\\n\");\n }).join(\"\\n\");\n const body = `export const ${routerName} = router({\n${entries}\n});\n`;\n const useShared = !!opts.validation?.useShared && !!opts.validation?.importPath;\n const declared = [];\n if (!useShared) {\n if (writable) {\n declared.push(`export const ${insertName} = ${renderSchema(table, lib, \"insert\")};`);\n declared.push(`export const ${updateName} = ${renderSchema(table, lib, \"update\")};`);\n }\n declared.push(`export const ${selectName} = ${renderSchema(table, lib, \"select\")};`);\n }\n const decided = [...declared, body].join(\"\\n\\n\");\n const imports = [];\n if (useShared) {\n const sharedAffix = resolveAffix({\n affix: opts.validation?.affix,\n schemaSuffix: opts.validation?.schemaSuffix\n });\n const wanted = [\n [\"insert\", insertName],\n [\"update\", updateName],\n [\"select\", selectName]\n ].filter(([, local]) => decided.includes(local));\n if (wanted.length) {\n const spec = resolveConfiguredImport(\n opts.validation.importPath,\n ctx.out,\n process.cwd(),\n opts.importExtension\n );\n const names = wanted.map(([mode, local]) => {\n const exported = schemaName(mode, table.tsName, sharedAffix);\n return exported === local ? local : `${exported} as ${local}`;\n }).join(\", \");\n imports.push(`import { ${names} } from '${spec}';`);\n }\n }\n imports.push(\n `import { ${[builder, \"router\"].sort().join(\", \")} } from '${importSpecifier(\n `./${BASE_MODULE}.ts`,\n opts.importExtension\n )}';`\n );\n if (service) {\n imports.push(`import { ${Service} } from '${serviceImportSpecifier(table, ctx, opts)}';`);\n }\n if (LIB_USAGE[lib].test(decided)) imports.unshift(LIB_IMPORTS[lib]);\n const wide = table.columns.filter(isWide).map((c) => c.name);\n const wideNote = wide.length ? `// No validated type for ${wide.length === 1 ? \"this column\" : \"these columns\"}: ${wide.join(\", \")}.\n// DRZL could not derive one from the schema, so the router accepts any value there.\n` : \"\";\n return `// Generated by @drzl/generator-trpc\n// Router for table: ${table.name}\n${wideNote}${imports.join(\"\\n\")}\n\n${decided}`;\n}\nfunction relationProcedures(table, lib, selectSchemaName, taken, service) {\n const d = LIBS[lib];\n const out = [];\n for (const fk of table.foreignKeys ?? []) {\n if (fk.columns.length !== 1) continue;\n const colName = fk.columns[0];\n const column = table.columns.find((c) => c.name === colName);\n if (!column) continue;\n const name = `listBy${cap(colName)}`;\n if (taken.has(name)) continue;\n taken.add(name);\n out.push({\n name,\n kind: \"query\",\n input: d.objectInline(field(column, lib, \"select\")),\n output: d.arrayOf(selectSchemaName),\n params: \"{ input: _input }\",\n body: [\n `// Rows of ${table.name} whose ${JSON.stringify(colName)} matches _input.${colName}.`,\n // In `service` mode every other procedure really does reach the database, so a lookup\n // quietly answering with an empty array would read as \"no matching rows\". There is no\n // generated service method for it, so it says so instead. In `standard` mode everything\n // is a stub and `[]` is consistent with `list`.\n service ? `throw new Error('Not implemented: ${name} ${table.tsName}.');` : \"return [];\"\n ]\n });\n }\n return out;\n}\nfunction renderBarrel(routers, ctx, path, opts) {\n const baseSpec = importSpecifier(`./${BASE_MODULE}.ts`, opts.importExtension);\n const reExports = `export { createCallerFactory, publicProcedure, router } from '${baseSpec}';\n` + (opts.databaseInjection?.enabled === true ? `export { dbProcedure } from '${baseSpec}';\n` : \"\") + `export type { Context } from '${baseSpec}';\n`;\n if (!routers.length) {\n return `// Generated by @drzl/generator-trpc\n// No tables detected in analysis. Add tables to your schema and regenerate.\nimport { router } from '${baseSpec}';\n\nexport const appRouter = router({});\n\n/** The type a tRPC client is parameterised by: \\`createTRPCClient<AppRouter>()\\`. */\nexport type AppRouter = typeof appRouter;\n\n${reExports}`;\n }\n const entries = routers.map(({ filePath, exportName, table }) => ({\n rel: importSpecifier(\n \"./\" + path.relative(ctx.out, filePath).replace(/\\\\/g, \"/\"),\n opts.importExtension\n ),\n exportName,\n // The namespace a client reaches this table's procedures through: `trpc.userProfiles.list`.\n // `tsName` verbatim, because it is already a valid identifier and it is the name the user\n // wrote in their schema. The oRPC barrel lowercases this key, turning `userProfiles` into\n // `userprofiles`: harmless in an object literal nobody reads, and not harmless when the key\n // is the public API of a typed client.\n key: table.tsName\n }));\n const importLines = entries.map(({ rel, exportName }) => `import { ${exportName} } from '${rel}';`).join(\"\\n\");\n const bodyLines = entries.map(({ key, exportName }) => ` ${isIdent(key) ? key : JSON.stringify(key)}: ${exportName},`).join(\"\\n\");\n return `// Generated by @drzl/generator-trpc\nimport { router } from '${baseSpec}';\n${importLines}\n\nexport const appRouter = router({\n${bodyLines}\n});\n\n/** The type a tRPC client is parameterised by: \\`createTRPCClient<AppRouter>()\\`. */\nexport type AppRouter = typeof appRouter;\n\n${reExports}`;\n}\nfunction serviceKeyNote(table) {\n const cols = table.primaryKey?.columns ?? [];\n const shape = cols.length > 1 ? `has a composite primary key (${cols.join(\", \")})` : `has a non-numeric primary key (${cols[0]})`;\n return `// ${table.name} ${shape}, and @drzl/generator-service types its key parameter as one number.\n// Wire this to your own lookup.`;\n}\nfunction routerExportName(table, naming) {\n const base = `${table.tsName}${naming?.routerSuffix ?? \"Router\"}`;\n const c = naming?.procedureCase;\n return toCase(base, c === \"kebab\" ? \"camel\" : c);\n}\nfunction serviceImportSpecifier(table, ctx, opts) {\n const rel = relativePosix(ctx.out, ctx.services);\n const dir = !rel ? \".\" : rel.startsWith(\".\") ? rel : `./${rel}`;\n return importSpecifier(`${dir}/${singularize(table.tsName)}Service.ts`, opts.importExtension);\n}\nfunction relativePosix(from, to) {\n const norm = (p) => p.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n const a = norm(from).split(\"/\");\n const b = norm(to).split(\"/\");\n let i = 0;\n while (i < a.length && i < b.length && a[i] === b[i]) i++;\n return [...Array.from({ length: a.length - i }, () => \"..\"), ...b.slice(i)].join(\"/\");\n}\nfunction buildHeader(h) {\n if (h && h.enabled === false) return \"\";\n const text = h?.text?.trim();\n const lines = text ? text.split(/\\r?\\n/).map((l) => `// ${l}`) : [\n \"// Generated by DRZL (@drzl/*)\",\n \"// Generated output is granted to you under your project's license.\",\n \"// You may use, copy, modify, and distribute without attribution.\"\n ];\n return lines.join(\"\\n\") + \"\\n\\n\";\n}\nexport {\n BASE_MODULE,\n TRPCGenerator,\n TRPC_MAJOR,\n index_default as default\n};\n","// src/index.ts\nimport {\n formatCode,\n moduleFileName,\n moduleSpecifier,\n resolveAffix,\n schemaName,\n typeName\n} from \"@drzl/validation-core\";\n\n// src/schemas.ts\nimport {\n COLUMN_FORMATS,\n insertColumns,\n isIntegerColumn,\n parseCheck,\n selectColumns,\n updateColumns\n} from \"@drzl/validation-core\";\nvar DRAFT = \"https://json-schema.org/draft/2020-12/schema\";\nvar UUID_FORMAT = \"uuid\";\nvar base64 = (target) => target === \"openapi-3.0\" ? { type: \"string\", format: \"byte\" } : { type: \"string\", contentEncoding: \"base64\" };\nfunction baseSchema(c, mode, target, checks, sets, lengths) {\n const s = c.shape;\n if (s) {\n switch (s.kind) {\n case \"json\":\n return {};\n case \"custom\":\n return {};\n case \"buffer\":\n return base64(target);\n case \"tuple\":\n return target === \"openapi-3.0\" ? { type: \"array\", items: { type: \"number\" }, minItems: s.length, maxItems: s.length } : {\n type: \"array\",\n prefixItems: Array.from({ length: s.length }, () => ({ type: \"number\" })),\n minItems: s.length,\n maxItems: s.length\n };\n case \"numberObject\":\n return {\n type: \"object\",\n properties: Object.fromEntries(s.fields.map((f) => [f, { type: \"number\" }])),\n required: [...s.fields]\n };\n case \"numberVector\":\n return {\n type: \"array\",\n items: { type: \"number\" },\n ...s.length ? { minItems: s.length, maxItems: s.length } : {}\n };\n case \"bitstring\":\n return {\n type: \"string\",\n pattern: \"^[01]*$\",\n ...s.length ? s.exact ? { minLength: s.length, maxLength: s.length } : { maxLength: s.length } : {}\n };\n case \"byteString\":\n return { type: \"string\", ...s.length ? { maxLength: s.length } : {} };\n }\n }\n const set = sets.find((x) => x.column === c.name);\n if (set) return { enum: set.values.map((v) => set.kind === \"string\" ? v : Number(v)) };\n if (c.enumValues && c.enumValues.length) return { enum: [...c.enumValues] };\n const mine = c.arrayDimensions ? [] : checks.filter((k) => k.column === c.name);\n const eq = mine.find((k) => k.operator === \"=\");\n if (eq) {\n const only = eq.kind === \"string\" ? eq.value : Number(eq.value);\n return target === \"openapi-3.0\" ? { enum: [only] } : { const: only };\n }\n switch (c.tsType) {\n case \"string\": {\n const out = { type: \"string\" };\n if (c.format === \"uuid\") out.format = UUID_FORMAT;\n else if (c.format && COLUMN_FORMATS[c.format]) out.pattern = COLUMN_FORMATS[c.format];\n if (c.maxLength !== void 0) out.maxLength = c.maxLength;\n applyByteCap(out, c);\n applyLengths(out, c, lengths);\n return out;\n }\n case \"number\": {\n const out = { type: isIntegerColumn(c) ? \"integer\" : \"number\" };\n if (!c.arrayDimensions) applyNumericBounds(out, c, checks, target);\n return out;\n }\n case \"bigint\":\n return { type: \"string\", pattern: \"^-?\\\\d+$\" };\n case \"boolean\":\n return { type: \"boolean\" };\n case \"Date\":\n return { type: \"string\", format: \"date-time\" };\n case \"Uint8Array\":\n return base64(target);\n default:\n return {};\n }\n}\nfunction applyByteCap(out, c) {\n if (!c.maxBytes) return;\n out.maxLength = Math.min(Number(out.maxLength ?? Infinity), c.maxBytes);\n out.description = `At most ${c.maxBytes} bytes of UTF-8, which JSON Schema has no keyword for. maxLength counts characters: it refuses nothing the column accepts, and a string of multi-byte characters can satisfy it and still be too long for the column.`;\n}\nfunction applyLengths(out, c, lengths) {\n for (const k of lengths.filter((x) => x.column === c.name)) {\n const n = Number(k.value);\n if (k.operator === \">=\") out.minLength = Math.max(Number(out.minLength ?? 0), n);\n else if (k.operator === \">\") out.minLength = Math.max(Number(out.minLength ?? 0), n + 1);\n else if (k.operator === \"<=\") out.maxLength = Math.min(Number(out.maxLength ?? Infinity), n);\n else if (k.operator === \"<\") out.maxLength = Math.min(Number(out.maxLength ?? Infinity), n - 1);\n else if (k.operator === \"=\") {\n out.minLength = n;\n out.maxLength = n;\n }\n }\n}\nfunction applyNumericBounds(out, c, checks, target) {\n let min = c.min !== void 0 ? { value: Number(c.min), exclusive: false } : void 0;\n let max = c.max !== void 0 ? { value: Number(c.max), exclusive: false } : void 0;\n for (const k of checks.filter((x) => x.column === c.name && x.kind === \"number\")) {\n if (k.operator === \">=\") min = { value: Number(k.value), exclusive: false };\n else if (k.operator === \">\") min = { value: Number(k.value), exclusive: true };\n else if (k.operator === \"<=\") max = { value: Number(k.value), exclusive: false };\n else if (k.operator === \"<\") max = { value: Number(k.value), exclusive: true };\n }\n const old = target === \"openapi-3.0\";\n if (min) {\n if (min.exclusive && !old) out.exclusiveMinimum = min.value;\n else {\n out.minimum = min.value;\n if (min.exclusive) out.exclusiveMinimum = true;\n }\n }\n if (max) {\n if (max.exclusive && !old) out.exclusiveMaximum = max.value;\n else {\n out.maximum = max.value;\n if (max.exclusive) out.exclusiveMaximum = true;\n }\n }\n}\nfunction cardinalityBounds(c, cardinalities) {\n if (!c.arrayDimensions) return {};\n const out = {};\n for (const k of cardinalities.filter((x) => x.column === c.name)) {\n const n = Number(k.value);\n if (k.operator === \">=\") out.minItems = n;\n else if (k.operator === \">\") out.minItems = n + 1;\n else if (k.operator === \"<=\") out.maxItems = n;\n else if (k.operator === \"<\") out.maxItems = n - 1;\n else if (k.operator === \"=\") {\n out.minItems = n;\n out.maxItems = n;\n }\n }\n return out;\n}\nfunction makeNullable(s, target) {\n if (target === \"openapi-3.0\") return { ...s, nullable: true };\n if (s.type === void 0) {\n if (Array.isArray(s.enum)) return { ...s, enum: [...s.enum, null] };\n if (\"const\" in s) {\n const { const: k, ...rest } = s;\n return { ...rest, enum: [k, null] };\n }\n return s;\n }\n return { ...s, type: [s.type, \"null\"] };\n}\nfunction columnSchema(c, mode, target, checks, sets, lengths, cardinalities, applyDefault) {\n let s = baseSchema(c, mode, target, checks, sets, lengths);\n const dims = c.arrayDimensions ?? 0;\n for (let i = 0; i < dims; i++) {\n s = { type: \"array\", items: s, ...i === dims - 1 ? cardinalityBounds(c, cardinalities) : {} };\n }\n if (c.nullable) s = makeNullable(s, target);\n if (mode === \"insert\" && applyDefault && c.defaultValue !== void 0) {\n s = { ...s, default: c.defaultValue };\n }\n return s;\n}\nfunction rowDescription(rows, cols) {\n const present = new Set(cols.map((c) => c.name));\n const applicable = rows.filter((r) => present.has(r.left) && present.has(r.right));\n if (!applicable.length) return void 0;\n const list = applicable.map((r) => `${r.name ? `${r.name}: ` : \"\"}${r.left} ${r.operator} ${r.right}`).join(\"; \");\n return `Row constraints not expressible in JSON Schema: ${list}`;\n}\nfunction tableSchema(table, cols, mode, target, applyDefaults, parsed) {\n const properties = {};\n const required = [];\n for (const c of cols) {\n properties[c.name] = columnSchema(\n c,\n mode,\n target,\n parsed.checks,\n parsed.sets,\n parsed.lengths,\n parsed.cardinalities,\n applyDefaults\n );\n const suppliedOnInsert = c.hasDefault || applyDefaults && c.defaultValue !== void 0 || c.isGenerated;\n const optional = mode === \"update\" || mode === \"insert\" && suppliedOnInsert;\n if (!optional) required.push(c.name);\n }\n const desc = rowDescription(parsed.rows, cols);\n return {\n ...target === \"draft-2020-12\" ? { $schema: DRAFT } : {},\n $id: `${table.tsName}.${mode}`,\n title: `${mode} ${table.tsName}`,\n ...desc ? { description: desc } : {},\n type: \"object\",\n properties,\n ...required.length ? { required } : {},\n additionalProperties: false\n };\n}\nfunction collect(table) {\n const parsed = (table.checks ?? []).map((k) => parseCheck(k.expression, k.name));\n return {\n checks: parsed.flatMap((p) => p.ok ? p.checks : []),\n sets: parsed.flatMap((p) => p.ok ? p.sets ?? [] : []),\n rows: parsed.flatMap((p) => p.ok ? p.rows ?? [] : []),\n lengths: parsed.flatMap((p) => p.ok ? p.lengths ?? [] : []),\n cardinalities: parsed.flatMap((p) => p.ok ? p.cardinalities ?? [] : [])\n };\n}\nfunction tableSchemas(table, opts = {}) {\n const target = opts.target ?? \"draft-2020-12\";\n const parsed = collect(table);\n const build2 = (cols, mode) => tableSchema(table, cols, mode, target, !!opts.applyDefaults, parsed);\n return {\n insert: build2(insertColumns(table), \"insert\"),\n update: build2(updateColumns(table), \"update\"),\n select: build2(selectColumns(table), \"select\")\n };\n}\nfunction componentsDocument(tables, opts = {}) {\n const schemas = {};\n for (const table of tables) {\n const built = tableSchemas(table, opts);\n for (const mode of [\"insert\", \"update\", \"select\"]) {\n const name = `${table.tsName}${mode[0].toUpperCase()}${mode.slice(1)}`;\n const { $schema: _dialect, $id: _id, ...rest } = built[mode];\n schemas[name] = rest;\n }\n }\n return { schemas };\n}\n\n// src/openapi.ts\nvar ERROR_SCHEMA = \"Error\";\nvar componentName = (table, mode) => `${table.tsName}${mode[0].toUpperCase()}${mode.slice(1)}`;\nvar ref = (name) => ({ $ref: `#/components/schemas/${name}` });\nvar pascal = (s) => s.charAt(0).toUpperCase() + s.slice(1);\nfunction keyColumns(table) {\n const names = table.primaryKey?.columns ?? [];\n if (!names.length) return null;\n const cols = names.map((n) => table.columns.find((c) => c.name === n));\n if (cols.some((c) => !c)) return null;\n return cols;\n}\nvar modesFor = (table, key) => [\n ...table.readOnly ? [] : [\"insert\"],\n ...table.readOnly || !key ? [] : [\"update\"],\n \"select\"\n];\nvar resourceSegment = (table) => encodeURIComponent(table.name);\nfunction foreignKeysOf(table) {\n if (table.foreignKeys?.length) return table.foreignKeys;\n return table.columns.filter((c) => c.references).map((c) => ({\n columns: [c.name],\n foreignTable: c.references.table,\n foreignColumns: [c.references.column]\n }));\n}\nvar jsonBody = (schema) => ({ content: { \"application/json\": { schema } } });\nfunction build(tables, opts) {\n const target = opts.target ?? \"draft-2020-12\";\n const schemaTarget = target === \"openapi-3.0\" ? \"openapi-3.0\" : \"openapi-3.1\";\n const failure = String(opts.validationStatus ?? 400);\n const paths = {};\n const schemas = {};\n const tags = [];\n const operationIds = /* @__PURE__ */ new Map();\n const owner = /* @__PURE__ */ new Map();\n const claim = (path, by, label) => {\n const taken = owner.get(path);\n if (taken !== void 0 && taken.by !== by) {\n throw new Error(\n `@drzl/generator-json-schema: the OpenAPI path \"${path}\" is claimed twice: by table \"${taken.label}\" (exported as ${taken.by}) and by table \"${label}\" (exported as ${by}). A path names one resource, so one of the two has to be left out of this generator with the config's \"exclude\" list.`\n );\n }\n owner.set(path, { by, label });\n };\n const operation = (id, table, rest) => {\n const clash = operationIds.get(id);\n if (clash !== void 0) {\n throw new Error(\n `@drzl/generator-json-schema: the operationId \"${id}\" would be emitted for both \"${clash}\" and \"${table.name}\". An operationId is the method name a client generator derives, and the specification requires it to be unique across the document.`\n );\n }\n operationIds.set(id, table.name);\n return { operationId: id, tags: [table.name], ...rest };\n };\n const built = tables.map((table) => ({\n table,\n key: keyColumns(table),\n segment: resourceSegment(table),\n schemas: tableSchemas(table, { target: schemaTarget, applyDefaults: opts.applyDefaults })\n }));\n for (const { table, key, segment, schemas: built3 } of built) {\n for (const mode of modesFor(table, key)) {\n const { $schema: _dialect, $id: _id, ...rest } = built3[mode];\n schemas[componentName(table, mode)] = rest;\n }\n const notes = [];\n if (!key) notes.push(\"It has no primary key, so no path addresses a single row.\");\n if (table.readOnly) {\n notes.push(\"It refuses every write, so only reads are described.\");\n }\n tags.push({ name: table.name, description: [`Table \"${table.name}\".`, ...notes].join(\" \") });\n const T = pascal(table.tsName);\n const select = ref(componentName(table, \"select\"));\n const validationFailed = {\n description: \"The request does not match the schema for this operation.\",\n ...jsonBody(ref(ERROR_SCHEMA))\n };\n const collidable = [\n ...table.primaryKey ? [`primary key (${table.primaryKey.columns.join(\", \")})`] : [],\n ...table.unique.map((u) => `${u.name ? `${u.name} ` : \"\"}(${u.columns.join(\", \")})`)\n ];\n const conflict = (constraints) => ({\n description: `The row collides with an existing one on ${constraints.join(\"; \")}.`,\n ...jsonBody(ref(ERROR_SCHEMA))\n });\n const collection = `/${segment}`;\n claim(collection, table.tsName, table.name);\n const item = {\n get: operation(`list${T}`, table, {\n summary: `List every ${table.name} row.`,\n // No pagination parameters. Whether the server implements a limit, an offset or a cursor is\n // not something a Drizzle schema states, and a declared parameter nothing honours is worse\n // than an undeclared one.\n responses: {\n \"200\": {\n description: `Every ${table.name} row.`,\n ...jsonBody({ type: \"array\", items: select })\n }\n }\n })\n };\n if (!table.readOnly) {\n item.post = operation(`create${T}`, table, {\n summary: `Create a ${table.name} row.`,\n requestBody: { required: true, ...jsonBody(ref(componentName(table, \"insert\"))) },\n responses: {\n \"201\": { description: `The ${table.name} row that was created.`, ...jsonBody(select) },\n [failure]: validationFailed,\n ...collidable.length ? { \"409\": conflict(collidable) } : {}\n }\n });\n }\n paths[collection] = item;\n if (!key) continue;\n const itemPath = `${collection}/${key.map((c) => `{${c.name}}`).join(\"/\")}`;\n claim(itemPath, table.tsName, table.name);\n const parameters = key.map((c) => ({\n name: c.name,\n in: \"path\",\n required: true,\n description: `${c.name}, from the primary key of ${table.name}.`,\n // The column's own schema rather than a string, so an integer key is declared as one and a\n // uuid key carries its format. This is the whole point of reading the real key.\n schema: built3.select.properties[c.name] ?? {}\n }));\n const missing = {\n description: `No ${table.name} row has that ${key.map((c) => c.name).join(\" and \")}.`,\n ...jsonBody(ref(ERROR_SCHEMA))\n };\n const byId = {\n parameters,\n get: operation(`get${T}`, table, {\n summary: `Read one ${table.name} row.`,\n responses: {\n \"200\": { description: `The requested ${table.name} row.`, ...jsonBody(select) },\n [failure]: validationFailed,\n \"404\": missing\n }\n })\n };\n if (!table.readOnly) {\n byId.patch = operation(`update${T}`, table, {\n summary: `Patch one ${table.name} row.`,\n requestBody: { required: true, ...jsonBody(ref(componentName(table, \"update\"))) },\n responses: {\n \"200\": { description: `The ${table.name} row after the patch.`, ...jsonBody(select) },\n [failure]: validationFailed,\n \"404\": missing,\n // The primary key is not in the update schema, so a patch cannot collide on it. Only a\n // unique constraint over other columns can.\n ...table.unique.length ? {\n \"409\": conflict(\n table.unique.map((u) => `${u.name ? `${u.name} ` : \"\"}(${u.columns.join(\", \")})`)\n )\n } : {}\n }\n });\n byId.delete = operation(`delete${T}`, table, {\n summary: `Delete one ${table.name} row.`,\n responses: {\n // No body. Handing back the deleted row is the alternative and it is not a true statement\n // on every dialect DRZL supports: RETURNING is Postgres and SQLite, and MySQL has no such\n // clause, so an implementation there has nothing to send.\n \"204\": { description: `The ${table.name} row was deleted. No content is returned.` },\n [failure]: validationFailed,\n \"404\": missing\n }\n });\n }\n paths[itemPath] = byId;\n if (!opts.includeRelations) continue;\n for (const child of built) {\n if (child.table === table) continue;\n const matching = foreignKeysOf(child.table).filter(\n (fk) => fk.foreignTable === table.name && fk.foreignColumns.length === key.length && fk.foreignColumns.every((c, i) => c === key[i].name)\n );\n if (matching.length !== 1) continue;\n const subPath = `${itemPath}/${child.segment}`;\n claim(\n subPath,\n `${table.tsName} -> ${child.table.tsName}`,\n `${table.name} -> ${child.table.name}`\n );\n paths[subPath] = {\n parameters,\n get: operation(`list${T}${pascal(child.table.tsName)}`, child.table, {\n summary: `List the ${child.table.name} rows belonging to one ${table.name} row.`,\n responses: {\n \"200\": {\n description: `The ${child.table.name} rows whose ${matching[0].columns.join(\", \")} names this ${table.name} row.`,\n ...jsonBody({ type: \"array\", items: ref(componentName(child.table, \"select\")) })\n },\n [failure]: validationFailed,\n \"404\": missing\n }\n })\n };\n }\n }\n return { paths, schemas, tags };\n}\nvar errorSchema = () => ({\n title: \"error\",\n description: \"What an operation returns when it does not return the row.\",\n type: \"object\",\n properties: {\n message: { type: \"string\" },\n code: { type: \"string\" }\n },\n required: [\"message\"],\n additionalProperties: true\n});\nfunction openApiDocument(tables, opts = {}) {\n const target = opts.target ?? \"draft-2020-12\";\n const { paths, schemas, tags } = build(tables, opts);\n if (ERROR_SCHEMA in schemas) {\n throw new Error(\n `@drzl/generator-json-schema: a table produced the component schema name \"${ERROR_SCHEMA}\", which the document already uses for its error responses.`\n );\n }\n return {\n openapi: target === \"openapi-3.0\" ? \"3.0.3\" : \"3.1.1\",\n info: {\n title: opts.info?.title ?? \"API\",\n version: opts.info?.version ?? \"0.0.0\",\n description: opts.info?.description ?? \"Generated by DRZL from a Drizzle schema. Paths, request bodies and response bodies are derived from the schema alone; nothing here has been checked against a running server.\"\n },\n ...opts.servers?.length ? { servers: opts.servers } : {},\n paths,\n components: { schemas: { ...schemas, [ERROR_SCHEMA]: errorSchema() } },\n tags\n };\n}\n\n// src/index.ts\nvar DEFAULT_FILE_SUFFIX = \".schema.ts\";\nfunction renderTableModule(table, affix, target, applyDefaults) {\n const T = table.tsName;\n const schemas = tableSchemas(table, { target, applyDefaults });\n const decl = (mode) => `export const ${schemaName(mode, T, affix)} = ${JSON.stringify(schemas[mode], null, 2)} as const;\n\nexport type ${typeName(mode, T, affix)} = typeof ${schemaName(mode, T, affix)};`;\n return [decl(\"insert\"), decl(\"update\"), decl(\"select\")].join(\"\\n\\n\") + \"\\n\";\n}\nfunction resolveDocument(opt) {\n if (!opt) return null;\n const o = opt === true ? {} : opt;\n if (o.enabled === false) return null;\n return { ...o, format: o.format ?? \"ts\" };\n}\nvar JsonSchemaGenerator = class {\n constructor(analysis) {\n this.analysis = analysis;\n this.library = \"json-schema\";\n }\n async generate(opts) {\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n const out = path.resolve(process.cwd(), opts.outDir);\n const files = [];\n await fs.mkdir(out, { recursive: true });\n const affix = resolveAffix(opts);\n const fileSuffix = opts.fileSuffix ?? DEFAULT_FILE_SUFFIX;\n const target = opts.target ?? \"draft-2020-12\";\n const document = resolveDocument(opts.document);\n for (const table of this.analysis.tables) {\n const filePath = path.join(out, moduleFileName(table.tsName, fileSuffix));\n const code = renderTableModule(table, affix, target, !!opts.applyDefaults);\n const formatted = await formatCode(\n buildHeader(opts.outputHeader) + code,\n filePath,\n opts.format\n );\n await fs.writeFile(filePath, formatted, \"utf8\");\n files.push(filePath);\n }\n if (opts.components) {\n const doc = componentsDocument(this.analysis.tables, {\n target,\n applyDefaults: !!opts.applyDefaults\n });\n const componentsPath = path.join(out, \"components.ts\");\n const code = `export const components = ${JSON.stringify(doc, null, 2)} as const;\n`;\n await fs.writeFile(\n componentsPath,\n await formatCode(buildHeader(opts.outputHeader) + code, componentsPath, opts.format),\n \"utf8\"\n );\n files.push(componentsPath);\n }\n if (document) {\n const built = openApiDocument(this.analysis.tables, {\n target,\n applyDefaults: !!opts.applyDefaults,\n includeRelations: !!opts.includeRelations,\n info: document.info,\n servers: document.servers,\n validationStatus: document.validationStatus\n });\n const body = JSON.stringify(built, null, 2);\n if (document.format !== \"json\") {\n const tsPath = path.join(out, \"openapi.ts\");\n const code = `export const openapi = ${body} as const;\n`;\n await fs.writeFile(\n tsPath,\n await formatCode(buildHeader(opts.outputHeader) + code, tsPath, opts.format),\n \"utf8\"\n );\n files.push(tsPath);\n }\n if (document.format !== \"ts\") {\n const jsonPath = path.join(out, \"openapi.json\");\n await fs.writeFile(jsonPath, body + \"\\n\", \"utf8\");\n files.push(jsonPath);\n }\n }\n const ext = opts.importExtension === \"none\" ? \"\" : \".js\";\n const indexPath = path.join(out, \"index.ts\");\n const index = this.analysis.tables.map(\n (t) => `export * from '${moduleSpecifier(t.tsName, fileSuffix, opts.importExtension)}';`\n ).concat(opts.components ? [`export * from './components${ext}';`] : []).concat(document && document.format !== \"json\" ? [`export * from './openapi${ext}';`] : []).join(\"\\n\") + \"\\n\";\n const indexFormatted = await formatCode(\n buildHeader(opts.outputHeader) + index,\n indexPath,\n opts.format\n );\n await fs.writeFile(indexPath, indexFormatted, \"utf8\");\n files.push(indexPath);\n return files;\n }\n renderTable(table, opts) {\n return renderTableModule(\n table,\n resolveAffix(opts),\n opts?.target ?? \"draft-2020-12\",\n !!opts?.applyDefaults\n );\n }\n};\nvar index_default = JsonSchemaGenerator;\nfunction buildHeader(h) {\n if (h?.enabled === false) return \"\";\n const text = h?.text ?? \"// Generated by DRZL. Do not edit by hand.\";\n return `${text}\n\n`;\n}\nexport {\n DRAFT,\n JsonSchemaGenerator,\n componentsDocument,\n index_default as default,\n openApiDocument,\n tableSchemas\n};\n","// src/index.ts\nimport {\n buildNestedPlan,\n formatCode,\n nestedArmNotes,\n nestedNodeColumns,\n nestedSchemaName,\n nestedTypeName,\n resolveNestedDepth,\n CODEPOINT_LENGTH,\n COERCIBLE_DATE_STRING,\n COLUMN_FORMATS,\n insertColumns,\n isIntegerColumn,\n moduleFileName,\n moduleSpecifier,\n nonFiniteAccepted,\n parseCheck,\n parsesToADate,\n renderDuplicateFinder,\n resolveAffix,\n resolveConfiguredImport,\n schemaName,\n selectColumns,\n typeName,\n updateColumns\n} from \"@drzl/validation-core\";\nvar DEFAULT_FILE_SUFFIX = \".effect.ts\";\nvar STANDARD_PREFIX = \"Standard\";\nvar NS = \"Schema\";\nvar OPS = {\n \">=\": \">=\",\n \">\": \">\",\n \"<=\": \"<=\",\n \"<\": \"<\",\n \"=\": \"===\",\n \"<>\": \"!==\"\n};\nfunction filter(expr, description) {\n return `${NS}.filter((v) => ${expr}, { description: ${JSON.stringify(description)} })`;\n}\nfunction piped(base, steps) {\n return steps.length ? `${base}.pipe(${steps.join(\", \")})` : base;\n}\nvar JSON_CONST = \"DrzlJsonValue\";\nvar JSON_PREAMBLE = `type ${JSON_CONST}Type =\n | string\n | number\n | boolean\n | null\n | readonly ${JSON_CONST}Type[]\n | { readonly [key: string]: ${JSON_CONST}Type };\n\nconst ${JSON_CONST}: ${NS}.Schema<${JSON_CONST}Type, unknown> = ${NS}.suspend(() =>\n ${NS}.Union(\n ${NS}.String,\n ${NS}.Finite,\n ${NS}.Boolean,\n ${NS}.Null,\n ${NS}.Array(${JSON_CONST}),\n // The plain-object test comes before the record, not after it. \\`Schema.Record\\` rebuilds its\n // output, so a check placed after it inspects that new object and reports every input as\n // plain. A Date sailed through: it has no own enumerable keys, so the record accepted it and\n // rebuilt it as \\`{}\\`.\n ${NS}.Unknown.pipe(\n ${NS}.filter(\n (o) => {\n if (typeof o !== 'object' || o === null || Array.isArray(o)) return false;\n const p = Object.getPrototypeOf(o);\n return p === Object.prototype || p === null;\n },\n { description: 'a plain object' }\n ),\n ${NS}.compose(${NS}.Record({ key: ${NS}.String, value: ${JSON_CONST} }), { strict: false })\n )\n )\n);\n`;\nvar UNKNOWN_EXPR = `${NS}.Unknown`;\nfunction isUnknownExpr(expr) {\n return expr === UNKNOWN_EXPR;\n}\nfunction withNarrowedType(expr, ref) {\n return `${expr} as unknown as ${NS}.Schema<${ref}>`;\n}\nfunction numericBounds(c, checks) {\n let lo = c.min !== void 0 ? { fn: \"greaterThanOrEqualTo\", value: c.min } : void 0;\n let hi = c.max !== void 0 ? { fn: \"lessThanOrEqualTo\", value: c.max } : void 0;\n for (const k of checks.filter((x) => x.column === c.name && x.kind === \"number\")) {\n if (k.operator === \">=\") lo = { fn: \"greaterThanOrEqualTo\", value: k.value };\n else if (k.operator === \">\") lo = { fn: \"greaterThan\", value: k.value };\n else if (k.operator === \"<=\") hi = { fn: \"lessThanOrEqualTo\", value: k.value };\n else if (k.operator === \"<\") hi = { fn: \"lessThan\", value: k.value };\n }\n return [lo, hi].filter(Boolean).map((x) => `${NS}.${x.fn}(${x.value})`);\n}\nfunction foldedIntoBounds(c, checks) {\n if (c.arrayDimensions || c.shape) return /* @__PURE__ */ new Set();\n if (c.tsType !== \"number\" && c.tsType !== \"bigint\") return /* @__PURE__ */ new Set();\n return new Set(\n checks.filter(\n (k) => k.column === c.name && k.kind === \"number\" && k.operator !== \"=\" && k.operator !== \"<>\"\n )\n );\n}\nfunction nonFiniteBranches(c) {\n const { nan, infinity } = nonFiniteAccepted(c);\n return [\n ...nan ? [`${NS}.Number.pipe(${filter(\"Number.isNaN(v)\", \"NaN, which this column stores\")})`] : [],\n ...infinity ? [`${NS}.Literal(Infinity, -Infinity)`] : []\n ];\n}\nfunction withNonFinite(c, base) {\n const branches = nonFiniteBranches(c);\n return branches.length ? `${NS}.Union(${base}, ${branches.join(\", \")})` : base;\n}\nfunction dateExpr(mode, coerceDates) {\n const plain = `${NS}.ValidDateFromSelf`;\n if (coerceDates === \"none\") return plain;\n const fromString = piped(`${NS}.String`, [\n `${NS}.pattern(new RegExp(${JSON.stringify(COERCIBLE_DATE_STRING)}))`,\n filter(parsesToADate(\"new Date(v)\"), \"a date the runtime can parse\")\n ]);\n const fromNumber = piped(`${NS}.Number`, [\n filter(parsesToADate(\"new Date(v)\"), \"a date the runtime can parse\")\n ]);\n const union = `${NS}.Union(${plain}, ${fromString}, ${fromNumber})`;\n if (coerceDates === \"all\") return union;\n return mode === \"select\" ? plain : union;\n}\nfunction capSteps(c, mode) {\n const steps = [];\n if (c.shape?.kind === \"byteString\") {\n const n = c.shape.length;\n if (!n) return steps;\n return mode === \"select\" ? [filter(`${CODEPOINT_LENGTH} <= ${n}`, `at most ${n} characters`)] : [filter(`new TextEncoder().encode(v).length <= ${n}`, `at most ${n} bytes`)];\n }\n if (c.maxLength) {\n steps.push(\n filter(`${CODEPOINT_LENGTH} <= ${c.maxLength}`, `at most ${c.maxLength} characters`)\n );\n }\n if (c.maxBytes) {\n steps.push(\n filter(`new TextEncoder().encode(v).length <= ${c.maxBytes}`, `at most ${c.maxBytes} bytes`)\n );\n }\n return steps;\n}\nfunction lengthSteps(c, lengths) {\n if (c.arrayDimensions || c.shape) return [];\n return lengths.filter((k) => k.column === c.name).map(\n (k) => filter(\n `${CODEPOINT_LENGTH} ${OPS[k.operator]} ${k.value}`,\n `${k.name ? `${k.name}: ` : \"\"}length(${c.name}) ${k.operator} ${k.value}`\n )\n );\n}\nfunction cardinalitySteps(c, cardinalities) {\n if (!c.arrayDimensions) return [];\n return cardinalities.filter((k) => k.column === c.name).map(\n (k) => filter(\n `v.length ${OPS[k.operator]} ${k.value}`,\n `${k.name ? `${k.name}: ` : \"\"}cardinality(${c.name}) ${k.operator} ${k.value}`\n )\n );\n}\nfunction checkSteps(c, checks) {\n if (c.arrayDimensions || c.shape) return [];\n const folded = foldedIntoBounds(c, checks);\n return checks.filter((k) => k.column === c.name && !folded.has(k)).map((k) => {\n const literal = k.kind === \"string\" ? JSON.stringify(k.value) : k.value;\n return filter(\n `v ${OPS[k.operator]} ${literal}`,\n `${k.name ? `${k.name}: ` : \"\"}${c.name} ${k.operator} ${k.value}`\n );\n });\n}\nfunction hasNoRuntimeType(c) {\n return c.tsType === \"any\" || c.shape?.kind === \"custom\" || c.shape?.kind === \"json\";\n}\nfunction shapeExpr(c, mode, replaced = false) {\n const s = c.shape;\n if (!s) return void 0;\n switch (s.kind) {\n case \"json\":\n return replaced ? UNKNOWN_EXPR : JSON_CONST;\n case \"custom\":\n return UNKNOWN_EXPR;\n case \"buffer\":\n return `${NS}.Uint8ArrayFromSelf`;\n case \"tuple\":\n return `${NS}.Tuple(${Array.from({ length: s.length }, () => `${NS}.Number`).join(\", \")})`;\n case \"numberObject\":\n return `${NS}.Struct({ ${s.fields.map((f) => `${f}: ${NS}.Number`).join(\", \")} })`;\n case \"numberVector\":\n return piped(\n `${NS}.Array(${NS}.Number)`,\n s.length ? [filter(`v.length === ${s.length}`, `exactly ${s.length} elements`)] : []\n );\n case \"bitstring\":\n return piped(`${NS}.String`, [\n `${NS}.pattern(/^[01]*$/)`,\n ...s.length ? [\n s.exact ? filter(`v.length === ${s.length}`, `exactly ${s.length} binary digits`) : filter(`v.length <= ${s.length}`, `at most ${s.length} binary digits`)\n ] : []\n ]);\n case \"byteString\":\n return piped(`${NS}.String`, capSteps(c, mode));\n }\n}\nfunction exprForColumn(c, mode, coerceDates, checks, sets, lengths, replaced) {\n const shaped = shapeExpr(c, mode, replaced);\n if (shaped) return shaped;\n const set = sets.find((x) => x.column === c.name);\n if (set) {\n const values = set.values.map((v) => set.kind === \"string\" ? JSON.stringify(v) : v);\n return `${NS}.Literal(${values.join(\", \")})`;\n }\n if (c.arrayDimensions) checks = [];\n if (c.enumValues && c.enumValues.length) {\n return `${NS}.Literal(${c.enumValues.map((v) => JSON.stringify(v)).join(\", \")})`;\n }\n const eq = checks.find((k) => k.column === c.name && k.operator === \"=\");\n if (eq && !c.shape) {\n return `${NS}.Literal(${eq.kind === \"string\" ? JSON.stringify(eq.value) : eq.value})`;\n }\n const rest = [...checkSteps(c, checks), ...lengthSteps(c, lengths)];\n switch (c.tsType) {\n case \"string\": {\n const base = c.format === \"uuid\" ? `${NS}.UUID` : `${NS}.String`;\n const pattern = c.format && c.format !== \"uuid\" && COLUMN_FORMATS[c.format] ? [`${NS}.pattern(new RegExp(${JSON.stringify(COLUMN_FORMATS[c.format])}))`] : [];\n return piped(base, [...pattern, ...capSteps(c, mode), ...rest]);\n }\n case \"number\": {\n const base = isIntegerColumn(c) ? `${NS}.Int` : `${NS}.Finite`;\n return withNonFinite(c, piped(base, [...numericBounds(c, checks), ...rest]));\n }\n case \"bigint\":\n return piped(`${NS}.BigIntFromSelf`, [\n ...c.min !== void 0 ? [`${NS}.greaterThanOrEqualToBigInt(${c.min}n)`] : [],\n ...c.max !== void 0 ? [`${NS}.lessThanOrEqualToBigInt(${c.max}n)`] : [],\n ...rest\n ]);\n case \"boolean\":\n return `${NS}.Boolean`;\n case \"Date\":\n return dateExpr(mode, coerceDates);\n case \"Uint8Array\":\n return `${NS}.Uint8ArrayFromSelf`;\n case \"any\":\n return UNKNOWN_EXPR;\n default:\n return UNKNOWN_EXPR;\n }\n}\nfunction renderField(c, mode, coerceDates, checks, sets, lengths, cardinalities, applyDefault, narrowRef) {\n let expr = exprForColumn(\n c,\n mode,\n coerceDates,\n checks,\n sets,\n lengths,\n !!narrowRef && hasNoRuntimeType(c)\n );\n const dims = c.arrayDimensions ?? 0;\n for (let i = 0; i < dims; i++) {\n expr = `${NS}.Array(${expr})`;\n if (i === dims - 1) expr = piped(expr, cardinalitySteps(c, cardinalities));\n }\n if (c.nullable && !isUnknownExpr(expr)) expr = `${NS}.NullOr(${expr})`;\n if (narrowRef) expr = withNarrowedType(expr, narrowRef);\n if (mode === \"select\") return expr;\n const wantsDefault = mode === \"insert\" && applyDefault && c.defaultValue !== void 0;\n if (wantsDefault) {\n return `${NS}.optionalWith(${expr}, { default: () => ${JSON.stringify(c.defaultValue)} })`;\n }\n if (mode === \"update\" || c.nullable || c.hasDefault) return `${NS}.optional(${expr})`;\n return expr;\n}\nfunction wantsRef(c, allColumns) {\n return allColumns || hasNoRuntimeType(c);\n}\nfunction renderObjectShape(cols, mode, coerceDates, checks, sets, lengths, cardinalities, typedJson, applyDefaults) {\n return cols.map((c) => {\n const ref = typedJson && wantsRef(c, !!typedJson.allColumns) ? `(typeof ${typedJson.table}.$infer${typedJson.mode === \"insert\" ? \"Insert\" : \"Select\"})[${JSON.stringify(c.name)}]` : void 0;\n const field = renderField(\n c,\n mode,\n coerceDates,\n checks,\n sets,\n lengths,\n cardinalities,\n applyDefaults,\n ref\n );\n return ` ${JSON.stringify(c.name)}: ${field},`;\n }).join(\"\\n\");\n}\nfunction rowSteps(rows, cols) {\n const present = new Set(cols.map((c) => c.name));\n return rows.filter((r) => present.has(r.left) && present.has(r.right)).map((r) => {\n const l = `o[${JSON.stringify(r.left)}]`;\n const rt = `o[${JSON.stringify(r.right)}]`;\n const msg = `${r.name ? `${r.name}: ` : \"\"}${r.left} ${r.operator} ${r.right}`;\n return `${NS}.filter((o) => ${l} == null || ${rt} == null || ${l} ${OPS[r.operator]} ${rt}, { description: ${JSON.stringify(msg)} })`;\n });\n}\nfunction indentBlock(code, by = \" \") {\n return code.split(\"\\n\").map((line) => line ? by + line : line).join(\"\\n\");\n}\nfunction parsedChecksFor(table) {\n const parsed = (table.checks ?? []).map((k) => parseCheck(k.expression, k.name));\n return {\n checks: parsed.flatMap((p) => p.ok ? p.checks : []),\n sets: parsed.flatMap((p) => p.ok ? p.sets ?? [] : []),\n rows: parsed.flatMap((p) => p.ok ? p.rows ?? [] : []),\n lengths: parsed.flatMap((p) => p.ok ? p.lengths ?? [] : []),\n cardinalities: parsed.flatMap((p) => p.ok ? p.cardinalities ?? [] : [])\n };\n}\nfunction nestedNodeCols(node, mode) {\n const all = mode === \"insert\" ? insertColumns(node.table) : selectColumns(node.table);\n return nestedNodeColumns(all, node);\n}\nfunction nestedNodes(node, into = []) {\n into.push(node);\n for (const arm of node.arms) nestedNodes(arm.child, into);\n return into;\n}\nfunction renderNestedObject(node, mode, coerceDates, typedJson, applyDefaults) {\n const cols = nestedNodeCols(node, mode);\n const { checks, sets, rows, lengths, cardinalities } = parsedChecksFor(node.table);\n const tj = typedJson ? { table: node.table.tsName, mode, allColumns: typedJson.allColumns } : void 0;\n const fields = renderObjectShape(\n cols,\n mode,\n coerceDates,\n checks,\n sets,\n lengths,\n cardinalities,\n tj,\n applyDefaults\n );\n const arms = node.arms.map((arm) => {\n const notes = nestedArmNotes(arm).map((n) => ` // ${n}\n`).join(\"\");\n const child = renderNestedObject(arm.child, mode, coerceDates, typedJson, applyDefaults);\n const inner = arm.single ? `${NS}.NullOr(\n${indentBlock(indentBlock(child))}\n )` : `${NS}.Array(\n${indentBlock(indentBlock(child))}\n )`;\n return `${notes} ${JSON.stringify(arm.key)}: ${NS}.optional(${inner}),`;\n });\n const body = [fields, ...arms].filter(Boolean).join(\"\\n\");\n return piped(`${NS}.Struct({\n${body}\n})`, rowSteps(rows, cols));\n}\nfunction renderNestedSchemas(table, affix, coerceDates, typedJson, applyDefaults, plans) {\n const out = [];\n for (const mode of [\"insert\", \"select\"]) {\n const plan = plans[mode];\n if (!plan) continue;\n const name = nestedSchemaName(mode, table.tsName, affix);\n const tname = nestedTypeName(mode, table.tsName, affix);\n const expr = renderNestedObject(plan, mode, coerceDates, typedJson, applyDefaults);\n out.push(\n `export const ${name} = ${expr};\n\nexport type ${tname} = ${NS}.Schema.Type<typeof ${name}>;\n\nexport const ${STANDARD_PREFIX}${name} = ${NS}.standardSchemaV1(${name});`\n );\n }\n return out.length ? `\n${out.join(\"\\n\\n\")}\n` : \"\";\n}\nfunction nestedPlansFor(table, analysis, depth) {\n const out = {};\n for (const mode of [\"insert\", \"select\"]) {\n if (mode === \"insert\" && table.readOnly) continue;\n const plan = buildNestedPlan(table, analysis.tables, analysis.relations ?? [], mode, depth);\n if (plan) out[mode] = plan;\n }\n return out;\n}\nfunction renderTableSchemas(table, affix, coerceDates, typedJson, applyDefaults = false, wantsDuplicateFinder = false, nested = {}) {\n const T = table.tsName;\n const insertCols = insertColumns(table);\n const updateCols = updateColumns(table);\n const selectCols = selectColumns(table);\n const { checks, sets, rows, lengths, cardinalities } = parsedChecksFor(table);\n const tj = typedJson ? { table: T, allColumns: typedJson.allColumns } : void 0;\n const modes = [\n [\"insert\", insertCols],\n [\"update\", updateCols],\n [\"select\", selectCols]\n ];\n const blocks = modes.map(([mode, cols]) => {\n const name = schemaName(mode, T, affix);\n const tname = typeName(mode, T, affix);\n const body = renderObjectShape(\n cols,\n mode,\n coerceDates,\n checks,\n sets,\n lengths,\n cardinalities,\n // The update schema references the insert-side inferred types: both describe a value going\n // in, and `$inferSelect` would name the post-default type for a column a write may omit.\n tj ? { ...tj, mode: mode === \"select\" ? \"select\" : \"insert\" } : void 0,\n applyDefaults\n );\n const expr = piped(`${NS}.Struct({\n${body}\n})`, rowSteps(rows, cols));\n return `export const ${name} = ${expr};\n\nexport type ${tname} = ${NS}.Schema.Type<typeof ${name}>;\n\nexport const ${STANDARD_PREFIX}${name} = ${NS}.standardSchemaV1(${name});`;\n });\n const nestedByTable = [\"insert\", \"select\"].flatMap((m) => {\n const plan = nested[m];\n return plan ? nestedNodes(plan).map((n) => [n.table.tsName, nestedNodeCols(n, m)]) : [];\n });\n const nestedCols = nestedByTable.flatMap(([, cs]) => cs);\n const referenced = /* @__PURE__ */ new Set();\n if (typedJson) {\n const all = !!typedJson.allColumns;\n if ([...insertCols, ...updateCols, ...selectCols].some((c) => wantsRef(c, all))) {\n referenced.add(T);\n }\n for (const [name, cs] of nestedByTable) {\n if (cs.some((c) => wantsRef(c, all))) referenced.add(name);\n }\n }\n const schemaImport = referenced.size ? `import type { ${[...referenced].join(\", \")} } from '${typedJson.schemaSpecifier}';\n` : \"\";\n const needsJson = !typedJson && [...insertCols, ...updateCols, ...selectCols, ...nestedCols].some(\n (c) => c.shape?.kind === \"json\"\n );\n const finder = wantsDuplicateFinder ? renderDuplicateFinder(table, `findDuplicate${T}`, typeName(\"insert\", T, affix)) : void 0;\n const duplicates = finder ? `\n${finder}\n` : \"\";\n const nestedCode = renderNestedSchemas(\n table,\n affix,\n coerceDates,\n typedJson,\n applyDefaults,\n nested\n );\n return `import * as ${NS} from 'effect/Schema';\n${schemaImport}${needsJson ? `\n${JSON_PREAMBLE}` : \"\"}\n${blocks.join(\"\\n\\n\")}\n${nestedCode}${duplicates}`;\n}\nvar EffectGenerator = class {\n constructor(analysis) {\n this.analysis = analysis;\n this.library = \"effect\";\n }\n async generate(opts) {\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n const out = path.resolve(process.cwd(), opts.outDir);\n const files = [];\n await fs.mkdir(out, { recursive: true });\n const affix = resolveAffix(opts);\n const coerceDates = opts.coerceDates ?? \"input\";\n const fileSuffix = opts.fileSuffix ?? DEFAULT_FILE_SUFFIX;\n const wantsTypes = opts.typedJson || opts.typedColumns;\n const typedJson = wantsTypes && opts.schemaPath ? {\n schemaSpecifier: resolveConfiguredImport(\n opts.schemaPath,\n out,\n process.cwd(),\n opts.importExtension\n ),\n allColumns: !!opts.typedColumns\n } : void 0;\n if (wantsTypes && !opts.schemaPath) {\n console.warn(\n \"[drzl] typedJson was requested but the schema path is unknown, so json columns keep their wide type.\"\n );\n }\n const nestedDepth = opts.nestedSchemas ? resolveNestedDepth(opts.nestedDepth, (m) => console.warn(m)) : 0;\n for (const table of this.analysis.tables) {\n const filePath = path.join(out, moduleFileName(table.tsName, fileSuffix));\n const code = renderTableSchemas(\n table,\n affix,\n coerceDates,\n typedJson,\n !!opts.applyDefaults,\n !!opts?.duplicateFinder,\n opts.nestedSchemas ? nestedPlansFor(table, this.analysis, nestedDepth) : {}\n );\n const formatted = await formatCode(\n buildHeader(opts.outputHeader) + code,\n filePath,\n opts.format\n );\n await fs.writeFile(filePath, formatted, \"utf8\");\n files.push(filePath);\n }\n const indexPath = path.join(out, \"index.ts\");\n const indexFormatted = await formatCode(\n buildHeader(opts.outputHeader) + this.defaultIndex(this.analysis, opts),\n indexPath,\n opts.format\n );\n await fs.writeFile(indexPath, indexFormatted, \"utf8\");\n files.push(indexPath);\n return files;\n }\n renderTable(table, opts) {\n return renderTableSchemas(\n table,\n resolveAffix(opts),\n opts?.coerceDates ?? \"input\",\n void 0,\n !!opts?.applyDefaults,\n !!opts?.duplicateFinder\n );\n }\n defaultIndex(analysis, opts) {\n const fileSuffix = opts.fileSuffix ?? DEFAULT_FILE_SUFFIX;\n return analysis.tables.map(\n (t) => `export * from '${moduleSpecifier(t.tsName, fileSuffix, opts.importExtension)}';`\n ).join(\"\\n\") + \"\\n\";\n }\n};\nvar index_default = EffectGenerator;\nfunction buildHeader(h) {\n if (h && h.enabled === false) return \"\";\n const text = h?.text?.trim();\n const lines = text ? text.split(/\\r?\\n/).map((l) => `// ${l}`) : [\n \"// Generated by DRZL (@drzl/*)\",\n \"// Generated output is granted to you under your project's license.\",\n \"// You may use, copy, modify, and distribute without attribution.\"\n ];\n return lines.join(\"\\n\") + \"\\n\\n\";\n}\nexport {\n EffectGenerator,\n index_default as default\n};\n","#!/usr/bin/env node\nimport { SchemaAnalyzer } from '@drzl/analyzer';\nimport { ORPCGenerator } from '@drzl/generator-orpc';\nimport chalk from 'chalk';\nimport chokidar from 'chokidar';\nimport cliProgress from 'cli-progress';\nimport { Command } from 'commander';\nimport * as path from 'node:path';\nimport ora from 'ora';\nimport { jsonSchemaOptions } from './json-schema-options.js';\nimport { trpcOptions } from './trpc-options.js';\nimport { validationOptions } from './validation-options';\nimport {\n computeGeneratorOutputDirs,\n computeWatchTargets,\n DrzlConfig,\n filterTables,\n loadConfig,\n} from './config.js';\nimport { buildDoctorReport, renderDoctorReport } from './doctor.js';\nimport { diffSnapshots, restoreSnapshot, snapshotAll } from './drift.js';\nimport { GeneratorNotInstalledError, loadGenerator } from './generator-loader.js';\nimport { maybeShowSponsorMessage } from './sponsor.js';\nimport { CLI_VERSION } from './version.js';\n\n/**\n * Say what went wrong with a generator, distinguishing the two things that can.\n *\n * Every branch below used to print \"<name> generator missing. Install with: npm install\n * @drzl/generator-<name>\" for anything at all that threw, with the real reason on a trailing\n * \"Error details\" line. A generator that was installed and merely failed therefore sent its user\n * to reinstall a package they already had, and the sentence that would have told them what\n * actually happened was the one written as a footnote.\n *\n * `loadGenerator` marks the one case that is an install problem, so the package name comes off the\n * error rather than being repeated here beside the `import()` that already spells it.\n */\nfunction reportGeneratorFailure(kind: string, e: unknown): void {\n if (e instanceof GeneratorNotInstalledError) {\n console.error(\n chalk.red(`The ${kind} generator is not installed.`),\n chalk.yellow(`\\nInstall with: npm install ${e.specifier}`)\n );\n return;\n }\n console.error(chalk.red(`The ${kind} generator failed:`), (e as any)?.message ?? e);\n}\n\nconst program = new Command();\nprogram.name('drzl').description('DRZL - Drizzle Developer Toolkit').version(CLI_VERSION);\nprogram.addHelpText(\n 'afterAll',\n `\\nNeed a template, adapter, or generator DRZL doesn't ship yet?\\n→ DM @omardulaimidev on X: https://x.com/omardulaimidev\\n`\n);\n\nprogram\n .command('analyze')\n .argument('<schema>', 'path to drizzle schema (TS)')\n .option('--relations', 'include relations', true)\n .option('--validate', 'validate constraints', true)\n .option('--out <file>', 'write analysis JSON to file')\n .option('--json', 'print JSON to stdout (overrides --out)', false)\n .action(async (schema: string, opts: any) => {\n try {\n const analyzer = new SchemaAnalyzer(schema);\n const spinner = !opts.json ? ora('Analyzing schema...').start() : null;\n const start = Date.now();\n const res = await analyzer.analyze({\n includeRelations: !!opts.relations,\n validateConstraints: !!opts.validate,\n });\n const ms = Date.now() - start;\n const json = JSON.stringify(res, null, 2);\n if (opts.json) {\n console.log(json);\n } else if (opts.out) {\n const fs = await import('node:fs/promises');\n await fs.writeFile(opts.out, json, 'utf8');\n spinner?.succeed(chalk.green(`Analysis written to ${opts.out} in ${ms}ms`));\n } else {\n spinner?.succeed(chalk.green(`Analyzed in ${ms}ms`));\n console.log(json);\n }\n process.exit(res.issues.some((i) => i.level === 'error') ? 2 : 0);\n } catch (e: any) {\n const msg = e?.message ?? String(e);\n if (opts.json)\n console.log(JSON.stringify({ event: 'error', code: 'DRZL_CLI_ANALYZE', message: msg }));\n else\n console.error(\n chalk.red('Analyze failed (DRZL_CLI_ANALYZE):'),\n msg,\n '\\nTip: run with --json for structured output.'\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('doctor')\n .description('Report what DRZL cannot type or enforce in your schema, and why')\n .argument('[schema]', 'path to drizzle schema (TS); defaults to the schema in drzl.config')\n .option('-c, --config <path>', 'path to drzl.config, read when no schema argument is given')\n .option('--json', 'print the report as JSON instead of prose', false)\n .option('--strict', 'exit 2 when anything is reported', false)\n .action(async (schema: string | undefined, opts: any) => {\n try {\n // A schema path argument, like `analyze`, or the one already named in the config, since a\n // user who has a config should not have to retype the path they put in it.\n let target = schema;\n if (!target) {\n const cfg = await loadConfig(opts.config);\n target = cfg?.schema;\n }\n if (!target) {\n const msg = 'No schema given. Pass a path, or run from a directory with a drzl.config.';\n if (opts.json)\n console.log(JSON.stringify({ event: 'error', code: 'DRZL_CLI_DOCTOR', message: msg }));\n else console.error(chalk.red('Doctor failed (DRZL_CLI_DOCTOR):'), msg);\n process.exit(1);\n return;\n }\n\n const analyzer = new SchemaAnalyzer(target);\n // Both on, unconditionally. Doctor's job is to look at everything, and a warning that only\n // appears when relations are read would be hidden by a flag turning them off.\n const analysis = await analyzer.analyze({\n includeRelations: true,\n validateConstraints: true,\n });\n const report = buildDoctorReport(analysis, target);\n\n if (opts.json) console.log(JSON.stringify(report, null, 2));\n else console.log(renderDoctorReport(report));\n\n // An error-level issue means the schema was never read: the file is missing, or importing it\n // threw. There is no report to act on, so this exits like `analyze`'s failure path rather\n // than pretending the empty analysis was a clean bill of health.\n if (report.findings.some((f) => f.level === 'error')) {\n process.exit(1);\n return;\n }\n // Zero by default, and that is the whole point. A schema carrying a customType or a CHECK\n // this parser will not guess at is normal and usable, and a doctor that failed every\n // pipeline reading one would be switched off within a week. `--strict` is the opt-in.\n process.exit(opts.strict && report.findings.length ? 2 : 0);\n } catch (e: any) {\n const msg = e?.message ?? String(e);\n if (opts.json)\n console.log(JSON.stringify({ event: 'error', code: 'DRZL_CLI_DOCTOR', message: msg }));\n else\n console.error(\n chalk.red('Doctor failed (DRZL_CLI_DOCTOR):'),\n msg,\n '\\nTip: run with --json for structured output.'\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('generate')\n .description('Run configured generators (drzl.config.*)')\n .option('-c, --config <path>', 'path to drzl.config')\n .option(\n '--check',\n 'regenerate and fail if the result differs from what is on disk, without changing it'\n )\n .action(async (opts: any) => {\n try {\n const cfg = await loadConfig(opts.config);\n if (!cfg) {\n console.error(\n chalk.red('No config found (DRZL_CFG_001). Create drzl.config.ts or pass --config.')\n );\n process.exit(2);\n return;\n }\n const analyzer = new SchemaAnalyzer(cfg.schema);\n const spinner = ora('Analyzing...').start();\n const t0 = Date.now();\n const analysis = await analyzer.analyze({\n includeRelations: cfg.analyzer.includeRelations,\n validateConstraints: cfg.analyzer.validateConstraints,\n includeHeuristicRelations: cfg.analyzer.includeHeuristicRelations,\n });\n // Applied before any generator sees the analysis, so every one of them honours it without\n // needing to know the option exists.\n analysis.tables = filterTables(analysis.tables, cfg);\n spinner.succeed(`Analysis complete in ${Date.now() - t0}ms`);\n reportWideColumns(analysis.issues);\n // Under --check the existing output is captured before anything overwrites it, so the\n // regenerated result can be compared against it and the tree put back either way.\n const driftDirs = computeGeneratorOutputDirs(cfg);\n const driftBefore = opts.check ? await snapshotAll(driftDirs) : null;\n const progress = new cliProgress.SingleBar(\n { hideCursor: true },\n cliProgress.Presets.shades_classic\n );\n const total = analysis.tables.length || 1;\n progress.start(total, 0);\n // Where the service generator is actually writing, so a router template that imports\n // services spells a path that exists. Templates default this to 'src/services', and with\n // nothing passed that default was used no matter where the services really went, emitting\n // an import of a module that was never created. Must match the `g.path ?? 'src/services'`\n // used by the service branch below.\n const servicesDir =\n cfg.generators.find((x: { kind: string }) => x.kind === 'service')?.path ?? 'src/services';\n for (const g of cfg.generators) {\n if (g.kind === 'orpc') {\n const gen = new ORPCGenerator(analysis);\n const { files } = await gen.generate({\n outputDir: cfg.outDir,\n template: g.template,\n includeRelations: g.includeRelations,\n naming: g.naming,\n outputHeader: g.outputHeader,\n format: g.format,\n templateOptions: g.templateOptions,\n importExtension: g.importExtension,\n validation: g.validation,\n // Documented on this generator since it was added and never reachable from a config\n // file, because the config schema had no such key and zod stripped it in silence.\n databaseInjection: g.databaseInjection,\n servicesDir,\n onProgress: ({ index }) => progress.update(index),\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (${g.kind}): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } else if (g.kind === 'trpc') {\n try {\n // An optional dependency, like the json-schema generator and unlike oRPC. A package\n // that has never been published cannot publish through npm's trusted-publisher OIDC\n // flow, so its first version has to go out by hand; naming it as a hard dependency of\n // the CLI in the same release breaks `npm i @drzl/cli` for everyone until it exists.\n // A missing optional dependency is skipped by the installer rather than failing it,\n // which is why this one really can be absent on an ordinary install.\n const { TRPCGenerator } = await loadGenerator(\n '@drzl/generator-trpc',\n () => import('@drzl/generator-trpc')\n );\n const gen = new TRPCGenerator(analysis);\n const { files } = await gen.generate({\n ...trpcOptions(g, cfg, servicesDir),\n onProgress: ({ index }: { index: number }) => progress.update(index),\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (trpc): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n } else if (g.kind === 'service') {\n try {\n const { ServiceGenerator } = await loadGenerator(\n '@drzl/generator-service',\n () => import('@drzl/generator-service')\n );\n const gen = new ServiceGenerator(analysis);\n const target = g.path ?? 'src/services';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n dataAccess: g.dataAccess,\n dbImportPath: g.dbImportPath,\n schemaImportPath: g.schemaImportPath,\n importExtension: g.importExtension,\n // The other half of `databaseInjection`. A router generator in injection mode\n // emits `Service.getById(ctx.db, id)`, and only a service generated in the same\n // mode has a `db` parameter to receive it. This branch never passed the option, so\n // the two halves of one generated project disagreed about the signature.\n databaseInjection: g.databaseInjection,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (service): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n } else if (g.kind === 'zod') {\n try {\n const { ZodGenerator } = await loadGenerator(\n '@drzl/generator-zod',\n () => import('@drzl/generator-zod')\n );\n const gen = new ZodGenerator(analysis);\n const target = g.path ?? 'src/validators/zod';\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: true }) as never\n );\n progress.stop();\n ora().succeed(chalk.green(`Generated (zod): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n } else if (g.kind === 'valibot') {\n try {\n const { ValibotGenerator } = await loadGenerator(\n '@drzl/generator-valibot',\n () => import('@drzl/generator-valibot')\n );\n const gen = new ValibotGenerator(analysis);\n const target = g.path ?? 'src/validators/valibot';\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: true }) as never\n );\n progress.stop();\n ora().succeed(chalk.green(`Generated (valibot): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n } else if (g.kind === 'arktype') {\n try {\n const { ArkTypeGenerator } = await loadGenerator(\n '@drzl/generator-arktype',\n () => import('@drzl/generator-arktype')\n );\n const gen = new ArkTypeGenerator(analysis);\n const target = g.path ?? 'src/validators/arktype';\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: false }) as never\n );\n progress.stop();\n ora().succeed(chalk.green(`Generated (arktype): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n } else if (g.kind === 'json-schema') {\n try {\n // An optional dependency, unlike the other generators, until its npm trusted publisher\n // exists. A missing optional dependency is skipped rather than failing the install,\n // which is what keeps `npm i @drzl/cli` working meanwhile, and is why this one really\n // can be absent on a normal install.\n const { JsonSchemaGenerator } = await loadGenerator(\n '@drzl/generator-json-schema',\n () => import('@drzl/generator-json-schema')\n );\n const gen = new JsonSchemaGenerator(analysis);\n const target = g.path ?? 'src/validators/json-schema';\n const files = await gen.generate(jsonSchemaOptions(g, cfg, target) as never);\n progress.stop();\n ora().succeed(chalk.green(`Generated (json-schema): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n } else if (g.kind === 'typebox') {\n try {\n const { TypeBoxGenerator } = await loadGenerator(\n '@drzl/generator-typebox',\n () => import('@drzl/generator-typebox')\n );\n const gen = new TypeBoxGenerator(analysis);\n const target = g.path ?? 'src/validators/typebox';\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: true }) as never\n );\n progress.stop();\n ora().succeed(chalk.green(`Generated (typebox): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n } else if (g.kind === 'effect') {\n try {\n const { EffectGenerator } = await loadGenerator(\n '@drzl/generator-effect',\n () => import('@drzl/generator-effect')\n );\n const gen = new EffectGenerator(analysis);\n const target = g.path ?? 'src/validators/effect';\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: true }) as never\n );\n progress.stop();\n ora().succeed(chalk.green(`Generated (effect): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n }\n }\n if (driftBefore) {\n const after = await snapshotAll(driftDirs);\n const drift = diffSnapshots(driftBefore, after);\n // Restored whether or not anything drifted, so `--check` never leaves the tree altered.\n await restoreSnapshot(driftBefore, after);\n\n if (drift.length) {\n console.error(chalk.red(`\\nGenerated output is out of date (${drift.length} file(s)):`));\n for (const d of drift) {\n const mark = d.status === 'added' ? '+' : d.status === 'removed' ? '-' : '~';\n console.error(\n ` ${mark} ${chalk.yellow(d.status.padEnd(8))} ${path.relative(process.cwd(), d.file)}`\n );\n }\n console.error(\n chalk.dim(\n '\\nRun `drzl generate` and commit the result. Nothing was written by this check.'\n )\n );\n process.exit(1);\n }\n console.log(chalk.green('Generated output is up to date.'));\n return;\n }\n\n if (cfg.generators.length) {\n maybeShowSponsorMessage({ reason: 'generate' });\n }\n } catch (e: any) {\n console.error(\n chalk.red('Generate failed (DRZL_GEN_001):'),\n e?.message ?? e,\n '\\nTip: check your drzl.config.ts and template path.'\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('generate:orpc')\n .argument('<schema>', 'path to drizzle schema (TS)')\n .option('-o, --outDir <dir>', 'output directory', 'src/api')\n .option('--template <name>', 'template name', 'standard')\n .option('--includeRelations', 'include relation endpoints')\n .action(async (schema: string, opts: any) => {\n try {\n const analyzer = new SchemaAnalyzer(schema);\n const analysis = await analyzer.analyze({\n includeRelations: !!opts.includeRelations,\n validateConstraints: true,\n });\n const gen = new ORPCGenerator(analysis);\n const { files } = await gen.generate({\n outputDir: opts.outDir,\n template: opts.template,\n includeRelations: !!opts.includeRelations,\n });\n console.log(chalk.green(`Generated:`), files.map((f) => chalk.cyan(f)).join(', '));\n maybeShowSponsorMessage({ reason: 'generate:orpc' });\n } catch (e: any) {\n console.error(chalk.red('Generate orpc failed:'), e?.message ?? e);\n process.exit(1);\n }\n });\n\nprogram\n .command('generate:trpc')\n .argument('<schema>', 'path to drizzle schema (TS)')\n .option('-o, --outDir <dir>', 'output directory', 'src/api')\n .option('--template <name>', 'standard | service', 'standard')\n .option('--includeRelations', 'include relation endpoints')\n .option('--servicesDir <dir>', 'where the service generator writes', 'src/services')\n .action(async (schema: string, opts: any) => {\n try {\n const analyzer = new SchemaAnalyzer(schema);\n const analysis = await analyzer.analyze({\n includeRelations: !!opts.includeRelations,\n validateConstraints: true,\n });\n const { TRPCGenerator } = await loadGenerator(\n '@drzl/generator-trpc',\n () => import('@drzl/generator-trpc')\n );\n const gen = new TRPCGenerator(analysis);\n const { files } = await gen.generate({\n outputDir: opts.outDir,\n template: opts.template,\n includeRelations: !!opts.includeRelations,\n // Only consulted by `--template service`, and passed unconditionally so this command\n // cannot become the branch that forgets it.\n servicesDir: opts.servicesDir,\n });\n console.log(chalk.green(`Generated:`), files.map((f: string) => chalk.cyan(f)).join(', '));\n maybeShowSponsorMessage({ reason: 'generate:trpc' });\n } catch (e: any) {\n reportGeneratorFailure('trpc', e);\n process.exit(1);\n }\n });\n\nprogram\n .command('watch')\n .description('Watch schema and regenerate on changes')\n .option('-c, --config <path>', 'path to drzl.config')\n .option('--pipeline <name>', 'all | analyze | generate-orpc | generate-trpc', 'all')\n .option('--debounce <ms>', 'debounce ms', '200')\n .option('--json', 'emit JSON logs', false)\n .option('--poll', 'force polling (helps WSL/Docker/remote FS)', false)\n .action(async (opts: any) => {\n let cfg = await loadConfig(opts.config);\n if (!cfg) {\n console.error(chalk.red('No config found. Create drzl.config.ts or pass --config.'));\n process.exit(2);\n return;\n }\n\n const abs = (p: string) => path.resolve(process.cwd(), p);\n const isInside = (child: string, parent: string) => {\n const rel = path.relative(parent, child);\n return !!rel && !rel.startsWith('..') && !path.isAbsolute(rel);\n };\n\n const ignoredOutDirs = new Set<string>(computeGeneratorOutputDirs(cfg).map(abs));\n const currentTargets = new Set<string>(computeWatchTargets(cfg).map(abs));\n\n const syncWatcherTargets = (watcher: import('chokidar').FSWatcher, next: Set<string>) => {\n const add: string[] = [];\n const del: string[] = [];\n for (const p of next) if (!currentTargets.has(p)) add.push(p);\n for (const p of currentTargets) if (!next.has(p)) del.push(p);\n if (add.length) watcher.add(add);\n if (del.length) watcher.unwatch(del);\n currentTargets.clear();\n next.forEach((p) => currentTargets.add(p));\n };\n\n const rebuildIgnoreDirsFrom = (cfgNow: DrzlConfig) => {\n ignoredOutDirs.clear();\n for (const d of computeGeneratorOutputDirs(cfgNow)) ignoredOutDirs.add(abs(d));\n };\n\n // Watch targets are directories now, because chokidar v4 dropped glob support. The\n // extensions the old `**/*.{ts,tsx,js}` glob selected therefore have to be filtered here\n // instead, or every unrelated file in the schema's directory would trigger a rebuild.\n const WATCHED_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.mjs', '.cjs']);\n\n const ignoredFn = (p: string, stats?: { isDirectory(): boolean }) => {\n const full = abs(p);\n for (const dir of ignoredOutDirs) {\n if (full === dir || isInside(full, dir)) return true;\n }\n // A directory is never ignored: chokidar has to descend into it to reach the files.\n if (stats?.isDirectory()) return false;\n const ext = path.extname(full);\n // Without stats chokidar is asking about a path it has not resolved yet. An extensionless\n // one is almost certainly a directory, so let it through and decide once it is known.\n if (!ext) return false;\n return !WATCHED_EXTENSIONS.has(ext);\n };\n\n const watcher = chokidar.watch(Array.from(currentTargets), {\n ignoreInitial: true,\n awaitWriteFinish: { stabilityThreshold: 400, pollInterval: 50 },\n usePolling: !!opts.poll,\n ignored: ignoredFn,\n });\n\n const logTrigger = (type: 'add' | 'change' | 'unlink', file: string) => {\n if (opts.json) console.log(JSON.stringify({ event: 'trigger', type, file }));\n };\n\n watcher\n .on('add', (p) => {\n logTrigger('add', p);\n trigger(p);\n })\n .on('change', (p) => {\n logTrigger('change', p);\n trigger(p);\n })\n .on('unlink', (p) => {\n logTrigger('unlink', p);\n trigger(p);\n });\n\n let lastFiles: string[] = [];\n\n const run = async () => {\n try {\n const reloaded = await loadConfig(opts.config);\n if (!reloaded) throw new Error('Config disappeared during watch.');\n cfg = reloaded;\n\n rebuildIgnoreDirsFrom(cfg);\n const nextTargets = new Set<string>(computeWatchTargets(cfg).map(abs));\n syncWatcherTargets(watcher, nextTargets);\n\n if (!opts.json) console.clear();\n\n if (opts.json) {\n console.log(\n JSON.stringify({\n event: 'watch_config_applied',\n targets: Array.from(currentTargets),\n ignored: Array.from(ignoredOutDirs),\n })\n );\n }\n\n const analyzer = new SchemaAnalyzer(cfg.schema);\n const analysis = await analyzer.analyze({\n includeRelations: cfg.analyzer.includeRelations,\n validateConstraints: cfg.analyzer.validateConstraints,\n includeHeuristicRelations: cfg.analyzer.includeHeuristicRelations,\n });\n analysis.tables = filterTables(analysis.tables, cfg);\n if (!opts.json) reportWideColumns(analysis.issues);\n\n if (opts.pipeline === 'analyze') {\n if (opts.json) {\n console.log(\n JSON.stringify({\n event: 'analyze_complete',\n issues: analysis.issues,\n tables: analysis.tables.length,\n })\n );\n } else {\n console.log(chalk.green('Analyze complete.'));\n }\n return;\n }\n\n const newFiles: string[] = [];\n\n // Must match the `g.path ?? 'src/services'` the service branch below uses, or a router\n // template that imports services spells a path nothing ever wrote. `generate` has always\n // computed this; `watch` did not, so a rebuild silently emitted the default.\n const servicesDir =\n cfg.generators.find((x: { kind: string }) => x.kind === 'service')?.path ??\n 'src/services';\n\n const PIPELINE_KINDS: Record<string, string> = {\n 'generate-orpc': 'orpc',\n 'generate-trpc': 'trpc',\n };\n\n for (const g of cfg.generators) {\n if (opts.pipeline !== 'all' && PIPELINE_KINDS[opts.pipeline] !== g.kind) {\n continue;\n }\n\n if (g.kind === 'orpc') {\n const gen = new ORPCGenerator(analysis);\n const { files } = await gen.generate({\n outputDir: cfg.outDir,\n template: g.template,\n includeRelations: g.includeRelations,\n naming: g.naming,\n outputHeader: g.outputHeader,\n format: g.format,\n templateOptions: g.templateOptions,\n importExtension: g.importExtension,\n validation: g.validation,\n databaseInjection: g.databaseInjection,\n servicesDir,\n });\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (${g.kind}):`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } else if (g.kind === 'trpc') {\n try {\n const { TRPCGenerator } = await loadGenerator(\n '@drzl/generator-trpc',\n () => import('@drzl/generator-trpc')\n );\n const gen = new TRPCGenerator(analysis);\n // The same builder `generate` uses, so the two dispatch loops cannot disagree\n // about what this generator is given.\n const { files } = await gen.generate(trpcOptions(g, cfg, servicesDir));\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (trpc): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n reportGeneratorFailure(g.kind, e);\n return;\n }\n } else if (g.kind === 'service') {\n try {\n const { ServiceGenerator } = await loadGenerator(\n '@drzl/generator-service',\n () => import('@drzl/generator-service')\n );\n const gen = new ServiceGenerator(analysis);\n const target = g.path ?? 'src/services';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n dataAccess: g.dataAccess,\n dbImportPath: g.dbImportPath,\n schemaImportPath: g.schemaImportPath,\n importExtension: g.importExtension,\n databaseInjection: g.databaseInjection,\n });\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (service): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n reportGeneratorFailure(g.kind, e);\n return;\n }\n } else if (g.kind === 'zod') {\n try {\n const { ZodGenerator } = await loadGenerator(\n '@drzl/generator-zod',\n () => import('@drzl/generator-zod')\n );\n const gen = new ZodGenerator(analysis);\n const target = g.path ?? 'src/validators/zod';\n // The same builder `generate` uses. Assembled by hand here until now, and every\n // option added since the builder existed was therefore absent from a watch rebuild:\n // `coerceDates`, `applyDefaults`, `typedJson`, `typedColumns` and `duplicateFinder`\n // were all dropped, so the first save after starting `drzl watch` silently replaced\n // correct output with output generated from defaults.\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: true }) as never\n );\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (zod): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n reportGeneratorFailure(g.kind, e);\n return;\n }\n } else if (g.kind === 'valibot') {\n try {\n const { ValibotGenerator } = await loadGenerator(\n '@drzl/generator-valibot',\n () => import('@drzl/generator-valibot')\n );\n const gen = new ValibotGenerator(analysis);\n const target = g.path ?? 'src/validators/valibot';\n // The same builder `generate` uses. Assembled by hand here until now, and every\n // option added since the builder existed was therefore absent from a watch rebuild:\n // `coerceDates`, `applyDefaults`, `typedJson`, `typedColumns` and `duplicateFinder`\n // were all dropped, so the first save after starting `drzl watch` silently replaced\n // correct output with output generated from defaults.\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: true }) as never\n );\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (valibot): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n reportGeneratorFailure(g.kind, e);\n return;\n }\n } else if (g.kind === 'arktype') {\n try {\n const { ArkTypeGenerator } = await loadGenerator(\n '@drzl/generator-arktype',\n () => import('@drzl/generator-arktype')\n );\n const gen = new ArkTypeGenerator(analysis);\n const target = g.path ?? 'src/validators/arktype';\n // The same builder `generate` uses. Assembled by hand here until now, and every\n // option added since the builder existed was therefore absent from a watch rebuild:\n // `coerceDates`, `applyDefaults`, `typedJson`, `typedColumns` and `duplicateFinder`\n // were all dropped, so the first save after starting `drzl watch` silently replaced\n // correct output with output generated from defaults.\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: false }) as never\n );\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (arktype): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n reportGeneratorFailure(g.kind, e);\n return;\n }\n } else if (g.kind === 'typebox') {\n try {\n const { TypeBoxGenerator } = await loadGenerator(\n '@drzl/generator-typebox',\n () => import('@drzl/generator-typebox')\n );\n const gen = new TypeBoxGenerator(analysis);\n const target = g.path ?? 'src/validators/typebox';\n // The same builder `generate` uses. Assembled by hand here until now, and every\n // option added since the builder existed was therefore absent from a watch rebuild:\n // `coerceDates`, `applyDefaults`, `typedJson`, `typedColumns` and `duplicateFinder`\n // were all dropped, so the first save after starting `drzl watch` silently replaced\n // correct output with output generated from defaults.\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: true }) as never\n );\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (typebox): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n reportGeneratorFailure(g.kind, e);\n return;\n }\n } else if (g.kind === 'effect') {\n try {\n const { EffectGenerator } = await loadGenerator(\n '@drzl/generator-effect',\n () => import('@drzl/generator-effect')\n );\n const gen = new EffectGenerator(analysis);\n const target = g.path ?? 'src/validators/effect';\n // The same builder `generate` uses, and the same default path, which is also the one\n // `computeGeneratorOutputDirs` has to spell: a watcher that does not ignore this\n // directory regenerates on its own output forever.\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: true }) as never\n );\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (effect): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n reportGeneratorFailure(g.kind, e);\n return;\n }\n } else if (g.kind === 'json-schema') {\n try {\n const { JsonSchemaGenerator } = await loadGenerator(\n '@drzl/generator-json-schema',\n () => import('@drzl/generator-json-schema')\n );\n const gen = new JsonSchemaGenerator(analysis);\n const target = g.path ?? 'src/validators/json-schema';\n // The same builder `generate` uses, so the two dispatch loops cannot disagree about\n // what this generator is given.\n const files = await gen.generate(jsonSchemaOptions(g, cfg, target) as never);\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (json-schema): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n reportGeneratorFailure(g.kind, e);\n return;\n }\n }\n }\n\n const added = newFiles.filter((f) => !lastFiles.includes(f));\n const removed = lastFiles.filter((f) => !newFiles.includes(f));\n opts.json\n ? console.log(JSON.stringify({ event: 'diff', added, removed }))\n : (() => {\n if (added.length) console.log(chalk.blue(`Added: ${added.join(', ')}`));\n if (removed.length) console.log(chalk.yellow(`Removed: ${removed.join(', ')}`));\n })();\n if (newFiles.length && !opts.json) {\n const reason =\n opts.pipeline && opts.pipeline !== 'all' ? `watch:${opts.pipeline}` : 'watch';\n maybeShowSponsorMessage({ reason });\n }\n lastFiles = newFiles;\n } catch (e: any) {\n opts.json\n ? console.log(JSON.stringify({ event: 'error', message: String(e?.message ?? e) }))\n : console.error(chalk.red('Watch pipeline failed:'), e?.message ?? e);\n }\n };\n\n const debounced = Number(opts.debounce) || 200;\n let timer: NodeJS.Timeout | null = null;\n const trigger = (file?: string) => {\n if (file) {\n const full = abs(file);\n for (const dir of ignoredOutDirs) {\n if (full === dir || isInside(full, dir)) return;\n }\n }\n if (timer) clearTimeout(timer);\n timer = setTimeout(run, debounced);\n };\n\n if (opts.json) {\n console.log(\n JSON.stringify({\n event: 'watching',\n targets: Array.from(currentTargets),\n ignored: Array.from(ignoredOutDirs),\n })\n );\n } else {\n console.log(\n chalk.gray(\n 'Watching:\\n ' +\n Array.from(currentTargets)\n .map((p) => path.relative(process.cwd(), p))\n .join('\\n ')\n )\n );\n }\n\n watcher\n .on('add', (p) => trigger(p))\n .on('change', (p) => trigger(p))\n .on('unlink', (p) => trigger(p))\n .on('error', (err) => console.error(chalk.red('Watcher error:'), err));\n\n await run();\n });\n\nprogram\n .command('init')\n .description('Scaffold a drzl.config.ts')\n .option('-y, --yes', 'accept defaults')\n .action(async (_opts: any) => {\n const fs = await import('node:fs/promises');\n const path = await import('node:path');\n const target = path.resolve(process.cwd(), 'drzl.config.ts');\n // One router generator, not both: they default to the same `outDir` and would each write an\n // `index.ts` there, so a scaffold naming both would emit a config whose second generator\n // silently overwrote the first. Swapping the kind is a one-word edit; running both needs a\n // `path` on one of them, which is what the comment says.\n const template = `export default {\n schema: 'src/db/schema.ts',\n outDir: 'src/api',\n analyzer: { includeRelations: true, validateConstraints: true },\n generators: [\n // For tRPC instead: { kind: 'trpc', template: 'standard', includeRelations: true }\n // To run both, give one of them its own \\`path\\`; they share \\`outDir\\` otherwise.\n { kind: 'orpc', template: 'standard', includeRelations: true }\n ]\n} as const\\n`;\n try {\n await fs.writeFile(target, template, { flag: 'wx' });\n console.log(chalk.green(`Created ${target}`));\n } catch (e: any) {\n console.error(chalk.red('Init failed:'), e?.message ?? e);\n process.exit(1);\n }\n });\n\n/**\n * Tell the user which columns got a validator that accepts anything.\n *\n * This is the user-facing half of a check `verify-packed.sh` runs on this repository. Two real\n * bugs took exactly this shape, `.array()` and `pgEnum` columns coming back untyped on\n * drizzle-orm 0.4x, and the only way anyone noticed was reading the generated file. A user whose\n * schema uses a type nobody here has modelled gets the same silence, and no gate of ours helps\n * them.\n *\n * Printed once with a count rather than a line per column, so a schema with fifty custom types\n * stays readable.\n */\nfunction reportWideColumns(issues: Array<{ code?: string; message?: string; hint?: string }>) {\n const wide = issues.filter((i) => i.code === 'DRZL_ANL_UNKNOWN_COLUMN');\n if (!wide.length) return;\n console.warn(\n chalk.yellow(`\\n${wide.length} column${wide.length === 1 ? '' : 's'} could not be typed:`)\n );\n for (const i of wide.slice(0, 10)) console.warn(chalk.gray(` - ${i.message}`));\n if (wide.length > 10) console.warn(chalk.gray(` ... and ${wide.length - 10} more`));\n // One hint for the set, since they are almost always the same two.\n const hints = [...new Set(wide.map((i) => i.hint).filter(Boolean))];\n for (const h of hints) console.warn(chalk.gray(` ${h}`));\n // Untypeable columns are the only thing this line can see. A CHECK constraint the generators\n // decline produces no output at all and so cannot be counted here without parsing every one of\n // them on the generate path, which is what `doctor` is for.\n console.warn(chalk.gray(' Run `drzl doctor` for the full report.'));\n}\n\nprogram.parseAsync(process.argv);\n","/**\n * The options every validation generator receives, built in one place.\n *\n * Each generator branch used to assemble this by hand, and three documented options were\n * found silently dead as a result: `typedJson` never reached typebox, and `coerceDates` and\n * `applyDefaults` never reached anything but zod. The config parsed them, the CLI dropped them,\n * and the feature simply did nothing while nothing said so. Building it once removes the class\n * rather than fixing each instance.\n *\n * What stays per-generator is a real capability rather than an oversight, which is why it is\n * named as one.\n */\n\n/**\n * A generator entry from the config, loosely typed because the config schema owns its shape.\n *\n * Exported so a builder that wraps this one names the same keys rather than restating them: every\n * key listed in two places is a key the two can drift on, which is the failure this file exists to\n * remove.\n */\nexport type ValidationGeneratorConfig = {\n outputHeader?: unknown;\n format?: unknown;\n schemaSuffix?: unknown;\n fileSuffix?: unknown;\n importExtension?: unknown;\n affix?: unknown;\n coerceDates?: unknown;\n applyDefaults?: unknown;\n typedJson?: unknown;\n typedColumns?: unknown;\n duplicateFinder?: unknown;\n nestedSchemas?: unknown;\n nestedDepth?: unknown;\n};\n\nexport interface GeneratorCapabilities {\n /**\n * Whether the generator can reference a type from the schema module.\n *\n * `typedJson` and `typedColumns` both work by importing the table back and reading\n * `typeof table.$inferSelect['col']`, so a generator that cannot embed a TypeScript type in its\n * output cannot use either. ArkType is the case: it emits one string per field, and a type\n * reference has nowhere to live inside a string DSL.\n */\n schemaTypes?: boolean;\n}\n\nexport function validationOptions(\n g: ValidationGeneratorConfig,\n cfg: { schema?: unknown },\n outDir: string,\n caps: GeneratorCapabilities = {}\n): Record<string, unknown> {\n return {\n outDir,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n importExtension: g.importExtension,\n affix: g.affix,\n coerceDates: g.coerceDates,\n applyDefaults: g.applyDefaults,\n duplicateFinder: g.duplicateFinder,\n nestedSchemas: g.nestedSchemas,\n nestedDepth: g.nestedDepth,\n // Only where the generator can act on them, so an unsupported option is absent rather than\n // present and ignored.\n ...(caps.schemaTypes\n ? {\n // Needed by both: the reference is resolved relative to the emitted file.\n schemaPath: cfg.schema,\n typedJson: g.typedJson,\n typedColumns: g.typedColumns,\n }\n : {}),\n };\n}\n","/**\n * The options `@drzl/generator-json-schema` receives, built in one place.\n *\n * `generate` and `watch` each dispatch over `cfg.generators` in their own loop, and the json-schema\n * branch was assembled by hand in both. That arrangement has already dropped options silently more\n * than once here: five validation options never reached a watch rebuild, and `watch` had no\n * json-schema branch at all for a while, so that directory went stale from the first save onward.\n * None of it is visible in the wiring, because the option parses, the generator defaults it, and\n * the feature simply does nothing.\n *\n * One builder makes the two call sites the same object by construction rather than by review, and\n * `packages/cli/test/openapi-branch-parity.e2e.spec.ts` runs both commands and compares the bytes.\n */\nimport { validationOptions, type ValidationGeneratorConfig } from './validation-options.js';\n\n/** A generator entry from the config, loosely typed because the config schema owns its shape. */\ntype GeneratorConfig = ValidationGeneratorConfig & {\n path?: string;\n target?: unknown;\n components?: unknown;\n document?: unknown;\n includeRelations?: unknown;\n};\n\nexport function jsonSchemaOptions(\n g: GeneratorConfig,\n cfg: { schema?: unknown },\n outDir: string\n): Record<string, unknown> {\n return {\n // JSON Schema is data, so nothing it emits references a type from the schema module.\n ...validationOptions(g, cfg, outDir, { schemaTypes: false }),\n target: g.target,\n components: g.components,\n document: g.document,\n // Read only while emitting a document, where it adds `/users/{id}/posts`. The per-table\n // schemas are flat whatever it says.\n includeRelations: g.includeRelations,\n };\n}\n","import type { AffixOptions } from '@drzl/validation-core';\nimport {\n AFFIX_PROBE_TABLE,\n DEFAULT_IMPORT_EXTENSION,\n IMPORT_EXTENSIONS,\n NAME_MODES,\n resolveAffix,\n schemaName,\n validateAffix,\n} from '@drzl/validation-core';\nimport * as fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport * as path from 'node:path';\nimport { z } from 'zod';\n\nexport const NamingSchema = z\n .object({\n routerSuffix: z.string().default('Router'),\n procedureCase: z.enum(['camel', 'kebab', 'snake']).default('camel'),\n })\n .partial();\n\n/** One affix for every mode, or a per-mode map. Keys match drzl's internal mode names. */\nconst AffixValueSchema = z.union(\n [\n z.string(),\n z\n .object({\n insert: z.string().optional(),\n update: z.string().optional(),\n select: z.string().optional(),\n })\n .strict(),\n ],\n {\n error:\n 'Expected a string to use for every mode, or an object with any of the keys \"insert\", ' +\n '\"update\" and \"select\". Those keys are lowercase, matching the mode names drzl uses ' +\n 'everywhere else.',\n }\n);\n\nconst AffixPartSchema = z\n .object({\n prefix: AffixValueSchema.optional(),\n suffix: AffixValueSchema.optional(),\n })\n .strict();\n\nexport const AffixSchema = z\n .object({\n /**\n * `preserve` (default) keeps today's output: the Drizzle export name goes into the\n * identifier verbatim, so `export const users` yields `InsertusersSchema`. `pascal`\n * upper-camels it first, yielding `InsertUsersSchema`.\n */\n tableCase: z.enum(['preserve', 'pascal']).optional(),\n schema: AffixPartSchema.optional(),\n type: AffixPartSchema.optional(),\n })\n .strict();\n\n/**\n * How every relative specifier drzl invents spells its extension.\n *\n * The generated files land in the consumer's own source tree, so the consumer's\n * `moduleResolution` decides which forms resolve. `js` is the only one that resolves under\n * all of `bundler`, `node10`, `node16` and `nodenext` with no compiler flag, so it is the\n * default. See the `ImportExtension` docs in `@drzl/validation-core` for the measured grid.\n */\nexport const ImportExtensionSchema = z.enum(IMPORT_EXTENSIONS);\n\nexport const GeneratorSchema = z.object({\n kind: z.enum([\n 'orpc',\n 'trpc',\n 'service',\n 'zod',\n 'valibot',\n 'arktype',\n 'typebox',\n 'effect',\n 'json-schema',\n ]),\n /**\n * Overrides the top-level `importExtension` for this generator alone, for a project whose\n * generated directories are compiled by different tsconfigs.\n */\n importExtension: ImportExtensionSchema.optional(),\n template: z.string().optional(),\n includeRelations: z.boolean().optional(),\n /**\n * Type `json` and `jsonb` columns from the schema rather than leaving them wide.\n *\n * `.$type<T>()` is a compile-time cast, so no runtime-derived validator can see it and\n * `drizzle-orm/zod` types every json column as its generic `Json`. A generator can reference\n * `typeof <table>.$inferSelect['<column>']` instead, which is the declared type resolved by\n * TypeScript itself, so generics, unions and imported interfaces all work.\n *\n * Off by default because it makes the generated file import your schema module, as a\n * type-only import that disappears at build time.\n */\n // What a date column accepts. Documented on the zod generator and, until now, accepted by the\n // config parser and then dropped on the floor: the generators default it to 'input' themselves,\n // so setting it here changed nothing.\n coerceDates: z.enum(['input', 'all', 'none']).optional(),\n typedJson: z.boolean().optional(),\n // The wider form: every column's static type comes from Drizzle, not just the untyped ones.\n typedColumns: z.boolean().optional(),\n // Reproduce literal column defaults in the insert schema, so parsing fills them in.\n applyDefaults: z.boolean().optional(),\n /**\n * Emit `findDuplicate<Table>` beside the schemas: the rows in a batch that collide with an\n * earlier row on a unique constraint.\n *\n * Uniqueness is the one constraint a per-row validator structurally cannot see, since it is a\n * fact about the table rather than the row. This checks the half that needs no database.\n */\n duplicateFinder: z.boolean().optional(),\n /**\n * Emit `NestedInsert<Table>` and `NestedSelect<Table>` beside the flat schemas: the table plus\n * one key per relation, so `{ ...user, posts: [...] }` can be validated whole.\n *\n * Nothing in the Drizzle validator ecosystem describes that payload, and `db.insert` drops the\n * relation key silently rather than refusing it, so the children are never written and nothing\n * says so.\n */\n nestedSchemas: z.boolean().optional(),\n /**\n * How many levels of children a nested schema describes. Defaults to 1, capped at 3.\n *\n * Nesting is expanded inline rather than by reference, so this multiplies the emitted size, and\n * it is also what terminates a cycle: `users -> posts -> users` stops here.\n */\n nestedDepth: z.number().int().optional(),\n naming: NamingSchema.optional(),\n outputHeader: z\n .object({\n enabled: z.boolean().default(true).optional(),\n text: z.string().optional(),\n })\n .optional(),\n format: z\n .object({\n enabled: z.boolean().default(true).optional(),\n engine: z.enum(['auto', 'prettier', 'biome']).default('auto').optional(),\n configPath: z.string().optional(),\n })\n .optional(),\n /**\n * Which spelling of JSON Schema the `json-schema` generator emits.\n *\n * OpenAPI 3.0 is not an older superset of the 2020-12 draft, it is a different dialect: a\n * nullable type is `nullable: true` rather than a type array, and an exclusive bound is a\n * boolean flag beside the bound rather than its own keyword. An unknown keyword is not an error\n * in JSON Schema, it is ignored, so emitting the wrong dialect produces a document that\n * validates and then accepts the values the constraints exist to reject.\n */\n target: z.enum(['draft-2020-12', 'openapi-3.1', 'openapi-3.0']).optional(),\n /** Also emit `components.ts` for the `json-schema` generator, ready for an OpenAPI document. */\n components: z.boolean().optional(),\n /**\n * Also emit the whole OpenAPI document for the `json-schema` generator: paths, verbs, request and\n * response bodies per table, with `components.schemas` embedded so the file stands alone.\n *\n * `true` is the short form. The object form carries the three things a Drizzle schema genuinely\n * cannot say: what the API is called, where it is served, and which status code that particular\n * server answers a request that fails its schema with.\n */\n document: z\n .union([\n z.boolean(),\n z\n .object({\n enabled: z.boolean().optional(),\n /** `ts` (default) writes a module, `json` the file OpenAPI tooling reads directly. */\n format: z.enum(['ts', 'json', 'both']).optional(),\n info: z\n .object({\n title: z.string().optional(),\n version: z.string().optional(),\n description: z.string().optional(),\n })\n .strict()\n .optional(),\n /**\n * Omitted by default, which the specification reads as a single server at `/`: the\n * document describes whatever is serving it. A placeholder host would be a fabrication\n * that tooling then follows.\n */\n servers: z\n .array(z.object({ url: z.string(), description: z.string().optional() }).strict())\n .optional(),\n /** 400 by default. 422 is the other defensible reading; exactly one is emitted. */\n validationStatus: z.union([z.literal(400), z.literal(422)]).optional(),\n })\n .strict(),\n ])\n .optional(),\n // service generator specific options\n path: z.string().optional(),\n dataAccess: z.enum(['stub', 'drizzle']).default('stub').optional(),\n dbImportPath: z.string().optional(),\n schemaImportPath: z.string().optional(),\n // zod/valibot/arktype generator specific options\n schemaSuffix: z.string().optional(),\n fileSuffix: z.string().optional(),\n /**\n * Prefixes, suffixes and table casing for generated identifiers (zod/valibot/arktype).\n * Omitting it reproduces the output of every previous release exactly.\n */\n affix: AffixSchema.optional(),\n /**\n * How the router generators reach a database handle: through the request context, rather than\n * through a module-level import in the service layer.\n *\n * Documented on the oRPC generator since it was added and, until now, absent from this schema\n * entirely. `GeneratorSchema` is not strict, so zod stripped the key without a word and the\n * option did nothing at all when set from a config file. It was only ever reachable by calling\n * the generator's API directly.\n */\n databaseInjection: z\n .object({\n enabled: z.boolean().optional(),\n /** The type annotation for the injected handle, e.g. `DrizzleD1Database`. */\n databaseType: z.string().optional(),\n databaseTypeImport: z.object({ name: z.string(), from: z.string() }).optional(),\n })\n .optional(),\n // router validation sharing (orpc, trpc)\n validation: z\n .object({\n useShared: z.boolean().default(false).optional(),\n library: z.enum(['zod', 'valibot', 'arktype']).default('zod').optional(),\n importPath: z.string().optional(),\n schemaSuffix: z.string().optional(),\n /**\n * How the validation generator named its exports. Usually left unset: the CLI copies\n * it from the sibling generator whose `kind` matches `library`.\n */\n affix: AffixSchema.optional(),\n })\n .optional(),\n // template options\n templateOptions: z.record(z.string(), z.any()).optional(),\n});\n\nexport const AnalyzerSchema = z.object({\n includeRelations: z.boolean().default(true),\n validateConstraints: z.boolean().default(true),\n includeHeuristicRelations: z.boolean().default(false),\n});\n\nexport const ConfigSchema = z\n .object({\n schema: z.string(),\n outDir: z.string().default('src/api'),\n /**\n * Which tables to generate for, matched against the database table name.\n *\n * There was no way to say this, and every generator loops over every table it finds, so\n * DRZL emitted unauthenticated CRUD over whatever shared the schema file. That is noise for\n * a migrations table and a genuine leak for an auth one: Better Auth puts `user`, `session`,\n * `account` and `verification` alongside your own tables, and `account` holds\n * `accessToken`, `refreshToken`, `idToken` and `password`.\n *\n * Deliberately name-based and explicit rather than detecting any particular library. Auth\n * table names are all renameable, so a built-in list would miss renamed tables and, worse,\n * silently skip an ordinary table that happened to be called `user`, which is usually the\n * application's main entity.\n *\n * `exclude` wins over `include`. Patterns support `*`, matching within a name.\n */\n include: z.array(z.string()).optional(),\n exclude: z.array(z.string()).optional(),\n /**\n * How every relative specifier drzl invents spells its extension, for every generator.\n * A generator may override it. Defaults to `js`, which is the only form that resolves\n * under every `moduleResolution` without a compiler flag.\n */\n importExtension: ImportExtensionSchema.default(DEFAULT_IMPORT_EXTENSION),\n analyzer: AnalyzerSchema.default({\n includeRelations: true,\n validateConstraints: true,\n includeHeuristicRelations: false,\n }),\n generators: z\n .array(GeneratorSchema)\n .min(1)\n .default([{ kind: 'orpc' } as any]),\n })\n // Reject an affix before anything is written, rather than emitting a file that cannot\n // compile. Only `affix` is inspected; the legacy flat `schemaSuffix` is left alone so\n // configs that parse today keep parsing.\n .superRefine((cfg, ctx) => {\n cfg.generators.forEach((g, i) => {\n const report = (base: (string | number)[], affix?: AffixOptions, schemaSuffix?: string) => {\n for (const issue of validateAffix(affix, schemaSuffix)) {\n ctx.addIssue({\n code: 'custom',\n path: ['generators', i, ...base, ...issue.path],\n message: issue.message,\n });\n }\n };\n report(['affix'], g.affix as AffixOptions | undefined, g.schemaSuffix);\n report(\n ['validation', 'affix'],\n g.validation?.affix as AffixOptions | undefined,\n g.validation?.schemaSuffix\n );\n });\n });\n\n// ✨ Separate input vs output types\nexport type DrzlConfigInput = z.input<typeof ConfigSchema>;\nexport type DrzlConfig = z.output<typeof ConfigSchema>;\n\nexport function defineConfig<T extends DrzlConfigInput>(cfg: T): T {\n return cfg;\n}\n\ntype GeneratorConfig = DrzlConfig['generators'][number];\n\n/** The generators that emit an RPC router, and so share `outDir` and `validation`. */\nconst ROUTER_KINDS = new Set(['orpc', 'trpc']);\n\n/**\n * Where the tRPC generator writes.\n *\n * `outDir` by default, exactly like oRPC, so a config that names one router generator puts its\n * output where the top-level setting says. `path` is the escape hatch, and a config that runs\n * *both* router generators needs it: they would otherwise write two different `index.ts` files to\n * the same directory and the second would win.\n *\n * Exported because `computeGeneratorOutputDirs` has to agree with the dispatch in cli.ts about\n * this, and the watcher ignoring the wrong directory is an infinite regeneration loop.\n */\nexport function trpcOutDir(g: { path?: string }, cfg: { outDir: string }): string {\n return g.path ?? cfg.outDir;\n}\n\nfunction sharedSchemaNames(opts: { affix?: AffixOptions; schemaSuffix?: string }): string[] {\n const resolved = resolveAffix(opts);\n return NAME_MODES.map((mode) => schemaName(mode, AFFIX_PROBE_TABLE, resolved));\n}\n\n/**\n * Fill in cross-generator defaults and refuse configs whose generators would disagree.\n *\n * An oRPC router that imports shared schemas has to spell the exact names the validation\n * generator exported. Both sides used to be configured independently, so they could silently\n * drift into a router that does not compile. When an oRPC generator uses shared validation\n * and exactly one sibling generator produces that library, its `affix` is copied across.\n *\n * Deliberately conservative about the pre-existing flat `schemaSuffix`: a disagreement there\n * is only reported, never repaired, because repairing it would change the bytes an existing\n * config emits.\n *\n * `importExtension` is pushed down here too. A consumer compiles the whole generated tree\n * with one tsconfig, so the setting that has to hold is the same for every generator, and\n * every call site downstream can then read it off the generator without knowing about the\n * top-level default.\n */\nexport function resolveConfig(cfg: DrzlConfig): { config: DrzlConfig; warnings: string[] } {\n const warnings: string[] = [];\n const generators: GeneratorConfig[] = cfg.generators.map((g) => ({\n ...g,\n importExtension: g.importExtension ?? cfg.importExtension,\n }));\n\n for (const g of generators) {\n // Both router generators import the validation generators' exports by name, so both have to\n // spell them the way the sibling generator wrote them.\n if (!ROUTER_KINDS.has(g.kind)) continue;\n\n /**\n * `databaseInjection` describes a contract between two generators, not a setting of one.\n *\n * A router in injection mode emits `Service.getById(ctx.db, id)`, and only a service\n * generated in the same mode has a `db` parameter to receive it. Declared once on the router\n * and pushed onto the service generator here, exactly as `validation.affix` is pulled the\n * other way, because the alternative is writing the same block twice and a project that\n * compiles in halves and not as a whole.\n *\n * `@drzl/generator-service` honours the flag only while emitting real Drizzle queries: its\n * stub bodies take no database whatever they are told. That combination cannot be repaired\n * from here without changing what an existing config emits, so it is reported instead.\n */\n if (g.databaseInjection?.enabled) {\n for (const s of generators.filter((x) => x.kind === 'service')) {\n if (!s.databaseInjection) {\n s.databaseInjection = g.databaseInjection;\n } else if (!s.databaseInjection.enabled) {\n warnings.push(\n `drzl config: the \"${g.kind}\" generator sets databaseInjection.enabled while the ` +\n `\"service\" generator sets it to false. The router will call ` +\n `Service.method(ctx.db, ...) against services that take no database parameter, so ` +\n `the generated project will not compile. Set both, or neither.`\n );\n }\n if ((s.dataAccess ?? 'stub') === 'stub') {\n warnings.push(\n `drzl config: the \"${g.kind}\" generator sets databaseInjection.enabled, so its ` +\n `handlers call Service.method(ctx.db, ...). The \"service\" generator emits stub ` +\n `bodies, which take no database parameter whatever this option says, so those ` +\n `calls will not compile. Set dataAccess: 'drizzle' on the \"service\" generator, or ` +\n `drop databaseInjection.`\n );\n }\n }\n }\n\n const v = g.validation;\n if (!v?.useShared) continue;\n\n const library = v.library ?? 'zod';\n const siblings = generators.filter((s) => s.kind === library);\n // Zero siblings means the user points at a barrel drzl does not generate; more than one\n // means there is no single source of truth. Either way, leave the config alone.\n if (siblings.length !== 1) continue;\n const sibling = siblings[0];\n\n const theirs = sharedSchemaNames({\n affix: sibling.affix as AffixOptions | undefined,\n schemaSuffix: sibling.schemaSuffix,\n });\n\n if (!v.affix) {\n if (sibling.affix) {\n // Bake the sibling's fully resolved naming in, so its own schemaSuffix fallback\n // travels with it and cannot be re-interpreted on the oRPC side.\n g.validation = {\n ...v,\n affix: resolveAffix({\n affix: sibling.affix as AffixOptions,\n schemaSuffix: sibling.schemaSuffix,\n }),\n };\n continue;\n }\n const mine = sharedSchemaNames({ schemaSuffix: v.schemaSuffix });\n if (mine.join(',') !== theirs.join(',')) {\n warnings.push(\n `drzl config: the \"${g.kind}\" generator's validation.schemaSuffix ` +\n `(${JSON.stringify(v.schemaSuffix ?? 'Schema')}) does not match the \"${library}\" ` +\n `generator's schemaSuffix (${JSON.stringify(sibling.schemaSuffix ?? 'Schema')}). ` +\n `The router will import ${mine.join(', ')} but the \"${library}\" generator exports ` +\n `${theirs.join(', ')}, so the generated router will not compile. Set both to the ` +\n `same value, or move to \"affix\", which is inherited automatically.`\n );\n }\n continue;\n }\n\n const mine = sharedSchemaNames({\n affix: v.affix as AffixOptions,\n schemaSuffix: v.schemaSuffix,\n });\n if (mine.join(',') !== theirs.join(',')) {\n throw new Error(\n `drzl config: the \"${g.kind}\" generator imports shared ${library} schemas, but its ` +\n `validation.affix disagrees with the \"${library}\" generator's own naming. The router ` +\n `would import ${mine.join(', ')} while the \"${library}\" generator exports ` +\n `${theirs.join(', ')}. Make them match, or drop validation.affix and let it be ` +\n `inherited from the \"${library}\" generator.`\n );\n }\n }\n\n return { config: { ...cfg, generators }, warnings };\n}\n\n/**\n * Parse, then resolve cross-generator defaults. Both `generate` and `watch` go through\n * loadConfig, so putting the resolution here is what keeps the two duplicated generator\n * dispatch blocks in cli.ts from needing the logic twice.\n */\nfunction finalize(raw: unknown): DrzlConfig {\n const { config, warnings } = resolveConfig(ConfigSchema.parse(raw));\n for (const w of warnings) console.warn(w);\n return config;\n}\n\nexport async function loadConfig(customPath?: string): Promise<DrzlConfig | null> {\n const fsp = await import('node:fs/promises');\n\n const candidates = customPath\n ? [customPath]\n : [\n 'drzl.config.ts',\n 'drzl.config.mjs',\n 'drzl.config.js',\n 'drzl.config.cjs',\n 'drzl.config.json',\n ];\n\n for (const c of candidates) {\n const p = path.resolve(process.cwd(), c);\n try {\n await fsp.access(p);\n } catch {\n continue;\n }\n\n const ext = path.extname(p).toLowerCase();\n\n // JSON: read directly\n if (ext === '.json') {\n const raw = JSON.parse(await fsp.readFile(p, 'utf8'));\n return finalize(raw);\n }\n\n // Everything else (TS/JS/MJS/CJS) -> Jiti with cache-busting\n const { createJiti } = await import('jiti');\n const stat = await fsp.stat(p);\n\n // Passing __filename is safe in CJS; fallback to cwd if not defined.\n const base =\n typeof __filename !== 'undefined' ? __filename : path.join(process.cwd(), 'index.js');\n\n const jiti = createJiti(base, {\n moduleCache: false, // re-evaluate each time\n fsCache: true, // keep transform cache\n cacheVersion: String(stat.mtimeMs), // bump on edit\n interopDefault: true,\n tryNative: false, // <-- prevent native import of .ts\n // debug: true,\n }) as any;\n\n const mod = await jiti.import(p);\n const raw = mod?.default ?? mod;\n return finalize(raw);\n }\n\n return null;\n}\n\n/** Absolute output dirs for all generators (to ignore in watcher). */\nexport function computeGeneratorOutputDirs(cfg: DrzlConfig, cwd = process.cwd()): string[] {\n const abs = (p: string) => path.resolve(cwd, p);\n const dirs = new Set<string>();\n dirs.add(abs(cfg.outDir)); // orpc\n for (const g of cfg.generators) {\n if (g.kind === 'trpc') dirs.add(abs(trpcOutDir(g, cfg)));\n if (g.kind === 'service') dirs.add(abs(g.path ?? 'src/services'));\n if (g.kind === 'zod') dirs.add(abs(g.path ?? 'src/validators/zod'));\n if (g.kind === 'valibot') dirs.add(abs(g.path ?? 'src/validators/valibot'));\n if (g.kind === 'arktype') dirs.add(abs(g.path ?? 'src/validators/arktype'));\n if (g.kind === 'typebox') dirs.add(abs(g.path ?? 'src/validators/typebox'));\n if (g.kind === 'effect') dirs.add(abs(g.path ?? 'src/validators/effect'));\n if (g.kind === 'json-schema') dirs.add(abs(g.path ?? 'src/validators/json-schema'));\n }\n return [...dirs];\n}\n\n/** Resolve custom template directories (local path or installed package). */\nexport function resolveTemplateDirsSync(cfg: DrzlConfig, cwd = process.cwd()): string[] {\n const results: string[] = [];\n const req = createRequire(\n typeof __filename !== 'undefined' ? __filename : path.join(process.cwd(), 'index.js')\n );\n\n for (const g of cfg.generators) {\n const t = g.template;\n // Built-in template names, not packages. `service` is the tRPC generator's, and without it\n // here every run would try to resolve a package called \"service\" and then watch a directory\n // of that name, neither of which exists.\n if (!t || t === 'standard' || t === 'minimal' || t === 'service') continue;\n\n // Try package resolution relative to cwd\n let pkgDir: string | null = null;\n try {\n const pkg = req.resolve(`${t}/package.json`, { paths: [cwd] as any });\n pkgDir = path.dirname(pkg);\n } catch {}\n\n if (pkgDir) {\n results.push(pkgDir);\n continue;\n }\n\n // Local path-like template\n if (/[./\\\\]/.test(t)) {\n const abs = path.resolve(cwd, t);\n if (fs.existsSync(abs)) results.push(abs);\n }\n }\n\n return Array.from(new Set(results));\n}\n\n/** Build watch targets (exclude output dirs; watcher will ignore those). */\n/**\n * Narrow an analysis's tables to the ones the config asked for.\n *\n * Matching is on the database table name, anchored, with `*` as the only metacharacter. Anchored\n * matters: `user` must not also drop `users`, and a substring match would. `exclude` is applied\n * after `include`, so the safer direction wins when both name the same table.\n */\nexport function filterTables<T extends { name: string }>(\n tables: T[],\n opts: { include?: string[]; exclude?: string[] }\n): T[] {\n const toRegExp = (pattern: string) =>\n new RegExp(\n '^' +\n pattern\n .split('*')\n .map((part) => part.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .join('.*') +\n '$'\n );\n\n const matches = (patterns: string[], name: string) =>\n patterns.some((p) => toRegExp(p).test(name));\n\n let out = tables;\n if (opts.include?.length) out = out.filter((t) => matches(opts.include!, t.name));\n if (opts.exclude?.length) out = out.filter((t) => !matches(opts.exclude!, t.name));\n return out;\n}\n\nexport function computeWatchTargets(cfg: DrzlConfig, cwd = process.cwd()): string[] {\n const abs = (p: string) => path.resolve(cwd, p);\n const schemaAbs = abs(cfg.schema);\n // The schema's directory, not a glob under it. Chokidar removed glob support in v4 and treats\n // `<dir>/**/*.{ts,tsx,js}` as a literal path, so it watched a directory named `**` that does\n // not exist: no event ever fired and `drzl watch` did its initial build and then sat inert.\n // A directory is watched recursively by chokidar itself, and the extension filtering that the\n // glob was doing now happens on the event instead.\n const targets = new Set<string>([\n path.dirname(schemaAbs),\n abs('drzl.config.ts'),\n abs('drzl.config.js'),\n abs('drzl.config.mjs'),\n abs('drzl.config.cjs'),\n ]);\n for (const t of resolveTemplateDirsSync(cfg, cwd)) targets.add(t);\n return [...targets];\n}\n","/**\n * The options `@drzl/generator-trpc` receives, built in one place.\n *\n * `generate` and `watch` each dispatch over `cfg.generators` in their own loop, and every branch\n * in both assembles its own options object by hand. Three documented options have already been\n * found dead that way: `typedJson` never reached typebox, `coerceDates` and `applyDefaults`\n * reached nothing but zod, and `servicesDir` is passed by `generate`'s oRPC branch and not by\n * `watch`'s, so a watch rebuild emits a service import pointing at the default directory whatever\n * the config says. None of those is visible in the wiring: the option parses, the generator\n * defaults it, and the feature simply does nothing.\n *\n * One builder means the two call sites are the same object by construction rather than by review.\n * It also gives the drift something to be asserted against, which is what\n * `packages/cli/test/trpc-branch-parity.spec.ts` does by running both commands and comparing the\n * bytes they wrote.\n */\nimport { trpcOutDir } from './config.js';\n\n/** A generator entry from the config, loosely typed because the config schema owns its shape. */\ntype GeneratorConfig = {\n path?: string;\n template?: unknown;\n includeRelations?: unknown;\n naming?: unknown;\n outputHeader?: unknown;\n format?: unknown;\n importExtension?: unknown;\n validation?: unknown;\n databaseInjection?: unknown;\n};\n\nexport function trpcOptions(\n g: GeneratorConfig,\n cfg: { outDir: string },\n servicesDir: string\n): Record<string, unknown> {\n return {\n outputDir: trpcOutDir(g, cfg),\n template: g.template,\n includeRelations: g.includeRelations,\n naming: g.naming,\n outputHeader: g.outputHeader,\n format: g.format,\n importExtension: g.importExtension,\n validation: g.validation,\n databaseInjection: g.databaseInjection,\n // Where the service generator is actually writing, so `template: 'service'` emits an import\n // of a module that exists. The generator defaults this to `src/services`, which is right only\n // by coincidence for a config that puts them elsewhere.\n servicesDir,\n };\n}\n","/**\n * The report behind `drzl doctor`: what DRZL will not check for you, and why.\n *\n * `drzl analyze` already prints the whole `Analysis` as JSON. This is not that. The analysis is a\n * description of the schema and the reader has to know which fields mean trouble; this is the list\n * of things that will silently not work, each with the sentence that says what to do about it.\n *\n * The point of the command is the *silent* half. A generator that cannot type a column emits a\n * validator accepting any value, and a CHECK the parser declines is simply absent from the output:\n * both produce a file that looks finished. `drzl generate` prints a one-line count for the first\n * and says nothing at all about the second.\n *\n * Two of the sections here read something the analyzer does not know:\n *\n * - **CHECK constraints.** `parseCheck` lives in `@drzl/validation-core` and every validation\n * generator calls it; the analyzer never does. It carries the raw expression through and has no\n * opinion on whether anything can be made of it. So the only way to say \"this constraint is in\n * your schema and nothing DRZL emits enforces it\" is to run the generators' own parser, which is\n * what this file does.\n * - **Primary keys.** The service generator keys `getById`, `update` and `delete` on\n * `table.primaryKey?.columns[0] ?? 'id'`, and the router templates take an `id` input to match.\n * A table with no primary key therefore gets a service referencing a column that may not exist,\n * and a composite key gets one keyed on half of it. The analysis states the key correctly; the\n * consequence is the generator's.\n *\n * Deliberately *not* reported, and each for a measured reason:\n *\n * - A CHECK that DRZL does translate. `age >= 18` folds into `.gte(18)` and `start < end` becomes\n * an object-level refinement; listing them as findings would drown the ones that matter.\n * - `length(col)` and `cardinality(col)` landing on a column that cannot take them. Some of the\n * validation generators drop those and some emit something for them, so no single sentence here\n * is true of all of them. It is also unreachable from a working schema: Postgres has no\n * `length(anyarray)` and no `cardinality(integer)`, so the DDL is refused before DRZL sees it.\n */\nimport type { Analysis, Column, Issue, Table } from '@drzl/analyzer';\nimport { parseCheck } from '@drzl/validation-core';\nimport chalk from 'chalk';\n\nexport type DoctorFindingKind =\n /** A column whose validator will accept any value. */\n | 'unknown-column'\n /** A CHECK the shared parser refused to translate. */\n | 'check-declined'\n /** A CHECK naming a column the table does not have. */\n | 'check-unknown-column'\n /** A CHECK comparing an array or structured column against a scalar literal. */\n | 'check-not-scalar'\n /** A table the generators cannot key. */\n | 'no-primary-key'\n /** A table keyed on more columns than the generators use. */\n | 'partial-primary-key'\n /** Anything else the analyzer said, passed through rather than dropped. */\n | 'analyzer';\n\nexport interface DoctorFinding {\n kind: DoctorFindingKind;\n level: 'warn' | 'error';\n /** Table this is about, as the analysis names it. Absent for a finding about the whole schema. */\n table?: string;\n column?: string;\n /** Constraint name, where the finding is about a CHECK. */\n constraint?: string;\n message: string;\n hint?: string;\n}\n\nexport interface DoctorReport {\n /** The schema path as the user spelled it, so the report names the file they asked about. */\n schema: string;\n dialect: string;\n /** True only when there is nothing at all to say. */\n ok: boolean;\n counts: { tables: number; columns: number; checks: number; findings: number };\n findings: DoctorFinding[];\n}\n\n/** Issue codes with a section of their own, so the catch-all does not print them twice. */\nconst HANDLED_CODES = new Set(['DRZL_ANL_UNKNOWN_COLUMN']);\n\n/**\n * Split an issue `path` into its table and column halves.\n *\n * The analyzer writes `table.column` for a column issue and a bare table name otherwise. Table\n * names are JavaScript identifiers, so the last dot is the separator and there is no ambiguity.\n */\nfunction splitPath(path: string | undefined): { table?: string; column?: string } {\n if (!path) return {};\n const dot = path.lastIndexOf('.');\n if (dot <= 0) return { table: path };\n return { table: path.slice(0, dot), column: path.slice(dot + 1) };\n}\n\n/** Every column name a parsed CHECK talks about, paired with the kind of constraint it came from. */\nfunction namedColumns(parsed: Extract<ReturnType<typeof parseCheck>, { ok: true }>) {\n const out: Array<{ column: string; scalar: boolean }> = [];\n // A comparison against a literal and an `IN` list are both statements about a scalar value, so\n // neither describes an array or a structured column. The other three kinds are not: a length or\n // a cardinality is a statement about a count, and a row check is a comparison of two columns.\n for (const c of parsed.checks) out.push({ column: c.column, scalar: true });\n for (const s of parsed.sets ?? []) out.push({ column: s.column, scalar: true });\n for (const l of parsed.lengths ?? []) out.push({ column: l.column, scalar: false });\n for (const c of parsed.cardinalities ?? []) out.push({ column: c.column, scalar: false });\n for (const r of parsed.rows ?? []) {\n out.push({ column: r.left, scalar: false });\n out.push({ column: r.right, scalar: false });\n }\n return out;\n}\n\n/**\n * What a column is, for a sentence about a constraint that does not fit it.\n *\n * Every `ColumnShape` kind has an arm, so a shape added later reads as \"a structured column\" rather\n * than as a wrong noun. `arrayDimensions` is checked first because an array carries its element's\n * shape and it is the array the constraint failed to describe.\n */\nfunction describeShape(c: Column): string {\n if (c.arrayDimensions) return 'an array';\n switch (c.shape?.kind) {\n case 'json':\n return 'a JSON';\n case 'buffer':\n return 'a binary';\n case 'tuple':\n case 'numberObject':\n return 'a structured';\n case 'numberVector':\n return 'a vector';\n case 'bitstring':\n return 'a bit-string';\n case 'byteString':\n return 'a byte-string';\n case 'custom':\n return 'a customType';\n default:\n return 'a structured';\n }\n}\n\nfunction checkFindings(table: Table): DoctorFinding[] {\n const out: DoctorFinding[] = [];\n const byName = new Map(table.columns.map((c) => [c.name, c]));\n for (const k of table.checks ?? []) {\n const label = k.name ? `\"${k.name}\"` : 'an unnamed constraint';\n const raw = k.expression ?? '';\n // A constraint whose expression the analyzer could not render at all is the one case where\n // printing the expression verbatim says nothing, and a line ending in \"Expression:\" reads\n // like the report itself is broken.\n const expr = raw.trim() ? raw : '(empty)';\n const parsed = parseCheck(raw, k.name);\n if (!parsed.ok) {\n out.push({\n kind: 'check-declined',\n level: 'warn',\n table: table.tsName,\n constraint: k.name,\n message: `CHECK ${label} on \"${table.tsName}\" is not translated: ${parsed.reason}. Expression: ${expr}`,\n hint:\n 'Only constraints whose meaning is unambiguous are translated, because a validator ' +\n 'enforcing a guess rejects rows the database accepts. Your database still enforces ' +\n 'this one; nothing DRZL emits does.',\n });\n continue;\n }\n\n // Reported once per column rather than once per clause, so `a >= 1 AND a <= 9` on a missing\n // column is one line and not two.\n const seen = new Set<string>();\n for (const { column, scalar } of namedColumns(parsed)) {\n if (seen.has(column)) continue;\n seen.add(column);\n const col = byName.get(column);\n if (!col) {\n out.push({\n kind: 'check-unknown-column',\n level: 'warn',\n table: table.tsName,\n column,\n constraint: k.name,\n message: `CHECK ${label} on \"${table.tsName}\" names \"${column}\", which is not a column of that table, so nothing enforces it. Expression: ${expr}`,\n hint:\n 'A constraint is attached to the field it names. Check the spelling, or move a ' +\n 'constraint spanning two tables out of the schema.',\n });\n continue;\n }\n if (scalar && (col.arrayDimensions || col.shape)) {\n out.push({\n kind: 'check-not-scalar',\n level: 'warn',\n table: table.tsName,\n column,\n constraint: k.name,\n message: `CHECK ${label} on \"${table.tsName}\" compares ${describeShape(col)} column \"${column}\" against a scalar literal, which does not describe it, so it is not translated. Expression: ${expr}`,\n hint:\n 'On an array column only cardinality(col) is read, since it is the one comparison ' +\n 'that is about the array rather than about an element.',\n });\n }\n }\n }\n return out;\n}\n\nfunction primaryKeyFindings(table: Table): DoctorFinding[] {\n // A read-only relation takes no writes and gets no keyed route, so it needs no key.\n if (table.readOnly) return [];\n const pk = table.primaryKey?.columns ?? [];\n if (!pk.length) {\n const hasId = table.columns.some((c) => c.name === 'id');\n return [\n {\n kind: 'no-primary-key',\n level: 'warn',\n table: table.tsName,\n message: hasId\n ? `Table \"${table.tsName}\" declares no primary key. The service and router generators fall back to a column named \"id\", which this table happens to have, so they work by coincidence.`\n : `Table \"${table.tsName}\" declares no primary key. The service and router generators fall back to a column named \"id\", which this table does not have, so the generated service will not compile.`,\n hint: 'Declare a primary key, or leave this table out with the config table filter.',\n },\n ];\n }\n if (pk.length > 1) {\n return [\n {\n kind: 'partial-primary-key',\n level: 'warn',\n table: table.tsName,\n message: `Table \"${table.tsName}\" has a composite primary key (${pk.join(', ')}). The service and router generators key getById, update and delete on \"${pk[0]}\" alone, so those operations match on part of the key.`,\n hint: 'Treat the generated service as a starting point for this table and widen the key by hand.',\n },\n ];\n }\n return [];\n}\n\n/**\n * Everything worth saying about one analysis, in the order it should be read.\n *\n * Ordered worst-first, and within that silent-first. A schema that could not be analyzed comes\n * first because nothing after it is trustworthy. Untypeable columns and dropped constraints come\n * next because they are invisible: the generated file exists, compiles and validates nothing. The\n * primary-key findings come after because one half of that pair announces itself as a compile\n * error. The catch-all is last.\n */\nexport function buildDoctorReport(analysis: Analysis, schemaPath: string): DoctorReport {\n const findings: DoctorFinding[] = [];\n\n const errors = analysis.issues.filter((i: Issue) => i.level === 'error');\n for (const i of errors) {\n findings.push({\n kind: 'analyzer',\n level: 'error',\n ...splitPath(i.path),\n message: i.message,\n hint: i.hint,\n });\n }\n\n for (const i of analysis.issues) {\n if (i.code !== 'DRZL_ANL_UNKNOWN_COLUMN') continue;\n findings.push({\n kind: 'unknown-column',\n level: 'warn',\n ...splitPath(i.path),\n message: i.message,\n hint: i.hint,\n });\n }\n\n for (const t of analysis.tables) findings.push(...checkFindings(t));\n for (const t of analysis.tables) findings.push(...primaryKeyFindings(t));\n\n for (const i of analysis.issues) {\n if (i.level === 'error' || HANDLED_CODES.has(i.code)) continue;\n findings.push({\n kind: 'analyzer',\n level: 'warn',\n ...splitPath(i.path),\n message: i.message,\n hint: i.hint,\n });\n }\n\n const columns = analysis.tables.reduce((n, t) => n + t.columns.length, 0);\n const checks = analysis.tables.reduce((n, t) => n + (t.checks?.length ?? 0), 0);\n return {\n schema: schemaPath,\n dialect: analysis.dialect,\n ok: findings.length === 0,\n counts: { tables: analysis.tables.length, columns, checks, findings: findings.length },\n findings,\n };\n}\n\n/** Sections, in report order, each with the sentence that says why its contents matter. */\nconst SECTIONS: Array<{ kinds: DoctorFindingKind[]; title: string; why: string }> = [\n {\n kinds: ['unknown-column'],\n title: 'Columns DRZL cannot type',\n why: 'These get a validator that accepts any value.',\n },\n {\n kinds: ['check-declined', 'check-unknown-column', 'check-not-scalar'],\n title: 'CHECK constraints DRZL does not enforce',\n why: 'Your database still enforces these. Nothing DRZL generates does.',\n },\n {\n kinds: ['no-primary-key', 'partial-primary-key'],\n title: 'Primary keys the generators cannot use',\n why: 'The generated getById, update and delete are keyed on one column.',\n },\n {\n kinds: ['analyzer'],\n title: 'Other findings',\n why: 'Reported by the analyzer while reading the schema.',\n },\n];\n\n/**\n * Wrap a sentence under a fixed indent, so it does not run off a narrow terminal.\n *\n * `first` is the prefix the opening line carries instead of the indent, which is what gives a\n * finding its bullet and its continuation lines a hanging indent under the text rather than under\n * the bullet.\n */\nfunction wrap(text: string, indent: string, first = indent, width = 96): string {\n const lines: string[] = [];\n let line = '';\n for (const word of text.split(/\\s+/)) {\n if (line && `${line} ${word}`.length + indent.length > width) {\n lines.push(line);\n line = word;\n } else {\n line = line ? `${line} ${word}` : word;\n }\n }\n if (line) lines.push(line);\n return lines.map((l, i) => (i === 0 ? first : indent) + l).join('\\n');\n}\n\n/**\n * The human-readable report.\n *\n * A clean schema prints what was looked at rather than nothing, because an empty page cannot be\n * told apart from a command that failed to run.\n */\nexport function renderDoctorReport(report: DoctorReport): string {\n const out: string[] = [];\n const plural = (n: number, one: string) => `${n} ${one}${n === 1 ? '' : 's'}`;\n\n out.push(chalk.bold(`DRZL doctor ${report.schema}`));\n out.push(\n chalk.dim(\n `${report.dialect}, ${plural(report.counts.tables, 'table')}, ` +\n `${plural(report.counts.columns, 'column')}, ${plural(report.counts.checks, 'CHECK constraint')}`\n )\n );\n out.push('');\n\n if (report.ok) {\n out.push(chalk.green('Nothing to report.'));\n out.push(chalk.dim(' Every column has a type DRZL can describe.'));\n out.push(chalk.dim(' Every CHECK constraint is translated into the generated validators.'));\n out.push(chalk.dim(' Every table has a primary key the generators can use.'));\n return out.join('\\n');\n }\n\n // Ahead of the sections rather than inside one. An error means the schema was never read, so\n // every count above is zero and every section below is empty, and printing that under \"Other\n // findings\" at the foot of the page buries the only sentence that matters.\n const fatal = report.findings.filter((f) => f.level === 'error');\n if (fatal.length) {\n out.push(chalk.red('DRZL could not read this schema'));\n out.push(chalk.dim(' Nothing else could be checked.'));\n out.push('');\n for (const f of fatal) {\n out.push(wrap(f.message, ' ', ` ${chalk.dim('-')} `));\n if (f.hint) out.push(chalk.dim(wrap(f.hint, ' ')));\n }\n out.push('');\n }\n\n for (const section of SECTIONS) {\n const mine = report.findings.filter(\n (f) => f.level !== 'error' && section.kinds.includes(f.kind)\n );\n if (!mine.length) continue;\n out.push(chalk.yellow(`${section.title} (${mine.length})`));\n out.push(chalk.dim(` ${section.why}`));\n out.push('');\n // One hint per distinct sentence, under the findings that share it: the same advice repeated\n // under twenty columns is the thing that makes a report unreadable.\n const groups = new Map<string, DoctorFinding[]>();\n for (const f of mine) {\n const key = f.hint ?? '';\n groups.set(key, [...(groups.get(key) ?? []), f]);\n }\n for (const [hint, items] of groups) {\n for (const f of items) out.push(wrap(f.message, ' ', ` ${chalk.dim('-')} `));\n if (hint) out.push(chalk.dim(wrap(hint, ' ')));\n out.push('');\n }\n }\n\n out.push(\n chalk.bold(`${plural(report.counts.findings, 'finding')} in ${report.schema}.`) +\n chalk.dim(\n fatal.length\n ? ' Fix the error above and run this again.'\n : ' None of these stop DRZL generating; they are what it will not check for you.'\n )\n );\n return out.join('\\n');\n}\n","/**\n * Drift detection for generated output.\n *\n * No runtime validator can offer this. `drizzle-orm/zod` and friends derive schemas in memory at\n * import time, so there is nothing on disk to have drifted and nothing for CI to compare. It is\n * only available to a code generator, which makes it one of the few things DRZL can do that the\n * first-party modules structurally cannot.\n *\n * The check is: regenerate, and require the result to equal what is committed. That catches the\n * two failures that actually happen, someone editing generated files by hand and someone\n * changing the schema without regenerating, and it catches them in CI rather than in review.\n *\n * Content-neutral by construction. Redirecting output to a temporary directory would not work:\n * generated files contain paths computed relative to their own location, so a different output\n * directory produces legitimately different bytes and every file would report as drifted. So the\n * real directories are snapshotted first, regeneration is allowed to overwrite them, and the\n * snapshot is put back if anything changed. Either way the tree ends as it began.\n */\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nexport interface DriftEntry {\n file: string;\n status: 'changed' | 'added' | 'removed';\n}\n\n/** Every file under `dir`, keyed by its path relative to `dir`. Missing directory means empty. */\nexport async function snapshotDir(dir: string): Promise<Map<string, string>> {\n const out = new Map<string, string>();\n async function walk(current: string) {\n let entries;\n try {\n entries = await fs.readdir(current, { withFileTypes: true });\n } catch {\n return; // Nothing generated there yet, which a first run should report as additions.\n }\n for (const e of entries) {\n const full = path.join(current, e.name);\n if (e.isDirectory()) await walk(full);\n else out.set(path.relative(dir, full), await fs.readFile(full, 'utf8'));\n }\n }\n await walk(dir);\n return out;\n}\n\n/** Snapshot several directories at once, keys prefixed by directory so they cannot collide. */\nexport async function snapshotAll(dirs: string[]): Promise<Map<string, string>> {\n const all = new Map<string, string>();\n for (const dir of dirs) {\n for (const [rel, content] of await snapshotDir(dir)) {\n all.set(path.join(dir, rel), content);\n }\n }\n return all;\n}\n\n/** What changed between two snapshots. */\nexport function diffSnapshots(\n before: Map<string, string>,\n after: Map<string, string>\n): DriftEntry[] {\n const out: DriftEntry[] = [];\n for (const [file, content] of after) {\n if (!before.has(file)) out.push({ file, status: 'added' });\n else if (before.get(file) !== content) out.push({ file, status: 'changed' });\n }\n for (const file of before.keys()) {\n if (!after.has(file)) out.push({ file, status: 'removed' });\n }\n return out.sort((a, b) => a.file.localeCompare(b.file));\n}\n\n/**\n * Put a snapshot back, so a failed check leaves the tree exactly as it found it.\n *\n * A file that regeneration created and the snapshot does not know about is deleted, since it was\n * not there before the check ran.\n */\nexport async function restoreSnapshot(\n before: Map<string, string>,\n after: Map<string, string>\n): Promise<void> {\n for (const [file, content] of before) {\n await fs.mkdir(path.dirname(file), { recursive: true });\n await fs.writeFile(file, content, 'utf8');\n }\n for (const file of after.keys()) {\n if (!before.has(file)) await fs.rm(file, { force: true });\n }\n}\n","/**\n * Loading an optional generator package, and telling absence apart from failure.\n *\n * Every validation generator is loaded on demand, because a project that only wants zod should not\n * have to install five. That makes \"the package is not installed\" a real, expected outcome worth a\n * helpful message. It does not make it the only outcome: a generator that is installed and running\n * can throw for any reason a program can throw, and the CLI reported all of those as a missing npm\n * package too, with the true reason printed underneath as a detail.\n *\n * Node reports an unresolvable import as `ERR_MODULE_NOT_FOUND`, and reports the same code when\n * the module resolved and something *it* imported did not. The code alone therefore does not\n * separate the two; the message does, because it names the specifier that failed to resolve.\n */\n\n/** A generator package that is not installed. Everything else is somebody's real error. */\nexport class GeneratorNotInstalledError extends Error {\n constructor(\n readonly specifier: string,\n /** What Node threw, kept so nothing is discarded on the way to the message. */\n readonly reason: unknown\n ) {\n super(`${specifier} is not installed`);\n this.name = 'GeneratorNotInstalledError';\n }\n}\n\n/**\n * Whether `err` is Node refusing to resolve `specifier` itself.\n *\n * Measured on Node 22, from an ESM entry and from a CJS one, since the CLI ships both builds and\n * the bundler leaves `import()` as `import()` in each:\n *\n * absent package ERR_MODULE_NOT_FOUND, `Cannot find package '<specifier>' imported…`\n * present, inner dep absent ERR_MODULE_NOT_FOUND, naming the *inner* specifier instead\n * present, main file gone ERR_MODULE_NOT_FOUND, naming the resolved file path\n * throws while evaluating no `code` at all, and whatever message the generator threw\n *\n * Only the first is an install problem, and only the first quotes the specifier that was asked\n * for, which is what this matches on.\n */\nexport function isPackageMissing(err: unknown, specifier: string): boolean {\n const code = (err as { code?: unknown } | null | undefined)?.code;\n if (code !== 'ERR_MODULE_NOT_FOUND') return false;\n const message = (err as { message?: unknown } | null | undefined)?.message;\n return typeof message === 'string' && message.includes(`'${specifier}'`);\n}\n\n/**\n * Run `load` and re-throw a missing package as `GeneratorNotInstalledError`.\n *\n * `load` is a thunk rather than a specifier so the caller keeps a literal `import('@drzl/…')` in\n * its own source, which is what lets the bundler see the dependency. Anything it throws that is\n * not this package's own absence comes out unchanged.\n */\nexport async function loadGenerator<T>(specifier: string, load: () => Promise<T>): Promise<T> {\n try {\n return await load();\n } catch (e) {\n if (isPackageMissing(e, specifier)) throw new GeneratorNotInstalledError(specifier, e);\n throw e;\n }\n}\n","import chalk from 'chalk';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\n\nexport interface SponsorMessageOptions {\n reason?: string;\n minIntervalMs?: number;\n force?: boolean;\n}\n\ninterface SponsorCachePayload {\n runs: number;\n lastShownAt?: number;\n lastReason?: string;\n}\n\nconst CACHE_DIR = path.join(process.cwd(), 'node_modules', '.cache', '@drzl');\nconst CACHE_FILE = path.join(CACHE_DIR, 'sponsor-message.json');\nconst DEFAULT_INTERVAL_MS = 1000 * 60 * 15; // 15 minutes\nlet shownThisProcess = false;\n\nconst tips = [\n 'Pair DRZL watch mode with drizzle-kit to keep schema & API synced.',\n 'Templatize your ORPC routers to roll out new endpoints safely.',\n 'Need typed validators? Enable the zod, valibot, arktype, typebox, or effect generators.',\n 'Need JSON Schema or OpenAPI? The json-schema generator emits both, with no runtime dependency.',\n 'Use output headers to track generated files and trim noisy diffs.',\n];\n\nconst green = (msg: string) => chalk.hex('#6ee7b7')(msg);\nconst cyan = (msg: string) => chalk.cyan(msg);\nconst gray = (msg: string) => chalk.gray(msg);\n\nexport function maybeShowSponsorMessage({\n reason = 'generate',\n minIntervalMs = DEFAULT_INTERVAL_MS,\n force = false,\n}: SponsorMessageOptions = {}) {\n const hideViaEnv = process.env.DRZL_HIDE_SPONSOR?.toLowerCase();\n const hideRequested = hideViaEnv === '1' || hideViaEnv === 'true';\n if (hideRequested || (process.env.CI && !force) || (shownThisProcess && !force)) return;\n\n try {\n mkdirSync(CACHE_DIR, { recursive: true });\n const payload = readCache();\n payload.runs += 1;\n\n const now = Date.now();\n const shouldShow = force || now - (payload.lastShownAt ?? 0) >= minIntervalMs;\n\n if (shouldShow) {\n payload.lastShownAt = now;\n payload.lastReason = reason;\n }\n\n writeCache(payload);\n\n if (!shouldShow) return;\n\n shownThisProcess = true;\n const tip = tips[payload.runs % tips.length];\n\n console.log(\n `\\n${cyan(`🚀 DRZL finished a ${reason} run (#${payload.runs.toLocaleString()}).`)}\\n\\n` +\n `${green('✨ Sponsors keep DRZL shipping. Consider supporting ongoing dev:')}\\n` +\n ` ${green('GitHub Sponsors')} ${gray('→ https://github.com/sponsors/omar-dulaimi')}\\n\\n` +\n `${green('Pro tip:')} ${tip}\\n`\n );\n } catch {\n // Swallow to avoid impacting generator success paths\n }\n}\n\nfunction readCache(): SponsorCachePayload {\n if (!existsSync(CACHE_FILE)) {\n return { runs: 0 };\n }\n try {\n const data = JSON.parse(readFileSync(CACHE_FILE, 'utf8')) as SponsorCachePayload;\n if (typeof data.runs !== 'number') return { runs: 0 };\n return data;\n } catch {\n return { runs: 0 };\n }\n}\n\nfunction writeCache(payload: SponsorCachePayload) {\n writeFileSync(CACHE_FILE, JSON.stringify(payload, null, 2), 'utf8');\n}\n","/**\n * The version `drzl --version` prints, read from the manifest that ships beside the build.\n *\n * It used to be the literal `'0.0.1'`, passed to `program.version()` when the CLI was scaffolded\n * and never touched again. That was true of exactly one release, the first: the registry lists 29\n * versions of `@drzl/cli`, and the other 28 printed `0.0.1` as well. Reading the manifest is the\n * only form that cannot drift, because it is the same file the registry took the version from.\n *\n * Nothing here falls back. A build that cannot find its own manifest, or finds someone else's, has\n * resolved somewhere it did not intend to, and a placeholder standing in for that is how the\n * original defect stayed invisible for 28 releases.\n */\nimport { readFileSync } from 'node:fs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/** The name the manifest beside this build must carry, which is what makes it ours. */\nconst PACKAGE_NAME = '@drzl/cli';\n\n/**\n * The directory holding the file this code ends up in, in every form it is reached.\n *\n * Three of them: `dist/cli.js`, `dist/cli.cjs`, and this file unbundled under ts-node, all three\n * run and checked. Only the CommonJS bundle has no `import.meta`; `tsup.config.ts` gives that\n * build a real value for `import.meta.url` rather than esbuild's empty one, so this needs no\n * branch. If that config is ever dropped, `fileURLToPath(undefined)` throws on load, so the\n * CommonJS bundle stops working loudly instead of reporting the wrong directory.\n */\nfunction moduleDir(): string {\n return path.dirname(fileURLToPath(import.meta.url));\n}\n\n/**\n * The `version` a named manifest declares, or a throw naming what was wrong with it.\n *\n * Split out from the caller below only so the three ways it refuses can be exercised without a\n * build. Nothing in the CLI passes a path.\n */\nexport function readVersionFrom(manifestPath: string): string {\n let raw: string;\n try {\n raw = readFileSync(manifestPath, 'utf8');\n } catch (e: any) {\n throw new Error(\n `${PACKAGE_NAME} cannot read its own version: no manifest at ${manifestPath} ` +\n `(${e?.message ?? String(e)}).`\n );\n }\n\n const manifest = JSON.parse(raw) as { name?: unknown; version?: unknown };\n\n if (manifest.name !== PACKAGE_NAME) {\n throw new Error(\n `${PACKAGE_NAME} looked for its own version in ${manifestPath} and found ` +\n `${JSON.stringify(manifest.name)}, so this build is not sitting where it thinks it is.`\n );\n }\n\n if (typeof manifest.version !== 'string' || manifest.version.length === 0) {\n throw new Error(`${manifestPath} declares no version, so there is nothing to report.`);\n }\n\n return manifest.version;\n}\n\n/**\n * The `version` field of this package's own manifest.\n *\n * Both bundles sit one level below it, in `dist/`, and so does `src/` when this file is run\n * unbundled, so one `..` covers every way it is reached. All three were run.\n */\nexport function readCliVersion(): string {\n return readVersionFrom(path.join(moduleDir(), '..', 'package.json'));\n}\n\nexport const CLI_VERSION = readCliVersion();\n"],"mappings":"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","names":["path","import_validation_core","fs","dist_exports","index_default","keyColumns","path","buildHeader","import_validation_core","init_dist","fs","dist_exports","index_default","ref","field","buildHeader","import_validation_core","DEFAULT_FILE_SUFFIX","init_dist","fs","path","import_chalk","path","mine","raw","import_validation_core","path","chalk","fs","path","import_chalk","import_node_fs","import_node_path","path","chalk","import_node_fs","path","chalk","ora","fs","cliProgress","TRPCGenerator","JsonSchemaGenerator","EffectGenerator","watcher","chokidar","path"]}
1
+ {"version":3,"sources":["../../generator-trpc/dist/index.js","../../generator-json-schema/dist/index.js","../../generator-effect/dist/index.js","../src/cli.ts","../src/validation-options.ts","../src/json-schema-options.ts","../src/config.ts","../src/patterns.ts","../src/trpc-options.ts","../src/column-filter.ts","../src/doctor.ts","../src/drift.ts","../src/generator-loader.ts","../src/sponsor.ts","../src/version.ts"],"sourcesContent":["// src/index.ts\nimport {\n formatCode,\n importSpecifier,\n resolveAffix,\n resolveConfiguredImport,\n schemaName\n} from \"@drzl/validation-core\";\nvar TRPC_MAJOR = 11;\nvar q = (v) => JSON.stringify(v);\nvar LIB_IMPORTS = {\n zod: \"import { z } from 'zod';\",\n valibot: \"import * as v from 'valibot';\",\n arktype: \"import { type } from 'arktype';\"\n};\nvar LIB_USAGE = {\n zod: /\\bz\\./,\n valibot: /\\bv\\./,\n arktype: /\\btype\\(/\n};\nvar LIBS = {\n zod: {\n number: \"z.number()\",\n string: \"z.string()\",\n boolean: \"z.boolean()\",\n date: \"z.date()\",\n unknown: \"z.unknown()\",\n tuple: (n) => `z.tuple([${Array.from({ length: n }, () => \"z.number()\").join(\", \")}])`,\n numberObject: (fields) => `z.object({ ${fields.map((f) => `${f}: z.number()`).join(\", \")} })`,\n enum: (vals) => `z.enum([${vals.map(q).join(\", \")}] as const)`,\n nullable: (b) => `${b}.nullable()`,\n optional: (b) => `${b}.optional()`,\n object: (body) => `z.object({\n${body}\n})`,\n objectInline: (body) => `z.object({ ${body} })`,\n partialUpdate: (s) => `${s}.partial()`,\n arrayOf: (s) => `z.array(${s})`,\n nullableOf: (s) => `${s}.nullable()`,\n booleanSchema: \"z.boolean()\"\n },\n valibot: {\n number: \"v.number()\",\n string: \"v.string()\",\n boolean: \"v.boolean()\",\n date: \"v.date()\",\n unknown: \"v.unknown()\",\n tuple: (n) => `v.tuple([${Array.from({ length: n }, () => \"v.number()\").join(\", \")}])`,\n numberObject: (fields) => `v.object({ ${fields.map((f) => `${f}: v.number()`).join(\", \")} })`,\n enum: (vals) => `v.picklist([${vals.map(q).join(\", \")}] as const)`,\n nullable: (b) => `v.nullable(${b})`,\n optional: (b) => `v.optional(${b})`,\n object: (body) => `v.object({\n${body}\n})`,\n objectInline: (body) => `v.object({ ${body} })`,\n arrayOf: (s) => `v.array(${s})`,\n nullableOf: (s) => `v.nullable(${s})`,\n booleanSchema: \"v.boolean()\"\n },\n arktype: {\n number: \"number\",\n string: \"string\",\n boolean: \"boolean\",\n date: \"Date\",\n unknown: \"unknown\",\n // The surrounding encode adds the quotes, so the union is built with the inner quoting\n // ArkType expects. Emitting `'${...}'` here produces `''admin' | 'user''`, which does not parse.\n enum: (vals) => vals.map((x) => `'${x.replace(/'/g, \"\\\\'\")}'`).join(\" | \"),\n nullable: (b) => `(${b} | null)`,\n optional: (b) => `${b}?`,\n object: (body) => `type({\n${body}\n})`,\n objectInline: (body) => `type({ ${body} })`,\n fieldIsString: true,\n arrayOf: (s) => `${s}.array()`,\n nullableOf: (s) => `${s}.or('null')`,\n booleanSchema: `type('boolean')`\n }\n};\nfunction isWide(column) {\n if (column.enumValues && column.enumValues.length) return false;\n if (column.shape?.kind === \"tuple\" || column.shape?.kind === \"numberObject\") return false;\n return ![\"number\", \"string\", \"boolean\", \"Date\"].includes(column.tsType);\n}\nfunction mapExpr(column, lib, mode) {\n const d = LIBS[lib];\n let base = (() => {\n if (column.enumValues && column.enumValues.length) return d.enum(column.enumValues);\n if (column.shape?.kind === \"tuple\" && d.tuple) return d.tuple(column.shape.length);\n if (column.shape?.kind === \"numberObject\" && d.numberObject) {\n return d.numberObject(column.shape.fields);\n }\n switch (column.tsType) {\n case \"number\":\n return d.number;\n case \"string\":\n return d.string;\n case \"boolean\":\n return d.boolean;\n case \"Date\":\n return d.date;\n default:\n return d.unknown;\n }\n })();\n if (column.nullable) base = d.nullable(base);\n if (mode !== \"select\") {\n const optional = mode === \"update\" || column.nullable || column.hasDefault;\n if (optional) base = d.optional(base);\n }\n return base;\n}\nfunction field(column, lib, mode) {\n const d = LIBS[lib];\n const expr = mapExpr(column, lib, mode);\n return `${objectKey(column.name)}: ${d.fieldIsString ? JSON.stringify(expr) : expr}`;\n}\nfunction objectKey(name) {\n return isIdent(name) ? name : JSON.stringify(name);\n}\nfunction renderSchema(table, lib, mode) {\n const d = LIBS[lib];\n const cols = table.columns.filter((c) => mode === \"select\" ? true : !c.isGenerated);\n const body = cols.map((c) => ` ${field(c, lib, mode)},`).join(\"\\n\");\n const schema = d.object(body);\n return mode === \"update\" && d.partialUpdate ? d.partialUpdate(schema) : schema;\n}\nfunction toCase(s, c) {\n if (!c) return s;\n const parts = s.replace(/([a-z0-9])([A-Z])/g, \"$1 $2\").replace(/[_-]/g, \" \").split(/\\s+/);\n if (c === \"camel\") {\n return parts.map(\n (p, i) => i === 0 ? p.toLowerCase() : p.charAt(0).toUpperCase() + p.slice(1).toLowerCase()\n ).join(\"\");\n }\n if (c === \"kebab\") return parts.map((p) => p.toLowerCase()).join(\"-\");\n if (c === \"snake\") return parts.map((p) => p.toLowerCase()).join(\"_\");\n return s;\n}\nvar cap = (s) => s.charAt(0).toUpperCase() + s.slice(1);\nvar singularize = (s) => s.endsWith(\"ies\") ? s.slice(0, -3) + \"y\" : s.endsWith(\"s\") ? s.slice(0, -1) : s;\nvar isIdent = (s) => /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(s);\nvar BASE_MODULE = \"trpc\";\nfunction keyColumns(table) {\n const names = table.primaryKey?.columns ?? [];\n if (!names.length) return null;\n const cols = names.map((n) => table.columns.find((c) => c.name === n));\n if (cols.some((c) => !c)) return null;\n return cols;\n}\nvar TRPCGenerator = class {\n constructor(analysis) {\n this.analysis = analysis;\n }\n async generate(opts) {\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n const out = path.resolve(process.cwd(), opts.outputDir);\n const ctx = {\n out,\n services: path.resolve(process.cwd(), opts.servicesDir ?? \"src/services\")\n };\n await fs.mkdir(out, { recursive: true });\n const files = [];\n const write = async (filePath, content) => {\n const formatted = await formatCode(\n buildHeader(opts.outputHeader) + content,\n filePath,\n opts.format\n );\n await fs.writeFile(filePath, formatted, \"utf8\");\n files.push(filePath);\n };\n const basePath = path.join(out, `${BASE_MODULE}.ts`);\n await write(basePath, renderBase(opts));\n const routers = [];\n const total = this.analysis.tables.length;\n let index = 0;\n for (const table of this.analysis.tables) {\n const base = `${table.tsName}${opts.naming?.routerSuffix ?? \"\"}`;\n const filePath = path.join(out, `${toCase(base, opts.naming?.procedureCase)}.ts`);\n if (filePath === basePath) {\n throw new Error(\n `@drzl/generator-trpc: the router for table \"${table.name}\" would be written to ${filePath}, which is the shared tRPC base module this generator also writes. Set naming.routerSuffix to move it out of the way.`\n );\n }\n await write(filePath, renderRouter(table, opts, ctx));\n routers.push({ table, filePath, exportName: routerExportName(table, opts.naming) });\n index++;\n opts.onProgress?.({ index, total, table: table.name, filePath });\n }\n await write(path.join(out, \"index.ts\"), renderBarrel(routers, ctx, path, opts));\n return { files };\n }\n};\nvar index_default = TRPCGenerator;\nfunction renderBase(opts) {\n const injection = opts.databaseInjection?.enabled === true;\n const dbType = opts.databaseInjection?.databaseType ?? \"unknown\";\n const typeImport = opts.databaseInjection?.databaseTypeImport ? `import type { ${opts.databaseInjection.databaseTypeImport.name} } from '${opts.databaseInjection.databaseTypeImport.from}';\n` : \"\";\n const trpcImport = injection ? `import { initTRPC, TRPCError } from '@trpc/server';` : `import { initTRPC } from '@trpc/server';`;\n const context = injection ? `/**\n * What your \\`createContext\\` hands every procedure.\n *\n * \\`db\\` is optional here and required by \\`dbProcedure\\` below. That split is what lets an adapter\n * build a context without a handle, for a health check or a public route, while every generated\n * procedure still sees one that is present.\n */\nexport interface Context {\n db?: ${dbType};\n}` : `/**\n * What your \\`createContext\\` hands every procedure. Nothing generated reads it, so it is left\n * open; narrow it to the shape your own context really has.\n */\nexport type Context = Record<string, unknown>;`;\n const middleware = injection ? `\n/**\n * The builder every generated procedure is built from: it refuses to run without a database\n * handle, and narrows \\`ctx.db\\` from optional to present for everything downstream.\n */\nexport const dbProcedure = t.procedure.use(async ({ ctx, next }) => {\n if (!ctx.db) {\n throw new TRPCError({\n code: 'INTERNAL_SERVER_ERROR',\n message: 'No database handle on the tRPC context. Provide one from createContext.',\n });\n }\n return next({ ctx: { db: ctx.db } });\n});\n` : \"\";\n return `// Generated by @drzl/generator-trpc\n// The shared tRPC base. Every generated router imports from here.\n${trpcImport}\n${typeImport}\n${context}\n\nconst t = initTRPC.context<Context>().create();\n\nexport const router = t.router;\nexport const mergeRouters = t.mergeRouters;\nexport const middleware = t.middleware;\n/** Needed to call this router in-process, from a test or from SSR. */\nexport const createCallerFactory = t.createCallerFactory;\nexport const publicProcedure = t.procedure;\n${middleware}`;\n}\nfunction renderRouter(table, opts, ctx) {\n const lib = opts.validation?.library ?? \"zod\";\n const d = LIBS[lib];\n const service = opts.template === \"service\";\n const injection = opts.databaseInjection?.enabled === true;\n const builder = injection ? \"dbProcedure\" : \"publicProcedure\";\n const insertName = `Insert${table.tsName}Schema`;\n const updateName = `Update${table.tsName}Schema`;\n const selectName = `Select${table.tsName}Schema`;\n const writable = !table.readOnly;\n const key = keyColumns(table);\n const Service = `${cap(singularize(table.tsName))}Service`;\n const serviceKeyable = !!key && key.length === 1 && key[0].tsType === \"number\";\n const keyArg = key && key.length === 1 ? `input.${key[0].name}` : \"\";\n const dbArg = injection ? \"ctx.db, \" : \"\";\n const wiredParams = injection ? \"{ ctx, input }\" : \"{ input }\";\n const procedures = [];\n const notImplemented = (what) => `throw new Error('Not implemented: ${what} ${table.tsName}.');`;\n procedures.push({\n name: \"list\",\n kind: \"query\",\n output: d.arrayOf(selectName),\n params: service && injection ? \"{ ctx }\" : \"\",\n body: service ? [`return await ${Service}.getAll(${injection ? \"ctx.db\" : \"\"});`] : [\"return [];\"]\n });\n const keyInput = key ? d.objectInline(key.map((c) => field(c, lib, \"select\")).join(\", \")) : void 0;\n if (key && keyInput) {\n const wired = service && serviceKeyable;\n procedures.push({\n name: \"byId\",\n kind: \"query\",\n input: keyInput,\n output: d.nullableOf(selectName),\n params: wired ? wiredParams : \"{ input: _input }\",\n body: wired ? [`return await ${Service}.getById(${dbArg}${keyArg});`] : service ? [serviceKeyNote(table), notImplemented(\"byId\")] : [\"return null;\"]\n });\n if (writable) {\n const updateInput = d.objectInline(\n [...key.map((c) => field(c, lib, \"select\")), `data: ${updateName}`].join(\", \")\n );\n procedures.push({\n name: \"update\",\n kind: \"mutation\",\n input: updateInput,\n output: selectName,\n params: wired ? wiredParams : \"{ input: _input }\",\n body: wired ? [`return await ${Service}.update(${dbArg}${keyArg}, input.data);`] : service ? [serviceKeyNote(table), notImplemented(\"update\")] : [notImplemented(\"update\")]\n });\n procedures.push({\n name: \"delete\",\n kind: \"mutation\",\n input: keyInput,\n output: d.booleanSchema,\n params: wired ? wiredParams : \"{ input: _input }\",\n body: wired ? [`return await ${Service}.delete(${dbArg}${keyArg});`] : service ? [serviceKeyNote(table), notImplemented(\"delete\")] : [\"return true;\"]\n });\n }\n }\n if (writable) {\n procedures.push({\n name: \"create\",\n kind: \"mutation\",\n input: insertName,\n output: selectName,\n params: service ? wiredParams : \"{ input: _input }\",\n body: service ? [`return await ${Service}.create(${dbArg}input);`] : [notImplemented(\"create\")]\n });\n }\n if (opts.includeRelations) {\n const taken = new Set(procedures.map((p) => p.name));\n procedures.push(...relationProcedures(table, lib, selectName, taken, service));\n }\n const order = [\"list\", \"byId\", \"create\", \"update\", \"delete\"];\n const rank = (n) => order.indexOf(n) === -1 ? order.length : order.indexOf(n);\n procedures.sort((a, b) => rank(a.name) - rank(b.name));\n const routerName = routerExportName(table, opts.naming);\n const entries = procedures.map((p) => {\n const rawKey = toCase(p.name, opts.naming?.procedureCase);\n const propKey = isIdent(rawKey) ? rawKey : JSON.stringify(rawKey);\n return [\n ` ${propKey}: ${builder}`,\n ...p.input ? [` .input(${p.input})`] : [],\n ` .output(${p.output})`,\n ` .${p.kind}(async (${p.params}) => {`,\n ...p.body.map((line) => ` ${line}`),\n ` }),`\n ].join(\"\\n\");\n }).join(\"\\n\");\n const body = `export const ${routerName} = router({\n${entries}\n});\n`;\n const useShared = !!opts.validation?.useShared && !!opts.validation?.importPath;\n const declared = [];\n if (!useShared) {\n if (writable) {\n declared.push(`export const ${insertName} = ${renderSchema(table, lib, \"insert\")};`);\n declared.push(`export const ${updateName} = ${renderSchema(table, lib, \"update\")};`);\n }\n declared.push(`export const ${selectName} = ${renderSchema(table, lib, \"select\")};`);\n }\n const decided = [...declared, body].join(\"\\n\\n\");\n const imports = [];\n if (useShared) {\n const sharedAffix = resolveAffix({\n affix: opts.validation?.affix,\n schemaSuffix: opts.validation?.schemaSuffix\n });\n const wanted = [\n [\"insert\", insertName],\n [\"update\", updateName],\n [\"select\", selectName]\n ].filter(([, local]) => decided.includes(local));\n if (wanted.length) {\n const spec = resolveConfiguredImport(\n opts.validation.importPath,\n ctx.out,\n process.cwd(),\n opts.importExtension\n );\n const names = wanted.map(([mode, local]) => {\n const exported = schemaName(mode, table.tsName, sharedAffix);\n return exported === local ? local : `${exported} as ${local}`;\n }).join(\", \");\n imports.push(`import { ${names} } from '${spec}';`);\n }\n }\n imports.push(\n `import { ${[builder, \"router\"].sort().join(\", \")} } from '${importSpecifier(\n `./${BASE_MODULE}.ts`,\n opts.importExtension\n )}';`\n );\n if (service) {\n imports.push(`import { ${Service} } from '${serviceImportSpecifier(table, ctx, opts)}';`);\n }\n if (LIB_USAGE[lib].test(decided)) imports.unshift(LIB_IMPORTS[lib]);\n const wide = table.columns.filter(isWide).map((c) => c.name);\n const wideNote = wide.length ? `// No validated type for ${wide.length === 1 ? \"this column\" : \"these columns\"}: ${wide.join(\", \")}.\n// DRZL could not derive one from the schema, so the router accepts any value there.\n` : \"\";\n return `// Generated by @drzl/generator-trpc\n// Router for table: ${table.name}\n${wideNote}${imports.join(\"\\n\")}\n\n${decided}`;\n}\nfunction relationProcedures(table, lib, selectSchemaName, taken, service) {\n const d = LIBS[lib];\n const out = [];\n for (const fk of table.foreignKeys ?? []) {\n if (fk.columns.length !== 1) continue;\n const colName = fk.columns[0];\n const column = table.columns.find((c) => c.name === colName);\n if (!column) continue;\n const name = `listBy${cap(colName)}`;\n if (taken.has(name)) continue;\n taken.add(name);\n out.push({\n name,\n kind: \"query\",\n input: d.objectInline(field(column, lib, \"select\")),\n output: d.arrayOf(selectSchemaName),\n params: \"{ input: _input }\",\n body: [\n `// Rows of ${table.name} whose ${JSON.stringify(colName)} matches _input.${colName}.`,\n // In `service` mode every other procedure really does reach the database, so a lookup\n // quietly answering with an empty array would read as \"no matching rows\". There is no\n // generated service method for it, so it says so instead. In `standard` mode everything\n // is a stub and `[]` is consistent with `list`.\n service ? `throw new Error('Not implemented: ${name} ${table.tsName}.');` : \"return [];\"\n ]\n });\n }\n return out;\n}\nfunction renderBarrel(routers, ctx, path, opts) {\n const baseSpec = importSpecifier(`./${BASE_MODULE}.ts`, opts.importExtension);\n const reExports = `export { createCallerFactory, publicProcedure, router } from '${baseSpec}';\n` + (opts.databaseInjection?.enabled === true ? `export { dbProcedure } from '${baseSpec}';\n` : \"\") + `export type { Context } from '${baseSpec}';\n`;\n if (!routers.length) {\n return `// Generated by @drzl/generator-trpc\n// No tables detected in analysis. Add tables to your schema and regenerate.\nimport { router } from '${baseSpec}';\n\nexport const appRouter = router({});\n\n/** The type a tRPC client is parameterised by: \\`createTRPCClient<AppRouter>()\\`. */\nexport type AppRouter = typeof appRouter;\n\n${reExports}`;\n }\n const entries = routers.map(({ filePath, exportName, table }) => ({\n rel: importSpecifier(\n \"./\" + path.relative(ctx.out, filePath).replace(/\\\\/g, \"/\"),\n opts.importExtension\n ),\n exportName,\n // The namespace a client reaches this table's procedures through: `trpc.userProfiles.list`.\n // `tsName` verbatim, because it is already a valid identifier and it is the name the user\n // wrote in their schema. The oRPC barrel lowercases this key, turning `userProfiles` into\n // `userprofiles`: harmless in an object literal nobody reads, and not harmless when the key\n // is the public API of a typed client.\n key: table.tsName\n }));\n const importLines = entries.map(({ rel, exportName }) => `import { ${exportName} } from '${rel}';`).join(\"\\n\");\n const bodyLines = entries.map(({ key, exportName }) => ` ${isIdent(key) ? key : JSON.stringify(key)}: ${exportName},`).join(\"\\n\");\n return `// Generated by @drzl/generator-trpc\nimport { router } from '${baseSpec}';\n${importLines}\n\nexport const appRouter = router({\n${bodyLines}\n});\n\n/** The type a tRPC client is parameterised by: \\`createTRPCClient<AppRouter>()\\`. */\nexport type AppRouter = typeof appRouter;\n\n${reExports}`;\n}\nfunction serviceKeyNote(table) {\n const cols = table.primaryKey?.columns ?? [];\n const shape = cols.length > 1 ? `has a composite primary key (${cols.join(\", \")})` : `has a non-numeric primary key (${cols[0]})`;\n return `// ${table.name} ${shape}, and @drzl/generator-service types its key parameter as one number.\n// Wire this to your own lookup.`;\n}\nfunction routerExportName(table, naming) {\n const base = `${table.tsName}${naming?.routerSuffix ?? \"Router\"}`;\n const c = naming?.procedureCase;\n return toCase(base, c === \"kebab\" ? \"camel\" : c);\n}\nfunction serviceImportSpecifier(table, ctx, opts) {\n const rel = relativePosix(ctx.out, ctx.services);\n const dir = !rel ? \".\" : rel.startsWith(\".\") ? rel : `./${rel}`;\n return importSpecifier(`${dir}/${singularize(table.tsName)}Service.ts`, opts.importExtension);\n}\nfunction relativePosix(from, to) {\n const norm = (p) => p.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n const a = norm(from).split(\"/\");\n const b = norm(to).split(\"/\");\n let i = 0;\n while (i < a.length && i < b.length && a[i] === b[i]) i++;\n return [...Array.from({ length: a.length - i }, () => \"..\"), ...b.slice(i)].join(\"/\");\n}\nfunction buildHeader(h) {\n if (h && h.enabled === false) return \"\";\n const text = h?.text?.trim();\n const lines = text ? text.split(/\\r?\\n/).map((l) => `// ${l}`) : [\n \"// Generated by DRZL (@drzl/*)\",\n \"// Generated output is granted to you under your project's license.\",\n \"// You may use, copy, modify, and distribute without attribution.\"\n ];\n return lines.join(\"\\n\") + \"\\n\\n\";\n}\nexport {\n BASE_MODULE,\n TRPCGenerator,\n TRPC_MAJOR,\n index_default as default\n};\n","// src/index.ts\nimport {\n formatCode,\n moduleFileName,\n moduleSpecifier,\n resolveAffix,\n schemaName,\n typeName\n} from \"@drzl/validation-core\";\n\n// src/openapi.ts\nimport { qualifiedForeignTable, qualifiedTableName } from \"@drzl/analyzer\";\n\n// src/schemas.ts\nimport {\n COLUMN_FORMATS,\n insertColumns,\n isIntegerColumn,\n parseCheck,\n selectColumns,\n updateColumns\n} from \"@drzl/validation-core\";\nvar DRAFT = \"https://json-schema.org/draft/2020-12/schema\";\nvar UUID_FORMAT = \"uuid\";\nvar base64 = (target) => target === \"openapi-3.0\" ? { type: \"string\", format: \"byte\" } : { type: \"string\", contentEncoding: \"base64\" };\nfunction baseSchema(c, mode, target, checks, sets, lengths) {\n const s = c.shape;\n if (s) {\n switch (s.kind) {\n case \"json\":\n return {};\n case \"custom\":\n return {};\n case \"buffer\":\n return base64(target);\n case \"tuple\":\n return target === \"openapi-3.0\" ? { type: \"array\", items: { type: \"number\" }, minItems: s.length, maxItems: s.length } : {\n type: \"array\",\n prefixItems: Array.from({ length: s.length }, () => ({ type: \"number\" })),\n minItems: s.length,\n maxItems: s.length\n };\n case \"numberObject\":\n return {\n type: \"object\",\n properties: Object.fromEntries(s.fields.map((f) => [f, { type: \"number\" }])),\n required: [...s.fields]\n };\n case \"numberVector\":\n return {\n type: \"array\",\n items: { type: \"number\" },\n ...s.length ? { minItems: s.length, maxItems: s.length } : {}\n };\n case \"bitstring\":\n return {\n type: \"string\",\n pattern: \"^[01]*$\",\n ...s.length ? s.exact ? { minLength: s.length, maxLength: s.length } : { maxLength: s.length } : {}\n };\n case \"byteString\":\n return { type: \"string\", ...s.length ? { maxLength: s.length } : {} };\n }\n }\n const set = sets.find((x) => x.column === c.name);\n if (set) return { enum: set.values.map((v) => set.kind === \"string\" ? v : Number(v)) };\n if (c.enumValues && c.enumValues.length) return { enum: [...c.enumValues] };\n const mine = c.arrayDimensions ? [] : checks.filter((k) => k.column === c.name);\n const eq = mine.find((k) => k.operator === \"=\");\n if (eq) {\n const only = eq.kind === \"string\" ? eq.value : Number(eq.value);\n return target === \"openapi-3.0\" ? { enum: [only] } : { const: only };\n }\n switch (c.tsType) {\n case \"string\": {\n const out = { type: \"string\" };\n if (c.format === \"uuid\") out.format = UUID_FORMAT;\n else if (c.format && COLUMN_FORMATS[c.format]) out.pattern = COLUMN_FORMATS[c.format];\n if (c.maxLength !== void 0) out.maxLength = c.maxLength;\n applyByteCap(out, c);\n applyLengths(out, c, lengths);\n return out;\n }\n case \"number\": {\n const out = { type: isIntegerColumn(c) ? \"integer\" : \"number\" };\n if (!c.arrayDimensions) applyNumericBounds(out, c, checks, target);\n return out;\n }\n case \"bigint\":\n return { type: \"string\", pattern: \"^-?\\\\d+$\" };\n case \"boolean\":\n return { type: \"boolean\" };\n case \"Date\":\n return { type: \"string\", format: \"date-time\" };\n case \"Uint8Array\":\n return base64(target);\n default:\n return {};\n }\n}\nfunction applyByteCap(out, c) {\n if (!c.maxBytes) return;\n out.maxLength = Math.min(Number(out.maxLength ?? Infinity), c.maxBytes);\n out.description = `At most ${c.maxBytes} bytes of UTF-8, which JSON Schema has no keyword for. maxLength counts characters: it refuses nothing the column accepts, and a string of multi-byte characters can satisfy it and still be too long for the column.`;\n}\nfunction applyLengths(out, c, lengths) {\n for (const k of lengths.filter((x) => x.column === c.name)) {\n const n = Number(k.value);\n if (k.operator === \">=\") out.minLength = Math.max(Number(out.minLength ?? 0), n);\n else if (k.operator === \">\") out.minLength = Math.max(Number(out.minLength ?? 0), n + 1);\n else if (k.operator === \"<=\") out.maxLength = Math.min(Number(out.maxLength ?? Infinity), n);\n else if (k.operator === \"<\") out.maxLength = Math.min(Number(out.maxLength ?? Infinity), n - 1);\n else if (k.operator === \"=\") {\n out.minLength = n;\n out.maxLength = n;\n }\n }\n}\nfunction applyNumericBounds(out, c, checks, target) {\n let min = c.min !== void 0 ? { value: Number(c.min), exclusive: false } : void 0;\n let max = c.max !== void 0 ? { value: Number(c.max), exclusive: false } : void 0;\n for (const k of checks.filter((x) => x.column === c.name && x.kind === \"number\")) {\n if (k.operator === \">=\") min = { value: Number(k.value), exclusive: false };\n else if (k.operator === \">\") min = { value: Number(k.value), exclusive: true };\n else if (k.operator === \"<=\") max = { value: Number(k.value), exclusive: false };\n else if (k.operator === \"<\") max = { value: Number(k.value), exclusive: true };\n }\n const old = target === \"openapi-3.0\";\n if (min) {\n if (min.exclusive && !old) out.exclusiveMinimum = min.value;\n else {\n out.minimum = min.value;\n if (min.exclusive) out.exclusiveMinimum = true;\n }\n }\n if (max) {\n if (max.exclusive && !old) out.exclusiveMaximum = max.value;\n else {\n out.maximum = max.value;\n if (max.exclusive) out.exclusiveMaximum = true;\n }\n }\n}\nfunction cardinalityBounds(c, cardinalities) {\n if (!c.arrayDimensions) return {};\n const out = {};\n for (const k of cardinalities.filter((x) => x.column === c.name)) {\n const n = Number(k.value);\n if (k.operator === \">=\") out.minItems = n;\n else if (k.operator === \">\") out.minItems = n + 1;\n else if (k.operator === \"<=\") out.maxItems = n;\n else if (k.operator === \"<\") out.maxItems = n - 1;\n else if (k.operator === \"=\") {\n out.minItems = n;\n out.maxItems = n;\n }\n }\n return out;\n}\nfunction makeNullable(s, target) {\n if (target === \"openapi-3.0\") return { ...s, nullable: true };\n if (s.type === void 0) {\n if (Array.isArray(s.enum)) return { ...s, enum: [...s.enum, null] };\n if (\"const\" in s) {\n const { const: k, ...rest } = s;\n return { ...rest, enum: [k, null] };\n }\n return s;\n }\n return { ...s, type: [s.type, \"null\"] };\n}\nfunction columnSchema(c, mode, target, checks, sets, lengths, cardinalities, applyDefault) {\n let s = baseSchema(c, mode, target, checks, sets, lengths);\n const dims = c.arrayDimensions ?? 0;\n for (let i = 0; i < dims; i++) {\n s = { type: \"array\", items: s, ...i === dims - 1 ? cardinalityBounds(c, cardinalities) : {} };\n }\n if (c.nullable) s = makeNullable(s, target);\n if (mode === \"insert\" && applyDefault && c.defaultValue !== void 0) {\n s = { ...s, default: c.defaultValue };\n }\n return s;\n}\nfunction rowDescription(rows, cols) {\n const present = new Set(cols.map((c) => c.name));\n const applicable = rows.filter((r) => present.has(r.left) && present.has(r.right));\n if (!applicable.length) return void 0;\n const list = applicable.map((r) => `${r.name ? `${r.name}: ` : \"\"}${r.left} ${r.operator} ${r.right}`).join(\"; \");\n return `Row constraints not expressible in JSON Schema: ${list}`;\n}\nfunction tableSchema(table, cols, mode, target, applyDefaults, parsed) {\n const properties = {};\n const required = [];\n for (const c of cols) {\n properties[c.name] = columnSchema(\n c,\n mode,\n target,\n parsed.checks,\n parsed.sets,\n parsed.lengths,\n parsed.cardinalities,\n applyDefaults\n );\n const suppliedOnInsert = c.hasDefault || applyDefaults && c.defaultValue !== void 0 || c.isGenerated;\n const optional = mode === \"update\" || mode === \"insert\" && suppliedOnInsert;\n if (!optional) required.push(c.name);\n }\n const desc = rowDescription(parsed.rows, cols);\n return {\n ...target === \"draft-2020-12\" ? { $schema: DRAFT } : {},\n $id: `${table.tsName}.${mode}`,\n title: `${mode} ${table.tsName}`,\n ...desc ? { description: desc } : {},\n type: \"object\",\n properties,\n ...required.length ? { required } : {},\n additionalProperties: false\n };\n}\nfunction collect(table) {\n const parsed = (table.checks ?? []).map((k) => parseCheck(k.expression, k.name));\n return {\n checks: parsed.flatMap((p) => p.ok ? p.checks : []),\n sets: parsed.flatMap((p) => p.ok ? p.sets ?? [] : []),\n rows: parsed.flatMap((p) => p.ok ? p.rows ?? [] : []),\n lengths: parsed.flatMap((p) => p.ok ? p.lengths ?? [] : []),\n cardinalities: parsed.flatMap((p) => p.ok ? p.cardinalities ?? [] : [])\n };\n}\nfunction tableSchemas(table, opts = {}) {\n const target = opts.target ?? \"draft-2020-12\";\n const parsed = collect(table);\n const build2 = (cols, mode) => tableSchema(table, cols, mode, target, !!opts.applyDefaults, parsed);\n return {\n insert: build2(insertColumns(table), \"insert\"),\n update: build2(updateColumns(table), \"update\"),\n select: build2(selectColumns(table), \"select\")\n };\n}\nfunction componentsDocument(tables, opts = {}) {\n const schemas = {};\n for (const table of tables) {\n const built = tableSchemas(table, opts);\n for (const mode of [\"insert\", \"update\", \"select\"]) {\n const name = `${table.tsName}${mode[0].toUpperCase()}${mode.slice(1)}`;\n const { $schema: _dialect, $id: _id, ...rest } = built[mode];\n schemas[name] = rest;\n }\n }\n return { schemas };\n}\n\n// src/openapi.ts\nvar ERROR_SCHEMA = \"Error\";\nvar componentName = (table, mode) => `${table.tsName}${mode[0].toUpperCase()}${mode.slice(1)}`;\nvar ref = (name) => ({ $ref: `#/components/schemas/${name}` });\nvar pascal = (s) => s.charAt(0).toUpperCase() + s.slice(1);\nfunction keyColumns(table) {\n const names = table.primaryKey?.columns ?? [];\n if (!names.length) return null;\n const cols = names.map((n) => table.columns.find((c) => c.name === n));\n if (cols.some((c) => !c)) return null;\n return cols;\n}\nvar modesFor = (table, key) => [\n ...table.readOnly ? [] : [\"insert\"],\n ...table.readOnly || !key ? [] : [\"update\"],\n \"select\"\n];\nvar resourceSegment = (table) => table.schema ? `${encodeURIComponent(table.schema)}/${encodeURIComponent(table.name)}` : encodeURIComponent(table.name);\nfunction foreignKeysOf(table) {\n if (table.foreignKeys?.length) return table.foreignKeys;\n return table.columns.filter((c) => c.references).map((c) => ({\n columns: [c.name],\n foreignTable: c.references.table,\n ...c.references.schema ? { foreignSchema: c.references.schema } : {},\n foreignColumns: [c.references.column]\n }));\n}\nvar jsonBody = (schema) => ({ content: { \"application/json\": { schema } } });\nfunction build(tables, opts) {\n const target = opts.target ?? \"draft-2020-12\";\n const schemaTarget = target === \"openapi-3.0\" ? \"openapi-3.0\" : \"openapi-3.1\";\n const failure = String(opts.validationStatus ?? 400);\n const paths = {};\n const schemas = {};\n const tags = [];\n const operationIds = /* @__PURE__ */ new Map();\n const owner = /* @__PURE__ */ new Map();\n const claim = (path, by, label) => {\n const taken = owner.get(path);\n if (taken !== void 0 && taken.by !== by) {\n throw new Error(\n `@drzl/generator-json-schema: the OpenAPI path \"${path}\" is claimed twice: by table \"${taken.label}\" (exported as ${taken.by}) and by table \"${label}\" (exported as ${by}). A path names one resource, so one of the two has to be left out of this generator with the config's \"exclude\" list.`\n );\n }\n owner.set(path, { by, label });\n };\n const operation = (id, table, rest) => {\n const clash = operationIds.get(id);\n if (clash !== void 0) {\n throw new Error(\n `@drzl/generator-json-schema: the operationId \"${id}\" would be emitted for both \"${clash}\" and \"${qualifiedTableName(table)}\". An operationId is the method name a client generator derives, and the specification requires it to be unique across the document.`\n );\n }\n operationIds.set(id, qualifiedTableName(table));\n return { operationId: id, tags: [qualifiedTableName(table)], ...rest };\n };\n const built = tables.map((table) => ({\n table,\n key: keyColumns(table),\n segment: resourceSegment(table),\n schemas: tableSchemas(table, { target: schemaTarget, applyDefaults: opts.applyDefaults })\n }));\n for (const { table, key, segment, schemas: built3 } of built) {\n for (const mode of modesFor(table, key)) {\n const { $schema: _dialect, $id: _id, ...rest } = built3[mode];\n schemas[componentName(table, mode)] = rest;\n }\n const notes = [];\n if (!key) notes.push(\"It has no primary key, so no path addresses a single row.\");\n if (table.readOnly) {\n notes.push(\"It refuses every write, so only reads are described.\");\n }\n tags.push({\n name: qualifiedTableName(table),\n description: [`Table \"${qualifiedTableName(table)}\".`, ...notes].join(\" \")\n });\n const T = pascal(table.tsName);\n const select = ref(componentName(table, \"select\"));\n const validationFailed = {\n description: \"The request does not match the schema for this operation.\",\n ...jsonBody(ref(ERROR_SCHEMA))\n };\n const collidable = [\n ...table.primaryKey ? [`primary key (${table.primaryKey.columns.join(\", \")})`] : [],\n ...table.unique.map((u) => `${u.name ? `${u.name} ` : \"\"}(${u.columns.join(\", \")})`)\n ];\n const conflict = (constraints) => ({\n description: `The row collides with an existing one on ${constraints.join(\"; \")}.`,\n ...jsonBody(ref(ERROR_SCHEMA))\n });\n const collection = `/${segment}`;\n claim(collection, table.tsName, qualifiedTableName(table));\n const item = {\n get: operation(`list${T}`, table, {\n summary: `List every ${table.name} row.`,\n // No pagination parameters. Whether the server implements a limit, an offset or a cursor is\n // not something a Drizzle schema states, and a declared parameter nothing honours is worse\n // than an undeclared one.\n responses: {\n \"200\": {\n description: `Every ${table.name} row.`,\n ...jsonBody({ type: \"array\", items: select })\n }\n }\n })\n };\n if (!table.readOnly) {\n item.post = operation(`create${T}`, table, {\n summary: `Create a ${table.name} row.`,\n requestBody: { required: true, ...jsonBody(ref(componentName(table, \"insert\"))) },\n responses: {\n \"201\": { description: `The ${table.name} row that was created.`, ...jsonBody(select) },\n [failure]: validationFailed,\n ...collidable.length ? { \"409\": conflict(collidable) } : {}\n }\n });\n }\n paths[collection] = item;\n if (!key) continue;\n const itemPath = `${collection}/${key.map((c) => `{${c.name}}`).join(\"/\")}`;\n claim(itemPath, table.tsName, qualifiedTableName(table));\n const parameters = key.map((c) => ({\n name: c.name,\n in: \"path\",\n required: true,\n description: `${c.name}, from the primary key of ${table.name}.`,\n // The column's own schema rather than a string, so an integer key is declared as one and a\n // uuid key carries its format. This is the whole point of reading the real key.\n schema: built3.select.properties[c.name] ?? {}\n }));\n const missing = {\n description: `No ${table.name} row has that ${key.map((c) => c.name).join(\" and \")}.`,\n ...jsonBody(ref(ERROR_SCHEMA))\n };\n const byId = {\n parameters,\n get: operation(`get${T}`, table, {\n summary: `Read one ${table.name} row.`,\n responses: {\n \"200\": { description: `The requested ${table.name} row.`, ...jsonBody(select) },\n [failure]: validationFailed,\n \"404\": missing\n }\n })\n };\n if (!table.readOnly) {\n byId.patch = operation(`update${T}`, table, {\n summary: `Patch one ${table.name} row.`,\n requestBody: { required: true, ...jsonBody(ref(componentName(table, \"update\"))) },\n responses: {\n \"200\": { description: `The ${table.name} row after the patch.`, ...jsonBody(select) },\n [failure]: validationFailed,\n \"404\": missing,\n // The primary key is not in the update schema, so a patch cannot collide on it. Only a\n // unique constraint over other columns can.\n ...table.unique.length ? {\n \"409\": conflict(\n table.unique.map((u) => `${u.name ? `${u.name} ` : \"\"}(${u.columns.join(\", \")})`)\n )\n } : {}\n }\n });\n byId.delete = operation(`delete${T}`, table, {\n summary: `Delete one ${table.name} row.`,\n responses: {\n // No body. Handing back the deleted row is the alternative and it is not a true statement\n // on every dialect DRZL supports: RETURNING is Postgres and SQLite, and MySQL has no such\n // clause, so an implementation there has nothing to send.\n \"204\": { description: `The ${table.name} row was deleted. No content is returned.` },\n [failure]: validationFailed,\n \"404\": missing\n }\n });\n }\n paths[itemPath] = byId;\n if (!opts.includeRelations) continue;\n for (const child of built) {\n if (child.table === table) continue;\n const matching = foreignKeysOf(child.table).filter(\n (fk) => (\n // Qualified on both sides. On the bare name a key pointing at `reporting.users` also\n // answered for `public.users`, so the child was hung under a parent in another schema.\n qualifiedForeignTable(fk) === qualifiedTableName(table) && fk.foreignColumns.length === key.length && fk.foreignColumns.every((c, i) => c === key[i].name)\n )\n );\n if (matching.length !== 1) continue;\n const subPath = `${itemPath}/${child.segment}`;\n claim(\n subPath,\n `${table.tsName} -> ${child.table.tsName}`,\n `${qualifiedTableName(table)} -> ${qualifiedTableName(child.table)}`\n );\n paths[subPath] = {\n parameters,\n get: operation(`list${T}${pascal(child.table.tsName)}`, child.table, {\n summary: `List the ${child.table.name} rows belonging to one ${table.name} row.`,\n responses: {\n \"200\": {\n description: `The ${child.table.name} rows whose ${matching[0].columns.join(\", \")} names this ${table.name} row.`,\n ...jsonBody({ type: \"array\", items: ref(componentName(child.table, \"select\")) })\n },\n [failure]: validationFailed,\n \"404\": missing\n }\n })\n };\n }\n }\n return { paths, schemas, tags };\n}\nvar errorSchema = () => ({\n title: \"error\",\n description: \"What an operation returns when it does not return the row.\",\n type: \"object\",\n properties: {\n message: { type: \"string\" },\n code: { type: \"string\" }\n },\n required: [\"message\"],\n additionalProperties: true\n});\nfunction openApiDocument(tables, opts = {}) {\n const target = opts.target ?? \"draft-2020-12\";\n const { paths, schemas, tags } = build(tables, opts);\n if (ERROR_SCHEMA in schemas) {\n throw new Error(\n `@drzl/generator-json-schema: a table produced the component schema name \"${ERROR_SCHEMA}\", which the document already uses for its error responses.`\n );\n }\n return {\n openapi: target === \"openapi-3.0\" ? \"3.0.3\" : \"3.1.1\",\n info: {\n title: opts.info?.title ?? \"API\",\n version: opts.info?.version ?? \"0.0.0\",\n description: opts.info?.description ?? \"Generated by DRZL from a Drizzle schema. Paths, request bodies and response bodies are derived from the schema alone; nothing here has been checked against a running server.\"\n },\n ...opts.servers?.length ? { servers: opts.servers } : {},\n paths,\n components: { schemas: { ...schemas, [ERROR_SCHEMA]: errorSchema() } },\n tags\n };\n}\n\n// src/index.ts\nvar DEFAULT_FILE_SUFFIX = \".schema.ts\";\nfunction renderTableModule(table, affix, target, applyDefaults) {\n const T = table.tsName;\n const schemas = tableSchemas(table, { target, applyDefaults });\n const decl = (mode) => `export const ${schemaName(mode, T, affix)} = ${JSON.stringify(schemas[mode], null, 2)} as const;\n\nexport type ${typeName(mode, T, affix)} = typeof ${schemaName(mode, T, affix)};`;\n return [decl(\"insert\"), decl(\"update\"), decl(\"select\")].join(\"\\n\\n\") + \"\\n\";\n}\nfunction resolveDocument(opt) {\n if (!opt) return null;\n const o = opt === true ? {} : opt;\n if (o.enabled === false) return null;\n return { ...o, format: o.format ?? \"ts\" };\n}\nvar JsonSchemaGenerator = class {\n constructor(analysis) {\n this.analysis = analysis;\n this.library = \"json-schema\";\n }\n async generate(opts) {\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n const out = path.resolve(process.cwd(), opts.outDir);\n const files = [];\n await fs.mkdir(out, { recursive: true });\n const affix = resolveAffix(opts);\n const fileSuffix = opts.fileSuffix ?? DEFAULT_FILE_SUFFIX;\n const target = opts.target ?? \"draft-2020-12\";\n const document = resolveDocument(opts.document);\n for (const table of this.analysis.tables) {\n const filePath = path.join(out, moduleFileName(table.tsName, fileSuffix));\n const code = renderTableModule(table, affix, target, !!opts.applyDefaults);\n const formatted = await formatCode(\n buildHeader(opts.outputHeader) + code,\n filePath,\n opts.format\n );\n await fs.writeFile(filePath, formatted, \"utf8\");\n files.push(filePath);\n }\n if (opts.components) {\n const doc = componentsDocument(this.analysis.tables, {\n target,\n applyDefaults: !!opts.applyDefaults\n });\n const componentsPath = path.join(out, \"components.ts\");\n const code = `export const components = ${JSON.stringify(doc, null, 2)} as const;\n`;\n await fs.writeFile(\n componentsPath,\n await formatCode(buildHeader(opts.outputHeader) + code, componentsPath, opts.format),\n \"utf8\"\n );\n files.push(componentsPath);\n }\n if (document) {\n const built = openApiDocument(this.analysis.tables, {\n target,\n applyDefaults: !!opts.applyDefaults,\n includeRelations: !!opts.includeRelations,\n info: document.info,\n servers: document.servers,\n validationStatus: document.validationStatus\n });\n const body = JSON.stringify(built, null, 2);\n if (document.format !== \"json\") {\n const tsPath = path.join(out, \"openapi.ts\");\n const code = `export const openapi = ${body} as const;\n`;\n await fs.writeFile(\n tsPath,\n await formatCode(buildHeader(opts.outputHeader) + code, tsPath, opts.format),\n \"utf8\"\n );\n files.push(tsPath);\n }\n if (document.format !== \"ts\") {\n const jsonPath = path.join(out, \"openapi.json\");\n await fs.writeFile(jsonPath, body + \"\\n\", \"utf8\");\n files.push(jsonPath);\n }\n }\n const ext = opts.importExtension === \"none\" ? \"\" : \".js\";\n const indexPath = path.join(out, \"index.ts\");\n const index = this.analysis.tables.map(\n (t) => `export * from '${moduleSpecifier(t.tsName, fileSuffix, opts.importExtension)}';`\n ).concat(opts.components ? [`export * from './components${ext}';`] : []).concat(document && document.format !== \"json\" ? [`export * from './openapi${ext}';`] : []).join(\"\\n\") + \"\\n\";\n const indexFormatted = await formatCode(\n buildHeader(opts.outputHeader) + index,\n indexPath,\n opts.format\n );\n await fs.writeFile(indexPath, indexFormatted, \"utf8\");\n files.push(indexPath);\n return files;\n }\n renderTable(table, opts) {\n return renderTableModule(\n table,\n resolveAffix(opts),\n opts?.target ?? \"draft-2020-12\",\n !!opts?.applyDefaults\n );\n }\n};\nvar index_default = JsonSchemaGenerator;\nfunction buildHeader(h) {\n if (h?.enabled === false) return \"\";\n const text = h?.text ?? \"// Generated by DRZL. Do not edit by hand.\";\n return `${text}\n\n`;\n}\nexport {\n DRAFT,\n JsonSchemaGenerator,\n componentsDocument,\n index_default as default,\n openApiDocument,\n tableSchemas\n};\n","// src/index.ts\nimport {\n buildBrandPlan,\n buildNestedPlan,\n formatCode,\n nestedArmNotes,\n nestedNodeColumns,\n nestedSchemaName,\n nestedTypeName,\n resolveNestedDepth,\n CODEPOINT_LENGTH,\n COERCIBLE_DATE_STRING,\n COLUMN_FORMATS,\n insertColumns,\n isIntegerColumn,\n moduleFileName,\n moduleSpecifier,\n nonFiniteAccepted,\n parseCheck,\n parsesToADate,\n renderDuplicateFinder,\n resolveAffix,\n resolveConfiguredImport,\n schemaName,\n selectColumns,\n typeName,\n updateColumns\n} from \"@drzl/validation-core\";\nvar DEFAULT_FILE_SUFFIX = \".effect.ts\";\nvar STANDARD_PREFIX = \"Standard\";\nvar NS = \"Schema\";\nvar OPS = {\n \">=\": \">=\",\n \">\": \">\",\n \"<=\": \"<=\",\n \"<\": \"<\",\n \"=\": \"===\",\n \"<>\": \"!==\"\n};\nfunction filter(expr, description) {\n return `${NS}.filter((v) => ${expr}, { description: ${JSON.stringify(description)} })`;\n}\nfunction piped(base, steps) {\n return steps.length ? `${base}.pipe(${steps.join(\", \")})` : base;\n}\nvar JSON_CONST = \"DrzlJsonValue\";\nvar JSON_PREAMBLE = `type ${JSON_CONST}Type =\n | string\n | number\n | boolean\n | null\n | readonly ${JSON_CONST}Type[]\n | { readonly [key: string]: ${JSON_CONST}Type };\n\nconst ${JSON_CONST}: ${NS}.Schema<${JSON_CONST}Type, unknown> = ${NS}.suspend(() =>\n ${NS}.Union(\n ${NS}.String,\n ${NS}.Finite,\n ${NS}.Boolean,\n ${NS}.Null,\n ${NS}.Array(${JSON_CONST}),\n // The plain-object test comes before the record, not after it. \\`Schema.Record\\` rebuilds its\n // output, so a check placed after it inspects that new object and reports every input as\n // plain. A Date sailed through: it has no own enumerable keys, so the record accepted it and\n // rebuilt it as \\`{}\\`.\n ${NS}.Unknown.pipe(\n ${NS}.filter(\n (o) => {\n if (typeof o !== 'object' || o === null || Array.isArray(o)) return false;\n const p = Object.getPrototypeOf(o);\n return p === Object.prototype || p === null;\n },\n { description: 'a plain object' }\n ),\n ${NS}.compose(${NS}.Record({ key: ${NS}.String, value: ${JSON_CONST} }), { strict: false })\n )\n )\n);\n`;\nvar UNKNOWN_EXPR = `${NS}.Unknown`;\nfunction isUnknownExpr(expr) {\n return expr === UNKNOWN_EXPR;\n}\nfunction withNarrowedType(expr, ref) {\n return `${expr} as unknown as ${NS}.Schema<${ref}>`;\n}\nfunction numericBounds(c, checks) {\n let lo = c.min !== void 0 ? { fn: \"greaterThanOrEqualTo\", value: c.min } : void 0;\n let hi = c.max !== void 0 ? { fn: \"lessThanOrEqualTo\", value: c.max } : void 0;\n for (const k of checks.filter((x) => x.column === c.name && x.kind === \"number\")) {\n if (k.operator === \">=\") lo = { fn: \"greaterThanOrEqualTo\", value: k.value };\n else if (k.operator === \">\") lo = { fn: \"greaterThan\", value: k.value };\n else if (k.operator === \"<=\") hi = { fn: \"lessThanOrEqualTo\", value: k.value };\n else if (k.operator === \"<\") hi = { fn: \"lessThan\", value: k.value };\n }\n return [lo, hi].filter(Boolean).map((x) => `${NS}.${x.fn}(${x.value})`);\n}\nfunction foldedIntoBounds(c, checks) {\n if (c.arrayDimensions || c.shape) return /* @__PURE__ */ new Set();\n if (c.tsType !== \"number\" && c.tsType !== \"bigint\") return /* @__PURE__ */ new Set();\n return new Set(\n checks.filter(\n (k) => k.column === c.name && k.kind === \"number\" && k.operator !== \"=\" && k.operator !== \"<>\"\n )\n );\n}\nfunction nonFiniteBranches(c) {\n const { nan, infinity } = nonFiniteAccepted(c);\n return [\n ...nan ? [`${NS}.Number.pipe(${filter(\"Number.isNaN(v)\", \"NaN, which this column stores\")})`] : [],\n ...infinity ? [`${NS}.Literal(Infinity, -Infinity)`] : []\n ];\n}\nfunction withNonFinite(c, base) {\n const branches = nonFiniteBranches(c);\n return branches.length ? `${NS}.Union(${base}, ${branches.join(\", \")})` : base;\n}\nfunction dateExpr(mode, coerceDates) {\n const plain = `${NS}.ValidDateFromSelf`;\n if (coerceDates === \"none\") return plain;\n const fromString = piped(`${NS}.String`, [\n `${NS}.pattern(new RegExp(${JSON.stringify(COERCIBLE_DATE_STRING)}))`,\n filter(parsesToADate(\"new Date(v)\"), \"a date the runtime can parse\")\n ]);\n const fromNumber = piped(`${NS}.Number`, [\n filter(parsesToADate(\"new Date(v)\"), \"a date the runtime can parse\")\n ]);\n const union = `${NS}.Union(${plain}, ${fromString}, ${fromNumber})`;\n if (coerceDates === \"all\") return union;\n return mode === \"select\" ? plain : union;\n}\nfunction capSteps(c, mode) {\n const steps = [];\n if (c.shape?.kind === \"byteString\") {\n const n = c.shape.length;\n if (!n) return steps;\n return mode === \"select\" ? [filter(`${CODEPOINT_LENGTH} <= ${n}`, `at most ${n} characters`)] : [filter(`new TextEncoder().encode(v).length <= ${n}`, `at most ${n} bytes`)];\n }\n if (c.maxLength) {\n steps.push(\n filter(`${CODEPOINT_LENGTH} <= ${c.maxLength}`, `at most ${c.maxLength} characters`)\n );\n }\n if (c.maxBytes) {\n steps.push(\n filter(`new TextEncoder().encode(v).length <= ${c.maxBytes}`, `at most ${c.maxBytes} bytes`)\n );\n }\n return steps;\n}\nfunction lengthSteps(c, lengths) {\n if (c.arrayDimensions || c.shape) return [];\n return lengths.filter((k) => k.column === c.name).map(\n (k) => filter(\n `${CODEPOINT_LENGTH} ${OPS[k.operator]} ${k.value}`,\n `${k.name ? `${k.name}: ` : \"\"}length(${c.name}) ${k.operator} ${k.value}`\n )\n );\n}\nfunction cardinalitySteps(c, cardinalities) {\n if (!c.arrayDimensions) return [];\n return cardinalities.filter((k) => k.column === c.name).map(\n (k) => filter(\n `v.length ${OPS[k.operator]} ${k.value}`,\n `${k.name ? `${k.name}: ` : \"\"}cardinality(${c.name}) ${k.operator} ${k.value}`\n )\n );\n}\nfunction checkSteps(c, checks) {\n if (c.arrayDimensions || c.shape) return [];\n const folded = foldedIntoBounds(c, checks);\n return checks.filter((k) => k.column === c.name && !folded.has(k)).map((k) => {\n const literal = k.kind === \"string\" ? JSON.stringify(k.value) : k.value;\n return filter(\n `v ${OPS[k.operator]} ${literal}`,\n `${k.name ? `${k.name}: ` : \"\"}${c.name} ${k.operator} ${k.value}`\n );\n });\n}\nfunction hasNoRuntimeType(c) {\n return c.tsType === \"any\" || c.shape?.kind === \"custom\" || c.shape?.kind === \"json\";\n}\nfunction shapeExpr(c, mode, replaced = false) {\n const s = c.shape;\n if (!s) return void 0;\n switch (s.kind) {\n case \"json\":\n return replaced ? UNKNOWN_EXPR : JSON_CONST;\n case \"custom\":\n return UNKNOWN_EXPR;\n case \"buffer\":\n return `${NS}.Uint8ArrayFromSelf`;\n case \"tuple\":\n return `${NS}.Tuple(${Array.from({ length: s.length }, () => `${NS}.Number`).join(\", \")})`;\n case \"numberObject\":\n return `${NS}.Struct({ ${s.fields.map((f) => `${f}: ${NS}.Number`).join(\", \")} })`;\n case \"numberVector\":\n return piped(\n `${NS}.Array(${NS}.Number)`,\n s.length ? [filter(`v.length === ${s.length}`, `exactly ${s.length} elements`)] : []\n );\n case \"bitstring\":\n return piped(`${NS}.String`, [\n `${NS}.pattern(/^[01]*$/)`,\n ...s.length ? [\n s.exact ? filter(`v.length === ${s.length}`, `exactly ${s.length} binary digits`) : filter(`v.length <= ${s.length}`, `at most ${s.length} binary digits`)\n ] : []\n ]);\n case \"byteString\":\n return piped(`${NS}.String`, capSteps(c, mode));\n }\n}\nfunction exprForColumn(c, mode, coerceDates, checks, sets, lengths, replaced) {\n const shaped = shapeExpr(c, mode, replaced);\n if (shaped) return shaped;\n const set = sets.find((x) => x.column === c.name);\n if (set) {\n const values = set.values.map((v) => set.kind === \"string\" ? JSON.stringify(v) : v);\n return `${NS}.Literal(${values.join(\", \")})`;\n }\n if (c.arrayDimensions) checks = [];\n if (c.enumValues && c.enumValues.length) {\n return `${NS}.Literal(${c.enumValues.map((v) => JSON.stringify(v)).join(\", \")})`;\n }\n const eq = checks.find((k) => k.column === c.name && k.operator === \"=\");\n if (eq && !c.shape) {\n return `${NS}.Literal(${eq.kind === \"string\" ? JSON.stringify(eq.value) : eq.value})`;\n }\n const rest = [...checkSteps(c, checks), ...lengthSteps(c, lengths)];\n switch (c.tsType) {\n case \"string\": {\n const base = c.format === \"uuid\" ? `${NS}.UUID` : `${NS}.String`;\n const pattern = c.format && c.format !== \"uuid\" && COLUMN_FORMATS[c.format] ? [`${NS}.pattern(new RegExp(${JSON.stringify(COLUMN_FORMATS[c.format])}))`] : [];\n return piped(base, [...pattern, ...capSteps(c, mode), ...rest]);\n }\n case \"number\": {\n const base = isIntegerColumn(c) ? `${NS}.Int` : `${NS}.Finite`;\n return withNonFinite(c, piped(base, [...numericBounds(c, checks), ...rest]));\n }\n case \"bigint\":\n return piped(`${NS}.BigIntFromSelf`, [\n ...c.min !== void 0 ? [`${NS}.greaterThanOrEqualToBigInt(${c.min}n)`] : [],\n ...c.max !== void 0 ? [`${NS}.lessThanOrEqualToBigInt(${c.max}n)`] : [],\n ...rest\n ]);\n case \"boolean\":\n return `${NS}.Boolean`;\n case \"Date\":\n return dateExpr(mode, coerceDates);\n case \"Uint8Array\":\n return `${NS}.Uint8ArrayFromSelf`;\n case \"any\":\n return UNKNOWN_EXPR;\n default:\n return UNKNOWN_EXPR;\n }\n}\nfunction renderField(c, mode, coerceDates, checks, sets, lengths, cardinalities, applyDefault, narrowRef, brand) {\n let expr = exprForColumn(\n c,\n mode,\n coerceDates,\n checks,\n sets,\n lengths,\n !!narrowRef && hasNoRuntimeType(c)\n );\n const dims = c.arrayDimensions ?? 0;\n for (let i = 0; i < dims; i++) {\n expr = `${NS}.Array(${expr})`;\n if (i === dims - 1) expr = piped(expr, cardinalitySteps(c, cardinalities));\n }\n if (brand) expr = piped(expr, [`${NS}.brand(${JSON.stringify(brand)})`]);\n if (c.nullable && !isUnknownExpr(expr)) expr = `${NS}.NullOr(${expr})`;\n if (narrowRef && !brand) expr = withNarrowedType(expr, narrowRef);\n if (mode === \"select\") return expr;\n const wantsDefault = mode === \"insert\" && applyDefault && c.defaultValue !== void 0;\n if (wantsDefault) {\n return `${NS}.optionalWith(${expr}, { default: () => ${JSON.stringify(c.defaultValue)} })`;\n }\n if (mode === \"update\" || c.nullable || c.hasDefault) return `${NS}.optional(${expr})`;\n return expr;\n}\nfunction wantsRef(c, allColumns) {\n return allColumns || hasNoRuntimeType(c);\n}\nfunction renderObjectShape(cols, mode, coerceDates, checks, sets, lengths, cardinalities, typedJson, applyDefaults, brands) {\n return cols.map((c) => {\n const ref = typedJson && wantsRef(c, !!typedJson.allColumns) ? `(typeof ${typedJson.table}.$infer${typedJson.mode === \"insert\" ? \"Insert\" : \"Select\"})[${JSON.stringify(c.name)}]` : void 0;\n const field = renderField(\n c,\n mode,\n coerceDates,\n checks,\n sets,\n lengths,\n cardinalities,\n applyDefaults,\n ref,\n brands?.plan.brandOf(brands.tsName, c.name)\n );\n return ` ${JSON.stringify(c.name)}: ${field},`;\n }).join(\"\\n\");\n}\nfunction rowSteps(rows, cols) {\n const present = new Set(cols.map((c) => c.name));\n return rows.filter((r) => present.has(r.left) && present.has(r.right)).map((r) => {\n const l = `o[${JSON.stringify(r.left)}]`;\n const rt = `o[${JSON.stringify(r.right)}]`;\n const msg = `${r.name ? `${r.name}: ` : \"\"}${r.left} ${r.operator} ${r.right}`;\n return `${NS}.filter((o) => ${l} == null || ${rt} == null || ${l} ${OPS[r.operator]} ${rt}, { description: ${JSON.stringify(msg)} })`;\n });\n}\nfunction indentBlock(code, by = \" \") {\n return code.split(\"\\n\").map((line) => line ? by + line : line).join(\"\\n\");\n}\nfunction parsedChecksFor(table) {\n const parsed = (table.checks ?? []).map((k) => parseCheck(k.expression, k.name));\n return {\n checks: parsed.flatMap((p) => p.ok ? p.checks : []),\n sets: parsed.flatMap((p) => p.ok ? p.sets ?? [] : []),\n rows: parsed.flatMap((p) => p.ok ? p.rows ?? [] : []),\n lengths: parsed.flatMap((p) => p.ok ? p.lengths ?? [] : []),\n cardinalities: parsed.flatMap((p) => p.ok ? p.cardinalities ?? [] : [])\n };\n}\nfunction nestedNodeCols(node, mode) {\n const all = mode === \"insert\" ? insertColumns(node.table) : selectColumns(node.table);\n return nestedNodeColumns(all, node);\n}\nfunction nestedNodes(node, into = []) {\n into.push(node);\n for (const arm of node.arms) nestedNodes(arm.child, into);\n return into;\n}\nfunction renderNestedObject(node, mode, coerceDates, typedJson, applyDefaults, brands) {\n const cols = nestedNodeCols(node, mode);\n const { checks, sets, rows, lengths, cardinalities } = parsedChecksFor(node.table);\n const tj = typedJson ? { table: node.table.tsName, mode, allColumns: typedJson.allColumns } : void 0;\n const fields = renderObjectShape(\n cols,\n mode,\n coerceDates,\n checks,\n sets,\n lengths,\n cardinalities,\n tj,\n applyDefaults,\n brands ? { plan: brands, tsName: node.table.tsName } : void 0\n );\n const arms = node.arms.map((arm) => {\n const notes = nestedArmNotes(arm).map((n) => ` // ${n}\n`).join(\"\");\n const child = renderNestedObject(\n arm.child,\n mode,\n coerceDates,\n typedJson,\n applyDefaults,\n brands\n );\n const inner = arm.single ? `${NS}.NullOr(\n${indentBlock(indentBlock(child))}\n )` : `${NS}.Array(\n${indentBlock(indentBlock(child))}\n )`;\n return `${notes} ${JSON.stringify(arm.key)}: ${NS}.optional(${inner}),`;\n });\n const body = [fields, ...arms].filter(Boolean).join(\"\\n\");\n return piped(`${NS}.Struct({\n${body}\n})`, rowSteps(rows, cols));\n}\nfunction renderNestedSchemas(table, affix, coerceDates, typedJson, applyDefaults, plans, brands) {\n const out = [];\n for (const mode of [\"insert\", \"select\"]) {\n const plan = plans[mode];\n if (!plan) continue;\n const name = nestedSchemaName(mode, table.tsName, affix);\n const tname = nestedTypeName(mode, table.tsName, affix);\n const expr = renderNestedObject(plan, mode, coerceDates, typedJson, applyDefaults, brands);\n out.push(\n `export const ${name} = ${expr};\n\nexport type ${tname} = ${NS}.Schema.Type<typeof ${name}>;\n\nexport const ${STANDARD_PREFIX}${name} = ${NS}.standardSchemaV1(${name});`\n );\n }\n return out.length ? `\n${out.join(\"\\n\\n\")}\n` : \"\";\n}\nfunction nestedPlansFor(table, analysis, depth) {\n const out = {};\n for (const mode of [\"insert\", \"select\"]) {\n if (mode === \"insert\" && table.readOnly) continue;\n const plan = buildNestedPlan(table, analysis.tables, analysis.relations ?? [], mode, depth);\n if (plan) out[mode] = plan;\n }\n return out;\n}\nfunction renderTableSchemas(table, affix, coerceDates, typedJson, applyDefaults = false, wantsDuplicateFinder = false, nested = {}, brands) {\n const T = table.tsName;\n const insertCols = insertColumns(table);\n const updateCols = updateColumns(table);\n const selectCols = selectColumns(table);\n const { checks, sets, rows, lengths, cardinalities } = parsedChecksFor(table);\n const tj = typedJson ? { table: T, allColumns: typedJson.allColumns } : void 0;\n const modes = [\n [\"insert\", insertCols],\n [\"update\", updateCols],\n [\"select\", selectCols]\n ];\n const blocks = modes.map(([mode, cols]) => {\n const name = schemaName(mode, T, affix);\n const tname = typeName(mode, T, affix);\n const body = renderObjectShape(\n cols,\n mode,\n coerceDates,\n checks,\n sets,\n lengths,\n cardinalities,\n // The update schema references the insert-side inferred types: both describe a value going\n // in, and `$inferSelect` would name the post-default type for a column a write may omit.\n tj ? { ...tj, mode: mode === \"select\" ? \"select\" : \"insert\" } : void 0,\n applyDefaults,\n brands ? { plan: brands, tsName: T } : void 0\n );\n const expr = piped(`${NS}.Struct({\n${body}\n})`, rowSteps(rows, cols));\n return `export const ${name} = ${expr};\n\nexport type ${tname} = ${NS}.Schema.Type<typeof ${name}>;\n\nexport const ${STANDARD_PREFIX}${name} = ${NS}.standardSchemaV1(${name});`;\n });\n const nestedByTable = [\"insert\", \"select\"].flatMap((m) => {\n const plan = nested[m];\n return plan ? nestedNodes(plan).map((n) => [n.table.tsName, nestedNodeCols(n, m)]) : [];\n });\n const nestedCols = nestedByTable.flatMap(([, cs]) => cs);\n const referenced = /* @__PURE__ */ new Set();\n if (typedJson) {\n const all = !!typedJson.allColumns;\n if ([...insertCols, ...updateCols, ...selectCols].some((c) => wantsRef(c, all))) {\n referenced.add(T);\n }\n for (const [name, cs] of nestedByTable) {\n if (cs.some((c) => wantsRef(c, all))) referenced.add(name);\n }\n }\n const schemaImport = referenced.size ? `import type { ${[...referenced].join(\", \")} } from '${typedJson.schemaSpecifier}';\n` : \"\";\n const needsJson = !typedJson && [...insertCols, ...updateCols, ...selectCols, ...nestedCols].some(\n (c) => c.shape?.kind === \"json\"\n );\n const finder = wantsDuplicateFinder ? renderDuplicateFinder(table, `findDuplicate${T}`, typeName(\"insert\", T, affix)) : void 0;\n const duplicates = finder ? `\n${finder}\n` : \"\";\n const nestedCode = renderNestedSchemas(\n table,\n affix,\n coerceDates,\n typedJson,\n applyDefaults,\n nested,\n brands\n );\n const selectName = schemaName(\"select\", T, affix);\n const brandAliases = (brands?.aliasesFor(T) ?? []).map(\n (a) => `/** The nominal type of ${T}.${a.column}. */\nexport type ${a.alias} = ${NS}.Schema.Type<typeof ${selectName}>[${JSON.stringify(a.column)}];`\n ).join(\"\\n\\n\");\n const brandCode = brandAliases ? `\n${brandAliases}\n` : \"\";\n return `import * as ${NS} from 'effect/Schema';\n${schemaImport}${needsJson ? `\n${JSON_PREAMBLE}` : \"\"}\n${blocks.join(\"\\n\\n\")}\n${brandCode}${nestedCode}${duplicates}`;\n}\nvar EffectGenerator = class {\n constructor(analysis) {\n this.analysis = analysis;\n this.library = \"effect\";\n }\n async generate(opts) {\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n const out = path.resolve(process.cwd(), opts.outDir);\n const files = [];\n await fs.mkdir(out, { recursive: true });\n const affix = resolveAffix(opts);\n const coerceDates = opts.coerceDates ?? \"input\";\n const fileSuffix = opts.fileSuffix ?? DEFAULT_FILE_SUFFIX;\n const wantsTypes = opts.typedJson || opts.typedColumns;\n const typedJson = wantsTypes && opts.schemaPath ? {\n schemaSpecifier: resolveConfiguredImport(\n opts.schemaPath,\n out,\n process.cwd(),\n opts.importExtension\n ),\n allColumns: !!opts.typedColumns\n } : void 0;\n if (wantsTypes && !opts.schemaPath) {\n console.warn(\n \"[drzl] typedJson was requested but the schema path is unknown, so json columns keep their wide type.\"\n );\n }\n const nestedDepth = opts.nestedSchemas ? resolveNestedDepth(opts.nestedDepth, (m) => console.warn(m)) : 0;\n const brands = buildBrandPlan(this.analysis.tables, opts.branded);\n for (const note of brands?.notes ?? []) console.warn(`[drzl] ${note}`);\n for (const table of this.analysis.tables) {\n const filePath = path.join(out, moduleFileName(table.tsName, fileSuffix));\n const code = renderTableSchemas(\n table,\n affix,\n coerceDates,\n typedJson,\n !!opts.applyDefaults,\n !!opts?.duplicateFinder,\n opts.nestedSchemas ? nestedPlansFor(table, this.analysis, nestedDepth) : {},\n brands\n );\n const formatted = await formatCode(\n buildHeader(opts.outputHeader) + code,\n filePath,\n opts.format\n );\n await fs.writeFile(filePath, formatted, \"utf8\");\n files.push(filePath);\n }\n const indexPath = path.join(out, \"index.ts\");\n const indexFormatted = await formatCode(\n buildHeader(opts.outputHeader) + this.defaultIndex(this.analysis, opts),\n indexPath,\n opts.format\n );\n await fs.writeFile(indexPath, indexFormatted, \"utf8\");\n files.push(indexPath);\n return files;\n }\n renderTable(table, opts) {\n return renderTableSchemas(\n table,\n resolveAffix(opts),\n opts?.coerceDates ?? \"input\",\n void 0,\n !!opts?.applyDefaults,\n !!opts?.duplicateFinder,\n {},\n buildBrandPlan(this.analysis.tables, opts?.branded)\n );\n }\n defaultIndex(analysis, opts) {\n const fileSuffix = opts.fileSuffix ?? DEFAULT_FILE_SUFFIX;\n return analysis.tables.map(\n (t) => `export * from '${moduleSpecifier(t.tsName, fileSuffix, opts.importExtension)}';`\n ).join(\"\\n\") + \"\\n\";\n }\n};\nvar index_default = EffectGenerator;\nfunction buildHeader(h) {\n if (h && h.enabled === false) return \"\";\n const text = h?.text?.trim();\n const lines = text ? text.split(/\\r?\\n/).map((l) => `// ${l}`) : [\n \"// Generated by DRZL (@drzl/*)\",\n \"// Generated output is granted to you under your project's license.\",\n \"// You may use, copy, modify, and distribute without attribution.\"\n ];\n return lines.join(\"\\n\") + \"\\n\\n\";\n}\nexport {\n EffectGenerator,\n index_default as default\n};\n","#!/usr/bin/env node\nimport { SchemaAnalyzer } from '@drzl/analyzer';\nimport { ORPCGenerator } from '@drzl/generator-orpc';\nimport chalk from 'chalk';\nimport chokidar from 'chokidar';\nimport cliProgress from 'cli-progress';\nimport { Command } from 'commander';\nimport * as path from 'node:path';\nimport ora from 'ora';\nimport { jsonSchemaOptions } from './json-schema-options.js';\nimport { trpcOptions } from './trpc-options.js';\nimport { validationOptions } from './validation-options';\nimport {\n computeGeneratorOutputDirs,\n computeWatchTargets,\n DrzlConfig,\n filterTables,\n loadConfig,\n tableFilterWarnings,\n} from './config.js';\nimport { filterColumns } from './column-filter.js';\nimport { buildDoctorReport, renderDoctorReport } from './doctor.js';\nimport { diffSnapshots, restoreSnapshot, snapshotAll } from './drift.js';\nimport { GeneratorNotInstalledError, loadGenerator } from './generator-loader.js';\nimport { maybeShowSponsorMessage } from './sponsor.js';\nimport { CLI_VERSION } from './version.js';\n\n/**\n * Say what went wrong with a generator, distinguishing the two things that can.\n *\n * Every branch below used to print \"<name> generator missing. Install with: npm install\n * @drzl/generator-<name>\" for anything at all that threw, with the real reason on a trailing\n * \"Error details\" line. A generator that was installed and merely failed therefore sent its user\n * to reinstall a package they already had, and the sentence that would have told them what\n * actually happened was the one written as a footnote.\n *\n * `loadGenerator` marks the one case that is an install problem, so the package name comes off the\n * error rather than being repeated here beside the `import()` that already spells it.\n */\nfunction reportGeneratorFailure(kind: string, e: unknown): void {\n if (e instanceof GeneratorNotInstalledError) {\n console.error(\n chalk.red(`The ${kind} generator is not installed.`),\n chalk.yellow(`\\nInstall with: npm install ${e.specifier}`)\n );\n return;\n }\n console.error(chalk.red(`The ${kind} generator failed:`), (e as any)?.message ?? e);\n}\n\nconst program = new Command();\nprogram.name('drzl').description('DRZL - Drizzle Developer Toolkit').version(CLI_VERSION);\nprogram.addHelpText(\n 'afterAll',\n `\\nNeed a template, adapter, or generator DRZL doesn't ship yet?\\n→ DM @omardulaimidev on X: https://x.com/omardulaimidev\\n`\n);\n\nprogram\n .command('analyze')\n .argument('<schema>', 'path to drizzle schema (TS)')\n .option('--relations', 'include relations', true)\n .option('--validate', 'validate constraints', true)\n .option('--out <file>', 'write analysis JSON to file')\n .option('--json', 'print JSON to stdout (overrides --out)', false)\n .action(async (schema: string, opts: any) => {\n try {\n const analyzer = new SchemaAnalyzer(schema);\n const spinner = !opts.json ? ora('Analyzing schema...').start() : null;\n const start = Date.now();\n const res = await analyzer.analyze({\n includeRelations: !!opts.relations,\n validateConstraints: !!opts.validate,\n });\n const ms = Date.now() - start;\n const json = JSON.stringify(res, null, 2);\n if (opts.json) {\n console.log(json);\n } else if (opts.out) {\n const fs = await import('node:fs/promises');\n await fs.writeFile(opts.out, json, 'utf8');\n spinner?.succeed(chalk.green(`Analysis written to ${opts.out} in ${ms}ms`));\n } else {\n spinner?.succeed(chalk.green(`Analyzed in ${ms}ms`));\n console.log(json);\n }\n process.exit(res.issues.some((i) => i.level === 'error') ? 2 : 0);\n } catch (e: any) {\n const msg = e?.message ?? String(e);\n if (opts.json)\n console.log(JSON.stringify({ event: 'error', code: 'DRZL_CLI_ANALYZE', message: msg }));\n else\n console.error(\n chalk.red('Analyze failed (DRZL_CLI_ANALYZE):'),\n msg,\n '\\nTip: run with --json for structured output.'\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('doctor')\n .description('Report what DRZL cannot type or enforce in your schema, and why')\n .argument('[schema]', 'path to drizzle schema (TS); defaults to the schema in drzl.config')\n .option('-c, --config <path>', 'path to drzl.config, read when no schema argument is given')\n .option('--json', 'print the report as JSON instead of prose', false)\n .option('--strict', 'exit 2 when anything is reported', false)\n .action(async (schema: string | undefined, opts: any) => {\n try {\n // A schema path argument, like `analyze`, or the one already named in the config, since a\n // user who has a config should not have to retype the path they put in it.\n let target = schema;\n if (!target) {\n const cfg = await loadConfig(opts.config);\n target = cfg?.schema;\n }\n if (!target) {\n const msg = 'No schema given. Pass a path, or run from a directory with a drzl.config.';\n if (opts.json)\n console.log(JSON.stringify({ event: 'error', code: 'DRZL_CLI_DOCTOR', message: msg }));\n else console.error(chalk.red('Doctor failed (DRZL_CLI_DOCTOR):'), msg);\n process.exit(1);\n return;\n }\n\n const analyzer = new SchemaAnalyzer(target);\n // Both on, unconditionally. Doctor's job is to look at everything, and a warning that only\n // appears when relations are read would be hidden by a flag turning them off.\n const analysis = await analyzer.analyze({\n includeRelations: true,\n validateConstraints: true,\n });\n const report = buildDoctorReport(analysis, target);\n\n if (opts.json) console.log(JSON.stringify(report, null, 2));\n else console.log(renderDoctorReport(report));\n\n // An error-level issue means the schema was never read: the file is missing, or importing it\n // threw. There is no report to act on, so this exits like `analyze`'s failure path rather\n // than pretending the empty analysis was a clean bill of health.\n if (report.findings.some((f) => f.level === 'error')) {\n process.exit(1);\n return;\n }\n // Zero by default, and that is the whole point. A schema carrying a customType or a CHECK\n // this parser will not guess at is normal and usable, and a doctor that failed every\n // pipeline reading one would be switched off within a week. `--strict` is the opt-in.\n process.exit(opts.strict && report.findings.length ? 2 : 0);\n } catch (e: any) {\n const msg = e?.message ?? String(e);\n if (opts.json)\n console.log(JSON.stringify({ event: 'error', code: 'DRZL_CLI_DOCTOR', message: msg }));\n else\n console.error(\n chalk.red('Doctor failed (DRZL_CLI_DOCTOR):'),\n msg,\n '\\nTip: run with --json for structured output.'\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('generate')\n .description('Run configured generators (drzl.config.*)')\n .option('-c, --config <path>', 'path to drzl.config')\n .option(\n '--check',\n 'regenerate and fail if the result differs from what is on disk, without changing it'\n )\n .action(async (opts: any) => {\n try {\n const cfg = await loadConfig(opts.config);\n if (!cfg) {\n console.error(\n chalk.red('No config found (DRZL_CFG_001). Create drzl.config.ts or pass --config.')\n );\n process.exit(2);\n return;\n }\n const analyzer = new SchemaAnalyzer(cfg.schema);\n const spinner = ora('Analyzing...').start();\n const t0 = Date.now();\n const analysis = await analyzer.analyze({\n includeRelations: cfg.analyzer.includeRelations,\n validateConstraints: cfg.analyzer.validateConstraints,\n includeHeuristicRelations: cfg.analyzer.includeHeuristicRelations,\n });\n // After the spinner rather than before it, because `filterColumns` throws on a config it\n // cannot honour and a thrown error under a live ora spinner prints into a line the spinner\n // then overwrites.\n spinner.succeed(`Analysis complete in ${Date.now() - t0}ms`);\n // Both filters are applied before any generator sees the analysis, so every one of them\n // honours them without needing to know the options exist.\n //\n // Columns first. Both orders leave the same tables, since one narrows columns and the other\n // drops whole tables, but only this one lets a `columns` entry name a table that `exclude`\n // also removes without that reading as a typo, and a typo is refused.\n const narrowed = filterColumns(analysis.tables, cfg.columns);\n // Before the filter runs, so the tables it reports on are the ones the pattern really\n // reached rather than what survived it.\n const filterWarnings = tableFilterWarnings(narrowed.tables, cfg);\n analysis.tables = filterTables(narrowed.tables, cfg);\n for (const w of [...narrowed.warnings, ...filterWarnings]) console.warn(chalk.yellow(w));\n reportWideColumns(analysis.issues);\n // Under --check the existing output is captured before anything overwrites it, so the\n // regenerated result can be compared against it and the tree put back either way.\n const driftDirs = computeGeneratorOutputDirs(cfg);\n const driftBefore = opts.check ? await snapshotAll(driftDirs) : null;\n const progress = new cliProgress.SingleBar(\n { hideCursor: true },\n cliProgress.Presets.shades_classic\n );\n const total = analysis.tables.length || 1;\n progress.start(total, 0);\n // Where the service generator is actually writing, so a router template that imports\n // services spells a path that exists. Templates default this to 'src/services', and with\n // nothing passed that default was used no matter where the services really went, emitting\n // an import of a module that was never created. Must match the `g.path ?? 'src/services'`\n // used by the service branch below.\n const servicesDir =\n cfg.generators.find((x: { kind: string }) => x.kind === 'service')?.path ?? 'src/services';\n for (const g of cfg.generators) {\n if (g.kind === 'orpc') {\n const gen = new ORPCGenerator(analysis);\n const { files } = await gen.generate({\n outputDir: cfg.outDir,\n template: g.template,\n includeRelations: g.includeRelations,\n naming: g.naming,\n outputHeader: g.outputHeader,\n format: g.format,\n templateOptions: g.templateOptions,\n importExtension: g.importExtension,\n validation: g.validation,\n // Documented on this generator since it was added and never reachable from a config\n // file, because the config schema had no such key and zod stripped it in silence.\n databaseInjection: g.databaseInjection,\n servicesDir,\n onProgress: ({ index }) => progress.update(index),\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (${g.kind}): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } else if (g.kind === 'trpc') {\n try {\n // An optional dependency, like the json-schema generator and unlike oRPC. A package\n // that has never been published cannot publish through npm's trusted-publisher OIDC\n // flow, so its first version has to go out by hand; naming it as a hard dependency of\n // the CLI in the same release breaks `npm i @drzl/cli` for everyone until it exists.\n // A missing optional dependency is skipped by the installer rather than failing it,\n // which is why this one really can be absent on an ordinary install.\n const { TRPCGenerator } = await loadGenerator(\n '@drzl/generator-trpc',\n () => import('@drzl/generator-trpc')\n );\n const gen = new TRPCGenerator(analysis);\n const { files } = await gen.generate({\n ...trpcOptions(g, cfg, servicesDir),\n onProgress: ({ index }: { index: number }) => progress.update(index),\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (trpc): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n } else if (g.kind === 'service') {\n try {\n const { ServiceGenerator } = await loadGenerator(\n '@drzl/generator-service',\n () => import('@drzl/generator-service')\n );\n const gen = new ServiceGenerator(analysis);\n const target = g.path ?? 'src/services';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n dataAccess: g.dataAccess,\n dbImportPath: g.dbImportPath,\n schemaImportPath: g.schemaImportPath,\n importExtension: g.importExtension,\n // The other half of `databaseInjection`. A router generator in injection mode\n // emits `Service.getById(ctx.db, id)`, and only a service generated in the same\n // mode has a `db` parameter to receive it. This branch never passed the option, so\n // the two halves of one generated project disagreed about the signature.\n databaseInjection: g.databaseInjection,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (service): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n } else if (g.kind === 'zod') {\n try {\n const { ZodGenerator } = await loadGenerator(\n '@drzl/generator-zod',\n () => import('@drzl/generator-zod')\n );\n const gen = new ZodGenerator(analysis);\n const target = g.path ?? 'src/validators/zod';\n // `meta` is zod-only; see `GeneratorCapabilities.meta` for why it is not passed to the\n // other four rather than being passed and ignored.\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: true, meta: true }) as never\n );\n progress.stop();\n ora().succeed(chalk.green(`Generated (zod): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n } else if (g.kind === 'valibot') {\n try {\n const { ValibotGenerator } = await loadGenerator(\n '@drzl/generator-valibot',\n () => import('@drzl/generator-valibot')\n );\n const gen = new ValibotGenerator(analysis);\n const target = g.path ?? 'src/validators/valibot';\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: true }) as never\n );\n progress.stop();\n ora().succeed(chalk.green(`Generated (valibot): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n } else if (g.kind === 'arktype') {\n try {\n const { ArkTypeGenerator } = await loadGenerator(\n '@drzl/generator-arktype',\n () => import('@drzl/generator-arktype')\n );\n const gen = new ArkTypeGenerator(analysis);\n const target = g.path ?? 'src/validators/arktype';\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: false }) as never\n );\n progress.stop();\n ora().succeed(chalk.green(`Generated (arktype): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n } else if (g.kind === 'json-schema') {\n try {\n // An optional dependency, unlike the other generators, until its npm trusted publisher\n // exists. A missing optional dependency is skipped rather than failing the install,\n // which is what keeps `npm i @drzl/cli` working meanwhile, and is why this one really\n // can be absent on a normal install.\n const { JsonSchemaGenerator } = await loadGenerator(\n '@drzl/generator-json-schema',\n () => import('@drzl/generator-json-schema')\n );\n const gen = new JsonSchemaGenerator(analysis);\n const target = g.path ?? 'src/validators/json-schema';\n const files = await gen.generate(jsonSchemaOptions(g, cfg, target) as never);\n progress.stop();\n ora().succeed(chalk.green(`Generated (json-schema): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n } else if (g.kind === 'typebox') {\n try {\n const { TypeBoxGenerator } = await loadGenerator(\n '@drzl/generator-typebox',\n () => import('@drzl/generator-typebox')\n );\n const gen = new TypeBoxGenerator(analysis);\n const target = g.path ?? 'src/validators/typebox';\n const files = await gen.generate(\n validationOptions(g, cfg, target, {\n schemaTypes: true,\n standardSchema: true,\n }) as never\n );\n progress.stop();\n ora().succeed(chalk.green(`Generated (typebox): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n } else if (g.kind === 'effect') {\n try {\n const { EffectGenerator } = await loadGenerator(\n '@drzl/generator-effect',\n () => import('@drzl/generator-effect')\n );\n const gen = new EffectGenerator(analysis);\n const target = g.path ?? 'src/validators/effect';\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: true }) as never\n );\n progress.stop();\n ora().succeed(chalk.green(`Generated (effect): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n }\n }\n if (driftBefore) {\n const after = await snapshotAll(driftDirs);\n const drift = diffSnapshots(driftBefore, after);\n // Restored whether or not anything drifted, so `--check` never leaves the tree altered.\n await restoreSnapshot(driftBefore, after);\n\n if (drift.length) {\n console.error(chalk.red(`\\nGenerated output is out of date (${drift.length} file(s)):`));\n for (const d of drift) {\n const mark = d.status === 'added' ? '+' : d.status === 'removed' ? '-' : '~';\n console.error(\n ` ${mark} ${chalk.yellow(d.status.padEnd(8))} ${path.relative(process.cwd(), d.file)}`\n );\n }\n console.error(\n chalk.dim(\n '\\nRun `drzl generate` and commit the result. Nothing was written by this check.'\n )\n );\n process.exit(1);\n }\n console.log(chalk.green('Generated output is up to date.'));\n return;\n }\n\n if (cfg.generators.length) {\n maybeShowSponsorMessage({ reason: 'generate' });\n }\n } catch (e: any) {\n console.error(\n chalk.red('Generate failed (DRZL_GEN_001):'),\n e?.message ?? e,\n '\\nTip: check your drzl.config.ts and template path.'\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('generate:orpc')\n .argument('<schema>', 'path to drizzle schema (TS)')\n .option('-o, --outDir <dir>', 'output directory', 'src/api')\n .option('--template <name>', 'template name', 'standard')\n .option('--includeRelations', 'include relation endpoints')\n .action(async (schema: string, opts: any) => {\n try {\n const analyzer = new SchemaAnalyzer(schema);\n const analysis = await analyzer.analyze({\n includeRelations: !!opts.includeRelations,\n validateConstraints: true,\n });\n const gen = new ORPCGenerator(analysis);\n const { files } = await gen.generate({\n outputDir: opts.outDir,\n template: opts.template,\n includeRelations: !!opts.includeRelations,\n });\n console.log(chalk.green(`Generated:`), files.map((f) => chalk.cyan(f)).join(', '));\n maybeShowSponsorMessage({ reason: 'generate:orpc' });\n } catch (e: any) {\n console.error(chalk.red('Generate orpc failed:'), e?.message ?? e);\n process.exit(1);\n }\n });\n\nprogram\n .command('generate:trpc')\n .argument('<schema>', 'path to drizzle schema (TS)')\n .option('-o, --outDir <dir>', 'output directory', 'src/api')\n .option('--template <name>', 'standard | service', 'standard')\n .option('--includeRelations', 'include relation endpoints')\n .option('--servicesDir <dir>', 'where the service generator writes', 'src/services')\n .action(async (schema: string, opts: any) => {\n try {\n const analyzer = new SchemaAnalyzer(schema);\n const analysis = await analyzer.analyze({\n includeRelations: !!opts.includeRelations,\n validateConstraints: true,\n });\n const { TRPCGenerator } = await loadGenerator(\n '@drzl/generator-trpc',\n () => import('@drzl/generator-trpc')\n );\n const gen = new TRPCGenerator(analysis);\n const { files } = await gen.generate({\n outputDir: opts.outDir,\n template: opts.template,\n includeRelations: !!opts.includeRelations,\n // Only consulted by `--template service`, and passed unconditionally so this command\n // cannot become the branch that forgets it.\n servicesDir: opts.servicesDir,\n });\n console.log(chalk.green(`Generated:`), files.map((f: string) => chalk.cyan(f)).join(', '));\n maybeShowSponsorMessage({ reason: 'generate:trpc' });\n } catch (e: any) {\n reportGeneratorFailure('trpc', e);\n process.exit(1);\n }\n });\n\nprogram\n .command('watch')\n .description('Watch schema and regenerate on changes')\n .option('-c, --config <path>', 'path to drzl.config')\n .option('--pipeline <name>', 'all | analyze | generate-orpc | generate-trpc', 'all')\n .option('--debounce <ms>', 'debounce ms', '200')\n .option('--json', 'emit JSON logs', false)\n .option('--poll', 'force polling (helps WSL/Docker/remote FS)', false)\n .action(async (opts: any) => {\n let cfg = await loadConfig(opts.config);\n if (!cfg) {\n console.error(chalk.red('No config found. Create drzl.config.ts or pass --config.'));\n process.exit(2);\n return;\n }\n\n const abs = (p: string) => path.resolve(process.cwd(), p);\n const isInside = (child: string, parent: string) => {\n const rel = path.relative(parent, child);\n return !!rel && !rel.startsWith('..') && !path.isAbsolute(rel);\n };\n\n const ignoredOutDirs = new Set<string>(computeGeneratorOutputDirs(cfg).map(abs));\n const currentTargets = new Set<string>(computeWatchTargets(cfg).map(abs));\n\n const syncWatcherTargets = (watcher: import('chokidar').FSWatcher, next: Set<string>) => {\n const add: string[] = [];\n const del: string[] = [];\n for (const p of next) if (!currentTargets.has(p)) add.push(p);\n for (const p of currentTargets) if (!next.has(p)) del.push(p);\n if (add.length) watcher.add(add);\n if (del.length) watcher.unwatch(del);\n currentTargets.clear();\n next.forEach((p) => currentTargets.add(p));\n };\n\n const rebuildIgnoreDirsFrom = (cfgNow: DrzlConfig) => {\n ignoredOutDirs.clear();\n for (const d of computeGeneratorOutputDirs(cfgNow)) ignoredOutDirs.add(abs(d));\n };\n\n // Watch targets are directories now, because chokidar v4 dropped glob support. The\n // extensions the old `**/*.{ts,tsx,js}` glob selected therefore have to be filtered here\n // instead, or every unrelated file in the schema's directory would trigger a rebuild.\n const WATCHED_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.mjs', '.cjs']);\n\n const ignoredFn = (p: string, stats?: { isDirectory(): boolean }) => {\n const full = abs(p);\n for (const dir of ignoredOutDirs) {\n if (full === dir || isInside(full, dir)) return true;\n }\n // A directory is never ignored: chokidar has to descend into it to reach the files.\n if (stats?.isDirectory()) return false;\n const ext = path.extname(full);\n // Without stats chokidar is asking about a path it has not resolved yet. An extensionless\n // one is almost certainly a directory, so let it through and decide once it is known.\n if (!ext) return false;\n return !WATCHED_EXTENSIONS.has(ext);\n };\n\n const watcher = chokidar.watch(Array.from(currentTargets), {\n ignoreInitial: true,\n awaitWriteFinish: { stabilityThreshold: 400, pollInterval: 50 },\n usePolling: !!opts.poll,\n ignored: ignoredFn,\n });\n\n const logTrigger = (type: 'add' | 'change' | 'unlink', file: string) => {\n if (opts.json) console.log(JSON.stringify({ event: 'trigger', type, file }));\n };\n\n watcher\n .on('add', (p) => {\n logTrigger('add', p);\n trigger(p);\n })\n .on('change', (p) => {\n logTrigger('change', p);\n trigger(p);\n })\n .on('unlink', (p) => {\n logTrigger('unlink', p);\n trigger(p);\n });\n\n let lastFiles: string[] = [];\n\n const run = async () => {\n try {\n const reloaded = await loadConfig(opts.config);\n if (!reloaded) throw new Error('Config disappeared during watch.');\n cfg = reloaded;\n\n rebuildIgnoreDirsFrom(cfg);\n const nextTargets = new Set<string>(computeWatchTargets(cfg).map(abs));\n syncWatcherTargets(watcher, nextTargets);\n\n if (!opts.json) console.clear();\n\n if (opts.json) {\n console.log(\n JSON.stringify({\n event: 'watch_config_applied',\n targets: Array.from(currentTargets),\n ignored: Array.from(ignoredOutDirs),\n })\n );\n }\n\n const analyzer = new SchemaAnalyzer(cfg.schema);\n const analysis = await analyzer.analyze({\n includeRelations: cfg.analyzer.includeRelations,\n validateConstraints: cfg.analyzer.validateConstraints,\n includeHeuristicRelations: cfg.analyzer.includeHeuristicRelations,\n });\n // Same order and the same reasons as `generate`. A config edited mid-watch that names a\n // column that does not exist throws here, and `run`'s own catch reports it and keeps\n // watching, so the next save can fix it.\n const narrowed = filterColumns(analysis.tables, cfg.columns);\n const filterWarnings = tableFilterWarnings(narrowed.tables, cfg);\n analysis.tables = filterTables(narrowed.tables, cfg);\n if (!opts.json)\n for (const w of [...narrowed.warnings, ...filterWarnings]) console.warn(chalk.yellow(w));\n if (!opts.json) reportWideColumns(analysis.issues);\n\n if (opts.pipeline === 'analyze') {\n if (opts.json) {\n console.log(\n JSON.stringify({\n event: 'analyze_complete',\n issues: analysis.issues,\n tables: analysis.tables.length,\n })\n );\n } else {\n console.log(chalk.green('Analyze complete.'));\n }\n return;\n }\n\n const newFiles: string[] = [];\n\n // Must match the `g.path ?? 'src/services'` the service branch below uses, or a router\n // template that imports services spells a path nothing ever wrote. `generate` has always\n // computed this; `watch` did not, so a rebuild silently emitted the default.\n const servicesDir =\n cfg.generators.find((x: { kind: string }) => x.kind === 'service')?.path ??\n 'src/services';\n\n const PIPELINE_KINDS: Record<string, string> = {\n 'generate-orpc': 'orpc',\n 'generate-trpc': 'trpc',\n };\n\n for (const g of cfg.generators) {\n if (opts.pipeline !== 'all' && PIPELINE_KINDS[opts.pipeline] !== g.kind) {\n continue;\n }\n\n if (g.kind === 'orpc') {\n const gen = new ORPCGenerator(analysis);\n const { files } = await gen.generate({\n outputDir: cfg.outDir,\n template: g.template,\n includeRelations: g.includeRelations,\n naming: g.naming,\n outputHeader: g.outputHeader,\n format: g.format,\n templateOptions: g.templateOptions,\n importExtension: g.importExtension,\n validation: g.validation,\n databaseInjection: g.databaseInjection,\n servicesDir,\n });\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (${g.kind}):`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } else if (g.kind === 'trpc') {\n try {\n const { TRPCGenerator } = await loadGenerator(\n '@drzl/generator-trpc',\n () => import('@drzl/generator-trpc')\n );\n const gen = new TRPCGenerator(analysis);\n // The same builder `generate` uses, so the two dispatch loops cannot disagree\n // about what this generator is given.\n const { files } = await gen.generate(trpcOptions(g, cfg, servicesDir));\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (trpc): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n reportGeneratorFailure(g.kind, e);\n return;\n }\n } else if (g.kind === 'service') {\n try {\n const { ServiceGenerator } = await loadGenerator(\n '@drzl/generator-service',\n () => import('@drzl/generator-service')\n );\n const gen = new ServiceGenerator(analysis);\n const target = g.path ?? 'src/services';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n dataAccess: g.dataAccess,\n dbImportPath: g.dbImportPath,\n schemaImportPath: g.schemaImportPath,\n importExtension: g.importExtension,\n databaseInjection: g.databaseInjection,\n });\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (service): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n reportGeneratorFailure(g.kind, e);\n return;\n }\n } else if (g.kind === 'zod') {\n try {\n const { ZodGenerator } = await loadGenerator(\n '@drzl/generator-zod',\n () => import('@drzl/generator-zod')\n );\n const gen = new ZodGenerator(analysis);\n const target = g.path ?? 'src/validators/zod';\n // `meta` is zod-only; see `GeneratorCapabilities.meta` for why it is not passed to\n // the other four rather than being passed and ignored.\n // The same builder `generate` uses. Assembled by hand here until now, and every\n // option added since the builder existed was therefore absent from a watch rebuild:\n // `coerceDates`, `applyDefaults`, `typedJson`, `typedColumns` and `duplicateFinder`\n // were all dropped, so the first save after starting `drzl watch` silently replaced\n // correct output with output generated from defaults.\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: true, meta: true }) as never\n );\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (zod): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n reportGeneratorFailure(g.kind, e);\n return;\n }\n } else if (g.kind === 'valibot') {\n try {\n const { ValibotGenerator } = await loadGenerator(\n '@drzl/generator-valibot',\n () => import('@drzl/generator-valibot')\n );\n const gen = new ValibotGenerator(analysis);\n const target = g.path ?? 'src/validators/valibot';\n // The same builder `generate` uses. Assembled by hand here until now, and every\n // option added since the builder existed was therefore absent from a watch rebuild:\n // `coerceDates`, `applyDefaults`, `typedJson`, `typedColumns` and `duplicateFinder`\n // were all dropped, so the first save after starting `drzl watch` silently replaced\n // correct output with output generated from defaults.\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: true }) as never\n );\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (valibot): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n reportGeneratorFailure(g.kind, e);\n return;\n }\n } else if (g.kind === 'arktype') {\n try {\n const { ArkTypeGenerator } = await loadGenerator(\n '@drzl/generator-arktype',\n () => import('@drzl/generator-arktype')\n );\n const gen = new ArkTypeGenerator(analysis);\n const target = g.path ?? 'src/validators/arktype';\n // The same builder `generate` uses. Assembled by hand here until now, and every\n // option added since the builder existed was therefore absent from a watch rebuild:\n // `coerceDates`, `applyDefaults`, `typedJson`, `typedColumns` and `duplicateFinder`\n // were all dropped, so the first save after starting `drzl watch` silently replaced\n // correct output with output generated from defaults.\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: false }) as never\n );\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (arktype): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n reportGeneratorFailure(g.kind, e);\n return;\n }\n } else if (g.kind === 'typebox') {\n try {\n const { TypeBoxGenerator } = await loadGenerator(\n '@drzl/generator-typebox',\n () => import('@drzl/generator-typebox')\n );\n const gen = new TypeBoxGenerator(analysis);\n const target = g.path ?? 'src/validators/typebox';\n // The same builder `generate` uses. Assembled by hand here until now, and every\n // option added since the builder existed was therefore absent from a watch rebuild:\n // `coerceDates`, `applyDefaults`, `typedJson`, `typedColumns` and `duplicateFinder`\n // were all dropped, so the first save after starting `drzl watch` silently replaced\n // correct output with output generated from defaults.\n const files = await gen.generate(\n validationOptions(g, cfg, target, {\n schemaTypes: true,\n standardSchema: true,\n }) as never\n );\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (typebox): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n reportGeneratorFailure(g.kind, e);\n return;\n }\n } else if (g.kind === 'effect') {\n try {\n const { EffectGenerator } = await loadGenerator(\n '@drzl/generator-effect',\n () => import('@drzl/generator-effect')\n );\n const gen = new EffectGenerator(analysis);\n const target = g.path ?? 'src/validators/effect';\n // The same builder `generate` uses, and the same default path, which is also the one\n // `computeGeneratorOutputDirs` has to spell: a watcher that does not ignore this\n // directory regenerates on its own output forever.\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: true }) as never\n );\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (effect): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n reportGeneratorFailure(g.kind, e);\n return;\n }\n } else if (g.kind === 'json-schema') {\n try {\n const { JsonSchemaGenerator } = await loadGenerator(\n '@drzl/generator-json-schema',\n () => import('@drzl/generator-json-schema')\n );\n const gen = new JsonSchemaGenerator(analysis);\n const target = g.path ?? 'src/validators/json-schema';\n // The same builder `generate` uses, so the two dispatch loops cannot disagree about\n // what this generator is given.\n const files = await gen.generate(jsonSchemaOptions(g, cfg, target) as never);\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (json-schema): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n reportGeneratorFailure(g.kind, e);\n return;\n }\n }\n }\n\n const added = newFiles.filter((f) => !lastFiles.includes(f));\n const removed = lastFiles.filter((f) => !newFiles.includes(f));\n opts.json\n ? console.log(JSON.stringify({ event: 'diff', added, removed }))\n : (() => {\n if (added.length) console.log(chalk.blue(`Added: ${added.join(', ')}`));\n if (removed.length) console.log(chalk.yellow(`Removed: ${removed.join(', ')}`));\n })();\n if (newFiles.length && !opts.json) {\n const reason =\n opts.pipeline && opts.pipeline !== 'all' ? `watch:${opts.pipeline}` : 'watch';\n maybeShowSponsorMessage({ reason });\n }\n lastFiles = newFiles;\n } catch (e: any) {\n opts.json\n ? console.log(JSON.stringify({ event: 'error', message: String(e?.message ?? e) }))\n : console.error(chalk.red('Watch pipeline failed:'), e?.message ?? e);\n }\n };\n\n const debounced = Number(opts.debounce) || 200;\n let timer: NodeJS.Timeout | null = null;\n const trigger = (file?: string) => {\n if (file) {\n const full = abs(file);\n for (const dir of ignoredOutDirs) {\n if (full === dir || isInside(full, dir)) return;\n }\n }\n if (timer) clearTimeout(timer);\n timer = setTimeout(run, debounced);\n };\n\n if (opts.json) {\n console.log(\n JSON.stringify({\n event: 'watching',\n targets: Array.from(currentTargets),\n ignored: Array.from(ignoredOutDirs),\n })\n );\n } else {\n console.log(\n chalk.gray(\n 'Watching:\\n ' +\n Array.from(currentTargets)\n .map((p) => path.relative(process.cwd(), p))\n .join('\\n ')\n )\n );\n }\n\n watcher\n .on('add', (p) => trigger(p))\n .on('change', (p) => trigger(p))\n .on('unlink', (p) => trigger(p))\n .on('error', (err) => console.error(chalk.red('Watcher error:'), err));\n\n await run();\n });\n\nprogram\n .command('init')\n .description('Scaffold a drzl.config.ts')\n .option('-y, --yes', 'accept defaults')\n .action(async (_opts: any) => {\n const fs = await import('node:fs/promises');\n const path = await import('node:path');\n const target = path.resolve(process.cwd(), 'drzl.config.ts');\n // One router generator, not both: they default to the same `outDir` and would each write an\n // `index.ts` there, so a scaffold naming both would emit a config whose second generator\n // silently overwrote the first. Swapping the kind is a one-word edit; running both needs a\n // `path` on one of them, which is what the comment says.\n const template = `export default {\n schema: 'src/db/schema.ts',\n outDir: 'src/api',\n analyzer: { includeRelations: true, validateConstraints: true },\n generators: [\n // For tRPC instead: { kind: 'trpc', template: 'standard', includeRelations: true }\n // To run both, give one of them its own \\`path\\`; they share \\`outDir\\` otherwise.\n { kind: 'orpc', template: 'standard', includeRelations: true }\n ]\n} as const\\n`;\n try {\n await fs.writeFile(target, template, { flag: 'wx' });\n console.log(chalk.green(`Created ${target}`));\n } catch (e: any) {\n console.error(chalk.red('Init failed:'), e?.message ?? e);\n process.exit(1);\n }\n });\n\n/**\n * Tell the user which columns got a validator that accepts anything.\n *\n * This is the user-facing half of a check `verify-packed.sh` runs on this repository. Two real\n * bugs took exactly this shape, `.array()` and `pgEnum` columns coming back untyped on\n * drizzle-orm 0.4x, and the only way anyone noticed was reading the generated file. A user whose\n * schema uses a type nobody here has modelled gets the same silence, and no gate of ours helps\n * them.\n *\n * Printed once with a count rather than a line per column, so a schema with fifty custom types\n * stays readable.\n */\nfunction reportWideColumns(issues: Array<{ code?: string; message?: string; hint?: string }>) {\n const wide = issues.filter((i) => i.code === 'DRZL_ANL_UNKNOWN_COLUMN');\n if (!wide.length) return;\n console.warn(\n chalk.yellow(`\\n${wide.length} column${wide.length === 1 ? '' : 's'} could not be typed:`)\n );\n for (const i of wide.slice(0, 10)) console.warn(chalk.gray(` - ${i.message}`));\n if (wide.length > 10) console.warn(chalk.gray(` ... and ${wide.length - 10} more`));\n // One hint for the set, since they are almost always the same two.\n const hints = [...new Set(wide.map((i) => i.hint).filter(Boolean))];\n for (const h of hints) console.warn(chalk.gray(` ${h}`));\n // Untypeable columns are the only thing this line can see. A CHECK constraint the generators\n // decline produces no output at all and so cannot be counted here without parsing every one of\n // them on the generate path, which is what `doctor` is for.\n console.warn(chalk.gray(' Run `drzl doctor` for the full report.'));\n}\n\nprogram.parseAsync(process.argv);\n","/**\n * The options every validation generator receives, built in one place.\n *\n * Each generator branch used to assemble this by hand, and three documented options were\n * found silently dead as a result: `typedJson` never reached typebox, and `coerceDates` and\n * `applyDefaults` never reached anything but zod. The config parsed them, the CLI dropped them,\n * and the feature simply did nothing while nothing said so. Building it once removes the class\n * rather than fixing each instance.\n *\n * What stays per-generator is a real capability rather than an oversight, which is why it is\n * named as one.\n */\n\n/**\n * A generator entry from the config, loosely typed because the config schema owns its shape.\n *\n * Exported so a builder that wraps this one names the same keys rather than restating them: every\n * key listed in two places is a key the two can drift on, which is the failure this file exists to\n * remove.\n */\nexport type ValidationGeneratorConfig = {\n outputHeader?: unknown;\n format?: unknown;\n schemaSuffix?: unknown;\n fileSuffix?: unknown;\n importExtension?: unknown;\n affix?: unknown;\n coerceDates?: unknown;\n applyDefaults?: unknown;\n typedJson?: unknown;\n typedColumns?: unknown;\n duplicateFinder?: unknown;\n nestedSchemas?: unknown;\n nestedDepth?: unknown;\n branded?: unknown;\n standardSchema?: unknown;\n meta?: unknown;\n};\n\nexport interface GeneratorCapabilities {\n /**\n * Whether the generator can reference a type from the schema module.\n *\n * `typedJson` and `typedColumns` both work by importing the table back and reading\n * `typeof table.$inferSelect['col']`, so a generator that cannot embed a TypeScript type in its\n * output cannot use either. ArkType is the case: it emits one string per field, and a type\n * reference has nowhere to live inside a string DSL.\n */\n schemaTypes?: boolean;\n /**\n * Whether the generator has a `~standard` key to add.\n *\n * TypeBox is the only one that has: zod, valibot and arktype put one on every schema they build,\n * measured on 4.4.3, 1.4.2 and 2.2.3, so there is nothing for the option to do there and setting\n * it would read as a promise that something changed.\n */\n standardSchema?: boolean;\n /**\n * Whether the generator can attach metadata to what it emits.\n *\n * zod is the only one so far, and deliberately: it is the one validator here whose metadata has\n * a destination outside itself, since `z.toJSONSchema` copies arbitrary keys through into the\n * document an OpenAPI consumer reads. The other four each have a facility of their own and each\n * needs its own measurement of where the metadata has to attach, which is the whole difficulty;\n * building four on the strength of one measurement is how three of them come to be subtly wrong.\n */\n meta?: boolean;\n}\n\nexport function validationOptions(\n g: ValidationGeneratorConfig,\n cfg: { schema?: unknown },\n outDir: string,\n caps: GeneratorCapabilities = {}\n): Record<string, unknown> {\n return {\n outDir,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n importExtension: g.importExtension,\n affix: g.affix,\n coerceDates: g.coerceDates,\n applyDefaults: g.applyDefaults,\n duplicateFinder: g.duplicateFinder,\n nestedSchemas: g.nestedSchemas,\n nestedDepth: g.nestedDepth,\n // Every validation generator can express a brand, including TypeBox, which has no brand\n // helper and gets one from `TUnsafe` instead. So this needs no capability flag: an option\n // that reached only four of the five would be the class of defect this file exists to\n // remove.\n branded: g.branded,\n // Only where the generator can act on them, so an unsupported option is absent rather than\n // present and ignored.\n ...(caps.schemaTypes\n ? {\n // Needed by both: the reference is resolved relative to the emitted file.\n schemaPath: cfg.schema,\n typedJson: g.typedJson,\n typedColumns: g.typedColumns,\n }\n : {}),\n ...(caps.standardSchema ? { standardSchema: g.standardSchema } : {}),\n ...(caps.meta ? { meta: g.meta } : {}),\n };\n}\n","/**\n * The options `@drzl/generator-json-schema` receives, built in one place.\n *\n * `generate` and `watch` each dispatch over `cfg.generators` in their own loop, and the json-schema\n * branch was assembled by hand in both. That arrangement has already dropped options silently more\n * than once here: five validation options never reached a watch rebuild, and `watch` had no\n * json-schema branch at all for a while, so that directory went stale from the first save onward.\n * None of it is visible in the wiring, because the option parses, the generator defaults it, and\n * the feature simply does nothing.\n *\n * One builder makes the two call sites the same object by construction rather than by review, and\n * `packages/cli/test/openapi-branch-parity.e2e.spec.ts` runs both commands and compares the bytes.\n */\nimport { validationOptions, type ValidationGeneratorConfig } from './validation-options.js';\n\n/** A generator entry from the config, loosely typed because the config schema owns its shape. */\ntype GeneratorConfig = ValidationGeneratorConfig & {\n path?: string;\n target?: unknown;\n components?: unknown;\n document?: unknown;\n includeRelations?: unknown;\n};\n\nexport function jsonSchemaOptions(\n g: GeneratorConfig,\n cfg: { schema?: unknown },\n outDir: string\n): Record<string, unknown> {\n return {\n // JSON Schema is data, so nothing it emits references a type from the schema module.\n ...validationOptions(g, cfg, outDir, { schemaTypes: false }),\n target: g.target,\n components: g.components,\n document: g.document,\n // Read only while emitting a document, where it adds `/users/{id}/posts`. The per-table\n // schemas are flat whatever it says.\n includeRelations: g.includeRelations,\n };\n}\n","import type { AffixOptions } from '@drzl/validation-core';\nimport {\n AFFIX_PROBE_TABLE,\n DEFAULT_IMPORT_EXTENSION,\n IMPORT_EXTENSIONS,\n NAME_MODES,\n resolveAffix,\n schemaName,\n validateAffix,\n} from '@drzl/validation-core';\nimport * as fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport * as path from 'node:path';\nimport { z } from 'zod';\nimport { ambiguousPatternWarnings, matchesTable } from './patterns.js';\n\nexport const NamingSchema = z\n .object({\n routerSuffix: z.string().default('Router'),\n procedureCase: z.enum(['camel', 'kebab', 'snake']).default('camel'),\n })\n .partial();\n\n/** One affix for every mode, or a per-mode map. Keys match drzl's internal mode names. */\nconst AffixValueSchema = z.union(\n [\n z.string(),\n z\n .object({\n insert: z.string().optional(),\n update: z.string().optional(),\n select: z.string().optional(),\n })\n .strict(),\n ],\n {\n error:\n 'Expected a string to use for every mode, or an object with any of the keys \"insert\", ' +\n '\"update\" and \"select\". Those keys are lowercase, matching the mode names drzl uses ' +\n 'everywhere else.',\n }\n);\n\nconst AffixPartSchema = z\n .object({\n prefix: AffixValueSchema.optional(),\n suffix: AffixValueSchema.optional(),\n })\n .strict();\n\nexport const AffixSchema = z\n .object({\n /**\n * `preserve` (default) keeps today's output: the Drizzle export name goes into the\n * identifier verbatim, so `export const users` yields `InsertusersSchema`. `pascal`\n * upper-camels it first, yielding `InsertUsersSchema`.\n */\n tableCase: z.enum(['preserve', 'pascal']).optional(),\n schema: AffixPartSchema.optional(),\n type: AffixPartSchema.optional(),\n })\n .strict();\n\n/**\n * How every relative specifier drzl invents spells its extension.\n *\n * The generated files land in the consumer's own source tree, so the consumer's\n * `moduleResolution` decides which forms resolve. `js` is the only one that resolves under\n * all of `bundler`, `node10`, `node16` and `nodenext` with no compiler flag, so it is the\n * default. See the `ImportExtension` docs in `@drzl/validation-core` for the measured grid.\n */\nexport const ImportExtensionSchema = z.enum(IMPORT_EXTENSIONS);\n\nexport const GeneratorSchema = z.object({\n kind: z.enum([\n 'orpc',\n 'trpc',\n 'service',\n 'zod',\n 'valibot',\n 'arktype',\n 'typebox',\n 'effect',\n 'json-schema',\n ]),\n /**\n * Overrides the top-level `importExtension` for this generator alone, for a project whose\n * generated directories are compiled by different tsconfigs.\n */\n importExtension: ImportExtensionSchema.optional(),\n template: z.string().optional(),\n includeRelations: z.boolean().optional(),\n /**\n * Type `json` and `jsonb` columns from the schema rather than leaving them wide.\n *\n * `.$type<T>()` is a compile-time cast, so no runtime-derived validator can see it and\n * `drizzle-orm/zod` types every json column as its generic `Json`. A generator can reference\n * `typeof <table>.$inferSelect['<column>']` instead, which is the declared type resolved by\n * TypeScript itself, so generics, unions and imported interfaces all work.\n *\n * Off by default because it makes the generated file import your schema module, as a\n * type-only import that disappears at build time.\n */\n // What a date column accepts. Documented on the zod generator and, until now, accepted by the\n // config parser and then dropped on the floor: the generators default it to 'input' themselves,\n // so setting it here changed nothing.\n coerceDates: z.enum(['input', 'all', 'none']).optional(),\n typedJson: z.boolean().optional(),\n // The wider form: every column's static type comes from Drizzle, not just the untyped ones.\n typedColumns: z.boolean().optional(),\n // Reproduce literal column defaults in the insert schema, so parsing fills them in.\n applyDefaults: z.boolean().optional(),\n /**\n * Emit `findDuplicate<Table>` beside the schemas: the rows in a batch that collide with an\n * earlier row on a unique constraint.\n *\n * Uniqueness is the one constraint a per-row validator structurally cannot see, since it is a\n * fact about the table rather than the row. This checks the half that needs no database.\n */\n duplicateFinder: z.boolean().optional(),\n /**\n * zod only. Attach the facts the analyzer knows and a zod schema cannot state, as `.meta()` on\n * every field and every table schema: the declared SQL type, the primary key, the unique\n * constraints, whether the database generates or defaults the value, and the CHECK constraints,\n * including the ones DRZL declined to enforce.\n *\n * `z.toJSONSchema` copies these through, so they are also how an OpenAPI document built from the\n * emitted schemas gets the declared width back: DRZL enforces one as a `.refine()`, and\n * `toJSONSchema` drops every refinement in silence.\n *\n * `true` is the shorthand for `{ enabled: true }`. `{ description: true }` additionally writes a\n * `description`, which is what an OpenAPI viewer renders to a human.\n */\n meta: z\n .union([\n z.boolean(),\n z.object({ enabled: z.boolean().optional(), description: z.boolean().optional() }).strict(),\n ])\n .optional(),\n /**\n * TypeBox only. Give every emitted schema a `~standard` key, so it can be handed to a tRPC or\n * oRPC route.\n *\n * TypeBox is the one validator DRZL emits that carries none of its own: measured on 0.34.52, a\n * bare `Type.Object()` has no `~standard` and the package exports nothing matching\n * `/standard/i`. zod, valibot and arktype all put one on every schema they build, so the option\n * does nothing for them and is not passed through.\n *\n * The property is non-enumerable, so the schema stays a TypeBox schema in every respect that was\n * already observable, including the JSON Schema `JSON.stringify` produces.\n */\n standardSchema: z.boolean().optional(),\n /**\n * Emit `NestedInsert<Table>` and `NestedSelect<Table>` beside the flat schemas: the table plus\n * one key per relation, so `{ ...user, posts: [...] }` can be validated whole.\n *\n * Nothing in the Drizzle validator ecosystem describes that payload, and `db.insert` drops the\n * relation key silently rather than refusing it, so the children are never written and nothing\n * says so.\n */\n nestedSchemas: z.boolean().optional(),\n /**\n * How many levels of children a nested schema describes. Defaults to 1, capped at 3.\n *\n * Nesting is expanded inline rather than by reference, so this multiplies the emitted size, and\n * it is also what terminates a cycle: `users -> posts -> users` stops here.\n */\n nestedDepth: z.number().int().optional(),\n /**\n * Give every primary key, and every foreign key pointing at one, a nominal type, so a\n * `users.id` cannot be passed where a `posts.id` is wanted.\n *\n * Type level only, in all five validators. Measured on zod 4.4.3, `.brand()` returns the same\n * schema object it was called on and the parsed value of `1` is `1`, so nothing about what a\n * schema accepts changes and no bytes are added to the bundle. TypeBox has no brand of its own\n * and gets a `TUnsafe` cast, which leaves the schema object identical.\n *\n * Off by default: it changes the inferred type of every consumer of the select schemas, which\n * is the point, but it is a change to existing call sites rather than an addition.\n *\n * `true` is the shorthand for `{ enabled: true }`. `{ foreignKeys: false }` brands only the\n * keys themselves, and `{ aliases: false }` stops the `export type UsersId = ...` lines.\n */\n branded: z\n .union([\n z.boolean(),\n z\n .object({\n enabled: z.boolean().optional(),\n foreignKeys: z.boolean().optional(),\n aliases: z.boolean().optional(),\n })\n .strict(),\n ])\n .optional(),\n naming: NamingSchema.optional(),\n outputHeader: z\n .object({\n enabled: z.boolean().default(true).optional(),\n text: z.string().optional(),\n })\n .optional(),\n format: z\n .object({\n enabled: z.boolean().default(true).optional(),\n engine: z.enum(['auto', 'prettier', 'biome']).default('auto').optional(),\n configPath: z.string().optional(),\n })\n .optional(),\n /**\n * Which spelling of JSON Schema the `json-schema` generator emits.\n *\n * OpenAPI 3.0 is not an older superset of the 2020-12 draft, it is a different dialect: a\n * nullable type is `nullable: true` rather than a type array, and an exclusive bound is a\n * boolean flag beside the bound rather than its own keyword. An unknown keyword is not an error\n * in JSON Schema, it is ignored, so emitting the wrong dialect produces a document that\n * validates and then accepts the values the constraints exist to reject.\n */\n target: z.enum(['draft-2020-12', 'openapi-3.1', 'openapi-3.0']).optional(),\n /** Also emit `components.ts` for the `json-schema` generator, ready for an OpenAPI document. */\n components: z.boolean().optional(),\n /**\n * Also emit the whole OpenAPI document for the `json-schema` generator: paths, verbs, request and\n * response bodies per table, with `components.schemas` embedded so the file stands alone.\n *\n * `true` is the short form. The object form carries the three things a Drizzle schema genuinely\n * cannot say: what the API is called, where it is served, and which status code that particular\n * server answers a request that fails its schema with.\n */\n document: z\n .union([\n z.boolean(),\n z\n .object({\n enabled: z.boolean().optional(),\n /** `ts` (default) writes a module, `json` the file OpenAPI tooling reads directly. */\n format: z.enum(['ts', 'json', 'both']).optional(),\n info: z\n .object({\n title: z.string().optional(),\n version: z.string().optional(),\n description: z.string().optional(),\n })\n .strict()\n .optional(),\n /**\n * Omitted by default, which the specification reads as a single server at `/`: the\n * document describes whatever is serving it. A placeholder host would be a fabrication\n * that tooling then follows.\n */\n servers: z\n .array(z.object({ url: z.string(), description: z.string().optional() }).strict())\n .optional(),\n /** 400 by default. 422 is the other defensible reading; exactly one is emitted. */\n validationStatus: z.union([z.literal(400), z.literal(422)]).optional(),\n })\n .strict(),\n ])\n .optional(),\n // service generator specific options\n path: z.string().optional(),\n dataAccess: z.enum(['stub', 'drizzle']).default('stub').optional(),\n dbImportPath: z.string().optional(),\n schemaImportPath: z.string().optional(),\n // zod/valibot/arktype generator specific options\n schemaSuffix: z.string().optional(),\n fileSuffix: z.string().optional(),\n /**\n * Prefixes, suffixes and table casing for generated identifiers (zod/valibot/arktype).\n * Omitting it reproduces the output of every previous release exactly.\n */\n affix: AffixSchema.optional(),\n /**\n * How the router generators reach a database handle: through the request context, rather than\n * through a module-level import in the service layer.\n *\n * Documented on the oRPC generator since it was added and, until now, absent from this schema\n * entirely. `GeneratorSchema` is not strict, so zod stripped the key without a word and the\n * option did nothing at all when set from a config file. It was only ever reachable by calling\n * the generator's API directly.\n */\n databaseInjection: z\n .object({\n enabled: z.boolean().optional(),\n /** The type annotation for the injected handle, e.g. `DrizzleD1Database`. */\n databaseType: z.string().optional(),\n databaseTypeImport: z.object({ name: z.string(), from: z.string() }).optional(),\n })\n .optional(),\n // router validation sharing (orpc, trpc)\n validation: z\n .object({\n useShared: z.boolean().default(false).optional(),\n library: z.enum(['zod', 'valibot', 'arktype']).default('zod').optional(),\n importPath: z.string().optional(),\n schemaSuffix: z.string().optional(),\n /**\n * How the validation generator named its exports. Usually left unset: the CLI copies\n * it from the sibling generator whose `kind` matches `library`.\n */\n affix: AffixSchema.optional(),\n })\n .optional(),\n // template options\n templateOptions: z.record(z.string(), z.any()).optional(),\n});\n\n/**\n * One table's column rules. Strict, so `ommit` is refused by the parser rather than dropped.\n *\n * The whole option exists to remove a column, and a key zod strips in silence is a config that\n * looks like it removed one and did not. `GeneratorSchema` is deliberately not strict and has\n * already cost this repo two options that parsed and then did nothing.\n */\nexport const ColumnRulesSchema = z\n .object({\n omit: z.array(z.string()).optional(),\n pick: z.array(z.string()).optional(),\n })\n .strict();\n\nexport const AnalyzerSchema = z.object({\n includeRelations: z.boolean().default(true),\n validateConstraints: z.boolean().default(true),\n includeHeuristicRelations: z.boolean().default(false),\n});\n\nexport const ConfigSchema = z\n .object({\n schema: z.string(),\n outDir: z.string().default('src/api'),\n /**\n * Which tables to generate for, matched against the database table name.\n *\n * There was no way to say this, and every generator loops over every table it finds, so\n * DRZL emitted unauthenticated CRUD over whatever shared the schema file. That is noise for\n * a migrations table and a genuine leak for an auth one: Better Auth puts `user`, `session`,\n * `account` and `verification` alongside your own tables, and `account` holds\n * `accessToken`, `refreshToken`, `idToken` and `password`.\n *\n * Deliberately name-based and explicit rather than detecting any particular library. Auth\n * table names are all renameable, so a built-in list would miss renamed tables and, worse,\n * silently skip an ordinary table that happened to be called `user`, which is usually the\n * application's main entity.\n *\n * `exclude` wins over `include`. Patterns support `*`, matching within a name.\n */\n include: z.array(z.string()).optional(),\n exclude: z.array(z.string()).optional(),\n /**\n * Which columns of those tables to generate for, keyed by table.\n *\n * `include`/`exclude` is all or nothing per table, and the column that should not be in a\n * generated schema is usually sitting in a table you do want: `passwordHash` on `users`, an\n * internal note beside the public fields, a `tenantId` the server sets from the session and a\n * request body must not carry. Editing the emitted file is not an answer, because the next\n * `drzl generate` overwrites it.\n *\n * ```ts\n * columns: {\n * users: { omit: ['passwordHash'] },\n * 'app_*': { omit: ['deleted_at'] },\n * }\n * ```\n *\n * The key is a table pattern in the same language `include`/`exclude` uses: the database table\n * name, anchored, with `*` as the only metacharacter. Column patterns are the same language\n * again. Every matching entry applies, in the order written; within one entry `pick` narrows\n * first and `omit` then removes, so `omit` wins, exactly as `exclude` wins over `include`.\n *\n * Applies to every mode and every generator at once, because it narrows the analysis rather\n * than any one generator's output. A column cannot be kept in `select` and dropped from\n * `insert`: see the docs for why that form was not taken on.\n *\n * A pattern that matches nothing is an error rather than a no-op, because a typo in `omit`\n * that silently does nothing leaves the column exactly where it was while reading like a fix.\n * Dropping a primary key column is an error too; dropping a NOT NULL column with no default is\n * a warning.\n */\n columns: z.record(z.string(), ColumnRulesSchema).optional(),\n /**\n * How every relative specifier drzl invents spells its extension, for every generator.\n * A generator may override it. Defaults to `js`, which is the only form that resolves\n * under every `moduleResolution` without a compiler flag.\n */\n importExtension: ImportExtensionSchema.default(DEFAULT_IMPORT_EXTENSION),\n analyzer: AnalyzerSchema.default({\n includeRelations: true,\n validateConstraints: true,\n includeHeuristicRelations: false,\n }),\n generators: z\n .array(GeneratorSchema)\n .min(1)\n .default([{ kind: 'orpc' } as any]),\n })\n // Reject an affix before anything is written, rather than emitting a file that cannot\n // compile. Only `affix` is inspected; the legacy flat `schemaSuffix` is left alone so\n // configs that parse today keep parsing.\n .superRefine((cfg, ctx) => {\n cfg.generators.forEach((g, i) => {\n const report = (base: (string | number)[], affix?: AffixOptions, schemaSuffix?: string) => {\n for (const issue of validateAffix(affix, schemaSuffix)) {\n ctx.addIssue({\n code: 'custom',\n path: ['generators', i, ...base, ...issue.path],\n message: issue.message,\n });\n }\n };\n report(['affix'], g.affix as AffixOptions | undefined, g.schemaSuffix);\n report(\n ['validation', 'affix'],\n g.validation?.affix as AffixOptions | undefined,\n g.validation?.schemaSuffix\n );\n });\n });\n\n// ✨ Separate input vs output types\nexport type DrzlConfigInput = z.input<typeof ConfigSchema>;\nexport type DrzlConfig = z.output<typeof ConfigSchema>;\n\nexport function defineConfig<T extends DrzlConfigInput>(cfg: T): T {\n return cfg;\n}\n\ntype GeneratorConfig = DrzlConfig['generators'][number];\n\n/** The generators that emit an RPC router, and so share `outDir` and `validation`. */\nconst ROUTER_KINDS = new Set(['orpc', 'trpc']);\n\n/**\n * Where the tRPC generator writes.\n *\n * `outDir` by default, exactly like oRPC, so a config that names one router generator puts its\n * output where the top-level setting says. `path` is the escape hatch, and a config that runs\n * *both* router generators needs it: they would otherwise write two different `index.ts` files to\n * the same directory and the second would win.\n *\n * Exported because `computeGeneratorOutputDirs` has to agree with the dispatch in cli.ts about\n * this, and the watcher ignoring the wrong directory is an infinite regeneration loop.\n */\nexport function trpcOutDir(g: { path?: string }, cfg: { outDir: string }): string {\n return g.path ?? cfg.outDir;\n}\n\nfunction sharedSchemaNames(opts: { affix?: AffixOptions; schemaSuffix?: string }): string[] {\n const resolved = resolveAffix(opts);\n return NAME_MODES.map((mode) => schemaName(mode, AFFIX_PROBE_TABLE, resolved));\n}\n\n/**\n * Fill in cross-generator defaults and refuse configs whose generators would disagree.\n *\n * An oRPC router that imports shared schemas has to spell the exact names the validation\n * generator exported. Both sides used to be configured independently, so they could silently\n * drift into a router that does not compile. When an oRPC generator uses shared validation\n * and exactly one sibling generator produces that library, its `affix` is copied across.\n *\n * Deliberately conservative about the pre-existing flat `schemaSuffix`: a disagreement there\n * is only reported, never repaired, because repairing it would change the bytes an existing\n * config emits.\n *\n * `importExtension` is pushed down here too. A consumer compiles the whole generated tree\n * with one tsconfig, so the setting that has to hold is the same for every generator, and\n * every call site downstream can then read it off the generator without knowing about the\n * top-level default.\n */\nexport function resolveConfig(cfg: DrzlConfig): { config: DrzlConfig; warnings: string[] } {\n const warnings: string[] = [];\n const generators: GeneratorConfig[] = cfg.generators.map((g) => ({\n ...g,\n importExtension: g.importExtension ?? cfg.importExtension,\n }));\n\n for (const g of generators) {\n // Both router generators import the validation generators' exports by name, so both have to\n // spell them the way the sibling generator wrote them.\n if (!ROUTER_KINDS.has(g.kind)) continue;\n\n /**\n * `databaseInjection` describes a contract between two generators, not a setting of one.\n *\n * A router in injection mode emits `Service.getById(ctx.db, id)`, and only a service\n * generated in the same mode has a `db` parameter to receive it. Declared once on the router\n * and pushed onto the service generator here, exactly as `validation.affix` is pulled the\n * other way, because the alternative is writing the same block twice and a project that\n * compiles in halves and not as a whole.\n *\n * `@drzl/generator-service` honours the flag only while emitting real Drizzle queries: its\n * stub bodies take no database whatever they are told. That combination cannot be repaired\n * from here without changing what an existing config emits, so it is reported instead.\n */\n if (g.databaseInjection?.enabled) {\n for (const s of generators.filter((x) => x.kind === 'service')) {\n if (!s.databaseInjection) {\n s.databaseInjection = g.databaseInjection;\n } else if (!s.databaseInjection.enabled) {\n warnings.push(\n `drzl config: the \"${g.kind}\" generator sets databaseInjection.enabled while the ` +\n `\"service\" generator sets it to false. The router will call ` +\n `Service.method(ctx.db, ...) against services that take no database parameter, so ` +\n `the generated project will not compile. Set both, or neither.`\n );\n }\n if ((s.dataAccess ?? 'stub') === 'stub') {\n warnings.push(\n `drzl config: the \"${g.kind}\" generator sets databaseInjection.enabled, so its ` +\n `handlers call Service.method(ctx.db, ...). The \"service\" generator emits stub ` +\n `bodies, which take no database parameter whatever this option says, so those ` +\n `calls will not compile. Set dataAccess: 'drizzle' on the \"service\" generator, or ` +\n `drop databaseInjection.`\n );\n }\n }\n }\n\n const v = g.validation;\n if (!v?.useShared) continue;\n\n const library = v.library ?? 'zod';\n const siblings = generators.filter((s) => s.kind === library);\n // Zero siblings means the user points at a barrel drzl does not generate; more than one\n // means there is no single source of truth. Either way, leave the config alone.\n if (siblings.length !== 1) continue;\n const sibling = siblings[0];\n\n const theirs = sharedSchemaNames({\n affix: sibling.affix as AffixOptions | undefined,\n schemaSuffix: sibling.schemaSuffix,\n });\n\n if (!v.affix) {\n if (sibling.affix) {\n // Bake the sibling's fully resolved naming in, so its own schemaSuffix fallback\n // travels with it and cannot be re-interpreted on the oRPC side.\n g.validation = {\n ...v,\n affix: resolveAffix({\n affix: sibling.affix as AffixOptions,\n schemaSuffix: sibling.schemaSuffix,\n }),\n };\n continue;\n }\n const mine = sharedSchemaNames({ schemaSuffix: v.schemaSuffix });\n if (mine.join(',') !== theirs.join(',')) {\n warnings.push(\n `drzl config: the \"${g.kind}\" generator's validation.schemaSuffix ` +\n `(${JSON.stringify(v.schemaSuffix ?? 'Schema')}) does not match the \"${library}\" ` +\n `generator's schemaSuffix (${JSON.stringify(sibling.schemaSuffix ?? 'Schema')}). ` +\n `The router will import ${mine.join(', ')} but the \"${library}\" generator exports ` +\n `${theirs.join(', ')}, so the generated router will not compile. Set both to the ` +\n `same value, or move to \"affix\", which is inherited automatically.`\n );\n }\n continue;\n }\n\n const mine = sharedSchemaNames({\n affix: v.affix as AffixOptions,\n schemaSuffix: v.schemaSuffix,\n });\n if (mine.join(',') !== theirs.join(',')) {\n throw new Error(\n `drzl config: the \"${g.kind}\" generator imports shared ${library} schemas, but its ` +\n `validation.affix disagrees with the \"${library}\" generator's own naming. The router ` +\n `would import ${mine.join(', ')} while the \"${library}\" generator exports ` +\n `${theirs.join(', ')}. Make them match, or drop validation.affix and let it be ` +\n `inherited from the \"${library}\" generator.`\n );\n }\n }\n\n return { config: { ...cfg, generators }, warnings };\n}\n\n/**\n * Parse, then resolve cross-generator defaults. Both `generate` and `watch` go through\n * loadConfig, so putting the resolution here is what keeps the two duplicated generator\n * dispatch blocks in cli.ts from needing the logic twice.\n */\nfunction finalize(raw: unknown): DrzlConfig {\n const { config, warnings } = resolveConfig(ConfigSchema.parse(raw));\n for (const w of warnings) console.warn(w);\n return config;\n}\n\nexport async function loadConfig(customPath?: string): Promise<DrzlConfig | null> {\n const fsp = await import('node:fs/promises');\n\n const candidates = customPath\n ? [customPath]\n : [\n 'drzl.config.ts',\n 'drzl.config.mjs',\n 'drzl.config.js',\n 'drzl.config.cjs',\n 'drzl.config.json',\n ];\n\n for (const c of candidates) {\n const p = path.resolve(process.cwd(), c);\n try {\n await fsp.access(p);\n } catch {\n continue;\n }\n\n const ext = path.extname(p).toLowerCase();\n\n // JSON: read directly\n if (ext === '.json') {\n const raw = JSON.parse(await fsp.readFile(p, 'utf8'));\n return finalize(raw);\n }\n\n // Everything else (TS/JS/MJS/CJS) -> Jiti with cache-busting\n const { createJiti } = await import('jiti');\n const stat = await fsp.stat(p);\n\n // Passing __filename is safe in CJS; fallback to cwd if not defined.\n const base =\n typeof __filename !== 'undefined' ? __filename : path.join(process.cwd(), 'index.js');\n\n const jiti = createJiti(base, {\n moduleCache: false, // re-evaluate each time\n fsCache: true, // keep transform cache\n cacheVersion: String(stat.mtimeMs), // bump on edit\n interopDefault: true,\n tryNative: false, // <-- prevent native import of .ts\n // debug: true,\n }) as any;\n\n const mod = await jiti.import(p);\n const raw = mod?.default ?? mod;\n return finalize(raw);\n }\n\n return null;\n}\n\n/** Absolute output dirs for all generators (to ignore in watcher). */\nexport function computeGeneratorOutputDirs(cfg: DrzlConfig, cwd = process.cwd()): string[] {\n const abs = (p: string) => path.resolve(cwd, p);\n const dirs = new Set<string>();\n dirs.add(abs(cfg.outDir)); // orpc\n for (const g of cfg.generators) {\n if (g.kind === 'trpc') dirs.add(abs(trpcOutDir(g, cfg)));\n if (g.kind === 'service') dirs.add(abs(g.path ?? 'src/services'));\n if (g.kind === 'zod') dirs.add(abs(g.path ?? 'src/validators/zod'));\n if (g.kind === 'valibot') dirs.add(abs(g.path ?? 'src/validators/valibot'));\n if (g.kind === 'arktype') dirs.add(abs(g.path ?? 'src/validators/arktype'));\n if (g.kind === 'typebox') dirs.add(abs(g.path ?? 'src/validators/typebox'));\n if (g.kind === 'effect') dirs.add(abs(g.path ?? 'src/validators/effect'));\n if (g.kind === 'json-schema') dirs.add(abs(g.path ?? 'src/validators/json-schema'));\n }\n return [...dirs];\n}\n\n/** Resolve custom template directories (local path or installed package). */\nexport function resolveTemplateDirsSync(cfg: DrzlConfig, cwd = process.cwd()): string[] {\n const results: string[] = [];\n const req = createRequire(\n typeof __filename !== 'undefined' ? __filename : path.join(process.cwd(), 'index.js')\n );\n\n for (const g of cfg.generators) {\n const t = g.template;\n // Built-in template names, not packages. `service` is the tRPC generator's, and without it\n // here every run would try to resolve a package called \"service\" and then watch a directory\n // of that name, neither of which exists.\n if (!t || t === 'standard' || t === 'minimal' || t === 'service') continue;\n\n // Try package resolution relative to cwd\n let pkgDir: string | null = null;\n try {\n const pkg = req.resolve(`${t}/package.json`, { paths: [cwd] as any });\n pkgDir = path.dirname(pkg);\n } catch {}\n\n if (pkgDir) {\n results.push(pkgDir);\n continue;\n }\n\n // Local path-like template\n if (/[./\\\\]/.test(t)) {\n const abs = path.resolve(cwd, t);\n if (fs.existsSync(abs)) results.push(abs);\n }\n }\n\n return Array.from(new Set(results));\n}\n\n/** Build watch targets (exclude output dirs; watcher will ignore those). */\n/**\n * Narrow an analysis's tables to the ones the config asked for.\n *\n * Matching is on the database table name, anchored, with `*` as the only metacharacter. Anchored\n * matters: `user` must not also drop `users`, and a substring match would. `exclude` is applied\n * after `include`, so the safer direction wins when both name the same table.\n *\n * A table also answers to its schema-qualified name, so `reporting.users` addresses one of two\n * same-named tables and `reporting.*` addresses a whole schema. See `tableAliases`.\n */\nexport function filterTables<T extends { name: string; schema?: string }>(\n tables: T[],\n opts: { include?: string[]; exclude?: string[] }\n): T[] {\n let out = tables;\n if (opts.include?.length) out = out.filter((t) => matchesTable(opts.include!, t));\n if (opts.exclude?.length) out = out.filter((t) => !matchesTable(opts.exclude!, t));\n return out;\n}\n\n/**\n * What to warn about the table filter, before it is applied.\n *\n * Separate from `filterTables` so that returns a plain array, as every caller and every test\n * already expects it to.\n */\nexport function tableFilterWarnings(\n tables: readonly { name: string; schema?: string }[],\n opts: { include?: string[]; exclude?: string[] }\n): string[] {\n return [\n ...ambiguousPatternWarnings(opts.include ?? [], tables, 'include'),\n ...ambiguousPatternWarnings(opts.exclude ?? [], tables, 'exclude'),\n ];\n}\n\nexport function computeWatchTargets(cfg: DrzlConfig, cwd = process.cwd()): string[] {\n const abs = (p: string) => path.resolve(cwd, p);\n const schemaAbs = abs(cfg.schema);\n // The schema's directory, not a glob under it. Chokidar removed glob support in v4 and treats\n // `<dir>/**/*.{ts,tsx,js}` as a literal path, so it watched a directory named `**` that does\n // not exist: no event ever fired and `drzl watch` did its initial build and then sat inert.\n // A directory is watched recursively by chokidar itself, and the extension filtering that the\n // glob was doing now happens on the event instead.\n const targets = new Set<string>([\n path.dirname(schemaAbs),\n abs('drzl.config.ts'),\n abs('drzl.config.js'),\n abs('drzl.config.mjs'),\n abs('drzl.config.cjs'),\n ]);\n for (const t of resolveTemplateDirsSync(cfg, cwd)) targets.add(t);\n return [...targets];\n}\n","/**\n * The one name-matching language every filter in a DRZL config speaks.\n *\n * Anchored, with `*` as the only metacharacter. Anchored is the whole point: `user` must not also\n * match `users`, and a substring match would, which for the table filter means silently dropping\n * the application's main entity while trying to drop an auth table.\n *\n * Shared rather than reimplemented. `include`/`exclude` and the per-table `columns` filter both\n * take patterns, and a reader who has learned one has learned the other only while there is one\n * implementation of \"learned\". Two copies of an anchored glob agree on the easy cases and drift on\n * exactly the corners that made this explicit in the first place.\n */\nexport function patternToRegExp(pattern: string): RegExp {\n return new RegExp(\n '^' +\n pattern\n .split('*')\n .map((part) => part.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .join('.*') +\n '$'\n );\n}\n\n/** Whether any of `patterns` matches `name` outright. */\nexport function matchesAny(patterns: string[], name: string): boolean {\n return patterns.some((p) => patternToRegExp(p).test(name));\n}\n\n/** The least a filter needs to know about a table. */\nexport interface NamedTable {\n name: string;\n schema?: string;\n}\n\n/** How the default SQL schema is spelled in a config, since a table in it carries no name for it. */\nexport const DEFAULT_SCHEMA_ALIAS = 'public';\n\n/**\n * Every name a table answers to in a config pattern.\n *\n * A table states one name and lives in one schema, and Postgres lets two schemas hold the same\n * name, so `users` alone stopped identifying a table the moment `pgSchema` entered the picture.\n * Each table therefore answers to two:\n *\n * - its bare database name, unchanged and listed first, so every pattern that matched before\n * matches now. That is not a compatibility gesture: `exclude: ['users']` written before a\n * `reporting` schema existed means \"the users tables\", and quietly narrowing it to one of them\n * would start generating an endpoint the config had already turned off.\n * - its qualified name, `reporting.users`, which is what addresses exactly one of them.\n *\n * A table with no schema answers to `public.users` rather than to a bare-schema form, because\n * Drizzle refuses `pgSchema('public')` outright: there is no other way to write a table in the\n * default schema, so there is no other name for it to have. That makes `public.` an alias this\n * file defines rather than something read back off the analysis, which is why it is only ever\n * offered to a table that names no schema.\n *\n * Order is the order they are tried, and the bare name being first is what keeps a table whose own\n * name contains a dot reachable by a pattern that spells it.\n */\nexport function tableAliases(table: NamedTable): string[] {\n return [table.name, `${table.schema ?? DEFAULT_SCHEMA_ALIAS}.${table.name}`];\n}\n\n/** Whether any of `patterns` matches the table under any of the names it answers to. */\nexport function matchesTable(patterns: string[], table: NamedTable): boolean {\n return tableAliases(table).some((alias) => matchesAny(patterns, alias));\n}\n\n/**\n * How a message names one table.\n *\n * Qualified only where the table names a schema, so every message in a project that uses none is\n * word for word what it was, and a project that uses several never has two of them reading alike.\n */\nexport function displayTableName(table: NamedTable): string {\n return table.schema ? `${table.schema}.${table.name}` : table.name;\n}\n\n/**\n * The spelling that addresses exactly this table and no other, `public.users` included.\n *\n * For a message whose job is to hand the reader something to paste into a config. Elsewhere\n * `displayTableName` is the one to use: spelling `public.` at someone who has only ever had one\n * schema names a concept their schema file does not contain.\n */\nexport function addressableName(table: NamedTable): string {\n return `${table.schema ?? DEFAULT_SCHEMA_ALIAS}.${table.name}`;\n}\n\n/** Whether an analysis has any table outside the default schema at all. */\nexport function hasNamedSchemas(tables: readonly NamedTable[]): boolean {\n return tables.some((t) => t.schema);\n}\n\n/**\n * Patterns that reach more than one SQL schema, which is nearly always a pattern written before\n * the second schema existed.\n *\n * Reported rather than refused. Matching every schema is what an unqualified pattern has always\n * done and is the reading that keeps an existing `exclude` doing its job, so it cannot be an\n * error. It is still worth a sentence, because the two tables are different tables: `columns: {\n * users: { pick: ['id', 'email'] } }` narrows both, and the table that has no `email` silently\n * loses every column that is not `id`, while the typo check stays quiet because the pattern did\n * match a column somewhere.\n *\n * Silent on a schema that uses no `pgSchema`, which is the shape of nearly every one: with one\n * schema in play no pattern can span two.\n */\nexport function ambiguousPatternWarnings(\n patterns: string[],\n tables: readonly NamedTable[],\n option: string\n): string[] {\n const out: string[] = [];\n for (const pattern of patterns) {\n // A pattern that already names a schema said which one it meant.\n if (pattern.includes('.')) continue;\n const matched = tables.filter((t) => matchesTable([pattern], t));\n const schemas = new Set(matched.map((t) => t.schema ?? DEFAULT_SCHEMA_ALIAS));\n if (schemas.size < 2) continue;\n out.push(\n `drzl config: ${option} pattern ${JSON.stringify(pattern)} matches tables in more than one ` +\n `schema, and every one of them is affected: ` +\n `${matched.map(addressableName).sort().join(', ')}. ` +\n `Write the schema to mean one of them, for example ${JSON.stringify(addressableName(matched[0]))}.`\n );\n }\n return out;\n}\n","/**\n * The options `@drzl/generator-trpc` receives, built in one place.\n *\n * `generate` and `watch` each dispatch over `cfg.generators` in their own loop, and every branch\n * in both assembles its own options object by hand. Three documented options have already been\n * found dead that way: `typedJson` never reached typebox, `coerceDates` and `applyDefaults`\n * reached nothing but zod, and `servicesDir` is passed by `generate`'s oRPC branch and not by\n * `watch`'s, so a watch rebuild emits a service import pointing at the default directory whatever\n * the config says. None of those is visible in the wiring: the option parses, the generator\n * defaults it, and the feature simply does nothing.\n *\n * One builder means the two call sites are the same object by construction rather than by review.\n * It also gives the drift something to be asserted against, which is what\n * `packages/cli/test/trpc-branch-parity.spec.ts` does by running both commands and comparing the\n * bytes they wrote.\n */\nimport { trpcOutDir } from './config.js';\n\n/** A generator entry from the config, loosely typed because the config schema owns its shape. */\ntype GeneratorConfig = {\n path?: string;\n template?: unknown;\n includeRelations?: unknown;\n naming?: unknown;\n outputHeader?: unknown;\n format?: unknown;\n importExtension?: unknown;\n validation?: unknown;\n databaseInjection?: unknown;\n};\n\nexport function trpcOptions(\n g: GeneratorConfig,\n cfg: { outDir: string },\n servicesDir: string\n): Record<string, unknown> {\n return {\n outputDir: trpcOutDir(g, cfg),\n template: g.template,\n includeRelations: g.includeRelations,\n naming: g.naming,\n outputHeader: g.outputHeader,\n format: g.format,\n importExtension: g.importExtension,\n validation: g.validation,\n databaseInjection: g.databaseInjection,\n // Where the service generator is actually writing, so `template: 'service'` emits an import\n // of a module that exists. The generator defaults this to `src/services`, which is right only\n // by coincidence for a config that puts them elsewhere.\n servicesDir,\n };\n}\n","/**\n * Choosing which *columns* DRZL generates for.\n *\n * `include`/`exclude` answers \"which tables\". This answers \"which columns of them\", which the\n * config had no way to say at all. A schema DRZL must read in full still holds columns that should\n * not reach a generated file: a `passwordHash` no client should ever be handed, an internal note\n * column, a `tenantId` the server sets from the session and a request body must not carry. The\n * only previous answer was to edit the emitted file, which the next `drzl generate` overwrites.\n *\n * ## Where this runs\n *\n * On the `Analysis`, once, before any generator is constructed, at the same seam `filterTables`\n * already uses. Not inside `@drzl/analyzer`, which reads a schema module and has no config: `drzl\n * analyze` must keep printing what is really there, and a user asking \"what does DRZL see\" has to\n * get the truth rather than their own config read back to them. And not inside each generator:\n * there are nine of them plus two template packages, each with its own idea of a mode, and the one\n * that forgot would emit a schema silently wider than the config asked for. Narrowing the analysis\n * is also what keeps the validators, the OpenAPI document, the emitted `.meta()` facts and the\n * service layer describing the same columns, since all of them read this one object.\n *\n * ## Why the narrowing is more than `columns`\n *\n * A table states its columns twice: once as `columns`, and again by name in `primaryKey`,\n * `unique`, `indexes`, `foreignKeys` and `checks`. Dropping a column from the first list and\n * leaving the others is not a smaller schema, it is an inconsistent one, and each stale name has a\n * different consequence:\n *\n * - `unique` reaches emitted TypeScript verbatim. `findDuplicate<Table>` declares\n * `columns: [\"email\"]` against the insert row type, so a unique key naming a column that type no\n * longer has is a generated file that does not compile. Narrowed.\n * - `foreignKeys` drives the relation lookup procedures in the tRPC and oRPC generators, both of\n * which already resolve the column against `columns` and skip when it is gone. Narrowed, which\n * changes no output and stops the analysis asserting a key over a column it does not have.\n * - `indexes` is read by nothing today. Narrowed anyway, on the same grounds.\n * - `checks` is deliberately *not* narrowed. Every generator already drops a row check naming a\n * column the mode does not carry, so nothing breaks, and the constraint really does still exist\n * in the database: leaving it lets `meta` keep listing it as unenforced, which is the honest\n * answer. A warning says so.\n * - `primaryKey` cannot be narrowed, because omitting a key column is refused outright. See below.\n */\nimport type { Table } from '@drzl/analyzer';\nimport { parseCheck } from '@drzl/validation-core';\nimport { namedColumns } from './doctor.js';\nimport {\n addressableName,\n ambiguousPatternWarnings,\n displayTableName,\n hasNamedSchemas,\n matchesAny,\n matchesTable,\n} from './patterns.js';\n\n/** What to do with one table's columns. Both are patterns, in the language `patterns.ts` defines. */\nexport interface ColumnRules {\n /** Drop these. Applied after `pick`, so it wins where both name the same column. */\n omit?: string[];\n /** Keep only these. */\n pick?: string[];\n}\n\n/**\n * Keyed by table pattern, matched against the database table name exactly as `include` is, and\n * against the schema-qualified name too: `reporting.users` names one of two same-named tables and\n * `reporting.*` names a whole schema.\n */\nexport type ColumnFilter = Record<string, ColumnRules>;\n\nexport interface ColumnFilterResult {\n tables: Table[];\n /** Printed by the caller. Nothing here stops generation. */\n warnings: string[];\n}\n\n/** Every column name a CHECK talks about, whatever kind of constraint it turned out to be. */\nfunction checkedColumns(expression: string | undefined, name: string | undefined): string[] {\n const parsed = parseCheck(expression, name);\n if (!parsed.ok) return [];\n return [...new Set(namedColumns(parsed).map((n) => n.column))];\n}\n\n/**\n * Narrow every table's columns to what the config asked for.\n *\n * Throws on anything that cannot be honoured, with every such problem in one message: a config is\n * edited once and rerun, and reporting the first of four typos three times is three wasted runs.\n * Returns warnings for what *is* honoured but changes what the output can do.\n *\n * Call this **before** `filterTables`. Both orders produce the same tables, since one narrows\n * columns and the other drops whole tables, but only this order lets a `columns` entry name a\n * table that `exclude` also removes without that reading as a typo.\n */\nexport function filterColumns(tables: Table[], spec: ColumnFilter | undefined): ColumnFilterResult {\n const entries = Object.entries(spec ?? {});\n if (!entries.length) return { tables, warnings: [] };\n\n const errors: string[] = [];\n const warnings: string[] = [];\n // Only where the analysis really has more than one schema. A project with one has no `public.`\n // to write, so offering it as the spelling to copy names something its schema file never says.\n const nameForConfig = hasNamedSchemas(tables) ? addressableName : displayTableName;\n\n /**\n * Every pattern has to name something that exists.\n *\n * This is the loud half, and it is the reason the option is safe to reach for. `omit:\n * ['passwrodHash']` that silently does nothing is not a no-op: it is the leak the option was\n * reached for, wearing the shape of a fix, and nothing downstream can tell the difference\n * between a column that was never there and one that was already dropped.\n *\n * A column pattern is required to match in *at least one* of the tables its entry matched, not\n * in all of them. Requiring all would make a wildcard table key useless, and dropping\n * `deleted_at` from every `app_*` table that has one is the main thing a wildcard key is for.\n */\n for (const [tablePattern, rules] of entries) {\n const matched = tables.filter((t) => matchesTable([tablePattern], t));\n if (!matched.length) {\n errors.push(\n `columns[${JSON.stringify(tablePattern)}] matches no table. ` +\n `The schema declares: ${tables.map(nameForConfig).join(', ') || '(no tables)'}.`\n );\n continue;\n }\n const available = [...new Set(matched.flatMap((t) => t.columns.map((c) => c.name)))];\n for (const which of ['pick', 'omit'] as const) {\n for (const pattern of rules[which] ?? []) {\n if (available.some((name) => matchesAny([pattern], name))) continue;\n errors.push(\n `columns[${JSON.stringify(tablePattern)}].${which} names ${JSON.stringify(pattern)}, ` +\n `which matches no column of ${matched.map(nameForConfig).join(', ')}. ` +\n `Available: ${available.join(', ')}.`\n );\n }\n }\n }\n\n // Said once per pattern, before anything is narrowed, because the consequence is that the rules\n // below run over more tables than the writer had in mind and every one of them is a real table.\n warnings.push(\n ...ambiguousPatternWarnings(\n entries.map(([p]) => p),\n tables,\n 'columns'\n )\n );\n\n const out = tables.map((table) => {\n const mine = entries.filter(([pattern]) => matchesTable([pattern], table));\n if (!mine.length) return table;\n\n // Applied in the order the entries are written, so a reader works down the config the way they\n // read it. Within one entry `pick` narrows and then `omit` removes, which is the same\n // precedence `exclude` already has over `include`: the direction that takes something away\n // wins, because that is the safe direction for the thing this option exists to remove.\n let keep = table.columns;\n for (const [, rules] of mine) {\n if (rules.pick?.length) keep = keep.filter((c) => matchesAny(rules.pick!, c.name));\n if (rules.omit?.length) keep = keep.filter((c) => !matchesAny(rules.omit!, c.name));\n }\n if (keep.length === table.columns.length) return table;\n\n const kept = new Set(keep.map((c) => c.name));\n const dropped = table.columns.filter((c) => !kept.has(c.name));\n\n if (!keep.length) {\n errors.push(\n `columns leaves table \"${displayTableName(table)}\" with no columns at all. An empty schema describes ` +\n `no row, so this is never a narrower API. Exclude the table instead, with the top-level ` +\n `\"exclude\" option.`\n );\n return table;\n }\n\n /**\n * A primary key column is refused rather than narrowed, and it is the one hard no here.\n *\n * The key is what addresses a row, and every generator that addresses one reads it\n * differently, so the consequence of dropping it depends on which generators happen to be\n * configured: the tRPC generator resolves the key against `columns` and silently drops byId,\n * update and delete; the oRPC generator never reads the key at all and keeps emitting\n * procedures typed `{ id: number }`; the service generator falls back to a column literally\n * named `id` and emits `eq(users.id, id)`, which does not compile when the key was called\n * something else; the OpenAPI document drops its `/{id}` paths; and zod's `meta` would publish\n * a primary key whose column the schema no longer describes. One config, five outcomes, none\n * of them announced.\n *\n * Refusing is also the reversible direction. An error can be relaxed to a warning later\n * without breaking a config that works; a warning cannot be tightened into an error without\n * breaking one.\n */\n const lostKey = (table.primaryKey?.columns ?? []).filter((n) => !kept.has(n));\n if (lostKey.length) {\n errors.push(\n `columns drops ${lostKey.map((n) => JSON.stringify(n)).join(', ')} from table ` +\n `\"${displayTableName(table)}\", which is part of its primary key ` +\n `(${table.primaryKey?.columns.join(', ')}). The generated getById, update and delete ` +\n `address rows by that key, so the emitted schemas would describe a row nothing can ` +\n `address. Keep the key, or leave the whole table out with the top-level \"exclude\" option.`\n );\n return table;\n }\n\n /**\n * A NOT NULL column with no default is warned about and then dropped, which is the other half\n * of the same judgement.\n *\n * It really does produce an insert schema that cannot describe a whole row. It is also the\n * multi-tenant pattern: a NOT NULL `tenantId` the server takes from the session is exactly a\n * column a request body must not carry, and refusing it would remove one of the two things\n * this option is for. An insert schema describes a request, not a row, so the narrower\n * statement is true; what is not obvious is who then supplies the rest, and that is what the\n * warning says. If a generated service in `drizzle` mode is handed the narrowed body, its\n * `create` parameter is Drizzle's own `$inferInsert` and the missing column is a compile error\n * in the generated project, which is loud on its own.\n */\n for (const c of dropped) {\n if (c.nullable || c.hasDefault || c.isGenerated || table.readOnly) continue;\n warnings.push(\n `drzl config: the \"columns\" option drops \"${c.name}\" from table \"${displayTableName(table)}\", and the ` +\n `database requires it: NOT NULL with no default. The emitted insert schema therefore ` +\n `describes a payload that is not a complete row, so whatever calls db.insert has to ` +\n `supply \"${c.name}\" itself.`\n );\n }\n\n // A CHECK naming a dropped column stops being enforced by anything DRZL emits. The generators\n // already skip it rather than emitting a comparison against a field that is not there, so this\n // is a warning and not an error, but it is exactly the silent kind of loss `drzl doctor` was\n // written for.\n for (const k of table.checks ?? []) {\n // Only names this filter really took away. A CHECK naming a column the table never had is a\n // different finding with a section of its own in `drzl doctor`, and claiming it here would\n // blame the config for something that was already wrong.\n const lost = checkedColumns(k.expression, k.name).filter(\n (n) => !kept.has(n) && table.columns.some((c) => c.name === n)\n );\n if (!lost.length) continue;\n warnings.push(\n `drzl config: CHECK ${k.name ? `\"${k.name}\"` : '(unnamed)'} on table \"${displayTableName(table)}\" ` +\n `names ${lost.map((n) => JSON.stringify(n)).join(', ')}, which the \"columns\" option ` +\n `drops, so nothing DRZL emits enforces it. Your database still does.`\n );\n }\n\n return {\n ...table,\n columns: keep,\n unique: (table.unique ?? []).filter((k) => k.columns.every((n) => kept.has(n))),\n indexes: (table.indexes ?? []).filter((i) => i.columns.every((n) => kept.has(n))),\n ...(table.foreignKeys\n ? { foreignKeys: table.foreignKeys.filter((f) => f.columns.every((n) => kept.has(n))) }\n : {}),\n };\n });\n\n if (errors.length) {\n throw new Error(\n `drzl config: the \"columns\" option cannot be honoured.\\n` +\n errors.map((e) => ` - ${e}`).join('\\n')\n );\n }\n\n return { tables: out, warnings };\n}\n","/**\n * The report behind `drzl doctor`: what DRZL will not check for you, and why.\n *\n * `drzl analyze` already prints the whole `Analysis` as JSON. This is not that. The analysis is a\n * description of the schema and the reader has to know which fields mean trouble; this is the list\n * of things that will silently not work, each with the sentence that says what to do about it.\n *\n * The point of the command is the *silent* half. A generator that cannot type a column emits a\n * validator accepting any value, and a CHECK the parser declines is simply absent from the output:\n * both produce a file that looks finished. `drzl generate` prints a one-line count for the first\n * and says nothing at all about the second.\n *\n * Two of the sections here read something the analyzer does not know:\n *\n * - **CHECK constraints.** `parseCheck` lives in `@drzl/validation-core` and every validation\n * generator calls it; the analyzer never does. It carries the raw expression through and has no\n * opinion on whether anything can be made of it. So the only way to say \"this constraint is in\n * your schema and nothing DRZL emits enforces it\" is to run the generators' own parser, which is\n * what this file does.\n * - **Primary keys.** The service generator keys `getById`, `update` and `delete` on\n * `table.primaryKey?.columns[0] ?? 'id'`, and the router templates take an `id` input to match.\n * A table with no primary key therefore gets a service referencing a column that may not exist,\n * and a composite key gets one keyed on half of it. The analysis states the key correctly; the\n * consequence is the generator's.\n *\n * Deliberately *not* reported, and each for a measured reason:\n *\n * - A CHECK that DRZL does translate. `age >= 18` folds into `.gte(18)` and `start < end` becomes\n * an object-level refinement; listing them as findings would drown the ones that matter.\n * - `length(col)` and `cardinality(col)` landing on a column that cannot take them. Some of the\n * validation generators drop those and some emit something for them, so no single sentence here\n * is true of all of them. It is also unreachable from a working schema: Postgres has no\n * `length(anyarray)` and no `cardinality(integer)`, so the DDL is refused before DRZL sees it.\n */\nimport type { Analysis, Column, Issue, Table } from '@drzl/analyzer';\nimport { parseCheck } from '@drzl/validation-core';\nimport chalk from 'chalk';\n\nexport type DoctorFindingKind =\n /** A column whose validator will accept any value. */\n | 'unknown-column'\n /** A CHECK the shared parser refused to translate. */\n | 'check-declined'\n /** A CHECK naming a column the table does not have. */\n | 'check-unknown-column'\n /** A CHECK comparing an array or structured column against a scalar literal. */\n | 'check-not-scalar'\n /** A table the generators cannot key. */\n | 'no-primary-key'\n /** A table keyed on more columns than the generators use. */\n | 'partial-primary-key'\n /** Anything else the analyzer said, passed through rather than dropped. */\n | 'analyzer';\n\nexport interface DoctorFinding {\n kind: DoctorFindingKind;\n level: 'warn' | 'error';\n /** Table this is about, as the analysis names it. Absent for a finding about the whole schema. */\n table?: string;\n column?: string;\n /** Constraint name, where the finding is about a CHECK. */\n constraint?: string;\n message: string;\n hint?: string;\n}\n\nexport interface DoctorReport {\n /** The schema path as the user spelled it, so the report names the file they asked about. */\n schema: string;\n dialect: string;\n /** True only when there is nothing at all to say. */\n ok: boolean;\n counts: { tables: number; columns: number; checks: number; findings: number };\n findings: DoctorFinding[];\n}\n\n/** Issue codes with a section of their own, so the catch-all does not print them twice. */\nconst HANDLED_CODES = new Set(['DRZL_ANL_UNKNOWN_COLUMN']);\n\n/**\n * Split an issue `path` into its table and column halves.\n *\n * The analyzer writes `table.column` for a column issue and a bare table name otherwise. Table\n * names are JavaScript identifiers, so the last dot is the separator and there is no ambiguity.\n */\nfunction splitPath(path: string | undefined): { table?: string; column?: string } {\n if (!path) return {};\n const dot = path.lastIndexOf('.');\n if (dot <= 0) return { table: path };\n return { table: path.slice(0, dot), column: path.slice(dot + 1) };\n}\n\n/**\n * Every column name a parsed CHECK talks about, paired with the kind of constraint it came from.\n *\n * Exported because the column filter needs the same answer: a constraint stops being enforced when\n * any column it names is dropped, and \"which columns does this name\" has to mean one thing.\n */\nexport function namedColumns(parsed: Extract<ReturnType<typeof parseCheck>, { ok: true }>) {\n const out: Array<{ column: string; scalar: boolean }> = [];\n // A comparison against a literal and an `IN` list are both statements about a scalar value, so\n // neither describes an array or a structured column. The other three kinds are not: a length or\n // a cardinality is a statement about a count, and a row check is a comparison of two columns.\n for (const c of parsed.checks) out.push({ column: c.column, scalar: true });\n for (const s of parsed.sets ?? []) out.push({ column: s.column, scalar: true });\n for (const l of parsed.lengths ?? []) out.push({ column: l.column, scalar: false });\n for (const c of parsed.cardinalities ?? []) out.push({ column: c.column, scalar: false });\n for (const r of parsed.rows ?? []) {\n out.push({ column: r.left, scalar: false });\n out.push({ column: r.right, scalar: false });\n }\n return out;\n}\n\n/**\n * What a column is, for a sentence about a constraint that does not fit it.\n *\n * Every `ColumnShape` kind has an arm, so a shape added later reads as \"a structured column\" rather\n * than as a wrong noun. `arrayDimensions` is checked first because an array carries its element's\n * shape and it is the array the constraint failed to describe.\n */\nfunction describeShape(c: Column): string {\n if (c.arrayDimensions) return 'an array';\n switch (c.shape?.kind) {\n case 'json':\n return 'a JSON';\n case 'buffer':\n return 'a binary';\n case 'tuple':\n case 'numberObject':\n return 'a structured';\n case 'numberVector':\n return 'a vector';\n case 'bitstring':\n return 'a bit-string';\n case 'byteString':\n return 'a byte-string';\n case 'custom':\n return 'a customType';\n default:\n return 'a structured';\n }\n}\n\nfunction checkFindings(table: Table): DoctorFinding[] {\n const out: DoctorFinding[] = [];\n const byName = new Map(table.columns.map((c) => [c.name, c]));\n for (const k of table.checks ?? []) {\n const label = k.name ? `\"${k.name}\"` : 'an unnamed constraint';\n const raw = k.expression ?? '';\n // A constraint whose expression the analyzer could not render at all is the one case where\n // printing the expression verbatim says nothing, and a line ending in \"Expression:\" reads\n // like the report itself is broken.\n const expr = raw.trim() ? raw : '(empty)';\n const parsed = parseCheck(raw, k.name);\n if (!parsed.ok) {\n out.push({\n kind: 'check-declined',\n level: 'warn',\n table: table.tsName,\n constraint: k.name,\n message: `CHECK ${label} on \"${table.tsName}\" is not translated: ${parsed.reason}. Expression: ${expr}`,\n hint:\n 'Only constraints whose meaning is unambiguous are translated, because a validator ' +\n 'enforcing a guess rejects rows the database accepts. Your database still enforces ' +\n 'this one; nothing DRZL emits does.',\n });\n continue;\n }\n\n // Reported once per column rather than once per clause, so `a >= 1 AND a <= 9` on a missing\n // column is one line and not two.\n const seen = new Set<string>();\n for (const { column, scalar } of namedColumns(parsed)) {\n if (seen.has(column)) continue;\n seen.add(column);\n const col = byName.get(column);\n if (!col) {\n out.push({\n kind: 'check-unknown-column',\n level: 'warn',\n table: table.tsName,\n column,\n constraint: k.name,\n message: `CHECK ${label} on \"${table.tsName}\" names \"${column}\", which is not a column of that table, so nothing enforces it. Expression: ${expr}`,\n hint:\n 'A constraint is attached to the field it names. Check the spelling, or move a ' +\n 'constraint spanning two tables out of the schema.',\n });\n continue;\n }\n if (scalar && (col.arrayDimensions || col.shape)) {\n out.push({\n kind: 'check-not-scalar',\n level: 'warn',\n table: table.tsName,\n column,\n constraint: k.name,\n message: `CHECK ${label} on \"${table.tsName}\" compares ${describeShape(col)} column \"${column}\" against a scalar literal, which does not describe it, so it is not translated. Expression: ${expr}`,\n hint:\n 'On an array column only cardinality(col) is read, since it is the one comparison ' +\n 'that is about the array rather than about an element.',\n });\n }\n }\n }\n return out;\n}\n\nfunction primaryKeyFindings(table: Table): DoctorFinding[] {\n // A read-only relation takes no writes and gets no keyed route, so it needs no key.\n if (table.readOnly) return [];\n const pk = table.primaryKey?.columns ?? [];\n if (!pk.length) {\n const hasId = table.columns.some((c) => c.name === 'id');\n return [\n {\n kind: 'no-primary-key',\n level: 'warn',\n table: table.tsName,\n message: hasId\n ? `Table \"${table.tsName}\" declares no primary key. The service and router generators fall back to a column named \"id\", which this table happens to have, so they work by coincidence.`\n : `Table \"${table.tsName}\" declares no primary key. The service and router generators fall back to a column named \"id\", which this table does not have, so the generated service will not compile.`,\n hint: 'Declare a primary key, or leave this table out with the config table filter.',\n },\n ];\n }\n if (pk.length > 1) {\n return [\n {\n kind: 'partial-primary-key',\n level: 'warn',\n table: table.tsName,\n message: `Table \"${table.tsName}\" has a composite primary key (${pk.join(', ')}). The service and router generators key getById, update and delete on \"${pk[0]}\" alone, so those operations match on part of the key.`,\n hint: 'Treat the generated service as a starting point for this table and widen the key by hand.',\n },\n ];\n }\n return [];\n}\n\n/**\n * Everything worth saying about one analysis, in the order it should be read.\n *\n * Ordered worst-first, and within that silent-first. A schema that could not be analyzed comes\n * first because nothing after it is trustworthy. Untypeable columns and dropped constraints come\n * next because they are invisible: the generated file exists, compiles and validates nothing. The\n * primary-key findings come after because one half of that pair announces itself as a compile\n * error. The catch-all is last.\n */\nexport function buildDoctorReport(analysis: Analysis, schemaPath: string): DoctorReport {\n const findings: DoctorFinding[] = [];\n\n const errors = analysis.issues.filter((i: Issue) => i.level === 'error');\n for (const i of errors) {\n findings.push({\n kind: 'analyzer',\n level: 'error',\n ...splitPath(i.path),\n message: i.message,\n hint: i.hint,\n });\n }\n\n for (const i of analysis.issues) {\n if (i.code !== 'DRZL_ANL_UNKNOWN_COLUMN') continue;\n findings.push({\n kind: 'unknown-column',\n level: 'warn',\n ...splitPath(i.path),\n message: i.message,\n hint: i.hint,\n });\n }\n\n for (const t of analysis.tables) findings.push(...checkFindings(t));\n for (const t of analysis.tables) findings.push(...primaryKeyFindings(t));\n\n for (const i of analysis.issues) {\n if (i.level === 'error' || HANDLED_CODES.has(i.code)) continue;\n findings.push({\n kind: 'analyzer',\n level: 'warn',\n ...splitPath(i.path),\n message: i.message,\n hint: i.hint,\n });\n }\n\n const columns = analysis.tables.reduce((n, t) => n + t.columns.length, 0);\n const checks = analysis.tables.reduce((n, t) => n + (t.checks?.length ?? 0), 0);\n return {\n schema: schemaPath,\n dialect: analysis.dialect,\n ok: findings.length === 0,\n counts: { tables: analysis.tables.length, columns, checks, findings: findings.length },\n findings,\n };\n}\n\n/** Sections, in report order, each with the sentence that says why its contents matter. */\nconst SECTIONS: Array<{ kinds: DoctorFindingKind[]; title: string; why: string }> = [\n {\n kinds: ['unknown-column'],\n title: 'Columns DRZL cannot type',\n why: 'These get a validator that accepts any value.',\n },\n {\n kinds: ['check-declined', 'check-unknown-column', 'check-not-scalar'],\n title: 'CHECK constraints DRZL does not enforce',\n why: 'Your database still enforces these. Nothing DRZL generates does.',\n },\n {\n kinds: ['no-primary-key', 'partial-primary-key'],\n title: 'Primary keys the generators cannot use',\n why: 'The generated getById, update and delete are keyed on one column.',\n },\n {\n kinds: ['analyzer'],\n title: 'Other findings',\n why: 'Reported by the analyzer while reading the schema.',\n },\n];\n\n/**\n * Wrap a sentence under a fixed indent, so it does not run off a narrow terminal.\n *\n * `first` is the prefix the opening line carries instead of the indent, which is what gives a\n * finding its bullet and its continuation lines a hanging indent under the text rather than under\n * the bullet.\n */\nfunction wrap(text: string, indent: string, first = indent, width = 96): string {\n const lines: string[] = [];\n let line = '';\n for (const word of text.split(/\\s+/)) {\n if (line && `${line} ${word}`.length + indent.length > width) {\n lines.push(line);\n line = word;\n } else {\n line = line ? `${line} ${word}` : word;\n }\n }\n if (line) lines.push(line);\n return lines.map((l, i) => (i === 0 ? first : indent) + l).join('\\n');\n}\n\n/**\n * The human-readable report.\n *\n * A clean schema prints what was looked at rather than nothing, because an empty page cannot be\n * told apart from a command that failed to run.\n */\nexport function renderDoctorReport(report: DoctorReport): string {\n const out: string[] = [];\n const plural = (n: number, one: string) => `${n} ${one}${n === 1 ? '' : 's'}`;\n\n out.push(chalk.bold(`DRZL doctor ${report.schema}`));\n out.push(\n chalk.dim(\n `${report.dialect}, ${plural(report.counts.tables, 'table')}, ` +\n `${plural(report.counts.columns, 'column')}, ${plural(report.counts.checks, 'CHECK constraint')}`\n )\n );\n out.push('');\n\n if (report.ok) {\n out.push(chalk.green('Nothing to report.'));\n out.push(chalk.dim(' Every column has a type DRZL can describe.'));\n out.push(chalk.dim(' Every CHECK constraint is translated into the generated validators.'));\n out.push(chalk.dim(' Every table has a primary key the generators can use.'));\n return out.join('\\n');\n }\n\n // Ahead of the sections rather than inside one. An error means the schema was never read, so\n // every count above is zero and every section below is empty, and printing that under \"Other\n // findings\" at the foot of the page buries the only sentence that matters.\n const fatal = report.findings.filter((f) => f.level === 'error');\n if (fatal.length) {\n out.push(chalk.red('DRZL could not read this schema'));\n out.push(chalk.dim(' Nothing else could be checked.'));\n out.push('');\n for (const f of fatal) {\n out.push(wrap(f.message, ' ', ` ${chalk.dim('-')} `));\n if (f.hint) out.push(chalk.dim(wrap(f.hint, ' ')));\n }\n out.push('');\n }\n\n for (const section of SECTIONS) {\n const mine = report.findings.filter(\n (f) => f.level !== 'error' && section.kinds.includes(f.kind)\n );\n if (!mine.length) continue;\n out.push(chalk.yellow(`${section.title} (${mine.length})`));\n out.push(chalk.dim(` ${section.why}`));\n out.push('');\n // One hint per distinct sentence, under the findings that share it: the same advice repeated\n // under twenty columns is the thing that makes a report unreadable.\n const groups = new Map<string, DoctorFinding[]>();\n for (const f of mine) {\n const key = f.hint ?? '';\n groups.set(key, [...(groups.get(key) ?? []), f]);\n }\n for (const [hint, items] of groups) {\n for (const f of items) out.push(wrap(f.message, ' ', ` ${chalk.dim('-')} `));\n if (hint) out.push(chalk.dim(wrap(hint, ' ')));\n out.push('');\n }\n }\n\n out.push(\n chalk.bold(`${plural(report.counts.findings, 'finding')} in ${report.schema}.`) +\n chalk.dim(\n fatal.length\n ? ' Fix the error above and run this again.'\n : ' None of these stop DRZL generating; they are what it will not check for you.'\n )\n );\n return out.join('\\n');\n}\n","/**\n * Drift detection for generated output.\n *\n * No runtime validator can offer this. `drizzle-orm/zod` and friends derive schemas in memory at\n * import time, so there is nothing on disk to have drifted and nothing for CI to compare. It is\n * only available to a code generator, which makes it one of the few things DRZL can do that the\n * first-party modules structurally cannot.\n *\n * The check is: regenerate, and require the result to equal what is committed. That catches the\n * two failures that actually happen, someone editing generated files by hand and someone\n * changing the schema without regenerating, and it catches them in CI rather than in review.\n *\n * Content-neutral by construction. Redirecting output to a temporary directory would not work:\n * generated files contain paths computed relative to their own location, so a different output\n * directory produces legitimately different bytes and every file would report as drifted. So the\n * real directories are snapshotted first, regeneration is allowed to overwrite them, and the\n * snapshot is put back if anything changed. Either way the tree ends as it began.\n */\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nexport interface DriftEntry {\n file: string;\n status: 'changed' | 'added' | 'removed';\n}\n\n/** Every file under `dir`, keyed by its path relative to `dir`. Missing directory means empty. */\nexport async function snapshotDir(dir: string): Promise<Map<string, string>> {\n const out = new Map<string, string>();\n async function walk(current: string) {\n let entries;\n try {\n entries = await fs.readdir(current, { withFileTypes: true });\n } catch {\n return; // Nothing generated there yet, which a first run should report as additions.\n }\n for (const e of entries) {\n const full = path.join(current, e.name);\n if (e.isDirectory()) await walk(full);\n else out.set(path.relative(dir, full), await fs.readFile(full, 'utf8'));\n }\n }\n await walk(dir);\n return out;\n}\n\n/** Snapshot several directories at once, keys prefixed by directory so they cannot collide. */\nexport async function snapshotAll(dirs: string[]): Promise<Map<string, string>> {\n const all = new Map<string, string>();\n for (const dir of dirs) {\n for (const [rel, content] of await snapshotDir(dir)) {\n all.set(path.join(dir, rel), content);\n }\n }\n return all;\n}\n\n/** What changed between two snapshots. */\nexport function diffSnapshots(\n before: Map<string, string>,\n after: Map<string, string>\n): DriftEntry[] {\n const out: DriftEntry[] = [];\n for (const [file, content] of after) {\n if (!before.has(file)) out.push({ file, status: 'added' });\n else if (before.get(file) !== content) out.push({ file, status: 'changed' });\n }\n for (const file of before.keys()) {\n if (!after.has(file)) out.push({ file, status: 'removed' });\n }\n return out.sort((a, b) => a.file.localeCompare(b.file));\n}\n\n/**\n * Put a snapshot back, so a failed check leaves the tree exactly as it found it.\n *\n * A file that regeneration created and the snapshot does not know about is deleted, since it was\n * not there before the check ran.\n */\nexport async function restoreSnapshot(\n before: Map<string, string>,\n after: Map<string, string>\n): Promise<void> {\n for (const [file, content] of before) {\n await fs.mkdir(path.dirname(file), { recursive: true });\n await fs.writeFile(file, content, 'utf8');\n }\n for (const file of after.keys()) {\n if (!before.has(file)) await fs.rm(file, { force: true });\n }\n}\n","/**\n * Loading an optional generator package, and telling absence apart from failure.\n *\n * Every validation generator is loaded on demand, because a project that only wants zod should not\n * have to install five. That makes \"the package is not installed\" a real, expected outcome worth a\n * helpful message. It does not make it the only outcome: a generator that is installed and running\n * can throw for any reason a program can throw, and the CLI reported all of those as a missing npm\n * package too, with the true reason printed underneath as a detail.\n *\n * Node reports an unresolvable import as `ERR_MODULE_NOT_FOUND`, and reports the same code when\n * the module resolved and something *it* imported did not. The code alone therefore does not\n * separate the two; the message does, because it names the specifier that failed to resolve.\n */\n\n/** A generator package that is not installed. Everything else is somebody's real error. */\nexport class GeneratorNotInstalledError extends Error {\n constructor(\n readonly specifier: string,\n /** What Node threw, kept so nothing is discarded on the way to the message. */\n readonly reason: unknown\n ) {\n super(`${specifier} is not installed`);\n this.name = 'GeneratorNotInstalledError';\n }\n}\n\n/**\n * Whether `err` is Node refusing to resolve `specifier` itself.\n *\n * Measured on Node 22, from an ESM entry and from a CJS one, since the CLI ships both builds and\n * the bundler leaves `import()` as `import()` in each:\n *\n * absent package ERR_MODULE_NOT_FOUND, `Cannot find package '<specifier>' imported…`\n * present, inner dep absent ERR_MODULE_NOT_FOUND, naming the *inner* specifier instead\n * present, main file gone ERR_MODULE_NOT_FOUND, naming the resolved file path\n * throws while evaluating no `code` at all, and whatever message the generator threw\n *\n * Only the first is an install problem, and only the first quotes the specifier that was asked\n * for, which is what this matches on.\n */\nexport function isPackageMissing(err: unknown, specifier: string): boolean {\n const code = (err as { code?: unknown } | null | undefined)?.code;\n if (code !== 'ERR_MODULE_NOT_FOUND') return false;\n const message = (err as { message?: unknown } | null | undefined)?.message;\n return typeof message === 'string' && message.includes(`'${specifier}'`);\n}\n\n/**\n * Run `load` and re-throw a missing package as `GeneratorNotInstalledError`.\n *\n * `load` is a thunk rather than a specifier so the caller keeps a literal `import('@drzl/…')` in\n * its own source, which is what lets the bundler see the dependency. Anything it throws that is\n * not this package's own absence comes out unchanged.\n */\nexport async function loadGenerator<T>(specifier: string, load: () => Promise<T>): Promise<T> {\n try {\n return await load();\n } catch (e) {\n if (isPackageMissing(e, specifier)) throw new GeneratorNotInstalledError(specifier, e);\n throw e;\n }\n}\n","import chalk from 'chalk';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\n\nexport interface SponsorMessageOptions {\n reason?: string;\n minIntervalMs?: number;\n force?: boolean;\n}\n\ninterface SponsorCachePayload {\n runs: number;\n lastShownAt?: number;\n lastReason?: string;\n}\n\nconst CACHE_DIR = path.join(process.cwd(), 'node_modules', '.cache', '@drzl');\nconst CACHE_FILE = path.join(CACHE_DIR, 'sponsor-message.json');\nconst DEFAULT_INTERVAL_MS = 1000 * 60 * 15; // 15 minutes\nlet shownThisProcess = false;\n\nconst tips = [\n 'Pair DRZL watch mode with drizzle-kit to keep schema & API synced.',\n 'Templatize your ORPC routers to roll out new endpoints safely.',\n 'Need typed validators? Enable the zod, valibot, arktype, typebox, or effect generators.',\n 'Need JSON Schema or OpenAPI? The json-schema generator emits both, with no runtime dependency.',\n 'Use output headers to track generated files and trim noisy diffs.',\n];\n\nconst green = (msg: string) => chalk.hex('#6ee7b7')(msg);\nconst cyan = (msg: string) => chalk.cyan(msg);\nconst gray = (msg: string) => chalk.gray(msg);\n\nexport function maybeShowSponsorMessage({\n reason = 'generate',\n minIntervalMs = DEFAULT_INTERVAL_MS,\n force = false,\n}: SponsorMessageOptions = {}) {\n const hideViaEnv = process.env.DRZL_HIDE_SPONSOR?.toLowerCase();\n const hideRequested = hideViaEnv === '1' || hideViaEnv === 'true';\n if (hideRequested || (process.env.CI && !force) || (shownThisProcess && !force)) return;\n\n try {\n mkdirSync(CACHE_DIR, { recursive: true });\n const payload = readCache();\n payload.runs += 1;\n\n const now = Date.now();\n const shouldShow = force || now - (payload.lastShownAt ?? 0) >= minIntervalMs;\n\n if (shouldShow) {\n payload.lastShownAt = now;\n payload.lastReason = reason;\n }\n\n writeCache(payload);\n\n if (!shouldShow) return;\n\n shownThisProcess = true;\n const tip = tips[payload.runs % tips.length];\n\n console.log(\n `\\n${cyan(`🚀 DRZL finished a ${reason} run (#${payload.runs.toLocaleString()}).`)}\\n\\n` +\n `${green('✨ Sponsors keep DRZL shipping. Consider supporting ongoing dev:')}\\n` +\n ` ${green('GitHub Sponsors')} ${gray('→ https://github.com/sponsors/omar-dulaimi')}\\n\\n` +\n `${green('Pro tip:')} ${tip}\\n`\n );\n } catch {\n // Swallow to avoid impacting generator success paths\n }\n}\n\nfunction readCache(): SponsorCachePayload {\n if (!existsSync(CACHE_FILE)) {\n return { runs: 0 };\n }\n try {\n const data = JSON.parse(readFileSync(CACHE_FILE, 'utf8')) as SponsorCachePayload;\n if (typeof data.runs !== 'number') return { runs: 0 };\n return data;\n } catch {\n return { runs: 0 };\n }\n}\n\nfunction writeCache(payload: SponsorCachePayload) {\n writeFileSync(CACHE_FILE, JSON.stringify(payload, null, 2), 'utf8');\n}\n","/**\n * The version `drzl --version` prints, read from the manifest that ships beside the build.\n *\n * It used to be the literal `'0.0.1'`, passed to `program.version()` when the CLI was scaffolded\n * and never touched again. That was true of exactly one release, the first: the registry lists 29\n * versions of `@drzl/cli`, and the other 28 printed `0.0.1` as well. Reading the manifest is the\n * only form that cannot drift, because it is the same file the registry took the version from.\n *\n * Nothing here falls back. A build that cannot find its own manifest, or finds someone else's, has\n * resolved somewhere it did not intend to, and a placeholder standing in for that is how the\n * original defect stayed invisible for 28 releases.\n */\nimport { readFileSync } from 'node:fs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/** The name the manifest beside this build must carry, which is what makes it ours. */\nconst PACKAGE_NAME = '@drzl/cli';\n\n/**\n * The directory holding the file this code ends up in, in every form it is reached.\n *\n * Three of them: `dist/cli.js`, `dist/cli.cjs`, and this file unbundled under ts-node, all three\n * run and checked. Only the CommonJS bundle has no `import.meta`; `tsup.config.ts` gives that\n * build a real value for `import.meta.url` rather than esbuild's empty one, so this needs no\n * branch. If that config is ever dropped, `fileURLToPath(undefined)` throws on load, so the\n * CommonJS bundle stops working loudly instead of reporting the wrong directory.\n */\nfunction moduleDir(): string {\n return path.dirname(fileURLToPath(import.meta.url));\n}\n\n/**\n * The `version` a named manifest declares, or a throw naming what was wrong with it.\n *\n * Split out from the caller below only so the three ways it refuses can be exercised without a\n * build. Nothing in the CLI passes a path.\n */\nexport function readVersionFrom(manifestPath: string): string {\n let raw: string;\n try {\n raw = readFileSync(manifestPath, 'utf8');\n } catch (e: any) {\n throw new Error(\n `${PACKAGE_NAME} cannot read its own version: no manifest at ${manifestPath} ` +\n `(${e?.message ?? String(e)}).`\n );\n }\n\n const manifest = JSON.parse(raw) as { name?: unknown; version?: unknown };\n\n if (manifest.name !== PACKAGE_NAME) {\n throw new Error(\n `${PACKAGE_NAME} looked for its own version in ${manifestPath} and found ` +\n `${JSON.stringify(manifest.name)}, so this build is not sitting where it thinks it is.`\n );\n }\n\n if (typeof manifest.version !== 'string' || manifest.version.length === 0) {\n throw new Error(`${manifestPath} declares no version, so there is nothing to report.`);\n }\n\n return manifest.version;\n}\n\n/**\n * The `version` field of this package's own manifest.\n *\n * Both bundles sit one level below it, in `dist/`, and so does `src/` when this file is run\n * unbundled, so one `..` covers every way it is reached. All three were run.\n */\nexport function readCliVersion(): string {\n return readVersionFrom(path.join(moduleDir(), '..', 'package.json'));\n}\n\nexport const CLI_VERSION = readCliVersion();\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiFA,SAAS,OAAO,QAAQ;AACtB,MAAI,OAAO,cAAc,OAAO,WAAW,OAAQ,QAAO;AAC1D,MAAI,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO,SAAS,eAAgB,QAAO;AACpF,SAAO,CAAC,CAAC,UAAU,UAAU,WAAW,MAAM,EAAE,SAAS,OAAO,MAAM;AACxE;AACA,SAAS,QAAQ,QAAQ,KAAK,MAAM;AAClC,QAAM,IAAI,KAAK,GAAG;AAClB,MAAI,QAAQ,MAAM;AAChB,QAAI,OAAO,cAAc,OAAO,WAAW,OAAQ,QAAO,EAAE,KAAK,OAAO,UAAU;AAClF,QAAI,OAAO,OAAO,SAAS,WAAW,EAAE,MAAO,QAAO,EAAE,MAAM,OAAO,MAAM,MAAM;AACjF,QAAI,OAAO,OAAO,SAAS,kBAAkB,EAAE,cAAc;AAC3D,aAAO,EAAE,aAAa,OAAO,MAAM,MAAM;AAAA,IAC3C;AACA,YAAQ,OAAO,QAAQ;AAAA,MACrB,KAAK;AACH,eAAO,EAAE;AAAA,MACX,KAAK;AACH,eAAO,EAAE;AAAA,MACX,KAAK;AACH,eAAO,EAAE;AAAA,MACX,KAAK;AACH,eAAO,EAAE;AAAA,MACX;AACE,eAAO,EAAE;AAAA,IACb;AAAA,EACF,GAAG;AACH,MAAI,OAAO,SAAU,QAAO,EAAE,SAAS,IAAI;AAC3C,MAAI,SAAS,UAAU;AACrB,UAAM,WAAW,SAAS,YAAY,OAAO,YAAY,OAAO;AAChE,QAAI,SAAU,QAAO,EAAE,SAAS,IAAI;AAAA,EACtC;AACA,SAAO;AACT;AACA,SAAS,MAAM,QAAQ,KAAK,MAAM;AAChC,QAAM,IAAI,KAAK,GAAG;AAClB,QAAM,OAAO,QAAQ,QAAQ,KAAK,IAAI;AACtC,SAAO,GAAG,UAAU,OAAO,IAAI,CAAC,KAAK,EAAE,gBAAgB,KAAK,UAAU,IAAI,IAAI,IAAI;AACpF;AACA,SAAS,UAAU,MAAM;AACvB,SAAO,QAAQ,IAAI,IAAI,OAAO,KAAK,UAAU,IAAI;AACnD;AACA,SAAS,aAAa,OAAO,KAAK,MAAM;AACtC,QAAM,IAAI,KAAK,GAAG;AAClB,QAAM,OAAO,MAAM,QAAQ,OAAO,CAAC,MAAM,SAAS,WAAW,OAAO,CAAC,EAAE,WAAW;AAClF,QAAM,OAAO,KAAK,IAAI,CAAC,MAAM,KAAK,MAAM,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI;AACnE,QAAM,SAAS,EAAE,OAAO,IAAI;AAC5B,SAAO,SAAS,YAAY,EAAE,gBAAgB,EAAE,cAAc,MAAM,IAAI;AAC1E;AACA,SAAS,OAAO,GAAG,GAAG;AACpB,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,QAAQ,EAAE,QAAQ,sBAAsB,OAAO,EAAE,QAAQ,SAAS,GAAG,EAAE,MAAM,KAAK;AACxF,MAAI,MAAM,SAAS;AACjB,WAAO,MAAM;AAAA,MACX,CAAC,GAAG,MAAM,MAAM,IAAI,EAAE,YAAY,IAAI,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC,EAAE,YAAY;AAAA,IAC3F,EAAE,KAAK,EAAE;AAAA,EACX;AACA,MAAI,MAAM,QAAS,QAAO,MAAM,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,KAAK,GAAG;AACpE,MAAI,MAAM,QAAS,QAAO,MAAM,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,KAAK,GAAG;AACpE,SAAO;AACT;AAKA,SAAS,WAAW,OAAO;AACzB,QAAM,QAAQ,MAAM,YAAY,WAAW,CAAC;AAC5C,MAAI,CAAC,MAAM,OAAQ,QAAO;AAC1B,QAAM,OAAO,MAAM,IAAI,CAAC,MAAM,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AACrE,MAAI,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,EAAG,QAAO;AACjC,SAAO;AACT;AA+CA,SAAS,WAAW,MAAM;AACxB,QAAM,YAAY,KAAK,mBAAmB,YAAY;AACtD,QAAM,SAAS,KAAK,mBAAmB,gBAAgB;AACvD,QAAM,aAAa,KAAK,mBAAmB,qBAAqB,iBAAiB,KAAK,kBAAkB,mBAAmB,IAAI,YAAY,KAAK,kBAAkB,mBAAmB,IAAI;AAAA,IACvL;AACF,QAAM,aAAa,YAAY,wDAAwD;AACvF,QAAM,UAAU,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAQrB,MAAM;AAAA,KACV;AAAA;AAAA;AAAA;AAAA;AAKH,QAAM,aAAa,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAc7B;AACF,SAAO;AAAA;AAAA,EAEP,UAAU;AAAA,EACV,UAAU;AAAA,EACV,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUP,UAAU;AACZ;AACA,SAAS,aAAa,OAAO,MAAM,KAAK;AACtC,QAAM,MAAM,KAAK,YAAY,WAAW;AACxC,QAAM,IAAI,KAAK,GAAG;AAClB,QAAM,UAAU,KAAK,aAAa;AAClC,QAAM,YAAY,KAAK,mBAAmB,YAAY;AACtD,QAAM,UAAU,YAAY,gBAAgB;AAC5C,QAAM,aAAa,SAAS,MAAM,MAAM;AACxC,QAAM,aAAa,SAAS,MAAM,MAAM;AACxC,QAAM,aAAa,SAAS,MAAM,MAAM;AACxC,QAAM,WAAW,CAAC,MAAM;AACxB,QAAM,MAAM,WAAW,KAAK;AAC5B,QAAM,UAAU,GAAG,IAAI,YAAY,MAAM,MAAM,CAAC,CAAC;AACjD,QAAM,iBAAiB,CAAC,CAAC,OAAO,IAAI,WAAW,KAAK,IAAI,CAAC,EAAE,WAAW;AACtE,QAAM,SAAS,OAAO,IAAI,WAAW,IAAI,SAAS,IAAI,CAAC,EAAE,IAAI,KAAK;AAClE,QAAM,QAAQ,YAAY,aAAa;AACvC,QAAM,cAAc,YAAY,mBAAmB;AACnD,QAAM,aAAa,CAAC;AACpB,QAAM,iBAAiB,CAAC,SAAS,qCAAqC,IAAI,IAAI,MAAM,MAAM;AAC1F,aAAW,KAAK;AAAA,IACd,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ,EAAE,QAAQ,UAAU;AAAA,IAC5B,QAAQ,WAAW,YAAY,YAAY;AAAA,IAC3C,MAAM,UAAU,CAAC,gBAAgB,OAAO,WAAW,YAAY,WAAW,EAAE,IAAI,IAAI,CAAC,YAAY;AAAA,EACnG,CAAC;AACD,QAAM,WAAW,MAAM,EAAE,aAAa,IAAI,IAAI,CAAC,MAAM,MAAM,GAAG,KAAK,QAAQ,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI;AAC5F,MAAI,OAAO,UAAU;AACnB,UAAM,QAAQ,WAAW;AACzB,eAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ,EAAE,WAAW,UAAU;AAAA,MAC/B,QAAQ,QAAQ,cAAc;AAAA,MAC9B,MAAM,QAAQ,CAAC,gBAAgB,OAAO,YAAY,KAAK,GAAG,MAAM,IAAI,IAAI,UAAU,CAAC,eAAe,KAAK,GAAG,eAAe,MAAM,CAAC,IAAI,CAAC,cAAc;AAAA,IACrJ,CAAC;AACD,QAAI,UAAU;AACZ,YAAM,cAAc,EAAE;AAAA,QACpB,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,MAAM,GAAG,KAAK,QAAQ,CAAC,GAAG,SAAS,UAAU,EAAE,EAAE,KAAK,IAAI;AAAA,MAC/E;AACA,iBAAW,KAAK;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ,QAAQ,cAAc;AAAA,QAC9B,MAAM,QAAQ,CAAC,gBAAgB,OAAO,WAAW,KAAK,GAAG,MAAM,gBAAgB,IAAI,UAAU,CAAC,eAAe,KAAK,GAAG,eAAe,QAAQ,CAAC,IAAI,CAAC,eAAe,QAAQ,CAAC;AAAA,MAC5K,CAAC;AACD,iBAAW,KAAK;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ,EAAE;AAAA,QACV,QAAQ,QAAQ,cAAc;AAAA,QAC9B,MAAM,QAAQ,CAAC,gBAAgB,OAAO,WAAW,KAAK,GAAG,MAAM,IAAI,IAAI,UAAU,CAAC,eAAe,KAAK,GAAG,eAAe,QAAQ,CAAC,IAAI,CAAC,cAAc;AAAA,MACtJ,CAAC;AAAA,IACH;AAAA,EACF;AACA,MAAI,UAAU;AACZ,eAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ,UAAU,cAAc;AAAA,MAChC,MAAM,UAAU,CAAC,gBAAgB,OAAO,WAAW,KAAK,SAAS,IAAI,CAAC,eAAe,QAAQ,CAAC;AAAA,IAChG,CAAC;AAAA,EACH;AACA,MAAI,KAAK,kBAAkB;AACzB,UAAM,QAAQ,IAAI,IAAI,WAAW,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AACnD,eAAW,KAAK,GAAG,mBAAmB,OAAO,KAAK,YAAY,OAAO,OAAO,CAAC;AAAA,EAC/E;AACA,QAAM,QAAQ,CAAC,QAAQ,QAAQ,UAAU,UAAU,QAAQ;AAC3D,QAAM,OAAO,CAAC,MAAM,MAAM,QAAQ,CAAC,MAAM,KAAK,MAAM,SAAS,MAAM,QAAQ,CAAC;AAC5E,aAAW,KAAK,CAAC,GAAG,MAAM,KAAK,EAAE,IAAI,IAAI,KAAK,EAAE,IAAI,CAAC;AACrD,QAAM,aAAa,iBAAiB,OAAO,KAAK,MAAM;AACtD,QAAM,UAAU,WAAW,IAAI,CAAC,MAAM;AACpC,UAAM,SAAS,OAAO,EAAE,MAAM,KAAK,QAAQ,aAAa;AACxD,UAAM,UAAU,QAAQ,MAAM,IAAI,SAAS,KAAK,UAAU,MAAM;AAChE,WAAO;AAAA,MACL,KAAK,OAAO,KAAK,OAAO;AAAA,MACxB,GAAG,EAAE,QAAQ,CAAC,cAAc,EAAE,KAAK,GAAG,IAAI,CAAC;AAAA,MAC3C,eAAe,EAAE,MAAM;AAAA,MACvB,QAAQ,EAAE,IAAI,WAAW,EAAE,MAAM;AAAA,MACjC,GAAG,EAAE,KAAK,IAAI,CAAC,SAAS,SAAS,IAAI,EAAE;AAAA,MACvC;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb,CAAC,EAAE,KAAK,IAAI;AACZ,QAAM,OAAO,gBAAgB,UAAU;AAAA,EACvC,OAAO;AAAA;AAAA;AAGP,QAAM,YAAY,CAAC,CAAC,KAAK,YAAY,aAAa,CAAC,CAAC,KAAK,YAAY;AACrE,QAAM,WAAW,CAAC;AAClB,MAAI,CAAC,WAAW;AACd,QAAI,UAAU;AACZ,eAAS,KAAK,gBAAgB,UAAU,MAAM,aAAa,OAAO,KAAK,QAAQ,CAAC,GAAG;AACnF,eAAS,KAAK,gBAAgB,UAAU,MAAM,aAAa,OAAO,KAAK,QAAQ,CAAC,GAAG;AAAA,IACrF;AACA,aAAS,KAAK,gBAAgB,UAAU,MAAM,aAAa,OAAO,KAAK,QAAQ,CAAC,GAAG;AAAA,EACrF;AACA,QAAM,UAAU,CAAC,GAAG,UAAU,IAAI,EAAE,KAAK,MAAM;AAC/C,QAAM,UAAU,CAAC;AACjB,MAAI,WAAW;AACb,UAAM,kBAAc,sCAAa;AAAA,MAC/B,OAAO,KAAK,YAAY;AAAA,MACxB,cAAc,KAAK,YAAY;AAAA,IACjC,CAAC;AACD,UAAM,SAAS;AAAA,MACb,CAAC,UAAU,UAAU;AAAA,MACrB,CAAC,UAAU,UAAU;AAAA,MACrB,CAAC,UAAU,UAAU;AAAA,IACvB,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,QAAQ,SAAS,KAAK,CAAC;AAC/C,QAAI,OAAO,QAAQ;AACjB,YAAM,WAAO;AAAA,QACX,KAAK,WAAW;AAAA,QAChB,IAAI;AAAA,QACJ,QAAQ,IAAI;AAAA,QACZ,KAAK;AAAA,MACP;AACA,YAAM,QAAQ,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM;AAC1C,cAAM,eAAW,oCAAW,MAAM,MAAM,QAAQ,WAAW;AAC3D,eAAO,aAAa,QAAQ,QAAQ,GAAG,QAAQ,OAAO,KAAK;AAAA,MAC7D,CAAC,EAAE,KAAK,IAAI;AACZ,cAAQ,KAAK,YAAY,KAAK,YAAY,IAAI,IAAI;AAAA,IACpD;AAAA,EACF;AACA,UAAQ;AAAA,IACN,YAAY,CAAC,SAAS,QAAQ,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC,gBAAY;AAAA,MAC3D,KAAK,WAAW;AAAA,MAChB,KAAK;AAAA,IACP,CAAC;AAAA,EACH;AACA,MAAI,SAAS;AACX,YAAQ,KAAK,YAAY,OAAO,YAAY,uBAAuB,OAAO,KAAK,IAAI,CAAC,IAAI;AAAA,EAC1F;AACA,MAAI,UAAU,GAAG,EAAE,KAAK,OAAO,EAAG,SAAQ,QAAQ,YAAY,GAAG,CAAC;AAClE,QAAM,OAAO,MAAM,QAAQ,OAAO,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAC3D,QAAM,WAAW,KAAK,SAAS,4BAA4B,KAAK,WAAW,IAAI,gBAAgB,eAAe,KAAK,KAAK,KAAK,IAAI,CAAC;AAAA;AAAA,IAEhI;AACF,SAAO;AAAA,uBACc,MAAM,IAAI;AAAA,EAC/B,QAAQ,GAAG,QAAQ,KAAK,IAAI,CAAC;AAAA;AAAA,EAE7B,OAAO;AACT;AACA,SAAS,mBAAmB,OAAO,KAAK,kBAAkB,OAAO,SAAS;AACxE,QAAM,IAAI,KAAK,GAAG;AAClB,QAAM,MAAM,CAAC;AACb,aAAW,MAAM,MAAM,eAAe,CAAC,GAAG;AACxC,QAAI,GAAG,QAAQ,WAAW,EAAG;AAC7B,UAAM,UAAU,GAAG,QAAQ,CAAC;AAC5B,UAAM,SAAS,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO;AAC3D,QAAI,CAAC,OAAQ;AACb,UAAM,OAAO,SAAS,IAAI,OAAO,CAAC;AAClC,QAAI,MAAM,IAAI,IAAI,EAAG;AACrB,UAAM,IAAI,IAAI;AACd,QAAI,KAAK;AAAA,MACP;AAAA,MACA,MAAM;AAAA,MACN,OAAO,EAAE,aAAa,MAAM,QAAQ,KAAK,QAAQ,CAAC;AAAA,MAClD,QAAQ,EAAE,QAAQ,gBAAgB;AAAA,MAClC,QAAQ;AAAA,MACR,MAAM;AAAA,QACJ,cAAc,MAAM,IAAI,UAAU,KAAK,UAAU,OAAO,CAAC,mBAAmB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,QAKnF,UAAU,qCAAqC,IAAI,IAAI,MAAM,MAAM,SAAS;AAAA,MAC9E;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AACT;AACA,SAAS,aAAa,SAAS,KAAKA,OAAM,MAAM;AAC9C,QAAM,eAAW,yCAAgB,KAAK,WAAW,OAAO,KAAK,eAAe;AAC5E,QAAM,YAAY,iEAAiE,QAAQ;AAAA,KACxF,KAAK,mBAAmB,YAAY,OAAO,gCAAgC,QAAQ;AAAA,IACpF,MAAM,iCAAiC,QAAQ;AAAA;AAEjD,MAAI,CAAC,QAAQ,QAAQ;AACnB,WAAO;AAAA;AAAA,0BAEe,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhC,SAAS;AAAA,EACT;AACA,QAAM,UAAU,QAAQ,IAAI,CAAC,EAAE,UAAU,YAAY,MAAM,OAAO;AAAA,IAChE,SAAK;AAAA,MACH,OAAOA,MAAK,SAAS,IAAI,KAAK,QAAQ,EAAE,QAAQ,OAAO,GAAG;AAAA,MAC1D,KAAK;AAAA,IACP;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,KAAK,MAAM;AAAA,EACb,EAAE;AACF,QAAM,cAAc,QAAQ,IAAI,CAAC,EAAE,KAAK,WAAW,MAAM,YAAY,UAAU,YAAY,GAAG,IAAI,EAAE,KAAK,IAAI;AAC7G,QAAM,YAAY,QAAQ,IAAI,CAAC,EAAE,KAAK,WAAW,MAAM,KAAK,QAAQ,GAAG,IAAI,MAAM,KAAK,UAAU,GAAG,CAAC,KAAK,UAAU,GAAG,EAAE,KAAK,IAAI;AACjI,SAAO;AAAA,0BACiB,QAAQ;AAAA,EAChC,WAAW;AAAA;AAAA;AAAA,EAGX,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,SAAS;AACX;AACA,SAAS,eAAe,OAAO;AAC7B,QAAM,OAAO,MAAM,YAAY,WAAW,CAAC;AAC3C,QAAM,QAAQ,KAAK,SAAS,IAAI,gCAAgC,KAAK,KAAK,IAAI,CAAC,MAAM,kCAAkC,KAAK,CAAC,CAAC;AAC9H,SAAO,MAAM,MAAM,IAAI,IAAI,KAAK;AAAA;AAElC;AACA,SAAS,iBAAiB,OAAO,QAAQ;AACvC,QAAM,OAAO,GAAG,MAAM,MAAM,GAAG,QAAQ,gBAAgB,QAAQ;AAC/D,QAAM,IAAI,QAAQ;AAClB,SAAO,OAAO,MAAM,MAAM,UAAU,UAAU,CAAC;AACjD;AACA,SAAS,uBAAuB,OAAO,KAAK,MAAM;AAChD,QAAM,MAAM,cAAc,IAAI,KAAK,IAAI,QAAQ;AAC/C,QAAM,MAAM,CAAC,MAAM,MAAM,IAAI,WAAW,GAAG,IAAI,MAAM,KAAK,GAAG;AAC7D,aAAO,yCAAgB,GAAG,GAAG,IAAI,YAAY,MAAM,MAAM,CAAC,cAAc,KAAK,eAAe;AAC9F;AACA,SAAS,cAAc,MAAM,IAAI;AAC/B,QAAM,OAAO,CAAC,MAAM,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,QAAQ,EAAE;AAC5D,QAAM,IAAI,KAAK,IAAI,EAAE,MAAM,GAAG;AAC9B,QAAM,IAAI,KAAK,EAAE,EAAE,MAAM,GAAG;AAC5B,MAAI,IAAI;AACR,SAAO,IAAI,EAAE,UAAU,IAAI,EAAE,UAAU,EAAE,CAAC,MAAM,EAAE,CAAC,EAAG;AACtD,SAAO,CAAC,GAAG,MAAM,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,GAAG,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG;AACtF;AACA,SAAS,YAAY,GAAG;AACtB,MAAI,KAAK,EAAE,YAAY,MAAO,QAAO;AACrC,QAAM,OAAO,GAAG,MAAM,KAAK;AAC3B,QAAM,QAAQ,OAAO,KAAK,MAAM,OAAO,EAAE,IAAI,CAAC,MAAM,MAAM,CAAC,EAAE,IAAI;AAAA,IAC/D;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI,IAAI;AAC5B;AAxfA,IACAC,yBAOI,YACA,GACA,aAKA,WAKA,MAyHA,KACA,aACA,SACA,aAQA,eA6CA;AArMJ;AAAA;AAAA;AACA,IAAAA,0BAMO;AACP,IAAI,aAAa;AACjB,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC;AAC/B,IAAI,cAAc;AAAA,MAChB,KAAK;AAAA,MACL,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AACA,IAAI,YAAY;AAAA,MACd,KAAK;AAAA,MACL,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AACA,IAAI,OAAO;AAAA,MACT,KAAK;AAAA,QACH,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO,CAAC,MAAM,YAAY,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,YAAY,EAAE,KAAK,IAAI,CAAC;AAAA,QAClF,cAAc,CAAC,WAAW,cAAc,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,cAAc,EAAE,KAAK,IAAI,CAAC;AAAA,QACxF,MAAM,CAAC,SAAS,WAAW,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,QACjD,UAAU,CAAC,MAAM,GAAG,CAAC;AAAA,QACrB,UAAU,CAAC,MAAM,GAAG,CAAC;AAAA,QACrB,QAAQ,CAAC,SAAS;AAAA,EACpB,IAAI;AAAA;AAAA,QAEF,cAAc,CAAC,SAAS,cAAc,IAAI;AAAA,QAC1C,eAAe,CAAC,MAAM,GAAG,CAAC;AAAA,QAC1B,SAAS,CAAC,MAAM,WAAW,CAAC;AAAA,QAC5B,YAAY,CAAC,MAAM,GAAG,CAAC;AAAA,QACvB,eAAe;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO,CAAC,MAAM,YAAY,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,YAAY,EAAE,KAAK,IAAI,CAAC;AAAA,QAClF,cAAc,CAAC,WAAW,cAAc,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,cAAc,EAAE,KAAK,IAAI,CAAC;AAAA,QACxF,MAAM,CAAC,SAAS,eAAe,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,QACrD,UAAU,CAAC,MAAM,cAAc,CAAC;AAAA,QAChC,UAAU,CAAC,MAAM,cAAc,CAAC;AAAA,QAChC,QAAQ,CAAC,SAAS;AAAA,EACpB,IAAI;AAAA;AAAA,QAEF,cAAc,CAAC,SAAS,cAAc,IAAI;AAAA,QAC1C,SAAS,CAAC,MAAM,WAAW,CAAC;AAAA,QAC5B,YAAY,CAAC,MAAM,cAAc,CAAC;AAAA,QAClC,eAAe;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,MAAM;AAAA,QACN,SAAS;AAAA;AAAA;AAAA,QAGT,MAAM,CAAC,SAAS,KAAK,IAAI,CAAC,MAAM,IAAI,EAAE,QAAQ,MAAM,KAAK,CAAC,GAAG,EAAE,KAAK,KAAK;AAAA,QACzE,UAAU,CAAC,MAAM,IAAI,CAAC;AAAA,QACtB,UAAU,CAAC,MAAM,GAAG,CAAC;AAAA,QACrB,QAAQ,CAAC,SAAS;AAAA,EACpB,IAAI;AAAA;AAAA,QAEF,cAAc,CAAC,SAAS,UAAU,IAAI;AAAA,QACtC,eAAe;AAAA,QACf,SAAS,CAAC,MAAM,GAAG,CAAC;AAAA,QACpB,YAAY,CAAC,MAAM,GAAG,CAAC;AAAA,QACvB,eAAe;AAAA,MACjB;AAAA,IACF;AA6DA,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC;AACtD,IAAI,cAAc,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM,EAAE,SAAS,GAAG,IAAI,EAAE,MAAM,GAAG,EAAE,IAAI;AACvG,IAAI,UAAU,CAAC,MAAM,6BAA6B,KAAK,CAAC;AACxD,IAAI,cAAc;AAQlB,IAAI,gBAAgB,MAAM;AAAA,MACxB,YAAY,UAAU;AACpB,aAAK,WAAW;AAAA,MAClB;AAAA,MACA,MAAM,SAAS,MAAM;AACnB,cAAMC,MAAK,MAAM,OAAO,aAAa;AACrC,cAAMF,QAAO,MAAM,OAAO,MAAM;AAChC,cAAM,MAAMA,MAAK,QAAQ,QAAQ,IAAI,GAAG,KAAK,SAAS;AACtD,cAAM,MAAM;AAAA,UACV;AAAA,UACA,UAAUA,MAAK,QAAQ,QAAQ,IAAI,GAAG,KAAK,eAAe,cAAc;AAAA,QAC1E;AACA,cAAME,IAAG,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACvC,cAAM,QAAQ,CAAC;AACf,cAAM,QAAQ,OAAO,UAAU,YAAY;AACzC,gBAAM,YAAY,UAAM;AAAA,YACtB,YAAY,KAAK,YAAY,IAAI;AAAA,YACjC;AAAA,YACA,KAAK;AAAA,UACP;AACA,gBAAMA,IAAG,UAAU,UAAU,WAAW,MAAM;AAC9C,gBAAM,KAAK,QAAQ;AAAA,QACrB;AACA,cAAM,WAAWF,MAAK,KAAK,KAAK,GAAG,WAAW,KAAK;AACnD,cAAM,MAAM,UAAU,WAAW,IAAI,CAAC;AACtC,cAAM,UAAU,CAAC;AACjB,cAAM,QAAQ,KAAK,SAAS,OAAO;AACnC,YAAI,QAAQ;AACZ,mBAAW,SAAS,KAAK,SAAS,QAAQ;AACxC,gBAAM,OAAO,GAAG,MAAM,MAAM,GAAG,KAAK,QAAQ,gBAAgB,EAAE;AAC9D,gBAAM,WAAWA,MAAK,KAAK,KAAK,GAAG,OAAO,MAAM,KAAK,QAAQ,aAAa,CAAC,KAAK;AAChF,cAAI,aAAa,UAAU;AACzB,kBAAM,IAAI;AAAA,cACR,+CAA+C,MAAM,IAAI,yBAAyB,QAAQ;AAAA,YAC5F;AAAA,UACF;AACA,gBAAM,MAAM,UAAU,aAAa,OAAO,MAAM,GAAG,CAAC;AACpD,kBAAQ,KAAK,EAAE,OAAO,UAAU,YAAY,iBAAiB,OAAO,KAAK,MAAM,EAAE,CAAC;AAClF;AACA,eAAK,aAAa,EAAE,OAAO,OAAO,OAAO,MAAM,MAAM,SAAS,CAAC;AAAA,QACjE;AACA,cAAM,MAAMA,MAAK,KAAK,KAAK,UAAU,GAAG,aAAa,SAAS,KAAKA,OAAM,IAAI,CAAC;AAC9E,eAAO,EAAE,MAAM;AAAA,MACjB;AAAA,IACF;AACA,IAAI,gBAAgB;AAAA;AAAA;;;ACrMpB,IAAAG,gBAAA;AAAA,SAAAA,eAAA;AAAA;AAAA;AAAA;AAAA,iBAAAC;AAAA,EAAA;AAAA;AAAA;AAyBA,SAAS,WAAW,GAAG,MAAM,QAAQ,QAAQ,MAAM,SAAS;AAC1D,QAAM,IAAI,EAAE;AACZ,MAAI,GAAG;AACL,YAAQ,EAAE,MAAM;AAAA,MACd,KAAK;AACH,eAAO,CAAC;AAAA,MACV,KAAK;AACH,eAAO,CAAC;AAAA,MACV,KAAK;AACH,eAAO,OAAO,MAAM;AAAA,MACtB,KAAK;AACH,eAAO,WAAW,gBAAgB,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,GAAG,UAAU,EAAE,QAAQ,UAAU,EAAE,OAAO,IAAI;AAAA,UACvH,MAAM;AAAA,UACN,aAAa,MAAM,KAAK,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,EAAE,MAAM,SAAS,EAAE;AAAA,UACxE,UAAU,EAAE;AAAA,UACZ,UAAU,EAAE;AAAA,QACd;AAAA,MACF,KAAK;AACH,eAAO;AAAA,UACL,MAAM;AAAA,UACN,YAAY,OAAO,YAAY,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,SAAS,CAAC,CAAC,CAAC;AAAA,UAC3E,UAAU,CAAC,GAAG,EAAE,MAAM;AAAA,QACxB;AAAA,MACF,KAAK;AACH,eAAO;AAAA,UACL,MAAM;AAAA,UACN,OAAO,EAAE,MAAM,SAAS;AAAA,UACxB,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,UAAU,EAAE,OAAO,IAAI,CAAC;AAAA,QAC9D;AAAA,MACF,KAAK;AACH,eAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,UACT,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,WAAW,EAAE,OAAO,IAAI,EAAE,WAAW,EAAE,OAAO,IAAI,CAAC;AAAA,QACpG;AAAA,MACF,KAAK;AACH,eAAO,EAAE,MAAM,UAAU,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,IAAI,CAAC,EAAE;AAAA,IACxE;AAAA,EACF;AACA,QAAM,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI;AAChD,MAAI,IAAK,QAAO,EAAE,MAAM,IAAI,OAAO,IAAI,CAAC,MAAM,IAAI,SAAS,WAAW,IAAI,OAAO,CAAC,CAAC,EAAE;AACrF,MAAI,EAAE,cAAc,EAAE,WAAW,OAAQ,QAAO,EAAE,MAAM,CAAC,GAAG,EAAE,UAAU,EAAE;AAC1E,QAAM,OAAO,EAAE,kBAAkB,CAAC,IAAI,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI;AAC9E,QAAM,KAAK,KAAK,KAAK,CAAC,MAAM,EAAE,aAAa,GAAG;AAC9C,MAAI,IAAI;AACN,UAAM,OAAO,GAAG,SAAS,WAAW,GAAG,QAAQ,OAAO,GAAG,KAAK;AAC9D,WAAO,WAAW,gBAAgB,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,KAAK;AAAA,EACrE;AACA,UAAQ,EAAE,QAAQ;AAAA,IAChB,KAAK,UAAU;AACb,YAAM,MAAM,EAAE,MAAM,SAAS;AAC7B,UAAI,EAAE,WAAW,OAAQ,KAAI,SAAS;AAAA,eAC7B,EAAE,UAAU,uCAAe,EAAE,MAAM,EAAG,KAAI,UAAU,uCAAe,EAAE,MAAM;AACpF,UAAI,EAAE,cAAc,OAAQ,KAAI,YAAY,EAAE;AAC9C,mBAAa,KAAK,CAAC;AACnB,mBAAa,KAAK,GAAG,OAAO;AAC5B,aAAO;AAAA,IACT;AAAA,IACA,KAAK,UAAU;AACb,YAAM,MAAM,EAAE,UAAM,yCAAgB,CAAC,IAAI,YAAY,SAAS;AAC9D,UAAI,CAAC,EAAE,gBAAiB,oBAAmB,KAAK,GAAG,QAAQ,MAAM;AACjE,aAAO;AAAA,IACT;AAAA,IACA,KAAK;AACH,aAAO,EAAE,MAAM,UAAU,SAAS,WAAW;AAAA,IAC/C,KAAK;AACH,aAAO,EAAE,MAAM,UAAU;AAAA,IAC3B,KAAK;AACH,aAAO,EAAE,MAAM,UAAU,QAAQ,YAAY;AAAA,IAC/C,KAAK;AACH,aAAO,OAAO,MAAM;AAAA,IACtB;AACE,aAAO,CAAC;AAAA,EACZ;AACF;AACA,SAAS,aAAa,KAAK,GAAG;AAC5B,MAAI,CAAC,EAAE,SAAU;AACjB,MAAI,YAAY,KAAK,IAAI,OAAO,IAAI,aAAa,QAAQ,GAAG,EAAE,QAAQ;AACtE,MAAI,cAAc,WAAW,EAAE,QAAQ;AACzC;AACA,SAAS,aAAa,KAAK,GAAG,SAAS;AACrC,aAAW,KAAK,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,GAAG;AAC1D,UAAM,IAAI,OAAO,EAAE,KAAK;AACxB,QAAI,EAAE,aAAa,KAAM,KAAI,YAAY,KAAK,IAAI,OAAO,IAAI,aAAa,CAAC,GAAG,CAAC;AAAA,aACtE,EAAE,aAAa,IAAK,KAAI,YAAY,KAAK,IAAI,OAAO,IAAI,aAAa,CAAC,GAAG,IAAI,CAAC;AAAA,aAC9E,EAAE,aAAa,KAAM,KAAI,YAAY,KAAK,IAAI,OAAO,IAAI,aAAa,QAAQ,GAAG,CAAC;AAAA,aAClF,EAAE,aAAa,IAAK,KAAI,YAAY,KAAK,IAAI,OAAO,IAAI,aAAa,QAAQ,GAAG,IAAI,CAAC;AAAA,aACrF,EAAE,aAAa,KAAK;AAC3B,UAAI,YAAY;AAChB,UAAI,YAAY;AAAA,IAClB;AAAA,EACF;AACF;AACA,SAAS,mBAAmB,KAAK,GAAG,QAAQ,QAAQ;AAClD,MAAI,MAAM,EAAE,QAAQ,SAAS,EAAE,OAAO,OAAO,EAAE,GAAG,GAAG,WAAW,MAAM,IAAI;AAC1E,MAAI,MAAM,EAAE,QAAQ,SAAS,EAAE,OAAO,OAAO,EAAE,GAAG,GAAG,WAAW,MAAM,IAAI;AAC1E,aAAW,KAAK,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,QAAQ,GAAG;AAChF,QAAI,EAAE,aAAa,KAAM,OAAM,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,WAAW,MAAM;AAAA,aACjE,EAAE,aAAa,IAAK,OAAM,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,WAAW,KAAK;AAAA,aACpE,EAAE,aAAa,KAAM,OAAM,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,WAAW,MAAM;AAAA,aACtE,EAAE,aAAa,IAAK,OAAM,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,WAAW,KAAK;AAAA,EAC/E;AACA,QAAM,MAAM,WAAW;AACvB,MAAI,KAAK;AACP,QAAI,IAAI,aAAa,CAAC,IAAK,KAAI,mBAAmB,IAAI;AAAA,SACjD;AACH,UAAI,UAAU,IAAI;AAClB,UAAI,IAAI,UAAW,KAAI,mBAAmB;AAAA,IAC5C;AAAA,EACF;AACA,MAAI,KAAK;AACP,QAAI,IAAI,aAAa,CAAC,IAAK,KAAI,mBAAmB,IAAI;AAAA,SACjD;AACH,UAAI,UAAU,IAAI;AAClB,UAAI,IAAI,UAAW,KAAI,mBAAmB;AAAA,IAC5C;AAAA,EACF;AACF;AACA,SAAS,kBAAkB,GAAG,eAAe;AAC3C,MAAI,CAAC,EAAE,gBAAiB,QAAO,CAAC;AAChC,QAAM,MAAM,CAAC;AACb,aAAW,KAAK,cAAc,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,GAAG;AAChE,UAAM,IAAI,OAAO,EAAE,KAAK;AACxB,QAAI,EAAE,aAAa,KAAM,KAAI,WAAW;AAAA,aAC/B,EAAE,aAAa,IAAK,KAAI,WAAW,IAAI;AAAA,aACvC,EAAE,aAAa,KAAM,KAAI,WAAW;AAAA,aACpC,EAAE,aAAa,IAAK,KAAI,WAAW,IAAI;AAAA,aACvC,EAAE,aAAa,KAAK;AAC3B,UAAI,WAAW;AACf,UAAI,WAAW;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AACA,SAAS,aAAa,GAAG,QAAQ;AAC/B,MAAI,WAAW,cAAe,QAAO,EAAE,GAAG,GAAG,UAAU,KAAK;AAC5D,MAAI,EAAE,SAAS,QAAQ;AACrB,QAAI,MAAM,QAAQ,EAAE,IAAI,EAAG,QAAO,EAAE,GAAG,GAAG,MAAM,CAAC,GAAG,EAAE,MAAM,IAAI,EAAE;AAClE,QAAI,WAAW,GAAG;AAChB,YAAM,EAAE,OAAO,GAAG,GAAG,KAAK,IAAI;AAC9B,aAAO,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,IAAI,EAAE;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AACA,SAAO,EAAE,GAAG,GAAG,MAAM,CAAC,EAAE,MAAM,MAAM,EAAE;AACxC;AACA,SAAS,aAAa,GAAG,MAAM,QAAQ,QAAQ,MAAM,SAAS,eAAe,cAAc;AACzF,MAAI,IAAI,WAAW,GAAG,MAAM,QAAQ,QAAQ,MAAM,OAAO;AACzD,QAAM,OAAO,EAAE,mBAAmB;AAClC,WAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,QAAI,EAAE,MAAM,SAAS,OAAO,GAAG,GAAG,MAAM,OAAO,IAAI,kBAAkB,GAAG,aAAa,IAAI,CAAC,EAAE;AAAA,EAC9F;AACA,MAAI,EAAE,SAAU,KAAI,aAAa,GAAG,MAAM;AAC1C,MAAI,SAAS,YAAY,gBAAgB,EAAE,iBAAiB,QAAQ;AAClE,QAAI,EAAE,GAAG,GAAG,SAAS,EAAE,aAAa;AAAA,EACtC;AACA,SAAO;AACT;AACA,SAAS,eAAe,MAAM,MAAM;AAClC,QAAM,UAAU,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAC/C,QAAM,aAAa,KAAK,OAAO,CAAC,MAAM,QAAQ,IAAI,EAAE,IAAI,KAAK,QAAQ,IAAI,EAAE,KAAK,CAAC;AACjF,MAAI,CAAC,WAAW,OAAQ,QAAO;AAC/B,QAAM,OAAO,WAAW,IAAI,CAAC,MAAM,GAAG,EAAE,OAAO,GAAG,EAAE,IAAI,OAAO,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE,QAAQ,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI;AAChH,SAAO,mDAAmD,IAAI;AAChE;AACA,SAAS,YAAY,OAAO,MAAM,MAAM,QAAQ,eAAe,QAAQ;AACrE,QAAM,aAAa,CAAC;AACpB,QAAM,WAAW,CAAC;AAClB,aAAW,KAAK,MAAM;AACpB,eAAW,EAAE,IAAI,IAAI;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP;AAAA,IACF;AACA,UAAM,mBAAmB,EAAE,cAAc,iBAAiB,EAAE,iBAAiB,UAAU,EAAE;AACzF,UAAM,WAAW,SAAS,YAAY,SAAS,YAAY;AAC3D,QAAI,CAAC,SAAU,UAAS,KAAK,EAAE,IAAI;AAAA,EACrC;AACA,QAAM,OAAO,eAAe,OAAO,MAAM,IAAI;AAC7C,SAAO;AAAA,IACL,GAAG,WAAW,kBAAkB,EAAE,SAAS,MAAM,IAAI,CAAC;AAAA,IACtD,KAAK,GAAG,MAAM,MAAM,IAAI,IAAI;AAAA,IAC5B,OAAO,GAAG,IAAI,IAAI,MAAM,MAAM;AAAA,IAC9B,GAAG,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;AAAA,IACnC,MAAM;AAAA,IACN;AAAA,IACA,GAAG,SAAS,SAAS,EAAE,SAAS,IAAI,CAAC;AAAA,IACrC,sBAAsB;AAAA,EACxB;AACF;AACA,SAAS,QAAQ,OAAO;AACtB,QAAM,UAAU,MAAM,UAAU,CAAC,GAAG,IAAI,CAAC,UAAM,oCAAW,EAAE,YAAY,EAAE,IAAI,CAAC;AAC/E,SAAO;AAAA,IACL,QAAQ,OAAO,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;AAAA,IAClD,MAAM,OAAO,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;AAAA,IACpD,MAAM,OAAO,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;AAAA,IACpD,SAAS,OAAO,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;AAAA,IAC1D,eAAe,OAAO,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC;AAAA,EACxE;AACF;AACA,SAAS,aAAa,OAAO,OAAO,CAAC,GAAG;AACtC,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,SAAS,QAAQ,KAAK;AAC5B,QAAM,SAAS,CAAC,MAAM,SAAS,YAAY,OAAO,MAAM,MAAM,QAAQ,CAAC,CAAC,KAAK,eAAe,MAAM;AAClG,SAAO;AAAA,IACL,QAAQ,WAAO,uCAAc,KAAK,GAAG,QAAQ;AAAA,IAC7C,QAAQ,WAAO,uCAAc,KAAK,GAAG,QAAQ;AAAA,IAC7C,QAAQ,WAAO,uCAAc,KAAK,GAAG,QAAQ;AAAA,EAC/C;AACF;AACA,SAAS,mBAAmB,QAAQ,OAAO,CAAC,GAAG;AAC7C,QAAM,UAAU,CAAC;AACjB,aAAW,SAAS,QAAQ;AAC1B,UAAM,QAAQ,aAAa,OAAO,IAAI;AACtC,eAAW,QAAQ,CAAC,UAAU,UAAU,QAAQ,GAAG;AACjD,YAAM,OAAO,GAAG,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,YAAY,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC;AACpE,YAAM,EAAE,SAAS,UAAU,KAAK,KAAK,GAAG,KAAK,IAAI,MAAM,IAAI;AAC3D,cAAQ,IAAI,IAAI;AAAA,IAClB;AAAA,EACF;AACA,SAAO,EAAE,QAAQ;AACnB;AAOA,SAASC,YAAW,OAAO;AACzB,QAAM,QAAQ,MAAM,YAAY,WAAW,CAAC;AAC5C,MAAI,CAAC,MAAM,OAAQ,QAAO;AAC1B,QAAM,OAAO,MAAM,IAAI,CAAC,MAAM,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AACrE,MAAI,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,EAAG,QAAO;AACjC,SAAO;AACT;AAOA,SAAS,cAAc,OAAO;AAC5B,MAAI,MAAM,aAAa,OAAQ,QAAO,MAAM;AAC5C,SAAO,MAAM,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO;AAAA,IAC3D,SAAS,CAAC,EAAE,IAAI;AAAA,IAChB,cAAc,EAAE,WAAW;AAAA,IAC3B,GAAG,EAAE,WAAW,SAAS,EAAE,eAAe,EAAE,WAAW,OAAO,IAAI,CAAC;AAAA,IACnE,gBAAgB,CAAC,EAAE,WAAW,MAAM;AAAA,EACtC,EAAE;AACJ;AAEA,SAAS,MAAM,QAAQ,MAAM;AAC3B,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,eAAe,WAAW,gBAAgB,gBAAgB;AAChE,QAAM,UAAU,OAAO,KAAK,oBAAoB,GAAG;AACnD,QAAM,QAAQ,CAAC;AACf,QAAM,UAAU,CAAC;AACjB,QAAM,OAAO,CAAC;AACd,QAAM,eAA+B,oBAAI,IAAI;AAC7C,QAAM,QAAwB,oBAAI,IAAI;AACtC,QAAM,QAAQ,CAACC,OAAM,IAAI,UAAU;AACjC,UAAM,QAAQ,MAAM,IAAIA,KAAI;AAC5B,QAAI,UAAU,UAAU,MAAM,OAAO,IAAI;AACvC,YAAM,IAAI;AAAA,QACR,kDAAkDA,KAAI,iCAAiC,MAAM,KAAK,kBAAkB,MAAM,EAAE,mBAAmB,KAAK,kBAAkB,EAAE;AAAA,MAC1K;AAAA,IACF;AACA,UAAM,IAAIA,OAAM,EAAE,IAAI,MAAM,CAAC;AAAA,EAC/B;AACA,QAAM,YAAY,CAAC,IAAI,OAAO,SAAS;AACrC,UAAM,QAAQ,aAAa,IAAI,EAAE;AACjC,QAAI,UAAU,QAAQ;AACpB,YAAM,IAAI;AAAA,QACR,iDAAiD,EAAE,gCAAgC,KAAK,cAAU,oCAAmB,KAAK,CAAC;AAAA,MAC7H;AAAA,IACF;AACA,iBAAa,IAAI,QAAI,oCAAmB,KAAK,CAAC;AAC9C,WAAO,EAAE,aAAa,IAAI,MAAM,KAAC,oCAAmB,KAAK,CAAC,GAAG,GAAG,KAAK;AAAA,EACvE;AACA,QAAM,QAAQ,OAAO,IAAI,CAAC,WAAW;AAAA,IACnC;AAAA,IACA,KAAKD,YAAW,KAAK;AAAA,IACrB,SAAS,gBAAgB,KAAK;AAAA,IAC9B,SAAS,aAAa,OAAO,EAAE,QAAQ,cAAc,eAAe,KAAK,cAAc,CAAC;AAAA,EAC1F,EAAE;AACF,aAAW,EAAE,OAAO,KAAK,SAAS,SAAS,OAAO,KAAK,OAAO;AAC5D,eAAW,QAAQ,SAAS,OAAO,GAAG,GAAG;AACvC,YAAM,EAAE,SAAS,UAAU,KAAK,KAAK,GAAG,KAAK,IAAI,OAAO,IAAI;AAC5D,cAAQ,cAAc,OAAO,IAAI,CAAC,IAAI;AAAA,IACxC;AACA,UAAM,QAAQ,CAAC;AACf,QAAI,CAAC,IAAK,OAAM,KAAK,2DAA2D;AAChF,QAAI,MAAM,UAAU;AAClB,YAAM,KAAK,sDAAsD;AAAA,IACnE;AACA,SAAK,KAAK;AAAA,MACR,UAAM,oCAAmB,KAAK;AAAA,MAC9B,aAAa,CAAC,cAAU,oCAAmB,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,KAAK,GAAG;AAAA,IAC3E,CAAC;AACD,UAAM,IAAI,OAAO,MAAM,MAAM;AAC7B,UAAM,SAAS,IAAI,cAAc,OAAO,QAAQ,CAAC;AACjD,UAAM,mBAAmB;AAAA,MACvB,aAAa;AAAA,MACb,GAAG,SAAS,IAAI,YAAY,CAAC;AAAA,IAC/B;AACA,UAAM,aAAa;AAAA,MACjB,GAAG,MAAM,aAAa,CAAC,gBAAgB,MAAM,WAAW,QAAQ,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;AAAA,MAClF,GAAG,MAAM,OAAO,IAAI,CAAC,MAAM,GAAG,EAAE,OAAO,GAAG,EAAE,IAAI,MAAM,EAAE,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC,GAAG;AAAA,IACrF;AACA,UAAM,WAAW,CAAC,iBAAiB;AAAA,MACjC,aAAa,4CAA4C,YAAY,KAAK,IAAI,CAAC;AAAA,MAC/E,GAAG,SAAS,IAAI,YAAY,CAAC;AAAA,IAC/B;AACA,UAAM,aAAa,IAAI,OAAO;AAC9B,UAAM,YAAY,MAAM,YAAQ,oCAAmB,KAAK,CAAC;AACzD,UAAM,OAAO;AAAA,MACX,KAAK,UAAU,OAAO,CAAC,IAAI,OAAO;AAAA,QAChC,SAAS,cAAc,MAAM,IAAI;AAAA;AAAA;AAAA;AAAA,QAIjC,WAAW;AAAA,UACT,OAAO;AAAA,YACL,aAAa,SAAS,MAAM,IAAI;AAAA,YAChC,GAAG,SAAS,EAAE,MAAM,SAAS,OAAO,OAAO,CAAC;AAAA,UAC9C;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,CAAC,MAAM,UAAU;AACnB,WAAK,OAAO,UAAU,SAAS,CAAC,IAAI,OAAO;AAAA,QACzC,SAAS,YAAY,MAAM,IAAI;AAAA,QAC/B,aAAa,EAAE,UAAU,MAAM,GAAG,SAAS,IAAI,cAAc,OAAO,QAAQ,CAAC,CAAC,EAAE;AAAA,QAChF,WAAW;AAAA,UACT,OAAO,EAAE,aAAa,OAAO,MAAM,IAAI,0BAA0B,GAAG,SAAS,MAAM,EAAE;AAAA,UACrF,CAAC,OAAO,GAAG;AAAA,UACX,GAAG,WAAW,SAAS,EAAE,OAAO,SAAS,UAAU,EAAE,IAAI,CAAC;AAAA,QAC5D;AAAA,MACF,CAAC;AAAA,IACH;AACA,UAAM,UAAU,IAAI;AACpB,QAAI,CAAC,IAAK;AACV,UAAM,WAAW,GAAG,UAAU,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,GAAG,EAAE,KAAK,GAAG,CAAC;AACzE,UAAM,UAAU,MAAM,YAAQ,oCAAmB,KAAK,CAAC;AACvD,UAAM,aAAa,IAAI,IAAI,CAAC,OAAO;AAAA,MACjC,MAAM,EAAE;AAAA,MACR,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,aAAa,GAAG,EAAE,IAAI,6BAA6B,MAAM,IAAI;AAAA;AAAA;AAAA,MAG7D,QAAQ,OAAO,OAAO,WAAW,EAAE,IAAI,KAAK,CAAC;AAAA,IAC/C,EAAE;AACF,UAAM,UAAU;AAAA,MACd,aAAa,MAAM,MAAM,IAAI,iBAAiB,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,OAAO,CAAC;AAAA,MAClF,GAAG,SAAS,IAAI,YAAY,CAAC;AAAA,IAC/B;AACA,UAAM,OAAO;AAAA,MACX;AAAA,MACA,KAAK,UAAU,MAAM,CAAC,IAAI,OAAO;AAAA,QAC/B,SAAS,YAAY,MAAM,IAAI;AAAA,QAC/B,WAAW;AAAA,UACT,OAAO,EAAE,aAAa,iBAAiB,MAAM,IAAI,SAAS,GAAG,SAAS,MAAM,EAAE;AAAA,UAC9E,CAAC,OAAO,GAAG;AAAA,UACX,OAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,CAAC,MAAM,UAAU;AACnB,WAAK,QAAQ,UAAU,SAAS,CAAC,IAAI,OAAO;AAAA,QAC1C,SAAS,aAAa,MAAM,IAAI;AAAA,QAChC,aAAa,EAAE,UAAU,MAAM,GAAG,SAAS,IAAI,cAAc,OAAO,QAAQ,CAAC,CAAC,EAAE;AAAA,QAChF,WAAW;AAAA,UACT,OAAO,EAAE,aAAa,OAAO,MAAM,IAAI,yBAAyB,GAAG,SAAS,MAAM,EAAE;AAAA,UACpF,CAAC,OAAO,GAAG;AAAA,UACX,OAAO;AAAA;AAAA;AAAA,UAGP,GAAG,MAAM,OAAO,SAAS;AAAA,YACvB,OAAO;AAAA,cACL,MAAM,OAAO,IAAI,CAAC,MAAM,GAAG,EAAE,OAAO,GAAG,EAAE,IAAI,MAAM,EAAE,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC,GAAG;AAAA,YAClF;AAAA,UACF,IAAI,CAAC;AAAA,QACP;AAAA,MACF,CAAC;AACD,WAAK,SAAS,UAAU,SAAS,CAAC,IAAI,OAAO;AAAA,QAC3C,SAAS,cAAc,MAAM,IAAI;AAAA,QACjC,WAAW;AAAA;AAAA;AAAA;AAAA,UAIT,OAAO,EAAE,aAAa,OAAO,MAAM,IAAI,4CAA4C;AAAA,UACnF,CAAC,OAAO,GAAG;AAAA,UACX,OAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AACA,UAAM,QAAQ,IAAI;AAClB,QAAI,CAAC,KAAK,iBAAkB;AAC5B,eAAW,SAAS,OAAO;AACzB,UAAI,MAAM,UAAU,MAAO;AAC3B,YAAM,WAAW,cAAc,MAAM,KAAK,EAAE;AAAA,QAC1C,CAAC;AAAA;AAAA;AAAA,cAGC,uCAAsB,EAAE,UAAM,oCAAmB,KAAK,KAAK,GAAG,eAAe,WAAW,IAAI,UAAU,GAAG,eAAe,MAAM,CAAC,GAAG,MAAM,MAAM,IAAI,CAAC,EAAE,IAAI;AAAA;AAAA,MAE7J;AACA,UAAI,SAAS,WAAW,EAAG;AAC3B,YAAM,UAAU,GAAG,QAAQ,IAAI,MAAM,OAAO;AAC5C;AAAA,QACE;AAAA,QACA,GAAG,MAAM,MAAM,OAAO,MAAM,MAAM,MAAM;AAAA,QACxC,OAAG,oCAAmB,KAAK,CAAC,WAAO,oCAAmB,MAAM,KAAK,CAAC;AAAA,MACpE;AACA,YAAM,OAAO,IAAI;AAAA,QACf;AAAA,QACA,KAAK,UAAU,OAAO,CAAC,GAAG,OAAO,MAAM,MAAM,MAAM,CAAC,IAAI,MAAM,OAAO;AAAA,UACnE,SAAS,YAAY,MAAM,MAAM,IAAI,0BAA0B,MAAM,IAAI;AAAA,UACzE,WAAW;AAAA,YACT,OAAO;AAAA,cACL,aAAa,OAAO,MAAM,MAAM,IAAI,eAAe,SAAS,CAAC,EAAE,QAAQ,KAAK,IAAI,CAAC,eAAe,MAAM,IAAI;AAAA,cAC1G,GAAG,SAAS,EAAE,MAAM,SAAS,OAAO,IAAI,cAAc,MAAM,OAAO,QAAQ,CAAC,EAAE,CAAC;AAAA,YACjF;AAAA,YACA,CAAC,OAAO,GAAG;AAAA,YACX,OAAO;AAAA,UACT;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,OAAO,SAAS,KAAK;AAChC;AAYA,SAAS,gBAAgB,QAAQ,OAAO,CAAC,GAAG;AAC1C,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,EAAE,OAAO,SAAS,KAAK,IAAI,MAAM,QAAQ,IAAI;AACnD,MAAI,gBAAgB,SAAS;AAC3B,UAAM,IAAI;AAAA,MACR,4EAA4E,YAAY;AAAA,IAC1F;AAAA,EACF;AACA,SAAO;AAAA,IACL,SAAS,WAAW,gBAAgB,UAAU;AAAA,IAC9C,MAAM;AAAA,MACJ,OAAO,KAAK,MAAM,SAAS;AAAA,MAC3B,SAAS,KAAK,MAAM,WAAW;AAAA,MAC/B,aAAa,KAAK,MAAM,eAAe;AAAA,IACzC;AAAA,IACA,GAAG,KAAK,SAAS,SAAS,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,IACvD;AAAA,IACA,YAAY,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC,YAAY,GAAG,YAAY,EAAE,EAAE;AAAA,IACrE;AAAA,EACF;AACF;AAIA,SAAS,kBAAkB,OAAO,OAAO,QAAQ,eAAe;AAC9D,QAAM,IAAI,MAAM;AAChB,QAAM,UAAU,aAAa,OAAO,EAAE,QAAQ,cAAc,CAAC;AAC7D,QAAM,OAAO,CAAC,SAAS,oBAAgB,oCAAW,MAAM,GAAG,KAAK,CAAC,MAAM,KAAK,UAAU,QAAQ,IAAI,GAAG,MAAM,CAAC,CAAC;AAAA;AAAA,kBAEjG,kCAAS,MAAM,GAAG,KAAK,CAAC,iBAAa,oCAAW,MAAM,GAAG,KAAK,CAAC;AAC3E,SAAO,CAAC,KAAK,QAAQ,GAAG,KAAK,QAAQ,GAAG,KAAK,QAAQ,CAAC,EAAE,KAAK,MAAM,IAAI;AACzE;AACA,SAAS,gBAAgB,KAAK;AAC5B,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,IAAI,QAAQ,OAAO,CAAC,IAAI;AAC9B,MAAI,EAAE,YAAY,MAAO,QAAO;AAChC,SAAO,EAAE,GAAG,GAAG,QAAQ,EAAE,UAAU,KAAK;AAC1C;AA6FA,SAASE,aAAY,GAAG;AACtB,MAAI,GAAG,YAAY,MAAO,QAAO;AACjC,QAAM,OAAO,GAAG,QAAQ;AACxB,SAAO,GAAG,IAAI;AAAA;AAAA;AAGhB;AAlmBA,IACAC,yBAUA,iBAGAA,yBAQI,OACA,aACA,QAsOA,cACA,eACA,KACA,QAQA,UAKA,iBAUA,UAuLA,aAkCA,qBAeA,qBA2FAJ;AA3lBJ,IAAAK,aAAA;AAAA;AAAA;AACA,IAAAD,0BAOO;AAGP,sBAA0D;AAG1D,IAAAA,0BAOO;AACP,IAAI,QAAQ;AACZ,IAAI,cAAc;AAClB,IAAI,SAAS,CAAC,WAAW,WAAW,gBAAgB,EAAE,MAAM,UAAU,QAAQ,OAAO,IAAI,EAAE,MAAM,UAAU,iBAAiB,SAAS;AAsOrI,IAAI,eAAe;AACnB,IAAI,gBAAgB,CAAC,OAAO,SAAS,GAAG,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,YAAY,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC;AAC5F,IAAI,MAAM,CAAC,UAAU,EAAE,MAAM,wBAAwB,IAAI,GAAG;AAC5D,IAAI,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC;AAQzD,IAAI,WAAW,CAAC,OAAO,QAAQ;AAAA,MAC7B,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,QAAQ;AAAA,MAClC,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ;AAAA,MAC1C;AAAA,IACF;AACA,IAAI,kBAAkB,CAAC,UAAU,MAAM,SAAS,GAAG,mBAAmB,MAAM,MAAM,CAAC,IAAI,mBAAmB,MAAM,IAAI,CAAC,KAAK,mBAAmB,MAAM,IAAI;AAUvJ,IAAI,WAAW,CAAC,YAAY,EAAE,SAAS,EAAE,oBAAoB,EAAE,OAAO,EAAE,EAAE;AAuL1E,IAAI,cAAc,OAAO;AAAA,MACvB,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,SAAS;AAAA,QAC1B,MAAM,EAAE,MAAM,SAAS;AAAA,MACzB;AAAA,MACA,UAAU,CAAC,SAAS;AAAA,MACpB,sBAAsB;AAAA,IACxB;AAwBA,IAAI,sBAAsB;AAe1B,IAAI,sBAAsB,MAAM;AAAA,MAC9B,YAAY,UAAU;AACpB,aAAK,WAAW;AAChB,aAAK,UAAU;AAAA,MACjB;AAAA,MACA,MAAM,SAAS,MAAM;AACnB,cAAME,MAAK,MAAM,OAAO,aAAa;AACrC,cAAMJ,QAAO,MAAM,OAAO,MAAM;AAChC,cAAM,MAAMA,MAAK,QAAQ,QAAQ,IAAI,GAAG,KAAK,MAAM;AACnD,cAAM,QAAQ,CAAC;AACf,cAAMI,IAAG,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACvC,cAAM,YAAQ,sCAAa,IAAI;AAC/B,cAAM,aAAa,KAAK,cAAc;AACtC,cAAM,SAAS,KAAK,UAAU;AAC9B,cAAM,WAAW,gBAAgB,KAAK,QAAQ;AAC9C,mBAAW,SAAS,KAAK,SAAS,QAAQ;AACxC,gBAAM,WAAWJ,MAAK,KAAK,SAAK,wCAAe,MAAM,QAAQ,UAAU,CAAC;AACxE,gBAAM,OAAO,kBAAkB,OAAO,OAAO,QAAQ,CAAC,CAAC,KAAK,aAAa;AACzE,gBAAM,YAAY,UAAM;AAAA,YACtBC,aAAY,KAAK,YAAY,IAAI;AAAA,YACjC;AAAA,YACA,KAAK;AAAA,UACP;AACA,gBAAMG,IAAG,UAAU,UAAU,WAAW,MAAM;AAC9C,gBAAM,KAAK,QAAQ;AAAA,QACrB;AACA,YAAI,KAAK,YAAY;AACnB,gBAAM,MAAM,mBAAmB,KAAK,SAAS,QAAQ;AAAA,YACnD;AAAA,YACA,eAAe,CAAC,CAAC,KAAK;AAAA,UACxB,CAAC;AACD,gBAAM,iBAAiBJ,MAAK,KAAK,KAAK,eAAe;AACrD,gBAAM,OAAO,6BAA6B,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC;AAAA;AAEtE,gBAAMI,IAAG;AAAA,YACP;AAAA,YACA,UAAM,oCAAWH,aAAY,KAAK,YAAY,IAAI,MAAM,gBAAgB,KAAK,MAAM;AAAA,YACnF;AAAA,UACF;AACA,gBAAM,KAAK,cAAc;AAAA,QAC3B;AACA,YAAI,UAAU;AACZ,gBAAM,QAAQ,gBAAgB,KAAK,SAAS,QAAQ;AAAA,YAClD;AAAA,YACA,eAAe,CAAC,CAAC,KAAK;AAAA,YACtB,kBAAkB,CAAC,CAAC,KAAK;AAAA,YACzB,MAAM,SAAS;AAAA,YACf,SAAS,SAAS;AAAA,YAClB,kBAAkB,SAAS;AAAA,UAC7B,CAAC;AACD,gBAAM,OAAO,KAAK,UAAU,OAAO,MAAM,CAAC;AAC1C,cAAI,SAAS,WAAW,QAAQ;AAC9B,kBAAM,SAASD,MAAK,KAAK,KAAK,YAAY;AAC1C,kBAAM,OAAO,0BAA0B,IAAI;AAAA;AAE3C,kBAAMI,IAAG;AAAA,cACP;AAAA,cACA,UAAM,oCAAWH,aAAY,KAAK,YAAY,IAAI,MAAM,QAAQ,KAAK,MAAM;AAAA,cAC3E;AAAA,YACF;AACA,kBAAM,KAAK,MAAM;AAAA,UACnB;AACA,cAAI,SAAS,WAAW,MAAM;AAC5B,kBAAM,WAAWD,MAAK,KAAK,KAAK,cAAc;AAC9C,kBAAMI,IAAG,UAAU,UAAU,OAAO,MAAM,MAAM;AAChD,kBAAM,KAAK,QAAQ;AAAA,UACrB;AAAA,QACF;AACA,cAAM,MAAM,KAAK,oBAAoB,SAAS,KAAK;AACnD,cAAM,YAAYJ,MAAK,KAAK,KAAK,UAAU;AAC3C,cAAM,QAAQ,KAAK,SAAS,OAAO;AAAA,UACjC,CAAC,MAAM,sBAAkB,yCAAgB,EAAE,QAAQ,YAAY,KAAK,eAAe,CAAC;AAAA,QACtF,EAAE,OAAO,KAAK,aAAa,CAAC,8BAA8B,GAAG,IAAI,IAAI,CAAC,CAAC,EAAE,OAAO,YAAY,SAAS,WAAW,SAAS,CAAC,2BAA2B,GAAG,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI;AACjL,cAAM,iBAAiB,UAAM;AAAA,UAC3BC,aAAY,KAAK,YAAY,IAAI;AAAA,UACjC;AAAA,UACA,KAAK;AAAA,QACP;AACA,cAAMG,IAAG,UAAU,WAAW,gBAAgB,MAAM;AACpD,cAAM,KAAK,SAAS;AACpB,eAAO;AAAA,MACT;AAAA,MACA,YAAY,OAAO,MAAM;AACvB,eAAO;AAAA,UACL;AAAA,cACA,sCAAa,IAAI;AAAA,UACjB,MAAM,UAAU;AAAA,UAChB,CAAC,CAAC,MAAM;AAAA,QACV;AAAA,MACF;AAAA,IACF;AACA,IAAIN,iBAAgB;AAAA;AAAA;;;AC3lBpB,IAAAO,gBAAA;AAAA,SAAAA,eAAA;AAAA;AAAA,iBAAAC;AAAA;AAuCA,SAAS,OAAO,MAAM,aAAa;AACjC,SAAO,GAAG,EAAE,kBAAkB,IAAI,oBAAoB,KAAK,UAAU,WAAW,CAAC;AACnF;AACA,SAAS,MAAM,MAAM,OAAO;AAC1B,SAAO,MAAM,SAAS,GAAG,IAAI,SAAS,MAAM,KAAK,IAAI,CAAC,MAAM;AAC9D;AAoCA,SAAS,cAAc,MAAM;AAC3B,SAAO,SAAS;AAClB;AACA,SAAS,iBAAiB,MAAMC,MAAK;AACnC,SAAO,GAAG,IAAI,kBAAkB,EAAE,WAAWA,IAAG;AAClD;AACA,SAAS,cAAc,GAAG,QAAQ;AAChC,MAAI,KAAK,EAAE,QAAQ,SAAS,EAAE,IAAI,wBAAwB,OAAO,EAAE,IAAI,IAAI;AAC3E,MAAI,KAAK,EAAE,QAAQ,SAAS,EAAE,IAAI,qBAAqB,OAAO,EAAE,IAAI,IAAI;AACxE,aAAW,KAAK,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,QAAQ,GAAG;AAChF,QAAI,EAAE,aAAa,KAAM,MAAK,EAAE,IAAI,wBAAwB,OAAO,EAAE,MAAM;AAAA,aAClE,EAAE,aAAa,IAAK,MAAK,EAAE,IAAI,eAAe,OAAO,EAAE,MAAM;AAAA,aAC7D,EAAE,aAAa,KAAM,MAAK,EAAE,IAAI,qBAAqB,OAAO,EAAE,MAAM;AAAA,aACpE,EAAE,aAAa,IAAK,MAAK,EAAE,IAAI,YAAY,OAAO,EAAE,MAAM;AAAA,EACrE;AACA,SAAO,CAAC,IAAI,EAAE,EAAE,OAAO,OAAO,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,GAAG;AACxE;AACA,SAAS,iBAAiB,GAAG,QAAQ;AACnC,MAAI,EAAE,mBAAmB,EAAE,MAAO,QAAuB,oBAAI,IAAI;AACjE,MAAI,EAAE,WAAW,YAAY,EAAE,WAAW,SAAU,QAAuB,oBAAI,IAAI;AACnF,SAAO,IAAI;AAAA,IACT,OAAO;AAAA,MACL,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,YAAY,EAAE,aAAa,OAAO,EAAE,aAAa;AAAA,IAC5F;AAAA,EACF;AACF;AACA,SAAS,kBAAkB,GAAG;AAC5B,QAAM,EAAE,KAAK,SAAS,QAAI,2CAAkB,CAAC;AAC7C,SAAO;AAAA,IACL,GAAG,MAAM,CAAC,GAAG,EAAE,gBAAgB,OAAO,mBAAmB,+BAA+B,CAAC,GAAG,IAAI,CAAC;AAAA,IACjG,GAAG,WAAW,CAAC,GAAG,EAAE,+BAA+B,IAAI,CAAC;AAAA,EAC1D;AACF;AACA,SAAS,cAAc,GAAG,MAAM;AAC9B,QAAM,WAAW,kBAAkB,CAAC;AACpC,SAAO,SAAS,SAAS,GAAG,EAAE,UAAU,IAAI,KAAK,SAAS,KAAK,IAAI,CAAC,MAAM;AAC5E;AACA,SAAS,SAAS,MAAM,aAAa;AACnC,QAAM,QAAQ,GAAG,EAAE;AACnB,MAAI,gBAAgB,OAAQ,QAAO;AACnC,QAAM,aAAa,MAAM,GAAG,EAAE,WAAW;AAAA,IACvC,GAAG,EAAE,uBAAuB,KAAK,UAAU,6CAAqB,CAAC;AAAA,IACjE,WAAO,uCAAc,aAAa,GAAG,8BAA8B;AAAA,EACrE,CAAC;AACD,QAAM,aAAa,MAAM,GAAG,EAAE,WAAW;AAAA,IACvC,WAAO,uCAAc,aAAa,GAAG,8BAA8B;AAAA,EACrE,CAAC;AACD,QAAM,QAAQ,GAAG,EAAE,UAAU,KAAK,KAAK,UAAU,KAAK,UAAU;AAChE,MAAI,gBAAgB,MAAO,QAAO;AAClC,SAAO,SAAS,WAAW,QAAQ;AACrC;AACA,SAAS,SAAS,GAAG,MAAM;AACzB,QAAM,QAAQ,CAAC;AACf,MAAI,EAAE,OAAO,SAAS,cAAc;AAClC,UAAM,IAAI,EAAE,MAAM;AAClB,QAAI,CAAC,EAAG,QAAO;AACf,WAAO,SAAS,WAAW,CAAC,OAAO,GAAG,wCAAgB,OAAO,CAAC,IAAI,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,yCAAyC,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC;AAAA,EAC7K;AACA,MAAI,EAAE,WAAW;AACf,UAAM;AAAA,MACJ,OAAO,GAAG,wCAAgB,OAAO,EAAE,SAAS,IAAI,WAAW,EAAE,SAAS,aAAa;AAAA,IACrF;AAAA,EACF;AACA,MAAI,EAAE,UAAU;AACd,UAAM;AAAA,MACJ,OAAO,yCAAyC,EAAE,QAAQ,IAAI,WAAW,EAAE,QAAQ,QAAQ;AAAA,IAC7F;AAAA,EACF;AACA,SAAO;AACT;AACA,SAAS,YAAY,GAAG,SAAS;AAC/B,MAAI,EAAE,mBAAmB,EAAE,MAAO,QAAO,CAAC;AAC1C,SAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE;AAAA,IAChD,CAAC,MAAM;AAAA,MACL,GAAG,wCAAgB,IAAI,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,KAAK;AAAA,MACjD,GAAG,EAAE,OAAO,GAAG,EAAE,IAAI,OAAO,EAAE,UAAU,EAAE,IAAI,KAAK,EAAE,QAAQ,IAAI,EAAE,KAAK;AAAA,IAC1E;AAAA,EACF;AACF;AACA,SAAS,iBAAiB,GAAG,eAAe;AAC1C,MAAI,CAAC,EAAE,gBAAiB,QAAO,CAAC;AAChC,SAAO,cAAc,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE;AAAA,IACtD,CAAC,MAAM;AAAA,MACL,YAAY,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,KAAK;AAAA,MACtC,GAAG,EAAE,OAAO,GAAG,EAAE,IAAI,OAAO,EAAE,eAAe,EAAE,IAAI,KAAK,EAAE,QAAQ,IAAI,EAAE,KAAK;AAAA,IAC/E;AAAA,EACF;AACF;AACA,SAAS,WAAW,GAAG,QAAQ;AAC7B,MAAI,EAAE,mBAAmB,EAAE,MAAO,QAAO,CAAC;AAC1C,QAAM,SAAS,iBAAiB,GAAG,MAAM;AACzC,SAAO,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM;AAC5E,UAAM,UAAU,EAAE,SAAS,WAAW,KAAK,UAAU,EAAE,KAAK,IAAI,EAAE;AAClE,WAAO;AAAA,MACL,KAAK,IAAI,EAAE,QAAQ,CAAC,IAAI,OAAO;AAAA,MAC/B,GAAG,EAAE,OAAO,GAAG,EAAE,IAAI,OAAO,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE,QAAQ,IAAI,EAAE,KAAK;AAAA,IAClE;AAAA,EACF,CAAC;AACH;AACA,SAAS,iBAAiB,GAAG;AAC3B,SAAO,EAAE,WAAW,SAAS,EAAE,OAAO,SAAS,YAAY,EAAE,OAAO,SAAS;AAC/E;AACA,SAAS,UAAU,GAAG,MAAM,WAAW,OAAO;AAC5C,QAAM,IAAI,EAAE;AACZ,MAAI,CAAC,EAAG,QAAO;AACf,UAAQ,EAAE,MAAM;AAAA,IACd,KAAK;AACH,aAAO,WAAW,eAAe;AAAA,IACnC,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,GAAG,EAAE;AAAA,IACd,KAAK;AACH,aAAO,GAAG,EAAE,UAAU,MAAM,KAAK,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;AAAA,IACzF,KAAK;AACH,aAAO,GAAG,EAAE,aAAa,EAAE,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;AAAA,IAC/E,KAAK;AACH,aAAO;AAAA,QACL,GAAG,EAAE,UAAU,EAAE;AAAA,QACjB,EAAE,SAAS,CAAC,OAAO,gBAAgB,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC,IAAI,CAAC;AAAA,MACrF;AAAA,IACF,KAAK;AACH,aAAO,MAAM,GAAG,EAAE,WAAW;AAAA,QAC3B,GAAG,EAAE;AAAA,QACL,GAAG,EAAE,SAAS;AAAA,UACZ,EAAE,QAAQ,OAAO,gBAAgB,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,gBAAgB,IAAI,OAAO,eAAe,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,gBAAgB;AAAA,QAC3J,IAAI,CAAC;AAAA,MACP,CAAC;AAAA,IACH,KAAK;AACH,aAAO,MAAM,GAAG,EAAE,WAAW,SAAS,GAAG,IAAI,CAAC;AAAA,EAClD;AACF;AACA,SAAS,cAAc,GAAG,MAAM,aAAa,QAAQ,MAAM,SAAS,UAAU;AAC5E,QAAM,SAAS,UAAU,GAAG,MAAM,QAAQ;AAC1C,MAAI,OAAQ,QAAO;AACnB,QAAM,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI;AAChD,MAAI,KAAK;AACP,UAAM,SAAS,IAAI,OAAO,IAAI,CAAC,MAAM,IAAI,SAAS,WAAW,KAAK,UAAU,CAAC,IAAI,CAAC;AAClF,WAAO,GAAG,EAAE,YAAY,OAAO,KAAK,IAAI,CAAC;AAAA,EAC3C;AACA,MAAI,EAAE,gBAAiB,UAAS,CAAC;AACjC,MAAI,EAAE,cAAc,EAAE,WAAW,QAAQ;AACvC,WAAO,GAAG,EAAE,YAAY,EAAE,WAAW,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,EAC/E;AACA,QAAM,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,GAAG;AACvE,MAAI,MAAM,CAAC,EAAE,OAAO;AAClB,WAAO,GAAG,EAAE,YAAY,GAAG,SAAS,WAAW,KAAK,UAAU,GAAG,KAAK,IAAI,GAAG,KAAK;AAAA,EACpF;AACA,QAAM,OAAO,CAAC,GAAG,WAAW,GAAG,MAAM,GAAG,GAAG,YAAY,GAAG,OAAO,CAAC;AAClE,UAAQ,EAAE,QAAQ;AAAA,IAChB,KAAK,UAAU;AACb,YAAM,OAAO,EAAE,WAAW,SAAS,GAAG,EAAE,UAAU,GAAG,EAAE;AACvD,YAAM,UAAU,EAAE,UAAU,EAAE,WAAW,UAAU,uCAAe,EAAE,MAAM,IAAI,CAAC,GAAG,EAAE,uBAAuB,KAAK,UAAU,uCAAe,EAAE,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC;AAC5J,aAAO,MAAM,MAAM,CAAC,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC;AAAA,IAChE;AAAA,IACA,KAAK,UAAU;AACb,YAAM,WAAO,yCAAgB,CAAC,IAAI,GAAG,EAAE,SAAS,GAAG,EAAE;AACrD,aAAO,cAAc,GAAG,MAAM,MAAM,CAAC,GAAG,cAAc,GAAG,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC;AAAA,IAC7E;AAAA,IACA,KAAK;AACH,aAAO,MAAM,GAAG,EAAE,mBAAmB;AAAA,QACnC,GAAG,EAAE,QAAQ,SAAS,CAAC,GAAG,EAAE,+BAA+B,EAAE,GAAG,IAAI,IAAI,CAAC;AAAA,QACzE,GAAG,EAAE,QAAQ,SAAS,CAAC,GAAG,EAAE,4BAA4B,EAAE,GAAG,IAAI,IAAI,CAAC;AAAA,QACtE,GAAG;AAAA,MACL,CAAC;AAAA,IACH,KAAK;AACH,aAAO,GAAG,EAAE;AAAA,IACd,KAAK;AACH,aAAO,SAAS,MAAM,WAAW;AAAA,IACnC,KAAK;AACH,aAAO,GAAG,EAAE;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AACA,SAAS,YAAY,GAAG,MAAM,aAAa,QAAQ,MAAM,SAAS,eAAe,cAAc,WAAW,OAAO;AAC/G,MAAI,OAAO;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,CAAC,aAAa,iBAAiB,CAAC;AAAA,EACnC;AACA,QAAM,OAAO,EAAE,mBAAmB;AAClC,WAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,WAAO,GAAG,EAAE,UAAU,IAAI;AAC1B,QAAI,MAAM,OAAO,EAAG,QAAO,MAAM,MAAM,iBAAiB,GAAG,aAAa,CAAC;AAAA,EAC3E;AACA,MAAI,MAAO,QAAO,MAAM,MAAM,CAAC,GAAG,EAAE,UAAU,KAAK,UAAU,KAAK,CAAC,GAAG,CAAC;AACvE,MAAI,EAAE,YAAY,CAAC,cAAc,IAAI,EAAG,QAAO,GAAG,EAAE,WAAW,IAAI;AACnE,MAAI,aAAa,CAAC,MAAO,QAAO,iBAAiB,MAAM,SAAS;AAChE,MAAI,SAAS,SAAU,QAAO;AAC9B,QAAM,eAAe,SAAS,YAAY,gBAAgB,EAAE,iBAAiB;AAC7E,MAAI,cAAc;AAChB,WAAO,GAAG,EAAE,iBAAiB,IAAI,sBAAsB,KAAK,UAAU,EAAE,YAAY,CAAC;AAAA,EACvF;AACA,MAAI,SAAS,YAAY,EAAE,YAAY,EAAE,WAAY,QAAO,GAAG,EAAE,aAAa,IAAI;AAClF,SAAO;AACT;AACA,SAAS,SAAS,GAAG,YAAY;AAC/B,SAAO,cAAc,iBAAiB,CAAC;AACzC;AACA,SAAS,kBAAkB,MAAM,MAAM,aAAa,QAAQ,MAAM,SAAS,eAAe,WAAW,eAAe,QAAQ;AAC1H,SAAO,KAAK,IAAI,CAAC,MAAM;AACrB,UAAMA,OAAM,aAAa,SAAS,GAAG,CAAC,CAAC,UAAU,UAAU,IAAI,WAAW,UAAU,KAAK,UAAU,UAAU,SAAS,WAAW,WAAW,QAAQ,KAAK,KAAK,UAAU,EAAE,IAAI,CAAC,MAAM;AACrL,UAAMC,SAAQ;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACAD;AAAA,MACA,QAAQ,KAAK,QAAQ,OAAO,QAAQ,EAAE,IAAI;AAAA,IAC5C;AACA,WAAO,KAAK,KAAK,UAAU,EAAE,IAAI,CAAC,KAAKC,MAAK;AAAA,EAC9C,CAAC,EAAE,KAAK,IAAI;AACd;AACA,SAAS,SAAS,MAAM,MAAM;AAC5B,QAAM,UAAU,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAC/C,SAAO,KAAK,OAAO,CAAC,MAAM,QAAQ,IAAI,EAAE,IAAI,KAAK,QAAQ,IAAI,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,MAAM;AAChF,UAAM,IAAI,KAAK,KAAK,UAAU,EAAE,IAAI,CAAC;AACrC,UAAM,KAAK,KAAK,KAAK,UAAU,EAAE,KAAK,CAAC;AACvC,UAAM,MAAM,GAAG,EAAE,OAAO,GAAG,EAAE,IAAI,OAAO,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE,QAAQ,IAAI,EAAE,KAAK;AAC5E,WAAO,GAAG,EAAE,kBAAkB,CAAC,eAAe,EAAE,eAAe,CAAC,IAAI,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,oBAAoB,KAAK,UAAU,GAAG,CAAC;AAAA,EAClI,CAAC;AACH;AACA,SAAS,YAAY,MAAM,KAAK,MAAM;AACpC,SAAO,KAAK,MAAM,IAAI,EAAE,IAAI,CAAC,SAAS,OAAO,KAAK,OAAO,IAAI,EAAE,KAAK,IAAI;AAC1E;AACA,SAAS,gBAAgB,OAAO;AAC9B,QAAM,UAAU,MAAM,UAAU,CAAC,GAAG,IAAI,CAAC,UAAM,oCAAW,EAAE,YAAY,EAAE,IAAI,CAAC;AAC/E,SAAO;AAAA,IACL,QAAQ,OAAO,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;AAAA,IAClD,MAAM,OAAO,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;AAAA,IACpD,MAAM,OAAO,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;AAAA,IACpD,SAAS,OAAO,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;AAAA,IAC1D,eAAe,OAAO,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC;AAAA,EACxE;AACF;AACA,SAAS,eAAe,MAAM,MAAM;AAClC,QAAM,MAAM,SAAS,eAAW,uCAAc,KAAK,KAAK,QAAI,uCAAc,KAAK,KAAK;AACpF,aAAO,2CAAkB,KAAK,IAAI;AACpC;AACA,SAAS,YAAY,MAAM,OAAO,CAAC,GAAG;AACpC,OAAK,KAAK,IAAI;AACd,aAAW,OAAO,KAAK,KAAM,aAAY,IAAI,OAAO,IAAI;AACxD,SAAO;AACT;AACA,SAAS,mBAAmB,MAAM,MAAM,aAAa,WAAW,eAAe,QAAQ;AACrF,QAAM,OAAO,eAAe,MAAM,IAAI;AACtC,QAAM,EAAE,QAAQ,MAAM,MAAM,SAAS,cAAc,IAAI,gBAAgB,KAAK,KAAK;AACjF,QAAM,KAAK,YAAY,EAAE,OAAO,KAAK,MAAM,QAAQ,MAAM,YAAY,UAAU,WAAW,IAAI;AAC9F,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,EAAE,MAAM,QAAQ,QAAQ,KAAK,MAAM,OAAO,IAAI;AAAA,EACzD;AACA,QAAM,OAAO,KAAK,KAAK,IAAI,CAAC,QAAQ;AAClC,UAAM,YAAQ,wCAAe,GAAG,EAAE,IAAI,CAAC,MAAM,QAAQ,CAAC;AAAA,CACzD,EAAE,KAAK,EAAE;AACN,UAAM,QAAQ;AAAA,MACZ,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,QAAQ,IAAI,SAAS,GAAG,EAAE;AAAA,EAClC,YAAY,YAAY,KAAK,CAAC,CAAC;AAAA,OAC1B,GAAG,EAAE;AAAA,EACV,YAAY,YAAY,KAAK,CAAC,CAAC;AAAA;AAE7B,WAAO,GAAG,KAAK,KAAK,KAAK,UAAU,IAAI,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK;AAAA,EACtE,CAAC;AACD,QAAM,OAAO,CAAC,QAAQ,GAAG,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AACxD,SAAO,MAAM,GAAG,EAAE;AAAA,EAClB,IAAI;AAAA,KACD,SAAS,MAAM,IAAI,CAAC;AACzB;AACA,SAAS,oBAAoB,OAAO,OAAO,aAAa,WAAW,eAAe,OAAO,QAAQ;AAC/F,QAAM,MAAM,CAAC;AACb,aAAW,QAAQ,CAAC,UAAU,QAAQ,GAAG;AACvC,UAAM,OAAO,MAAM,IAAI;AACvB,QAAI,CAAC,KAAM;AACX,UAAM,WAAO,0CAAiB,MAAM,MAAM,QAAQ,KAAK;AACvD,UAAM,YAAQ,wCAAe,MAAM,MAAM,QAAQ,KAAK;AACtD,UAAM,OAAO,mBAAmB,MAAM,MAAM,aAAa,WAAW,eAAe,MAAM;AACzF,QAAI;AAAA,MACF,gBAAgB,IAAI,MAAM,IAAI;AAAA;AAAA,cAEtB,KAAK,MAAM,EAAE,uBAAuB,IAAI;AAAA;AAAA,eAEvC,eAAe,GAAG,IAAI,MAAM,EAAE,qBAAqB,IAAI;AAAA,IAClE;AAAA,EACF;AACA,SAAO,IAAI,SAAS;AAAA,EACpB,IAAI,KAAK,MAAM,CAAC;AAAA,IACd;AACJ;AACA,SAAS,eAAe,OAAO,UAAU,OAAO;AAC9C,QAAM,MAAM,CAAC;AACb,aAAW,QAAQ,CAAC,UAAU,QAAQ,GAAG;AACvC,QAAI,SAAS,YAAY,MAAM,SAAU;AACzC,UAAM,WAAO,yCAAgB,OAAO,SAAS,QAAQ,SAAS,aAAa,CAAC,GAAG,MAAM,KAAK;AAC1F,QAAI,KAAM,KAAI,IAAI,IAAI;AAAA,EACxB;AACA,SAAO;AACT;AACA,SAAS,mBAAmB,OAAO,OAAO,aAAa,WAAW,gBAAgB,OAAO,uBAAuB,OAAO,SAAS,CAAC,GAAG,QAAQ;AAC1I,QAAM,IAAI,MAAM;AAChB,QAAM,iBAAa,uCAAc,KAAK;AACtC,QAAM,iBAAa,uCAAc,KAAK;AACtC,QAAM,iBAAa,uCAAc,KAAK;AACtC,QAAM,EAAE,QAAQ,MAAM,MAAM,SAAS,cAAc,IAAI,gBAAgB,KAAK;AAC5E,QAAM,KAAK,YAAY,EAAE,OAAO,GAAG,YAAY,UAAU,WAAW,IAAI;AACxE,QAAM,QAAQ;AAAA,IACZ,CAAC,UAAU,UAAU;AAAA,IACrB,CAAC,UAAU,UAAU;AAAA,IACrB,CAAC,UAAU,UAAU;AAAA,EACvB;AACA,QAAM,SAAS,MAAM,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM;AACzC,UAAM,WAAO,oCAAW,MAAM,GAAG,KAAK;AACtC,UAAM,YAAQ,kCAAS,MAAM,GAAG,KAAK;AACrC,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA;AAAA,MAGA,KAAK,EAAE,GAAG,IAAI,MAAM,SAAS,WAAW,WAAW,SAAS,IAAI;AAAA,MAChE;AAAA,MACA,SAAS,EAAE,MAAM,QAAQ,QAAQ,EAAE,IAAI;AAAA,IACzC;AACA,UAAM,OAAO,MAAM,GAAG,EAAE;AAAA,EAC1B,IAAI;AAAA,KACD,SAAS,MAAM,IAAI,CAAC;AACrB,WAAO,gBAAgB,IAAI,MAAM,IAAI;AAAA;AAAA,cAE3B,KAAK,MAAM,EAAE,uBAAuB,IAAI;AAAA;AAAA,eAEvC,eAAe,GAAG,IAAI,MAAM,EAAE,qBAAqB,IAAI;AAAA,EACpE,CAAC;AACD,QAAM,gBAAgB,CAAC,UAAU,QAAQ,EAAE,QAAQ,CAAC,MAAM;AACxD,UAAM,OAAO,OAAO,CAAC;AACrB,WAAO,OAAO,YAAY,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,QAAQ,eAAe,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAAA,EACxF,CAAC;AACD,QAAM,aAAa,cAAc,QAAQ,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE;AACvD,QAAM,aAA6B,oBAAI,IAAI;AAC3C,MAAI,WAAW;AACb,UAAM,MAAM,CAAC,CAAC,UAAU;AACxB,QAAI,CAAC,GAAG,YAAY,GAAG,YAAY,GAAG,UAAU,EAAE,KAAK,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG;AAC/E,iBAAW,IAAI,CAAC;AAAA,IAClB;AACA,eAAW,CAAC,MAAM,EAAE,KAAK,eAAe;AACtC,UAAI,GAAG,KAAK,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC,EAAG,YAAW,IAAI,IAAI;AAAA,IAC3D;AAAA,EACF;AACA,QAAM,eAAe,WAAW,OAAO,iBAAiB,CAAC,GAAG,UAAU,EAAE,KAAK,IAAI,CAAC,YAAY,UAAU,eAAe;AAAA,IACrH;AACF,QAAM,YAAY,CAAC,aAAa,CAAC,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,UAAU,EAAE;AAAA,IAC3F,CAAC,MAAM,EAAE,OAAO,SAAS;AAAA,EAC3B;AACA,QAAM,SAAS,2BAAuB,+CAAsB,OAAO,gBAAgB,CAAC,QAAI,kCAAS,UAAU,GAAG,KAAK,CAAC,IAAI;AACxH,QAAM,aAAa,SAAS;AAAA,EAC5B,MAAM;AAAA,IACJ;AACF,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,iBAAa,oCAAW,UAAU,GAAG,KAAK;AAChD,QAAM,gBAAgB,QAAQ,WAAW,CAAC,KAAK,CAAC,GAAG;AAAA,IACjD,CAAC,MAAM,2BAA2B,CAAC,IAAI,EAAE,MAAM;AAAA,cACrC,EAAE,KAAK,MAAM,EAAE,uBAAuB,UAAU,KAAK,KAAK,UAAU,EAAE,MAAM,CAAC;AAAA,EACzF,EAAE,KAAK,MAAM;AACb,QAAM,YAAY,eAAe;AAAA,EACjC,YAAY;AAAA,IACV;AACF,SAAO,eAAe,EAAE;AAAA,EACxB,YAAY,GAAG,YAAY;AAAA,EAC3B,aAAa,KAAK,EAAE;AAAA,EACpB,OAAO,KAAK,MAAM,CAAC;AAAA,EACnB,SAAS,GAAG,UAAU,GAAG,UAAU;AACrC;AAmFA,SAASC,aAAY,GAAG;AACtB,MAAI,KAAK,EAAE,YAAY,MAAO,QAAO;AACrC,QAAM,OAAO,GAAG,MAAM,KAAK;AAC3B,QAAM,QAAQ,OAAO,KAAK,MAAM,OAAO,EAAE,IAAI,CAAC,MAAM,MAAM,CAAC,EAAE,IAAI;AAAA,IAC/D;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI,IAAI;AAC5B;AAnkBA,IACAC,yBA2BIC,sBACA,iBACA,IACA,KAcA,YACA,eAiCA,cAyZA,iBAiFAL;AAzjBJ,IAAAM,aAAA;AAAA;AAAA;AACA,IAAAF,0BA0BO;AACP,IAAIC,uBAAsB;AAC1B,IAAI,kBAAkB;AACtB,IAAI,KAAK;AACT,IAAI,MAAM;AAAA,MACR,MAAM;AAAA,MACN,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,MAAM;AAAA,IACR;AAOA,IAAI,aAAa;AACjB,IAAI,gBAAgB,QAAQ,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,eAKvB,UAAU;AAAA,gCACO,UAAU;AAAA;AAAA,QAElC,UAAU,KAAK,EAAE,WAAW,UAAU,oBAAoB,EAAE;AAAA,IAChE,EAAE;AAAA,MACA,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE,UAAU,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,MAKtB,EAAE;AAAA,QACA,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAQF,EAAE,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,UAAU;AAAA;AAAA;AAAA;AAAA;AAKzE,IAAI,eAAe,GAAG,EAAE;AAyZxB,IAAI,kBAAkB,MAAM;AAAA,MAC1B,YAAY,UAAU;AACpB,aAAK,WAAW;AAChB,aAAK,UAAU;AAAA,MACjB;AAAA,MACA,MAAM,SAAS,MAAM;AACnB,cAAME,MAAK,MAAM,OAAO,aAAa;AACrC,cAAMC,QAAO,MAAM,OAAO,MAAM;AAChC,cAAM,MAAMA,MAAK,QAAQ,QAAQ,IAAI,GAAG,KAAK,MAAM;AACnD,cAAM,QAAQ,CAAC;AACf,cAAMD,IAAG,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACvC,cAAM,YAAQ,sCAAa,IAAI;AAC/B,cAAM,cAAc,KAAK,eAAe;AACxC,cAAM,aAAa,KAAK,cAAcF;AACtC,cAAM,aAAa,KAAK,aAAa,KAAK;AAC1C,cAAM,YAAY,cAAc,KAAK,aAAa;AAAA,UAChD,qBAAiB;AAAA,YACf,KAAK;AAAA,YACL;AAAA,YACA,QAAQ,IAAI;AAAA,YACZ,KAAK;AAAA,UACP;AAAA,UACA,YAAY,CAAC,CAAC,KAAK;AAAA,QACrB,IAAI;AACJ,YAAI,cAAc,CAAC,KAAK,YAAY;AAClC,kBAAQ;AAAA,YACN;AAAA,UACF;AAAA,QACF;AACA,cAAM,cAAc,KAAK,oBAAgB,4CAAmB,KAAK,aAAa,CAAC,MAAM,QAAQ,KAAK,CAAC,CAAC,IAAI;AACxG,cAAM,aAAS,wCAAe,KAAK,SAAS,QAAQ,KAAK,OAAO;AAChE,mBAAW,QAAQ,QAAQ,SAAS,CAAC,EAAG,SAAQ,KAAK,UAAU,IAAI,EAAE;AACrE,mBAAW,SAAS,KAAK,SAAS,QAAQ;AACxC,gBAAM,WAAWG,MAAK,KAAK,SAAK,wCAAe,MAAM,QAAQ,UAAU,CAAC;AACxE,gBAAM,OAAO;AAAA,YACX;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,CAAC,CAAC,KAAK;AAAA,YACP,CAAC,CAAC,MAAM;AAAA,YACR,KAAK,gBAAgB,eAAe,OAAO,KAAK,UAAU,WAAW,IAAI,CAAC;AAAA,YAC1E;AAAA,UACF;AACA,gBAAM,YAAY,UAAM;AAAA,YACtBL,aAAY,KAAK,YAAY,IAAI;AAAA,YACjC;AAAA,YACA,KAAK;AAAA,UACP;AACA,gBAAMI,IAAG,UAAU,UAAU,WAAW,MAAM;AAC9C,gBAAM,KAAK,QAAQ;AAAA,QACrB;AACA,cAAM,YAAYC,MAAK,KAAK,KAAK,UAAU;AAC3C,cAAM,iBAAiB,UAAM;AAAA,UAC3BL,aAAY,KAAK,YAAY,IAAI,KAAK,aAAa,KAAK,UAAU,IAAI;AAAA,UACtE;AAAA,UACA,KAAK;AAAA,QACP;AACA,cAAMI,IAAG,UAAU,WAAW,gBAAgB,MAAM;AACpD,cAAM,KAAK,SAAS;AACpB,eAAO;AAAA,MACT;AAAA,MACA,YAAY,OAAO,MAAM;AACvB,eAAO;AAAA,UACL;AAAA,cACA,sCAAa,IAAI;AAAA,UACjB,MAAM,eAAe;AAAA,UACrB;AAAA,UACA,CAAC,CAAC,MAAM;AAAA,UACR,CAAC,CAAC,MAAM;AAAA,UACR,CAAC;AAAA,cACD,wCAAe,KAAK,SAAS,QAAQ,MAAM,OAAO;AAAA,QACpD;AAAA,MACF;AAAA,MACA,aAAa,UAAU,MAAM;AAC3B,cAAM,aAAa,KAAK,cAAcF;AACtC,eAAO,SAAS,OAAO;AAAA,UACrB,CAAC,MAAM,sBAAkB,yCAAgB,EAAE,QAAQ,YAAY,KAAK,eAAe,CAAC;AAAA,QACtF,EAAE,KAAK,IAAI,IAAI;AAAA,MACjB;AAAA,IACF;AACA,IAAIL,iBAAgB;AAAA;AAAA;;;ACxjBpB,IAAAS,mBAA+B;AAC/B,4BAA8B;AAC9B,IAAAC,gBAAkB;AAClB,sBAAqB;AACrB,0BAAwB;AACxB,uBAAwB;AACxB,IAAAC,QAAsB;AACtB,iBAAgB;;;AC6DT,SAAS,kBACd,GACA,KACA,QACA,OAA8B,CAAC,GACN;AACzB,SAAO;AAAA,IACL;AAAA,IACA,cAAc,EAAE;AAAA,IAChB,QAAQ,EAAE;AAAA,IACV,cAAc,EAAE;AAAA,IAChB,YAAY,EAAE;AAAA,IACd,iBAAiB,EAAE;AAAA,IACnB,OAAO,EAAE;AAAA,IACT,aAAa,EAAE;AAAA,IACf,eAAe,EAAE;AAAA,IACjB,iBAAiB,EAAE;AAAA,IACnB,eAAe,EAAE;AAAA,IACjB,aAAa,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,IAKf,SAAS,EAAE;AAAA;AAAA;AAAA,IAGX,GAAI,KAAK,cACL;AAAA;AAAA,MAEE,YAAY,IAAI;AAAA,MAChB,WAAW,EAAE;AAAA,MACb,cAAc,EAAE;AAAA,IAClB,IACA,CAAC;AAAA,IACL,GAAI,KAAK,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,IAAI,CAAC;AAAA,IAClE,GAAI,KAAK,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;AAAA,EACtC;AACF;;;AClFO,SAAS,kBACd,GACA,KACA,QACyB;AACzB,SAAO;AAAA;AAAA,IAEL,GAAG,kBAAkB,GAAG,KAAK,QAAQ,EAAE,aAAa,MAAM,CAAC;AAAA,IAC3D,QAAQ,EAAE;AAAA,IACV,YAAY,EAAE;AAAA,IACd,UAAU,EAAE;AAAA;AAAA;AAAA,IAGZ,kBAAkB,EAAE;AAAA,EACtB;AACF;;;ACtCA,6BAQO;AACP,SAAoB;AACpB,yBAA8B;AAC9B,WAAsB;AACtB,iBAAkB;;;ACDX,SAAS,gBAAgB,SAAyB;AACvD,SAAO,IAAI;AAAA,IACT,MACE,QACG,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,QAAQ,uBAAuB,MAAM,CAAC,EACzD,KAAK,IAAI,IACZ;AAAA,EACJ;AACF;AAGO,SAAS,WAAW,UAAoB,MAAuB;AACpE,SAAO,SAAS,KAAK,CAAC,MAAM,gBAAgB,CAAC,EAAE,KAAK,IAAI,CAAC;AAC3D;AASO,IAAM,uBAAuB;AAwB7B,SAAS,aAAa,OAA6B;AACxD,SAAO,CAAC,MAAM,MAAM,GAAG,MAAM,UAAU,oBAAoB,IAAI,MAAM,IAAI,EAAE;AAC7E;AAGO,SAAS,aAAa,UAAoB,OAA4B;AAC3E,SAAO,aAAa,KAAK,EAAE,KAAK,CAAC,UAAU,WAAW,UAAU,KAAK,CAAC;AACxE;AAQO,SAAS,iBAAiB,OAA2B;AAC1D,SAAO,MAAM,SAAS,GAAG,MAAM,MAAM,IAAI,MAAM,IAAI,KAAK,MAAM;AAChE;AASO,SAAS,gBAAgB,OAA2B;AACzD,SAAO,GAAG,MAAM,UAAU,oBAAoB,IAAI,MAAM,IAAI;AAC9D;AAGO,SAAS,gBAAgB,QAAwC;AACtE,SAAO,OAAO,KAAK,CAAC,MAAM,EAAE,MAAM;AACpC;AAgBO,SAAS,yBACd,UACA,QACA,QACU;AACV,QAAM,MAAgB,CAAC;AACvB,aAAW,WAAW,UAAU;AAE9B,QAAI,QAAQ,SAAS,GAAG,EAAG;AAC3B,UAAM,UAAU,OAAO,OAAO,CAAC,MAAM,aAAa,CAAC,OAAO,GAAG,CAAC,CAAC;AAC/D,UAAM,UAAU,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,UAAU,oBAAoB,CAAC;AAC5E,QAAI,QAAQ,OAAO,EAAG;AACtB,QAAI;AAAA,MACF,gBAAgB,MAAM,YAAY,KAAK,UAAU,OAAO,CAAC,+EAEpD,QAAQ,IAAI,eAAe,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC,uDACI,KAAK,UAAU,gBAAgB,QAAQ,CAAC,CAAC,CAAC,CAAC;AAAA,IACpG;AAAA,EACF;AACA,SAAO;AACT;;;ADhHO,IAAM,eAAe,aACzB,OAAO;AAAA,EACN,cAAc,aAAE,OAAO,EAAE,QAAQ,QAAQ;AAAA,EACzC,eAAe,aAAE,KAAK,CAAC,SAAS,SAAS,OAAO,CAAC,EAAE,QAAQ,OAAO;AACpE,CAAC,EACA,QAAQ;AAGX,IAAM,mBAAmB,aAAE;AAAA,EACzB;AAAA,IACE,aAAE,OAAO;AAAA,IACT,aACG,OAAO;AAAA,MACN,QAAQ,aAAE,OAAO,EAAE,SAAS;AAAA,MAC5B,QAAQ,aAAE,OAAO,EAAE,SAAS;AAAA,MAC5B,QAAQ,aAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,CAAC,EACA,OAAO;AAAA,EACZ;AAAA,EACA;AAAA,IACE,OACE;AAAA,EAGJ;AACF;AAEA,IAAM,kBAAkB,aACrB,OAAO;AAAA,EACN,QAAQ,iBAAiB,SAAS;AAAA,EAClC,QAAQ,iBAAiB,SAAS;AACpC,CAAC,EACA,OAAO;AAEH,IAAM,cAAc,aACxB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMN,WAAW,aAAE,KAAK,CAAC,YAAY,QAAQ,CAAC,EAAE,SAAS;AAAA,EACnD,QAAQ,gBAAgB,SAAS;AAAA,EACjC,MAAM,gBAAgB,SAAS;AACjC,CAAC,EACA,OAAO;AAUH,IAAM,wBAAwB,aAAE,KAAK,wCAAiB;AAEtD,IAAM,kBAAkB,aAAE,OAAO;AAAA,EACtC,MAAM,aAAE,KAAK;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKD,iBAAiB,sBAAsB,SAAS;AAAA,EAChD,UAAU,aAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,kBAAkB,aAAE,QAAQ,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAevC,aAAa,aAAE,KAAK,CAAC,SAAS,OAAO,MAAM,CAAC,EAAE,SAAS;AAAA,EACvD,WAAW,aAAE,QAAQ,EAAE,SAAS;AAAA;AAAA,EAEhC,cAAc,aAAE,QAAQ,EAAE,SAAS;AAAA;AAAA,EAEnC,eAAe,aAAE,QAAQ,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQpC,iBAAiB,aAAE,QAAQ,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EActC,MAAM,aACH,MAAM;AAAA,IACL,aAAE,QAAQ;AAAA,IACV,aAAE,OAAO,EAAE,SAAS,aAAE,QAAQ,EAAE,SAAS,GAAG,aAAa,aAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO;AAAA,EAC5F,CAAC,EACA,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaZ,gBAAgB,aAAE,QAAQ,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASrC,eAAe,aAAE,QAAQ,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOpC,aAAa,aAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBvC,SAAS,aACN,MAAM;AAAA,IACL,aAAE,QAAQ;AAAA,IACV,aACG,OAAO;AAAA,MACN,SAAS,aAAE,QAAQ,EAAE,SAAS;AAAA,MAC9B,aAAa,aAAE,QAAQ,EAAE,SAAS;AAAA,MAClC,SAAS,aAAE,QAAQ,EAAE,SAAS;AAAA,IAChC,CAAC,EACA,OAAO;AAAA,EACZ,CAAC,EACA,SAAS;AAAA,EACZ,QAAQ,aAAa,SAAS;AAAA,EAC9B,cAAc,aACX,OAAO;AAAA,IACN,SAAS,aAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS;AAAA,IAC5C,MAAM,aAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,CAAC,EACA,SAAS;AAAA,EACZ,QAAQ,aACL,OAAO;AAAA,IACN,SAAS,aAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS;AAAA,IAC5C,QAAQ,aAAE,KAAK,CAAC,QAAQ,YAAY,OAAO,CAAC,EAAE,QAAQ,MAAM,EAAE,SAAS;AAAA,IACvE,YAAY,aAAE,OAAO,EAAE,SAAS;AAAA,EAClC,CAAC,EACA,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUZ,QAAQ,aAAE,KAAK,CAAC,iBAAiB,eAAe,aAAa,CAAC,EAAE,SAAS;AAAA;AAAA,EAEzE,YAAY,aAAE,QAAQ,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASjC,UAAU,aACP,MAAM;AAAA,IACL,aAAE,QAAQ;AAAA,IACV,aACG,OAAO;AAAA,MACN,SAAS,aAAE,QAAQ,EAAE,SAAS;AAAA;AAAA,MAE9B,QAAQ,aAAE,KAAK,CAAC,MAAM,QAAQ,MAAM,CAAC,EAAE,SAAS;AAAA,MAChD,MAAM,aACH,OAAO;AAAA,QACN,OAAO,aAAE,OAAO,EAAE,SAAS;AAAA,QAC3B,SAAS,aAAE,OAAO,EAAE,SAAS;AAAA,QAC7B,aAAa,aAAE,OAAO,EAAE,SAAS;AAAA,MACnC,CAAC,EACA,OAAO,EACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMZ,SAAS,aACN,MAAM,aAAE,OAAO,EAAE,KAAK,aAAE,OAAO,GAAG,aAAa,aAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,CAAC,EAChF,SAAS;AAAA;AAAA,MAEZ,kBAAkB,aAAE,MAAM,CAAC,aAAE,QAAQ,GAAG,GAAG,aAAE,QAAQ,GAAG,CAAC,CAAC,EAAE,SAAS;AAAA,IACvE,CAAC,EACA,OAAO;AAAA,EACZ,CAAC,EACA,SAAS;AAAA;AAAA,EAEZ,MAAM,aAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,YAAY,aAAE,KAAK,CAAC,QAAQ,SAAS,CAAC,EAAE,QAAQ,MAAM,EAAE,SAAS;AAAA,EACjE,cAAc,aAAE,OAAO,EAAE,SAAS;AAAA,EAClC,kBAAkB,aAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAEtC,cAAc,aAAE,OAAO,EAAE,SAAS;AAAA,EAClC,YAAY,aAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAKhC,OAAO,YAAY,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU5B,mBAAmB,aAChB,OAAO;AAAA,IACN,SAAS,aAAE,QAAQ,EAAE,SAAS;AAAA;AAAA,IAE9B,cAAc,aAAE,OAAO,EAAE,SAAS;AAAA,IAClC,oBAAoB,aAAE,OAAO,EAAE,MAAM,aAAE,OAAO,GAAG,MAAM,aAAE,OAAO,EAAE,CAAC,EAAE,SAAS;AAAA,EAChF,CAAC,EACA,SAAS;AAAA;AAAA,EAEZ,YAAY,aACT,OAAO;AAAA,IACN,WAAW,aAAE,QAAQ,EAAE,QAAQ,KAAK,EAAE,SAAS;AAAA,IAC/C,SAAS,aAAE,KAAK,CAAC,OAAO,WAAW,SAAS,CAAC,EAAE,QAAQ,KAAK,EAAE,SAAS;AAAA,IACvE,YAAY,aAAE,OAAO,EAAE,SAAS;AAAA,IAChC,cAAc,aAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,IAKlC,OAAO,YAAY,SAAS;AAAA,EAC9B,CAAC,EACA,SAAS;AAAA;AAAA,EAEZ,iBAAiB,aAAE,OAAO,aAAE,OAAO,GAAG,aAAE,IAAI,CAAC,EAAE,SAAS;AAC1D,CAAC;AASM,IAAM,oBAAoB,aAC9B,OAAO;AAAA,EACN,MAAM,aAAE,MAAM,aAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,MAAM,aAAE,MAAM,aAAE,OAAO,CAAC,EAAE,SAAS;AACrC,CAAC,EACA,OAAO;AAEH,IAAM,iBAAiB,aAAE,OAAO;AAAA,EACrC,kBAAkB,aAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EAC1C,qBAAqB,aAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EAC7C,2BAA2B,aAAE,QAAQ,EAAE,QAAQ,KAAK;AACtD,CAAC;AAEM,IAAM,eAAe,aACzB,OAAO;AAAA,EACN,QAAQ,aAAE,OAAO;AAAA,EACjB,QAAQ,aAAE,OAAO,EAAE,QAAQ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBpC,SAAS,aAAE,MAAM,aAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACtC,SAAS,aAAE,MAAM,aAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+BtC,SAAS,aAAE,OAAO,aAAE,OAAO,GAAG,iBAAiB,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM1D,iBAAiB,sBAAsB,QAAQ,+CAAwB;AAAA,EACvE,UAAU,eAAe,QAAQ;AAAA,IAC/B,kBAAkB;AAAA,IAClB,qBAAqB;AAAA,IACrB,2BAA2B;AAAA,EAC7B,CAAC;AAAA,EACD,YAAY,aACT,MAAM,eAAe,EACrB,IAAI,CAAC,EACL,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAQ,CAAC;AACtC,CAAC,EAIA,YAAY,CAAC,KAAK,QAAQ;AACzB,MAAI,WAAW,QAAQ,CAAC,GAAG,MAAM;AAC/B,UAAM,SAAS,CAAC,MAA2B,OAAsB,iBAA0B;AACzF,iBAAW,aAAS,sCAAc,OAAO,YAAY,GAAG;AACtD,YAAI,SAAS;AAAA,UACX,MAAM;AAAA,UACN,MAAM,CAAC,cAAc,GAAG,GAAG,MAAM,GAAG,MAAM,IAAI;AAAA,UAC9C,SAAS,MAAM;AAAA,QACjB,CAAC;AAAA,MACH;AAAA,IACF;AACA,WAAO,CAAC,OAAO,GAAG,EAAE,OAAmC,EAAE,YAAY;AACrE;AAAA,MACE,CAAC,cAAc,OAAO;AAAA,MACtB,EAAE,YAAY;AAAA,MACd,EAAE,YAAY;AAAA,IAChB;AAAA,EACF,CAAC;AACH,CAAC;AAaH,IAAM,eAAe,oBAAI,IAAI,CAAC,QAAQ,MAAM,CAAC;AAatC,SAAS,WAAW,GAAsB,KAAiC;AAChF,SAAO,EAAE,QAAQ,IAAI;AACvB;AAEA,SAAS,kBAAkB,MAAiE;AAC1F,QAAM,eAAW,qCAAa,IAAI;AAClC,SAAO,kCAAW,IAAI,CAAC,aAAS,mCAAW,MAAM,0CAAmB,QAAQ,CAAC;AAC/E;AAmBO,SAAS,cAAc,KAA6D;AACzF,QAAM,WAAqB,CAAC;AAC5B,QAAM,aAAgC,IAAI,WAAW,IAAI,CAAC,OAAO;AAAA,IAC/D,GAAG;AAAA,IACH,iBAAiB,EAAE,mBAAmB,IAAI;AAAA,EAC5C,EAAE;AAEF,aAAW,KAAK,YAAY;AAG1B,QAAI,CAAC,aAAa,IAAI,EAAE,IAAI,EAAG;AAe/B,QAAI,EAAE,mBAAmB,SAAS;AAChC,iBAAW,KAAK,WAAW,OAAO,CAAC,MAAM,EAAE,SAAS,SAAS,GAAG;AAC9D,YAAI,CAAC,EAAE,mBAAmB;AACxB,YAAE,oBAAoB,EAAE;AAAA,QAC1B,WAAW,CAAC,EAAE,kBAAkB,SAAS;AACvC,mBAAS;AAAA,YACP,qBAAqB,EAAE,IAAI;AAAA,UAI7B;AAAA,QACF;AACA,aAAK,EAAE,cAAc,YAAY,QAAQ;AACvC,mBAAS;AAAA,YACP,qBAAqB,EAAE,IAAI;AAAA,UAK7B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,IAAI,EAAE;AACZ,QAAI,CAAC,GAAG,UAAW;AAEnB,UAAM,UAAU,EAAE,WAAW;AAC7B,UAAM,WAAW,WAAW,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO;AAG5D,QAAI,SAAS,WAAW,EAAG;AAC3B,UAAM,UAAU,SAAS,CAAC;AAE1B,UAAM,SAAS,kBAAkB;AAAA,MAC/B,OAAO,QAAQ;AAAA,MACf,cAAc,QAAQ;AAAA,IACxB,CAAC;AAED,QAAI,CAAC,EAAE,OAAO;AACZ,UAAI,QAAQ,OAAO;AAGjB,UAAE,aAAa;AAAA,UACb,GAAG;AAAA,UACH,WAAO,qCAAa;AAAA,YAClB,OAAO,QAAQ;AAAA,YACf,cAAc,QAAQ;AAAA,UACxB,CAAC;AAAA,QACH;AACA;AAAA,MACF;AACA,YAAMC,QAAO,kBAAkB,EAAE,cAAc,EAAE,aAAa,CAAC;AAC/D,UAAIA,MAAK,KAAK,GAAG,MAAM,OAAO,KAAK,GAAG,GAAG;AACvC,iBAAS;AAAA,UACP,qBAAqB,EAAE,IAAI,0CACrB,KAAK,UAAU,EAAE,gBAAgB,QAAQ,CAAC,yBAAyB,OAAO,+BACjD,KAAK,UAAU,QAAQ,gBAAgB,QAAQ,CAAC,6BACnDA,MAAK,KAAK,IAAI,CAAC,aAAa,OAAO,uBAC1D,OAAO,KAAK,IAAI,CAAC;AAAA,QAExB;AAAA,MACF;AACA;AAAA,IACF;AAEA,UAAM,OAAO,kBAAkB;AAAA,MAC7B,OAAO,EAAE;AAAA,MACT,cAAc,EAAE;AAAA,IAClB,CAAC;AACD,QAAI,KAAK,KAAK,GAAG,MAAM,OAAO,KAAK,GAAG,GAAG;AACvC,YAAM,IAAI;AAAA,QACR,qBAAqB,EAAE,IAAI,8BAA8B,OAAO,0DACtB,OAAO,qDAC/B,KAAK,KAAK,IAAI,CAAC,eAAe,OAAO,uBAClD,OAAO,KAAK,IAAI,CAAC,iFACG,OAAO;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,EAAE,GAAG,KAAK,WAAW,GAAG,SAAS;AACpD;AAOA,SAAS,SAAS,KAA0B;AAC1C,QAAM,EAAE,QAAQ,SAAS,IAAI,cAAc,aAAa,MAAM,GAAG,CAAC;AAClE,aAAW,KAAK,SAAU,SAAQ,KAAK,CAAC;AACxC,SAAO;AACT;AAEA,eAAsB,WAAW,YAAiD;AAChF,QAAM,MAAM,MAAM,OAAO,aAAkB;AAE3C,QAAM,aAAa,aACf,CAAC,UAAU,IACX;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEJ,aAAW,KAAK,YAAY;AAC1B,UAAM,IAAS,aAAQ,QAAQ,IAAI,GAAG,CAAC;AACvC,QAAI;AACF,YAAM,IAAI,OAAO,CAAC;AAAA,IACpB,QAAQ;AACN;AAAA,IACF;AAEA,UAAM,MAAW,aAAQ,CAAC,EAAE,YAAY;AAGxC,QAAI,QAAQ,SAAS;AACnB,YAAMC,OAAM,KAAK,MAAM,MAAM,IAAI,SAAS,GAAG,MAAM,CAAC;AACpD,aAAO,SAASA,IAAG;AAAA,IACrB;AAGA,UAAM,EAAE,WAAW,IAAI,MAAM,OAAO,MAAM;AAC1C,UAAM,OAAO,MAAM,IAAI,KAAK,CAAC;AAG7B,UAAM,OACJ,OAAO,eAAe,cAAc,aAAkB,UAAK,QAAQ,IAAI,GAAG,UAAU;AAEtF,UAAM,OAAO,WAAW,MAAM;AAAA,MAC5B,aAAa;AAAA;AAAA,MACb,SAAS;AAAA;AAAA,MACT,cAAc,OAAO,KAAK,OAAO;AAAA;AAAA,MACjC,gBAAgB;AAAA,MAChB,WAAW;AAAA;AAAA;AAAA,IAEb,CAAC;AAED,UAAM,MAAM,MAAM,KAAK,OAAO,CAAC;AAC/B,UAAM,MAAM,KAAK,WAAW;AAC5B,WAAO,SAAS,GAAG;AAAA,EACrB;AAEA,SAAO;AACT;AAGO,SAAS,2BAA2B,KAAiB,MAAM,QAAQ,IAAI,GAAa;AACzF,QAAM,MAAM,CAAC,MAAmB,aAAQ,KAAK,CAAC;AAC9C,QAAM,OAAO,oBAAI,IAAY;AAC7B,OAAK,IAAI,IAAI,IAAI,MAAM,CAAC;AACxB,aAAW,KAAK,IAAI,YAAY;AAC9B,QAAI,EAAE,SAAS,OAAQ,MAAK,IAAI,IAAI,WAAW,GAAG,GAAG,CAAC,CAAC;AACvD,QAAI,EAAE,SAAS,UAAW,MAAK,IAAI,IAAI,EAAE,QAAQ,cAAc,CAAC;AAChE,QAAI,EAAE,SAAS,MAAO,MAAK,IAAI,IAAI,EAAE,QAAQ,oBAAoB,CAAC;AAClE,QAAI,EAAE,SAAS,UAAW,MAAK,IAAI,IAAI,EAAE,QAAQ,wBAAwB,CAAC;AAC1E,QAAI,EAAE,SAAS,UAAW,MAAK,IAAI,IAAI,EAAE,QAAQ,wBAAwB,CAAC;AAC1E,QAAI,EAAE,SAAS,UAAW,MAAK,IAAI,IAAI,EAAE,QAAQ,wBAAwB,CAAC;AAC1E,QAAI,EAAE,SAAS,SAAU,MAAK,IAAI,IAAI,EAAE,QAAQ,uBAAuB,CAAC;AACxE,QAAI,EAAE,SAAS,cAAe,MAAK,IAAI,IAAI,EAAE,QAAQ,4BAA4B,CAAC;AAAA,EACpF;AACA,SAAO,CAAC,GAAG,IAAI;AACjB;AAGO,SAAS,wBAAwB,KAAiB,MAAM,QAAQ,IAAI,GAAa;AACtF,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAM;AAAA,IACV,OAAO,eAAe,cAAc,aAAkB,UAAK,QAAQ,IAAI,GAAG,UAAU;AAAA,EACtF;AAEA,aAAW,KAAK,IAAI,YAAY;AAC9B,UAAM,IAAI,EAAE;AAIZ,QAAI,CAAC,KAAK,MAAM,cAAc,MAAM,aAAa,MAAM,UAAW;AAGlE,QAAI,SAAwB;AAC5B,QAAI;AACF,YAAM,MAAM,IAAI,QAAQ,GAAG,CAAC,iBAAiB,EAAE,OAAO,CAAC,GAAG,EAAS,CAAC;AACpE,eAAc,aAAQ,GAAG;AAAA,IAC3B,QAAQ;AAAA,IAAC;AAET,QAAI,QAAQ;AACV,cAAQ,KAAK,MAAM;AACnB;AAAA,IACF;AAGA,QAAI,SAAS,KAAK,CAAC,GAAG;AACpB,YAAM,MAAW,aAAQ,KAAK,CAAC;AAC/B,UAAO,cAAW,GAAG,EAAG,SAAQ,KAAK,GAAG;AAAA,IAC1C;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI,IAAI,OAAO,CAAC;AACpC;AAaO,SAAS,aACd,QACA,MACK;AACL,MAAI,MAAM;AACV,MAAI,KAAK,SAAS,OAAQ,OAAM,IAAI,OAAO,CAAC,MAAM,aAAa,KAAK,SAAU,CAAC,CAAC;AAChF,MAAI,KAAK,SAAS,OAAQ,OAAM,IAAI,OAAO,CAAC,MAAM,CAAC,aAAa,KAAK,SAAU,CAAC,CAAC;AACjF,SAAO;AACT;AAQO,SAAS,oBACd,QACA,MACU;AACV,SAAO;AAAA,IACL,GAAG,yBAAyB,KAAK,WAAW,CAAC,GAAG,QAAQ,SAAS;AAAA,IACjE,GAAG,yBAAyB,KAAK,WAAW,CAAC,GAAG,QAAQ,SAAS;AAAA,EACnE;AACF;AAEO,SAAS,oBAAoB,KAAiB,MAAM,QAAQ,IAAI,GAAa;AAClF,QAAM,MAAM,CAAC,MAAmB,aAAQ,KAAK,CAAC;AAC9C,QAAM,YAAY,IAAI,IAAI,MAAM;AAMhC,QAAM,UAAU,oBAAI,IAAY;AAAA,IACzB,aAAQ,SAAS;AAAA,IACtB,IAAI,gBAAgB;AAAA,IACpB,IAAI,gBAAgB;AAAA,IACpB,IAAI,iBAAiB;AAAA,IACrB,IAAI,iBAAiB;AAAA,EACvB,CAAC;AACD,aAAW,KAAK,wBAAwB,KAAK,GAAG,EAAG,SAAQ,IAAI,CAAC;AAChE,SAAO,CAAC,GAAG,OAAO;AACpB;;;AEhtBO,SAAS,YACd,GACA,KACA,aACyB;AACzB,SAAO;AAAA,IACL,WAAW,WAAW,GAAG,GAAG;AAAA,IAC5B,UAAU,EAAE;AAAA,IACZ,kBAAkB,EAAE;AAAA,IACpB,QAAQ,EAAE;AAAA,IACV,cAAc,EAAE;AAAA,IAChB,QAAQ,EAAE;AAAA,IACV,iBAAiB,EAAE;AAAA,IACnB,YAAY,EAAE;AAAA,IACd,mBAAmB,EAAE;AAAA;AAAA;AAAA;AAAA,IAIrB;AAAA,EACF;AACF;;;ACVA,IAAAC,0BAA2B;;;ACN3B,IAAAC,0BAA2B;AAC3B,mBAAkB;AAyClB,IAAM,gBAAgB,oBAAI,IAAI,CAAC,yBAAyB,CAAC;AAQzD,SAAS,UAAUC,OAA+D;AAChF,MAAI,CAACA,MAAM,QAAO,CAAC;AACnB,QAAM,MAAMA,MAAK,YAAY,GAAG;AAChC,MAAI,OAAO,EAAG,QAAO,EAAE,OAAOA,MAAK;AACnC,SAAO,EAAE,OAAOA,MAAK,MAAM,GAAG,GAAG,GAAG,QAAQA,MAAK,MAAM,MAAM,CAAC,EAAE;AAClE;AAQO,SAAS,aAAa,QAA8D;AACzF,QAAM,MAAkD,CAAC;AAIzD,aAAW,KAAK,OAAO,OAAQ,KAAI,KAAK,EAAE,QAAQ,EAAE,QAAQ,QAAQ,KAAK,CAAC;AAC1E,aAAW,KAAK,OAAO,QAAQ,CAAC,EAAG,KAAI,KAAK,EAAE,QAAQ,EAAE,QAAQ,QAAQ,KAAK,CAAC;AAC9E,aAAW,KAAK,OAAO,WAAW,CAAC,EAAG,KAAI,KAAK,EAAE,QAAQ,EAAE,QAAQ,QAAQ,MAAM,CAAC;AAClF,aAAW,KAAK,OAAO,iBAAiB,CAAC,EAAG,KAAI,KAAK,EAAE,QAAQ,EAAE,QAAQ,QAAQ,MAAM,CAAC;AACxF,aAAW,KAAK,OAAO,QAAQ,CAAC,GAAG;AACjC,QAAI,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,MAAM,CAAC;AAC1C,QAAI,KAAK,EAAE,QAAQ,EAAE,OAAO,QAAQ,MAAM,CAAC;AAAA,EAC7C;AACA,SAAO;AACT;AASA,SAAS,cAAc,GAAmB;AACxC,MAAI,EAAE,gBAAiB,QAAO;AAC9B,UAAQ,EAAE,OAAO,MAAM;AAAA,IACrB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,cAAc,OAA+B;AACpD,QAAM,MAAuB,CAAC;AAC9B,QAAM,SAAS,IAAI,IAAI,MAAM,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAC5D,aAAW,KAAK,MAAM,UAAU,CAAC,GAAG;AAClC,UAAM,QAAQ,EAAE,OAAO,IAAI,EAAE,IAAI,MAAM;AACvC,UAAM,MAAM,EAAE,cAAc;AAI5B,UAAM,OAAO,IAAI,KAAK,IAAI,MAAM;AAChC,UAAM,aAAS,oCAAW,KAAK,EAAE,IAAI;AACrC,QAAI,CAAC,OAAO,IAAI;AACd,UAAI,KAAK;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO,MAAM;AAAA,QACb,YAAY,EAAE;AAAA,QACd,SAAS,SAAS,KAAK,QAAQ,MAAM,MAAM,wBAAwB,OAAO,MAAM,iBAAiB,IAAI;AAAA,QACrG,MACE;AAAA,MAGJ,CAAC;AACD;AAAA,IACF;AAIA,UAAM,OAAO,oBAAI,IAAY;AAC7B,eAAW,EAAE,QAAQ,OAAO,KAAK,aAAa,MAAM,GAAG;AACrD,UAAI,KAAK,IAAI,MAAM,EAAG;AACtB,WAAK,IAAI,MAAM;AACf,YAAM,MAAM,OAAO,IAAI,MAAM;AAC7B,UAAI,CAAC,KAAK;AACR,YAAI,KAAK;AAAA,UACP,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO,MAAM;AAAA,UACb;AAAA,UACA,YAAY,EAAE;AAAA,UACd,SAAS,SAAS,KAAK,QAAQ,MAAM,MAAM,YAAY,MAAM,+EAA+E,IAAI;AAAA,UAChJ,MACE;AAAA,QAEJ,CAAC;AACD;AAAA,MACF;AACA,UAAI,WAAW,IAAI,mBAAmB,IAAI,QAAQ;AAChD,YAAI,KAAK;AAAA,UACP,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO,MAAM;AAAA,UACb;AAAA,UACA,YAAY,EAAE;AAAA,UACd,SAAS,SAAS,KAAK,QAAQ,MAAM,MAAM,cAAc,cAAc,GAAG,CAAC,YAAY,MAAM,gGAAgG,IAAI;AAAA,UACjM,MACE;AAAA,QAEJ,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAA+B;AAEzD,MAAI,MAAM,SAAU,QAAO,CAAC;AAC5B,QAAM,KAAK,MAAM,YAAY,WAAW,CAAC;AACzC,MAAI,CAAC,GAAG,QAAQ;AACd,UAAM,QAAQ,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACvD,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO,MAAM;AAAA,QACb,SAAS,QACL,UAAU,MAAM,MAAM,kKACtB,UAAU,MAAM,MAAM;AAAA,QAC1B,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,MAAI,GAAG,SAAS,GAAG;AACjB,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO,MAAM;AAAA,QACb,SAAS,UAAU,MAAM,MAAM,kCAAkC,GAAG,KAAK,IAAI,CAAC,2EAA2E,GAAG,CAAC,CAAC;AAAA,QAC9J,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO,CAAC;AACV;AAWO,SAAS,kBAAkB,UAAoB,YAAkC;AACtF,QAAM,WAA4B,CAAC;AAEnC,QAAM,SAAS,SAAS,OAAO,OAAO,CAAC,MAAa,EAAE,UAAU,OAAO;AACvE,aAAW,KAAK,QAAQ;AACtB,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,GAAG,UAAU,EAAE,IAAI;AAAA,MACnB,SAAS,EAAE;AAAA,MACX,MAAM,EAAE;AAAA,IACV,CAAC;AAAA,EACH;AAEA,aAAW,KAAK,SAAS,QAAQ;AAC/B,QAAI,EAAE,SAAS,0BAA2B;AAC1C,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,GAAG,UAAU,EAAE,IAAI;AAAA,MACnB,SAAS,EAAE;AAAA,MACX,MAAM,EAAE;AAAA,IACV,CAAC;AAAA,EACH;AAEA,aAAW,KAAK,SAAS,OAAQ,UAAS,KAAK,GAAG,cAAc,CAAC,CAAC;AAClE,aAAW,KAAK,SAAS,OAAQ,UAAS,KAAK,GAAG,mBAAmB,CAAC,CAAC;AAEvE,aAAW,KAAK,SAAS,QAAQ;AAC/B,QAAI,EAAE,UAAU,WAAW,cAAc,IAAI,EAAE,IAAI,EAAG;AACtD,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,GAAG,UAAU,EAAE,IAAI;AAAA,MACnB,SAAS,EAAE;AAAA,MACX,MAAM,EAAE;AAAA,IACV,CAAC;AAAA,EACH;AAEA,QAAM,UAAU,SAAS,OAAO,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,QAAQ,CAAC;AACxE,QAAM,SAAS,SAAS,OAAO,OAAO,CAAC,GAAG,MAAM,KAAK,EAAE,QAAQ,UAAU,IAAI,CAAC;AAC9E,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,SAAS,SAAS;AAAA,IAClB,IAAI,SAAS,WAAW;AAAA,IACxB,QAAQ,EAAE,QAAQ,SAAS,OAAO,QAAQ,SAAS,QAAQ,UAAU,SAAS,OAAO;AAAA,IACrF;AAAA,EACF;AACF;AAGA,IAAM,WAA8E;AAAA,EAClF;AAAA,IACE,OAAO,CAAC,gBAAgB;AAAA,IACxB,OAAO;AAAA,IACP,KAAK;AAAA,EACP;AAAA,EACA;AAAA,IACE,OAAO,CAAC,kBAAkB,wBAAwB,kBAAkB;AAAA,IACpE,OAAO;AAAA,IACP,KAAK;AAAA,EACP;AAAA,EACA;AAAA,IACE,OAAO,CAAC,kBAAkB,qBAAqB;AAAA,IAC/C,OAAO;AAAA,IACP,KAAK;AAAA,EACP;AAAA,EACA;AAAA,IACE,OAAO,CAAC,UAAU;AAAA,IAClB,OAAO;AAAA,IACP,KAAK;AAAA,EACP;AACF;AASA,SAAS,KAAK,MAAc,QAAgB,QAAQ,QAAQ,QAAQ,IAAY;AAC9E,QAAM,QAAkB,CAAC;AACzB,MAAI,OAAO;AACX,aAAW,QAAQ,KAAK,MAAM,KAAK,GAAG;AACpC,QAAI,QAAQ,GAAG,IAAI,IAAI,IAAI,GAAG,SAAS,OAAO,SAAS,OAAO;AAC5D,YAAM,KAAK,IAAI;AACf,aAAO;AAAA,IACT,OAAO;AACL,aAAO,OAAO,GAAG,IAAI,IAAI,IAAI,KAAK;AAAA,IACpC;AAAA,EACF;AACA,MAAI,KAAM,OAAM,KAAK,IAAI;AACzB,SAAO,MAAM,IAAI,CAAC,GAAG,OAAO,MAAM,IAAI,QAAQ,UAAU,CAAC,EAAE,KAAK,IAAI;AACtE;AAQO,SAAS,mBAAmB,QAA8B;AAC/D,QAAM,MAAgB,CAAC;AACvB,QAAM,SAAS,CAAC,GAAW,QAAgB,GAAG,CAAC,IAAI,GAAG,GAAG,MAAM,IAAI,KAAK,GAAG;AAE3E,MAAI,KAAK,aAAAC,QAAM,KAAK,gBAAgB,OAAO,MAAM,EAAE,CAAC;AACpD,MAAI;AAAA,IACF,aAAAA,QAAM;AAAA,MACJ,GAAG,OAAO,OAAO,KAAK,OAAO,OAAO,OAAO,QAAQ,OAAO,CAAC,KACtD,OAAO,OAAO,OAAO,SAAS,QAAQ,CAAC,KAAK,OAAO,OAAO,OAAO,QAAQ,kBAAkB,CAAC;AAAA,IACnG;AAAA,EACF;AACA,MAAI,KAAK,EAAE;AAEX,MAAI,OAAO,IAAI;AACb,QAAI,KAAK,aAAAA,QAAM,MAAM,oBAAoB,CAAC;AAC1C,QAAI,KAAK,aAAAA,QAAM,IAAI,8CAA8C,CAAC;AAClE,QAAI,KAAK,aAAAA,QAAM,IAAI,uEAAuE,CAAC;AAC3F,QAAI,KAAK,aAAAA,QAAM,IAAI,yDAAyD,CAAC;AAC7E,WAAO,IAAI,KAAK,IAAI;AAAA,EACtB;AAKA,QAAM,QAAQ,OAAO,SAAS,OAAO,CAAC,MAAM,EAAE,UAAU,OAAO;AAC/D,MAAI,MAAM,QAAQ;AAChB,QAAI,KAAK,aAAAA,QAAM,IAAI,iCAAiC,CAAC;AACrD,QAAI,KAAK,aAAAA,QAAM,IAAI,kCAAkC,CAAC;AACtD,QAAI,KAAK,EAAE;AACX,eAAW,KAAK,OAAO;AACrB,UAAI,KAAK,KAAK,EAAE,SAAS,QAAQ,KAAK,aAAAA,QAAM,IAAI,GAAG,CAAC,GAAG,CAAC;AACxD,UAAI,EAAE,KAAM,KAAI,KAAK,aAAAA,QAAM,IAAI,KAAK,EAAE,MAAM,MAAM,CAAC,CAAC;AAAA,IACtD;AACA,QAAI,KAAK,EAAE;AAAA,EACb;AAEA,aAAW,WAAW,UAAU;AAC9B,UAAM,OAAO,OAAO,SAAS;AAAA,MAC3B,CAAC,MAAM,EAAE,UAAU,WAAW,QAAQ,MAAM,SAAS,EAAE,IAAI;AAAA,IAC7D;AACA,QAAI,CAAC,KAAK,OAAQ;AAClB,QAAI,KAAK,aAAAA,QAAM,OAAO,GAAG,QAAQ,KAAK,MAAM,KAAK,MAAM,GAAG,CAAC;AAC3D,QAAI,KAAK,aAAAA,QAAM,IAAI,KAAK,QAAQ,GAAG,EAAE,CAAC;AACtC,QAAI,KAAK,EAAE;AAGX,UAAM,SAAS,oBAAI,IAA6B;AAChD,eAAW,KAAK,MAAM;AACpB,YAAM,MAAM,EAAE,QAAQ;AACtB,aAAO,IAAI,KAAK,CAAC,GAAI,OAAO,IAAI,GAAG,KAAK,CAAC,GAAI,CAAC,CAAC;AAAA,IACjD;AACA,eAAW,CAAC,MAAM,KAAK,KAAK,QAAQ;AAClC,iBAAW,KAAK,MAAO,KAAI,KAAK,KAAK,EAAE,SAAS,QAAQ,KAAK,aAAAA,QAAM,IAAI,GAAG,CAAC,GAAG,CAAC;AAC/E,UAAI,KAAM,KAAI,KAAK,aAAAA,QAAM,IAAI,KAAK,MAAM,MAAM,CAAC,CAAC;AAChD,UAAI,KAAK,EAAE;AAAA,IACb;AAAA,EACF;AAEA,MAAI;AAAA,IACF,aAAAA,QAAM,KAAK,GAAG,OAAO,OAAO,OAAO,UAAU,SAAS,CAAC,OAAO,OAAO,MAAM,GAAG,IAC5E,aAAAA,QAAM;AAAA,MACJ,MAAM,SACF,6CACA;AAAA,IACN;AAAA,EACJ;AACA,SAAO,IAAI,KAAK,IAAI;AACtB;;;ADzVA,SAAS,eAAe,YAAgC,MAAoC;AAC1F,QAAM,aAAS,oCAAW,YAAY,IAAI;AAC1C,MAAI,CAAC,OAAO,GAAI,QAAO,CAAC;AACxB,SAAO,CAAC,GAAG,IAAI,IAAI,aAAa,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC/D;AAaO,SAAS,cAAc,QAAiB,MAAoD;AACjG,QAAM,UAAU,OAAO,QAAQ,QAAQ,CAAC,CAAC;AACzC,MAAI,CAAC,QAAQ,OAAQ,QAAO,EAAE,QAAQ,UAAU,CAAC,EAAE;AAEnD,QAAM,SAAmB,CAAC;AAC1B,QAAM,WAAqB,CAAC;AAG5B,QAAM,gBAAgB,gBAAgB,MAAM,IAAI,kBAAkB;AAclE,aAAW,CAAC,cAAc,KAAK,KAAK,SAAS;AAC3C,UAAM,UAAU,OAAO,OAAO,CAAC,MAAM,aAAa,CAAC,YAAY,GAAG,CAAC,CAAC;AACpE,QAAI,CAAC,QAAQ,QAAQ;AACnB,aAAO;AAAA,QACL,WAAW,KAAK,UAAU,YAAY,CAAC,4CACb,OAAO,IAAI,aAAa,EAAE,KAAK,IAAI,KAAK,aAAa;AAAA,MACjF;AACA;AAAA,IACF;AACA,UAAM,YAAY,CAAC,GAAG,IAAI,IAAI,QAAQ,QAAQ,CAAC,MAAM,EAAE,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;AACnF,eAAW,SAAS,CAAC,QAAQ,MAAM,GAAY;AAC7C,iBAAW,WAAW,MAAM,KAAK,KAAK,CAAC,GAAG;AACxC,YAAI,UAAU,KAAK,CAAC,SAAS,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC,EAAG;AAC3D,eAAO;AAAA,UACL,WAAW,KAAK,UAAU,YAAY,CAAC,KAAK,KAAK,UAAU,KAAK,UAAU,OAAO,CAAC,gCAClD,QAAQ,IAAI,aAAa,EAAE,KAAK,IAAI,CAAC,gBACrD,UAAU,KAAK,IAAI,CAAC;AAAA,QACtC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,WAAS;AAAA,IACP,GAAG;AAAA,MACD,QAAQ,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;AAAA,MACtB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,MAAM,OAAO,IAAI,CAAC,UAAU;AAChC,UAAM,OAAO,QAAQ,OAAO,CAAC,CAAC,OAAO,MAAM,aAAa,CAAC,OAAO,GAAG,KAAK,CAAC;AACzE,QAAI,CAAC,KAAK,OAAQ,QAAO;AAMzB,QAAI,OAAO,MAAM;AACjB,eAAW,CAAC,EAAE,KAAK,KAAK,MAAM;AAC5B,UAAI,MAAM,MAAM,OAAQ,QAAO,KAAK,OAAO,CAAC,MAAM,WAAW,MAAM,MAAO,EAAE,IAAI,CAAC;AACjF,UAAI,MAAM,MAAM,OAAQ,QAAO,KAAK,OAAO,CAAC,MAAM,CAAC,WAAW,MAAM,MAAO,EAAE,IAAI,CAAC;AAAA,IACpF;AACA,QAAI,KAAK,WAAW,MAAM,QAAQ,OAAQ,QAAO;AAEjD,UAAM,OAAO,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAC5C,UAAM,UAAU,MAAM,QAAQ,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,IAAI,CAAC;AAE7D,QAAI,CAAC,KAAK,QAAQ;AAChB,aAAO;AAAA,QACL,yBAAyB,iBAAiB,KAAK,CAAC;AAAA,MAGlD;AACA,aAAO;AAAA,IACT;AAmBA,UAAM,WAAW,MAAM,YAAY,WAAW,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;AAC5E,QAAI,QAAQ,QAAQ;AAClB,aAAO;AAAA,QACL,iBAAiB,QAAQ,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,gBAC3D,iBAAiB,KAAK,CAAC,wCACvB,MAAM,YAAY,QAAQ,KAAK,IAAI,CAAC;AAAA,MAG5C;AACA,aAAO;AAAA,IACT;AAeA,eAAW,KAAK,SAAS;AACvB,UAAI,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,MAAM,SAAU;AACnE,eAAS;AAAA,QACP,4CAA4C,EAAE,IAAI,iBAAiB,iBAAiB,KAAK,CAAC,6LAG7E,EAAE,IAAI;AAAA,MACrB;AAAA,IACF;AAMA,eAAW,KAAK,MAAM,UAAU,CAAC,GAAG;AAIlC,YAAM,OAAO,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE;AAAA,QAChD,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,KAAK,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,MAC/D;AACA,UAAI,CAAC,KAAK,OAAQ;AAClB,eAAS;AAAA,QACP,sBAAsB,EAAE,OAAO,IAAI,EAAE,IAAI,MAAM,WAAW,cAAc,iBAAiB,KAAK,CAAC,WACpF,KAAK,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,MAE1D;AAAA,IACF;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS;AAAA,MACT,SAAS,MAAM,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,QAAQ,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC;AAAA,MAC9E,UAAU,MAAM,WAAW,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,QAAQ,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC;AAAA,MAChF,GAAI,MAAM,cACN,EAAE,aAAa,MAAM,YAAY,OAAO,CAAC,MAAM,EAAE,QAAQ,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,IACpF,CAAC;AAAA,IACP;AAAA,EACF,CAAC;AAED,MAAI,OAAO,QAAQ;AACjB,UAAM,IAAI;AAAA,MACR;AAAA,IACE,OAAO,IAAI,CAAC,MAAM,OAAO,CAAC,EAAE,EAAE,KAAK,IAAI;AAAA,IAC3C;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,KAAK,SAAS;AACjC;;;AEpPA,qBAA+B;AAC/B,uBAAiB;AAQjB,eAAsB,YAAY,KAA2C;AAC3E,QAAM,MAAM,oBAAI,IAAoB;AACpC,iBAAe,KAAK,SAAiB;AACnC,QAAI;AACJ,QAAI;AACF,gBAAU,MAAM,eAAAC,SAAG,QAAQ,SAAS,EAAE,eAAe,KAAK,CAAC;AAAA,IAC7D,QAAQ;AACN;AAAA,IACF;AACA,eAAW,KAAK,SAAS;AACvB,YAAM,OAAO,iBAAAC,QAAK,KAAK,SAAS,EAAE,IAAI;AACtC,UAAI,EAAE,YAAY,EAAG,OAAM,KAAK,IAAI;AAAA,UAC/B,KAAI,IAAI,iBAAAA,QAAK,SAAS,KAAK,IAAI,GAAG,MAAM,eAAAD,SAAG,SAAS,MAAM,MAAM,CAAC;AAAA,IACxE;AAAA,EACF;AACA,QAAM,KAAK,GAAG;AACd,SAAO;AACT;AAGA,eAAsB,YAAY,MAA8C;AAC9E,QAAM,MAAM,oBAAI,IAAoB;AACpC,aAAW,OAAO,MAAM;AACtB,eAAW,CAAC,KAAK,OAAO,KAAK,MAAM,YAAY,GAAG,GAAG;AACnD,UAAI,IAAI,iBAAAC,QAAK,KAAK,KAAK,GAAG,GAAG,OAAO;AAAA,IACtC;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,cACd,QACA,OACc;AACd,QAAM,MAAoB,CAAC;AAC3B,aAAW,CAAC,MAAM,OAAO,KAAK,OAAO;AACnC,QAAI,CAAC,OAAO,IAAI,IAAI,EAAG,KAAI,KAAK,EAAE,MAAM,QAAQ,QAAQ,CAAC;AAAA,aAChD,OAAO,IAAI,IAAI,MAAM,QAAS,KAAI,KAAK,EAAE,MAAM,QAAQ,UAAU,CAAC;AAAA,EAC7E;AACA,aAAW,QAAQ,OAAO,KAAK,GAAG;AAChC,QAAI,CAAC,MAAM,IAAI,IAAI,EAAG,KAAI,KAAK,EAAE,MAAM,QAAQ,UAAU,CAAC;AAAA,EAC5D;AACA,SAAO,IAAI,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AACxD;AAQA,eAAsB,gBACpB,QACA,OACe;AACf,aAAW,CAAC,MAAM,OAAO,KAAK,QAAQ;AACpC,UAAM,eAAAD,SAAG,MAAM,iBAAAC,QAAK,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACtD,UAAM,eAAAD,SAAG,UAAU,MAAM,SAAS,MAAM;AAAA,EAC1C;AACA,aAAW,QAAQ,MAAM,KAAK,GAAG;AAC/B,QAAI,CAAC,OAAO,IAAI,IAAI,EAAG,OAAM,eAAAA,SAAG,GAAG,MAAM,EAAE,OAAO,KAAK,CAAC;AAAA,EAC1D;AACF;;;AC3EO,IAAM,6BAAN,cAAyC,MAAM;AAAA,EACpD,YACW,WAEA,QACT;AACA,UAAM,GAAG,SAAS,mBAAmB;AAJ5B;AAEA;AAGT,SAAK,OAAO;AAAA,EACd;AACF;AAgBO,SAAS,iBAAiB,KAAc,WAA4B;AACzE,QAAM,OAAQ,KAA+C;AAC7D,MAAI,SAAS,uBAAwB,QAAO;AAC5C,QAAM,UAAW,KAAkD;AACnE,SAAO,OAAO,YAAY,YAAY,QAAQ,SAAS,IAAI,SAAS,GAAG;AACzE;AASA,eAAsB,cAAiB,WAAmB,MAAoC;AAC5F,MAAI;AACF,WAAO,MAAM,KAAK;AAAA,EACpB,SAAS,GAAG;AACV,QAAI,iBAAiB,GAAG,SAAS,EAAG,OAAM,IAAI,2BAA2B,WAAW,CAAC;AACrF,UAAM;AAAA,EACR;AACF;;;AC7DA,IAAAE,gBAAkB;AAClB,IAAAC,kBAAmE;AACnE,IAAAC,oBAAiB;AAcjB,IAAM,YAAY,kBAAAC,QAAK,KAAK,QAAQ,IAAI,GAAG,gBAAgB,UAAU,OAAO;AAC5E,IAAM,aAAa,kBAAAA,QAAK,KAAK,WAAW,sBAAsB;AAC9D,IAAM,sBAAsB,MAAO,KAAK;AACxC,IAAI,mBAAmB;AAEvB,IAAM,OAAO;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,QAAQ,CAAC,QAAgB,cAAAC,QAAM,IAAI,SAAS,EAAE,GAAG;AACvD,IAAM,OAAO,CAAC,QAAgB,cAAAA,QAAM,KAAK,GAAG;AAC5C,IAAM,OAAO,CAAC,QAAgB,cAAAA,QAAM,KAAK,GAAG;AAErC,SAAS,wBAAwB;AAAA,EACtC,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,QAAQ;AACV,IAA2B,CAAC,GAAG;AAC7B,QAAM,aAAa,QAAQ,IAAI,mBAAmB,YAAY;AAC9D,QAAM,gBAAgB,eAAe,OAAO,eAAe;AAC3D,MAAI,iBAAkB,QAAQ,IAAI,MAAM,CAAC,SAAW,oBAAoB,CAAC,MAAQ;AAEjF,MAAI;AACF,mCAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AACxC,UAAM,UAAU,UAAU;AAC1B,YAAQ,QAAQ;AAEhB,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,aAAa,SAAS,OAAO,QAAQ,eAAe,MAAM;AAEhE,QAAI,YAAY;AACd,cAAQ,cAAc;AACtB,cAAQ,aAAa;AAAA,IACvB;AAEA,eAAW,OAAO;AAElB,QAAI,CAAC,WAAY;AAEjB,uBAAmB;AACnB,UAAM,MAAM,KAAK,QAAQ,OAAO,KAAK,MAAM;AAE3C,YAAQ;AAAA,MACN;AAAA,EAAK,KAAK,6BAAsB,MAAM,UAAU,QAAQ,KAAK,eAAe,CAAC,IAAI,CAAC;AAAA;AAAA,EAC7E,MAAM,sEAAiE,CAAC;AAAA,IACtE,MAAM,iBAAiB,CAAC,KAAK,KAAK,iDAA4C,CAAC;AAAA;AAAA,EACjF,MAAM,UAAU,CAAC,IAAI,GAAG;AAAA;AAAA,IAC/B;AAAA,EACF,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,YAAiC;AACxC,MAAI,KAAC,4BAAW,UAAU,GAAG;AAC3B,WAAO,EAAE,MAAM,EAAE;AAAA,EACnB;AACA,MAAI;AACF,UAAM,OAAO,KAAK,UAAM,8BAAa,YAAY,MAAM,CAAC;AACxD,QAAI,OAAO,KAAK,SAAS,SAAU,QAAO,EAAE,MAAM,EAAE;AACpD,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,EAAE,MAAM,EAAE;AAAA,EACnB;AACF;AAEA,SAAS,WAAW,SAA8B;AAChD,qCAAc,YAAY,KAAK,UAAU,SAAS,MAAM,CAAC,GAAG,MAAM;AACpE;;;AC5EA,IAAAC,kBAA6B;AAC7B,IAAAC,QAAsB;AACtB,sBAA8B;AAG9B,IAAM,eAAe;AAWrB,SAAS,YAAoB;AAC3B,SAAY,kBAAQ,+BAAc,eAAe,CAAC;AACpD;AAQO,SAAS,gBAAgB,cAA8B;AAC5D,MAAI;AACJ,MAAI;AACF,cAAM,8BAAa,cAAc,MAAM;AAAA,EACzC,SAAS,GAAQ;AACf,UAAM,IAAI;AAAA,MACR,GAAG,YAAY,gDAAgD,YAAY,KACrE,GAAG,WAAW,OAAO,CAAC,CAAC;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,WAAW,KAAK,MAAM,GAAG;AAE/B,MAAI,SAAS,SAAS,cAAc;AAClC,UAAM,IAAI;AAAA,MACR,GAAG,YAAY,kCAAkC,YAAY,cACxD,KAAK,UAAU,SAAS,IAAI,CAAC;AAAA,IACpC;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,YAAY,YAAY,SAAS,QAAQ,WAAW,GAAG;AACzE,UAAM,IAAI,MAAM,GAAG,YAAY,sDAAsD;AAAA,EACvF;AAEA,SAAO,SAAS;AAClB;AAQO,SAAS,iBAAyB;AACvC,SAAO,gBAAqB,WAAK,UAAU,GAAG,MAAM,cAAc,CAAC;AACrE;AAEO,IAAM,cAAc,eAAe;;;AXpC1C,SAAS,uBAAuB,MAAc,GAAkB;AAC9D,MAAI,aAAa,4BAA4B;AAC3C,YAAQ;AAAA,MACN,cAAAC,QAAM,IAAI,OAAO,IAAI,8BAA8B;AAAA,MACnD,cAAAA,QAAM,OAAO;AAAA,4BAA+B,EAAE,SAAS,EAAE;AAAA,IAC3D;AACA;AAAA,EACF;AACA,UAAQ,MAAM,cAAAA,QAAM,IAAI,OAAO,IAAI,oBAAoB,GAAI,GAAW,WAAW,CAAC;AACpF;AAEA,IAAM,UAAU,IAAI,yBAAQ;AAC5B,QAAQ,KAAK,MAAM,EAAE,YAAY,kCAAkC,EAAE,QAAQ,WAAW;AACxF,QAAQ;AAAA,EACN;AAAA,EACA;AAAA;AAAA;AAAA;AACF;AAEA,QACG,QAAQ,SAAS,EACjB,SAAS,YAAY,6BAA6B,EAClD,OAAO,eAAe,qBAAqB,IAAI,EAC/C,OAAO,cAAc,wBAAwB,IAAI,EACjD,OAAO,gBAAgB,6BAA6B,EACpD,OAAO,UAAU,0CAA0C,KAAK,EAChE,OAAO,OAAO,QAAgB,SAAc;AAC3C,MAAI;AACF,UAAM,WAAW,IAAI,gCAAe,MAAM;AAC1C,UAAM,UAAU,CAAC,KAAK,WAAO,WAAAC,SAAI,qBAAqB,EAAE,MAAM,IAAI;AAClE,UAAM,QAAQ,KAAK,IAAI;AACvB,UAAM,MAAM,MAAM,SAAS,QAAQ;AAAA,MACjC,kBAAkB,CAAC,CAAC,KAAK;AAAA,MACzB,qBAAqB,CAAC,CAAC,KAAK;AAAA,IAC9B,CAAC;AACD,UAAM,KAAK,KAAK,IAAI,IAAI;AACxB,UAAM,OAAO,KAAK,UAAU,KAAK,MAAM,CAAC;AACxC,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,IAAI;AAAA,IAClB,WAAW,KAAK,KAAK;AACnB,YAAMC,MAAK,MAAM,OAAO,aAAkB;AAC1C,YAAMA,IAAG,UAAU,KAAK,KAAK,MAAM,MAAM;AACzC,eAAS,QAAQ,cAAAF,QAAM,MAAM,uBAAuB,KAAK,GAAG,OAAO,EAAE,IAAI,CAAC;AAAA,IAC5E,OAAO;AACL,eAAS,QAAQ,cAAAA,QAAM,MAAM,eAAe,EAAE,IAAI,CAAC;AACnD,cAAQ,IAAI,IAAI;AAAA,IAClB;AACA,YAAQ,KAAK,IAAI,OAAO,KAAK,CAAC,MAAM,EAAE,UAAU,OAAO,IAAI,IAAI,CAAC;AAAA,EAClE,SAAS,GAAQ;AACf,UAAM,MAAM,GAAG,WAAW,OAAO,CAAC;AAClC,QAAI,KAAK;AACP,cAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,SAAS,MAAM,oBAAoB,SAAS,IAAI,CAAC,CAAC;AAAA;AAEtF,cAAQ;AAAA,QACN,cAAAA,QAAM,IAAI,oCAAoC;AAAA,QAC9C;AAAA,QACA;AAAA,MACF;AACF,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,iEAAiE,EAC7E,SAAS,YAAY,oEAAoE,EACzF,OAAO,uBAAuB,4DAA4D,EAC1F,OAAO,UAAU,6CAA6C,KAAK,EACnE,OAAO,YAAY,oCAAoC,KAAK,EAC5D,OAAO,OAAO,QAA4B,SAAc;AACvD,MAAI;AAGF,QAAI,SAAS;AACb,QAAI,CAAC,QAAQ;AACX,YAAM,MAAM,MAAM,WAAW,KAAK,MAAM;AACxC,eAAS,KAAK;AAAA,IAChB;AACA,QAAI,CAAC,QAAQ;AACX,YAAM,MAAM;AACZ,UAAI,KAAK;AACP,gBAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,SAAS,MAAM,mBAAmB,SAAS,IAAI,CAAC,CAAC;AAAA,UAClF,SAAQ,MAAM,cAAAA,QAAM,IAAI,kCAAkC,GAAG,GAAG;AACrE,cAAQ,KAAK,CAAC;AACd;AAAA,IACF;AAEA,UAAM,WAAW,IAAI,gCAAe,MAAM;AAG1C,UAAM,WAAW,MAAM,SAAS,QAAQ;AAAA,MACtC,kBAAkB;AAAA,MAClB,qBAAqB;AAAA,IACvB,CAAC;AACD,UAAM,SAAS,kBAAkB,UAAU,MAAM;AAEjD,QAAI,KAAK,KAAM,SAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,QACrD,SAAQ,IAAI,mBAAmB,MAAM,CAAC;AAK3C,QAAI,OAAO,SAAS,KAAK,CAAC,MAAM,EAAE,UAAU,OAAO,GAAG;AACpD,cAAQ,KAAK,CAAC;AACd;AAAA,IACF;AAIA,YAAQ,KAAK,KAAK,UAAU,OAAO,SAAS,SAAS,IAAI,CAAC;AAAA,EAC5D,SAAS,GAAQ;AACf,UAAM,MAAM,GAAG,WAAW,OAAO,CAAC;AAClC,QAAI,KAAK;AACP,cAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,SAAS,MAAM,mBAAmB,SAAS,IAAI,CAAC,CAAC;AAAA;AAErF,cAAQ;AAAA,QACN,cAAAA,QAAM,IAAI,kCAAkC;AAAA,QAC5C;AAAA,QACA;AAAA,MACF;AACF,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,UAAU,EAClB,YAAY,2CAA2C,EACvD,OAAO,uBAAuB,qBAAqB,EACnD;AAAA,EACC;AAAA,EACA;AACF,EACC,OAAO,OAAO,SAAc;AAC3B,MAAI;AACF,UAAM,MAAM,MAAM,WAAW,KAAK,MAAM;AACxC,QAAI,CAAC,KAAK;AACR,cAAQ;AAAA,QACN,cAAAA,QAAM,IAAI,yEAAyE;AAAA,MACrF;AACA,cAAQ,KAAK,CAAC;AACd;AAAA,IACF;AACA,UAAM,WAAW,IAAI,gCAAe,IAAI,MAAM;AAC9C,UAAM,cAAU,WAAAC,SAAI,cAAc,EAAE,MAAM;AAC1C,UAAM,KAAK,KAAK,IAAI;AACpB,UAAM,WAAW,MAAM,SAAS,QAAQ;AAAA,MACtC,kBAAkB,IAAI,SAAS;AAAA,MAC/B,qBAAqB,IAAI,SAAS;AAAA,MAClC,2BAA2B,IAAI,SAAS;AAAA,IAC1C,CAAC;AAID,YAAQ,QAAQ,wBAAwB,KAAK,IAAI,IAAI,EAAE,IAAI;AAO3D,UAAM,WAAW,cAAc,SAAS,QAAQ,IAAI,OAAO;AAG3D,UAAM,iBAAiB,oBAAoB,SAAS,QAAQ,GAAG;AAC/D,aAAS,SAAS,aAAa,SAAS,QAAQ,GAAG;AACnD,eAAW,KAAK,CAAC,GAAG,SAAS,UAAU,GAAG,cAAc,EAAG,SAAQ,KAAK,cAAAD,QAAM,OAAO,CAAC,CAAC;AACvF,sBAAkB,SAAS,MAAM;AAGjC,UAAM,YAAY,2BAA2B,GAAG;AAChD,UAAM,cAAc,KAAK,QAAQ,MAAM,YAAY,SAAS,IAAI;AAChE,UAAM,WAAW,IAAI,oBAAAG,QAAY;AAAA,MAC/B,EAAE,YAAY,KAAK;AAAA,MACnB,oBAAAA,QAAY,QAAQ;AAAA,IACtB;AACA,UAAM,QAAQ,SAAS,OAAO,UAAU;AACxC,aAAS,MAAM,OAAO,CAAC;AAMvB,UAAM,cACJ,IAAI,WAAW,KAAK,CAAC,MAAwB,EAAE,SAAS,SAAS,GAAG,QAAQ;AAC9E,eAAW,KAAK,IAAI,YAAY;AAC9B,UAAI,EAAE,SAAS,QAAQ;AACrB,cAAM,MAAM,IAAI,oCAAc,QAAQ;AACtC,cAAM,EAAE,MAAM,IAAI,MAAM,IAAI,SAAS;AAAA,UACnC,WAAW,IAAI;AAAA,UACf,UAAU,EAAE;AAAA,UACZ,kBAAkB,EAAE;AAAA,UACpB,QAAQ,EAAE;AAAA,UACV,cAAc,EAAE;AAAA,UAChB,QAAQ,EAAE;AAAA,UACV,iBAAiB,EAAE;AAAA,UACnB,iBAAiB,EAAE;AAAA,UACnB,YAAY,EAAE;AAAA;AAAA;AAAA,UAGd,mBAAmB,EAAE;AAAA,UACrB;AAAA,UACA,YAAY,CAAC,EAAE,MAAM,MAAM,SAAS,OAAO,KAAK;AAAA,QAClD,CAAC;AACD,iBAAS,KAAK;AACd,uBAAAF,SAAI,EAAE,QAAQ,cAAAD,QAAM,MAAM,cAAc,EAAE,IAAI,MAAM,MAAM,MAAM,QAAQ,CAAC;AACzE,cAAM,QAAQ,CAAC,MAAc,QAAQ,IAAI,OAAO,cAAAA,QAAM,KAAK,CAAC,CAAC,CAAC;AAAA,MAChE,WAAW,EAAE,SAAS,QAAQ;AAC5B,YAAI;AAOF,gBAAM,EAAE,eAAAI,eAAc,IAAI,MAAM;AAAA,YAC9B;AAAA,YACA,MAAM;AAAA,UACR;AACA,gBAAM,MAAM,IAAIA,eAAc,QAAQ;AACtC,gBAAM,EAAE,MAAM,IAAI,MAAM,IAAI,SAAS;AAAA,YACnC,GAAG,YAAY,GAAG,KAAK,WAAW;AAAA,YAClC,YAAY,CAAC,EAAE,MAAM,MAAyB,SAAS,OAAO,KAAK;AAAA,UACrE,CAAC;AACD,mBAAS,KAAK;AACd,yBAAAH,SAAI,EAAE,QAAQ,cAAAD,QAAM,MAAM,qBAAqB,MAAM,MAAM,QAAQ,CAAC;AACpE,gBAAM,QAAQ,CAAC,MAAc,QAAQ,IAAI,OAAO,cAAAA,QAAM,KAAK,CAAC,CAAC,CAAC;AAAA,QAChE,SAAS,GAAQ;AACf,mBAAS,KAAK;AACd,iCAAuB,EAAE,MAAM,CAAC;AAChC,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF,WAAW,EAAE,SAAS,WAAW;AAC/B,YAAI;AACF,gBAAM,EAAE,iBAAiB,IAAI,MAAM;AAAA,YACjC;AAAA,YACA,MAAM,OAAO,yBAAyB;AAAA,UACxC;AACA,gBAAM,MAAM,IAAI,iBAAiB,QAAQ;AACzC,gBAAM,SAAS,EAAE,QAAQ;AACzB,gBAAM,QAAQ,MAAM,IAAI,SAAS;AAAA,YAC/B,QAAQ;AAAA,YACR,cAAc,EAAE;AAAA,YAChB,QAAQ,EAAE;AAAA,YACV,YAAY,EAAE;AAAA,YACd,cAAc,EAAE;AAAA,YAChB,kBAAkB,EAAE;AAAA,YACpB,iBAAiB,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,YAKnB,mBAAmB,EAAE;AAAA,UACvB,CAAC;AACD,mBAAS,KAAK;AACd,yBAAAC,SAAI,EAAE,QAAQ,cAAAD,QAAM,MAAM,wBAAwB,MAAM,MAAM,QAAQ,CAAC;AACvE,gBAAM,QAAQ,CAAC,MAAc,QAAQ,IAAI,OAAO,cAAAA,QAAM,KAAK,CAAC,CAAC,CAAC;AAAA,QAChE,SAAS,GAAQ;AACf,mBAAS,KAAK;AACd,iCAAuB,EAAE,MAAM,CAAC;AAChC,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF,WAAW,EAAE,SAAS,OAAO;AAC3B,YAAI;AACF,gBAAM,EAAE,aAAa,IAAI,MAAM;AAAA,YAC7B;AAAA,YACA,MAAM,OAAO,qBAAqB;AAAA,UACpC;AACA,gBAAM,MAAM,IAAI,aAAa,QAAQ;AACrC,gBAAM,SAAS,EAAE,QAAQ;AAGzB,gBAAM,QAAQ,MAAM,IAAI;AAAA,YACtB,kBAAkB,GAAG,KAAK,QAAQ,EAAE,aAAa,MAAM,MAAM,KAAK,CAAC;AAAA,UACrE;AACA,mBAAS,KAAK;AACd,yBAAAC,SAAI,EAAE,QAAQ,cAAAD,QAAM,MAAM,oBAAoB,MAAM,MAAM,QAAQ,CAAC;AACnE,gBAAM,QAAQ,CAAC,MAAc,QAAQ,IAAI,OAAO,cAAAA,QAAM,KAAK,CAAC,CAAC,CAAC;AAAA,QAChE,SAAS,GAAQ;AACf,mBAAS,KAAK;AACd,iCAAuB,EAAE,MAAM,CAAC;AAChC,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF,WAAW,EAAE,SAAS,WAAW;AAC/B,YAAI;AACF,gBAAM,EAAE,iBAAiB,IAAI,MAAM;AAAA,YACjC;AAAA,YACA,MAAM,OAAO,yBAAyB;AAAA,UACxC;AACA,gBAAM,MAAM,IAAI,iBAAiB,QAAQ;AACzC,gBAAM,SAAS,EAAE,QAAQ;AACzB,gBAAM,QAAQ,MAAM,IAAI;AAAA,YACtB,kBAAkB,GAAG,KAAK,QAAQ,EAAE,aAAa,KAAK,CAAC;AAAA,UACzD;AACA,mBAAS,KAAK;AACd,yBAAAC,SAAI,EAAE,QAAQ,cAAAD,QAAM,MAAM,wBAAwB,MAAM,MAAM,QAAQ,CAAC;AACvE,gBAAM,QAAQ,CAAC,MAAc,QAAQ,IAAI,OAAO,cAAAA,QAAM,KAAK,CAAC,CAAC,CAAC;AAAA,QAChE,SAAS,GAAQ;AACf,mBAAS,KAAK;AACd,iCAAuB,EAAE,MAAM,CAAC;AAChC,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF,WAAW,EAAE,SAAS,WAAW;AAC/B,YAAI;AACF,gBAAM,EAAE,iBAAiB,IAAI,MAAM;AAAA,YACjC;AAAA,YACA,MAAM,OAAO,yBAAyB;AAAA,UACxC;AACA,gBAAM,MAAM,IAAI,iBAAiB,QAAQ;AACzC,gBAAM,SAAS,EAAE,QAAQ;AACzB,gBAAM,QAAQ,MAAM,IAAI;AAAA,YACtB,kBAAkB,GAAG,KAAK,QAAQ,EAAE,aAAa,MAAM,CAAC;AAAA,UAC1D;AACA,mBAAS,KAAK;AACd,yBAAAC,SAAI,EAAE,QAAQ,cAAAD,QAAM,MAAM,wBAAwB,MAAM,MAAM,QAAQ,CAAC;AACvE,gBAAM,QAAQ,CAAC,MAAc,QAAQ,IAAI,OAAO,cAAAA,QAAM,KAAK,CAAC,CAAC,CAAC;AAAA,QAChE,SAAS,GAAQ;AACf,mBAAS,KAAK;AACd,iCAAuB,EAAE,MAAM,CAAC;AAChC,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF,WAAW,EAAE,SAAS,eAAe;AACnC,YAAI;AAKF,gBAAM,EAAE,qBAAAK,qBAAoB,IAAI,MAAM;AAAA,YACpC;AAAA,YACA,MAAM;AAAA,UACR;AACA,gBAAM,MAAM,IAAIA,qBAAoB,QAAQ;AAC5C,gBAAM,SAAS,EAAE,QAAQ;AACzB,gBAAM,QAAQ,MAAM,IAAI,SAAS,kBAAkB,GAAG,KAAK,MAAM,CAAU;AAC3E,mBAAS,KAAK;AACd,yBAAAJ,SAAI,EAAE,QAAQ,cAAAD,QAAM,MAAM,4BAA4B,MAAM,MAAM,QAAQ,CAAC;AAC3E,gBAAM,QAAQ,CAAC,MAAc,QAAQ,IAAI,OAAO,cAAAA,QAAM,KAAK,CAAC,CAAC,CAAC;AAAA,QAChE,SAAS,GAAQ;AACf,mBAAS,KAAK;AACd,iCAAuB,EAAE,MAAM,CAAC;AAChC,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF,WAAW,EAAE,SAAS,WAAW;AAC/B,YAAI;AACF,gBAAM,EAAE,iBAAiB,IAAI,MAAM;AAAA,YACjC;AAAA,YACA,MAAM,OAAO,yBAAyB;AAAA,UACxC;AACA,gBAAM,MAAM,IAAI,iBAAiB,QAAQ;AACzC,gBAAM,SAAS,EAAE,QAAQ;AACzB,gBAAM,QAAQ,MAAM,IAAI;AAAA,YACtB,kBAAkB,GAAG,KAAK,QAAQ;AAAA,cAChC,aAAa;AAAA,cACb,gBAAgB;AAAA,YAClB,CAAC;AAAA,UACH;AACA,mBAAS,KAAK;AACd,yBAAAC,SAAI,EAAE,QAAQ,cAAAD,QAAM,MAAM,wBAAwB,MAAM,MAAM,QAAQ,CAAC;AACvE,gBAAM,QAAQ,CAAC,MAAc,QAAQ,IAAI,OAAO,cAAAA,QAAM,KAAK,CAAC,CAAC,CAAC;AAAA,QAChE,SAAS,GAAQ;AACf,mBAAS,KAAK;AACd,iCAAuB,EAAE,MAAM,CAAC;AAChC,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF,WAAW,EAAE,SAAS,UAAU;AAC9B,YAAI;AACF,gBAAM,EAAE,iBAAAM,iBAAgB,IAAI,MAAM;AAAA,YAChC;AAAA,YACA,MAAM;AAAA,UACR;AACA,gBAAM,MAAM,IAAIA,iBAAgB,QAAQ;AACxC,gBAAM,SAAS,EAAE,QAAQ;AACzB,gBAAM,QAAQ,MAAM,IAAI;AAAA,YACtB,kBAAkB,GAAG,KAAK,QAAQ,EAAE,aAAa,KAAK,CAAC;AAAA,UACzD;AACA,mBAAS,KAAK;AACd,yBAAAL,SAAI,EAAE,QAAQ,cAAAD,QAAM,MAAM,uBAAuB,MAAM,MAAM,QAAQ,CAAC;AACtE,gBAAM,QAAQ,CAAC,MAAc,QAAQ,IAAI,OAAO,cAAAA,QAAM,KAAK,CAAC,CAAC,CAAC;AAAA,QAChE,SAAS,GAAQ;AACf,mBAAS,KAAK;AACd,iCAAuB,EAAE,MAAM,CAAC;AAChC,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AACA,QAAI,aAAa;AACf,YAAM,QAAQ,MAAM,YAAY,SAAS;AACzC,YAAM,QAAQ,cAAc,aAAa,KAAK;AAE9C,YAAM,gBAAgB,aAAa,KAAK;AAExC,UAAI,MAAM,QAAQ;AAChB,gBAAQ,MAAM,cAAAA,QAAM,IAAI;AAAA,mCAAsC,MAAM,MAAM,YAAY,CAAC;AACvF,mBAAW,KAAK,OAAO;AACrB,gBAAM,OAAO,EAAE,WAAW,UAAU,MAAM,EAAE,WAAW,YAAY,MAAM;AACzE,kBAAQ;AAAA,YACN,KAAK,IAAI,IAAI,cAAAA,QAAM,OAAO,EAAE,OAAO,OAAO,CAAC,CAAC,CAAC,IAAS,eAAS,QAAQ,IAAI,GAAG,EAAE,IAAI,CAAC;AAAA,UACvF;AAAA,QACF;AACA,gBAAQ;AAAA,UACN,cAAAA,QAAM;AAAA,YACJ;AAAA,UACF;AAAA,QACF;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,cAAQ,IAAI,cAAAA,QAAM,MAAM,iCAAiC,CAAC;AAC1D;AAAA,IACF;AAEA,QAAI,IAAI,WAAW,QAAQ;AACzB,8BAAwB,EAAE,QAAQ,WAAW,CAAC;AAAA,IAChD;AAAA,EACF,SAAS,GAAQ;AACf,YAAQ;AAAA,MACN,cAAAA,QAAM,IAAI,iCAAiC;AAAA,MAC3C,GAAG,WAAW;AAAA,MACd;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,eAAe,EACvB,SAAS,YAAY,6BAA6B,EAClD,OAAO,sBAAsB,oBAAoB,SAAS,EAC1D,OAAO,qBAAqB,iBAAiB,UAAU,EACvD,OAAO,sBAAsB,4BAA4B,EACzD,OAAO,OAAO,QAAgB,SAAc;AAC3C,MAAI;AACF,UAAM,WAAW,IAAI,gCAAe,MAAM;AAC1C,UAAM,WAAW,MAAM,SAAS,QAAQ;AAAA,MACtC,kBAAkB,CAAC,CAAC,KAAK;AAAA,MACzB,qBAAqB;AAAA,IACvB,CAAC;AACD,UAAM,MAAM,IAAI,oCAAc,QAAQ;AACtC,UAAM,EAAE,MAAM,IAAI,MAAM,IAAI,SAAS;AAAA,MACnC,WAAW,KAAK;AAAA,MAChB,UAAU,KAAK;AAAA,MACf,kBAAkB,CAAC,CAAC,KAAK;AAAA,IAC3B,CAAC;AACD,YAAQ,IAAI,cAAAA,QAAM,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,MAAM,cAAAA,QAAM,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AACjF,4BAAwB,EAAE,QAAQ,gBAAgB,CAAC;AAAA,EACrD,SAAS,GAAQ;AACf,YAAQ,MAAM,cAAAA,QAAM,IAAI,uBAAuB,GAAG,GAAG,WAAW,CAAC;AACjE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,eAAe,EACvB,SAAS,YAAY,6BAA6B,EAClD,OAAO,sBAAsB,oBAAoB,SAAS,EAC1D,OAAO,qBAAqB,sBAAsB,UAAU,EAC5D,OAAO,sBAAsB,4BAA4B,EACzD,OAAO,uBAAuB,sCAAsC,cAAc,EAClF,OAAO,OAAO,QAAgB,SAAc;AAC3C,MAAI;AACF,UAAM,WAAW,IAAI,gCAAe,MAAM;AAC1C,UAAM,WAAW,MAAM,SAAS,QAAQ;AAAA,MACtC,kBAAkB,CAAC,CAAC,KAAK;AAAA,MACzB,qBAAqB;AAAA,IACvB,CAAC;AACD,UAAM,EAAE,eAAAI,eAAc,IAAI,MAAM;AAAA,MAC9B;AAAA,MACA,MAAM;AAAA,IACR;AACA,UAAM,MAAM,IAAIA,eAAc,QAAQ;AACtC,UAAM,EAAE,MAAM,IAAI,MAAM,IAAI,SAAS;AAAA,MACnC,WAAW,KAAK;AAAA,MAChB,UAAU,KAAK;AAAA,MACf,kBAAkB,CAAC,CAAC,KAAK;AAAA;AAAA;AAAA,MAGzB,aAAa,KAAK;AAAA,IACpB,CAAC;AACD,YAAQ,IAAI,cAAAJ,QAAM,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,MAAc,cAAAA,QAAM,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AACzF,4BAAwB,EAAE,QAAQ,gBAAgB,CAAC;AAAA,EACrD,SAAS,GAAQ;AACf,2BAAuB,QAAQ,CAAC;AAChC,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,OAAO,EACf,YAAY,wCAAwC,EACpD,OAAO,uBAAuB,qBAAqB,EACnD,OAAO,qBAAqB,iDAAiD,KAAK,EAClF,OAAO,mBAAmB,eAAe,KAAK,EAC9C,OAAO,UAAU,kBAAkB,KAAK,EACxC,OAAO,UAAU,8CAA8C,KAAK,EACpE,OAAO,OAAO,SAAc;AAC3B,MAAI,MAAM,MAAM,WAAW,KAAK,MAAM;AACtC,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,cAAAA,QAAM,IAAI,0DAA0D,CAAC;AACnF,YAAQ,KAAK,CAAC;AACd;AAAA,EACF;AAEA,QAAM,MAAM,CAAC,MAAmB,cAAQ,QAAQ,IAAI,GAAG,CAAC;AACxD,QAAM,WAAW,CAAC,OAAe,WAAmB;AAClD,UAAM,MAAW,eAAS,QAAQ,KAAK;AACvC,WAAO,CAAC,CAAC,OAAO,CAAC,IAAI,WAAW,IAAI,KAAK,CAAM,iBAAW,GAAG;AAAA,EAC/D;AAEA,QAAM,iBAAiB,IAAI,IAAY,2BAA2B,GAAG,EAAE,IAAI,GAAG,CAAC;AAC/E,QAAM,iBAAiB,IAAI,IAAY,oBAAoB,GAAG,EAAE,IAAI,GAAG,CAAC;AAExE,QAAM,qBAAqB,CAACO,UAAuC,SAAsB;AACvF,UAAM,MAAgB,CAAC;AACvB,UAAM,MAAgB,CAAC;AACvB,eAAW,KAAK,KAAM,KAAI,CAAC,eAAe,IAAI,CAAC,EAAG,KAAI,KAAK,CAAC;AAC5D,eAAW,KAAK,eAAgB,KAAI,CAAC,KAAK,IAAI,CAAC,EAAG,KAAI,KAAK,CAAC;AAC5D,QAAI,IAAI,OAAQ,CAAAA,SAAQ,IAAI,GAAG;AAC/B,QAAI,IAAI,OAAQ,CAAAA,SAAQ,QAAQ,GAAG;AACnC,mBAAe,MAAM;AACrB,SAAK,QAAQ,CAAC,MAAM,eAAe,IAAI,CAAC,CAAC;AAAA,EAC3C;AAEA,QAAM,wBAAwB,CAAC,WAAuB;AACpD,mBAAe,MAAM;AACrB,eAAW,KAAK,2BAA2B,MAAM,EAAG,gBAAe,IAAI,IAAI,CAAC,CAAC;AAAA,EAC/E;AAKA,QAAM,qBAAqB,oBAAI,IAAI,CAAC,OAAO,QAAQ,OAAO,QAAQ,MAAM,CAAC;AAEzE,QAAM,YAAY,CAAC,GAAW,UAAuC;AACnE,UAAM,OAAO,IAAI,CAAC;AAClB,eAAW,OAAO,gBAAgB;AAChC,UAAI,SAAS,OAAO,SAAS,MAAM,GAAG,EAAG,QAAO;AAAA,IAClD;AAEA,QAAI,OAAO,YAAY,EAAG,QAAO;AACjC,UAAM,MAAW,cAAQ,IAAI;AAG7B,QAAI,CAAC,IAAK,QAAO;AACjB,WAAO,CAAC,mBAAmB,IAAI,GAAG;AAAA,EACpC;AAEA,QAAM,UAAU,gBAAAC,QAAS,MAAM,MAAM,KAAK,cAAc,GAAG;AAAA,IACzD,eAAe;AAAA,IACf,kBAAkB,EAAE,oBAAoB,KAAK,cAAc,GAAG;AAAA,IAC9D,YAAY,CAAC,CAAC,KAAK;AAAA,IACnB,SAAS;AAAA,EACX,CAAC;AAED,QAAM,aAAa,CAAC,MAAmC,SAAiB;AACtE,QAAI,KAAK,KAAM,SAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,WAAW,MAAM,KAAK,CAAC,CAAC;AAAA,EAC7E;AAEA,UACG,GAAG,OAAO,CAAC,MAAM;AAChB,eAAW,OAAO,CAAC;AACnB,YAAQ,CAAC;AAAA,EACX,CAAC,EACA,GAAG,UAAU,CAAC,MAAM;AACnB,eAAW,UAAU,CAAC;AACtB,YAAQ,CAAC;AAAA,EACX,CAAC,EACA,GAAG,UAAU,CAAC,MAAM;AACnB,eAAW,UAAU,CAAC;AACtB,YAAQ,CAAC;AAAA,EACX,CAAC;AAEH,MAAI,YAAsB,CAAC;AAE3B,QAAM,MAAM,YAAY;AACtB,QAAI;AACF,YAAM,WAAW,MAAM,WAAW,KAAK,MAAM;AAC7C,UAAI,CAAC,SAAU,OAAM,IAAI,MAAM,kCAAkC;AACjE,YAAM;AAEN,4BAAsB,GAAG;AACzB,YAAM,cAAc,IAAI,IAAY,oBAAoB,GAAG,EAAE,IAAI,GAAG,CAAC;AACrE,yBAAmB,SAAS,WAAW;AAEvC,UAAI,CAAC,KAAK,KAAM,SAAQ,MAAM;AAE9B,UAAI,KAAK,MAAM;AACb,gBAAQ;AAAA,UACN,KAAK,UAAU;AAAA,YACb,OAAO;AAAA,YACP,SAAS,MAAM,KAAK,cAAc;AAAA,YAClC,SAAS,MAAM,KAAK,cAAc;AAAA,UACpC,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,WAAW,IAAI,gCAAe,IAAI,MAAM;AAC9C,YAAM,WAAW,MAAM,SAAS,QAAQ;AAAA,QACtC,kBAAkB,IAAI,SAAS;AAAA,QAC/B,qBAAqB,IAAI,SAAS;AAAA,QAClC,2BAA2B,IAAI,SAAS;AAAA,MAC1C,CAAC;AAID,YAAM,WAAW,cAAc,SAAS,QAAQ,IAAI,OAAO;AAC3D,YAAM,iBAAiB,oBAAoB,SAAS,QAAQ,GAAG;AAC/D,eAAS,SAAS,aAAa,SAAS,QAAQ,GAAG;AACnD,UAAI,CAAC,KAAK;AACR,mBAAW,KAAK,CAAC,GAAG,SAAS,UAAU,GAAG,cAAc,EAAG,SAAQ,KAAK,cAAAR,QAAM,OAAO,CAAC,CAAC;AACzF,UAAI,CAAC,KAAK,KAAM,mBAAkB,SAAS,MAAM;AAEjD,UAAI,KAAK,aAAa,WAAW;AAC/B,YAAI,KAAK,MAAM;AACb,kBAAQ;AAAA,YACN,KAAK,UAAU;AAAA,cACb,OAAO;AAAA,cACP,QAAQ,SAAS;AAAA,cACjB,QAAQ,SAAS,OAAO;AAAA,YAC1B,CAAC;AAAA,UACH;AAAA,QACF,OAAO;AACL,kBAAQ,IAAI,cAAAA,QAAM,MAAM,mBAAmB,CAAC;AAAA,QAC9C;AACA;AAAA,MACF;AAEA,YAAM,WAAqB,CAAC;AAK5B,YAAM,cACJ,IAAI,WAAW,KAAK,CAAC,MAAwB,EAAE,SAAS,SAAS,GAAG,QACpE;AAEF,YAAM,iBAAyC;AAAA,QAC7C,iBAAiB;AAAA,QACjB,iBAAiB;AAAA,MACnB;AAEA,iBAAW,KAAK,IAAI,YAAY;AAC9B,YAAI,KAAK,aAAa,SAAS,eAAe,KAAK,QAAQ,MAAM,EAAE,MAAM;AACvE;AAAA,QACF;AAEA,YAAI,EAAE,SAAS,QAAQ;AACrB,gBAAM,MAAM,IAAI,oCAAc,QAAQ;AACtC,gBAAM,EAAE,MAAM,IAAI,MAAM,IAAI,SAAS;AAAA,YACnC,WAAW,IAAI;AAAA,YACf,UAAU,EAAE;AAAA,YACZ,kBAAkB,EAAE;AAAA,YACpB,QAAQ,EAAE;AAAA,YACV,cAAc,EAAE;AAAA,YAChB,QAAQ,EAAE;AAAA,YACV,iBAAiB,EAAE;AAAA,YACnB,iBAAiB,EAAE;AAAA,YACnB,YAAY,EAAE;AAAA,YACd,mBAAmB,EAAE;AAAA,YACrB;AAAA,UACF,CAAC;AACD,eAAK,OACD,QAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,qBAAqB,MAAM,EAAE,MAAM,MAAM,CAAC,CAAC,IAC/E,QAAQ;AAAA,YACN,cAAAA,QAAM,MAAM,cAAc,EAAE,IAAI,IAAI;AAAA,YACpC,MAAM,IAAI,CAAC,MAAc,cAAAA,QAAM,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,UACnD;AACJ,mBAAS,KAAK,GAAG,KAAK;AAAA,QACxB,WAAW,EAAE,SAAS,QAAQ;AAC5B,cAAI;AACF,kBAAM,EAAE,eAAAI,eAAc,IAAI,MAAM;AAAA,cAC9B;AAAA,cACA,MAAM;AAAA,YACR;AACA,kBAAM,MAAM,IAAIA,eAAc,QAAQ;AAGtC,kBAAM,EAAE,MAAM,IAAI,MAAM,IAAI,SAAS,YAAY,GAAG,KAAK,WAAW,CAAC;AACrE,iBAAK,OACD,QAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,qBAAqB,MAAM,EAAE,MAAM,MAAM,CAAC,CAAC,IAC/E,QAAQ;AAAA,cACN,cAAAJ,QAAM,MAAM,qBAAqB,MAAM,MAAM,QAAQ;AAAA,cACrD,MAAM,IAAI,CAAC,MAAc,cAAAA,QAAM,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,YACnD;AACJ,qBAAS,KAAK,GAAG,KAAK;AAAA,UACxB,SAAS,GAAQ;AACf,mCAAuB,EAAE,MAAM,CAAC;AAChC;AAAA,UACF;AAAA,QACF,WAAW,EAAE,SAAS,WAAW;AAC/B,cAAI;AACF,kBAAM,EAAE,iBAAiB,IAAI,MAAM;AAAA,cACjC;AAAA,cACA,MAAM,OAAO,yBAAyB;AAAA,YACxC;AACA,kBAAM,MAAM,IAAI,iBAAiB,QAAQ;AACzC,kBAAM,SAAS,EAAE,QAAQ;AACzB,kBAAM,QAAQ,MAAM,IAAI,SAAS;AAAA,cAC/B,QAAQ;AAAA,cACR,cAAc,EAAE;AAAA,cAChB,QAAQ,EAAE;AAAA,cACV,YAAY,EAAE;AAAA,cACd,cAAc,EAAE;AAAA,cAChB,kBAAkB,EAAE;AAAA,cACpB,iBAAiB,EAAE;AAAA,cACnB,mBAAmB,EAAE;AAAA,YACvB,CAAC;AACD,iBAAK,OACD,QAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,qBAAqB,MAAM,EAAE,MAAM,MAAM,CAAC,CAAC,IAC/E,QAAQ;AAAA,cACN,cAAAA,QAAM,MAAM,wBAAwB,MAAM,MAAM,QAAQ;AAAA,cACxD,MAAM,IAAI,CAAC,MAAc,cAAAA,QAAM,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,YACnD;AACJ,qBAAS,KAAK,GAAG,KAAK;AAAA,UACxB,SAAS,GAAQ;AACf,mCAAuB,EAAE,MAAM,CAAC;AAChC;AAAA,UACF;AAAA,QACF,WAAW,EAAE,SAAS,OAAO;AAC3B,cAAI;AACF,kBAAM,EAAE,aAAa,IAAI,MAAM;AAAA,cAC7B;AAAA,cACA,MAAM,OAAO,qBAAqB;AAAA,YACpC;AACA,kBAAM,MAAM,IAAI,aAAa,QAAQ;AACrC,kBAAM,SAAS,EAAE,QAAQ;AAQzB,kBAAM,QAAQ,MAAM,IAAI;AAAA,cACtB,kBAAkB,GAAG,KAAK,QAAQ,EAAE,aAAa,MAAM,MAAM,KAAK,CAAC;AAAA,YACrE;AACA,iBAAK,OACD,QAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,qBAAqB,MAAM,EAAE,MAAM,MAAM,CAAC,CAAC,IAC/E,QAAQ;AAAA,cACN,cAAAA,QAAM,MAAM,oBAAoB,MAAM,MAAM,QAAQ;AAAA,cACpD,MAAM,IAAI,CAAC,MAAc,cAAAA,QAAM,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,YACnD;AACJ,qBAAS,KAAK,GAAG,KAAK;AAAA,UACxB,SAAS,GAAQ;AACf,mCAAuB,EAAE,MAAM,CAAC;AAChC;AAAA,UACF;AAAA,QACF,WAAW,EAAE,SAAS,WAAW;AAC/B,cAAI;AACF,kBAAM,EAAE,iBAAiB,IAAI,MAAM;AAAA,cACjC;AAAA,cACA,MAAM,OAAO,yBAAyB;AAAA,YACxC;AACA,kBAAM,MAAM,IAAI,iBAAiB,QAAQ;AACzC,kBAAM,SAAS,EAAE,QAAQ;AAMzB,kBAAM,QAAQ,MAAM,IAAI;AAAA,cACtB,kBAAkB,GAAG,KAAK,QAAQ,EAAE,aAAa,KAAK,CAAC;AAAA,YACzD;AACA,iBAAK,OACD,QAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,qBAAqB,MAAM,EAAE,MAAM,MAAM,CAAC,CAAC,IAC/E,QAAQ;AAAA,cACN,cAAAA,QAAM,MAAM,wBAAwB,MAAM,MAAM,QAAQ;AAAA,cACxD,MAAM,IAAI,CAAC,MAAc,cAAAA,QAAM,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,YACnD;AACJ,qBAAS,KAAK,GAAG,KAAK;AAAA,UACxB,SAAS,GAAQ;AACf,mCAAuB,EAAE,MAAM,CAAC;AAChC;AAAA,UACF;AAAA,QACF,WAAW,EAAE,SAAS,WAAW;AAC/B,cAAI;AACF,kBAAM,EAAE,iBAAiB,IAAI,MAAM;AAAA,cACjC;AAAA,cACA,MAAM,OAAO,yBAAyB;AAAA,YACxC;AACA,kBAAM,MAAM,IAAI,iBAAiB,QAAQ;AACzC,kBAAM,SAAS,EAAE,QAAQ;AAMzB,kBAAM,QAAQ,MAAM,IAAI;AAAA,cACtB,kBAAkB,GAAG,KAAK,QAAQ,EAAE,aAAa,MAAM,CAAC;AAAA,YAC1D;AACA,iBAAK,OACD,QAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,qBAAqB,MAAM,EAAE,MAAM,MAAM,CAAC,CAAC,IAC/E,QAAQ;AAAA,cACN,cAAAA,QAAM,MAAM,wBAAwB,MAAM,MAAM,QAAQ;AAAA,cACxD,MAAM,IAAI,CAAC,MAAc,cAAAA,QAAM,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,YACnD;AACJ,qBAAS,KAAK,GAAG,KAAK;AAAA,UACxB,SAAS,GAAQ;AACf,mCAAuB,EAAE,MAAM,CAAC;AAChC;AAAA,UACF;AAAA,QACF,WAAW,EAAE,SAAS,WAAW;AAC/B,cAAI;AACF,kBAAM,EAAE,iBAAiB,IAAI,MAAM;AAAA,cACjC;AAAA,cACA,MAAM,OAAO,yBAAyB;AAAA,YACxC;AACA,kBAAM,MAAM,IAAI,iBAAiB,QAAQ;AACzC,kBAAM,SAAS,EAAE,QAAQ;AAMzB,kBAAM,QAAQ,MAAM,IAAI;AAAA,cACtB,kBAAkB,GAAG,KAAK,QAAQ;AAAA,gBAChC,aAAa;AAAA,gBACb,gBAAgB;AAAA,cAClB,CAAC;AAAA,YACH;AACA,iBAAK,OACD,QAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,qBAAqB,MAAM,EAAE,MAAM,MAAM,CAAC,CAAC,IAC/E,QAAQ;AAAA,cACN,cAAAA,QAAM,MAAM,wBAAwB,MAAM,MAAM,QAAQ;AAAA,cACxD,MAAM,IAAI,CAAC,MAAc,cAAAA,QAAM,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,YACnD;AACJ,qBAAS,KAAK,GAAG,KAAK;AAAA,UACxB,SAAS,GAAQ;AACf,mCAAuB,EAAE,MAAM,CAAC;AAChC;AAAA,UACF;AAAA,QACF,WAAW,EAAE,SAAS,UAAU;AAC9B,cAAI;AACF,kBAAM,EAAE,iBAAAM,iBAAgB,IAAI,MAAM;AAAA,cAChC;AAAA,cACA,MAAM;AAAA,YACR;AACA,kBAAM,MAAM,IAAIA,iBAAgB,QAAQ;AACxC,kBAAM,SAAS,EAAE,QAAQ;AAIzB,kBAAM,QAAQ,MAAM,IAAI;AAAA,cACtB,kBAAkB,GAAG,KAAK,QAAQ,EAAE,aAAa,KAAK,CAAC;AAAA,YACzD;AACA,iBAAK,OACD,QAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,qBAAqB,MAAM,EAAE,MAAM,MAAM,CAAC,CAAC,IAC/E,QAAQ;AAAA,cACN,cAAAN,QAAM,MAAM,uBAAuB,MAAM,MAAM,QAAQ;AAAA,cACvD,MAAM,IAAI,CAAC,MAAc,cAAAA,QAAM,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,YACnD;AACJ,qBAAS,KAAK,GAAG,KAAK;AAAA,UACxB,SAAS,GAAQ;AACf,mCAAuB,EAAE,MAAM,CAAC;AAChC;AAAA,UACF;AAAA,QACF,WAAW,EAAE,SAAS,eAAe;AACnC,cAAI;AACF,kBAAM,EAAE,qBAAAK,qBAAoB,IAAI,MAAM;AAAA,cACpC;AAAA,cACA,MAAM;AAAA,YACR;AACA,kBAAM,MAAM,IAAIA,qBAAoB,QAAQ;AAC5C,kBAAM,SAAS,EAAE,QAAQ;AAGzB,kBAAM,QAAQ,MAAM,IAAI,SAAS,kBAAkB,GAAG,KAAK,MAAM,CAAU;AAC3E,iBAAK,OACD,QAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,qBAAqB,MAAM,EAAE,MAAM,MAAM,CAAC,CAAC,IAC/E,QAAQ;AAAA,cACN,cAAAL,QAAM,MAAM,4BAA4B,MAAM,MAAM,QAAQ;AAAA,cAC5D,MAAM,IAAI,CAAC,MAAc,cAAAA,QAAM,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,YACnD;AACJ,qBAAS,KAAK,GAAG,KAAK;AAAA,UACxB,SAAS,GAAQ;AACf,mCAAuB,EAAE,MAAM,CAAC;AAChC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,QAAQ,SAAS,OAAO,CAAC,MAAM,CAAC,UAAU,SAAS,CAAC,CAAC;AAC3D,YAAM,UAAU,UAAU,OAAO,CAAC,MAAM,CAAC,SAAS,SAAS,CAAC,CAAC;AAC7D,WAAK,OACD,QAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,QAAQ,OAAO,QAAQ,CAAC,CAAC,KAC5D,MAAM;AACL,YAAI,MAAM,OAAQ,SAAQ,IAAI,cAAAA,QAAM,KAAK,UAAU,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC;AACtE,YAAI,QAAQ,OAAQ,SAAQ,IAAI,cAAAA,QAAM,OAAO,YAAY,QAAQ,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,MAChF,GAAG;AACP,UAAI,SAAS,UAAU,CAAC,KAAK,MAAM;AACjC,cAAM,SACJ,KAAK,YAAY,KAAK,aAAa,QAAQ,SAAS,KAAK,QAAQ,KAAK;AACxE,gCAAwB,EAAE,OAAO,CAAC;AAAA,MACpC;AACA,kBAAY;AAAA,IACd,SAAS,GAAQ;AACf,WAAK,OACD,QAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,SAAS,SAAS,OAAO,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,IAChF,QAAQ,MAAM,cAAAA,QAAM,IAAI,wBAAwB,GAAG,GAAG,WAAW,CAAC;AAAA,IACxE;AAAA,EACF;AAEA,QAAM,YAAY,OAAO,KAAK,QAAQ,KAAK;AAC3C,MAAI,QAA+B;AACnC,QAAM,UAAU,CAAC,SAAkB;AACjC,QAAI,MAAM;AACR,YAAM,OAAO,IAAI,IAAI;AACrB,iBAAW,OAAO,gBAAgB;AAChC,YAAI,SAAS,OAAO,SAAS,MAAM,GAAG,EAAG;AAAA,MAC3C;AAAA,IACF;AACA,QAAI,MAAO,cAAa,KAAK;AAC7B,YAAQ,WAAW,KAAK,SAAS;AAAA,EACnC;AAEA,MAAI,KAAK,MAAM;AACb,YAAQ;AAAA,MACN,KAAK,UAAU;AAAA,QACb,OAAO;AAAA,QACP,SAAS,MAAM,KAAK,cAAc;AAAA,QAClC,SAAS,MAAM,KAAK,cAAc;AAAA,MACpC,CAAC;AAAA,IACH;AAAA,EACF,OAAO;AACL,YAAQ;AAAA,MACN,cAAAA,QAAM;AAAA,QACJ,kBACE,MAAM,KAAK,cAAc,EACtB,IAAI,CAAC,MAAW,eAAS,QAAQ,IAAI,GAAG,CAAC,CAAC,EAC1C,KAAK,MAAM;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAEA,UACG,GAAG,OAAO,CAAC,MAAM,QAAQ,CAAC,CAAC,EAC3B,GAAG,UAAU,CAAC,MAAM,QAAQ,CAAC,CAAC,EAC9B,GAAG,UAAU,CAAC,MAAM,QAAQ,CAAC,CAAC,EAC9B,GAAG,SAAS,CAAC,QAAQ,QAAQ,MAAM,cAAAA,QAAM,IAAI,gBAAgB,GAAG,GAAG,CAAC;AAEvE,QAAM,IAAI;AACZ,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,2BAA2B,EACvC,OAAO,aAAa,iBAAiB,EACrC,OAAO,OAAO,UAAe;AAC5B,QAAME,MAAK,MAAM,OAAO,aAAkB;AAC1C,QAAMO,QAAO,MAAM,OAAO,MAAW;AACrC,QAAM,SAASA,MAAK,QAAQ,QAAQ,IAAI,GAAG,gBAAgB;AAK3D,QAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUjB,MAAI;AACF,UAAMP,IAAG,UAAU,QAAQ,UAAU,EAAE,MAAM,KAAK,CAAC;AACnD,YAAQ,IAAI,cAAAF,QAAM,MAAM,WAAW,MAAM,EAAE,CAAC;AAAA,EAC9C,SAAS,GAAQ;AACf,YAAQ,MAAM,cAAAA,QAAM,IAAI,cAAc,GAAG,GAAG,WAAW,CAAC;AACxD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAcH,SAAS,kBAAkB,QAAmE;AAC5F,QAAM,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,yBAAyB;AACtE,MAAI,CAAC,KAAK,OAAQ;AAClB,UAAQ;AAAA,IACN,cAAAA,QAAM,OAAO;AAAA,EAAK,KAAK,MAAM,UAAU,KAAK,WAAW,IAAI,KAAK,GAAG,sBAAsB;AAAA,EAC3F;AACA,aAAW,KAAK,KAAK,MAAM,GAAG,EAAE,EAAG,SAAQ,KAAK,cAAAA,QAAM,KAAK,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9E,MAAI,KAAK,SAAS,GAAI,SAAQ,KAAK,cAAAA,QAAM,KAAK,aAAa,KAAK,SAAS,EAAE,OAAO,CAAC;AAEnF,QAAM,QAAQ,CAAC,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,OAAO,CAAC,CAAC;AAClE,aAAW,KAAK,MAAO,SAAQ,KAAK,cAAAA,QAAM,KAAK,KAAK,CAAC,EAAE,CAAC;AAIxD,UAAQ,KAAK,cAAAA,QAAM,KAAK,0CAA0C,CAAC;AACrE;AAEA,QAAQ,WAAW,QAAQ,IAAI;","names":["path","import_validation_core","fs","dist_exports","index_default","keyColumns","path","buildHeader","import_validation_core","init_dist","fs","dist_exports","index_default","ref","field","buildHeader","import_validation_core","DEFAULT_FILE_SUFFIX","init_dist","fs","path","import_analyzer","import_chalk","path","mine","raw","import_validation_core","import_validation_core","path","chalk","fs","path","import_chalk","import_node_fs","import_node_path","path","chalk","import_node_fs","path","chalk","ora","fs","cliProgress","TRPCGenerator","JsonSchemaGenerator","EffectGenerator","watcher","chokidar","path"]}