@owlmeans/mongo-resource 0.1.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.
Files changed (56) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +807 -0
  3. package/build/.gitkeep +0 -0
  4. package/build/consts.d.ts +3 -0
  5. package/build/consts.d.ts.map +1 -0
  6. package/build/consts.js +3 -0
  7. package/build/consts.js.map +1 -0
  8. package/build/helper.d.ts +3 -0
  9. package/build/helper.d.ts.map +1 -0
  10. package/build/helper.js +3 -0
  11. package/build/helper.js.map +1 -0
  12. package/build/index.d.ts +5 -0
  13. package/build/index.d.ts.map +1 -0
  14. package/build/index.js +4 -0
  15. package/build/index.js.map +1 -0
  16. package/build/resource.d.ts +4 -0
  17. package/build/resource.d.ts.map +1 -0
  18. package/build/resource.js +268 -0
  19. package/build/resource.js.map +1 -0
  20. package/build/types.d.ts +20 -0
  21. package/build/types.d.ts.map +1 -0
  22. package/build/types.js +2 -0
  23. package/build/types.js.map +1 -0
  24. package/build/utils/index.d.ts +5 -0
  25. package/build/utils/index.d.ts.map +1 -0
  26. package/build/utils/index.js +5 -0
  27. package/build/utils/index.js.map +1 -0
  28. package/build/utils/indexes.d.ts +5 -0
  29. package/build/utils/indexes.d.ts.map +1 -0
  30. package/build/utils/indexes.js +34 -0
  31. package/build/utils/indexes.js.map +1 -0
  32. package/build/utils/life-cycle.d.ts +7 -0
  33. package/build/utils/life-cycle.d.ts.map +1 -0
  34. package/build/utils/life-cycle.js +48 -0
  35. package/build/utils/life-cycle.js.map +1 -0
  36. package/build/utils/name.d.ts +4 -0
  37. package/build/utils/name.d.ts.map +1 -0
  38. package/build/utils/name.js +2 -0
  39. package/build/utils/name.js.map +1 -0
  40. package/build/utils/schema.d.ts +4 -0
  41. package/build/utils/schema.d.ts.map +1 -0
  42. package/build/utils/schema.js +63 -0
  43. package/build/utils/schema.js.map +1 -0
  44. package/package.json +41 -0
  45. package/src/consts.ts +4 -0
  46. package/src/helper.ts +5 -0
  47. package/src/index.ts +5 -0
  48. package/src/resource.ts +349 -0
  49. package/src/types.ts +17 -0
  50. package/src/utils/index.ts +5 -0
  51. package/src/utils/indexes.ts +38 -0
  52. package/src/utils/life-cycle.ts +64 -0
  53. package/src/utils/name.ts +5 -0
  54. package/src/utils/schema.ts +82 -0
  55. package/tsconfig.json +14 -0
  56. package/tsconfig.tsbuildinfo +1 -0
