@c9up/atlas 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/README.md +8 -0
  2. package/db.darwin-arm64.node +0 -0
  3. package/db.darwin-x64.node +0 -0
  4. package/db.linux-arm64-gnu.node +0 -0
  5. package/db.linux-x64-gnu.node +0 -0
  6. package/db.win32-x64-msvc.node +0 -0
  7. package/dist/AtlasProvider.d.ts +60 -7
  8. package/dist/AtlasProvider.d.ts.map +1 -1
  9. package/dist/AtlasProvider.js +204 -38
  10. package/dist/AtlasProvider.js.map +1 -1
  11. package/dist/BaseEntity.d.ts +17 -0
  12. package/dist/BaseEntity.d.ts.map +1 -1
  13. package/dist/BaseEntity.js.map +1 -1
  14. package/dist/BaseModel.d.ts +63 -27
  15. package/dist/BaseModel.d.ts.map +1 -1
  16. package/dist/BaseModel.js +108 -51
  17. package/dist/BaseModel.js.map +1 -1
  18. package/dist/BaseRepository.d.ts +11 -1
  19. package/dist/BaseRepository.d.ts.map +1 -1
  20. package/dist/BaseRepository.js +95 -20
  21. package/dist/BaseRepository.js.map +1 -1
  22. package/dist/ConnectionManager.d.ts +106 -0
  23. package/dist/ConnectionManager.d.ts.map +1 -0
  24. package/dist/ConnectionManager.js +228 -0
  25. package/dist/ConnectionManager.js.map +1 -0
  26. package/dist/ModelQuery.d.ts +256 -43
  27. package/dist/ModelQuery.d.ts.map +1 -1
  28. package/dist/ModelQuery.js +899 -231
  29. package/dist/ModelQuery.js.map +1 -1
  30. package/dist/Transaction.d.ts +54 -1
  31. package/dist/Transaction.d.ts.map +1 -1
  32. package/dist/Transaction.js +121 -59
  33. package/dist/Transaction.js.map +1 -1
  34. package/dist/adapters/NapiDbAdapter.d.ts +11 -0
  35. package/dist/adapters/NapiDbAdapter.d.ts.map +1 -1
  36. package/dist/adapters/NapiDbAdapter.js +35 -7
  37. package/dist/adapters/NapiDbAdapter.js.map +1 -1
  38. package/dist/console/contract.d.ts +62 -0
  39. package/dist/console/contract.d.ts.map +1 -0
  40. package/dist/console/contract.js +38 -0
  41. package/dist/console/contract.js.map +1 -0
  42. package/dist/console/factoryCommands.d.ts +23 -0
  43. package/dist/console/factoryCommands.d.ts.map +1 -0
  44. package/dist/console/factoryCommands.js +62 -0
  45. package/dist/console/factoryCommands.js.map +1 -0
  46. package/dist/console/migrationCommands.d.ts +38 -8
  47. package/dist/console/migrationCommands.d.ts.map +1 -1
  48. package/dist/console/migrationCommands.js +157 -50
  49. package/dist/console/migrationCommands.js.map +1 -1
  50. package/dist/console/schemaCheckCommand.d.ts +11 -17
  51. package/dist/console/schemaCheckCommand.d.ts.map +1 -1
  52. package/dist/console/schemaCheckCommand.js +21 -15
  53. package/dist/console/schemaCheckCommand.js.map +1 -1
  54. package/dist/console/schemaDumpCommand.d.ts +30 -0
  55. package/dist/console/schemaDumpCommand.d.ts.map +1 -0
  56. package/dist/console/schemaDumpCommand.js +69 -0
  57. package/dist/console/schemaDumpCommand.js.map +1 -0
  58. package/dist/console/schemaGenerateCommand.d.ts +100 -0
  59. package/dist/console/schemaGenerateCommand.d.ts.map +1 -0
  60. package/dist/console/schemaGenerateCommand.js +246 -0
  61. package/dist/console/schemaGenerateCommand.js.map +1 -0
  62. package/dist/console/seederCommands.d.ts +46 -0
  63. package/dist/console/seederCommands.d.ts.map +1 -0
  64. package/dist/console/seederCommands.js +136 -0
  65. package/dist/console/seederCommands.js.map +1 -0
  66. package/dist/decorators/entity.d.ts +13 -2
  67. package/dist/decorators/entity.d.ts.map +1 -1
  68. package/dist/decorators/entity.js +10 -0
  69. package/dist/decorators/entity.js.map +1 -1
  70. package/dist/decorators/hooks.d.ts +3 -3
  71. package/dist/decorators/hooks.d.ts.map +1 -1
  72. package/dist/decorators/hooks.js.map +1 -1
  73. package/dist/events.d.ts +5 -0
  74. package/dist/events.d.ts.map +1 -1
  75. package/dist/events.js.map +1 -1
  76. package/dist/factories.d.ts +8 -0
  77. package/dist/factories.d.ts.map +1 -0
  78. package/dist/factories.js +8 -0
  79. package/dist/factories.js.map +1 -0
  80. package/dist/index.d.ts +11 -5
  81. package/dist/index.d.ts.map +1 -1
  82. package/dist/index.js +12 -4
  83. package/dist/index.js.map +1 -1
  84. package/dist/lucid-schema.d.ts +15 -0
  85. package/dist/lucid-schema.d.ts.map +1 -0
  86. package/dist/lucid-schema.js +16 -0
  87. package/dist/lucid-schema.js.map +1 -0
  88. package/dist/orm.d.ts +14 -0
  89. package/dist/orm.d.ts.map +1 -0
  90. package/dist/orm.js +14 -0
  91. package/dist/orm.js.map +1 -0
  92. package/dist/query/DatabaseQueryBuilder.d.ts +557 -0
  93. package/dist/query/DatabaseQueryBuilder.d.ts.map +1 -0
  94. package/dist/query/DatabaseQueryBuilder.js +1798 -0
  95. package/dist/query/DatabaseQueryBuilder.js.map +1 -0
  96. package/dist/query/DmlBuilder.d.ts +62 -0
  97. package/dist/query/DmlBuilder.d.ts.map +1 -0
  98. package/dist/query/DmlBuilder.js +84 -0
  99. package/dist/query/DmlBuilder.js.map +1 -0
  100. package/dist/query/QueryBuilder.d.ts +5 -0
  101. package/dist/query/QueryBuilder.d.ts.map +1 -1
  102. package/dist/query/QueryBuilder.js +7 -0
  103. package/dist/query/QueryBuilder.js.map +1 -1
  104. package/dist/query/RawQueryBuilder.d.ts +47 -0
  105. package/dist/query/RawQueryBuilder.d.ts.map +1 -0
  106. package/dist/query/RawQueryBuilder.js +138 -0
  107. package/dist/query/RawQueryBuilder.js.map +1 -0
  108. package/dist/query/interpolate.d.ts +45 -0
  109. package/dist/query/interpolate.d.ts.map +1 -0
  110. package/dist/query/interpolate.js +51 -0
  111. package/dist/query/interpolate.js.map +1 -0
  112. package/dist/query/native.d.ts +8 -0
  113. package/dist/query/native.d.ts.map +1 -1
  114. package/dist/query/native.js +14 -0
  115. package/dist/query/native.js.map +1 -1
  116. package/dist/query/operators.d.ts +4 -0
  117. package/dist/query/operators.d.ts.map +1 -0
  118. package/dist/query/operators.js +27 -0
  119. package/dist/query/operators.js.map +1 -0
  120. package/dist/schema/Migration.d.ts +31 -7
  121. package/dist/schema/Migration.d.ts.map +1 -1
  122. package/dist/schema/Migration.js +34 -7
  123. package/dist/schema/Migration.js.map +1 -1
  124. package/dist/schema/MigrationRunner.d.ts +56 -6
  125. package/dist/schema/MigrationRunner.d.ts.map +1 -1
  126. package/dist/schema/MigrationRunner.js +382 -112
  127. package/dist/schema/MigrationRunner.js.map +1 -1
  128. package/dist/schema/Schema.d.ts +59 -2
  129. package/dist/schema/Schema.d.ts.map +1 -1
  130. package/dist/schema/Schema.js +143 -9
  131. package/dist/schema/Schema.js.map +1 -1
  132. package/dist/schema/SchemaDumper.d.ts +121 -0
  133. package/dist/schema/SchemaDumper.d.ts.map +1 -0
  134. package/dist/schema/SchemaDumper.js +365 -0
  135. package/dist/schema/SchemaDumper.js.map +1 -0
  136. package/dist/schema/Seeder.d.ts +13 -0
  137. package/dist/schema/Seeder.d.ts.map +1 -1
  138. package/dist/schema/Seeder.js +28 -5
  139. package/dist/schema/Seeder.js.map +1 -1
  140. package/dist/schema/TableBuilder.d.ts +27 -8
  141. package/dist/schema/TableBuilder.d.ts.map +1 -1
  142. package/dist/schema/TableBuilder.js +50 -12
  143. package/dist/schema/TableBuilder.js.map +1 -1
  144. package/dist/schema/catalog.d.ts +25 -1
  145. package/dist/schema/catalog.d.ts.map +1 -1
  146. package/dist/schema/catalog.js +69 -22
  147. package/dist/schema/catalog.js.map +1 -1
  148. package/dist/schema/introspect.d.ts +1 -1
  149. package/dist/schema/introspect.d.ts.map +1 -1
  150. package/dist/schema/introspect.js +26 -11
  151. package/dist/schema/introspect.js.map +1 -1
  152. package/dist/seeders.d.ts +7 -0
  153. package/dist/seeders.d.ts.map +1 -0
  154. package/dist/seeders.js +7 -0
  155. package/dist/seeders.js.map +1 -0
  156. package/dist/services/db.d.ts +120 -9
  157. package/dist/services/db.d.ts.map +1 -1
  158. package/dist/services/db.js +182 -26
  159. package/dist/services/db.js.map +1 -1
  160. package/dist/testing/DatabaseCleanup.d.ts +29 -6
  161. package/dist/testing/DatabaseCleanup.d.ts.map +1 -1
  162. package/dist/testing/DatabaseCleanup.js +44 -17
  163. package/dist/testing/DatabaseCleanup.js.map +1 -1
  164. package/dist/testing/DbAssertions.d.ts +48 -0
  165. package/dist/testing/DbAssertions.d.ts.map +1 -0
  166. package/dist/testing/DbAssertions.js +80 -0
  167. package/dist/testing/DbAssertions.js.map +1 -0
  168. package/dist/testing/Factory.d.ts +111 -25
  169. package/dist/testing/Factory.d.ts.map +1 -1
  170. package/dist/testing/Factory.js +331 -56
  171. package/dist/testing/Factory.js.map +1 -1
  172. package/dist/testing/TestUtils.d.ts +49 -0
  173. package/dist/testing/TestUtils.d.ts.map +1 -0
  174. package/dist/testing/TestUtils.js +79 -0
  175. package/dist/testing/TestUtils.js.map +1 -0
  176. package/dist/testing/index.d.ts +3 -1
  177. package/dist/testing/index.d.ts.map +1 -1
  178. package/dist/testing/index.js +3 -1
  179. package/dist/testing/index.js.map +1 -1
  180. package/dist/types/relations.d.ts +31 -0
  181. package/dist/types/relations.d.ts.map +1 -0
  182. package/dist/types/relations.js +20 -0
  183. package/dist/types/relations.js.map +1 -0
  184. package/index.darwin-arm64.node +0 -0
  185. package/index.darwin-x64.node +0 -0
  186. package/index.linux-arm64-gnu.node +0 -0
  187. package/index.linux-x64-gnu.node +0 -0
  188. package/index.win32-x64-msvc.node +0 -0
  189. package/package.json +30 -2
  190. package/src/AtlasProvider.ts +297 -51
  191. package/src/BaseEntity.ts +29 -0
  192. package/src/BaseModel.ts +174 -37
  193. package/src/BaseRepository.ts +136 -17
  194. package/src/ConnectionManager.ts +298 -0
  195. package/src/ModelQuery.ts +1309 -260
  196. package/src/Transaction.ts +194 -60
  197. package/src/adapters/NapiDbAdapter.ts +72 -14
  198. package/src/console/contract.ts +96 -0
  199. package/src/console/factoryCommands.ts +73 -0
  200. package/src/console/migrationCommands.ts +253 -63
  201. package/src/console/schemaCheckCommand.ts +26 -22
  202. package/src/console/schemaDumpCommand.ts +96 -0
  203. package/src/console/schemaGenerateCommand.ts +380 -0
  204. package/src/console/seederCommands.ts +174 -0
  205. package/src/decorators/entity.ts +18 -2
  206. package/src/decorators/hooks.ts +5 -3
  207. package/src/events.ts +5 -0
  208. package/src/factories.ts +10 -0
  209. package/src/index.ts +50 -3
  210. package/src/lucid-schema.ts +22 -0
  211. package/src/orm.ts +13 -0
  212. package/src/query/DatabaseQueryBuilder.ts +2724 -0
  213. package/src/query/DmlBuilder.ts +131 -0
  214. package/src/query/QueryBuilder.ts +8 -0
  215. package/src/query/RawQueryBuilder.ts +173 -0
  216. package/src/query/interpolate.ts +73 -0
  217. package/src/query/native.ts +29 -0
  218. package/src/query/operators.ts +27 -0
  219. package/src/schema/Migration.ts +36 -7
  220. package/src/schema/MigrationRunner.ts +483 -119
  221. package/src/schema/Schema.ts +168 -19
  222. package/src/schema/SchemaDumper.ts +518 -0
  223. package/src/schema/Seeder.ts +47 -10
  224. package/src/schema/TableBuilder.ts +48 -11
  225. package/src/schema/catalog.ts +94 -24
  226. package/src/schema/introspect.ts +26 -9
  227. package/src/seeders.ts +16 -0
  228. package/src/services/db.ts +343 -31
  229. package/src/testing/DatabaseCleanup.ts +73 -21
  230. package/src/testing/DbAssertions.ts +127 -0
  231. package/src/testing/Factory.ts +559 -79
  232. package/src/testing/TestUtils.ts +123 -0
  233. package/src/testing/index.ts +12 -1
  234. package/src/types/relations.ts +43 -0
