@c9up/atlas 0.1.13 → 0.1.15

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 (48) hide show
  1. package/db.win32-x64-msvc.node +0 -0
  2. package/dist/AtlasProvider.d.ts +12 -0
  3. package/dist/AtlasProvider.d.ts.map +1 -1
  4. package/dist/AtlasProvider.js +19 -1
  5. package/dist/AtlasProvider.js.map +1 -1
  6. package/dist/console/schemaCheckCommand.d.ts +37 -0
  7. package/dist/console/schemaCheckCommand.d.ts.map +1 -0
  8. package/dist/console/schemaCheckCommand.js +49 -0
  9. package/dist/console/schemaCheckCommand.js.map +1 -0
  10. package/dist/index.d.ts +4 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +3 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/schema/Migration.d.ts +4 -3
  15. package/dist/schema/Migration.d.ts.map +1 -1
  16. package/dist/schema/Migration.js +4 -3
  17. package/dist/schema/Migration.js.map +1 -1
  18. package/dist/schema/SchemaCheck.d.ts +61 -0
  19. package/dist/schema/SchemaCheck.d.ts.map +1 -0
  20. package/dist/schema/SchemaCheck.js +204 -0
  21. package/dist/schema/SchemaCheck.js.map +1 -0
  22. package/dist/schema/TableBuilder.d.ts +7 -1
  23. package/dist/schema/TableBuilder.d.ts.map +1 -1
  24. package/dist/schema/TableBuilder.js +13 -5
  25. package/dist/schema/TableBuilder.js.map +1 -1
  26. package/dist/schema/introspect.d.ts +34 -0
  27. package/dist/schema/introspect.d.ts.map +1 -0
  28. package/dist/schema/introspect.js +83 -0
  29. package/dist/schema/introspect.js.map +1 -0
  30. package/dist/schema/raw.d.ts +26 -0
  31. package/dist/schema/raw.d.ts.map +1 -0
  32. package/dist/schema/raw.js +33 -0
  33. package/dist/schema/raw.js.map +1 -0
  34. package/dist/services/db.d.ts +12 -1
  35. package/dist/services/db.d.ts.map +1 -1
  36. package/dist/services/db.js +5 -0
  37. package/dist/services/db.js.map +1 -1
  38. package/index.win32-x64-msvc.node +0 -0
  39. package/package.json +1 -1
  40. package/src/AtlasProvider.ts +29 -1
  41. package/src/console/schemaCheckCommand.ts +62 -0
  42. package/src/index.ts +19 -0
  43. package/src/schema/Migration.ts +8 -5
  44. package/src/schema/SchemaCheck.ts +273 -0
  45. package/src/schema/TableBuilder.ts +14 -5
  46. package/src/schema/introspect.ts +133 -0
  47. package/src/schema/raw.ts +34 -0
  48. package/src/services/db.ts +17 -1
@@ -7,6 +7,7 @@
7
7
  * @implements FR34
8
8
  */
9
9
  import { type AtlasDialect } from "../query/native.js";
10
+ import { type DefaultValue } from "./raw.js";
10
11
  import { type ColumnDefinition, type IndexDefinition } from "./types.js";
11
12
  /** Table builder — used inside `schema.createTable(name, callback)`. */
