edinburgh 0.1.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.
- package/LICENSE +15 -0
- package/README.md +804 -0
- package/build/src/bytes.d.ts +155 -0
- package/build/src/bytes.js +455 -0
- package/build/src/bytes.js.map +1 -0
- package/build/src/edinburgh.d.ts +47 -0
- package/build/src/edinburgh.js +93 -0
- package/build/src/edinburgh.js.map +1 -0
- package/build/src/indexes.d.ts +348 -0
- package/build/src/indexes.js +632 -0
- package/build/src/indexes.js.map +1 -0
- package/build/src/models.d.ts +192 -0
- package/build/src/models.js +457 -0
- package/build/src/models.js.map +1 -0
- package/build/src/types.d.ts +301 -0
- package/build/src/types.js +522 -0
- package/build/src/types.js.map +1 -0
- package/build/src/utils.d.ts +26 -0
- package/build/src/utils.js +32 -0
- package/build/src/utils.js.map +1 -0
- package/package.json +56 -0
- package/src/bytes.ts +500 -0
- package/src/edinburgh.ts +119 -0
- package/src/indexes.ts +810 -0
- package/src/models.ts +519 -0
- package/src/types.ts +635 -0
- package/src/utils.ts +39 -0
|
@@ -0,0 +1,522 @@
|
|
|
1
|
+
import { Bytes } from "./bytes.js";
|
|
2
|
+
import * as olmdb from "olmdb";
|
|
3
|
+
import { DatabaseError } from "olmdb";
|
|
4
|
+
import { modelRegistry, getMockModel } from "./models.js";
|
|
5
|
+
import { assert, addErrorPath } from "./utils.js";
|
|
6
|
+
/**
|
|
7
|
+
* @internal Abstract base class for all type wrappers in the Edinburgh ORM system.
|
|
8
|
+
*
|
|
9
|
+
* This is an implementation detail and should not be referenced directly in user code.
|
|
10
|
+
* Type wrappers define how values are serialized to/from the database and how they are validated.
|
|
11
|
+
* Each type wrapper must implement serialization, deserialization, and validation logic.
|
|
12
|
+
*
|
|
13
|
+
* @template T - The TypeScript type this wrapper represents.
|
|
14
|
+
*/
|
|
15
|
+
export class TypeWrapper {
|
|
16
|
+
/** @internal Used for TypeScript type inference - this field is required for the type system */
|
|
17
|
+
_T;
|
|
18
|
+
constructor() { }
|
|
19
|
+
/**
|
|
20
|
+
* Validate a value and serialize it, throwing on validation errors.
|
|
21
|
+
* @param obj - The object containing the value.
|
|
22
|
+
* @param prop - The property name or index.
|
|
23
|
+
* @param bytes - The Bytes instance to write to.
|
|
24
|
+
* @param model - Optional model instance for context.
|
|
25
|
+
* @throws {DatabaseError} If validation fails.
|
|
26
|
+
*/
|
|
27
|
+
validateAndSerialize(obj, prop, bytes, model) {
|
|
28
|
+
const errors = this.getErrors(obj, prop);
|
|
29
|
+
if (errors.length)
|
|
30
|
+
throw errors[0];
|
|
31
|
+
this.serialize(obj, prop, bytes, model);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Serialize type metadata to bytes (for schema serialization).
|
|
35
|
+
* @param bytes - The Bytes instance to write to.
|
|
36
|
+
*/
|
|
37
|
+
serializeType(bytes) { }
|
|
38
|
+
/**
|
|
39
|
+
* Check if indexing should be skipped for this field value.
|
|
40
|
+
* @param obj - The object containing the value.
|
|
41
|
+
* @param prop - The property name or index.
|
|
42
|
+
* @returns true if indexing should be skipped.
|
|
43
|
+
*/
|
|
44
|
+
checkSkipIndex(obj, prop) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
toString() {
|
|
48
|
+
return `${this.kind}`;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* @internal Type wrapper for string values.
|
|
53
|
+
*/
|
|
54
|
+
class StringType extends TypeWrapper {
|
|
55
|
+
kind = 'string';
|
|
56
|
+
serialize(obj, prop, bytes, model) {
|
|
57
|
+
bytes.writeString(obj[prop]);
|
|
58
|
+
}
|
|
59
|
+
deserialize(obj, prop, bytes, model) {
|
|
60
|
+
obj[prop] = bytes.readString();
|
|
61
|
+
}
|
|
62
|
+
getErrors(obj, prop) {
|
|
63
|
+
if (typeof obj[prop] !== 'string') {
|
|
64
|
+
return [new DatabaseError(`Expected string, got ${typeof obj[prop]}`, 'INVALID_TYPE')];
|
|
65
|
+
}
|
|
66
|
+
return [];
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* @internal Type wrapper for number values.
|
|
71
|
+
*/
|
|
72
|
+
class NumberType extends TypeWrapper {
|
|
73
|
+
kind = 'number';
|
|
74
|
+
serialize(obj, prop, bytes, model) {
|
|
75
|
+
bytes.writeNumber(obj[prop]);
|
|
76
|
+
}
|
|
77
|
+
deserialize(obj, prop, bytes, model) {
|
|
78
|
+
obj[prop] = bytes.readNumber();
|
|
79
|
+
}
|
|
80
|
+
getErrors(obj, prop) {
|
|
81
|
+
const value = obj[prop];
|
|
82
|
+
if (typeof value !== 'number' || isNaN(value)) {
|
|
83
|
+
return [new DatabaseError(`Expected number, got ${typeof value}`, 'INVALID_TYPE')];
|
|
84
|
+
}
|
|
85
|
+
return [];
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* @internal Type wrapper for boolean values.
|
|
90
|
+
*/
|
|
91
|
+
class BooleanType extends TypeWrapper {
|
|
92
|
+
kind = 'boolean';
|
|
93
|
+
serialize(obj, prop, bytes, model) {
|
|
94
|
+
bytes.writeBits(obj[prop] ? 1 : 0, 1);
|
|
95
|
+
}
|
|
96
|
+
deserialize(obj, prop, bytes, model) {
|
|
97
|
+
obj[prop] = bytes.readBits(1) === 1;
|
|
98
|
+
}
|
|
99
|
+
getErrors(obj, prop) {
|
|
100
|
+
if (typeof obj[prop] !== 'boolean') {
|
|
101
|
+
return [new DatabaseError(`Expected boolean, got ${typeof obj[prop]}`, 'INVALID_TYPE')];
|
|
102
|
+
}
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* @internal Type wrapper for array values with optional length constraints.
|
|
108
|
+
* @template T - The type of array elements.
|
|
109
|
+
*/
|
|
110
|
+
class ArrayType extends TypeWrapper {
|
|
111
|
+
inner;
|
|
112
|
+
opts;
|
|
113
|
+
kind = 'array';
|
|
114
|
+
/**
|
|
115
|
+
* Create a new ArrayType.
|
|
116
|
+
* @param inner - Type wrapper for array elements.
|
|
117
|
+
* @param opts - Array constraints (min/max length).
|
|
118
|
+
*/
|
|
119
|
+
constructor(inner, opts = {}) {
|
|
120
|
+
super();
|
|
121
|
+
this.inner = inner;
|
|
122
|
+
this.opts = opts;
|
|
123
|
+
}
|
|
124
|
+
serialize(obj, prop, bytes, model) {
|
|
125
|
+
const value = obj[prop];
|
|
126
|
+
bytes.writeNumber(value.length);
|
|
127
|
+
for (let i = 0; i < value.length; i++) {
|
|
128
|
+
this.inner.serialize(value, i, bytes, model);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
deserialize(obj, prop, bytes, model) {
|
|
132
|
+
const length = bytes.readNumber();
|
|
133
|
+
const result = [];
|
|
134
|
+
for (let i = 0; i < length; i++) {
|
|
135
|
+
this.inner.deserialize(result, i, bytes, model);
|
|
136
|
+
}
|
|
137
|
+
obj[prop] = result;
|
|
138
|
+
}
|
|
139
|
+
getErrors(obj, prop) {
|
|
140
|
+
const value = obj[prop];
|
|
141
|
+
if (!Array.isArray(value)) {
|
|
142
|
+
return [new DatabaseError(`Expected array, got ${typeof value}`, 'INVALID_TYPE')];
|
|
143
|
+
}
|
|
144
|
+
const errors = [];
|
|
145
|
+
if (this.opts.min !== undefined && value.length < this.opts.min) {
|
|
146
|
+
errors.push(new DatabaseError(`Array length ${value.length} is less than minimum ${this.opts.min}`, 'OUT_OF_BOUNDS'));
|
|
147
|
+
}
|
|
148
|
+
if (this.opts.max !== undefined && value.length > this.opts.max) {
|
|
149
|
+
errors.push(new DatabaseError(`Array length ${value.length} is greater than maximum ${this.opts.max}`, 'OUT_OF_BOUNDS'));
|
|
150
|
+
}
|
|
151
|
+
for (let i = 0; i < value.length; i++) {
|
|
152
|
+
for (let itemError of this.inner.getErrors(value, i)) {
|
|
153
|
+
errors.push(addErrorPath(itemError, i));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return errors;
|
|
157
|
+
}
|
|
158
|
+
serializeType(bytes) {
|
|
159
|
+
serializeType(this.inner, bytes);
|
|
160
|
+
}
|
|
161
|
+
static deserializeType(bytes, featureFlags) {
|
|
162
|
+
const inner = deserializeType(bytes, featureFlags);
|
|
163
|
+
return new ArrayType(inner);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* @internal Type wrapper for union/discriminated union types.
|
|
168
|
+
* @template T - The union type this wrapper represents.
|
|
169
|
+
*/
|
|
170
|
+
class OrType extends TypeWrapper {
|
|
171
|
+
choices;
|
|
172
|
+
kind = 'or';
|
|
173
|
+
/**
|
|
174
|
+
* Create a new OrType.
|
|
175
|
+
* @param choices - Array of type wrappers representing the union choices.
|
|
176
|
+
*/
|
|
177
|
+
constructor(choices) {
|
|
178
|
+
super();
|
|
179
|
+
this.choices = choices;
|
|
180
|
+
}
|
|
181
|
+
_getChoiceIndex(obj, prop) {
|
|
182
|
+
for (const [i, choice] of this.choices.entries()) {
|
|
183
|
+
if (choice.getErrors(obj, prop).length === 0) {
|
|
184
|
+
return i;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
throw new DatabaseError(`Value does not match any union type: ${obj[prop]}`, 'INVALID_TYPE');
|
|
188
|
+
}
|
|
189
|
+
serialize(obj, prop, bytes, model) {
|
|
190
|
+
const choiceIndex = this._getChoiceIndex(obj, prop);
|
|
191
|
+
bytes.writeUIntN(choiceIndex, this.choices.length - 1);
|
|
192
|
+
this.choices[choiceIndex].serialize(obj, prop, bytes, model);
|
|
193
|
+
}
|
|
194
|
+
deserialize(obj, prop, bytes, model) {
|
|
195
|
+
const index = bytes.readUIntN(this.choices.length - 1);
|
|
196
|
+
if (index < 0 || index >= this.choices.length) {
|
|
197
|
+
throw new DatabaseError(`Could not deserialize invalid union index ${index}`, 'DESERIALIZATION_ERROR');
|
|
198
|
+
}
|
|
199
|
+
const type = this.choices[index];
|
|
200
|
+
type.deserialize(obj, prop, bytes, model);
|
|
201
|
+
}
|
|
202
|
+
getErrors(obj, prop) {
|
|
203
|
+
const errors = [];
|
|
204
|
+
for (let i = 0; i < this.choices.length; i++) {
|
|
205
|
+
const type = this.choices[i];
|
|
206
|
+
const subErrors = type.getErrors(obj, prop);
|
|
207
|
+
if (subErrors.length === 0)
|
|
208
|
+
return [];
|
|
209
|
+
for (let err of subErrors) {
|
|
210
|
+
errors.push(addErrorPath(err, `opt${i + 1}`));
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return errors;
|
|
214
|
+
}
|
|
215
|
+
checkSkipIndex(obj, prop) {
|
|
216
|
+
const choiceIndex = this._getChoiceIndex(obj, prop);
|
|
217
|
+
return this.choices[choiceIndex].checkSkipIndex(obj, prop);
|
|
218
|
+
}
|
|
219
|
+
serializeType(bytes) {
|
|
220
|
+
bytes.writeNumber(this.choices.length);
|
|
221
|
+
for (const choice of this.choices) {
|
|
222
|
+
serializeType(choice, bytes);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
static deserializeType(bytes, featureFlags) {
|
|
226
|
+
const count = bytes.readNumber();
|
|
227
|
+
const choices = [];
|
|
228
|
+
for (let i = 0; i < count; i++) {
|
|
229
|
+
choices.push(deserializeType(bytes, featureFlags));
|
|
230
|
+
}
|
|
231
|
+
return new OrType(choices);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* @internal Type wrapper for literal values (constants).
|
|
236
|
+
* @template T - The literal type this wrapper represents.
|
|
237
|
+
*/
|
|
238
|
+
class LiteralType extends TypeWrapper {
|
|
239
|
+
value;
|
|
240
|
+
kind = 'literal';
|
|
241
|
+
/**
|
|
242
|
+
* Create a new LiteralType.
|
|
243
|
+
* @param value - The literal value this type represents.
|
|
244
|
+
*/
|
|
245
|
+
constructor(value) {
|
|
246
|
+
super();
|
|
247
|
+
this.value = value;
|
|
248
|
+
}
|
|
249
|
+
serialize(obj, prop, bytes, model) {
|
|
250
|
+
// Literal values don't need to be serialized since they're constants
|
|
251
|
+
}
|
|
252
|
+
deserialize(obj, prop, bytes, model) {
|
|
253
|
+
obj[prop] = this.value;
|
|
254
|
+
}
|
|
255
|
+
getErrors(obj, prop) {
|
|
256
|
+
return this.value === obj[prop] ? [] : [new DatabaseError(`Invalid literal value ${obj[prop]} instead of ${this.value}`, 'INVALID_TYPE')];
|
|
257
|
+
}
|
|
258
|
+
serializeType(bytes) {
|
|
259
|
+
bytes.writeString(this.value === undefined ? "" : JSON.stringify(this.value));
|
|
260
|
+
}
|
|
261
|
+
checkSkipIndex(obj, prop) {
|
|
262
|
+
return obj[prop] == null;
|
|
263
|
+
}
|
|
264
|
+
static deserializeType(bytes, featureFlags) {
|
|
265
|
+
const json = bytes.readString();
|
|
266
|
+
const value = json === "" ? undefined : JSON.parse(json);
|
|
267
|
+
return new LiteralType(value);
|
|
268
|
+
}
|
|
269
|
+
default(model) {
|
|
270
|
+
return this.value;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
const ID_SIZE = 7;
|
|
274
|
+
/**
|
|
275
|
+
* @internal Type wrapper for auto-generated unique identifier strings.
|
|
276
|
+
*/
|
|
277
|
+
class IdentifierType extends TypeWrapper {
|
|
278
|
+
kind = 'id';
|
|
279
|
+
serialize(obj, prop, bytes) {
|
|
280
|
+
const value = obj[prop];
|
|
281
|
+
assert(value.length === ID_SIZE);
|
|
282
|
+
bytes.writeBase64(value);
|
|
283
|
+
}
|
|
284
|
+
deserialize(obj, prop, bytes) {
|
|
285
|
+
obj[prop] = bytes.readBase64(ID_SIZE);
|
|
286
|
+
}
|
|
287
|
+
getErrors(obj, prop) {
|
|
288
|
+
const value = obj[prop];
|
|
289
|
+
if (typeof value !== 'string' || value.length !== ID_SIZE)
|
|
290
|
+
return [new DatabaseError(`Invalid ID format: ${value}`, 'VALUE_ERROR')];
|
|
291
|
+
return [];
|
|
292
|
+
}
|
|
293
|
+
serializeType(bytes) {
|
|
294
|
+
}
|
|
295
|
+
static deserializeType(bytes, featureFlags) {
|
|
296
|
+
return new IdentifierType();
|
|
297
|
+
}
|
|
298
|
+
default(model) {
|
|
299
|
+
// Generate a random ID, and if it already exists in the database, retry.
|
|
300
|
+
let id;
|
|
301
|
+
do {
|
|
302
|
+
// Combine a timestamp with randomness, to create locality of reference as well as a high chance of uniqueness.
|
|
303
|
+
// Bits 9...42 are the date (wrapping about four times a year)
|
|
304
|
+
// Bit 0...14 are random bits (partly overlapping with the date, adding up to 31ms of jitter)
|
|
305
|
+
let num = Math.floor(+new Date() * (1 << 9) + Math.random() * (1 << 14));
|
|
306
|
+
id = '';
|
|
307
|
+
for (let i = 0; i < 7; i++) {
|
|
308
|
+
id = Bytes.BASE64_CHARS[num & 0x3f] + id;
|
|
309
|
+
num = Math.floor(num / 64);
|
|
310
|
+
}
|
|
311
|
+
} while (olmdb.get(new Bytes().writeNumber(model.constructor._pk._cachedIndexId).writeBase64(id).getBuffer()));
|
|
312
|
+
return id;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
const WANT_PK_ARRAY = {};
|
|
316
|
+
/**
|
|
317
|
+
* @internal Type wrapper for model relationships (foreign keys).
|
|
318
|
+
* @template T - The target model class type.
|
|
319
|
+
*/
|
|
320
|
+
export class LinkType extends TypeWrapper {
|
|
321
|
+
kind = 'link';
|
|
322
|
+
TargetModel;
|
|
323
|
+
/**
|
|
324
|
+
* Create a new LinkType.
|
|
325
|
+
* @param TargetModel - The model class this link points to.
|
|
326
|
+
*/
|
|
327
|
+
constructor(TargetModel) {
|
|
328
|
+
super();
|
|
329
|
+
this.TargetModel = getMockModel(TargetModel);
|
|
330
|
+
}
|
|
331
|
+
serialize(obj, prop, bytes, model) {
|
|
332
|
+
let pkArray;
|
|
333
|
+
const pk = this.TargetModel._pk;
|
|
334
|
+
// If obj[prop] is getter(), it will return the primary key array (based on WANT_PK_ARRAY
|
|
335
|
+
// being the receiver). Otherwise, it will just return the value, which is a model instance.
|
|
336
|
+
let value = Reflect.get(obj, prop, WANT_PK_ARRAY);
|
|
337
|
+
if (value instanceof Array) {
|
|
338
|
+
// It's a pk array, and the object has not been loaded. We can just serialize it.
|
|
339
|
+
pk._serializeArgs(value, bytes);
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
// It's a model instance that has been loaded
|
|
343
|
+
pk._serializeModel(value, bytes);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
deserialize(obj, prop, bytes, sourceModel) {
|
|
347
|
+
const pk = this.TargetModel._pk;
|
|
348
|
+
const pkArray = pk._deserializeKey(bytes);
|
|
349
|
+
const TargetModel = this.TargetModel;
|
|
350
|
+
// Define a getter to load the model on first access
|
|
351
|
+
Object.defineProperty(obj, prop, {
|
|
352
|
+
get: function () {
|
|
353
|
+
// Special case to return the primary key array instead of load the model, used by serialize.
|
|
354
|
+
if (this === WANT_PK_ARRAY)
|
|
355
|
+
return pkArray;
|
|
356
|
+
const targetModel = TargetModel._pk.get(...pkArray); // load by primary key Uint8Array
|
|
357
|
+
if (!targetModel) {
|
|
358
|
+
throw new DatabaseError(`Linked ${TargetModel.tableName} instance ${pkArray.join(', ')} not found`, 'BROKEN_LINK');
|
|
359
|
+
}
|
|
360
|
+
this[prop] = targetModel; // Cause set() to be called, so our property will be come a regular value
|
|
361
|
+
return targetModel;
|
|
362
|
+
},
|
|
363
|
+
set: function (newValue) {
|
|
364
|
+
// Convert back to a regular value property
|
|
365
|
+
Object.defineProperty(this, prop, {
|
|
366
|
+
value: newValue,
|
|
367
|
+
writable: true,
|
|
368
|
+
enumerable: true,
|
|
369
|
+
configurable: true
|
|
370
|
+
});
|
|
371
|
+
},
|
|
372
|
+
enumerable: true,
|
|
373
|
+
configurable: true
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
getErrors(obj, prop) {
|
|
377
|
+
if (!(obj[prop] instanceof this.TargetModel)) {
|
|
378
|
+
return [new DatabaseError(`Expected instance of ${this.TargetModel.tableName}, got ${typeof obj[prop]}`, 'VALUE_ERROR')];
|
|
379
|
+
}
|
|
380
|
+
return [];
|
|
381
|
+
}
|
|
382
|
+
serializeType(bytes) {
|
|
383
|
+
bytes.writeString(this.TargetModel.tableName);
|
|
384
|
+
}
|
|
385
|
+
static deserializeType(bytes, featureFlags) {
|
|
386
|
+
const tableName = bytes.readString();
|
|
387
|
+
const targetModel = modelRegistry[tableName];
|
|
388
|
+
if (!targetModel)
|
|
389
|
+
throw new DatabaseError(`Could not deserialize undefined model ${tableName}`, 'DESERIALIZATION_ERROR');
|
|
390
|
+
return new LinkType(targetModel);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
/** Constant representing the string type. */
|
|
394
|
+
export const string = new StringType();
|
|
395
|
+
/** Constant representing the number type. */
|
|
396
|
+
export const number = new NumberType();
|
|
397
|
+
/** Constant representing the boolean type. */
|
|
398
|
+
export const boolean = new BooleanType();
|
|
399
|
+
/** Constant representing the identifier type. */
|
|
400
|
+
export const identifier = new IdentifierType();
|
|
401
|
+
/**
|
|
402
|
+
* Create a literal type wrapper for a constant value.
|
|
403
|
+
* @template T - The literal type.
|
|
404
|
+
* @param value - The literal value.
|
|
405
|
+
* @returns A literal type instance.
|
|
406
|
+
*
|
|
407
|
+
* @example
|
|
408
|
+
* ```typescript
|
|
409
|
+
* const statusType = E.literal("active");
|
|
410
|
+
* const countType = E.literal(42);
|
|
411
|
+
* ```
|
|
412
|
+
*/
|
|
413
|
+
export function literal(value) {
|
|
414
|
+
return new LiteralType(value);
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Create a union type wrapper from multiple type choices.
|
|
418
|
+
* @template T - Array of type wrapper or basic types.
|
|
419
|
+
* @param choices - The type choices for the union.
|
|
420
|
+
* @returns A union type instance.
|
|
421
|
+
*
|
|
422
|
+
* @example
|
|
423
|
+
* ```typescript
|
|
424
|
+
* const stringOrNumber = E.or(E.string, E.number);
|
|
425
|
+
* const status = E.or("active", "inactive", "pending");
|
|
426
|
+
* ```
|
|
427
|
+
*/
|
|
428
|
+
export function or(...choices) {
|
|
429
|
+
return new OrType(choices.map(wrapIfLiteral));
|
|
430
|
+
}
|
|
431
|
+
/** Constant representing the 'undefined' type. */
|
|
432
|
+
export const undef = new LiteralType(undefined);
|
|
433
|
+
/**
|
|
434
|
+
* Create an optional type wrapper (allows undefined).
|
|
435
|
+
* @template T - Type wrapper or basic type to make optional.
|
|
436
|
+
* @param inner - The inner type to make optional.
|
|
437
|
+
* @returns A union type that accepts the inner type or undefined.
|
|
438
|
+
*
|
|
439
|
+
* @example
|
|
440
|
+
* ```typescript
|
|
441
|
+
* const optionalString = E.opt(E.string);
|
|
442
|
+
* const optionalNumber = E.opt(E.number);
|
|
443
|
+
* ```
|
|
444
|
+
*/
|
|
445
|
+
export function opt(inner) {
|
|
446
|
+
return or(undef, inner);
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Create an array type wrapper with optional length constraints.
|
|
450
|
+
* @template T - The element type.
|
|
451
|
+
* @param inner - Type wrapper for array elements.
|
|
452
|
+
* @param opts - Optional constraints (min/max length).
|
|
453
|
+
* @returns An array type instance.
|
|
454
|
+
*
|
|
455
|
+
* @example
|
|
456
|
+
* ```typescript
|
|
457
|
+
* const stringArray = E.array(E.string);
|
|
458
|
+
* const boundedArray = E.array(E.number, {min: 1, max: 10});
|
|
459
|
+
* ```
|
|
460
|
+
*/
|
|
461
|
+
export function array(inner, opts = {}) {
|
|
462
|
+
return new ArrayType(wrapIfLiteral(inner), opts);
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* Create a link type wrapper for model relationships.
|
|
466
|
+
* @template T - The target model class.
|
|
467
|
+
* @param TargetModel - The model class this link points to.
|
|
468
|
+
* @returns A link type instance.
|
|
469
|
+
*
|
|
470
|
+
* @example
|
|
471
|
+
* ```typescript
|
|
472
|
+
* class User extends E.Model<User> {
|
|
473
|
+
* posts = E.field(E.array(E.link(Post, 'author')));
|
|
474
|
+
* }
|
|
475
|
+
*
|
|
476
|
+
* class Post extends E.Model<Post> {
|
|
477
|
+
* author = E.field(E.link(User));
|
|
478
|
+
* }
|
|
479
|
+
* ```
|
|
480
|
+
*/
|
|
481
|
+
export function link(TargetModel) {
|
|
482
|
+
return new LinkType(TargetModel);
|
|
483
|
+
}
|
|
484
|
+
function wrapIfLiteral(type) {
|
|
485
|
+
return type instanceof TypeWrapper ? type : new LiteralType(type);
|
|
486
|
+
}
|
|
487
|
+
/**
|
|
488
|
+
* Serialize a type wrapper to bytes for schema persistence.
|
|
489
|
+
* @param arg - The type wrapper to serialize.
|
|
490
|
+
* @param bytes - The Bytes instance to write to.
|
|
491
|
+
*/
|
|
492
|
+
export function serializeType(arg, bytes) {
|
|
493
|
+
bytes.writeString(arg.kind);
|
|
494
|
+
arg.serializeType(bytes);
|
|
495
|
+
}
|
|
496
|
+
const TYPE_WRAPPERS = {
|
|
497
|
+
string: string,
|
|
498
|
+
number: number,
|
|
499
|
+
array: ArrayType,
|
|
500
|
+
or: OrType,
|
|
501
|
+
literal: LiteralType,
|
|
502
|
+
boolean: boolean,
|
|
503
|
+
id: identifier,
|
|
504
|
+
link: LinkType,
|
|
505
|
+
};
|
|
506
|
+
/**
|
|
507
|
+
* Deserialize a type wrapper from bytes.
|
|
508
|
+
* @param bytes - The Bytes instance to read from.
|
|
509
|
+
* @param featureFlags - Feature flags for version compatibility.
|
|
510
|
+
* @returns The deserialized type wrapper.
|
|
511
|
+
*/
|
|
512
|
+
export function deserializeType(bytes, featureFlags) {
|
|
513
|
+
const kind = bytes.readString();
|
|
514
|
+
const TypeWrapper = TYPE_WRAPPERS[kind];
|
|
515
|
+
if ('deserializeType' in TypeWrapper) {
|
|
516
|
+
return TypeWrapper.deserializeType(bytes, featureFlags);
|
|
517
|
+
}
|
|
518
|
+
else {
|
|
519
|
+
return TypeWrapper;
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { DatabaseError } from "olmdb";
|
|
2
|
+
/**
|
|
3
|
+
* Assert function for runtime checks with TypeScript assertion support.
|
|
4
|
+
* @param cond - Condition to check.
|
|
5
|
+
* @param message - Optional error message.
|
|
6
|
+
* @throws {Error} If condition is false.
|
|
7
|
+
*/
|
|
8
|
+
export declare function assert(cond: any, message?: string): asserts cond;
|
|
9
|
+
/**
|
|
10
|
+
* Regular expression for parsing error messages with paths.
|
|
11
|
+
*/
|
|
12
|
+
export declare const ERROR_AT: RegExp;
|
|
13
|
+
/**
|
|
14
|
+
* Add a path segment to a DatabaseError message for better error reporting.
|
|
15
|
+
* @param error - The DatabaseError to modify.
|
|
16
|
+
* @param path - The path segment to add (string or number).
|
|
17
|
+
* @returns The modified DatabaseError.
|
|
18
|
+
*/
|
|
19
|
+
export declare function addErrorPath(error: DatabaseError, path: string | number): DatabaseError;
|
|
20
|
+
/**
|
|
21
|
+
* Global log level for debugging output.
|
|
22
|
+
* 0 = no logging, 1 = model-level logs, 2 = update logs, 3 = read logs.
|
|
23
|
+
*/
|
|
24
|
+
export declare let logLevel: number;
|
|
25
|
+
/** @internal Symbol used to access the underlying model from a proxy */
|
|
26
|
+
export declare const TARGET_SYMBOL: unique symbol;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assert function for runtime checks with TypeScript assertion support.
|
|
3
|
+
* @param cond - Condition to check.
|
|
4
|
+
* @param message - Optional error message.
|
|
5
|
+
* @throws {Error} If condition is false.
|
|
6
|
+
*/
|
|
7
|
+
export function assert(cond, message) {
|
|
8
|
+
if (!cond) {
|
|
9
|
+
throw new Error(message || "Assertion failed");
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Regular expression for parsing error messages with paths.
|
|
14
|
+
*/
|
|
15
|
+
export const ERROR_AT = /^(.*) at ([a-zA-Z0-9_.]+)$/;
|
|
16
|
+
/**
|
|
17
|
+
* Add a path segment to a DatabaseError message for better error reporting.
|
|
18
|
+
* @param error - The DatabaseError to modify.
|
|
19
|
+
* @param path - The path segment to add (string or number).
|
|
20
|
+
* @returns The modified DatabaseError.
|
|
21
|
+
*/
|
|
22
|
+
export function addErrorPath(error, path) {
|
|
23
|
+
const m = error.message.match(ERROR_AT);
|
|
24
|
+
error.message = m ? `${m[1]} at ${path}.${m[2]}` : `${error.message} at ${path}`;
|
|
25
|
+
return error;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Global log level for debugging output.
|
|
29
|
+
* 0 = no logging, 1 = model-level logs, 2 = update logs, 3 = read logs.
|
|
30
|
+
*/
|
|
31
|
+
export let logLevel = 0;
|
|
32
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,UAAU,MAAM,CAAC,IAAS,EAAE,OAAgB;IAC9C,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,kBAAkB,CAAC,CAAC;IACnD,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,4BAA4B,CAAC;AAErD;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,KAAoB,EAAE,IAAqB;IACpE,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,OAAO,IAAI,EAAE,CAAC;IACjF,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "edinburgh",
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"author": "Frank van Viegen",
|
|
5
|
+
"devDependencies": {
|
|
6
|
+
"@jest/globals": "^30.0.3",
|
|
7
|
+
"@types/bun": "^1.2.16",
|
|
8
|
+
"@types/node": "^22.10.6",
|
|
9
|
+
"jest": "^30.0.5",
|
|
10
|
+
"typescript": "^5.8.3"
|
|
11
|
+
},
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"bun": "./src/edinburgh.ts",
|
|
15
|
+
"types": "./build/edinburgh.d.ts",
|
|
16
|
+
"default": "./build/edinburgh.js"
|
|
17
|
+
},
|
|
18
|
+
"./bytes": {
|
|
19
|
+
"bun": "./src/bytes.ts",
|
|
20
|
+
"types": "./build/bytes.d.ts",
|
|
21
|
+
"default": "./build/bytes.js"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"description": "Very fast object persistence for TypeScript, supporting optimistic transactions, on-demand reference loading, automatic back-references and indexes.",
|
|
25
|
+
"files": [
|
|
26
|
+
"src",
|
|
27
|
+
"build/src"
|
|
28
|
+
],
|
|
29
|
+
"keywords": [
|
|
30
|
+
"orm",
|
|
31
|
+
"backend",
|
|
32
|
+
"database",
|
|
33
|
+
"transactions",
|
|
34
|
+
"acid",
|
|
35
|
+
"lmdb",
|
|
36
|
+
"olmdb",
|
|
37
|
+
"typescript"
|
|
38
|
+
],
|
|
39
|
+
"license": "ISC",
|
|
40
|
+
"scripts": {
|
|
41
|
+
"build": "rm -rf build && tsc",
|
|
42
|
+
"test": "npm run test:bun && npm run test:node",
|
|
43
|
+
"test:bun": "bun test",
|
|
44
|
+
"test:node": "npm run build && node --experimental-vm-modules node_modules/jest/bin/jest.js --verbose --silent --runInBand",
|
|
45
|
+
"prepack": "npm run build && npm run test && npm run readme-tsdoc",
|
|
46
|
+
"readme-tsdoc": "readme-tsdoc --repo-url https://github.com/vanviegen/edinburgh"
|
|
47
|
+
},
|
|
48
|
+
"trustedDependencies": [
|
|
49
|
+
"olmdb"
|
|
50
|
+
],
|
|
51
|
+
"type": "module",
|
|
52
|
+
"dependencies": {
|
|
53
|
+
"olmdb": "^0.2.17",
|
|
54
|
+
"readme-tsdoc": "^1.1.4"
|
|
55
|
+
}
|
|
56
|
+
}
|