@graphitation/supermassive 0.8.5 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintcache +1 -0
- package/CHANGELOG.md +18 -2
- package/lib/bin/supermassive.d.ts.map +1 -1
- package/lib/bin/supermassive.js +48 -4
- package/lib/bin/supermassive.mjs +48 -4
- package/lib/codegen/context/expect.d.ts +1 -0
- package/lib/codegen/context/expect.d.ts.map +1 -0
- package/lib/codegen/context/expect.js +0 -0
- package/lib/codegen/context/expect.mjs +0 -0
- package/lib/codegen/context/import.d.ts +5 -0
- package/lib/codegen/context/import.d.ts.map +1 -0
- package/lib/codegen/context/import.js +55 -0
- package/lib/codegen/context/import.mjs +37 -0
- package/lib/codegen/context/index.d.ts +51 -0
- package/lib/codegen/context/index.d.ts.map +1 -0
- package/lib/codegen/context/index.js +234 -0
- package/lib/codegen/context/index.mjs +223 -0
- package/lib/codegen/context/model.d.ts +5 -0
- package/lib/codegen/context/model.d.ts.map +1 -0
- package/lib/codegen/context/model.js +53 -0
- package/lib/codegen/context/model.mjs +37 -0
- package/lib/codegen/context/utilities.d.ts +2 -0
- package/lib/codegen/context/utilities.d.ts.map +1 -0
- package/lib/codegen/context/utilities.js +26 -0
- package/lib/codegen/context/utilities.mjs +8 -0
- package/lib/codegen/index.d.ts +7 -0
- package/lib/codegen/index.d.ts.map +1 -0
- package/lib/codegen/index.js +41 -0
- package/lib/codegen/index.mjs +23 -0
- package/lib/codegen/models.d.ts +5 -0
- package/lib/codegen/models.d.ts.map +1 -0
- package/lib/codegen/models.js +157 -0
- package/lib/codegen/models.mjs +141 -0
- package/lib/codegen/resolvers.d.ts +5 -0
- package/lib/codegen/resolvers.d.ts.map +1 -0
- package/lib/codegen/resolvers.js +146 -0
- package/lib/codegen/resolvers.mjs +133 -0
- package/lib/codegen/typedVisitor.d.ts +57 -0
- package/lib/codegen/typedVisitor.d.ts.map +1 -0
- package/lib/codegen/typedVisitor.js +26 -0
- package/lib/codegen/typedVisitor.mjs +8 -0
- package/lib/codegen/types.d.ts +18 -0
- package/lib/codegen/types.d.ts.map +1 -0
- package/lib/codegen/types.js +15 -0
- package/lib/codegen/types.mjs +0 -0
- package/lib/codegen/utilities.d.ts +39 -0
- package/lib/codegen/utilities.d.ts.map +1 -0
- package/lib/codegen/utilities.js +166 -0
- package/lib/codegen/utilities.mjs +148 -0
- package/lib/{extractImplicitTypesToTypescript.d.ts → extractors/extractImplicitTypesToTypescript.d.ts} +0 -0
- package/lib/extractors/extractImplicitTypesToTypescript.d.ts.map +1 -0
- package/lib/{extractImplicitTypesToTypescript.js → extractors/extractImplicitTypesToTypescript.js} +0 -0
- package/lib/{extractImplicitTypesToTypescript.mjs → extractors/extractImplicitTypesToTypescript.mjs} +1 -1
- package/lib/extractors/index.d.ts +2 -0
- package/lib/extractors/index.d.ts.map +1 -0
- package/lib/extractors/index.js +23 -0
- package/lib/extractors/index.mjs +5 -0
- package/lib/index.d.ts +3 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -2
- package/lib/index.mjs +2 -2
- package/lib/utilities/blankGraphQLTag.d.ts +2 -0
- package/lib/utilities/blankGraphQLTag.d.ts.map +1 -0
- package/lib/utilities/blankGraphQLTag.js +25 -0
- package/lib/utilities/blankGraphQLTag.mjs +7 -0
- package/package.json +13 -8
- package/lib/extractImplicitTypesToTypescript.d.ts.map +0 -1
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// src/codegen/index.ts
|
|
2
|
+
import { extractContext } from "./context.mjs";
|
|
3
|
+
import { generateResolvers } from "./resolvers.mjs";
|
|
4
|
+
import { generateModels } from "./models.mjs";
|
|
5
|
+
function generateTS(document, contextImport, contextName) {
|
|
6
|
+
try {
|
|
7
|
+
let context = extractContext({
|
|
8
|
+
context: {
|
|
9
|
+
name: contextName,
|
|
10
|
+
from: contextImport || null
|
|
11
|
+
}
|
|
12
|
+
}, document);
|
|
13
|
+
let models = generateModels(context, document);
|
|
14
|
+
let resolvers = generateResolvers(context, document);
|
|
15
|
+
return { models, resolvers };
|
|
16
|
+
} catch (e) {
|
|
17
|
+
console.error(e);
|
|
18
|
+
throw e;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export {
|
|
22
|
+
generateTS
|
|
23
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/codegen/models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAQ7C,wBAAgB,cAAc,CAC5B,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,YAAY,GACrB,EAAE,CAAC,UAAU,CAEf"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod));
|
|
20
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
21
|
+
var models_exports = {};
|
|
22
|
+
__export(models_exports, {
|
|
23
|
+
generateModels: () => generateModels
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(models_exports);
|
|
26
|
+
var import_typescript = __toESM(require("typescript"));
|
|
27
|
+
var import_typedVisitor = require("./typedVisitor");
|
|
28
|
+
var import_utilities = require("./utilities");
|
|
29
|
+
function generateModels(context, document) {
|
|
30
|
+
return (0, import_typedVisitor.visit)(document, createModelsReducer(context));
|
|
31
|
+
}
|
|
32
|
+
function createModelsReducer(context) {
|
|
33
|
+
return {
|
|
34
|
+
Document: {
|
|
35
|
+
leave(node) {
|
|
36
|
+
const imports = context.getAllModelImportDeclarations();
|
|
37
|
+
const statements = node.definitions;
|
|
38
|
+
return import_typescript.factory.createSourceFile(imports.concat(context.getDefaultTypes(), statements.flat()), import_typescript.factory.createToken(import_typescript.default.SyntaxKind.EndOfFileToken), import_typescript.default.NodeFlags.None);
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
SchemaExtension: {
|
|
42
|
+
leave() {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
ObjectTypeExtension: {
|
|
47
|
+
leave() {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
FieldDefinition: {
|
|
52
|
+
leave(node) {
|
|
53
|
+
return import_typescript.factory.createPropertySignature(void 0, import_typescript.factory.createIdentifier(node.name), void 0, node.type);
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
ObjectTypeDefinition: {
|
|
57
|
+
leave(node) {
|
|
58
|
+
const model = context.getDefinedModelType(node.name);
|
|
59
|
+
const interfaces = node.interfaces || [];
|
|
60
|
+
const extendTypes = [context.getBaseModelType()];
|
|
61
|
+
if (model) {
|
|
62
|
+
extendTypes.push(model);
|
|
63
|
+
}
|
|
64
|
+
if (["Query", "Mutation", "Subscription"].includes(node.name)) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
return import_typescript.factory.createInterfaceDeclaration(void 0, [import_typescript.factory.createModifier(import_typescript.default.SyntaxKind.ExportKeyword)], import_typescript.factory.createIdentifier((0, import_utilities.addModelSuffix)(node.name)), void 0, [
|
|
68
|
+
import_typescript.factory.createHeritageClause(import_typescript.default.SyntaxKind.ExtendsKeyword, [
|
|
69
|
+
...extendTypes.map((type) => import_typescript.factory.createExpressionWithTypeArguments(type.toExpression(), void 0)),
|
|
70
|
+
...interfaces.map((interfaceExpression) => import_typescript.factory.createExpressionWithTypeArguments(interfaceExpression, void 0))
|
|
71
|
+
])
|
|
72
|
+
], [
|
|
73
|
+
import_typescript.factory.createPropertySignature(void 0, "__typename", void 0, import_typescript.factory.createLiteralTypeNode(import_typescript.factory.createStringLiteral(node.name))),
|
|
74
|
+
...!model && node.fields || []
|
|
75
|
+
]);
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
InputObjectTypeDefinition: {
|
|
79
|
+
leave(node) {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
InputValueDefinition: {
|
|
84
|
+
leave(node) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
EnumTypeDefinition: {
|
|
89
|
+
leave(node) {
|
|
90
|
+
return import_typescript.factory.createEnumDeclaration(void 0, [import_typescript.factory.createModifier(import_typescript.default.SyntaxKind.ExportKeyword)], (0, import_utilities.addModelSuffix)(node.name), node.values || []);
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
EnumValueDefinition: {
|
|
94
|
+
leave(node) {
|
|
95
|
+
return import_typescript.factory.createEnumMember(node.name, import_typescript.factory.createStringLiteral(node.name));
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
InterfaceTypeDefinition: {
|
|
99
|
+
leave(node) {
|
|
100
|
+
const extendTypes = [context.getBaseModelType()];
|
|
101
|
+
return import_typescript.factory.createInterfaceDeclaration(void 0, [import_typescript.factory.createModifier(import_typescript.default.SyntaxKind.ExportKeyword)], import_typescript.factory.createIdentifier((0, import_utilities.addModelSuffix)(node.name)), void 0, [
|
|
102
|
+
import_typescript.factory.createHeritageClause(import_typescript.default.SyntaxKind.ExtendsKeyword, extendTypes.map((type) => import_typescript.factory.createExpressionWithTypeArguments(type.toExpression(), void 0)))
|
|
103
|
+
], [
|
|
104
|
+
import_typescript.factory.createPropertySignature(void 0, "__typename", void 0, import_typescript.factory.createKeywordTypeNode(import_typescript.default.SyntaxKind.StringKeyword))
|
|
105
|
+
]);
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
UnionTypeDefinition: {
|
|
109
|
+
leave({ name, types }) {
|
|
110
|
+
return import_typescript.factory.createTypeAliasDeclaration(void 0, [import_typescript.factory.createModifier(import_typescript.default.SyntaxKind.ExportKeyword)], import_typescript.factory.createIdentifier((0, import_utilities.addModelSuffix)(name)), void 0, import_typescript.factory.createUnionTypeNode((types == null ? void 0 : types.map((type) => {
|
|
111
|
+
return (0, import_utilities.createNonNullableType)(type);
|
|
112
|
+
})) || []));
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
ScalarTypeDefinition: {
|
|
116
|
+
leave(node) {
|
|
117
|
+
context.addScalar(node.name);
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
NamedType: {
|
|
122
|
+
leave(node, _a, _p, path, ancestors) {
|
|
123
|
+
const isAncestorInput = (0, import_utilities.isDirectAncestorInput)(ancestors);
|
|
124
|
+
const isImplementedInterface = path[path.length - 2] === "interfaces";
|
|
125
|
+
if (isImplementedInterface) {
|
|
126
|
+
return import_typescript.factory.createIdentifier((0, import_utilities.addModelSuffix)(node.name));
|
|
127
|
+
}
|
|
128
|
+
return (0, import_utilities.createNullableType)(context.getModelType(node.name, !isAncestorInput).toTypeReference());
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
ListType: {
|
|
132
|
+
leave({ type }) {
|
|
133
|
+
return (0, import_utilities.createNullableType)(import_typescript.factory.createArrayTypeNode(type));
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
NonNullType: {
|
|
137
|
+
leave({ type }) {
|
|
138
|
+
return (0, import_utilities.createNonNullableType)(type);
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
Name: {
|
|
142
|
+
leave(node) {
|
|
143
|
+
return node.value;
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
DirectiveDefinition: {
|
|
147
|
+
leave() {
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
Directive: {
|
|
152
|
+
leave() {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
// src/codegen/models.ts
|
|
2
|
+
import ts, { factory } from "typescript";
|
|
3
|
+
import { visit } from "./typedVisitor.mjs";
|
|
4
|
+
import {
|
|
5
|
+
createNullableType,
|
|
6
|
+
createNonNullableType,
|
|
7
|
+
isDirectAncestorInput,
|
|
8
|
+
addModelSuffix
|
|
9
|
+
} from "./utilities.mjs";
|
|
10
|
+
function generateModels(context, document) {
|
|
11
|
+
return visit(document, createModelsReducer(context));
|
|
12
|
+
}
|
|
13
|
+
function createModelsReducer(context) {
|
|
14
|
+
return {
|
|
15
|
+
Document: {
|
|
16
|
+
leave(node) {
|
|
17
|
+
const imports = context.getAllModelImportDeclarations();
|
|
18
|
+
const statements = node.definitions;
|
|
19
|
+
return factory.createSourceFile(imports.concat(context.getDefaultTypes(), statements.flat()), factory.createToken(ts.SyntaxKind.EndOfFileToken), ts.NodeFlags.None);
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
SchemaExtension: {
|
|
23
|
+
leave() {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
ObjectTypeExtension: {
|
|
28
|
+
leave() {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
FieldDefinition: {
|
|
33
|
+
leave(node) {
|
|
34
|
+
return factory.createPropertySignature(void 0, factory.createIdentifier(node.name), void 0, node.type);
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
ObjectTypeDefinition: {
|
|
38
|
+
leave(node) {
|
|
39
|
+
const model = context.getDefinedModelType(node.name);
|
|
40
|
+
const interfaces = node.interfaces || [];
|
|
41
|
+
const extendTypes = [context.getBaseModelType()];
|
|
42
|
+
if (model) {
|
|
43
|
+
extendTypes.push(model);
|
|
44
|
+
}
|
|
45
|
+
if (["Query", "Mutation", "Subscription"].includes(node.name)) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
return factory.createInterfaceDeclaration(void 0, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier(addModelSuffix(node.name)), void 0, [
|
|
49
|
+
factory.createHeritageClause(ts.SyntaxKind.ExtendsKeyword, [
|
|
50
|
+
...extendTypes.map((type) => factory.createExpressionWithTypeArguments(type.toExpression(), void 0)),
|
|
51
|
+
...interfaces.map((interfaceExpression) => factory.createExpressionWithTypeArguments(interfaceExpression, void 0))
|
|
52
|
+
])
|
|
53
|
+
], [
|
|
54
|
+
factory.createPropertySignature(void 0, "__typename", void 0, factory.createLiteralTypeNode(factory.createStringLiteral(node.name))),
|
|
55
|
+
...!model && node.fields || []
|
|
56
|
+
]);
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
InputObjectTypeDefinition: {
|
|
60
|
+
leave(node) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
InputValueDefinition: {
|
|
65
|
+
leave(node) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
EnumTypeDefinition: {
|
|
70
|
+
leave(node) {
|
|
71
|
+
return factory.createEnumDeclaration(void 0, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], addModelSuffix(node.name), node.values || []);
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
EnumValueDefinition: {
|
|
75
|
+
leave(node) {
|
|
76
|
+
return factory.createEnumMember(node.name, factory.createStringLiteral(node.name));
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
InterfaceTypeDefinition: {
|
|
80
|
+
leave(node) {
|
|
81
|
+
const extendTypes = [context.getBaseModelType()];
|
|
82
|
+
return factory.createInterfaceDeclaration(void 0, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier(addModelSuffix(node.name)), void 0, [
|
|
83
|
+
factory.createHeritageClause(ts.SyntaxKind.ExtendsKeyword, extendTypes.map((type) => factory.createExpressionWithTypeArguments(type.toExpression(), void 0)))
|
|
84
|
+
], [
|
|
85
|
+
factory.createPropertySignature(void 0, "__typename", void 0, factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword))
|
|
86
|
+
]);
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
UnionTypeDefinition: {
|
|
90
|
+
leave({ name, types }) {
|
|
91
|
+
return factory.createTypeAliasDeclaration(void 0, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier(addModelSuffix(name)), void 0, factory.createUnionTypeNode((types == null ? void 0 : types.map((type) => {
|
|
92
|
+
return createNonNullableType(type);
|
|
93
|
+
})) || []));
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
ScalarTypeDefinition: {
|
|
97
|
+
leave(node) {
|
|
98
|
+
context.addScalar(node.name);
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
NamedType: {
|
|
103
|
+
leave(node, _a, _p, path, ancestors) {
|
|
104
|
+
const isAncestorInput = isDirectAncestorInput(ancestors);
|
|
105
|
+
const isImplementedInterface = path[path.length - 2] === "interfaces";
|
|
106
|
+
if (isImplementedInterface) {
|
|
107
|
+
return factory.createIdentifier(addModelSuffix(node.name));
|
|
108
|
+
}
|
|
109
|
+
return createNullableType(context.getModelType(node.name, !isAncestorInput).toTypeReference());
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
ListType: {
|
|
113
|
+
leave({ type }) {
|
|
114
|
+
return createNullableType(factory.createArrayTypeNode(type));
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
NonNullType: {
|
|
118
|
+
leave({ type }) {
|
|
119
|
+
return createNonNullableType(type);
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
Name: {
|
|
123
|
+
leave(node) {
|
|
124
|
+
return node.value;
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
DirectiveDefinition: {
|
|
128
|
+
leave() {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
Directive: {
|
|
133
|
+
leave() {
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
export {
|
|
140
|
+
generateModels
|
|
141
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolvers.d.ts","sourceRoot":"","sources":["../../src/codegen/resolvers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,MAAM,YAAY,CAAC;AACzC,OAAO,EACL,YAAY,EAIb,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAO7C,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,YAAY,GACrB,EAAE,CAAC,UAAU,CAEf"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod));
|
|
20
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
21
|
+
var resolvers_exports = {};
|
|
22
|
+
__export(resolvers_exports, {
|
|
23
|
+
generateResolvers: () => generateResolvers
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(resolvers_exports);
|
|
26
|
+
var import_typescript = __toESM(require("typescript"));
|
|
27
|
+
var import_graphql = require("graphql");
|
|
28
|
+
var import_typedVisitor = require("./typedVisitor");
|
|
29
|
+
var import_utilities = require("./utilities");
|
|
30
|
+
function generateResolvers(context, document) {
|
|
31
|
+
return (0, import_typedVisitor.visit)(document, createResolversReducer(context));
|
|
32
|
+
}
|
|
33
|
+
function createResolversReducer(context) {
|
|
34
|
+
return {
|
|
35
|
+
Document: {
|
|
36
|
+
leave(node) {
|
|
37
|
+
const imports = context.getAllResolverImportDeclarations();
|
|
38
|
+
const statements = node.definitions;
|
|
39
|
+
return import_typescript.factory.createSourceFile(imports.concat(statements.flat()), import_typescript.factory.createToken(import_typescript.default.SyntaxKind.EndOfFileToken), import_typescript.default.NodeFlags.None);
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
SchemaExtension: {
|
|
43
|
+
leave() {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
ObjectTypeDefinition: {
|
|
48
|
+
leave(node) {
|
|
49
|
+
return import_typescript.factory.createModuleDeclaration(void 0, [
|
|
50
|
+
import_typescript.factory.createModifier(import_typescript.default.SyntaxKind.ExportKeyword),
|
|
51
|
+
import_typescript.factory.createModifier(import_typescript.default.SyntaxKind.DeclareKeyword)
|
|
52
|
+
], import_typescript.factory.createIdentifier(node.name), import_typescript.factory.createModuleBlock(node.fields || []), import_typescript.default.NodeFlags.Namespace);
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
ObjectTypeExtension: {
|
|
56
|
+
leave(node) {
|
|
57
|
+
return import_typescript.factory.createModuleDeclaration(void 0, [
|
|
58
|
+
import_typescript.factory.createModifier(import_typescript.default.SyntaxKind.ExportKeyword),
|
|
59
|
+
import_typescript.factory.createModifier(import_typescript.default.SyntaxKind.DeclareKeyword)
|
|
60
|
+
], import_typescript.factory.createIdentifier(node.name), import_typescript.factory.createModuleBlock(node.fields || []), import_typescript.default.NodeFlags.Namespace);
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
FieldDefinition: {
|
|
64
|
+
leave(node, _a, _p, _path, ancestors) {
|
|
65
|
+
const parentObject = ancestors[ancestors.length - 1];
|
|
66
|
+
if (!("kind" in parentObject && ((0, import_graphql.isTypeDefinitionNode)(parentObject) || (0, import_graphql.isTypeExtensionNode)(parentObject)))) {
|
|
67
|
+
throw new Error("Invalid parent for field");
|
|
68
|
+
}
|
|
69
|
+
const parentName = parentObject.name.value;
|
|
70
|
+
let modelIdentifier;
|
|
71
|
+
if (["Query", "Mutation", "Subscription"].includes(parentName)) {
|
|
72
|
+
modelIdentifier = import_typescript.factory.createKeywordTypeNode(import_typescript.default.SyntaxKind.UnknownKeyword);
|
|
73
|
+
} else if (parentObject.kind !== import_graphql.Kind.INTERFACE_TYPE_DEFINITION) {
|
|
74
|
+
modelIdentifier = context.getModelType(parentName, true, true).toTypeReference();
|
|
75
|
+
}
|
|
76
|
+
return import_typescript.factory.createTypeAliasDeclaration(void 0, [import_typescript.factory.createModifier(import_typescript.default.SyntaxKind.ExportKeyword)], import_typescript.factory.createIdentifier(node.name), void 0, import_typescript.factory.createFunctionTypeNode(void 0, [
|
|
77
|
+
import_typescript.factory.createParameterDeclaration(void 0, void 0, void 0, import_typescript.factory.createIdentifier("model"), void 0, modelIdentifier, void 0),
|
|
78
|
+
import_typescript.factory.createParameterDeclaration(void 0, void 0, void 0, import_typescript.factory.createIdentifier("args"), void 0, import_typescript.factory.createTypeLiteralNode(node.arguments || []), void 0),
|
|
79
|
+
import_typescript.factory.createParameterDeclaration(void 0, void 0, void 0, import_typescript.factory.createIdentifier("context"), void 0, context.getContextType().toTypeReference(), void 0),
|
|
80
|
+
import_typescript.factory.createParameterDeclaration(void 0, void 0, void 0, import_typescript.factory.createIdentifier("info"), void 0, context.getResolveInfoType().toTypeReference(), void 0)
|
|
81
|
+
], import_typescript.factory.createTypeReferenceNode(import_typescript.factory.createIdentifier("PromiseOrValue"), [node.type])));
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
NamedType: {
|
|
85
|
+
leave(node, _a, _p, _path, ancestors) {
|
|
86
|
+
const isAncestorInput = (0, import_utilities.isDirectAncestorInput)(ancestors);
|
|
87
|
+
return (0, import_utilities.createNullableType)(context.getModelType(node.name, !isAncestorInput, !isAncestorInput, true).toTypeReference());
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
ListType: {
|
|
91
|
+
leave({ type }) {
|
|
92
|
+
return (0, import_utilities.createNullableType)(import_typescript.factory.createArrayTypeNode(type));
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
NonNullType: {
|
|
96
|
+
leave({ type }) {
|
|
97
|
+
return (0, import_utilities.createNonNullableType)(type);
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
Name: {
|
|
101
|
+
leave(node) {
|
|
102
|
+
return node.value;
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
Directive: {
|
|
106
|
+
leave() {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
InputValueDefinition: {
|
|
111
|
+
leave(node) {
|
|
112
|
+
return import_typescript.factory.createPropertySignature(void 0, node.name, void 0, node.type);
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
InputObjectTypeDefinition: {
|
|
116
|
+
leave(node) {
|
|
117
|
+
return import_typescript.factory.createTypeAliasDeclaration(void 0, [import_typescript.factory.createModifier(import_typescript.default.SyntaxKind.ExportKeyword)], node.name, void 0, import_typescript.factory.createTypeLiteralNode(node.fields || []));
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
UnionTypeDefinition: {
|
|
121
|
+
leave() {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
EnumTypeDefinition: {
|
|
126
|
+
leave() {
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
InterfaceTypeDefinition: {
|
|
131
|
+
leave() {
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
DirectiveDefinition: {
|
|
136
|
+
leave() {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
ScalarTypeDefinition: {
|
|
141
|
+
leave() {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// src/codegen/resolvers.ts
|
|
2
|
+
import ts, { factory } from "typescript";
|
|
3
|
+
import {
|
|
4
|
+
isTypeDefinitionNode,
|
|
5
|
+
isTypeExtensionNode,
|
|
6
|
+
Kind
|
|
7
|
+
} from "graphql";
|
|
8
|
+
import { visit } from "./typedVisitor.mjs";
|
|
9
|
+
import {
|
|
10
|
+
createNullableType,
|
|
11
|
+
createNonNullableType,
|
|
12
|
+
isDirectAncestorInput
|
|
13
|
+
} from "./utilities.mjs";
|
|
14
|
+
function generateResolvers(context, document) {
|
|
15
|
+
return visit(document, createResolversReducer(context));
|
|
16
|
+
}
|
|
17
|
+
function createResolversReducer(context) {
|
|
18
|
+
return {
|
|
19
|
+
Document: {
|
|
20
|
+
leave(node) {
|
|
21
|
+
const imports = context.getAllResolverImportDeclarations();
|
|
22
|
+
const statements = node.definitions;
|
|
23
|
+
return factory.createSourceFile(imports.concat(statements.flat()), factory.createToken(ts.SyntaxKind.EndOfFileToken), ts.NodeFlags.None);
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
SchemaExtension: {
|
|
27
|
+
leave() {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
ObjectTypeDefinition: {
|
|
32
|
+
leave(node) {
|
|
33
|
+
return factory.createModuleDeclaration(void 0, [
|
|
34
|
+
factory.createModifier(ts.SyntaxKind.ExportKeyword),
|
|
35
|
+
factory.createModifier(ts.SyntaxKind.DeclareKeyword)
|
|
36
|
+
], factory.createIdentifier(node.name), factory.createModuleBlock(node.fields || []), ts.NodeFlags.Namespace);
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
ObjectTypeExtension: {
|
|
40
|
+
leave(node) {
|
|
41
|
+
return factory.createModuleDeclaration(void 0, [
|
|
42
|
+
factory.createModifier(ts.SyntaxKind.ExportKeyword),
|
|
43
|
+
factory.createModifier(ts.SyntaxKind.DeclareKeyword)
|
|
44
|
+
], factory.createIdentifier(node.name), factory.createModuleBlock(node.fields || []), ts.NodeFlags.Namespace);
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
FieldDefinition: {
|
|
48
|
+
leave(node, _a, _p, _path, ancestors) {
|
|
49
|
+
const parentObject = ancestors[ancestors.length - 1];
|
|
50
|
+
if (!("kind" in parentObject && (isTypeDefinitionNode(parentObject) || isTypeExtensionNode(parentObject)))) {
|
|
51
|
+
throw new Error("Invalid parent for field");
|
|
52
|
+
}
|
|
53
|
+
const parentName = parentObject.name.value;
|
|
54
|
+
let modelIdentifier;
|
|
55
|
+
if (["Query", "Mutation", "Subscription"].includes(parentName)) {
|
|
56
|
+
modelIdentifier = factory.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword);
|
|
57
|
+
} else if (parentObject.kind !== Kind.INTERFACE_TYPE_DEFINITION) {
|
|
58
|
+
modelIdentifier = context.getModelType(parentName, true, true).toTypeReference();
|
|
59
|
+
}
|
|
60
|
+
return factory.createTypeAliasDeclaration(void 0, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier(node.name), void 0, factory.createFunctionTypeNode(void 0, [
|
|
61
|
+
factory.createParameterDeclaration(void 0, void 0, void 0, factory.createIdentifier("model"), void 0, modelIdentifier, void 0),
|
|
62
|
+
factory.createParameterDeclaration(void 0, void 0, void 0, factory.createIdentifier("args"), void 0, factory.createTypeLiteralNode(node.arguments || []), void 0),
|
|
63
|
+
factory.createParameterDeclaration(void 0, void 0, void 0, factory.createIdentifier("context"), void 0, context.getContextType().toTypeReference(), void 0),
|
|
64
|
+
factory.createParameterDeclaration(void 0, void 0, void 0, factory.createIdentifier("info"), void 0, context.getResolveInfoType().toTypeReference(), void 0)
|
|
65
|
+
], factory.createTypeReferenceNode(factory.createIdentifier("PromiseOrValue"), [node.type])));
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
NamedType: {
|
|
69
|
+
leave(node, _a, _p, _path, ancestors) {
|
|
70
|
+
const isAncestorInput = isDirectAncestorInput(ancestors);
|
|
71
|
+
return createNullableType(context.getModelType(node.name, !isAncestorInput, !isAncestorInput, true).toTypeReference());
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
ListType: {
|
|
75
|
+
leave({ type }) {
|
|
76
|
+
return createNullableType(factory.createArrayTypeNode(type));
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
NonNullType: {
|
|
80
|
+
leave({ type }) {
|
|
81
|
+
return createNonNullableType(type);
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
Name: {
|
|
85
|
+
leave(node) {
|
|
86
|
+
return node.value;
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
Directive: {
|
|
90
|
+
leave() {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
InputValueDefinition: {
|
|
95
|
+
leave(node) {
|
|
96
|
+
return factory.createPropertySignature(void 0, node.name, void 0, node.type);
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
InputObjectTypeDefinition: {
|
|
100
|
+
leave(node) {
|
|
101
|
+
return factory.createTypeAliasDeclaration(void 0, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], node.name, void 0, factory.createTypeLiteralNode(node.fields || []));
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
UnionTypeDefinition: {
|
|
105
|
+
leave() {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
EnumTypeDefinition: {
|
|
110
|
+
leave() {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
InterfaceTypeDefinition: {
|
|
115
|
+
leave() {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
DirectiveDefinition: {
|
|
120
|
+
leave() {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
ScalarTypeDefinition: {
|
|
125
|
+
leave() {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
export {
|
|
132
|
+
generateResolvers
|
|
133
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { ASTNode } from "graphql";
|
|
2
|
+
/**
|
|
3
|
+
* Hack GraphQL Visitor to have better type safety.
|
|
4
|
+
*
|
|
5
|
+
* You can provide type that defines how reducer of visitor converts type (becomes return type
|
|
6
|
+
* of leave) and how are fields converted (becomes fields on the node).
|
|
7
|
+
*/
|
|
8
|
+
export declare type ReducerResultMap<T> = {
|
|
9
|
+
[NodeT in ASTNode as NodeT["kind"]]?: T | T[] | null;
|
|
10
|
+
};
|
|
11
|
+
export declare type ReducerFieldMap<T> = {
|
|
12
|
+
[NodeT in ASTNode as NodeT["kind"]]?: {
|
|
13
|
+
[K in keyof NodeT]?: T | T[] | null;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
export declare type ASTReducer<T, TR extends ReducerResultMap<T>, TRF extends ReducerFieldMap<T>> = {
|
|
17
|
+
readonly [NodeT in ASTNode as NodeT["kind"]]?: {
|
|
18
|
+
readonly enter?: ASTVisitFn<NodeT>;
|
|
19
|
+
readonly leave: ASTReducerFn<NodeT, TR[NodeT["kind"]], TRF[NodeT["kind"]]>;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
declare type ASTReducerFn<TReducedNode extends ASTNode, TResult, TReducerMap> = (
|
|
23
|
+
/** The current node being visiting. */
|
|
24
|
+
node: {
|
|
25
|
+
[K in keyof TReducedNode]: ReducedField<TReducedNode[K], TReducerMap extends undefined ? undefined : K extends keyof TReducerMap ? TReducerMap[K] extends undefined ? undefined : TReducerMap[K] : undefined>;
|
|
26
|
+
},
|
|
27
|
+
/** The index or key to this node from the parent node or Array. */
|
|
28
|
+
key: string | number | undefined,
|
|
29
|
+
/** The parent immediately above this node, which may be an Array. */
|
|
30
|
+
parent: ASTNode | ReadonlyArray<ASTNode> | undefined,
|
|
31
|
+
/** The key path to get to this node from the root node. */
|
|
32
|
+
path: ReadonlyArray<string | number>,
|
|
33
|
+
/**
|
|
34
|
+
* All nodes and Arrays visited before reaching parent of this node.
|
|
35
|
+
* These correspond to array indices in `path`.
|
|
36
|
+
* Note: ancestors includes arrays which contain the parent of visited node.
|
|
37
|
+
*/
|
|
38
|
+
ancestors: ReadonlyArray<ASTNode | ReadonlyArray<ASTNode>>) => TResult;
|
|
39
|
+
declare type ReducedField<T, R> = R extends undefined ? T : T extends null | undefined ? T : T extends ReadonlyArray<any> ? ReadonlyArray<R> : R;
|
|
40
|
+
export declare type ASTVisitFn<TVisitedNode extends ASTNode> = (
|
|
41
|
+
/** The current node being visiting. */
|
|
42
|
+
node: TVisitedNode,
|
|
43
|
+
/** The index or key to this node from the parent node or Array. */
|
|
44
|
+
key: string | number | undefined,
|
|
45
|
+
/** The parent immediately above this node, which may be an Array. */
|
|
46
|
+
parent: ASTNode | ReadonlyArray<ASTNode> | undefined,
|
|
47
|
+
/** The key path to get to this node from the root node. */
|
|
48
|
+
path: ReadonlyArray<string | number>,
|
|
49
|
+
/**
|
|
50
|
+
* All nodes and Arrays visited before reaching parent of this node.
|
|
51
|
+
* These correspond to array indices in `path`.
|
|
52
|
+
* Note: ancestors includes arrays which contain the parent of visited node.
|
|
53
|
+
*/
|
|
54
|
+
ancestors: ReadonlyArray<ASTNode | ReadonlyArray<ASTNode>>) => any;
|
|
55
|
+
export declare function visit<T, TR, TTR>(root: ASTNode, visitor: ASTReducer<T, TR, TTR>): T;
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=typedVisitor.d.ts.map
|