12
13
  export declare class TableBuilder {
@@ -93,7 +94,12 @@ export declare class TableBuilder {
93
94
  notNullable(): this;
94
95
  nullable(): this;
95
96
  unique(): this;
96
- defaultTo(value: string): this;
97
+ /**
98
+ * Set a column default. JS literals are quoted/escaped (`'x'`, `123`,
99
+ * `true` — Lucid/Knex semantics); wrap SQL expressions in {@link raw} (or
100
+ * use `Migration.now()`) to emit them verbatim.
101
+ */
102
+ defaultTo(value: DefaultValue): this;
97
103
  references(table: string, column?: string): this;
98
104
  index(columns: string | string[], name?: string): this;
99
105
  uniqueIndex(columns: string | string[], name?: string): this;
@@ -1 +1 @@
1
- {"version":3,"file":"TableBuilder.d.ts","sourceRoot":"","sources":["../../src/schema/TableBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACN,KAAK,YAAY,EAGjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACN,KAAK,gBAAgB,EAErB,KAAK,eAAe,EAEpB,MAAM,YAAY,CAAC;AAEpB,wEAAwE;AACxE,qBAAa,YAAY;;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAKf,SAAS,EAAE,MAAM;IAM7B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIxB;;;;;OAKG;IACH,UAAU,CAAC,IAAI,SAAO,GAAG,IAAI;IAI7B,sEAAsE;IACtE,aAAa,CAAC,IAAI,SAAO,GAAG,IAAI;IAIhC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAM,GAAG,IAAI;IAMxC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAGxB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAG3B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI9B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAK,EAAE,KAAK,SAAI,GAAG,IAAI;IAStD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAG3B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAGxB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAG7B;;;;;;;;OAQG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAG/B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAGxB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAM1B;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,EAAE,IAAI,IAAI;IAIV;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,UAAU,IAAI,IAAI;IAQlB,OAAO,IAAI,IAAI;IAKf,WAAW,IAAI,IAAI;IAKnB,QAAQ,IAAI,IAAI;IAKhB,MAAM,IAAI,IAAI;IAKd,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK9B,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,SAAO,GAAG,IAAI;IAO9C,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAUtD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAY5D,UAAU,IAAI,gBAAgB,EAAE;IAGhC,UAAU,IAAI,eAAe,EAAE;IAI/B,uDAAuD;IACvD,YAAY,CAAC,OAAO,GAAE,YAAgC,GAAG,MAAM,EAAE;CAiDjE"}
1
+ {"version":3,"file":"TableBuilder.d.ts","sourceRoot":"","sources":["../../src/schema/TableBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACN,KAAK,YAAY,EAGjB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,UAAU,CAAC;AACjE,OAAO,EACN,KAAK,gBAAgB,EAErB,KAAK,eAAe,EAEpB,MAAM,YAAY,CAAC;AAEpB,wEAAwE;AACxE,qBAAa,YAAY;;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAKf,SAAS,EAAE,MAAM;IAM7B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIxB;;;;;OAKG;IACH,UAAU,CAAC,IAAI,SAAO,GAAG,IAAI;IAI7B,sEAAsE;IACtE,aAAa,CAAC,IAAI,SAAO,GAAG,IAAI;IAIhC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAM,GAAG,IAAI;IAMxC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAGxB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAG3B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI9B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAK,EAAE,KAAK,SAAI,GAAG,IAAI;IAStD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAG3B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAGxB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAG7B;;;;;;;;OAQG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAG/B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAGxB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAM1B;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,EAAE,IAAI,IAAI;IAIV;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,UAAU,IAAI,IAAI;IAQlB,OAAO,IAAI,IAAI;IAKf,WAAW,IAAI,IAAI;IAKnB,QAAQ,IAAI,IAAI;IAKhB,MAAM,IAAI,IAAI;IAKd;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAOpC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,SAAO,GAAG,IAAI;IAO9C,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAUtD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAY5D,UAAU,IAAI,gBAAgB,EAAE;IAGhC,UAAU,IAAI,eAAe,EAAE;IAI/B,uDAAuD;IACvD,YAAY,CAAC,OAAO,GAAE,YAAgC,GAAG,MAAM,EAAE;CAiDjE"}
@@ -7,6 +7,8 @@
7
7
  * @implements FR34
8
8
  */
9
9
  import { compileStatementNative, getAtlasDialect, } from "../query/native.js";
10
+ import { RawSql } from "../query/QueryBuilder.js";
11
+ import { renderDefaultValue } from "./raw.js";
10
12
  import { TYPE_KIND_MAP, } from "./types.js";
11
13
  /** Table builder — used inside `schema.createTable(name, callback)`. */
12
14
  export class TableBuilder {
@@ -107,7 +109,7 @@ export class TableBuilder {
107
109
  * the helper dialect-aware.
108
110
  */
109
111
  id() {
110
- return this.uuid("id").primary().defaultTo("gen_random_uuid()");
112
+ return this.uuid("id").primary().defaultTo(new RawSql("gen_random_uuid()"));
111
113
  }
112
114
  /**
113
115
  * `created_at` + `updated_at` columns with Postgres-only `DEFAULT NOW()`.
@@ -133,8 +135,8 @@ export class TableBuilder {
133
135
  * the helper dialect-aware.
134
136
  */
135
137
  timestamps() {
136
- this.timestamp("created_at").notNullable().defaultTo("NOW()");
137
- this.timestamp("updated_at").notNullable().defaultTo("NOW()");
138
+ this.timestamp("created_at").notNullable().defaultTo(new RawSql("NOW()"));
139
+ this.timestamp("updated_at").notNullable().defaultTo(new RawSql("NOW()"));
138
140
  return this;
139
141
  }
140
142
  // ─── Column modifiers ─────────────────────────────────────
@@ -158,9 +160,15 @@ export class TableBuilder {
158
160
  this.#currentColumn.unique = true;
159
161
  return this;
160
162
  }
163
+ /**
164
+ * Set a column default. JS literals are quoted/escaped (`'x'`, `123`,
165
+ * `true` — Lucid/Knex semantics); wrap SQL expressions in {@link raw} (or
166
+ * use `Migration.now()`) to emit them verbatim.
167
+ */
161
168
  defaultTo(value) {
162
- if (this.#currentColumn)
163
- this.#currentColumn.defaultValue = value;
169
+ if (this.#currentColumn) {
170
+ this.#currentColumn.defaultValue = renderDefaultValue(value);
171
+ }
164
172
  return this;
165
173
  }
166
174
  references(table, column = "id") {
@@ -1 +1 @@
1
- {"version":3,"file":"TableBuilder.js","sourceRoot":"","sources":["../../src/schema/TableBuilder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TableBuilder.js","sourceRoot":"","sources":["../../src/schema/TableBuilder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Live schema introspection — reads the ACTUAL table/column shape from the
3
+ * connected database, per dialect. The reconciler in `SchemaCheck.ts` diffs
4
+ * this against each model's `@Column` metadata.
5
+ *
6
+ * SQLite uses `pragma_table_info`; Postgres and MySQL use `information_schema`.
7
+ * Table names come from `@Entity(...)` (developer-defined, trusted) — they are
8
+ * validated against a strict identifier pattern before interpolation, since
9
+ * `pragma_table_info(...)` cannot bind its argument.
10
+ */
11
+ import type { AtlasDialect } from "../query/native.js";
12
+ /**
13
+ * Minimal connection surface the check needs: a row-returning `query`. Both the
14
+ * real `AsyncDatabaseConnection` and the test `Database` satisfy it, so the
15
+ * checker doesn't depend on the full driver interface.
16
+ */
17
+ export interface SchemaIntrospectable {
18
+ query(sql: string, params?: unknown[]): Promise<Record<string, unknown>[]>;
19
+ }
20
+ /** One column as it actually exists in the database. */
21
+ export interface IntrospectedColumn {
22
+ name: string;
23
+ /** Raw dialect type string (e.g. `INTEGER`, `character varying`, `varchar`). */
24
+ type: string;
25
+ nullable: boolean;
26
+ hasDefault: boolean;
27
+ primaryKey: boolean;
28
+ }
29
+ /**
30
+ * Introspect one table. Returns its columns, or `null` when the table does not
31
+ * exist in the database (a distinct, reportable drift — not an error).
32
+ */
33
+ export declare function introspectTable(db: SchemaIntrospectable, dialect: AtlasDialect, table: string): Promise<IntrospectedColumn[] | null>;
34
+ //# sourceMappingURL=introspect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"introspect.d.ts","sourceRoot":"","sources":["../../src/schema/introspect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACpC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;CAC3E;AAED,wDAAwD;AACxD,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;CACpB;AAaD;;;GAGG;AACH,wBAAsB,eAAe,CACpC,EAAE,EAAE,oBAAoB,EACxB,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,MAAM,GACX,OAAO,CAAC,kBAAkB,EAAE,GAAG,IAAI,CAAC,CAUtC"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Live schema introspection — reads the ACTUAL table/column shape from the
3
+ * connected database, per dialect. The reconciler in `SchemaCheck.ts` diffs
4
+ * this against each model's `@Column` metadata.
5
+ *
6
+ * SQLite uses `pragma_table_info`; Postgres and MySQL use `information_schema`.
7
+ * Table names come from `@Entity(...)` (developer-defined, trusted) — they are
8
+ * validated against a strict identifier pattern before interpolation, since
9
+ * `pragma_table_info(...)` cannot bind its argument.
10
+ */
11
+ /** A safe SQL identifier (table name from `@Entity`). */
12
+ const IDENT = /^[A-Za-z_][A-Za-z0-9_]*$/;
13
+ function assertIdent(name) {
14
+ if (!IDENT.test(name)) {
15
+ throw new Error(`[atlas:check] refusing to introspect unsafe table identifier: ${JSON.stringify(name)}`);
16
+ }
17
+ }
18
+ /**
19
+ * Introspect one table. Returns its columns, or `null` when the table does not
20
+ * exist in the database (a distinct, reportable drift — not an error).
21
+ */
22
+ export async function introspectTable(db, dialect, table) {
23
+ assertIdent(table);
24
+ switch (dialect) {
25
+ case "sqlite":
26
+ return introspectSqlite(db, table);
27
+ case "postgres":
28
+ return introspectPostgres(db, table);
29
+ case "mysql":
30
+ return introspectMysql(db, table);
31
+ }
32
+ }
33
+ async function introspectSqlite(db, table) {
34
+ const rows = await db.query(`SELECT * FROM pragma_table_info('${table}')`);
35
+ if (rows.length === 0)
36
+ return null; // unknown table → no columns
37
+ return rows.map((r) => ({
38
+ name: String(r.name),
39
+ type: String(r.type ?? ""),
40
+ nullable: Number(r.notnull) === 0,
41
+ hasDefault: r.dflt_value !== null && r.dflt_value !== undefined,
42
+ primaryKey: Number(r.pk) > 0,
43
+ }));
44
+ }
45
+ async function introspectPostgres(db, table) {
46
+ const cols = await db.query(`SELECT column_name, data_type, is_nullable, column_default
47
+ FROM information_schema.columns
48
+ WHERE table_schema = current_schema() AND table_name = $1
49
+ ORDER BY ordinal_position`, [table]);
50
+ if (cols.length === 0)
51
+ return null;
52
+ const pkRows = await db.query(`SELECT kcu.column_name
53
+ FROM information_schema.table_constraints tc
54
+ JOIN information_schema.key_column_usage kcu
55
+ ON kcu.constraint_name = tc.constraint_name
56
+ AND kcu.table_schema = tc.table_schema
57
+ WHERE tc.table_name = $1 AND tc.constraint_type = 'PRIMARY KEY'`, [table]);
58
+ const pks = new Set(pkRows.map((r) => String(r.column_name)));
59
+ return cols.map((r) => ({
60
+ name: String(r.column_name),
61
+ type: String(r.data_type ?? ""),
62
+ nullable: String(r.is_nullable).toUpperCase() === "YES",
63
+ hasDefault: r.column_default !== null && r.column_default !== undefined,
64
+ primaryKey: pks.has(String(r.column_name)),
65
+ }));
66
+ }
67
+ async function introspectMysql(db, table) {
68
+ const rows = await db.query(`SELECT column_name, data_type, is_nullable, column_default, column_key
69
+ FROM information_schema.columns
70
+ WHERE table_schema = DATABASE() AND table_name = ?
71
+ ORDER BY ordinal_position`, [table]);
72
+ if (rows.length === 0)
73
+ return null;
74
+ return rows.map((r) => ({
75
+ name: String(r.column_name ?? r.COLUMN_NAME),
76
+ type: String(r.data_type ?? r.DATA_TYPE ?? ""),
77
+ nullable: String(r.is_nullable ?? r.IS_NULLABLE).toUpperCase() === "YES",
78
+ hasDefault: (r.column_default ?? r.COLUMN_DEFAULT) !== null &&
79
+ (r.column_default ?? r.COLUMN_DEFAULT) !== undefined,
80
+ primaryKey: String(r.column_key ?? r.COLUMN_KEY ?? "").toUpperCase() === "PRI",
81
+ }));
82
+ }
83
+ //# sourceMappingURL=introspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"introspect.js","sourceRoot":"","sources":["../../src/schema/introspect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Default-value rendering for the schema builder — Lucid/Knex semantics.
3
+ *
4
+ * `defaultTo` quotes JS literals and emits raw SQL only when given a `RawSql`
5
+ * (the single raw-expression type atlas uses everywhere, incl. queries),
6
+ * produced in a migration by `this.now()` / `this.raw(...)`:
7
+ *
8
+ * t.text('status').defaultTo('new') // → DEFAULT 'new' (quoted literal)
9
+ * t.boolean('active').defaultTo(false) // → DEFAULT false
10
+ * t.integer('count').defaultTo(0) // → DEFAULT 0
11
+ * t.uuid('id').defaultTo(this.raw('gen_random_uuid()')) // → DEFAULT gen_random_uuid()
12
+ * t.timestamp('created_at').defaultTo(this.now()) // → DEFAULT NOW()/CURRENT_TIMESTAMP
13
+ *
14
+ * Before this, `defaultTo` wrote its argument verbatim, so a bare
15
+ * `defaultTo('new')` produced the invalid `DEFAULT new` and string defaults had
16
+ * to be hand-quoted (`defaultTo("'new'")`) — a footgun Lucid/Knex avoid.
17
+ */
18
+ import { RawSql } from "../query/QueryBuilder.js";
19
+ /** Accepted `defaultTo` argument: a JS literal or a raw SQL expression. */
20
+ export type DefaultValue = string | number | boolean | RawSql;
21
+ /**
22
+ * Render a `defaultTo` argument to the SQL fragment stored as the column
23
+ * default. Literals are quoted/escaped; a {@link RawSql} passes through verbatim.
24
+ */
25
+ export declare function renderDefaultValue(value: DefaultValue): string;
26
+ //# sourceMappingURL=raw.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raw.d.ts","sourceRoot":"","sources":["../../src/schema/raw.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAElD,2EAA2E;AAC3E,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAE9D;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAM9D"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Default-value rendering for the schema builder — Lucid/Knex semantics.
3
+ *
4
+ * `defaultTo` quotes JS literals and emits raw SQL only when given a `RawSql`
5
+ * (the single raw-expression type atlas uses everywhere, incl. queries),
6
+ * produced in a migration by `this.now()` / `this.raw(...)`:
7
+ *
8
+ * t.text('status').defaultTo('new') // → DEFAULT 'new' (quoted literal)
9
+ * t.boolean('active').defaultTo(false) // → DEFAULT false
10
+ * t.integer('count').defaultTo(0) // → DEFAULT 0
11
+ * t.uuid('id').defaultTo(this.raw('gen_random_uuid()')) // → DEFAULT gen_random_uuid()
12
+ * t.timestamp('created_at').defaultTo(this.now()) // → DEFAULT NOW()/CURRENT_TIMESTAMP
13
+ *
14
+ * Before this, `defaultTo` wrote its argument verbatim, so a bare
15
+ * `defaultTo('new')` produced the invalid `DEFAULT new` and string defaults had
16
+ * to be hand-quoted (`defaultTo("'new'")`) — a footgun Lucid/Knex avoid.
17
+ */
18
+ import { RawSql } from "../query/QueryBuilder.js";
19
+ /**
20
+ * Render a `defaultTo` argument to the SQL fragment stored as the column
21
+ * default. Literals are quoted/escaped; a {@link RawSql} passes through verbatim.
22
+ */
23
+ export function renderDefaultValue(value) {
24
+ if (value instanceof RawSql)
25
+ return value.sql;
26
+ if (typeof value === "number")
27
+ return String(value);
28
+ if (typeof value === "boolean")
29
+ return value ? "true" : "false";
30
+ // String literal — single-quote and escape embedded quotes (SQL standard).
31
+ return `'${value.replace(/'/g, "''")}'`;
32
+ }
33
+ //# sourceMappingURL=raw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raw.js","sourceRoot":"","sources":["../../src/schema/raw.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAKlD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAmB;IACrD,IAAI,KAAK,YAAY,MAAM;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACpD,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAChE,2EAA2E;IAC3E,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;AACzC,CAAC"}
@@ -13,6 +13,17 @@
13
13
  * container hooks).
14
14
  */
15
15
  import type { AsyncDatabaseConnection } from "../adapters/NapiDbAdapter.js";
16
+ import { RawSql } from "../query/QueryBuilder.js";
17
+ /** The `db` singleton surface: the bound connection plus the AdonisJS-style `db.raw()` builder. */
18
+ export interface DbService extends AsyncDatabaseConnection {
19
+ /**
20
+ * Build a raw SQL expression — AdonisJS `db.raw()` / `Database.raw()`. Use it
21
+ * for query fragments and for column defaults that are SQL expressions:
22
+ *
23
+ * t.uuid('id').defaultTo(db.raw('gen_random_uuid()'))
24
+ */
25
+ raw(sql: string, params?: unknown[]): RawSql;
26
+ }
16
27
  /** @internal Bind the singleton (called by AtlasProvider). */
17
28
  export declare function setDb(connection: AsyncDatabaseConnection): void;
18
29
  /**
@@ -24,6 +35,6 @@ export declare function setDb(connection: AsyncDatabaseConnection): void;
24
35
  export declare function clearDb(connection: AsyncDatabaseConnection): void;
25
36
  /** @internal Read the singleton (or `undefined` pre-boot). */
26
37
  export declare function getDb(): AsyncDatabaseConnection | undefined;
27
- declare const db: AsyncDatabaseConnection;
38
+ declare const db: DbService;
28
39
  export default db;
29
40
  //# sourceMappingURL=db.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/services/db.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAI5E,8DAA8D;AAC9D,wBAAgB,KAAK,CAAC,UAAU,EAAE,uBAAuB,GAAG,IAAI,CAE/D;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,UAAU,EAAE,uBAAuB,GAAG,IAAI,CAEjE;AAED,8DAA8D;AAC9D,wBAAgB,KAAK,IAAI,uBAAuB,GAAG,SAAS,CAE3D;AAED,QAAA,MAAM,EAAE,EAAE,uBAaR,CAAC;AAEH,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/services/db.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAElD,mGAAmG;AACnG,MAAM,WAAW,SAAU,SAAQ,uBAAuB;IACzD;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;CAC7C;AAID,8DAA8D;AAC9D,wBAAgB,KAAK,CAAC,UAAU,EAAE,uBAAuB,GAAG,IAAI,CAE/D;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,UAAU,EAAE,uBAAuB,GAAG,IAAI,CAEjE;AAED,8DAA8D;AAC9D,wBAAgB,KAAK,IAAI,uBAAuB,GAAG,SAAS,CAE3D;AAED,QAAA,MAAM,EAAE,EAAE,SAiBR,CAAC;AAEH,eAAe,EAAE,CAAC"}
@@ -12,6 +12,7 @@
12
12
  * swap in a custom `AsyncDatabaseConnection` through the provider's
13
13
  * container hooks).
14
14
  */
15
+ import { RawSql } from "../query/QueryBuilder.js";
15
16
  let instance;
16
17
  /** @internal Bind the singleton (called by AtlasProvider). */
17
18
  export function setDb(connection) {
@@ -33,6 +34,10 @@ export function getDb() {
33
34
  }
34
35
  const db = new Proxy({}, {
35
36
  get(_target, prop) {
37
+ // `raw` is a pure builder (no connection needed) — available pre-boot too.
38
+ if (prop === "raw") {
39
+ return (sql, params = []) => new RawSql(sql, params);
40
+ }
36
41
  if (!instance) {
37
42
  throw new Error("[atlas] db singleton accessed before AtlasProvider.boot() ran. " +
38
43
  "Check that `@c9up/atlas/provider` is listed in your reamrc.ts " +
@@ -1 +1 @@
1
- {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/services/db.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,IAAI,QAA6C,CAAC;AAElD,8DAA8D;AAC9D,MAAM,UAAU,KAAK,CAAC,UAAmC;IACxD,QAAQ,GAAG,UAAU,CAAC;AACvB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,UAAmC;IAC1D,IAAI,QAAQ,KAAK,UAAU;QAAE,QAAQ,GAAG,SAAS,CAAC;AACnD,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,KAAK;IACpB,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,MAAM,EAAE,GAA4B,IAAI,KAAK,CAAC,EAA6B,EAAE;IAC5E,GAAG,CAAC,OAAO,EAAE,IAAI;QAChB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACd,iEAAiE;gBAChE,gEAAgE;gBAChE,+DAA+D;gBAC/D,aAAa,CACd,CAAC;QACH,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QACpD,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACnE,CAAC;CACD,CAAC,CAAC;AAEH,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/services/db.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAalD,IAAI,QAA6C,CAAC;AAElD,8DAA8D;AAC9D,MAAM,UAAU,KAAK,CAAC,UAAmC;IACxD,QAAQ,GAAG,UAAU,CAAC;AACvB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,UAAmC;IAC1D,IAAI,QAAQ,KAAK,UAAU;QAAE,QAAQ,GAAG,SAAS,CAAC;AACnD,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,KAAK;IACpB,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,MAAM,EAAE,GAAc,IAAI,KAAK,CAAC,EAAe,EAAE;IAChD,GAAG,CAAC,OAAO,EAAE,IAAI;QAChB,2EAA2E;QAC3E,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACpB,OAAO,CAAC,GAAW,EAAE,SAAoB,EAAE,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACd,iEAAiE;gBAChE,gEAAgE;gBAChE,+DAA+D;gBAC/D,aAAa,CACd,CAAC;QACH,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QACpD,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACnE,CAAC;CACD,CAAC,CAAC;AAEH,eAAe,EAAE,CAAC"}
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@c9up/atlas",
3
- "version": "0.1.13",
3
+ "version": "0.1.15",
4
4
  "description": "Atlas — Data Mapper ORM for the Ream framework",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -122,6 +122,18 @@ export interface AtlasDatabaseConfig extends ConnectionConfig {
122
122
  */
123
123
  table?: string;
124
124
  };
125
+ /**
126
+ * Boot-time schema verification. When set, atlas reconciles each listed
127
+ * model's `@Column` metadata against the LIVE database schema after boot and
128
+ * reports drift (typo'd / missing columns, type mismatches, unmapped NOT NULL
129
+ * columns). `mode: "throw"` (default) fails the boot on drift; `"warn"` logs
130
+ * and continues. Atlas has no global entity registry by design — list your
131
+ * models here (mirrors Lucid, where `ace` is pointed at your models dir).
132
+ */
133
+ verifySchema?: {
134
+ entities: ReadonlyArray<new (...args: unknown[]) => unknown>;
135
+ mode?: "throw" | "warn";
136
+ };
125
137
  }
126
138
 
127
139
  export default class AtlasProvider {
@@ -269,7 +281,23 @@ export default class AtlasProvider {
269
281
  }
270
282
  }
271
283
 
272
- async start() {}
284
+ async start() {
285
+ // Boot-time schema verification (opt-in via `database.verifySchema`).
286
+ // Runs AFTER boot so the default connection is open. Reconciles models
287
+ // against the live DB and throws/warns on drift before requests serve.
288
+ const config = this.app.config.get<AtlasDatabaseConfig>("database");
289
+ const verify = config?.verifySchema;
290
+ if (!verify || verify.entities.length === 0) return;
291
+ const db = this.#connections.get(this.#defaultName);
292
+ if (!db) return;
293
+ const [{ verifySchema }, { getAtlasDialect }] = await Promise.all([
294
+ import("./schema/SchemaCheck.js"),
295
+ import("./query/native.js"),
296
+ ]);
297
+ await verifySchema(verify.entities, db, getAtlasDialect(), {
298
+ mode: verify.mode,
299
+ });
300
+ }
273
301
  async ready() {}
274
302
 
275
303
  /** Normalize the config into a `{ name → ConnectionConfig }` map + default name. */
@@ -0,0 +1,62 @@
1
+ /**
2
+ * `atlas:check` console command — the Ream-idiomatic CLI for schema
3
+ * verification. Ream commands are plain `{ name, description, run }` objects
4
+ * registered in `reamrc.commands` and dispatched by the console kernel
5
+ * (`new Ignitor(...).console().handle(argv)`).
6
+ *
7
+ * Stays framework-agnostic: resolves the live connection + dialect from atlas's
8
+ * OWN service locators (`getDb` / `getAtlasDialect`), never importing
9
+ * `@c9up/ream`. The {@link AtlasCommand} shape structurally matches Ream's
10
+ * `Command` interface, so the console kernel accepts it without a type
11
+ * dependency in either direction.
12
+ */
13
+
14
+ import { getAtlasDialect } from "../query/native.js";
15
+ import { runSchemaCheck } from "../schema/SchemaCheck.js";
16
+ import { getDb } from "../services/db.js";
17
+
18
+ type Constructor = new (...args: unknown[]) => unknown;
19
+
20
+ /** Structural match of Ream's console `Command` (no `@c9up/ream` import). */
21
+ export interface AtlasCommand {
22
+ name: string;
23
+ description: string;
24
+ run(args: string[], flags: Record<string, string | boolean>): Promise<void>;
25
+ }
26
+
27
+ /**
28
+ * Build the `atlas:check` command for the given models. Register it in
29
+ * `reamrc.commands` (atlas has no global entity registry — list your models,
30
+ * as in Lucid). Run it via the console kernel; `--warn` reports drift without a
31
+ * non-zero exit (useful for an advisory CI step).
32
+ *
33
+ * @example
34
+ * // commands/atlas-check.ts
35
+ * import { schemaCheckCommand } from '@c9up/atlas'
36
+ * import { User } from '#models/user'
37
+ * export default schemaCheckCommand([User])
38
+ *
39
+ * // reamrc.ts → commands: [() => import('./commands/atlas-check.js')]
40
+ * // run: <console-entry> atlas:check
41
+ */
42
+ export function schemaCheckCommand(
43
+ entities: readonly Constructor[],
44
+ ): AtlasCommand {
45
+ return {
46
+ name: "atlas:check",
47
+ description: "Verify models match the live database schema",
48
+ async run(_args, flags) {
49
+ const db = getDb();
50
+ if (!db) {
51
+ console.error(
52
+ "[atlas:check] no database connection — is AtlasProvider registered?",
53
+ );
54
+ process.exitCode = 1;
55
+ return;
56
+ }
57
+ const code = await runSchemaCheck(entities, db, getAtlasDialect());
58
+ // `--warn` downgrades drift to advisory (exit 0); default fails CI.
59
+ if (code !== 0 && !flags.warn) process.exitCode = code;
60
+ },
61
+ };
62
+ }
package/src/index.ts CHANGED
@@ -18,6 +18,10 @@ export type { DatabaseConnection } from "./BaseRepository.js";
18
18
  export { BaseRepository } from "./BaseRepository.js";
19
19
  export { defineConfig } from "./config.js";
20
20
  export { configure } from "./configure.js";
21
+ export {
22
+ type AtlasCommand,
23
+ schemaCheckCommand,
24
+ } from "./console/schemaCheckCommand.js";
21
25
  export type {
22
26
  ColumnAdapter,
23
27
  ColumnMetadata,
@@ -95,6 +99,10 @@ export type {
95
99
  WhereOperator,
96
100
  } from "./query/QueryBuilder.js";
97
101
  export { QueryBuilder, RawSql } from "./query/QueryBuilder.js";
102
+ export {
103
+ type IntrospectedColumn,
104
+ introspectTable,
105
+ } from "./schema/introspect.js";
98
106
  export { Migration } from "./schema/Migration.js";
99
107
  export type {
100
108
  DatabaseAdapter,
@@ -103,8 +111,19 @@ export type {
103
111
  MigrationStatus,
104
112
  } from "./schema/MigrationRunner.js";
105
113
  export { MigrationRunner } from "./schema/MigrationRunner.js";
114
+ export type { DefaultValue } from "./schema/raw.js";
106
115
  export type { ColumnDefinition, ColumnType } from "./schema/SchemaBuilder.js";
107
116
  export { Schema, TableBuilder } from "./schema/SchemaBuilder.js";
117
+ export {
118
+ checkSchema,
119
+ formatSchemaFindings,
120
+ runSchemaCheck,
121
+ type SchemaFinding,
122
+ type SchemaFindingKind,
123
+ suggestColumn,
124
+ typesCompatible,
125
+ verifySchema,
126
+ } from "./schema/SchemaCheck.js";
108
127
  export {
109
128
  BaseSeeder,
110
129
  runSeederDirectory,
@@ -5,6 +5,7 @@
5
5
  */
6
6
 
7
7
  import type { AtlasDialect } from "../query/native.js";
8
+ import { RawSql } from "../query/QueryBuilder.js";
8
9
  import { Schema } from "./SchemaBuilder.js";
9
10
 
10
11
  /**
@@ -46,9 +47,9 @@ export abstract class Migration {
46
47
  /** Rollback the migration. */
47
48
  abstract down(): Promise<void> | void;
48
49
 
49
- /** Helper: raw SQL expression (for DEFAULT values). */
50
- raw(expression: string): string {
51
- return expression;
50
+ /** Helper: raw SQL expression for a column DEFAULT — emitted verbatim, not quoted. */
51
+ raw(expression: string): RawSql {
52
+ return new RawSql(expression);
52
53
  }
53
54
 
54
55
  /**
@@ -62,8 +63,10 @@ export abstract class Migration {
62
63
  * migrations — `NOW()` is not a recognised function there and the column
63
64
  * default would blow up at DDL compile time.
64
65
  */
65
- now(): string {
66
- return this.#dialect === "sqlite" ? "CURRENT_TIMESTAMP" : "NOW()";
66
+ now(): RawSql {
67
+ return new RawSql(
68
+ this.#dialect === "sqlite" ? "CURRENT_TIMESTAMP" : "NOW()",
69
+ );
67
70
  }
68
71
 
69
72
  /** Get the SQL statements generated by this migration. */