grafeo-ogm 2.4.8 → 2.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 (61) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/README.md +20 -6
  3. package/dist/cjs/compilers/mutation.compiler.d.ts.map +1 -1
  4. package/dist/cjs/compilers/mutation.compiler.js +48 -42
  5. package/dist/cjs/compilers/mutation.compiler.js.map +1 -1
  6. package/dist/cjs/compilers/selection.compiler.d.ts +16 -0
  7. package/dist/cjs/compilers/selection.compiler.d.ts.map +1 -1
  8. package/dist/cjs/compilers/selection.compiler.js +158 -18
  9. package/dist/cjs/compilers/selection.compiler.js.map +1 -1
  10. package/dist/cjs/generator/type-emitters/where-emitter.js +16 -0
  11. package/dist/cjs/generator/type-emitters/where-emitter.js.map +1 -1
  12. package/dist/cjs/interface-model.d.ts +12 -0
  13. package/dist/cjs/interface-model.d.ts.map +1 -1
  14. package/dist/cjs/interface-model.js +21 -13
  15. package/dist/cjs/interface-model.js.map +1 -1
  16. package/dist/cjs/model.d.ts.map +1 -1
  17. package/dist/cjs/model.js +6 -0
  18. package/dist/cjs/model.js.map +1 -1
  19. package/dist/cjs/subgraph/subgraph-operations.d.ts.map +1 -1
  20. package/dist/cjs/subgraph/subgraph-operations.js +71 -6
  21. package/dist/cjs/subgraph/subgraph-operations.js.map +1 -1
  22. package/dist/cjs/subgraph/types.d.ts +14 -0
  23. package/dist/cjs/subgraph/types.d.ts.map +1 -1
  24. package/dist/cjs/testing/cypher-assert.d.ts +19 -1
  25. package/dist/cjs/testing/cypher-assert.d.ts.map +1 -1
  26. package/dist/cjs/testing/cypher-assert.js +192 -11
  27. package/dist/cjs/testing/cypher-assert.js.map +1 -1
  28. package/dist/cjs/testing/neo4j-record-factory.d.ts +8 -4
  29. package/dist/cjs/testing/neo4j-record-factory.d.ts.map +1 -1
  30. package/dist/cjs/testing/neo4j-record-factory.js +18 -7
  31. package/dist/cjs/testing/neo4j-record-factory.js.map +1 -1
  32. package/dist/esm/compilers/mutation.compiler.d.ts.map +1 -1
  33. package/dist/esm/compilers/mutation.compiler.js +48 -42
  34. package/dist/esm/compilers/mutation.compiler.js.map +1 -1
  35. package/dist/esm/compilers/selection.compiler.d.ts +16 -0
  36. package/dist/esm/compilers/selection.compiler.d.ts.map +1 -1
  37. package/dist/esm/compilers/selection.compiler.js +160 -20
  38. package/dist/esm/compilers/selection.compiler.js.map +1 -1
  39. package/dist/esm/generator/type-emitters/where-emitter.js +16 -0
  40. package/dist/esm/generator/type-emitters/where-emitter.js.map +1 -1
  41. package/dist/esm/interface-model.d.ts +12 -0
  42. package/dist/esm/interface-model.d.ts.map +1 -1
  43. package/dist/esm/interface-model.js +21 -13
  44. package/dist/esm/interface-model.js.map +1 -1
  45. package/dist/esm/model.d.ts.map +1 -1
  46. package/dist/esm/model.js +6 -0
  47. package/dist/esm/model.js.map +1 -1
  48. package/dist/esm/subgraph/subgraph-operations.d.ts.map +1 -1
  49. package/dist/esm/subgraph/subgraph-operations.js +71 -6
  50. package/dist/esm/subgraph/subgraph-operations.js.map +1 -1
  51. package/dist/esm/subgraph/types.d.ts +14 -0
  52. package/dist/esm/subgraph/types.d.ts.map +1 -1
  53. package/dist/esm/testing/cypher-assert.d.ts +19 -1
  54. package/dist/esm/testing/cypher-assert.d.ts.map +1 -1
  55. package/dist/esm/testing/cypher-assert.js +192 -11
  56. package/dist/esm/testing/cypher-assert.js.map +1 -1
  57. package/dist/esm/testing/neo4j-record-factory.d.ts +8 -4
  58. package/dist/esm/testing/neo4j-record-factory.d.ts.map +1 -1
  59. package/dist/esm/testing/neo4j-record-factory.js +18 -7
  60. package/dist/esm/testing/neo4j-record-factory.js.map +1 -1
  61. package/package.json +1 -1