@@ -0,0 +1,365 @@
1
+ /**
2
+ * Schema dumps (Adonis Lucid `schema:dump` / `SchemaDumper`). Serialise the live
3
+ * database's structure — every table's DDL plus the migration bookkeeping rows —
4
+ * into a `.sql` file and a `.meta.json` manifest, so a fresh database can be
5
+ * rebuilt from the dump instead of replaying the whole migration history.
6
+ *
7
+ * The migration runner consumes this via `migration:run --schema-path` /
8
+ * `migration:fresh --schema-path`: when a database has no applied migrations and
9
+ * a dump exists, it loads the dump, then runs only the migrations that postdate
10
+ * it (see {@link MigrationRunner.loadDump}).
11
+ *
12
+ * const dumper = new SchemaDumper(db, { migrationsDir: 'database/migrations' })
13
+ * await dumper.run()
14
+ * if (dumper.error) throw dumper.error
15
+ * console.log(dumper.result?.dumpPath, dumper.result?.metaPath)
16
+ */
17
+ import * as fsp from "node:fs/promises";
18
+ import * as path from "node:path";
19
+ import { listUserTables } from "./catalog.js";
20
+ import { introspectTable } from "./introspect.js";
21
+ /** Current time as an ISO string (extracted so tests can stub it). */
22
+ function nowIso() {
23
+ return new Date().toISOString();
24
+ }
25
+ /** The manifest path for a dump `.sql` path (extension swapped for `.meta.json`). */
26
+ export function schemaDumpManifestPath(dumpPath) {
27
+ return `${dumpPath.replace(/\.sql$/, "")}.meta.json`;
28
+ }
29
+ /** Structural guard for a manifest — no cast, `in`-narrowed field checks. */
30
+ function isSchemaDumpManifest(v) {
31
+ return (typeof v === "object" &&
32
+ v !== null &&
33
+ "version" in v &&
34
+ v.version === 1 &&
35
+ "schemaTableName" in v &&
36
+ typeof v.schemaTableName === "string");
37
+ }
38
+ /**
39
+ * Read + validate a dump's manifest, or return `undefined` when it is missing.
40
+ * Throws on a present-but-malformed manifest (wrong `version`, missing fields)
41
+ * so a corrupt dump is caught rather than silently mis-loaded.
42
+ */
43
+ export async function readSchemaDumpManifest(dumpPath) {
44
+ const metaPath = schemaDumpManifestPath(dumpPath);
45
+ let raw;
46
+ try {
47
+ raw = await fsp.readFile(metaPath, "utf8");
48
+ }
49
+ catch {
50
+ return undefined;
51
+ }
52
+ const parsed = JSON.parse(raw);
53
+ if (!isSchemaDumpManifest(parsed)) {
54
+ throw new Error(`Invalid schema-dump manifest at ${metaPath}: expected version 1 with a schemaTableName.`);
55
+ }
56
+ return parsed;
57
+ }
58
+ const pgQuote = (id) => `"${id}"`;
59
+ /** Map a `pg_constraint.confupdtype`/`confdeltype` char to its SQL action. */
60
+ function pgActionCode(code) {
61
+ switch (code) {
62
+ case "c":
63
+ return "CASCADE";
64
+ case "n":
65
+ return "SET NULL";
66
+ case "d":
67
+ return "SET DEFAULT";
68
+ case "r":
69
+ return "RESTRICT";
70
+ default:
71
+ return undefined; // 'a' NO ACTION (default) — omit
72
+ }
73
+ }
74
+ /**
75
+ * Render `CREATE TABLE` from introspected columns + primary key (Postgres dump).
76
+ * Pure — no DB access — so the assembly is unit-testable with fixture columns.
77
+ */
78
+ export function renderPgCreateTable(table, columns) {
79
+ const cols = columns.map((c) => {
80
+ const notNull = c.nullable ? "" : " NOT NULL";
81
+ return ` ${pgQuote(c.name)} ${c.type}${notNull}`;
82
+ });
83
+ const pks = columns.filter((c) => c.primaryKey).map((c) => pgQuote(c.name));
84
+ if (pks.length > 0)
85
+ cols.push(` PRIMARY KEY (${pks.join(", ")})`);
86
+ return `CREATE TABLE ${pgQuote(table)} (\n${cols.join(",\n")}\n);`;
87
+ }
88
+ /**
89
+ * Render an `ALTER TABLE … ADD CONSTRAINT … FOREIGN KEY` from an introspected
90
+ * {@link PgForeignKey} (Postgres dump). Pure — unit-testable. `ON UPDATE` /
91
+ * `ON DELETE` are emitted only when the rule is not the default `NO ACTION`.
92
+ */
93
+ export function renderPgForeignKeyDdl(table, fk) {
94
+ const cols = fk.columns.map(pgQuote).join(", ");
95
+ const fcols = fk.foreignColumns.map(pgQuote).join(", ");
96
+ const nonDefault = (rule) => rule && rule.toUpperCase() !== "NO ACTION" ? rule.toUpperCase() : undefined;
97
+ const onUpdate = nonDefault(fk.onUpdate);
98
+ const onDelete = nonDefault(fk.onDelete);
99
+ return (`ALTER TABLE ${pgQuote(table)} ADD CONSTRAINT ${pgQuote(fk.name)} ` +
100
+ `FOREIGN KEY (${cols}) REFERENCES ${pgQuote(fk.foreignTable)} (${fcols})` +
101
+ (onUpdate ? ` ON UPDATE ${onUpdate}` : "") +
102
+ (onDelete ? ` ON DELETE ${onDelete}` : "") +
103
+ ";");
104
+ }
105
+ /**
106
+ * Dumps a database's schema to `{outputDir}/{connection}-schema.sql` and a
107
+ * `.meta.json` manifest. Errors are captured on `.error` (Lucid parity) rather
108
+ * than thrown, so a CLI can report cleanly; `.result` holds the output paths on
109
+ * success.
110
+ */
111
+ export class SchemaDumper {
112
+ #db;
113
+ #options;
114
+ #result;
115
+ #error;
116
+ constructor(db, options = {}) {
117
+ this.#db = db;
118
+ this.#options = {
119
+ connectionName: options.connectionName ?? "default",
120
+ dumpPath: options.dumpPath,
121
+ outputDir: options.outputDir ?? "database/schema",
122
+ migrationsDir: options.migrationsDir ?? "",
123
+ schemaTableName: options.schemaTableName ?? "ream_migrations",
124
+ prune: options.prune ?? false,
125
+ generatedAt: options.generatedAt,
126
+ };
127
+ }
128
+ get result() {
129
+ return this.#result;
130
+ }
131
+ get error() {
132
+ return this.#error;
133
+ }
134
+ /** Resolved SQL dump file path — the explicit `dumpPath` or the default per-connection name. */
135
+ get dumpPath() {
136
+ return (this.#options.dumpPath ??
137
+ path.join(this.#options.outputDir, `${this.#options.connectionName}-schema.sql`));
138
+ }
139
+ /** Manifest path — the dump path with its extension swapped for `.meta.json`. */
140
+ get metaPath() {
141
+ return schemaDumpManifestPath(this.dumpPath);
142
+ }
143
+ async run() {
144
+ try {
145
+ const sql = await this.#buildDump();
146
+ const dumpPath = this.dumpPath;
147
+ const metaPath = this.metaPath;
148
+ await fsp.mkdir(path.dirname(dumpPath), { recursive: true });
149
+ await fsp.writeFile(dumpPath, sql);
150
+ const squashed = this.#options.prune ? await this.#prune() : [];
151
+ const manifest = {
152
+ version: 1,
153
+ connection: this.#options.connectionName,
154
+ dialect: this.#db.dialect,
155
+ dumpPath,
156
+ generatedAt: this.#options.generatedAt ?? nowIso(),
157
+ schemaTableName: this.#options.schemaTableName,
158
+ schemaVersionsTableName: null,
159
+ squashedMigrationNames: squashed,
160
+ };
161
+ await fsp.writeFile(metaPath, `${JSON.stringify(manifest, null, 2)}\n`);
162
+ this.#result = {
163
+ dumpPath,
164
+ metaPath,
165
+ tableCount: (sql.match(/CREATE TABLE/gi) ?? []).length,
166
+ };
167
+ }
168
+ catch (err) {
169
+ this.#error = err instanceof Error ? err : new Error(String(err));
170
+ }
171
+ }
172
+ /** Serialise DDL for every table (incl. the migrations table) + its bookkeeping rows. */
173
+ async #buildDump() {
174
+ const dialect = this.#db.dialect;
175
+ const header = "-- Generated by @c9up/atlas schema:dump — DO NOT EDIT.\n" +
176
+ `-- connection=${this.#options.connectionName} dialect=${dialect}\n\n`;
177
+ const ddl = await this.#dumpDdl(dialect);
178
+ const data = await this.#dumpMigrationRows();
179
+ return header + ddl + data;
180
+ }
181
+ /** Dialect-specific DDL for all tables (framework tables included, for the dump). */
182
+ async #dumpDdl(dialect) {
183
+ // The migration LOCK table is transient infrastructure, never schema — its
184
+ // presence in the dump would collide with the runner re-creating it.
185
+ const lockTable = `${this.#options.schemaTableName}_lock`;
186
+ if (dialect === "sqlite") {
187
+ // sqlite_master carries the exact CREATE statements (tables + indexes).
188
+ const rows = await this.#db.query("SELECT name, sql FROM sqlite_master " +
189
+ "WHERE sql IS NOT NULL AND name NOT LIKE 'sqlite_%' " +
190
+ "ORDER BY (type = 'table') DESC, name");
191
+ return `${rows
192
+ .filter((r) => r.sql && r.name !== lockTable)
193
+ .map((r) => `${r.sql};`)
194
+ .join("\n\n")}\n\n`;
195
+ }
196
+ const tables = (await listUserTables(this.#db, dialect, {
197
+ includeFrameworkTables: true,
198
+ })).filter((t) => t !== lockTable);
199
+ if (dialect === "mysql") {
200
+ // SHOW CREATE TABLE gives the exact DDL, indexes and constraints included.
201
+ const out = [];
202
+ for (const table of tables.sort()) {
203
+ let rows;
204
+ try {
205
+ rows = await this.#db.query(`SHOW CREATE TABLE \`${table}\``);
206
+ }
207
+ catch {
208
+ // The table vanished between listing and dumping (concurrent DDL) —
209
+ // skip it, mirroring the postgres path (introspectTable → null).
210
+ continue;
211
+ }
212
+ const create = rows[0]?.["Create Table"];
213
+ if (create)
214
+ out.push(`${create};`);
215
+ }
216
+ return `${out.join("\n\n")}\n\n`;
217
+ }
218
+ // postgres: reconstruct from catalog introspection (Adonis Lucid introspects
219
+ // the connection — it does NOT shell out to pg_dump). Per table: CREATE
220
+ // TABLE (columns + PK) + foreign keys + CHECK constraints + indexes; then
221
+ // the schema's views. Proven against real PostgreSQL (podman) in
222
+ // schema-dump-pg.test.ts.
223
+ const out = [];
224
+ for (const table of tables.sort()) {
225
+ const columns = await introspectTable(this.#db, dialect, table);
226
+ if (!columns)
227
+ continue;
228
+ out.push(renderPgCreateTable(table, columns));
229
+ for (const fk of await this.#introspectPgForeignKeys(table)) {
230
+ out.push(renderPgForeignKeyDdl(table, fk));
231
+ }
232
+ // CHECK constraints — pg_get_constraintdef gives the exact `CHECK (...)`.
233
+ for (const chk of await this.#introspectPgChecks(table)) {
234
+ out.push(`ALTER TABLE ${pgQuote(table)} ADD CONSTRAINT ${pgQuote(chk.name)} ${chk.def};`);
235
+ }
236
+ // `indexdef` is the exact CREATE INDEX statement; pass it through.
237
+ for (const indexDef of await this.#introspectPgIndexes(table)) {
238
+ out.push(`${indexDef};`);
239
+ }
240
+ }
241
+ // Views + materialized views (schema-level, not in the base-table list).
242
+ for (const view of await this.#introspectPgViews()) {
243
+ const kind = view.materialized ? "MATERIALIZED VIEW" : "VIEW";
244
+ out.push(`CREATE ${kind} ${pgQuote(view.name)} AS\n${view.definition.replace(/;\s*$/, "")};`);
245
+ }
246
+ return `${out.join("\n\n")}\n\n`;
247
+ }
248
+ /**
249
+ * FK constraints for `table`, grouped per constraint (Postgres). Uses
250
+ * `pg_constraint` with `unnest(conkey, confkey) WITH ORDINALITY` so the local
251
+ * and foreign columns of a COMPOSITE FK are paired by position — the
252
+ * information_schema kcu×ccu join produces a cartesian product and mismaps
253
+ * multi-column keys.
254
+ */
255
+ async #introspectPgForeignKeys(table) {
256
+ const rows = await this.#db.query(
257
+ // ::text on every column — pg_catalog uses the `name` and `"char"` types
258
+ // which atlas's strict sqlx decode rejects as Option<String>.
259
+ `SELECT con.conname::text AS constraint_name,
260
+ att.attname::text AS column_name,
261
+ fatt.attname::text AS foreign_column,
262
+ fcl.relname::text AS foreign_table,
263
+ con.confupdtype::text AS update_type,
264
+ con.confdeltype::text AS delete_type
265
+ FROM pg_constraint con
266
+ JOIN pg_class cl ON cl.oid = con.conrelid
267
+ JOIN pg_class fcl ON fcl.oid = con.confrelid
268
+ JOIN LATERAL unnest(con.conkey, con.confkey) WITH ORDINALITY
269
+ AS keys(conkey, confkey, ord) ON true
270
+ JOIN pg_attribute att
271
+ ON att.attrelid = con.conrelid AND att.attnum = keys.conkey
272
+ JOIN pg_attribute fatt
273
+ ON fatt.attrelid = con.confrelid AND fatt.attnum = keys.confkey
274
+ WHERE con.contype = 'f' AND cl.relname = $1
275
+ AND cl.relnamespace = current_schema()::regnamespace
276
+ ORDER BY con.conname, keys.ord`, [table]);
277
+ const byName = new Map();
278
+ for (const r of rows) {
279
+ const fk = byName.get(r.constraint_name) ?? {
280
+ name: r.constraint_name,
281
+ columns: [],
282
+ foreignTable: r.foreign_table,
283
+ foreignColumns: [],
284
+ onUpdate: pgActionCode(r.update_type),
285
+ onDelete: pgActionCode(r.delete_type),
286
+ };
287
+ fk.columns.push(r.column_name);
288
+ fk.foreignColumns.push(r.foreign_column);
289
+ byName.set(r.constraint_name, fk);
290
+ }
291
+ return [...byName.values()];
292
+ }
293
+ /** Non-primary index definitions for `table` (Postgres `pg_indexes.indexdef`). */
294
+ async #introspectPgIndexes(table) {
295
+ const rows = await this.#db.query(`SELECT i.indexdef FROM pg_indexes i
296
+ WHERE i.schemaname = current_schema() AND i.tablename = $1
297
+ AND NOT EXISTS (
298
+ SELECT 1 FROM pg_constraint c
299
+ WHERE c.conname = i.indexname AND c.contype = 'p'
300
+ )
301
+ ORDER BY i.indexname`, [table]);
302
+ return rows.map((r) => r.indexdef).filter((d) => Boolean(d));
303
+ }
304
+ /** CHECK constraints for `table` (Postgres) — `pg_get_constraintdef` is exact. */
305
+ async #introspectPgChecks(table) {
306
+ const rows = await this.#db.query(`SELECT con.conname::text AS name,
307
+ pg_get_constraintdef(con.oid)::text AS def
308
+ FROM pg_constraint con
309
+ JOIN pg_class cl ON cl.oid = con.conrelid
310
+ WHERE con.contype = 'c' AND cl.relname = $1
311
+ AND cl.relnamespace = current_schema()::regnamespace
312
+ ORDER BY con.conname`, [table]);
313
+ return rows.filter((r) => r.name && r.def);
314
+ }
315
+ /** Views + materialized views in the current schema (Postgres). */
316
+ async #introspectPgViews() {
317
+ const views = await this.#db.query(`SELECT viewname::text AS name, definition::text AS definition
318
+ FROM pg_views WHERE schemaname = current_schema() ORDER BY viewname`);
319
+ const matviews = await this.#db.query(`SELECT matviewname::text AS name, definition::text AS definition
320
+ FROM pg_matviews WHERE schemaname = current_schema() ORDER BY matviewname`);
321
+ return [
322
+ ...views.map((v) => ({ ...v, materialized: false })),
323
+ ...matviews.map((v) => ({ ...v, materialized: true })),
324
+ ].filter((v) => v.name && v.definition);
325
+ }
326
+ /** `INSERT` the applied-migration rows so the runner sees them as applied. */
327
+ async #dumpMigrationRows() {
328
+ const table = this.#options.schemaTableName;
329
+ let rows;
330
+ try {
331
+ rows = await this.#db.query(`SELECT name, batch FROM ${this.#quote(table)} ORDER BY id`);
332
+ }
333
+ catch {
334
+ // No bookkeeping table yet (nothing migrated) — nothing to record.
335
+ return "";
336
+ }
337
+ if (rows.length === 0)
338
+ return "";
339
+ const values = rows
340
+ .map((r) => `(${this.#literal(r.name)}, ${Number(r.batch)})`)
341
+ .join(",\n ");
342
+ return `INSERT INTO ${this.#quote(table)} (name, batch) VALUES\n ${values};\n`;
343
+ }
344
+ /** Delete every migration file and return the pruned names (`--prune`). */
345
+ async #prune() {
346
+ if (!this.#options.migrationsDir) {
347
+ throw new Error("schema:dump --prune requires a migrationsDir");
348
+ }
349
+ const entries = (await fsp.readdir(this.#options.migrationsDir))
350
+ .filter((f) => (f.endsWith(".ts") || f.endsWith(".js")) && !f.endsWith(".d.ts"))
351
+ .sort();
352
+ for (const file of entries) {
353
+ await fsp.rm(path.join(this.#options.migrationsDir, file));
354
+ }
355
+ return entries.map((f) => f.replace(/\.(ts|js)$/, ""));
356
+ }
357
+ #quote(id) {
358
+ return this.#db.dialect === "mysql" ? `\`${id}\`` : `"${id}"`;
359
+ }
360
+ /** Single-quote a string literal for the dump (doubling embedded quotes). */
361
+ #literal(value) {
362
+ return `'${value.replace(/'/g, "''")}'`;
363
+ }
364
+ }
365
+ //# sourceMappingURL=SchemaDumper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaDumper.js","sourceRoot":"","sources":["../../src/schema/SchemaDumper.ts"],"names":[],"mappings":"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"}
@@ -29,7 +29,15 @@ import type { DatabaseConnection } from "../BaseRepository.js";
29
29
  */
