@x12i/memorix-descriptors 1.3.0 → 1.4.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 (43) hide show
  1. package/dist/admin/control-plane.d.ts +14 -0
  2. package/dist/admin/control-plane.d.ts.map +1 -0
  3. package/dist/admin/control-plane.js +22 -0
  4. package/dist/admin/control-plane.js.map +1 -0
  5. package/dist/admin/create-admin.d.ts +3 -2
  6. package/dist/admin/create-admin.d.ts.map +1 -1
  7. package/dist/admin/create-admin.js +2 -1
  8. package/dist/admin/create-admin.js.map +1 -1
  9. package/dist/admin/execute-mutation.d.ts +9 -0
  10. package/dist/admin/execute-mutation.d.ts.map +1 -0
  11. package/dist/admin/execute-mutation.js +85 -0
  12. package/dist/admin/execute-mutation.js.map +1 -0
  13. package/dist/index.d.ts +3 -1
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +3 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/reconcile/apply.d.ts +4 -0
  18. package/dist/reconcile/apply.d.ts.map +1 -0
  19. package/dist/reconcile/apply.js +123 -0
  20. package/dist/reconcile/apply.js.map +1 -0
  21. package/dist/reconcile/index.d.ts +10 -24
  22. package/dist/reconcile/index.d.ts.map +1 -1
  23. package/dist/reconcile/index.js +54 -63
  24. package/dist/reconcile/index.js.map +1 -1
  25. package/dist/reconcile/suggestions.d.ts +4 -0
  26. package/dist/reconcile/suggestions.d.ts.map +1 -0
  27. package/dist/reconcile/suggestions.js +90 -0
  28. package/dist/reconcile/suggestions.js.map +1 -0
  29. package/dist/reconcile/types.d.ts +45 -0
  30. package/dist/reconcile/types.d.ts.map +1 -0
  31. package/dist/reconcile/types.js +2 -0
  32. package/dist/reconcile/types.js.map +1 -0
  33. package/dist/tests/execute-mutation.test.d.ts +2 -0
  34. package/dist/tests/execute-mutation.test.d.ts.map +1 -0
  35. package/dist/tests/execute-mutation.test.js +57 -0
  36. package/dist/tests/execute-mutation.test.js.map +1 -0
  37. package/dist/tests/live/catalox.live.test.js +3 -2
  38. package/dist/tests/live/catalox.live.test.js.map +1 -1
  39. package/dist/tests/reconcile-unified.test.d.ts +2 -0
  40. package/dist/tests/reconcile-unified.test.d.ts.map +1 -0
  41. package/dist/tests/reconcile-unified.test.js +214 -0
  42. package/dist/tests/reconcile-unified.test.js.map +1 -0
  43. package/package.json +1 -1