@@ -24,6 +24,160 @@ function canonicalJson(value) {
24
24
  return v;
25
25
  });
26
26
  }
27
+ /**
28
+ * Split Cypher into tokens, keeping string literals, backticked names and
29
+ * comments whole so nothing inside them is read as a keyword, a parameter
30
+ * or collapsible whitespace (v2.5.0).
31
+ */
32
+ function tokenize(cypher) {
33
+ const tokens = [];
34
+ let i = 0;
35
+ const push = (kind, end) => {
36
+ tokens.push({ kind, text: cypher.slice(i, end), start: i, end });
37
+ i = end;
38
+ };
39
+ while (i < cypher.length) {
40
+ const ch = cypher[i];
41
+ if (/\s/.test(ch)) {
42
+ let j = i + 1;
43
+ while (j < cypher.length && /\s/.test(cypher[j]))
44
+ j++;
45
+ push('space', j);
46
+ }
47
+ else if (ch === "'" || ch === '"') {
48
+ let j = i + 1;
49
+ while (j < cypher.length && cypher[j] !== ch)
50
+ j += cypher[j] === '\\' ? 2 : 1;
51
+ push('quoted', Math.min(j + 1, cypher.length));
52
+ }
53
+ else if (ch === '`') {
54
+ // A backticked name escapes a backtick by doubling it.
55
+ let j = i + 1;
56
+ while (j < cypher.length)
57
+ if (cypher[j] === '`' && cypher[j + 1] === '`')
58
+ j += 2;
59
+ else if (cypher[j] === '`')
60
+ break;
61
+ else
62
+ j++;
63
+ push('quoted', Math.min(j + 1, cypher.length));
64
+ }
65
+ else if (cypher.startsWith('//', i)) {
66
+ const nl = cypher.indexOf('\n', i);
67
+ push('comment', nl === -1 ? cypher.length : nl);
68
+ }
69
+ else if (cypher.startsWith('/*', i)) {
70
+ const close = cypher.indexOf('*/', i + 2);
71
+ push('comment', close === -1 ? cypher.length : close + 2);
72
+ }
73
+ else if (ch === '$' && /[A-Za-z_]/.test(cypher[i + 1] ?? '')) {
74
+ let j = i + 1;
75
+ while (j < cypher.length && /[A-Za-z0-9_]/.test(cypher[j]))
76
+ j++;
77
+ push('param', j);
78
+ }
79
+ else if (/[A-Za-z0-9_]/.test(ch)) {
80
+ let j = i + 1;
81
+ while (j < cypher.length && /[A-Za-z0-9_]/.test(cypher[j]))
82
+ j++;
83
+ push('word', j);
84
+ }
85
+ else
86
+ push('punct', i + 1);
87
+ }
88
+ return tokens;
89
+ }
90
+ /** Keywords that start a clause, and so end the clause before them. */
91
+ const CLAUSE_KEYWORDS = new Set([
92
+ 'CALL',
93
+ 'CREATE',
94
+ 'DELETE',
95
+ 'DETACH',
96
+ 'FINISH',
97
+ 'FOREACH',
98
+ 'LIMIT',
99
+ 'LOAD',
100
+ 'MATCH',
101
+ 'MERGE',
102
+ 'OFFSET',
103
+ 'ON',
104
+ 'OPTIONAL',
105
+ 'ORDER',
106
+ 'REMOVE',
107
+ 'RETURN',
108
+ 'SET',
109
+ 'SKIP',
110
+ 'UNION',
111
+ 'UNWIND',
112
+ 'USE',
113
+ 'WHERE',
114
+ 'WITH',
115
+ 'YIELD',
116
+ ]);
117
+ /** The tokens that carry meaning, so keyword checks look past whitespace. */
118
+ function significant(tokens) {
119
+ return tokens.filter((t) => t.kind !== 'space' && t.kind !== 'comment');
120
+ }
121
+ /**
122
+ * Whether `sig[k]` (a word) is used as a keyword rather than a name: not a
123
+ * property (`.set`), a label or type (`:Set`), a map key (`set:`), or the
124
+ * WITH of `STARTS WITH` / `ENDS WITH`.
125
+ */
126
+ function isKeywordUse(sig, k) {
127
+ const prev = sig[k - 1];
128
+ const next = sig[k + 1];
129
+ if (prev?.kind === 'punct' && (prev.text === '.' || prev.text === ':'))
130
+ return false;
131
+ if (next?.kind === 'punct' && next.text === ':')
132
+ return false;
133
+ if (sig[k].text.toUpperCase() === 'WITH' &&
134
+ prev?.kind === 'word' &&
135
+ ['STARTS', 'ENDS'].includes(prev.text.toUpperCase()))
136
+ return false;
137
+ return true;
138
+ }
139
+ /**
140
+ * The source text of every occurrence of `clauseType` used as a keyword:
141
+ * from the keyword to the next clause keyword at the same bracket depth,
142
+ * a `|` at that depth (list and pattern comprehensions), or the bracket
143
+ * that closes the enclosing one — whichever comes first.
144
+ */
145
+ function clauseSegments(cypher, clauseType) {
146
+ const words = clauseType.trim().toUpperCase().split(/\s+/);
147
+ const sig = significant(tokenize(cypher));
148
+ const segments = [];
149
+ for (let k = 0; k + words.length <= sig.length; k++) {
150
+ const matches = words.every((w, n) => sig[k + n].kind === 'word' && sig[k + n].text.toUpperCase() === w);
151
+ if (!matches || !isKeywordUse(sig, k))
152
+ continue;
153
+ let depth = 0;
154
+ let end = cypher.length;
155
+ for (let j = k + words.length; j < sig.length; j++) {
156
+ const t = sig[j];
157
+ if (t.kind === 'punct' && '([{'.includes(t.text))
158
+ depth++;
159
+ else if (t.kind === 'punct' && ')]}'.includes(t.text)) {
160
+ if (--depth < 0) {
161
+ end = t.start;
162
+ break;
163
+ }
164
+ }
165
+ else if (depth === 0 && t.kind === 'punct' && t.text === '|') {
166
+ end = t.start;
167
+ break;
168
+ }
169
+ else if (depth === 0 &&
170
+ t.kind === 'word' &&
171
+ CLAUSE_KEYWORDS.has(t.text.toUpperCase()) &&
172
+ isKeywordUse(sig, j)) {
173
+ end = t.start;
174
+ break;
175
+ }
176
+ }
177
+ segments.push(cypher.slice(sig[k].start, end));
178
+ }
179
+ return segments;
180
+ }
27
181
  /**
28
182
  * Structural Cypher comparison utility that normalizes whitespace
29
183
  * and parameter names for deterministic test assertions.
@@ -34,17 +188,30 @@ class CypherAssert {
34
188
  * - Collapse all whitespace sequences to a single space
35
189
  * - Trim leading/trailing whitespace
36
190
  * - Rename params to canonical $p0, $p1, etc. (in order of appearance)
191
+ *
192
+ * String literals and backticked names are kept verbatim (v2.5.0): their
193
+ * whitespace is part of the value, and a `$name` inside a string is text,
194
+ * not a parameter. Before v2.5.0 both were collapsed and renamed, so
195
+ * `'a b'` equalled `'a b'`.
37
196
  */