30
30
  export declare abstract class BaseSeeder {
31
31
  protected db: DatabaseConnection;
32
+ /**
33
+ * Environments this seeder is allowed to run in (Adonis Lucid
34
+ * `static environment`). When set, `runSeederDirectory({ environment })`
35
+ * skips it unless the current environment is listed. Unset = every env.
36
+ */
37
+ static environment?: string[];
32
38
  constructor(db: DatabaseConnection);
39
+ /** Alias of {@link db} — Adonis Lucid seeders expose the connection as `this.client`. */
40
+ protected get client(): DatabaseConnection;
33
41
  /** The seeder body. Should be idempotent — `repo.upsert(...)` is the recommended pattern. */
34
42
  abstract run(): Promise<void> | void;
35
43
  }
@@ -54,6 +62,11 @@ export declare function runSeeders(seeders: BaseSeeder[]): Promise<void>;
54
62
  * @implements Story 32.12
55
63
  */
56
64
  export declare function runSeederDirectory(dir: string, db: DatabaseConnection, options?: {
65
+ /** Run only these seeders, by base name OR full/relative file path (Lucid `--files`). */
57
66
  files?: readonly string[];
67
+ /** Sort files numerically (`2_x` before `10_x`) instead of lexicographically (Lucid `naturalSort`). */
68
+ naturalSort?: boolean;
69
+ /** The current environment — skips a seeder whose `static environment` excludes it (Lucid). */
70
+ environment?: string;
58
71
  }): Promise<string[]>;
