@snowtop/ent 0.1.0-alpha15 → 0.1.0-alpha150
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/action/action.d.ts +27 -16
- package/action/action.js +22 -7
- package/action/executor.d.ts +16 -3
- package/action/executor.js +90 -23
- package/action/experimental_action.d.ts +25 -16
- package/action/experimental_action.js +35 -9
- package/action/index.d.ts +3 -1
- package/action/index.js +7 -1
- package/action/operations.d.ts +125 -0
- package/action/operations.js +684 -0
- package/action/orchestrator.d.ts +38 -12
- package/action/orchestrator.js +427 -102
- package/action/relative_value.d.ts +47 -0
- package/action/relative_value.js +125 -0
- package/action/transaction.d.ts +10 -0
- package/action/transaction.js +23 -0
- package/auth/auth.d.ts +1 -1
- package/core/base.d.ts +51 -21
- package/core/base.js +7 -1
- package/core/clause.d.ts +85 -40
- package/core/clause.js +375 -64
- package/core/config.d.ts +15 -1
- package/core/config.js +10 -1
- package/core/const.d.ts +3 -0
- package/core/const.js +6 -0
- package/core/context.d.ts +4 -2
- package/core/context.js +20 -2
- package/core/convert.d.ts +1 -1
- package/core/date.js +1 -5
- package/core/db.d.ts +12 -8
- package/core/db.js +18 -8
- package/core/ent.d.ts +68 -94
- package/core/ent.js +535 -586
- package/core/global_schema.d.ts +7 -0
- package/core/global_schema.js +51 -0
- package/core/loaders/assoc_count_loader.d.ts +1 -0
- package/core/loaders/assoc_count_loader.js +10 -2
- package/core/loaders/assoc_edge_loader.d.ts +1 -1
- package/core/loaders/assoc_edge_loader.js +10 -13
- package/core/loaders/index.d.ts +1 -1
- package/core/loaders/index.js +1 -3
- package/core/loaders/index_loader.d.ts +3 -3
- package/core/loaders/loader.d.ts +2 -2
- package/core/loaders/loader.js +5 -5
- package/core/loaders/object_loader.d.ts +30 -9
- package/core/loaders/object_loader.js +225 -78
- package/core/loaders/query_loader.d.ts +6 -12
- package/core/loaders/query_loader.js +54 -13
- package/core/loaders/raw_count_loader.js +5 -1
- package/core/logger.d.ts +1 -1
- package/core/logger.js +1 -0
- package/core/privacy.d.ts +7 -6
- package/core/privacy.js +21 -25
- package/core/query/assoc_query.d.ts +3 -2
- package/core/query/assoc_query.js +9 -1
- package/core/query/custom_clause_query.d.ts +27 -0
- package/core/query/custom_clause_query.js +88 -0
- package/core/query/custom_query.d.ts +17 -2
- package/core/query/custom_query.js +88 -13
- package/core/query/index.d.ts +1 -0
- package/core/query/index.js +3 -1
- package/core/query/query.d.ts +15 -3
- package/core/query/query.js +128 -53
- package/core/query/shared_assoc_test.d.ts +2 -1
- package/core/query/shared_assoc_test.js +44 -54
- package/core/query/shared_test.d.ts +8 -1
- package/core/query/shared_test.js +532 -236
- package/core/viewer.d.ts +2 -0
- package/core/viewer.js +3 -1
- package/graphql/graphql.d.ts +52 -19
- package/graphql/graphql.js +174 -136
- package/graphql/graphql_field_helpers.d.ts +7 -1
- package/graphql/graphql_field_helpers.js +21 -1
- package/graphql/index.d.ts +2 -2
- package/graphql/index.js +3 -5
- package/graphql/query/connection_type.d.ts +9 -9
- package/graphql/query/shared_assoc_test.js +1 -1
- package/graphql/query/shared_edge_connection.js +1 -19
- package/graphql/scalars/orderby_direction.d.ts +2 -0
- package/graphql/scalars/orderby_direction.js +15 -0
- package/imports/dataz/example1/_auth.js +128 -47
- package/imports/dataz/example1/_viewer.js +87 -39
- package/imports/index.d.ts +7 -2
- package/imports/index.js +20 -5
- package/index.d.ts +14 -5
- package/index.js +26 -10
- package/package.json +18 -17
- package/parse_schema/parse.d.ts +31 -9
- package/parse_schema/parse.js +179 -32
- package/schema/base_schema.d.ts +13 -3
- package/schema/base_schema.js +13 -0
- package/schema/field.d.ts +78 -21
- package/schema/field.js +231 -71
- package/schema/index.d.ts +2 -2
- package/schema/index.js +7 -2
- package/schema/json_field.d.ts +16 -4
- package/schema/json_field.js +32 -2
- package/schema/schema.d.ts +109 -20
- package/schema/schema.js +42 -53
- package/schema/struct_field.d.ts +15 -3
- package/schema/struct_field.js +117 -22
- package/schema/union_field.d.ts +1 -1
- package/scripts/custom_compiler.js +12 -8
- package/scripts/custom_graphql.js +145 -34
- package/scripts/migrate_v0.1.js +36 -0
- package/scripts/move_types.js +120 -0
- package/scripts/read_schema.js +22 -7
- package/testutils/action/complex_schemas.d.ts +69 -0
- package/testutils/action/complex_schemas.js +405 -0
- package/testutils/builder.d.ts +39 -43
- package/testutils/builder.js +75 -49
- package/testutils/db/fixture.d.ts +10 -0
- package/testutils/db/fixture.js +26 -0
- package/testutils/db/{test_db.d.ts → temp_db.d.ts} +32 -8
- package/testutils/db/{test_db.js → temp_db.js} +244 -48
- package/testutils/db/value.d.ts +7 -0
- package/testutils/db/value.js +251 -0
- package/testutils/db_mock.d.ts +16 -4
- package/testutils/db_mock.js +52 -9
- package/testutils/db_time_zone.d.ts +4 -0
- package/testutils/db_time_zone.js +41 -0
- package/testutils/ent-graphql-tests/index.d.ts +7 -1
- package/testutils/ent-graphql-tests/index.js +56 -26
- package/testutils/fake_comms.js +1 -1
- package/testutils/fake_data/const.d.ts +2 -1
- package/testutils/fake_data/const.js +3 -0
- package/testutils/fake_data/fake_contact.d.ts +7 -3
- package/testutils/fake_data/fake_contact.js +13 -7
- package/testutils/fake_data/fake_event.d.ts +4 -1
- package/testutils/fake_data/fake_event.js +7 -6
- package/testutils/fake_data/fake_tag.d.ts +36 -0
- package/testutils/fake_data/fake_tag.js +89 -0
- package/testutils/fake_data/fake_user.d.ts +8 -5
- package/testutils/fake_data/fake_user.js +16 -15
- package/testutils/fake_data/index.js +5 -1
- package/testutils/fake_data/internal.d.ts +2 -0
- package/testutils/fake_data/internal.js +7 -1
- package/testutils/fake_data/tag_query.d.ts +13 -0
- package/testutils/fake_data/tag_query.js +43 -0
- package/testutils/fake_data/test_helpers.d.ts +11 -4
- package/testutils/fake_data/test_helpers.js +29 -13
- package/testutils/fake_data/user_query.d.ts +11 -4
- package/testutils/fake_data/user_query.js +54 -22
- package/testutils/fake_log.js +1 -1
- package/testutils/parse_sql.d.ts +6 -0
- package/testutils/parse_sql.js +16 -2
- package/testutils/test_edge_global_schema.d.ts +15 -0
- package/testutils/test_edge_global_schema.js +62 -0
- package/testutils/write.d.ts +2 -2
- package/testutils/write.js +33 -7
- package/tsc/ast.d.ts +25 -2
- package/tsc/ast.js +141 -17
- package/tsc/compilerOptions.js +5 -1
- package/tsc/move_generated.d.ts +1 -0
- package/tsc/move_generated.js +164 -0
- package/tsc/transform.d.ts +22 -0
- package/tsc/transform.js +182 -0
- package/tsc/transform_action.d.ts +22 -0
- package/tsc/transform_action.js +183 -0
- package/tsc/transform_ent.d.ts +17 -0
- package/tsc/transform_ent.js +60 -0
- package/tsc/transform_schema.d.ts +27 -0
- package/{scripts → tsc}/transform_schema.js +146 -117
- package/graphql/enums.d.ts +0 -3
- package/graphql/enums.js +0 -25
- package/scripts/move_generated.js +0 -142
- package/scripts/transform_code.js +0 -113
- package/scripts/transform_schema.d.ts +0 -1
- /package/scripts/{move_generated.d.ts → migrate_v0.1.d.ts} +0 -0
- /package/scripts/{transform_code.d.ts → move_types.d.ts} +0 -0
package/graphql/graphql.js
CHANGED
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.gqlFileUpload = exports.gqlConnection = exports.gqlContextType = exports.gqlMutation = exports.gqlQuery = exports.
|
|
4
|
-
require("reflect-metadata");
|
|
5
|
-
// export interface gqlTopLevelOptions
|
|
6
|
-
// name?: string;
|
|
7
|
-
// type?: Type | Array<Type>;
|
|
8
|
-
// description?: string;
|
|
9
|
-
// }
|
|
3
|
+
exports.gqlFileUpload = exports.gqlConnection = exports.gqlContextType = exports.gqlMutation = exports.gqlQuery = exports.gqlUnionType = exports.gqlInterfaceType = exports.gqlObjectType = exports.gqlInputObjectType = exports.gqlArgType = exports.gqlField = exports.GQLCapture = exports.addCustomType = exports.isCustomType = exports.knownInterfaces = exports.knownDisAllowedNames = exports.knownAllowedNames = exports.CustomFieldType = void 0;
|
|
10
4
|
var CustomFieldType;
|
|
11
5
|
(function (CustomFieldType) {
|
|
12
6
|
CustomFieldType["Accessor"] = "ACCESSOR";
|
|
@@ -29,6 +23,8 @@ exports.knownAllowedNames = new Map([
|
|
|
29
23
|
["Int", "number"],
|
|
30
24
|
["Float", "number"],
|
|
31
25
|
["ID", "ID"],
|
|
26
|
+
["JSON", "any"],
|
|
27
|
+
["Node", "Ent"],
|
|
32
28
|
]);
|
|
33
29
|
exports.knownDisAllowedNames = new Map([
|
|
34
30
|
["Function", true],
|
|
@@ -36,6 +32,11 @@ exports.knownDisAllowedNames = new Map([
|
|
|
36
32
|
["Array", true],
|
|
37
33
|
["Promise", true],
|
|
38
34
|
]);
|
|
35
|
+
exports.knownInterfaces = new Map([
|
|
36
|
+
["Node", true],
|
|
37
|
+
["Edge", true],
|
|
38
|
+
["Connection", true],
|
|
39
|
+
]);
|
|
39
40
|
const isArray = (type) => {
|
|
40
41
|
if (typeof type === "function") {
|
|
41
42
|
return false;
|
|
@@ -61,13 +62,15 @@ exports.isCustomType = isCustomType;
|
|
|
61
62
|
const isGraphQLScalarType = (type) => {
|
|
62
63
|
return type.serialize !== undefined;
|
|
63
64
|
};
|
|
64
|
-
const addCustomType = (type) => {
|
|
65
|
+
const addCustomType = (type, gqlCapture) => {
|
|
65
66
|
// TODO these should return ReadOnly objects...
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
67
|
+
const customTypes = gqlCapture.getCustomTypes();
|
|
68
|
+
const customType = customTypes.get(type.type);
|
|
69
|
+
if (customType && customType === type) {
|
|
70
|
+
return;
|
|
69
71
|
}
|
|
70
|
-
if (
|
|
72
|
+
if (type.enumMap) {
|
|
73
|
+
customTypes.set(type.type, type);
|
|
71
74
|
return;
|
|
72
75
|
}
|
|
73
76
|
try {
|
|
@@ -85,9 +88,21 @@ const addCustomType = (type) => {
|
|
|
85
88
|
}
|
|
86
89
|
}
|
|
87
90
|
catch (e) {
|
|
91
|
+
if (type.secondaryImportPath) {
|
|
92
|
+
(0, exports.addCustomType)({
|
|
93
|
+
...type,
|
|
94
|
+
importPath: type.secondaryImportPath,
|
|
95
|
+
}, gqlCapture);
|
|
96
|
+
}
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
if (customType) {
|
|
100
|
+
if (JSON.stringify(customType) !== JSON.stringify(type)) {
|
|
101
|
+
throw new Error(`cannot add multiple custom types of name ${type.type}`);
|
|
102
|
+
}
|
|
88
103
|
return;
|
|
89
104
|
}
|
|
90
|
-
|
|
105
|
+
customTypes.set(type.type, type);
|
|
91
106
|
};
|
|
92
107
|
exports.addCustomType = addCustomType;
|
|
93
108
|
const getType = (typ, result) => {
|
|
@@ -111,7 +126,8 @@ const getType = (typ, result) => {
|
|
|
111
126
|
}
|
|
112
127
|
if ((0, exports.isCustomType)(typ)) {
|
|
113
128
|
result.type = typ.type;
|
|
114
|
-
|
|
129
|
+
// TODO???
|
|
130
|
+
(0, exports.addCustomType)(typ, GQLCapture);
|
|
115
131
|
return;
|
|
116
132
|
}
|
|
117
133
|
// GraphQLScalarType or ClassType
|
|
@@ -133,8 +149,9 @@ class GQLCapture {
|
|
|
133
149
|
this.customArgs.clear();
|
|
134
150
|
this.customInputObjects.clear();
|
|
135
151
|
this.customObjects.clear();
|
|
152
|
+
this.customInterfaces.clear();
|
|
153
|
+
this.customUnions.clear();
|
|
136
154
|
this.customTypes.clear();
|
|
137
|
-
this.argMap.clear();
|
|
138
155
|
}
|
|
139
156
|
static getCustomFields() {
|
|
140
157
|
return this.customFields;
|
|
@@ -154,6 +171,12 @@ class GQLCapture {
|
|
|
154
171
|
static getCustomObjects() {
|
|
155
172
|
return this.customObjects;
|
|
156
173
|
}
|
|
174
|
+
static getCustomInterfaces() {
|
|
175
|
+
return this.customInterfaces;
|
|
176
|
+
}
|
|
177
|
+
static getCustomUnions() {
|
|
178
|
+
return this.customUnions;
|
|
179
|
+
}
|
|
157
180
|
static getCustomTypes() {
|
|
158
181
|
return this.customTypes;
|
|
159
182
|
}
|
|
@@ -198,33 +221,34 @@ class GQLCapture {
|
|
|
198
221
|
return res;
|
|
199
222
|
});
|
|
200
223
|
}
|
|
201
|
-
static
|
|
202
|
-
let type = metadata.name;
|
|
203
|
-
if ((type === "Number" || type === "Object") && !options?.type) {
|
|
204
|
-
throw new Error(`type is required when accessor/function/property returns a ${type}`);
|
|
205
|
-
}
|
|
224
|
+
static getField(field) {
|
|
206
225
|
let list;
|
|
207
226
|
let scalarType = false;
|
|
208
227
|
let connection;
|
|
209
|
-
|
|
228
|
+
let type = "";
|
|
229
|
+
if (field?.type) {
|
|
210
230
|
let r = { type: "" };
|
|
211
|
-
getType(
|
|
231
|
+
getType(field.type, r);
|
|
212
232
|
list = r.list;
|
|
213
233
|
scalarType = r.scalarType || false;
|
|
214
234
|
connection = r.connection;
|
|
215
235
|
type = r.type;
|
|
216
236
|
}
|
|
237
|
+
if (!type) {
|
|
238
|
+
throw new Error(`type is required for accessor/function/property`);
|
|
239
|
+
}
|
|
217
240
|
if (exports.knownDisAllowedNames.has(type)) {
|
|
218
241
|
throw new Error(`${type} isn't a valid type for accessor/function/property`);
|
|
219
242
|
}
|
|
220
243
|
let result = {
|
|
221
|
-
name:
|
|
222
|
-
type,
|
|
244
|
+
name: field?.name || "",
|
|
245
|
+
type: type,
|
|
223
246
|
tsType: exports.knownAllowedNames.get(type) || this.customTypes.get(type)?.tsType,
|
|
224
|
-
nullable:
|
|
247
|
+
nullable: field?.nullable,
|
|
225
248
|
list: list,
|
|
226
249
|
connection: connection,
|
|
227
|
-
|
|
250
|
+
// @ts-ignore
|
|
251
|
+
isContextArg: field?.isContextArg,
|
|
228
252
|
};
|
|
229
253
|
// unknown type. we need to flag that this field needs to eventually be resolved
|
|
230
254
|
if (!exports.knownAllowedNames.has(type)) {
|
|
@@ -236,11 +260,16 @@ class GQLCapture {
|
|
|
236
260
|
return result;
|
|
237
261
|
}
|
|
238
262
|
static gqlField(options) {
|
|
239
|
-
return function (
|
|
240
|
-
if (!GQLCapture.isEnabled()
|
|
263
|
+
return function (_target, ctx) {
|
|
264
|
+
if (!GQLCapture.isEnabled() ||
|
|
265
|
+
(ctx.kind !== "method" &&
|
|
266
|
+
ctx.kind !== "field" &&
|
|
267
|
+
ctx.kind !== "getter") ||
|
|
268
|
+
ctx.static ||
|
|
269
|
+
ctx.private) {
|
|
241
270
|
return;
|
|
242
271
|
}
|
|
243
|
-
let customField = GQLCapture.getCustomField(
|
|
272
|
+
let customField = GQLCapture.getCustomField(ctx, options);
|
|
244
273
|
if (!customField) {
|
|
245
274
|
return;
|
|
246
275
|
}
|
|
@@ -271,152 +300,109 @@ class GQLCapture {
|
|
|
271
300
|
GQLCapture.customFields.set(customField.nodeName, list);
|
|
272
301
|
};
|
|
273
302
|
}
|
|
274
|
-
static getCustomField(
|
|
303
|
+
static getCustomField(ctx, options, allowNoReturnType) {
|
|
275
304
|
let fieldType;
|
|
276
|
-
let nodeName = target.constructor.name;
|
|
277
305
|
let args = [];
|
|
278
306
|
let results = [];
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
if (returnTypeMetadata) {
|
|
282
|
-
// function...
|
|
283
|
-
if (returnTypeMetadata.name === "Promise") {
|
|
284
|
-
fieldType = CustomFieldType.AsyncFunction;
|
|
285
|
-
}
|
|
286
|
-
else {
|
|
307
|
+
switch (ctx.kind) {
|
|
308
|
+
case "method":
|
|
287
309
|
fieldType = CustomFieldType.Function;
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
fieldType = CustomFieldType.Accessor;
|
|
294
|
-
}
|
|
295
|
-
else if (descriptor && descriptor.value) {
|
|
296
|
-
// could be implicit async
|
|
297
|
-
fieldType = CustomFieldType.Function;
|
|
298
|
-
}
|
|
299
|
-
else {
|
|
310
|
+
if (options.async) {
|
|
311
|
+
fieldType = CustomFieldType.AsyncFunction;
|
|
312
|
+
}
|
|
313
|
+
break;
|
|
314
|
+
case "field":
|
|
300
315
|
fieldType = CustomFieldType.Field;
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
fieldType
|
|
304
|
-
|
|
305
|
-
results.push(GQLCapture.getResultFromMetadata(typeMetadata, options));
|
|
306
|
-
}
|
|
316
|
+
break;
|
|
317
|
+
case "getter":
|
|
318
|
+
fieldType = CustomFieldType.Accessor;
|
|
319
|
+
break;
|
|
307
320
|
}
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
name: param.name,
|
|
319
|
-
paramName,
|
|
320
|
-
isContextArg: arg.isContextArg,
|
|
321
|
-
}, arg.options);
|
|
322
|
-
// TODO this may not be the right order...
|
|
323
|
-
args.push(field);
|
|
321
|
+
if (!allowNoReturnType && !options.type) {
|
|
322
|
+
throw new Error(`type is required for ${fieldType}`);
|
|
323
|
+
}
|
|
324
|
+
if (options.type) {
|
|
325
|
+
// override name property passed down so we return '' as name
|
|
326
|
+
results.push(GQLCapture.getField({ ...options, name: "" }));
|
|
327
|
+
}
|
|
328
|
+
if (options.args?.length) {
|
|
329
|
+
options.args.forEach((arg) => {
|
|
330
|
+
args.push(GQLCapture.getField(arg));
|
|
324
331
|
});
|
|
325
|
-
// TODO this is deterministically (so far) coming in reverse order so reverse (for now)
|
|
326
|
-
args = args.reverse();
|
|
327
332
|
}
|
|
328
333
|
return {
|
|
329
|
-
nodeName:
|
|
330
|
-
gqlName: options?.name ||
|
|
331
|
-
functionName:
|
|
334
|
+
nodeName: options.class,
|
|
335
|
+
gqlName: options?.name || ctx.name.toString(),
|
|
336
|
+
functionName: ctx.name.toString(),
|
|
332
337
|
args: args,
|
|
333
338
|
results: results,
|
|
334
339
|
fieldType: fieldType,
|
|
335
340
|
description: options?.description,
|
|
336
341
|
};
|
|
337
342
|
}
|
|
338
|
-
static argImpl(name, isContextArg, options) {
|
|
339
|
-
return function (target, propertyKey, index) {
|
|
340
|
-
if (!GQLCapture.isEnabled()) {
|
|
341
|
-
return;
|
|
342
|
-
}
|
|
343
|
-
let nodeName = target.constructor.name;
|
|
344
|
-
let m = GQLCapture.argMap.get(nodeName);
|
|
345
|
-
if (!m) {
|
|
346
|
-
m = new Map();
|
|
347
|
-
GQLCapture.argMap.set(nodeName, m);
|
|
348
|
-
}
|
|
349
|
-
let propertyMap = m.get(propertyKey);
|
|
350
|
-
if (!propertyMap) {
|
|
351
|
-
propertyMap = [];
|
|
352
|
-
m.set(propertyKey, propertyMap);
|
|
353
|
-
}
|
|
354
|
-
propertyMap.push({
|
|
355
|
-
name: name,
|
|
356
|
-
index: index,
|
|
357
|
-
options: options,
|
|
358
|
-
isContextArg,
|
|
359
|
-
});
|
|
360
|
-
// console.log("arg", name, target, propertyKey, index);
|
|
361
|
-
};
|
|
362
|
-
}
|
|
363
|
-
// TODO custom args because for example name doesn't make sense here.
|
|
364
|
-
static gqlArg(name, options) {
|
|
365
|
-
return GQLCapture.argImpl(name, undefined, options);
|
|
366
|
-
}
|
|
367
343
|
static gqlContextType() {
|
|
368
|
-
|
|
369
|
-
|
|
344
|
+
return {
|
|
345
|
+
name: "context",
|
|
346
|
+
isContextArg: true,
|
|
347
|
+
type: "Context",
|
|
348
|
+
};
|
|
370
349
|
}
|
|
371
350
|
static gqlArgType(options) {
|
|
372
|
-
return function (target,
|
|
373
|
-
return GQLCapture.customGQLObject(
|
|
351
|
+
return function (target, ctx) {
|
|
352
|
+
return GQLCapture.customGQLObject(ctx, GQLCapture.customArgs, options);
|
|
374
353
|
};
|
|
375
354
|
}
|
|
376
355
|
static gqlInputObjectType(options) {
|
|
377
|
-
return function (target,
|
|
378
|
-
return GQLCapture.customGQLObject(
|
|
356
|
+
return function (target, ctx) {
|
|
357
|
+
return GQLCapture.customGQLObject(ctx, GQLCapture.customInputObjects, options);
|
|
379
358
|
};
|
|
380
359
|
}
|
|
381
360
|
static gqlObjectType(options) {
|
|
382
|
-
return function (target,
|
|
383
|
-
return GQLCapture.customGQLObject(
|
|
361
|
+
return function (target, ctx) {
|
|
362
|
+
return GQLCapture.customGQLObject(ctx, GQLCapture.customObjects, options);
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
static gqlUnionType(options) {
|
|
366
|
+
return function (target, ctx) {
|
|
367
|
+
return GQLCapture.customGQLObject(ctx, GQLCapture.customUnions, options);
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
static gqlInterfaceType(options) {
|
|
371
|
+
return function (target, ctx) {
|
|
372
|
+
return GQLCapture.customGQLObject(ctx, GQLCapture.customInterfaces, options);
|
|
384
373
|
};
|
|
385
374
|
}
|
|
386
|
-
static customGQLObject(
|
|
387
|
-
if (!GQLCapture.isEnabled()) {
|
|
375
|
+
static customGQLObject(ctx, map, options) {
|
|
376
|
+
if (!GQLCapture.isEnabled() || ctx.kind !== "class" || !ctx.name) {
|
|
388
377
|
return;
|
|
389
378
|
}
|
|
390
|
-
let className =
|
|
379
|
+
let className = ctx.name.toString();
|
|
391
380
|
let nodeName = options?.name || className;
|
|
392
381
|
map.set(className, {
|
|
393
382
|
className,
|
|
394
383
|
nodeName,
|
|
395
384
|
description: options?.description,
|
|
385
|
+
// @ts-ignore
|
|
386
|
+
interfaces: options?.interfaces,
|
|
387
|
+
// @ts-ignore
|
|
388
|
+
unionTypes: options?.unionTypes,
|
|
396
389
|
});
|
|
397
390
|
}
|
|
398
|
-
// TODO query and mutation
|
|
399
391
|
// we want to specify args if any, name, response if any
|
|
400
392
|
static gqlQuery(options) {
|
|
401
|
-
return function (target,
|
|
393
|
+
return function (target, ctx) {
|
|
402
394
|
if (!GQLCapture.isEnabled()) {
|
|
403
395
|
return;
|
|
404
396
|
}
|
|
405
|
-
GQLCapture.customQueries.push(GQLCapture.getCustomField(
|
|
397
|
+
GQLCapture.customQueries.push(GQLCapture.getCustomField(ctx, options));
|
|
406
398
|
};
|
|
407
399
|
}
|
|
408
|
-
// we want to specify inputs (required), name, response
|
|
409
|
-
// input is via gqlArg
|
|
410
|
-
// should it be gqlInputArg?
|
|
411
400
|
static gqlMutation(options) {
|
|
412
|
-
return function (target,
|
|
401
|
+
return function (target, ctx) {
|
|
413
402
|
if (!GQLCapture.isEnabled()) {
|
|
414
403
|
return;
|
|
415
404
|
}
|
|
416
|
-
GQLCapture.customMutations.push(GQLCapture.getCustomField(
|
|
417
|
-
...options,
|
|
418
|
-
allowFunctionType: true,
|
|
419
|
-
}));
|
|
405
|
+
GQLCapture.customMutations.push(GQLCapture.getCustomField(ctx, options, true));
|
|
420
406
|
};
|
|
421
407
|
}
|
|
422
408
|
static gqlConnection(type) {
|
|
@@ -426,13 +412,62 @@ class GQLCapture {
|
|
|
426
412
|
}
|
|
427
413
|
static resolve(objects) {
|
|
428
414
|
let baseObjects = new Map();
|
|
429
|
-
objects.
|
|
430
|
-
this.customObjects.forEach((
|
|
415
|
+
objects.forEach((object) => baseObjects.set(object, true));
|
|
416
|
+
this.customObjects.forEach((obj, key) => {
|
|
417
|
+
baseObjects.set(key, true);
|
|
418
|
+
obj.interfaces?.forEach((interfaceName) => {
|
|
419
|
+
const inter = this.customInterfaces.get(interfaceName);
|
|
420
|
+
if (inter) {
|
|
421
|
+
const fields = this.customFields.get(inter.nodeName);
|
|
422
|
+
if (fields) {
|
|
423
|
+
// check for duplicate fields
|
|
424
|
+
// if field is already defined no need to add it
|
|
425
|
+
let objFields = this.customFields.get(obj.nodeName);
|
|
426
|
+
if (!objFields) {
|
|
427
|
+
objFields = [];
|
|
428
|
+
}
|
|
429
|
+
let map = new Map();
|
|
430
|
+
for (const f of objFields) {
|
|
431
|
+
map.set(f.gqlName, f);
|
|
432
|
+
}
|
|
433
|
+
for (const field of fields) {
|
|
434
|
+
const newField = {
|
|
435
|
+
...field,
|
|
436
|
+
nodeName: obj.nodeName,
|
|
437
|
+
};
|
|
438
|
+
if (map.has(field.gqlName)) {
|
|
439
|
+
const existing = map.get(field.gqlName);
|
|
440
|
+
if (JSON.stringify(existing) !== JSON.stringify(newField)) {
|
|
441
|
+
throw new Error(`object ${obj.nodeName} has duplicate field ${field.gqlName} with different definition`);
|
|
442
|
+
}
|
|
443
|
+
continue;
|
|
444
|
+
}
|
|
445
|
+
objFields.push(newField);
|
|
446
|
+
}
|
|
447
|
+
this.customFields.set(obj.nodeName, objFields);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
else if (!exports.knownInterfaces.has(interfaceName)) {
|
|
451
|
+
throw new Error(`object ${key} references unknown interface ${interfaceName}`);
|
|
452
|
+
}
|
|
453
|
+
});
|
|
454
|
+
});
|
|
431
455
|
let baseArgs = new Map();
|
|
432
456
|
this.customArgs.forEach((_val, key) => baseArgs.set(key, true));
|
|
433
457
|
this.customInputObjects.forEach((_val, key) => baseArgs.set(key, true));
|
|
434
458
|
baseArgs.set("Context", true);
|
|
435
459
|
this.customTypes.forEach((_val, key) => baseArgs.set(key, true));
|
|
460
|
+
this.customUnions.forEach((val, key) => {
|
|
461
|
+
if (this.customFields.has(key)) {
|
|
462
|
+
throw new Error(`union ${key} has custom fields which is not allowed`);
|
|
463
|
+
}
|
|
464
|
+
val.unionTypes?.forEach((typ) => {
|
|
465
|
+
if (!baseObjects.has(typ)) {
|
|
466
|
+
throw new Error(`union ${key} references ${typ} which isn't a graphql object`);
|
|
467
|
+
}
|
|
468
|
+
});
|
|
469
|
+
});
|
|
470
|
+
// TODO this should be aware of knownCustomTypes
|
|
436
471
|
const resolveFields = (fields) => {
|
|
437
472
|
fields.forEach((field) => {
|
|
438
473
|
// we have a check earlier that *should* make this path impossible
|
|
@@ -453,7 +488,9 @@ class GQLCapture {
|
|
|
453
488
|
// but i don't think it applies
|
|
454
489
|
field.results.forEach((result) => {
|
|
455
490
|
if (result.needsResolving) {
|
|
456
|
-
if (baseObjects.has(result.type)
|
|
491
|
+
if (baseObjects.has(result.type) ||
|
|
492
|
+
this.customUnions.has(result.type) ||
|
|
493
|
+
this.customInterfaces.has(result.type)) {
|
|
457
494
|
result.needsResolving = false;
|
|
458
495
|
}
|
|
459
496
|
else {
|
|
@@ -468,7 +505,6 @@ class GQLCapture {
|
|
|
468
505
|
resolveFields(GQLCapture.customMutations);
|
|
469
506
|
}
|
|
470
507
|
}
|
|
471
|
-
exports.GQLCapture = GQLCapture;
|
|
472
508
|
GQLCapture.enabled = false;
|
|
473
509
|
// map from class name to fields
|
|
474
510
|
GQLCapture.customFields = new Map();
|
|
@@ -477,16 +513,18 @@ GQLCapture.customMutations = [];
|
|
|
477
513
|
GQLCapture.customArgs = new Map();
|
|
478
514
|
GQLCapture.customInputObjects = new Map();
|
|
479
515
|
GQLCapture.customObjects = new Map();
|
|
516
|
+
GQLCapture.customInterfaces = new Map();
|
|
517
|
+
GQLCapture.customUnions = new Map();
|
|
480
518
|
GQLCapture.customTypes = new Map();
|
|
481
|
-
|
|
482
|
-
GQLCapture.argMap = new Map();
|
|
519
|
+
exports.GQLCapture = GQLCapture;
|
|
483
520
|
// why is this a static class lol?
|
|
484
521
|
// TODO make all these just plain functions
|
|
485
522
|
exports.gqlField = GQLCapture.gqlField;
|
|
486
|
-
exports.gqlArg = GQLCapture.gqlArg;
|
|
487
523
|
exports.gqlArgType = GQLCapture.gqlArgType;
|
|
488
524
|
exports.gqlInputObjectType = GQLCapture.gqlInputObjectType;
|
|
489
525
|
exports.gqlObjectType = GQLCapture.gqlObjectType;
|
|
526
|
+
exports.gqlInterfaceType = GQLCapture.gqlInterfaceType;
|
|
527
|
+
exports.gqlUnionType = GQLCapture.gqlUnionType;
|
|
490
528
|
exports.gqlQuery = GQLCapture.gqlQuery;
|
|
491
529
|
exports.gqlMutation = GQLCapture.gqlMutation;
|
|
492
530
|
exports.gqlContextType = GQLCapture.gqlContextType;
|
|
@@ -8,12 +8,16 @@ export declare function validateNoCustomFields(): void;
|
|
|
8
8
|
export declare function validateCustomArgs(expected: CustomObject[]): void;
|
|
9
9
|
export declare function validateCustomInputObjects(expected: CustomObject[]): void;
|
|
10
10
|
export declare function validateCustomObjects(expected: CustomObject[]): void;
|
|
11
|
+
export declare function validateCustomInterfaces(expected: CustomObject[]): void;
|
|
12
|
+
export declare function validateCustomUnions(expected: CustomObject[]): void;
|
|
11
13
|
export declare function validateNoCustomArgs(): void;
|
|
12
14
|
export declare function validateNoCustomQueries(): void;
|
|
13
15
|
export declare function validateNoCustomMutations(): void;
|
|
14
16
|
export declare function validateNoCustomInputObjects(): void;
|
|
15
17
|
export declare function validateNoCustomObjects(): void;
|
|
16
18
|
export declare function validateNoCustomTypes(): void;
|
|
19
|
+
export declare function validateNoCustomInterfaces(): void;
|
|
20
|
+
export declare function validateNoCustomUnions(): void;
|
|
17
21
|
export declare enum CustomObjectTypes {
|
|
18
22
|
Field = 1,
|
|
19
23
|
Arg = 2,
|
|
@@ -21,7 +25,9 @@ export declare enum CustomObjectTypes {
|
|
|
21
25
|
InputObject = 8,
|
|
22
26
|
Query = 16,
|
|
23
27
|
Mutation = 32,
|
|
24
|
-
CustomTypes = 64
|
|
28
|
+
CustomTypes = 64,
|
|
29
|
+
Interface = 128,
|
|
30
|
+
Union = 256
|
|
25
31
|
}
|
|
26
32
|
export declare function validateNoCustom(...exceptions: number[]): void;
|
|
27
33
|
export declare function validateCustomTypes(expected: CustomType[]): void;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.validateCustomTypes = exports.validateNoCustom = exports.CustomObjectTypes = exports.validateNoCustomTypes = exports.validateNoCustomObjects = exports.validateNoCustomInputObjects = exports.validateNoCustomMutations = exports.validateNoCustomQueries = exports.validateNoCustomArgs = exports.validateCustomObjects = exports.validateCustomInputObjects = exports.validateCustomArgs = exports.validateNoCustomFields = exports.validateFields = exports.validateCustomQueries = exports.validateCustomMutations = exports.validateCustomFields = exports.validateOneCustomField = void 0;
|
|
3
|
+
exports.validateCustomTypes = exports.validateNoCustom = exports.CustomObjectTypes = exports.validateNoCustomUnions = exports.validateNoCustomInterfaces = exports.validateNoCustomTypes = exports.validateNoCustomObjects = exports.validateNoCustomInputObjects = exports.validateNoCustomMutations = exports.validateNoCustomQueries = exports.validateNoCustomArgs = exports.validateCustomUnions = exports.validateCustomInterfaces = exports.validateCustomObjects = exports.validateCustomInputObjects = exports.validateCustomArgs = exports.validateNoCustomFields = exports.validateFields = exports.validateCustomQueries = exports.validateCustomMutations = exports.validateCustomFields = exports.validateOneCustomField = void 0;
|
|
4
4
|
const graphql_1 = require("./graphql");
|
|
5
5
|
function validateOneCustomField(expected) {
|
|
6
6
|
let customFields = graphql_1.GQLCapture.getCustomFields();
|
|
@@ -101,6 +101,14 @@ function validateCustomObjects(expected) {
|
|
|
101
101
|
validateCustom(expected, graphql_1.GQLCapture.getCustomObjects());
|
|
102
102
|
}
|
|
103
103
|
exports.validateCustomObjects = validateCustomObjects;
|
|
104
|
+
function validateCustomInterfaces(expected) {
|
|
105
|
+
validateCustom(expected, graphql_1.GQLCapture.getCustomInterfaces());
|
|
106
|
+
}
|
|
107
|
+
exports.validateCustomInterfaces = validateCustomInterfaces;
|
|
108
|
+
function validateCustomUnions(expected) {
|
|
109
|
+
validateCustom(expected, graphql_1.GQLCapture.getCustomUnions());
|
|
110
|
+
}
|
|
111
|
+
exports.validateCustomUnions = validateCustomUnions;
|
|
104
112
|
function validateNoCustomArgs() {
|
|
105
113
|
expect(graphql_1.GQLCapture.getCustomArgs().size).toBe(0);
|
|
106
114
|
}
|
|
@@ -125,6 +133,14 @@ function validateNoCustomTypes() {
|
|
|
125
133
|
expect(graphql_1.GQLCapture.getCustomTypes().size).toBe(0);
|
|
126
134
|
}
|
|
127
135
|
exports.validateNoCustomTypes = validateNoCustomTypes;
|
|
136
|
+
function validateNoCustomInterfaces() {
|
|
137
|
+
expect(graphql_1.GQLCapture.getCustomInterfaces().size).toBe(0);
|
|
138
|
+
}
|
|
139
|
+
exports.validateNoCustomInterfaces = validateNoCustomInterfaces;
|
|
140
|
+
function validateNoCustomUnions() {
|
|
141
|
+
expect(graphql_1.GQLCapture.getCustomUnions().size).toBe(0);
|
|
142
|
+
}
|
|
143
|
+
exports.validateNoCustomUnions = validateNoCustomUnions;
|
|
128
144
|
var CustomObjectTypes;
|
|
129
145
|
(function (CustomObjectTypes) {
|
|
130
146
|
CustomObjectTypes[CustomObjectTypes["Field"] = 1] = "Field";
|
|
@@ -134,6 +150,8 @@ var CustomObjectTypes;
|
|
|
134
150
|
CustomObjectTypes[CustomObjectTypes["Query"] = 16] = "Query";
|
|
135
151
|
CustomObjectTypes[CustomObjectTypes["Mutation"] = 32] = "Mutation";
|
|
136
152
|
CustomObjectTypes[CustomObjectTypes["CustomTypes"] = 64] = "CustomTypes";
|
|
153
|
+
CustomObjectTypes[CustomObjectTypes["Interface"] = 128] = "Interface";
|
|
154
|
+
CustomObjectTypes[CustomObjectTypes["Union"] = 256] = "Union";
|
|
137
155
|
})(CustomObjectTypes = exports.CustomObjectTypes || (exports.CustomObjectTypes = {}));
|
|
138
156
|
// TODO what's a good name for this instead
|
|
139
157
|
function validateNoCustom(...exceptions) {
|
|
@@ -151,6 +169,8 @@ function validateNoCustom(...exceptions) {
|
|
|
151
169
|
validate(CustomObjectTypes.Mutation, validateNoCustomMutations);
|
|
152
170
|
validate(CustomObjectTypes.InputObject, validateNoCustomInputObjects);
|
|
153
171
|
validate(CustomObjectTypes.CustomTypes, validateNoCustomTypes);
|
|
172
|
+
validate(CustomObjectTypes.Interface, validateNoCustomInterfaces);
|
|
173
|
+
validate(CustomObjectTypes.Union, validateNoCustomUnions);
|
|
154
174
|
}
|
|
155
175
|
exports.validateNoCustom = validateNoCustom;
|
|
156
176
|
function validateCustomTypes(expected) {
|
package/graphql/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
export { gqlFieldOptions, gqlObjectOptions, gqlField,
|
|
1
|
+
export { gqlFieldOptions, gqlObjectOptions, gqlField, gqlArgType, gqlInputObjectType, gqlObjectType, gqlQuery, gqlMutation, gqlContextType, gqlConnection, GraphQLConnection, GQLCapture, gqlFileUpload, CustomType, } from "./graphql";
|
|
2
2
|
export { GraphQLTime } from "./scalars/time";
|
|
3
|
+
export { GraphQLOrderByDirection } from "./scalars/orderby_direction";
|
|
3
4
|
export { GraphQLPageInfo } from "./query/page_info";
|
|
4
5
|
export { GraphQLEdge, GraphQLEdgeConnection } from "./query/edge_connection";
|
|
5
6
|
export { GraphQLEdgeType, GraphQLConnectionType, } from "./query/connection_type";
|
|
@@ -7,5 +8,4 @@ export { GraphQLNodeInterface } from "./builtins/node";
|
|
|
7
8
|
export { GraphQLConnectionInterface } from "./builtins/connection";
|
|
8
9
|
export { GraphQLEdgeInterface } from "./builtins/edge";
|
|
9
10
|
export { NodeResolver, EntNodeResolver, registerResolver, clearResolvers, resolveID, nodeIDEncoder, mustDecodeIDFromGQLID, mustDecodeNullableIDFromGQLID, encodeGQLID, } from "./node_resolver";
|
|
10
|
-
export { convertFromGQLEnum, convertToGQLEnum } from "./enums";
|
|
11
11
|
export { transformUnionTypes } from "./mutations/union";
|
package/graphql/index.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.transformUnionTypes = exports.
|
|
3
|
+
exports.transformUnionTypes = exports.encodeGQLID = exports.mustDecodeNullableIDFromGQLID = exports.mustDecodeIDFromGQLID = exports.nodeIDEncoder = exports.resolveID = exports.clearResolvers = exports.registerResolver = exports.EntNodeResolver = exports.GraphQLEdgeInterface = exports.GraphQLConnectionInterface = exports.GraphQLNodeInterface = exports.GraphQLConnectionType = exports.GraphQLEdgeType = exports.GraphQLEdgeConnection = exports.GraphQLPageInfo = exports.GraphQLOrderByDirection = exports.GraphQLTime = exports.gqlFileUpload = exports.GQLCapture = exports.gqlConnection = exports.gqlContextType = exports.gqlMutation = exports.gqlQuery = exports.gqlObjectType = exports.gqlInputObjectType = exports.gqlArgType = exports.gqlField = void 0;
|
|
4
4
|
var graphql_1 = require("./graphql");
|
|
5
5
|
Object.defineProperty(exports, "gqlField", { enumerable: true, get: function () { return graphql_1.gqlField; } });
|
|
6
|
-
Object.defineProperty(exports, "gqlArg", { enumerable: true, get: function () { return graphql_1.gqlArg; } });
|
|
7
6
|
Object.defineProperty(exports, "gqlArgType", { enumerable: true, get: function () { return graphql_1.gqlArgType; } });
|
|
8
7
|
Object.defineProperty(exports, "gqlInputObjectType", { enumerable: true, get: function () { return graphql_1.gqlInputObjectType; } });
|
|
9
8
|
Object.defineProperty(exports, "gqlObjectType", { enumerable: true, get: function () { return graphql_1.gqlObjectType; } });
|
|
@@ -15,6 +14,8 @@ Object.defineProperty(exports, "GQLCapture", { enumerable: true, get: function (
|
|
|
15
14
|
Object.defineProperty(exports, "gqlFileUpload", { enumerable: true, get: function () { return graphql_1.gqlFileUpload; } });
|
|
16
15
|
var time_1 = require("./scalars/time");
|
|
17
16
|
Object.defineProperty(exports, "GraphQLTime", { enumerable: true, get: function () { return time_1.GraphQLTime; } });
|
|
17
|
+
var orderby_direction_1 = require("./scalars/orderby_direction");
|
|
18
|
+
Object.defineProperty(exports, "GraphQLOrderByDirection", { enumerable: true, get: function () { return orderby_direction_1.GraphQLOrderByDirection; } });
|
|
18
19
|
var page_info_1 = require("./query/page_info");
|
|
19
20
|
Object.defineProperty(exports, "GraphQLPageInfo", { enumerable: true, get: function () { return page_info_1.GraphQLPageInfo; } });
|
|
20
21
|
var edge_connection_1 = require("./query/edge_connection");
|
|
@@ -37,8 +38,5 @@ Object.defineProperty(exports, "nodeIDEncoder", { enumerable: true, get: functio
|
|
|
37
38
|
Object.defineProperty(exports, "mustDecodeIDFromGQLID", { enumerable: true, get: function () { return node_resolver_1.mustDecodeIDFromGQLID; } });
|
|
38
39
|
Object.defineProperty(exports, "mustDecodeNullableIDFromGQLID", { enumerable: true, get: function () { return node_resolver_1.mustDecodeNullableIDFromGQLID; } });
|
|
39
40
|
Object.defineProperty(exports, "encodeGQLID", { enumerable: true, get: function () { return node_resolver_1.encodeGQLID; } });
|
|
40
|
-
var enums_1 = require("./enums");
|
|
41
|
-
Object.defineProperty(exports, "convertFromGQLEnum", { enumerable: true, get: function () { return enums_1.convertFromGQLEnum; } });
|
|
42
|
-
Object.defineProperty(exports, "convertToGQLEnum", { enumerable: true, get: function () { return enums_1.convertToGQLEnum; } });
|
|
43
41
|
var union_1 = require("./mutations/union");
|
|
44
42
|
Object.defineProperty(exports, "transformUnionTypes", { enumerable: true, get: function () { return union_1.transformUnionTypes; } });
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { GraphQLFieldConfigMap, GraphQLObjectType, GraphQLInterfaceType } from "graphql";
|
|
2
2
|
import { RequestContext } from "../../core/context";
|
|
3
3
|
import { GraphQLEdge } from "./edge_connection";
|
|
4
|
-
import { Data } from "../../core/base";
|
|
5
|
-
|
|
6
|
-
export declare class GraphQLEdgeType<TNode extends nodeType, TEdge extends Data> extends GraphQLObjectType {
|
|
7
|
-
constructor(name: string, nodeType: TNode, optionalFields?: () => GraphQLFieldConfigMap<GraphQLEdge<TEdge>, RequestContext
|
|
4
|
+
import { Data, Viewer } from "../../core/base";
|
|
5
|
+
type nodeType = GraphQLObjectType | GraphQLInterfaceType;
|
|
6
|
+
export declare class GraphQLEdgeType<TNode extends nodeType, TEdge extends Data, TViewer extends Viewer> extends GraphQLObjectType {
|
|
7
|
+
constructor(name: string, nodeType: TNode, optionalFields?: () => GraphQLFieldConfigMap<GraphQLEdge<TEdge>, RequestContext<TViewer>>);
|
|
8
8
|
}
|
|
9
|
-
interface connectionOptions<T extends Data> {
|
|
10
|
-
fields?(): GraphQLFieldConfigMap<GraphQLEdge<T>, RequestContext
|
|
9
|
+
interface connectionOptions<T extends Data, TViewer extends Viewer> {
|
|
10
|
+
fields?(): GraphQLFieldConfigMap<GraphQLEdge<T>, RequestContext<TViewer>>;
|
|
11
11
|
}
|
|
12
|
-
export declare class GraphQLConnectionType<TNode extends nodeType, TEdge extends Data> extends GraphQLObjectType {
|
|
13
|
-
edgeType: GraphQLEdgeType<TNode, TEdge>;
|
|
14
|
-
constructor(name: string, nodeType: TNode, options?: connectionOptions<TEdge>);
|
|
12
|
+
export declare class GraphQLConnectionType<TNode extends nodeType, TEdge extends Data, TViewer extends Viewer> extends GraphQLObjectType {
|
|
13
|
+
edgeType: GraphQLEdgeType<TNode, TEdge, TViewer>;
|
|
14
|
+
constructor(name: string, nodeType: TNode, options?: connectionOptions<TEdge, TViewer>);
|
|
15
15
|
}
|
|
16
16
|
export {};
|