edinburgh 0.3.0 → 0.4.2

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.
@@ -1,8 +1,26 @@
1
- import * as olmdb from "olmdb";
2
- import { DatabaseError } from "olmdb";
1
+ import { DatabaseError } from "olmdb/lowlevel";
2
+ import { AsyncLocalStorage } from "node:async_hooks";
3
3
  import { TypeWrapper, identifier } from "./types.js";
4
+ import { scheduleInit } from "./edinburgh.js";
5
+ export const txnStorage = new AsyncLocalStorage();
6
+ const PREVENT_PERSIST_DESCRIPTOR = {
7
+ get() {
8
+ throw new DatabaseError("Operation not allowed after preventPersist()", "NO_PERSIST");
9
+ },
10
+ };
11
+ /**
12
+ * Returns the current transaction from AsyncLocalStorage.
13
+ * Throws if called outside a transact() callback.
14
+ * @internal
15
+ */
16
+ export function currentTxn() {
17
+ const txn = txnStorage.getStore();
18
+ if (!txn)
19
+ throw new DatabaseError("No active transaction. Operations must be performed within a transact() callback.", 'NO_TRANSACTION');
20
+ return txn;
21
+ }
4
22
  import { PrimaryIndex } from "./indexes.js";
5
- import { addErrorPath, logLevel, tryDelayedInits, delayedInits } from "./utils.js";
23
+ import { addErrorPath, logLevel, dbGet, hashBytes } from "./utils.js";
6
24
  /**
7
25
  * Create a field definition for a model property.
8
26
  *
@@ -30,14 +48,6 @@ export function field(type, options = {}) {
30
48
  }
31
49
  // Model registration and initialization
32
50
  export const modelRegistry = {};
33
- export function resetModelCaches() {
34
- for (const model of Object.values(modelRegistry)) {
35
- for (const index of model._secondaries || []) {
36
- index._cachedIndexId = undefined;
37
- }
38
- delete model._primary?._cachedIndexId;
39
- }
40
- }
41
51
  function isObjectEmpty(obj) {
42
52
  for (let _ of Object.keys(obj)) {
43
53
  return false;
@@ -65,18 +75,19 @@ export function registerModel(MyModel) {
65
75
  const MockModel = getMockModel(MyModel);
66
76
  // Copy own static methods/properties
67
77
  for (const name of Object.getOwnPropertyNames(MyModel)) {
68
- if (name !== 'length' && name !== 'prototype' && name !== 'name' && name !== 'mock') {
78
+ if (name !== 'length' && name !== 'prototype' && name !== 'name' && name !== 'mock' && name !== 'override') {
69
79
  MockModel[name] = MyModel[name];
70
80
  }
71
81
  }
72
- MockModel.tableName ||= MyModel.name; // Set the table name to the class name if not already set
82
+ MockModel.tableName ||= MyModel.name;
73
83
  // Register the constructor by name
74
- if (MockModel.tableName in modelRegistry)
75
- throw new DatabaseError(`Model with table name '${MockModel.tableName}' already registered`, 'INIT_ERROR');
84
+ if (MockModel.tableName in modelRegistry) {
85
+ if (!MyModel.override) {
86
+ throw new DatabaseError(`Model with table name '${MockModel.tableName}' already registered`, 'INIT_ERROR');
87
+ }
88
+ delete modelRegistry[MockModel.tableName];
89
+ }
76
90
  modelRegistry[MockModel.tableName] = MockModel;
77
- // Attempt to instantiate the class and gather field metadata
78
- delayedInits.add(MyModel);
79
- tryDelayedInits();
80
91
  return MockModel;
81
92
  }
82
93
  export function getMockModel(OrgModel) {
@@ -85,16 +96,14 @@ export function getMockModel(OrgModel) {
85
96
  return OrgModel;
86
97
  if (AnyOrgModel._mock)
87
98
  return AnyOrgModel._mock;
88
- const name = OrgModel.tableName || OrgModel.name;
89
- const MockModel = function (initial) {
90
- if (delayedInits.has(this.constructor)) {
91
- throw new DatabaseError("Cannot instantiate while linked models haven't been registered yet", 'INIT_ERROR');
92
- }
93
- if (initial && !isObjectEmpty(initial)) {
99
+ const MockModel = function (initial, txn = currentTxn()) {
100
+ // This constructor should only be called when the user does 'new Model'. We'll bypass this when
101
+ // loading objects. Add to 'instances', so the object will be saved.
102
+ this._txn = txn;
103
+ txn.instances.add(this);
104
+ if (initial) {
94
105
  Object.assign(this, initial);
95
106
  }
96
- const instances = olmdb.getTransactionData(INSTANCES_SYMBOL);
97
- instances.add(this);
98
107
  };
99
108
  // We want .constructor to point at our fake constructor function.
100
109
  OrgModel.prototype.constructor = MockModel;
@@ -102,13 +111,13 @@ export function getMockModel(OrgModel) {
102
111
  Object.setPrototypeOf(MockModel, Object.getPrototypeOf(OrgModel));
103
112
  MockModel.prototype = OrgModel.prototype;
104
113
  MockModel._isMock = true;
114
+ MockModel._original = OrgModel;
105
115
  AnyOrgModel._mock = MockModel;
116
+ scheduleInit();
106
117
  return MockModel;
107
118
  }
108
119
  // Model base class and related symbols/state
109
120
  const INIT_INSTANCE_SYMBOL = Symbol();
110
- /** @internal Symbol used to attach modified instances to running transaction */
111
- export const INSTANCES_SYMBOL = Symbol('instances');
112
121
  /**
113
122
  * Base class for all database models in the Edinburgh ORM.
114
123
  *
@@ -116,19 +125,49 @@ export const INSTANCES_SYMBOL = Symbol('instances');
116
125
  * change tracking, and relationship management. All model classes should extend
117
126
  * this base class and be decorated with `@registerModel`.
118
127
  *
128
+ * ### Schema Evolution
129
+ *
130
+ * Edinburgh tracks the schema version of each model automatically. When you add, remove, or
131
+ * change the types of fields, or add/remove indexes, Edinburgh detects the new schema version.
132
+ *
133
+ * **Lazy migration:** Changes to non-key field values are migrated lazily, when a row with an
134
+ * old schema version is read from disk, it is deserialized using the old schema and optionally
135
+ * transformed by the static `migrate()` function. This happens transparently on every read
136
+ * and requires no downtime or batch processing.
137
+ *
138
+ * **Batch migration (via `npx migrate-edinburgh` or `runMigration()`):** Certain schema changes
139
+ * require an explicit migration run:
140
+ * - Adding or removing secondary/unique indexes
141
+ * - Changing the fields or types of an existing index
142
+ * - A `migrate()` function that changes values used in secondary index fields
143
+ *
144
+ * The batch migration tool populates new indexes, deletes orphaned ones, and updates index
145
+ * entries whose values were changed by `migrate()`. It does *not* rewrite primary data rows
146
+ * (lazy migration handles that).
147
+ *
148
+ * ### Lifecycle Hooks
149
+ *
150
+ * - **`static migrate(record)`**: Called when deserializing rows written with an older schema
151
+ * version. Receives a plain record object; mutate it in-place to match the current schema.
152
+ * See {@link Model.migrate}.
153
+ *
154
+ * - **`preCommit()`**: Called on each modified instance right before the transaction commits.
155
+ * Useful for computing derived fields, enforcing cross-field invariants, or creating related
156
+ * instances. See {@link Model.preCommit}.
157
+ *
119
158
  * @template SUB - The concrete model subclass (for proper typing).
120
159
  *
121
160
  * @example
122
161
  * ```typescript
123
162
  * ⁣@E.registerModel
124
163
  * class User extends E.Model<User> {
125
- * static pk = E.index(User, ["id"], "primary");
164
+ * static pk = E.primary(User, "id");
126
165
  *
127
166
  * id = E.field(E.identifier);
128
167
  * name = E.field(E.string);
129
168
  * email = E.field(E.string);
130
169
  *
131
- * static byEmail = E.index(User, "email", "unique");
170
+ * static byEmail = E.unique(User, "email");
132
171
  * }
133
172
  * ```
134
173
  */