38
197
  static normalize(cypher) {
39
- const collapsed = cypher.replace(/\s+/g, ' ').trim();
40
198
  const seen = new Map();
41
199
  let counter = 0;
42
- const normalized = collapsed.replace(/\$[a-zA-Z_][a-zA-Z0-9_]*/g, (match) => {
43
- if (!seen.has(match))
44
- seen.set(match, `$p${counter++}`);
45
- return seen.get(match);
46
- });
47
- return normalized;
200
+ return tokenize(cypher)
201
+ .map((t) => {
202
+ if (t.kind === 'space')
203
+ return ' ';
204
+ if (t.kind === 'comment')
205
+ return t.text.replace(/\s+/g, ' ');
206
+ if (t.kind === 'param') {
207
+ if (!seen.has(t.text))
208
+ seen.set(t.text, `$p${counter++}`);
209
+ return seen.get(t.text);
210
+ }
211
+ return t.text;
212
+ })
213
+ .join('')
214
+ .trim();
48
215
  }
49
216
  /**
50
217
  * Assert two Cypher strings are structurally equal after normalization.
@@ -57,16 +224,30 @@ class CypherAssert {
57
224
  throw new Error(`Cypher mismatch:\n Actual: ${normalizedActual}\n Expected: ${normalizedExpected}`);
58
225
  }
59
226
  /**
60
- * Assert that a Cypher string contains a specific clause.
227
+ * Assert that a Cypher string contains a clause, and that `pattern`
228
+ * appears inside that clause.
229
+ *
230
+ * The clause keyword is matched case-insensitively as a whole word (or
231
+ * words, e.g. 'ORDER BY', 'ON CREATE SET'), never inside a name, a
232
+ * parameter, a string or a comment. A clause runs from its keyword to the
233
+ * next clause keyword at the same bracket depth (WHERE, ORDER BY, SKIP and
234
+ * LIMIT each count as their own clause), a `|` at that depth, or the
235
+ * bracket closing the enclosing one. The assertion passes when any
236
+ * occurrence of the clause contains `pattern`.
237
+ *
238
+ * Before v2.5.0 the clause was a raw substring (`'SET'` matched
239
+ * `$offset`) and `pattern` could appear anywhere in the query.
240
+ *
61
241
  * @param cypher - The full Cypher string
62
242
  * @param clauseType - e.g., 'WHERE', 'MATCH', 'RETURN', 'SET'
63
243
  * @param pattern - Substring to search for within the clause
64
244
  */
