@c9up/atlas 0.1.3 → 0.1.5

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 (150) hide show
  1. package/db.darwin-arm64.node +0 -0
  2. package/db.darwin-x64.node +0 -0
  3. package/db.linux-arm64-gnu.node +0 -0
  4. package/db.linux-x64-gnu.node +0 -0
  5. package/db.win32-x64-msvc.node +0 -0
  6. package/dist/AtlasProvider.d.ts +106 -0
  7. package/dist/AtlasProvider.d.ts.map +1 -0
  8. package/dist/AtlasProvider.js +190 -0
  9. package/dist/AtlasProvider.js.map +1 -0
  10. package/dist/BaseEntity.d.ts +255 -0
  11. package/dist/BaseEntity.d.ts.map +1 -0
  12. package/dist/BaseEntity.js +420 -0
  13. package/dist/BaseEntity.js.map +1 -0
  14. package/dist/BaseRepository.d.ts +175 -0
  15. package/dist/BaseRepository.d.ts.map +1 -0
  16. package/dist/BaseRepository.js +1451 -0
  17. package/dist/BaseRepository.js.map +1 -0
  18. package/dist/ModelQuery.d.ts +338 -0
  19. package/dist/ModelQuery.d.ts.map +1 -0
  20. package/dist/ModelQuery.js +1598 -0
  21. package/dist/ModelQuery.js.map +1 -0
  22. package/dist/Transaction.d.ts +15 -0
  23. package/dist/Transaction.d.ts.map +1 -0
  24. package/dist/Transaction.js +67 -0
  25. package/dist/Transaction.js.map +1 -0
  26. package/dist/adapters/NapiDbAdapter.d.ts +34 -0
  27. package/dist/adapters/NapiDbAdapter.d.ts.map +1 -0
  28. package/dist/adapters/NapiDbAdapter.js +96 -0
  29. package/dist/adapters/NapiDbAdapter.js.map +1 -0
  30. package/dist/config.d.ts +4 -0
  31. package/dist/config.d.ts.map +1 -0
  32. package/dist/config.js +4 -0
  33. package/dist/config.js.map +1 -0
  34. package/dist/configure.d.ts +10 -0
  35. package/dist/configure.d.ts.map +1 -0
  36. package/dist/configure.js +25 -0
  37. package/dist/configure.js.map +1 -0
  38. package/dist/decorators/entity.d.ts +235 -0
  39. package/dist/decorators/entity.d.ts.map +1 -0
  40. package/dist/decorators/entity.js +264 -0
  41. package/dist/decorators/entity.js.map +1 -0
  42. package/dist/decorators/hooks.d.ts +70 -0
  43. package/dist/decorators/hooks.d.ts.map +1 -0
  44. package/dist/decorators/hooks.js +107 -0
  45. package/dist/decorators/hooks.js.map +1 -0
  46. package/dist/decorators/scope.d.ts +35 -0
  47. package/dist/decorators/scope.d.ts.map +1 -0
  48. package/dist/decorators/scope.js +29 -0
  49. package/dist/decorators/scope.js.map +1 -0
  50. package/dist/errors.d.ts +54 -0
  51. package/dist/errors.d.ts.map +1 -0
  52. package/dist/errors.js +82 -0
  53. package/dist/errors.js.map +1 -0
  54. package/dist/index.d.ts +39 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +28 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/naming/NamingStrategy.d.ts +52 -0
  59. package/dist/naming/NamingStrategy.d.ts.map +1 -0
  60. package/dist/naming/NamingStrategy.js +65 -0
  61. package/dist/naming/NamingStrategy.js.map +1 -0
  62. package/dist/query/QueryBuilder.d.ts +95 -0
  63. package/dist/query/QueryBuilder.d.ts.map +1 -0
  64. package/dist/query/QueryBuilder.js +310 -0
  65. package/dist/query/QueryBuilder.js.map +1 -0
  66. package/dist/query/native.d.ts +18 -0
  67. package/dist/query/native.d.ts.map +1 -0
  68. package/dist/query/native.js +49 -0
  69. package/dist/query/native.js.map +1 -0
  70. package/dist/schema/Migration.d.ts +55 -0
  71. package/dist/schema/Migration.d.ts.map +1 -0
  72. package/dist/schema/Migration.js +68 -0
  73. package/dist/schema/Migration.js.map +1 -0
  74. package/dist/schema/MigrationRunner.d.ts +115 -0
  75. package/dist/schema/MigrationRunner.d.ts.map +1 -0
  76. package/dist/schema/MigrationRunner.js +406 -0
  77. package/dist/schema/MigrationRunner.js.map +1 -0
  78. package/dist/schema/Schema.d.ts +22 -0
  79. package/dist/schema/Schema.d.ts.map +1 -0
  80. package/dist/schema/Schema.js +51 -0
  81. package/dist/schema/Schema.js.map +1 -0
  82. package/dist/schema/SchemaBuilder.d.ts +14 -0
  83. package/dist/schema/SchemaBuilder.d.ts.map +1 -0
  84. package/dist/schema/SchemaBuilder.js +13 -0
  85. package/dist/schema/SchemaBuilder.js.map +1 -0
  86. package/dist/schema/Seeder.d.ts +54 -0
  87. package/dist/schema/Seeder.d.ts.map +1 -0
  88. package/dist/schema/Seeder.js +89 -0
  89. package/dist/schema/Seeder.js.map +1 -0
  90. package/dist/schema/TableBuilder.d.ts +95 -0
  91. package/dist/schema/TableBuilder.d.ts.map +1 -0
  92. package/dist/schema/TableBuilder.js +234 -0
  93. package/dist/schema/TableBuilder.js.map +1 -0
  94. package/dist/schema/types.d.ts +30 -0
  95. package/dist/schema/types.d.ts.map +1 -0
  96. package/dist/schema/types.js +19 -0
  97. package/dist/schema/types.js.map +1 -0
  98. package/dist/services/db.d.ts +22 -0
  99. package/dist/services/db.d.ts.map +1 -0
  100. package/dist/services/db.js +37 -0
  101. package/dist/services/db.js.map +1 -0
  102. package/dist/testing/DatabaseCleanup.d.ts +19 -0
  103. package/dist/testing/DatabaseCleanup.d.ts.map +1 -0
  104. package/dist/testing/DatabaseCleanup.js +39 -0
  105. package/dist/testing/DatabaseCleanup.js.map +1 -0
  106. package/dist/testing/Factory.d.ts +59 -0
  107. package/dist/testing/Factory.d.ts.map +1 -0
  108. package/dist/testing/Factory.js +105 -0
  109. package/dist/testing/Factory.js.map +1 -0
  110. package/dist/testing/TestDatabase.d.ts +25 -0
  111. package/dist/testing/TestDatabase.d.ts.map +1 -0
  112. package/dist/testing/TestDatabase.js +52 -0
  113. package/dist/testing/TestDatabase.js.map +1 -0
  114. package/dist/testing/index.d.ts +4 -0
  115. package/dist/testing/index.d.ts.map +1 -0
  116. package/dist/testing/index.js +4 -0
  117. package/dist/testing/index.js.map +1 -0
  118. package/dist/utils/casing.d.ts +5 -0
  119. package/dist/utils/casing.d.ts.map +1 -0
  120. package/dist/utils/casing.js +9 -0
  121. package/dist/utils/casing.js.map +1 -0
  122. package/dist/utils/dialectFromUrl.d.ts +10 -0
  123. package/dist/utils/dialectFromUrl.d.ts.map +1 -0
  124. package/dist/utils/dialectFromUrl.js +8 -0
  125. package/dist/utils/dialectFromUrl.js.map +1 -0
  126. package/dist/utils/identifier.d.ts +19 -0
  127. package/dist/utils/identifier.d.ts.map +1 -0
  128. package/dist/utils/identifier.js +27 -0
  129. package/dist/utils/identifier.js.map +1 -0
  130. package/dist/utils/safePath.d.ts +22 -0
  131. package/dist/utils/safePath.d.ts.map +1 -0
  132. package/dist/utils/safePath.js +46 -0
  133. package/dist/utils/safePath.js.map +1 -0
  134. package/dist/utils/transactionBrand.d.ts +5 -0
  135. package/dist/utils/transactionBrand.d.ts.map +1 -0
  136. package/dist/utils/transactionBrand.js +5 -0
  137. package/dist/utils/transactionBrand.js.map +1 -0
  138. package/index.darwin-arm64.node +0 -0
  139. package/index.darwin-x64.node +0 -0
  140. package/index.linux-arm64-gnu.node +0 -0
  141. package/index.linux-x64-gnu.node +0 -0
  142. package/index.win32-x64-msvc.node +0 -0
  143. package/package.json +1 -1
  144. package/src/AtlasProvider.ts +2 -2
  145. package/src/BaseRepository.ts +73 -11
  146. package/src/adapters/NapiDbAdapter.ts +1 -1
  147. package/src/schema/MigrationRunner.ts +16 -12
  148. package/src/schema/TableBuilder.ts +26 -0
  149. package/src/schema/types.ts +2 -0
  150. package/src/testing/DatabaseCleanup.ts +6 -7