package/build/.gitkeep ADDED
File without changes
@@ -0,0 +1,3 @@
1
+ export declare const DEFAULT_DB_ALIAS = "mongo";
2
+ export declare const DEFAULT_PAGE_SIZE = 10;
3
+ //# sourceMappingURL=consts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consts.d.ts","sourceRoot":"","sources":["../src/consts.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,gBAAgB,UAAU,CAAA;AAEvC,eAAO,MAAM,iBAAiB,KAAK,CAAA"}
@@ -0,0 +1,3 @@
1
+ export const DEFAULT_DB_ALIAS = 'mongo';
2
+ export const DEFAULT_PAGE_SIZE = 10;
3
+ //# sourceMappingURL=consts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consts.js","sourceRoot":"","sources":["../src/consts.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAA;AAEvC,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { AnySchema } from "ajv";
2
+ export declare const getSchemaSecureFeilds: (schema: AnySchema) => string[];
3
+ //# sourceMappingURL=helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../src/helper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,KAAK,CAAA;AAEpD,eAAO,MAAM,qBAAqB,WAAY,SAAS,KAAG,MAAM,EAEgB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export const getSchemaSecureFeilds = (schema) => Object.entries(schema?.properties)
2
+ .filter(([, prop]) => prop.secure === true).map(([key]) => key);
3
+ //# sourceMappingURL=helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helper.js","sourceRoot":"","sources":["../src/helper.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,MAAiB,EAAY,EAAE,CACjE,MAAM,CAAC,OAAO,CAAE,MAA8B,EAAE,UAAU,CAAC;KACtD,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAE,IAAY,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ export type * from './types.js';
2
+ export * from './consts.js';
3
+ export * from './resource.js';
4
+ export * from './helper.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,mBAAmB,YAAY,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA"}
package/build/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export * from './consts.js';
2
+ export * from './resource.js';
3
+ export * from './helper.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { ResourceMaker, ResourceRecord } from '@owlmeans/resource';
2
+ import type { MongoResource } from './types.js';
3
+ export declare const makeMongoResource: <R extends ResourceRecord, T extends MongoResource<R> = MongoResource<R>>(alias: string, dbAlias?: string, serviceAlias?: string, makeCustomResource?: ResourceMaker<R, T>) => T;
4
+ //# sourceMappingURL=resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAgB,aAAa,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAErF,OAAO,KAAK,EAAkB,aAAa,EAAE,MAAM,YAAY,CAAA;AAU/D,eAAO,MAAM,iBAAiB,GAC5B,CAAC,SAAS,cAAc,EAAE,CAAC,SAAS,aAAa,CAAC,CAAC,CAAC,4BAE7C,MAAM,YAAW,MAAM,iBAAmC,MAAM,uBAClD,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,KACvC,CAkRF,CAAA"}
@@ -0,0 +1,268 @@
1
+ import { appendContextual, assertContext } from '@owlmeans/context';
2
+ import { DEFAULT_DB_ALIAS, DEFAULT_PAGE_SIZE } from './consts.js';
3
+ import { initializeCollection } from './utils/life-cycle.js';
4
+ import { ObjectId } from 'mongodb';
5
+ import { MisshapedRecord, RecordExists, UnknownRecordError, UnsupportedArgumentError, RecordUpdateFailed, prepareListOptions } from '@owlmeans/resource';
6
+ import { getSchemaSecureFeilds } from './helper.js';
7
+ export const makeMongoResource = (alias, dbAlias = DEFAULT_DB_ALIAS, serviceAlias = DEFAULT_DB_ALIAS, makeCustomResource) => {
8
+ const location = `mongo-resource:${alias}`;
9
+ const resource = appendContextual(alias, {
10
+ get: async (id, field, opts) => {
11
+ const record = await resource.load(id, field, opts);
12
+ if (record == null) {
13
+ throw new UnknownRecordError(id);
14
+ }
15
+ return record;
16
+ },
17
+ load: async (id, field, opts) => {
18
+ if (typeof field === 'object') {
19
+ opts = field;
20
+ field = field.field;
21
+ }
22
+ field = field ?? '_id';
23
+ const criteria = '_id' === field ? new ObjectId(id) : id;
24
+ if (opts?.ttl != null) {
25
+ throw new UnsupportedArgumentError('ttl');
26
+ }
27
+ const record = await resource.collection.findOne({ [field]: criteria });
28
+ if (record != null) {
29
+ record.id = record._id instanceof ObjectId ? record._id.toString() : record._id;
30
+ delete record._id;
31
+ }
32
+ return record;
33
+ },
34
+ update: async (record, opts) => {
35
+ let field = '_id';
36
+ if (typeof opts === 'string') {
37
+ field = opts;
38
+ }
39
+ else if (typeof opts === 'object') {
40
+ field = opts.field ?? field;
41
+ }
42
+ if (field !== '_id' && record[field] == null) {
43
+ throw new MisshapedRecord('no-field-value');
44
+ }
45
+ const id = field == '_id' ? record.id : record[field];
46
+ if (id == null) {
47
+ throw new MisshapedRecord('id');
48
+ }
49
+ const original = await resource.get(id, field);
50
+ const criteria = '_id' === field ? new ObjectId(id) : id;
51
+ const replace = { ...record, _id: new ObjectId(original.id) };
52
+ if (replace.id != null) {
53
+ delete replace.id;
54
+ }
55
+ const result = await resource.collection.replaceOne({ [field]: criteria }, _prepareValues(replace, resource.schema));
56
+ if (!result.acknowledged) {
57
+ throw new RecordUpdateFailed(`${field}:${id}`);
58
+ }
59
+ return resource.get(id, opts);
60
+ },
61
+ save: async (record, opts) => {
62
+ const id = record.id;
63
+ if (id != null || (typeof opts === 'string' && record[opts] != null) || (typeof opts === 'object' && ("field" in opts)
64
+ && record[opts.field] != null)) {
65
+ return resource.update(record, opts);
66
+ }
67
+ return resource.create(record, typeof opts !== 'string' ? opts : undefined);
68
+ },
69
+ getDefaults: () => {
70
+ const schema = resource.schema;
71
+ if (schema == null) {
72
+ return {};
73
+ }
74
+ return Object.entries(schema.properties ?? {}).reduce((defaults, [key, value]) => {
75
+ if (value.default == null) {
76
+ return defaults;
77
+ }
78
+ return { ...defaults, [key]: value.default };
79
+ }, {});
80
+ },
81
+ create: async (record, opts) => {
82
+ if ("id" in record && record.id == null) {
83
+ delete record.id;
84
+ }
85
+ if (record.id != null) {
86
+ throw new RecordExists('id-present');
87
+ }
88
+ if (opts != null && opts.ttl != null) {
89
+ throw new UnsupportedArgumentError('ttl');
90
+ }
91
+ const result = await resource.collection.insertOne({
92
+ ...resource.getDefaults(),
93
+ ..._prepareValues(record, resource.schema)
94
+ });
95
+ if (!result.acknowledged) {
96
+ throw new RecordUpdateFailed(`creation`);
97
+ }
98
+ const id = result.insertedId;
99
+ return resource.get(id.toString());
100
+ },
101
+ delete: async (id, opts) => {
102
+ let record = null;
103
+ if (typeof id === 'object') {
104
+ if (id.id == null) {
105
+ throw new MisshapedRecord('id');
106
+ }
107
+ record = await resource.load(id.id);
108
+ }
109
+ else {
110
+ record = await resource.load(id, opts);
111
+ }
112
+ if (record == null) {
113
+ return null;
114
+ }
115
+ let field = '_id';
116
+ if (typeof opts === 'string') {
117
+ field = opts;
118
+ opts = undefined;
119
+ }
120
+ else if (typeof opts === 'object') {
121
+ field = opts.field ?? field;
122
+ }
123
+ const _id = field == '_id' ? record.id : record[field];
124
+ if (id == null) {
125
+ throw new MisshapedRecord('id');
126
+ }
127
+ const criteria = '_id' === field ? new ObjectId(_id) : _id;
128
+ const result = await resource.collection.deleteOne({ [field]: criteria });
129
+ if (!result.acknowledged || result.deletedCount === 0) {
130
+ return null;
131
+ }
132
+ return record;
133
+ },
134
+ pick: async (id, opts) => {
135
+ const record = await resource.delete(id, opts);
136
+ if (record == null) {
137
+ throw new UnknownRecordError(typeof id == 'string' ? id : (id.id ?? 'unknown'));
138
+ }
139
+ return record;
140
+ },
141
+ list: async (criteria, opts) => {
142
+ const options = prepareListOptions(DEFAULT_PAGE_SIZE, criteria, opts);
143
+ criteria = options.criteria;
144
+ const pager = options.pager ?? {};
145
+ const size = pager?.size ?? DEFAULT_PAGE_SIZE;
146
+ const total = await resource.collection.countDocuments(criteria);
147
+ pager.total = total;
148
+ const skip = (pager.page ?? 0) * size;
149
+ if (total === 0 && skip >= total) {
150
+ return { items: [], pager };
151
+ }
152
+ let cursor = resource.collection.find(criteria)
153
+ .skip(skip).limit(size);
154
+ if (pager.sort != null) {
155
+ cursor = cursor.sort(typeof pager.sort === 'string'
156
+ ? pager.sort
157
+ : pager.sort.reduce((sort, [field, order]) => ({ ...sort, [field]: order ? -1 : 1 }), {}));
158
+ }
159
+ const items = await cursor.toArray();
160
+ return {
161
+ pager, items: items.map(item => {
162
+ const _item = { ...item };
163
+ _item.id = item._id.toString();
164
+ delete _item._id;
165
+ return _item;
166
+ })
167
+ };
168
+ },
169
+ lock: async (record, fields) => {
170
+ fields ??= getSchemaSecureFeilds(resource.schema ?? {});
171
+ if (fields == null || fields.length < 1) {
172
+ throw new SyntaxError(`No fields to lock: ${JSON.stringify(record)}`);
173
+ }
174
+ const context = assertContext(resource.ctx, location);
175
+ const mongo = context.service(serviceAlias ?? dbAlias);
176
+ return mongo.lock(dbAlias, record, fields);
177
+ },
178
+ unlock: async (record, fields) => {
179
+ fields ??= getSchemaSecureFeilds(resource.schema ?? {});
180
+ if (fields == null || fields.length < 1) {
181
+ throw new SyntaxError(`No fields to unlock: ${JSON.stringify(record)}`);
182
+ }
183
+ const context = assertContext(resource.ctx, location);
184
+ const mongo = context.service(serviceAlias ?? dbAlias);
185
+ return mongo.unlock(dbAlias, record, fields);
186
+ },
187
+ db: async () => {
188
+ const context = assertContext(resource.ctx, location);
189
+ const mongo = context.service(serviceAlias ?? dbAlias);
190
+ await mongo.ready();
191
+ return await mongo.db(dbAlias);
192
+ },
193
+ client: async () => {
194
+ const context = assertContext(resource.ctx, location);
195
+ const mongo = context.service(serviceAlias ?? dbAlias);
196
+ await mongo.ready();
197
+ return await mongo.client(dbAlias);
198
+ },
199
+ index: (name, index, options) => {
200
+ resource.indexes = resource.indexes ?? [];
201
+ resource.indexes.push({ name, index, options });
202
+ return resource;
203
+ }
204
+ });
205
+ resource.init = async () => {
206
+ const context = assertContext(resource.ctx, location);
207
+ const mongo = context.service(serviceAlias ?? dbAlias);
208
+ await mongo.ready();
209
+ const db = await mongo.db(dbAlias);
210
+ const config = mongo.config(dbAlias);
211
+ resource.collection = await initializeCollection(db, config, resource);
212
+ };
213
+ resource.reinitializeContext = (context) => {
214
+ const resource = (makeCustomResource?.(dbAlias, serviceAlias)
215
+ ?? makeMongoResource(alias, dbAlias, serviceAlias));
216
+ resource.ctx = context;
217
+ return resource;
218
+ };
219
+ return resource;
220
+ };
221
+ const _prepareValues = (obj, schema) => {
222
+ // @TODO Validate keys from additional properties in the root
223
+ return schema != null ? Object.fromEntries(Object.entries(obj).map(([key, value]) => {
224
+ // @TODO What if we reference another table by object id in another field?
225
+ // How to properly transform them?
226
+ // What if _id isn't an Object Id?
227
+ if (key === '_id') {
228
+ return [key, new ObjectId(value)];
229
+ }
230
+ const type = schema.properties?.[key];
231
+ if (type?.type === 'object') {
232
+ if (type.format === 'date-time') {
233
+ return [key, new Date(value)];
234
+ }
235
+ if (type.additionalProperties != null && type.additionalProperties.type === 'object') {
236
+ value = Object.fromEntries(Object.entries(value).map(([key, value]) => {
237
+ return [key, _prepareSingleValue(value, type.additionalProperties)];
238
+ }));
239
+ return [key, value];
240
+ }
241
+ return [key, _prepareValues(value, type)];
242
+ }
243
+ else if (type?.type === 'array') {
244
+ return [key, value.map(item => _prepareSingleValue(item, type.items))];
245
+ }
246
+ return [key, _prepareSingleValue(value, type)];
247
+ })) : obj;
248
+ };
249
+ const _prepareSingleValue = (value, schema) => {
250
+ if (['object', 'array'].includes(schema?.type)) {
251
+ return _prepareValues(value, schema);
252
+ }
253
+ if (schema?.type === 'string' && value != null) {
254
+ return `${value}`;
255
+ }
256
+ if (schema?.type === 'number' && value != null) {
257
+ return +value;
258
+ }
259
+ if (schema?.type === 'boolean' && value != null) {
260
+ return !!value;
261
+ }
262
+ if (value == null) {
263
+ return value;
264
+ }
265
+ // We sclarize value forcefully if we don't expect any tricks here
266
+ return `${value}`;
267
+ };
268
+ //# sourceMappingURL=resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.js","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Resource, ResourceRecord, ResourceDbService, DbLocker, ResourceLocker } from '@owlmeans/resource';
2
+ import type { Collection, CreateIndexesOptions, Db, IndexSpecification, MongoClient } from 'mongodb';
3
+ import type { AnySchema } from 'ajv';
4
+ export interface MongoResource<T extends ResourceRecord> extends Resource<T>, ResourceLocker<T> {
5
+ name?: string;
6
+ schema?: AnySchema;
7
+ indexes?: Array<{
8
+ name: string;
9
+ index: IndexSpecification;
10
+ options?: CreateIndexesOptions;
11
+ }>;
12
+ collection: Collection;
13
+ db: () => Promise<Db>;
14
+ client: () => Promise<MongoClient>;
15
+ index: <Type extends MongoResource<T>>(name: string, index: IndexSpecification, options?: CreateIndexesOptions) => Type;
16
+ getDefaults: () => Partial<T>;
17
+ }
18
+ export interface MongoDbService extends ResourceDbService<Db, MongoClient>, DbLocker<ResourceRecord> {
19
+ }
20
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,iBAAiB,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAC/G,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,EAAE,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACpG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAA;AAEpC,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,cAAc,CAAE,SAAQ,QAAQ,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;IAC7F,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,kBAAkB,CAAC;QAAC,OAAO,CAAC,EAAE,oBAAoB,CAAA;KAAE,CAAC,CAAA;IAC5F,UAAU,EAAE,UAAU,CAAA;IACtB,EAAE,EAAE,MAAM,OAAO,CAAC,EAAE,CAAC,CAAA;IACrB,MAAM,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,CAAA;IAClC,KAAK,EAAE,CAAC,IAAI,SAAS,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,oBAAoB,KAAK,IAAI,CAAA;IACvH,WAAW,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAA;CAC9B;AAED,MAAM,WAAW,cAAe,SAAQ,iBAAiB,CAAC,EAAE,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC;CACnG"}
package/build/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ export * from './indexes.js';
2
+ export * from './schema.js';
3
+ export * from './name.js';
4
+ export * from './life-cycle.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,iBAAiB,CAAA"}
@@ -0,0 +1,5 @@
1
+ export * from './indexes.js';
2
+ export * from './schema.js';
3
+ export * from './name.js';
4
+ export * from './life-cycle.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,iBAAiB,CAAA"}
@@ -0,0 +1,5 @@
1
+ import type { ResourceRecord } from '@owlmeans/resource';
2
+ import type { MongoResource } from '../types.js';
3
+ import type { Collection } from 'mongodb';
4
+ export declare const updateIndexes: (collection: Collection, resource: MongoResource<ResourceRecord>) => Promise<void>;
5
+ //# sourceMappingURL=indexes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexes.d.ts","sourceRoot":"","sources":["../../src/utils/indexes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEzC,eAAO,MAAM,aAAa,eAAsB,UAAU,YAAY,aAAa,CAAC,cAAc,CAAC,kBAiClG,CAAA"}
@@ -0,0 +1,34 @@
1
+ export const updateIndexes = async (collection, resource) => {
2
+ if (resource.indexes != null) {
3
+ await Promise.all(resource.indexes.map(async (index) => {
4
+ const _index = (await collection.indexes()).find(_index => _index.name === index.name);
5
+ if (_index != null) {
6
+ const existing = { ..._index };
7
+ if ('name' in existing) {
8
+ delete existing.name;
9
+ }
10
+ if ('v' in existing) {
11
+ delete existing.v;
12
+ }
13
+ const propsed = { key: index.index, ...index.options };
14
+ // We do not recreate text indexes
15
+ if (JSON.stringify(existing) !== JSON.stringify(propsed) && !('weights' in existing)) {
16
+ console.info(JSON.stringify(existing));
17
+ console.info(JSON.stringify(propsed));
18
+ console.debug(`Recreate index ${resource.alias} : ${index.name}`);
19
+ await collection.dropIndex(index.name);
20
+ await collection.createIndex(index.index, {
21
+ name: index.name, ...((index.options != null) ? index.options : {})
22
+ });
23
+ }
24
+ }
25
+ else {
26
+ console.debug(`Create index ${resource.alias} : ${index.name}`);
27
+ await collection.createIndex(index.index, {
28
+ name: index.name, ...((index.options != null) ? index.options : {})
29
+ });
30
+ }
31
+ }));
32
+ }
33
+ };
34
+ //# sourceMappingURL=indexes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexes.js","sourceRoot":"","sources":["../../src/utils/indexes.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,UAAsB,EAAE,QAAuC,EAAE,EAAE;IACrG,IAAI,QAAQ,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;QAC7B,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CACpC,KAAK,EAAC,KAAK,EAAC,EAAE;YACZ,MAAM,MAAM,GAAG,CAAC,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAA;YACtF,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBACnB,MAAM,QAAQ,GAAG,EAAE,GAAG,MAAM,EAAE,CAAA;gBAC9B,IAAI,MAAM,IAAI,QAAQ,EAAE,CAAC;oBACvB,OAAO,QAAQ,CAAC,IAAI,CAAA;gBACtB,CAAC;gBACD,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;oBACpB,OAAO,QAAQ,CAAC,CAAC,CAAA;gBACnB,CAAC;gBACD,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAA;gBACtD,kCAAkC;gBAClC,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,QAAQ,CAAC,EAAE,CAAC;oBACrF,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAA;oBACtC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;oBACrC,OAAO,CAAC,KAAK,CAAC,kBAAkB,QAAQ,CAAC,KAAK,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;oBACjE,MAAM,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;oBACtC,MAAM,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE;wBACxC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;qBACpE,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,gBAAgB,QAAQ,CAAC,KAAK,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;gBAC/D,MAAM,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE;oBACxC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;iBACpE,CAAC,CAAA;YACJ,CAAC;QACH,CAAC,CACF,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAA"}
@@ -0,0 +1,7 @@
1
+ import type { DbConfig, ResourceRecord } from '@owlmeans/resource';
2
+ import type { MongoResource } from '../types.js';
3
+ import type { Db, Collection } from 'mongodb';
4
+ export declare const initializeCollection: (db: Db, config: DbConfig, resource: MongoResource<ResourceRecord>) => Promise<Collection>;
5
+ export declare const createCollection: (db: Db, name: string, resource: MongoResource<ResourceRecord>) => Promise<Collection>;
6
+ export declare const updateCollection: (db: Db, name: string, resource: MongoResource<ResourceRecord>) => Promise<Collection>;
7
+ //# sourceMappingURL=life-cycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"life-cycle.d.ts","sourceRoot":"","sources":["../../src/utils/life-cycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,KAAK,EAAE,EAAE,EAAE,UAAU,EAAY,MAAM,SAAS,CAAA;AAKvD,eAAO,MAAM,oBAAoB,OAC3B,EAAE,UAAU,QAAQ,YAAY,aAAa,CAAC,cAAc,CAAC,KAChE,OAAO,CAAC,UAAU,CAYpB,CAAA;AAED,eAAO,MAAM,gBAAgB,OAAc,EAAE,QAAQ,MAAM,YAAY,aAAa,CAAC,cAAc,CAAC,KAAG,OAAO,CAAC,UAAU,CAkBxH,CAAA;AAED,eAAO,MAAM,gBAAgB,OAAc,EAAE,QAAQ,MAAM,YAAY,aAAa,CAAC,cAAc,CAAC,KAAG,OAAO,CAAC,UAAU,CAWxH,CAAA"}
@@ -0,0 +1,48 @@
1
+ import { mongoCollectionName } from './name.js';
2
+ import { schemaToMongoSchema } from './schema.js';
3
+ import { updateIndexes } from './indexes.js';
4
+ export const initializeCollection = async (db, config, resource) => {
5
+ let _collection;
6
+ const name = mongoCollectionName(config, resource);
7
+ const cursor = db.listCollections({ name });
8
+ if (!await cursor.hasNext()) {
9
+ _collection = await createCollection(db, name, resource);
10
+ }
11
+ else {
12
+ _collection = await updateCollection(db, name, resource);
13
+ }
14
+ return _collection;
15
+ };
16
+ export const createCollection = async (db, name, resource) => {
17
+ const collection = await db.createCollection(name, {
18
+ ...(resource.schema != null ? {
19
+ validator: {
20
+ $jsonSchema: patchJsonSchema(schemaToMongoSchema(resource.schema))
21
+ }
22
+ } : {})
23
+ });
24
+ if (resource.indexes != null) {
25
+ await Promise.all(resource.indexes.map(async (index) => await collection.createIndex(index.index, {
26
+ name: index.name, ...((index.options != null) ? index.options : {})
27
+ })));
28
+ }
29
+ return collection;
30
+ };
31
+ export const updateCollection = async (db, name, resource) => {
32
+ if (resource.schema != null) {
33
+ const $jsonSchema = patchJsonSchema(schemaToMongoSchema(resource.schema));
34
+ await db.command({ collMod: name, validator: { $jsonSchema } });
35
+ }
36
+ const collection = db.collection(name);
37
+ await updateIndexes(collection, resource);
38
+ return collection;
39
+ };
40
+ const patchJsonSchema = (schema) => {
41
+ if (schema.properties != null) {
42
+ if (schema.properties._id == null) {
43
+ schema.properties._id = { bsonType: 'objectId' };
44
+ }
45
+ }
46
+ return schema;
47
+ };
48
+ //# sourceMappingURL=life-cycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"life-cycle.js","sourceRoot":"","sources":["../../src/utils/life-cycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { DbConfig, ResourceRecord } from '@owlmeans/resource';
2
+ import type { MongoResource } from '../types.js';
3
+ export declare const mongoCollectionName: (config: DbConfig, resource: MongoResource<ResourceRecord>) => string;
4
+ //# sourceMappingURL=name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"name.d.ts","sourceRoot":"","sources":["../../src/utils/name.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,eAAO,MAAM,mBAAmB,WAAY,QAAQ,YAAY,aAAa,CAAC,cAAc,CAAC,KAAG,MAC5B,CAAA"}
@@ -0,0 +1,2 @@
1
+ export const mongoCollectionName = (config, resource) => `${config.resourcePrefix ?? ''}${resource.name ?? resource.alias}`;
2
+ //# sourceMappingURL=name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"name.js","sourceRoot":"","sources":["../../src/utils/name.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAgB,EAAE,QAAuC,EAAU,EAAE,CACvG,GAAG,MAAM,CAAC,cAAc,IAAI,EAAE,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { AnySchema } from 'ajv';
2
+ import type { Document } from 'mongodb';
3
+ export declare const schemaToMongoSchema: (schema: AnySchema) => Document;
4
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/utils/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,KAAK,CAAA;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,eAAO,MAAM,mBAAmB,WAAY,SAAS,KAAG,QA+BvD,CAAA"}
@@ -0,0 +1,63 @@
1
+ export const schemaToMongoSchema = (schema) => {
2
+ const _schema = schema;
3
+ if (_schema.type !== 'object') {
4
+ throw new SyntaxError('Only object schemas can be converted to mongo schema');
5
+ }
6
+ const mongoSchems = {
7
+ bsonType: 'object',
8
+ properties: _schema.properties != null
9
+ ? 'allOf' in _schema.properties
10
+ ? covertAllOfProperties(_schema.properties.allOf) :
11
+ convertProperties(_schema.properties ?? {})
12
+ : undefined,
13
+ additionalProperties: _schema.additionalProperties != null
14
+ ? convertAdditionalProperties(_schema.additionalProperties)
15
+ : false,
16
+ ...(_schema.required != null ? { required: _schema.required } : {}),
17
+ };
18
+ if ("properties" in mongoSchems && mongoSchems.properties == null) {
19
+ delete mongoSchems.properties;
20
+ }
21
+ if ("required" in mongoSchems && mongoSchems.required == null
22
+ || Array.isArray(mongoSchems.required) && mongoSchems.required.length === 0) {
23
+ delete mongoSchems.required;
24
+ }
25
+ return mongoSchems;
26
+ };
27
+ const convertAdditionalProperties = (additionalProperties) => {
28
+ if (typeof additionalProperties === 'boolean') {
29
+ return additionalProperties;
30
+ }
31
+ return convertToBsonType(additionalProperties);
32
+ };
33
+ const convertProperties = (properties) => Object.fromEntries(Object.entries(properties).map(([key, value]) => {
34
+ if (key === 'oneOf') {
35
+ throw new SyntaxError('We dont support schemas with oneof properties definition');
36
+ }
37
+ return [key, convertToBsonType(value)];
38
+ }));
39
+ const covertAllOfProperties = (allOf) => allOf.map(schema => convertProperties(schema.properties ?? {}))
40
+ .reduce((properties, schema) => ({ ...properties, ...schema }), {});
41
+ const prepareScalarType = (value) => {
42
+ const type = (Array.isArray(value.type) ? value.type : [value.type])
43
+ .map(type => type === 'boolean' ? 'bool' : type);
44
+ if (value.nullable) {
45
+ type.push('null');
46
+ }
47
+ return type.length === 1 ? type[0] : type;
48
+ };
49
+ const convertToBsonType = (value) => {
50
+ if (Array.isArray(value.type)) {
51
+ if ('properties' in value || 'additionalProperties' in value) {
52
+ return {
53
+ ...schemaToMongoSchema({ ...value, type: 'object' }),
54
+ bsonType: prepareScalarType(value)
55
+ };
56
+ }
57
+ return { bsonType: prepareScalarType(value) };
58
+ }
59
+ return value.type === 'object'
60
+ ? value.format === 'date-time' ? { bsonType: 'date' } : schemaToMongoSchema(value)
61
+ : { bsonType: prepareScalarType(value) };
62
+ };
63
+ //# sourceMappingURL=schema.js.map