@x12i/memorix-service 3.12.4 → 3.13.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 (151) hide show
  1. package/README.md +1 -1
  2. package/dist/anomaly/catalog.d.ts +4 -0
  3. package/dist/anomaly/catalog.d.ts.map +1 -0
  4. package/dist/anomaly/catalog.js +315 -0
  5. package/dist/anomaly/catalog.js.map +1 -0
  6. package/dist/anomaly/descriptors.d.ts +11 -0
  7. package/dist/anomaly/descriptors.d.ts.map +1 -0
  8. package/dist/anomaly/descriptors.js +113 -0
  9. package/dist/anomaly/descriptors.js.map +1 -0
  10. package/dist/anomaly/index.d.ts +6 -0
  11. package/dist/anomaly/index.d.ts.map +1 -0
  12. package/dist/anomaly/index.js +5 -0
  13. package/dist/anomaly/index.js.map +1 -0
  14. package/dist/anomaly/records.d.ts +28 -0
  15. package/dist/anomaly/records.d.ts.map +1 -0
  16. package/dist/anomaly/records.js +384 -0
  17. package/dist/anomaly/records.js.map +1 -0
  18. package/dist/anomaly/types.d.ts +116 -0
  19. package/dist/anomaly/types.d.ts.map +1 -0
  20. package/dist/anomaly/types.js +24 -0
  21. package/dist/anomaly/types.js.map +1 -0
  22. package/dist/anomaly/values.d.ts +31 -0
  23. package/dist/anomaly/values.d.ts.map +1 -0
  24. package/dist/anomaly/values.js +171 -0
  25. package/dist/anomaly/values.js.map +1 -0
  26. package/dist/app.d.ts.map +1 -1
  27. package/dist/app.js +12 -0
  28. package/dist/app.js.map +1 -1
  29. package/dist/catalog-bridge.d.ts +18 -0
  30. package/dist/catalog-bridge.d.ts.map +1 -1
  31. package/dist/catalog-bridge.js +85 -0
  32. package/dist/catalog-bridge.js.map +1 -1
  33. package/dist/errors.d.ts +5 -0
  34. package/dist/errors.d.ts.map +1 -1
  35. package/dist/errors.js +18 -0
  36. package/dist/errors.js.map +1 -1
  37. package/dist/knowledge-upstream.d.ts +32 -0
  38. package/dist/knowledge-upstream.d.ts.map +1 -1
  39. package/dist/knowledge-upstream.js +86 -2
  40. package/dist/knowledge-upstream.js.map +1 -1
  41. package/dist/mcp/nexum-tools.d.ts +1 -1
  42. package/dist/mcp/nexum-tools.d.ts.map +1 -1
  43. package/dist/mcp/nexum-tools.js +39 -22
  44. package/dist/mcp/nexum-tools.js.map +1 -1
  45. package/dist/nexum-analysis/enqueue.d.ts.map +1 -1
  46. package/dist/nexum-analysis/enqueue.js +2 -1
  47. package/dist/nexum-analysis/enqueue.js.map +1 -1
  48. package/dist/nexum-analysis/knowledge-read.d.ts +45 -0
  49. package/dist/nexum-analysis/knowledge-read.d.ts.map +1 -0
  50. package/dist/nexum-analysis/knowledge-read.js +26 -0
  51. package/dist/nexum-analysis/knowledge-read.js.map +1 -0
  52. package/dist/openapi/openapi.json +18354 -17718
  53. package/dist/patches/access.d.ts +15 -0
  54. package/dist/patches/access.d.ts.map +1 -0
  55. package/dist/patches/access.js +27 -0
  56. package/dist/patches/access.js.map +1 -0
  57. package/dist/patches/engine.d.ts +67 -0
  58. package/dist/patches/engine.d.ts.map +1 -0
  59. package/dist/patches/engine.js +966 -0
  60. package/dist/patches/engine.js.map +1 -0
  61. package/dist/patches/guards.d.ts +23 -0
  62. package/dist/patches/guards.d.ts.map +1 -0
  63. package/dist/patches/guards.js +77 -0
  64. package/dist/patches/guards.js.map +1 -0
  65. package/dist/patches/legacy-rows.d.ts +56 -0
  66. package/dist/patches/legacy-rows.d.ts.map +1 -0
  67. package/dist/patches/legacy-rows.js +162 -0
  68. package/dist/patches/legacy-rows.js.map +1 -0
  69. package/dist/patches/ops.d.ts +24 -0
  70. package/dist/patches/ops.d.ts.map +1 -0
  71. package/dist/patches/ops.js +204 -0
  72. package/dist/patches/ops.js.map +1 -0
  73. package/dist/patches/parse.d.ts +5 -0
  74. package/dist/patches/parse.d.ts.map +1 -0
  75. package/dist/patches/parse.js +323 -0
  76. package/dist/patches/parse.js.map +1 -0
  77. package/dist/patches/paths.d.ts +38 -0
  78. package/dist/patches/paths.d.ts.map +1 -0
  79. package/dist/patches/paths.js +204 -0
  80. package/dist/patches/paths.js.map +1 -0
  81. package/dist/patches/service.d.ts +16 -0
  82. package/dist/patches/service.d.ts.map +1 -0
  83. package/dist/patches/service.js +128 -0
  84. package/dist/patches/service.js.map +1 -0
  85. package/dist/patches/store.d.ts +87 -0
  86. package/dist/patches/store.d.ts.map +1 -0
  87. package/dist/patches/store.js +27 -0
  88. package/dist/patches/store.js.map +1 -0
  89. package/dist/patches/types.d.ts +112 -0
  90. package/dist/patches/types.d.ts.map +1 -0
  91. package/dist/patches/types.js +5 -0
  92. package/dist/patches/types.js.map +1 -0
  93. package/dist/platform.d.ts +8 -0
  94. package/dist/platform.d.ts.map +1 -1
  95. package/dist/platform.js +98 -4
  96. package/dist/platform.js.map +1 -1
  97. package/dist/routes/anomaly.d.ts +5 -0
  98. package/dist/routes/anomaly.d.ts.map +1 -0
  99. package/dist/routes/anomaly.js +308 -0
  100. package/dist/routes/anomaly.js.map +1 -0
  101. package/dist/routes/data.d.ts.map +1 -1
  102. package/dist/routes/data.js +190 -202
  103. package/dist/routes/data.js.map +1 -1
  104. package/dist/routes/knowledge.d.ts.map +1 -1
  105. package/dist/routes/knowledge.js +6 -22
  106. package/dist/routes/knowledge.js.map +1 -1
  107. package/dist/routes/metadata.d.ts.map +1 -1
  108. package/dist/routes/metadata.js +28 -1
  109. package/dist/routes/metadata.js.map +1 -1
  110. package/dist/routes/patches.d.ts +7 -0
  111. package/dist/routes/patches.d.ts.map +1 -0
  112. package/dist/routes/patches.js +111 -0
  113. package/dist/routes/patches.js.map +1 -0
  114. package/dist/routes/subject-roots-backfill.d.ts +4 -0
  115. package/dist/routes/subject-roots-backfill.d.ts.map +1 -0
  116. package/dist/routes/subject-roots-backfill.js +15 -0
  117. package/dist/routes/subject-roots-backfill.js.map +1 -0
  118. package/dist/single-read-discriminator.d.ts +17 -0
  119. package/dist/single-read-discriminator.d.ts.map +1 -0
  120. package/dist/single-read-discriminator.js +67 -0
  121. package/dist/single-read-discriminator.js.map +1 -0
  122. package/dist/subject-roots-backfill.d.ts +24 -0
  123. package/dist/subject-roots-backfill.d.ts.map +1 -0
  124. package/dist/subject-roots-backfill.js +133 -0
  125. package/dist/subject-roots-backfill.js.map +1 -0
  126. package/dist/write-precondition.d.ts +5 -1
  127. package/dist/write-precondition.d.ts.map +1 -1
  128. package/dist/write-precondition.js +11 -3
  129. package/dist/write-precondition.js.map +1 -1
  130. package/dist/writes/content-write.d.ts +170 -0
  131. package/dist/writes/content-write.d.ts.map +1 -0
  132. package/dist/writes/content-write.js +569 -0
  133. package/dist/writes/content-write.js.map +1 -0
  134. package/dist/writes/effects.d.ts +13 -0
  135. package/dist/writes/effects.d.ts.map +1 -0
  136. package/dist/writes/effects.js +28 -0
  137. package/dist/writes/effects.js.map +1 -0
  138. package/dist/writes/error-shape.d.ts +11 -0
  139. package/dist/writes/error-shape.d.ts.map +1 -0
  140. package/dist/writes/error-shape.js +100 -0
  141. package/dist/writes/error-shape.js.map +1 -0
  142. package/dist/writes/receipt-store.d.ts +81 -0
  143. package/dist/writes/receipt-store.d.ts.map +1 -0
  144. package/dist/writes/receipt-store.js +171 -0
  145. package/dist/writes/receipt-store.js.map +1 -0
  146. package/dist/writes/worker.d.ts +9 -0
  147. package/dist/writes/worker.d.ts.map +1 -0
  148. package/dist/writes/worker.js +20 -0
  149. package/dist/writes/worker.js.map +1 -0
  150. package/openapi/openapi.json +18354 -17718
  151. package/package.json +4 -4