65
245
  static assertContainsClause(cypher, clauseType, pattern) {
66
- if (!cypher.toUpperCase().includes(clauseType.toUpperCase()))
246
+ const segments = clauseSegments(cypher, clauseType);
247
+ if (segments.length === 0)
67
248
  throw new Error(`Cypher does not contain clause '${clauseType}':\n ${cypher}`);
68
- if (!cypher.includes(pattern))
69
- throw new Error(`Cypher does not contain pattern '${pattern}':\n ${cypher}`);
249
+ if (!segments.some((s) => s.includes(pattern)))
250
+ throw new Error(`Cypher does not contain pattern '${pattern}' within a '${clauseType}' clause:\n ${cypher}`);
70
251
  }
71
252
  /**
72
253
  * Assert that a Cypher string does NOT contain a specific clause/pattern.
@@ -1 +1 @@
1
- {"version":3,"file":"cypher-assert.js","sourceRoot":"","sources":["../../../src/testing/cypher-assert.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cypher-assert.js","sourceRoot":"","sources":["../../../src/testing/cypher-assert.ts"],"names":[],"mappings":"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"}
@@ -22,11 +22,15 @@ export declare class Neo4jRecordFactory {
22
22
  * Field values are plain numbers (what the driver returns with
23
23
  * `disableLosslessIntegers`), so `toString()` matches the driver's.
24
24
  *
25
- * Before v2.4.8 the value was converted to UTC with the offset dropped,
26
- * and the fraction was cut to milliseconds.
25
+ * A string with neither an offset nor a zone id is read as UTC, as Neo4j
26
+ * reads it with its default zone.
27
+ *
28
+ * Before v2.4.8 the value was converted to UTC with the offset dropped
29
+ * and the fraction cut to milliseconds; before v2.5.0 an offset-less
30
+ * string was read in the machine's local zone.
27
31
  */
28
32
  static dateTime(isoString: string): unknown;
29
- /** The pre-v2.4.8 parse: through `Date`, in UTC, millisecond precision. */
33
+ /** The pre-v2.5.0 parse: through `Date`, in UTC, millisecond precision. */
30
34
  private static legacyDateTime;
