grafeo-ogm 2.0.0 → 2.1.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 +77 -0
- package/dist/cjs/compilers/mutation.compiler.d.ts +7 -0
- package/dist/cjs/compilers/mutation.compiler.d.ts.map +1 -1
- package/dist/cjs/compilers/mutation.compiler.js +130 -36
- package/dist/cjs/compilers/mutation.compiler.js.map +1 -1
- package/dist/cjs/compilers/where.compiler.d.ts.map +1 -1
- package/dist/cjs/compilers/where.compiler.js +13 -4
- package/dist/cjs/compilers/where.compiler.js.map +1 -1
- package/dist/cjs/generator/type-emitters/utility-types.js +1 -1
- package/dist/cjs/utils/write-coercion.d.ts +61 -0
- package/dist/cjs/utils/write-coercion.d.ts.map +1 -0
- package/dist/cjs/utils/write-coercion.js +213 -0
- package/dist/cjs/utils/write-coercion.js.map +1 -0
- package/dist/esm/compilers/mutation.compiler.d.ts +7 -0
- package/dist/esm/compilers/mutation.compiler.d.ts.map +1 -1
- package/dist/esm/compilers/mutation.compiler.js +130 -36
- package/dist/esm/compilers/mutation.compiler.js.map +1 -1
- package/dist/esm/compilers/where.compiler.d.ts.map +1 -1
- package/dist/esm/compilers/where.compiler.js +13 -4
- package/dist/esm/compilers/where.compiler.js.map +1 -1
- package/dist/esm/generator/type-emitters/utility-types.js +1 -1
- package/dist/esm/utils/write-coercion.d.ts +61 -0
- package/dist/esm/utils/write-coercion.d.ts.map +1 -0
- package/dist/esm/utils/write-coercion.js +206 -0
- package/dist/esm/utils/write-coercion.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { int, isInt } from 'neo4j-driver';
|
|
2
|
+
import { OGMError } from '../errors';
|
|
3
|
+
/**
|
|
4
|
+
* GraphQL scalar types whose Neo4j storage type is INTEGER (Long).
|
|
5
|
+
*/
|
|
6
|
+
const INTEGER_SCALAR_TYPES = new Set(['Int', 'BigInt']);
|
|
7
|
+
/**
|
|
8
|
+
* Temporal scalar types → the Cypher constructor that parses their ISO
|
|
9
|
+
* string form into the native Neo4j temporal type. Writes wrap the
|
|
10
|
+
* *parameter* in the constructor instead of converting the value in JS,
|
|
11
|
+
* because Neo4j's own parsers handle everything JS `Date` cannot:
|
|
12
|
+
* nanosecond precision, bracket timezone names
|
|
13
|
+
* (`2024-01-15T10:30:00[America/New_York]`), and ISO-8601 durations.
|
|
14
|
+
*/
|
|
15
|
+
const TEMPORAL_CONSTRUCTORS = {
|
|
16
|
+
DateTime: 'datetime',
|
|
17
|
+
LocalDateTime: 'localdatetime',
|
|
18
|
+
Date: 'date',
|
|
19
|
+
Time: 'time',
|
|
20
|
+
LocalTime: 'localtime',
|
|
21
|
+
Duration: 'duration',
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Where-operator suffixes whose parameter is compared against the field
|
|
25
|
+
* value (`''` = plain equality) and therefore needs the same temporal
|
|
26
|
+
* constructor treatment as writes. String operators (`_CONTAINS`,
|
|
27
|
+
* `_STARTS_WITH`, `_MATCHES`, ...) are excluded — their params are
|
|
28
|
+
* strings by definition.
|
|
29
|
+
*/
|
|
30
|
+
const TEMPORAL_COMPARABLE_SUFFIXES = new Set([
|
|
31
|
+
'',
|
|
32
|
+
'_NOT',
|
|
33
|
+
'_GT',
|
|
34
|
+
'_GTE',
|
|
35
|
+
'_LT',
|
|
36
|
+
'_LTE',
|
|
37
|
+
'_IN',
|
|
38
|
+
'_NOT_IN',
|
|
39
|
+
]);
|
|
40
|
+
/**
|
|
41
|
+
* Coerce a JS write value bound for an `Int`/`BigInt`-typed schema field
|
|
42
|
+
* into a Neo4j Integer so the stored property is a Long, not a Double.
|
|
43
|
+
*
|
|
44
|
+
* The driver packs EVERY JS `number` as a Bolt FLOAT64 (packstream:
|
|
45
|
+
* `typeof x === 'number'` → `packFloat`) — `disableLosslessIntegers`
|
|
46
|
+
* only affects the read direction. Reads convert Integer → number
|
|
47
|
+
* (ResultMapper), so without write-side coercion the round-trip is
|
|
48
|
+
* asymmetric: every OGM-written Int property lands as a Double. Once a
|
|
49
|
+
* field holds a mixed Long/Double population, Long-typed consumers break
|
|
50
|
+
* (e.g. `apoc.coll.sortMulti` throws `java.lang.Double cannot be cast to
|
|
51
|
+
* class java.lang.Long`).
|
|
52
|
+
*
|
|
53
|
+
* Non-integral numbers and non-integer strings for Int/BigInt fields
|
|
54
|
+
* throw instead of truncating or storing a String property, matching the
|
|
55
|
+
* v1.14 contract of rejecting inputs that would be silently corrupted.
|
|
56
|
+
* Values the coercion doesn't own — null/undefined, driver Integer
|
|
57
|
+
* instances, fields of any other scalar type, or fields absent from the
|
|
58
|
+
* schema — pass through untouched.
|
|
59
|
+
*/
|
|
60
|
+
export function coerceWriteValue(value, propDef) {
|
|
61
|
+
if (propDef === undefined || value === null || value === undefined)
|
|
62
|
+
return value;
|
|
63
|
+
if (!INTEGER_SCALAR_TYPES.has(propDef.type))
|
|
64
|
+
return value;
|
|
65
|
+
if (propDef.isArray) {
|
|
66
|
+
if (!Array.isArray(value))
|
|
67
|
+
return value;
|
|
68
|
+
return value.map((element) => coerceIntegerElement(element, propDef));
|
|
69
|
+
}
|
|
70
|
+
return coerceIntegerElement(value, propDef);
|
|
71
|
+
}
|
|
72
|
+
function coerceIntegerElement(value, propDef) {
|
|
73
|
+
if (value === null || value === undefined)
|
|
74
|
+
return value;
|
|
75
|
+
// `int()` accepts strings in every driver major — `toString()` keeps
|
|
76
|
+
// bigint inputs working regardless of the installed driver's overloads.
|
|
77
|
+
if (typeof value === 'bigint')
|
|
78
|
+
return int(value.toString());
|
|
79
|
+
if (typeof value === 'number') {
|
|
80
|
+
if (!Number.isInteger(value))
|
|
81
|
+
throw new OGMError(`Expected an integer for ${propDef.type} field "${propDef.name}" but got ${value}. ` +
|
|
82
|
+
`Storing it would corrupt the property's integer type; pass a whole number ` +
|
|
83
|
+
`(or declare the field as Float).`);
|
|
84
|
+
return int(value);
|
|
85
|
+
}
|
|
86
|
+
if (typeof value === 'string') {
|
|
87
|
+
// The generated BigInt scalar declares `input: string` (64-bit values
|
|
88
|
+
// don't fit a JS number), so integer strings are the CANONICAL input
|
|
89
|
+
// shape for BigInt fields — binding them raw would store a String
|
|
90
|
+
// property. Same reject-don't-corrupt rule as numbers for anything
|
|
91
|
+
// that isn't a plain base-10 integer literal.
|
|
92
|
+
if (!/^-?\d+$/.test(value))
|
|
93
|
+
throw new OGMError(`Expected an integer for ${propDef.type} field "${propDef.name}" but got the string "${value}". ` +
|
|
94
|
+
`Pass a base-10 integer literal string, a whole number, or a bigint.`);
|
|
95
|
+
return int(value);
|
|
96
|
+
}
|
|
97
|
+
// Already a driver Integer — pass through unchanged.
|
|
98
|
+
if (isInt(value))
|
|
99
|
+
return value;
|
|
100
|
+
return value;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Wrap a write RHS expression (`$param`, or an UNWIND item reference) in
|
|
104
|
+
* the field's temporal Cypher constructor, so ISO-string inputs are
|
|
105
|
+
* stored as native temporal properties instead of Strings. Reads convert
|
|
106
|
+
* native temporals → ISO strings (ResultMapper), so this is the write
|
|
107
|
+
* half of the same round-trip symmetry issue #5 fixed for integers.
|
|
108
|
+
*
|
|
109
|
+
* Only string values are wrapped — a driver temporal object already
|
|
110
|
+
* packs natively and binds raw. Temporal LIST fields wrap element-wise
|
|
111
|
+
* via a list comprehension when any element is a string.
|
|
112
|
+
*/
|
|
113
|
+
export function wrapTemporalWriteExpr(expr, value, propDef) {
|
|
114
|
+
if (propDef === undefined)
|
|
115
|
+
return expr;
|
|
116
|
+
const ctor = TEMPORAL_CONSTRUCTORS[propDef.type];
|
|
117
|
+
if (ctor === undefined)
|
|
118
|
+
return expr;
|
|
119
|
+
if (propDef.isArray) {
|
|
120
|
+
if (!Array.isArray(value) || !value.some((el) => typeof el === 'string'))
|
|
121
|
+
return expr;
|
|
122
|
+
return `[wc_t IN ${expr} | ${ctor}(wc_t)]`;
|
|
123
|
+
}
|
|
124
|
+
if (typeof value !== 'string')
|
|
125
|
+
return expr;
|
|
126
|
+
return `${ctor}(${expr})`;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Temporal wrapping for UNWIND item references (`item.prop`,
|
|
130
|
+
* `connItem.edge.prop`), where ONE Cypher expression serves EVERY item in
|
|
131
|
+
* the batch: the wrap decision must hold for all items' values for the
|
|
132
|
+
* key. A mixed string/non-string column throws — a single expression
|
|
133
|
+
* cannot be correct for both representations.
|
|
134
|
+
*/
|
|
135
|
+
export function wrapTemporalListItemExpr(expr, values, propDef) {
|
|
136
|
+
if (propDef === undefined)
|
|
137
|
+
return expr;
|
|
138
|
+
const ctor = TEMPORAL_CONSTRUCTORS[propDef.type];
|
|
139
|
+
if (ctor === undefined)
|
|
140
|
+
return expr;
|
|
141
|
+
const defined = values.filter((v) => v !== null && v !== undefined);
|
|
142
|
+
if (defined.length === 0)
|
|
143
|
+
return expr;
|
|
144
|
+
if (propDef.isArray) {
|
|
145
|
+
const anyString = defined.some((v) => Array.isArray(v) && v.some((el) => typeof el === 'string'));
|
|
146
|
+
return anyString ? `[wc_t IN ${expr} | ${ctor}(wc_t)]` : expr;
|
|
147
|
+
}
|
|
148
|
+
const stringCount = defined.filter((v) => typeof v === 'string').length;
|
|
149
|
+
if (stringCount === 0)
|
|
150
|
+
return expr;
|
|
151
|
+
if (stringCount !== defined.length)
|
|
152
|
+
throw new OGMError(`Mixed input types for ${propDef.type} field "${propDef.name}": some items pass ISO ` +
|
|
153
|
+
`strings, others pass non-string values. Batched writes share one Cypher expression ` +
|
|
154
|
+
`per field, so every item must use the same representation.`);
|
|
155
|
+
return `${ctor}(${expr})`;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Wrap a WHERE parameter reference for a temporal field. With properties
|
|
159
|
+
* stored as native temporals, comparing them to a raw string param is a
|
|
160
|
+
* cross-type comparison — Neo4j evaluates it to NULL and silently drops
|
|
161
|
+
* the row. `suffix` is the operator suffix (`''` for plain equality);
|
|
162
|
+
* only comparison-shaped operators wrap, and `_IN`/`_NOT_IN` wrap their
|
|
163
|
+
* list param element-wise.
|
|
164
|
+
*/
|
|
165
|
+
export function wrapTemporalWhereParam(paramRef, value, propDef, suffix) {
|
|
166
|
+
if (propDef === undefined)
|
|
167
|
+
return paramRef;
|
|
168
|
+
const ctor = TEMPORAL_CONSTRUCTORS[propDef.type];
|
|
169
|
+
if (ctor === undefined)
|
|
170
|
+
return paramRef;
|
|
171
|
+
if (!TEMPORAL_COMPARABLE_SUFFIXES.has(suffix))
|
|
172
|
+
return paramRef;
|
|
173
|
+
if (suffix === '_IN' || suffix === '_NOT_IN') {
|
|
174
|
+
if (!Array.isArray(value) || !value.some((el) => typeof el === 'string'))
|
|
175
|
+
return paramRef;
|
|
176
|
+
return `[wc_t IN ${paramRef} | ${ctor}(wc_t)]`;
|
|
177
|
+
}
|
|
178
|
+
if (typeof value !== 'string')
|
|
179
|
+
return paramRef;
|
|
180
|
+
return `${ctor}(${paramRef})`;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Materialize a parsed `@default` into a driver-ready bound value. The
|
|
184
|
+
* parser stores every default as a string (`'true'`, `'5'`, `'WELCOME'`);
|
|
185
|
+
* conversion is by declared scalar type, and Int/BigInt defaults route
|
|
186
|
+
* through the same Integer coercion as user input. Temporal defaults stay
|
|
187
|
+
* ISO strings here — they get their constructor wrapper at the binding
|
|
188
|
+
* site like any other temporal write.
|
|
189
|
+
*/
|
|
190
|
+
export function resolveDefaultWriteValue(propDef) {
|
|
191
|
+
const raw = propDef.defaultValue;
|
|
192
|
+
if (raw === undefined)
|
|
193
|
+
return undefined;
|
|
194
|
+
switch (propDef.type) {
|
|
195
|
+
case 'Boolean':
|
|
196
|
+
return raw === 'true';
|
|
197
|
+
case 'Float':
|
|
198
|
+
return Number(raw);
|
|
199
|
+
case 'Int':
|
|
200
|
+
case 'BigInt':
|
|
201
|
+
return coerceWriteValue(raw, propDef);
|
|
202
|
+
default:
|
|
203
|
+
return raw;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=write-coercion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-coercion.js","sourceRoot":"","sources":["../../../src/utils/write-coercion.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "grafeo-ogm",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "Type-safe Neo4j ORM / OGM for TypeScript. Define your graph in GraphQL SDL, get fully typed Prisma-like CRUD, optimized Cypher, and zero-config code generation. Community successor to @neo4j/graphql-ogm.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Alejandro Guzman",
|