59
72
  //# sourceMappingURL=Seeder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Seeder.d.ts","sourceRoot":"","sources":["../../src/schema/Seeder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAQ/D;;;;;GAKG;AACH,8BAAsB,UAAU;IAC/B,SAAS,CAAC,EAAE,EAAE,kBAAkB,CAAC;gBAErB,EAAE,EAAE,kBAAkB;IAIlC,6FAA6F;IAC7F,QAAQ,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;CACpC;AAED,yDAAyD;AACzD,eAAO,MAAM,MAAM,mBAAa,CAAC;AAEjC;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAIrE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CACvC,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,kBAAkB,EACtB,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GACrC,OAAO,CAAC,MAAM,EAAE,CAAC,CAqDnB"}
1
+ {"version":3,"file":"Seeder.d.ts","sourceRoot":"","sources":["../../src/schema/Seeder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAKH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAQ/D;;;;;GAKG;AACH,8BAAsB,UAAU;IAC/B,SAAS,CAAC,EAAE,EAAE,kBAAkB,CAAC;IAEjC;;;;OAIG;IACH,MAAM,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;gBAElB,EAAE,EAAE,kBAAkB;IAIlC,yFAAyF;IACzF,SAAS,KAAK,MAAM,IAAI,kBAAkB,CAEzC;IAED,6FAA6F;IAC7F,QAAQ,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;CACpC;AAED,yDAAyD;AACzD,eAAO,MAAM,MAAM,mBAAa,CAAC;AAEjC;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAIrE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CACvC,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,kBAAkB,EACtB,OAAO,CAAC,EAAE;IACT,yFAAyF;IACzF,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,uGAAuG;IACvG,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+FAA+F;IAC/F,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB,GACC,OAAO,CAAC,MAAM,EAAE,CAAC,CAsEnB"}
@@ -21,6 +21,7 @@
21
21
  * @implements MISS-4, Story 32.12
22
22
  */
23
23
  import * as fsp from "node:fs/promises";
24
+ import * as path from "node:path";
24
25
  import { pathToFileURL } from "node:url";
25
26
  import { AtlasError } from "../errors.js";
26
27
  import { assertPathInsideBase, assertSafeName, pathExists, } from "../utils/safePath.js";
@@ -32,9 +33,19 @@ import { assertPathInsideBase, assertSafeName, pathExists, } from "../utils/safe
32
33
  */
33
34
  export class BaseSeeder {
34
35
  db;
36
+ /**
37
+ * Environments this seeder is allowed to run in (Adonis Lucid
38
+ * `static environment`). When set, `runSeederDirectory({ environment })`
39
+ * skips it unless the current environment is listed. Unset = every env.
40
+ */
41
+ static environment;
35
42
  constructor(db) {
36
43
  this.db = db;
37
44
  }
45
+ /** Alias of {@link db} — Adonis Lucid seeders expose the connection as `this.client`. */
46
+ get client() {
47
+ return this.db;
48
+ }
38
49
  }
39
50
  /** Legacy alias kept for code using the previous API. */
40
51
  export const Seeder = BaseSeeder;
@@ -66,11 +77,16 @@ export async function runSeederDirectory(dir, db, options) {
66
77
  hint: "Create the directory or adjust the path passed to runSeederDirectory.",
67
78
  });
