@x12i/memorix-descriptors 1.4.2 → 1.5.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 (180) hide show
  1. package/README.md +17 -10
  2. package/dist/admin/create-admin.d.ts +20 -0
  3. package/dist/admin/create-admin.d.ts.map +1 -1
  4. package/dist/admin/create-admin.js +38 -2
  5. package/dist/admin/create-admin.js.map +1 -1
  6. package/dist/catalog/ids.d.ts +7 -0
  7. package/dist/catalog/ids.d.ts.map +1 -1
  8. package/dist/catalog/ids.js +13 -0
  9. package/dist/catalog/ids.js.map +1 -1
  10. package/dist/catalox/client.d.ts.map +1 -1
  11. package/dist/catalox/client.js +26 -1
  12. package/dist/catalox/client.js.map +1 -1
  13. package/dist/cli/index.js +146 -3
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/env/load-env-file.d.ts +7 -0
  16. package/dist/env/load-env-file.d.ts.map +1 -0
  17. package/dist/env/load-env-file.js +74 -0
  18. package/dist/env/load-env-file.js.map +1 -0
  19. package/dist/index.d.ts +9 -2
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +5 -1
  22. package/dist/index.js.map +1 -1
  23. package/dist/migration/apply.d.ts +21 -0
  24. package/dist/migration/apply.d.ts.map +1 -0
  25. package/dist/migration/apply.js +102 -0
  26. package/dist/migration/apply.js.map +1 -0
  27. package/dist/migration/backup.d.ts +8 -0
  28. package/dist/migration/backup.d.ts.map +1 -0
  29. package/dist/migration/backup.js +27 -0
  30. package/dist/migration/backup.js.map +1 -0
  31. package/dist/migration/classify.d.ts +6 -0
  32. package/dist/migration/classify.d.ts.map +1 -0
  33. package/dist/migration/classify.js +67 -0
  34. package/dist/migration/classify.js.map +1 -0
  35. package/dist/migration/ensure-canonical-catalogs.d.ts +4 -0
  36. package/dist/migration/ensure-canonical-catalogs.d.ts.map +1 -0
  37. package/dist/migration/ensure-canonical-catalogs.js +101 -0
  38. package/dist/migration/ensure-canonical-catalogs.js.map +1 -0
  39. package/dist/migration/generate-descriptors.d.ts +22 -0
  40. package/dist/migration/generate-descriptors.d.ts.map +1 -0
  41. package/dist/migration/generate-descriptors.js +234 -0
  42. package/dist/migration/generate-descriptors.js.map +1 -0
  43. package/dist/migration/index.d.ts +13 -0
  44. package/dist/migration/index.d.ts.map +1 -0
  45. package/dist/migration/index.js +12 -0
  46. package/dist/migration/index.js.map +1 -0
  47. package/dist/migration/inspect.d.ts +9 -0
  48. package/dist/migration/inspect.d.ts.map +1 -0
  49. package/dist/migration/inspect.js +57 -0
  50. package/dist/migration/inspect.js.map +1 -0
  51. package/dist/migration/load-snapshot.d.ts +15 -0
  52. package/dist/migration/load-snapshot.d.ts.map +1 -0
  53. package/dist/migration/load-snapshot.js +83 -0
  54. package/dist/migration/load-snapshot.js.map +1 -0
  55. package/dist/migration/mongo-inventory.d.ts +20 -0
  56. package/dist/migration/mongo-inventory.d.ts.map +1 -0
  57. package/dist/migration/mongo-inventory.js +95 -0
  58. package/dist/migration/mongo-inventory.js.map +1 -0
  59. package/dist/migration/object-type-specs.d.ts +17 -0
  60. package/dist/migration/object-type-specs.d.ts.map +1 -0
  61. package/dist/migration/object-type-specs.js +58 -0
  62. package/dist/migration/object-type-specs.js.map +1 -0
  63. package/dist/migration/plan.d.ts +4 -0
  64. package/dist/migration/plan.d.ts.map +1 -0
  65. package/dist/migration/plan.js +136 -0
  66. package/dist/migration/plan.js.map +1 -0
  67. package/dist/migration/reset.d.ts +17 -0
  68. package/dist/migration/reset.d.ts.map +1 -0
  69. package/dist/migration/reset.js +73 -0
  70. package/dist/migration/reset.js.map +1 -0
  71. package/dist/migration/types.d.ts +76 -0
  72. package/dist/migration/types.d.ts.map +1 -0
  73. package/dist/migration/types.js +17 -0
  74. package/dist/migration/types.js.map +1 -0
  75. package/dist/migration/validate-plan.d.ts +15 -0
  76. package/dist/migration/validate-plan.d.ts.map +1 -0
  77. package/dist/migration/validate-plan.js +112 -0
  78. package/dist/migration/validate-plan.js.map +1 -0
  79. package/dist/migration/verify.d.ts +15 -0
  80. package/dist/migration/verify.d.ts.map +1 -0
  81. package/dist/migration/verify.js +27 -0
  82. package/dist/migration/verify.js.map +1 -0
  83. package/dist/mutations/common.d.ts +7 -4
  84. package/dist/mutations/common.d.ts.map +1 -1
  85. package/dist/mutations/common.js +54 -3
  86. package/dist/mutations/common.js.map +1 -1
  87. package/dist/mutations/entity.d.ts.map +1 -1
  88. package/dist/mutations/entity.js +5 -1
  89. package/dist/mutations/entity.js.map +1 -1
  90. package/dist/mutations/execute.d.ts.map +1 -1
  91. package/dist/mutations/execute.js +9 -1
  92. package/dist/mutations/execute.js.map +1 -1
  93. package/dist/mutations/item.d.ts.map +1 -1
  94. package/dist/mutations/item.js +5 -1
  95. package/dist/mutations/item.js.map +1 -1
  96. package/dist/mutations/list.js +8 -1
  97. package/dist/mutations/list.js.map +1 -1
  98. package/dist/source/action-drafts.d.ts +17 -0
  99. package/dist/source/action-drafts.d.ts.map +1 -0
  100. package/dist/source/action-drafts.js +191 -0
  101. package/dist/source/action-drafts.js.map +1 -0
  102. package/dist/source/aliases.d.ts +23 -0
  103. package/dist/source/aliases.d.ts.map +1 -0
  104. package/dist/source/aliases.js +60 -0
  105. package/dist/source/aliases.js.map +1 -0
  106. package/dist/source/catalog-health.d.ts +17 -0
  107. package/dist/source/catalog-health.d.ts.map +1 -0
  108. package/dist/source/catalog-health.js +87 -0
  109. package/dist/source/catalog-health.js.map +1 -0
  110. package/dist/source/envelope.d.ts +29 -0
  111. package/dist/source/envelope.d.ts.map +1 -0
  112. package/dist/source/envelope.js +125 -0
  113. package/dist/source/envelope.js.map +1 -0
  114. package/dist/source/graph.d.ts +12 -0
  115. package/dist/source/graph.d.ts.map +1 -0
  116. package/dist/source/graph.js +148 -0
  117. package/dist/source/graph.js.map +1 -0
  118. package/dist/source/guards.d.ts +7 -0
  119. package/dist/source/guards.d.ts.map +1 -0
  120. package/dist/source/guards.js +74 -0
  121. package/dist/source/guards.js.map +1 -0
  122. package/dist/source/index.d.ts +14 -0
  123. package/dist/source/index.d.ts.map +1 -0
  124. package/dist/source/index.js +14 -0
  125. package/dist/source/index.js.map +1 -0
  126. package/dist/source/inspectable.d.ts +11 -0
  127. package/dist/source/inspectable.d.ts.map +1 -0
  128. package/dist/source/inspectable.js +167 -0
  129. package/dist/source/inspectable.js.map +1 -0
  130. package/dist/source/reconcile-source.d.ts +10 -0
  131. package/dist/source/reconcile-source.d.ts.map +1 -0
  132. package/dist/source/reconcile-source.js +40 -0
  133. package/dist/source/reconcile-source.js.map +1 -0
  134. package/dist/source/registry.d.ts +9 -0
  135. package/dist/source/registry.d.ts.map +1 -0
  136. package/dist/source/registry.js +121 -0
  137. package/dist/source/registry.js.map +1 -0
  138. package/dist/source/snapshot.d.ts +15 -0
  139. package/dist/source/snapshot.d.ts.map +1 -0
  140. package/dist/source/snapshot.js +160 -0
  141. package/dist/source/snapshot.js.map +1 -0
  142. package/dist/source/types.d.ts +222 -0
  143. package/dist/source/types.d.ts.map +1 -0
  144. package/dist/source/types.js +2 -0
  145. package/dist/source/types.js.map +1 -0
  146. package/dist/source/validation.d.ts +12 -0
  147. package/dist/source/validation.d.ts.map +1 -0
  148. package/dist/source/validation.js +229 -0
  149. package/dist/source/validation.js.map +1 -0
  150. package/dist/tests/canonical-metadata.test.d.ts +2 -0
  151. package/dist/tests/canonical-metadata.test.d.ts.map +1 -0
  152. package/dist/tests/canonical-metadata.test.js +198 -0
  153. package/dist/tests/canonical-metadata.test.js.map +1 -0
  154. package/dist/tests/source-aware.test.d.ts +2 -0
  155. package/dist/tests/source-aware.test.d.ts.map +1 -0
  156. package/dist/tests/source-aware.test.js +227 -0
  157. package/dist/tests/source-aware.test.js.map +1 -0
  158. package/dist/types/canonical-v2.d.ts +164 -0
  159. package/dist/types/canonical-v2.d.ts.map +1 -0
  160. package/dist/types/canonical-v2.js +6 -0
  161. package/dist/types/canonical-v2.js.map +1 -0
  162. package/dist/types/index.d.ts +25 -2
  163. package/dist/types/index.d.ts.map +1 -1
  164. package/dist/validation/canonical-contamination.d.ts +6 -0
  165. package/dist/validation/canonical-contamination.d.ts.map +1 -0
  166. package/dist/validation/canonical-contamination.js +71 -0
  167. package/dist/validation/canonical-contamination.js.map +1 -0
  168. package/dist/validation/canonical-metadata-validation.d.ts +13 -0
  169. package/dist/validation/canonical-metadata-validation.d.ts.map +1 -0
  170. package/dist/validation/canonical-metadata-validation.js +248 -0
  171. package/dist/validation/canonical-metadata-validation.js.map +1 -0
  172. package/dist/validation/canonical-v2-validation.d.ts +8 -0
  173. package/dist/validation/canonical-v2-validation.d.ts.map +1 -0
  174. package/dist/validation/canonical-v2-validation.js +273 -0
  175. package/dist/validation/canonical-v2-validation.js.map +1 -0
  176. package/docs/MEMORIX-CATALOX-CATALOG-MAP.md +589 -0
  177. package/docs/MEMORIX-CATALOX-CONTRACTS.md +17 -10
  178. package/docs/MEMORIX-DATABASE-CONVENTIONS.md +10 -7
  179. package/docs/MEMORIX-OBJECT-TYPES-AND-TARGETS.md +207 -0
  180. package/package.json +9 -1
