@webda/mongo 4.0.0-beta.2 → 4.0.0-beta.4

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.
@@ -0,0 +1,474 @@
1
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
2
+ var useValue = arguments.length > 2;
3
+ for (var i = 0; i < initializers.length; i++) {
4
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
5
+ }
6
+ return useValue ? value : void 0;
7
+ };
8
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
9
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
10
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
11
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
12
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
13
+ var _, done = false;
14
+ for (var i = decorators.length - 1; i >= 0; i--) {
15
+ var context = {};
16
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
17
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
18
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
19
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
20
+ if (kind === "accessor") {
21
+ if (result === void 0) continue;
22
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
23
+ if (_ = accept(result.get)) descriptor.get = _;
24
+ if (_ = accept(result.set)) descriptor.set = _;
25
+ if (_ = accept(result.init)) initializers.unshift(_);
26
+ }
27
+ else if (_ = accept(result)) {
28
+ if (kind === "field") initializers.unshift(_);
29
+ else descriptor[key] = _;
30
+ }
31
+ }
32
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
33
+ done = true;
34
+ };
35
+ import { EventRepository, InstanceCache, MemoryRepository, Store, StoreNotFoundError, StoreParameters, UpdateConditionFailError, useModelMetadata } from "@webda/core";
36
+ import * as WebdaQL from "@webda/ql";
37
+ import { MongoClient } from "mongodb";
38
+ /**
39
+ * MongoDB store parameters
40
+ */
41
+ export class MongoParameters extends StoreParameters {
42
+ /**
43
+ * @override
44
+ * @param params - raw parameters
45
+ * @returns this
46
+ */
47
+ load(params = {}) {
48
+ super.load(params);
49
+ this.mongoUrl ?? (this.mongoUrl = process.env["WEBDA_MONGO_URL"]);
50
+ if (this.mongoUrl === undefined) {
51
+ throw new Error("An URL is required for MongoDB service");
52
+ }
53
+ this.options ?? (this.options = {});
54
+ return this;
55
+ }
56
+ }
57
+ /**
58
+ * Get a mongodb query object from WebdaQL
59
+ * @param expression - the WebdaQL expression
60
+ * @returns the MongoDB filter
61
+ */
62
+ export function mapExpression(expression) {
63
+ if (expression instanceof WebdaQL.BooleanExpression) {
64
+ // TRUE matches every document, FALSE none: never let FALSE fail open
65
+ return expression.value ? {} : { $expr: false };
66
+ }
67
+ else if (expression instanceof WebdaQL.AndExpression) {
68
+ const children = expression.children.map(e => mapExpression(e));
69
+ if (children.some(c => c.$expr === false)) {
70
+ return { $expr: false };
71
+ }
72
+ // Use $and so two conditions on the same attribute do not override each other
73
+ const nonEmpty = children.filter(c => Object.keys(c).length > 0);
74
+ if (nonEmpty.length === 0) {
75
+ return {};
76
+ }
77
+ if (nonEmpty.length === 1) {
78
+ return nonEmpty[0];
79
+ }
80
+ return { $and: nonEmpty };
81
+ }
82
+ else if (expression instanceof WebdaQL.OrExpression) {
83
+ // An empty OR matches everything (as OrExpression.eval) and $or rejects an empty array
84
+ if (expression.children.length === 0) {
85
+ return {};
86
+ }
87
+ return {
88
+ $or: expression.children.map(e => mapExpression(e))
89
+ };
90
+ }
91
+ else if (expression instanceof WebdaQL.ComparisonExpression) {
92
+ const attribute = expression.attribute.join(".");
93
+ switch (expression.operator) {
94
+ case "=":
95
+ case "CONTAINS":
96
+ // MongoDB use same syntax for exact match or contains for an array
97
+ return { [attribute]: expression.value };
98
+ case "<":
99
+ return { [attribute]: { $lt: expression.value } };
100
+ case ">":
101
+ return { [attribute]: { $gt: expression.value } };
102
+ case "<=":
103
+ return { [attribute]: { $lte: expression.value } };
104
+ case ">=":
105
+ return { [attribute]: { $gte: expression.value } };
106
+ case "!=":
107
+ return { [attribute]: { $ne: expression.value } };
108
+ case "IN":
109
+ return { [attribute]: { $in: expression.value } };
110
+ case "LIKE":
111
+ return { [attribute]: WebdaQL.ComparisonExpression.likeToRegex(expression.value) };
112
+ case "IS NULL":
113
+ // Matches documents where the field is null or missing
114
+ return { [attribute]: null };
115
+ case "IS NOT NULL":
116
+ // Matches documents where the field exists and is not null
117
+ return { [attribute]: { $ne: null } };
118
+ }
119
+ }
120
+ return {};
121
+ }
122
+ /**
123
+ * MongoDB-backed repository for a single model class
124
+ *
125
+ * Every object is stored as a plain document with `_id` set to its primary key
126
+ * and `__type` set to its model identifier, so several models can share one
127
+ * collection. The inherited MemoryRepository helpers are only used for primary
128
+ * key and class filter computation.
129
+ */
130
+ export class MongoRepository extends MemoryRepository {
131
+ /**
132
+ * @param model - the model class
133
+ * @param pks - primary key field names
134
+ * @param getCollection - return the collection, connecting if needed
135
+ * @param separator - composite key separator
136
+ */
137
+ constructor(model, pks, getCollection, separator) {
138
+ super(model, pks, separator);
139
+ this.getCollection = getCollection;
140
+ }
141
+ /**
142
+ * Convert an object to the document stored in MongoDB
143
+ * @param item - the model instance or raw data
144
+ * @param key - the primary key
145
+ * @returns the document
146
+ */
147
+ toDocument(item, key) {
148
+ const doc = JSON.parse(JSON.stringify(item));
149
+ doc._id = key;
150
+ const type = item?.constructor?.Metadata?.Identifier ?? this.model.Metadata?.Identifier;
151
+ if (type) {
152
+ doc.__type = type;
153
+ }
154
+ return doc;
155
+ }
156
+ /**
157
+ * Convert a stored document into a model instance
158
+ * @param doc - the MongoDB document
159
+ * @returns the model instance
160
+ */
161
+ fromDocument(doc) {
162
+ const { _id, __type, ...data } = doc;
163
+ const instance = new this.model(data);
164
+ if (typeof instance.load === "function") {
165
+ instance.load(data);
166
+ }
167
+ else {
168
+ Object.assign(instance, data);
169
+ }
170
+ Object.defineProperty(instance, "__type", {
171
+ value: __type ?? this.model.Metadata?.Identifier,
172
+ enumerable: false,
173
+ configurable: true,
174
+ writable: true
175
+ });
176
+ return instance;
177
+ }
178
+ /**
179
+ * Return a filter for Mongo command
180
+ * @param key - the primary key
181
+ * @param conditionField - field to check
182
+ * @param condition - expected value
183
+ * @returns the filter
184
+ */
185
+ getFilter(key, conditionField, condition) {
186
+ const filter = { _id: key };
187
+ if (conditionField) {
188
+ filter[String(conditionField)] = condition instanceof Date ? condition.toISOString() : condition;
189
+ }
190
+ return filter;
191
+ }
192
+ /** @override */
193
+ async get(primaryKey) {
194
+ const key = this.getPrimaryKey(primaryKey).toString();
195
+ const doc = await (await this.getCollection()).findOne({ _id: key });
196
+ if (doc === null) {
197
+ throw new Error(`Not found: ${key}`);
198
+ }
199
+ return this.fromDocument(doc);
200
+ }
201
+ /** @override */
202
+ async create(data, save = true) {
203
+ // Build the item once so a primary key generated by the model (e.g. UuidModel)
204
+ // is the one stored, even when the input carries an undefined key
205
+ const item = this.buildItem(data);
206
+ const key = this.getPrimaryKey(item).toString();
207
+ if (save !== false) {
208
+ try {
209
+ await (await this.getCollection()).insertOne(this.toDocument(item, key));
210
+ }
211
+ catch (err) {
212
+ if (err?.code === 11000) {
213
+ throw new Error(`Already exists: ${key}`);
214
+ }
215
+ throw err;
216
+ }
217
+ }
218
+ return item;
219
+ }
220
+ /** @override */
221
+ async update(data, conditionField, condition) {
222
+ const key = this.getPrimaryKey(data).toString();
223
+ const res = await (await this.getCollection()).replaceOne(this.getFilter(key, conditionField, condition), this.toDocument(data, key));
224
+ if (res.matchedCount === 0) {
225
+ throw new UpdateConditionFailError(key, conditionField, condition);
226
+ }
227
+ }
228
+ /** @override */
229
+ async patch(primaryKey, data, conditionField, condition) {
230
+ const key = this.getPrimaryKey(primaryKey).toString();
231
+ const $set = JSON.parse(JSON.stringify(data));
232
+ delete $set._id;
233
+ delete $set.__type;
234
+ const res = await (await this.getCollection()).updateOne(this.getFilter(key, conditionField, condition), { $set });
235
+ if (res.matchedCount === 0) {
236
+ throw new UpdateConditionFailError(key, conditionField, condition);
237
+ }
238
+ }
239
+ /** @override */
240
+ async delete(primaryKey, conditionField, condition) {
241
+ const key = this.getPrimaryKey(primaryKey).toString();
242
+ const res = await (await this.getCollection()).deleteOne(this.getFilter(key, conditionField, condition));
243
+ if (conditionField && res.deletedCount === 0) {
244
+ throw new UpdateConditionFailError(key, conditionField, condition);
245
+ }
246
+ }
247
+ /** @override */
248
+ async exists(primaryKey) {
249
+ const key = this.getPrimaryKey(primaryKey).toString();
250
+ return (await (await this.getCollection()).countDocuments({ _id: key }, { limit: 1 })) === 1;
251
+ }
252
+ /** @override */
253
+ async removeAttribute(primaryKey, attribute, conditionField, condition) {
254
+ const key = this.getPrimaryKey(primaryKey).toString();
255
+ const res = await (await this.getCollection()).updateOne(this.getFilter(key, conditionField, condition), {
256
+ $unset: { [String(attribute)]: 1 },
257
+ $set: { _lastUpdate: new Date().toISOString() }
258
+ });
259
+ if (res.matchedCount === 0) {
260
+ if (conditionField) {
261
+ throw new UpdateConditionFailError(key, conditionField, condition);
262
+ }
263
+ throw new StoreNotFoundError(key, this.getCollectionName());
264
+ }
265
+ }
266
+ /** @override */
267
+ async incrementAttributes(primaryKey, info, conditionField, condition) {
268
+ const key = this.getPrimaryKey(primaryKey).toString();
269
+ const $inc = {};
270
+ if (Array.isArray(info)) {
271
+ for (const e of info) {
272
+ if (typeof e === "string") {
273
+ $inc[e] = 1;
274
+ }
275
+ else {
276
+ $inc[e.property] = e.value ?? 1;
277
+ }
278
+ }
279
+ }
280
+ else {
281
+ for (const [property, value] of Object.entries(info)) {
282
+ $inc[property] = value;
283
+ }
284
+ }
285
+ const res = await (await this.getCollection()).updateOne(this.getFilter(key, conditionField, condition), {
286
+ $inc,
287
+ $set: { _lastUpdate: new Date().toISOString() }
288
+ });
289
+ if (res.matchedCount === 0) {
290
+ if (conditionField) {
291
+ throw new UpdateConditionFailError(key, conditionField, condition);
292
+ }
293
+ throw new StoreNotFoundError(key, this.getCollectionName());
294
+ }
295
+ }
296
+ /** @override */
297
+ async upsertItemToCollection(primaryKey, collection, item, index, itemWriteConditionField, itemWriteCondition) {
298
+ const key = this.getPrimaryKey(primaryKey).toString();
299
+ const prop = String(collection);
300
+ const filter = { _id: key };
301
+ const value = JSON.parse(JSON.stringify(item));
302
+ let params;
303
+ if (index === undefined) {
304
+ params = { $push: { [prop]: value }, $set: { _lastUpdate: new Date().toISOString() } };
305
+ }
306
+ else {
307
+ params = { $set: { [`${prop}.${index}`]: value, _lastUpdate: new Date().toISOString() } };
308
+ if (itemWriteCondition !== undefined) {
309
+ filter[`${prop}.${index}.${String(itemWriteConditionField)}`] = itemWriteCondition;
310
+ }
311
+ }
312
+ const res = await (await this.getCollection()).updateOne(filter, params);
313
+ if (res.matchedCount === 0) {
314
+ if (itemWriteCondition !== undefined) {
315
+ throw new UpdateConditionFailError(key, String(itemWriteConditionField), itemWriteCondition);
316
+ }
317
+ throw new StoreNotFoundError(key, this.getCollectionName());
318
+ }
319
+ }
320
+ /** @override */
321
+ async deleteItemFromCollection(primaryKey, collection, index, itemWriteConditionField, itemWriteCondition) {
322
+ const key = this.getPrimaryKey(primaryKey).toString();
323
+ const prop = String(collection);
324
+ const filter = { _id: key };
325
+ if (itemWriteCondition !== undefined) {
326
+ filter[`${prop}.${index}.${String(itemWriteConditionField)}`] = itemWriteCondition;
327
+ }
328
+ const col = await this.getCollection();
329
+ // MongoDB cannot remove an array element by index: unset it then pull the null
330
+ const res = await col.updateOne(filter, {
331
+ $unset: { [`${prop}.${index}`]: 1 },
332
+ $set: { _lastUpdate: new Date().toISOString() }
333
+ });
334
+ if (res.matchedCount === 0) {
335
+ if (itemWriteCondition !== undefined) {
336
+ throw new UpdateConditionFailError(key, String(itemWriteConditionField), itemWriteCondition);
337
+ }
338
+ throw new StoreNotFoundError(key, this.getCollectionName());
339
+ }
340
+ await col.updateOne({ _id: key }, { $pull: { [prop]: null } });
341
+ }
342
+ /**
343
+ * Build the MongoDB filter restricting results to this model and its subclasses
344
+ *
345
+ * Documents without `__type` are considered as instance of the repository model
346
+ * @returns the class filter or undefined if the model has no metadata
347
+ */
348
+ getClassFilter() {
349
+ const ids = this.buildClassFilterIdentifiers();
350
+ if (!ids) {
351
+ return undefined;
352
+ }
353
+ return { $or: [{ __type: { $in: ids } }, { __type: { $exists: false } }] };
354
+ }
355
+ /** @override — translate the WebdaQL query to a MongoDB find */
356
+ async query(query) {
357
+ const parsed = typeof query === "string" ? WebdaQL.parse(query) : query;
358
+ let offset = parseInt(parsed.continuationToken);
359
+ if (isNaN(offset)) {
360
+ offset = 0;
361
+ }
362
+ const sort = {};
363
+ for (const order of parsed.orderBy ?? []) {
364
+ sort[order.field] = order.direction === "ASC" ? 1 : -1;
365
+ }
366
+ const limit = parsed.limit || 1000;
367
+ let filter = mapExpression(parsed.filter);
368
+ const classFilter = this.getClassFilter();
369
+ if (classFilter) {
370
+ filter = Object.keys(filter).length ? { $and: [classFilter, filter] } : classFilter;
371
+ }
372
+ const docs = await (await this.getCollection()).find(filter).sort(sort).skip(offset).limit(limit).toArray();
373
+ const results = docs.map(doc => this.fromDocument(doc));
374
+ return {
375
+ results,
376
+ continuationToken: results.length >= limit ? (offset + limit).toString() : undefined
377
+ };
378
+ }
379
+ /**
380
+ * Name of the underlying collection, used in errors
381
+ * @returns the collection name
382
+ */
383
+ getCollectionName() {
384
+ return this.model.Metadata?.Identifier ?? "MongoDB";
385
+ }
386
+ }
387
+ /**
388
+ * Store Objects in MongoDB
389
+ *
390
+ * Parameters:
391
+ * mongoUrl: 'mongodb://127.0.0.1:27017' // If not found try to read WEBDA_MONGO_URL env variable
392
+ *
393
+ * @WebdaModda
394
+ */
395
+ let MongoStore = (() => {
396
+ var _a;
397
+ let _classSuper = Store;
398
+ let _instanceExtraInitializers = [];
399
+ let _getRepository_decorators;
400
+ return _a = class MongoStore extends _classSuper {
401
+ constructor() {
402
+ super(...arguments);
403
+ /**
404
+ * Connect promise
405
+ */
406
+ this._connectPromise = (__runInitializers(this, _instanceExtraInitializers), undefined);
407
+ }
408
+ /**
409
+ * Connect to MongoDB if not already connected
410
+ * @returns the collection
411
+ */
412
+ async _connect() {
413
+ this._connectPromise ?? (this._connectPromise = (async () => {
414
+ this._client = await new MongoClient(this.parameters.mongoUrl, this.parameters.options).connect();
415
+ this._db = this._client.db(this.parameters.database, this.parameters.databaseOptions);
416
+ this._collection = this._db.collection(this.parameters.collection);
417
+ return this._collection;
418
+ })());
419
+ return this._connectPromise;
420
+ }
421
+ /**
422
+ * @override
423
+ */
424
+ async init() {
425
+ await this._connect();
426
+ return super.init();
427
+ }
428
+ /**
429
+ * @override
430
+ */
431
+ async stop() {
432
+ if (this._connectPromise) {
433
+ this._connectPromise = undefined;
434
+ await this._client?.close();
435
+ this._client = undefined;
436
+ this._db = undefined;
437
+ this._collection = undefined;
438
+ }
439
+ await super.stop();
440
+ }
441
+ /**
442
+ * Build and return a MongoRepository for the given model
443
+ *
444
+ * The collection is resolved lazily so the repository can be registered
445
+ * before the store is connected.
446
+ * @param model - the model class
447
+ * @returns a repository backed by the store collection
448
+ */
449
+ getRepository(model) {
450
+ const meta = useModelMetadata(model);
451
+ const pks = meta.PrimaryKey;
452
+ const inner = new MongoRepository(model, pks, () => this._connect(), meta.PrimaryKeySeparator);
453
+ // Wrap in EventRepository so typed CRUD events fire; consumers reach them
454
+ // via useRepository(model).on(...).
455
+ return new EventRepository(model, pks, inner, meta.PrimaryKeySeparator);
456
+ }
457
+ /**
458
+ * Remove every document from the collection (used in tests)
459
+ */
460
+ async __clean() {
461
+ await (await this._connect()).deleteMany({});
462
+ }
463
+ },
464
+ (() => {
465
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
466
+ _getRepository_decorators = [InstanceCache()];
467
+ __esDecorate(_a, null, _getRepository_decorators, { kind: "method", name: "getRepository", static: false, private: false, access: { has: obj => "getRepository" in obj, get: obj => obj.getRepository }, metadata: _metadata }, null, _instanceExtraInitializers);
468
+ if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
469
+ })(),
470
+ _a;
471
+ })();
472
+ export { MongoStore };
473
+ export default MongoStore;
474
+ //# sourceMappingURL=mongodb.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongodb.service.js","sourceRoot":"","sources":["../src/mongodb.service.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webda/mongo",
3
- "version": "4.0.0-beta.2",
3
+ "version": "4.0.0-beta.4",
4
4
  "description": "Implements Mongo DB on webda",
