nanodb-orm 0.0.7 → 0.0.8

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/README.md CHANGED
@@ -19,6 +19,11 @@ A lightweight ORM wrapper for Drizzle ORM with automatic migrations, schema intr
19
19
  npm install nanodb-orm
20
20
  ```
21
21
 
22
+ ## Monorepo
23
+
24
+ This repo is managed as an npm workspace with core + plugin packages.
25
+ See `PACKAGES.md` for layout and cross-package commands.
26
+
22
27
  > **Important:** All interactions should go through `nanodb-orm`.
23
28
  > Use `nanodb-orm` exports for schema, queries, and utilities instead of importing from Drizzle directly.
24
29
 
@@ -28,6 +33,9 @@ Optional plugins:
28
33
  npm install @nanodb-orm/plugin-timestamps @nanodb-orm/plugin-soft-delete @nanodb-orm/plugin-logger
29
34
  ```
30
35
 
36
+ > Plugin preview rule: multi-plugin mode requires `preview: { deterministicPluginOrdering: true }`.
37
+ > Without this preview flag, `createDatabase()` accepts only one plugin.
38
+
31
39
  Preview features: embedded replicas (opt-in via config switch).
32
40
 
33
41
  ## CLI
@@ -207,7 +215,9 @@ const db = await createDatabase({
207
215
  autoMigrate: true, // default: true
208
216
  dropTables: false, // default: false
209
217
  },
210
- plugins: [auditPlugin, validationPlugin], // optional
218
+ useSingletonConnection: false, // default: false
219
+ plugins: [auditPlugin], // optional
220
+ preview: { deterministicPluginOrdering: true }, // optional preview for multi-plugin mode
211
221
  });
212
222
  ```
213
223
 
@@ -223,6 +233,7 @@ await db.sync(); // Sync with Turso (if remote)
223
233
  await db.reset(); // Drop all, recreate, reseed
224
234
  await db.seed(); // Re-seed data
225
235
  await db.clearData(); // Delete all data (keep tables)
236
+ await db.dispose(); // Release in-memory context and non-singleton client
226
237
  ```
227
238
 
228
239
  ### Schema Introspection (from `db.schema`)
@@ -364,14 +375,25 @@ import { queryLogger } from '@nanodb-orm/plugin-logger';
364
375
 
365
376
  const db = await createDatabase({
366
377
  tables: { users, posts },
367
- plugins: [
368
- timestamps(), // Auto createdAt/updatedAt
369
- queryLogger({ level: 'info' }), // SQL logging with timing
370
- softDelete({ tables: ['posts'] }), // Soft delete for posts
371
- ],
378
+ plugins: [timestamps()],
379
+ });
380
+ ```
381
+
382
+ To use multiple plugins, enable deterministic ordering preview:
383
+
384
+ ```typescript
385
+ const db = await createDatabase({
386
+ tables: { users, posts },
387
+ plugins: [queryLogger(), softDelete(), timestamps()],
388
+ preview: { deterministicPluginOrdering: true },
372
389
  });
373
390
  ```
374
391
 
392
+ Ordering rules in preview mode:
393
+ - lower `plugin.order` runs first (default `0`)
394
+ - ties are sorted by `plugin.name` (ascending)
395
+ - final tie-breaker is declaration order in the `plugins` array
396
+
375
397
  | Package | Function | Description |
376
398
  |---------|----------|-------------|
377
399
  | `@nanodb-orm/plugin-timestamps` | `timestamps()` | Auto-add `createdAt` / `updatedAt` |
@@ -414,6 +436,7 @@ import { NanoPlugin } from 'nanodb-orm';
414
436
 
415
437
  const myPlugin: NanoPlugin = {
416
438
  name: 'my-plugin',
439
+ order: 0, // optional execution priority (lower runs earlier)
417
440
 
418
441
  // Lifecycle
419
442
  install: (db) => db, // Modify db instance
@@ -471,18 +494,17 @@ const validationPlugin: NanoPlugin = {
471
494
  },
472
495
  };
473
496
 
474
- // Use plugins
497
+ // Use a plugin (temporary one-plugin limit)
475
498
  const db = await createDatabase({
476
499
  tables,
477
- plugins: [auditPlugin, slugPlugin, validationPlugin],
500
+ plugins: [auditPlugin],
478
501
  });
479
502
 
480
503
  // Hooks run automatically
481
- await db.insert(posts).values({ title: 'My Post' }); // slug auto-generated
482
- await db.insert(users).values({ email: 'invalid' }); // throws error
504
+ await db.insert(posts).values({ title: 'My Post' });
483
505
 
484
506
  // Check loaded plugins
485
- db.plugins.list(); // ['audit', 'slug', 'validation']
507
+ db.plugins.list(); // ['audit']
486
508
  ```
487
509
 
488
510
  ## Best Practices
@@ -720,7 +742,7 @@ Error output is clean and actionable:
720
742
  │ Column "email" does not exist
721
743
  │ Table: users
722
744
  │ Operation: seed
723
- │ Detail: Row data: {"name":"Alice","email":"alice@example.com"}
745
+ │ Detail: Failed seed columns: name, email
724
746
  └────────────────────────────────────────────────