@@ -0,0 +1,406 @@
1
+ /**
2
+ * Migration Runner — discovers, executes, and tracks database migrations.
3
+ *
4
+ * @implements FR34
5
+ */
6
+ import * as fsp from "node:fs/promises";
7
+ import * as path from "node:path";
8
+ import { pathToFileURL } from "node:url";
9
+ import { AtlasError } from "../errors.js";
10
+ import { compileStatementNative } from "../query/native.js";
11
+ import { assertPathInsideBase, assertSafeName, pathExists, } from "../utils/safePath.js";
12
+ const DEFAULT_TABLE = "ream_migrations";
13
+ const TABLE_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
14
+ function validateTrackingTableName(name) {
15
+ if (!TABLE_NAME_PATTERN.test(name)) {
16
+ throw new AtlasError("MIGRATION_INVALID_TABLE_NAME", `Invalid tracking-table name: ${JSON.stringify(name)}. ` +
17
+ "Must match /^[A-Za-z_][A-Za-z0-9_]*$/ (letters, digits, underscores; not starting with a digit).");
18
+ }
19
+ return name;
20
+ }
21
+ /** Compile a statement + run it via the adapter. */
22
+ async function runStmt(db, dialect, spec) {
23
+ const compiled = compileStatementNative(spec, dialect);
24
+ for (const sql of compiled.statements) {
25
+ await db.execute(sql, compiled.params);
26
+ }
27
+ }
28
+ async function queryStmt(db, dialect, spec) {
29
+ const compiled = compileStatementNative(spec, dialect);
30
+ return db.query(compiled.statements[0], compiled.params);
31
+ }
32
+ /**
33
+ * Runs migrations against a database.
34
+ */
35
+ export class MigrationRunner {
36
+ #db;
37
+ #migrationsDir;
38
+ #dialect;
39
+ #tableName;
40
+ /**
41
+ * @param db Underlying database adapter.
42
+ * @param options.migrationsDir Directory containing migration files. Defaults to `database/migrations`.
43
+ * @param options.dialect SQL dialect of the adapter. Defaults to `sqlite`.
44
+ * @param options.tableName Custom name for the migrations tracking table.
45
+ * Defaults to `"ream_migrations"`. Must match `/^[A-Za-z_][A-Za-z0-9_]*$/` —
46
+ * throws `AtlasError("MIGRATION_INVALID_TABLE_NAME")` synchronously otherwise.
47
+ *
48
+ * Cleanup coupling: `DatabaseCleanup.truncateAll` (`src/testing/DatabaseCleanup.ts`)
49
+ * skips tables whose name starts with `ream_` (via `LIKE 'ream\_%' ESCAPE '\'`).
50
+ * The default `"ream_migrations"` is therefore auto-protected. Choosing a name
51
+ * without the `ream_` prefix (e.g. `"schema_versions"`) opts the tracking table
52
+ * out of that protection — `truncateAll` will wipe it alongside user tables,
53
+ * forcing a re-`init()` and replay of every migration on next test run.
54
+ *
55
+ * Rename caveat: `init()` emits `CREATE TABLE IF NOT EXISTS <tableName>` —
56
+ * it does NOT auto-migrate from a previous tracking table. A project that
57
+ * has been running with `ream_migrations` and then changes `tableName` to
58
+ * `schema_versions` will get a fresh empty `schema_versions` on next boot,
59
+ * read zero applied migrations, and re-run every past migration (likely
60
+ * crashing on `CREATE TABLE <user-table>` already-exists). To rename
61
+ * safely, copy the history manually before switching:
62
+ *
63
+ * INSERT INTO schema_versions SELECT * FROM ream_migrations;
64
+ * -- (then DROP TABLE ream_migrations once verified)
65
+ */
66
+ constructor(db, options) {
67
+ this.#db = db;
68
+ this.#migrationsDir = options?.migrationsDir ?? "database/migrations";
69
+ this.#dialect = options?.dialect ?? "sqlite";
70
+ this.#tableName =
71
+ options?.tableName === undefined
72
+ ? DEFAULT_TABLE
73
+ : validateTrackingTableName(options.tableName);
74
+ }
75
+ /** Ensure the ream_migrations tracking table exists. */
76
+ async init() {
77
+ await runStmt(this.#db, this.#dialect, {
78
+ kind: "createTable",
79
+ table: this.#tableName,
80
+ ifNotExists: true,
81
+ columns: [
82
+ // Auto-increment PK (Lucid's adonis_schema uses `increments`). The
83
+ // Rust compiler emits the dialect-appropriate identity clause, so
84
+ // the INSERT below omits `id` on every dialect.
85
+ {
86
+ name: "id",
87
+ kind: "integer",
88
+ autoIncrement: true,
89
+ nullable: false,
90
+ primary: true,
91
+ unique: false,
92
+ default: null,
93
+ references: null,
94
+ length: null,
95
+ precision: null,
96
+ scale: null,
97
+ },
98
+ {
99
+ name: "name",
100
+ kind: "string",
101
+ length: 255,
102
+ nullable: false,
103
+ primary: false,
104
+ unique: true,
105
+ default: null,
106
+ references: null,
107
+ precision: null,
108
+ scale: null,
109
+ },
110
+ {
111
+ name: "batch",
112
+ kind: "integer",
113
+ nullable: false,
114
+ primary: false,
115
+ unique: false,
116
+ default: null,
117
+ references: null,
118
+ length: null,
119
+ precision: null,
120
+ scale: null,
121
+ },
122
+ {
123
+ name: "executed_at",
124
+ kind: "timestamp",
125
+ nullable: false,
126
+ primary: false,
127
+ unique: false,
128
+ default: "CURRENT_TIMESTAMP",
129
+ references: null,
130
+ length: null,
131
+ precision: null,
132
+ scale: null,
133
+ },
134
+ ],
135
+ indexes: [],
136
+ });
137
+ }
138
+ /** Get the status of all migrations. */
139
+ async status() {
140
+ const applied = await queryStmt(this.#db, this.#dialect, {
141
+ kind: "select",
142
+ table: this.#tableName,
143
+ select: ["name", "batch"],
144
+ wheres: [],
145
+ orderBy: [{ column: "name", direction: "asc" }],
146
+ groupBy: [],
147
+ having: [],
148
+ limit: null,
149
+ offset: null,
150
+ distinct: false,
151
+ ctes: [],
152
+ unions: [],
153
+ });
154
+ const appliedMap = new Map(applied.map((r) => [r.name, r.batch]));
155
+ const files = await this.#discoverFiles();
156
+ return files.map((f) => ({
157
+ name: f,
158
+ status: appliedMap.has(f) ? "applied" : "pending",
159
+ batch: appliedMap.get(f),
160
+ }));
161
+ }
162
+ /** Run all pending migrations. */
163
+ async migrate() {
164
+ await this.init();
165
+ const applied = await queryStmt(this.#db, this.#dialect, {
166
+ kind: "select",
167
+ table: this.#tableName,
168
+ select: ["name"],
169
+ wheres: [],
170
+ orderBy: [],
171
+ groupBy: [],
172
+ having: [],
173
+ limit: null,
174
+ offset: null,
175
+ distinct: false,
176
+ ctes: [],
177
+ unions: [],
178
+ });
179
+ const appliedNames = new Set(applied.map((r) => r.name));
180
+ const files = await this.#discoverFiles();
181
+ const pending = files.filter((f) => !appliedNames.has(f));
182
+ if (pending.length === 0) {
183
+ return [];
184
+ }
185
+ const batch = (await this.#currentBatch()) + 1;
186
+ const executed = [];
187
+ for (const name of pending) {
188
+ this.#assertSafeName(name);
189
+ const migration = await this.#loadMigration(name);
190
+ const statements = await migration.getUpSQL();
191
+ // Compile the ream_migrations INSERT so we can include it in the same
192
+ // transaction as the migration's own DDL/DML — either everything
193
+ // commits or nothing does.
194
+ const insertCompiled = compileStatementNative({
195
+ kind: "insert",
196
+ table: this.#tableName,
197
+ values: [
198
+ ["name", name],
199
+ ["batch", batch],
200
+ ],
201
+ }, this.#dialect);
202
+ const [insertSql] = insertCompiled.statements;
203
+ if (insertSql === undefined) {
204
+ throw new AtlasError("MIGRATION_COMPILE_EMPTY", `compileStatementNative returned no statements for migration insert of '${name}'`);
205
+ }
206
+ const batchStatements = [
207
+ ...statements.map((sql) => ({ sql, params: [] })),
208
+ { sql: insertSql, params: insertCompiled.params },
209
+ ];
210
+ await this.#runAtomic(batchStatements, name);
211
+ executed.push(name);
212
+ }
213
+ return executed;
214
+ }
215
+ /** Rollback the last batch of migrations. */
216
+ async rollback() {
217
+ await this.init();
218
+ const batch = await this.#currentBatch();
219
+ if (batch === 0) {
220
+ return [];
221
+ }
222
+ const toRollback = await queryStmt(this.#db, this.#dialect, {
223
+ kind: "select",
224
+ table: this.#tableName,
225
+ select: ["name"],
226
+ wheres: [{ column: "batch", operator: "=", value: batch, type: "and" }],
227
+ orderBy: [{ column: "name", direction: "desc" }],
228
+ groupBy: [],
229
+ having: [],
230
+ limit: null,
231
+ offset: null,
232
+ distinct: false,
233
+ ctes: [],
234
+ unions: [],
235
+ });
236
+ const rolled = [];
237
+ for (const record of toRollback) {
238
+ this.#assertSafeName(record.name);
239
+ const migration = await this.#loadMigration(record.name);
240
+ const statements = await migration.getDownSQL();
241
+ const deleteCompiled = compileStatementNative({
242
+ kind: "delete",
243
+ table: this.#tableName,
244
+ wheres: [
245
+ { column: "name", operator: "=", value: record.name, type: "and" },
246
+ ],
247
+ }, this.#dialect);
248
+ const [deleteSql] = deleteCompiled.statements;
249
+ if (deleteSql === undefined) {
250
+ throw new AtlasError("MIGRATION_COMPILE_EMPTY", `compileStatementNative returned no statements for migration delete of '${record.name}'`);
251
+ }
252
+ const batchStatements = [
253
+ ...statements.map((sql) => ({ sql, params: [] })),
254
+ { sql: deleteSql, params: deleteCompiled.params },
255
+ ];
256
+ await this.#runAtomic(batchStatements, record.name);
257
+ rolled.push(record.name);
258
+ }
259
+ return rolled;
260
+ }
261
+ /**
262
+ * Run a batch of statements in a single transaction if the adapter supports
263
+ * it; otherwise fall back to sequential execute (best-effort). Adapters that
264
+ * lack transaction support get a warning so integrators notice the risk.
265
+ */
266
+ async #runAtomic(batch, migrationName) {
267
+ if (this.#db.runInTransaction) {
268
+ await this.#db.runInTransaction(batch);
269
+ return;
270
+ }
271
+ // Fallback — log once and run sequentially. Not ideal; adapters should
272
+ // implement `runInTransaction` for production use.
273
+ console.warn(`[atlas] DatabaseAdapter does not support runInTransaction — running '${migrationName}' without atomicity.`);
274
+ for (const { sql, params } of batch) {
275
+ await this.#db.execute(sql, params);
276
+ }
277
+ }
278
+ /**
279
+ * Rollback + re-run a specific number of batches (or all if `steps` omitted).
280
+ * `migrate:refresh` in Lucid parlance.
281
+ *
282
+ * @implements Story 32.11
283
+ */
284
+ async refresh() {
285
+ const rolled = await this.reset();
286
+ const executed = await this.migrate();
287
+ return { rolled, executed };
288
+ }
289
+ /**
290
+ * Drop EVERY table the migrations created (via successive rollbacks) then
291
+ * run every migration from scratch. `migrate:fresh` in Lucid parlance.
292
+ *
293
+ * Distinct from `refresh()` only in intent — both end up with a fresh DB.
294
+ */
295
+ async fresh() {
296
+ return this.refresh();
297
+ }
298
+ /**
299
+ * Rollback every applied batch (alias for `migrate:reset`).
300
+ * Returns the list of rolled-back migration names (in rollback order).
301
+ */
302
+ async reset() {
303
+ await this.init();
304
+ const all = [];
305
+ // Roll back batches one by one until nothing remains.
306
+ while ((await this.#currentBatch()) > 0) {
307
+ const rolled = await this.rollback();
308
+ if (rolled.length === 0)
309
+ break;
310
+ all.push(...rolled);
311
+ }
312
+ return all;
313
+ }
314
+ /**
315
+ * Dry-run: compute the SQL statements that would be emitted by a migrate
316
+ * without executing them. Returns the full list of statements per pending
317
+ * migration file. Useful for CI pre-flight checks.
318
+ */
319
+ async dryRun() {
320
+ await this.init();
321
+ const applied = await queryStmt(this.#db, this.#dialect, {
322
+ kind: "select",
323
+ table: this.#tableName,
324
+ select: ["name"],
325
+ wheres: [],
326
+ orderBy: [],
327
+ groupBy: [],
328
+ having: [],
329
+ limit: null,
330
+ offset: null,
331
+ distinct: false,
332
+ ctes: [],
333
+ unions: [],
334
+ });
335
+ const appliedNames = new Set(applied.map((r) => r.name));
336
+ const files = (await this.#discoverFiles()).filter((f) => !appliedNames.has(f));
337
+ const result = [];
338
+ for (const name of files) {
339
+ this.#assertSafeName(name);
340
+ const migration = await this.#loadMigration(name);
341
+ const statements = await migration.getUpSQL();
342
+ result.push({ name, sql: statements });
343
+ }
344
+ return result;
345
+ }
346
+ async #currentBatch() {
347
+ // MAX(batch) — select expression uses quote_select_expr allowlist which permits MAX.
348
+ const rows = await queryStmt(this.#db, this.#dialect, {
349
+ kind: "select",
350
+ table: this.#tableName,
351
+ select: ["MAX(batch) AS max"],
352
+ wheres: [],
353
+ orderBy: [],
354
+ groupBy: [],
355
+ having: [],
356
+ limit: null,
357
+ offset: null,
358
+ distinct: false,
359
+ ctes: [],
360
+ unions: [],
361
+ });
362
+ return rows[0]?.max ?? 0;
363
+ }
364
+ /** Discover migration files sorted by name. Async — never blocks the event loop. */
365
+ async #discoverFiles() {
366
+ try {
367
+ const entries = await fsp.readdir(this.#migrationsDir);
368
+ return entries
369
+ .filter((f) => f.endsWith(".ts") || f.endsWith(".js"))
370
+ .sort()
371
+ .map((f) => f.replace(/\.(ts|js)$/, ""));
372
+ }
373
+ catch (err) {
374
+ // Missing directory → no migrations. Any other error propagates.
375
+ if (err.code === "ENOENT")
376
+ return [];
377
+ throw err;
378
+ }
379
+ }
380
+ /** Validate migration name — delegates to the shared safe-path helpers. */
381
+ #assertSafeName(name) {
382
+ assertSafeName(name, "MIGRATION_INVALID", "migration");
383
+ }
384
+ /** Load and instantiate a migration class. */
385
+ async #loadMigration(name) {
386
+ this.#assertSafeName(name);
387
+ assertPathInsideBase(this.#migrationsDir, `${name}.ts`, "MIGRATION_INVALID", "Migration");
388
+ const tsPath = path.join(this.#migrationsDir, `${name}.ts`);
389
+ const jsPath = path.join(this.#migrationsDir, `${name}.js`);
390
+ const tsExists = await pathExists(tsPath);
391
+ const filePath = tsExists ? tsPath : jsPath;
392
+ if (!tsExists && !(await pathExists(jsPath))) {
393
+ throw new AtlasError("MIGRATION_NOT_FOUND", `Migration file not found: ${name}`);
394
+ }
395
+ // ESM dynamic import on Windows REQUIRES a file:// URL — a bare
396
+ // `C:\…` path triggers ERR_UNSUPPORTED_ESM_URL_SCHEME. `pathToFileURL`
397
+ // normalizes both Windows and POSIX paths to a valid URL.
398
+ const mod = await import(pathToFileURL(path.resolve(filePath)).href);
399
+ const MigrationClass = mod.default;
400
+ if (!MigrationClass || typeof MigrationClass !== "function") {
401
+ throw new AtlasError("MIGRATION_INVALID", `Migration ${name} must export a default class`);
402
+ }
403
+ return new MigrationClass(this.#dialect);
404
+ }
405
+ }
406
+ //# sourceMappingURL=MigrationRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MigrationRunner.js","sourceRoot":"","sources":["../../src/schema/MigrationRunner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Schema — top-level fluent API for DDL operations.
3
+ *
4
+ * Each method appends compiled SQL statements (via the Rust compiler) to an
5
+ * internal buffer that the migration runner can flush to the database.
6
+ *
7
+ * @implements FR34
8
+ */
9
+ import { type AtlasDialect } from "../query/native.js";
10
+ import { TableBuilder } from "./TableBuilder.js";
11
+ export declare class Schema {
12
+ #private;
13
+ constructor(dialect?: AtlasDialect);
14
+ createTable(name: string, callback: (table: TableBuilder) => void): this;
15
+ dropTable(name: string): this;
16
+ createIndex(table: string, columns: string | string[], name?: string, unique?: boolean): this;
17
+ dropIndex(name: string): this;
18
+ raw(sql: string): this;
19
+ reset(): void;
20
+ toSQL(): string[];
21
+ }
22
+ //# sourceMappingURL=Schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Schema.d.ts","sourceRoot":"","sources":["../../src/schema/Schema.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACN,KAAK,YAAY,EAGjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,qBAAa,MAAM;;gBAIN,OAAO,GAAE,YAAgC;IAIrD,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI;IAOxE,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAS7B,WAAW,CACV,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,IAAI,CAAC,EAAE,MAAM,EACb,MAAM,UAAQ,GACZ,IAAI;IAWP,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAS7B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKtB,KAAK,IAAI,IAAI;IAIb,KAAK,IAAI,MAAM,EAAE;CAGjB"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Schema — top-level fluent API for DDL operations.
3
+ *
4
+ * Each method appends compiled SQL statements (via the Rust compiler) to an
5
+ * internal buffer that the migration runner can flush to the database.
6
+ *
7
+ * @implements FR34
8
+ */
9
+ import { compileStatementNative, getAtlasDialect, } from "../query/native.js";
10
+ import { TableBuilder } from "./TableBuilder.js";
11
+ export class Schema {
12
+ #dialect;
13
+ #statements = [];
14
+ constructor(dialect = getAtlasDialect()) {
15
+ this.#dialect = dialect;
16
+ }
17
+ createTable(name, callback) {
18
+ const builder = new TableBuilder(name);
19
+ callback(builder);
20
+ this.#statements.push(...builder.toStatements(this.#dialect));
21
+ return this;
22
+ }
23
+ dropTable(name) {
24
+ const { statements } = compileStatementNative({ kind: "dropTable", table: name, ifExists: true }, this.#dialect);
25
+ this.#statements.push(...statements);
26
+ return this;
27
+ }
28
+ createIndex(table, columns, name, unique = false) {
29
+ const cols = Array.isArray(columns) ? columns : [columns];
30
+ const indexName = name ?? `idx_${table}_${cols.join("_")}`;
31
+ const { statements } = compileStatementNative({ kind: "createIndex", table, name: indexName, columns: cols, unique }, this.#dialect);
32
+ this.#statements.push(...statements);
33
+ return this;
34
+ }
35
+ dropIndex(name) {
36
+ const { statements } = compileStatementNative({ kind: "dropIndex", name, ifExists: true }, this.#dialect);
37
+ this.#statements.push(...statements);
38
+ return this;
39
+ }
40
+ raw(sql) {
41
+ this.#statements.push(sql);
42
+ return this;
43
+ }
44
+ reset() {
45
+ this.#statements = [];
46
+ }
47
+ toSQL() {
48
+ return [...this.#statements];
49
+ }
50
+ }
51
+ //# sourceMappingURL=Schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Schema.js","sourceRoot":"","sources":["../../src/schema/Schema.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAEN,sBAAsB,EACtB,eAAe,GACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,OAAO,MAAM;IAClB,QAAQ,CAAe;IACvB,WAAW,GAAa,EAAE,CAAC;IAE3B,YAAY,UAAwB,eAAe,EAAE;QACpD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,WAAW,CAAC,IAAY,EAAE,QAAuC;QAChE,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;QACvC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC;IACb,CAAC;IAED,SAAS,CAAC,IAAY;QACrB,MAAM,EAAE,UAAU,EAAE,GAAG,sBAAsB,CAC5C,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAClD,IAAI,CAAC,QAAQ,CACb,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACb,CAAC;IAED,WAAW,CACV,KAAa,EACb,OAA0B,EAC1B,IAAa,EACb,MAAM,GAAG,KAAK;QAEd,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,IAAI,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3D,MAAM,EAAE,UAAU,EAAE,GAAG,sBAAsB,CAC5C,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EACtE,IAAI,CAAC,QAAQ,CACb,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACb,CAAC;IAED,SAAS,CAAC,IAAY;QACrB,MAAM,EAAE,UAAU,EAAE,GAAG,sBAAsB,CAC5C,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAC3C,IAAI,CAAC,QAAQ,CACb,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACb,CAAC;IAED,GAAG,CAAC,GAAW;QACd,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IACb,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IACvB,CAAC;IAED,KAAK;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IAC9B,CAAC;CACD"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * SchemaBuilder — barrel re-export for backward compatibility.
3
+ *
4
+ * The classes were split into one-class-per-file:
5
+ * - {@link Schema} → ./Schema.ts
6
+ * - {@link TableBuilder} → ./TableBuilder.ts
7
+ * - shared types → ./types.ts
8
+ *
9
+ * @implements FR34
10
+ */
11
+ export { Schema } from "./Schema.js";
12
+ export { TableBuilder } from "./TableBuilder.js";
13
+ export type { ColumnDefinition, ColumnType, IndexDefinition } from "./types.js";
14
+ //# sourceMappingURL=SchemaBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaBuilder.d.ts","sourceRoot":"","sources":["../../src/schema/SchemaBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * SchemaBuilder — barrel re-export for backward compatibility.
3
+ *
4
+ * The classes were split into one-class-per-file:
5
+ * - {@link Schema} → ./Schema.ts
6
+ * - {@link TableBuilder} → ./TableBuilder.ts
7
+ * - shared types → ./types.ts
8
+ *
9
+ * @implements FR34
10
+ */
11
+ export { Schema } from "./Schema.js";
12
+ export { TableBuilder } from "./TableBuilder.js";
13
+ //# sourceMappingURL=SchemaBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaBuilder.js","sourceRoot":"","sources":["../../src/schema/SchemaBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Seeder — populate the database with default / reference / test data.
3
+ *
4
+ * The canonical pattern:
5
+ *
6
+ * export default class CountrySeeder extends BaseSeeder {
7
+ * async run() {
8
+ * // Idempotent via updateOrCreateMany — safe to re-run.
9
+ * await Country.updateOrCreateMany('isoCode', [
10
+ * { isoCode: 'FR', name: 'France' },
11
+ * { isoCode: 'IN', name: 'India' },
12
+ * ])
13
+ * }
14
+ * }
15
+ *
16
+ * @implements MISS-4, Story 32.12
17
+ */
18
+ import type { DatabaseConnection } from "../BaseRepository.js";
19
+ /**
20
+ * Base class for all seeders.
21
+ *
22
+ * Subclasses receive the database connection via the constructor so they can
23
+ * build repositories inside `run()` without resorting to globals.
24
+ */
25
+ export declare abstract class BaseSeeder {
26
+ protected db: DatabaseConnection;
27
+ constructor(db: DatabaseConnection);
28
+ /** The seeder body. Should be idempotent — `updateOrCreateMany` is the recommended pattern. */
29
+ abstract run(): Promise<void> | void;
30
+ }
31
+ /** Legacy alias kept for code using the previous API. */
32
+ export declare const Seeder: typeof BaseSeeder;
33
+ /**
34
+ * Run a pre-built list of seeder INSTANCES in order. Each `run()` is awaited
35
+ * sequentially so ordering is deterministic and side effects are visible to
36
+ * subsequent seeders.
37
+ */
38
+ export declare function runSeeders(seeders: BaseSeeder[], _db?: DatabaseConnection): Promise<void>;
39
+ /**
40
+ * Discover seeder files under `dir`, import them in alphabetical order, build
41
+ * instances with the given DB connection, and run them sequentially.
42
+ *
43
+ * Usage: `await runSeederDirectory('./database/seeders', db)`
44
+ *
45
+ * @param dir Directory containing `.ts` / `.js` seeder files
46
+ * @param db Database connection passed to each seeder constructor
47
+ * @param options Optional filter (`files: ['CountrySeeder']`) to run a subset
48
+ *
49
+ * @implements Story 32.12
50
+ */
51
+ export declare function runSeederDirectory(dir: string, db: DatabaseConnection, options?: {
52
+ files?: readonly string[];
53
+ }): Promise<string[]>;
54
+ //# sourceMappingURL=Seeder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Seeder.d.ts","sourceRoot":"","sources":["../../src/schema/Seeder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;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,+FAA+F;IAC/F,QAAQ,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;CACpC;AAED,yDAAyD;AACzD,eAAO,MAAM,MAAM,mBAAa,CAAC;AAEjC;;;;GAIG;AACH,wBAAsB,UAAU,CAC/B,OAAO,EAAE,UAAU,EAAE,EACrB,GAAG,CAAC,EAAE,kBAAkB,GACtB,OAAO,CAAC,IAAI,CAAC,CAIf;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"}