68
79
  }
69
- const allFiles = (await fsp.readdir(dir))
70
- .filter((f) => (f.endsWith(".ts") || f.endsWith(".js")) && !f.endsWith(".d.ts"))
71
- .sort();
72
- const selected = options?.files
73
- ? allFiles.filter((f) => options.files?.includes(f.replace(/\.(ts|js)$/, "")))
80
+ const files = (await fsp.readdir(dir)).filter((f) => (f.endsWith(".ts") || f.endsWith(".js")) && !f.endsWith(".d.ts"));
81
+ // naturalSort compares embedded numbers by value; the default is lexicographic.
82
+ const allFiles = options?.naturalSort
83
+ ? files.sort((a, b) => a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }))
84
+ : files.sort();
85
+ // `--files` matches a base name (`UserSeeder`) OR a full/relative path
86
+ // (`database/seeders/UserSeeder.ts`) — take each entry's basename sans ext.
87
+ const wanted = options?.files?.map((f) => path.basename(f).replace(/\.(ts|js)$/, ""));
88
+ const selected = wanted
89
+ ? allFiles.filter((f) => wanted.includes(f.replace(/\.(ts|js)$/, "")))
74
90
  : allFiles;
75
91
  const executed = [];
76
92
  for (const file of selected) {
@@ -85,6 +101,13 @@ export async function runSeederDirectory(dir, db, options) {
85
101
  hint: "Example: `export default class UserSeeder extends BaseSeeder { async run() { ... } }`",
86
102
  });
