@owlmeans/mongo-resource 0.1.18-rc.8 → 0.1.18

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 (116) hide show
  1. package/README.md +232 -71
  2. package/agent-meta/manifest.json +3 -3
  3. package/agent-meta/skills/mongo-resource/SKILL.md +89 -44
  4. package/build/consts.d.ts +8 -4
  5. package/build/consts.d.ts.map +1 -1
  6. package/build/consts.js +8 -4
  7. package/build/consts.js.map +1 -1
  8. package/build/declarations/types.d.ts +12 -0
  9. package/build/declarations/types.d.ts.map +1 -0
  10. package/build/declarations/types.js +2 -0
  11. package/build/declarations/types.js.map +1 -0
  12. package/build/declarations.d.ts +4 -9
  13. package/build/declarations.d.ts.map +1 -1
  14. package/build/declarations.js +28 -21
  15. package/build/declarations.js.map +1 -1
  16. package/build/index.d.ts +4 -0
  17. package/build/index.d.ts.map +1 -1
  18. package/build/index.js +1 -0
  19. package/build/index.js.map +1 -1
  20. package/build/resource.d.ts +2 -2
  21. package/build/resource.d.ts.map +1 -1
  22. package/build/resource.js +100 -130
  23. package/build/resource.js.map +1 -1
  24. package/build/types.d.ts +11 -5
  25. package/build/types.d.ts.map +1 -1
  26. package/build/types.local.d.ts +4 -0
  27. package/build/types.local.d.ts.map +1 -0
  28. package/build/types.local.js +2 -0
  29. package/build/types.local.js.map +1 -0
  30. package/build/utils/consts.local.d.ts +25 -0
  31. package/build/utils/consts.local.d.ts.map +1 -0
  32. package/build/utils/consts.local.js +31 -0
  33. package/build/utils/consts.local.js.map +1 -0
  34. package/build/utils/criteria/types.d.ts +27 -0
  35. package/build/utils/criteria/types.d.ts.map +1 -0
  36. package/build/utils/criteria/types.js +2 -0
  37. package/build/utils/criteria/types.js.map +1 -0
  38. package/build/utils/criteria.d.ts +9 -0
  39. package/build/utils/criteria.d.ts.map +1 -0
  40. package/build/utils/criteria.js +204 -0
  41. package/build/utils/criteria.js.map +1 -0
  42. package/build/utils/index.d.ts +1 -0
  43. package/build/utils/index.d.ts.map +1 -1
  44. package/build/utils/index.js +1 -0
  45. package/build/utils/index.js.map +1 -1
  46. package/build/utils/indexes/types.d.ts +19 -0
  47. package/build/utils/indexes/types.d.ts.map +1 -0
  48. package/build/utils/indexes/types.js +2 -0
  49. package/build/utils/indexes/types.js.map +1 -0
  50. package/build/utils/indexes.d.ts +3 -4
  51. package/build/utils/indexes.d.ts.map +1 -1
  52. package/build/utils/indexes.js +44 -28
  53. package/build/utils/indexes.js.map +1 -1
  54. package/build/utils/life-cycle/types.d.ts +36 -0
  55. package/build/utils/life-cycle/types.d.ts.map +1 -0
  56. package/build/utils/life-cycle/types.js +2 -0
  57. package/build/utils/life-cycle/types.js.map +1 -0
  58. package/build/utils/life-cycle.d.ts +3 -30
  59. package/build/utils/life-cycle.d.ts.map +1 -1
  60. package/build/utils/life-cycle.js +96 -112
  61. package/build/utils/life-cycle.js.map +1 -1
  62. package/build/utils/migrations.d.ts.map +1 -1
  63. package/build/utils/migrations.js +1 -2
  64. package/build/utils/migrations.js.map +1 -1
  65. package/build/utils/name.d.ts.map +1 -1
  66. package/build/utils/name.js +1 -5
  67. package/build/utils/name.js.map +1 -1
  68. package/build/utils/refs/types.d.ts +78 -0
  69. package/build/utils/refs/types.d.ts.map +1 -0
  70. package/build/utils/refs/types.js +2 -0
  71. package/build/utils/refs/types.js.map +1 -0
  72. package/build/utils/refs.d.ts +13 -67
  73. package/build/utils/refs.d.ts.map +1 -1
  74. package/build/utils/refs.js +115 -158
  75. package/build/utils/refs.js.map +1 -1
  76. package/build/utils/schema/types.d.ts +16 -0
  77. package/build/utils/schema/types.d.ts.map +1 -0
  78. package/build/utils/schema/types.js +2 -0
  79. package/build/utils/schema/types.js.map +1 -0
  80. package/build/utils/schema.d.ts +3 -11
  81. package/build/utils/schema.d.ts.map +1 -1
  82. package/build/utils/schema.js +86 -88
  83. package/build/utils/schema.js.map +1 -1
  84. package/build/utils/types.local.d.ts +13 -0
  85. package/build/utils/types.local.d.ts.map +1 -0
  86. package/build/utils/types.local.js +2 -0
  87. package/build/utils/types.local.js.map +1 -0
  88. package/package.json +10 -9
  89. package/src/consts.ts +8 -4
  90. package/src/declarations/types.ts +12 -0
  91. package/src/declarations.ts +32 -28
  92. package/src/index.ts +4 -0
  93. package/src/resource.ts +121 -163
  94. package/src/types.local.ts +5 -0
  95. package/src/types.ts +13 -7
  96. package/src/utils/consts.local.ts +35 -0
  97. package/src/utils/criteria/types.ts +28 -0
  98. package/src/utils/criteria.ts +235 -0
  99. package/src/utils/index.ts +1 -0
  100. package/src/utils/indexes/types.ts +20 -0
  101. package/src/utils/indexes.ts +48 -28
  102. package/src/utils/life-cycle/types.ts +39 -0
  103. package/src/utils/life-cycle.ts +120 -134
  104. package/src/utils/migrations.ts +3 -17
  105. package/src/utils/name.ts +1 -6
  106. package/src/utils/refs/types.ts +79 -0
  107. package/src/utils/refs.ts +147 -189
  108. package/src/utils/schema/types.ts +17 -0
  109. package/src/utils/schema.ts +92 -91
  110. package/src/utils/types.local.ts +13 -0
  111. package/tests/context.ts +3 -3
  112. package/tests/criteria.spec.ts +116 -0
  113. package/tests/crud.spec.ts +2 -2
  114. package/tests/indexes.spec.ts +42 -0
  115. package/tests/refs.spec.ts +5 -3
  116. package/build/.gitkeep +0 -0
