@x12i/memorix-descriptors 1.5.0 → 1.7.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 (162) hide show
  1. package/README.md +1 -1
  2. package/dist/admin/create-admin.d.ts +10 -1
  3. package/dist/admin/create-admin.d.ts.map +1 -1
  4. package/dist/admin/create-admin.js +21 -0
  5. package/dist/admin/create-admin.js.map +1 -1
  6. package/dist/admin/execute-mutation.d.ts.map +1 -1
  7. package/dist/admin/execute-mutation.js +6 -0
  8. package/dist/admin/execute-mutation.js.map +1 -1
  9. package/dist/catalog/ensure-catalogs.d.ts.map +1 -1
  10. package/dist/catalog/ensure-catalogs.js +6 -2
  11. package/dist/catalog/ensure-catalogs.js.map +1 -1
  12. package/dist/catalog/ids.d.ts +18 -4
  13. package/dist/catalog/ids.d.ts.map +1 -1
  14. package/dist/catalog/ids.js +31 -4
  15. package/dist/catalog/ids.js.map +1 -1
  16. package/dist/catalox/client.d.ts +2 -1
  17. package/dist/catalox/client.d.ts.map +1 -1
  18. package/dist/catalox/client.js +3 -2
  19. package/dist/catalox/client.js.map +1 -1
  20. package/dist/cli/index.js +35 -1
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/index.d.ts +7 -2
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +5 -1
  25. package/dist/index.js.map +1 -1
  26. package/dist/migration/apply.d.ts.map +1 -1
  27. package/dist/migration/apply.js +1 -1
  28. package/dist/migration/apply.js.map +1 -1
  29. package/dist/migration/classify.d.ts.map +1 -1
  30. package/dist/migration/classify.js +4 -2
  31. package/dist/migration/classify.js.map +1 -1
  32. package/dist/migration/load-snapshot.js +3 -3
  33. package/dist/migration/load-snapshot.js.map +1 -1
  34. package/dist/migration/object-type-specs.d.ts.map +1 -1
  35. package/dist/migration/object-type-specs.js +5 -0
  36. package/dist/migration/object-type-specs.js.map +1 -1
  37. package/dist/migration/plan.js +2 -2
  38. package/dist/migration/plan.js.map +1 -1
  39. package/dist/migration/verify.d.ts +2 -0
  40. package/dist/migration/verify.d.ts.map +1 -1
  41. package/dist/migration/verify.js +11 -1
  42. package/dist/migration/verify.js.map +1 -1
  43. package/dist/mutations/common.d.ts.map +1 -1
  44. package/dist/mutations/common.js +7 -0
  45. package/dist/mutations/common.js.map +1 -1
  46. package/dist/mutations/content-type.d.ts.map +1 -1
  47. package/dist/mutations/content-type.js +14 -10
  48. package/dist/mutations/content-type.js.map +1 -1
  49. package/dist/mutations/entity.d.ts +2 -0
  50. package/dist/mutations/entity.d.ts.map +1 -1
  51. package/dist/mutations/entity.js +53 -23
  52. package/dist/mutations/entity.js.map +1 -1
  53. package/dist/mutations/execute.d.ts.map +1 -1
  54. package/dist/mutations/execute.js +12 -3
  55. package/dist/mutations/execute.js.map +1 -1
  56. package/dist/mutations/item.js.map +1 -1
  57. package/dist/mutations/list.js.map +1 -1
  58. package/dist/mutations/property.d.ts.map +1 -1
  59. package/dist/mutations/property.js +11 -7
  60. package/dist/mutations/property.js.map +1 -1
  61. package/dist/mutations/relation.d.ts.map +1 -1
  62. package/dist/mutations/relation.js +13 -9
  63. package/dist/mutations/relation.js.map +1 -1
  64. package/dist/mutations/rename-entity.d.ts.map +1 -1
  65. package/dist/mutations/rename-entity.js +11 -8
  66. package/dist/mutations/rename-entity.js.map +1 -1
  67. package/dist/mutations/write-descriptor.d.ts +12 -0
  68. package/dist/mutations/write-descriptor.d.ts.map +1 -0
  69. package/dist/mutations/write-descriptor.js +120 -0
  70. package/dist/mutations/write-descriptor.js.map +1 -0
  71. package/dist/reconcile/index.d.ts +1 -1
  72. package/dist/reconcile/index.d.ts.map +1 -1
  73. package/dist/reconcile/index.js.map +1 -1
  74. package/dist/reconcile/inventory-types.d.ts +28 -12
  75. package/dist/reconcile/inventory-types.d.ts.map +1 -1
  76. package/dist/reconcile/inventory-types.js.map +1 -1
  77. package/dist/reconcile/types.d.ts +1 -1
  78. package/dist/reconcile/types.d.ts.map +1 -1
  79. package/dist/reconcile/unified-inventory.d.ts.map +1 -1
  80. package/dist/reconcile/unified-inventory.js +106 -21
  81. package/dist/reconcile/unified-inventory.js.map +1 -1
  82. package/dist/seeds/build-manifest.d.ts.map +1 -1
  83. package/dist/seeds/build-manifest.js +4 -15
  84. package/dist/seeds/build-manifest.js.map +1 -1
  85. package/dist/seeds/default-seed-spec.d.ts +4 -2
  86. package/dist/seeds/default-seed-spec.d.ts.map +1 -1
  87. package/dist/seeds/default-seed-spec.js +60 -31
  88. package/dist/seeds/default-seed-spec.js.map +1 -1
  89. package/dist/seeds/index.d.ts.map +1 -1
  90. package/dist/seeds/index.js +12 -4
  91. package/dist/seeds/index.js.map +1 -1
  92. package/dist/source/graph.d.ts.map +1 -1
  93. package/dist/source/graph.js +4 -3
  94. package/dist/source/graph.js.map +1 -1
  95. package/dist/source/inspectable.js +2 -2
  96. package/dist/source/inspectable.js.map +1 -1
  97. package/dist/source/registry.js +2 -2
  98. package/dist/source/registry.js.map +1 -1
  99. package/dist/source/snapshot.js +2 -2
  100. package/dist/source/snapshot.js.map +1 -1
  101. package/dist/source/validation.d.ts.map +1 -1
  102. package/dist/source/validation.js +6 -5
  103. package/dist/source/validation.js.map +1 -1
  104. package/dist/store/descriptor-lookup.d.ts +9 -0
  105. package/dist/store/descriptor-lookup.d.ts.map +1 -0
  106. package/dist/store/descriptor-lookup.js +21 -0
  107. package/dist/store/descriptor-lookup.js.map +1 -0
  108. package/dist/store/descriptor-normalize.d.ts +14 -0
  109. package/dist/store/descriptor-normalize.d.ts.map +1 -0
  110. package/dist/store/descriptor-normalize.js +141 -0
  111. package/dist/store/descriptor-normalize.js.map +1 -0
  112. package/dist/store/snapshot.d.ts.map +1 -1
  113. package/dist/store/snapshot.js +16 -6
  114. package/dist/store/snapshot.js.map +1 -1
  115. package/dist/tests/canonical-metadata.test.js +12 -13
  116. package/dist/tests/canonical-metadata.test.js.map +1 -1
  117. package/dist/tests/descriptor-lookup.test.d.ts +2 -0
  118. package/dist/tests/descriptor-lookup.test.d.ts.map +1 -0
  119. package/dist/tests/descriptor-lookup.test.js +44 -0
  120. package/dist/tests/descriptor-lookup.test.js.map +1 -0
  121. package/dist/tests/fixtures.d.ts +32 -0
  122. package/dist/tests/fixtures.d.ts.map +1 -1
  123. package/dist/tests/fixtures.js +29 -0
  124. package/dist/tests/fixtures.js.map +1 -1
  125. package/dist/tests/live/catalox.live.test.js +2 -2
  126. package/dist/tests/live/catalox.live.test.js.map +1 -1
  127. package/dist/tests/reconcile-unified.test.js +9 -0
  128. package/dist/tests/reconcile-unified.test.js.map +1 -1
  129. package/dist/tests/seeds.test.js +4 -3
  130. package/dist/tests/seeds.test.js.map +1 -1
  131. package/dist/tests/source-aware.test.js +2 -2
  132. package/dist/tests/source-aware.test.js.map +1 -1
  133. package/dist/tests/unified-inventory.test.js +9 -3
  134. package/dist/tests/unified-inventory.test.js.map +1 -1
  135. package/dist/tests/v2-fixtures.d.ts +4 -0
  136. package/dist/tests/v2-fixtures.d.ts.map +1 -0
  137. package/dist/tests/v2-fixtures.js +82 -0
  138. package/dist/tests/v2-fixtures.js.map +1 -0
  139. package/dist/tests/write-descriptor.test.d.ts +2 -0
  140. package/dist/tests/write-descriptor.test.d.ts.map +1 -0
  141. package/dist/tests/write-descriptor.test.js +75 -0
  142. package/dist/tests/write-descriptor.test.js.map +1 -0
  143. package/dist/types/graph-runs.d.ts +65 -0
  144. package/dist/types/graph-runs.d.ts.map +1 -0
  145. package/dist/types/graph-runs.js +3 -0
  146. package/dist/types/graph-runs.js.map +1 -0
  147. package/dist/types/index.d.ts +3 -0
  148. package/dist/types/index.d.ts.map +1 -1
  149. package/dist/types/write-descriptor.d.ts +108 -0
  150. package/dist/types/write-descriptor.d.ts.map +1 -0
  151. package/dist/types/write-descriptor.js +2 -0
  152. package/dist/types/write-descriptor.js.map +1 -0
  153. package/dist/validation/canonical-metadata-validation.d.ts +2 -4
  154. package/dist/validation/canonical-metadata-validation.d.ts.map +1 -1
  155. package/dist/validation/canonical-metadata-validation.js +3 -8
  156. package/dist/validation/canonical-metadata-validation.js.map +1 -1
  157. package/dist/validation/write-descriptor-validation.d.ts +11 -0
  158. package/dist/validation/write-descriptor-validation.d.ts.map +1 -0
  159. package/dist/validation/write-descriptor-validation.js +120 -0
  160. package/dist/validation/write-descriptor-validation.js.map +1 -0
  161. package/docs/METADATA-RELEASE-CHECKLIST.md +44 -0
  162. package/package.json +1 -1
