grafeo-ogm 1.3.1 → 1.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 +51 -0
- package/dist/cjs/generator/type-emitters/model-map-emitter.d.ts +3 -1
- package/dist/cjs/generator/type-emitters/model-map-emitter.d.ts.map +1 -1
- package/dist/cjs/generator/type-emitters/model-map-emitter.js +13 -5
- package/dist/cjs/generator/type-emitters/model-map-emitter.js.map +1 -1
- package/dist/cjs/generator/type-emitters/sort-options-emitter.d.ts +4 -3
- package/dist/cjs/generator/type-emitters/sort-options-emitter.d.ts.map +1 -1
- package/dist/cjs/generator/type-emitters/sort-options-emitter.js +54 -16
- package/dist/cjs/generator/type-emitters/sort-options-emitter.js.map +1 -1
- package/dist/cjs/interface-model.d.ts +10 -10
- package/dist/cjs/interface-model.d.ts.map +1 -1
- package/dist/cjs/interface-model.js +28 -19
- package/dist/cjs/interface-model.js.map +1 -1
- package/dist/cjs/model.d.ts +10 -10
- package/dist/cjs/model.d.ts.map +1 -1
- package/dist/cjs/model.js +23 -16
- package/dist/cjs/model.js.map +1 -1
- package/dist/cjs/ogm.d.ts +10 -4
- package/dist/cjs/ogm.d.ts.map +1 -1
- package/dist/cjs/ogm.js.map +1 -1
- package/dist/cjs/schema/parser.d.ts.map +1 -1
- package/dist/cjs/schema/parser.js +8 -0
- package/dist/cjs/schema/parser.js.map +1 -1
- package/dist/cjs/schema/types.d.ts +2 -0
- package/dist/cjs/schema/types.d.ts.map +1 -1
- package/dist/cjs/utils/cypher-sort-projection.d.ts +44 -0
- package/dist/cjs/utils/cypher-sort-projection.d.ts.map +1 -0
- package/dist/cjs/utils/cypher-sort-projection.js +79 -0
- package/dist/cjs/utils/cypher-sort-projection.js.map +1 -0
- package/dist/esm/generator/type-emitters/model-map-emitter.d.ts +3 -1
- package/dist/esm/generator/type-emitters/model-map-emitter.d.ts.map +1 -1
- package/dist/esm/generator/type-emitters/model-map-emitter.js +13 -5
- package/dist/esm/generator/type-emitters/model-map-emitter.js.map +1 -1
- package/dist/esm/generator/type-emitters/sort-options-emitter.d.ts +4 -3
- package/dist/esm/generator/type-emitters/sort-options-emitter.d.ts.map +1 -1
- package/dist/esm/generator/type-emitters/sort-options-emitter.js +54 -16
- package/dist/esm/generator/type-emitters/sort-options-emitter.js.map +1 -1
- package/dist/esm/interface-model.d.ts +10 -10
- package/dist/esm/interface-model.d.ts.map +1 -1
- package/dist/esm/interface-model.js +29 -20
- package/dist/esm/interface-model.js.map +1 -1
- package/dist/esm/model.d.ts +10 -10
- package/dist/esm/model.d.ts.map +1 -1
- package/dist/esm/model.js +24 -17
- package/dist/esm/model.js.map +1 -1
- package/dist/esm/ogm.d.ts +10 -4
- package/dist/esm/ogm.d.ts.map +1 -1
- package/dist/esm/ogm.js.map +1 -1
- package/dist/esm/schema/parser.d.ts.map +1 -1
- package/dist/esm/schema/parser.js +8 -0
- package/dist/esm/schema/parser.js.map +1 -1
- package/dist/esm/schema/types.d.ts +2 -0
- package/dist/esm/schema/types.d.ts.map +1 -1
- package/dist/esm/utils/cypher-sort-projection.d.ts +44 -0
- package/dist/esm/utils/cypher-sort-projection.d.ts.map +1 -0
- package/dist/esm/utils/cypher-sort-projection.js +75 -0
- package/dist/esm/utils/cypher-sort-projection.js.map +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,56 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.5.0 (2026-04-30)
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- **Sort by `@cypher` scalar fields** — `find()` / `findFirst()` / `findFirstOrThrow()` now resolve `@cypher` scalar fields at runtime when used in `options.sort`, instead of silently sorting against `NULL`. Each `@cypher` sort is compiled into a `CALL { WITH n; WITH n AS this; <user statement> }` subquery, with the projected column renamed to a unique `__sort_<field>` alias before the `RETURN`. Multi-field sort with mixed stored and `@cypher` fields works in any combination. Supports relationship-traversing statements (e.g. `MATCH (this)-[:HAS_STATUS]->(s) RETURN s.name`) — the rebound `this` variable scopes correctly inside the subquery without text substitution.
|
|
8
|
+
|
|
9
|
+
### Codegen
|
|
10
|
+
|
|
11
|
+
- **`<Type>Sort` now includes scalar-returning `@cypher` fields** — the per-node and per-interface `Sort` types emit a `<field>?: InputMaybe<SortDirection>` for any `@cypher` field whose declared return type is a sortable scalar (`ID`, `String`, `Int`, `Float`, `Boolean`, `BigInt`, `Date`, `Time`, `LocalTime`, `DateTime`, `LocalDateTime`, `Duration`, or an enum). Skips array returns, node/interface returns, and `Point` / `CartesianPoint`. Purely additive — every previous key still exists, no symbol renames, no removals.
|
|
12
|
+
|
|
13
|
+
### Schema parser
|
|
14
|
+
|
|
15
|
+
- **`@cypher(statement, columnName)` arguments are now captured.** `PropertyDefinition` gains two optional fields: `cypherStatement` (the verbatim subquery body) and `cypherColumnName` (the column to project). `cypherColumnName` defaults to the GraphQL field name at runtime when omitted, matching the `@neo4j/graphql` v4+ convention.
|
|
16
|
+
|
|
17
|
+
### Internal
|
|
18
|
+
|
|
19
|
+
- New helper `src/utils/cypher-sort-projection.ts` exporting `compileSortClause()` and `buildCypherSortProjection()`. `Model.compileOptions()` and `InterfaceModel.find()` both delegate sort compilation to it. The helper accepts a `preserveVars` array so callers can carry forward variables already in scope (e.g. `__typename` on `InterfaceModel`) across each successive `WITH`.
|
|
20
|
+
- `Model.compileOptions()` now returns `{ pre, post }` instead of a single string. `pre` (the CALL subqueries + `WITH` projections) is injected before the `RETURN`; `post` (`ORDER BY` / `SKIP` / `LIMIT`) goes after it.
|
|
21
|
+
|
|
22
|
+
### Notes & Limits
|
|
23
|
+
|
|
24
|
+
- **Sort-only.** This release implements `@cypher` resolution exclusively for `ORDER BY`. `select`, `selectionSet`, `where`, and `aggregate` continue to skip `@cypher` fields at runtime as in 1.4.0 — those use cases will be addressed in a separate release.
|
|
25
|
+
- **Pre-existing `where-emitter` footgun unchanged**: scalar `@cypher` fields are still emitted in `<Node>Where`, and the WHERE compiler still produces `n.<cypherField>` (which fails at Neo4j). This was already broken in 1.4.x and is out of scope for 1.5.0; track in a separate issue.
|
|
26
|
+
- **Statement convention.** `@cypher` statements must reference the bound node as `this` and end with `RETURN <expr> AS <columnName>` (or `RETURN <expr>` alone — the column name then defaults to the GraphQL field name). Example: `@cypher(statement: "RETURN toLower(this.drugName) AS insensitiveDrugName")`. The OGM never modifies the user's statement — `this` is rebound by the wrapping `CALL` subquery.
|
|
27
|
+
- **Stored-field sorts produce byte-identical Cypher to 1.4.0.** Only sorts that resolve to a `@cypher` field gain the new CALL/WITH machinery; everything else is unchanged.
|
|
28
|
+
- **No new generic parameters or breaking type changes.** `TSort` keeps its 1.4.0 default (`Record<string, 'ASC' | 'DESC'>`) — un-regenerated consumers continue to compile against the older `<Node>Sort` shape.
|
|
29
|
+
|
|
30
|
+
## 1.4.0 (2026-04-30)
|
|
31
|
+
|
|
32
|
+
### Features
|
|
33
|
+
|
|
34
|
+
- **Type-safe `sort` options per model** — `find()`, `findFirst()`, and `findFirstOrThrow()` now type-check the `options.sort` array against the actual node (or interface) properties. Writing `sort: [{ nonExistentField: 'ASC' }]` produces a TypeScript error instead of silently compiling. Powered by the existing per-node `<Node>Sort` types (which were emitted by the generator since v1.0 but never wired into the runtime). Also covers `InterfaceModel` via newly emitted `<Iface>Sort` / `<Iface>Options` types.
|
|
35
|
+
|
|
36
|
+
### Improvements
|
|
37
|
+
|
|
38
|
+
- `ModelInterface` and `Model` now accept `TSort` as an 11th generic parameter (default `Record<string, 'ASC' | 'DESC'>`, preserving the previous untyped behavior for callers that don't pass generics).
|
|
39
|
+
- `InterfaceModelInterface` and `InterfaceModel` accept `TSort` as a 3rd generic parameter (same default).
|
|
40
|
+
- `ogm.model<K>()` and `ogm.interfaceModel<K>()` typed overloads now derive `TSort` from `TModelMap[K]` / `TInterfaceModelMap[K]` via a new `Sort` field on each map entry. The `model<K>` overload also wires `MutationSelectFields` through (was previously defaulting to `any` despite being available on the map).
|
|
41
|
+
- The generated `<Node>Model` aliases — including the fulltext-typed override variants — now reference `<Node>Sort` directly, so autocomplete and typo-checking work in IDEs without any extra setup.
|
|
42
|
+
|
|
43
|
+
### Generator
|
|
44
|
+
|
|
45
|
+
- `sort-options-emitter.ts` now also emits `<Iface>Sort` and `<Iface>Options` for every interface in the schema (previously nodes only). Each interface's sortable fields are derived from its own scalar property declarations, skipping `@cypher` computed fields.
|
|
46
|
+
- `model-map-emitter.ts` adds `Sort: <Type>Sort;` to every `ModelMap` and `InterfaceModelMap` entry.
|
|
47
|
+
|
|
48
|
+
### Notes & Limits
|
|
49
|
+
|
|
50
|
+
- **Type-only breaking change**: code that previously compiled with invalid sort field names (e.g. typos) will now produce TypeScript errors after upgrading. This is the intended behavior — runtime semantics are unchanged. If you need the loose typing temporarily during migration, cast at the call site: `sort: [{ field: 'ASC' } as Record<string, 'ASC' | 'DESC'>]`.
|
|
51
|
+
- No runtime changes: Cypher generation, parameter binding, and execution paths are byte-for-byte identical to v1.3.1.
|
|
52
|
+
- Backwards compatible at the JS level: callers using `ogm.model<T>(name)` (single-generic overload) or `Model` without explicit type args continue to receive the loose `Record<string, 'ASC' | 'DESC'>` shape via the default.
|
|
53
|
+
|
|
3
54
|
## 1.3.1 (2026-04-21)
|
|
4
55
|
|
|
5
56
|
### Bug Fixes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-map-emitter.d.ts","sourceRoot":"","sources":["../../../../src/generator/type-emitters/model-map-emitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD
|
|
1
|
+
{"version":3,"file":"model-map-emitter.d.ts","sourceRoot":"","sources":["../../../../src/generator/type-emitters/model-map-emitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAoBpE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAiB3D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAWpE"}
|
|
@@ -19,7 +19,9 @@ const fulltext_emitter_1 = require("./fulltext-emitter");
|
|
|
19
19
|
* BookConnectInput,
|
|
20
20
|
* BookDisconnectInput,
|
|
21
21
|
* BookDeleteInput,
|
|
22
|
-
* 'books'
|
|
22
|
+
* 'books',
|
|
23
|
+
* BookMutationSelectFields,
|
|
24
|
+
* BookSort
|
|
23
25
|
* >;
|
|
24
26
|
* ```
|
|
25
27
|
*
|
|
@@ -99,7 +101,8 @@ function buildModelType(typeName, pluralName, hasRels, hasFulltext) {
|
|
|
99
101
|
` ${disconnectType},`,
|
|
100
102
|
` ${deleteType},`,
|
|
101
103
|
` '${pluralName}',`,
|
|
102
|
-
` ${typeName}MutationSelectFields
|
|
104
|
+
` ${typeName}MutationSelectFields,`,
|
|
105
|
+
` ${typeName}Sort`,
|
|
103
106
|
`>`,
|
|
104
107
|
].join('\n');
|
|
105
108
|
if (!hasFulltext)
|
|
@@ -122,12 +125,13 @@ function buildModelTypeWithTypedFulltext(typeName, baseAlias) {
|
|
|
122
125
|
// We only re-declare what we need to change. The shared parameter shapes
|
|
123
126
|
// are inlined to stay decoupled from the non-exported runtime
|
|
124
127
|
// `FindOptions`; `ExecutionContext` is imported from the package.
|
|
128
|
+
const sort = `${typeName}Sort`;
|
|
125
129
|
const findParams = `{
|
|
126
130
|
where?: ${where};
|
|
127
131
|
selectionSet?: string | DocumentNode;
|
|
128
132
|
select?: ${select};
|
|
129
133
|
labels?: string[];
|
|
130
|
-
options?: { limit?: number; offset?: number; sort?: Array
|
|
134
|
+
options?: { limit?: number; offset?: number; sort?: Array<${sort}> };
|
|
131
135
|
fulltext?: ${fulltextInput};
|
|
132
136
|
context?: ExecutionContext;
|
|
133
137
|
}`;
|
|
@@ -136,7 +140,7 @@ function buildModelTypeWithTypedFulltext(typeName, baseAlias) {
|
|
|
136
140
|
selectionSet?: string | DocumentNode;
|
|
137
141
|
select?: ${select};
|
|
138
142
|
labels?: string[];
|
|
139
|
-
options?: { offset?: number; sort?: Array
|
|
143
|
+
options?: { offset?: number; sort?: Array<${sort}> };
|
|
140
144
|
fulltext?: ${fulltextInput};
|
|
141
145
|
context?: ExecutionContext;
|
|
142
146
|
}`;
|
|
@@ -170,7 +174,8 @@ function buildInterfaceModelType(ifaceName) {
|
|
|
170
174
|
return [
|
|
171
175
|
`export type ${ifaceName}Model = InterfaceModelInterface<`,
|
|
172
176
|
` ${ifaceName},`,
|
|
173
|
-
` ${ifaceName}Where
|
|
177
|
+
` ${ifaceName}Where,`,
|
|
178
|
+
` ${ifaceName}Sort`,
|
|
174
179
|
`>;`,
|
|
175
180
|
].join('\n');
|
|
176
181
|
}
|
|
@@ -196,6 +201,7 @@ function buildModelMapEntry(typeName, pluralName, hasRels) {
|
|
|
196
201
|
` DisconnectInput: ${disconnectType};`,
|
|
197
202
|
` DeleteInput: ${deleteType};`,
|
|
198
203
|
` PluralKey: '${pluralName}';`,
|
|
204
|
+
` Sort: ${typeName}Sort;`,
|
|
199
205
|
` };`,
|
|
200
206
|
].join('\n');
|
|
201
207
|
}
|
|
@@ -211,6 +217,7 @@ function buildInterfaceAsModelMapEntry(ifaceName) {
|
|
|
211
217
|
` DisconnectInput: Record<string, never>;`,
|
|
212
218
|
` DeleteInput: Record<string, never>;`,
|
|
213
219
|
` PluralKey: never;`,
|
|
220
|
+
` Sort: ${ifaceName}Sort;`,
|
|
214
221
|
` };`,
|
|
215
222
|
].join('\n');
|
|
216
223
|
}
|
|
@@ -219,6 +226,7 @@ function buildInterfaceModelMapEntry(ifaceName) {
|
|
|
219
226
|
` ${ifaceName}: {`,
|
|
220
227
|
` Type: ${ifaceName};`,
|
|
221
228
|
` Where: ${ifaceName}Where;`,
|
|
229
|
+
` Sort: ${ifaceName}Sort;`,
|
|
222
230
|
` };`,
|
|
223
231
|
].join('\n');
|
|
224
232
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-map-emitter.js","sourceRoot":"","sources":["../../../../src/generator/type-emitters/model-map-emitter.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"model-map-emitter.js","sourceRoot":"","sources":["../../../../src/generator/type-emitters/model-map-emitter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { SchemaMetadata } from '../../schema/types';
|
|
2
2
|
/**
|
|
3
|
-
* For each node in the schema, emits
|
|
4
|
-
* `SortDirection` field per scalar
|
|
5
|
-
*
|
|
3
|
+
* For each node and interface in the schema, emits:
|
|
4
|
+
* - `<Type>Sort` — one optional `SortDirection` field per sortable scalar
|
|
5
|
+
* (stored scalars + scalar-returning `@cypher` fields)
|
|
6
|
+
* - `<Type>Options` — `limit`, `offset`, `sort` for use in find params
|
|
6
7
|
*/
|
|
7
8
|
export declare function emitSortOptions(schema: SchemaMetadata): string;
|
|
8
9
|
//# sourceMappingURL=sort-options-emitter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sort-options-emitter.d.ts","sourceRoot":"","sources":["../../../../src/generator/type-emitters/sort-options-emitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"sort-options-emitter.d.ts","sourceRoot":"","sources":["../../../../src/generator/type-emitters/sort-options-emitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAIf,MAAM,oBAAoB,CAAC;AAE5B;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAgB9D"}
|
|
@@ -2,46 +2,84 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.emitSortOptions = emitSortOptions;
|
|
4
4
|
/**
|
|
5
|
-
* For each node in the schema, emits
|
|
6
|
-
* `SortDirection` field per scalar
|
|
7
|
-
*
|
|
5
|
+
* For each node and interface in the schema, emits:
|
|
6
|
+
* - `<Type>Sort` — one optional `SortDirection` field per sortable scalar
|
|
7
|
+
* (stored scalars + scalar-returning `@cypher` fields)
|
|
8
|
+
* - `<Type>Options` — `limit`, `offset`, `sort` for use in find params
|
|
8
9
|
*/
|
|
9
10
|
function emitSortOptions(schema) {
|
|
10
11
|
const blocks = [];
|
|
11
|
-
// Process nodes in alphabetical order
|
|
12
12
|
const sortedNodes = [...schema.nodes.entries()].sort(([a], [b]) => a.localeCompare(b));
|
|
13
13
|
for (const [, node] of sortedNodes)
|
|
14
|
-
blocks.push(emitNodeSortAndOptions(node));
|
|
14
|
+
blocks.push(emitNodeSortAndOptions(node, schema));
|
|
15
|
+
const sortedInterfaces = [...schema.interfaces.entries()].sort(([a], [b]) => a.localeCompare(b));
|
|
16
|
+
for (const [, iface] of sortedInterfaces)
|
|
17
|
+
blocks.push(emitInterfaceSortAndOptions(iface, schema));
|
|
15
18
|
return blocks.join('\n\n');
|
|
16
19
|
}
|
|
17
20
|
// ---------------------------------------------------------------------------
|
|
18
21
|
// Helpers
|
|
19
22
|
// ---------------------------------------------------------------------------
|
|
20
|
-
function emitNodeSortAndOptions(node) {
|
|
21
|
-
|
|
23
|
+
function emitNodeSortAndOptions(node, schema) {
|
|
24
|
+
return emitSortAndOptionsBlock(node.typeName, getSortableProperties(node.properties, schema));
|
|
25
|
+
}
|
|
26
|
+
function emitInterfaceSortAndOptions(iface, schema) {
|
|
27
|
+
return emitSortAndOptionsBlock(iface.name, getSortableProperties(iface.properties, schema));
|
|
28
|
+
}
|
|
29
|
+
function emitSortAndOptionsBlock(typeName, sortFields) {
|
|
22
30
|
const sortMembers = sortFields
|
|
23
31
|
.map((name) => ` ${name}?: InputMaybe<SortDirection>;`)
|
|
24
32
|
.join('\n');
|
|
25
|
-
const sortType = `export type ${
|
|
26
|
-
const optionsType = `export type ${
|
|
33
|
+
const sortType = `export type ${typeName}Sort = {\n${sortMembers}\n};`;
|
|
34
|
+
const optionsType = `export type ${typeName}Options = {
|
|
27
35
|
limit?: InputMaybe<Scalars["Int"]["input"]>;
|
|
28
36
|
offset?: InputMaybe<Scalars["Int"]["input"]>;
|
|
29
|
-
sort?: InputMaybe<Array<${
|
|
37
|
+
sort?: InputMaybe<Array<${typeName}Sort>>;
|
|
30
38
|
};`;
|
|
31
39
|
return `${sortType}\n\n${optionsType}`;
|
|
32
40
|
}
|
|
33
41
|
/**
|
|
34
|
-
* Returns the names of
|
|
35
|
-
*
|
|
42
|
+
* Returns the names of properties eligible for `ORDER BY`:
|
|
43
|
+
* - Stored scalars (any non-`@cypher` property)
|
|
44
|
+
* - `@cypher` fields whose declared return type is a sortable scalar
|
|
45
|
+
* (skips `Point` / `CartesianPoint` and array returns)
|
|
46
|
+
*
|
|
47
|
+
* Preserves the insertion order of the properties map.
|
|
36
48
|
*/
|
|
37
|
-
function getSortableProperties(
|
|
49
|
+
function getSortableProperties(properties, schema) {
|
|
38
50
|
const names = [];
|
|
39
|
-
for (const [name, prop] of
|
|
40
|
-
// Skip @cypher fields — they are computed and not stored
|
|
51
|
+
for (const [name, prop] of properties) {
|
|
41
52
|
if (prop.isCypher)
|
|
42
|
-
|
|
53
|
+
if (!isCypherSortable(prop, schema))
|
|
54
|
+
continue;
|
|
43
55
|
names.push(name);
|
|
44
56
|
}
|
|
45
57
|
return names;
|
|
46
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* A `@cypher` field is sortable when it returns a single (non-array)
|
|
61
|
+
* scalar / enum value. Geo types (`Point` / `CartesianPoint`) are excluded
|
|
62
|
+
* because Cypher cannot `ORDER BY` them directly.
|
|
63
|
+
*/
|
|
64
|
+
function isCypherSortable(prop, schema) {
|
|
65
|
+
if (prop.isArray)
|
|
66
|
+
return false;
|
|
67
|
+
if (prop.type === 'Point' || prop.type === 'CartesianPoint')
|
|
68
|
+
return false;
|
|
69
|
+
return SORTABLE_SCALARS.has(prop.type) || schema.enums.has(prop.type);
|
|
70
|
+
}
|
|
71
|
+
const SORTABLE_SCALARS = new Set([
|
|
72
|
+
'ID',
|
|
73
|
+
'String',
|
|
74
|
+
'Int',
|
|
75
|
+
'Float',
|
|
76
|
+
'Boolean',
|
|
77
|
+
'BigInt',
|
|
78
|
+
'Date',
|
|
79
|
+
'Time',
|
|
80
|
+
'LocalTime',
|
|
81
|
+
'DateTime',
|
|
82
|
+
'LocalDateTime',
|
|
83
|
+
'Duration',
|
|
84
|
+
]);
|
|
47
85
|
//# sourceMappingURL=sort-options-emitter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sort-options-emitter.js","sourceRoot":"","sources":["../../../../src/generator/type-emitters/sort-options-emitter.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"sort-options-emitter.js","sourceRoot":"","sources":["../../../../src/generator/type-emitters/sort-options-emitter.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,10 +2,10 @@ import { DocumentNode } from 'graphql';
|
|
|
2
2
|
import { Driver } from 'neo4j-driver';
|
|
3
3
|
import { ExecutionContext } from './execution/executor';
|
|
4
4
|
import { InterfaceDefinition, SchemaMetadata } from './schema/types';
|
|
5
|
-
interface FindOptions {
|
|
5
|
+
interface FindOptions<TSort = Record<string, 'ASC' | 'DESC'>> {
|
|
6
6
|
limit?: number;
|
|
7
7
|
offset?: number;
|
|
8
|
-
sort?:
|
|
8
|
+
sort?: TSort[];
|
|
9
9
|
}
|
|
10
10
|
import type { QueryCompilers } from './model';
|
|
11
11
|
/**
|
|
@@ -17,11 +17,11 @@ export type InterfaceModelCompilers = QueryCompilers;
|
|
|
17
17
|
* Public-facing interface for InterfaceModel — used in generated type aliases.
|
|
18
18
|
* Excludes internal class properties so jest.Mocked<XModel> only requires find/aggregate.
|
|
19
19
|
*/
|
|
20
|
-
export interface InterfaceModelInterface<T = any, TWhere = any
|
|
20
|
+
export interface InterfaceModelInterface<T = any, TWhere = any, TSort = Record<string, 'ASC' | 'DESC'>> {
|
|
21
21
|
find(params?: {
|
|
22
22
|
where?: TWhere;
|
|
23
23
|
selectionSet?: string | DocumentNode;
|
|
24
|
-
options?: FindOptions
|
|
24
|
+
options?: FindOptions<TSort>;
|
|
25
25
|
labels?: string[];
|
|
26
26
|
context?: ExecutionContext;
|
|
27
27
|
}): Promise<(T & {
|
|
@@ -39,7 +39,7 @@ export interface InterfaceModelInterface<T = any, TWhere = any> {
|
|
|
39
39
|
findFirst?(params?: {
|
|
40
40
|
where?: TWhere;
|
|
41
41
|
selectionSet?: string | DocumentNode;
|
|
42
|
-
options?: Omit<FindOptions
|
|
42
|
+
options?: Omit<FindOptions<TSort>, 'limit'>;
|
|
43
43
|
labels?: string[];
|
|
44
44
|
context?: ExecutionContext;
|
|
45
45
|
}): Promise<(T & {
|
|
@@ -56,7 +56,7 @@ export interface InterfaceModelInterface<T = any, TWhere = any> {
|
|
|
56
56
|
findFirstOrThrow?(params?: {
|
|
57
57
|
where?: TWhere;
|
|
58
58
|
selectionSet?: string | DocumentNode;
|
|
59
|
-
options?: Omit<FindOptions
|
|
59
|
+
options?: Omit<FindOptions<TSort>, 'limit'>;
|
|
60
60
|
labels?: string[];
|
|
61
61
|
context?: ExecutionContext;
|
|
62
62
|
}): Promise<T & {
|
|
@@ -76,7 +76,7 @@ export interface InterfaceModelInterface<T = any, TWhere = any> {
|
|
|
76
76
|
context?: ExecutionContext;
|
|
77
77
|
}): Promise<number>;
|
|
78
78
|
}
|
|
79
|
-
export declare class InterfaceModel<T = Record<string, unknown>, TWhere = any
|
|
79
|
+
export declare class InterfaceModel<T = Record<string, unknown>, TWhere = any, TSort = Record<string, 'ASC' | 'DESC'>> implements InterfaceModelInterface<T, TWhere, TSort> {
|
|
80
80
|
private interfaceDef;
|
|
81
81
|
private schema;
|
|
82
82
|
private whereCompiler;
|
|
@@ -91,7 +91,7 @@ export declare class InterfaceModel<T = Record<string, unknown>, TWhere = any> i
|
|
|
91
91
|
find(params?: {
|
|
92
92
|
where?: TWhere;
|
|
93
93
|
selectionSet?: string | DocumentNode;
|
|
94
|
-
options?: FindOptions
|
|
94
|
+
options?: FindOptions<TSort>;
|
|
95
95
|
labels?: string[];
|
|
96
96
|
context?: ExecutionContext;
|
|
97
97
|
}): Promise<(T & {
|
|
@@ -109,7 +109,7 @@ export declare class InterfaceModel<T = Record<string, unknown>, TWhere = any> i
|
|
|
109
109
|
findFirst(params?: {
|
|
110
110
|
where?: TWhere;
|
|
111
111
|
selectionSet?: string | DocumentNode;
|
|
112
|
-
options?: Omit<FindOptions
|
|
112
|
+
options?: Omit<FindOptions<TSort>, 'limit'>;
|
|
113
113
|
labels?: string[];
|
|
114
114
|
context?: ExecutionContext;
|
|
115
115
|
}): Promise<(T & {
|
|
@@ -126,7 +126,7 @@ export declare class InterfaceModel<T = Record<string, unknown>, TWhere = any> i
|
|
|
126
126
|
findFirstOrThrow(params?: {
|
|
127
127
|
where?: TWhere;
|
|
128
128
|
selectionSet?: string | DocumentNode;
|
|
129
|
-
options?: Omit<FindOptions
|
|
129
|
+
options?: Omit<FindOptions<TSort>, 'limit'>;
|
|
130
130
|
labels?: string[];
|
|
131
131
|
context?: ExecutionContext;
|
|
132
132
|
}): Promise<T & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface-model.d.ts","sourceRoot":"","sources":["../../src/interface-model.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,MAAM,EAAmB,MAAM,cAAc,CAAC;AAQvD,OAAO,EAAE,gBAAgB,EAAY,MAAM,sBAAsB,CAAC;AAElE,OAAO,EACL,mBAAmB,EAEnB,cAAc,EAEf,MAAM,gBAAgB,CAAC;AASxB,UAAU,WAAW
|
|
1
|
+
{"version":3,"file":"interface-model.d.ts","sourceRoot":"","sources":["../../src/interface-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ const where_compiler_1 = require("./compilers/where.compiler");
|
|
|
9
9
|
const errors_1 = require("./errors");
|
|
10
10
|
const executor_1 = require("./execution/executor");
|
|
11
11
|
const result_mapper_1 = require("./execution/result-mapper");
|
|
12
|
+
const cypher_sort_projection_1 = require("./utils/cypher-sort-projection");
|
|
12
13
|
const validation_1 = require("./utils/validation");
|
|
13
14
|
class InterfaceModel {
|
|
14
15
|
constructor(interfaceDef, schema, driver, compilers) {
|
|
@@ -59,26 +60,34 @@ class InterfaceModel {
|
|
|
59
60
|
const returnClause = this.selectionCompiler.compile(selection, 'n', this.syntheticNodeDef, this.maxDepth, 0, allParams, paramCounter);
|
|
60
61
|
// Inject __typename into the projection: "n { .id, .name }" → "n { .id, .name, __typename: __typename }"
|
|
61
62
|
const injected = returnClause.replace(/\}$/, ', __typename: __typename }');
|
|
63
|
+
// OPTIONS — sort `pre` (CALL subqueries + WITH for `@cypher` sorts) is
|
|
64
|
+
// injected BEFORE the RETURN so the projected aliases are in scope; the
|
|
65
|
+
// WITH must preserve `__typename` (already in scope from the typename
|
|
66
|
+
// resolution step above).
|
|
67
|
+
let sortPre = '';
|
|
68
|
+
let sortOrderBy = '';
|
|
69
|
+
if (params?.options?.sort?.length) {
|
|
70
|
+
const compiled = (0, cypher_sort_projection_1.compileSortClause)({
|
|
71
|
+
sort: params.options.sort,
|
|
72
|
+
nodeVar: 'n',
|
|
73
|
+
propertyLookup: (field) => this.syntheticNodeDef.properties.get(field),
|
|
74
|
+
preserveVars: ['__typename'],
|
|
75
|
+
});
|
|
76
|
+
sortPre = compiled.pre;
|
|
77
|
+
sortOrderBy = compiled.orderBy;
|
|
78
|
+
}
|
|
79
|
+
if (sortPre)
|
|
80
|
+
cypherParts.push(sortPre);
|
|
62
81
|
cypherParts.push(`RETURN ${injected}`);
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
cypherParts.push(`ORDER BY ${sortItems.join(', ')}`);
|
|
73
|
-
}
|
|
74
|
-
if (params.options.offset !== undefined) {
|
|
75
|
-
allParams.options_offset = (0, neo4j_driver_1.int)(params.options.offset);
|
|
76
|
-
cypherParts.push(`SKIP $options_offset`);
|
|
77
|
-
}
|
|
78
|
-
if (params.options.limit !== undefined) {
|
|
79
|
-
allParams.options_limit = (0, neo4j_driver_1.int)(params.options.limit);
|
|
80
|
-
cypherParts.push(`LIMIT $options_limit`);
|
|
81
|
-
}
|
|
82
|
+
if (sortOrderBy)
|
|
83
|
+
cypherParts.push(sortOrderBy);
|
|
84
|
+
if (params?.options?.offset !== undefined) {
|
|
85
|
+
allParams.options_offset = (0, neo4j_driver_1.int)(params.options.offset);
|
|
86
|
+
cypherParts.push(`SKIP $options_offset`);
|
|
87
|
+
}
|
|
88
|
+
if (params?.options?.limit !== undefined) {
|
|
89
|
+
allParams.options_limit = (0, neo4j_driver_1.int)(params.options.limit);
|
|
90
|
+
cypherParts.push(`LIMIT $options_limit`);
|
|
82
91
|
}
|
|
83
92
|
const cypher = cypherParts.join('\n');
|
|
84
93
|
const result = await this.executor.execute(cypher, allParams, params?.context);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface-model.js","sourceRoot":"","sources":["../../src/interface-model.ts"],"names":[],"mappings":";AAAA,uDAAuD;;;AAGvD,+CAAuD;AACvD,qEAAiE;AACjE,uEAGwC;AACxC,+DAA2D;AAC3D,qCAA+C;AAC/C,mDAAkE;AAClE,6DAAyD;AAOzD,
|
|
1
|
+
{"version":3,"file":"interface-model.js","sourceRoot":"","sources":["../../src/interface-model.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/model.d.ts
CHANGED
|
@@ -8,10 +8,10 @@ import { VectorCompiler } from './compilers/vector.compiler';
|
|
|
8
8
|
import { WhereCompiler } from './compilers/where.compiler';
|
|
9
9
|
import { ExecutionContext, OGMLogger } from './execution/executor';
|
|
10
10
|
import { NodeDefinition, SchemaMetadata } from './schema/types';
|
|
11
|
-
interface FindOptions {
|
|
11
|
+
interface FindOptions<TSort = Record<string, 'ASC' | 'DESC'>> {
|
|
12
12
|
limit?: number;
|
|
13
13
|
offset?: number;
|
|
14
|
-
sort?:
|
|
14
|
+
sort?: TSort[];
|
|
15
15
|
}
|
|
16
16
|
/** A single fulltext index query entry */
|
|
17
17
|
export interface FulltextIndexEntry {
|
|
@@ -54,13 +54,13 @@ export type MutationResponse<T = any, K extends string = any> = string extends K
|
|
|
54
54
|
* Excludes internal class properties (selectionSet setter, maxDepth, etc.)
|
|
55
55
|
* so that jest.Mocked<XModel> only requires CRUD methods.
|
|
56
56
|
*/
|
|
57
|
-
export interface ModelInterface<T = any, TSelect extends Record<string, unknown> = any, TWhere extends Record<string, unknown> = any, TCreateInput extends Record<string, unknown> = any, TUpdateInput extends Record<string, unknown> = any, TConnectInput extends Record<string, unknown> = any, TDisconnectInput extends Record<string, unknown> = any, TDeleteInput extends Record<string, unknown> = any, TPluralKey extends string = any, TMutationSelect extends Record<string, unknown> = any
|
|
57
|
+
export interface ModelInterface<T = any, TSelect extends Record<string, unknown> = any, TWhere extends Record<string, unknown> = any, TCreateInput extends Record<string, unknown> = any, TUpdateInput extends Record<string, unknown> = any, TConnectInput extends Record<string, unknown> = any, TDisconnectInput extends Record<string, unknown> = any, TDeleteInput extends Record<string, unknown> = any, TPluralKey extends string = any, TMutationSelect extends Record<string, unknown> = any, TSort = Record<string, 'ASC' | 'DESC'>> {
|
|
58
58
|
find(params?: {
|
|
59
59
|
where?: TWhere;
|
|
60
60
|
selectionSet?: string | DocumentNode;
|
|
61
61
|
select?: TSelect;
|
|
62
62
|
labels?: string[];
|
|
63
|
-
options?: FindOptions
|
|
63
|
+
options?: FindOptions<TSort>;
|
|
64
64
|
fulltext?: FulltextInput;
|
|
65
65
|
context?: ExecutionContext;
|
|
66
66
|
}): Promise<T[]>;
|
|
@@ -107,7 +107,7 @@ export interface ModelInterface<T = any, TSelect extends Record<string, unknown>
|
|
|
107
107
|
selectionSet?: string | DocumentNode;
|
|
108
108
|
select?: TSelect;
|
|
109
109
|
labels?: string[];
|
|
110
|
-
options?: Omit<FindOptions
|
|
110
|
+
options?: Omit<FindOptions<TSort>, 'limit'>;
|
|
111
111
|
fulltext?: FulltextInput;
|
|
112
112
|
context?: ExecutionContext;
|
|
113
113
|
}): Promise<T | null>;
|
|
@@ -123,7 +123,7 @@ export interface ModelInterface<T = any, TSelect extends Record<string, unknown>
|
|
|
123
123
|
selectionSet?: string | DocumentNode;
|
|
124
124
|
select?: TSelect;
|
|
125
125
|
labels?: string[];
|
|
126
|
-
options?: Omit<FindOptions
|
|
126
|
+
options?: Omit<FindOptions<TSort>, 'limit'>;
|
|
127
127
|
fulltext?: FulltextInput;
|
|
128
128
|
context?: ExecutionContext;
|
|
129
129
|
}): Promise<T>;
|
|
@@ -223,7 +223,7 @@ export interface MutationCompilers {
|
|
|
223
223
|
export interface ModelCompilers extends QueryCompilers, MutationCompilers {
|
|
224
224
|
vector?: VectorCompiler;
|
|
225
225
|
}
|
|
226
|
-
export declare class Model<T = any, TSelect extends Record<string, unknown> = any, TWhere extends Record<string, unknown> = any, TCreateInput extends Record<string, unknown> = any, TUpdateInput extends Record<string, unknown> = any, TConnectInput extends Record<string, unknown> = any, TDisconnectInput extends Record<string, unknown> = any, TDeleteInput extends Record<string, unknown> = any, TPluralKey extends string = any, TMutationSelect extends Record<string, unknown> = any
|
|
226
|
+
export declare class Model<T = any, TSelect extends Record<string, unknown> = any, TWhere extends Record<string, unknown> = any, TCreateInput extends Record<string, unknown> = any, TUpdateInput extends Record<string, unknown> = any, TConnectInput extends Record<string, unknown> = any, TDisconnectInput extends Record<string, unknown> = any, TDeleteInput extends Record<string, unknown> = any, TPluralKey extends string = any, TMutationSelect extends Record<string, unknown> = any, TSort = Record<string, 'ASC' | 'DESC'>> implements ModelInterface<T, TSelect, TWhere, TCreateInput, TUpdateInput, TConnectInput, TDisconnectInput, TDeleteInput, TPluralKey, TMutationSelect, TSort> {
|
|
227
227
|
private nodeDef;
|
|
228
228
|
private schema;
|
|
229
229
|
private _selectionSet;
|
|
@@ -254,7 +254,7 @@ export declare class Model<T = any, TSelect extends Record<string, unknown> = an
|
|
|
254
254
|
selectionSet?: string | DocumentNode;
|
|
255
255
|
select?: TSelect;
|
|
256
256
|
labels?: string[];
|
|
257
|
-
options?: FindOptions
|
|
257
|
+
options?: FindOptions<TSort>;
|
|
258
258
|
fulltext?: FulltextInput;
|
|
259
259
|
context?: ExecutionContext;
|
|
260
260
|
}): Promise<T[]>;
|
|
@@ -307,7 +307,7 @@ export declare class Model<T = any, TSelect extends Record<string, unknown> = an
|
|
|
307
307
|
selectionSet?: string | DocumentNode;
|
|
308
308
|
select?: TSelect;
|
|
309
309
|
labels?: string[];
|
|
310
|
-
options?: Omit<FindOptions
|
|
310
|
+
options?: Omit<FindOptions<TSort>, 'limit'>;
|
|
311
311
|
fulltext?: FulltextInput;
|
|
312
312
|
context?: ExecutionContext;
|
|
313
313
|
}): Promise<T | null>;
|
|
@@ -323,7 +323,7 @@ export declare class Model<T = any, TSelect extends Record<string, unknown> = an
|
|
|
323
323
|
selectionSet?: string | DocumentNode;
|
|
324
324
|
select?: TSelect;
|
|
325
325
|
labels?: string[];
|
|
326
|
-
options?: Omit<FindOptions
|
|
326
|
+
options?: Omit<FindOptions<TSort>, 'limit'>;
|
|
327
327
|
fulltext?: FulltextInput;
|
|
328
328
|
context?: ExecutionContext;
|
|
329
329
|
}): Promise<T>;
|