@@ -1,137 +1,16 @@
1
1
  import { MisshapedRecord } from '@owlmeans/resource';
2
2
  import { ObjectId } from 'mongodb';
3
+ import { logger } from '@owlmeans/log';
4
+ import { HEX24, LOGICAL_OPERATORS, OPAQUE_OPERATORS } from './consts.local.js';
5
+ const log = logger('mongo-resource');
3
6
  /**
4
- * The only shape a stored reference is converted from. Deliberately stricter than
5
- * `ObjectId.isValid`, which also accepts any 12 character string and would silently
6
- * swallow short business keys.
7
- */
8
- const HEX24 = /^[0-9a-fA-F]{24}$/;
9
- export const isObjectIdHex = (value) => typeof value === 'string' && HEX24.test(value);
10
- /**
11
- * Write side of a declared reference: the string id a record carries becomes the
12
- * `ObjectId` the collection stores. Arrays convert elementwise.
13
- *
14
- * Strict on purpose — a declared reference holding something that is not a mongo id is
15
- * either a mis-declared field (should never have been a reference) or a bug at the call
16
- * site, and storing it as a string would silently reintroduce the mixed type state this
17
- * mechanism exists to remove.
18
- *
19
- * @throws {MisshapedRecord}
20
- */
21
- export const marshalReference = (field, value) => {
22
- if (value == null) {
23
- return value;
24
- }
25
- if (value instanceof ObjectId) {
26
- return value;
27
- }
28
- if (Array.isArray(value)) {
29
- return value.map(item => marshalReference(field, item));
30
- }
31
- if (isObjectIdHex(value)) {
32
- return new ObjectId(value);
33
- }
34
- throw new MisshapedRecord(`ref:${field}`);
35
- };
36
- /** Read side: `ObjectId` back to the string records carry. Tolerates not yet migrated strings. */
37
- export const demarshalReference = (value) => {
38
- if (value instanceof ObjectId) {
39
- return value.toString();
40
- }
41
- if (Array.isArray(value)) {
42
- return value.map(demarshalReference);
43
- }
44
- return value;
45
- };
46
- /** Convert every declared reference of a fetched document back to string ids, in place. */
47
- export const demarshalRefs = (record, refs) => {
48
- if (refs.size < 1) {
49
- return record;
50
- }
51
- for (const field of refs.keys()) {
52
- const value = record[field];
53
- if (value != null) {
54
- record[field] = demarshalReference(value);
55
- }
56
- }
57
- return record;
58
- };
59
- /**
60
- * Operators whose operand is never an id — a 24 hex string under `$regex` is a pattern,
61
- * not a reference.
62
- */
63
- const OPAQUE_OPERATORS = ['$regex', '$options', '$type', '$size', '$mod', '$exists', '$where'];
64
- const LOGICAL_OPERATORS = ['$and', '$or', '$nor'];
65
- const marshalCriteriaValue = (value) => {
66
- if (typeof value === 'string') {
67
- return isObjectIdHex(value) ? new ObjectId(value) : value;
68
- }
69
- if (Array.isArray(value)) {
70
- return value.map(marshalCriteriaValue);
71
- }
72
- if (value != null && typeof value === 'object' && !(value instanceof ObjectId) && !(value instanceof Date)) {
73
- return Object.fromEntries(Object.entries(value).map(([operator, operand]) => OPAQUE_OPERATORS.includes(operator)
74
- ? [operator, operand]
75
- : [operator, marshalCriteriaValue(operand)]));
76
- }
77
- return value;
78
- };
79
- /**
80
- * Convert list criteria the way records are converted: values addressed at `_id` or at a
81
- * declared reference become `ObjectId`s, and the `id` alias records actually carry is
82
- * mapped onto `_id` — documents never store `id`, so before this mapping such criteria
83
- * silently matched nothing.
7
+ * Ledger registered body of the system reference migration.
84
8
  *
85
- * Tolerant by design: a value that is not 24 hex passes through unconverted. Criteria are
86
- * matched against the collection, and against an `ObjectId` typed field a stray string
87
- * matches nothing — which is exactly what it matched before the field was converted.
9
+ * Stays a module level factory, textually unchanged: the ledger fingerprints a migration by the
10
+ * source text of the function it registers (`apply.toString()`), so moving the returned closure —
11
+ * or renaming what it calls — changes the checksum and raises `MigrationConflict` against every
12
+ * ledger that already applied it.
88
13
  */