@@ -0,0 +1,248 @@
1
+ import { LEGACY_GLOBAL_CONTENT_TYPE_CATALOG, LEGACY_SCHEMA_INFERENCE_CATALOG, MEMORIX_COMPLETION_MAPPINGS_CATALOG, MEMORIX_ENTITY_DESCRIPTORS_CATALOG, MEMORIX_INVENTORY_POLICIES_CATALOG, MEMORIX_INVENTORY_POLICY_ITEM_ID, MEMORIX_ITEM_DESCRIPTORS_CATALOG, MEMORIX_LIST_DESCRIPTORS_CATALOG, MEMORIX_OBJECT_TYPE_DESCRIPTORS_CATALOG, MEMORIX_REQUIRED_CANONICAL_CATALOG_IDS, PARALLEL_KNOWLEDGE_CATALOG, } from "../catalog/ids.js";
2
+ import { findContaminationInDescriptorData } from "./canonical-contamination.js";
3
+ import { validateMemorixCompletionMappingV2, validateMemorixInventoryPolicyV1, validateMemorixItemDescriptorV2, validateMemorixListDescriptorV2, validateMemorixObjectTypeDescriptorV2, WORKSPACE_SYNTHETIC_FIELDS, } from "./canonical-v2-validation.js";
4
+ import { DescriptorValidationError } from "./errors.js";
5
+ export const FORBIDDEN_LEGACY_CATALOG_IDS = [
6
+ MEMORIX_ENTITY_DESCRIPTORS_CATALOG,
7
+ LEGACY_SCHEMA_INFERENCE_CATALOG,
8
+ LEGACY_GLOBAL_CONTENT_TYPE_CATALOG,
9
+ ];
10
+ export const FORBIDDEN_LEGACY_ITEM_IDS = [
11
+ "variabilities-groups",
12
+ "variabilities-group-detail-item",
13
+ "variabilities-groups-main-list",
14
+ "critical-vulnerabilities-list",
15
+ ];
16
+ const DESCRIPTOR_LIKE_PREFIXES = ["memorix-", "memorix_"];
17
+ function pushError(errors, issue) {
18
+ errors.push(issue);
19
+ }
20
+ function validationErrorToIssue(err, catalogId, itemId) {
21
+ if (err instanceof DescriptorValidationError) {
22
+ return {
23
+ code: err.code,
24
+ message: err.message,
25
+ catalogId,
26
+ itemId,
27
+ };
28
+ }
29
+ return {
30
+ code: "INVALID_DESCRIPTOR",
31
+ message: err instanceof Error ? err.message : String(err),
32
+ catalogId,
33
+ itemId,
34
+ };
35
+ }
36
+ function catalogItems(snapshot, catalogId) {
37
+ return snapshot.catalogs[catalogId] ?? [];
38
+ }
39
+ function isDescriptorLikeUnknownCatalog(catalogId) {
40
+ if (MEMORIX_REQUIRED_CANONICAL_CATALOG_IDS.includes(catalogId)) {
41
+ return false;
42
+ }
43
+ if (catalogId === PARALLEL_KNOWLEDGE_CATALOG) {
44
+ return false;
45
+ }
46
+ return DESCRIPTOR_LIKE_PREFIXES.some((prefix) => catalogId.startsWith(prefix));
47
+ }
48
+ export function validateCanonicalMemorixCataloxMetadata(snapshot, options = {}) {
49
+ const errors = [];
50
+ const warnings = [];
51
+ const appId = snapshot.appId || "memorix";
52
+ for (const catalogId of FORBIDDEN_LEGACY_CATALOG_IDS) {
53
+ if (options.allowLegacyCatalogs)
54
+ continue;
55
+ if (catalogItems(snapshot, catalogId).length > 0 || catalogId in snapshot.catalogs) {
56
+ pushError(errors, {
57
+ code: "LEGACY_CATALOG_PRESENT",
58
+ catalogId,
59
+ message: `Legacy catalog "${catalogId}" is not allowed in canonical Memorix metadata.`,
60
+ });
61
+ }
62
+ }
63
+ for (const catalogId of Object.keys(snapshot.catalogs)) {
64
+ if (options.allowLegacyCatalogs && FORBIDDEN_LEGACY_CATALOG_IDS.includes(catalogId)) {
65
+ continue;
66
+ }
67
+ if (isDescriptorLikeUnknownCatalog(catalogId)) {
68
+ pushError(errors, {
69
+ code: "UNKNOWN_DESCRIPTOR_CATALOG",
70
+ catalogId,
71
+ message: `Unknown descriptor-like catalog "${catalogId}" under app "${appId}".`,
72
+ });
73
+ }
74
+ }
75
+ for (const requiredCatalogId of MEMORIX_REQUIRED_CANONICAL_CATALOG_IDS) {
76
+ if (!(requiredCatalogId in snapshot.catalogs)) {
77
+ pushError(errors, {
78
+ code: "MISSING_REQUIRED_CATALOG",
79
+ catalogId: requiredCatalogId,
80
+ message: `Required catalog "${requiredCatalogId}" is missing.`,
81
+ });
82
+ }
83
+ }
84
+ const objectTypes = {};
85
+ for (const item of catalogItems(snapshot, MEMORIX_OBJECT_TYPE_DESCRIPTORS_CATALOG)) {
86
+ if (FORBIDDEN_LEGACY_ITEM_IDS.includes(item.id)) {
87
+ pushError(errors, {
88
+ code: "FORBIDDEN_LEGACY_ITEM_ID",
89
+ catalogId: MEMORIX_OBJECT_TYPE_DESCRIPTORS_CATALOG,
90
+ itemId: item.id,
91
+ message: `Forbidden legacy item id "${item.id}".`,
92
+ });
93
+ continue;
94
+ }
95
+ try {
96
+ const validated = validateMemorixObjectTypeDescriptorV2(item.data);
97
+ objectTypes[item.id] = validated;
98
+ if (validated.id !== validated.objectType) {
99
+ pushError(errors, {
100
+ code: "OBJECT_TYPE_ID_MISMATCH",
101
+ catalogId: MEMORIX_OBJECT_TYPE_DESCRIPTORS_CATALOG,
102
+ itemId: item.id,
103
+ message: "Object type descriptor id must equal objectType.",
104
+ });
105
+ }
106
+ }
107
+ catch (err) {
108
+ pushError(errors, validationErrorToIssue(err, MEMORIX_OBJECT_TYPE_DESCRIPTORS_CATALOG, item.id));
109
+ }
110
+ }
111
+ const listItems = catalogItems(snapshot, MEMORIX_LIST_DESCRIPTORS_CATALOG);
112
+ const itemDescriptorsById = new Map(catalogItems(snapshot, MEMORIX_ITEM_DESCRIPTORS_CATALOG).map((item) => [item.id, item]));
113
+ for (const item of listItems) {
114
+ if (FORBIDDEN_LEGACY_ITEM_IDS.includes(item.id)) {
115
+ pushError(errors, {
116
+ code: "FORBIDDEN_LEGACY_ITEM_ID",
117
+ catalogId: MEMORIX_LIST_DESCRIPTORS_CATALOG,
118
+ itemId: item.id,
119
+ message: `Forbidden legacy list id "${item.id}".`,
120
+ });
121
+ continue;
122
+ }
123
+ try {
124
+ const validated = validateMemorixListDescriptorV2(item.data, objectTypes);
125
+ if (validated.kind === "workspace") {
126
+ for (const field of validated.fields) {
127
+ if (!WORKSPACE_SYNTHETIC_FIELDS.has(field)) {
128
+ pushError(errors, {
129
+ code: "UNKNOWN_WORKSPACE_FIELD",
130
+ catalogId: MEMORIX_LIST_DESCRIPTORS_CATALOG,
131
+ itemId: item.id,
132
+ message: `Workspace field "${field}" is not a known synthetic field.`,
133
+ });
134
+ }
135
+ }
136
+ }
137
+ if (validated.kind === "slice" && validated.defaultItemDescriptorId) {
138
+ if (!itemDescriptorsById.has(validated.defaultItemDescriptorId)) {
139
+ pushError(errors, {
140
+ code: "UNKNOWN_ITEM_DESCRIPTOR",
141
+ catalogId: MEMORIX_LIST_DESCRIPTORS_CATALOG,
142
+ itemId: item.id,
143
+ message: `Slice defaultItemDescriptorId "${validated.defaultItemDescriptorId}" does not exist.`,
144
+ });
145
+ }
146
+ }
147
+ }
148
+ catch (err) {
149
+ pushError(errors, validationErrorToIssue(err, MEMORIX_LIST_DESCRIPTORS_CATALOG, item.id));
150
+ }
151
+ }
152
+ for (const item of catalogItems(snapshot, MEMORIX_ITEM_DESCRIPTORS_CATALOG)) {
153
+ if (FORBIDDEN_LEGACY_ITEM_IDS.includes(item.id)) {
154
+ pushError(errors, {
155
+ code: "FORBIDDEN_LEGACY_ITEM_ID",
156
+ catalogId: MEMORIX_ITEM_DESCRIPTORS_CATALOG,
157
+ itemId: item.id,
158
+ message: `Forbidden legacy item descriptor id "${item.id}".`,
159
+ });
160
+ continue;
161
+ }
162
+ try {
163
+ validateMemorixItemDescriptorV2(item.data, objectTypes);
164
+ }
165
+ catch (err) {
166
+ pushError(errors, validationErrorToIssue(err, MEMORIX_ITEM_DESCRIPTORS_CATALOG, item.id));
167
+ }
168
+ }
169
+ for (const item of catalogItems(snapshot, MEMORIX_COMPLETION_MAPPINGS_CATALOG)) {
170
+ try {
171
+ validateMemorixCompletionMappingV2(item.data, objectTypes);
172
+ }
173
+ catch (err) {
174
+ pushError(errors, validationErrorToIssue(err, MEMORIX_COMPLETION_MAPPINGS_CATALOG, item.id));
175
+ }
176
+ }
177
+ const inventoryItems = catalogItems(snapshot, MEMORIX_INVENTORY_POLICIES_CATALOG);
178
+ const defaultPolicy = inventoryItems.find((item) => item.id === MEMORIX_INVENTORY_POLICY_ITEM_ID);
179
+ if (!defaultPolicy) {
180
+ pushError(errors, {
181
+ code: "MISSING_INVENTORY_POLICY",
182
+ catalogId: MEMORIX_INVENTORY_POLICIES_CATALOG,
183
+ itemId: MEMORIX_INVENTORY_POLICY_ITEM_ID,
184
+ message: 'Inventory policy item "default" is required.',
185
+ });
186
+ }
187
+ else {
188
+ try {
189
+ validateMemorixInventoryPolicyV1(defaultPolicy.data);
190
+ }
191
+ catch (err) {
192
+ pushError(errors, validationErrorToIssue(err, MEMORIX_INVENTORY_POLICIES_CATALOG, defaultPolicy.id));
193
+ }
194
+ }
195
+ for (const [catalogId, items] of Object.entries(snapshot.catalogs)) {
196
+ if (!MEMORIX_REQUIRED_CANONICAL_CATALOG_IDS.includes(catalogId)) {
197
+ continue;
198
+ }
199
+ for (const item of items) {
200
+ const contamination = findContaminationInDescriptorData(item.data);
201
+ for (const hit of contamination) {
202
+ pushError(errors, {
203
+ code: "RUNTIME_CONTAMINATION",
204
+ catalogId,
205
+ itemId: item.id,
206
+ path: hit.path,
207
+ message: hit.reason,
208
+ });
209
+ }
210
+ }
211
+ }
212
+ for (const objectType of Object.values(objectTypes)) {
213
+ if (!listItems.some((item) => item.id === objectType.defaultListDescriptorId)) {
214
+ pushError(errors, {
215
+ code: "UNKNOWN_LIST_DESCRIPTOR",
216
+ catalogId: MEMORIX_OBJECT_TYPE_DESCRIPTORS_CATALOG,
217
+ itemId: objectType.id,
218
+ message: `defaultListDescriptorId "${objectType.defaultListDescriptorId}" does not exist.`,
219
+ });
220
+ }
221
+ if (!itemDescriptorsById.has(objectType.defaultItemDescriptorId)) {
222
+ pushError(errors, {
223
+ code: "UNKNOWN_ITEM_DESCRIPTOR",
224
+ catalogId: MEMORIX_OBJECT_TYPE_DESCRIPTORS_CATALOG,
225
+ itemId: objectType.id,
226
+ message: `defaultItemDescriptorId "${objectType.defaultItemDescriptorId}" does not exist.`,
227
+ });
228
+ }
229
+ }
230
+ if (catalogItems(snapshot, PARALLEL_KNOWLEDGE_CATALOG).length > 0) {
231
+ warnings.push({
232
+ code: "PARALLEL_KNOWLEDGE_CATALOG_PRESENT",
233
+ catalogId: PARALLEL_KNOWLEDGE_CATALOG,
234
+ message: "The knowledge catalog is present. It is not object type descriptor metadata and requires explicit product policy.",
235
+ });
236
+ }
237
+ return {
238
+ ok: errors.length === 0,
239
+ errors,
240
+ warnings,
241
+ };
242
+ }
243
+ export async function validateCanonicalMemorixCataloxMetadataFromCatalox(catalox, options = {}) {
244
+ const { loadCanonicalMemorixCatalogSnapshot } = await import("../migration/load-snapshot.js");
245
+ const snapshot = await loadCanonicalMemorixCatalogSnapshot(catalox, options);
246
+ return validateCanonicalMemorixCataloxMetadata(snapshot, options);
247
+ }
248
+ //# sourceMappingURL=canonical-metadata-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical-metadata-validation.js","sourceRoot":"","sources":["../../src/validation/canonical-metadata-validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { MemorixCompletionMappingV2, MemorixInventoryPolicyV1, MemorixItemDescriptorV2, MemorixListDescriptorV2, MemorixObjectTypeDescriptorV2 } from "../types/canonical-v2.js";
2
+ export declare const WORKSPACE_SYNTHETIC_FIELDS: Set<string>;
3
+ export declare function validateMemorixObjectTypeDescriptorV2(raw: Record<string, unknown>): MemorixObjectTypeDescriptorV2;
4
+ export declare function validateMemorixListDescriptorV2(raw: Record<string, unknown>, objectTypes: Record<string, MemorixObjectTypeDescriptorV2>): MemorixListDescriptorV2;
5
+ export declare function validateMemorixItemDescriptorV2(raw: Record<string, unknown>, objectTypes: Record<string, MemorixObjectTypeDescriptorV2>): MemorixItemDescriptorV2;
6
+ export declare function validateMemorixCompletionMappingV2(raw: Record<string, unknown>, objectTypes: Record<string, MemorixObjectTypeDescriptorV2>): MemorixCompletionMappingV2;
7
+ export declare function validateMemorixInventoryPolicyV1(raw: Record<string, unknown>): MemorixInventoryPolicyV1;
8
+ //# sourceMappingURL=canonical-v2-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical-v2-validation.d.ts","sourceRoot":"","sources":["../../src/validation/canonical-v2-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,0BAA0B,EAC1B,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,6BAA6B,EAC9B,MAAM,0BAA0B,CAAC;AAelC,eAAO,MAAM,0BAA0B,aAQrC,CAAC;AAYH,wBAAgB,qCAAqC,CACnD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,6BAA6B,CAgH/B;AAED,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,6BAA6B,CAAC,GACzD,uBAAuB,CA6HzB;AAED,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,6BAA6B,CAAC,GACzD,uBAAuB,CA2FzB;AAED,wBAAgB,kCAAkC,CAChD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,6BAA6B,CAAC,GACzD,0BAA0B,CA4D5B;AAED,wBAAgB,gCAAgC,CAC9C,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,wBAAwB,CAwD1B"}
@@ -0,0 +1,273 @@
1
+ import { COMPLETION_MAPPING_SCHEMA_V2, INVENTORY_POLICY_SCHEMA_V1, ITEM_DESCRIPTOR_SCHEMA_V2, LIST_DESCRIPTOR_SCHEMA_V2, OBJECT_TYPE_DESCRIPTOR_SCHEMA_V2, } from "../types/canonical-v2.js";
2
+ import { findContaminationInDescriptorData } from "./canonical-contamination.js";
3
+ import { DescriptorValidationError } from "./errors.js";
4
+ import { validateListPagination } from "./list-pagination.js";
5
+ const VALID_TARGETS = ["entity", "event", "knowledge"];
6
+ export const WORKSPACE_SYNTHETIC_FIELDS = new Set([
7
+ "objectType",
8
+ "recordTitle",
9
+ "recordId",
10
+ "target",
11
+ "source",
12
+ "lastUpdated",
13
+ "status",
14
+ ]);
15
+ function assertObject(value, label) {
16
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
17
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", `${label} must be an object`);
18
+ }
19
+ return value;
20
+ }
21
+ export function validateMemorixObjectTypeDescriptorV2(raw) {
22
+ const d = assertObject(raw, "object type descriptor");
23
+ if (d.schemaVersion !== OBJECT_TYPE_DESCRIPTOR_SCHEMA_V2) {
24
+ throw new DescriptorValidationError("INVALID_SCHEMA_VERSION", `Object type descriptor requires schemaVersion "${OBJECT_TYPE_DESCRIPTOR_SCHEMA_V2}"`);
25
+ }
26
+ if (!d.id || !d.objectType || !d.collectionPrefix) {
27
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Object type descriptor requires id, objectType, collectionPrefix");
28
+ }
29
+ if ("entityName" in d) {
30
+ throw new DescriptorValidationError("FORBIDDEN_LEGACY_FIELD", "entityName is forbidden in canonical object type descriptors");
31
+ }
32
+ if (!d.defaultListDescriptorId || !d.defaultItemDescriptorId) {
33
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Object type descriptor requires defaultListDescriptorId and defaultItemDescriptorId");
34
+ }
35
+ if (!VALID_TARGETS.includes(d.target)) {
36
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", 'Object type descriptor target must be "entity", "event", or "knowledge"');
37
+ }
38
+ const contentTypes = d.contentTypes;
39
+ if (!contentTypes || typeof contentTypes !== "object" || Array.isArray(contentTypes)) {
40
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Object type descriptor requires contentTypes");
41
+ }
42
+ const entries = Object.entries(contentTypes);
43
+ if (entries.length === 0) {
44
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Object type descriptor requires at least one content type");
45
+ }
46
+ for (const [key, ct] of entries) {
47
+ const collection = typeof ct.collection === "string" ? ct.collection.trim() : "";
48
+ if (!collection) {
49
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", `Content type "${key}" requires explicit collection`);
50
+ }
51
+ }
52
+ const canonicalTypes = entries.filter(([, ct]) => ct.isCanonical === true);
53
+ if (canonicalTypes.length !== 1) {
54
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Object type descriptor requires exactly one canonical content type");
55
+ }
56
+ const [canonicalName] = canonicalTypes[0];
57
+ const defaults = d.defaults;
58
+ if (defaults?.canonicalContentType !== canonicalName) {
59
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "defaults.canonicalContentType must match the canonical content type key");
60
+ }
61
+ const properties = d.properties;
62
+ if (!properties || typeof properties !== "object") {
63
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Object type descriptor requires properties object");
64
+ }
65
+ for (const [propName, prop] of Object.entries(properties)) {
66
+ const source = prop.source;
67
+ if (source?.contentType && !(source.contentType in contentTypes)) {
68
+ throw new DescriptorValidationError("UNKNOWN_CONTENT_TYPE", `Property "${propName}" references unknown content type "${source.contentType}"`);
69
+ }
70
+ }
71
+ const relations = d.relations;
72
+ if (relations) {
73
+ for (const [relName, rel] of Object.entries(relations)) {
74
+ if ("targetEntity" in rel) {
75
+ throw new DescriptorValidationError("FORBIDDEN_LEGACY_FIELD", `Relation "${relName}" must use targetObjectType, not targetEntity`);
76
+ }
77
+ }
78
+ }
79
+ const contamination = findContaminationInDescriptorData(d);
80
+ if (contamination.length > 0) {
81
+ throw new DescriptorValidationError("RUNTIME_CONTAMINATION", contamination.map((hit) => `${hit.path}: ${hit.reason}`).join("; "));
82
+ }
83
+ return d;
84
+ }
85
+ export function validateMemorixListDescriptorV2(raw, objectTypes) {
86
+ const d = assertObject(raw, "list descriptor");
87
+ if (d.schemaVersion !== LIST_DESCRIPTOR_SCHEMA_V2) {
88
+ throw new DescriptorValidationError("INVALID_SCHEMA_VERSION", `List descriptor requires schemaVersion "${LIST_DESCRIPTOR_SCHEMA_V2}"`);
89
+ }
90
+ if (!d.id || !d.kind) {
91
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "List descriptor requires id and kind");
92
+ }
93
+ if (d.kind === "entity" || "entity" in d || "entityName" in d) {
94
+ throw new DescriptorValidationError("FORBIDDEN_LEGACY_FIELD", 'List descriptor must use objectType and kind "object-list", not entity');
95
+ }
96
+ validateListPagination(d.pagination);
97
+ if (d.kind === "workspace") {
98
+ const objectTypeList = d.objectTypes;
99
+ if (!Array.isArray(objectTypeList) || objectTypeList.length === 0) {
100
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Workspace list requires objectTypes array");
101
+ }
102
+ for (const objectType of objectTypeList) {
103
+ if (!objectTypes[String(objectType)]) {
104
+ throw new DescriptorValidationError("UNKNOWN_OBJECT_TYPE", `Workspace list references unknown object type "${String(objectType)}"`);
105
+ }
106
+ }
107
+ if (!Array.isArray(d.fields) || d.fields.length === 0) {
108
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Workspace list requires fields");
109
+ }
110
+ return d;
111
+ }
112
+ if (d.kind === "object-list" || d.kind === "slice") {
113
+ const objectType = String(d.objectType ?? "");
114
+ const objectTypeDescriptor = objectTypes[objectType];
115
+ if (!objectType) {
116
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", `${String(d.kind)} descriptor requires objectType`);
117
+ }
118
+ if (!objectTypeDescriptor) {
119
+ throw new DescriptorValidationError("UNKNOWN_OBJECT_TYPE", `${String(d.kind)} descriptor references unknown object type "${objectType}"`);
120
+ }
121
+ if (d.kind === "object-list") {
122
+ const leading = String(d.leadingContentType ?? "");
123
+ if (!leading || !(leading in objectTypeDescriptor.contentTypes)) {
124
+ throw new DescriptorValidationError("UNKNOWN_CONTENT_TYPE", `Object list leadingContentType "${leading}" does not exist on object type "${objectType}"`);
125
+ }
126
+ if (!Array.isArray(d.fields)) {
127
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Object list requires fields array");
128
+ }
129
+ for (const field of d.fields) {
130
+ if (!(field in objectTypeDescriptor.properties)) {
131
+ throw new DescriptorValidationError("UNKNOWN_FIELD", `List field "${field}" is not defined on object type "${objectType}"`);
132
+ }
133
+ }
134
+ }
135
+ if (d.kind === "slice") {
136
+ const contentType = String(d.contentType ?? "");
137
+ if (!contentType || !(contentType in objectTypeDescriptor.contentTypes)) {
138
+ throw new DescriptorValidationError("UNKNOWN_CONTENT_TYPE", `Slice contentType "${contentType}" does not exist on object type "${objectType}"`);
139
+ }
140
+ if (d.target && d.target !== objectTypeDescriptor.target) {
141
+ throw new DescriptorValidationError("TARGET_MISMATCH", "Slice target must match object type target");
142
+ }
143
+ if (!Array.isArray(d.fields) || d.fields.length === 0) {
144
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Slice descriptor requires non-empty fields");
145
+ }
146
+ }
147
+ }
148
+ else {
149
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", 'List kind must be "object-list", "workspace", or "slice"');
150
+ }
151
+ const contamination = findContaminationInDescriptorData(d);
152
+ if (contamination.length > 0) {
153
+ throw new DescriptorValidationError("RUNTIME_CONTAMINATION", contamination.map((hit) => `${hit.path}: ${hit.reason}`).join("; "));
154
+ }
155
+ return d;
156
+ }
157
+ export function validateMemorixItemDescriptorV2(raw, objectTypes) {
158
+ const d = assertObject(raw, "item descriptor");
159
+ if (d.schemaVersion !== ITEM_DESCRIPTOR_SCHEMA_V2) {
160
+ throw new DescriptorValidationError("INVALID_SCHEMA_VERSION", `Item descriptor requires schemaVersion "${ITEM_DESCRIPTOR_SCHEMA_V2}"`);
161
+ }
162
+ if ("entity" in d || "entityName" in d) {
163
+ throw new DescriptorValidationError("FORBIDDEN_LEGACY_FIELD", "Item descriptor must use objectType, not entity/entityName");
164
+ }
165
+ if (!d.id || !d.objectType || !d.identity) {
166
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Item descriptor requires id, objectType, identity");
167
+ }
168
+ const identity = d.identity;
169
+ if (!identity.idField) {
170
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Item descriptor identity.idField is required");
171
+ }
172
+ const objectTypeDescriptor = objectTypes[String(d.objectType)];
173
+ if (!objectTypeDescriptor) {
174
+ throw new DescriptorValidationError("UNKNOWN_OBJECT_TYPE", `Item descriptor references unknown object type "${String(d.objectType)}"`);
175
+ }
176
+ const contentTypes = d.contentTypes;
177
+ if (!Array.isArray(contentTypes) || contentTypes.length === 0) {
178
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Item descriptor requires contentTypes array");
179
+ }
180
+ for (const entry of contentTypes) {
181
+ if (!entry.contentType || !(entry.contentType in objectTypeDescriptor.contentTypes)) {
182
+ throw new DescriptorValidationError("UNKNOWN_CONTENT_TYPE", `Item content type "${String(entry.contentType)}" does not exist on object type "${String(d.objectType)}"`);
183
+ }
184
+ }
185
+ const sections = d.sections;
186
+ if (!Array.isArray(sections) || sections.length === 0) {
187
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Item descriptor requires sections");
188
+ }
189
+ for (const section of sections) {
190
+ for (const field of section.fields ?? []) {
191
+ if (!(field in objectTypeDescriptor.properties)) {
192
+ throw new DescriptorValidationError("UNKNOWN_FIELD", `Item section field "${field}" is not defined on object type "${String(d.objectType)}"`);
193
+ }
194
+ }
195
+ }
196
+ const includeRelations = d.includeRelations;
197
+ if (Array.isArray(includeRelations)) {
198
+ for (const rel of includeRelations) {
199
+ if (typeof rel !== "string" || !(rel in (objectTypeDescriptor.relations ?? {}))) {
200
+ throw new DescriptorValidationError("UNKNOWN_RELATION", `Item includeRelations references unknown relation "${String(rel)}"`);
201
+ }
202
+ }
203
+ }
204
+ const contamination = findContaminationInDescriptorData(d);
205
+ if (contamination.length > 0) {
206
+ throw new DescriptorValidationError("RUNTIME_CONTAMINATION", contamination.map((hit) => `${hit.path}: ${hit.reason}`).join("; "));
207
+ }
208
+ return d;
209
+ }
210
+ export function validateMemorixCompletionMappingV2(raw, objectTypes) {
211
+ const d = assertObject(raw, "completion mapping");
212
+ if (d.schemaVersion !== COMPLETION_MAPPING_SCHEMA_V2) {
213
+ throw new DescriptorValidationError("INVALID_SCHEMA_VERSION", `Completion mapping requires schemaVersion "${COMPLETION_MAPPING_SCHEMA_V2}"`);
214
+ }
215
+ if ("entityType" in d) {
216
+ throw new DescriptorValidationError("FORBIDDEN_LEGACY_FIELD", "Completion mapping must use objectType, not entityType");
217
+ }
218
+ if (!d.id || !d.objectType || !d.target || !d.targetCollection) {
219
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Completion mapping requires id, objectType, target, targetCollection");
220
+ }
221
+ if (d.writeRoot !== "data") {
222
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", 'Completion mapping writeRoot must be "data"');
223
+ }
224
+ const objectTypeDescriptor = objectTypes[String(d.objectType)];
225
+ if (!objectTypeDescriptor) {
226
+ throw new DescriptorValidationError("UNKNOWN_OBJECT_TYPE", `Completion mapping references unknown object type "${String(d.objectType)}"`);
227
+ }
228
+ if (d.target !== objectTypeDescriptor.target) {
229
+ throw new DescriptorValidationError("TARGET_MISMATCH", "Completion mapping target must match object type target");
230
+ }
231
+ const collections = Object.values(objectTypeDescriptor.contentTypes).map((ct) => ct.collection);
232
+ if (!collections.includes(String(d.targetCollection))) {
233
+ throw new DescriptorValidationError("UNKNOWN_TARGET_COLLECTION", `Completion mapping targetCollection "${String(d.targetCollection)}" is not declared on object type "${String(d.objectType)}"`);
234
+ }
235
+ const contamination = findContaminationInDescriptorData(d);
236
+ if (contamination.length > 0) {
237
+ throw new DescriptorValidationError("RUNTIME_CONTAMINATION", contamination.map((hit) => `${hit.path}: ${hit.reason}`).join("; "));
238
+ }
239
+ return d;
240
+ }
241
+ export function validateMemorixInventoryPolicyV1(raw) {
242
+ const d = assertObject(raw, "inventory policy");
243
+ if (d.schemaVersion !== INVENTORY_POLICY_SCHEMA_V1) {
244
+ throw new DescriptorValidationError("INVALID_SCHEMA_VERSION", `Inventory policy requires schemaVersion "${INVENTORY_POLICY_SCHEMA_V1}"`);
245
+ }
246
+ if (d.id !== "default") {
247
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", 'Inventory policy id must be "default"');
248
+ }
249
+ const ignoredCollections = d.ignoredCollections;
250
+ if (!Array.isArray(ignoredCollections)) {
251
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Inventory policy requires ignoredCollections array");
252
+ }
253
+ const seen = new Set();
254
+ for (const entry of ignoredCollections) {
255
+ if (!VALID_TARGETS.includes(entry.target)) {
256
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", 'Ignored collection target must be "entity", "event", or "knowledge"');
257
+ }
258
+ if (!entry.collectionName || !String(entry.collectionName).trim()) {
259
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Ignored collection requires collectionName");
260
+ }
261
+ const key = `${String(entry.target)}::${String(entry.databaseName ?? "")}::${String(entry.collectionName)}`;
262
+ if (seen.has(key)) {
263
+ throw new DescriptorValidationError("DUPLICATE_IGNORED_COLLECTION", `Duplicate ignored collection "${String(entry.collectionName)}"`);
264
+ }
265
+ seen.add(key);
266
+ }
267
+ const contamination = findContaminationInDescriptorData(d);
268
+ if (contamination.length > 0) {
269
+ throw new DescriptorValidationError("RUNTIME_CONTAMINATION", contamination.map((hit) => `${hit.path}: ${hit.reason}`).join("; "));
270
+ }
271
+ return d;
272
+ }
273
+ //# sourceMappingURL=canonical-v2-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical-v2-validation.js","sourceRoot":"","sources":["../../src/validation/canonical-v2-validation.ts"],"names":[],"mappings":"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"}