@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 @@
1
+ {"version":3,"file":"QueryBuilder.d.ts","sourceRoot":"","sources":["../../src/query/QueryBuilder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,310 @@
1
+ /**
2
+ * Fluent Query Builder — with advanced features (CTE, subqueries, unions, window functions).
3
+ *
4
+ * @implements FR31, FR32, FR33, FR36, FR37
5
+ */
6
+ import { AtlasError } from "../errors.js";
7
+ import { assertValidIdentifier } from "../utils/identifier.js";
8
+ import { compileStatementNative, getAtlasDialect, } from "./native.js";
9
+ const WHERE_OPERATORS = new Set([
10
+ "=",
11
+ "!=",
12
+ ">",
13
+ ">=",
14
+ "<",
15
+ "<=",
16
+ "LIKE",
17
+ "IN",
18
+ "NOT IN",
19
+ "IS NULL",
20
+ "IS NOT NULL",
21
+ ]);
22
+ function isWhereOperator(v) {
23
+ return typeof v === "string" && WHERE_OPERATORS.has(v);
24
+ }
25
+ /** Typed raw SQL with parameterized values. */
26
+ export class RawSql {
27
+ sql;
28
+ params;
29
+ constructor(sql, params = []) {
30
+ this.sql = sql;
31
+ this.params = params;
32
+ }
33
+ /** Tagged template literal for raw SQL with automatic parameterization. */
34
+ static sql(strings, ...values) {
35
+ let sql = "";
36
+ const params = [];
37
+ let paramIndex = 1;
38
+ for (let i = 0; i < strings.length; i++) {
39
+ sql += strings[i];
40
+ if (i < values.length) {
41
+ if (values[i] instanceof RawSql) {
42
+ // Inline raw SQL fragments — re-index their $N placeholders
43
+ const raw = values[i];
44
+ let remapped = raw.sql;
45
+ for (let j = raw.params.length; j >= 1; j--) {
46
+ remapped = remapped.replace(new RegExp(`\\$${j}(?!\\d)`, "g"), `$${paramIndex + j - 1}`);
47
+ }
48
+ sql += remapped;
49
+ params.push(...raw.params);
50
+ paramIndex += raw.params.length;
51
+ }
52
+ else {
53
+ sql += `$${paramIndex++}`;
54
+ params.push(values[i]);
55
+ }
56
+ }
57
+ }
58
+ return new RawSql(sql, params);
59
+ }
60
+ }
61
+ // Identifier quoting and SQL compilation now handled by Rust (ream-query crate).
62
+ // The TS QueryBuilder is a thin wrapper that serializes to JSON and calls the Rust compiler.
63
+ /**
64
+ * Fluent query builder — type-safe, composable, with advanced features.
65
+ */
66
+ export class QueryBuilder {
67
+ #table;
68
+ #select = ["*"];
69
+ #where = [];
70
+ #orderBy = [];
71
+ #groupBy = [];
72
+ #having = [];
73
+ #limit;
74
+ #offset;
75
+ #preload = [];
76
+ #ctes = [];
77
+ #unions = [];
78
+ #distinct = false;
79
+ /** SQL dialect for compilation — explicit override or process default. */
80
+ #dialect;
81
+ constructor(table, options) {
82
+ this.#table = table;
83
+ this.#dialect = options?.dialect ?? getAtlasDialect();
84
+ }
85
+ /** SELECT DISTINCT. */
86
+ distinct() {
87
+ this.#distinct = true;
88
+ return this;
89
+ }
90
+ /** Select specific columns (supports expressions like 'COUNT(*) AS total'). */
91
+ select(...columns) {
92
+ if (columns.length === 0) {
93
+ throw new AtlasError("EMPTY_SELECT", "select() requires at least one column");
94
+ }
95
+ this.#select = columns;
96
+ return this;
97
+ }
98
+ /** Add a WHERE condition. */
99
+ where(column, operatorOrValue, value) {
100
+ if (value === undefined) {
101
+ this.#where.push({
102
+ column,
103
+ operator: "=",
104
+ value: operatorOrValue,
105
+ type: "and",
106
+ });
107
+ }
108
+ else {
109
+ if (!isWhereOperator(operatorOrValue)) {
110
+ throw new AtlasError("INVALID_OPERATOR", `Invalid WHERE operator: ${String(operatorOrValue)}`);
111
+ }
112
+ this.#where.push({
113
+ column,
114
+ operator: operatorOrValue,
115
+ value,
116
+ type: "and",
117
+ });
118
+ }
119
+ return this;
120
+ }
121
+ /** Add an OR WHERE condition. */
122
+ orWhere(column, operatorOrValue, value) {
123
+ if (value === undefined) {
124
+ this.#where.push({
125
+ column,
126
+ operator: "=",
127
+ value: operatorOrValue,
128
+ type: "or",
129
+ });
130
+ }
131
+ else {
132
+ if (!isWhereOperator(operatorOrValue)) {
133
+ throw new AtlasError("INVALID_OPERATOR", `Invalid WHERE operator: ${String(operatorOrValue)}`);
134
+ }
135
+ this.#where.push({
136
+ column,
137
+ operator: operatorOrValue,
138
+ value,
139
+ type: "or",
140
+ });
141
+ }
142
+ return this;
143
+ }
144
+ /** WHERE column IN (values). */
145
+ whereIn(column, values) {
146
+ this.#where.push({ column, operator: "IN", value: values, type: "and" });
147
+ return this;
148
+ }
149
+ /** WHERE column IS NULL. */
150
+ whereNull(column) {
151
+ this.#where.push({ column, operator: "IS NULL", value: null, type: "and" });
152
+ return this;
153
+ }
154
+ /** WHERE column IS NOT NULL. */
155
+ whereNotNull(column) {
156
+ this.#where.push({
157
+ column,
158
+ operator: "IS NOT NULL",
159
+ value: null,
160
+ type: "and",
161
+ });
162
+ return this;
163
+ }
164
+ /** WHERE EXISTS (subquery). Subquery is deferred — toSQL() called at build time. */
165
+ whereExists(subquery) {
166
+ this.#where.push({ kind: "exists", subquery, type: "and" });
167
+ return this;
168
+ }
169
+ /** GROUP BY columns. */
170
+ groupBy(...columns) {
171
+ this.#groupBy.push(...columns);
172
+ return this;
173
+ }
174
+ /** HAVING condition (used after GROUP BY). Supports aggregate expressions. */
175
+ having(column, operatorOrValue, value) {
176
+ if (value === undefined) {
177
+ this.#having.push({
178
+ column,
179
+ operator: "=",
180
+ value: operatorOrValue,
181
+ type: "and",
182
+ });
183
+ }
184
+ else {
185
+ if (!isWhereOperator(operatorOrValue)) {
186
+ throw new AtlasError("INVALID_OPERATOR", `Invalid HAVING operator: ${String(operatorOrValue)}`);
187
+ }
188
+ this.#having.push({
189
+ column,
190
+ operator: operatorOrValue,
191
+ value,
192
+ type: "and",
193
+ });
194
+ }
195
+ return this;
196
+ }
197
+ /** ORDER BY column. */
198
+ orderBy(column, direction = "asc") {
199
+ this.#orderBy.push({ column, direction });
200
+ return this;
201
+ }
202
+ /** LIMIT results. */
203
+ limit(n) {
204
+ if (n < 0) {
205
+ throw new AtlasError("INVALID_LIMIT", "limit must be >= 0");
206
+ }
207
+ this.#limit = n;
208
+ return this;
209
+ }
210
+ /** OFFSET results. */
211
+ offset(n) {
212
+ if (n < 0) {
213
+ throw new AtlasError("INVALID_OFFSET", "offset must be >= 0");
214
+ }
215
+ this.#offset = n;
216
+ return this;
217
+ }
218
+ /** Paginate results. */
219
+ paginate(page, perPage = 20) {
220
+ if (page < 1) {
221
+ throw new AtlasError("INVALID_PAGE", "page must be >= 1");
222
+ }
223
+ if (perPage < 1) {
224
+ throw new AtlasError("INVALID_PER_PAGE", "perPage must be >= 1");
225
+ }
226
+ this.#limit = perPage;
227
+ this.#offset = (page - 1) * perPage;
228
+ return this;
229
+ }
230
+ /** Eager-load a relation. */
231
+ preload(relation) {
232
+ this.#preload.push(relation);
233
+ return this;
234
+ }
235
+ /** WITH (Common Table Expression). */
236
+ with(name, query) {
237
+ assertValidIdentifier(name, "CTE name", (msg) => new AtlasError("INVALID_CTE_NAME", msg));
238
+ this.#ctes.push({ name, query });
239
+ return this;
240
+ }
241
+ /** UNION with another query (wrapped in parentheses). */
242
+ union(query) {
243
+ this.#unions.push({ query, all: false });
244
+ return this;
245
+ }
246
+ /** UNION ALL with another query (wrapped in parentheses). */
247
+ unionAll(query) {
248
+ this.#unions.push({ query, all: true });
249
+ return this;
250
+ }
251
+ /**
252
+ * Serialize the query description to JSON for the Rust compiler.
253
+ */
254
+ #toQueryDescription() {
255
+ // Serialize CTEs — pre-compile sub-queries
256
+ const ctes = this.#ctes.map((cte) => {
257
+ if (cte.query instanceof RawSql) {
258
+ return { name: cte.name, sql: cte.query.sql, params: cte.query.params };
259
+ }
260
+ const sub = cte.query.toSQL();
261
+ return { name: cte.name, sql: sub.sql, params: sub.params };
262
+ });
263
+ // Serialize WHERE clauses
264
+ const wheres = this.#where.map((w) => {
265
+ if ("kind" in w) {
266
+ const sub = w.subquery.#toQueryDescription();
267
+ return { kind: "exists", subquery: sub, type: w.type };
268
+ }
269
+ return {
270
+ column: w.column,
271
+ operator: w.operator,
272
+ value: w.value,
273
+ type: w.type,
274
+ };
275
+ });
276
+ // Serialize UNIONs — pre-compile sub-queries
277
+ const unions = this.#unions.map((u) => {
278
+ const sub = u.query.toSQL();
279
+ return { sql: sub.sql, params: sub.params, all: u.all };
280
+ });
281
+ return {
282
+ table: this.#table,
283
+ select: this.#select,
284
+ wheres,
285
+ orderBy: this.#orderBy,
286
+ groupBy: this.#groupBy,
287
+ having: this.#having,
288
+ limit: this.#limit ?? null,
289
+ offset: this.#offset ?? null,
290
+ distinct: this.#distinct,
291
+ ctes,
292
+ unions,
293
+ };
294
+ }
295
+ /** Build the SQL query string via the Rust compiler. */
296
+ toSQL() {
297
+ const desc = this.#toQueryDescription();
298
+ const compiled = compileStatementNative({ kind: "select", ...desc }, this.#dialect);
299
+ return { sql: compiled.statements[0], params: compiled.params };
300
+ }
301
+ /** Get the table name. */
302
+ getTable() {
303
+ return this.#table;
304
+ }
305
+ /** Get preloaded relations. */
306
+ getPreloads() {
307
+ return [...this.#preload];
308
+ }
309
+ }
310
+ //# sourceMappingURL=QueryBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryBuilder.js","sourceRoot":"","sources":["../../src/query/QueryBuilder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Native query compiler loader — loads the Rust NAPI binary.
3
+ *
4
+ * @implements FR36
5
+ */
6
+ export type AtlasDialect = "sqlite" | "postgres" | "mysql";
7
+ export declare function setAtlasDialect(dialect: AtlasDialect): void;
8
+ export declare function getAtlasDialect(): AtlasDialect;
9
+ export interface CompiledStatement {
10
+ statements: string[];
11
+ params: unknown[];
12
+ }
13
+ /**
14
+ * Compile any statement (SELECT/INSERT/UPDATE/DELETE/DDL) via the Rust compiler.
15
+ * `spec` is a tagged object: `{ kind: 'select' | 'insert' | ..., ... }`.
16
+ */
17
+ export declare function compileStatementNative(spec: object, dialect?: AtlasDialect): CompiledStatement;
18
+ //# sourceMappingURL=native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../src/query/native.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoCH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;AAK3D,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAE3D;AAED,wBAAgB,eAAe,IAAI,YAAY,CAE9C;AAED,MAAM,WAAW,iBAAiB;IACjC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,OAAO,EAAE,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACrC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,YAA6B,GACpC,iBAAiB,CAQnB"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Native query compiler loader — loads the Rust NAPI binary.
3
+ *
4
+ * @implements FR36
5
+ */
6
+ import { createRequire } from "node:module";
7
+ import { dirname, join } from "node:path";
8
+ import { arch, platform } from "node:process";
9
+ import { fileURLToPath } from "node:url";
10
+ const require2 = createRequire(import.meta.url);
11
+ const __dirname2 = dirname(fileURLToPath(import.meta.url));
12
+ const platformMap = {
13
+ "linux-x64": "linux-x64-gnu",
14
+ "darwin-x64": "darwin-x64",
15
+ "darwin-arm64": "darwin-arm64",
16
+ "win32-x64": "win32-x64-msvc",
17
+ "linux-arm64": "linux-arm64-gnu",
18
+ };
19
+ let native;
20
+ let loadError;
21
+ try {
22
+ const suffix = platformMap[`${platform}-${arch}`];
23
+ if (suffix) {
24
+ native = require2(join(__dirname2, `../../index.${suffix}.node`));
25
+ }
26
+ }
27
+ catch (e) {
28
+ loadError = e;
29
+ }
30
+ /** Module-level default dialect. Set by AtlasProvider at boot. */
31
+ let defaultDialect = "sqlite";
32
+ export function setAtlasDialect(dialect) {
33
+ defaultDialect = dialect;
34
+ }
35
+ export function getAtlasDialect() {
36
+ return defaultDialect;
37
+ }
38
+ /**
39
+ * Compile any statement (SELECT/INSERT/UPDATE/DELETE/DDL) via the Rust compiler.
40
+ * `spec` is a tagged object: `{ kind: 'select' | 'insert' | ..., ... }`.
41
+ */
42
+ export function compileStatementNative(spec, dialect = defaultDialect) {
43
+ if (!native) {
44
+ throw new Error(`[ATLAS_NAPI_NOT_FOUND] Rust query compiler not available: ${loadError ?? "binary not found"}`);
45
+ }
46
+ const json = native.compileStatement(JSON.stringify(spec), dialect);
47
+ return JSON.parse(json);
48
+ }
49
+ //# sourceMappingURL=native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native.js","sourceRoot":"","sources":["../../src/query/native.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChD,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE3D,MAAM,WAAW,GAA2B;IAC3C,WAAW,EAAE,eAAe;IAC5B,YAAY,EAAE,YAAY;IAC1B,cAAc,EAAE,cAAc;IAC9B,WAAW,EAAE,gBAAgB;IAC7B,aAAa,EAAE,iBAAiB;CAChC,CAAC;AAOF,IAAI,MAAiC,CAAC;AAEtC,IAAI,SAAkB,CAAC;AAEvB,IAAI,CAAC;IACJ,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC;IAClD,IAAI,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,MAAM,OAAO,CAAC,CAAC,CAAC;IACnE,CAAC;AACF,CAAC;AAAC,OAAO,CAAC,EAAE,CAAC;IACZ,SAAS,GAAG,CAAC,CAAC;AACf,CAAC;AAID,kEAAkE;AAClE,IAAI,cAAc,GAAiB,QAAQ,CAAC;AAE5C,MAAM,UAAU,eAAe,CAAC,OAAqB;IACpD,cAAc,GAAG,OAAO,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,eAAe;IAC9B,OAAO,cAAc,CAAC;AACvB,CAAC;AAOD;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACrC,IAAY,EACZ,UAAwB,cAAc;IAEtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACd,6DAA6D,SAAS,IAAI,kBAAkB,EAAE,CAC9F,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IACpE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Migration base class — extend this to create database migrations.
3
+ *
4
+ * @implements FR34
5
+ */
6
+ import type { AtlasDialect } from "../query/native.js";
7
+ import { Schema } from "./SchemaBuilder.js";
8
+ /**
9
+ * Base class for all migrations.
10
+ *
11
+ * Usage:
12
+ * import { Migration } from '@c9up/atlas'
13
+ *
14
+ * export default class CreateOrders extends Migration {
15
+ * async up() {
16
+ * this.schema.createTable('orders', (table) => {
17
+ * table.id()
18
+ * table.string('status', 50).notNullable().defaultTo("'pending'")
19
+ * table.decimal('total', 10, 2).notNullable()
20
+ * table.timestamps()
21
+ * })
22
+ * }
23
+ *
24
+ * async down() {
25
+ * this.schema.dropTable('orders')
26
+ * }
27
+ * }
28
+ */
29
+ export declare abstract class Migration {
30
+ #private;
31
+ readonly schema: Schema;
32
+ constructor(dialect?: AtlasDialect);
33
+ /** Apply the migration. */
34
+ abstract up(): Promise<void> | void;
35
+ /** Rollback the migration. */
36
+ abstract down(): Promise<void> | void;
37
+ /** Helper: raw SQL expression (for DEFAULT values). */
38
+ raw(expression: string): string;
39
+ /**
40
+ * Dialect-aware "current timestamp" helper for column defaults.
41
+ *
42
+ * - `sqlite` → `CURRENT_TIMESTAMP` (the only form SQLite understands)
43
+ * - `postgres` → `NOW()`
44
+ * - `mysql` → `NOW()`
45
+ *
46
+ * Previously this always returned `NOW()`, which silently broke SQLite
47
+ * migrations — `NOW()` is not a recognised function there and the column
48
+ * default would blow up at DDL compile time.
49
+ */
50
+ now(): string;
51
+ /** Get the SQL statements generated by this migration. */
52
+ getUpSQL(): Promise<string[]>;
53
+ getDownSQL(): Promise<string[]>;
54
+ }
55
+ //# sourceMappingURL=Migration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Migration.d.ts","sourceRoot":"","sources":["../../src/schema/Migration.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,8BAAsB,SAAS;;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAGZ,OAAO,CAAC,EAAE,YAAY;IAQlC,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAEnC,8BAA8B;IAC9B,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAErC,uDAAuD;IACvD,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAI/B;;;;;;;;;;OAUG;IACH,GAAG,IAAI,MAAM;IAIb,0DAA0D;IACpD,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAM7B,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAKrC"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Migration base class — extend this to create database migrations.
3
+ *
4
+ * @implements FR34
5
+ */
6
+ import { Schema } from "./SchemaBuilder.js";
7
+ /**
8
+ * Base class for all migrations.
9
+ *
10
+ * Usage:
11
+ * import { Migration } from '@c9up/atlas'
12
+ *
13
+ * export default class CreateOrders extends Migration {
14
+ * async up() {
15
+ * this.schema.createTable('orders', (table) => {
16
+ * table.id()
17
+ * table.string('status', 50).notNullable().defaultTo("'pending'")
18
+ * table.decimal('total', 10, 2).notNullable()
19
+ * table.timestamps()
20
+ * })
21
+ * }
22
+ *
23
+ * async down() {
24
+ * this.schema.dropTable('orders')
25
+ * }
26
+ * }
27
+ */
28
+ export class Migration {
29
+ schema;
30
+ #dialect;
31
+ constructor(dialect) {
32
+ this.schema = new Schema(dialect);
33
+ // Default to sqlite when no dialect is passed — the generator emits
34
+ // sqlite-compatible helpers (`CURRENT_TIMESTAMP`) which happen to work
35
+ // on postgres/mysql too, so this is the safest conservative default.
36
+ this.#dialect = dialect ?? "sqlite";
37
+ }
38
+ /** Helper: raw SQL expression (for DEFAULT values). */
39
+ raw(expression) {
40
+ return expression;
41
+ }
42
+ /**
43
+ * Dialect-aware "current timestamp" helper for column defaults.
44
+ *
45
+ * - `sqlite` → `CURRENT_TIMESTAMP` (the only form SQLite understands)
46
+ * - `postgres` → `NOW()`
47
+ * - `mysql` → `NOW()`
48
+ *
49
+ * Previously this always returned `NOW()`, which silently broke SQLite
50
+ * migrations — `NOW()` is not a recognised function there and the column
51
+ * default would blow up at DDL compile time.
52
+ */
53
+ now() {
54
+ return this.#dialect === "sqlite" ? "CURRENT_TIMESTAMP" : "NOW()";
55
+ }
56
+ /** Get the SQL statements generated by this migration. */
57
+ async getUpSQL() {
58
+ this.schema.reset();
59
+ await this.up();
60
+ return this.schema.toSQL();
61
+ }
62
+ async getDownSQL() {
63
+ this.schema.reset();
64
+ await this.down();
65
+ return this.schema.toSQL();
66
+ }
67
+ }
68
+ //# sourceMappingURL=Migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Migration.js","sourceRoot":"","sources":["../../src/schema/Migration.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,OAAgB,SAAS;IACrB,MAAM,CAAS;IACf,QAAQ,CAAe;IAEhC,YAAY,OAAsB;QACjC,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;QAClC,oEAAoE;QACpE,uEAAuE;QACvE,qEAAqE;QACrE,IAAI,CAAC,QAAQ,GAAG,OAAO,IAAI,QAAQ,CAAC;IACrC,CAAC;IAQD,uDAAuD;IACvD,GAAG,CAAC,UAAkB;QACrB,OAAO,UAAU,CAAC;IACnB,CAAC;IAED;;;;;;;;;;OAUG;IACH,GAAG;QACF,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,OAAO,CAAC;IACnE,CAAC;IAED,0DAA0D;IAC1D,KAAK,CAAC,QAAQ;QACb,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,MAAM,IAAI,CAAC,EAAE,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,UAAU;QACf,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;CACD"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Migration Runner — discovers, executes, and tracks database migrations.
3
+ *
4
+ * @implements FR34
5
+ */
6
+ import { type AtlasDialect } from "../query/native.js";
7
+ export interface BatchStmt {
8
+ sql: string;
9
+ params?: unknown[];
10
+ }
11
+ export interface DatabaseAdapter {
12
+ /** Execute a SQL statement with optional parameterized values. */
13
+ execute(sql: string, params?: unknown[]): Promise<void>;
14
+ /** Query rows with optional parameterized values. */
15
+ query<T>(sql: string, params?: unknown[]): Promise<T[]>;
16
+ /**
17
+ * Run every statement in `batch` atomically in a single transaction.
18
+ * Required for migrations (used by `migrate()`/`rollback()` — see story
19
+ * "Migrations non transactionnelles" in the remediation audit).
20
+ */
21
+ runInTransaction?(batch: readonly BatchStmt[]): Promise<number>;
22
+ /** Close the connection. */
23
+ close(): Promise<void>;
24
+ }
25
+ export interface MigrationRecord {
26
+ name: string;
27
+ batch: number;
28
+ executed_at: string;
29
+ }
30
+ export type MigrationState = "applied" | "pending";
31
+ export interface MigrationStatus {
32
+ name: string;
33
+ status: MigrationState;
34
+ batch?: number;
35
+ }
36
+ /**
37
+ * Runs migrations against a database.
38
+ */
39
+ export declare class MigrationRunner {
40
+ #private;
41
+ /**
42
+ * @param db Underlying database adapter.
43
+ * @param options.migrationsDir Directory containing migration files. Defaults to `database/migrations`.
44
+ * @param options.dialect SQL dialect of the adapter. Defaults to `sqlite`.
45
+ * @param options.tableName Custom name for the migrations tracking table.
46
+ * Defaults to `"ream_migrations"`. Must match `/^[A-Za-z_][A-Za-z0-9_]*$/` —
47
+ * throws `AtlasError("MIGRATION_INVALID_TABLE_NAME")` synchronously otherwise.
48
+ *
49
+ * Cleanup coupling: `DatabaseCleanup.truncateAll` (`src/testing/DatabaseCleanup.ts`)
50
+ * skips tables whose name starts with `ream_` (via `LIKE 'ream\_%' ESCAPE '\'`).
51
+ * The default `"ream_migrations"` is therefore auto-protected. Choosing a name
52
+ * without the `ream_` prefix (e.g. `"schema_versions"`) opts the tracking table
53
+ * out of that protection — `truncateAll` will wipe it alongside user tables,
54
+ * forcing a re-`init()` and replay of every migration on next test run.
55
+ *
56
+ * Rename caveat: `init()` emits `CREATE TABLE IF NOT EXISTS <tableName>` —
57
+ * it does NOT auto-migrate from a previous tracking table. A project that
58
+ * has been running with `ream_migrations` and then changes `tableName` to
59
+ * `schema_versions` will get a fresh empty `schema_versions` on next boot,
60
+ * read zero applied migrations, and re-run every past migration (likely
61
+ * crashing on `CREATE TABLE <user-table>` already-exists). To rename
62
+ * safely, copy the history manually before switching:
63
+ *
64
+ * INSERT INTO schema_versions SELECT * FROM ream_migrations;
65
+ * -- (then DROP TABLE ream_migrations once verified)
66
+ */
67
+ constructor(db: DatabaseAdapter, options?: {
68
+ migrationsDir?: string;
69
+ dialect?: AtlasDialect;
70
+ tableName?: string;
71
+ });
72
+ /** Ensure the ream_migrations tracking table exists. */
73
+ init(): Promise<void>;
74
+ /** Get the status of all migrations. */
75
+ status(): Promise<MigrationStatus[]>;
76
+ /** Run all pending migrations. */
77
+ migrate(): Promise<string[]>;
78
+ /** Rollback the last batch of migrations. */
79
+ rollback(): Promise<string[]>;
80
+ /**
81
+ * Rollback + re-run a specific number of batches (or all if `steps` omitted).
82
+ * `migrate:refresh` in Lucid parlance.
83
+ *
84
+ * @implements Story 32.11
85
+ */
86
+ refresh(): Promise<{
87
+ rolled: string[];
88
+ executed: string[];
89
+ }>;
90
+ /**
91
+ * Drop EVERY table the migrations created (via successive rollbacks) then
92
+ * run every migration from scratch. `migrate:fresh` in Lucid parlance.
93
+ *
94
+ * Distinct from `refresh()` only in intent — both end up with a fresh DB.
95
+ */
96
+ fresh(): Promise<{
97
+ rolled: string[];
98
+ executed: string[];
99
+ }>;
100
+ /**
101
+ * Rollback every applied batch (alias for `migrate:reset`).
102
+ * Returns the list of rolled-back migration names (in rollback order).
103
+ */
104
+ reset(): Promise<string[]>;
105
+ /**
106
+ * Dry-run: compute the SQL statements that would be emitted by a migrate
107
+ * without executing them. Returns the full list of statements per pending
108
+ * migration file. Useful for CI pre-flight checks.
109
+ */
110
+ dryRun(): Promise<Array<{
111
+ name: string;
112
+ sql: string[];
113
+ }>>;
114
+ }
115
+ //# sourceMappingURL=MigrationRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MigrationRunner.d.ts","sourceRoot":"","sources":["../../src/schema/MigrationRunner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAE,KAAK,YAAY,EAA0B,MAAM,oBAAoB,CAAC;AA2C/E,MAAM,WAAW,SAAS;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC/B,kEAAkE;IAClE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,qDAAqD;IACrD,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IACxD;;;;OAIG;IACH,gBAAgB,CAAC,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChE,4BAA4B;IAC5B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,CAAC;AAEnD,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,qBAAa,eAAe;;IAM3B;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;gBAEF,EAAE,EAAE,eAAe,EACnB,OAAO,CAAC,EAAE;QACT,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,OAAO,CAAC,EAAE,YAAY,CAAC;QACvB,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB;IAWF,wDAAwD;IAClD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA+D3B,wCAAwC;IAClC,MAAM,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAyB1C,kCAAkC;IAC5B,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAmElC,6CAA6C;IACvC,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAuFnC;;;;;OAKG;IACG,OAAO,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAMlE;;;;;OAKG;IACG,KAAK,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAIhE;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAYhC;;;;OAIG;IACG,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CA2G/D"}