@wild-framework/database-drizzle 0.1.0 → 0.2.0

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.
package/dist/ddl.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Generate `CREATE TABLE IF NOT EXISTS` statements from a Drizzle schema
3
+ * object, so the database is ready to use the moment the app boots — no
4
+ * external migration tool needed for development and simple deployments.
5
+ *
6
+ * Covers the common SQLite column cases: scalar types, NOT NULL,
7
+ * PRIMARY KEY AUTOINCREMENT, UNIQUE, and literal DEFAULTs.
8
+ */
9
+ export declare function generateSqliteDdl(schema: Record<string, unknown>): string[];
10
+ //# sourceMappingURL=ddl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ddl.d.ts","sourceRoot":"","sources":["../src/ddl.ts"],"names":[],"mappings":"AAqBA;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAwB3E"}
package/dist/ddl.js ADDED
@@ -0,0 +1,73 @@
1
+ import { getTableConfig } from "drizzle-orm/sqlite-core";
2
+ /**
3
+ * Generate `CREATE TABLE IF NOT EXISTS` statements from a Drizzle schema
4
+ * object, so the database is ready to use the moment the app boots — no
5
+ * external migration tool needed for development and simple deployments.
6
+ *
7
+ * Covers the common SQLite column cases: scalar types, NOT NULL,
8
+ * PRIMARY KEY AUTOINCREMENT, UNIQUE, and literal DEFAULTs.
9
+ */
10
+ export function generateSqliteDdl(schema) {
11
+ const statements = [];
12
+ for (const table of Object.values(schema)) {
13
+ if (!table || typeof table !== "object")
14
+ continue;
15
+ let config;
16
+ try {
17
+ config = getTableConfig(table);
18
+ }
19
+ catch {
20
+ continue; // not a table (view, relation, …)
21
+ }
22
+ const columns = config.columns;
23
+ if (columns.length === 0)
24
+ continue;
25
+ const lines = columns.map((column) => ` ${columnSql(column)}`);
26
+ statements.push(`CREATE TABLE IF NOT EXISTS "${config.name}" (\n${lines.join(",\n")}\n);`);
27
+ }
28
+ return statements;
29
+ }
30
+ /** Render a single column definition for SQLite. */
31
+ function columnSql(column) {
32
+ const parts = [`"${column.name}"`, sqlType(column)];
33
+ if (column.primary) {
34
+ parts.push("PRIMARY KEY");
35
+ if (column.autoIncrement) {
36
+ parts.push("AUTOINCREMENT");
37
+ }
38
+ }
39
+ if (column.notNull) {
40
+ parts.push("NOT NULL");
41
+ }
42
+ if (column.isUnique) {
43
+ parts.push("UNIQUE");
44
+ }
45
+ const def = literalDefault(column);
46
+ if (def !== undefined) {
47
+ parts.push(`DEFAULT ${def}`);
48
+ }
49
+ return parts.join(" ");
50
+ }
51
+ function sqlType(column) {
52
+ return column.getSQLType?.() ?? "text";
53
+ }
54
+ /**
55
+ * Render a literal default, skipping function/SQL-expression defaults
56
+ * (which drizzle-kit migrations should own).
57
+ */
58
+ function literalDefault(column) {
59
+ if (!column.hasDefault)
60
+ return undefined;
61
+ const value = column.default;
62
+ if (value === null)
63
+ return "NULL";
64
+ if (typeof value === "number")
65
+ return String(value);
66
+ if (typeof value === "boolean")
67
+ return value ? "1" : "0";
68
+ if (typeof value === "string")
69
+ return `'${value.replace(/'/g, "''")}'`;
70
+ // Non-literal (SQL expression, function, …) — leave to migrations.
71
+ return undefined;
72
+ }
73
+ //# sourceMappingURL=ddl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ddl.js","sourceRoot":"","sources":["../src/ddl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAqBzD;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAA+B;IAC7D,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAElD,IAAI,MAA+C,CAAC;QACpD,IAAI,CAAC;YACD,MAAM,GAAG,cAAc,CAAC,KAA6C,CAGpE,CAAC;QACN,CAAC;QAAC,MAAM,CAAC;YACL,SAAS,CAAC,kCAAkC;QAChD,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAEnC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChE,UAAU,CAAC,IAAI,CAAC,+BAA+B,MAAM,CAAC,IAAI,QAAQ,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/F,CAAC;IAED,OAAO,UAAU,CAAC;AACtB,CAAC;AAED,oDAAoD;AACpD,SAAS,SAAS,CAAC,MAAkB;IACjC,MAAM,KAAK,GAAa,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAE9D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1B,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAChC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,OAAO,CAAC,MAAkB;IAC/B,OAAO,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,MAAM,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,MAAkB;IACtC,IAAI,CAAC,MAAM,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAEzC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC;IAC7B,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACpD,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACzD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;IAEvE,mEAAmE;IACnE,OAAO,SAAS,CAAC;AACrB,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { DatabaseDriver } from "@wild-framework/database";
1
+ import type { DatabaseDriver, SqlExecutor, Row } from "@wild-framework/database";
2
2
  import { type BetterSQLite3Database } from "drizzle-orm/better-sqlite3";