89
- export const marshalCriteria = (criteria, refs) => {
90
- if (criteria == null) {
91
- return criteria;
92
- }
93
- return Object.fromEntries(Object.entries(criteria).map(([key, value]) => {
94
- if (LOGICAL_OPERATORS.includes(key) && Array.isArray(value)) {
95
- return [key, value.map(sub => marshalCriteria(sub, refs))];
96
- }
97
- if (key === 'id' || key === '_id') {
98
- return ['_id', marshalCriteriaValue(value)];
99
- }
100
- if (refs.has(key)) {
101
- return [key, marshalCriteriaValue(value)];
102
- }
103
- return [key, value];
104
- }));
105
- };
106
- /**
107
- * Criteria for addressing a single record by a field — `get`/`load`/`update`/`delete`.
108
- *
109
- * `_id` keeps its historical strictness (an invalid id throws through the driver). The
110
- * `id` alias and declared references convert tolerantly, so a caller probing a reference
111
- * with a value that is not a mongo id gets "not found" rather than a throw.
112
- */
113
- export const identityCriteria = (field, id, refs) => {
114
- if (field === '_id') {
115
- return { _id: new ObjectId(id) };
116
- }
117
- if (field === 'id') {
118
- return { _id: isObjectIdHex(id) ? new ObjectId(id) : id };
119
- }
120
- if (refs.has(field)) {
121
- return { [field]: isObjectIdHex(id) ? new ObjectId(id) : id };
122
- }
123
- return { [field]: id };
124
- };
125
- /**
126
- * Name of the system migration that converts a reference field's stored strings.
127
- *
128
- * The `@1` is the body's version: the shared body below fingerprints identically for
129
- * every field, so an edit to it would raise `MigrationConflict` against every ledger on
130
- * the next boot. Any semantic change to {@link convertReferenceField} must bump this
131
- * suffix instead — the old name stays applied, the new one runs (idempotently) once.
132
- */
133
- export const refMigrationName = (field) => `$ref:${field}@1`;
134
- /** Ledger registered body of the system reference migration. */
135
14
  export const makeRefMigration = (field) => async (tx) => {
136
15
  await convertReferenceField(tx.collection, field);
137
16
  };