@@ -0,0 +1,204 @@
1
+ import { isDeepStrictEqual } from "node:util";
2
+ import { deleteKeyEverywhere, deletePlain, hasPlain, isPlainObject, isPresent, locate, matchesPattern, parsePath, PatchRowError, readPlain, setPlain, testValues, valueAt, writeAt, } from "./paths.js";
3
+ const BODY_ROOTS = ["data", "context", "_metadata"];
4
+ function isEmptyValue(value) {
5
+ if (value === null || value === undefined || value === "")
6
+ return true;
7
+ if (Array.isArray(value))
8
+ return value.length === 0;
9
+ if (isPlainObject(value))
10
+ return Object.keys(value).length === 0;
11
+ return false;
12
+ }
13
+ /** Remove empty objects, empty arrays, nulls, and empty strings below `value`. `value` itself stays. */
14
+ export function pruneBelow(value) {
15
+ if (Array.isArray(value)) {
16
+ for (let i = value.length - 1; i >= 0; i -= 1) {
17
+ pruneBelow(value[i]);
18
+ if (isEmptyValue(value[i]))
19
+ value.splice(i, 1);
20
+ }
21
+ return;
22
+ }
23
+ if (!isPlainObject(value))
24
+ return;
25
+ for (const key of Object.keys(value)) {
26
+ pruneBelow(value[key]);
27
+ if (isEmptyValue(value[key]))
28
+ delete value[key];
29
+ }
30
+ }
31
+ function mapOne(value, map) {
32
+ if (typeof value === "string" && Object.prototype.hasOwnProperty.call(map, value)) {
33
+ return { value: structuredClone(map[value]), changed: true };
34
+ }
35
+ return { value, changed: false };
36
+ }
37
+ export function applyOps(stored, ops, options) {
38
+ const record = structuredClone(stored);
39
+ if (!isPlainObject(record.data))
40
+ throw new PatchRowError("data is not an object");
41
+ const result = { record };
42
+ for (const op of ops) {
43
+ switch (op.op) {
44
+ case "set": {
45
+ if (op.onlyIfAbsent && hasPlain(record, op.path))
46
+ break;
47
+ setPlain(record, op.path, structuredClone(op.value));
48
+ break;
49
+ }
50
+ case "delete": {
51
+ if ("key" in op) {
52
+ deleteKeyEverywhere(record.data, op.key, op.when);
53
+ break;
54
+ }
55
+ for (const location of locate(record, parsePath(op.path))) {
56
+ if (!isPresent(location))
57
+ continue;
58
+ if (op.when && !testValues([valueAt(location)], op.when))
59
+ continue;
60
+ delete location.parent[String(location.key)];
61
+ }
62
+ break;
63
+ }
64
+ case "move":
65
+ case "copy": {
66
+ if (!hasPlain(record, op.from))
67
+ break;
68
+ const value = structuredClone(readPlain(record, op.from));
69
+ if (!op.overwrite && hasPlain(record, op.to)) {
70
+ if (op.op === "copy")
71
+ break;
72
+ if (isDeepStrictEqual(readPlain(record, op.to), value))
73
+ deletePlain(record, op.from);
74
+ else
75
+ result.conflict ??= `move ${op.from} to ${op.to}: ${op.to} already holds a different value`;
76
+ break;
77
+ }
78
+ setPlain(record, op.to, value);
79
+ if (op.op === "move")
80
+ deletePlain(record, op.from);
81
+ break;
82
+ }
83
+ case "rename": {
84
+ for (const location of locate(record, parsePath(op.path))) {
85
+ if (!isPresent(location))
86
+ continue;
87
+ const parent = location.parent;
88
+ if (Object.prototype.hasOwnProperty.call(parent, op.to)) {
89
+ result.conflict ??= `rename ${op.path} to ${op.to}: ${op.to} already exists`;
90
+ continue;
91
+ }
92
+ parent[op.to] = parent[String(location.key)];
93
+ delete parent[String(location.key)];
94
+ }
95
+ break;
96
+ }
97
+ case "mapValues": {
98
+ for (const location of locate(record, parsePath(op.path))) {
99
+ if (!isPresent(location))
100
+ continue;
101
+ const current = valueAt(location);
102
+ if (Array.isArray(current)) {
103
+ const next = current.map((item) => mapOne(item, op.map).value);
104
+ if (!isDeepStrictEqual(next, current))
105
+ writeAt(location, next);
106
+ continue;
107
+ }
108
+ const mapped = mapOne(current, op.map);
109
+ if (mapped.changed)
110
+ writeAt(location, mapped.value);
111
+ }
112
+ break;
113
+ }
114
+ case "dropValues": {
115
+ const segments = parsePath(op.path);
116
+ const last = segments.at(-1);
117
+ if (last.each)
118
+ segments[segments.length - 1] = { key: last.key, each: false };
119
+ for (const location of locate(record, segments)) {
120
+ if (!isPresent(location))
121
+ continue;
122
+ const current = valueAt(location);
123
+ if (!Array.isArray(current))
124
+ continue;
125
+ const kept = current.filter((item) => {
126
+ if (typeof item !== "string")
127
+ return true;
128
+ if (op.values)
129
+ return !op.values.includes(item);
130
+ return !matchesPattern(item, op.matches);
131
+ });
132
+ if (kept.length !== current.length)
133
+ writeAt(location, kept);
134
+ }
135
+ break;
136
+ }
137
+ case "prune": {
138
+ for (const location of locate(record, parsePath(op.path ?? "data"))) {
139
+ if (isPresent(location))
140
+ pruneBelow(valueAt(location));
141
+ }
142
+ break;
143
+ }
144
+ case "setDiscriminator": {
145
+ if (!options.discriminatorPath) {
146
+ throw new PatchRowError("this content type has no discriminator");
147
+ }
148
+ setPlain(record, options.discriminatorPath, op.value);
149
+ result.discriminator = { value: op.value, onExisting: op.onExisting ?? "skip" };
150
+ break;
151
+ }
152
+ case "deleteRecord": {
153
+ result.deleteRecord = op.mode ?? "tombstone";
154
+ break;
155
+ }
156
+ }
157
+ }
158
+ if (!isPlainObject(record.data))
159
+ throw new PatchRowError("data must stay an object");
160
+ for (const root of ["context", "_metadata"]) {
161
+ const value = record[root];
162
+ if (value === undefined)
163
+ continue;
164
+ if (!isPlainObject(value))
165
+ throw new PatchRowError(`${root} must stay an object`);
166
+ if (Object.keys(value).length === 0 && !isDeepStrictEqual(stored[root], {}))
167
+ delete record[root];
168
+ }
169
+ return result;
170
+ }
171
+ export function bodyChanged(before, after) {
172
+ return BODY_ROOTS.some((root) => !isDeepStrictEqual(before[root], after[root]));
173
+ }
174
+ function flatten(value, prefix, out) {
175
+ if (isPlainObject(value) && Object.keys(value).length > 0) {
176
+ for (const [key, child] of Object.entries(value))
177
+ flatten(child, `${prefix}.${key}`, out);
178
+ return;
179
+ }
180
+ out.set(prefix, value);
181
+ }
182
+ /** Path-level diff of the body roots. An absent value is `null`. */
183
+ export function bodyDiff(before, after) {
184
+ const left = new Map();
185
+ const right = new Map();
186
+ for (const root of BODY_ROOTS) {
187
+ if (before[root] !== undefined)
188
+ flatten(before[root], root, left);
189
+ if (after[root] !== undefined)
190
+ flatten(after[root], root, right);
191
+ }
192
+ const out = { before: {}, after: {} };
193
+ const paths = new Set([...left.keys(), ...right.keys()]);
194
+ for (const path of paths) {
195
+ const l = left.has(path) ? left.get(path) : null;
196
+ const r = right.has(path) ? right.get(path) : null;
197
+ if (isDeepStrictEqual(l, r))
198
+ continue;
199
+ out.before[path] = l;
200
+ out.after[path] = r;
201
+ }
202
+ return out;
203
+ }
204
+ //# sourceMappingURL=ops.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ops.js","sourceRoot":"","sources":["../../src/patches/ops.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,QAAQ,EACR,aAAa,EACb,SAAS,EACT,MAAM,EACN,cAAc,EACd,SAAS,EACT,aAAa,EACb,SAAS,EACT,QAAQ,EACR,UAAU,EACV,OAAO,EACP,OAAO,GACR,MAAM,YAAY,CAAC;AAYpB,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAU,CAAC;AAE7D,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACvE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;IACpD,IAAI,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IACjE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACrB,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAAE,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjD,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO;IAClC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACvB,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,KAAc,EAAE,GAA4B;IAC1D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;QAClF,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC/D,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,QAAQ,CACtB,MAA+B,EAC/B,GAAc,EACd,OAAuC;IAEvC,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,aAAa,CAAC,uBAAuB,CAAC,CAAC;IAClF,MAAM,MAAM,GAAc,EAAE,MAAM,EAAE,CAAC;IAErC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;YACd,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,IAAI,EAAE,CAAC,YAAY,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC;oBAAE,MAAM;gBACxD,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrD,MAAM;YACR,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;oBAChB,mBAAmB,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;oBAClD,MAAM;gBACR,CAAC;gBACD,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;oBAC1D,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;wBAAE,SAAS;oBACnC,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;wBAAE,SAAS;oBACnE,OAAQ,QAAQ,CAAC,MAAkC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC5E,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,MAAM,CAAC;YACZ,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC;oBAAE,MAAM;gBACtC,MAAM,KAAK,GAAG,eAAe,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC1D,IAAI,CAAC,EAAE,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;oBAC7C,IAAI,EAAE,CAAC,EAAE,KAAK,MAAM;wBAAE,MAAM;oBAC5B,IAAI,iBAAiB,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;wBAAE,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;;wBAChF,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,kCAAkC,CAAC;oBACjG,MAAM;gBACR,CAAC;gBACD,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBAC/B,IAAI,EAAE,CAAC,EAAE,KAAK,MAAM;oBAAE,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;gBACnD,MAAM;YACR,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;oBAC1D,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;wBAAE,SAAS;oBACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAiC,CAAC;oBAC1D,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;wBACxD,MAAM,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,iBAAiB,CAAC;wBAC7E,SAAS;oBACX,CAAC;oBACD,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC7C,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;gBACtC,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;oBAC1D,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;wBAAE,SAAS;oBACnC,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;oBAClC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;wBAC/D,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC;4BAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;wBAC/D,SAAS;oBACX,CAAC;oBACD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;oBACvC,IAAI,MAAM,CAAC,OAAO;wBAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;gBACtD,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,MAAM,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;gBACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;gBAC9B,IAAI,IAAI,CAAC,IAAI;oBAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;gBAC9E,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC;oBAChD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;wBAAE,SAAS;oBACnC,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;oBAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;wBAAE,SAAS;oBACtC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;wBACnC,IAAI,OAAO,IAAI,KAAK,QAAQ;4BAAE,OAAO,IAAI,CAAC;wBAC1C,IAAI,EAAE,CAAC,MAAM;4BAAE,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;wBAChD,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC,OAAQ,CAAC,CAAC;oBAC5C,CAAC,CAAC,CAAC;oBACH,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM;wBAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAC9D,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC;oBACpE,IAAI,SAAS,CAAC,QAAQ,CAAC;wBAAE,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACzD,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;oBAC/B,MAAM,IAAI,aAAa,CAAC,wCAAwC,CAAC,CAAC;gBACpE,CAAC;gBACD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;gBACtD,MAAM,CAAC,aAAa,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC,UAAU,IAAI,MAAM,EAAE,CAAC;gBAChF,MAAM;YACR,CAAC;YACD,KAAK,cAAc,CAAC,CAAC,CAAC;gBACpB,MAAM,CAAC,YAAY,GAAG,EAAE,CAAC,IAAI,IAAI,WAAW,CAAC;gBAC7C,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,aAAa,CAAC,0BAA0B,CAAC,CAAC;IACrF,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,WAAW,CAAU,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,aAAa,CAAC,GAAG,IAAI,sBAAsB,CAAC,CAAC;QAClF,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IACnG,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAA+B,EAAE,KAA8B;IACzF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,OAAO,CAAC,KAAc,EAAE,MAAc,EAAE,GAAyB;IACxE,IAAI,aAAa,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,KAAK,EAAE,GAAG,MAAM,IAAI,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;QAC1F,OAAO;IACT,CAAC;IACD,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,QAAQ,CACtB,MAA+B,EAC/B,KAA8B;IAE9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAmB,CAAC;IACxC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,SAAS;YAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAClE,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS;YAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,GAAG,GAAG,EAAE,MAAM,EAAE,EAA6B,EAAE,KAAK,EAAE,EAA6B,EAAE,CAAC;IAC5F,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACzD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACjD,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnD,IAAI,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC;YAAE,SAAS;QACtC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { PatchRequest, Predicate } from "./types.js";
2
+ export declare function invalid(message: string, field?: string): never;
3
+ export declare function parsePredicate(raw: unknown, field: string): Predicate;
4
+ export declare function parsePatchRequest(body: unknown): PatchRequest;
5
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/patches/parse.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAuB,YAAY,EAAe,SAAS,EAAa,MAAM,YAAY,CAAC;AAiBvG,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAE9D;AAqED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAYrE;AA8KD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,CAsB7D"}
@@ -0,0 +1,323 @@
1
+ import { ServiceError } from "../errors.js";
2
+ import { parsePath } from "./paths.js";
3
+ const OP_ROOTS = new Set(["data", "context", "_metadata"]);
4
+ const READ_ROOTS = new Set([
5
+ "data",
6
+ "context",
7
+ "_metadata",
8
+ "_system",
9
+ "concept",
10
+ "subject",
11
+ "recordId",
12
+ "revision",
13
+ "objectType",
14
+ "contentType",
15
+ ]);
16
+ const KEY_PATTERN = /^[A-Za-z0-9_$@:-][A-Za-z0-9_$@:.-]*$/;
17
+ export function invalid(message, field) {
18
+ throw new ServiceError("PATCH_INVALID", message, 400, field ? { field, retryable: false } : { retryable: false });
19
+ }
20
+ function isPlainObject(value) {
21
+ return value !== null && typeof value === "object" && !Array.isArray(value);
22
+ }
23
+ function nonEmptyString(value, field) {
24
+ if (typeof value !== "string" || !value.trim())
25
+ invalid(`${field} must be a non-empty string`, field);
26
+ return value.trim();
27
+ }
28
+ function checkRegex(pattern, field) {
29
+ if (typeof pattern !== "string" || !pattern)
30
+ invalid(`${field} must be a regular expression string`, field);
31
+ try {
32
+ new RegExp(pattern);
33
+ }
34
+ catch {
35
+ invalid(`${field} is not a valid regular expression`, field);
36
+ }
37
+ return pattern;
38
+ }
39
+ function checkPath(raw, field, roots, allowEach) {
40
+ const path = nonEmptyString(raw, field);
41
+ let segments;
42
+ try {
43
+ segments = parsePath(path);
44
+ }
45
+ catch (err) {
46
+ invalid(`${field}: ${err instanceof Error ? err.message : String(err)}`, field);
47
+ }
48
+ if (!roots.has(segments[0].key) || segments[0].each) {
49
+ invalid(`${field} must start with ${[...roots].join(", ")}`, field);
50
+ }
51
+ if (!allowEach && segments.some((segment) => segment.each)) {
52
+ invalid(`${field} cannot step into arrays with []`, field);
53
+ }
54
+ return path;
55
+ }
56
+ function parseValueTest(raw, field, required) {
57
+ const test = {};
58
+ let count = 0;
59
+ if (raw.exists !== undefined) {
60
+ if (raw.exists !== true)
61
+ invalid(`${field}.exists must be true`, `${field}.exists`);
62
+ test.exists = true;
63
+ count += 1;
64
+ }
65
+ if (raw.missing !== undefined) {
66
+ if (raw.missing !== true)
67
+ invalid(`${field}.missing must be true`, `${field}.missing`);
68
+ test.missing = true;
69
+ count += 1;
70
+ }
71
+ if (Object.prototype.hasOwnProperty.call(raw, "equals")) {
72
+ test.equals = structuredClone(raw.equals);
73
+ count += 1;
74
+ }
75
+ if (raw.in !== undefined) {
76
+ if (!Array.isArray(raw.in))
77
+ invalid(`${field}.in must be an array`, `${field}.in`);
78
+ test.in = structuredClone(raw.in);
79
+ count += 1;
80
+ }
81
+ if (raw.matches !== undefined) {
82
+ test.matches = checkRegex(raw.matches, `${field}.matches`);
83
+ count += 1;
84
+ }
85
+ if (count > 1)
86
+ invalid(`${field} takes one of exists, missing, equals, in, matches`, field);
87
+ if (required && count === 0)
88
+ invalid(`${field} needs exists, missing, equals, in, or matches`, field);
89
+ return test;
90
+ }
91
+ export function parsePredicate(raw, field) {
92
+ if (!isPlainObject(raw))
93
+ invalid(`${field} must be an object`, field);
94
+ const test = parseValueTest(raw, field, true);
95
+ if (raw.anyDepth !== undefined) {
96
+ if (raw.anyDepth !== true)
97
+ invalid(`${field}.anyDepth must be true`, `${field}.anyDepth`);
98
+ if (raw.path !== undefined)
99
+ invalid(`${field} takes path or key with anyDepth, not both`, field);
100
+ const key = nonEmptyString(raw.key, `${field}.key`);
101
+ if (!KEY_PATTERN.test(key) || key.includes("."))
102
+ invalid(`${field}.key must be a single key`, `${field}.key`);
103
+ return { key, anyDepth: true, ...test };
104
+ }
105
+ if (raw.key !== undefined)
106
+ invalid(`${field}.key needs anyDepth: true`, `${field}.key`);
107
+ return { path: checkPath(raw.path, `${field}.path`, READ_ROOTS, true), ...test };
108
+ }
109
+ function parseSelect(raw) {
110
+ if (!isPlainObject(raw))
111
+ invalid("select must be an object", "select");
112
+ const objectType = nonEmptyString(raw.objectType, "select.objectType");
113
+ if (!Array.isArray(raw.contentTypes) || raw.contentTypes.length === 0) {
114
+ invalid("select.contentTypes must name at least one content type", "select.contentTypes");
115
+ }
116
+ const contentTypes = [...new Set(raw.contentTypes.map((ct, i) => nonEmptyString(ct, `select.contentTypes[${i}]`)))];
117
+ if (raw.recordIds !== undefined && raw.idPrefix !== undefined) {
118
+ invalid("select takes recordIds or idPrefix, not both", "select.recordIds");
119
+ }
120
+ const select = { objectType, contentTypes, state: "active" };
121
+ if (raw.recordIds !== undefined) {
122
+ if (!Array.isArray(raw.recordIds) || raw.recordIds.length === 0) {
123
+ invalid("select.recordIds must be a non-empty array", "select.recordIds");
124
+ }
125
+ select.recordIds = [...new Set(raw.recordIds.map((id, i) => nonEmptyString(id, `select.recordIds[${i}]`)))];
126
+ }
127
+ if (raw.idPrefix !== undefined)
128
+ select.idPrefix = nonEmptyString(raw.idPrefix, "select.idPrefix");
129
+ if (raw.discriminator !== undefined) {
130
+ const disc = raw.discriminator;
131
+ if (!isPlainObject(disc))
132
+ invalid("select.discriminator must be an object", "select.discriminator");
133
+ if (disc.absent !== undefined && disc.value !== undefined) {
134
+ invalid("select.discriminator takes value or absent, not both", "select.discriminator");
135
+ }
136
+ if (disc.absent !== undefined) {
137
+ if (disc.absent !== true)
138
+ invalid("select.discriminator.absent must be true", "select.discriminator.absent");
139
+ select.discriminator = { absent: true };
140
+ }
141
+ else {
142
+ select.discriminator = { value: nonEmptyString(disc.value, "select.discriminator.value") };
143
+ }
144
+ }
145
+ if (raw.where !== undefined) {
146
+ if (!Array.isArray(raw.where))
147
+ invalid("select.where must be an array", "select.where");
148
+ select.where = raw.where.map((item, i) => parsePredicate(item, `select.where[${i}]`));
149
+ }
150
+ if (raw.state !== undefined) {
151
+ if (raw.state !== "active" && raw.state !== "tombstoned" && raw.state !== "any") {
152
+ invalid("select.state must be active, tombstoned, or any", "select.state");
153
+ }
154
+ select.state = raw.state;
155
+ }
156
+ if (raw.limit !== undefined) {
157
+ if (typeof raw.limit !== "number" || !Number.isInteger(raw.limit) || raw.limit < 1) {
158
+ invalid("select.limit must be an integer >= 1", "select.limit");
159
+ }
160
+ select.limit = raw.limit;
161
+ }
162
+ return select;
163
+ }
164
+ function parseOverwrite(raw, field) {
165
+ if (raw.overwrite === undefined)
166
+ return false;
167
+ if (typeof raw.overwrite !== "boolean")
168
+ invalid(`${field}.overwrite must be a boolean`, `${field}.overwrite`);
169
+ return raw.overwrite;
170
+ }
171
+ function parseOp(raw, index) {
172
+ const field = `ops[${index}]`;
173
+ if (!isPlainObject(raw))
174
+ invalid(`${field} must be an object`, field);
175
+ switch (raw.op) {
176
+ case "set": {
177
+ if (!Object.prototype.hasOwnProperty.call(raw, "value"))
178
+ invalid(`${field}.value is required`, `${field}.value`);
179
+ if (raw.onlyIfAbsent !== undefined && typeof raw.onlyIfAbsent !== "boolean") {
180
+ invalid(`${field}.onlyIfAbsent must be a boolean`, `${field}.onlyIfAbsent`);
181
+ }
182
+ return {
183
+ op: "set",
184
+ path: checkPath(raw.path, `${field}.path`, OP_ROOTS, false),
185
+ value: structuredClone(raw.value),
186
+ ...(raw.onlyIfAbsent === true ? { onlyIfAbsent: true } : {}),
187
+ };
188
+ }
189
+ case "delete": {
190
+ const when = raw.when === undefined ? undefined : parseWhen(raw.when, `${field}.when`);
191
+ if (raw.anyDepth !== undefined) {
192
+ if (raw.anyDepth !== true)
193
+ invalid(`${field}.anyDepth must be true`, `${field}.anyDepth`);
194
+ if (raw.path !== undefined)
195
+ invalid(`${field} takes path or key with anyDepth, not both`, field);
196
+ const key = nonEmptyString(raw.key, `${field}.key`);
197
+ if (!KEY_PATTERN.test(key) || key.includes("."))
198
+ invalid(`${field}.key must be a single key`, `${field}.key`);
199
+ return { op: "delete", key, anyDepth: true, ...(when ? { when } : {}) };
200
+ }
201
+ if (raw.key !== undefined)
202
+ invalid(`${field}.key needs anyDepth: true`, `${field}.key`);
203
+ const path = checkPath(raw.path, `${field}.path`, OP_ROOTS, true);
204
+ if (parsePath(path).length < 2)
205
+ invalid(`${field}.path cannot delete a whole root`, `${field}.path`);
206
+ if (parsePath(path).at(-1).each)
207
+ invalid(`${field}.path cannot end with []`, `${field}.path`);
208
+ return { op: "delete", path, ...(when ? { when } : {}) };
209
+ }
210
+ case "move":
211
+ case "copy": {
212
+ const from = checkPath(raw.from, `${field}.from`, OP_ROOTS, false);
213
+ const to = checkPath(raw.to, `${field}.to`, OP_ROOTS, false);
214
+ if (parsePath(from).length < 2 || parsePath(to).length < 2) {
215
+ invalid(`${field} cannot ${raw.op} a whole root`, field);
216
+ }
217
+ if (from === to || to.startsWith(`${from}.`) || from.startsWith(`${to}.`)) {
218
+ invalid(`${field}.from and ${field}.to must not overlap`, field);
219
+ }
220
+ return { op: raw.op, from, to, overwrite: parseOverwrite(raw, field) };
221
+ }
222
+ case "rename": {
223
+ const path = checkPath(raw.path, `${field}.path`, OP_ROOTS, true);
224
+ const segments = parsePath(path);
225
+ if (segments.length < 2 || segments.at(-1).each)
226
+ invalid(`${field}.path must name a key`, `${field}.path`);
227
+ const to = nonEmptyString(raw.to, `${field}.to`);
228
+ if (to.includes(".") || to.includes("[") || !KEY_PATTERN.test(to)) {
229
+ invalid(`${field}.to is the new key name, not a path`, `${field}.to`);
230
+ }
231
+ return { op: "rename", path, to };
232
+ }
233
+ case "mapValues": {
234
+ if (!isPlainObject(raw.map) || Object.keys(raw.map).length === 0) {
235
+ invalid(`${field}.map must be a non-empty object`, `${field}.map`);
236
+ }
237
+ return {
238
+ op: "mapValues",
239
+ path: checkPath(raw.path, `${field}.path`, OP_ROOTS, true),
240
+ map: structuredClone(raw.map),
241
+ };
242
+ }
243
+ case "dropValues": {
244
+ const path = checkPath(raw.path, `${field}.path`, OP_ROOTS, true);
245
+ if ((raw.values === undefined) === (raw.matches === undefined)) {
246
+ invalid(`${field} takes values or matches`, field);
247
+ }
248
+ if (raw.values !== undefined) {
249
+ if (!Array.isArray(raw.values) || raw.values.some((v) => typeof v !== "string")) {
250
+ invalid(`${field}.values must be an array of strings`, `${field}.values`);
251
+ }
252
+ return { op: "dropValues", path, values: [...raw.values] };
253
+ }
254
+ return { op: "dropValues", path, matches: checkRegex(raw.matches, `${field}.matches`) };
255
+ }
256
+ case "prune": {
257
+ if (raw.path === undefined)
258
+ return { op: "prune" };
259
+ return { op: "prune", path: checkPath(raw.path, `${field}.path`, OP_ROOTS, true) };
260
+ }
261
+ case "setDiscriminator": {
262
+ const value = nonEmptyString(raw.value, `${field}.value`);
263
+ const onExisting = raw.onExisting ?? "skip";
264
+ if (onExisting !== "skip" && onExisting !== "replace" && onExisting !== "deleteLegacy") {
265
+ invalid(`${field}.onExisting must be skip, replace, or deleteLegacy`, `${field}.onExisting`);
266
+ }
267
+ return { op: "setDiscriminator", value, onExisting };
268
+ }
269
+ case "deleteRecord": {
270
+ const mode = raw.mode ?? "tombstone";
271
+ if (mode !== "tombstone" && mode !== "purge") {
272
+ invalid(`${field}.mode must be tombstone or purge`, `${field}.mode`);
273
+ }
274
+ return { op: "deleteRecord", mode };
275
+ }
276
+ default:
277
+ invalid(`${field}.op ${JSON.stringify(raw.op)} is not a patch op`, `${field}.op`);
278
+ }
279
+ }
280
+ function parseWhen(raw, field) {
281
+ if (!isPlainObject(raw))
282
+ invalid(`${field} must be an object`, field);
283
+ if (raw.path !== undefined || raw.key !== undefined) {
284
+ invalid(`${field} tests the value being deleted; it takes no path`, field);
285
+ }
286
+ return parseValueTest(raw, field, true);
287
+ }
288
+ function parseGuard(raw, index) {
289
+ const field = `guards[${index}]`;
290
+ if (!isPlainObject(raw))
291
+ invalid(`${field} must be an object`, field);
292
+ const rejectWhen = parsePredicate(raw.rejectWhen, `${field}.rejectWhen`);
293
+ if (rejectWhen.missing)
294
+ invalid(`${field}.rejectWhen cannot reject a missing field`, `${field}.rejectWhen`);
295
+ return { rejectWhen, message: nonEmptyString(raw.message, `${field}.message`) };
296
+ }
297
+ export function parsePatchRequest(body) {
298
+ if (!isPlainObject(body))
299
+ invalid("patch body must be an object");
300
+ const select = parseSelect(body.select);
301
+ if (!Array.isArray(body.ops) || body.ops.length === 0)
302
+ invalid("ops must name at least one op", "ops");
303
+ const ops = body.ops.map((op, i) => parseOp(op, i));
304
+ const deleteAt = ops.findIndex((op) => op.op === "deleteRecord");
305
+ if (deleteAt >= 0 && deleteAt !== ops.length - 1) {
306
+ invalid("deleteRecord must be the last op", `ops[${deleteAt}]`);
307
+ }
308
+ if (ops.filter((op) => op.op === "setDiscriminator").length > 1) {
309
+ invalid("setDiscriminator may appear once", "ops");
310
+ }
311
+ if (deleteAt >= 0 && ops.some((op) => op.op === "setDiscriminator")) {
312
+ invalid("deleteRecord and setDiscriminator cannot share a patch", "ops");
313
+ }
314
+ let guards = [];
315
+ if (body.guards !== undefined) {
316
+ if (!Array.isArray(body.guards))
317
+ invalid("guards must be an array", "guards");
318
+ guards = body.guards.map((guard, i) => parseGuard(guard, i));
319
+ }
320
+ const reason = body.reason === undefined ? undefined : nonEmptyString(body.reason, "reason");
321
+ return { ...(reason ? { reason } : {}), select, ops, guards };
322
+ }
323
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/patches/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { Predicate, ValueTest } from "./types.js";
2
+ export type Segment = {
3
+ key: string;
4
+ each: boolean;
5
+ };
6
+ type Container = Record<string, unknown> | unknown[];
7
+ export type Location = {
8
+ parent: Container;
9
+ key: string | number;
10
+ };
11
+ /** A row cannot take this op as written, for example a path through a string. */
12
+ export declare class PatchRowError extends Error {
13
+ constructor(message: string);
14
+ }
15
+ export declare function isPlainObject(value: unknown): value is Record<string, unknown>;
16
+ export declare function parsePath(path: string): Segment[];
17
+ /** Every place the path names. The last key may be absent at a location. */
18
+ export declare function locate(root: Record<string, unknown>, segments: Segment[]): Location[];
19
+ export declare function isPresent(location: Location): boolean;
20
+ export declare function valueAt(location: Location): unknown;
21
+ export declare function writeAt(location: Location, value: unknown): void;
22
+ export declare function readValues(root: Record<string, unknown>, path: string): unknown[];
23
+ /** Value at a path without array steps, or undefined. */
24
+ export declare function readPlain(root: Record<string, unknown>, path: string): unknown;
25
+ export declare function hasPlain(root: Record<string, unknown>, path: string): boolean;
26
+ /** Set a value, creating objects on the way. A non-object on the way fails the row. */
27
+ export declare function setPlain(root: Record<string, unknown>, path: string, value: unknown): void;
28
+ export declare function deletePlain(root: Record<string, unknown>, path: string): boolean;
29
+ /** Values of `key` at any depth under `value`, including inside arrays. */
30
+ export declare function valuesForKey(value: unknown, key: string, out?: unknown[]): unknown[];
31
+ /** Remove `key` at every depth under `value`. With `when`, only where its value passes. */
32
+ export declare function deleteKeyEverywhere(value: unknown, key: string, when?: ValueTest): boolean;
33
+ export declare function matchesPattern(value: unknown, pattern: string): boolean;
34
+ /** `values` are what the path or key found. Absent locations are not in the list. */
35
+ export declare function testValues(values: unknown[], test: ValueTest): boolean;
36
+ export declare function evaluatePredicate(record: Record<string, unknown>, predicate: Predicate): boolean;
37
+ export {};
38
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/patches/paths.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,MAAM,OAAO,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAErD,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,EAAE,CAAC;AAErD,MAAM,MAAM,QAAQ,GAAG;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAAC;AAInE,iFAAiF;AACjF,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE9E;AAMD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAUjD;AAED,4EAA4E;AAC5E,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,CAqBrF;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAGrD;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAInD;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAGhE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAEjF;AAED,yDAAyD;AACzD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAO9E;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAQ7E;AAED,uFAAuF;AACvF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAa1F;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAWhF;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,OAAO,EAAO,GAAG,OAAO,EAAE,CAWxF;AAED,2FAA2F;AAC3F,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,CAa1F;AAcD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvE;AAED,qFAAqF;AACrF,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAetE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAMhG"}