@mongodb-js/mongodb-schema 12.7.1

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 (53) hide show
  1. package/.esm-wrapper.mjs +10 -0
  2. package/LICENSE +201 -0
  3. package/README.md +353 -0
  4. package/bin/mongodb-schema +231 -0
  5. package/dist/index.d.ts +14 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +69 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/schema-accessor.d.ts +30 -0
  10. package/dist/schema-accessor.d.ts.map +1 -0
  11. package/dist/schema-accessor.js +30 -0
  12. package/dist/schema-accessor.js.map +1 -0
  13. package/dist/schema-analyzer.d.ts +161 -0
  14. package/dist/schema-analyzer.d.ts.map +1 -0
  15. package/dist/schema-analyzer.js +379 -0
  16. package/dist/schema-analyzer.js.map +1 -0
  17. package/dist/schema-converters/internal-to-expanded.d.ts +6 -0
  18. package/dist/schema-converters/internal-to-expanded.d.ts.map +1 -0
  19. package/dist/schema-converters/internal-to-expanded.js +97 -0
  20. package/dist/schema-converters/internal-to-expanded.js.map +1 -0
  21. package/dist/schema-converters/internal-to-mongodb.d.ts +7 -0
  22. package/dist/schema-converters/internal-to-mongodb.d.ts.map +1 -0
  23. package/dist/schema-converters/internal-to-mongodb.js +93 -0
  24. package/dist/schema-converters/internal-to-mongodb.js.map +1 -0
  25. package/dist/schema-converters/internal-to-standard.d.ts +228 -0
  26. package/dist/schema-converters/internal-to-standard.d.ts.map +1 -0
  27. package/dist/schema-converters/internal-to-standard.js +318 -0
  28. package/dist/schema-converters/internal-to-standard.js.map +1 -0
  29. package/dist/semantic-types/email.d.ts +2 -0
  30. package/dist/semantic-types/email.d.ts.map +1 -0
  31. package/dist/semantic-types/email.js +8 -0
  32. package/dist/semantic-types/email.js.map +1 -0
  33. package/dist/semantic-types/index.d.ts +6 -0
  34. package/dist/semantic-types/index.d.ts.map +1 -0
  35. package/dist/semantic-types/index.js +7 -0
  36. package/dist/semantic-types/index.js.map +1 -0
  37. package/dist/stats.d.ts +11 -0
  38. package/dist/stats.d.ts.map +1 -0
  39. package/dist/stats.js +82 -0
  40. package/dist/stats.js.map +1 -0
  41. package/dist/to-typescript.d.ts +3 -0
  42. package/dist/to-typescript.d.ts.map +1 -0
  43. package/dist/to-typescript.js +103 -0
  44. package/dist/to-typescript.js.map +1 -0
  45. package/dist/types.d.ts +29 -0
  46. package/dist/types.d.ts.map +1 -0
  47. package/dist/types.js +3 -0
  48. package/dist/types.js.map +1 -0
  49. package/dist/util.d.ts +3 -0
  50. package/dist/util.d.ts.map +1 -0
  51. package/dist/util.js +13 -0
  52. package/dist/util.js.map +1 -0
  53. package/package.json +110 -0