@@ -0,0 +1,120 @@
1
+ import { resolveMemorixCollectionName, } from "../collections/collection-name.js";
2
+ import { DescriptorValidationError } from "./errors.js";
3
+ import { validateMemorixEntityDescriptor } from "./descriptor-validation.js";
4
+ const CONTENT_OBJECT_TYPE = "memorix-content-object";
5
+ export function validateMemorixWriteDescriptorShape(raw) {
6
+ const descriptor = raw;
7
+ if (!descriptor.id?.trim()) {
8
+ throw new DescriptorValidationError("INVALID_WRITE_DESCRIPTOR", "write descriptor id is required");
9
+ }
10
+ if (!descriptor.entity?.trim()) {
11
+ throw new DescriptorValidationError("INVALID_WRITE_DESCRIPTOR", "write descriptor entity is required");
12
+ }
13
+ if (!descriptor.target?.contentType?.trim()) {
14
+ throw new DescriptorValidationError("INVALID_WRITE_DESCRIPTOR", "write descriptor target.contentType is required");
15
+ }
16
+ if (!descriptor.operations?.allowed?.length) {
17
+ throw new DescriptorValidationError("INVALID_WRITE_DESCRIPTOR", "write descriptor operations.allowed must be non-empty");
18
+ }
19
+ if (!descriptor.operations.allowed.includes(descriptor.operations.default)) {
20
+ throw new DescriptorValidationError("INVALID_WRITE_DESCRIPTOR", "write descriptor operations.default must be in operations.allowed");
21
+ }
22
+ if (!descriptor.fields || Object.keys(descriptor.fields).length === 0) {
23
+ throw new DescriptorValidationError("INVALID_WRITE_DESCRIPTOR", "write descriptor must declare at least one field");
24
+ }
25
+ for (const [fieldKey, field] of Object.entries(descriptor.fields)) {
26
+ if (!field.target?.path?.trim()) {
27
+ throw new DescriptorValidationError("INVALID_WRITE_DESCRIPTOR", `write descriptor field "${fieldKey}" requires target.path`);
28
+ }
29
+ if (field.content?.enabled && field.content.objectType !== CONTENT_OBJECT_TYPE) {
30
+ throw new DescriptorValidationError("INVALID_WRITE_DESCRIPTOR", `write descriptor field "${fieldKey}" content.objectType must be "${CONTENT_OBJECT_TYPE}"`);
31
+ }
32
+ }
33
+ return { ...descriptor, id: descriptor.id.trim(), entity: descriptor.entity.trim() };
34
+ }
35
+ function entityCollections(entity, env) {
36
+ return Object.keys(entity.contentTypes).map((key) => resolveMemorixCollectionName(entity, key, env));
37
+ }
38
+ export function validateWriteDescriptorAgainstSnapshot(snapshot, descriptor, env = process.env) {
39
+ const errors = [];
40
+ const entityRaw = snapshot.entityDescriptors[descriptor.entity];
41
+ if (!entityRaw) {
42
+ errors.push({
43
+ code: "UNKNOWN_OBJECT_TYPE",
44
+ message: `Write descriptor entity "${descriptor.entity}" not found in object type catalog`,
45
+ path: "entity",
46
+ });
47
+ return errors;
48
+ }
49
+ let entity;
50
+ try {
51
+ entity = validateMemorixEntityDescriptor(entityRaw);
52
+ }
53
+ catch (err) {
54
+ errors.push({
55
+ code: "INVALID_OBJECT_TYPE",
56
+ message: err instanceof Error ? err.message : String(err),
57
+ path: "entity",
58
+ });
59
+ return errors;
60
+ }
61
+ const entitySource = {
62
+ entityName: entity.entityName,
63
+ collectionPrefix: entity.collectionPrefix,
64
+ target: entity.target,
65
+ contentTypes: Object.fromEntries(Object.entries(entity.contentTypes).map(([key, ct]) => [
66
+ key,
67
+ { postfix: ct.postfix, collection: ct.collection },
68
+ ])),
69
+ };
70
+ if (!entity.contentTypes[descriptor.target.contentType]) {
71
+ errors.push({
72
+ code: "UNKNOWN_CONTENT_TYPE",
73
+ message: `Write descriptor target.contentType "${descriptor.target.contentType}" is not declared on object type "${descriptor.entity}"`,
74
+ path: "target.contentType",
75
+ });
76
+ }
77
+ const collections = entityCollections(entitySource, env);
78
+ const resolvedCollection = entity.contentTypes[descriptor.target.contentType]
79
+ ? resolveMemorixCollectionName(entitySource, descriptor.target.contentType, env)
80
+ : undefined;
81
+ if (descriptor.target.targetCollection) {
82
+ if (!collections.includes(descriptor.target.targetCollection)) {
83
+ errors.push({
84
+ code: "UNKNOWN_TARGET_COLLECTION",
85
+ message: `targetCollection "${descriptor.target.targetCollection}" is not declared on object type "${descriptor.entity}"`,
86
+ path: "target.targetCollection",
87
+ });
88
+ }
89
+ }
90
+ if (descriptor.target.targetCollectionCandidates?.length) {
91
+ for (const candidate of descriptor.target.targetCollectionCandidates) {
92
+ if (!collections.includes(candidate)) {
93
+ errors.push({
94
+ code: "UNKNOWN_TARGET_COLLECTION",
95
+ message: `targetCollectionCandidates entry "${candidate}" is not declared on object type "${descriptor.entity}"`,
96
+ path: "target.targetCollectionCandidates",
97
+ });
98
+ }
99
+ }
100
+ }
101
+ if (resolvedCollection &&
102
+ descriptor.target.targetCollection &&
103
+ descriptor.target.targetCollection !== resolvedCollection) {
104
+ errors.push({
105
+ code: "TARGET_COLLECTION_MISMATCH",
106
+ message: `targetCollection "${descriptor.target.targetCollection}" does not match resolved collection "${resolvedCollection}" for content type "${descriptor.target.contentType}"`,
107
+ path: "target.targetCollection",
108
+ });
109
+ }
110
+ return errors;
111
+ }
112
+ export function validateMemorixWriteDescriptor(raw, snapshot, env = process.env) {
113
+ const descriptor = validateMemorixWriteDescriptorShape(raw);
114
+ const snapshotErrors = validateWriteDescriptorAgainstSnapshot(snapshot, descriptor, env);
115
+ if (snapshotErrors.length > 0) {
116
+ throw new DescriptorValidationError(snapshotErrors[0].code, snapshotErrors.map((e) => e.message).join("; "));
117
+ }
118
+ return descriptor;
119
+ }
120
+ //# sourceMappingURL=write-descriptor-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-descriptor-validation.js","sourceRoot":"","sources":["../../src/validation/write-descriptor-validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ # Memorix metadata release checklist (v2 canonical)
2
+
3
+ After deploying `@x12i/memorix-descriptors` with v2-only runtime loading:
4
+
5
+ 1. **Inspect baseline**
6
+ ```bash
7
+ npx tsx scripts/memorix-metadata/inspect.ts
8
+ ```
9
+
10
+ 2. **Plan canonical reset** (from `CANONICAL_OBJECT_TYPE_SPECS`)
11
+ ```bash
12
+ npx tsx scripts/memorix-metadata/plan.ts
13
+ npx tsx scripts/memorix-metadata/validate-plan.ts
14
+ ```
15
+
16
+ 3. **Apply** to Catalox (`memorix-object-type-descriptors`, lists, items)
17
+ ```bash
18
+ npx tsx scripts/memorix-metadata/apply.ts
19
+ ```
20
+
21
+ 4. **Verify** — canonical `memorix-object-type-descriptors` must be populated; legacy catalogs must be absent
22
+
23
+ See also: [../../docs/MIGRATION-V2-CATALOG.md](../../docs/MIGRATION-V2-CATALOG.md)
24
+
25
+ Legacy catalog `memorix-entity-descriptors` is **not read** at runtime and must be deleted during migration.
26
+ ```bash
27
+ npx tsx scripts/memorix-metadata/verify.ts
28
+ ```
29
+
30
+ 5. **Seed** (optional programmatic apply)
31
+ ```bash
32
+ # Uses createCanonicalSeedReadJson() from default-seed-spec
33
+ npm run catalox:seed:memorix-retrieval:apply
34
+ ```
35
+
36
+ 6. **Validate**
37
+ ```bash
38
+ npm test
39
+ npm run test:live # with MONGO_URI + FIRESTORE_LIVE_TESTS=1
40
+ ```
41
+
42
+ 7. **Explorer** — reload unified inventory; Catalox-first rows should match declared object types.
43
+
44
+ Legacy catalog `memorix-entity-descriptors` is **not read** at runtime. Canonical validation fails if legacy catalog items remain.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@x12i/memorix-descriptors",
3
- "version": "1.5.0",
3
+ "version": "1.7.0",
4
4
  "description": "Manage Memorix entity, list, and item descriptors in Catalox",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",