@sedrino/db-schema 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -6
- package/dist/cli.js +1904 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +365 -85
- package/dist/index.js +1108 -187
- package/dist/index.js.map +1 -1
- package/docs/cli.md +93 -0
- package/docs/expressions-and-transforms.md +165 -0
- package/docs/index.md +5 -2
- package/docs/migrations.md +183 -3
- package/docs/planning-and-apply.md +200 -0
- package/docs/relations.md +130 -0
- package/docs/schema-document.md +62 -0
- package/package.json +3 -2
- package/src/apply.ts +67 -0
- package/src/cli.ts +105 -7
- package/src/drizzle.ts +348 -1
- package/src/index.ts +38 -1
- package/src/migration.ts +315 -3
- package/src/operations.ts +278 -0
- package/src/planner.ts +7 -190
- package/src/project.ts +157 -1
- package/src/sql-expression.ts +123 -0
- package/src/sqlite.ts +150 -9
- package/src/transforms.ts +94 -0
- package/src/utils.ts +54 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/utils.ts","../src/drizzle.ts","../src/apply.ts","../src/types.ts","../src/schema.ts","../src/operations.ts","../src/sqlite.ts","../src/planner.ts","../src/project.ts"],"sourcesContent":["import path from \"node:path\";\nimport { env, exit } from \"node:process\";\nimport { compileSchemaToDrizzle } from \"./drizzle\";\nimport { applyMigrations, createLibsqlClient, inspectMigrationStatus } from \"./apply\";\nimport {\n createMigrationScaffold,\n materializeProjectMigrations,\n resolveDbProjectLayout,\n validateDbProject,\n writeDrizzleSchema,\n writeSchemaSnapshot,\n} from \"./project\";\n\ntype ParsedArgs = {\n positionals: string[];\n options: Map<string, string | boolean>;\n};\n\nasync function main() {\n const args = parseArgs(process.argv.slice(2));\n const [group, command] = args.positionals;\n\n if (!group || group === \"help\" || hasFlag(args, \"help\")) {\n printHelp();\n return;\n }\n\n switch (`${group} ${command ?? \"\"}`.trim()) {\n case \"migrate plan\":\n await handleMigratePlan(args);\n return;\n case \"migrate create\":\n await handleMigrateCreate(args);\n return;\n case \"migrate apply\":\n await handleMigrateApply(args);\n return;\n case \"migrate validate\":\n await handleMigrateValidate(args);\n return;\n case \"migrate status\":\n await handleMigrateStatus(args);\n return;\n case \"schema print\":\n await handleSchemaPrint(args);\n return;\n case \"schema drizzle\":\n await handleSchemaDrizzle(args);\n return;\n default:\n throw new Error(`Unknown command: ${[group, command].filter(Boolean).join(\" \")}`);\n }\n}\n\nasync function handleMigratePlan(args: ParsedArgs) {\n const layout = resolveLayoutFromArgs(args);\n const { schema, plans } = await materializeProjectMigrations(layout);\n const snapshotPath = path.resolve(getStringOption(args, \"snapshot\") ?? layout.snapshotPath);\n const drizzleOutputPath = path.resolve(getStringOption(args, \"drizzle-out\") ?? layout.drizzlePath);\n\n await writeSchemaSnapshot(schema, snapshotPath);\n await writeDrizzleSchema(schema, drizzleOutputPath);\n\n const warnings = plans.flatMap((plan) =>\n plan.sql.warnings.map((warning) => `${plan.migrationId}: ${warning}`),\n );\n const statementCount = plans.reduce((total, plan) => total + plan.sql.statements.length, 0);\n\n console.log(`Planned ${plans.length} migration(s)`);\n console.log(`Schema snapshot: ${snapshotPath}`);\n console.log(`Drizzle output: ${drizzleOutputPath}`);\n console.log(`SQL statements: ${statementCount}`);\n console.log(`Schema hash: ${plans.at(-1)?.toSchemaHash ?? \"schema_00000000\"}`);\n\n if (warnings.length > 0) {\n console.log(\"\");\n console.log(\"Warnings:\");\n for (const warning of warnings) console.log(`- ${warning}`);\n }\n\n if (hasFlag(args, \"sql\")) {\n console.log(\"\");\n for (const plan of plans) {\n console.log(`# ${plan.migrationId} ${plan.migrationName}`);\n for (const statement of plan.sql.statements) console.log(statement);\n if (plan.sql.warnings.length > 0) {\n for (const warning of plan.sql.warnings) console.log(`-- warning: ${warning}`);\n }\n console.log(\"\");\n }\n }\n}\n\nasync function handleMigrateCreate(args: ParsedArgs) {\n const layout = resolveLayoutFromArgs(args);\n const rawName = args.positionals.slice(2).join(\" \").trim();\n\n if (!rawName) {\n throw new Error(\"Missing migration name. Usage: sedrino-db migrate create <name> [--dir db]\");\n }\n\n const created = await createMigrationScaffold(layout, rawName);\n\n console.log(`Created migration: ${created.filePath}`);\n console.log(`Migration id: ${created.migrationId}`);\n console.log(`Migration name: ${created.migrationName}`);\n}\n\nasync function handleMigrateApply(args: ParsedArgs) {\n const layout = resolveLayoutFromArgs(args);\n const { migrations } = await materializeProjectMigrations(layout);\n const url = getStringOption(args, \"url\") ?? env.LIBSQL_URL;\n const authToken = getStringOption(args, \"auth-token\") ?? env.LIBSQL_AUTH_TOKEN;\n\n if (!url) {\n throw new Error(\"Missing database URL. Use --url or set LIBSQL_URL.\");\n }\n\n const result = await applyMigrations({\n client: createLibsqlClient({ url, authToken }),\n migrations,\n });\n\n await writeSchemaSnapshot(\n result.currentSchema,\n getStringOption(args, \"snapshot\") ?? layout.snapshotPath,\n );\n await writeDrizzleSchema(\n result.currentSchema,\n getStringOption(args, \"drizzle-out\") ?? layout.drizzlePath,\n );\n\n console.log(`Applied ${result.appliedPlans.length} migration(s)`);\n console.log(`Skipped ${result.skippedMigrationIds.length} already-applied migration(s)`);\n console.log(`Current schema hash: ${result.currentSchemaHash}`);\n\n if (result.appliedPlans.length > 0) {\n console.log(\"\");\n console.log(\"Applied:\");\n for (const plan of result.appliedPlans) {\n console.log(`- ${plan.migrationId} (${plan.sql.statements.length} statement(s))`);\n }\n }\n}\n\nasync function handleMigrateValidate(args: ParsedArgs) {\n const layout = resolveLayoutFromArgs(args);\n const result = await validateDbProject(layout);\n\n console.log(`Validated ${result.migrations.length} migration(s)`);\n console.log(`Schema hash: ${result.plans.at(-1)?.toSchemaHash ?? \"schema_00000000\"}`);\n console.log(`Snapshot up to date: ${result.artifacts.snapshotUpToDate ? \"yes\" : \"no\"}`);\n console.log(`Drizzle output up to date: ${result.artifacts.drizzleUpToDate ? \"yes\" : \"no\"}`);\n\n if (result.warnings.length > 0) {\n console.log(\"\");\n console.log(\"Warnings:\");\n for (const warning of result.warnings) console.log(`- ${warning}`);\n }\n\n const hasIssues =\n result.warnings.length > 0 ||\n !result.artifacts.snapshotUpToDate ||\n !result.artifacts.drizzleUpToDate;\n\n if (hasIssues) {\n exit(1);\n }\n}\n\nasync function handleMigrateStatus(args: ParsedArgs) {\n const layout = resolveLayoutFromArgs(args);\n const { migrations, plans } = await materializeProjectMigrations(layout);\n console.log(`Local migrations: ${migrations.length}`);\n console.log(`Local schema hash: ${plans.at(-1)?.toSchemaHash ?? \"schema_00000000\"}`);\n\n const url = getStringOption(args, \"url\") ?? env.LIBSQL_URL;\n const authToken = getStringOption(args, \"auth-token\") ?? env.LIBSQL_AUTH_TOKEN;\n if (!url) {\n return;\n }\n\n const status = await inspectMigrationStatus({\n client: createLibsqlClient({ url, authToken }),\n migrations,\n baseSchema: undefined,\n });\n\n console.log(`Metadata tables present: ${status.metadataTablesPresent ? \"yes\" : \"no\"}`);\n console.log(`Applied in database: ${status.appliedMigrationIds.length}`);\n console.log(`Pending locally: ${status.pendingMigrationIds.length}`);\n console.log(`Unexpected in database: ${status.unexpectedDatabaseMigrationIds.length}`);\n console.log(\n `Database schema hash: ${status.schemaHash.database ?? (status.metadataTablesPresent ? \"missing\" : \"none\")}`,\n );\n console.log(`Drift detected: ${status.schemaHash.driftDetected ? \"yes\" : \"no\"}`);\n\n if (status.pendingMigrationIds.length > 0) {\n console.log(\"\");\n console.log(\"Pending:\");\n for (const migrationId of status.pendingMigrationIds) console.log(`- ${migrationId}`);\n }\n\n if (status.unexpectedDatabaseMigrationIds.length > 0) {\n console.log(\"\");\n console.log(\"Unexpected in database:\");\n for (const migrationId of status.unexpectedDatabaseMigrationIds) console.log(`- ${migrationId}`);\n }\n\n if (status.schemaHash.driftDetected || status.unexpectedDatabaseMigrationIds.length > 0) {\n exit(1);\n }\n}\n\nasync function handleSchemaPrint(args: ParsedArgs) {\n const layout = resolveLayoutFromArgs(args);\n const { schema } = await materializeProjectMigrations(layout);\n console.log(JSON.stringify(schema, null, 2));\n}\n\nasync function handleSchemaDrizzle(args: ParsedArgs) {\n const layout = resolveLayoutFromArgs(args);\n const { schema } = await materializeProjectMigrations(layout);\n const source = compileSchemaToDrizzle(schema);\n const outputPath = getStringOption(args, \"out\");\n\n if (outputPath) {\n await writeDrizzleSchema(schema, path.resolve(outputPath));\n console.log(`Wrote Drizzle schema to ${path.resolve(outputPath)}`);\n return;\n }\n\n process.stdout.write(source);\n}\n\nfunction resolveLayoutFromArgs(args: ParsedArgs) {\n return resolveDbProjectLayout(getStringOption(args, \"dir\") ?? \"db\");\n}\n\nfunction parseArgs(argv: string[]): ParsedArgs {\n const positionals: string[] = [];\n const options = new Map<string, string | boolean>();\n\n for (let index = 0; index < argv.length; index += 1) {\n const value = argv[index]!;\n if (!value.startsWith(\"--\")) {\n positionals.push(value);\n continue;\n }\n\n const withoutPrefix = value.slice(2);\n const [rawKey, inlineValue] = withoutPrefix.split(\"=\", 2);\n const key = rawKey ?? \"\";\n if (inlineValue !== undefined) {\n options.set(key, inlineValue);\n continue;\n }\n\n const next = argv[index + 1];\n if (next && !next.startsWith(\"--\")) {\n options.set(key, next);\n index += 1;\n continue;\n }\n\n options.set(key, true);\n }\n\n return {\n positionals,\n options,\n };\n}\n\nfunction hasFlag(args: ParsedArgs, name: string) {\n return args.options.get(name) === true;\n}\n\nfunction getStringOption(args: ParsedArgs, name: string) {\n const value = args.options.get(name);\n return typeof value === \"string\" && value.length > 0 ? value : null;\n}\n\nfunction printHelp() {\n console.log(`sedrino-db\n\nUsage:\n sedrino-db migrate create <name> [--dir db]\n sedrino-db migrate plan [--dir db] [--sql] [--snapshot path] [--drizzle-out path]\n sedrino-db migrate apply --url <libsql-url> [--auth-token token] [--dir db]\n sedrino-db migrate validate [--dir db]\n sedrino-db migrate status [--dir db] [--url <libsql-url>] [--auth-token token]\n sedrino-db schema print [--dir db]\n sedrino-db schema drizzle [--dir db] [--out path]\n\nDefaults:\n --dir defaults to ./db\n schema snapshot defaults to ./db/schema/schema.snapshot.json\n drizzle output defaults to ./db/schema/schema.generated.ts\n`);\n}\n\nmain().catch((error) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(message);\n exit(1);\n});\n","import type {\n DatabaseSchemaDocument,\n DefaultSpec,\n FieldSpec,\n LogicalTypeSpec,\n SchemaValidationIssue,\n StorageSpec,\n} from \"./types\";\n\nconst SQLITE_EPOCH_MS_NOW =\n \"CAST(strftime('%s','now') AS integer) * 1000 + CAST((strftime('%f','now') - strftime('%S','now')) * 1000 AS integer)\";\n\nexport function sqliteEpochMsNowSql() {\n return SQLITE_EPOCH_MS_NOW;\n}\n\nexport function toSnakeCase(value: string) {\n return value\n .replace(/-/g, \"_\")\n .replace(/([a-z0-9])([A-Z])/g, \"$1_$2\")\n .replace(/([A-Z]+)([A-Z][a-z0-9]+)/g, \"$1_$2\")\n .toLowerCase();\n}\n\nexport function toPascalCase(value: string) {\n return value\n .replace(/[_-]+/g, \" \")\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .split(/\\s+/)\n .filter(Boolean)\n .map((part) => `${part[0]!.toUpperCase()}${part.slice(1)}`)\n .join(\"\");\n}\n\nexport function toCamelCase(value: string) {\n const pascal = toPascalCase(value);\n return pascal.length > 0 ? `${pascal[0]!.toLowerCase()}${pascal.slice(1)}` : pascal;\n}\n\nexport function pluralize(value: string) {\n if (value.endsWith(\"s\")) return `${value}es`;\n if (value.endsWith(\"y\") && !/[aeiou]y$/i.test(value)) {\n return `${value.slice(0, -1)}ies`;\n }\n return `${value}s`;\n}\n\nexport function singularize(value: string) {\n if (value.endsWith(\"ies\") && value.length > 3) {\n return `${value.slice(0, -3)}y`;\n }\n if (value.endsWith(\"ses\") && value.length > 3) {\n return value.slice(0, -2);\n }\n if (value.endsWith(\"s\") && !value.endsWith(\"ss\") && value.length > 1) {\n return value.slice(0, -1);\n }\n return value;\n}\n\nexport function quoteIdentifier(value: string) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n}\n\nexport function tableVariableName(tableName: string) {\n return `table${toPascalCase(tableName)}`;\n}\n\nexport function fieldAutoId(tableName: string, fieldName: string) {\n return `fld_${toSnakeCase(tableName)}_${toSnakeCase(fieldName)}`;\n}\n\nexport function tableAutoId(tableName: string) {\n return `tbl_${toSnakeCase(tableName)}`;\n}\n\nexport function defaultStorageForLogical(logical: LogicalTypeSpec, column: string): StorageSpec {\n switch (logical.kind) {\n case \"id\":\n case \"string\":\n case \"text\":\n case \"enum\":\n case \"json\":\n return { strategy: \"sqlite.text\", column };\n case \"boolean\":\n case \"integer\":\n return { strategy: \"sqlite.integer\", column };\n case \"number\":\n return { strategy: \"sqlite.real\", column };\n case \"temporal.instant\":\n return { strategy: \"sqlite.temporalInstantEpochMs\", column };\n case \"temporal.plainDate\":\n return { strategy: \"sqlite.temporalPlainDateText\", column };\n }\n}\n\nexport function validateLogicalAndStorageCompatibility(\n logical: LogicalTypeSpec,\n storage: StorageSpec,\n): string | null {\n switch (storage.strategy) {\n case \"sqlite.temporalInstantEpochMs\":\n return logical.kind === \"temporal.instant\"\n ? null\n : \"sqlite.temporalInstantEpochMs storage requires logical kind temporal.instant\";\n case \"sqlite.temporalPlainDateText\":\n return logical.kind === \"temporal.plainDate\"\n ? null\n : \"sqlite.temporalPlainDateText storage requires logical kind temporal.plainDate\";\n case \"sqlite.integer\":\n return logical.kind === \"boolean\" || logical.kind === \"integer\"\n ? null\n : \"sqlite.integer storage requires logical kind boolean or integer\";\n case \"sqlite.real\":\n return logical.kind === \"number\" ? null : \"sqlite.real storage requires logical kind number\";\n case \"sqlite.text\":\n return logical.kind === \"id\" ||\n logical.kind === \"string\" ||\n logical.kind === \"text\" ||\n logical.kind === \"enum\" ||\n logical.kind === \"json\"\n ? null\n : \"sqlite.text storage requires logical kind id, string, text, enum, or json\";\n }\n}\n\nexport function validateDefaultCompatibility(\n field: FieldSpec,\n defaultValue: DefaultSpec,\n): string | null {\n if (defaultValue.kind === \"generatedId\") {\n return field.logical.kind === \"id\" ? null : \"generatedId default requires logical kind id\";\n }\n\n if (defaultValue.kind === \"now\") {\n return field.logical.kind === \"temporal.instant\"\n ? null\n : \"now default requires logical kind temporal.instant\";\n }\n\n if (field.logical.kind === \"boolean\" && typeof defaultValue.value !== \"boolean\") {\n return \"boolean fields require boolean literal defaults\";\n }\n\n if (field.logical.kind === \"integer\" && !Number.isInteger(defaultValue.value)) {\n return \"integer fields require integer literal defaults\";\n }\n\n if (field.logical.kind === \"number\" && typeof defaultValue.value !== \"number\") {\n return \"number fields require numeric literal defaults\";\n }\n\n return null;\n}\n\nexport function validateSchemaDocumentCompatibility(\n schema: DatabaseSchemaDocument,\n): SchemaValidationIssue[] {\n const issues: SchemaValidationIssue[] = [];\n const tableNames = new Set<string>();\n const indexNames = new Set<string>();\n\n for (const table of schema.tables) {\n if (tableNames.has(table.name)) {\n issues.push({\n path: `tables.${table.name}`,\n message: `Duplicate table name ${table.name}`,\n });\n }\n tableNames.add(table.name);\n\n const fieldNames = new Set<string>();\n const columnNames = new Set<string>();\n let primaryKeyCount = 0;\n\n for (const field of table.fields) {\n if (fieldNames.has(field.name)) {\n issues.push({\n path: `tables.${table.name}.fields.${field.name}`,\n message: `Duplicate field name ${field.name}`,\n });\n }\n fieldNames.add(field.name);\n\n if (columnNames.has(field.storage.column)) {\n issues.push({\n path: `tables.${table.name}.fields.${field.name}`,\n message: `Duplicate column name ${field.storage.column}`,\n });\n }\n columnNames.add(field.storage.column);\n\n if (field.primaryKey) primaryKeyCount += 1;\n if (field.primaryKey && field.nullable) {\n issues.push({\n path: `tables.${table.name}.fields.${field.name}`,\n message: \"Primary key fields cannot be nullable\",\n });\n }\n\n const storageIssue = validateLogicalAndStorageCompatibility(field.logical, field.storage);\n if (storageIssue) {\n issues.push({\n path: `tables.${table.name}.fields.${field.name}`,\n message: storageIssue,\n });\n }\n\n if (field.default) {\n const defaultIssue = validateDefaultCompatibility(field, field.default);\n if (defaultIssue) {\n issues.push({\n path: `tables.${table.name}.fields.${field.name}`,\n message: defaultIssue,\n });\n }\n }\n\n if (field.references && !tableNames.has(field.references.table)) {\n const targetTableExists = schema.tables.some(\n (candidate) => candidate.name === field.references!.table,\n );\n if (!targetTableExists) {\n issues.push({\n path: `tables.${table.name}.fields.${field.name}`,\n message: `Referenced table ${field.references.table} does not exist`,\n });\n }\n }\n\n if (field.references) {\n const targetTable = schema.tables.find(\n (candidate) => candidate.name === field.references!.table,\n );\n const targetFieldExists = targetTable?.fields.some(\n (candidate) => candidate.name === field.references!.field,\n );\n\n if (targetTable && !targetFieldExists) {\n issues.push({\n path: `tables.${table.name}.fields.${field.name}`,\n message: `Referenced field ${field.references.field} does not exist on table ${field.references.table}`,\n });\n }\n }\n }\n\n if (primaryKeyCount > 1) {\n issues.push({\n path: `tables.${table.name}`,\n message: \"Composite primary keys are not supported in v1\",\n });\n }\n\n for (const index of table.indexes) {\n const indexName = index.name ?? `${table.name}_${index.fields.join(\"_\")}_idx`;\n if (indexNames.has(indexName)) {\n issues.push({\n path: `tables.${table.name}.indexes.${indexName}`,\n message: `Duplicate index name ${indexName}`,\n });\n }\n indexNames.add(indexName);\n\n for (const fieldName of index.fields) {\n if (!fieldNames.has(fieldName)) {\n issues.push({\n path: `tables.${table.name}.indexes.${index.name ?? fieldName}`,\n message: `Index references missing field ${fieldName}`,\n });\n }\n }\n }\n\n for (const unique of table.uniques) {\n const uniqueName = unique.name ?? `${table.name}_${unique.fields.join(\"_\")}_unique`;\n if (indexNames.has(uniqueName)) {\n issues.push({\n path: `tables.${table.name}.uniques.${uniqueName}`,\n message: `Duplicate index name ${uniqueName}`,\n });\n }\n indexNames.add(uniqueName);\n\n for (const fieldName of unique.fields) {\n if (!fieldNames.has(fieldName)) {\n issues.push({\n path: `tables.${table.name}.uniques.${unique.name ?? fieldName}`,\n message: `Unique constraint references missing field ${fieldName}`,\n });\n }\n }\n }\n }\n\n return issues;\n}\n\nexport function stableStringify(value: unknown): string {\n return JSON.stringify(sortValue(value));\n}\n\nfunction sortValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((entry) => sortValue(entry));\n }\n\n if (value && typeof value === \"object\") {\n const entries = Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, innerValue]) => [key, sortValue(innerValue)]);\n return Object.fromEntries(entries);\n }\n\n return value;\n}\n\nexport function createSchemaHash(schema: DatabaseSchemaDocument) {\n const text = stableStringify(schema);\n let hash = 2166136261;\n\n for (let index = 0; index < text.length; index += 1) {\n hash ^= text.charCodeAt(index);\n hash = Math.imul(hash, 16777619);\n }\n\n return `schema_${(hash >>> 0).toString(16).padStart(8, \"0\")}`;\n}\n\nexport function cloneSchema<T>(value: T): T {\n return structuredClone(value);\n}\n\nexport function renameStorageColumn(field: FieldSpec, newFieldName: string): FieldSpec {\n const next = cloneSchema(field);\n const column = toSnakeCase(newFieldName);\n next.name = newFieldName;\n next.storage = { ...next.storage, column };\n return next;\n}\n","import type {\n DatabaseSchemaDocument,\n DefaultSpec,\n FieldSpec,\n IndexSpec,\n TableSpec,\n UniqueSpec,\n} from \"./types\";\nimport { pluralize, singularize, tableVariableName, toCamelCase, toPascalCase } from \"./utils\";\n\nexport function compileSchemaToDrizzle(schema: DatabaseSchemaDocument) {\n const sqliteImports = new Set([\"sqliteTable\"]);\n const toolkitImports = new Set<string>();\n let needsRelationsImport = false;\n let needsUlid = false;\n\n for (const table of schema.tables) {\n for (const field of table.fields) {\n switch (field.logical.kind) {\n case \"id\":\n case \"string\":\n case \"text\":\n case \"enum\":\n case \"json\":\n sqliteImports.add(\"text\");\n break;\n case \"boolean\":\n case \"integer\":\n sqliteImports.add(\"integer\");\n break;\n case \"number\":\n sqliteImports.add(\"real\");\n break;\n case \"temporal.instant\":\n toolkitImports.add(\"temporalInstantEpochMs\");\n break;\n case \"temporal.plainDate\":\n toolkitImports.add(\"temporalPlainDateText\");\n break;\n }\n\n if (field.default?.kind === \"generatedId\") needsUlid = true;\n if (field.default?.kind === \"now\") toolkitImports.add(\"epochMsNow\");\n if (field.references) needsRelationsImport = true;\n }\n\n if (table.indexes.length > 0) sqliteImports.add(\"index\");\n if (table.uniques.length > 0) sqliteImports.add(\"uniqueIndex\");\n }\n\n const lines: string[] = [];\n if (needsRelationsImport) {\n lines.push(`import { defineRelations } from \"drizzle-orm\";`);\n }\n lines.push(\n `import { ${Array.from(sqliteImports).sort().join(\", \")} } from \"drizzle-orm/sqlite-core\";`,\n );\n if (toolkitImports.size > 0) {\n lines.push(\n `import { ${Array.from(toolkitImports).sort().join(\", \")} } from \"@sedrino/toolkit/drizzle/sqlite\";`,\n );\n }\n if (needsUlid) {\n lines.push(`import { ulid } from \"ulid\";`);\n }\n lines.push(\"\");\n\n for (const table of schema.tables) {\n lines.push(renderTable(table));\n lines.push(\"\");\n }\n\n const relationsSource = compileSchemaToDrizzleRelations(schema);\n if (relationsSource) {\n lines.push(relationsSource);\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\").trimEnd() + \"\\n\";\n}\n\nexport function compileSchemaToDrizzleRelations(schema: DatabaseSchemaDocument) {\n const directRelations = inferDirectRelations(schema);\n const manyToManyRelations = inferManyToManyRelations(schema, directRelations.usedKeysByTable);\n if (directRelations.relations.length === 0 && manyToManyRelations.length === 0) return \"\";\n\n const schemaEntries = schema.tables\n .map((table) => ` ${tableSchemaKey(table.name)}: ${tableVariableName(table.name)},`)\n .join(\"\\n\");\n\n const tableBlocks = schema.tables\n .map((table) => {\n const tableKey = tableSchemaKey(table.name);\n const relationLines = directRelations.relations\n .filter(\n (relation) =>\n relation.sourceTable.name === table.name || relation.targetTable.name === table.name,\n )\n .flatMap((relation) => {\n const lines: string[] = [];\n\n if (relation.sourceTable.name === table.name) {\n lines.push(` ${relation.forwardKey}: ${renderOneRelation(relation)},`);\n }\n\n if (relation.targetTable.name === table.name && !relation.skipReverse) {\n lines.push(` ${relation.reverseKey}: ${renderReverseRelation(relation)},`);\n }\n\n return lines;\n })\n .concat(\n manyToManyRelations\n .filter((relation) => relation.leftTable.name === table.name || relation.rightTable.name === table.name)\n .map((relation) =>\n relation.leftTable.name === table.name\n ? ` ${relation.leftKey}: ${renderManyToManyRelation(relation, \"left\")},`\n : ` ${relation.rightKey}: ${renderManyToManyRelation(relation, \"right\")},`,\n ),\n );\n\n if (relationLines.length === 0) return null;\n return ` ${tableKey}: {\\n${relationLines.join(\"\\n\")}\\n },`;\n })\n .filter((block): block is string => block !== null)\n .join(\"\\n\");\n\n return `export const relations = defineRelations({\\n${schemaEntries}\\n}, (r) => ({\\n${tableBlocks}\\n}));`;\n}\n\nfunction renderTable(table: TableSpec) {\n const variableName = tableVariableName(table.name);\n const fieldLines = table.fields.map((field) => ` ${field.name}: ${renderField(field)},`);\n const tableConfig = renderTableConfig(table);\n\n if (!tableConfig) {\n return `export const ${variableName} = sqliteTable(\"${table.name}\", {\\n${fieldLines.join(\"\\n\")}\\n});`;\n }\n\n return `export const ${variableName} = sqliteTable(\"${table.name}\", {\\n${fieldLines.join(\n \"\\n\",\n )}\\n}, (table) => [\\n${tableConfig}\\n]);`;\n}\n\nfunction renderTableConfig(table: TableSpec) {\n const lines: string[] = [];\n\n for (const index of table.indexes) {\n lines.push(` ${renderIndex(table.name, index)},`);\n }\n\n for (const unique of table.uniques) {\n lines.push(` ${renderUnique(table.name, unique)},`);\n }\n\n return lines.length > 0 ? lines.join(\"\\n\") : null;\n}\n\nfunction renderIndex(tableName: string, index: IndexSpec) {\n const name = index.name ?? `${tableName}_${index.fields.join(\"_\")}_idx`;\n return `index(\"${name}\").on(${index.fields.map((field) => `table.${field}`).join(\", \")})`;\n}\n\nfunction renderUnique(tableName: string, unique: UniqueSpec) {\n const name = unique.name ?? `${tableName}_${unique.fields.join(\"_\")}_unique`;\n return `uniqueIndex(\"${name}\").on(${unique.fields.map((field) => `table.${field}`).join(\", \")})`;\n}\n\nfunction renderField(field: FieldSpec) {\n let expression = renderBaseColumn(field);\n\n if (field.logical.kind === \"json\") {\n expression += `.$type<${field.logical.tsType}>()`;\n }\n\n if (field.primaryKey) expression += \".primaryKey()\";\n if (!field.nullable) expression += \".notNull()\";\n if (field.unique && !field.primaryKey) expression += \".unique()\";\n\n const defaultExpression = renderDrizzleDefault(field.default);\n if (defaultExpression) expression += `.default(${defaultExpression})`;\n\n if (field.default?.kind === \"generatedId\") {\n expression += `.$default(() => \\`${field.default.prefix}-\\${ulid()}\\`)`;\n }\n\n if (field.references) {\n const targetTable = tableVariableName(field.references.table);\n const referenceParts = [`() => ${targetTable}.${field.references.field}`];\n const options: string[] = [];\n if (field.references.onDelete) options.push(`onDelete: \"${field.references.onDelete}\"`);\n if (field.references.onUpdate) options.push(`onUpdate: \"${field.references.onUpdate}\"`);\n if (options.length > 0) {\n referenceParts.push(`{ ${options.join(\", \")} }`);\n }\n expression += `.references(${referenceParts.join(\", \")})`;\n }\n\n return expression;\n}\n\nfunction renderBaseColumn(field: FieldSpec) {\n switch (field.logical.kind) {\n case \"id\":\n case \"string\":\n case \"text\":\n return `text(\"${field.storage.column}\")`;\n case \"enum\":\n return `text(\"${field.storage.column}\", { enum: [${field.logical.values\n .map((value) => JSON.stringify(value))\n .join(\", \")}] })`;\n case \"json\":\n return `text(\"${field.storage.column}\", { mode: \"json\" })`;\n case \"boolean\":\n return `integer(\"${field.storage.column}\", { mode: \"boolean\" })`;\n case \"integer\":\n return `integer(\"${field.storage.column}\", { mode: \"number\" })`;\n case \"number\":\n return `real(\"${field.storage.column}\")`;\n case \"temporal.instant\":\n return `temporalInstantEpochMs(\"${field.storage.column}\")`;\n case \"temporal.plainDate\":\n return `temporalPlainDateText(\"${field.storage.column}\")`;\n }\n}\n\nfunction renderDrizzleDefault(defaultValue: DefaultSpec | undefined) {\n if (!defaultValue) return null;\n\n switch (defaultValue.kind) {\n case \"generatedId\":\n return null;\n case \"now\":\n return \"epochMsNow()\";\n case \"literal\":\n return JSON.stringify(defaultValue.value);\n }\n}\n\ntype InferredRelation = {\n sourceTable: TableSpec;\n targetTable: TableSpec;\n sourceField: FieldSpec;\n targetFieldName: string;\n sourceTableKey: string;\n targetTableKey: string;\n forwardKey: string;\n reverseKey: string;\n alias: string | null;\n reverseKind: \"one\" | \"many\";\n skipReverse: boolean;\n};\n\ntype InferredManyToManyRelation = {\n junctionTable: TableSpec;\n leftTable: TableSpec;\n rightTable: TableSpec;\n leftField: FieldSpec;\n rightField: FieldSpec;\n leftTargetFieldName: string;\n rightTargetFieldName: string;\n junctionTableKey: string;\n leftTableKey: string;\n rightTableKey: string;\n leftKey: string;\n rightKey: string;\n alias: string | null;\n};\n\nfunction inferDirectRelations(schema: DatabaseSchemaDocument): {\n relations: InferredRelation[];\n usedKeysByTable: Map<string, Set<string>>;\n} {\n const junctionTableNames = new Set(inferJunctionCandidates(schema).map((candidate) => candidate.junctionTable.name));\n const raw = schema.tables.flatMap((sourceTable) =>\n sourceTable.fields\n .filter((field) => field.references)\n .map((field) => {\n const targetTable = schema.tables.find((table) => table.name === field.references!.table);\n if (!targetTable) {\n throw new Error(\n `Cannot infer relation for ${sourceTable.name}.${field.name}; missing target table ${field.references!.table}`,\n );\n }\n\n return {\n sourceTable,\n targetTable,\n sourceField: field,\n targetFieldName: field.references!.field,\n sourceTableKey: tableSchemaKey(sourceTable.name),\n targetTableKey: tableSchemaKey(targetTable.name),\n forwardBase: inferForwardRelationKey(field, targetTable),\n reverseBase: tableSchemaKey(pluralize(sourceTable.name)),\n };\n }),\n );\n\n const duplicatePairCounts = new Map<string, number>();\n for (const relation of raw) {\n const key = `${relation.sourceTable.name}::${relation.targetTable.name}`;\n duplicatePairCounts.set(key, (duplicatePairCounts.get(key) ?? 0) + 1);\n }\n\n const usedByTable = new Map<string, Set<string>>();\n\n return {\n relations: raw.map((relation) => {\n const skipReverse = junctionTableNames.has(relation.sourceTable.name);\n const pairKey = `${relation.sourceTable.name}::${relation.targetTable.name}`;\n const needsAlias = (duplicatePairCounts.get(pairKey) ?? 0) > 1;\n const alias = needsAlias ? relation.forwardBase : null;\n const sourceUsed = ensureUsedSet(usedByTable, relation.sourceTable.name);\n const targetUsed = ensureUsedSet(usedByTable, relation.targetTable.name);\n const reverseKind = inferReverseKind(relation.sourceTable, relation.sourceField);\n\n const forwardKey = ensureUniqueKey(\n sourceUsed,\n relation.forwardBase,\n `${relation.forwardBase}${toPascalCase(relation.targetTable.name)}`,\n );\n const reversePreferred = needsAlias\n ? `${relation.forwardBase}${toPascalCase(pluralize(relation.sourceTable.name))}`\n : relation.reverseBase;\n const reverseFallback = `${relation.forwardBase}${toPascalCase(pluralize(relation.sourceTable.name))}`;\n const reverseKey = skipReverse\n ? reversePreferred\n : ensureUniqueKey(targetUsed, reversePreferred, reverseFallback);\n\n return {\n sourceTable: relation.sourceTable,\n targetTable: relation.targetTable,\n sourceField: relation.sourceField,\n targetFieldName: relation.targetFieldName,\n sourceTableKey: relation.sourceTableKey,\n targetTableKey: relation.targetTableKey,\n forwardKey,\n reverseKey,\n alias,\n reverseKind,\n skipReverse,\n };\n }),\n usedKeysByTable: usedByTable,\n };\n}\n\nfunction inferManyToManyRelations(\n schema: DatabaseSchemaDocument,\n usedByTable: Map<string, Set<string>>,\n): InferredManyToManyRelation[] {\n const candidates = inferJunctionCandidates(schema);\n const pairCounts = new Map<string, number>();\n\n for (const candidate of candidates) {\n const pairKey = createPairKey(candidate.leftTable.name, candidate.rightTable.name);\n pairCounts.set(pairKey, (pairCounts.get(pairKey) ?? 0) + 1);\n }\n\n return candidates.map((candidate) => {\n const pairKey = createPairKey(candidate.leftTable.name, candidate.rightTable.name);\n const duplicatePair = (pairCounts.get(pairKey) ?? 0) > 1;\n const selfRelation = candidate.leftTable.name === candidate.rightTable.name;\n const alias = duplicatePair || selfRelation ? tableSchemaKey(candidate.junctionTable.name) : null;\n\n const leftUsed = ensureUsedSet(usedByTable, candidate.leftTable.name);\n const rightUsed = ensureUsedSet(usedByTable, candidate.rightTable.name);\n\n const leftPreferred = inferManyToManyKey(candidate.rightTable, candidate.rightField, selfRelation);\n const rightPreferred = inferManyToManyKey(candidate.leftTable, candidate.leftField, selfRelation);\n const leftFallback = `${leftPreferred}${toPascalCase(candidate.junctionTable.name)}`;\n const rightFallback = `${rightPreferred}${toPascalCase(candidate.junctionTable.name)}`;\n\n return {\n junctionTable: candidate.junctionTable,\n leftTable: candidate.leftTable,\n rightTable: candidate.rightTable,\n leftField: candidate.leftField,\n rightField: candidate.rightField,\n leftTargetFieldName: candidate.leftField.references!.field,\n rightTargetFieldName: candidate.rightField.references!.field,\n junctionTableKey: tableSchemaKey(candidate.junctionTable.name),\n leftTableKey: tableSchemaKey(candidate.leftTable.name),\n rightTableKey: tableSchemaKey(candidate.rightTable.name),\n leftKey: ensureUniqueKey(leftUsed, leftPreferred, leftFallback),\n rightKey: ensureUniqueKey(rightUsed, rightPreferred, rightFallback),\n alias,\n };\n });\n}\n\nfunction inferJunctionCandidates(schema: DatabaseSchemaDocument) {\n return schema.tables.flatMap((junctionTable) => {\n const referencedFields = junctionTable.fields.filter((field) => field.references);\n if (referencedFields.length !== 2) return [];\n if (junctionTable.fields.length !== 2) return [];\n\n const compositeUnique = junctionTable.uniques.some(\n (unique) =>\n unique.fields.length === 2 &&\n referencedFields.every((field) => unique.fields.includes(field.name)),\n );\n if (!compositeUnique) return [];\n\n const [leftField, rightField] = referencedFields;\n const leftTable = schema.tables.find((table) => table.name === leftField!.references!.table);\n const rightTable = schema.tables.find((table) => table.name === rightField!.references!.table);\n if (!leftTable || !rightTable) return [];\n\n return [\n {\n junctionTable,\n leftField: leftField!,\n rightField: rightField!,\n leftTable,\n rightTable,\n },\n ];\n });\n}\n\nfunction renderOneRelation(relation: InferredRelation) {\n const options = [\n `from: r.${relation.sourceTableKey}.${relation.sourceField.name}`,\n `to: r.${relation.targetTableKey}.${relation.targetFieldName}`,\n ];\n if (relation.alias) {\n options.push(`alias: \"${relation.alias}\"`);\n }\n\n return `r.one.${relation.targetTableKey}({ ${options.join(\", \")} })`;\n}\n\nfunction renderReverseRelation(relation: InferredRelation) {\n const options = [\n `from: r.${relation.targetTableKey}.${relation.targetFieldName}`,\n `to: r.${relation.sourceTableKey}.${relation.sourceField.name}`,\n ];\n if (relation.alias) {\n options.push(`alias: \"${relation.alias}\"`);\n }\n\n return `r.${relation.reverseKind}.${relation.sourceTableKey}({ ${options.join(\", \")} })`;\n}\n\nfunction renderManyToManyRelation(\n relation: InferredManyToManyRelation,\n side: \"left\" | \"right\",\n) {\n const isLeft = side === \"left\";\n const currentTableKey = isLeft ? relation.leftTableKey : relation.rightTableKey;\n const currentTargetFieldName = isLeft ? relation.leftTargetFieldName : relation.rightTargetFieldName;\n const currentJunctionFieldName = isLeft ? relation.leftField.name : relation.rightField.name;\n const otherTableKey = isLeft ? relation.rightTableKey : relation.leftTableKey;\n const otherTargetFieldName = isLeft ? relation.rightTargetFieldName : relation.leftTargetFieldName;\n const otherJunctionFieldName = isLeft ? relation.rightField.name : relation.leftField.name;\n\n const options = [\n `from: r.${currentTableKey}.${currentTargetFieldName}.through(r.${relation.junctionTableKey}.${currentJunctionFieldName})`,\n `to: r.${otherTableKey}.${otherTargetFieldName}.through(r.${relation.junctionTableKey}.${otherJunctionFieldName})`,\n ];\n if (relation.alias) {\n options.push(`alias: \"${relation.alias}\"`);\n }\n\n return `r.many.${otherTableKey}({ ${options.join(\", \")} })`;\n}\n\nfunction inferForwardRelationKey(field: FieldSpec, targetTable: TableSpec) {\n const trimmed = field.name.replace(/Id$/, \"\").replace(/Ids$/, \"\").replace(/Ref$/, \"\");\n const candidate = trimmed.length > 0 ? trimmed : tableSchemaKey(targetTable.name);\n return toCamelCase(candidate);\n}\n\nfunction inferManyToManyKey(targetTable: TableSpec, targetField: FieldSpec, selfRelation: boolean) {\n if (!selfRelation) {\n return tableSchemaKey(pluralize(singularize(targetTable.name)));\n }\n\n return tableSchemaKey(pluralize(inferForwardRelationKey(targetField, targetTable)));\n}\n\nfunction inferReverseKind(sourceTable: TableSpec, sourceField: FieldSpec): \"one\" | \"many\" {\n if (sourceField.primaryKey || sourceField.unique) return \"one\";\n const hasSingleFieldUnique = sourceTable.uniques.some(\n (unique) => unique.fields.length === 1 && unique.fields[0] === sourceField.name,\n );\n return hasSingleFieldUnique ? \"one\" : \"many\";\n}\n\nfunction ensureUsedSet(map: Map<string, Set<string>>, key: string) {\n const existing = map.get(key);\n if (existing) return existing;\n const created = new Set<string>();\n map.set(key, created);\n return created;\n}\n\nfunction ensureUniqueKey(used: Set<string>, preferred: string, fallback: string) {\n if (!used.has(preferred)) {\n used.add(preferred);\n return preferred;\n }\n\n if (!used.has(fallback)) {\n used.add(fallback);\n return fallback;\n }\n\n let counter = 2;\n while (used.has(`${fallback}${counter}`)) {\n counter += 1;\n }\n const candidate = `${fallback}${counter}`;\n used.add(candidate);\n return candidate;\n}\n\nfunction tableSchemaKey(tableName: string) {\n return toCamelCase(tableName);\n}\n\nfunction createPairKey(left: string, right: string) {\n return [left, right].sort((a, b) => a.localeCompare(b)).join(\"::\");\n}\n","import { createClient, type Client } from \"@libsql/client\";\nimport type { DatabaseSchemaDocument } from \"./types\";\nimport type { MigrationDefinition } from \"./migration\";\nimport { materializeSchema, planMigration, type PlannedMigration } from \"./planner\";\nimport { schemaHash } from \"./schema\";\n\nconst MIGRATIONS_TABLE = \"_sedrino_schema_migrations\";\nconst STATE_TABLE = \"_sedrino_schema_state\";\n\ntype SqlValue = string | number | null;\n\ntype SchemaStateRow = {\n schemaHash: string;\n schemaJson: string;\n};\n\nexport type ApplyMigrationsResult = {\n appliedPlans: PlannedMigration[];\n skippedMigrationIds: string[];\n currentSchema: DatabaseSchemaDocument;\n currentSchemaHash: string;\n};\n\nexport type MigrationStatusResult = {\n localMigrationIds: string[];\n appliedMigrationIds: string[];\n pendingMigrationIds: string[];\n unexpectedDatabaseMigrationIds: string[];\n schemaHash: {\n local: string;\n database: string | null;\n driftDetected: boolean;\n };\n metadataTablesPresent: boolean;\n};\n\nexport type LibsqlConnectionOptions = {\n url: string;\n authToken?: string;\n};\n\nexport function createLibsqlClient(options: LibsqlConnectionOptions) {\n return createClient({\n url: options.url,\n authToken: options.authToken,\n concurrency: 0,\n });\n}\n\nexport async function applyMigrations(args: {\n client?: Client;\n connection?: LibsqlConnectionOptions;\n migrations: MigrationDefinition[];\n baseSchema?: DatabaseSchemaDocument;\n}) {\n const client = args.client ?? createLibsqlClient(assertConnection(args.connection));\n\n await ensureMetadataTables(client);\n\n const appliedRows = await listAppliedMigrations(client);\n const appliedIds = new Set(appliedRows.map((row) => row.migrationId));\n const migrationMap = new Map(args.migrations.map((migration) => [migration.meta.id, migration]));\n\n for (const applied of appliedRows) {\n if (!migrationMap.has(applied.migrationId)) {\n throw new Error(\n `Database contains applied migration ${applied.migrationId}, but it is not present locally`,\n );\n }\n }\n\n const appliedLocalMigrations = args.migrations.filter((migration) =>\n appliedIds.has(migration.meta.id),\n );\n const expectedCurrent = materializeSchema({\n baseSchema: args.baseSchema,\n migrations: appliedLocalMigrations,\n }).schema;\n const expectedHash = schemaHash(expectedCurrent);\n const currentState = await getSchemaState(client);\n\n if (currentState) {\n if (currentState.schemaHash !== expectedHash) {\n throw new Error(\n `Schema drift detected. Database hash ${currentState.schemaHash} does not match expected local hash ${expectedHash}`,\n );\n }\n } else if (appliedRows.length > 0) {\n throw new Error(\n `Database has applied migrations recorded in ${MIGRATIONS_TABLE} but is missing ${STATE_TABLE}`,\n );\n }\n\n const pendingMigrations = args.migrations.filter(\n (migration) => !appliedIds.has(migration.meta.id),\n );\n const appliedPlans: PlannedMigration[] = [];\n let currentSchema = expectedCurrent;\n\n for (const migration of pendingMigrations) {\n const plan = planMigration({\n currentSchema,\n migration,\n });\n\n if (plan.sql.warnings.length > 0) {\n throw new Error(\n `Migration ${plan.migrationId} cannot be applied safely:\\n${plan.sql.warnings\n .map((warning) => `- ${warning}`)\n .join(\"\\n\")}`,\n );\n }\n\n await executePlan(client, plan);\n currentSchema = plan.nextSchema;\n appliedPlans.push(plan);\n }\n\n return {\n appliedPlans,\n skippedMigrationIds: appliedLocalMigrations.map((migration) => migration.meta.id),\n currentSchema,\n currentSchemaHash: schemaHash(currentSchema),\n } satisfies ApplyMigrationsResult;\n}\n\nexport async function listAppliedMigrations(client: Client) {\n const result = await client.execute(\n `SELECT migration_id, migration_name, schema_hash, applied_at\n FROM ${MIGRATIONS_TABLE}\n ORDER BY applied_at ASC, migration_id ASC`,\n );\n\n return (result.rows as Array<Record<string, unknown>>).map((row) => ({\n migrationId: getString(row.migration_id) ?? \"\",\n migrationName: getString(row.migration_name) ?? \"\",\n schemaHash: getString(row.schema_hash) ?? \"\",\n appliedAt: getNumber(row.applied_at) ?? 0,\n }));\n}\n\nexport async function inspectMigrationStatus(args: {\n client?: Client;\n connection?: LibsqlConnectionOptions;\n migrations: MigrationDefinition[];\n baseSchema?: DatabaseSchemaDocument;\n}) {\n const client = args.client ?? createLibsqlClient(assertConnection(args.connection));\n const metadataTablesPresent = await hasMetadataTables(client);\n const appliedRows = metadataTablesPresent ? await listAppliedMigrations(client) : [];\n const appliedIds = new Set(appliedRows.map((row) => row.migrationId));\n const localMigrationIds = args.migrations.map((migration) => migration.meta.id);\n const pendingMigrationIds = localMigrationIds.filter((id) => !appliedIds.has(id));\n const unexpectedDatabaseMigrationIds = appliedRows\n .map((row) => row.migrationId)\n .filter((id) => !localMigrationIds.includes(id));\n const appliedLocalMigrations = args.migrations.filter((migration) => appliedIds.has(migration.meta.id));\n const expectedCurrent = materializeSchema({\n baseSchema: args.baseSchema,\n migrations: appliedLocalMigrations,\n }).schema;\n const currentState = metadataTablesPresent ? await getSchemaState(client) : null;\n const localSchemaHash = schemaHash(expectedCurrent);\n const databaseSchemaHash = currentState?.schemaHash ?? null;\n\n return {\n localMigrationIds,\n appliedMigrationIds: appliedRows.map((row) => row.migrationId),\n pendingMigrationIds,\n unexpectedDatabaseMigrationIds,\n schemaHash: {\n local: localSchemaHash,\n database: databaseSchemaHash,\n driftDetected: databaseSchemaHash !== null && databaseSchemaHash !== localSchemaHash,\n },\n metadataTablesPresent,\n } satisfies MigrationStatusResult;\n}\n\nexport async function getSchemaState(client: Client): Promise<SchemaStateRow | null> {\n const result = await client.execute(\n `SELECT schema_hash, schema_json\n FROM ${STATE_TABLE}\n WHERE singleton_id = 1`,\n );\n\n const row = (result.rows as Array<Record<string, unknown>>)[0];\n if (!row) return null;\n\n const schemaHashValue = getString(row.schema_hash);\n const schemaJsonValue = getString(row.schema_json);\n if (!schemaHashValue || !schemaJsonValue) return null;\n\n return {\n schemaHash: schemaHashValue,\n schemaJson: schemaJsonValue,\n };\n}\n\nasync function ensureMetadataTables(client: Client) {\n await client.batch(\n [\n \"PRAGMA foreign_keys = ON\",\n `\n CREATE TABLE IF NOT EXISTS ${MIGRATIONS_TABLE} (\n migration_id TEXT PRIMARY KEY,\n migration_name TEXT NOT NULL,\n schema_hash TEXT NOT NULL,\n applied_at INTEGER NOT NULL,\n sql_statements_json TEXT NOT NULL\n )\n `,\n `\n CREATE TABLE IF NOT EXISTS ${STATE_TABLE} (\n singleton_id INTEGER PRIMARY KEY CHECK (singleton_id = 1),\n schema_hash TEXT NOT NULL,\n schema_json TEXT NOT NULL,\n updated_at INTEGER NOT NULL\n )\n `,\n ],\n \"write\",\n );\n}\n\nasync function hasMetadataTables(client: Client) {\n const result = await client.execute({\n sql: `SELECT name FROM sqlite_master\n WHERE type = 'table' AND name IN (?, ?)`,\n args: [MIGRATIONS_TABLE, STATE_TABLE],\n });\n\n const names = new Set(\n (result.rows as Array<Record<string, unknown>>)\n .map((row) => getString(row.name))\n .filter((value): value is string => value !== null),\n );\n\n return names.has(MIGRATIONS_TABLE) && names.has(STATE_TABLE);\n}\n\nasync function executePlan(client: Client, plan: PlannedMigration) {\n const appliedAt = Date.now();\n const statements: Array<string | { sql: string; args: SqlValue[] }> = [\n ...plan.sql.statements,\n {\n sql: `INSERT INTO ${MIGRATIONS_TABLE} (\n migration_id,\n migration_name,\n schema_hash,\n applied_at,\n sql_statements_json\n ) VALUES (?, ?, ?, ?, ?)`,\n args: [\n plan.migrationId,\n plan.migrationName,\n plan.toSchemaHash,\n appliedAt,\n JSON.stringify(plan.sql.statements),\n ],\n },\n {\n sql: `INSERT INTO ${STATE_TABLE} (\n singleton_id,\n schema_hash,\n schema_json,\n updated_at\n ) VALUES (1, ?, ?, ?)\n ON CONFLICT(singleton_id) DO UPDATE SET\n schema_hash = excluded.schema_hash,\n schema_json = excluded.schema_json,\n updated_at = excluded.updated_at`,\n args: [plan.toSchemaHash, JSON.stringify(plan.nextSchema), appliedAt],\n },\n ];\n\n await client.batch(statements, \"write\");\n}\n\nfunction assertConnection(\n connection: LibsqlConnectionOptions | undefined,\n): LibsqlConnectionOptions {\n if (!connection?.url) {\n throw new Error(\"Missing database connection. Provide --url or pass a connection object.\");\n }\n return connection;\n}\n\nfunction getString(value: unknown) {\n return typeof value === \"string\" && value.trim().length > 0 ? value : null;\n}\n\nfunction getNumber(value: unknown) {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"bigint\") return Number(value);\n if (typeof value === \"string\" && value.trim().length > 0) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n","import { z } from \"zod\";\n\nexport const foreignKeyActionSchema = z.enum([\n \"cascade\",\n \"restrict\",\n \"set null\",\n \"set default\",\n \"no action\",\n]);\n\nexport const fieldReferenceSpecSchema = z.object({\n table: z.string().min(1),\n field: z.string().min(1),\n onDelete: foreignKeyActionSchema.optional(),\n onUpdate: foreignKeyActionSchema.optional(),\n});\n\nexport const logicalTypeSpecSchema = z.discriminatedUnion(\"kind\", [\n z.object({\n kind: z.literal(\"id\"),\n prefix: z.string().min(1),\n }),\n z.object({\n kind: z.literal(\"string\"),\n format: z.enum([\"email\", \"url\", \"slug\"]).optional(),\n }),\n z.object({\n kind: z.literal(\"text\"),\n }),\n z.object({\n kind: z.literal(\"boolean\"),\n }),\n z.object({\n kind: z.literal(\"integer\"),\n }),\n z.object({\n kind: z.literal(\"number\"),\n }),\n z.object({\n kind: z.literal(\"enum\"),\n values: z.array(z.string()).min(1),\n }),\n z.object({\n kind: z.literal(\"json\"),\n tsType: z.string().min(1),\n }),\n z.object({\n kind: z.literal(\"temporal.instant\"),\n }),\n z.object({\n kind: z.literal(\"temporal.plainDate\"),\n }),\n]);\n\nexport const storageSpecSchema = z.discriminatedUnion(\"strategy\", [\n z.object({\n strategy: z.literal(\"sqlite.text\"),\n column: z.string().min(1),\n }),\n z.object({\n strategy: z.literal(\"sqlite.integer\"),\n column: z.string().min(1),\n }),\n z.object({\n strategy: z.literal(\"sqlite.real\"),\n column: z.string().min(1),\n }),\n z.object({\n strategy: z.literal(\"sqlite.temporalInstantEpochMs\"),\n column: z.string().min(1),\n }),\n z.object({\n strategy: z.literal(\"sqlite.temporalPlainDateText\"),\n column: z.string().min(1),\n }),\n]);\n\nexport const defaultSpecSchema = z.discriminatedUnion(\"kind\", [\n z.object({\n kind: z.literal(\"literal\"),\n value: z.union([z.string(), z.number(), z.boolean(), z.null()]),\n }),\n z.object({\n kind: z.literal(\"now\"),\n }),\n z.object({\n kind: z.literal(\"generatedId\"),\n prefix: z.string().min(1),\n }),\n]);\n\nexport const fieldSpecSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n logical: logicalTypeSpecSchema,\n storage: storageSpecSchema,\n nullable: z.boolean().default(true),\n default: defaultSpecSchema.optional(),\n primaryKey: z.boolean().default(false),\n unique: z.boolean().default(false),\n description: z.string().min(1).optional(),\n references: fieldReferenceSpecSchema.optional(),\n});\n\nexport const indexSpecSchema = z.object({\n name: z.string().min(1).optional(),\n fields: z.array(z.string().min(1)).min(1),\n});\n\nexport const uniqueSpecSchema = z.object({\n name: z.string().min(1).optional(),\n fields: z.array(z.string().min(1)).min(1),\n});\n\nexport const tableSpecSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n description: z.string().min(1).optional(),\n fields: z.array(fieldSpecSchema).default([]),\n indexes: z.array(indexSpecSchema).default([]),\n uniques: z.array(uniqueSpecSchema).default([]),\n});\n\nexport const schemaDocumentSchema = z.object({\n version: z.literal(1),\n dialect: z.literal(\"sqlite\"),\n schemaId: z.string().min(1),\n tables: z.array(tableSpecSchema).default([]),\n});\n\nexport type ForeignKeyAction = z.infer<typeof foreignKeyActionSchema>;\nexport type FieldReferenceSpec = z.infer<typeof fieldReferenceSpecSchema>;\nexport type LogicalTypeSpec = z.infer<typeof logicalTypeSpecSchema>;\nexport type StorageSpec = z.infer<typeof storageSpecSchema>;\nexport type DefaultSpec = z.infer<typeof defaultSpecSchema>;\nexport type FieldSpec = z.infer<typeof fieldSpecSchema>;\nexport type IndexSpec = z.infer<typeof indexSpecSchema>;\nexport type UniqueSpec = z.infer<typeof uniqueSpecSchema>;\nexport type TableSpec = z.infer<typeof tableSpecSchema>;\nexport type DatabaseSchemaDocument = z.infer<typeof schemaDocumentSchema>;\n\nexport type SchemaValidationIssue = {\n path: string;\n message: string;\n};\n","import {\n type DatabaseSchemaDocument,\n type FieldSpec,\n type SchemaValidationIssue,\n schemaDocumentSchema,\n} from \"./types\";\nimport { createSchemaHash, validateSchemaDocumentCompatibility } from \"./utils\";\n\nexport function createEmptySchema(schemaId = \"schema\") {\n return schemaDocumentSchema.parse({\n version: 1,\n dialect: \"sqlite\",\n schemaId,\n tables: [],\n });\n}\n\nexport function parseSchemaDocument(input: unknown): DatabaseSchemaDocument {\n return schemaDocumentSchema.parse(input);\n}\n\nexport function validateSchemaDocument(input: unknown): {\n schema: DatabaseSchemaDocument;\n issues: SchemaValidationIssue[];\n} {\n const schema = parseSchemaDocument(input);\n return {\n schema,\n issues: validateSchemaDocumentCompatibility(schema),\n };\n}\n\nexport function assertValidSchemaDocument(input: unknown): DatabaseSchemaDocument {\n const { schema, issues } = validateSchemaDocument(input);\n if (issues.length > 0) {\n throw new Error(\n `Schema validation failed:\\n${issues.map((issue) => `- ${issue.path}: ${issue.message}`).join(\"\\n\")}`,\n );\n }\n return schema;\n}\n\nexport function schemaHash(input: DatabaseSchemaDocument) {\n return createSchemaHash(input);\n}\n\nexport function findTable(schema: DatabaseSchemaDocument, tableName: string) {\n return schema.tables.find((table) => table.name === tableName) ?? null;\n}\n\nexport function findField(table: { fields: FieldSpec[] }, fieldName: string) {\n return table.fields.find((field) => field.name === fieldName) ?? null;\n}\n","import type {\n DatabaseSchemaDocument,\n FieldSpec,\n IndexSpec,\n UniqueSpec,\n} from \"./types\";\nimport type { AlterFieldPatch, MigrationOperation } from \"./migration\";\nimport { assertValidSchemaDocument, findField, findTable } from \"./schema\";\nimport {\n cloneSchema,\n defaultStorageForLogical,\n renameStorageColumn,\n validateDefaultCompatibility,\n validateLogicalAndStorageCompatibility,\n} from \"./utils\";\n\nexport function applyOperationsToSchema(\n schemaInput: DatabaseSchemaDocument,\n operations: MigrationOperation[],\n) {\n const schema = cloneSchema(schemaInput);\n\n for (const operation of operations) {\n applyOperationToSchemaMutating(schema, operation);\n }\n\n return assertValidSchemaDocument(schema);\n}\n\nexport function applyOperationToSchema(\n schemaInput: DatabaseSchemaDocument,\n operation: MigrationOperation,\n) {\n const schema = cloneSchema(schemaInput);\n applyOperationToSchemaMutating(schema, operation);\n return assertValidSchemaDocument(schema);\n}\n\nfunction applyOperationToSchemaMutating(\n schema: DatabaseSchemaDocument,\n operation: MigrationOperation,\n) {\n switch (operation.kind) {\n case \"createTable\":\n if (findTable(schema, operation.table.name)) {\n throw new Error(`Table ${operation.table.name} already exists`);\n }\n schema.tables.push(cloneSchema(operation.table));\n return;\n case \"dropTable\": {\n const referencedBy = schema.tables.flatMap((table) =>\n table.fields\n .filter((field) => field.references?.table === operation.tableName)\n .map((field) => `${table.name}.${field.name}`),\n );\n\n if (referencedBy.length > 0) {\n throw new Error(\n `Cannot drop table ${operation.tableName}; still referenced by ${referencedBy.join(\", \")}`,\n );\n }\n\n const index = schema.tables.findIndex((table) => table.name === operation.tableName);\n if (index < 0) throw new Error(`Table ${operation.tableName} does not exist`);\n schema.tables.splice(index, 1);\n return;\n }\n case \"renameTable\": {\n const table = findTable(schema, operation.from);\n if (!table) throw new Error(`Table ${operation.from} does not exist`);\n if (findTable(schema, operation.to)) {\n throw new Error(`Table ${operation.to} already exists`);\n }\n\n table.name = operation.to;\n for (const candidateTable of schema.tables) {\n for (const field of candidateTable.fields) {\n if (field.references?.table === operation.from) {\n field.references = {\n ...field.references,\n table: operation.to,\n };\n }\n }\n }\n return;\n }\n case \"addField\": {\n const table = findTable(schema, operation.tableName);\n if (!table) throw new Error(`Table ${operation.tableName} does not exist`);\n if (findField(table, operation.field.name)) {\n throw new Error(`Field ${operation.tableName}.${operation.field.name} already exists`);\n }\n table.fields.push(cloneSchema(operation.field));\n return;\n }\n case \"dropField\": {\n const table = findTable(schema, operation.tableName);\n if (!table) throw new Error(`Table ${operation.tableName} does not exist`);\n const fieldIndex = table.fields.findIndex((field) => field.name === operation.fieldName);\n if (fieldIndex < 0) {\n throw new Error(`Field ${operation.tableName}.${operation.fieldName} does not exist`);\n }\n const referencedBy = schema.tables.flatMap((candidateTable) =>\n candidateTable.fields\n .filter(\n (field) =>\n field.references?.table === operation.tableName &&\n field.references.field === operation.fieldName,\n )\n .map((field) => `${candidateTable.name}.${field.name}`),\n );\n if (referencedBy.length > 0) {\n throw new Error(\n `Cannot drop field ${operation.tableName}.${operation.fieldName}; still referenced by ${referencedBy.join(\", \")}`,\n );\n }\n table.fields.splice(fieldIndex, 1);\n table.indexes = table.indexes.filter((index) => !index.fields.includes(operation.fieldName));\n table.uniques = table.uniques.filter((unique) => !unique.fields.includes(operation.fieldName));\n return;\n }\n case \"renameField\": {\n const table = findTable(schema, operation.tableName);\n if (!table) throw new Error(`Table ${operation.tableName} does not exist`);\n const field = findField(table, operation.from);\n if (!field) throw new Error(`Field ${operation.tableName}.${operation.from} does not exist`);\n if (findField(table, operation.to)) {\n throw new Error(`Field ${operation.tableName}.${operation.to} already exists`);\n }\n\n const renamed = renameStorageColumn(field, operation.to);\n const index = table.fields.findIndex((candidate) => candidate.id === field.id);\n table.fields[index] = renamed;\n table.indexes = renameFieldInIndexes(table.indexes, operation.from, operation.to);\n table.uniques = renameFieldInUniques(table.uniques, operation.from, operation.to);\n\n for (const candidateTable of schema.tables) {\n for (const candidateField of candidateTable.fields) {\n if (\n candidateField.references?.table === table.name &&\n candidateField.references.field === operation.from\n ) {\n candidateField.references = {\n ...candidateField.references,\n field: operation.to,\n };\n }\n }\n }\n return;\n }\n case \"alterField\": {\n const table = findTable(schema, operation.tableName);\n if (!table) throw new Error(`Table ${operation.tableName} does not exist`);\n const field = findField(table, operation.fieldName);\n if (!field) {\n throw new Error(`Field ${operation.tableName}.${operation.fieldName} does not exist`);\n }\n\n const nextField = applyAlterFieldPatch(operation.tableName, field, operation.patch);\n const fieldIndex = table.fields.findIndex((candidate) => candidate.id === field.id);\n table.fields[fieldIndex] = nextField;\n return;\n }\n case \"addIndex\": {\n const table = findTable(schema, operation.tableName);\n if (!table) throw new Error(`Table ${operation.tableName} does not exist`);\n table.indexes.push(cloneSchema(operation.index));\n return;\n }\n case \"dropIndex\": {\n const table = findTable(schema, operation.tableName);\n if (!table) throw new Error(`Table ${operation.tableName} does not exist`);\n const nextIndexes = table.indexes.filter(\n (index) => resolveIndexName(table.name, index) !== operation.indexName,\n );\n if (nextIndexes.length === table.indexes.length) {\n throw new Error(`Index ${operation.indexName} does not exist on ${table.name}`);\n }\n table.indexes = nextIndexes;\n return;\n }\n case \"addUnique\": {\n const table = findTable(schema, operation.tableName);\n if (!table) throw new Error(`Table ${operation.tableName} does not exist`);\n table.uniques.push(cloneSchema(operation.unique));\n return;\n }\n case \"dropUnique\": {\n const table = findTable(schema, operation.tableName);\n if (!table) throw new Error(`Table ${operation.tableName} does not exist`);\n const nextUniques = table.uniques.filter(\n (unique) => resolveUniqueName(table.name, unique) !== operation.uniqueName,\n );\n if (nextUniques.length === table.uniques.length) {\n throw new Error(`Unique ${operation.uniqueName} does not exist on ${table.name}`);\n }\n table.uniques = nextUniques;\n return;\n }\n }\n}\n\nexport function applyAlterFieldPatch(\n tableName: string,\n field: FieldSpec,\n patch: AlterFieldPatch,\n): FieldSpec {\n if (field.primaryKey) {\n throw new Error(`Field ${tableName}.${field.name} is a primary key and cannot be altered in v1`);\n }\n if (patch.logical?.kind === \"id\") {\n throw new Error(`Field ${tableName}.${field.name} cannot be altered into an id field in v1`);\n }\n\n const nextLogical = patch.logical ?? field.logical;\n const nextColumn = patch.column ?? patch.storage?.column ?? field.storage.column;\n const nextStorage =\n patch.storage ??\n (patch.logical ? defaultStorageForLogical(nextLogical, nextColumn) : { ...field.storage, column: nextColumn });\n\n const nextField: FieldSpec = {\n ...cloneSchema(field),\n logical: cloneSchema(nextLogical),\n storage: cloneSchema(nextStorage),\n };\n\n if (patch.nullable !== undefined) nextField.nullable = patch.nullable;\n if (patch.default !== undefined) nextField.default = patch.default ?? undefined;\n if (patch.unique !== undefined) nextField.unique = patch.unique;\n if (patch.description !== undefined) nextField.description = patch.description ?? undefined;\n if (patch.references !== undefined) nextField.references = patch.references ?? undefined;\n\n const storageIssue = validateLogicalAndStorageCompatibility(nextField.logical, nextField.storage);\n if (storageIssue) {\n throw new Error(`Field ${tableName}.${field.name}: ${storageIssue}`);\n }\n\n if (nextField.default) {\n const defaultIssue = validateDefaultCompatibility(nextField, nextField.default);\n if (defaultIssue) {\n throw new Error(`Field ${tableName}.${field.name}: ${defaultIssue}`);\n }\n }\n\n return nextField;\n}\n\nexport function fieldStorageStrategyChanged(before: FieldSpec, after: FieldSpec) {\n return before.storage.strategy !== after.storage.strategy;\n}\n\nexport function fieldNullabilityTightened(before: FieldSpec, after: FieldSpec) {\n return before.nullable && !after.nullable;\n}\n\nexport function resolveIndexName(tableName: string, index: IndexSpec) {\n return index.name ?? `${tableName}_${index.fields.join(\"_\")}_idx`;\n}\n\nexport function resolveUniqueName(tableName: string, unique: UniqueSpec) {\n return unique.name ?? `${tableName}_${unique.fields.join(\"_\")}_unique`;\n}\n\nfunction renameFieldInIndexes(indexes: IndexSpec[], from: string, to: string): IndexSpec[] {\n return indexes.map((index) => ({\n ...index,\n fields: index.fields.map((field) => (field === from ? to : field)),\n }));\n}\n\nfunction renameFieldInUniques(uniques: UniqueSpec[], from: string, to: string): UniqueSpec[] {\n return uniques.map((unique) => ({\n ...unique,\n fields: unique.fields.map((field) => (field === from ? to : field)),\n }));\n}\n","import type {\n DatabaseSchemaDocument,\n DefaultSpec,\n FieldSpec,\n IndexSpec,\n StorageSpec,\n TableSpec,\n UniqueSpec,\n} from \"./types\";\nimport type { MigrationOperation } from \"./migration\";\nimport { createEmptySchema, findTable } from \"./schema\";\nimport {\n applyOperationToSchema,\n fieldNullabilityTightened,\n fieldStorageStrategyChanged,\n} from \"./operations\";\nimport { quoteIdentifier, sqliteEpochMsNowSql, toSnakeCase } from \"./utils\";\n\nexport function compileSchemaToSqlite(schema: DatabaseSchemaDocument) {\n const statements: string[] = [];\n\n for (const table of schema.tables) {\n statements.push(renderCreateTableStatement(table));\n statements.push(...renderCreateIndexStatements(table));\n }\n\n return `${statements.join(\"\\n\\n\")}\\n`;\n}\n\nexport function renderSqliteMigration(\n operations: MigrationOperation[],\n options: { currentSchema?: DatabaseSchemaDocument } = {},\n) {\n const statements: string[] = [];\n const warnings: string[] = [];\n let workingSchema = options.currentSchema ?? createEmptySchema();\n let rebuildSequence = 0;\n\n for (const operation of operations) {\n const nextSchema = applyOperationToSchema(workingSchema, operation);\n\n switch (operation.kind) {\n case \"createTable\":\n statements.push(renderCreateTableStatement(operation.table));\n statements.push(...renderCreateIndexStatements(operation.table));\n break;\n case \"dropTable\":\n statements.push(`DROP TABLE ${quoteIdentifier(operation.tableName)};`);\n break;\n case \"renameTable\":\n statements.push(\n `ALTER TABLE ${quoteIdentifier(operation.from)} RENAME TO ${quoteIdentifier(operation.to)};`,\n );\n break;\n case \"renameField\":\n statements.push(\n `ALTER TABLE ${quoteIdentifier(operation.tableName)} RENAME COLUMN ${quoteIdentifier(toSnakeCase(operation.from))} TO ${quoteIdentifier(toSnakeCase(operation.to))};`,\n );\n break;\n case \"addIndex\":\n statements.push(renderCreateIndexStatement(operation.tableName, operation.index));\n break;\n case \"dropIndex\":\n statements.push(`DROP INDEX ${quoteIdentifier(operation.indexName)};`);\n break;\n case \"addUnique\":\n statements.push(renderCreateUniqueStatement(operation.tableName, operation.unique));\n break;\n case \"dropUnique\":\n statements.push(`DROP INDEX ${quoteIdentifier(operation.uniqueName)};`);\n break;\n case \"addField\":\n case \"dropField\":\n case \"alterField\": {\n const tableName = operation.tableName;\n const beforeTable = findTable(workingSchema, tableName);\n const afterTable = findTable(nextSchema, tableName);\n\n if (!beforeTable || !afterTable) {\n warnings.push(\n `operation ${operation.kind} on ${tableName} could not be emitted because the table state was incomplete`,\n );\n break;\n }\n\n const rebuild = renderTableRebuild({\n beforeTable,\n afterTable,\n operation,\n sequence: rebuildSequence,\n });\n rebuildSequence += 1;\n statements.push(...rebuild.statements);\n warnings.push(...rebuild.warnings);\n break;\n }\n }\n\n workingSchema = nextSchema;\n }\n\n return {\n statements,\n warnings,\n };\n}\n\nexport function renderCreateTableStatement(table: TableSpec) {\n const columnLines = table.fields.map((field) => ` ${renderColumnDefinition(field)}`);\n return `CREATE TABLE ${quoteIdentifier(table.name)} (\\n${columnLines.join(\",\\n\")}\\n);`;\n}\n\nexport function renderCreateIndexStatements(table: TableSpec) {\n const statements = table.indexes.map((index) =>\n renderCreateIndexStatement(table.name, index, table),\n );\n statements.push(\n ...table.uniques.map((unique) => renderCreateUniqueStatement(table.name, unique, table)),\n );\n return statements;\n}\n\nfunction renderCreateIndexStatement(tableName: string, index: IndexSpec, table?: TableSpec) {\n const name = index.name ?? `${tableName}_${index.fields.join(\"_\")}_idx`;\n return `CREATE INDEX ${quoteIdentifier(name)} ON ${quoteIdentifier(tableName)} (${index.fields\n .map((field) => quoteIdentifier(resolveColumnName(table, field)))\n .join(\", \")});`;\n}\n\nfunction renderCreateUniqueStatement(tableName: string, unique: UniqueSpec, table?: TableSpec) {\n const name = unique.name ?? `${tableName}_${unique.fields.join(\"_\")}_unique`;\n return `CREATE UNIQUE INDEX ${quoteIdentifier(name)} ON ${quoteIdentifier(tableName)} (${unique.fields\n .map((field) => quoteIdentifier(resolveColumnName(table, field)))\n .join(\", \")});`;\n}\n\nfunction renderColumnDefinition(field: FieldSpec) {\n const parts = [quoteIdentifier(field.storage.column), renderSqlType(field.storage)];\n\n if (field.primaryKey) parts.push(\"PRIMARY KEY\");\n if (!field.nullable) parts.push(\"NOT NULL\");\n if (field.unique && !field.primaryKey) parts.push(\"UNIQUE\");\n\n const defaultSql = renderSqlDefault(field.default, field);\n if (defaultSql) parts.push(`DEFAULT ${defaultSql}`);\n\n if (field.references) {\n parts.push(\n `REFERENCES ${quoteIdentifier(field.references.table)}(${quoteIdentifier(toSnakeCase(field.references.field))})`,\n );\n if (field.references.onDelete)\n parts.push(`ON DELETE ${field.references.onDelete.toUpperCase()}`);\n if (field.references.onUpdate)\n parts.push(`ON UPDATE ${field.references.onUpdate.toUpperCase()}`);\n }\n\n return parts.join(\" \");\n}\n\nfunction renderSqlType(storage: StorageSpec) {\n switch (storage.strategy) {\n case \"sqlite.text\":\n case \"sqlite.temporalPlainDateText\":\n return \"TEXT\";\n case \"sqlite.integer\":\n case \"sqlite.temporalInstantEpochMs\":\n return \"INTEGER\";\n case \"sqlite.real\":\n return \"REAL\";\n }\n}\n\nfunction renderSqlDefault(defaultValue: DefaultSpec | undefined, field: FieldSpec) {\n if (!defaultValue) return null;\n\n switch (defaultValue.kind) {\n case \"generatedId\":\n return null;\n case \"now\":\n return `(${sqliteEpochMsNowSql()})`;\n case \"literal\":\n if (defaultValue.value === null) return \"NULL\";\n if (typeof defaultValue.value === \"string\") {\n return `'${defaultValue.value.replace(/'/g, \"''\")}'`;\n }\n if (typeof defaultValue.value === \"boolean\") {\n return field.storage.strategy === \"sqlite.integer\"\n ? defaultValue.value\n ? \"1\"\n : \"0\"\n : defaultValue.value\n ? \"TRUE\"\n : \"FALSE\";\n }\n return `${defaultValue.value}`;\n }\n}\n\nfunction resolveColumnName(table: TableSpec | undefined, fieldName: string) {\n const field = table?.fields.find((candidate) => candidate.name === fieldName);\n return field?.storage.column ?? toSnakeCase(fieldName);\n}\n\nfunction renderTableRebuild(args: {\n beforeTable: TableSpec;\n afterTable: TableSpec;\n operation: Extract<MigrationOperation, { kind: \"addField\" | \"dropField\" | \"alterField\" }>;\n sequence: number;\n}) {\n const warnings: string[] = [];\n const tempName = `__sedrino_rebuild_${args.afterTable.name}_${args.sequence}`;\n const insertColumns = args.afterTable.fields.map((field) => quoteIdentifier(field.storage.column));\n const selectExpressions = args.afterTable.fields.map((field) =>\n renderRebuildSelectExpression({\n beforeTable: args.beforeTable,\n afterTable: args.afterTable,\n operation: args.operation,\n targetField: field,\n warnings,\n }),\n );\n\n const statements = [\n \"PRAGMA foreign_keys = OFF;\",\n `ALTER TABLE ${quoteIdentifier(args.beforeTable.name)} RENAME TO ${quoteIdentifier(tempName)};`,\n renderCreateTableStatement(args.afterTable),\n ...renderCreateIndexStatements(args.afterTable),\n `INSERT INTO ${quoteIdentifier(args.afterTable.name)} (${insertColumns.join(\", \")}) SELECT ${selectExpressions.join(\", \")} FROM ${quoteIdentifier(tempName)};`,\n `DROP TABLE ${quoteIdentifier(tempName)};`,\n \"PRAGMA foreign_keys = ON;\",\n ];\n\n return {\n statements,\n warnings,\n };\n}\n\nfunction renderRebuildSelectExpression(args: {\n beforeTable: TableSpec;\n afterTable: TableSpec;\n operation: Extract<MigrationOperation, { kind: \"addField\" | \"dropField\" | \"alterField\" }>;\n targetField: FieldSpec;\n warnings: string[];\n}) {\n const sourceField =\n args.beforeTable.fields.find((candidate) => candidate.id === args.targetField.id) ?? null;\n\n if (!sourceField) {\n if (\n args.operation.kind === \"addField\" &&\n args.operation.field.id === args.targetField.id &&\n args.operation.backfill\n ) {\n return `(${args.operation.backfill.sql}) AS ${quoteIdentifier(args.targetField.storage.column)}`;\n }\n\n const defaultSql = renderSqlDefault(args.targetField.default, args.targetField);\n if (defaultSql) return `${defaultSql} AS ${quoteIdentifier(args.targetField.storage.column)}`;\n if (args.targetField.nullable) {\n return `NULL AS ${quoteIdentifier(args.targetField.storage.column)}`;\n }\n\n args.warnings.push(\n `addField ${args.afterTable.name}.${args.targetField.name} is required with no default and cannot be backfilled safely`,\n );\n return `NULL AS ${quoteIdentifier(args.targetField.storage.column)}`;\n }\n\n if (fieldStorageStrategyChanged(sourceField, args.targetField)) {\n if (\n args.operation.kind === \"alterField\" &&\n args.operation.transform &&\n args.operation.fieldName === args.targetField.name\n ) {\n return `(${args.operation.transform.sql}) AS ${quoteIdentifier(args.targetField.storage.column)}`;\n }\n\n args.warnings.push(\n `alterField ${args.afterTable.name}.${args.targetField.name} changes storage strategy from ${sourceField.storage.strategy} to ${args.targetField.storage.strategy}; explicit data transforms are not supported in v1`,\n );\n }\n\n let expression = quoteIdentifier(sourceField.storage.column);\n\n if (\n args.operation.kind === \"alterField\" &&\n args.operation.transform &&\n args.operation.fieldName === args.targetField.name\n ) {\n expression = `(${args.operation.transform.sql})`;\n }\n\n if (\n fieldNullabilityTightened(sourceField, args.targetField) &&\n !(\n args.operation.kind === \"alterField\" &&\n args.operation.transform &&\n args.operation.fieldName === args.targetField.name\n )\n ) {\n const defaultSql = renderSqlDefault(args.targetField.default, args.targetField);\n if (defaultSql) {\n expression = `COALESCE(${expression}, ${defaultSql})`;\n } else {\n args.warnings.push(\n `alterField ${args.afterTable.name}.${args.targetField.name} makes a nullable field required without a default; existing NULL rows would fail during rebuild`,\n );\n }\n }\n\n return `${expression} AS ${quoteIdentifier(args.targetField.storage.column)}`;\n}\n","import type { DatabaseSchemaDocument } from \"./types\";\nimport { type MigrationDefinition, type MigrationOperation } from \"./migration\";\nimport { assertValidSchemaDocument, createEmptySchema } from \"./schema\";\nimport { applyOperationsToSchema } from \"./operations\";\nimport { renderSqliteMigration } from \"./sqlite\";\nimport { createSchemaHash } from \"./utils\";\n\nexport { applyOperationsToSchema } from \"./operations\";\n\nexport type PlannedMigration = {\n migrationId: string;\n migrationName: string;\n fromSchemaHash: string;\n toSchemaHash: string;\n operations: MigrationOperation[];\n nextSchema: DatabaseSchemaDocument;\n sql: {\n statements: string[];\n warnings: string[];\n };\n};\n\nexport function planMigration(args: {\n currentSchema?: DatabaseSchemaDocument;\n migration: MigrationDefinition;\n}): PlannedMigration {\n const currentSchema = args.currentSchema\n ? assertValidSchemaDocument(args.currentSchema)\n : createEmptySchema(args.migration.meta.id);\n const operations = args.migration.buildOperations();\n const nextSchema = applyOperationsToSchema(currentSchema, operations);\n\n return {\n migrationId: args.migration.meta.id,\n migrationName: args.migration.meta.name,\n fromSchemaHash: createSchemaHash(currentSchema),\n toSchemaHash: createSchemaHash(nextSchema),\n operations,\n nextSchema,\n sql: renderSqliteMigration(operations, { currentSchema }),\n };\n}\n\nexport function materializeSchema(args: {\n baseSchema?: DatabaseSchemaDocument;\n migrations: MigrationDefinition[];\n}) {\n let schema = args.baseSchema ? assertValidSchemaDocument(args.baseSchema) : createEmptySchema();\n const plans: PlannedMigration[] = [];\n\n for (const migration of args.migrations) {\n const plan = planMigration({\n currentSchema: schema,\n migration,\n });\n plans.push(plan);\n schema = plan.nextSchema;\n }\n\n return {\n schema,\n plans,\n };\n}\n","import { mkdir, readFile, readdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { DatabaseSchemaDocument } from \"./types\";\nimport type { MigrationDefinition } from \"./migration\";\nimport { compileSchemaToDrizzle } from \"./drizzle\";\nimport { materializeSchema } from \"./planner\";\n\nconst MIGRATION_EXTENSIONS = new Set([\".ts\", \".mts\", \".js\", \".mjs\"]);\n\nexport type DbProjectLayout = {\n dbDir: string;\n migrationsDir: string;\n schemaDir: string;\n snapshotPath: string;\n drizzlePath: string;\n};\n\nexport type CreatedMigrationFile = {\n filePath: string;\n fileName: string;\n migrationId: string;\n migrationName: string;\n};\n\nexport function resolveDbProjectLayout(dbDir = \"db\"): DbProjectLayout {\n const absoluteDbDir = path.resolve(dbDir);\n return {\n dbDir: absoluteDbDir,\n migrationsDir: path.join(absoluteDbDir, \"migrations\"),\n schemaDir: path.join(absoluteDbDir, \"schema\"),\n snapshotPath: path.join(absoluteDbDir, \"schema\", \"schema.snapshot.json\"),\n drizzlePath: path.join(absoluteDbDir, \"schema\", \"schema.generated.ts\"),\n };\n}\n\nexport async function loadMigrationDefinitionsFromDirectory(\n migrationsDir: string,\n): Promise<MigrationDefinition[]> {\n const files = await readdir(migrationsDir, { withFileTypes: true });\n const migrationFiles = files\n .filter((entry) => entry.isFile())\n .map((entry) => path.join(migrationsDir, entry.name))\n .filter((filePath) => MIGRATION_EXTENSIONS.has(path.extname(filePath)))\n .sort((left, right) => path.basename(left).localeCompare(path.basename(right)));\n\n const migrations: MigrationDefinition[] = [];\n\n for (const filePath of migrationFiles) {\n const imported = await import(pathToFileURL(filePath).href);\n const definition = imported.default as Partial<MigrationDefinition> | undefined;\n\n if (\n !definition ||\n !definition.meta ||\n typeof definition.meta.id !== \"string\" ||\n typeof definition.meta.name !== \"string\" ||\n typeof definition.buildOperations !== \"function\"\n ) {\n throw new Error(`Migration file ${filePath} does not export a valid default migration`);\n }\n\n migrations.push(definition as MigrationDefinition);\n }\n\n return migrations;\n}\n\nexport async function materializeProjectMigrations(layout: DbProjectLayout) {\n const migrations = await loadMigrationDefinitionsFromDirectory(layout.migrationsDir);\n assertUniqueMigrationIds(migrations);\n const materialized = materializeSchema({ migrations });\n return {\n ...materialized,\n migrations,\n };\n}\n\nexport async function createMigrationScaffold(\n layout: DbProjectLayout,\n rawName: string,\n now = new Date(),\n): Promise<CreatedMigrationFile> {\n const slug = toKebabCase(rawName);\n if (!slug) {\n throw new Error(\"Migration name must contain at least one letter or number\");\n }\n\n await mkdir(layout.migrationsDir, { recursive: true });\n\n const datePrefix = formatMigrationDate(now);\n const sequence = await nextMigrationSequence(layout.migrationsDir, datePrefix);\n const sequenceText = String(sequence).padStart(3, \"0\");\n const migrationId = `${datePrefix}-${sequenceText}-${slug}`;\n const fileName = `${migrationId}.ts`;\n const filePath = path.join(layout.migrationsDir, fileName);\n const migrationName = humanizeMigrationName(slug);\n const source = renderMigrationTemplate({\n migrationId,\n migrationName,\n });\n\n await writeFile(filePath, source, { encoding: \"utf8\", flag: \"wx\" });\n\n return {\n filePath,\n fileName,\n migrationId,\n migrationName,\n };\n}\n\nexport async function validateDbProject(layout: DbProjectLayout) {\n const materialized = await materializeProjectMigrations(layout);\n const expectedSnapshot = `${JSON.stringify(materialized.schema, null, 2)}\\n`;\n const expectedDrizzle = compileSchemaToDrizzle(materialized.schema);\n const warnings = materialized.plans.flatMap((plan) =>\n plan.sql.warnings.map((warning) => `${plan.migrationId}: ${warning}`),\n );\n\n const [snapshotContents, drizzleContents] = await Promise.all([\n readTextIfExists(layout.snapshotPath),\n readTextIfExists(layout.drizzlePath),\n ]);\n\n return {\n ...materialized,\n warnings,\n expectedSnapshot,\n expectedDrizzle,\n artifacts: {\n snapshotExists: snapshotContents !== null,\n drizzleExists: drizzleContents !== null,\n snapshotUpToDate: snapshotContents === expectedSnapshot,\n drizzleUpToDate: drizzleContents === expectedDrizzle,\n },\n };\n}\n\nexport async function writeSchemaSnapshot(schema: DatabaseSchemaDocument, snapshotPath: string) {\n await mkdir(path.dirname(snapshotPath), { recursive: true });\n await writeFile(snapshotPath, `${JSON.stringify(schema, null, 2)}\\n`, \"utf8\");\n}\n\nexport async function writeDrizzleSchema(schema: DatabaseSchemaDocument, drizzlePath: string) {\n await mkdir(path.dirname(drizzlePath), { recursive: true });\n await writeFile(drizzlePath, compileSchemaToDrizzle(schema), \"utf8\");\n}\n\nfunction assertUniqueMigrationIds(migrations: MigrationDefinition[]) {\n const seen = new Set<string>();\n for (const migration of migrations) {\n if (seen.has(migration.meta.id)) {\n throw new Error(`Duplicate migration id ${migration.meta.id}`);\n }\n seen.add(migration.meta.id);\n }\n}\n\nasync function readTextIfExists(filePath: string) {\n try {\n return await readFile(filePath, \"utf8\");\n } catch (error) {\n if (error && typeof error === \"object\" && \"code\" in error && error.code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\nasync function nextMigrationSequence(migrationsDir: string, datePrefix: string) {\n const files = await readdir(migrationsDir, { withFileTypes: true });\n let maxSequence = 0;\n\n for (const entry of files) {\n if (!entry.isFile()) continue;\n const match = entry.name.match(/^(\\d{4}-\\d{2}-\\d{2})-(\\d{3})(?:-[^.]+)?\\.(?:ts|mts|js|mjs)$/);\n if (!match) continue;\n if (match[1] !== datePrefix) continue;\n\n const parsed = Number(match[2]);\n if (Number.isInteger(parsed) && parsed > maxSequence) {\n maxSequence = parsed;\n }\n }\n\n return maxSequence + 1;\n}\n\nfunction formatMigrationDate(date: Date) {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n}\n\nfunction toKebabCase(value: string) {\n return value\n .trim()\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/([A-Z]+)([A-Z][a-z0-9]+)/g, \"$1-$2\")\n .replace(/[^a-zA-Z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .toLowerCase();\n}\n\nfunction humanizeMigrationName(slug: string) {\n const parts = slug.split(\"-\").filter(Boolean);\n const first = parts[0];\n if (!first) return \"New migration\";\n\n const rest = parts.slice(1);\n return [\n `${first[0]!.toUpperCase()}${first.slice(1)}`,\n ...rest,\n ].join(\" \");\n}\n\nfunction renderMigrationTemplate(args: {\n migrationId: string;\n migrationName: string;\n}) {\n return `import { createMigration } from \"@sedrino/db-schema\";\n\nexport default createMigration(\n {\n id: ${JSON.stringify(args.migrationId)},\n name: ${JSON.stringify(args.migrationName)},\n },\n (m) => {\n // TODO: define migration operations.\n },\n);\n`;\n}\n"],"mappings":"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","names":["path","path"]}
|