3
3
  /**
4
4
  * Configuration for the Drizzle driver.
@@ -8,14 +8,21 @@ export interface DrizzleConfig<TSchema extends Record<string, unknown>> {
8
8
  filename: string;
9
9
  /** Optional Drizzle schema object (tables). */
10
10
  schema?: TSchema;
11
+ /**
12
+ * Create tables from the schema at connect time (dev-friendly).
13
+ * Set false to rely on an external migration tool (e.g. drizzle-kit).
14
+ * Defaults to true.
15
+ */
16
+ autoCreate?: boolean;
11
17
  }
12
18
  /**
13
19
  * Drizzle ORM driver implementing `DatabaseDriver` from `@wild-framework/database`.
14
20
  *
15
21
  * Backed by better-sqlite3. The `db` getter returns the typed Drizzle
16
- * instance for full ORM queries.
22
+ * instance for full ORM queries. Also implements `SqlExecutor` so it can
23
+ * back the `MigrationRunner` for raw SQL migrations.
17
24
  */
18
- export declare class DrizzleDriver<TSchema extends Record<string, unknown>> implements DatabaseDriver {
25
+ export declare class DrizzleDriver<TSchema extends Record<string, unknown>> implements DatabaseDriver, SqlExecutor {
19
26
  private config;
20
27
  private sqlite;
21
28
  private drizzleDb;
@@ -23,6 +30,11 @@ export declare class DrizzleDriver<TSchema extends Record<string, unknown>> impl
23
30
  connect(): Promise<void>;
24
31
  close(): Promise<void>;
25
32
  isConnected(): boolean;
33
+ /** Run one or more `;`-separated SQL statements. */
34
+ exec(sql: string): Promise<void>;
35
+ /** Run a query and return its rows. */
36
+ all<T = Row>(sql: string): Promise<T[]>;
37
+ private requireSqlite;
26
38
  /**
27
39
  * The typed Drizzle instance for queries.
28
40
  *
@@ -1 +1 @@
1
- {"version":3,"file":"drizzle-driver.d.ts","sourceRoot":"","sources":["../src/drizzle-driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAW,KAAK,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAGjF;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAClE,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;GAKG;AACH,qBAAa,aAAa,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAE,YAAW,cAAc;IAI7E,OAAO,CAAC,MAAM;IAH1B,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,SAAS,CAA+C;gBAE5C,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC;IAE5C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAKxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B,WAAW,IAAI,OAAO;IAItB;;;;OAIG;IACH,IAAI,EAAE,IAAI,qBAAqB,CAAC,OAAO,CAAC,CAKvC;CACJ"}
1
+ {"version":3,"file":"drizzle-driver.d.ts","sourceRoot":"","sources":["../src/drizzle-driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AACjF,OAAO,EAAW,KAAK,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAIjF;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAClE,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;GAMG;AACH,qBAAa,aAAa,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAC9D,YAAW,cAAc,EAAE,WAAW;IAK1B,OAAO,CAAC,MAAM;IAH1B,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,SAAS,CAA+C;gBAE5C,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC;IAE5C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAYxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B,WAAW,IAAI,OAAO;IAQtB,oDAAoD;IAC9C,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAItC,uCAAuC;IACjC,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAI7C,OAAO,CAAC,aAAa;IAOrB;;;;OAIG;IACH,IAAI,EAAE,IAAI,qBAAqB,CAAC,OAAO,CAAC,CAKvC;CACJ"}
@@ -1,10 +1,12 @@
1
1
  import { drizzle } from "drizzle-orm/better-sqlite3";
2
2
  import Database from "better-sqlite3";
3
+ import { generateSqliteDdl } from "./ddl.js";
3
4
  /**
4
5
  * Drizzle ORM driver implementing `DatabaseDriver` from `@wild-framework/database`.
5
6
  *
6
7
  * Backed by better-sqlite3. The `db` getter returns the typed Drizzle
7
- * instance for full ORM queries.
8
+ * instance for full ORM queries. Also implements `SqlExecutor` so it can
9
+ * back the `MigrationRunner` for raw SQL migrations.
8
10
  */
9
11
  export class DrizzleDriver {
10
12
  config;
@@ -16,6 +18,12 @@ export class DrizzleDriver {
16
18
  async connect() {
17
19
  this.sqlite = new Database(this.config.filename);
18
20
  this.drizzleDb = drizzle(this.sqlite, { schema: this.config.schema });
21
+ // Create tables from the schema so the DB is ready immediately.
22
+ if (this.config.autoCreate !== false && this.config.schema) {
23
+ for (const statement of generateSqliteDdl(this.config.schema)) {
24
+ this.sqlite.exec(statement);
25
+ }
26
+ }
19
27
  }
20
28
  async close() {
21
29
  this.sqlite?.close();
@@ -25,6 +33,23 @@ export class DrizzleDriver {
25
33
  isConnected() {
26
34
  return this.drizzleDb !== null;
27
35
  }
36
+ // -------------------------------------------------------------------
37
+ // SqlExecutor — raw SQL for migrations and ad-hoc statements
38
+ // -------------------------------------------------------------------
39
+ /** Run one or more `;`-separated SQL statements. */
40
+ async exec(sql) {
41
+ this.requireSqlite().exec(sql);
42
+ }
43
+ /** Run a query and return its rows. */
44
+ async all(sql) {
45
+ return this.requireSqlite().prepare(sql).all();
46
+ }
47
+ requireSqlite() {
48
+ if (!this.sqlite) {
49
+ throw new Error("Database is not connected. Call connect() first.");
50
+ }
51
+ return this.sqlite;
52
+ }
28
53
  /**
29
54
  * The typed Drizzle instance for queries.
30
55
  *
@@ -1 +1 @@
1
- {"version":3,"file":"drizzle-driver.js","sourceRoot":"","sources":["../src/drizzle-driver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAA8B,MAAM,4BAA4B,CAAC;AACjF,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAYtC;;;;;GAKG;AACH,MAAM,OAAO,aAAa;IAIF;IAHZ,MAAM,GAA6B,IAAI,CAAC;IACxC,SAAS,GAA0C,IAAI,CAAC;IAEhE,YAAoB,MAA8B;QAA9B,WAAM,GAAN,MAAM,CAAwB;IAAG,CAAC;IAEtD,KAAK,CAAC,OAAO;QACT,IAAI,CAAC,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,KAAK;QACP,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,WAAW;QACP,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;IACnC,CAAC;IAED;;;;OAIG;IACH,IAAI,EAAE;QACF,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;CACJ"}
1
+ {"version":3,"file":"drizzle-driver.js","sourceRoot":"","sources":["../src/drizzle-driver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAA8B,MAAM,4BAA4B,CAAC;AACjF,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAkB7C;;;;;;GAMG;AACH,MAAM,OAAO,aAAa;IAMF;IAHZ,MAAM,GAA6B,IAAI,CAAC;IACxC,SAAS,GAA0C,IAAI,CAAC;IAEhE,YAAoB,MAA8B;QAA9B,WAAM,GAAN,MAAM,CAAwB;IAAG,CAAC;IAEtD,KAAK,CAAC,OAAO;QACT,IAAI,CAAC,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAEtE,gEAAgE;QAChE,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACzD,KAAK,MAAM,SAAS,IAAI,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAChC,CAAC;QACL,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK;QACP,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,WAAW;QACP,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;IACnC,CAAC;IAED,sEAAsE;IACtE,6DAA6D;IAC7D,sEAAsE;IAEtE,oDAAoD;IACpD,KAAK,CAAC,IAAI,CAAC,GAAW;QAClB,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,uCAAuC;IACvC,KAAK,CAAC,GAAG,CAAU,GAAW;QAC1B,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAS,CAAC;IAC1D,CAAC;IAEO,aAAa;QACjB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACH,IAAI,EAAE;QACF,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;CACJ"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export { DrizzleDriver } from "./drizzle-driver.js";
2
2
  export type { DrizzleConfig } from "./drizzle-driver.js";
3
3
  export { DrizzleProvider } from "./provider.js";
4
+ export { generateSqliteDdl } from "./ddl.js";
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  export { DrizzleDriver } from "./drizzle-driver.js";
2
2
  export { DrizzleProvider } from "./provider.js";
3
+ export { generateSqliteDdl } from "./ddl.js";
3
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { Provider, Application } from "@wild-framework/core";
2
+ import { type Migration } from "@wild-framework/database";
2
3
  /**
3
4
  * Registers a Drizzle-backed database with the application.
4
5
  *
@@ -7,15 +8,21 @@ import type { Provider, Application } from "@wild-framework/core";
7
8
  * ```ts
8
9
  * DrizzleProvider.schema = { users };
9
10
  * DrizzleProvider.filename = "app.db";
11
+ * DrizzleProvider.migrations = loadMigrations("./migrations");
10
12
  * ```
11
13
  *
12
- * Connects on boot, closes on shutdown.
14
+ * Connects on boot, creates tables from the schema, applies pending
15
+ * migrations, and closes on shutdown.
13
16
  */
14
17
  export declare class DrizzleProvider implements Provider {
15
18
  /** Drizzle schema object (tables). */
16
19
  static schema: Record<string, unknown> | undefined;
17
20
  /** SQLite file path. Defaults to in-memory. */
18
21
  static filename: string;
22
+ /** Create tables from the schema at boot. Defaults to true. */
23
+ static autoCreate: boolean;
24
+ /** Migrations to apply (in order) after connecting. */
25
+ static migrations: Migration[];
19
26
  register(app: Application): void;
20
27
  boot(app: Application): Promise<void>;
21
28
  shutdown(app: Application): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAKlE;;;;;;;;;;;GAWG;AACH,qBAAa,eAAgB,YAAW,QAAQ;IAC5C,sCAAsC;IACtC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACnD,+CAA+C;IAC/C,MAAM,CAAC,QAAQ,SAAc;IAE7B,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAc1B,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrC,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAIlD"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAElE,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAGrF;;;;;;;;;;;;;GAaG;AACH,qBAAa,eAAgB,YAAW,QAAQ;IAC5C,sCAAsC;IACtC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACnD,+CAA+C;IAC/C,MAAM,CAAC,QAAQ,SAAc;IAC7B,+DAA+D;IAC/D,MAAM,CAAC,UAAU,UAAQ;IACzB,uDAAuD;IACvD,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,CAAM;IAEpC,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAe1B,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAarC,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAIlD"}
package/dist/provider.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Container } from "@wild-framework/container";
2
- import { Database } from "@wild-framework/database";
2
+ import { Database, MigrationRunner } from "@wild-framework/database";
3
3
  import { DrizzleDriver } from "./drizzle-driver.js";
4
4
  /**
5
5
  * Registers a Drizzle-backed database with the application.
@@ -9,20 +9,27 @@ import { DrizzleDriver } from "./drizzle-driver.js";
9
9
  * ```ts
10
10
  * DrizzleProvider.schema = { users };
11
11
  * DrizzleProvider.filename = "app.db";
12
+ * DrizzleProvider.migrations = loadMigrations("./migrations");
12
13
  * ```
13
14
  *
14
- * Connects on boot, closes on shutdown.
15
+ * Connects on boot, creates tables from the schema, applies pending
16
+ * migrations, and closes on shutdown.
15
17
  */
16
18
  export class DrizzleProvider {
17
19
  /** Drizzle schema object (tables). */
18
20
  static schema;
19
21
  /** SQLite file path. Defaults to in-memory. */
20
22
  static filename = ":memory:";
23
+ /** Create tables from the schema at boot. Defaults to true. */
24
+ static autoCreate = true;
25
+ /** Migrations to apply (in order) after connecting. */
26
+ static migrations = [];
21
27
  register(app) {
22
28
  const container = app.resolve(Container);
23
29
  const config = {
24
30
  filename: DrizzleProvider.filename,
25
31
  schema: DrizzleProvider.schema,
32
+ autoCreate: DrizzleProvider.autoCreate,
26
33
  };
27
34
  const driver = new DrizzleDriver(config);
28
35
  const database = new Database(driver);
@@ -31,6 +38,13 @@ export class DrizzleProvider {
31
38
  async boot(app) {
32
39
  const database = app.resolve(Database);
33
40
  await database.connect();
41
+ if (DrizzleProvider.migrations.length > 0) {
42
+ const driver = database.driver;
43
+ const applied = await new MigrationRunner(driver).migrate(DrizzleProvider.migrations);
44
+ if (applied.length > 0) {
45
+ console.log(`[drizzle] applied ${applied.length} migration(s): ${applied.join(", ")}`);
46
+ }
47
+ }
34
48
  }
35
49
  async shutdown(app) {
36
50
  const database = app.resolve(Database);
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,aAAa,EAAsB,MAAM,qBAAqB,CAAC;AAExE;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,eAAe;IACxB,sCAAsC;IACtC,MAAM,CAAC,MAAM,CAAsC;IACnD,+CAA+C;IAC/C,MAAM,CAAC,QAAQ,GAAG,UAAU,CAAC;IAE7B,QAAQ,CAAC,GAAgB;QACrB,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEzC,MAAM,MAAM,GAA2C;YACnD,QAAQ,EAAE,eAAe,CAAC,QAAQ;YAClC,MAAM,EAAE,eAAe,CAAC,MAAM;SACjC,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAEtC,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAgB;QACvB,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAW,QAAQ,CAAC,CAAC;QACjD,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAgB;QAC3B,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAW,QAAQ,CAAC,CAAC;QACjD,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC"}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAkB,MAAM,0BAA0B,CAAC;AACrF,OAAO,EAAE,aAAa,EAAsB,MAAM,qBAAqB,CAAC;AAExE;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,eAAe;IACxB,sCAAsC;IACtC,MAAM,CAAC,MAAM,CAAsC;IACnD,+CAA+C;IAC/C,MAAM,CAAC,QAAQ,GAAG,UAAU,CAAC;IAC7B,+DAA+D;IAC/D,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,uDAAuD;IACvD,MAAM,CAAC,UAAU,GAAgB,EAAE,CAAC;IAEpC,QAAQ,CAAC,GAAgB;QACrB,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEzC,MAAM,MAAM,GAA2C;YACnD,QAAQ,EAAE,eAAe,CAAC,QAAQ;YAClC,MAAM,EAAE,eAAe,CAAC,MAAM;YAC9B,UAAU,EAAE,eAAe,CAAC,UAAU;SACzC,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAEtC,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAgB;QACvB,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAW,QAAQ,CAAC,CAAC;QACjD,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QAEzB,IAAI,eAAe,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAgD,CAAC;YACzE,MAAM,OAAO,GAAG,MAAM,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YACtF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,MAAM,kBAAkB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3F,CAAC;QACL,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAgB;QAC3B,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAW,QAAQ,CAAC,CAAC;QACjD,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wild-framework/database-drizzle",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -33,9 +33,9 @@
33
33
  "dependencies": {
34
34
  "drizzle-orm": "^0.38.0",
35
35
  "better-sqlite3": "^11.0.0",
36
- "@wild-framework/container": "0.1.0",
37
- "@wild-framework/database": "0.1.0",
38
- "@wild-framework/core": "0.1.0"
36
+ "@wild-framework/core": "0.2.0",
37
+ "@wild-framework/container": "0.2.0",
38
+ "@wild-framework/database": "0.2.0"
39
39
  },
40
40
  "devDependencies": {
41
41
  "@types/better-sqlite3": "^7.6.0"