@@ -0,0 +1,379 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SchemaAnalyzer = void 0;
7
+ exports.verifyStreamSource = verifyStreamSource;
8
+ exports.getCompletedSchemaAnalyzer = getCompletedSchemaAnalyzer;
9
+ const reservoir_1 = __importDefault(require("reservoir"));
10
+ const bson_1 = require("bson");
11
+ const semantic_types_1 = __importDefault(require("./semantic-types"));
12
+ const util_1 = require("./util");
13
+ const defaultSchemaParseOptions = {
14
+ semanticTypes: false,
15
+ storeValues: true,
16
+ storedValuesLengthLimit: 10000,
17
+ };
18
+ function extractStringValueFromBSON(value) {
19
+ if (value?._bsontype) {
20
+ if (['Decimal128', 'Long'].includes(value._bsontype)) {
21
+ return value.toString();
22
+ }
23
+ if (['Double', 'Int32'].includes(value._bsontype)) {
24
+ return String(value.value);
25
+ }
26
+ }
27
+ if (typeof value === 'string') {
28
+ return value;
29
+ }
30
+ return String(value);
31
+ }
32
+ function fieldComparator(a, b) {
33
+ const aName = a.name;
34
+ const bName = b.name;
35
+ if (aName === '_id') {
36
+ return -1;
37
+ }
38
+ if (bName === '_id') {
39
+ return 1;
40
+ }
41
+ return aName.toLowerCase() < bName.toLowerCase() ? -1 : 1;
42
+ }
43
+ function getBSONType(value) {
44
+ const bsonType = value?._bsontype
45
+ ? value._bsontype
46
+ : Object.prototype.toString.call(value).replace(/^\[object (\w+)\]$/, '$1');
47
+ if (bsonType === 'Object') {
48
+ return 'Document';
49
+ }
50
+ if (bsonType === 'Code' && value.scope) {
51
+ return 'CodeWScope';
52
+ }
53
+ return bsonType;
54
+ }
55
+ function isNullType(type) {
56
+ return type.name === 'Null';
57
+ }
58
+ function isArrayType(type) {
59
+ return type.name === 'Array';
60
+ }
61
+ function isDocumentType(type) {
62
+ return type.name === 'Document';
63
+ }
64
+ function schemaToPaths(fields, parent = []) {
65
+ const paths = [];
66
+ const sortedFields = Object.values(fields).sort(fieldComparator);
67
+ for (const field of sortedFields) {
68
+ const path = [...parent, field.name];
69
+ paths.push(path);
70
+ const doc = Object.values(field.types).find((f) => f.bsonType === 'Document');
71
+ if (doc) {
72
+ paths.push(...schemaToPaths(doc.fields, path));
73
+ }
74
+ const array = Object.values(field.types).find((f) => f.bsonType === 'Array');
75
+ if (array) {
76
+ const arrayDoc = Object.values(array.types).find((f) => f.bsonType === 'Document');
77
+ if (arrayDoc) {
78
+ paths.push(...schemaToPaths(arrayDoc.fields, path));
79
+ }
80
+ }
81
+ }
82
+ return paths;
83
+ }
84
+ function simplifiedSchema(fields) {
85
+ function finalizeSchemaFieldTypes(types) {
86
+ return Object.values(types)
87
+ .sort((a, b) => {
88
+ return b.count - a.count;
89
+ })
90
+ .map((type) => {
91
+ return {
92
+ bsonType: type.bsonType,
93
+ ...(isArrayType(type)
94
+ ? {
95
+ types: finalizeSchemaFieldTypes(type.types),
96
+ }
97
+ : {}),
98
+ ...(isDocumentType(type)
99
+ ? { fields: finalizeDocumentFieldSchema(type.fields) }
100
+ : {}),
101
+ };
102
+ });
103
+ }
104
+ function finalizeDocumentFieldSchema(fieldMap) {
105
+ const fieldSchema = Object.create(null);
106
+ Object.values(fieldMap).forEach((field) => {
107
+ const fieldTypes = finalizeSchemaFieldTypes(field.types);
108
+ fieldSchema[field.name] = {
109
+ types: fieldTypes,
110
+ };
111
+ });
112
+ return fieldSchema;
113
+ }
114
+ return finalizeDocumentFieldSchema(fields);
115
+ }
116
+ function cropString(value, limit) {
117
+ if (limit < 1)
118
+ return '';
119
+ return value.charCodeAt(limit - 1) === value.codePointAt(limit - 1)
120
+ ? value.slice(0, limit)
121
+ : value.slice(0, limit - 1);
122
+ }
123
+ function getCappedValue(bsonType, value, limit) {
124
+ if (bsonType === 'String') {
125
+ return cropString(value, limit);
126
+ }
127
+ if (bsonType === 'Binary') {
128
+ value = value;
129
+ return value.buffer.length > limit
130
+ ? new bson_1.Binary(value.buffer.slice(0, limit), value.sub_type)
131
+ : value;
132
+ }
133
+ if (bsonType === 'Code') {
134
+ value = value;
135
+ return value.code.length >= limit
136
+ ? new bson_1.Code(cropString(value.code, limit), value.scope)
137
+ : value;
138
+ }
139
+ return value;
140
+ }
141
+ function computeHasDuplicatesForType(type, unique) {
142
+ if (isNullType(type)) {
143
+ return type.count > 0;
144
+ }
145
+ if (!type.values) {
146
+ return undefined;
147
+ }
148
+ return unique !== type.values.length;
149
+ }
150
+ function computeUniqueForType(type) {
151
+ if (isNullType(type)) {
152
+ return type.count === 0 ? 0 : 1;
153
+ }
154
+ if (!type.values) {
155
+ return undefined;
156
+ }
157
+ return new Set(type.values.map(extractStringValueFromBSON)).size;
158
+ }
159
+ function finalizeSchema(schemaAnalysis) {
160
+ function finalizeArrayFieldProperties(type) {
161
+ const totalCount = Object.values(type.types)
162
+ .map((v) => v.count)
163
+ .reduce((p, c) => p + c, 0);
164
+ const types = finalizeSchemaFieldTypes(type.types, totalCount);
165
+ return {
166
+ types,
167
+ totalCount,
168
+ lengths: type.lengths,
169
+ averageLength: totalCount / type.lengths.length,
170
+ };
171
+ }
172
+ function finalizeSchemaFieldTypes(types, parentCount) {
173
+ return Object.values(types)
174
+ .map((type) => {
175
+ const unique = computeUniqueForType(type);
176
+ return {
177
+ name: type.name,
178
+ path: type.path,
179
+ count: type.count,
180
+ probability: type.count / parentCount,
181
+ unique,
182
+ hasDuplicates: computeHasDuplicatesForType(type, unique),
183
+ values: isNullType(type) ? undefined : type.values,
184
+ bsonType: type.bsonType,
185
+ ...(isArrayType(type) ? finalizeArrayFieldProperties(type) : {}),
186
+ ...(isDocumentType(type)
187
+ ? { fields: finalizeDocumentFieldSchema(type.fields, type.count) }
188
+ : {}),
189
+ };
190
+ })
191
+ .sort((a, b) => b.probability - a.probability);
192
+ }
193
+ function finalizeDocumentFieldSchema(fieldMap, parentCount) {
194
+ return Object.values(fieldMap)
195
+ .map((field) => {
196
+ const fieldTypes = finalizeSchemaFieldTypes(field.types, parentCount);
197
+ const undefinedCount = parentCount - field.count;
198
+ if (undefinedCount > 0) {
199
+ fieldTypes.push({
200
+ name: 'Undefined',
201
+ bsonType: 'Undefined',
202
+ unique: undefinedCount > 1 ? 0 : 1,
203
+ hasDuplicates: undefinedCount > 1,
204
+ path: field.path,
205
+ count: undefinedCount,
206
+ probability: undefinedCount / parentCount,
207
+ });
208
+ }
209
+ return {
210
+ name: field.name,
211
+ path: field.path,
212
+ count: field.count,
213
+ type: fieldTypes.length === 1
214
+ ? fieldTypes[0].name
215
+ : fieldTypes.map((v) => v.name),
216
+ probability: field.count / parentCount,
217
+ hasDuplicates: !!fieldTypes.find((v) => v.hasDuplicates),
218
+ types: fieldTypes,
219
+ };
220
+ })
221
+ .sort(fieldComparator);
222
+ }
223
+ return finalizeDocumentFieldSchema(schemaAnalysis.fields, schemaAnalysis.count);
224
+ }
225
+ class SchemaAnalyzer {
226
+ semanticTypes;
227
+ options;
228
+ documentsAnalyzed = 0;
229
+ fieldsCount = 0;
230
+ schemaAnalysisRoot = {
231
+ fields: Object.create(null),
232
+ count: 0,
233
+ };
234
+ finalized = true;
235
+ schemaResult = {
236
+ count: 0,
237
+ fields: [],
238
+ };
239
+ fieldAndTypeAnalysisCounter = 0;
240
+ constructor(options) {
241
+ this.options = { ...defaultSchemaParseOptions, ...options };
242
+ this.semanticTypes = {
243
+ ...semantic_types_1.default,
244
+ };
245
+ if (typeof this.options.semanticTypes === 'object') {
246
+ const enabledTypes = Object.entries(this.options.semanticTypes)
247
+ .filter(([, v]) => typeof v === 'boolean' && v)
248
+ .map(([k]) => k.toLowerCase());
249
+ this.semanticTypes = {
250
+ ...Object.entries(this.semanticTypes)
251
+ .filter(([k]) => enabledTypes.includes(k.toLowerCase()))
252
+ .reduce((p, [k, v]) => ({ ...p, [k]: v }), Object.create(null)),
253
+ };
254
+ Object.entries(this.options.semanticTypes)
255
+ .filter(([, v]) => typeof v === 'function')
256
+ .forEach(([k, v]) => {
257
+ this.semanticTypes[k] = v;
258
+ });
259
+ }
260
+ }
261
+ allowAbortDuringAnalysis() {
262
+ if (this.fieldAndTypeAnalysisCounter++ % util_1.ALLOW_ABORT_INTERVAL_COUNT === 0) {
263
+ void (0, util_1.allowAbort)();
264
+ }
265
+ return Promise.resolve();
266
+ }
267
+ increaseFieldCount() {
268
+ if (!this.options.distinctFieldsAbortThreshold)
269
+ return;
270
+ this.fieldsCount++;
271
+ if (this.fieldsCount > this.options.distinctFieldsAbortThreshold) {
272
+ throw new Error(`Schema analysis aborted: Fields count above ${this.options.distinctFieldsAbortThreshold}`);
273
+ }
274
+ }
275
+ getSemanticType(value, path) {
276
+ const returnValue = Object.entries(this.semanticTypes)
277
+ .filter(([, v]) => {
278
+ return v(value, path);
279
+ })
280
+ .map(([k]) => k)[0];
281
+ return returnValue;
282
+ }
283
+ async analyzeDoc(doc) {
284
+ this.finalized = false;
285
+ const addToType = async (path, value, schema) => {
286
+ await this.allowAbortDuringAnalysis();
287
+ const bsonType = getBSONType(value);
288
+ const typeName = this.options.semanticTypes
289
+ ? this.getSemanticType(value, path) || bsonType
290
+ : bsonType;
291
+ if (!schema[typeName]) {
292
+ schema[typeName] = {
293
+ name: typeName,
294
+ bsonType: bsonType,
295
+ path,
296
+ count: 0,
297
+ };
298
+ }
299
+ const type = schema[typeName];
300
+ type.count++;
301
+ if (isArrayType(type)) {
302
+ type.types = type.types ?? Object.create(null);
303
+ type.lengths = type.lengths ?? [];
304
+ type.lengths.push(value.length);
305
+ for (const v of value) {
306
+ await addToType(path, v, type.types);
307
+ }
308
+ }
309
+ else if (isDocumentType(type)) {
310
+ type.fields = type.fields ?? Object.create(null);
311
+ for (const [fieldName, v] of Object.entries(value)) {
312
+ await addToField(fieldName, [...path, fieldName], v, type.fields);
313
+ }
314
+ }
315
+ else if (this.options.storeValues && !isNullType(type)) {
316
+ if (!type.values) {
317
+ type.values = ['String', 'Binary', 'Code'].includes(bsonType)
318
+ ? (0, reservoir_1.default)(100)
319
+ : (0, reservoir_1.default)(10000);
320
+ }
321
+ type.values.pushSome(getCappedValue(type.bsonType, value, this.options.storedValuesLengthLimit));
322
+ }
323
+ };
324
+ const addToField = async (fieldName, path, value, schema) => {
325
+ await this.allowAbortDuringAnalysis();
326
+ if (!schema[fieldName]) {
327
+ schema[fieldName] = {
328
+ name: fieldName,
329
+ path: path,
330
+ count: 0,
331
+ types: Object.create(null),
332
+ };
333
+ this.increaseFieldCount();
334
+ }
335
+ const field = schema[fieldName];
336
+ field.count++;
337
+ await addToType(path, value, field.types);
338
+ };
339
+ for (const key of Object.keys(doc)) {
340
+ await addToField(key, [key], doc[key], this.schemaAnalysisRoot.fields);
341
+ }
342
+ this.schemaAnalysisRoot.count += 1;
343
+ }
344
+ getResult() {
345
+ if (this.finalized) {
346
+ return this.schemaResult;
347
+ }
348
+ this.schemaResult = {
349
+ count: this.schemaAnalysisRoot.count,
350
+ fields: finalizeSchema(this.schemaAnalysisRoot),
351
+ };
352
+ this.finalized = true;
353
+ return this.schemaResult;
354
+ }
355
+ getSchemaPaths() {
356
+ return schemaToPaths(this.schemaAnalysisRoot.fields);
357
+ }
358
+ getSimplifiedSchema() {
359
+ return simplifiedSchema(this.schemaAnalysisRoot.fields);
360
+ }
361
+ }
362
+ exports.SchemaAnalyzer = SchemaAnalyzer;
363
+ function verifyStreamSource(source) {
364
+ if (!(Symbol.iterator in source) && !(Symbol.asyncIterator in source)) {
365
+ throw new Error('Unknown input type for `docs`. Must be an array, ' +
366
+ 'stream or MongoDB Cursor.');
367
+ }
368
+ return source;
369
+ }
370
+ async function getCompletedSchemaAnalyzer(source, options) {
371
+ const analyzer = new SchemaAnalyzer(options);
372
+ for await (const doc of verifyStreamSource(source)) {
373
+ if (options?.signal?.aborted)
374
+ throw options.signal.reason;
375
+ await analyzer.analyzeDoc(doc);
376
+ }
377
+ return analyzer;
378
+ }
379
+ //# sourceMappingURL=schema-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-analyzer.js","sourceRoot":"","sources":["../src/schema-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Schema as InternalSchema } from '../schema-analyzer';
2
+ import { type ExpandedJSONSchema } from '../types';
3
+ export declare function convertInternalToExpanded(internalSchema: InternalSchema, options?: {
4
+ signal?: AbortSignal;
5
+ }): Promise<ExpandedJSONSchema>;
6
+ //# sourceMappingURL=internal-to-expanded.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-to-expanded.d.ts","sourceRoot":"","sources":["../../src/schema-converters/internal-to-expanded.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,MAAM,IAAI,cAAc,EAGzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,UAAU,CAAC;AA0InD,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,cAAc,EAC9B,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GACrC,OAAO,CAAC,kBAAkB,CAAC,CAE7B"}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.convertInternalToExpanded = convertInternalToExpanded;
4
+ const internal_to_standard_1 = require("./internal-to-standard");
5
+ const internal_to_mongodb_1 = require("./internal-to-mongodb");
6
+ const util_1 = require("../util");
7
+ const createConvertInternalToExpanded = function () {
8
+ const usedDefinitions = new Set();
9
+ function getUsedDefinitions() {
10
+ const filteredDefinitions = Object.fromEntries(Object.entries(internal_to_standard_1.RELAXED_EJSON_DEFINITIONS).filter(([key]) => usedDefinitions.has(key)));
11
+ return Object.freeze(filteredDefinitions);
12
+ }
13
+ function markUsedDefinition(ref) {
14
+ usedDefinitions.add(ref.split('/')[2]);
15
+ }
16
+ function getStandardType(internalType) {
17
+ const type = internal_to_standard_1.InternalTypeToStandardTypeMap[internalType];
18
+ if (!type)
19
+ throw new Error(`Encountered unknown type: ${internalType}`);
20
+ return { ...type };
21
+ }
22
+ function getBsonType(internalType) {
23
+ const type = internal_to_mongodb_1.InternalTypeToBsonTypeMap[internalType];
24
+ if (!type)
25
+ throw new Error(`Encountered unknown type: ${internalType}`);
26
+ return type;
27
+ }
28
+ async function parseType(type, signal) {
29
+ await (0, util_1.allowAbort)(signal);
30
+ const schema = {
31
+ ...getStandardType(type.bsonType),
32
+ 'x-bsonType': getBsonType(type.bsonType),
33
+ 'x-metadata': getMetadata(type),
34
+ };
35
+ if ('values' in type && type.values) {
36
+ schema['x-sampleValues'] = type.values;
37
+ }
38
+ if (schema.$ref)
39
+ markUsedDefinition(schema.$ref);
40
+ switch (type.bsonType) {
41
+ case 'Array':
42
+ schema.items = await parseTypes(type.types, signal);
43
+ break;
44
+ case 'Document':
45
+ Object.assign(schema, await parseFields(type.fields, signal));
46
+ break;
47
+ }
48
+ return schema;
49
+ }
50
+ function getMetadata({ hasDuplicates, probability, count, }) {
51
+ return {
52
+ ...(typeof hasDuplicates === 'boolean' ? { hasDuplicates } : {}),
53
+ probability,
54
+ count,
55
+ };
56
+ }
57
+ async function parseTypes(types, signal) {
58
+ await (0, util_1.allowAbort)(signal);
59
+ const definedTypes = types.filter((type) => type.bsonType.toLowerCase() !== 'undefined');
60
+ const isSingleType = definedTypes.length === 1;
61
+ if (isSingleType) {
62
+ return parseType(definedTypes[0], signal);
63
+ }
64
+ const parsedTypes = await Promise.all(definedTypes.map((type) => parseType(type, signal)));
65
+ return {
66
+ anyOf: parsedTypes,
67
+ };
68
+ }
69
+ async function parseFields(fields, signal) {
70
+ const required = [];
71
+ const properties = {};
72
+ for (const field of fields) {
73
+ if (field.probability === 1)
74
+ required.push(field.name);
75
+ properties[field.name] = {
76
+ ...(await parseTypes(field.types, signal)),
77
+ 'x-metadata': getMetadata(field),
78
+ };
79
+ }
80
+ return { required, properties };
81
+ }
82
+ return async function convert(internalSchema, options = {}) {
83
+ const { required, properties } = await parseFields(internalSchema.fields, options.signal);
84
+ const schema = {
85
+ type: 'object',
86
+ 'x-bsonType': 'object',
87
+ required,
88
+ properties,
89
+ $defs: getUsedDefinitions(),
90
+ };
91
+ return schema;
92
+ };
93
+ };
94
+ function convertInternalToExpanded(internalSchema, options = {}) {
95
+ return createConvertInternalToExpanded()(internalSchema, options);
96
+ }
97
+ //# sourceMappingURL=internal-to-expanded.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-to-expanded.js","sourceRoot":"","sources":["../../src/schema-converters/internal-to-expanded.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Schema as InternalSchema, SchemaType } from '../schema-analyzer';
2
+ import type { MongoDBJSONSchema } from '../types';
3
+ export declare const InternalTypeToBsonTypeMap: Record<SchemaType['name'] | 'Double' | 'BSONSymbol', string>;
4
+ export declare function convertInternalToMongodb(internalSchema: InternalSchema, options?: {
5
+ signal?: AbortSignal;
6
+ }): Promise<MongoDBJSONSchema>;
7
+ //# sourceMappingURL=internal-to-mongodb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-to-mongodb.d.ts","sourceRoot":"","sources":["../../src/schema-converters/internal-to-mongodb.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAGV,MAAM,IAAI,cAAc,EACxB,UAAU,EACX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAMlD,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAC5C,UAAU,CAAC,MAAM,CAAC,GAAG,QAAQ,GAAG,YAAY,EAC5C,MAAM,CA0BP,CAAC;AAoFF,wBAAsB,wBAAwB,CAC5C,cAAc,EAAE,cAAc,EAC9B,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,WAAW,CAAC;CACjB,GACL,OAAO,CAAC,iBAAiB,CAAC,CAY5B"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InternalTypeToBsonTypeMap = void 0;
4
+ exports.convertInternalToMongodb = convertInternalToMongodb;
5
+ const util_1 = require("../util");
6
+ exports.InternalTypeToBsonTypeMap = {
7
+ Double: 'double',
8
+ Number: 'double',
9
+ String: 'string',
10
+ Document: 'object',
11
+ Array: 'array',
12
+ Binary: 'binData',
13
+ Undefined: 'undefined',
14
+ ObjectId: 'objectId',
15
+ Boolean: 'bool',
16
+ Date: 'date',
17
+ Null: 'null',
18
+ RegExp: 'regex',
19
+ BSONRegExp: 'regex',
20
+ DBRef: 'dbPointer',
21
+ BSONSymbol: 'symbol',
22
+ Symbol: 'symbol',
23
+ Code: 'javascript',
24
+ CodeWScope: 'javascriptWithScope',
25
+ Int32: 'int',
26
+ Timestamp: 'timestamp',
27
+ Long: 'long',
28
+ Decimal128: 'decimal',
29
+ MinKey: 'minKey',
30
+ MaxKey: 'maxKey',
31
+ };
32
+ const convertInternalType = (type) => {
33
+ const bsonType = exports.InternalTypeToBsonTypeMap[type];
34
+ if (!bsonType)
35
+ throw new Error(`Encountered unknown type: ${type}`);
36
+ return bsonType;
37
+ };
38
+ async function parseType(type, signal) {
39
+ await (0, util_1.allowAbort)(signal);
40
+ const schema = {
41
+ bsonType: convertInternalType(type.bsonType),
42
+ };
43
+ if (type.bsonType === 'Array') {
44
+ const items = await parseTypes(type.types);
45
+ if (!items.bsonType || items.bsonType?.length > 0) {
46
+ schema.items = items;
47
+ }
48
+ }
49
+ else if (type.bsonType === 'Document') {
50
+ Object.assign(schema, await parseFields(type.fields, signal));
51
+ }
52
+ return schema;
53
+ }
54
+ function isPlainTypesOnly(types) {
55
+ return types.every((definition) => !!definition.bsonType && Object.keys(definition).length === 1);
56
+ }
57
+ async function parseTypes(types, signal) {
58
+ await (0, util_1.allowAbort)(signal);
59
+ const definedTypes = types.filter((type) => type.bsonType.toLowerCase() !== 'undefined');
60
+ const isSingleType = definedTypes.length === 1;
61
+ if (isSingleType) {
62
+ return parseType(definedTypes[0], signal);
63
+ }
64
+ const parsedTypes = await Promise.all(definedTypes.map((type) => parseType(type, signal)));
65
+ if (isPlainTypesOnly(parsedTypes)) {
66
+ return {
67
+ bsonType: parsedTypes.map(({ bsonType }) => bsonType),
68
+ };
69
+ }
70
+ return {
71
+ anyOf: parsedTypes,
72
+ };
73
+ }
74
+ async function parseFields(fields, signal) {
75
+ const required = [];
76
+ const properties = {};
77
+ for (const field of fields) {
78
+ if (field.probability === 1)
79
+ required.push(field.name);
80
+ properties[field.name] = await parseTypes(field.types, signal);
81
+ }
82
+ return { properties, ...(required.length > 0 ? { required } : {}) };
83
+ }
84
+ async function convertInternalToMongodb(internalSchema, options = {}) {
85
+ const { required, properties } = await parseFields(internalSchema.fields, options.signal);
86
+ const schema = {
87
+ bsonType: 'object',
88
+ ...(required === undefined ? {} : { required }),
89
+ properties,
90
+ };
91
+ return schema;
92
+ }
93
+ //# sourceMappingURL=internal-to-mongodb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-to-mongodb.js","sourceRoot":"","sources":["../../src/schema-converters/internal-to-mongodb.ts"],"names":[],"mappings":";;;AA+HA,4DAiBC;AAtID,kCAAqC;AAKxB,QAAA,yBAAyB,GAGlC;IACF,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,SAAS;IACjB,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,MAAM;IACf,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,OAAO;IACf,UAAU,EAAE,OAAO;IACnB,KAAK,EAAE,WAAW;IAClB,UAAU,EAAE,QAAQ;IACpB,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,YAAY;IAClB,UAAU,EAAE,qBAAqB;IACjC,KAAK,EAAE,KAAK;IACZ,SAAS,EAAE,WAAW;IACtB,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,SAAS;IACrB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;CACjB,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAE,EAAE;IAC3C,MAAM,QAAQ,GAAG,iCAAyB,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;IACpE,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,KAAK,UAAU,SAAS,CACtB,IAAgB,EAChB,MAAoB;IAEpB,MAAM,IAAA,iBAAU,EAAC,MAAM,CAAC,CAAC;IACzB,MAAM,MAAM,GAAsB;QAChC,QAAQ,EAAE,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC;KAC7C,CAAC;IAEF,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,UAAU,CAAE,IAAwB,CAAC,KAAK,CAAC,CAAC;QAEhE,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QACvB,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QACxC,MAAM,CAAC,MAAM,CACX,MAAM,EACN,MAAM,WAAW,CAAE,IAA2B,CAAC,MAAM,EAAE,MAAM,CAAC,CAC/D,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CACvB,KAA0B;IAE1B,OAAO,KAAK,CAAC,KAAK,CAChB,CAAC,UAAU,EAAE,EAAE,CACb,CAAC,CAAC,UAAU,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,CAChE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,KAAmB,EACnB,MAAoB;IAEpB,MAAM,IAAA,iBAAU,EAAC,MAAM,CAAC,CAAC;IACzB,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAC/B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,WAAW,CACtD,CAAC;IACF,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC;IAC/C,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CACnC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CACpD,CAAC;IACF,IAAI,gBAAgB,CAAC,WAAW,CAAC,EAAE,CAAC;QAClC,OAAO;YACL,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC;SACtD,CAAC;IACJ,CAAC;IACD,OAAO;QACL,KAAK,EAAE,WAAW;KACnB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,MAAoC,EACpC,MAAoB;IAKpB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,UAAU,GAAoC,EAAE,CAAC;IACvD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,WAAW,KAAK,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvD,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACtE,CAAC;AAEM,KAAK,UAAU,wBAAwB,CAC5C,cAA8B,EAC9B,UAEI,EAAE;IAEN,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,MAAM,WAAW,CAChD,cAAc,CAAC,MAAM,EACrB,OAAO,CAAC,MAAM,CACf,CAAC;IACF,MAAM,MAAM,GAAsB;QAChC,QAAQ,EAAE,QAAQ;QAElB,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;QAC/C,UAAU;KACX,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC"}