5
5
  "keywords": [
6
6
  "mongo",
@@ -10,38 +10,16 @@
10
10
  "repository": "git://github.com/loopingz/webda.io.git",
11
11
  "main": "lib/index.js",
12
12
  "typings": "lib/index.d.ts",
13
- "scripts": {
14
- "build": "webda build",
15
- "build:watch": "webda build --watch",
16
- "pretest": "npm run build",
17
- "lint": "eslint",
18
- "lint:fix": "eslint --fix",
19
- "test": "c8 mocha",
20
- "format": "prettier --check src/**/*",
21
- "format:fix": "prettier --write src/**/*"
22
- },
23
13
  "dependencies": {
24
- "@webda/core": "^4.0.0-beta.2",
25
- "@webda/ql": "^4.0.0-beta.2",
26
- "mongodb": "^6.0.0"
14
+ "mongodb": "^7.1.1",
15
+ "@webda/core": "4.0.0-beta.4",
16
+ "@webda/ql": "4.0.0-beta.3"
27
17
  },
28
18
  "files": [
29
19
  "lib",
30
20
  "test",
31
21
  "webda.module.json"
32
22
  ],
33
- "c8": {
34
- "report-dir": "./reports",
35
- "reporter": [
36
- "html",
37
- "lcov",
38
- "json",
39
- "text"
40
- ],
41
- "exclude": [
42
- "**/*.spec.ts"
43
- ]
44
- },
45
23
  "homepage": "https://webda.io",
46
24
  "publishConfig": {
47
25
  "access": "public"
@@ -50,21 +28,37 @@
50
28
  "namespace": "Webda"
51
29
  },
52
30
  "devDependencies": {
53
- "@testdeck/mocha": "^0.3.2",
54
- "@types/node": "20.0.0",
55
- "@webda/shell": "^4.0.0-beta.2",
56
- "tsx": "^4.17.0"
31
+ "@types/node": "25.5.0",
32
+ "@vitest/coverage-v8": "^4.1.2",
33
+ "jscodeshift": "^17.3.0",
34
+ "skott": "^0.35.8",
35
+ "tsx": "^4.21.0",
36
+ "typescript": "7.1.0-dev.20260929.1",
37
+ "vite": "^6.0.0",
38
+ "vitest": "^4.1.2",
39
+ "@webda/compiler": "^4.0.0-beta.4",
40
+ "@webda/test": "4.0.0-beta.3"
57
41
  },
58
42
  "type": "module",
59
43
  "engines": {
60
- "node": ">=20.0.0"
44
+ "node": ">=22.0.0"
61
45
  },
62
46
  "nx": {
63
47
  "implicitDependencies": [
64
- "@webda/core",
65
- "@webda/shell"
48
+ "@webda/core"
66
49
  ]
67
50
  },
68
51
  "license": "LGPL-3.0-only",
69
- "gitHead": "e992dcfb82cefa6cd5c61c54a0e63778b6f53d8e"
70
- }
52
+ "scripts": {
53
+ "build": "webdac build",
54
+ "build:watch": "webdac build --watch",
55
+ "pretest": "npm run build",
56
+ "lint": "eslint",
57
+ "lint:fix": "eslint --fix",
58
+ "test": "vitest run",
59
+ "format": "prettier --check src/**/*",
60
+ "format:fix": "prettier --write src/**/*",
61
+ "deps:graph": "skott --showCircularDependencies --no-trackTypeOnlyDependencies --displayMode=raw -e .ts",
62
+ "codemod": "jscodeshift --parser=ts --extensions=tsx,ts -t ../codemod/current.mjs src"
63
+ }
64
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "version": 2,
3
+ "parameters": {},
4
+ "services": {}
5
+ }