725
747
  ```
726
748
 
@@ -7,7 +7,7 @@ export interface ConnectionOverride {
7
7
  databasePath?: string;
8
8
  }
9
9
  /**
10
- * Thread-safe singleton database connection manager.
10
+ * Database connection factory with optional singleton caching.
11
11
  * Supports both Turso (remote) and local SQLite databases.
12
12
  *
13
13
  * Environment variables:
@@ -5,7 +5,7 @@ const libsql_1 = require("drizzle-orm/libsql");
5
5
  const client_1 = require("@libsql/client");
6
6
  const config_1 = require("./config");
7
7
  /**
8
- * Thread-safe singleton database connection manager.
8
+ * Database connection factory with optional singleton caching.
9
9
  * Supports both Turso (remote) and local SQLite databases.
10
10
  *
11
11
  * Environment variables:
package/dist/init.d.ts CHANGED
@@ -87,6 +87,8 @@ export type NanoDatabase<S extends Schema> = LibSQLDatabase<S> & {
87
87
  plugins: PluginUtils;
88
88
  /** Hook system */
89
89
  hooks: Hooks;
90
+ /** Release in-memory nanodb context state */
91
+ dispose: () => Promise<void>;
90
92
  };
91
93
  /**
92
94
  * Configuration for createDatabase().
@@ -99,8 +101,21 @@ export interface CreateDatabaseConfig<S extends Schema = Schema> extends SchemaD
99
101
  forceLocal?: boolean;
100
102
  databasePath?: string;
101
103
  };
104
+ /** Reuse process-wide singleton connection (default: false) */
105
+ useSingletonConnection?: boolean;
102
106
  /** Plugins to extend database functionality */
103
107
  plugins?: NanoPlugin[];
108
+ /** Preview features */
109
+ preview?: {
110
+ /** Enables preview-gated features such as replicated database mode */
111
+ enabled?: true;
112
+ /**
113
+ * Enable deterministic plugin ordering for multi-plugin setups.
114
+ * When enabled, plugins are sorted by `order` (asc), then `name` (asc),
115
+ * then declaration position as a final tiebreaker.
116
+ */
117
+ deterministicPluginOrdering?: boolean;
118
+ };
104
119
  }
105
120
  declare const HOOK_TYPES: readonly ["beforeInsert", "afterInsert", "beforeUpdate", "afterUpdate", "beforeDelete", "afterDelete", "beforeQuery", "afterQuery"];
106
121
  type HookType = typeof HOOK_TYPES[number];
@@ -140,5 +155,5 @@ export declare function createDatabase<S extends Schema>(config: CreateDatabaseC
140
155
  *
141
156
  * @internal
142
157
  */
143
- export declare function initializeDatabase<S extends Schema>(schemaData: SchemaData<S>): void;
158
+ export declare function initializeDatabase<S extends Schema>(schemaData: SchemaData<S>, contextId?: string): void;
144
159
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../init.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,MAAM,EAEN,UAAU,EACV,eAAe,EACf,UAAU,EAIV,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,aAAa,EACd,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC;AAMxD;;GAEG;AACH,MAAM,WAAW,KAAK;IACpB,YAAY,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;IAC/C,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;IAC5D,YAAY,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;IAC/C,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;IAC5D,YAAY,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;IAC/C,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;IAC5D,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;IAC9C,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;IAC3D,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACnE,OAAO,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/B,GAAG,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,MAAM;IAC3C,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;IAC1B,wCAAwC;IACxC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,aAAa,CAAC;IAC3C,mCAAmC;IACnC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,MAAM,EAAE,CAAC;IACxC,uCAAuC;IACvC,QAAQ,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC1C,4BAA4B;IAC5B,KAAK,EAAE,MAAM;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,YAAY,EAAE,aAAa,EAAE,CAAA;KAAE,CAAC;IAC1F,wCAAwC;IACxC,aAAa,EAAE,MAAM,KAAK,CAAC;QACzB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,qBAAqB;IACrB,GAAG,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,uCAAuC;IACvC,QAAQ,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC1C,+BAA+B;IAC/B,WAAW,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACrD;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,kCAAkC;IAClC,IAAI,EAAE,MAAM,MAAM,EAAE,CAAC;CACtB;AAED;;;;GAIG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG;IAC/D,mBAAmB;IACnB,WAAW,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;IACxC,iCAAiC;IACjC,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,+BAA+B;IAC/B,IAAI,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;IAChC,4CAA4C;IAC5C,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,uBAAuB;IACvB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,qBAAqB;IACrB,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,qCAAqC;IACrC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,0BAA0B;IAC1B,UAAU,EAAE,cAAc,CAAC;IAC3B,wBAAwB;IACxB,OAAO,EAAE,WAAW,CAAC;IACrB,kBAAkB;IAClB,KAAK,EAAE,KAAK,CAAC;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,UAAU,CAAC,CAAC,CAAC;IACpF,wDAAwD;IACxD,UAAU,CAAC,EAAE;QACX,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,+CAA+C;IAC/C,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;CACxB;AAMD,QAAA,MAAM,UAAU,qIAKN,CAAC;AAEX,KAAK,QAAQ,GAAG,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;AA8D1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,cAAc,CAAC,CAAC,SAAS,MAAM,EACnD,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAC9B,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAuM1B;AAaD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAuBpF"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../init.ts"],"names":[],"mappings":"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"}