31
35
  /**
32
36
  * Create a mock Neo4j Node.
@@ -35,7 +39,7 @@ export declare class Neo4jRecordFactory {
35
39
  * an Integer, so pass `Neo4jRecordFactory.integer(n)` where a test needs
36
40
  * that; a JS number is never converted, because it may stand for a Float.
37
41
  *
38
- * `options.identity` and `options.elementId` (v2.4.8) give mock nodes
42
+ * `options.identity` and `options.elementId` (v2.5.0) give mock nodes
39
43
  * distinct ids; without them every node has identity 0 and elementId "0".
40
44
  * A given identity alone yields elementId `String(identity)`, as the
41
45
  * driver does for a 4.x server.
@@ -1 +1 @@
1
- {"version":3,"file":"neo4j-record-factory.d.ts","sourceRoot":"","sources":["../../../src/testing/neo4j-record-factory.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,OAAO,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,cAAc,CAAC;AAoDrE;;GAEG;AACH,qBAAa,kBAAkB;IAC7B;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW;IAMzD;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAItC;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAoC3C,2EAA2E;IAC3E,OAAO,CAAC,MAAM,CAAC,cAAc;IAc7B;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,IAAI,CACT,MAAM,EAAE,MAAM,EAAE,EAChB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GAChE,OAAO;CASX"}
1
+ {"version":3,"file":"neo4j-record-factory.d.ts","sourceRoot":"","sources":["../../../src/testing/neo4j-record-factory.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,OAAO,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,cAAc,CAAC;AAoDrE;;GAEG;AACH,qBAAa,kBAAkB;IAC7B;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW;IAMzD;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAItC;;;;;;;;;;;;;;;OAeG;IACH,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAsC3C,2EAA2E;IAC3E,OAAO,CAAC,MAAM,CAAC,cAAc;IAoB7B;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,IAAI,CACT,MAAM,EAAE,MAAM,EAAE,EAChB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GAChE,OAAO;CASX"}
@@ -75,13 +75,18 @@ class Neo4jRecordFactory {
75
75
  * Field values are plain numbers (what the driver returns with
76
76
  * `disableLosslessIntegers`), so `toString()` matches the driver's.
77
77
  *
78
- * Before v2.4.8 the value was converted to UTC with the offset dropped,
79
- * and the fraction was cut to milliseconds.
78
+ * A string with neither an offset nor a zone id is read as UTC, as Neo4j
79
+ * reads it with its default zone.
80
+ *
81
+ * Before v2.4.8 the value was converted to UTC with the offset dropped
82
+ * and the fraction cut to milliseconds; before v2.5.0 an offset-less
83
+ * string was read in the machine's local zone.
80
84
  */