@@ -138,6 +177,8 @@ export class Model {
138
177
  static _secondaries;
139
178
  /** The database table name (defaults to class name). */
140
179
  static tableName;
180
+ /** When true, registerModel replaces an existing model with the same tableName. */
181
+ static override;
141
182
  /** Field configuration metadata. */
142
183
  static fields;
143
184
  /*
@@ -147,181 +188,191 @@ export class Model {
147
188
  */
148
189
  /**
149
190
  * @internal
150
- * - !_oldValues: New instance, not yet saved.
151
- * - _oldValues && _primaryKey: Loaded (possibly only partial, still lazy) from disk, _oldValues contains (partial) old values
191
+ * - _oldValues===undefined: New instance, not yet saved.
192
+ * - _oldValues===null: Instance is to be deleted.
193
+ * - _oldValues is an object: Loaded (possibly only partial, still lazy) from disk, _oldValues contains (partial) old values
152
194
  */
153
195
  _oldValues;
154
196
  _primaryKey;
155
- /**
156
- * This property can be used in `setOnSave` callbacks to determine how a model instance has changed.
157
- * If the value is undefined, the instance has been created. If it's "deleted" the instance has
158
- * been deleted. If its an object, the instance has been modified and the object contains the old values.
159
- *
160
- * Note: this property should **not** be accessed *during* a `transact()` -- it's state is an implementation
161
- * detail that may change semantics at any minor release.
162
- */
163
- changed;
164
- // Reference the static `fields` property; the mock constructor copies it here for performance
165
- _fields;
197
+ _primaryKeyHash;
198
+ _txn;
166
199
  constructor(initial = {}) {
167
200
  // This constructor will only be called once, from `initModels`. All other instances will
168
201
  // be created by the 'fake' constructor. The typing for `initial` *is* important though.
169
- if (initial !== INIT_INSTANCE_SYMBOL) {
170
- throw new DatabaseError("The model needs a @registerModel decorator", 'INIT_ERROR');
171
- }
202
+ if (initial === INIT_INSTANCE_SYMBOL)
203
+ return;
204
+ throw new DatabaseError("The model needs a @registerModel decorator", 'INIT_ERROR');
172
205
  }
173
- static _delayedInit() {
206
+ static async _delayedInit(cleared) {
174
207
  const MockModel = getMockModel(this);
175
- // Create an instance (the only one to ever exist) of the actual class,
176
- // in order to gather field config data.
177
- let instance;
178
- try {
179
- instance = new this(INIT_INSTANCE_SYMBOL);
180
- }
181
- catch (e) {
182
- if (!(e instanceof ReferenceError))
183
- throw e;
184
- // ReferenceError: Cannot access 'SomeLinkedClass' before initialization.
185
- // We'll try again after the next class has successfully initialized.
186
- return false;
208
+ if (cleared) {
209
+ MockModel._primary._indexId = undefined;
210
+ MockModel._primary._versions.clear();
211
+ for (const sec of MockModel._secondaries || [])
212
+ sec._indexId = undefined;
187
213
  }
188
- // If no primary key exists, create one using 'id' field
189
- if (!MockModel._primary) {
190
- // If no `id` field exists, add it automatically
191
- if (!instance.id) {
192
- instance.id = { type: identifier };
193
- }
194
- // @ts-ignore-next-line - `id` is not part of the type, but the user probably shouldn't touch it anyhow
195
- new PrimaryIndex(MockModel, ['id']);
196
- }
197
- MockModel.fields = MockModel.prototype._fields = {};
198
- for (const key in instance) {
199
- const value = instance[key];
200
- // Check if this property contains field metadata
201
- if (value && value.type instanceof TypeWrapper) {
202
- // Set the configuration on the constructor's `fields` property
203
- MockModel.fields[key] = value;
204
- // Set default value on the prototype
205
- const defObj = value.default === undefined ? value.type : value;
206
- const def = defObj.default;
207
- if (typeof def === 'function') {
208
- // The default is a function. We'll define a getter on the property in the model prototype,
209
- // and once it is read, we'll run the function and set the value as a plain old property
210
- // on the instance object.
211
- Object.defineProperty(MockModel.prototype, key, {
212
- get() {
213
- // This will call set(), which will define the property on the instance.
214
- return (this[key] = def.call(defObj, this));
215
- },
216
- set(val) {
217
- Object.defineProperty(this, key, {
218
- value: val,
219
- configurable: true,
220
- writable: true,
221
- enumerable: true,
222
- });
223
- },
224
- configurable: true,
225
- });
214
+ if (!MockModel.fields) {
215
+ // First-time init: gather field configs from a temporary instance of the original class.
216
+ const OrgModel = MockModel._original || this;
217
+ const instance = new OrgModel(INIT_INSTANCE_SYMBOL);
218
+ // If no primary key exists, create one using 'id' field
219
+ if (!MockModel._primary) {
220
+ if (!instance.id) {
221
+ instance.id = { type: identifier };
226
222
  }
227
- else if (def !== undefined) {
228
- MockModel.prototype[key] = def;
223
+ // @ts-ignore-next-line - `id` is not part of the type, but the user probably shouldn't touch it anyhow
224
+ new PrimaryIndex(MockModel, ['id']);
225
+ }
226
+ MockModel.fields = {};
227
+ for (const key in instance) {
228
+ const value = instance[key];
229
+ // Check if this property contains field metadata
230
+ if (value && value.type instanceof TypeWrapper) {
231
+ // Set the configuration on the constructor's `fields` property
232
+ MockModel.fields[key] = value;
233
+ // Set default value on the prototype
234
+ const defObj = value.default === undefined ? value.type : value;
235
+ const def = defObj.default;
236
+ if (typeof def === 'function') {
237
+ // The default is a function. We'll define a getter on the property in the model prototype,
238
+ // and once it is read, we'll run the function and set the value as a plain old property
239
+ // on the instance object.
240
+ Object.defineProperty(MockModel.prototype, key, {
241
+ get() {
242
+ // This will call set(), which will define the property on the instance.
243
+ return (this[key] = def.call(defObj, this));
244
+ },
245
+ set(val) {
246
+ Object.defineProperty(this, key, {
247
+ value: val,
248
+ configurable: true,
249
+ writable: true,
250
+ enumerable: true,
251
+ });
252
+ },
253
+ configurable: true,
254
+ });
255
+ }
256
+ else if (def !== undefined) {
257
+ MockModel.prototype[key] = def;
258
+ }
229
259
  }
230
260
  }
261
+ if (logLevel >= 1) {
262
+ console.log(`[edinburgh] Registered model ${MockModel.tableName} with fields: ${Object.keys(MockModel.fields).join(' ')}`);
263
+ }
231
264
  }
232
- if (logLevel >= 1) {
233
- console.log(`Registered model ${MockModel.tableName} with fields: ${Object.keys(MockModel.fields).join(' ')}`);
234
- }
235
- return true;
265
+ // Always run index inits (idempotent, skip if already initialized)
266
+ await MockModel._primary._delayedInit();
267
+ for (const sec of MockModel._secondaries || [])
268
+ await sec._delayedInit();
269
+ await MockModel._primary._initVersioning();
236
270
  }
237
271
  _setLoadedField(fieldName, value) {
238
- const orgValues = this._oldValues ||= Object.create(Object.getPrototypeOf(this));
239
- if (orgValues.hasOwnProperty(fieldName))
272
+ const oldValues = this._oldValues;
273
+ if (oldValues.hasOwnProperty(fieldName))
240
274
  return; // Already loaded earlier (as part of index key?)
241
- const fieldType = this._fields[fieldName].type;
242
275
  this[fieldName] = value;
243
- orgValues[fieldName] = fieldType.clone(value);
276
+ if (typeof value === 'object' && value !== null) {
277
+ const fieldType = this.constructor.fields[fieldName].type;
278
+ oldValues[fieldName] = fieldType.clone(value);
279
+ }
280
+ else {
281
+ // This path is just an optimization
282
+ oldValues[fieldName] = value;
283
+ }
244
284
  }
245
285
  /**
246
- * @returns The primary key for this instance, or undefined if not yet saved.
286
+ * @returns The primary key for this instance.
247
287
  */
248
288
  getPrimaryKey() {
249
- return this._primaryKey;
289
+ let key = this._primaryKey;
290
+ if (key === undefined) {
291
+ key = this.constructor._primary._serializeKeyFields(this).toUint8Array();
292
+ this._setPrimaryKey(key);
293
+ }
294
+ return key;
295
+ }
296
+ _setPrimaryKey(key, hash) {
297
+ this._primaryKey = key;
298
+ this._primaryKeyHash = hash ?? hashBytes(key);
299
+ Object.defineProperties(this, this.constructor._primary._freezePrimaryKeyDescriptors);
250
300
  }
251
- _getCreatePrimaryKey() {
252
- return this._primaryKey ||= this.constructor._primary._instanceToKeySingleton(this);
301
+ /**
302
+ * @returns A 53-bit positive integer non-cryptographic hash of the primary key, or undefined if not yet saved.
303
+ */
304
+ getPrimaryKeyHash() {
305
+ if (this._primaryKeyHash === undefined)
306
+ this.getPrimaryKey();
307
+ return this._primaryKeyHash;
253
308
  }
254
309
  isLazyField(field) {
255
310
  const descr = this.constructor._primary._lazyDescriptors[field];
256
311
  return !!(descr && 'get' in descr && descr.get === Reflect.getOwnPropertyDescriptor(this, field)?.get);
257
312
  }
258
- _onCommit(onSaveQueue) {
313
+ _write(txn) {
259
314
  const oldValues = this._oldValues;
260
- let changed;
261
- if (oldValues) {
262
- // We're doing an update. Note that we may still be in a lazy state, and we don't want to load
263
- // the whole object just to see if something changed.
264
- // Delete all items from this.changed that have not actually changed.
265
- const fields = this._fields;
266
- changed = {};
267
- for (const fieldName of Object.keys(oldValues)) {
268
- const oldValue = oldValues[fieldName];
269
- if (!fields[fieldName].type.equals(this[fieldName], oldValue)) {
270
- changed[fieldName] = oldValue;
271
- }
272
- }
273
- if (isObjectEmpty(changed))
274
- return; // No changes, nothing to do
275
- // Make sure primary has not been changed
276
- for (const field of this.constructor._primary._fieldTypes.keys()) {
277
- if (changed.hasOwnProperty(field)) {
278
- throw new DatabaseError(`Cannot modify primary key field: ${field}`, "CHANGE_PRIMARY");
279
- }
280
- }
281
- // We have changes. Now it's okay for any lazy fields to be loaded (which the validate will trigger).
282
- // Raise any validation errors
283
- this.validate(true);
284
- // Update the primary index
285
- this.constructor._primary._write(this);
286
- // Update any secondaries with changed fields
287
- for (const index of this.constructor._secondaries || []) {
288
- for (const field of index._fieldTypes.keys()) {
289
- if (changed.hasOwnProperty(field)) {
290
- // We need to update this index - first delete the old one
291
- index._delete(oldValues);
292
- index._write(this);
293
- break;
294
- }
295
- }
296
- }
297
- }
298
- else if (this._primaryKey) { // Deleted instance
299
- this.constructor._primary._delete(this);
315
+ if (oldValues === null) { // Delete instance
316
+ const pk = this._primaryKey;
317
+ this.constructor._primary._delete(txn, pk, this);
300
318
  for (const index of this.constructor._secondaries || []) {
301
- index._delete(this);
319
+ index._delete(txn, pk, this);
302
320
  }
303
- changed = "deleted";
321
+ return "deleted";
304
322
  }
305
- else {
306
- // New instance
307
- // Raise any validation errors
323
+ if (oldValues === undefined) { // Create instance
308
324
  this.validate(true);
309
325
  // Make sure the primary key does not already exist
310
- if (olmdb.get(this._getCreatePrimaryKey())) {
326
+ const pk = this.getPrimaryKey();
327
+ if (dbGet(txn.id, pk)) {
311
328
  throw new DatabaseError("Unique constraint violation", "UNIQUE_CONSTRAINT");
312
329
  }
313
330
  // Insert the primary index
314
- this.constructor._primary._write(this);
331
+ this.constructor._primary._write(txn, pk, this);
315
332
  // Insert all secondaries
316
333
  for (const index of this.constructor._secondaries || []) {
317
- index._write(this);
334
+ index._write(txn, pk, this);
335
+ }
336
+ return "created";
337
+ }
338
+ // oldValues is an object.
339
+ // We're doing an update. Note that we may still be in a lazy state, and we don't want to load
340
+ // the whole object just to see if something changed.
341
+ // Add old values of changed fields to 'changed'.
342
+ const fields = this.constructor.fields;
343
+ let changed = {};
344
+ for (const fieldName in oldValues) {
345
+ const oldValue = oldValues[fieldName];
346
+ const newValue = this[fieldName];
347
+ if (newValue !== oldValue && !fields[fieldName].type.equals(newValue, oldValue)) {
348
+ changed[fieldName] = oldValue;
349
+ }
350
+ }
351
+ if (isObjectEmpty(changed))
352
+ return; // No changes, nothing to do
353
+ // Make sure primary has not been changed
354
+ for (const field of this.constructor._primary._fieldTypes.keys()) {
355
+ if (changed.hasOwnProperty(field)) {
356
+ throw new DatabaseError(`Cannot modify primary key field: ${field}`, "CHANGE_PRIMARY");
318
357
  }
319
- changed = "created";
320
358
  }
321
- if (onSaveQueue) {
322
- this.changed = changed;
323
- onSaveQueue.push(this);
359
+ // We have changes. Now it's okay for any lazy fields to be loaded (which the validate will trigger).
360
+ // Raise any validation errors
361
+ this.validate(true);
362
+ // Update the primary index
363
+ const pk = this._primaryKey;
364
+ this.constructor._primary._write(txn, pk, this);
365
+ // Update any secondaries with changed fields
366
+ for (const index of this.constructor._secondaries || []) {
367
+ for (const field of index._fieldTypes.keys()) {
368
+ if (changed.hasOwnProperty(field)) {
369
+ index._delete(txn, pk, oldValues);
370
+ index._write(txn, pk, this);
371
+ break;
372
+ }
373
+ }
324
374
  }
375
+ return changed;
325
376
  }
326
377
  /**
327
378
  * Prevent this instance from being persisted to the database.
@@ -336,8 +387,9 @@ export class Model {
336
387
  * ```
337
388
  */
338
389
  preventPersist() {
339
- const instances = olmdb.getTransactionData(INSTANCES_SYMBOL);
340
- instances.delete(this);
390
+ this._txn.instances.delete(this);
391
+ // Have access to '_txn' throw a descriptive error:
392
+ Object.defineProperty(this, "_txn", PREVENT_PERSIST_DESCRIPTOR);
341
393
  return this;
342
394
  }
343
395
  /**
@@ -349,6 +401,36 @@ export class Model {
349
401
  static findAll(opts) {
350
402
  return this._primary.find(opts);
351
403
  }
404
+ /**
405
+ * Load an existing instance by primary key and update it, or create a new one.
406
+ *
407
+ * The provided object must contain all primary key fields. If a matching row exists,
408
+ * the remaining properties from `obj` are set on the loaded instance. Otherwise a
409
+ * new instance is created with `obj` as its initial properties.
410
+ *
411
+ * @param obj - Partial model data that **must** include every primary key field.
412
+ * @returns The loaded-and-updated or newly created instance.
413
+ */
414
+ static replaceInto(obj) {
415
+ const pk = this._primary;
416
+ const keyArgs = [];
417
+ for (const fieldName of pk._fieldTypes.keys()) {
418
+ if (!(fieldName in obj)) {
419
+ throw new DatabaseError(`replaceInto: missing primary key field '${fieldName}'`, "MISSING_PRIMARY_KEY");
420
+ }
421
+ keyArgs.push(obj[fieldName]);
422
+ }
423
+ const existing = pk.get(...keyArgs);
424
+ if (existing) {
425
+ for (const key in obj) {
426
+ if (!pk._fieldTypes.has(key)) {
427
+ existing[key] = obj[key];
428
+ }
429
+ }
430
+ return existing;
431
+ }
432
+ return new this(obj);
433
+ }
352
434
  /**
353
435
  * Delete this model instance from the database.
354
436
  *
@@ -361,9 +443,9 @@ export class Model {
361
443
  * ```
362
444
  */
363
445
  delete() {
364
- if (!this._primaryKey)
446
+ if (this._oldValues === undefined)
365
447
  throw new DatabaseError("Cannot delete unsaved instance", "NOT_SAVED");
366
- this._oldValues = undefined;
448
+ this._oldValues = null;
367
449
  }
368
450
  /**
369
451
  * Validate all fields in this model instance.
@@ -381,7 +463,7 @@ export class Model {
381
463
  */
382
464
  validate(raise = false) {
383
465
  const errors = [];
384
- for (const [key, fieldConfig] of Object.entries(this._fields)) {
466
+ for (const [key, fieldConfig] of Object.entries(this.constructor.fields)) {
385
467
  let e = fieldConfig.type.getError(this[key]);
386
468
  if (e) {
387
469
  e = addErrorPath(e, this.constructor.tableName + "." + key);
@@ -405,5 +487,25 @@ export class Model {
405
487
  isValid() {
406
488
  return this.validate().length === 0;
407
489
  }
490
+ getState() {
491
+ if (this._oldValues === null)
492
+ return "deleted";
493
+ if (this._oldValues === undefined)
494
+ return "created";
495
+ for (const [key, descr] of Object.entries(this.constructor._primary._lazyDescriptors)) {
496
+ if (descr && 'get' in descr && descr.get === Reflect.getOwnPropertyDescriptor(this, key)?.get) {
497
+ return "lazy";
498
+ }
499
+ }
500
+ return "loaded";
501
+ }
502
+ toString() {
503
+ const primary = this.constructor._primary;
504
+ const pk = primary._keyToArray(this._primaryKey || primary._serializeKeyFields(this).toUint8Array(false));
505
+ return `{Model:${this.constructor.tableName} ${this.getState()} ${pk}}`;
506
+ }
507
+ [Symbol.for('nodejs.util.inspect.custom')]() {
508
+ return this.toString();
509
+ }
408
510
  }
409
511
  //# sourceMappingURL=models.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/models.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/models.ts"],"names":[],"mappings":"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"}