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.
- package/CHANGELOG.md +58 -0
- package/README.md +20 -6
- package/dist/cjs/compilers/mutation.compiler.d.ts.map +1 -1
- package/dist/cjs/compilers/mutation.compiler.js +48 -42
- package/dist/cjs/compilers/mutation.compiler.js.map +1 -1
- package/dist/cjs/compilers/selection.compiler.d.ts +16 -0
- package/dist/cjs/compilers/selection.compiler.d.ts.map +1 -1
- package/dist/cjs/compilers/selection.compiler.js +158 -18
- package/dist/cjs/compilers/selection.compiler.js.map +1 -1
- package/dist/cjs/generator/type-emitters/where-emitter.js +16 -0
- package/dist/cjs/generator/type-emitters/where-emitter.js.map +1 -1
- package/dist/cjs/interface-model.d.ts +12 -0
- package/dist/cjs/interface-model.d.ts.map +1 -1
- package/dist/cjs/interface-model.js +21 -13
- package/dist/cjs/interface-model.js.map +1 -1
- package/dist/cjs/model.d.ts.map +1 -1
- package/dist/cjs/model.js +6 -0
- package/dist/cjs/model.js.map +1 -1
- package/dist/cjs/subgraph/subgraph-operations.d.ts.map +1 -1
- package/dist/cjs/subgraph/subgraph-operations.js +71 -6
- package/dist/cjs/subgraph/subgraph-operations.js.map +1 -1
- package/dist/cjs/subgraph/types.d.ts +14 -0
- package/dist/cjs/subgraph/types.d.ts.map +1 -1
- package/dist/cjs/testing/cypher-assert.d.ts +19 -1
- package/dist/cjs/testing/cypher-assert.d.ts.map +1 -1
- package/dist/cjs/testing/cypher-assert.js +192 -11
- package/dist/cjs/testing/cypher-assert.js.map +1 -1
- package/dist/cjs/testing/neo4j-record-factory.d.ts +8 -4
- package/dist/cjs/testing/neo4j-record-factory.d.ts.map +1 -1
- package/dist/cjs/testing/neo4j-record-factory.js +18 -7
- package/dist/cjs/testing/neo4j-record-factory.js.map +1 -1
- package/dist/esm/compilers/mutation.compiler.d.ts.map +1 -1
- package/dist/esm/compilers/mutation.compiler.js +48 -42
- package/dist/esm/compilers/mutation.compiler.js.map +1 -1
- package/dist/esm/compilers/selection.compiler.d.ts +16 -0
- package/dist/esm/compilers/selection.compiler.d.ts.map +1 -1
- package/dist/esm/compilers/selection.compiler.js +160 -20
- package/dist/esm/compilers/selection.compiler.js.map +1 -1
- package/dist/esm/generator/type-emitters/where-emitter.js +16 -0
- package/dist/esm/generator/type-emitters/where-emitter.js.map +1 -1
- package/dist/esm/interface-model.d.ts +12 -0
- package/dist/esm/interface-model.d.ts.map +1 -1
- package/dist/esm/interface-model.js +21 -13
- package/dist/esm/interface-model.js.map +1 -1
- package/dist/esm/model.d.ts.map +1 -1
- package/dist/esm/model.js +6 -0
- package/dist/esm/model.js.map +1 -1
- package/dist/esm/subgraph/subgraph-operations.d.ts.map +1 -1
- package/dist/esm/subgraph/subgraph-operations.js +71 -6
- package/dist/esm/subgraph/subgraph-operations.js.map +1 -1
- package/dist/esm/subgraph/types.d.ts +14 -0
- package/dist/esm/subgraph/types.d.ts.map +1 -1
- package/dist/esm/testing/cypher-assert.d.ts +19 -1
- package/dist/esm/testing/cypher-assert.d.ts.map +1 -1
- package/dist/esm/testing/cypher-assert.js +192 -11
- package/dist/esm/testing/cypher-assert.js.map +1 -1
- package/dist/esm/testing/neo4j-record-factory.d.ts +8 -4
- package/dist/esm/testing/neo4j-record-factory.d.ts.map +1 -1
- package/dist/esm/testing/neo4j-record-factory.js +18 -7
- package/dist/esm/testing/neo4j-record-factory.js.map +1 -1
- 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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
|
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
|
-
|
|
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 (!
|
|
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":";;;AAAA;;;;;;;;;GASG;AACH,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAU,EAAE,EAAE;QAChD,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;QAC5D,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,MAAM,MAAM,GAA4B,EAAE,CAAC;YAC3C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;gBACnC,MAAM,CAAC,CAAC,CAAC,GAAI,CAA6B,CAAC,CAAC,CAAC,CAAC;YAChD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC;
|
|
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
|
-
*
|
|
26
|
-
*
|
|
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.
|
|
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.
|
|
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
|
|
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
|
-
*
|
|
79
|
-
*
|
|
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
|
-
//
|
|
84
|
-
|
|
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
|
-
:
|
|
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.
|
|
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.
|
|
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":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EACL,cAAc,EAGd,cAAc,EACf,MAAM,iBAAiB,CAAC;AAqBzB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAgDD;;GAEG;AACH,qBAAa,gBAAgB;IAmBzB,OAAO,CAAC,MAAM;IAlBhB;;;OAGG;IACH,OAAO,CAAC,UAAU,CAA6B;IAE/C,OAAO,CAAC,MAAM,CAAC,CAAY;IAE3B;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB,CAAC,CAAgB;gBAGlC,MAAM,EAAE,cAAc,EAC9B,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,SAAS,CAAC;QAAC,aAAa,CAAC,EAAE,aAAa,CAAA;KAAE;IAMjE;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,OAAO,CAAC,0BAA0B;IAuDlC,OAAO,CAAC,sBAAsB;IAU9B;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,kBAAkB;IA+B1B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,yBAAyB;IA6BjC;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAQxB,8EAA8E;IAC9E,WAAW,IAAI,IAAI;IAInB,OAAO,CAAC,oBAAoB;IAQ5B;;;;;;OAMG;IACH,OAAO,CAAC,WAAW;IAqBnB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IASxB;;;OAGG;IACH,aAAa,CACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EACjC,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,MAAM,EAAE;IACjB;;;;OAIG;IACH,aAAa,CAAC,EAAE,mBAAmB;IACnC;;;OAGG;IACH,YAAY,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAC/B,cAAc;
|
|
1
|
+
{"version":3,"file":"mutation.compiler.d.ts","sourceRoot":"","sources":["../../../src/compilers/mutation.compiler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EACL,cAAc,EAGd,cAAc,EACf,MAAM,iBAAiB,CAAC;AAqBzB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAgDD;;GAEG;AACH,qBAAa,gBAAgB;IAmBzB,OAAO,CAAC,MAAM;IAlBhB;;;OAGG;IACH,OAAO,CAAC,UAAU,CAA6B;IAE/C,OAAO,CAAC,MAAM,CAAC,CAAY;IAE3B;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB,CAAC,CAAgB;gBAGlC,MAAM,EAAE,cAAc,EAC9B,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,SAAS,CAAC;QAAC,aAAa,CAAC,EAAE,aAAa,CAAA;KAAE;IAMjE;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,OAAO,CAAC,0BAA0B;IAuDlC,OAAO,CAAC,sBAAsB;IAU9B;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,kBAAkB;IA+B1B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,yBAAyB;IA6BjC;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAQxB,8EAA8E;IAC9E,WAAW,IAAI,IAAI;IAInB,OAAO,CAAC,oBAAoB;IAQ5B;;;;;;OAMG;IACH,OAAO,CAAC,WAAW;IAqBnB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IASxB;;;OAGG;IACH,aAAa,CACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EACjC,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,MAAM,EAAE;IACjB;;;;OAIG;IACH,aAAa,CAAC,EAAE,mBAAmB;IACnC;;;OAGG;IACH,YAAY,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAC/B,cAAc;IA+DjB;;OAEG;IACH,aAAa,CACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC3C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC5C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC/C,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE;QACX,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,EACD,MAAM,CAAC,EAAE,MAAM,EAAE,EACjB,UAAU,GAAE,MAAM,GAAG,OAAgB;IACrC;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,mBAAmB;IACnC;;;;OAIG;IACH,YAAY,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAC/B,cAAc;IAsFjB;;;;;;;;OAQG;IACH,aAAa,CACX,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE;QACX,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,EACD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACrC,+DAA+D;IAC/D,aAAa,CAAC,EAAE,mBAAmB;IACnC,gEAAgE;IAChE,YAAY,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAC/B,cAAc;IA+CjB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,iBAAiB;IAgFzB;;;OAGG;IACH,YAAY,CACV,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,MAAM,EAAE,GAChB,cAAc;IA2HjB;;OAEG;IACH,gBAAgB,CACd,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE;QACX,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,EACD,SAAS,CAAC,EAAE,MAAM,EAAE,EACpB,YAAY,CAAC,EAAE,MAAM,EAAE,GACtB,cAAc;IA2CjB;;;;OAIG;IACH,iBAAiB,CACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC/B,OAAO,EAAE,cAAc,EACvB,cAAc,CAAC,EAAE,OAAO,EACxB,MAAM,CAAC,EAAE,MAAM,EAAE,GAChB,cAAc;IAmLjB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,qBAAqB;IA4C7B,OAAO,CAAC,wBAAwB;IAgFhC;;;OAGG;IACH,OAAO,CAAC,iCAAiC;IA6KzC;;;;;;;OAOG;IACH,OAAO,CAAC,aAAa;IAqDrB;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IA0LxB;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,gBAAgB;IAuHxB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAsDxB;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IAsC7B,yEAAyE;IACzE,OAAO,CAAC,mBAAmB;IAoI3B;;;;;OAKG;IACH,OAAO,CAAC,eAAe,CAAyC;IAEhE,OAAO,CAAC,cAAc;IAStB,0EAA0E;IAC1E,OAAO,CAAC,kBAAkB;IAO1B;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IA4C9B;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAofhC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAcvC;IAEF;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,6BAA6B;IAkCrC,OAAO,CAAC,qBAAqB;CAQ9B;AAoBD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiDzB;AAED,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,cAAc,GACrB,cAAc,GAAG,IAAI,CAiBvB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,MAAM,GAChB,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,CAyB5B;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,OAAO,EACjB,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,MAAM,GAChB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAenC"}
|
|
@@ -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
|
-
|
|
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
|
-
//
|
|
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
|
|
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(
|
|
527
|
-
|
|
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
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
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
|