@subsquid/openreader 2.1.0 → 3.0.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/lib/ir/args.d.ts +1 -1
- package/lib/ir/args.d.ts.map +1 -1
- package/lib/ir/connection.d.ts +3 -4
- package/lib/ir/connection.d.ts.map +1 -1
- package/lib/ir/connection.js.map +1 -1
- package/lib/ir/fields.d.ts +6 -2
- package/lib/ir/fields.d.ts.map +1 -1
- package/lib/ir/fields.js +15 -0
- package/lib/ir/fields.js.map +1 -1
- package/lib/limit.size.d.ts +4 -4
- package/lib/limit.size.d.ts.map +1 -1
- package/lib/limit.size.js +51 -20
- package/lib/limit.size.js.map +1 -1
- package/lib/main.js +0 -9
- package/lib/main.js.map +1 -1
- package/lib/model.d.ts +2 -1
- package/lib/model.d.ts.map +1 -1
- package/lib/model.schema.d.ts +2 -2
- package/lib/model.schema.d.ts.map +1 -1
- package/lib/model.schema.js +8 -3
- package/lib/model.schema.js.map +1 -1
- package/lib/model.tools.d.ts +6 -1
- package/lib/model.tools.d.ts.map +1 -1
- package/lib/model.tools.js +111 -8
- package/lib/model.tools.js.map +1 -1
- package/lib/opencrud/orderBy.d.ts +2 -2
- package/lib/opencrud/orderBy.d.ts.map +1 -1
- package/lib/opencrud/orderBy.js +13 -17
- package/lib/opencrud/orderBy.js.map +1 -1
- package/lib/opencrud/schema.d.ts +4 -4
- package/lib/opencrud/schema.d.ts.map +1 -1
- package/lib/opencrud/schema.js +53 -62
- package/lib/opencrud/schema.js.map +1 -1
- package/lib/opencrud/tree.d.ts +9 -7
- package/lib/opencrud/tree.d.ts.map +1 -1
- package/lib/opencrud/tree.js +32 -14
- package/lib/opencrud/tree.js.map +1 -1
- package/lib/sql/cursor.js +2 -2
- package/lib/sql/cursor.js.map +1 -1
- package/lib/sql/mapping.d.ts +3 -1
- package/lib/sql/mapping.d.ts.map +1 -1
- package/lib/sql/mapping.js +16 -1
- package/lib/sql/mapping.js.map +1 -1
- package/lib/sql/printer.d.ts +29 -11
- package/lib/sql/printer.d.ts.map +1 -1
- package/lib/sql/printer.js +106 -10
- package/lib/sql/printer.js.map +1 -1
- package/lib/sql/query.d.ts +11 -11
- package/lib/sql/query.d.ts.map +1 -1
- package/lib/sql/query.js +41 -19
- package/lib/sql/query.js.map +1 -1
- package/lib/test/queryable.test.d.ts +2 -0
- package/lib/test/queryable.test.d.ts.map +1 -0
- package/lib/test/queryable.test.js +255 -0
- package/lib/test/queryable.test.js.map +1 -0
- package/package.json +2 -2
- package/src/ir/args.ts +1 -1
- package/src/ir/connection.ts +3 -4
- package/src/ir/fields.ts +22 -2
- package/src/limit.size.ts +55 -30
- package/src/main.ts +0 -11
- package/src/model.schema.ts +16 -9
- package/src/model.tools.ts +121 -8
- package/src/model.ts +2 -1
- package/src/opencrud/orderBy.ts +13 -17
- package/src/opencrud/schema.ts +78 -84
- package/src/opencrud/tree.ts +55 -26
- package/src/sql/cursor.ts +2 -2
- package/src/sql/mapping.ts +18 -1
- package/src/sql/printer.ts +137 -21
- package/src/sql/query.ts +50 -30
- package/src/test/queryable.test.ts +258 -0
package/lib/model.tools.js
CHANGED
|
@@ -3,7 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.getFtsQuery = exports.getObject = exports.getEntity = exports.propTypeEquals = exports.validateIndexes = exports.validateLookups = exports.validateUnionTypes = exports.validateNames = exports.validateModel = exports.buildUnionProps = exports.getUnionProps = void 0;
|
|
6
|
+
exports.getFtsQuery = exports.getInterface = exports.getObject = exports.getEntity = exports.propTypeEquals = exports.validateQueryableInterfaces = exports.validateIndexes = exports.validateLookups = exports.validateUnionTypes = exports.validateNames = exports.validateModel = exports.getUniversalProperties = exports.getQueryableProperties = exports.getQueryableEntities = exports.buildUnionProps = exports.getUnionProps = void 0;
|
|
7
|
+
const util_internal_1 = require("@subsquid/util-internal");
|
|
7
8
|
const assert_1 = __importDefault(require("assert"));
|
|
8
9
|
const UNION_MAPS = new WeakMap();
|
|
9
10
|
function getUnionProps(model, unionName) {
|
|
@@ -21,8 +22,7 @@ function buildUnionProps(model, unionName) {
|
|
|
21
22
|
let union = model[unionName];
|
|
22
23
|
(0, assert_1.default)(union.kind == 'union');
|
|
23
24
|
let properties = {};
|
|
24
|
-
for (let
|
|
25
|
-
let objectName = union.variants[i];
|
|
25
|
+
for (let objectName of union.variants) {
|
|
26
26
|
let object = model[objectName];
|
|
27
27
|
(0, assert_1.default)(object.kind == 'object');
|
|
28
28
|
Object.assign(properties, object.properties);
|
|
@@ -34,12 +34,99 @@ function buildUnionProps(model, unionName) {
|
|
|
34
34
|
return { kind: 'object', properties };
|
|
35
35
|
}
|
|
36
36
|
exports.buildUnionProps = buildUnionProps;
|
|
37
|
+
const QUERYABLE_ENTITIES = new WeakMap();
|
|
38
|
+
function getQueryableEntities(model, queryableName) {
|
|
39
|
+
let cache = QUERYABLE_ENTITIES.get(model);
|
|
40
|
+
if (cache == null) {
|
|
41
|
+
cache = {};
|
|
42
|
+
QUERYABLE_ENTITIES.set(model, cache);
|
|
43
|
+
}
|
|
44
|
+
let entities = cache[queryableName];
|
|
45
|
+
if (entities)
|
|
46
|
+
return entities;
|
|
47
|
+
entities = cache[queryableName] = [];
|
|
48
|
+
for (let name in model) {
|
|
49
|
+
let item = model[name];
|
|
50
|
+
if (item.kind == 'entity' && item.interfaces?.includes(queryableName)) {
|
|
51
|
+
entities.push(name);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return entities;
|
|
55
|
+
}
|
|
56
|
+
exports.getQueryableEntities = getQueryableEntities;
|
|
57
|
+
function getQueryableProperties(model, queryableName) {
|
|
58
|
+
let queryable = getInterface(model, queryableName);
|
|
59
|
+
let props = {};
|
|
60
|
+
for (let entityName of getQueryableEntities(model, queryableName)) {
|
|
61
|
+
let entity = getEntity(model, entityName);
|
|
62
|
+
for (let key in queryable.properties) {
|
|
63
|
+
let ep = entity.properties[key];
|
|
64
|
+
if (ep == null)
|
|
65
|
+
throw new Error(`Entity ${entityName} doesn't implement ${queryableName} properly: .${key} property is missing`);
|
|
66
|
+
let prop = matchWithQueryableProp(queryable.properties[key], ep);
|
|
67
|
+
if (prop == null)
|
|
68
|
+
throw new Error(`Entity ${entityName} doesn't implement ${queryableName} properly: .${key} property types are incompatible`);
|
|
69
|
+
props[key] = prop;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return props;
|
|
73
|
+
}
|
|
74
|
+
exports.getQueryableProperties = getQueryableProperties;
|
|
75
|
+
function matchWithQueryableProp(queryableProp, entityProp) {
|
|
76
|
+
if (!queryableProp.nullable && entityProp.nullable)
|
|
77
|
+
return undefined;
|
|
78
|
+
let qt = queryableProp.type;
|
|
79
|
+
let et = entityProp.type;
|
|
80
|
+
switch (et.kind) {
|
|
81
|
+
case 'fk':
|
|
82
|
+
case 'lookup':
|
|
83
|
+
if (qt.kind == 'object' && qt.name == et.entity) {
|
|
84
|
+
return {
|
|
85
|
+
type: et,
|
|
86
|
+
nullable: queryableProp.nullable,
|
|
87
|
+
description: queryableProp.description
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
return undefined;
|
|
91
|
+
case 'list-lookup':
|
|
92
|
+
if (qt.kind == 'list' && qt.item.type.kind == 'object' && qt.item.type.name == et.entity) {
|
|
93
|
+
return {
|
|
94
|
+
type: et,
|
|
95
|
+
nullable: false,
|
|
96
|
+
description: queryableProp.description
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
return undefined;
|
|
100
|
+
default:
|
|
101
|
+
if (propTypeEquals(et, qt)) {
|
|
102
|
+
return queryableProp;
|
|
103
|
+
}
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function getUniversalProperties(model, typeName) {
|
|
108
|
+
let item = model[typeName];
|
|
109
|
+
switch (item.kind) {
|
|
110
|
+
case 'entity':
|
|
111
|
+
case 'object':
|
|
112
|
+
return item.properties;
|
|
113
|
+
case 'union':
|
|
114
|
+
return getUnionProps(model, typeName).properties;
|
|
115
|
+
case 'interface':
|
|
116
|
+
(0, assert_1.default)(item.queryable);
|
|
117
|
+
return getQueryableProperties(model, typeName);
|
|
118
|
+
default:
|
|
119
|
+
throw (0, util_internal_1.unexpectedCase)(item.kind);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
exports.getUniversalProperties = getUniversalProperties;
|
|
37
123
|
function validateModel(model) {
|
|
38
124
|
// TODO: check all invariants we assume
|
|
39
125
|
validateNames(model);
|
|
40
126
|
validateUnionTypes(model);
|
|
41
127
|
validateLookups(model);
|
|
42
128
|
validateIndexes(model);
|
|
129
|
+
validateQueryableInterfaces(model);
|
|
43
130
|
}
|
|
44
131
|
exports.validateModel = validateModel;
|
|
45
132
|
const TYPE_NAME_REGEX = /^[A-Z][a-zA-Z0-9]*$/;
|
|
@@ -115,7 +202,7 @@ function validateLookups(model) {
|
|
|
115
202
|
if (prop.type.kind == 'lookup' || prop.type.kind == 'list-lookup') {
|
|
116
203
|
let lookupEntity = getEntity(model, prop.type.entity);
|
|
117
204
|
let lookupProperty = lookupEntity.properties[prop.type.field];
|
|
118
|
-
if (lookupProperty?.type.kind != 'fk' || lookupProperty.type.
|
|
205
|
+
if (lookupProperty?.type.kind != 'fk' || lookupProperty.type.entity != name) {
|
|
119
206
|
throw invalidProperty(name, key, `${prop.type.entity}.${prop.type.field} is not a foreign key pointing to ${name}`);
|
|
120
207
|
}
|
|
121
208
|
if (prop.type.kind == 'lookup' && !lookupProperty.unique) {
|
|
@@ -139,7 +226,7 @@ function validateIndexes(model) {
|
|
|
139
226
|
index.fields.forEach(f => {
|
|
140
227
|
let prop = item.properties[f.name];
|
|
141
228
|
if (prop == null)
|
|
142
|
-
throw new Error(`Entity ${name} doesn't have a property ${f.name}, but is a part of index`);
|
|
229
|
+
throw new Error(`Entity ${name} doesn't have a property ${f.name}, but it is a part of index`);
|
|
143
230
|
switch (prop.type.kind) {
|
|
144
231
|
case "scalar":
|
|
145
232
|
case "enum":
|
|
@@ -153,17 +240,27 @@ function validateIndexes(model) {
|
|
|
153
240
|
}
|
|
154
241
|
}
|
|
155
242
|
exports.validateIndexes = validateIndexes;
|
|
243
|
+
function validateQueryableInterfaces(model) {
|
|
244
|
+
for (let name in model) {
|
|
245
|
+
let item = model[name];
|
|
246
|
+
if (item.kind == 'interface' && item.queryable) {
|
|
247
|
+
getQueryableProperties(model, name);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
exports.validateQueryableInterfaces = validateQueryableInterfaces;
|
|
156
252
|
function invalidProperty(item, key, msg) {
|
|
157
253
|
return new Error(`Invalid property ${item}.${key}: ${msg}`);
|
|
158
254
|
}
|
|
159
255
|
function propTypeEquals(a, b) {
|
|
160
256
|
if (a.kind != b.kind)
|
|
161
257
|
return false;
|
|
162
|
-
if (a.kind == 'list')
|
|
163
|
-
return propTypeEquals(a.item.type, b.item.type);
|
|
164
258
|
switch (a.kind) {
|
|
259
|
+
case 'list':
|
|
260
|
+
return a.item.nullable == b.item.nullable
|
|
261
|
+
&& propTypeEquals(a.item.type, b.item.type);
|
|
165
262
|
case 'fk':
|
|
166
|
-
return a.
|
|
263
|
+
return a.entity == b.entity;
|
|
167
264
|
case 'lookup':
|
|
168
265
|
case 'list-lookup':
|
|
169
266
|
return a.entity == b.entity && a.field == b.field;
|
|
@@ -184,6 +281,12 @@ function getObject(model, name) {
|
|
|
184
281
|
return object;
|
|
185
282
|
}
|
|
186
283
|
exports.getObject = getObject;
|
|
284
|
+
function getInterface(model, name) {
|
|
285
|
+
let i = model[name];
|
|
286
|
+
(0, assert_1.default)(i.kind == 'interface', `${name} expected to be an interface`);
|
|
287
|
+
return i;
|
|
288
|
+
}
|
|
289
|
+
exports.getInterface = getInterface;
|
|
187
290
|
function getFtsQuery(model, name) {
|
|
188
291
|
let query = model[name];
|
|
189
292
|
(0, assert_1.default)(query.kind == 'fts', `${name} expected to be FTS query`);
|
package/lib/model.tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.tools.js","sourceRoot":"","sources":["../src/model.tools.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA2B;AAI3B,MAAM,UAAU,GAAG,IAAI,OAAO,EAAqC,CAAA;AAGnE,SAAgB,aAAa,CAAC,KAAY,EAAE,SAAiB;IACzD,IAAI,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAC/B,IAAI,GAAG,IAAI,IAAI,EAAE;QACb,GAAG,GAAG,EAAE,CAAA;QACR,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;KAC7B;IACD,IAAI,GAAG,CAAC,SAAS,CAAC;QAAE,OAAO,GAAG,CAAC,SAAS,CAAC,CAAA;IACzC,OAAO,GAAG,CAAC,SAAS,CAAC,GAAG,eAAe,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;AAC7D,CAAC;AARD,sCAQC;AAGD,SAAgB,eAAe,CAAC,KAAY,EAAE,SAAiB;IAC3D,IAAI,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAA;IAC5B,IAAA,gBAAM,EAAC,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC,CAAA;IAC7B,IAAI,UAAU,GAAyB,EAAE,CAAA;IACzC,KAAK,IAAI,
|
|
1
|
+
{"version":3,"file":"model.tools.js","sourceRoot":"","sources":["../src/model.tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ export declare type OpenCrudOrderByValue = string;
|
|
|
8
8
|
* A mapping between OpenCRUD enum variants and OrderBy specs
|
|
9
9
|
*/
|
|
10
10
|
export declare type OpenCrud_OrderBy_Mapping = ReadonlyMap<OpenCrudOrderByValue, OrderBy>;
|
|
11
|
-
export declare function getOrderByMapping(model: Model,
|
|
12
|
-
export declare function parseOrderBy(model: Model,
|
|
11
|
+
export declare function getOrderByMapping(model: Model, typeName: string): OpenCrud_OrderBy_Mapping;
|
|
12
|
+
export declare function parseOrderBy(model: Model, typeName: string, input: OpenCrudOrderByValue[]): OrderBy;
|
|
13
13
|
export declare function mergeOrderBy(list: OrderBy[]): OrderBy;
|
|
14
14
|
//# sourceMappingURL=orderBy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orderBy.d.ts","sourceRoot":"","sources":["../../src/opencrud/orderBy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,UAAU,CAAA;AAEnC,OAAO,EAAC,OAAO,EAAC,MAAM,YAAY,CAAA;AAGlC;;GAEG;AACH,oBAAY,oBAAoB,GAAG,MAAM,CAAA;AAGzC;;GAEG;AACH,oBAAY,wBAAwB,GAAG,WAAW,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAA;AAMjF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"orderBy.d.ts","sourceRoot":"","sources":["../../src/opencrud/orderBy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,UAAU,CAAA;AAEnC,OAAO,EAAC,OAAO,EAAC,MAAM,YAAY,CAAA;AAGlC;;GAEG;AACH,oBAAY,oBAAoB,GAAG,MAAM,CAAA;AAGzC;;GAEG;AACH,oBAAY,wBAAwB,GAAG,WAAW,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAA;AAMjF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,GAAG,wBAAwB,CAQ1F;AAuCD,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,oBAAoB,EAAE,GAAG,OAAO,CASnG;AAGD,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAerD"}
|
package/lib/opencrud/orderBy.js
CHANGED
|
@@ -7,28 +7,24 @@ exports.mergeOrderBy = exports.parseOrderBy = exports.getOrderByMapping = void 0
|
|
|
7
7
|
const assert_1 = __importDefault(require("assert"));
|
|
8
8
|
const model_tools_1 = require("../model.tools");
|
|
9
9
|
const MAPPING_CACHE = new WeakMap();
|
|
10
|
-
function getOrderByMapping(model,
|
|
10
|
+
function getOrderByMapping(model, typeName) {
|
|
11
11
|
let cache = MAPPING_CACHE.get(model);
|
|
12
12
|
if (cache == null) {
|
|
13
13
|
cache = {};
|
|
14
14
|
MAPPING_CACHE.set(model, cache);
|
|
15
15
|
}
|
|
16
|
-
if (cache[
|
|
17
|
-
return cache[
|
|
18
|
-
return cache[
|
|
16
|
+
if (cache[typeName])
|
|
17
|
+
return cache[typeName];
|
|
18
|
+
return cache[typeName] = buildOrderByMapping(model, typeName, 2);
|
|
19
19
|
}
|
|
20
20
|
exports.getOrderByMapping = getOrderByMapping;
|
|
21
21
|
function buildOrderByMapping(model, typeName, depth) {
|
|
22
22
|
if (depth <= 0)
|
|
23
23
|
return new Map();
|
|
24
|
-
let
|
|
25
|
-
if (object.kind == 'union') {
|
|
26
|
-
object = (0, model_tools_1.getUnionProps)(model, typeName);
|
|
27
|
-
}
|
|
28
|
-
(0, assert_1.default)(object.kind == 'entity' || object.kind == 'object');
|
|
24
|
+
let properties = (0, model_tools_1.getUniversalProperties)(model, typeName);
|
|
29
25
|
let m = new Map();
|
|
30
|
-
for (let key in
|
|
31
|
-
let propType =
|
|
26
|
+
for (let key in properties) {
|
|
27
|
+
let propType = properties[key].type;
|
|
32
28
|
switch (propType.kind) {
|
|
33
29
|
case 'scalar':
|
|
34
30
|
case 'enum':
|
|
@@ -44,10 +40,6 @@ function buildOrderByMapping(model, typeName, depth) {
|
|
|
44
40
|
}
|
|
45
41
|
break;
|
|
46
42
|
case 'fk':
|
|
47
|
-
for (let [name, spec] of buildOrderByMapping(model, propType.foreignEntity, depth - 1)) {
|
|
48
|
-
m.set(key + '_' + name, { [key]: spec });
|
|
49
|
-
}
|
|
50
|
-
break;
|
|
51
43
|
case 'lookup':
|
|
52
44
|
for (let [name, spec] of buildOrderByMapping(model, propType.entity, depth - 1)) {
|
|
53
45
|
m.set(key + '_' + name, { [key]: spec });
|
|
@@ -55,10 +47,14 @@ function buildOrderByMapping(model, typeName, depth) {
|
|
|
55
47
|
break;
|
|
56
48
|
}
|
|
57
49
|
}
|
|
50
|
+
if (model[typeName].kind == 'interface') {
|
|
51
|
+
m.set('_type_ASC', { _type: 'ASC' });
|
|
52
|
+
m.set('_type_DESC', { _type: 'DESC' });
|
|
53
|
+
}
|
|
58
54
|
return m;
|
|
59
55
|
}
|
|
60
|
-
function parseOrderBy(model,
|
|
61
|
-
let mapping = getOrderByMapping(model,
|
|
56
|
+
function parseOrderBy(model, typeName, input) {
|
|
57
|
+
let mapping = getOrderByMapping(model, typeName);
|
|
62
58
|
return mergeOrderBy(input.map(value => {
|
|
63
59
|
let spec = mapping.get(value);
|
|
64
60
|
(0, assert_1.default)(spec != null);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orderBy.js","sourceRoot":"","sources":["../../src/opencrud/orderBy.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA2B;AAE3B,
|
|
1
|
+
{"version":3,"file":"orderBy.js","sourceRoot":"","sources":["../../src/opencrud/orderBy.ts"],"names":[],"mappings":"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"}
|
package/lib/opencrud/schema.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { GraphQLSchema } from
|
|
2
|
-
import { Model } from
|
|
1
|
+
import { GraphQLSchema } from 'graphql';
|
|
2
|
+
import { Model } from '../model';
|
|
3
3
|
export interface SchemaOptions {
|
|
4
4
|
model: Model;
|
|
5
5
|
subscriptions?: boolean;
|
|
@@ -15,13 +15,13 @@ export declare class SchemaBuilder {
|
|
|
15
15
|
private buildType;
|
|
16
16
|
private buildObjectFields;
|
|
17
17
|
private getPropType;
|
|
18
|
-
private
|
|
18
|
+
private listArguments;
|
|
19
19
|
private getWhere;
|
|
20
20
|
private buildPropWhereFilters;
|
|
21
21
|
private hasFilters;
|
|
22
22
|
private getOrderBy;
|
|
23
23
|
build(): GraphQLSchema;
|
|
24
|
-
private
|
|
24
|
+
private installListQuery;
|
|
25
25
|
private installEntityById;
|
|
26
26
|
private installEntityByUniqueInput;
|
|
27
27
|
private installRelayConnection;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/opencrud/schema.ts"],"names":[],"mappings":"AAIA,OAAO,EAeH,aAAa,EAGhB,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/opencrud/schema.ts"],"names":[],"mappings":"AAIA,OAAO,EAeH,aAAa,EAGhB,MAAM,SAAS,CAAA;AAWhB,OAAO,EAAgC,KAAK,EAAO,MAAM,UAAU,CAAA;AAgBnE,MAAM,WAAW,aAAa;IAC1B,KAAK,EAAE,KAAK,CAAA;IACZ,aAAa,CAAC,EAAE,OAAO,CAAA;CAC1B;AAGD,qBAAa,aAAa;IAMV,OAAO,CAAC,OAAO;IAL3B,OAAO,CAAC,KAAK,CAAO;IACpB,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,OAAO,CAAsC;gBAEjC,OAAO,EAAE,aAAa;IAI1C,OAAO,CAAC,GAAG;IAkCX,OAAO,CAAC,SAAS;IAyCjB,OAAO,CAAC,iBAAiB;IA2BzB,OAAO,CAAC,WAAW;IA4BnB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,QAAQ;IAkChB,OAAO,CAAC,qBAAqB;IAwF7B,OAAO,CAAC,UAAU;IAmBlB,OAAO,CAAC,UAAU;IAsBlB,KAAK,IAAI,aAAa;IAkCtB,OAAO,CAAC,gBAAgB;IAwCxB,OAAO,CAAC,iBAAiB;IAwCzB,OAAO,CAAC,0BAA0B;IA2BlC,OAAO,CAAC,sBAAsB;IA8F9B,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,YAAY;CAavB"}
|
package/lib/opencrud/schema.js
CHANGED
|
@@ -78,7 +78,8 @@ class SchemaBuilder {
|
|
|
78
78
|
return new graphql_1.GraphQLInterfaceType({
|
|
79
79
|
name,
|
|
80
80
|
description: item.description,
|
|
81
|
-
fields: () => this.buildObjectFields(item)
|
|
81
|
+
fields: () => this.buildObjectFields(item),
|
|
82
|
+
resolveType: item.queryable ? (value) => value._isTypeOf : undefined
|
|
82
83
|
});
|
|
83
84
|
case "enum":
|
|
84
85
|
return new graphql_1.GraphQLEnumType({
|
|
@@ -111,7 +112,7 @@ class SchemaBuilder {
|
|
|
111
112
|
type: this.getPropType(prop)
|
|
112
113
|
};
|
|
113
114
|
if (prop.type.kind == 'list-lookup') {
|
|
114
|
-
field.args = this.
|
|
115
|
+
field.args = this.listArguments(prop.type.entity);
|
|
115
116
|
}
|
|
116
117
|
if (object.kind == 'entity' || object.kind == 'object') {
|
|
117
118
|
switch (prop.type.kind) {
|
|
@@ -135,7 +136,7 @@ class SchemaBuilder {
|
|
|
135
136
|
type = new graphql_1.GraphQLList(this.getPropType(prop.type.item));
|
|
136
137
|
break;
|
|
137
138
|
case "fk":
|
|
138
|
-
type = this.get(prop.type.
|
|
139
|
+
type = this.get(prop.type.entity);
|
|
139
140
|
break;
|
|
140
141
|
case "lookup":
|
|
141
142
|
return this.get(prop.type.entity);
|
|
@@ -149,43 +150,29 @@ class SchemaBuilder {
|
|
|
149
150
|
}
|
|
150
151
|
return type;
|
|
151
152
|
}
|
|
152
|
-
|
|
153
|
+
listArguments(typeName) {
|
|
153
154
|
return {
|
|
154
|
-
where: { type: this.getWhere(
|
|
155
|
-
orderBy: { type: this.getOrderBy(
|
|
155
|
+
where: { type: this.getWhere(typeName) },
|
|
156
|
+
orderBy: { type: this.getOrderBy(typeName) },
|
|
156
157
|
offset: { type: graphql_1.GraphQLInt },
|
|
157
158
|
limit: { type: graphql_1.GraphQLInt }
|
|
158
159
|
};
|
|
159
160
|
}
|
|
160
|
-
getWhere(
|
|
161
|
-
let where = this.where.get(
|
|
161
|
+
getWhere(typeName) {
|
|
162
|
+
let where = this.where.get(typeName);
|
|
162
163
|
if (where)
|
|
163
164
|
return where;
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
case "entity":
|
|
167
|
-
case "object":
|
|
168
|
-
case "union":
|
|
169
|
-
break;
|
|
170
|
-
default:
|
|
171
|
-
throw (0, util_internal_1.unexpectedCase)(object.kind);
|
|
172
|
-
}
|
|
165
|
+
let object = this.model[typeName];
|
|
166
|
+
let properties = (0, model_tools_1.getUniversalProperties)(this.model, typeName);
|
|
173
167
|
where = new graphql_1.GraphQLInputObjectType({
|
|
174
|
-
name: `${
|
|
168
|
+
name: `${typeName}WhereInput`,
|
|
175
169
|
fields: () => {
|
|
176
170
|
let fields = {};
|
|
177
|
-
let properties;
|
|
178
|
-
if (object.kind == 'union') {
|
|
179
|
-
properties = (0, model_tools_1.getUnionProps)(this.model, name).properties;
|
|
180
|
-
}
|
|
181
|
-
else {
|
|
182
|
-
properties = object.properties;
|
|
183
|
-
}
|
|
184
171
|
for (let key in properties) {
|
|
185
172
|
this.buildPropWhereFilters(key, properties[key], fields);
|
|
186
173
|
}
|
|
187
|
-
if (object.kind == 'entity') {
|
|
188
|
-
let whereList = new graphql_1.GraphQLList(new graphql_1.GraphQLNonNull(this.getWhere(
|
|
174
|
+
if (object.kind == 'entity' || object.kind == 'interface') {
|
|
175
|
+
let whereList = new graphql_1.GraphQLList(new graphql_1.GraphQLNonNull(this.getWhere(typeName)));
|
|
189
176
|
fields['AND'] = {
|
|
190
177
|
type: whereList
|
|
191
178
|
};
|
|
@@ -196,7 +183,7 @@ class SchemaBuilder {
|
|
|
196
183
|
return fields;
|
|
197
184
|
}
|
|
198
185
|
});
|
|
199
|
-
this.where.set(
|
|
186
|
+
this.where.set(typeName, where);
|
|
200
187
|
return where;
|
|
201
188
|
}
|
|
202
189
|
buildPropWhereFilters(key, prop, fields) {
|
|
@@ -269,10 +256,8 @@ class SchemaBuilder {
|
|
|
269
256
|
fields[key] = { type: this.getWhere(prop.type.name) };
|
|
270
257
|
break;
|
|
271
258
|
case "fk":
|
|
272
|
-
fields[`${key}_isNull`] = { type: graphql_1.GraphQLBoolean };
|
|
273
|
-
fields[key] = { type: this.getWhere(prop.type.foreignEntity) };
|
|
274
|
-
break;
|
|
275
259
|
case "lookup":
|
|
260
|
+
fields[`${key}_isNull`] = { type: graphql_1.GraphQLBoolean };
|
|
276
261
|
fields[key] = { type: this.getWhere(prop.type.entity) };
|
|
277
262
|
break;
|
|
278
263
|
case "list-lookup": {
|
|
@@ -302,19 +287,19 @@ class SchemaBuilder {
|
|
|
302
287
|
}
|
|
303
288
|
return false;
|
|
304
289
|
}
|
|
305
|
-
getOrderBy(
|
|
306
|
-
let orderBy = this.orderBy.get(
|
|
290
|
+
getOrderBy(typeName) {
|
|
291
|
+
let orderBy = this.orderBy.get(typeName);
|
|
307
292
|
if (orderBy)
|
|
308
293
|
return orderBy;
|
|
309
294
|
let values = {};
|
|
310
|
-
for (let variant of (0, orderBy_1.getOrderByMapping)(this.model,
|
|
295
|
+
for (let variant of (0, orderBy_1.getOrderByMapping)(this.model, typeName).keys()) {
|
|
311
296
|
values[variant] = {};
|
|
312
297
|
}
|
|
313
298
|
orderBy = new graphql_1.GraphQLList(new graphql_1.GraphQLNonNull(new graphql_1.GraphQLEnumType({
|
|
314
|
-
name: `${
|
|
299
|
+
name: `${typeName}OrderByInput`,
|
|
315
300
|
values
|
|
316
301
|
})));
|
|
317
|
-
this.orderBy.set(
|
|
302
|
+
this.orderBy.set(typeName, orderBy);
|
|
318
303
|
return orderBy;
|
|
319
304
|
}
|
|
320
305
|
build() {
|
|
@@ -324,11 +309,17 @@ class SchemaBuilder {
|
|
|
324
309
|
let item = this.model[name];
|
|
325
310
|
switch (item.kind) {
|
|
326
311
|
case "entity":
|
|
327
|
-
this.
|
|
312
|
+
this.installListQuery(name, query, subscription);
|
|
328
313
|
this.installEntityById(name, query, subscription);
|
|
329
314
|
this.installEntityByUniqueInput(name, query);
|
|
330
315
|
this.installRelayConnection(name, query);
|
|
331
316
|
break;
|
|
317
|
+
case 'interface':
|
|
318
|
+
if (item.queryable) {
|
|
319
|
+
this.installListQuery(name, query, subscription);
|
|
320
|
+
this.installRelayConnection(name, query);
|
|
321
|
+
}
|
|
322
|
+
break;
|
|
332
323
|
}
|
|
333
324
|
}
|
|
334
325
|
return new graphql_1.GraphQLSchema({
|
|
@@ -342,17 +333,17 @@ class SchemaBuilder {
|
|
|
342
333
|
}) : undefined
|
|
343
334
|
});
|
|
344
335
|
}
|
|
345
|
-
|
|
336
|
+
installListQuery(typeName, query, subscription) {
|
|
346
337
|
let model = this.model;
|
|
347
|
-
let queryName = (0, util_naming_1.toPlural)((0, util_naming_1.toCamelCase)(
|
|
348
|
-
let outputType = new graphql_1.GraphQLNonNull(new graphql_1.GraphQLList(new graphql_1.GraphQLNonNull(this.get(
|
|
349
|
-
let argsType = this.
|
|
338
|
+
let queryName = (0, util_naming_1.toPlural)((0, util_naming_1.toCamelCase)(typeName));
|
|
339
|
+
let outputType = new graphql_1.GraphQLNonNull(new graphql_1.GraphQLList(new graphql_1.GraphQLNonNull(this.get(typeName))));
|
|
340
|
+
let argsType = this.listArguments(typeName);
|
|
350
341
|
function createQuery(context, info, limit) {
|
|
351
342
|
let tree = (0, resolve_tree_1.getResolveTree)(info);
|
|
352
|
-
let
|
|
353
|
-
let
|
|
354
|
-
limit?.check(() => (0, limit_size_1.
|
|
355
|
-
return new query_1.
|
|
343
|
+
let args = (0, tree_1.parseSqlArguments)(model, typeName, tree.args);
|
|
344
|
+
let fields = (0, tree_1.parseAnyTree)(model, typeName, info.schema, tree);
|
|
345
|
+
limit?.check(() => (0, limit_size_1.getListSize)(model, typeName, fields, args.limit, args.where) + 1);
|
|
346
|
+
return new query_1.ListQuery(model, context.openreader.dialect, typeName, fields, args);
|
|
356
347
|
}
|
|
357
348
|
query[queryName] = {
|
|
358
349
|
type: outputType,
|
|
@@ -380,8 +371,8 @@ class SchemaBuilder {
|
|
|
380
371
|
};
|
|
381
372
|
function createQuery(context, info, limit) {
|
|
382
373
|
let tree = (0, resolve_tree_1.getResolveTree)(info);
|
|
383
|
-
let fields = (0, tree_1.
|
|
384
|
-
limit?.check(() => (0, limit_size_1.
|
|
374
|
+
let fields = (0, tree_1.parseObjectTree)(model, entityName, info.schema, tree);
|
|
375
|
+
limit?.check(() => (0, limit_size_1.getObjectSize)(model, fields) + 1);
|
|
385
376
|
return new query_1.EntityByIdQuery(model, context.openreader.dialect, entityName, fields, tree.args.id);
|
|
386
377
|
}
|
|
387
378
|
query[queryName] = {
|
|
@@ -412,20 +403,20 @@ class SchemaBuilder {
|
|
|
412
403
|
},
|
|
413
404
|
async resolve(source, args, context, info) {
|
|
414
405
|
let tree = (0, resolve_tree_1.getResolveTree)(info);
|
|
415
|
-
let fields = (0, tree_1.
|
|
416
|
-
context.openreader.responseSizeLimit?.check(() => (0, limit_size_1.
|
|
417
|
-
let query = new query_1.
|
|
406
|
+
let fields = (0, tree_1.parseObjectTree)(model, entityName, info.schema, tree);
|
|
407
|
+
context.openreader.responseSizeLimit?.check(() => (0, limit_size_1.getObjectSize)(model, fields) + 1);
|
|
408
|
+
let query = new query_1.ListQuery(model, context.openreader.dialect, entityName, fields, { where: { op: 'eq', field: 'id', value: args.where.id } });
|
|
418
409
|
let result = await context.openreader.executeQuery(query);
|
|
419
410
|
(0, assert_1.default)(result.length < 2);
|
|
420
411
|
return result[0];
|
|
421
412
|
}
|
|
422
413
|
};
|
|
423
414
|
}
|
|
424
|
-
installRelayConnection(
|
|
415
|
+
installRelayConnection(typeName, query) {
|
|
425
416
|
let model = this.model;
|
|
426
|
-
let outputType = (0, util_naming_1.toPlural)(
|
|
427
|
-
let edgeType = `${
|
|
428
|
-
query[`${(0, util_naming_1.toPlural)((0, util_naming_1.toCamelCase)(
|
|
417
|
+
let outputType = (0, util_naming_1.toPlural)(typeName) + 'Connection';
|
|
418
|
+
let edgeType = `${typeName}Edge`;
|
|
419
|
+
query[`${(0, util_naming_1.toPlural)((0, util_naming_1.toCamelCase)(typeName))}Connection`] = {
|
|
429
420
|
type: new graphql_1.GraphQLNonNull(new graphql_1.GraphQLObjectType({
|
|
430
421
|
name: outputType,
|
|
431
422
|
fields: {
|
|
@@ -433,7 +424,7 @@ class SchemaBuilder {
|
|
|
433
424
|
type: new graphql_1.GraphQLNonNull(new graphql_1.GraphQLList(new graphql_1.GraphQLNonNull(new graphql_1.GraphQLObjectType({
|
|
434
425
|
name: edgeType,
|
|
435
426
|
fields: {
|
|
436
|
-
node: { type: new graphql_1.GraphQLNonNull(this.get(
|
|
427
|
+
node: { type: new graphql_1.GraphQLNonNull(this.get(typeName)) },
|
|
437
428
|
cursor: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) }
|
|
438
429
|
}
|
|
439
430
|
}))))
|
|
@@ -443,10 +434,10 @@ class SchemaBuilder {
|
|
|
443
434
|
}
|
|
444
435
|
})),
|
|
445
436
|
args: {
|
|
446
|
-
orderBy: { type: new graphql_1.GraphQLNonNull(this.getOrderBy(
|
|
437
|
+
orderBy: { type: new graphql_1.GraphQLNonNull(this.getOrderBy(typeName)) },
|
|
447
438
|
after: { type: graphql_1.GraphQLString },
|
|
448
439
|
first: { type: graphql_1.GraphQLInt },
|
|
449
|
-
where: { type: this.getWhere(
|
|
440
|
+
where: { type: this.getWhere(typeName) }
|
|
450
441
|
},
|
|
451
442
|
async resolve(source, args, context, info) {
|
|
452
443
|
let orderByArg = (0, util_1.ensureArray)(args.orderBy);
|
|
@@ -454,7 +445,7 @@ class SchemaBuilder {
|
|
|
454
445
|
throw new apollo_server_core_1.UserInputError('orderBy argument is required for connection');
|
|
455
446
|
}
|
|
456
447
|
let req = {
|
|
457
|
-
orderBy: (0, orderBy_1.parseOrderBy)(model,
|
|
448
|
+
orderBy: (0, orderBy_1.parseOrderBy)(model, typeName, orderByArg),
|
|
458
449
|
where: (0, where_1.parseWhere)(args.where)
|
|
459
450
|
};
|
|
460
451
|
if (args.first != null) {
|
|
@@ -482,13 +473,13 @@ class SchemaBuilder {
|
|
|
482
473
|
req.edgeCursor = (0, resolve_tree_1.hasTreeRequest)(edgeFields, 'cursor');
|
|
483
474
|
let nodeTree = (0, resolve_tree_1.getTreeRequest)(edgeFields, 'node');
|
|
484
475
|
if (nodeTree) {
|
|
485
|
-
req.edgeNode = (0, tree_1.
|
|
476
|
+
req.edgeNode = (0, tree_1.parseAnyTree)(model, typeName, info.schema, nodeTree);
|
|
486
477
|
}
|
|
487
478
|
}
|
|
488
|
-
context.openreader.responseSizeLimit?.check(() => (0, limit_size_1.
|
|
489
|
-
let result = await context.openreader.executeQuery(new query_1.
|
|
479
|
+
context.openreader.responseSizeLimit?.check(() => (0, limit_size_1.getConnectionSize)(model, typeName, req) + 1);
|
|
480
|
+
let result = await context.openreader.executeQuery(new query_1.ConnectionQuery(model, context.openreader.dialect, typeName, req));
|
|
490
481
|
if (req.totalCount && result.totalCount == null) {
|
|
491
|
-
result.totalCount = await context.openreader.executeQuery(new query_1.
|
|
482
|
+
result.totalCount = await context.openreader.executeQuery(new query_1.CountQuery(model, context.openreader.dialect, typeName, req.where));
|
|
492
483
|
}
|
|
493
484
|
return result;
|
|
494
485
|
}
|