import type { AnyColumn, AnyTable } from "../schema/create"; export interface ForeignKeyInfo { name: string; columns: string[]; referencedTable: string; referencedColumns: string[]; onUpdate: "RESTRICT" | "CASCADE" | "SET NULL"; onDelete: "RESTRICT" | "CASCADE" | "SET NULL"; } export type MigrationOperation = | TableOperation | { // warning: not supported by SQLite type: "add-foreign-key"; table: string; value: ForeignKeyInfo; } | { // warning: not supported by SQLite type: "drop-foreign-key"; table: string; name: string; } | { type: "drop-unique-constraint"; table: string; name: string; } | { type: "add-unique-constraint"; table: string; columns: string[]; name: string; } | CustomOperation; export type CustomOperation = { type: "custom"; } & Record; export type TableOperation = | { type: "create-table"; value: AnyTable; } | { type: "drop-table"; name: string; } | { /** * Not supported by FumaDB * - update table's primary key */ type: "update-table"; name: string; value: ColumnOperation[]; } | { type: "rename-table"; from: string; to: string; }; export type ColumnOperation = | { type: "rename-column"; from: string; to: string; } | { type: "drop-column"; name: string; } | { /** * Note: unique constraints are not created, please use dedicated operations like `add-unique-constraint` instead */ type: "create-column"; value: AnyColumn; } | { /** * warning: Not supported by SQLite */ type: "update-column"; name: string; /** * For databases like MySQL, it requires the full definition for any modify column statement. * Hence, you need to specify the full information of your column here. * * Then, opt-in for in-detail modification for other databases that supports changing data type/nullable/default separately, such as PostgreSQL. * * Note: unique constraints are not updated, please use dedicated operations like `add-unique-constraint` instead */ value: AnyColumn; updateNullable: boolean; updateDefault: boolean; updateDataType: boolean; }; export function isUpdated( op: Extract ): boolean { return op.updateDataType || op.updateDefault || op.updateNullable; }