@mateusseiboth/ember-orm 0.1.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/LICENSE +21 -0
- package/README.md +125 -0
- package/dist/cli/bin.cjs +3265 -0
- package/dist/cli/bin.cjs.map +1 -0
- package/dist/cli/bin.d.cts +1 -0
- package/dist/cli/bin.d.ts +1 -0
- package/dist/cli/bin.js +3241 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/client/index.cjs +2434 -0
- package/dist/client/index.cjs.map +1 -0
- package/dist/client/index.d.cts +2 -0
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.js +2396 -0
- package/dist/client/index.js.map +1 -0
- package/dist/editor.cjs +1113 -0
- package/dist/editor.cjs.map +1 -0
- package/dist/editor.d.cts +22 -0
- package/dist/editor.d.ts +22 -0
- package/dist/editor.js +1077 -0
- package/dist/editor.js.map +1 -0
- package/dist/index-0lWi8TMM.d.ts +72 -0
- package/dist/index-BSXZjDUd.d.ts +459 -0
- package/dist/index-CKqkQhZx.d.cts +459 -0
- package/dist/index-CMeqhmVc.d.cts +72 -0
- package/dist/index-D0xIdtCl.d.cts +145 -0
- package/dist/index-D0xIdtCl.d.ts +145 -0
- package/dist/index.cjs +5013 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +288 -0
- package/dist/index.d.ts +288 -0
- package/dist/index.js +4935 -0
- package/dist/index.js.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/bin.ts","../../src/errors/index.ts","../../src/cli/commands.ts","../../src/schema/index.ts","../../src/schema/lexer.ts","../../src/schema/parser.ts","../../src/ast/index.ts","../../src/schema/validator.ts","../../src/schema/printer.ts","../../src/utils/index.ts","../../src/schema/relations-complete.ts","../../src/driver/firebird-driver.ts","../../src/driver/url.ts","../../src/driver/index.ts","../../src/sql/dialect.ts","../../src/introspect/firebird-meta.ts","../../src/introspect/type-map.ts","../../src/introspect/index.ts","../../src/generator/index.ts","../../src/generator/ts-types.ts","../../src/migrate/index.ts","../../src/migrate/diff.ts","../../src/migrate/ddl.ts","../../src/migrate/planner.ts","../../src/migrate/history.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { EmberError } from \"@ember/errors\";\nimport {\n type CliContext,\n dbPull,\n dbPush,\n format,\n generate,\n init,\n migrateDeploy,\n migrateDev,\n migrateStatus,\n validate,\n} from \"./commands\";\n\nconst HELP = `EmberORM — Prisma-like ORM for Firebird\n\nUsage: ember <command> [options]\n\nCommands:\n init Scaffold ember/schema.ember\n db pull Introspect the database into your schema\n db push Apply schema changes directly (no migration file)\n generate Generate the typed client from the schema\n migrate dev Diff, create a migration file, and apply it\n migrate deploy Apply all pending migration files\n migrate status Show applied vs pending migrations\n format Re-print the schema with canonical formatting\n validate Parse and validate the schema\n\nOptions:\n --schema <path> Path to the schema file\n --url <url> Firebird connection URL (overrides datasource/env)\n --name <name> Migration name (migrate dev)\n -h, --help Show this help\n -v, --version Show version\n`;\n\ninterface ParsedArgs {\n command: string[];\n flags: Record<string, string | boolean>;\n}\n\nfunction parseArgs(argv: string[]): ParsedArgs {\n const command: string[] = [];\n const flags: Record<string, string | boolean> = {};\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i]!;\n if (arg.startsWith(\"--\")) {\n const key = arg.slice(2);\n const next = argv[i + 1];\n if (next && !next.startsWith(\"-\")) {\n flags[key] = next;\n i++;\n } else {\n flags[key] = true;\n }\n } else if (arg === \"-h\") {\n flags.help = true;\n } else if (arg === \"-v\") {\n flags.version = true;\n } else {\n command.push(arg);\n }\n }\n return { command, flags };\n}\n\nasync function main(): Promise<number> {\n const { command, flags } = parseArgs(process.argv.slice(2));\n const ctx: CliContext = {\n cwd: process.cwd(),\n log: (m) => process.stdout.write(m + \"\\n\"),\n error: (m) => process.stderr.write(`error: ${m}\\n`),\n };\n\n if (flags.version) {\n ctx.log(readVersion());\n return 0;\n }\n if (flags.help || command.length === 0) {\n ctx.log(HELP);\n return command.length === 0 ? 1 : 0;\n }\n\n const schemaPath = typeof flags.schema === \"string\" ? flags.schema : undefined;\n const url = typeof flags.url === \"string\" ? flags.url : undefined;\n const name = typeof flags.name === \"string\" ? flags.name : undefined;\n const [first, second] = command;\n\n switch (first) {\n case \"init\":\n return init(ctx);\n case \"validate\":\n return validate(ctx, schemaPath);\n case \"format\":\n return format(ctx, schemaPath);\n case \"generate\":\n return generate(ctx, schemaPath);\n case \"db\":\n if (second === \"pull\") return dbPull(ctx, { schemaPath, url });\n if (second === \"push\") return dbPush(ctx, { schemaPath, url });\n ctx.error(`Unknown db subcommand '${second ?? \"\"}'.`);\n return 1;\n case \"migrate\":\n if (second === \"dev\") return migrateDev(ctx, { schemaPath, url, name });\n if (second === \"deploy\") return migrateDeploy(ctx, { schemaPath, url });\n if (second === \"status\") return migrateStatus(ctx, { schemaPath, url });\n ctx.error(`Unknown migrate subcommand '${second ?? \"\"}'.`);\n return 1;\n default:\n ctx.error(`Unknown command '${first}'. Run 'ember --help'.`);\n return 1;\n }\n}\n\nfunction readVersion(): string {\n // dist/cli/bin.js -> ../../package.json\n for (const candidate of [\"../../package.json\", \"../package.json\"]) {\n try {\n const url = new URL(candidate, import.meta.url);\n const pkg = JSON.parse(readFileSync(fileURLToPath(url), \"utf8\"));\n if (pkg?.version) return `ember ${pkg.version}`;\n } catch {\n // try next candidate\n }\n }\n return \"ember (unknown version)\";\n}\n\nmain()\n .then((code) => process.exit(code))\n .catch((err) => {\n if (err instanceof EmberError) {\n process.stderr.write(`error: ${err.message}\\n`);\n } else {\n process.stderr.write(`unexpected error: ${(err as Error).stack ?? err}\\n`);\n }\n process.exit(1);\n });\n","/** Base class for every error thrown by EmberORM. */\nexport class EmberError extends Error {\n constructor(message: string) {\n super(message);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Raised while lexing/parsing a `.ember` schema file. */\nexport class SchemaParseError extends EmberError {\n constructor(\n message: string,\n public readonly line: number,\n public readonly column: number,\n public readonly file?: string,\n ) {\n super(\n `${message} (at ${file ? `${file}:` : \"\"}${line}:${column})`,\n );\n }\n}\n\n/** Raised when a parsed schema is structurally invalid. */\nexport class SchemaValidationError extends EmberError {\n constructor(\n message: string,\n public readonly details: string[] = [],\n ) {\n super(\n details.length > 0 ? `${message}\\n - ${details.join(\"\\n - \")}` : message,\n );\n }\n}\n\n/** Raised when a query is malformed before it reaches the database. */\nexport class QueryValidationError extends EmberError {}\n\n/** Wraps a low-level driver/database failure with EmberORM context. */\nexport class DatabaseError extends EmberError {\n constructor(\n message: string,\n public override readonly cause?: unknown,\n public readonly sql?: string,\n ) {\n super(message);\n }\n}\n\n/** Thrown by `*OrThrow` operations when no record matches. */\nexport class RecordNotFoundError extends EmberError {\n constructor(model: string) {\n super(`No '${model}' record found matching the given criteria.`);\n }\n}\n\n/** Thrown on unique constraint violations (mapped from Firebird errors). */\nexport class UniqueConstraintError extends EmberError {\n constructor(\n public readonly target: string,\n cause?: unknown,\n ) {\n super(`Unique constraint failed on: ${target}`);\n if (cause !== undefined) this.cause = cause;\n }\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport {\n findSchemaPath,\n formatSchema,\n loadSchema,\n printSchema,\n resolveDatasourceUrl,\n} from \"@ember/schema\";\nimport {\n createDriver,\n parseConnectionUrl,\n type SqlDriver,\n} from \"@ember/driver\";\nimport { FirebirdDialect } from \"@ember/sql\";\nimport { Introspector } from \"@ember/introspect\";\nimport { writeClient } from \"@ember/generator\";\nimport { Migrator } from \"@ember/migrate\";\nimport { readFileSync } from \"node:fs\";\n\nexport interface CliContext {\n cwd: string;\n log: (msg: string) => void;\n error: (msg: string) => void;\n}\n\nconst DEFAULT_SCHEMA = \"ember/schema.ember\";\n\nconst STARTER_SCHEMA = `datasource db {\n provider = \"firebird\"\n url = env(\"DATABASE_URL\")\n}\n\ngenerator client {\n provider = \"ember-client-js\"\n output = \"../generated\"\n}\n\n/// Example model — replace with your own or run \\`ember db pull\\`.\nmodel User {\n id Int @id @default(autoincrement())\n email String @unique\n name String?\n createdAt DateTime @default(now())\n}\n`;\n\n/** `ember init` — scaffold a schema file. */\nexport function init(ctx: CliContext): number {\n const target = resolve(ctx.cwd, DEFAULT_SCHEMA);\n if (existsSync(target)) {\n ctx.error(`Schema already exists at ${target}`);\n return 1;\n }\n mkdirSync(dirname(target), { recursive: true });\n writeFileSync(target, STARTER_SCHEMA, \"utf8\");\n ctx.log(`Created ${rel(ctx.cwd, target)}`);\n ctx.log(\"Set DATABASE_URL and run `ember db pull` or `ember generate`.\");\n return 0;\n}\n\n/** `ember validate` — parse and validate the schema. */\nexport function validate(ctx: CliContext, schemaPath?: string): number {\n const path = requireSchema(ctx, schemaPath);\n if (!path) return 1;\n loadSchema(path);\n ctx.log(`Schema at ${rel(ctx.cwd, path)} is valid.`);\n return 0;\n}\n\n/**\n * `ember format` — auto-complete missing relation sides and re-print the schema\n * with canonical formatting (like Prisma's formatter).\n */\nexport function format(ctx: CliContext, schemaPath?: string): number {\n const path = requireSchema(ctx, schemaPath);\n if (!path) return 1;\n const source = readFileSync(path, \"utf8\");\n writeFileSync(path, formatSchema(source, path), \"utf8\");\n ctx.log(`Formatted ${rel(ctx.cwd, path)}`);\n return 0;\n}\n\n/** `ember generate` — emit the typed client from the schema. */\nexport function generate(ctx: CliContext, schemaPath?: string): number {\n const path = requireSchema(ctx, schemaPath);\n if (!path) return 1;\n const { document } = loadSchema(path);\n const gen = document.generators[0];\n const out = resolve(dirname(path), gen?.output ?? \"../generated\");\n const file = writeClient(document, out);\n ctx.log(`Generated client at ${rel(ctx.cwd, file)}`);\n return 0;\n}\n\n/** `ember db pull` — introspect the database and write the schema. */\nexport async function dbPull(\n ctx: CliContext,\n options: { schemaPath?: string; url?: string },\n): Promise<number> {\n const path =\n findSchemaPath(ctx.cwd, options.schemaPath) ??\n resolve(ctx.cwd, DEFAULT_SCHEMA);\n\n let url = options.url;\n let envVar = \"DATABASE_URL\";\n if (!url && existsSync(path)) {\n const { document } = loadSchema(path);\n url = resolveDatasourceUrl(document, dirname(path));\n if (document.datasource?.url.kind === \"env\") {\n envVar = document.datasource.url.value;\n }\n }\n url ??= process.env.DATABASE_URL;\n if (!url) {\n ctx.error(\n \"No database URL. Set DATABASE_URL, pass --url, or add a datasource block.\",\n );\n return 1;\n }\n\n const driver = createDriver(url);\n try {\n await driver.connect();\n const introspector = new Introspector(driver);\n const document = await introspector.introspect({\n datasource: { name: \"db\", provider: \"firebird\", envVar },\n });\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, printSchema(document), \"utf8\");\n ctx.log(\n `Introspected ${document.models.length} model(s) into ${rel(ctx.cwd, path)}`,\n );\n return 0;\n } finally {\n await driver.disconnect();\n }\n}\n\n/** `ember migrate dev [--name x]` — diff, write a migration file, apply it. */\nexport async function migrateDev(\n ctx: CliContext,\n options: { schemaPath?: string; url?: string; name?: string },\n): Promise<number> {\n return withMigrator(ctx, options, async (migrator) => {\n const result = await migrator.dev(options.name ?? \"migration\");\n if (result.empty) {\n ctx.log(\"No schema changes — database already in sync.\");\n return 0;\n }\n ctx.log(`Created and applied migration ${result.id} (${result.statements.length} step(s)).`);\n return 0;\n });\n}\n\n/** `ember migrate deploy` — apply all pending migration files. */\nexport async function migrateDeploy(\n ctx: CliContext,\n options: { schemaPath?: string; url?: string },\n): Promise<number> {\n return withMigrator(ctx, options, async (migrator) => {\n const { applied } = await migrator.deploy();\n if (applied.length === 0) {\n ctx.log(\"No pending migrations.\");\n return 0;\n }\n for (const m of applied) ctx.log(`Applied ${m.id} (${m.steps} step(s)).`);\n return 0;\n });\n}\n\n/** `ember migrate status` — show applied vs pending migrations. */\nexport async function migrateStatus(\n ctx: CliContext,\n options: { schemaPath?: string; url?: string },\n): Promise<number> {\n return withMigrator(ctx, options, async (migrator) => {\n const { applied, pending } = await migrator.status();\n ctx.log(`Applied (${applied.length}):`);\n for (const id of applied) ctx.log(` ✓ ${id}`);\n ctx.log(`Pending (${pending.length}):`);\n for (const id of pending) ctx.log(` • ${id}`);\n return 0;\n });\n}\n\n/** `ember db push` — apply the diff directly without creating a migration. */\nexport async function dbPush(\n ctx: CliContext,\n options: { schemaPath?: string; url?: string },\n): Promise<number> {\n return withMigrator(ctx, options, async (migrator) => {\n const { statements } = await migrator.push();\n if (statements.length === 0) {\n ctx.log(\"No schema changes — database already in sync.\");\n return 0;\n }\n ctx.log(`Applied ${statements.length} statement(s) to the database.`);\n return 0;\n });\n}\n\n// ---- helpers --------------------------------------------------------------\n\n/** Resolve schema + URL, open a driver, build a Migrator, and run `fn`. */\nasync function withMigrator(\n ctx: CliContext,\n options: { schemaPath?: string; url?: string },\n fn: (migrator: Migrator) => Promise<number>,\n): Promise<number> {\n const path = requireSchema(ctx, options.schemaPath);\n if (!path) return 1;\n const { document } = loadSchema(path);\n\n const url =\n options.url ??\n resolveDatasourceUrl(document, dirname(path)) ??\n process.env.DATABASE_URL;\n if (!url) {\n ctx.error(\n \"No database URL. Set DATABASE_URL, pass --url, or add a datasource block.\",\n );\n return 1;\n }\n\n const migrationsDir = resolve(dirname(path), \"migrations\");\n const config = parseConnectionUrl(url);\n const dialect = new FirebirdDialect({ version: config.version });\n const driver: SqlDriver = createDriver(config);\n try {\n await driver.connect();\n const migrator = new Migrator(driver, document, migrationsDir, dialect);\n return await fn(migrator);\n } finally {\n await driver.disconnect();\n }\n}\n\nfunction requireSchema(ctx: CliContext, schemaPath?: string): string | null {\n const path = findSchemaPath(ctx.cwd, schemaPath);\n if (!path) {\n ctx.error(\n `Schema not found. Expected ${DEFAULT_SCHEMA} (or pass --schema). Run \\`ember init\\` to create one.`,\n );\n return null;\n }\n return path;\n}\n\nfunction rel(cwd: string, target: string): string {\n return target.startsWith(cwd) ? target.slice(cwd.length + 1) : target;\n}\n","import { readFileSync, existsSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\nimport type { SchemaDocument } from \"@ember/ast\";\nimport { Parser } from \"./parser\";\nimport { validateSchema } from \"./validator\";\nimport { printSchema } from \"./printer\";\nimport { completeRelations } from \"./relations-complete\";\n\nexport { Parser } from \"./parser\";\nexport { Lexer } from \"./lexer\";\nexport { validateSchema, printSchema, completeRelations };\n\n/**\n * Canonical formatter: parse, auto-complete missing relation sides (like\n * Prisma's formatter), validate, and re-print with aligned formatting.\n */\nexport function formatSchema(source: string, file?: string): string {\n const doc = completeRelations(parseSchema(source, file));\n validateSchema(doc);\n return printSchema(doc);\n}\n\n/** Parse schema source text into an AST (no validation). */\nexport function parseSchema(source: string, file?: string): SchemaDocument {\n return new Parser(source, file).parse();\n}\n\n/** Parse and validate schema source text. */\nexport function parseAndValidate(source: string, file?: string): SchemaDocument {\n const doc = parseSchema(source, file);\n validateSchema(doc);\n return doc;\n}\n\nexport interface LoadedSchema {\n document: SchemaDocument;\n path: string;\n /** Resolved connection URL (env() expanded). */\n databaseUrl?: string;\n}\n\nconst DEFAULT_SCHEMA_PATHS = [\n \"ember/schema.ember\",\n \"schema.ember\",\n \"prisma/schema.ember\",\n];\n\n/** Locate the schema file relative to a base directory. */\nexport function findSchemaPath(\n base = process.cwd(),\n explicit?: string,\n): string | undefined {\n if (explicit) {\n const p = resolve(base, explicit);\n return existsSync(p) ? p : undefined;\n }\n for (const candidate of DEFAULT_SCHEMA_PATHS) {\n const p = resolve(base, candidate);\n if (existsSync(p)) return p;\n }\n return undefined;\n}\n\n/** Load, parse, validate a schema file and resolve its datasource URL. */\nexport function loadSchema(path: string): LoadedSchema {\n const source = readFileSync(path, \"utf8\");\n const document = parseAndValidate(source, path);\n return {\n document,\n path,\n databaseUrl: resolveDatasourceUrl(document, dirname(path)),\n };\n}\n\nexport function resolveDatasourceUrl(\n doc: SchemaDocument,\n _base: string,\n): string | undefined {\n const ds = doc.datasource;\n if (!ds) return undefined;\n if (ds.url.kind === \"literal\") return ds.url.value;\n return process.env[ds.url.value];\n}\n","import { SchemaParseError } from \"@ember/errors\";\n\nexport type TokenType =\n | \"identifier\"\n | \"string\"\n | \"number\"\n | \"lbrace\"\n | \"rbrace\"\n | \"lparen\"\n | \"rparen\"\n | \"lbracket\"\n | \"rbracket\"\n | \"equals\"\n | \"comma\"\n | \"colon\"\n | \"at\"\n | \"double_at\"\n | \"question\"\n | \"dot\"\n | \"doc_comment\"\n | \"eof\";\n\nexport interface Token {\n type: TokenType;\n value: string;\n line: number;\n column: number;\n}\n\nconst SINGLE_CHAR_TOKENS: Record<string, TokenType> = {\n \"{\": \"lbrace\",\n \"}\": \"rbrace\",\n \"(\": \"lparen\",\n \")\": \"rparen\",\n \"[\": \"lbracket\",\n \"]\": \"rbracket\",\n \"=\": \"equals\",\n \",\": \"comma\",\n \":\": \"colon\",\n \"?\": \"question\",\n \".\": \"dot\",\n};\n\nconst IDENT_START = /[A-Za-z_]/;\nconst IDENT_PART = /[A-Za-z0-9_]/;\n\n/**\n * Converts schema source text into a flat token stream.\n * Regular `//` comments are discarded; `///` doc comments are preserved as\n * `doc_comment` tokens so the parser can attach documentation to nodes.\n */\nexport class Lexer {\n private pos = 0;\n private line = 1;\n private column = 1;\n\n constructor(\n private readonly source: string,\n private readonly file?: string,\n ) {}\n\n tokenize(): Token[] {\n const tokens: Token[] = [];\n let token = this.next();\n while (token.type !== \"eof\") {\n tokens.push(token);\n token = this.next();\n }\n tokens.push(token); // eof\n return tokens;\n }\n\n private next(): Token {\n this.skipWhitespaceAndComments();\n if (this.pos >= this.source.length) {\n return this.make(\"eof\", \"\");\n }\n\n const startLine = this.line;\n const startColumn = this.column;\n const ch = this.source[this.pos]!;\n\n // Doc comment (/// ...) — re-check here because skip kept them.\n if (ch === \"/\" && this.peek(1) === \"/\" && this.peek(2) === \"/\") {\n return this.readDocComment(startLine, startColumn);\n }\n\n if (ch === '\"') {\n return this.readString(startLine, startColumn);\n }\n\n if (ch === \"@\") {\n this.advance();\n if (this.source[this.pos] === \"@\") {\n this.advance();\n return { type: \"double_at\", value: \"@@\", line: startLine, column: startColumn };\n }\n return { type: \"at\", value: \"@\", line: startLine, column: startColumn };\n }\n\n const single = SINGLE_CHAR_TOKENS[ch];\n if (single) {\n this.advance();\n return { type: single, value: ch, line: startLine, column: startColumn };\n }\n\n if (ch === \"-\" || /[0-9]/.test(ch)) {\n return this.readNumber(startLine, startColumn);\n }\n\n if (IDENT_START.test(ch)) {\n return this.readIdentifier(startLine, startColumn);\n }\n\n throw new SchemaParseError(\n `Unexpected character '${ch}'`,\n startLine,\n startColumn,\n this.file,\n );\n }\n\n private readDocComment(line: number, column: number): Token {\n this.advance(); // /\n this.advance(); // /\n this.advance(); // /\n let value = \"\";\n while (this.pos < this.source.length && this.source[this.pos] !== \"\\n\") {\n value += this.source[this.pos];\n this.advance();\n }\n return { type: \"doc_comment\", value: value.trim(), line, column };\n }\n\n private readString(line: number, column: number): Token {\n this.advance(); // opening quote\n let value = \"\";\n while (this.pos < this.source.length && this.source[this.pos] !== '\"') {\n const c = this.source[this.pos]!;\n if (c === \"\\\\\") {\n this.advance();\n const escaped = this.source[this.pos];\n if (escaped === undefined) break;\n value += escapeChar(escaped);\n this.advance();\n continue;\n }\n if (c === \"\\n\") {\n throw new SchemaParseError(\n \"Unterminated string literal\",\n line,\n column,\n this.file,\n );\n }\n value += c;\n this.advance();\n }\n if (this.source[this.pos] !== '\"') {\n throw new SchemaParseError(\n \"Unterminated string literal\",\n line,\n column,\n this.file,\n );\n }\n this.advance(); // closing quote\n return { type: \"string\", value, line, column };\n }\n\n private readNumber(line: number, column: number): Token {\n let value = \"\";\n if (this.source[this.pos] === \"-\") {\n value += \"-\";\n this.advance();\n }\n while (\n this.pos < this.source.length &&\n /[0-9.]/.test(this.source[this.pos]!)\n ) {\n value += this.source[this.pos];\n this.advance();\n }\n return { type: \"number\", value, line, column };\n }\n\n private readIdentifier(line: number, column: number): Token {\n let value = \"\";\n while (\n this.pos < this.source.length &&\n IDENT_PART.test(this.source[this.pos]!)\n ) {\n value += this.source[this.pos];\n this.advance();\n }\n return { type: \"identifier\", value, line, column };\n }\n\n private skipWhitespaceAndComments(): void {\n while (this.pos < this.source.length) {\n const ch = this.source[this.pos]!;\n if (ch === \" \" || ch === \"\\t\" || ch === \"\\r\" || ch === \"\\n\") {\n this.advance();\n continue;\n }\n // Keep doc comments (///) — only skip plain // comments.\n if (ch === \"/\" && this.peek(1) === \"/\" && this.peek(2) !== \"/\") {\n while (this.pos < this.source.length && this.source[this.pos] !== \"\\n\") {\n this.advance();\n }\n continue;\n }\n if (ch === \"/\" && this.peek(1) === \"*\") {\n this.advance();\n this.advance();\n while (\n this.pos < this.source.length &&\n !(this.source[this.pos] === \"*\" && this.peek(1) === \"/\")\n ) {\n this.advance();\n }\n this.advance();\n this.advance();\n continue;\n }\n break;\n }\n }\n\n private peek(offset: number): string | undefined {\n return this.source[this.pos + offset];\n }\n\n private advance(): void {\n if (this.source[this.pos] === \"\\n\") {\n this.line++;\n this.column = 1;\n } else {\n this.column++;\n }\n this.pos++;\n }\n\n private make(type: TokenType, value: string): Token {\n return { type, value, line: this.line, column: this.column };\n }\n}\n\nfunction escapeChar(c: string): string {\n switch (c) {\n case \"n\":\n return \"\\n\";\n case \"t\":\n return \"\\t\";\n case \"r\":\n return \"\\r\";\n case '\"':\n return '\"';\n case \"\\\\\":\n return \"\\\\\";\n default:\n return c;\n }\n}\n","import { SchemaParseError } from \"@ember/errors\";\nimport {\n type AttributeArgValue,\n type DatasourceNode,\n type DefaultValue,\n type EnumNode,\n type FieldNode,\n type GeneratorNode,\n type ModelNode,\n type NativeType,\n type ReferentialAction,\n type RelationInfo,\n type SchemaDocument,\n} from \"@ember/ast\";\nimport { Lexer, type Token, type TokenType } from \"./lexer\";\n\ninterface RawAttribute {\n name: string; // e.g. \"id\", \"default\", \"relation\", \"db.VarChar\"\n args: AttributeArgValue[];\n line: number;\n column: number;\n}\n\n/**\n * Recursive-descent parser that turns a token stream into a SchemaDocument.\n * Field `kind` (scalar/enum/object) is resolved in a second pass once all\n * model and enum names are known (see `resolveKinds`).\n */\nexport class Parser {\n private tokens: Token[];\n private pos = 0;\n\n constructor(\n source: string,\n private readonly file?: string,\n ) {\n this.tokens = new Lexer(source, file).tokenize();\n }\n\n parse(): SchemaDocument {\n const doc: SchemaDocument = { generators: [], models: [], enums: [] };\n let pendingDoc: string[] = [];\n\n while (!this.isEof()) {\n const tok = this.peek();\n if (tok.type === \"doc_comment\") {\n pendingDoc.push(tok.value);\n this.advance();\n continue;\n }\n if (tok.type !== \"identifier\") {\n throw this.error(`Unexpected token '${tok.value}'`, tok);\n }\n const documentation = pendingDoc.length\n ? pendingDoc.join(\"\\n\")\n : undefined;\n pendingDoc = [];\n\n switch (tok.value) {\n case \"datasource\":\n doc.datasource = this.parseDatasource();\n break;\n case \"generator\":\n doc.generators.push(this.parseGenerator());\n break;\n case \"model\":\n doc.models.push(this.parseModel(documentation));\n break;\n case \"enum\":\n doc.enums.push(this.parseEnum(documentation));\n break;\n default:\n throw this.error(`Unknown top-level keyword '${tok.value}'`, tok);\n }\n }\n\n resolveKinds(doc);\n return doc;\n }\n\n // ---- Top-level blocks -------------------------------------------------\n\n private parseDatasource(): DatasourceNode {\n this.expectKeyword(\"datasource\");\n const name = this.expect(\"identifier\").value;\n this.expect(\"lbrace\");\n const assignments = this.parseAssignments();\n this.expect(\"rbrace\");\n\n const provider = literalString(assignments[\"provider\"]);\n const urlAssign = assignments[\"url\"];\n let url: DatasourceNode[\"url\"] = { kind: \"literal\", value: \"\" };\n if (urlAssign) {\n if (urlAssign.kind === \"function\" && urlAssign.name === \"env\") {\n url = { kind: \"env\", value: literalString(urlAssign.args[0]) };\n } else if (urlAssign.kind === \"string\") {\n url = { kind: \"literal\", value: urlAssign.value };\n }\n }\n return { name, provider: provider ?? \"firebird\", url };\n }\n\n private parseGenerator(): GeneratorNode {\n this.expectKeyword(\"generator\");\n const name = this.expect(\"identifier\").value;\n this.expect(\"lbrace\");\n const assignments = this.parseAssignments();\n this.expect(\"rbrace\");\n\n const config: Record<string, string> = {};\n for (const [key, value] of Object.entries(assignments)) {\n if (value.kind === \"string\") config[key] = value.value;\n }\n return {\n name,\n provider: literalString(assignments[\"provider\"]) ?? \"ember-client-js\",\n output: assignments[\"output\"]\n ? literalString(assignments[\"output\"])\n : undefined,\n config,\n };\n }\n\n private parseAssignments(): Record<string, AttributeArgValue> {\n const out: Record<string, AttributeArgValue> = {};\n while (!this.check(\"rbrace\") && !this.isEof()) {\n if (this.check(\"doc_comment\")) {\n this.advance();\n continue;\n }\n const key = this.expect(\"identifier\").value;\n this.expect(\"equals\");\n out[key] = this.parseValue();\n }\n return out;\n }\n\n private parseModel(documentation?: string): ModelNode {\n this.expectKeyword(\"model\");\n const name = this.expect(\"identifier\").value;\n this.expect(\"lbrace\");\n\n const model: ModelNode = {\n name,\n fields: [],\n primaryKey: [],\n uniqueIndexes: [],\n indexes: [],\n documentation,\n };\n\n let pendingDoc: string[] = [];\n while (!this.check(\"rbrace\") && !this.isEof()) {\n const tok = this.peek();\n if (tok.type === \"doc_comment\") {\n pendingDoc.push(tok.value);\n this.advance();\n continue;\n }\n if (tok.type === \"double_at\") {\n this.parseBlockAttribute(model);\n pendingDoc = [];\n continue;\n }\n const field = this.parseField(\n pendingDoc.length ? pendingDoc.join(\"\\n\") : undefined,\n );\n pendingDoc = [];\n model.fields.push(field);\n // Promote inline @id / @unique to model metadata.\n if (field.isId && !model.primaryKey.includes(field.name)) {\n model.primaryKey.push(field.name);\n }\n }\n this.expect(\"rbrace\");\n return model;\n }\n\n private parseField(documentation?: string): FieldNode {\n const name = this.expect(\"identifier\").value;\n const typeName = this.expect(\"identifier\").value;\n\n let isList = false;\n let isRequired = true;\n // Order-independent handling of `[]` and `?`.\n while (this.check(\"lbracket\") || this.check(\"question\")) {\n if (this.check(\"lbracket\")) {\n this.advance();\n this.expect(\"rbracket\");\n isList = true;\n } else {\n this.advance();\n isRequired = false;\n }\n }\n\n const field: FieldNode = {\n name,\n type: typeName,\n kind: \"scalar\", // resolved later\n isList,\n isRequired,\n isId: false,\n isUnique: false,\n isUpdatedAt: false,\n documentation,\n };\n\n while (this.check(\"at\")) {\n const attr = this.parseAttribute();\n this.applyFieldAttribute(field, attr);\n }\n return field;\n }\n\n private applyFieldAttribute(field: FieldNode, attr: RawAttribute): void {\n if (attr.name.startsWith(\"db.\")) {\n field.nativeType = toNativeType(attr);\n return;\n }\n switch (attr.name) {\n case \"id\":\n field.isId = true;\n break;\n case \"unique\":\n field.isUnique = true;\n break;\n case \"updatedAt\":\n field.isUpdatedAt = true;\n break;\n case \"default\":\n field.default = toDefaultValue(attr.args[0]);\n break;\n case \"map\":\n field.dbName = literalString(attr.args[0]);\n break;\n case \"relation\":\n field.relation = toRelationInfo(attr.args);\n break;\n default:\n throw this.error(`Unknown field attribute '@${attr.name}'`, attr);\n }\n }\n\n private parseBlockAttribute(model: ModelNode): void {\n const start = this.expect(\"double_at\");\n const name = this.expect(\"identifier\").value;\n const args = this.check(\"lparen\") ? this.parseArgList() : [];\n\n switch (name) {\n case \"id\":\n model.primaryKey = fieldNameList(args);\n break;\n case \"unique\":\n model.uniqueIndexes.push({\n fields: fieldNameList(args),\n name: namedArg(args, \"map\"),\n });\n break;\n case \"index\":\n model.indexes.push({\n fields: fieldNameList(args),\n name: namedArg(args, \"map\"),\n unique: false,\n });\n break;\n case \"map\":\n model.dbName = literalString(args[0]);\n break;\n default:\n throw this.error(`Unknown block attribute '@@${name}'`, start);\n }\n }\n\n private parseEnum(documentation?: string): EnumNode {\n this.expectKeyword(\"enum\");\n const name = this.expect(\"identifier\").value;\n this.expect(\"lbrace\");\n const node: EnumNode = { name, values: [], documentation };\n\n while (!this.check(\"rbrace\") && !this.isEof()) {\n if (this.check(\"doc_comment\")) {\n this.advance();\n continue;\n }\n if (this.check(\"double_at\")) {\n this.advance();\n const attrName = this.expect(\"identifier\").value;\n const args = this.check(\"lparen\") ? this.parseArgList() : [];\n if (attrName === \"map\") node.dbName = literalString(args[0]);\n continue;\n }\n const valueName = this.expect(\"identifier\").value;\n let dbName: string | undefined;\n while (this.check(\"at\")) {\n const attr = this.parseAttribute();\n if (attr.name === \"map\") dbName = literalString(attr.args[0]);\n }\n node.values.push({ name: valueName, dbName });\n }\n this.expect(\"rbrace\");\n return node;\n }\n\n // ---- Attributes & values ---------------------------------------------\n\n private parseAttribute(): RawAttribute {\n const at = this.expect(\"at\");\n let name = this.expect(\"identifier\").value;\n // Native type attributes look like @db.VarChar(255).\n if (this.check(\"dot\")) {\n this.advance();\n name += \".\" + this.expect(\"identifier\").value;\n }\n const args = this.check(\"lparen\") ? this.parseArgList() : [];\n return { name, args, line: at.line, column: at.column };\n }\n\n private parseArgList(): AttributeArgValue[] {\n this.expect(\"lparen\");\n const args: AttributeArgValue[] = [];\n while (!this.check(\"rparen\") && !this.isEof()) {\n args.push(this.parseArg());\n if (this.check(\"comma\")) this.advance();\n }\n this.expect(\"rparen\");\n return args;\n }\n\n /** Handles both positional values and `name: value` named arguments. */\n private parseArg(): AttributeArgValue {\n if (this.check(\"identifier\") && this.peek(1)?.type === \"colon\") {\n const key = this.expect(\"identifier\").value;\n this.expect(\"colon\");\n const value = this.parseValue();\n return { kind: \"function\", name: `__named:${key}`, args: [value] };\n }\n return this.parseValue();\n }\n\n private parseValue(): AttributeArgValue {\n const tok = this.peek();\n switch (tok.type) {\n case \"string\":\n this.advance();\n return { kind: \"string\", value: tok.value };\n case \"number\":\n this.advance();\n return { kind: \"number\", value: Number(tok.value) };\n case \"lbracket\": {\n this.advance();\n const items: AttributeArgValue[] = [];\n while (!this.check(\"rbracket\") && !this.isEof()) {\n items.push(this.parseValue());\n if (this.check(\"comma\")) this.advance();\n }\n this.expect(\"rbracket\");\n return { kind: \"array\", items };\n }\n case \"identifier\": {\n this.advance();\n if (tok.value === \"true\" || tok.value === \"false\") {\n return { kind: \"boolean\", value: tok.value === \"true\" };\n }\n if (this.check(\"lparen\")) {\n const args = this.parseArgList();\n return { kind: \"function\", name: tok.value, args };\n }\n return { kind: \"ref\", value: tok.value };\n }\n default:\n throw this.error(`Unexpected value token '${tok.value}'`, tok);\n }\n }\n\n // ---- Token helpers ----------------------------------------------------\n\n private peek(offset = 0): Token {\n return this.tokens[this.pos + offset] ?? this.tokens[this.tokens.length - 1]!;\n }\n\n private advance(): Token {\n const tok = this.tokens[this.pos]!;\n if (this.pos < this.tokens.length - 1) this.pos++;\n return tok;\n }\n\n private check(type: TokenType): boolean {\n return this.peek().type === type;\n }\n\n private isEof(): boolean {\n return this.peek().type === \"eof\";\n }\n\n private expect(type: TokenType): Token {\n const tok = this.peek();\n if (tok.type !== type) {\n throw this.error(`Expected ${type} but found '${tok.value}' (${tok.type})`, tok);\n }\n return this.advance();\n }\n\n private expectKeyword(keyword: string): Token {\n const tok = this.peek();\n if (tok.type !== \"identifier\" || tok.value !== keyword) {\n throw this.error(`Expected keyword '${keyword}'`, tok);\n }\n return this.advance();\n }\n\n private error(message: string, at: { line: number; column: number }) {\n return new SchemaParseError(message, at.line, at.column, this.file);\n }\n}\n\n// ---- Value coercion helpers --------------------------------------------\n\nfunction literalString(v: AttributeArgValue | undefined): string {\n if (!v) return \"\";\n if (v.kind === \"string\") return v.value;\n if (v.kind === \"ref\") return v.value;\n return String(\"value\" in v ? v.value : \"\");\n}\n\nfunction toNativeType(attr: RawAttribute): NativeType {\n const name = attr.name.slice(\"db.\".length);\n const args = attr.args\n .filter((a) => a.kind === \"number\")\n .map((a) => (a as { value: number }).value);\n return { name, args };\n}\n\nfunction toDefaultValue(v: AttributeArgValue | undefined): DefaultValue {\n if (!v) return {};\n switch (v.kind) {\n case \"function\":\n return { function: { name: v.name, args: v.args } };\n case \"string\":\n return { literal: v.value };\n case \"number\":\n return { literal: v.value };\n case \"boolean\":\n return { literal: v.value };\n case \"ref\":\n // enum value default such as @default(USER)\n return { literal: v.value };\n default:\n return {};\n }\n}\n\nfunction toRelationInfo(args: AttributeArgValue[]): RelationInfo {\n const info: RelationInfo = {};\n for (const arg of args) {\n if (arg.kind === \"string\") {\n info.name = arg.value;\n continue;\n }\n const named = asNamed(arg);\n if (!named) continue;\n const [key, value] = named;\n if (key === \"name\" && value.kind === \"string\") info.name = value.value;\n if (key === \"fields\") info.fields = refArray(value);\n if (key === \"references\") info.references = refArray(value);\n if (key === \"onDelete\") info.onDelete = refName(value) as ReferentialAction;\n if (key === \"onUpdate\") info.onUpdate = refName(value) as ReferentialAction;\n }\n return info;\n}\n\nfunction asNamed(\n arg: AttributeArgValue,\n): [string, AttributeArgValue] | undefined {\n if (arg.kind === \"function\" && arg.name.startsWith(\"__named:\")) {\n return [arg.name.slice(\"__named:\".length), arg.args[0]!];\n }\n return undefined;\n}\n\nfunction namedArg(args: AttributeArgValue[], key: string): string | undefined {\n for (const arg of args) {\n const named = asNamed(arg);\n if (named && named[0] === key && named[1].kind === \"string\") {\n return named[1].value;\n }\n }\n return undefined;\n}\n\nfunction refArray(v: AttributeArgValue): string[] {\n if (v.kind === \"array\") {\n return v.items.map((i) => refName(i)).filter((s): s is string => !!s);\n }\n const single = refName(v);\n return single ? [single] : [];\n}\n\nfunction refName(v: AttributeArgValue): string | undefined {\n if (v.kind === \"ref\") return v.value;\n if (v.kind === \"string\") return v.value;\n return undefined;\n}\n\n/** A list of bare field references, used by @@id/@@unique/@@index. */\nfunction fieldNameList(args: AttributeArgValue[]): string[] {\n for (const arg of args) {\n if (arg.kind === \"array\") return refArray(arg);\n const named = asNamed(arg);\n if (named && named[0] === \"fields\") return refArray(named[1]);\n }\n // single bare ref form: @@id(field)\n return args.map((a) => refName(a)).filter((s): s is string => !!s);\n}\n\n/**\n * Second pass: now that all model and enum names are known, classify each\n * field as scalar, enum, or object (relation).\n */\nfunction resolveKinds(doc: SchemaDocument): void {\n const modelNames = new Set(doc.models.map((m) => m.name));\n const enumNames = new Set(doc.enums.map((e) => e.name));\n for (const model of doc.models) {\n for (const field of model.fields) {\n if (modelNames.has(field.type)) field.kind = \"object\";\n else if (enumNames.has(field.type)) field.kind = \"enum\";\n else field.kind = \"scalar\";\n }\n }\n}\n","/**\n * EmberORM schema AST (DMMF-like).\n *\n * This is the single in-memory source of truth that every other layer\n * (parser, validator, query engine, generator, introspection) depends on.\n * It is intentionally decoupled from Firebird specifics so it can be reused\n * for other dialects in the future.\n */\n\nexport type ScalarType =\n | \"String\"\n | \"Boolean\"\n | \"Int\"\n | \"BigInt\"\n | \"Float\"\n | \"Decimal\"\n | \"DateTime\"\n | \"Bytes\"\n | \"Json\";\n\nexport const SCALAR_TYPES: readonly ScalarType[] = [\n \"String\",\n \"Boolean\",\n \"Int\",\n \"BigInt\",\n \"Float\",\n \"Decimal\",\n \"DateTime\",\n \"Bytes\",\n \"Json\",\n] as const;\n\nexport type FieldKind = \"scalar\" | \"enum\" | \"object\";\n\n/** Value of an attribute argument, e.g. `@default(now())` or `@map(\"USER_ID\")`. */\nexport type AttributeArgValue =\n | { kind: \"string\"; value: string }\n | { kind: \"number\"; value: number }\n | { kind: \"boolean\"; value: boolean }\n | { kind: \"ref\"; value: string } // bare identifier, e.g. an enum value or field name\n | { kind: \"function\"; name: string; args: AttributeArgValue[] } // e.g. now(), autoincrement()\n | { kind: \"array\"; items: AttributeArgValue[] };\n\nexport interface DefaultValue {\n /** A scalar literal default. */\n literal?: string | number | boolean;\n /** A function default such as now(), uuid(), cuid(), autoincrement(). */\n function?: { name: string; args: AttributeArgValue[] };\n}\n\nexport interface RelationInfo {\n /** Relation name (@relation(\"name\")). */\n name?: string;\n /** Local fields participating in the FK (`fields: [...]`). */\n fields?: string[];\n /** Referenced fields on the other model (`references: [...]`). */\n references?: string[];\n onDelete?: ReferentialAction;\n onUpdate?: ReferentialAction;\n}\n\nexport type ReferentialAction =\n | \"Cascade\"\n | \"Restrict\"\n | \"NoAction\"\n | \"SetNull\"\n | \"SetDefault\";\n\nexport interface NativeType {\n /** e.g. \"VarChar\", \"Decimal\". */\n name: string;\n /** e.g. [255] or [18, 4]. */\n args: number[];\n}\n\nexport interface FieldNode {\n name: string;\n /** Resolved type name: a ScalarType, an enum name, or a model name. */\n type: string;\n kind: FieldKind;\n isList: boolean;\n isRequired: boolean;\n isId: boolean;\n isUnique: boolean;\n isUpdatedAt: boolean;\n /** Column name in the database (@map). Defaults to `name`. */\n dbName?: string;\n default?: DefaultValue;\n relation?: RelationInfo;\n nativeType?: NativeType;\n /** documentation/comment attached above the field (///). */\n documentation?: string;\n}\n\nexport interface UniqueIndex {\n name?: string;\n fields: string[];\n}\n\nexport interface IndexNode {\n name?: string;\n fields: string[];\n unique: boolean;\n}\n\nexport interface ModelNode {\n name: string;\n /** Table name in the database (@@map). Defaults to `name`. */\n dbName?: string;\n fields: FieldNode[];\n /** Names of fields forming the primary key (composite supported via @@id). */\n primaryKey: string[];\n uniqueIndexes: UniqueIndex[];\n indexes: IndexNode[];\n documentation?: string;\n}\n\nexport interface EnumNode {\n name: string;\n dbName?: string;\n values: { name: string; dbName?: string }[];\n documentation?: string;\n}\n\nexport interface DatasourceNode {\n name: string;\n provider: string;\n /** Raw url expression; env(\"X\") resolved at runtime. */\n url: { kind: \"literal\" | \"env\"; value: string };\n}\n\nexport interface GeneratorNode {\n name: string;\n provider: string;\n output?: string;\n config: Record<string, string>;\n}\n\nexport interface SchemaDocument {\n datasource?: DatasourceNode;\n generators: GeneratorNode[];\n models: ModelNode[];\n enums: EnumNode[];\n}\n\nexport function emptySchema(): SchemaDocument {\n return { generators: [], models: [], enums: [] };\n}\n\nexport function findModel(\n schema: SchemaDocument,\n name: string,\n): ModelNode | undefined {\n return schema.models.find((m) => m.name === name);\n}\n\nexport function findEnum(\n schema: SchemaDocument,\n name: string,\n): EnumNode | undefined {\n return schema.enums.find((e) => e.name === name);\n}\n\n/**\n * Physical column name. Firebird folds unquoted identifiers to UPPER CASE, and\n * EmberORM always quotes identifiers, so a field without an explicit `@map`\n * resolves to its UPPER-CASED name to match the stored column. Use `@map` to\n * target a column created with case-sensitive (quoted) lower/mixed case.\n */\nexport function fieldColumn(field: FieldNode): string {\n return field.dbName ?? field.name.toUpperCase();\n}\n\n/** Physical table name; same UPPER-CASE folding rule as {@link fieldColumn}. */\nexport function modelTable(model: ModelNode): string {\n return model.dbName ?? model.name.toUpperCase();\n}\n\n/** Returns scalar fields only (excludes relation/object fields). */\nexport function scalarFields(model: ModelNode): FieldNode[] {\n return model.fields.filter((f) => f.kind !== \"object\");\n}\n\n/** Returns relation (object) fields only. */\nexport function relationFields(model: ModelNode): FieldNode[] {\n return model.fields.filter((f) => f.kind === \"object\");\n}\n\nexport function idFields(model: ModelNode): FieldNode[] {\n if (model.primaryKey.length > 0) {\n return model.primaryKey\n .map((n) => model.fields.find((f) => f.name === n))\n .filter((f): f is FieldNode => !!f);\n }\n return model.fields.filter((f) => f.isId);\n}\n","import { SchemaValidationError } from \"@ember/errors\";\nimport {\n SCALAR_TYPES,\n type SchemaDocument,\n findModel,\n} from \"@ember/ast\";\n\n/**\n * Structural validation of a parsed schema. Throws SchemaValidationError with\n * all detected problems at once so the user can fix them in a single pass.\n */\nexport function validateSchema(doc: SchemaDocument): void {\n const errors: string[] = [];\n const scalar = new Set<string>(SCALAR_TYPES);\n const enumNames = new Set(doc.enums.map((e) => e.name));\n const modelNames = new Set(doc.models.map((m) => m.name));\n\n const duplicateModels = findDuplicates(doc.models.map((m) => m.name));\n for (const name of duplicateModels) {\n errors.push(`Duplicate model '${name}'.`);\n }\n\n for (const model of doc.models) {\n const fieldNames = new Set<string>();\n for (const field of model.fields) {\n if (fieldNames.has(field.name)) {\n errors.push(`Duplicate field '${model.name}.${field.name}'.`);\n }\n fieldNames.add(field.name);\n\n const known =\n scalar.has(field.type) ||\n enumNames.has(field.type) ||\n modelNames.has(field.type);\n if (!known) {\n errors.push(\n `Field '${model.name}.${field.name}' has unknown type '${field.type}'.`,\n );\n }\n\n if (field.kind === \"object\" && field.relation) {\n validateRelation(doc, model.name, field.name, field.relation, errors);\n }\n }\n\n for (const pk of model.primaryKey) {\n if (!fieldNames.has(pk)) {\n errors.push(\n `Primary key field '${pk}' does not exist on model '${model.name}'.`,\n );\n }\n }\n\n const hasId =\n model.primaryKey.length > 0 || model.fields.some((f) => f.isId);\n if (!hasId) {\n errors.push(\n `Model '${model.name}' has no @id / @@id. Every model needs a primary key.`,\n );\n }\n }\n\n for (const enumNode of doc.enums) {\n if (enumNode.values.length === 0) {\n errors.push(`Enum '${enumNode.name}' has no values.`);\n }\n }\n\n if (errors.length > 0) {\n throw new SchemaValidationError(\"Schema validation failed\", errors);\n }\n}\n\nfunction validateRelation(\n doc: SchemaDocument,\n modelName: string,\n fieldName: string,\n relation: { fields?: string[]; references?: string[] },\n errors: string[],\n): void {\n const model = findModel(doc, modelName);\n if (!model) return;\n for (const f of relation.fields ?? []) {\n if (!model.fields.some((mf) => mf.name === f)) {\n errors.push(\n `Relation '${modelName}.${fieldName}' references local field '${f}' which does not exist.`,\n );\n }\n }\n}\n\nfunction findDuplicates(values: string[]): string[] {\n const seen = new Set<string>();\n const dups = new Set<string>();\n for (const v of values) {\n if (seen.has(v)) dups.add(v);\n seen.add(v);\n }\n return [...dups];\n}\n","import {\n type AttributeArgValue,\n type DefaultValue,\n type EnumNode,\n type FieldNode,\n type ModelNode,\n type SchemaDocument,\n} from \"@ember/ast\";\n\n/**\n * Serializes a SchemaDocument back into `.ember` source text.\n * Used by `ember db pull` (introspection output) and `ember format`.\n * Field columns are aligned for readability, mirroring Prisma's formatter.\n */\nexport function printSchema(doc: SchemaDocument): string {\n const blocks: string[] = [];\n\n if (doc.datasource) {\n const ds = doc.datasource;\n const url =\n ds.url.kind === \"env\"\n ? `env(\"${ds.url.value}\")`\n : `\"${ds.url.value}\"`;\n blocks.push(\n `datasource ${ds.name} {\\n provider = \"${ds.provider}\"\\n url = ${url}\\n}`,\n );\n }\n\n for (const gen of doc.generators) {\n const lines = [` provider = \"${gen.provider}\"`];\n if (gen.output) lines.push(` output = \"${gen.output}\"`);\n for (const [k, v] of Object.entries(gen.config)) {\n if (k === \"provider\" || k === \"output\") continue;\n lines.push(` ${k} = \"${v}\"`);\n }\n blocks.push(`generator ${gen.name} {\\n${lines.join(\"\\n\")}\\n}`);\n }\n\n for (const enumNode of doc.enums) {\n blocks.push(printEnum(enumNode));\n }\n\n for (const model of doc.models) {\n blocks.push(printModel(model));\n }\n\n return blocks.join(\"\\n\\n\") + \"\\n\";\n}\n\nfunction printEnum(node: EnumNode): string {\n const lines: string[] = [];\n if (node.documentation) lines.push(...docLines(node.documentation));\n lines.push(`enum ${node.name} {`);\n for (const v of node.values) {\n lines.push(` ${v.name}${v.dbName ? ` @map(\"${v.dbName}\")` : \"\"}`);\n }\n if (node.dbName) lines.push(`\\n @@map(\"${node.dbName}\")`);\n lines.push(`}`);\n return lines.join(\"\\n\");\n}\n\nfunction printModel(model: ModelNode): string {\n const lines: string[] = [];\n if (model.documentation) lines.push(...docLines(model.documentation));\n lines.push(`model ${model.name} {`);\n\n const nameWidth = Math.max(...model.fields.map((f) => f.name.length), 0);\n const typeWidth = Math.max(...model.fields.map((f) => fieldType(f).length), 0);\n\n for (const field of model.fields) {\n if (field.documentation) {\n lines.push(...docLines(field.documentation).map((l) => ` ${l}`));\n }\n const attrs = fieldAttributes(field);\n const name = field.name.padEnd(nameWidth);\n const type = fieldType(field).padEnd(typeWidth);\n lines.push(` ${name} ${type}${attrs ? ` ${attrs}` : \"\"}`.trimEnd());\n }\n\n const blockAttrs = modelBlockAttributes(model);\n if (blockAttrs.length > 0) {\n lines.push(\"\");\n for (const a of blockAttrs) lines.push(` ${a}`);\n }\n\n lines.push(`}`);\n return lines.join(\"\\n\");\n}\n\nfunction fieldType(field: FieldNode): string {\n let t = field.type;\n if (field.isList) t += \"[]\";\n else if (!field.isRequired) t += \"?\";\n return t;\n}\n\nfunction fieldAttributes(field: FieldNode): string {\n const parts: string[] = [];\n if (field.isId) parts.push(\"@id\");\n if (field.isUnique) parts.push(\"@unique\");\n if (field.default) parts.push(`@default(${printDefault(field.default)})`);\n if (field.isUpdatedAt) parts.push(\"@updatedAt\");\n if (field.relation) {\n const rel = field.relation;\n const args: string[] = [];\n if (rel.name) args.push(`\"${rel.name}\"`);\n if (rel.fields?.length) args.push(`fields: [${rel.fields.join(\", \")}]`);\n if (rel.references?.length)\n args.push(`references: [${rel.references.join(\", \")}]`);\n if (rel.onDelete) args.push(`onDelete: ${rel.onDelete}`);\n if (rel.onUpdate) args.push(`onUpdate: ${rel.onUpdate}`);\n parts.push(args.length ? `@relation(${args.join(\", \")})` : \"@relation\");\n }\n if (field.nativeType) {\n const a = field.nativeType.args.length\n ? `(${field.nativeType.args.join(\", \")})`\n : \"\";\n parts.push(`@db.${field.nativeType.name}${a}`);\n }\n if (field.dbName) parts.push(`@map(\"${field.dbName}\")`);\n return parts.join(\" \");\n}\n\nfunction printDefault(def: DefaultValue): string {\n if (def.function) {\n return `${def.function.name}(${def.function.args\n .map(printArgValue)\n .join(\", \")})`;\n }\n if (typeof def.literal === \"string\") {\n // enum/ref defaults are unquoted identifiers\n return /^[A-Za-z_][A-Za-z0-9_]*$/.test(def.literal)\n ? def.literal\n : `\"${def.literal}\"`;\n }\n return String(def.literal);\n}\n\nfunction printArgValue(v: AttributeArgValue): string {\n switch (v.kind) {\n case \"string\":\n return `\"${v.value}\"`;\n case \"number\":\n return String(v.value);\n case \"boolean\":\n return String(v.value);\n case \"ref\":\n return v.value;\n case \"array\":\n return `[${v.items.map(printArgValue).join(\", \")}]`;\n case \"function\":\n return `${v.name}(${v.args.map(printArgValue).join(\", \")})`;\n }\n}\n\nfunction modelBlockAttributes(model: ModelNode): string[] {\n const out: string[] = [];\n const inlineId =\n model.primaryKey.length === 1 &&\n model.fields.find((f) => f.name === model.primaryKey[0])?.isId;\n if (model.primaryKey.length > 0 && !inlineId) {\n out.push(`@@id([${model.primaryKey.join(\", \")}])`);\n }\n for (const u of model.uniqueIndexes) {\n out.push(\n `@@unique([${u.fields.join(\", \")}]${u.name ? `, map: \"${u.name}\"` : \"\"})`,\n );\n }\n for (const i of model.indexes) {\n out.push(\n `@@index([${i.fields.join(\", \")}]${i.name ? `, map: \"${i.name}\"` : \"\"})`,\n );\n }\n if (model.dbName) out.push(`@@map(\"${model.dbName}\")`);\n return out;\n}\n\nfunction docLines(documentation: string): string[] {\n return documentation.split(\"\\n\").map((l) => `/// ${l}`);\n}\n","/** Small, dependency-free helpers shared across layers. */\n\nexport function isPlainObject(v: unknown): v is Record<string, unknown> {\n return (\n typeof v === \"object\" &&\n v !== null &&\n !Array.isArray(v) &&\n !(v instanceof Date) &&\n !Buffer.isBuffer(v)\n );\n}\n\nexport function isEmptyObject(v: unknown): boolean {\n return isPlainObject(v) && Object.keys(v).length === 0;\n}\n\nexport function uniq<T>(items: T[]): T[] {\n return [...new Set(items)];\n}\n\nexport function pascalCase(input: string): string {\n return input\n .toLowerCase()\n .replace(/[^a-zA-Z0-9]+(.)?/g, (_, c: string | undefined) =>\n c ? c.toUpperCase() : \"\",\n )\n .replace(/^(.)/, (_, c: string) => c.toUpperCase());\n}\n\nexport function camelCase(input: string): string {\n const pascal = pascalCase(input);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\nexport function pluralize(word: string): string {\n if (/[^aeiou]y$/i.test(word)) return word.replace(/y$/i, \"ies\");\n if (/(s|x|z|ch|sh)$/i.test(word)) return `${word}es`;\n return `${word}s`;\n}\n\n/** First char lowercased — used to derive delegate names from model names. */\nexport function lowerFirst(input: string): string {\n return input.charAt(0).toLowerCase() + input.slice(1);\n}\n\nexport function indent(text: string, level = 1, unit = \" \"): string {\n const pad = unit.repeat(level);\n return text\n .split(\"\\n\")\n .map((l) => (l.length > 0 ? pad + l : l))\n .join(\"\\n\");\n}\n\nexport function assertNever(value: never, message = \"Unexpected value\"): never {\n throw new Error(`${message}: ${JSON.stringify(value)}`);\n}\n","import {\n type FieldNode,\n type ModelNode,\n type SchemaDocument,\n findModel,\n idFields,\n} from \"@ember/ast\";\nimport { camelCase, pascalCase, pluralize } from \"@ember/utils\";\n\n/**\n * Auto-complete missing relation sides, mirroring Prisma's formatter:\n *\n * - If a model declares the **owning** side (`field Type @relation(fields,\n * references)`), the referenced model gets the opposite **back-relation**\n * (a list, or a to-one for 1:1) if it is missing.\n * - If a model declares a **list** (`items Type[]`), the element model gets the\n * owning to-one field plus its scalar foreign key, if missing.\n * - A bare to-one (`field Type` with no `@relation` and no partner) is upgraded\n * to the owning side (scalar FK + `@relation`) and the other model gets the\n * back-relation list.\n *\n * Mutates and returns `doc`. Safe to run repeatedly (idempotent): a relation\n * whose partner already exists is left untouched.\n */\nexport function completeRelations(doc: SchemaDocument): SchemaDocument {\n // Snapshot the original relation fields so newly-added fields aren't\n // re-processed within the same pass.\n const original: { model: ModelNode; field: FieldNode }[] = [];\n for (const model of doc.models) {\n for (const field of model.fields) {\n if (field.kind === \"object\") original.push({ model, field });\n }\n }\n\n for (const { model, field } of original) {\n const related = findModel(doc, field.type);\n if (!related) continue;\n if (hasPartner(related, model, field)) continue;\n\n if (field.isList) {\n addOwningSide(related, model, field);\n } else if (field.relation?.fields?.length) {\n addBackRelation(related, model, field);\n } else {\n upgradeBareToOne(doc, model, field);\n }\n }\n\n return doc;\n}\n\nfunction hasPartner(\n related: ModelNode,\n model: ModelNode,\n field: FieldNode,\n): boolean {\n return related.fields.some(\n (f) =>\n f !== field &&\n f.kind === \"object\" &&\n f.type === model.name &&\n relationNamesMatch(f, field),\n );\n}\n\nfunction relationNamesMatch(a: FieldNode, b: FieldNode): boolean {\n const an = a.relation?.name;\n const bn = b.relation?.name;\n if (an && bn) return an === bn; // both named: must match\n if (!an && !bn) return true; // both unnamed: the single relation between them\n return false; // one named, one not: different relations\n}\n\n/** Add the opposite back-relation (list, or to-one for 1:1) on `related`. */\nfunction addBackRelation(\n related: ModelNode,\n owner: ModelNode,\n owning: FieldNode,\n): void {\n // A unique foreign key (the scalar field(s) the relation maps to) implies a\n // 1:1, so the back side is a to-one rather than a list.\n const fkFields = (owning.relation?.fields ?? [])\n .map((n) => owner.fields.find((f) => f.name === n))\n .filter((f): f is FieldNode => !!f);\n const isOneToOne = fkFields.length > 0 && fkFields.every((f) => f.isUnique);\n const baseName = isOneToOne\n ? camelCase(owner.name)\n : camelCase(pluralize(owner.name));\n const name = uniqueFieldName(related, baseName);\n\n related.fields.push({\n name,\n type: owner.name,\n kind: \"object\",\n isList: !isOneToOne,\n isRequired: false,\n isId: false,\n isUnique: false,\n isUpdatedAt: false,\n // Only emit @relation when the relation is named; an unnamed back-relation\n // carries no attribute (matches Prisma's formatter output).\n ...(owning.relation?.name ? { relation: { name: owning.relation.name } } : {}),\n });\n}\n\n/** Add the owning to-one field + scalar FK on `related` (which holds the FK). */\nfunction addOwningSide(\n related: ModelNode,\n parent: ModelNode,\n listField: FieldNode,\n): void {\n const ref = idFields(parent)[0];\n if (!ref) return;\n\n const relationField = uniqueFieldName(related, camelCase(parent.name));\n const fkName = uniqueFieldName(\n related,\n `${camelCase(parent.name)}${pascalCase(ref.name)}`,\n );\n\n related.fields.push({\n name: fkName,\n type: ref.type,\n kind: \"scalar\",\n isList: false,\n isRequired: true,\n isId: false,\n isUnique: false,\n isUpdatedAt: false,\n ...(ref.nativeType ? { nativeType: ref.nativeType } : {}),\n });\n\n related.fields.push({\n name: relationField,\n type: parent.name,\n kind: \"object\",\n isList: false,\n isRequired: true,\n isId: false,\n isUnique: false,\n isUpdatedAt: false,\n relation: {\n ...(listField.relation?.name ? { name: listField.relation.name } : {}),\n fields: [fkName],\n references: [ref.name],\n },\n });\n}\n\n/** Upgrade `field Type` (bare to-one) to the owning side and add the back list. */\nfunction upgradeBareToOne(\n doc: SchemaDocument,\n model: ModelNode,\n field: FieldNode,\n): void {\n const related = findModel(doc, field.type);\n if (!related) return;\n const ref = idFields(related)[0];\n if (!ref) return;\n\n const fkName = uniqueFieldName(model, `${field.name}${pascalCase(ref.name)}`);\n // Insert the scalar FK just before the relation field for readability.\n const idx = model.fields.indexOf(field);\n model.fields.splice(idx, 0, {\n name: fkName,\n type: ref.type,\n kind: \"scalar\",\n isList: false,\n isRequired: field.isRequired,\n isId: false,\n isUnique: false,\n isUpdatedAt: false,\n ...(ref.nativeType ? { nativeType: ref.nativeType } : {}),\n });\n field.relation = {\n ...(field.relation ?? {}),\n fields: [fkName],\n references: [ref.name],\n };\n\n addBackRelation(related, model, field);\n}\n\nfunction uniqueFieldName(model: ModelNode, base: string): string {\n let name = base || \"relation\";\n let i = 1;\n while (model.fields.some((f) => f.name === name)) name = `${base}_${++i}`;\n return name;\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport Firebird from \"node-firebird\";\nimport { DatabaseError } from \"@ember/errors\";\nimport type {\n ConnectionConfig,\n DriverOptions,\n IsolationLevel,\n SqlDriver,\n SqlValue,\n TransactionContext,\n TransactionOptions,\n} from \"./types\";\n\n// node-firebird is callback-based and weakly typed; these aliases keep the\n// rest of the file readable without leaking `any` outward.\ntype FbDatabase = {\n query(sql: string, params: unknown[], cb: (err: unknown, result: unknown) => void): void;\n transaction(isolation: unknown, cb: (err: unknown, tr: FbTransaction) => void): void;\n detach(cb?: (err: unknown) => void): void;\n};\ntype FbTransaction = {\n query(sql: string, params: unknown[], cb: (err: unknown, result: unknown) => void): void;\n commit(cb: (err: unknown) => void): void;\n rollback(cb: (err: unknown) => void): void;\n};\ntype FbPool = {\n get(cb: (err: unknown, db: FbDatabase) => void): void;\n destroy(): void;\n};\n\nconst fb = Firebird as unknown as {\n pool(max: number, options: unknown, cb?: unknown): FbPool;\n ISOLATION_READ_COMMITTED: unknown;\n ISOLATION_READ_COMMITTED_READ_ONLY: unknown;\n ISOLATION_REPEATABLE_READ: unknown;\n ISOLATION_SERIALIZABLE: unknown;\n};\n\nfunction isolationConstant(level: IsolationLevel | undefined): unknown {\n switch (level) {\n case \"READ_COMMITTED_READ_ONLY\":\n return fb.ISOLATION_READ_COMMITTED_READ_ONLY;\n case \"REPEATABLE_READ\":\n return fb.ISOLATION_REPEATABLE_READ;\n case \"SERIALIZABLE\":\n return fb.ISOLATION_SERIALIZABLE;\n case \"READ_COMMITTED\":\n default:\n return fb.ISOLATION_READ_COMMITTED;\n }\n}\n\n/**\n * Firebird implementation of SqlDriver. Wraps node-firebird's callback API in\n * promises, manages a connection pool, and guarantees every query executes\n * inside a transaction. Nested `transaction()` calls reuse the active one via\n * AsyncLocalStorage so `client.$transaction(...)` composes naturally.\n */\nexport class FirebirdDriver implements SqlDriver {\n private pool: FbPool | null = null;\n private readonly options: Record<string, unknown>;\n private readonly poolMax: number;\n private readonly onQuery?: DriverOptions[\"onQuery\"];\n private readonly activeTx = new AsyncLocalStorage<TransactionContext>();\n\n constructor(config: ConnectionConfig, driverOptions?: DriverOptions) {\n this.poolMax = config.poolMax ?? 5;\n this.onQuery = driverOptions?.onQuery;\n this.options = {\n host: config.host,\n port: config.port,\n database: config.database,\n user: config.user,\n password: config.password,\n role: config.role ?? \"\",\n pageSize: config.pageSize ?? 4096,\n encoding: config.encoding ?? \"UTF8\",\n blobAsText: config.blobAsText ?? true,\n lowercase_keys: config.lowercaseKeys ?? false,\n retryConnectionInterval: 1000,\n // FB3+ secure auth (Srp) is negotiated by default; set explicitly to force\n // a plugin, or \"Legacy_Auth\" for Firebird 2.1/2.5 servers.\n ...(config.authPlugin ? { pluginName: config.authPlugin } : {}),\n ...(config.wireCompression != null\n ? { wireCompression: config.wireCompression }\n : {}),\n };\n }\n\n async connect(): Promise<void> {\n if (this.pool) return;\n this.pool = fb.pool(this.poolMax, this.options);\n }\n\n async disconnect(): Promise<void> {\n if (!this.pool) return;\n this.pool.destroy();\n this.pool = null;\n }\n\n async transaction<T>(\n fn: (tx: TransactionContext) => Promise<T>,\n options?: TransactionOptions,\n ): Promise<T> {\n const existing = this.activeTx.getStore();\n if (existing) {\n // Reuse the enclosing transaction; do not commit here.\n return fn(existing);\n }\n await this.connect();\n const db = await this.acquire();\n const tr = await this.begin(db, options?.isolation);\n const ctx: TransactionContext = {\n query: (sql, params) => this.runOnTransaction(tr, sql, params),\n };\n try {\n const result = await this.activeTx.run(ctx, () => fn(ctx));\n await this.commit(tr);\n return result;\n } catch (err) {\n await this.safeRollback(tr);\n throw err;\n } finally {\n db.detach();\n }\n }\n\n // ---- promise wrappers over node-firebird -------------------------------\n\n private acquire(): Promise<FbDatabase> {\n return new Promise((resolve, reject) => {\n this.pool!.get((err, db) => {\n if (err) return reject(wrap(err, \"Failed to acquire connection\"));\n resolve(db);\n });\n });\n }\n\n private begin(\n db: FbDatabase,\n isolation?: IsolationLevel,\n ): Promise<FbTransaction> {\n return new Promise((resolve, reject) => {\n db.transaction(isolationConstant(isolation), (err, tr) => {\n if (err) return reject(wrap(err, \"Failed to start transaction\"));\n resolve(tr);\n });\n });\n }\n\n private runOnTransaction<T>(\n tr: FbTransaction,\n sql: string,\n params: readonly SqlValue[] = [],\n ): Promise<T[]> {\n const start = this.onQuery ? performance.now() : 0;\n return new Promise((resolve, reject) => {\n tr.query(sql, [...params], (err, result) => {\n if (err) return reject(wrap(err, \"Query failed\", sql));\n const rows = normalizeRows<T>(result);\n if (this.onQuery) {\n this.onQuery({\n sql,\n params,\n durationMs: performance.now() - start,\n rowCount: rows.length,\n });\n }\n resolve(rows);\n });\n });\n }\n\n private commit(tr: FbTransaction): Promise<void> {\n return new Promise((resolve, reject) => {\n tr.commit((err) => {\n if (err) return reject(wrap(err, \"Failed to commit transaction\"));\n resolve();\n });\n });\n }\n\n private safeRollback(tr: FbTransaction): Promise<void> {\n return new Promise((resolve) => {\n tr.rollback(() => resolve());\n });\n }\n}\n\nfunction normalizeRows<T>(result: unknown): T[] {\n if (Array.isArray(result)) return result as T[];\n if (result === undefined || result === null) return [];\n return [result as T];\n}\n\nfunction wrap(err: unknown, message: string, sql?: string): DatabaseError {\n const detail =\n err && typeof err === \"object\" && \"message\" in err\n ? String((err as { message: unknown }).message)\n : String(err);\n return new DatabaseError(`${message}: ${detail}`, err, sql);\n}\n","import { EmberError } from \"@ember/errors\";\nimport type { ConnectionConfig } from \"./types\";\n\n/**\n * Parse a Firebird connection URL into a ConnectionConfig.\n *\n * Supported forms:\n * firebird://user:password@host:port/path/to/database.fdb?role=RDB$ADMIN\n * firebird://SYSDBA:masterkey@localhost:3050//var/lib/firebird/data/app.fdb\n *\n * The path after the host is treated as the absolute database path. A leading\n * double slash (`//var/...`) yields an absolute POSIX path; a single slash with\n * a Windows drive (`/C:/...`) is normalized too.\n */\nexport function parseConnectionUrl(url: string): ConnectionConfig {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new EmberError(`Invalid Firebird connection URL: ${url}`);\n }\n\n if (!/^firebird:?$/.test(parsed.protocol.replace(\":\", \"\") + \":\")) {\n if (parsed.protocol !== \"firebird:\") {\n throw new EmberError(\n `Unsupported protocol '${parsed.protocol}'. Expected 'firebird:'.`,\n );\n }\n }\n\n const database = normalizeDatabasePath(parsed.pathname);\n if (!database) {\n throw new EmberError(`Connection URL is missing a database path: ${url}`);\n }\n\n const params = parsed.searchParams;\n const config: ConnectionConfig = {\n host: parsed.hostname || \"127.0.0.1\",\n port: parsed.port ? Number(parsed.port) : 3050,\n database,\n user: decodeURIComponent(parsed.username || \"SYSDBA\"),\n password: decodeURIComponent(parsed.password || \"masterkey\"),\n encoding: params.get(\"encoding\") ?? \"UTF8\",\n };\n\n const role = params.get(\"role\");\n if (role) config.role = role;\n const poolMax = params.get(\"poolMax\") ?? params.get(\"connection_limit\");\n if (poolMax) config.poolMax = Number(poolMax);\n const pageSize = params.get(\"pageSize\");\n if (pageSize) config.pageSize = Number(pageSize);\n\n const auth = (params.get(\"authPlugin\") ?? params.get(\"auth\"))?.toLowerCase();\n if (auth === \"legacy\" || auth === \"legacy_auth\") config.authPlugin = \"Legacy_Auth\";\n else if (auth === \"srp\") config.authPlugin = \"Srp\";\n\n const wireCompression = params.get(\"wireCompression\");\n if (wireCompression != null) {\n config.wireCompression = wireCompression !== \"false\" && wireCompression !== \"0\";\n }\n\n const version = params.get(\"version\");\n if (version) config.version = normalizeVersion(version);\n\n return config;\n}\n\nconst VERSIONS = new Set([\"2.1\", \"2.5\", \"3\", \"4\", \"5\"]);\n\nfunction normalizeVersion(raw: string): ConnectionConfig[\"version\"] {\n const trimmed = raw.trim();\n if (VERSIONS.has(trimmed)) return trimmed as ConnectionConfig[\"version\"];\n // Accept \"3.0\", \"4.0.1\" etc. by taking the major (or major.minor for 2.x).\n if (/^2\\.1/.test(trimmed)) return \"2.1\";\n if (/^2\\.5/.test(trimmed)) return \"2.5\";\n const major = trimmed.split(\".\")[0];\n if (major && VERSIONS.has(major)) return major as ConnectionConfig[\"version\"];\n return undefined;\n}\n\nfunction normalizeDatabasePath(pathname: string): string {\n let p = decodeURIComponent(pathname);\n // `//var/lib/app.fdb` -> `/var/lib/app.fdb`\n if (p.startsWith(\"//\")) p = p.slice(1);\n // `/C:/db.fdb` -> `C:/db.fdb`\n if (/^\\/[A-Za-z]:\\//.test(p)) p = p.slice(1);\n return p;\n}\n\nexport function buildConnectionUrl(config: ConnectionConfig): string {\n const auth = `${encodeURIComponent(config.user)}:${encodeURIComponent(\n config.password,\n )}`;\n const dbPath = config.database.startsWith(\"/\")\n ? `/${config.database}`\n : `/${config.database}`;\n const url = new URL(`firebird://${auth}@${config.host}:${config.port}${dbPath}`);\n if (config.role) url.searchParams.set(\"role\", config.role);\n return url.toString();\n}\n","export type {\n ConnectionConfig,\n FirebirdVersion,\n DriverOptions,\n QueryEvent,\n QueryLogger,\n SqlDriver,\n SqlValue,\n TransactionContext,\n TransactionOptions,\n IsolationLevel,\n} from \"./types\";\nexport { FirebirdDriver } from \"./firebird-driver\";\nexport { parseConnectionUrl, buildConnectionUrl } from \"./url\";\n\nimport type { ConnectionConfig, DriverOptions, SqlDriver } from \"./types\";\nimport { FirebirdDriver } from \"./firebird-driver\";\nimport { parseConnectionUrl } from \"./url\";\n\n/**\n * Factory that builds a driver from either a connection URL or an explicit\n * config object. Centralizing creation here keeps the client decoupled from a\n * concrete driver class (Factory pattern / DIP).\n */\nexport function createDriver(\n source: string | ConnectionConfig,\n options?: DriverOptions,\n): SqlDriver {\n const config =\n typeof source === \"string\" ? parseConnectionUrl(source) : source;\n return new FirebirdDriver(config, options);\n}\n","import type { FirebirdVersion, SqlValue } from \"@ember/driver\";\nimport { Sql } from \"./fragment\";\n\n/**\n * Strategy interface for SQL generation. Encapsulates every dialect-specific\n * decision so the query compiler stays backend-agnostic. Only FirebirdDialect\n * is implemented today, but the engine never assumes Firebird directly.\n */\nexport interface SqlDialect {\n /** Quote an identifier (table/column/alias). */\n quoteId(name: string): string;\n /** Quote a `table.column` reference. */\n quoteRef(table: string, column: string): string;\n /** Pagination clause placed right after SELECT (e.g. `FIRST 10 SKIP 5`). */\n paginationClause(take?: number, skip?: number): string;\n /** Wrap a value for LIKE with case-insensitive mode. */\n caseInsensitive(expr: string): string;\n /** Map a default function name (now/uuid/...) to a SQL expression, if any. */\n defaultFunctionSql(name: string): string | null;\n /** Coerce a JS value into a driver-bindable SqlValue. */\n coerceValue(value: unknown): SqlValue;\n /** True if the dialect can paginate (controls FIRST/SKIP usage). */\n readonly supportsReturning: boolean;\n /** Native BOOLEAN type (Firebird 3+) vs SMALLINT fallback (2.1/2.5). */\n readonly supportsBooleanType: boolean;\n /** IDENTITY columns (Firebird 3+) vs generator+trigger (2.1/2.5). */\n readonly supportsIdentity: boolean;\n /** Window functions like ROW_NUMBER() OVER (...) (Firebird 3+). */\n readonly supportsWindowFunctions: boolean;\n /** DDL type used for boolean columns. */\n booleanColumnType(): string;\n}\n\n/**\n * Firebird 3+/4+ dialect.\n * - Identifiers are double-quoted to preserve case (introspection yields\n * UPPER-CASE names and quoting avoids accidental folding).\n * - Pagination uses `FIRST n SKIP m` after the SELECT keyword.\n * - Case-insensitive matching uses UPPER() on both sides.\n */\nexport interface FirebirdDialectOptions {\n version?: FirebirdVersion;\n}\n\nexport class FirebirdDialect implements SqlDialect {\n readonly supportsReturning = true;\n readonly version: FirebirdVersion;\n readonly supportsBooleanType: boolean;\n readonly supportsIdentity: boolean;\n readonly supportsWindowFunctions: boolean;\n\n constructor(options: FirebirdDialectOptions = {}) {\n this.version = options.version ?? \"3\";\n const rank = versionRank(this.version);\n this.supportsBooleanType = rank >= 30;\n this.supportsIdentity = rank >= 30;\n this.supportsWindowFunctions = rank >= 30;\n }\n\n booleanColumnType(): string {\n return this.supportsBooleanType ? \"BOOLEAN\" : \"SMALLINT\";\n }\n\n quoteId(name: string): string {\n // Escape embedded double quotes by doubling them.\n return `\"${name.replace(/\"/g, '\"\"')}\"`;\n }\n\n quoteRef(table: string, column: string): string {\n return `${this.quoteId(table)}.${this.quoteId(column)}`;\n }\n\n paginationClause(take?: number, skip?: number): string {\n const parts: string[] = [];\n if (typeof take === \"number\" && take >= 0) {\n parts.push(`FIRST ${Math.trunc(take)}`);\n }\n if (typeof skip === \"number\" && skip > 0) {\n parts.push(`SKIP ${Math.trunc(skip)}`);\n }\n return parts.join(\" \");\n }\n\n caseInsensitive(expr: string): string {\n return `UPPER(${expr})`;\n }\n\n defaultFunctionSql(name: string): string | null {\n switch (name) {\n case \"now\":\n return \"CURRENT_TIMESTAMP\";\n case \"uuid\":\n case \"cuid\":\n // Firebird can generate a 16-byte GUID; expose as a string-friendly UUID.\n return \"UUID_TO_CHAR(GEN_UUID())\";\n case \"autoincrement\":\n return null; // handled via generators/identity, not an inline default\n default:\n return null;\n }\n }\n\n coerceValue(value: unknown): SqlValue {\n if (value === null || value === undefined) return null;\n if (value instanceof Date) return value;\n if (Buffer.isBuffer(value)) return value;\n if (typeof value === \"boolean\") {\n // Firebird 2.1/2.5 have no BOOLEAN type: store as SMALLINT 0/1.\n return this.supportsBooleanType ? value : value ? 1 : 0;\n }\n if (typeof value === \"bigint\") return value;\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") return value;\n // Json / objects are serialized to text.\n return JSON.stringify(value);\n }\n}\n\nfunction versionRank(version: FirebirdVersion): number {\n switch (version) {\n case \"2.1\":\n return 21;\n case \"2.5\":\n return 25;\n case \"3\":\n return 30;\n case \"4\":\n return 40;\n case \"5\":\n return 50;\n default:\n return 30;\n }\n}\n\n/** Helper to build `SELECT <pagination> ...` with the dialect's clause. */\nexport function selectKeyword(\n dialect: SqlDialect,\n take?: number,\n skip?: number,\n): Sql {\n const pagination = dialect.paginationClause(take, skip);\n return Sql.raw(pagination ? `SELECT ${pagination}` : \"SELECT\");\n}\n","import type { TransactionContext } from \"@ember/driver\";\n\n/** Raw column metadata as read from RDB$ system tables (already trimmed). */\nexport interface RawColumn {\n table: string;\n name: string;\n position: number;\n fieldType: number;\n fieldSubType: number | null;\n length: number | null;\n precision: number | null;\n scale: number | null;\n notNull: boolean;\n defaultSource: string | null;\n isIdentity: boolean;\n charLength: number | null;\n}\n\nexport interface RawConstraint {\n table: string;\n type: string; // PRIMARY KEY | UNIQUE | FOREIGN KEY\n name: string;\n indexName: string | null;\n columns: string[];\n // foreign key only:\n references?: { table: string; columns: string[] };\n updateRule?: string;\n deleteRule?: string;\n}\n\nconst trim = (v: unknown): string => (v == null ? \"\" : String(v).trim());\nconst numOrNull = (v: unknown): number | null =>\n v == null ? null : Number(v);\n\n/** Reads tables, columns and constraints from Firebird's metadata catalog. */\nexport class FirebirdMetadataReader {\n constructor(private readonly tx: TransactionContext) {}\n\n async tables(): Promise<string[]> {\n const rows = await this.tx.query<{ RDB$RELATION_NAME: string }>(\n `SELECT RDB$RELATION_NAME\n FROM RDB$RELATIONS\n WHERE RDB$VIEW_BLR IS NULL\n AND (RDB$SYSTEM_FLAG IS NULL OR RDB$SYSTEM_FLAG = 0)\n ORDER BY RDB$RELATION_NAME`,\n );\n return rows.map((r) => trim(r[\"RDB$RELATION_NAME\"]));\n }\n\n async columns(): Promise<RawColumn[]> {\n const rows = await this.tx.query<Record<string, unknown>>(\n `SELECT\n rf.RDB$RELATION_NAME AS TABLE_NAME,\n rf.RDB$FIELD_NAME AS FIELD_NAME,\n rf.RDB$FIELD_POSITION AS FIELD_POSITION,\n rf.RDB$NULL_FLAG AS NULL_FLAG,\n rf.RDB$DEFAULT_SOURCE AS DEFAULT_SOURCE,\n rf.RDB$IDENTITY_TYPE AS IDENTITY_TYPE,\n f.RDB$FIELD_TYPE AS FIELD_TYPE,\n f.RDB$FIELD_SUB_TYPE AS FIELD_SUB_TYPE,\n f.RDB$FIELD_LENGTH AS FIELD_LENGTH,\n f.RDB$CHARACTER_LENGTH AS CHAR_LENGTH,\n f.RDB$FIELD_PRECISION AS FIELD_PRECISION,\n f.RDB$FIELD_SCALE AS FIELD_SCALE\n FROM RDB$RELATION_FIELDS rf\n JOIN RDB$FIELDS f ON f.RDB$FIELD_NAME = rf.RDB$FIELD_SOURCE\n JOIN RDB$RELATIONS r ON r.RDB$RELATION_NAME = rf.RDB$RELATION_NAME\n WHERE r.RDB$VIEW_BLR IS NULL\n AND (r.RDB$SYSTEM_FLAG IS NULL OR r.RDB$SYSTEM_FLAG = 0)\n ORDER BY rf.RDB$RELATION_NAME, rf.RDB$FIELD_POSITION`,\n );\n return rows.map((r) => ({\n table: trim(r.TABLE_NAME),\n name: trim(r.FIELD_NAME),\n position: Number(r.FIELD_POSITION ?? 0),\n fieldType: Number(r.FIELD_TYPE ?? 0),\n fieldSubType: numOrNull(r.FIELD_SUB_TYPE),\n length: numOrNull(r.FIELD_LENGTH),\n charLength: numOrNull(r.CHAR_LENGTH),\n precision: numOrNull(r.FIELD_PRECISION),\n scale: numOrNull(r.FIELD_SCALE),\n notNull: r.NULL_FLAG != null && Number(r.NULL_FLAG) === 1,\n defaultSource: r.DEFAULT_SOURCE == null ? null : trim(r.DEFAULT_SOURCE),\n isIdentity: r.IDENTITY_TYPE != null,\n }));\n }\n\n async constraints(): Promise<RawConstraint[]> {\n const rows = await this.tx.query<Record<string, unknown>>(\n `SELECT\n rc.RDB$CONSTRAINT_NAME AS CONSTRAINT_NAME,\n rc.RDB$CONSTRAINT_TYPE AS CONSTRAINT_TYPE,\n rc.RDB$RELATION_NAME AS TABLE_NAME,\n rc.RDB$INDEX_NAME AS INDEX_NAME,\n seg.RDB$FIELD_NAME AS FIELD_NAME,\n seg.RDB$FIELD_POSITION AS SEG_POSITION,\n refc.RDB$UPDATE_RULE AS UPDATE_RULE,\n refc.RDB$DELETE_RULE AS DELETE_RULE,\n refc.RDB$CONST_NAME_UQ AS UQ_NAME\n FROM RDB$RELATION_CONSTRAINTS rc\n JOIN RDB$INDEX_SEGMENTS seg ON seg.RDB$INDEX_NAME = rc.RDB$INDEX_NAME\n LEFT JOIN RDB$REF_CONSTRAINTS refc ON refc.RDB$CONSTRAINT_NAME = rc.RDB$CONSTRAINT_NAME\n WHERE rc.RDB$CONSTRAINT_TYPE IN ('PRIMARY KEY', 'UNIQUE', 'FOREIGN KEY')\n ORDER BY rc.RDB$CONSTRAINT_NAME, seg.RDB$FIELD_POSITION`,\n );\n\n const byName = new Map<string, RawConstraint>();\n const uqByName = new Map<string, string>(); // constraint -> referenced UQ constraint name\n\n for (const r of rows) {\n const name = trim(r.CONSTRAINT_NAME);\n let c = byName.get(name);\n if (!c) {\n c = {\n table: trim(r.TABLE_NAME),\n type: trim(r.CONSTRAINT_TYPE),\n name,\n indexName: r.INDEX_NAME == null ? null : trim(r.INDEX_NAME),\n columns: [],\n };\n if (c.type === \"FOREIGN KEY\") {\n c.updateRule = trim(r.UPDATE_RULE) || undefined;\n c.deleteRule = trim(r.DELETE_RULE) || undefined;\n uqByName.set(name, trim(r.UQ_NAME));\n }\n byName.set(name, c);\n }\n const col = trim(r.FIELD_NAME);\n if (col && !c.columns.includes(col)) c.columns.push(col);\n }\n\n // Resolve foreign key targets via the referenced unique/PK constraint.\n for (const c of byName.values()) {\n if (c.type !== \"FOREIGN KEY\") continue;\n const uqName = uqByName.get(c.name);\n if (!uqName) continue;\n const target = byName.get(uqName);\n if (target) {\n c.references = { table: target.table, columns: [...target.columns] };\n } else {\n const resolved = await this.resolveConstraintColumns(uqName);\n if (resolved) c.references = resolved;\n }\n }\n\n return [...byName.values()];\n }\n\n private async resolveConstraintColumns(\n constraintName: string,\n ): Promise<{ table: string; columns: string[] } | null> {\n const rows = await this.tx.query<Record<string, unknown>>(\n `SELECT rc.RDB$RELATION_NAME AS TABLE_NAME, seg.RDB$FIELD_NAME AS FIELD_NAME\n FROM RDB$RELATION_CONSTRAINTS rc\n JOIN RDB$INDEX_SEGMENTS seg ON seg.RDB$INDEX_NAME = rc.RDB$INDEX_NAME\n WHERE rc.RDB$CONSTRAINT_NAME = ?\n ORDER BY seg.RDB$FIELD_POSITION`,\n [constraintName],\n );\n if (rows.length === 0) return null;\n return {\n table: trim(rows[0]!.TABLE_NAME),\n columns: rows.map((r) => trim(r.FIELD_NAME)),\n };\n }\n}\n","import type { NativeType, ScalarType } from \"@ember/ast\";\nimport type { RawColumn } from \"./firebird-meta\";\n\n// Firebird RDB$FIELD_TYPE codes.\nconst FB = {\n SMALLINT: 7,\n INTEGER: 8,\n QUAD: 9,\n FLOAT: 10,\n DATE_LEGACY: 11,\n DATE: 12,\n TIME: 13,\n CHAR: 14,\n INT64: 16, // BIGINT / numeric\n BOOLEAN: 23,\n DOUBLE: 27,\n TIMESTAMP: 35,\n VARCHAR: 37,\n BLOB: 261,\n} as const;\n\nexport interface MappedType {\n scalar: ScalarType;\n native?: NativeType;\n}\n\n/**\n * Translate a Firebird column type into an EmberORM scalar type plus the native\n * type annotation (`@db.*`) that preserves the exact column definition.\n */\nexport function mapColumnType(col: RawColumn): MappedType {\n const scale = col.scale ?? 0;\n switch (col.fieldType) {\n case FB.SMALLINT:\n return scale < 0\n ? decimal(col)\n : { scalar: \"Int\", native: { name: \"SmallInt\", args: [] } };\n case FB.INTEGER:\n return scale < 0\n ? decimal(col)\n : { scalar: \"Int\", native: { name: \"Integer\", args: [] } };\n case FB.INT64:\n return scale < 0\n ? decimal(col)\n : { scalar: \"BigInt\", native: { name: \"BigInt\", args: [] } };\n case FB.FLOAT:\n return { scalar: \"Float\", native: { name: \"Float\", args: [] } };\n case FB.DOUBLE:\n return { scalar: \"Float\", native: { name: \"DoublePrecision\", args: [] } };\n case FB.BOOLEAN:\n return { scalar: \"Boolean\", native: { name: \"Boolean\", args: [] } };\n case FB.CHAR:\n return {\n scalar: \"String\",\n native: { name: \"Char\", args: col.charLength ? [col.charLength] : [] },\n };\n case FB.VARCHAR:\n return {\n scalar: \"String\",\n native: { name: \"VarChar\", args: col.charLength ? [col.charLength] : [] },\n };\n case FB.DATE:\n case FB.DATE_LEGACY:\n return { scalar: \"DateTime\", native: { name: \"Date\", args: [] } };\n case FB.TIME:\n return { scalar: \"DateTime\", native: { name: \"Time\", args: [] } };\n case FB.TIMESTAMP:\n return { scalar: \"DateTime\", native: { name: \"Timestamp\", args: [] } };\n case FB.BLOB:\n // sub_type 1 is a text blob.\n return col.fieldSubType === 1\n ? { scalar: \"String\", native: { name: \"Text\", args: [] } }\n : { scalar: \"Bytes\", native: { name: \"Blob\", args: [] } };\n default:\n return { scalar: \"String\" };\n }\n}\n\nfunction decimal(col: RawColumn): MappedType {\n const precision = col.precision ?? 18;\n const scaleAbs = Math.abs(col.scale ?? 0);\n return {\n scalar: \"Decimal\",\n native: { name: \"Decimal\", args: [precision, scaleAbs] },\n };\n}\n","import {\n type DefaultValue,\n type EnumNode,\n type FieldNode,\n type ModelNode,\n type SchemaDocument,\n} from \"@ember/ast\";\nimport type { SqlDriver } from \"@ember/driver\";\nimport { camelCase, lowerFirst, pascalCase, pluralize, uniq } from \"@ember/utils\";\nimport {\n FirebirdMetadataReader,\n type RawColumn,\n type RawConstraint,\n} from \"./firebird-meta\";\nimport { mapColumnType } from \"./type-map\";\n\nexport { FirebirdMetadataReader } from \"./firebird-meta\";\nexport { mapColumnType } from \"./type-map\";\n\nexport interface IntrospectOptions {\n datasource?: { name: string; provider: string; envVar?: string; url?: string };\n}\n\n/**\n * Reverse-engineer a SchemaDocument from a live Firebird database.\n * Table/column names are kept as-is via `@@map`/`@map` when the idiomatic\n * Ember name differs, and foreign keys become relation fields on both sides.\n */\nexport class Introspector {\n constructor(private readonly driver: SqlDriver) {}\n\n async introspect(options: IntrospectOptions = {}): Promise<SchemaDocument> {\n const { tables, columns, constraints } = await this.driver.transaction(\n async (tx) => {\n const reader = new FirebirdMetadataReader(tx);\n return {\n tables: await reader.tables(),\n columns: await reader.columns(),\n constraints: await reader.constraints(),\n };\n },\n { isolation: \"READ_COMMITTED_READ_ONLY\" },\n );\n\n const columnsByTable = groupBy(columns, (c) => c.table);\n const constraintsByTable = groupBy(constraints, (c) => c.table);\n const modelNames = buildNameMap(tables);\n\n const models: ModelNode[] = tables.map((table) =>\n this.buildModel(\n table,\n modelNames,\n columnsByTable.get(table) ?? [],\n constraintsByTable.get(table) ?? [],\n ),\n );\n\n addRelations(models, modelNames, constraints);\n\n const enums: EnumNode[] = [];\n const doc: SchemaDocument = {\n generators: [\n { name: \"client\", provider: \"ember-client-js\", output: \"../generated\", config: {} },\n ],\n models,\n enums,\n };\n if (options.datasource) {\n doc.datasource = {\n name: options.datasource.name,\n provider: options.datasource.provider,\n url: options.datasource.envVar\n ? { kind: \"env\", value: options.datasource.envVar }\n : { kind: \"literal\", value: options.datasource.url ?? \"\" },\n };\n }\n return doc;\n }\n\n private buildModel(\n table: string,\n modelNames: Map<string, string>,\n columns: RawColumn[],\n constraints: RawConstraint[],\n ): ModelNode {\n const modelName = modelNames.get(table)!;\n const pk = constraints.find((c) => c.type === \"PRIMARY KEY\");\n const uniques = constraints.filter((c) => c.type === \"UNIQUE\");\n\n const fieldNameMap = buildNameMap(columns.map((c) => c.name), camelCase);\n const fields: FieldNode[] = columns.map((col) =>\n buildField(col, fieldNameMap, pk, uniques),\n );\n\n const model: ModelNode = {\n name: modelName,\n dbName: modelName !== table ? table : undefined,\n fields,\n primaryKey:\n pk && pk.columns.length > 1\n ? pk.columns.map((c) => fieldNameMap.get(c)!)\n : [],\n uniqueIndexes: uniques\n .filter((u) => u.columns.length > 1)\n .map((u) => ({ fields: u.columns.map((c) => fieldNameMap.get(c)!) })),\n indexes: [],\n };\n return model;\n }\n}\n\nfunction buildField(\n col: RawColumn,\n fieldNameMap: Map<string, string>,\n pk: RawConstraint | undefined,\n uniques: RawConstraint[],\n): FieldNode {\n const fieldName = fieldNameMap.get(col.name)!;\n const mapped = mapColumnType(col);\n const isSingleIdCol =\n !!pk && pk.columns.length === 1 && pk.columns[0] === col.name;\n const isSingleUnique = uniques.some(\n (u) => u.columns.length === 1 && u.columns[0] === col.name,\n );\n\n const field: FieldNode = {\n name: fieldName,\n type: mapped.scalar,\n kind: \"scalar\",\n isList: false,\n isRequired: col.notNull || isSingleIdCol,\n isId: isSingleIdCol,\n isUnique: isSingleUnique,\n isUpdatedAt: false,\n dbName: fieldName !== col.name ? col.name : undefined,\n nativeType: mapped.native,\n default: parseDefault(col),\n };\n return field;\n}\n\nfunction parseDefault(col: RawColumn): DefaultValue | undefined {\n if (col.isIdentity) return { function: { name: \"autoincrement\", args: [] } };\n if (!col.defaultSource) return undefined;\n const src = col.defaultSource.replace(/^DEFAULT\\s+/i, \"\").trim();\n if (/^CURRENT_TIMESTAMP/i.test(src)) return { function: { name: \"now\", args: [] } };\n if (/^(TRUE|FALSE)$/i.test(src)) return { literal: /^TRUE$/i.test(src) };\n if (/^-?\\d+(\\.\\d+)?$/.test(src)) return { literal: Number(src) };\n const str = /^'(.*)'$/.exec(src);\n if (str) return { literal: str[1]! };\n return undefined;\n}\n\n/**\n * Create relation fields on both sides of every foreign key:\n * - the child gets a to-one field with `@relation(fields, references)`;\n * - the parent gets a to-many back relation (a list).\n */\nfunction addRelations(\n models: ModelNode[],\n modelNames: Map<string, string>,\n constraints: RawConstraint[],\n): void {\n const byName = new Map(models.map((m) => [m.name, m]));\n for (const fk of constraints) {\n if (fk.type !== \"FOREIGN KEY\" || !fk.references) continue;\n const childModel = byName.get(modelNames.get(fk.table)!);\n const parentModel = byName.get(modelNames.get(fk.references.table)!);\n if (!childModel || !parentModel) continue;\n\n const localFieldNames = fk.columns.map((c) => columnToField(childModel, c));\n const refFieldNames = fk.references.columns.map((c) =>\n columnToField(parentModel, c),\n );\n\n const childFieldName = uniqueFieldName(childModel, lowerFirst(parentModel.name));\n childModel.fields.push({\n name: childFieldName,\n type: parentModel.name,\n kind: \"object\",\n isList: false,\n isRequired: localFieldNames.every(\n (n) => childModel.fields.find((f) => f.name === n)?.isRequired,\n ),\n isId: false,\n isUnique: false,\n isUpdatedAt: false,\n relation: {\n fields: localFieldNames,\n references: refFieldNames,\n onDelete: mapRule(fk.deleteRule),\n onUpdate: mapRule(fk.updateRule),\n },\n });\n\n const backName = uniqueFieldName(\n parentModel,\n lowerFirst(pluralize(childModel.name)),\n );\n parentModel.fields.push({\n name: backName,\n type: childModel.name,\n kind: \"object\",\n isList: true,\n isRequired: false,\n isId: false,\n isUnique: false,\n isUpdatedAt: false,\n });\n }\n}\n\nfunction columnToField(model: ModelNode, column: string): string {\n const f = model.fields.find((x) => (x.dbName ?? x.name) === column);\n return f ? f.name : camelCase(column);\n}\n\nfunction uniqueFieldName(model: ModelNode, base: string): string {\n let name = base;\n let i = 1;\n while (model.fields.some((f) => f.name === name)) name = `${base}_${++i}`;\n return name;\n}\n\nfunction mapRule(rule?: string) {\n switch ((rule ?? \"\").toUpperCase()) {\n case \"CASCADE\":\n return \"Cascade\" as const;\n case \"SET NULL\":\n return \"SetNull\" as const;\n case \"SET DEFAULT\":\n return \"SetDefault\" as const;\n case \"NO ACTION\":\n return \"NoAction\" as const;\n case \"RESTRICT\":\n return \"Restrict\" as const;\n default:\n return undefined;\n }\n}\n\n// ---- name helpers ---------------------------------------------------------\n\nfunction buildNameMap(\n dbNames: string[],\n transform: (s: string) => string = pascalCase,\n): Map<string, string> {\n const map = new Map<string, string>();\n const used = new Set<string>();\n for (const dbName of uniq(dbNames)) {\n let name = transform(dbName);\n if (!name) name = dbName;\n let candidate = name;\n let i = 1;\n while (used.has(candidate)) candidate = `${name}_${++i}`;\n used.add(candidate);\n map.set(dbName, candidate);\n }\n return map;\n}\n\nfunction groupBy<T>(items: T[], key: (t: T) => string): Map<string, T[]> {\n const map = new Map<string, T[]>();\n for (const item of items) {\n const k = key(item);\n const list = map.get(k) ?? [];\n list.push(item);\n map.set(k, list);\n }\n return map;\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport {\n type EnumNode,\n type FieldNode,\n type ModelNode,\n type SchemaDocument,\n relationFields,\n scalarFields,\n} from \"@ember/ast\";\nimport { lowerFirst } from \"@ember/utils\";\nimport { baseTsType } from \"./ts-types\";\n\nexport { baseTsType, fieldTsType } from \"./ts-types\";\n\n/**\n * Generates a fully-typed TypeScript client from a schema. Produces per-model\n * scalar types, relation payloads, filter/where/select/include/create/update\n * input types, typed delegates, and the `EmberClient` class (which embeds the\n * schema so it can run with no extra wiring).\n */\nexport class ClientGenerator {\n constructor(private readonly schema: SchemaDocument) {}\n\n generate(): string {\n const parts: string[] = [];\n parts.push(this.header());\n parts.push(this.enums());\n parts.push(this.modelTypes());\n parts.push(this.registry());\n parts.push(PAYLOAD_RESOLVER);\n parts.push(this.namespace());\n parts.push(this.clientClass());\n return parts.filter(Boolean).join(\"\\n\\n\") + \"\\n\";\n }\n\n // ---- header & shared ----------------------------------------------------\n\n private header(): string {\n return `// AUTO-GENERATED by EmberORM. Do not edit by hand.\n/* eslint-disable */\nimport { EmberClientBase } from \"ember-orm/client\";\nimport type { ClientOptions } from \"ember-orm/client\";\n\nexport type JsonValue =\n | string\n | number\n | boolean\n | null\n | { [key: string]: JsonValue }\n | JsonValue[];\n\nexport type SortOrder = \"asc\" | \"desc\";\nexport type QueryMode = \"default\" | \"insensitive\";\n\nconst schemaDocument = ${JSON.stringify(this.schema)} as unknown as ClientOptions[\"schema\"];`;\n }\n\n private enums(): string {\n return this.schema.enums.map((e) => this.enumType(e)).join(\"\\n\\n\");\n }\n\n private enumType(node: EnumNode): string {\n const values = node.values.map((v) => ` ${v.name}: \"${v.name}\"`).join(\",\\n\");\n return `export const ${node.name} = {\\n${values}\\n} as const;\nexport type ${node.name} = (typeof ${node.name})[keyof typeof ${node.name}];`;\n }\n\n private modelTypes(): string {\n return this.schema.models.map((m) => this.modelType(m)).join(\"\\n\\n\");\n }\n\n private modelType(model: ModelNode): string {\n const scalars = scalarFields(model)\n .map((f) => ` ${f.name}: ${this.scalarType(f)};`)\n .join(\"\\n\");\n\n const lines: string[] = [];\n // Public model type is scalar-only; relations are resolved per-query.\n lines.push(`export type ${model.name} = {\\n${scalars}\\n};`);\n // Recursive payload resolver (handles nested select/include narrowing).\n lines.push(`export type ${model.name}GetPayload<A> = $Payload<\"${model.name}\", A>;`);\n lines.push(this.fluentType(model));\n return lines.join(\"\\n\");\n }\n\n /**\n * Fluent-API return type for single-record reads: a Promise of the payload\n * that also exposes a method per relation (to-many -> array; to-one ->\n * chainable fluent).\n */\n private fluentType(model: ModelNode): string {\n const n = model.name;\n const methods = relationFields(model).map((f) => {\n if (f.isList) {\n return ` ${f.name}<S extends Prisma.${f.type}FindManyArgs = {}>(args?: S): Promise<${f.type}GetPayload<S>[]>;`;\n }\n return ` ${f.name}<S extends Prisma.${f.type}FindFirstArgs = {}>(args?: S): ${f.type}Fluent<S, null>;`;\n });\n return `export type ${n}Fluent<A, Null = null> = Promise<${n}GetPayload<A> | Null> & {\n${methods.join(\"\\n\")}\n};`;\n }\n\n /**\n * Type-level registry powering recursive payload resolution: a model-name\n * union, a scalar-payload map, and a relation map carrying each relation's\n * target model, list-ness and nullability.\n */\n private registry(): string {\n const names = this.schema.models.map((m) => `\"${m.name}\"`).join(\" | \");\n\n const scalarEntries = this.schema.models\n .map((m) => ` ${m.name}: ${m.name};`)\n .join(\"\\n\");\n\n const relationEntries = this.schema.models\n .map((m) => {\n const rels = relationFields(m)\n .map((f) => {\n const nullable = !f.isList && !f.isRequired ? \"; isNullable: true\" : \"\";\n return ` ${f.name}: { model: \"${f.type}\"; isList: ${f.isList}${nullable} }`;\n })\n .join(\";\\n\");\n return ` ${m.name}: {${rels ? `\\n${rels}\\n ` : \"\"}};`;\n })\n .join(\"\\n\");\n\n return `export type $ModelName = ${names || \"never\"};\n\nexport interface $ScalarPayload {\n${scalarEntries}\n}\n\nexport interface $RelationMap {\n${relationEntries}\n}`;\n }\n\n private scalarType(field: FieldNode): string {\n const base = baseTsType(field, this.schema);\n if (field.isList) return `${base}[]`;\n return field.isRequired ? base : `${base} | null`;\n }\n\n // ---- input types (Prisma namespace) -------------------------------------\n\n private namespace(): string {\n const blocks: string[] = [SHARED_FILTERS];\n for (const model of this.schema.models) {\n blocks.push(this.whereInput(model));\n blocks.push(this.orderByInput(model));\n blocks.push(this.selectInclude(model));\n blocks.push(this.dataInputs(model));\n blocks.push(this.argsTypes(model));\n blocks.push(this.delegateInterface(model));\n }\n return `export namespace Prisma {\\n${indentBlock(blocks.join(\"\\n\\n\"))}\\n}`;\n }\n\n private whereInput(model: ModelNode): string {\n const fields: string[] = [];\n for (const f of model.fields) {\n if (f.kind === \"object\") {\n fields.push(` ${f.name}?: ${this.relationFilter(f)};`);\n } else {\n fields.push(` ${f.name}?: ${this.fieldFilter(f)};`);\n }\n }\n return `export type ${model.name}WhereInput = {\n AND?: ${model.name}WhereInput | ${model.name}WhereInput[];\n OR?: ${model.name}WhereInput[];\n NOT?: ${model.name}WhereInput | ${model.name}WhereInput[];\n${fields.join(\"\\n\")}\n};\n\nexport type ${model.name}WhereUniqueInput = ${this.whereUnique(model)};`;\n }\n\n private whereUnique(model: ModelNode): string {\n const uniques = new Set<string>();\n for (const f of model.fields) if (f.isId || f.isUnique) uniques.add(f.name);\n for (const f of model.primaryKey) uniques.add(f);\n const parts = [...uniques].map((name) => {\n const field = model.fields.find((x) => x.name === name)!;\n return `{ ${name}: ${baseTsType(field, this.schema)} }`;\n });\n const base = `Partial<${model.name}WhereInput>`;\n return parts.length ? `(${parts.join(\" | \")}) & ${base}` : base;\n }\n\n private fieldFilter(field: FieldNode): string {\n const base = baseTsType(field, this.schema);\n const filterName = FILTER_FOR_SCALAR[field.type] ?? null;\n if (field.kind === \"enum\") {\n return `${base} | { equals?: ${base}; in?: ${base}[]; notIn?: ${base}[]; not?: ${base} }`;\n }\n if (filterName) return `${base} | ${filterName}`;\n return `${base}`;\n }\n\n private relationFilter(field: FieldNode): string {\n if (field.isList) {\n return `{ some?: ${field.type}WhereInput; every?: ${field.type}WhereInput; none?: ${field.type}WhereInput }`;\n }\n return `${field.type}WhereInput | { is?: ${field.type}WhereInput | null; isNot?: ${field.type}WhereInput | null } | null`;\n }\n\n private orderByInput(model: ModelNode): string {\n const fields = scalarFields(model)\n .map((f) => ` ${f.name}?: SortOrder;`)\n .join(\"\\n\");\n return `export type ${model.name}OrderByInput = {\\n${fields}\\n};`;\n }\n\n private selectInclude(model: ModelNode): string {\n const scalarSel = scalarFields(model)\n .map((f) => ` ${f.name}?: boolean;`)\n .join(\"\\n\");\n const relSel = relationFields(model)\n .map((f) => ` ${f.name}?: boolean | ${f.type}FindManyArgs;`)\n .join(\"\\n\");\n const include = relationFields(model)\n .map((f) => ` ${f.name}?: boolean | ${f.type}FindManyArgs;`)\n .join(\"\\n\");\n\n const listRelations = relationFields(model).filter((f) => f.isList);\n const countLine = listRelations.length\n ? `\\n _count?: boolean | { select?: { ${listRelations\n .map((f) => `${f.name}?: boolean`)\n .join(\"; \")} } };`\n : \"\";\n\n return `export type ${model.name}Select = {\n${scalarSel}${relSel ? \"\\n\" + relSel : \"\"}${countLine}\n};\n\nexport type ${model.name}Include = {\n${include || \" [k: string]: never;\"}${countLine}\n};`;\n }\n\n private dataInputs(model: ModelNode): string {\n // Foreign-key scalars can be supplied via their relation, so they are\n // optional in CreateInput (mirrors Prisma's CreateWithout* inputs).\n const foreignKeys = new Set<string>();\n for (const rel of relationFields(model)) {\n for (const fk of rel.relation?.fields ?? []) foreignKeys.add(fk);\n }\n const createScalars = scalarFields(model)\n .filter((f) => !isGeneratedOnCreate(f))\n .map((f) => {\n const optional =\n isOptionalOnCreate(f) || foreignKeys.has(f.name) ? \"?\" : \"\";\n return ` ${f.name}${optional}: ${this.inputScalarType(f)};`;\n });\n const createRelations = relationFields(model).map(\n (f) => ` ${f.name}?: ${this.nestedCreate(f)};`,\n );\n const updateScalars = scalarFields(model).map(\n (f) => ` ${f.name}?: ${this.updateScalarType(f)};`,\n );\n const updateRelations = relationFields(model).map(\n (f) => ` ${f.name}?: ${this.nestedUpdate(f)};`,\n );\n\n return `export type ${model.name}CreateInput = {\n${[...createScalars, ...createRelations].join(\"\\n\")}\n};\n\nexport type ${model.name}UpdateInput = {\n${[...updateScalars, ...updateRelations].join(\"\\n\")}\n};`;\n }\n\n private inputScalarType(field: FieldNode): string {\n const base = baseTsType(field, this.schema);\n if (field.isList) return `${base}[]`;\n return field.isRequired ? base : `${base} | null`;\n }\n\n /**\n * Update value for a scalar field: a bare value, `{ set }`, and — for numeric\n * fields — the atomic operators increment/decrement/multiply/divide.\n */\n private updateScalarType(field: FieldNode): string {\n const value = this.inputScalarType(field);\n if (field.isList) return value;\n const base = baseTsType(field, this.schema);\n if (NUMERIC_SCALARS.has(field.type)) {\n const nullable = field.isRequired ? \"\" : \" | null\";\n return `${value} | { set?: ${base}${nullable}; increment?: ${base}; decrement?: ${base}; multiply?: ${base}; divide?: ${base} }`;\n }\n return `${value} | { set?: ${value} }`;\n }\n\n private nestedCreate(field: FieldNode): string {\n const t = field.type;\n if (field.isList) {\n return `{ create?: ${t}CreateInput | ${t}CreateInput[]; connect?: ${t}WhereUniqueInput | ${t}WhereUniqueInput[]; connectOrCreate?: { where: ${t}WhereUniqueInput; create: ${t}CreateInput } | { where: ${t}WhereUniqueInput; create: ${t}CreateInput }[] }`;\n }\n return `{ create?: ${t}CreateInput; connect?: ${t}WhereUniqueInput; connectOrCreate?: { where: ${t}WhereUniqueInput; create: ${t}CreateInput } }`;\n }\n\n private nestedUpdate(field: FieldNode): string {\n const t = field.type;\n if (field.isList) {\n return `{ create?: ${t}CreateInput | ${t}CreateInput[]; connect?: ${t}WhereUniqueInput | ${t}WhereUniqueInput[]; disconnect?: ${t}WhereUniqueInput | ${t}WhereUniqueInput[]; set?: ${t}WhereUniqueInput | ${t}WhereUniqueInput[]; delete?: ${t}WhereUniqueInput | ${t}WhereUniqueInput[] }`;\n }\n return `{ create?: ${t}CreateInput; connect?: ${t}WhereUniqueInput; disconnect?: boolean }`;\n }\n\n private argsTypes(model: ModelNode): string {\n const n = model.name;\n return `export type ${n}Omit = Partial<Record<keyof ${n}, boolean>>;\n\nexport type ${n}FindManyArgs = {\n where?: ${n}WhereInput;\n orderBy?: ${n}OrderByInput | ${n}OrderByInput[];\n select?: ${n}Select;\n include?: ${n}Include;\n omit?: ${n}Omit;\n take?: number;\n skip?: number;\n cursor?: ${n}WhereUniqueInput;\n distinct?: (keyof ${n})[];\n};\n\nexport type ${n}FindFirstArgs = ${n}FindManyArgs;\n\nexport type ${n}FindUniqueArgs = {\n where: ${n}WhereUniqueInput;\n select?: ${n}Select;\n include?: ${n}Include;\n omit?: ${n}Omit;\n};\n\nexport type ${n}CreateArgs = {\n data: ${n}CreateInput;\n select?: ${n}Select;\n include?: ${n}Include;\n omit?: ${n}Omit;\n};\n\nexport type ${n}CreateManyArgs = { data: ${n}CreateInput[]; skipDuplicates?: boolean };\n\nexport type ${n}CreateManyAndReturnArgs = {\n data: ${n}CreateInput[];\n select?: ${n}Select;\n omit?: ${n}Omit;\n skipDuplicates?: boolean;\n};\n\nexport type ${n}UpdateArgs = {\n where: ${n}WhereUniqueInput;\n data: ${n}UpdateInput;\n select?: ${n}Select;\n include?: ${n}Include;\n omit?: ${n}Omit;\n};\n\nexport type ${n}UpdateManyArgs = { where?: ${n}WhereInput; data: ${n}UpdateInput };\n\nexport type ${n}UpsertArgs = {\n where: ${n}WhereUniqueInput;\n create: ${n}CreateInput;\n update: ${n}UpdateInput;\n select?: ${n}Select;\n include?: ${n}Include;\n omit?: ${n}Omit;\n};\n\nexport type ${n}DeleteArgs = { where: ${n}WhereUniqueInput; select?: ${n}Select; include?: ${n}Include };\nexport type ${n}DeleteManyArgs = { where?: ${n}WhereInput };\n\nexport type ${n}CountArgs = { where?: ${n}WhereInput; take?: number; skip?: number };\n\nexport type ${n}AggregateArgs = {\n where?: ${n}WhereInput;\n _count?: true | Partial<Record<keyof ${n}, boolean>>;\n _avg?: Partial<Record<keyof ${n}, boolean>>;\n _sum?: Partial<Record<keyof ${n}, boolean>>;\n _min?: Partial<Record<keyof ${n}, boolean>>;\n _max?: Partial<Record<keyof ${n}, boolean>>;\n};\n\nexport type ${n}GroupByArgs = ${n}AggregateArgs & {\n by: (keyof ${n})[];\n having?: ${n}WhereInput;\n orderBy?: ${n}OrderByInput | ${n}OrderByInput[];\n};`;\n }\n\n private delegateInterface(model: ModelNode): string {\n const n = model.name;\n return `export interface ${n}Delegate {\n findMany<A extends ${n}FindManyArgs>(args?: A): Promise<${n}GetPayload<A>[]>;\n findFirst<A extends ${n}FindFirstArgs>(args?: A): ${n}Fluent<A, null>;\n findFirstOrThrow<A extends ${n}FindFirstArgs>(args?: A): ${n}Fluent<A, never>;\n findUnique<A extends ${n}FindUniqueArgs>(args: A): ${n}Fluent<A, null>;\n findUniqueOrThrow<A extends ${n}FindUniqueArgs>(args: A): ${n}Fluent<A, never>;\n create<A extends ${n}CreateArgs>(args: A): Promise<${n}GetPayload<A>>;\n createMany(args: ${n}CreateManyArgs): Promise<{ count: number }>;\n createManyAndReturn<A extends ${n}CreateManyAndReturnArgs>(args: A): Promise<${n}GetPayload<A>[]>;\n update<A extends ${n}UpdateArgs>(args: A): Promise<${n}GetPayload<A>>;\n updateMany(args: ${n}UpdateManyArgs): Promise<{ count: number }>;\n upsert<A extends ${n}UpsertArgs>(args: A): Promise<${n}GetPayload<A>>;\n delete<A extends ${n}DeleteArgs>(args: A): Promise<${n}GetPayload<A>>;\n deleteMany(args?: ${n}DeleteManyArgs): Promise<{ count: number }>;\n count(args?: ${n}CountArgs): Promise<number>;\n aggregate(args?: ${n}AggregateArgs): Promise<Record<string, any>>;\n groupBy(args: ${n}GroupByArgs): Promise<Record<string, any>[]>;\n}`;\n }\n\n // ---- client class -------------------------------------------------------\n\n private clientClass(): string {\n const delegates = this.schema.models\n .map((m) => ` declare readonly ${lowerFirst(m.name)}: Prisma.${m.name}Delegate;`)\n .join(\"\\n\");\n return `export type EmberClientOptions = {\n datasourceUrl?: string;\n datasource?: ClientOptions[\"datasource\"];\n log?: ClientOptions[\"log\"];\n};\n\nexport class EmberClient extends EmberClientBase {\n constructor(options: EmberClientOptions = {}) {\n super({ schema: schemaDocument, ...options });\n }\n\n${delegates}\n}`;\n }\n}\n\nexport function generateClientSource(schema: SchemaDocument): string {\n return new ClientGenerator(schema).generate();\n}\n\n/** Generate and write the client to `<outDir>/index.ts`. Returns the path. */\nexport function writeClient(schema: SchemaDocument, outDir: string): string {\n const source = generateClientSource(schema);\n const file = resolve(outDir, \"index.ts\");\n mkdirSync(dirname(file), { recursive: true });\n writeFileSync(file, source, \"utf8\");\n return file;\n}\n\n// ---- static template fragments -------------------------------------------\n\n/**\n * Generic, recursive payload resolver shared by every model's GetPayload.\n * Resolves nested `select`/`include` narrowing to arbitrary depth using the\n * `$ScalarPayload` / `$RelationMap` registries emitted per schema.\n */\nconst PAYLOAD_RESOLVER = `type $Scalar<M extends $ModelName> = $ScalarPayload[M];\ntype $Relations<M extends $ModelName> = M extends keyof $RelationMap\n ? $RelationMap[M]\n : {};\n\n// A relation sub-arg may be \\`true\\` (full payload) or a nested args object.\ntype $NormalizeArgs<Sub> = Sub extends object ? Sub : {};\n\ntype $RelationResult<Info, Sub> = Info extends {\n model: infer RM extends $ModelName;\n isList: infer L;\n}\n ? L extends true\n ? $Payload<RM, $NormalizeArgs<Sub>>[]\n : Info extends { isNullable: true }\n ? $Payload<RM, $NormalizeArgs<Sub>> | null\n : $Payload<RM, $NormalizeArgs<Sub>>\n : never;\n\n// To-many relation keys of a model (eligible for _count).\ntype $ListRelations<M extends $ModelName> = {\n [K in keyof $Relations<M>]: $Relations<M>[K] extends { isList: true }\n ? K\n : never;\n}[keyof $Relations<M>];\n\ntype $CountResult<M extends $ModelName, C> = C extends { select: infer SC }\n ? { [K in keyof SC & $ListRelations<M>]: number }\n : { [K in $ListRelations<M> & string]: number };\n\ntype $CountPart<M extends $ModelName, A> = A extends { _count: infer C }\n ? { _count: $CountResult<M, C> }\n : {};\n\ntype $SelectResult<M extends $ModelName, S> = {\n [K in keyof S & keyof $Scalar<M>]: $Scalar<M>[K];\n} & {\n [K in keyof S & keyof $Relations<M>]: $RelationResult<$Relations<M>[K], S[K]>;\n} & $CountPart<M, S>;\n\ntype $IncludeResult<M extends $ModelName, I> = {\n [K in keyof I & keyof $Relations<M>]: $RelationResult<$Relations<M>[K], I[K]>;\n} & $CountPart<M, I>;\n\nexport type $Payload<M extends $ModelName, A> = A extends { select: infer S }\n ? $SelectResult<M, S>\n : A extends { include: infer I }\n ? $Scalar<M> & $IncludeResult<M, I>\n : $Scalar<M>;`;\n\nconst NUMERIC_SCALARS = new Set([\"Int\", \"BigInt\", \"Float\", \"Decimal\"]);\n\nconst FILTER_FOR_SCALAR: Record<string, string> = {\n String: \"StringFilter\",\n Int: \"IntFilter\",\n BigInt: \"BigIntFilter\",\n Float: \"FloatFilter\",\n Decimal: \"FloatFilter\",\n Boolean: \"BoolFilter\",\n DateTime: \"DateTimeFilter\",\n Bytes: \"BytesFilter\",\n Json: \"JsonFilter\",\n};\n\nconst SHARED_FILTERS = `export type StringFilter = {\n equals?: string;\n not?: string | StringFilter;\n in?: string[];\n notIn?: string[];\n lt?: string;\n lte?: string;\n gt?: string;\n gte?: string;\n contains?: string;\n startsWith?: string;\n endsWith?: string;\n mode?: QueryMode;\n};\n\nexport type IntFilter = {\n equals?: number;\n not?: number | IntFilter;\n in?: number[];\n notIn?: number[];\n lt?: number;\n lte?: number;\n gt?: number;\n gte?: number;\n};\n\nexport type FloatFilter = IntFilter;\nexport type BigIntFilter = {\n equals?: bigint;\n not?: bigint | BigIntFilter;\n in?: bigint[];\n notIn?: bigint[];\n lt?: bigint;\n lte?: bigint;\n gt?: bigint;\n gte?: bigint;\n};\n\nexport type BoolFilter = { equals?: boolean; not?: boolean };\n\nexport type DateTimeFilter = {\n equals?: Date;\n not?: Date | DateTimeFilter;\n in?: Date[];\n notIn?: Date[];\n lt?: Date;\n lte?: Date;\n gt?: Date;\n gte?: Date;\n};\n\nexport type BytesFilter = { equals?: Buffer; not?: Buffer };\n\n// Firebird has no JSON SQL functions: filters operate on the serialized text.\n// 'path' is accepted by the type but rejected at runtime on Firebird.\nexport type JsonFilter = {\n equals?: JsonValue;\n not?: JsonValue;\n string_contains?: string;\n string_starts_with?: string;\n string_ends_with?: string;\n path?: string[];\n};`;\n\nfunction isGeneratedOnCreate(field: FieldNode): boolean {\n return field.default?.function?.name === \"autoincrement\";\n}\n\nfunction isOptionalOnCreate(field: FieldNode): boolean {\n return !field.isRequired || !!field.default || field.isUpdatedAt || field.isList;\n}\n\nfunction indentBlock(text: string): string {\n return text\n .split(\"\\n\")\n .map((l) => (l ? \" \" + l : l))\n .join(\"\\n\");\n}\n","import {\n type FieldNode,\n type ScalarType,\n type SchemaDocument,\n} from \"@ember/ast\";\n\nconst SCALAR_TS: Record<ScalarType, string> = {\n String: \"string\",\n Boolean: \"boolean\",\n Int: \"number\",\n BigInt: \"bigint\",\n Float: \"number\",\n Decimal: \"number\",\n DateTime: \"Date\",\n Bytes: \"Buffer\",\n Json: \"JsonValue\",\n};\n\n/** TS type for a scalar/enum field value (without null/array decoration). */\nexport function baseTsType(field: FieldNode, schema: SchemaDocument): string {\n if (field.kind === \"enum\") return field.type;\n if (field.kind === \"object\") return field.type;\n return SCALAR_TS[field.type as ScalarType] ?? \"unknown\";\n}\n\n/** Full TS type for a field, including null and array decoration. */\nexport function fieldTsType(field: FieldNode, schema: SchemaDocument): string {\n const base = baseTsType(field, schema);\n if (field.isList) return `${base}[]`;\n return field.isRequired ? base : `${base} | null`;\n}\n\n/** TS type usable as a filter value for a scalar field. */\nexport function scalarFilterType(field: FieldNode): string {\n const base = SCALAR_TS[field.type as ScalarType] ?? \"unknown\";\n return base;\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { type SchemaDocument, modelTable } from \"@ember/ast\";\nimport type { SqlDriver } from \"@ember/driver\";\nimport { FirebirdDialect, type SqlDialect } from \"@ember/sql\";\nimport { Introspector } from \"@ember/introspect\";\nimport { diffSchemas, type SchemaDiff } from \"./diff\";\nimport { planMigration, renderMigrationSql, splitStatements } from \"./planner\";\nimport {\n HISTORY_TABLE,\n appliedMigrations,\n checksum,\n ensureHistoryTable,\n listLocalMigrations,\n recordMigration,\n} from \"./history\";\n\nexport { diffSchemas } from \"./diff\";\nexport { planMigration, renderMigrationSql, splitStatements } from \"./planner\";\nexport { FirebirdDdl } from \"./ddl\";\nexport {\n HISTORY_TABLE,\n listLocalMigrations,\n appliedMigrations,\n ensureHistoryTable,\n} from \"./history\";\n\nexport interface DevResult {\n empty: boolean;\n id?: string;\n dir?: string;\n statements: string[];\n}\n\nexport interface DeployResult {\n applied: { id: string; steps: number }[];\n}\n\nexport interface StatusResult {\n applied: string[];\n pending: string[];\n}\n\n/**\n * Drives schema migrations against a live Firebird database. Diffs the desired\n * `.ember` schema against the introspected current state and emits/applies DDL.\n * The history table `_EMBER_MIGRATIONS` is always excluded from the diff.\n */\nexport class Migrator {\n private readonly dialect: SqlDialect;\n\n constructor(\n private readonly driver: SqlDriver,\n private readonly desired: SchemaDocument,\n private readonly migrationsDir: string,\n dialect?: SqlDialect,\n ) {\n this.dialect = dialect ?? new FirebirdDialect();\n }\n\n /** Compute the diff between the desired schema and the live database. */\n async diff(): Promise<SchemaDiff> {\n const current = await this.currentSchema();\n return diffSchemas(this.desired, current);\n }\n\n /** Plan (but do not apply) the DDL needed to reach the desired schema. */\n async plan(): Promise<string[]> {\n const diff = await this.diff();\n return planMigration(diff, this.desired, this.dialect);\n }\n\n /**\n * `migrate dev`: create a timestamped migration from the current diff, apply\n * it, and record it in history.\n */\n async dev(name = \"migration\"): Promise<DevResult> {\n const statements = await this.plan();\n if (statements.length === 0) return { empty: true, statements: [] };\n\n const id = `${timestamp()}_${slug(name)}`;\n const dir = join(this.migrationsDir, id);\n const body = renderMigrationSql(statements);\n mkdirSync(dir, { recursive: true });\n writeFileSync(join(dir, \"migration.sql\"), body, \"utf8\");\n\n await this.driver.transaction(async (tx) => {\n await ensureHistoryTable(tx, this.dialect);\n for (const stmt of statements) await tx.query(stmt);\n await recordMigration(tx, this.dialect, {\n id,\n checksum: checksum(body),\n steps: statements.length,\n });\n });\n\n return { empty: false, id, dir, statements };\n }\n\n /**\n * `db push`: apply the diff directly to the database without writing a\n * migration file (prototyping flow).\n */\n async push(): Promise<{ statements: string[] }> {\n const statements = await this.plan();\n if (statements.length === 0) return { statements: [] };\n await this.driver.transaction(async (tx) => {\n for (const stmt of statements) await tx.query(stmt);\n });\n return { statements };\n }\n\n /** `migrate deploy`: apply every on-disk migration not yet recorded. */\n async deploy(): Promise<DeployResult> {\n const local = listLocalMigrations(this.migrationsDir);\n const applied: { id: string; steps: number }[] = [];\n\n const known = await this.driver.transaction(async (tx) => {\n await ensureHistoryTable(tx, this.dialect);\n return new Set((await appliedMigrations(tx, this.dialect)).map((m) => m.id));\n });\n\n for (const migration of local) {\n if (known.has(migration.id)) continue;\n const statements = splitStatements(migration.sql);\n await this.driver.transaction(async (tx) => {\n for (const stmt of statements) await tx.query(stmt);\n await recordMigration(tx, this.dialect, {\n id: migration.id,\n checksum: checksum(migration.sql),\n steps: statements.length,\n });\n });\n applied.push({ id: migration.id, steps: statements.length });\n }\n return { applied };\n }\n\n /** `migrate status`: list applied vs pending migrations. */\n async status(): Promise<StatusResult> {\n const local = listLocalMigrations(this.migrationsDir).map((m) => m.id);\n const applied = await this.driver.transaction(async (tx) => {\n await ensureHistoryTable(tx, this.dialect);\n return (await appliedMigrations(tx, this.dialect)).map((m) => m.id);\n });\n const appliedSet = new Set(applied);\n return {\n applied,\n pending: local.filter((id) => !appliedSet.has(id)),\n };\n }\n\n private async currentSchema(): Promise<SchemaDocument> {\n const introspector = new Introspector(this.driver);\n const current = await introspector.introspect();\n // Never diff the migration bookkeeping table.\n current.models = current.models.filter(\n (m) => modelTable(m) !== HISTORY_TABLE,\n );\n return current;\n }\n}\n\nfunction timestamp(): string {\n const d = new Date();\n const p = (n: number, w = 2) => String(n).padStart(w, \"0\");\n return (\n `${d.getUTCFullYear()}${p(d.getUTCMonth() + 1)}${p(d.getUTCDate())}` +\n `${p(d.getUTCHours())}${p(d.getUTCMinutes())}${p(d.getUTCSeconds())}`\n );\n}\n\nfunction slug(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]+/g, \"_\").replace(/^_|_$/g, \"\") || \"migration\";\n}\n","import {\n type FieldNode,\n type ModelNode,\n type NativeType,\n type SchemaDocument,\n fieldColumn,\n modelTable,\n relationFields,\n scalarFields,\n} from \"@ember/ast\";\n\nexport interface ColumnChange {\n field: FieldNode;\n table: string;\n typeChanged: boolean;\n nullabilityChanged: boolean;\n}\n\nexport interface UniqueSpec {\n name: string;\n columns: string[];\n}\n\nexport interface ForeignKeySpec {\n name: string;\n columns: string[];\n refTable: string;\n refColumns: string[];\n onDelete?: string;\n onUpdate?: string;\n}\n\nexport interface IndexSpec {\n name: string;\n columns: string[];\n unique: boolean;\n}\n\nexport interface ModelChange {\n model: ModelNode; // desired\n table: string;\n addedColumns: FieldNode[];\n droppedColumns: string[];\n changedColumns: ColumnChange[];\n addedUniques: UniqueSpec[];\n addedForeignKeys: ForeignKeySpec[];\n}\n\nexport interface SchemaDiff {\n createdModels: ModelNode[];\n droppedTables: string[];\n modelChanges: ModelChange[];\n}\n\n/**\n * Structural diff turning `current` (usually introspected from the live DB)\n * into `desired` (the `.ember` schema). Pure and dialect-independent; the\n * planner converts it to DDL.\n *\n * Scope (safe subset): create/drop tables, add/drop/alter columns, and add\n * unique/foreign-key constraints that don't already exist. Dropping\n * constraints and plain (non-constraint) indexes on existing tables is left to\n * explicit user action — see doc/migrations.md.\n */\nexport function diffSchemas(\n desired: SchemaDocument,\n current: SchemaDocument,\n): SchemaDiff {\n const currentByTable = new Map(\n current.models.map((m) => [modelTable(m), m]),\n );\n const desiredTables = new Set(desired.models.map((m) => modelTable(m)));\n\n const createdModels: ModelNode[] = [];\n const modelChanges: ModelChange[] = [];\n\n for (const model of desired.models) {\n const table = modelTable(model);\n const currentModel = currentByTable.get(table);\n if (!currentModel) {\n createdModels.push(model);\n continue;\n }\n const change = diffModel(desired, model, currentModel, table);\n if (hasModelChanges(change)) modelChanges.push(change);\n }\n\n const droppedTables = current.models\n .map((m) => modelTable(m))\n .filter((t) => !desiredTables.has(t));\n\n return { createdModels, droppedTables, modelChanges };\n}\n\nfunction diffModel(\n desired: SchemaDocument,\n model: ModelNode,\n current: ModelNode,\n table: string,\n): ModelChange {\n const desiredCols = new Map(\n scalarFields(model).map((f) => [fieldColumn(f), f]),\n );\n const currentCols = new Map(\n scalarFields(current).map((f) => [fieldColumn(f), f]),\n );\n\n const addedColumns: FieldNode[] = [];\n const changedColumns: ColumnChange[] = [];\n for (const [col, field] of desiredCols) {\n const existing = currentCols.get(col);\n if (!existing) {\n addedColumns.push(field);\n continue;\n }\n const typeChanged = !sameColumnType(field, existing);\n const nullabilityChanged = field.isRequired !== existing.isRequired;\n if (typeChanged || nullabilityChanged) {\n changedColumns.push({ field, table, typeChanged, nullabilityChanged });\n }\n }\n\n const droppedColumns = [...currentCols.keys()].filter(\n (c) => !desiredCols.has(c),\n );\n\n const currentUniqueSets = uniqueColumnSets(current).map(setKey);\n const addedUniques = uniqueColumnSets(model)\n .filter((cols) => !currentUniqueSets.includes(setKey(cols)))\n .map((cols) => ({ name: constraintName(\"UQ\", table, cols), columns: cols }));\n\n const currentFkSets = foreignKeys(desired, current).map(fkKey);\n const addedForeignKeys = foreignKeys(desired, model)\n .filter((fk) => !currentFkSets.includes(fkKey(fk)))\n .map((fk) => ({ ...fk, name: constraintName(\"FK\", table, fk.columns) }));\n\n return {\n model,\n table,\n addedColumns,\n droppedColumns,\n changedColumns,\n addedUniques,\n addedForeignKeys,\n };\n}\n\nfunction hasModelChanges(c: ModelChange): boolean {\n return (\n c.addedColumns.length > 0 ||\n c.droppedColumns.length > 0 ||\n c.changedColumns.length > 0 ||\n c.addedUniques.length > 0 ||\n c.addedForeignKeys.length > 0\n );\n}\n\n// ---- extractors -----------------------------------------------------------\n\n/** Unique column-sets from single @unique fields and composite @@unique. */\nexport function uniqueColumnSets(model: ModelNode): string[][] {\n const sets: string[][] = [];\n for (const f of scalarFields(model)) {\n if (f.isUnique) sets.push([fieldColumn(f)]);\n }\n for (const u of model.uniqueIndexes) {\n sets.push(u.fields.map((name) => columnFor(model, name)));\n }\n return sets;\n}\n\nexport function indexSpecs(model: ModelNode): IndexSpec[] {\n return model.indexes.map((i) => ({\n name: i.name ?? constraintName(\"IDX\", modelTable(model), i.fields.map((n) => columnFor(model, n))),\n columns: i.fields.map((name) => columnFor(model, name)),\n unique: i.unique,\n }));\n}\n\n/** Owning-side foreign keys declared on this model. */\nexport function foreignKeys(\n schema: SchemaDocument,\n model: ModelNode,\n): Omit<ForeignKeySpec, \"name\">[] {\n const out: Omit<ForeignKeySpec, \"name\">[] = [];\n for (const f of relationFields(model)) {\n const rel = f.relation;\n if (!rel?.fields?.length) continue;\n const refModel = schema.models.find((m) => m.name === f.type);\n if (!refModel) continue;\n out.push({\n columns: rel.fields.map((name) => columnFor(model, name)),\n refTable: modelTable(refModel),\n refColumns: (rel.references ?? []).map((name) => columnFor(refModel, name)),\n onDelete: rel.onDelete,\n onUpdate: rel.onUpdate,\n });\n }\n return out;\n}\n\nfunction columnFor(model: ModelNode, fieldName: string): string {\n const f = model.fields.find((x) => x.name === fieldName);\n return f ? fieldColumn(f) : fieldName.toUpperCase();\n}\n\n// ---- comparison helpers ---------------------------------------------------\n\nfunction sameColumnType(a: FieldNode, b: FieldNode): boolean {\n if (a.type !== b.type) return false;\n return sameNative(a.nativeType, b.nativeType);\n}\n\nfunction sameNative(a?: NativeType, b?: NativeType): boolean {\n if (!a && !b) return true;\n if (!a || !b) return true; // one side unspecified: treat as compatible\n return a.name === b.name && a.args.join(\",\") === b.args.join(\",\");\n}\n\nfunction setKey(cols: string[]): string {\n return [...cols].sort().join(\",\");\n}\n\nfunction fkKey(fk: Omit<ForeignKeySpec, \"name\">): string {\n return `${setKey(fk.columns)}->${fk.refTable}(${setKey(fk.refColumns)})`;\n}\n\n/** Deterministic, length-capped constraint/index name. */\nexport function constraintName(\n prefix: string,\n table: string,\n columns: string[],\n): string {\n const base = `${prefix}_${table}_${columns.join(\"_\")}`.replace(/[^A-Za-z0-9_]/g, \"_\");\n if (base.length <= 31) return base;\n // Cap to Firebird's classic 31-char identifier limit with a stable hash.\n let hash = 0;\n for (let i = 0; i < base.length; i++) hash = (hash * 31 + base.charCodeAt(i)) | 0;\n const suffix = Math.abs(hash).toString(36).slice(0, 6);\n return `${base.slice(0, 24)}_${suffix}`;\n}\n","import {\n type DefaultValue,\n type FieldNode,\n type ModelNode,\n type ScalarType,\n fieldColumn,\n idFields,\n modelTable,\n scalarFields,\n} from \"@ember/ast\";\nimport { type SqlDialect } from \"@ember/sql\";\n\n/**\n * Generates Firebird DDL from schema nodes. Pure string generation (no I/O),\n * so it is fully unit-testable. Identifier quoting is delegated to the dialect\n * (Strategy) to stay backend-agnostic at the call sites.\n */\nexport class FirebirdDdl {\n constructor(private readonly d: SqlDialect) {}\n\n // ---- column types -------------------------------------------------------\n\n /** Firebird column type for a field, honoring its `@db.*` native type. */\n columnType(field: FieldNode): string {\n const native = field.nativeType;\n if (native) {\n const args = native.args.length ? `(${native.args.join(\", \")})` : \"\";\n switch (native.name) {\n case \"VarChar\":\n return `VARCHAR${args || \"(255)\"}`;\n case \"Char\":\n return `CHAR${args || \"(1)\"}`;\n case \"Text\":\n return \"BLOB SUB_TYPE TEXT\";\n case \"SmallInt\":\n return \"SMALLINT\";\n case \"Integer\":\n return \"INTEGER\";\n case \"BigInt\":\n return \"BIGINT\";\n case \"Float\":\n return \"FLOAT\";\n case \"DoublePrecision\":\n return \"DOUBLE PRECISION\";\n case \"Decimal\":\n return `DECIMAL${args || \"(18, 4)\"}`;\n case \"Boolean\":\n return this.d.booleanColumnType();\n case \"Date\":\n return \"DATE\";\n case \"Time\":\n return \"TIME\";\n case \"Timestamp\":\n return \"TIMESTAMP\";\n case \"Blob\":\n return \"BLOB SUB_TYPE BINARY\";\n }\n }\n if (field.type === \"Boolean\") return this.d.booleanColumnType();\n return DEFAULT_DDL_TYPE[field.type as ScalarType] ?? \"VARCHAR(255)\";\n }\n\n /** `\"COL\" <type> [GENERATED ...] [DEFAULT ...] [NOT NULL]`. */\n columnDefinition(field: FieldNode): string {\n const parts = [this.d.quoteId(fieldColumn(field)), this.columnType(field)];\n if (isIdentity(field) && this.d.supportsIdentity) {\n parts.push(\"GENERATED BY DEFAULT AS IDENTITY\");\n } else if (!isIdentity(field)) {\n const def = defaultClause(field.default);\n if (def) parts.push(def);\n }\n if (field.isRequired) parts.push(\"NOT NULL\");\n return parts.join(\" \");\n }\n\n /**\n * On Firebird 2.1/2.5 (no IDENTITY), emulate autoincrement with a SEQUENCE\n * and a BEFORE INSERT trigger. Returns the extra DDL objects to create after\n * the table; an empty array when IDENTITY is supported.\n */\n autoIncrementObjects(model: ModelNode): string[] {\n if (this.d.supportsIdentity) return [];\n const table = modelTable(model);\n const out: string[] = [];\n for (const field of scalarFields(model)) {\n if (isIdentity(field)) {\n out.push(...this.autoIncrementForColumn(table, fieldColumn(field)));\n }\n }\n return out;\n }\n\n autoIncrementForColumn(table: string, column: string): string[] {\n if (this.d.supportsIdentity) return [];\n const seq = capName(`GEN_${table}_${column}`);\n const trig = capName(`${table}_BI_${column}`);\n const qTable = this.d.quoteId(table);\n const qCol = this.d.quoteId(column);\n const qSeq = this.d.quoteId(seq);\n return [\n `CREATE SEQUENCE ${qSeq}`,\n `CREATE TRIGGER ${this.d.quoteId(trig)} FOR ${qTable} ACTIVE BEFORE INSERT POSITION 0 AS\\n` +\n `BEGIN\\n` +\n ` IF (NEW.${qCol} IS NULL) THEN NEW.${qCol} = GEN_ID(${qSeq}, 1);\\n` +\n `END`,\n ];\n }\n\n // ---- table-level --------------------------------------------------------\n\n createTable(model: ModelNode): string {\n const cols = scalarFields(model).map((f) => \" \" + this.columnDefinition(f));\n const pk = idFields(model);\n const lines = [...cols];\n if (pk.length > 0) {\n lines.push(\n ` PRIMARY KEY (${pk.map((f) => this.d.quoteId(fieldColumn(f))).join(\", \")})`,\n );\n }\n return `CREATE TABLE ${this.d.quoteId(modelTable(model))} (\\n${lines.join(\",\\n\")}\\n)`;\n }\n\n dropTable(table: string): string {\n return `DROP TABLE ${this.d.quoteId(table)}`;\n }\n\n addColumn(table: string, field: FieldNode): string {\n return `ALTER TABLE ${this.d.quoteId(table)} ADD ${this.columnDefinition(field)}`;\n }\n\n dropColumn(table: string, column: string): string {\n return `ALTER TABLE ${this.d.quoteId(table)} DROP ${this.d.quoteId(column)}`;\n }\n\n /** Change a column's data type (Firebird: ALTER COLUMN ... TYPE ...). */\n alterColumnType(table: string, field: FieldNode): string {\n return `ALTER TABLE ${this.d.quoteId(table)} ALTER COLUMN ${this.d.quoteId(\n fieldColumn(field),\n )} TYPE ${this.columnType(field)}`;\n }\n\n setNotNull(table: string, column: string, notNull: boolean): string {\n const action = notNull ? \"SET NOT NULL\" : \"DROP NOT NULL\";\n return `ALTER TABLE ${this.d.quoteId(table)} ALTER COLUMN ${this.d.quoteId(\n column,\n )} ${action}`;\n }\n\n // ---- constraints & indexes ---------------------------------------------\n\n addUnique(table: string, name: string, columns: string[]): string {\n return `ALTER TABLE ${this.d.quoteId(table)} ADD CONSTRAINT ${this.d.quoteId(\n name,\n )} UNIQUE (${columns.map((c) => this.d.quoteId(c)).join(\", \")})`;\n }\n\n dropConstraint(table: string, name: string): string {\n return `ALTER TABLE ${this.d.quoteId(table)} DROP CONSTRAINT ${this.d.quoteId(name)}`;\n }\n\n addForeignKey(\n table: string,\n name: string,\n columns: string[],\n refTable: string,\n refColumns: string[],\n onDelete?: string,\n onUpdate?: string,\n ): string {\n let sql = `ALTER TABLE ${this.d.quoteId(table)} ADD CONSTRAINT ${this.d.quoteId(\n name,\n )} FOREIGN KEY (${columns.map((c) => this.d.quoteId(c)).join(\", \")}) REFERENCES ${this.d.quoteId(\n refTable,\n )} (${refColumns.map((c) => this.d.quoteId(c)).join(\", \")})`;\n if (onUpdate) sql += ` ON UPDATE ${referentialSql(onUpdate)}`;\n if (onDelete) sql += ` ON DELETE ${referentialSql(onDelete)}`;\n return sql;\n }\n\n createIndex(\n table: string,\n name: string,\n columns: string[],\n unique: boolean,\n ): string {\n return `CREATE ${unique ? \"UNIQUE \" : \"\"}INDEX ${this.d.quoteId(name)} ON ${this.d.quoteId(\n table,\n )} (${columns.map((c) => this.d.quoteId(c)).join(\", \")})`;\n }\n\n dropIndex(name: string): string {\n return `DROP INDEX ${this.d.quoteId(name)}`;\n }\n}\n\n// ---- helpers --------------------------------------------------------------\n\nconst DEFAULT_DDL_TYPE: Record<ScalarType, string> = {\n String: \"VARCHAR(255)\",\n Boolean: \"BOOLEAN\",\n Int: \"INTEGER\",\n BigInt: \"BIGINT\",\n Float: \"DOUBLE PRECISION\",\n Decimal: \"DECIMAL(18, 4)\",\n DateTime: \"TIMESTAMP\",\n Bytes: \"BLOB SUB_TYPE BINARY\",\n Json: \"BLOB SUB_TYPE TEXT\",\n};\n\nexport function isIdentity(field: FieldNode): boolean {\n return field.default?.function?.name === \"autoincrement\";\n}\n\n/** Cap an identifier to Firebird's classic 31-char limit with a stable hash. */\nfunction capName(name: string): string {\n const safe = name.replace(/[^A-Za-z0-9_]/g, \"_\");\n if (safe.length <= 31) return safe;\n let hash = 0;\n for (let i = 0; i < safe.length; i++) hash = (hash * 31 + safe.charCodeAt(i)) | 0;\n return `${safe.slice(0, 24)}_${Math.abs(hash).toString(36).slice(0, 6)}`;\n}\n\nfunction defaultClause(def: DefaultValue | undefined): string | null {\n if (!def) return null;\n if (def.function) {\n switch (def.function.name) {\n case \"now\":\n return \"DEFAULT CURRENT_TIMESTAMP\";\n case \"uuid\":\n case \"cuid\":\n return null; // generated app-side\n default:\n return null;\n }\n }\n if (def.literal === undefined) return null;\n if (typeof def.literal === \"boolean\") {\n return `DEFAULT ${def.literal ? \"TRUE\" : \"FALSE\"}`;\n }\n if (typeof def.literal === \"number\") return `DEFAULT ${def.literal}`;\n return `DEFAULT '${String(def.literal).replace(/'/g, \"''\")}'`;\n}\n\nfunction referentialSql(action: string): string {\n switch (action) {\n case \"Cascade\":\n return \"CASCADE\";\n case \"SetNull\":\n return \"SET NULL\";\n case \"SetDefault\":\n return \"SET DEFAULT\";\n case \"NoAction\":\n return \"NO ACTION\";\n case \"Restrict\":\n return \"NO ACTION\"; // Firebird has no RESTRICT; NO ACTION is closest\n default:\n return \"NO ACTION\";\n }\n}\n","import { type SqlDialect } from \"@ember/sql\";\nimport { type SchemaDocument, fieldColumn, modelTable } from \"@ember/ast\";\nimport { FirebirdDdl, isIdentity } from \"./ddl\";\nimport {\n type SchemaDiff,\n constraintName,\n foreignKeys,\n indexSpecs,\n uniqueColumnSets,\n} from \"./diff\";\n\n/**\n * Convert a SchemaDiff into an ordered list of DDL statements. Order matters in\n * Firebird: tables and columns must exist before constraints reference them, so\n * foreign keys are always emitted last.\n */\nexport function planMigration(\n diff: SchemaDiff,\n desired: SchemaDocument,\n dialect: SqlDialect,\n): string[] {\n const ddl = new FirebirdDdl(dialect);\n const drops: string[] = [];\n const creates: string[] = [];\n const alters: string[] = [];\n const constraints: string[] = [];\n const indexes: string[] = [];\n const foreignKeyStmts: string[] = [];\n\n // 1. Drops (columns then tables).\n for (const change of diff.modelChanges) {\n for (const col of change.droppedColumns) {\n drops.push(ddl.dropColumn(change.table, col));\n }\n }\n for (const table of diff.droppedTables) {\n drops.push(ddl.dropTable(table));\n }\n\n // 2. Create tables (no FKs yet) + their uniques/indexes/FKs.\n for (const model of diff.createdModels) {\n const table = modelTable(model);\n creates.push(ddl.createTable(model));\n // Firebird 2.1/2.5: sequence + BEFORE INSERT trigger for autoincrement.\n creates.push(...ddl.autoIncrementObjects(model));\n for (const cols of uniqueColumnSets(model)) {\n // Single-column @unique already implies a unique index; skip to avoid\n // a redundant constraint. Composite @@unique becomes a constraint.\n if (cols.length === 1) continue;\n constraints.push(\n ddl.addUnique(table, constraintName(\"UQ\", table, cols), cols),\n );\n }\n for (const idx of indexSpecs(model)) {\n indexes.push(ddl.createIndex(table, idx.name, idx.columns, idx.unique));\n }\n for (const fk of foreignKeys(desired, model)) {\n foreignKeyStmts.push(\n ddl.addForeignKey(\n table,\n constraintName(\"FK\", table, fk.columns),\n fk.columns,\n fk.refTable,\n fk.refColumns,\n fk.onDelete,\n fk.onUpdate,\n ),\n );\n }\n }\n\n // 3. Existing-table changes.\n for (const change of diff.modelChanges) {\n for (const field of change.addedColumns) {\n alters.push(ddl.addColumn(change.table, field));\n if (isIdentity(field)) {\n creates.push(\n ...ddl.autoIncrementForColumn(change.table, fieldColumn(field)),\n );\n }\n }\n for (const cc of change.changedColumns) {\n if (cc.typeChanged) alters.push(ddl.alterColumnType(cc.table, cc.field));\n if (cc.nullabilityChanged) {\n alters.push(\n ddl.setNotNull(cc.table, columnName(cc), cc.field.isRequired),\n );\n }\n }\n for (const uq of change.addedUniques) {\n if (uq.columns.length === 1) {\n // single-column unique: a constraint is fine and idempotent-checked\n constraints.push(ddl.addUnique(change.table, uq.name, uq.columns));\n } else {\n constraints.push(ddl.addUnique(change.table, uq.name, uq.columns));\n }\n }\n for (const fk of change.addedForeignKeys) {\n foreignKeyStmts.push(\n ddl.addForeignKey(\n change.table,\n fk.name,\n fk.columns,\n fk.refTable,\n fk.refColumns,\n fk.onDelete,\n fk.onUpdate,\n ),\n );\n }\n }\n\n return [\n ...drops,\n ...creates,\n ...alters,\n ...constraints,\n ...indexes,\n ...foreignKeyStmts,\n ];\n}\n\n/**\n * Statements are separated by an explicit breakpoint line rather than `;`, so\n * PSQL bodies (triggers/procedures) that contain internal semicolons survive a\n * round-trip through the `.sql` file.\n */\nconst BREAKPOINT = \"--> statement-breakpoint\";\n\n/** Render DDL statements as a `.sql` migration file body. */\nexport function renderMigrationSql(statements: string[]): string {\n if (statements.length === 0) return \"-- This migration is empty.\\n\";\n return statements.join(`\\n${BREAKPOINT}\\n`) + \"\\n\";\n}\n\n/** Split a migration `.sql` body back into executable statements. */\nexport function splitStatements(sql: string): string[] {\n return sql\n .split(BREAKPOINT)\n .map((s) => stripComments(s).trim().replace(/;\\s*$/, \"\").trim())\n .filter((s) => s.length > 0);\n}\n\nfunction stripComments(sql: string): string {\n return sql\n .split(\"\\n\")\n .filter((line) => !line.trim().startsWith(\"--\"))\n .join(\"\\n\");\n}\n\nfunction columnName(cc: { field: { dbName?: string; name: string } }): string {\n return cc.field.dbName ?? cc.field.name.toUpperCase();\n}\n","import { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { TransactionContext } from \"@ember/driver\";\nimport { type SqlDialect } from \"@ember/sql\";\n\nexport const HISTORY_TABLE = \"_EMBER_MIGRATIONS\";\n\nexport interface AppliedMigration {\n id: string;\n checksum: string;\n steps: number;\n}\n\nexport interface LocalMigration {\n id: string;\n dir: string;\n sql: string;\n}\n\n/** Create the migration-history table if it does not exist yet. */\nexport async function ensureHistoryTable(\n tx: TransactionContext,\n dialect: SqlDialect,\n): Promise<void> {\n const exists = await tx.query<{ N: number }>(\n `SELECT COUNT(*) AS N FROM RDB$RELATIONS WHERE RDB$RELATION_NAME = ?`,\n [HISTORY_TABLE],\n );\n if (Number(exists[0]?.N ?? 0) > 0) return;\n\n const t = dialect.quoteId(HISTORY_TABLE);\n await tx.query(\n `CREATE TABLE ${t} (\n ${dialect.quoteId(\"ID\")} VARCHAR(128) NOT NULL PRIMARY KEY,\n ${dialect.quoteId(\"CHECKSUM\")} VARCHAR(64),\n ${dialect.quoteId(\"STEPS\")} INTEGER,\n ${dialect.quoteId(\"APPLIED_AT\")} TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )`,\n );\n}\n\nexport async function appliedMigrations(\n tx: TransactionContext,\n dialect: SqlDialect,\n): Promise<AppliedMigration[]> {\n const t = dialect.quoteId(HISTORY_TABLE);\n const rows = await tx.query<Record<string, unknown>>(\n `SELECT ${dialect.quoteId(\"ID\")} AS \"id\", ${dialect.quoteId(\"CHECKSUM\")} AS \"checksum\", ${dialect.quoteId(\"STEPS\")} AS \"steps\" FROM ${t} ORDER BY ${dialect.quoteId(\"ID\")}`,\n );\n return rows.map((r) => ({\n id: String(r.id).trim(),\n checksum: r.checksum == null ? \"\" : String(r.checksum).trim(),\n steps: Number(r.steps ?? 0),\n }));\n}\n\nexport async function recordMigration(\n tx: TransactionContext,\n dialect: SqlDialect,\n migration: { id: string; checksum: string; steps: number },\n): Promise<void> {\n const t = dialect.quoteId(HISTORY_TABLE);\n await tx.query(\n `INSERT INTO ${t} (${dialect.quoteId(\"ID\")}, ${dialect.quoteId(\"CHECKSUM\")}, ${dialect.quoteId(\"STEPS\")}) VALUES (?, ?, ?)`,\n [migration.id, migration.checksum, migration.steps],\n );\n}\n\n/** Read migration folders (sorted) from `<migrationsDir>`. */\nexport function listLocalMigrations(migrationsDir: string): LocalMigration[] {\n if (!existsSync(migrationsDir)) return [];\n return readdirSync(migrationsDir, { withFileTypes: true })\n .filter((e) => e.isDirectory())\n .map((e) => e.name)\n .sort()\n .map((id) => {\n const dir = join(migrationsDir, id);\n const file = join(dir, \"migration.sql\");\n return {\n id,\n dir,\n sql: existsSync(file) ? readFileSync(file, \"utf8\") : \"\",\n };\n })\n .filter((m) => m.sql.length > 0);\n}\n\n/** FNV-1a checksum of a migration body. */\nexport function checksum(sql: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < sql.length; i++) {\n h ^= sql.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return (h >>> 0).toString(16).padStart(8, \"0\");\n}\n"],"mappings":"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","names":["readFileSync","existsSync","mkdirSync","writeFileSync","dirname","resolve","rel","resolve","constraintName","uniqueFieldName","dirname","resolve","foreignKeys","rel","resolve","dirname","mkdirSync","writeFileSync","join","rel","existsSync","readFileSync","join","mkdirSync","writeFileSync","readFileSync","resolve","existsSync","mkdirSync","dirname","writeFileSync","readFileSync"]}
|