87
103
  }
104
+ // Skip a seeder whose `static environment` excludes the current one (Lucid).
105
+ const allowed = SeederClass.environment;
106
+ if (options?.environment &&
107
+ Array.isArray(allowed) &&
108
+ !allowed.includes(options.environment)) {
109
+ continue;
110
+ }
88
111
  const instance = new SeederClass(db);
89
112
  await instance.run();
90
113
  executed.push(file.replace(/\.(ts|js)$/, ""));
@@ -1 +1 @@
1
- {"version":3,"file":"Seeder.js","sourceRoot":"","sources":["../../src/schema/Seeder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EACN,oBAAoB,EACpB,cAAc,EACd,UAAU,GACV,MAAM,sBAAsB,CAAC;AAE9B;;;;;GAKG;AACH,MAAM,OAAgB,UAAU;IACrB,EAAE,CAAqB;IAEjC,YAAY,EAAsB;QACjC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACd,CAAC;CAID;AAED,yDAAyD;AACzD,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAC;AAEjC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAqB;IACrD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;IACpB,CAAC;AACF,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACvC,GAAW,EACX,EAAsB,EACtB,OAAuC;IAEvC,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,UAAU,CACnB,wBAAwB,EACxB,+BAA+B,GAAG,EAAE,EACpC;YACC,IAAI,EAAE,uEAAuE;SAC7E,CACD,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;SACvC,MAAM,CACN,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CACvE;SACA,IAAI,EAAE,CAAC;IAET,MAAM,QAAQ,GAAG,OAAO,EAAE,KAAK;QAC9B,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACtB,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CACpD;QACF,CAAC,CAAC,QAAQ,CAAC;IAEZ,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC7B,cAAc,CAAC,IAAI,EAAE,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAC1C,GAAG,EACH,IAAI,EACJ,uBAAuB,EACvB,QAAQ,CACR,CAAC;QAEF,iEAAiE;QACjE,+DAA+D;QAC/D,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC;QAChC,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,UAAU,EAAE,CAAC;YACvD,MAAM,IAAI,UAAU,CACnB,kBAAkB,EAClB,UAAU,IAAI,mDAAmD,EACjE;gBACC,IAAI,EAAE,uFAAuF;aAC7F,CACD,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAe,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;QACjD,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,QAAQ,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"Seeder.js","sourceRoot":"","sources":["../../src/schema/Seeder.ts"],"names":[],"mappings":"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"}
@@ -161,9 +161,8 @@ export declare class TableBuilder {
161
161
  * t.uuid('id').primary() // no DEFAULT
162
162
  * // and at insert: db.insert({ id: crypto.randomUUID(), ... })
163
163
  *
164
- * See `AUDIT-migration-templates.md` (shipped at the package root) for
165
- * the full audit and the escape-hatch procedure if a future story makes
166
- * the helper dialect-aware.
164
+ * (A dialect-aware escape hatch can be added later if a future story needs
165
+ * per-dialect PK defaults.)
167
166
  */
168
167
  id(): this;
169
168
  /**
@@ -185,11 +184,22 @@ export declare class TableBuilder {
185
184
  * t.timestamp('updated_at').notNullable()
186
185
  * // and at insert: db.insert({ created_at: new Date().toISOString(), ... })
187
186
  *
188
- * See `AUDIT-migration-templates.md` (shipped at the package root) for
189
- * the full audit and the escape-hatch procedure if a future story makes
190
- * the helper dialect-aware.
187
+ * (A dialect-aware escape hatch can be added later if a future story needs
188
+ * per-dialect PK defaults.)
191
189
  */
192
- timestamps(): this;
190
+ /**
191
+ * Add `created_at` / `updated_at` columns (Adonis Lucid / Knex
192
+ * `timestamps(useTimestamps, defaultToNow)`).
193
+ *
194
+ * - `useTimestamps` (default `true`): `timestamp` type; `false` → `dateTime`.
195
+ * - `defaultToNow` (default `true`): `NOT NULL DEFAULT CURRENT_TIMESTAMP`;
196
+ * `false` → nullable, no default.
197
+ *
198
+ * The default uses `CURRENT_TIMESTAMP`, which every dialect understands —
199
+ * unlike `NOW()`, which SQLite rejects. So `timestamps()` and the Lucid
200
+ * `timestamps(true, true)` form both port to SQLite/Postgres/MySQL unchanged.
201
+ */
202
+ timestamps(useTimestamps?: boolean, defaultToNow?: boolean): this;
193
203
  notNullable(): this;
194
204
  nullable(): this;
195
205
  /**
@@ -200,7 +210,16 @@ export declare class TableBuilder {
200
210
  defaultTo(value: DefaultValue): this;
201
211
  /** MySQL `UNSIGNED` numeric modifier (Lucid `unsigned()`). No-op on pg/sqlite. */
202
212
  unsigned(): this;
203
- references(table: string, column?: string): this;
213
+ /**
214
+ * Declare the current column a foreign key.
215
+ *
216
+ * - `references('users', 'id')` — atlas form `(table, column='id')`.
217
+ * - `references('users.id')` — Lucid/Knex dotted `'table.column'` shorthand, so
218
+ * a migration copied from Lucid resolves the target the same way. A single
219
+ * argument without a dot is treated as the table name (column defaults to
220
+ * `id`), preserving the atlas one-arg behaviour.
221
+ */
222
+ references(tableOrPath: string, column?: string): this;
204
223
  /**
205
224
  * Referential action for the current column's foreign key `ON DELETE`
206
225
  * (Lucid parity). Must follow {@link references}.
@@ -1 +1 @@
1
- {"version":3,"file":"TableBuilder.d.ts","sourceRoot":"","sources":["../../src/schema/TableBuilder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TableBuilder.d.ts","sourceRoot":"","sources":["../../src/schema/TableBuilder.ts"],"names":[],"mappings":"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"}