81
85
  static dateTime(isoString) {
82
86
  const m = ISO_DATE_TIME.exec(isoString.trim());
83
- // Strings without an offset or zone id keep the pre-v2.4.8 parse.
84
- if (!m || (m[8] === undefined && m[9] === undefined))
87
+ // A non-ISO string `Date` understands (e.g. RFC 2822) keeps the
88
+ // pre-v2.5.0 parse.
89
+ if (!m)
85
90
  return Neo4jRecordFactory.legacyDateTime(isoString);
86
91
  const [, y, mo, d, h, mi, s, frac, offset, zoneId] = m;
87
92
  const year = Number(y);
@@ -93,12 +98,18 @@ class Neo4jRecordFactory {
93
98
  const nanosecond = frac ? Number(frac.padEnd(9, '0')) : 0;
94
99
  const offsetSeconds = offset !== undefined
95
100
  ? parseOffsetSeconds(offset)
96
- : zoneOffsetSeconds(zoneId, Date.UTC(year, month - 1, day, hour, minute, second));
101
+ : zoneId !== undefined
102
+ ? zoneOffsetSeconds(zoneId, Date.UTC(year, month - 1, day, hour, minute, second))
103
+ : 0;
97
104
  return new neo4j_driver_1.default.types.DateTime(year, month, day, hour, minute, second, nanosecond, offsetSeconds, zoneId);
98
105
  }
99
- /** The pre-v2.4.8 parse: through `Date`, in UTC, millisecond precision. */
106
+ /** The pre-v2.5.0 parse: through `Date`, in UTC, millisecond precision. */
100
107
  static legacyDateTime(isoString) {
101
108
  const d = new Date(isoString);
109
+ // An Invalid Date used to reach the driver as NaN fields and fail there
110
+ // with an unrelated message.
111
+ if (Number.isNaN(d.getTime()))
112
+ throw new TypeError(`Neo4jRecordFactory.dateTime: '${isoString}' is not an ISO-8601 date-time`);
102
113
  return new neo4j_driver_1.default.types.DateTime(d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(), d.getUTCMilliseconds() * 1000000, 0);
103
114
  }
104
115
  /**
@@ -108,7 +119,7 @@ class Neo4jRecordFactory {
108
119
  * an Integer, so pass `Neo4jRecordFactory.integer(n)` where a test needs
109
120
  * that; a JS number is never converted, because it may stand for a Float.
110
121
  *
111
- * `options.identity` and `options.elementId` (v2.4.8) give mock nodes
122
+ * `options.identity` and `options.elementId` (v2.5.0) give mock nodes
112
123
  * distinct ids; without them every node has identity 0 and elementId "0".
113
124
  * A given identity alone yields elementId `String(identity)`, as the
114
125
  * driver does for a 4.x server.
@@ -1 +1 @@
1
- {"version":3,"file":"neo4j-record-factory.js","sourceRoot":"","sources":["../../../src/testing/neo4j-record-factory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"neo4j-record-factory.js","sourceRoot":"","sources":["../../../src/testing/neo4j-record-factory.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"mutation.compiler.d.ts","sourceRoot":"","sources":["../../../src/compilers/mutation.compiler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mutation.compiler.d.ts","sourceRoot":"","sources":["../../../src/compilers/mutation.compiler.ts"],"names":[],"mappings":"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"}
@@ -276,8 +276,10 @@ export class MutationCompiler {
276
276
  const input = inputs[i];
277
277
  const prefix = `create${i}`;
278
278
  const nodeVar = i === 0 ? 'n' : `n_${i}`;
279
- const { propString, propParams } = this.buildCreateProperties(input, nodeDef, prefix);
279
+ // Labels first: an unsafe label must fail as such, before any
280
+ // input-key check (v2.5.0 rejects unknown keys).
280
281
  const labelStr = this.getCachedLabelString(nodeDef);
282
+ const { propString, propParams } = this.buildCreateProperties(input, nodeDef, prefix);
281
283
  lines.push(`CREATE (${nodeVar}:${labelStr} { ${propString} })`);
282
284
  mergeParams(params, propParams);
283
285
  createdVars.push(nodeVar);
@@ -352,6 +354,7 @@ export class MutationCompiler {
352
354
  if (value === undefined)
353
355
  continue;
354
356
  assertSafePropertyName(key, 'update property');
357
+ assertKnownField(nodeDef, key, 'update');
355
358
  const propDef = nodeDef.properties.get(key);
356
359
  const paramName = `update_${key}`;
357
360
  const valueExpr = wrapWriteExpr(`$${paramName}`, value, propDef);
@@ -503,19 +506,31 @@ export class MutationCompiler {
503
506
  const labelStr = this.getCachedLabelString(nodeDef);
504
507
  const lines = [];
505
508
  const params = {};
506
- // Build MERGE key properties from where clause (scalar only)
509
+ // MERGE key: the `@id` / `@unique` fields of `where`, and nothing else
510
+ // (v2.5.0). Any other key throws:
511
+ // - a plain field (`{ email, name }`) became part of the MERGE
512
+ // pattern, so an existing node with that email but another name did
513
+ // not match — MERGE created a DUPLICATE beside it;
514
+ // - an operator key (`name_CONTAINS`) was dropped, silently widening
515
+ // the match to the remaining keys;
516
+ // - a typo (`usernme`) became a phantom property on the new node.
517
+ // Pre-1.7.4 any key set was accepted; 1.7.4 required at least one
518
+ // unique key but still let the others through.
507
519
  const mergeProps = [];
508
520
  const mergeKeyNames = [];
509
521
  for (const [key, value] of Object.entries(where)) {
510
- if (value === undefined || value === null)
511
- continue;
512
- // Skip relationship suffixes and operators
513
- if (key === 'AND' || key === 'OR' || key === 'NOT')
514
- continue;
515
- if (key.includes('_') && !nodeDef.properties.has(key))
522
+ if (value === undefined)
516
523
  continue;
517
- assertSafePropertyName(key, 'merge key');
518
524
  const propDef = nodeDef.properties.get(key);
525
+ if (!propDef ||
526
+ propDef.isCypher ||
527
+ !(propDef.isUnique || propDef.isGenerated))
528
+ throw new OGMError(`upsert "where" accepts only @id / @unique fields of ${nodeDef.typeName}; "${key}" is not one. ` +
529
+ `MERGE matches on exactly these keys — put other fields in "create" / "update", ` +
530
+ `or use findFirst() + create() / update() for a non-unique match.`);
531
+ if (value === null)
532
+ throw new OGMError(`upsert "where.${key}" is null; a MERGE key must have a value.`);
533
+ assertSafePropertyName(key, 'merge key');
519
534
  const paramName = `merge_${key}`;
520
535
  const valueExpr = wrapWriteExpr(`$${paramName}`, value, propDef);
521
536
  mergeProps.push(`${escapeIdentifier(key)}: ${valueExpr}`);
@@ -523,30 +538,8 @@ export class MutationCompiler {
523
538
  params[paramName] = coerceWriteValue(value, propDef);
524
539
  }
525
540
  if (mergeProps.length === 0)
526
- throw new OGMError('upsert requires at least one scalar property in "where" for MERGE key');
527
- // Validate that the MERGE key set contains at least one `@unique` or
528
- // `@id` property. Pre-1.7.4 we accepted any key set, so:
529
- // - A typo in `where` (e.g. `usernme`) became a phantom MERGE
530
- // property — Neo4j happily created a node with that mis-named
531
- // attribute on first use.
532
- // - A non-unique `where` (e.g. `where: { country: 'AR' }`) matched
533
- // multiple existing nodes; MERGE then fans out across all of
534
- // them, applying ON MATCH SET to every match. Almost always a
535
- // bug, never the developer's intent.
536
- // Requiring at least one unique/id key forces MERGE to target at
537
- // most one row.
538
- const hasUniqueOrId = mergeKeyNames.some((name) => {
539
- const prop = nodeDef.properties.get(name);
540
- // `isGenerated` is the parser's flag for the `@id` directive;
541
- // `isUnique` is the flag for `@unique`. Either is sufficient
542
- // to guarantee the MERGE pattern targets at most one row.
543
- return prop !== undefined && (prop.isUnique || prop.isGenerated);
544
- });
545
- if (!hasUniqueOrId)
546
- throw new OGMError(`upsert "where" must contain at least one property marked with @id or @unique. ` +
547
- `Got [${mergeKeyNames.map((n) => `"${n}"`).join(', ')}] — none of these are unique on ${nodeDef.typeName}. ` +
548
- `Without a unique key, MERGE can fan out across multiple existing nodes (applying ON MATCH SET to each) ` +
549
- `or create phantom properties on typo. If you really want a non-unique merge, use create() + update().`);
541
+ throw new OGMError(`upsert requires at least one scalar property in "where" for MERGE key: ` +
542
+ `an @id or @unique field of ${nodeDef.typeName}.`);
550
543
  lines.push(`MERGE (n:${labelStr} { ${mergeProps.join(', ')} })`);
551
544
  // ON CREATE SET — all properties from create input (scalar only)
552
545
  const createSets = [];
@@ -559,6 +552,7 @@ export class MutationCompiler {
559
552
  throw upsertRelationshipError(nodeDef, key, 'create');
560
553
  }
561
554
  assertSafePropertyName(key, 'create property');
555
+ assertKnownField(nodeDef, key, 'create');
562
556
  const propDef = nodeDef.properties.get(key);
563
557
  const paramName = `onCreate_${key}`;
564
558
  const valueExpr = wrapWriteExpr(`$${paramName}`, value, propDef);
@@ -609,6 +603,7 @@ export class MutationCompiler {
609
603
  throw upsertRelationshipError(nodeDef, key, 'update');
610
604
  }
611
605
  assertSafePropertyName(key, 'update property');
606
+ assertKnownField(nodeDef, key, 'update');
612
607
  const propDef = nodeDef.properties.get(key);
613
608
  const paramName = `onMatch_${key}`;
614
609
  const valueExpr = wrapWriteExpr(`$${paramName}`, value, propDef);
@@ -682,16 +677,13 @@ export class MutationCompiler {
682
677
  for (const key of Object.keys(item)) {
683
678
  if (item[key] === undefined || scalarKeys.includes(key))
684
679
  continue;
685
- if (nodeDef.relationships.has(key)) {
686
- // Only the first item's relationship fields have ever been
687
- // rejected; in later items they were (and still are) skipped
688
- // unwritten. Rejecting them everywhere would make calls that
689
- // succeed today throw — tracked as a separate, breaking change.
690
- if (index > 0)
691
- continue;
692
- throw new OGMError(`createMany does not support relationship fields. Found: "${key}". Use create() for nested operations.`);
693
- }
680
+ // v2.5.0 — rejected in EVERY item. Pre-2.5.0 only the first item's
681
+ // relationship fields were; in later items the nested input was
682
+ // skipped unwritten.
683
+ if (nodeDef.relationships.has(key))
684
+ throw new OGMError(`createMany does not support relationship fields. Found: "${key}" in data[${index}]. Use create() for nested operations.`);
694
685
  assertSafePropertyName(key, 'createMany property');
686
+ assertKnownField(nodeDef, key, 'createMany');
695
687
  scalarKeys.push(key);
696
688
  }
697
689
  // Identify @id (generated) fields that are NOT provided in data
@@ -823,6 +815,7 @@ export class MutationCompiler {
823
815
  if (value === undefined)
824
816
  continue;
825
817
  assertSafePropertyName(key, 'create property');
818
+ assertKnownField(nodeDef, key, 'create');
826
819
  const propDef = nodeDef.properties.get(key);
827
820
  const paramName = `${prefix}_${key}`;
828
821
  const valueExpr = wrapWriteExpr(`$${paramName}`, value, propDef);
@@ -1667,6 +1660,7 @@ export class MutationCompiler {
1667
1660
  if (val === undefined)
1668
1661
  continue;
1669
1662
  assertSafePropertyName(prop, 'nested update property');
1663
+ assertKnownField(targetNodeDef, prop, 'nested update');
1670
1664
  const nodePropDef = targetNodeDef.properties.get(prop);
1671
1665
  const paramName = `${itemPrefix}_set_${prop}`;
1672
1666
  setClauses.push(`${updateVar}.${escapeIdentifier(prop)} = ${wrapWriteExpr(`$${paramName}`, val, nodePropDef)}`);
@@ -1969,6 +1963,18 @@ export function unwrapAbstractCreateNode(nodeSpec, target, fieldName) {
1969
1963
  `e.g. { node: { ${target.members[0] ?? 'Member'}: { … } } }. Allowed: ${target.members.map((m) => `"${m}"`).join(', ')}.`);
1970
1964
  return [keys[0], nodeSpec[keys[0]]];
1971
1965
  }
1966
+ /**
1967
+ * Reject a write key that is neither a property nor a relationship of the
1968
+ * type (v2.5.0). Pre-2.5.0 only its spelling was checked, so a typo
1969
+ * (`nmae`) was stored as a stray property and the intended field was left
1970
+ * untouched — at every depth (nested creates and updates included).
1971
+ */
1972
+ function assertKnownField(nodeDef, key, input) {
1973
+ if (nodeDef.properties.has(key) || nodeDef.relationships.has(key))
1974
+ return;
1975
+ throw new OGMError(`Unknown field "${key}" in the ${input} input of ${nodeDef.typeName}: it is neither a property nor a ` +
1976
+ `relationship of the type. Declare it in the schema, or fix the key.`);
1977
+ }
1972
1978
  /**
1973
1979
  * MERGE writes scalars only. Pre-2.4.8 a relationship field in an upsert's
1974
1980
  * `create` / `update` was skipped, so its nested connect / create never