@@ -0,0 +1,214 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { buildReconcileDraftForSuggestion, buildReconcileSuggestionsFromUnifiedInventory, } from "../reconcile/index.js";
3
+ import { applyReconcileDraft } from "../reconcile/apply.js";
4
+ import { sampleSnapshot } from "./fixtures.js";
5
+ function emptyTargetInventory() {
6
+ return {
7
+ databaseName: "entities",
8
+ declaredCollections: 0,
9
+ mappedCollections: 0,
10
+ missingCollections: 0,
11
+ orphanCollections: 0,
12
+ emptyDeclaredCollections: 0,
13
+ mongoCollections: 0,
14
+ };
15
+ }
16
+ function unifiedInventory(issues, rows = []) {
17
+ return {
18
+ sourceLens: "catalox-first",
19
+ summary: {
20
+ cataloxObjects: 1,
21
+ mongoCollections: 1,
22
+ declaredCollections: 1,
23
+ mappedCollections: 0,
24
+ missingCollections: 0,
25
+ orphanCollections: 0,
26
+ emptyDeclaredCollections: 0,
27
+ issueCount: issues.length,
28
+ },
29
+ targets: {
30
+ entity: emptyTargetInventory(),
31
+ event: { ...emptyTargetInventory(), databaseName: "events" },
32
+ knowledge: { ...emptyTargetInventory(), databaseName: "knowledge" },
33
+ },
34
+ rows,
35
+ issues,
36
+ generatedAt: "2026-05-23T00:00:00.000Z",
37
+ };
38
+ }
39
+ describe("buildReconcileSuggestionsFromUnifiedInventory", () => {
40
+ it("maps unified inventory issues to reconcile suggestion kinds", () => {
41
+ const inventory = unifiedInventory([
42
+ {
43
+ issueId: "issue-1",
44
+ severity: "error",
45
+ kind: "missing-collection",
46
+ objectName: "assets",
47
+ contentType: "snapshots",
48
+ message: "missing",
49
+ suggestedActions: ["inspect", "fix-binding"],
50
+ },
51
+ {
52
+ issueId: "issue-2",
53
+ severity: "info",
54
+ kind: "empty-declared-collection",
55
+ objectName: "assets",
56
+ contentType: "snapshots",
57
+ message: "empty",
58
+ suggestedActions: ["inspect"],
59
+ },
60
+ {
61
+ issueId: "issue-3",
62
+ severity: "warning",
63
+ kind: "orphan-collection",
64
+ target: "entity",
65
+ collectionName: "legacy-assets",
66
+ message: "orphan",
67
+ suggestedActions: ["create-descriptor"],
68
+ },
69
+ {
70
+ issueId: "issue-4",
71
+ severity: "warning",
72
+ kind: "content-type-missing",
73
+ target: "entity",
74
+ objectName: "assets",
75
+ contentType: "enrichment",
76
+ collectionName: "assets-enrichment",
77
+ message: "missing ct",
78
+ suggestedActions: ["add-content-type"],
79
+ },
80
+ {
81
+ issueId: "issue-5",
82
+ severity: "warning",
83
+ kind: "collection-mismatch",
84
+ target: "entity",
85
+ objectName: "assets",
86
+ contentType: "snapshots",
87
+ collectionName: "assets-live",
88
+ message: "mismatch",
89
+ suggestedActions: ["fix-binding"],
90
+ },
91
+ {
92
+ issueId: "issue-6",
93
+ severity: "warning",
94
+ kind: "unparseable-collection",
95
+ target: "entity",
96
+ collectionName: "legacydata",
97
+ message: "unparseable",
98
+ suggestedActions: ["inspect", "ignore"],
99
+ },
100
+ ], [
101
+ {
102
+ rowId: "row-1",
103
+ target: "entity",
104
+ databaseName: "entities",
105
+ objectName: "assets",
106
+ contentType: "snapshots",
107
+ collectionName: "assets-live",
108
+ expectedCollectionName: "assets-snapshots",
109
+ source: "merged",
110
+ mappingStatus: "collection-mismatch",
111
+ counts: { countMode: "none" },
112
+ actions: ["fix-binding"],
113
+ issueIds: ["issue-5"],
114
+ },
115
+ ]);
116
+ const suggestions = buildReconcileSuggestionsFromUnifiedInventory(inventory);
117
+ expect(suggestions).toEqual([
118
+ {
119
+ kind: "ensure-collection",
120
+ entityName: "assets",
121
+ contentType: "snapshots",
122
+ },
123
+ {
124
+ kind: "empty-declared-collection",
125
+ entityName: "assets",
126
+ contentType: "snapshots",
127
+ },
128
+ {
129
+ kind: "create-descriptor-for-orphan",
130
+ collection: "legacy-assets",
131
+ target: "entity",
132
+ },
133
+ {
134
+ kind: "add-content-type-for-orphan",
135
+ target: "entity",
136
+ collection: "assets-enrichment",
137
+ parsedObject: "assets",
138
+ parsedContentType: "enrichment",
139
+ },
140
+ {
141
+ kind: "fix-collection-binding",
142
+ entityName: "assets",
143
+ contentType: "snapshots",
144
+ expectedCollection: "assets-snapshots",
145
+ actualCollection: "assets-live",
146
+ },
147
+ {
148
+ kind: "unparseable-collection",
149
+ target: "entity",
150
+ collectionName: "legacydata",
151
+ },
152
+ {
153
+ kind: "ignore-collection",
154
+ target: "entity",
155
+ collectionName: "legacydata",
156
+ },
157
+ ]);
158
+ });
159
+ });
160
+ describe("buildReconcileDraftForSuggestion", () => {
161
+ it("builds apply-ready drafts for draft-backed suggestions", () => {
162
+ const snapshot = sampleSnapshot();
163
+ const addDraft = buildReconcileDraftForSuggestion({
164
+ kind: "add-content-type-for-orphan",
165
+ target: "entity",
166
+ collection: "assets-enrichment",
167
+ parsedObject: "assets",
168
+ parsedContentType: "enrichment",
169
+ }, snapshot);
170
+ expect(addDraft?.suggestedAction).toBe("addContentType");
171
+ const fixDraft = buildReconcileDraftForSuggestion({
172
+ kind: "fix-collection-binding",
173
+ entityName: "assets",
174
+ contentType: "snapshots",
175
+ expectedCollection: "assets-snapshots",
176
+ actualCollection: "assets-live",
177
+ }, snapshot);
178
+ expect(fixDraft?.suggestedAction).toBe("updateContentType");
179
+ });
180
+ });
181
+ describe("applyReconcileDraft", () => {
182
+ it("applies add-content-type drafts in dry-run", async () => {
183
+ const snapshot = sampleSnapshot();
184
+ const draft = buildReconcileDraftForSuggestion({
185
+ kind: "add-content-type-for-orphan",
186
+ target: "entity",
187
+ collection: "assets-enrichment",
188
+ parsedObject: "assets",
189
+ parsedContentType: "enrichment",
190
+ }, snapshot);
191
+ expect(draft).toBeTruthy();
192
+ const result = await applyReconcileDraft({
193
+ catalox: {},
194
+ env: process.env,
195
+ loadSnapshot: async () => snapshot,
196
+ }, draft, { dryRun: true });
197
+ expect(result.ok).toBe(true);
198
+ expect(result.cataloxWrites).toHaveLength(1);
199
+ });
200
+ it("rejects manualReview drafts", async () => {
201
+ const result = await applyReconcileDraft({
202
+ catalox: {},
203
+ env: process.env,
204
+ loadSnapshot: async () => sampleSnapshot(),
205
+ }, {
206
+ suggestedAction: "manualReview",
207
+ draft: { collectionName: "bad" },
208
+ warnings: ["needs review"],
209
+ }, { dryRun: true });
210
+ expect(result.ok).toBe(false);
211
+ expect(result.errors[0]?.code).toBe("MANUAL_REVIEW_REQUIRED");
212
+ });
213
+ });
214
+ //# sourceMappingURL=reconcile-unified.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile-unified.test.js","sourceRoot":"","sources":["../../src/tests/reconcile-unified.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@x12i/memorix-descriptors",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "Manage Memorix entity, list, and item descriptors in Catalox",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",