@@ -148,21 +27,10 @@ const convertScalar = (path) => ({
148
27
  ]
149
28
  });
150
29
  /**
151
- * Convert one reference field's stored string ids to `ObjectId`s — the body of the
152
- * system migration and of the boot time reconciliation probe alike.
153
- *
154
- * Idempotent and interrupt safe: it matches only documents where the field (or one of
155
- * its elements) is still a string, converts only values that are actually 24 hex, and
156
- * leaves everything else exactly as it was. Safe to run concurrently from several
157
- * replicas — a document converts once, the loser's filter no longer matches it.
158
- *
159
- * Validation is bypassed deliberately: at `Pre` stage the collection still carries the
160
- * validator that declares the field a *string*, and after the switch a legacy document
161
- * may violate the schema in unrelated ways — either would wedge the boot on a write
162
- * that only makes the data more correct. (Bypassing requires the connection's user to
163
- * hold the `bypassDocumentValidation` privilege — `dbOwner`/`root` do.)
30
+ * The body {@link makeRefMigration} runs, kept at module level for the same reason it is; the
31
+ * helper exposes the very same function as `convertReferenceField`.
164
32
  */
165
- export const convertReferenceField = async (collection, field) => {
33
+ const convertReferenceField = async (collection, field) => {
166
34
  const result = await collection.updateMany(
167
35
  /** An array valued field matches `$type: 'string'` when any element is a string. */
168
36
  { [field]: { $type: 'string' } }, [{
@@ -178,20 +46,109 @@ export const convertReferenceField = async (collection, field) => {
178
46
  }], { bypassDocumentValidation: true });
179
47
  return result.modifiedCount;
180
48
  };
181
- /**
182
- * The second half of the double check the reference migration promises: the ledger says
183
- * whether the migration ran; this probes whether the collection actually holds no
184
- * convertible strings — and repairs it when the two disagree (a restored backup, a
185
- * write from a legacy process, a ledger created by hand).
186
- */
187
- export const reconcileReferences = async (collection, refs, alias) => {
188
- for (const ref of refs) {
189
- const remnant = await collection.findOne({ [ref.field]: { $type: 'string', $regex: HEX24 } }, { projection: { _id: 1 } });
190
- if (remnant != null) {
191
- const converted = await convertReferenceField(collection, ref.field);
192
- console.warn(`@owlmeans/mongo-resource: ${alias}.${ref.field} held string ids outside the migration`
193
- + ` ledger — converted ${converted} document(s)`);
194
- }
195
- }
49
+ export const createMongoRefHelper = () => {
50
+ const isObjectIdHex = (value) => typeof value === 'string' && HEX24.test(value);
51
+ const marshalReference = (field, value) => {
52
+ if (value == null) {
53
+ return value;
54
+ }
55
+ if (value instanceof ObjectId) {
56
+ return value;
57
+ }
58
+ if (Array.isArray(value)) {
59
+ return value.map(item => marshalReference(field, item));
60
+ }
61
+ if (isObjectIdHex(value)) {
62
+ return new ObjectId(value);
63
+ }
64
+ throw new MisshapedRecord(`ref:${field}`);
65
+ };
66
+ const demarshalReference = (value) => {
67
+ if (value instanceof ObjectId) {
68
+ return value.toString();
69
+ }
70
+ if (Array.isArray(value)) {
71
+ return value.map(demarshalReference);
72
+ }
73
+ return value;
74
+ };
75
+ const demarshalRefs = (record, refs) => {
76
+ if (refs.size < 1) {
77
+ return record;
78
+ }
79
+ for (const field of refs.keys()) {
80
+ const value = record[field];
81
+ if (value != null) {
82
+ record[field] = demarshalReference(value);
83
+ }
84
+ }
85
+ return record;
86
+ };
87
+ const marshalCriteriaValue = (value) => {
88
+ if (typeof value === 'string') {
89
+ return isObjectIdHex(value) ? new ObjectId(value) : value;
90
+ }
91
+ if (Array.isArray(value)) {
92
+ return value.map(marshalCriteriaValue);
93
+ }
94
+ if (value != null && typeof value === 'object' && !(value instanceof ObjectId) && !(value instanceof Date)) {
95
+ return Object.fromEntries(Object.entries(value).map(([operator, operand]) => OPAQUE_OPERATORS.includes(operator)
96
+ ? [operator, operand]
97
+ : [operator, marshalCriteriaValue(operand)]));
98
+ }
99
+ return value;
100
+ };
101
+ const marshalCriteria = (criteria, refs) => {
102
+ if (criteria == null) {
103
+ return criteria;
104
+ }
105
+ return Object.fromEntries(Object.entries(criteria).map(([key, value]) => {
106
+ if (LOGICAL_OPERATORS.includes(key) && Array.isArray(value)) {
107
+ return [key, value.map(sub => marshalCriteria(sub, refs))];
108
+ }
109
+ if (key === 'id' || key === '_id') {
110
+ return ['_id', marshalCriteriaValue(value)];
111
+ }
112
+ if (refs.has(key)) {
113
+ return [key, marshalCriteriaValue(value)];
114
+ }
115
+ return [key, value];
116
+ }));
117
+ };
118
+ const identityCriteria = (field, id, refs) => {
119
+ if (field === '_id') {
120
+ return { _id: new ObjectId(id) };
121
+ }
122
+ if (field === 'id') {
123
+ return { _id: isObjectIdHex(id) ? new ObjectId(id) : id };
124
+ }
125
+ if (refs.has(field)) {
126
+ return { [field]: isObjectIdHex(id) ? new ObjectId(id) : id };
127
+ }
128
+ return { [field]: id };
129
+ };
130
+ const refMigrationName = (field) => `$ref:${field}@1`;
131
+ const reconcileReferences = async (collection, refs, alias) => {
132
+ for (const ref of refs) {
133
+ const remnant = await collection.findOne({ [ref.field]: { $type: 'string', $regex: HEX24 } }, { projection: { _id: 1 } });
134
+ if (remnant != null) {
135
+ const converted = await convertReferenceField(collection, ref.field);
136
+ log.warn('Reference field held string ids outside the migration ledger; converted', {
137
+ resource: alias, field: ref.field, converted,
138
+ });
139
+ }
140
+ }
141
+ };
142
+ return {
143
+ isObjectIdHex, marshalReference, demarshalReference, demarshalRefs, marshalCriteria, identityCriteria,
144
+ refMigrationName, convertReferenceField, reconcileReferences
145
+ };
196
146
  };
147
+ export const mongoRefHelper = createMongoRefHelper();
148
+ /** @deprecated compat:factory-refactor — use `mongoRefHelper.isObjectIdHex(…)` */
149
+ export const isObjectIdHex = (value) => mongoRefHelper.isObjectIdHex(value);
150
+ /** @deprecated compat:factory-refactor — use `mongoRefHelper.marshalReference(…)` */
151
+ export const marshalReference = (field, value) => mongoRefHelper.marshalReference(field, value);
152
+ /** @deprecated compat:factory-refactor — use `mongoRefHelper.demarshalRefs(…)` */
153
+ export const demarshalRefs = (record, refs) => mongoRefHelper.demarshalRefs(record, refs);
197
154
  //# sourceMappingURL=refs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"refs.js","sourceRoot":"","sources":["../../src/utils/refs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"refs.js","sourceRoot":"","sources":["../../src/utils/refs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { AnySchema } from 'ajv';
2
+ import type { Document } from 'mongodb';
3
+ import type { MongoReference } from '../../types.js';
4
+ /** An AJV schema as the `$jsonSchema` validator of a collection. */
5
+ export interface MongoSchemaUtils {
6
+ /**
7
+ * Declared references are stored as `ObjectId`s while the AJV schema — which describes
8
+ * the records the app exchanges — keeps calling them strings. The collection validator
9
+ * describes what's stored, so the reference fields are overridden here after the plain
10
+ * conversion. Nullability and array shape carry over from the declared property.
11
+ */
12
+ applyReferenceTypes: (mongoSchema: Document, schema: AnySchema, refs: MongoReference[]) => Document;
13
+ /** The plain conversion of an object schema into a `$jsonSchema` document. */
14
+ schemaToMongoSchema: (schema: AnySchema) => Document;
15
+ }
16
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/utils/schema/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAA;AACpC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,oEAAoE;AACpE,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,mBAAmB,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,QAAQ,CAAA;IACnG,8EAA8E;IAC9E,mBAAmB,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,QAAQ,CAAA;CACrD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/utils/schema/types.ts"],"names":[],"mappings":""}
@@ -1,12 +1,4 @@
1
- import type { AnySchema } from 'ajv';
2
- import type { Document } from 'mongodb';
3
- import type { MongoReference } from '../types.js';
4
- /**
5
- * Declared references are stored as `ObjectId`s while the AJV schema — which describes
6
- * the records the app exchanges — keeps calling them strings. The collection validator
7
- * describes what's stored, so the reference fields are overridden here after the plain
8
- * conversion. Nullability and array shape carry over from the declared property.
9
- */
10
- export declare const applyReferenceTypes: (mongoSchema: Document, schema: AnySchema, refs: MongoReference[]) => Document;
11
- export declare const schemaToMongoSchema: (schema: AnySchema) => Document;
1
+ import type { MongoSchemaUtils } from './schema/types.js';
2
+ export declare const createMongoSchemaUtils: () => MongoSchemaUtils;
3
+ export declare const mongoSchemaUtils: MongoSchemaUtils;
12
4
  //# sourceMappingURL=schema.d.ts.map
@@ -1 +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,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,gBACjB,QAAQ,UAAU,SAAS,QAAQ,cAAc,EAAE,KAC/D,QAoBF,CAAA;AAED,eAAO,MAAM,mBAAmB,WAAY,SAAS,KAAG,QAmCvD,CAAA"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/utils/schema.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEzD,eAAO,MAAM,sBAAsB,QAAO,gBAiHzC,CAAA;AAED,eAAO,MAAM,gBAAgB,kBAA2B,CAAA"}
@@ -1,94 +1,92 @@
1
- /**
2
- * Declared references are stored as `ObjectId`s while the AJV schema — which describes
3
- * the records the app exchanges — keeps calling them strings. The collection validator
4
- * describes what's stored, so the reference fields are overridden here after the plain
5
- * conversion. Nullability and array shape carry over from the declared property.
6
- */
7
- export const applyReferenceTypes = (mongoSchema, schema, refs) => {
8
- if (mongoSchema.properties == null || refs.length < 1) {
9
- return mongoSchema;
10
- }
11
- const properties = schema.properties ?? {};
12
- for (const ref of refs) {
13
- const declared = properties[ref.field];
14
- if (declared == null || mongoSchema.properties[ref.field] == null) {
15
- continue;
1
+ export const createMongoSchemaUtils = () => {
2
+ const applyReferenceTypes = (mongoSchema, schema, refs) => {
3
+ if (mongoSchema.properties == null || refs.length < 1) {
4
+ return mongoSchema;
16
5
  }
17
- mongoSchema.properties[ref.field] = declared.type === 'array'
18
- ? {
19
- bsonType: declared.nullable ? ['array', 'null'] : 'array',
20
- items: { bsonType: 'objectId' }
6
+ const properties = schema.properties ?? {};
7
+ for (const ref of refs) {
8
+ const declared = properties[ref.field];
9
+ if (declared == null || mongoSchema.properties[ref.field] == null) {
10
+ continue;
21
11
  }
22
- : { bsonType: declared.nullable ? ['objectId', 'null'] : 'objectId' };
23
- }
24
- return mongoSchema;
25
- };
26
- export const schemaToMongoSchema = (schema) => {
27
- const _schema = schema;
28
- if (_schema.type !== 'object') {
29
- throw new SyntaxError('Only object schemas can be converted to mongo schema');
30
- }
31
- const mongoSchems = {
32
- bsonType: 'object',
33
- properties: _schema.properties != null
34
- ? 'allOf' in _schema.properties
35
- ? covertAllOfProperties(_schema.properties.allOf) :
36
- convertProperties(_schema.properties ?? {})
37
- : undefined,
38
- additionalProperties: _schema.additionalProperties != null
39
- ? convertAdditionalProperties(_schema.additionalProperties)
40
- : false,
41
- ...(_schema.required != null ? { required: _schema.required } : {}),
12
+ mongoSchema.properties[ref.field] = declared.type === 'array'
13
+ ? {
14
+ bsonType: declared.nullable ? ['array', 'null'] : 'array',
15
+ items: { bsonType: 'objectId' }
16
+ }
17
+ : { bsonType: declared.nullable ? ['objectId', 'null'] : 'objectId' };
18
+ }
19
+ return mongoSchema;
42
20
  };
43
- if (_schema.nullable) {
44
- mongoSchems.bsonType = [mongoSchems.bsonType, 'null'];
45
- }
46
- if ("properties" in mongoSchems && mongoSchems.properties == null) {
47
- delete mongoSchems.properties;
48
- }
49
- if ("required" in mongoSchems && mongoSchems.required == null
50
- || Array.isArray(mongoSchems.required) && mongoSchems.required.length === 0) {
51
- delete mongoSchems.required;
52
- }
53
- return mongoSchems;
54
- };
55
- const convertAdditionalProperties = (additionalProperties) => {
56
- if (typeof additionalProperties === 'boolean') {
57
- return additionalProperties;
58
- }
59
- return convertToBsonType(additionalProperties);
60
- };
61
- const convertProperties = (properties) => Object.fromEntries(Object.entries(properties).map(([key, value]) => {
62
- if (key === 'oneOf') {
63
- throw new SyntaxError('We dont support schemas with oneof properties definition');
64
- }
65
- return [key, convertToBsonType(value)];
66
- }));
67
- const covertAllOfProperties = (allOf) => allOf.map(schema => convertProperties(schema.properties ?? {}))
68
- .reduce((properties, schema) => ({ ...properties, ...schema }), {});
69
- const prepareScalarType = (value) => {
70
- const type = (Array.isArray(value.type) ? value.type : [value.type])
71
- .map(type => type === 'boolean' ? 'bool' : type);
72
- if (value.nullable) {
73
- type.push('null');
74
- }
75
- return type.length === 1 ? type[0] : type;
76
- };
77
- const convertToBsonType = (value) => {
78
- if (Array.isArray(value.type)) {
79
- if ('properties' in value || 'additionalProperties' in value) {
80
- return {
81
- ...schemaToMongoSchema({ ...value, type: 'object' }),
82
- bsonType: prepareScalarType(value)
83
- };
21
+ const schemaToMongoSchema = (schema) => {
22
+ const _schema = schema;
23
+ if (_schema.type !== 'object') {
24
+ throw new SyntaxError('Only object schemas can be converted to mongo schema');
25
+ }
26
+ const mongoSchems = {
27
+ bsonType: 'object',
28
+ properties: _schema.properties != null
29
+ ? 'allOf' in _schema.properties
30
+ ? covertAllOfProperties(_schema.properties.allOf) :
31
+ convertProperties(_schema.properties ?? {})
32
+ : undefined,
33
+ additionalProperties: _schema.additionalProperties != null
34
+ ? convertAdditionalProperties(_schema.additionalProperties)
35
+ : false,
36
+ ...(_schema.required != null ? { required: _schema.required } : {}),
37
+ };
38
+ if (_schema.nullable) {
39
+ mongoSchems.bsonType = [mongoSchems.bsonType, 'null'];
40
+ }
41
+ if ("properties" in mongoSchems && mongoSchems.properties == null) {
42
+ delete mongoSchems.properties;
43
+ }
44
+ if ("required" in mongoSchems && mongoSchems.required == null
45
+ || Array.isArray(mongoSchems.required) && mongoSchems.required.length === 0) {
46
+ delete mongoSchems.required;
84
47
  }
85
- return { bsonType: prepareScalarType(value) };
86
- }
87
- return value.type === 'object'
88
- // `DateSchema` is `{ type: 'object', format: 'date-time' }`, so a date is detected by
89
- // format rather than type — but it still has to honor `nullable`, otherwise an optional
90
- // date left unset (the driver writes `undefined` as `null`) fails collection validation.
91
- ? value.format === 'date-time' ? { bsonType: value.nullable ? ['date', 'null'] : 'date' } : schemaToMongoSchema(value)
92
- : { bsonType: prepareScalarType(value) };
48
+ return mongoSchems;
49
+ };
50
+ const convertAdditionalProperties = (additionalProperties) => {
51
+ if (typeof additionalProperties === 'boolean') {
52
+ return additionalProperties;
53
+ }
54
+ return convertToBsonType(additionalProperties);
55
+ };
56
+ const convertProperties = (properties) => Object.fromEntries(Object.entries(properties).map(([key, value]) => {
57
+ if (key === 'oneOf') {
58
+ throw new SyntaxError('We dont support schemas with oneof properties definition');
59
+ }
60
+ return [key, convertToBsonType(value)];
61
+ }));
62
+ const covertAllOfProperties = (allOf) => allOf.map(schema => convertProperties(schema.properties ?? {}))
63
+ .reduce((properties, schema) => ({ ...properties, ...schema }), {});
64
+ const prepareScalarType = (value) => {
65
+ const type = (Array.isArray(value.type) ? value.type : [value.type])
66
+ .map(type => type === 'boolean' ? 'bool' : type);
67
+ if (value.nullable) {
68
+ type.push('null');
69
+ }
70
+ return type.length === 1 ? type[0] : type;
71
+ };
72
+ const convertToBsonType = (value) => {
73
+ if (Array.isArray(value.type)) {
74
+ if ('properties' in value || 'additionalProperties' in value) {
75
+ return {
76
+ ...schemaToMongoSchema({ ...value, type: 'object' }),
77
+ bsonType: prepareScalarType(value)
78
+ };
79
+ }
80
+ return { bsonType: prepareScalarType(value) };
81
+ }
82
+ return value.type === 'object'
83
+ // `DateSchema` is `{ type: 'object', format: 'date-time' }`, so a date is detected by
84
+ // format rather than type — but it still has to honor `nullable`, otherwise an optional
85
+ // date left unset (the driver writes `undefined` as `null`) fails collection validation.
86
+ ? value.format === 'date-time' ? { bsonType: value.nullable ? ['date', 'null'] : 'date' } : schemaToMongoSchema(value)
87
+ : { bsonType: prepareScalarType(value) };
88
+ };
89
+ return { applyReferenceTypes, schemaToMongoSchema };
93
90
  };
91
+ export const mongoSchemaUtils = createMongoSchemaUtils();
94
92
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/utils/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/utils/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { MigrationStage } from '@owlmeans/resource';
2
+ export interface LedgerRecord {
3
+ alias: string;
4
+ name: string;
5
+ stage: MigrationStage;
6
+ checksum: string | null;
7
+ baseline: boolean;
8
+ startedAt: Date;
9
+ /** `null` while a replica is running it — the claim, not the completion. */
10
+ completedAt: Date | null;
11
+ durationMs: number | null;
12
+ }
13
+ //# sourceMappingURL=types.local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.local.d.ts","sourceRoot":"","sources":["../../src/utils/types.local.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAExD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,cAAc,CAAA;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,QAAQ,EAAE,OAAO,CAAA;IACjB,SAAS,EAAE,IAAI,CAAA;IACf,4EAA4E;IAC5E,WAAW,EAAE,IAAI,GAAG,IAAI,CAAA;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.local.js","sourceRoot":"","sources":["../../src/utils/types.local.ts"],"names":[],"mappings":""}