sofa-api 0.10.3-alpha.0 → 0.11.2
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/README.md +1 -1
- package/index.d.ts +3 -3
- package/{index.cjs.js → index.js} +19 -26
- package/{index.esm.js → index.mjs} +23 -30
- package/open-api/index.d.ts +3 -1
- package/open-api/types.d.ts +2 -2
- package/package.json +22 -11
- package/subscriptions.d.ts +2 -10
- package/index.cjs.js.map +0 -1
- package/index.esm.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
[](https://sofa-api.com)
|
|
1
|
+
[](https://www.sofa-api.com)
|
|
2
2
|
|
|
3
3
|
[](https://npmjs.com/package/sofa-api)
|
|
4
4
|
[](https://discord.gg/xud7bH9)
|
package/index.d.ts
CHANGED
|
@@ -24,8 +24,8 @@ export declare function createSofaRouter(config: SofaConfig): (request: {
|
|
|
24
24
|
method: string;
|
|
25
25
|
url: string;
|
|
26
26
|
body: any;
|
|
27
|
-
contextValue:
|
|
28
|
-
}) => Promise<{
|
|
27
|
+
contextValue: ContextValue;
|
|
28
|
+
}) => Promise<({
|
|
29
29
|
type: "result";
|
|
30
30
|
status: number;
|
|
31
31
|
statusMessage?: string | undefined;
|
|
@@ -35,4 +35,4 @@ export declare function createSofaRouter(config: SofaConfig): (request: {
|
|
|
35
35
|
status: number;
|
|
36
36
|
statusMessage?: string | undefined;
|
|
37
37
|
error: any;
|
|
38
|
-
} | null>;
|
|
38
|
+
}) | null>;
|
|
@@ -6,12 +6,12 @@ function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'defau
|
|
|
6
6
|
|
|
7
7
|
const tslib = require('tslib');
|
|
8
8
|
const graphql = require('graphql');
|
|
9
|
-
const Trouter = require('trouter');
|
|
9
|
+
const Trouter = _interopDefault(require('trouter'));
|
|
10
10
|
const utils = require('@graphql-tools/utils');
|
|
11
11
|
const paramCase = require('param-case');
|
|
12
12
|
const uuid = require('uuid');
|
|
13
|
-
const
|
|
14
|
-
const colors = require('ansi-colors');
|
|
13
|
+
const crossUndiciFetch = require('cross-undici-fetch');
|
|
14
|
+
const colors = _interopDefault(require('ansi-colors'));
|
|
15
15
|
const jsYaml = require('js-yaml');
|
|
16
16
|
const fs = require('fs');
|
|
17
17
|
const titleCase = require('title-case');
|
|
@@ -62,7 +62,7 @@ function resolveVariable({ value, type, schema, }) {
|
|
|
62
62
|
return value;
|
|
63
63
|
}
|
|
64
64
|
if (type.kind === graphql.Kind.LIST_TYPE) {
|
|
65
|
-
return value.map(val => resolveVariable({
|
|
65
|
+
return (Array.isArray(value) ? value : [value]).map(val => resolveVariable({
|
|
66
66
|
value: val,
|
|
67
67
|
type: type.type,
|
|
68
68
|
schema,
|
|
@@ -236,7 +236,14 @@ class SubscriptionManager {
|
|
|
236
236
|
}
|
|
237
237
|
const { url } = this.clients.get(id);
|
|
238
238
|
logger.info(`[Subscription] Trigger ${id}`);
|
|
239
|
-
yield
|
|
239
|
+
const response = yield crossUndiciFetch.fetch(url, {
|
|
240
|
+
method: 'POST',
|
|
241
|
+
body: JSON.stringify(result),
|
|
242
|
+
headers: {
|
|
243
|
+
'Content-Type': 'application/json',
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
yield response.text();
|
|
240
247
|
});
|
|
241
248
|
}
|
|
242
249
|
buildOperations() {
|
|
@@ -497,7 +504,8 @@ function pickParam({ name, url, params, body, }) {
|
|
|
497
504
|
}
|
|
498
505
|
const searchParams = new URLSearchParams(url.split('?')[1]);
|
|
499
506
|
if (searchParams.has(name)) {
|
|
500
|
-
|
|
507
|
+
const values = searchParams.getAll(name);
|
|
508
|
+
return values.length === 1 ? values[0] : values;
|
|
501
509
|
}
|
|
502
510
|
if (body && body.hasOwnProperty(name)) {
|
|
503
511
|
return body[name];
|
|
@@ -558,24 +566,8 @@ function extractsModels(schema) {
|
|
|
558
566
|
}
|
|
559
567
|
// it's dumb but let's leave it for now
|
|
560
568
|
function isArrayOf(type, expected) {
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
}
|
|
564
|
-
if (graphql.isNonNullType(type) && isOptionalList(type.ofType)) {
|
|
565
|
-
return true;
|
|
566
|
-
}
|
|
567
|
-
function isOptionalList(list) {
|
|
568
|
-
if (graphql.isListType(list)) {
|
|
569
|
-
if (list.ofType.name === expected.name) {
|
|
570
|
-
return true;
|
|
571
|
-
}
|
|
572
|
-
if (graphql.isNonNullType(list.ofType) &&
|
|
573
|
-
list.ofType.ofType.name === expected.name) {
|
|
574
|
-
return true;
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
}
|
|
578
|
-
return false;
|
|
569
|
+
const typeNameInSdl = type.toString();
|
|
570
|
+
return (typeNameInSdl.includes('[') && typeNameInSdl.includes(expected.toString()));
|
|
579
571
|
}
|
|
580
572
|
function hasID(type) {
|
|
581
573
|
return graphql.isObjectType(type) && !!type.getFields().id;
|
|
@@ -780,11 +772,13 @@ function isObjectTypeDefinitionNode(node) {
|
|
|
780
772
|
return node.kind === graphql.Kind.OBJECT_TYPE_DEFINITION;
|
|
781
773
|
}
|
|
782
774
|
|
|
783
|
-
function OpenAPI({ schema, info, components, security, }) {
|
|
775
|
+
function OpenAPI({ schema, info, servers, components, security, tags, }) {
|
|
784
776
|
const types = schema.getTypeMap();
|
|
785
777
|
const swagger = {
|
|
786
778
|
openapi: '3.0.0',
|
|
787
779
|
info,
|
|
780
|
+
servers,
|
|
781
|
+
tags,
|
|
788
782
|
paths: {},
|
|
789
783
|
components: {
|
|
790
784
|
schemas: {},
|
|
@@ -902,4 +896,3 @@ exports.OpenAPI = OpenAPI;
|
|
|
902
896
|
exports.createSofaRouter = createSofaRouter;
|
|
903
897
|
exports.isContextFn = isContextFn;
|
|
904
898
|
exports.useSofa = useSofa;
|
|
905
|
-
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { __awaiter, __asyncValues, __rest } from 'tslib';
|
|
2
2
|
import { getOperationAST, Kind, isScalarType, isEqualType, GraphQLBoolean, isInputObjectType, subscribe, isObjectType, isNonNullType, print, graphql, getNamedType, isListType, isEnumType, parse, printType, isIntrospectionType } from 'graphql';
|
|
3
|
-
import
|
|
3
|
+
import Trouter from 'trouter';
|
|
4
4
|
import { buildOperationNodeForField } from '@graphql-tools/utils';
|
|
5
5
|
import { paramCase } from 'param-case';
|
|
6
6
|
import { v4 } from 'uuid';
|
|
7
|
-
import
|
|
8
|
-
import
|
|
7
|
+
import { fetch } from 'cross-undici-fetch';
|
|
8
|
+
import colors from 'ansi-colors';
|
|
9
9
|
import { dump } from 'js-yaml';
|
|
10
10
|
import { writeFileSync } from 'fs';
|
|
11
11
|
import { titleCase } from 'title-case';
|
|
@@ -56,7 +56,7 @@ function resolveVariable({ value, type, schema, }) {
|
|
|
56
56
|
return value;
|
|
57
57
|
}
|
|
58
58
|
if (type.kind === Kind.LIST_TYPE) {
|
|
59
|
-
return value.map(val => resolveVariable({
|
|
59
|
+
return (Array.isArray(value) ? value : [value]).map(val => resolveVariable({
|
|
60
60
|
value: val,
|
|
61
61
|
type: type.type,
|
|
62
62
|
schema,
|
|
@@ -84,16 +84,16 @@ const log = (level, color, args) => {
|
|
|
84
84
|
};
|
|
85
85
|
const logger = {
|
|
86
86
|
error: (...args) => {
|
|
87
|
-
log('error', red, args);
|
|
87
|
+
log('error', colors.red, args);
|
|
88
88
|
},
|
|
89
89
|
warn: (...args) => {
|
|
90
|
-
log('warn', yellow, args);
|
|
90
|
+
log('warn', colors.yellow, args);
|
|
91
91
|
},
|
|
92
92
|
info: (...args) => {
|
|
93
|
-
log('info', green, args);
|
|
93
|
+
log('info', colors.green, args);
|
|
94
94
|
},
|
|
95
95
|
debug: (...args) => {
|
|
96
|
-
log('debug', blue, args);
|
|
96
|
+
log('debug', colors.blue, args);
|
|
97
97
|
},
|
|
98
98
|
};
|
|
99
99
|
|
|
@@ -230,7 +230,14 @@ class SubscriptionManager {
|
|
|
230
230
|
}
|
|
231
231
|
const { url } = this.clients.get(id);
|
|
232
232
|
logger.info(`[Subscription] Trigger ${id}`);
|
|
233
|
-
yield
|
|
233
|
+
const response = yield fetch(url, {
|
|
234
|
+
method: 'POST',
|
|
235
|
+
body: JSON.stringify(result),
|
|
236
|
+
headers: {
|
|
237
|
+
'Content-Type': 'application/json',
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
yield response.text();
|
|
234
241
|
});
|
|
235
242
|
}
|
|
236
243
|
buildOperations() {
|
|
@@ -491,7 +498,8 @@ function pickParam({ name, url, params, body, }) {
|
|
|
491
498
|
}
|
|
492
499
|
const searchParams = new URLSearchParams(url.split('?')[1]);
|
|
493
500
|
if (searchParams.has(name)) {
|
|
494
|
-
|
|
501
|
+
const values = searchParams.getAll(name);
|
|
502
|
+
return values.length === 1 ? values[0] : values;
|
|
495
503
|
}
|
|
496
504
|
if (body && body.hasOwnProperty(name)) {
|
|
497
505
|
return body[name];
|
|
@@ -552,24 +560,8 @@ function extractsModels(schema) {
|
|
|
552
560
|
}
|
|
553
561
|
// it's dumb but let's leave it for now
|
|
554
562
|
function isArrayOf(type, expected) {
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
}
|
|
558
|
-
if (isNonNullType(type) && isOptionalList(type.ofType)) {
|
|
559
|
-
return true;
|
|
560
|
-
}
|
|
561
|
-
function isOptionalList(list) {
|
|
562
|
-
if (isListType(list)) {
|
|
563
|
-
if (list.ofType.name === expected.name) {
|
|
564
|
-
return true;
|
|
565
|
-
}
|
|
566
|
-
if (isNonNullType(list.ofType) &&
|
|
567
|
-
list.ofType.ofType.name === expected.name) {
|
|
568
|
-
return true;
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
}
|
|
572
|
-
return false;
|
|
563
|
+
const typeNameInSdl = type.toString();
|
|
564
|
+
return (typeNameInSdl.includes('[') && typeNameInSdl.includes(expected.toString()));
|
|
573
565
|
}
|
|
574
566
|
function hasID(type) {
|
|
575
567
|
return isObjectType(type) && !!type.getFields().id;
|
|
@@ -774,11 +766,13 @@ function isObjectTypeDefinitionNode(node) {
|
|
|
774
766
|
return node.kind === Kind.OBJECT_TYPE_DEFINITION;
|
|
775
767
|
}
|
|
776
768
|
|
|
777
|
-
function OpenAPI({ schema, info, components, security, }) {
|
|
769
|
+
function OpenAPI({ schema, info, servers, components, security, tags, }) {
|
|
778
770
|
const types = schema.getTypeMap();
|
|
779
771
|
const swagger = {
|
|
780
772
|
openapi: '3.0.0',
|
|
781
773
|
info,
|
|
774
|
+
servers,
|
|
775
|
+
tags,
|
|
782
776
|
paths: {},
|
|
783
777
|
components: {
|
|
784
778
|
schemas: {},
|
|
@@ -893,4 +887,3 @@ function createSofaRouter(config) {
|
|
|
893
887
|
}
|
|
894
888
|
|
|
895
889
|
export { OpenAPI, createSofaRouter, isContextFn, useSofa };
|
|
896
|
-
//# sourceMappingURL=index.esm.js.map
|
package/open-api/index.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { GraphQLSchema } from 'graphql';
|
|
2
2
|
import { RouteInfo } from '../types';
|
|
3
|
-
export declare function OpenAPI({ schema, info, components, security, }: {
|
|
3
|
+
export declare function OpenAPI({ schema, info, servers, components, security, tags, }: {
|
|
4
4
|
schema: GraphQLSchema;
|
|
5
5
|
info: Record<string, any>;
|
|
6
|
+
servers?: Record<string, any>[];
|
|
6
7
|
components?: Record<string, any>;
|
|
7
8
|
security?: Record<string, any>[];
|
|
9
|
+
tags?: Record<string, any>[];
|
|
8
10
|
}): {
|
|
9
11
|
addRoute(info: RouteInfo, config?: {
|
|
10
12
|
basePath?: string | undefined;
|
package/open-api/types.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { GraphQLObjectType, GraphQLInputObjectType,
|
|
1
|
+
import { GraphQLObjectType, GraphQLInputObjectType, GraphQLType } from 'graphql';
|
|
2
2
|
export declare function buildSchemaObjectFromType(type: GraphQLObjectType | GraphQLInputObjectType): any;
|
|
3
|
-
export declare function resolveFieldType(type:
|
|
3
|
+
export declare function resolveFieldType(type: GraphQLType): any;
|
package/package.json
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sofa-api",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.2",
|
|
4
4
|
"description": "Create REST APIs with GraphQL",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"peerDependencies": {
|
|
7
|
-
"graphql": "^0.13.2 || ^14.0.0 || ^15.0.0"
|
|
7
|
+
"graphql": "^0.13.2 || ^14.0.0 || ^15.0.0 || ^16.0.0"
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
|
-
"@graphql-tools/utils": "
|
|
11
|
-
"@types/js-yaml": "4.0.
|
|
10
|
+
"@graphql-tools/utils": "8.6.5",
|
|
11
|
+
"@types/js-yaml": "4.0.5",
|
|
12
12
|
"ansi-colors": "4.1.1",
|
|
13
|
-
"
|
|
14
|
-
"js-yaml": "4.
|
|
13
|
+
"cross-undici-fetch": "0.1.28",
|
|
14
|
+
"js-yaml": "4.1.0",
|
|
15
15
|
"param-case": "3.0.4",
|
|
16
16
|
"title-case": "3.0.3",
|
|
17
|
-
"trouter": "3.
|
|
18
|
-
"tslib": "2.1
|
|
17
|
+
"trouter": "3.2.0",
|
|
18
|
+
"tslib": "2.3.1",
|
|
19
19
|
"uuid": "8.3.2"
|
|
20
20
|
},
|
|
21
21
|
"repository": {
|
|
@@ -34,10 +34,21 @@
|
|
|
34
34
|
"url": "https://github.com/Urigo"
|
|
35
35
|
},
|
|
36
36
|
"license": "MIT",
|
|
37
|
-
"main": "index.
|
|
38
|
-
"module": "index.
|
|
37
|
+
"main": "index.js",
|
|
38
|
+
"module": "index.mjs",
|
|
39
39
|
"typings": "index.d.ts",
|
|
40
40
|
"typescript": {
|
|
41
41
|
"definition": "index.d.ts"
|
|
42
|
+
},
|
|
43
|
+
"exports": {
|
|
44
|
+
".": {
|
|
45
|
+
"require": "./index.js",
|
|
46
|
+
"import": "./index.mjs"
|
|
47
|
+
},
|
|
48
|
+
"./*": {
|
|
49
|
+
"require": "./*.js",
|
|
50
|
+
"import": "./*.mjs"
|
|
51
|
+
},
|
|
52
|
+
"./package.json": "./package.json"
|
|
42
53
|
}
|
|
43
|
-
}
|
|
54
|
+
}
|
package/subscriptions.d.ts
CHANGED
|
@@ -20,19 +20,11 @@ export declare class SubscriptionManager {
|
|
|
20
20
|
private operations;
|
|
21
21
|
private clients;
|
|
22
22
|
constructor(sofa: Sofa);
|
|
23
|
-
start(event: StartSubscriptionEvent, contextValue: ContextValue): Promise<ExecutionResult<{
|
|
24
|
-
[key: string]: any;
|
|
25
|
-
}, {
|
|
26
|
-
[key: string]: any;
|
|
27
|
-
}> | {
|
|
23
|
+
start(event: StartSubscriptionEvent, contextValue: ContextValue): Promise<ExecutionResult<import("graphql/jsutils/ObjMap").ObjMap<unknown>, import("graphql/jsutils/ObjMap").ObjMap<unknown>> | {
|
|
28
24
|
id: string;
|
|
29
25
|
}>;
|
|
30
26
|
stop(id: ID): Promise<StopSubscriptionResponse>;
|
|
31
|
-
update(event: UpdateSubscriptionEvent, contextValue: ContextValue): Promise<ExecutionResult<{
|
|
32
|
-
[key: string]: any;
|
|
33
|
-
}, {
|
|
34
|
-
[key: string]: any;
|
|
35
|
-
}> | {
|
|
27
|
+
update(event: UpdateSubscriptionEvent, contextValue: ContextValue): Promise<ExecutionResult<import("graphql/jsutils/ObjMap").ObjMap<unknown>, import("graphql/jsutils/ObjMap").ObjMap<unknown>> | {
|
|
36
28
|
id: string;
|
|
37
29
|
}>;
|
|
38
30
|
private execute;
|
package/index.cjs.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/ast.ts","../src/common.ts","../src/parse.ts","../src/logger.ts","../src/subscriptions.ts","../src/express.ts","../src/sofa.ts","../src/open-api/utils.ts","../src/open-api/types.ts","../src/open-api/operations.ts","../src/open-api/index.ts","../src/index.ts"],"sourcesContent":["import {\n getOperationAST,\n DocumentNode,\n OperationDefinitionNode,\n VariableDefinitionNode,\n} from 'graphql';\n\nexport type OperationInfo =\n | {\n operation: OperationDefinitionNode;\n variables: ReadonlyArray<VariableDefinitionNode>;\n name: string;\n }\n | undefined;\n\nexport function getOperationInfo(doc: DocumentNode): OperationInfo {\n const op = getOperationAST(doc, null);\n\n if (!op) {\n return;\n }\n\n return {\n operation: op,\n name: op.name!.value,\n variables: op.variableDefinitions || [],\n };\n}\n","import { paramCase } from 'param-case';\n\nexport function convertName(name: string) {\n return paramCase(name);\n}\n\nexport function isNil<T>(val: T) {\n return val == null;\n}\n","import {\n VariableDefinitionNode,\n GraphQLSchema,\n TypeNode,\n isScalarType,\n isEqualType,\n GraphQLBoolean,\n isInputObjectType,\n Kind,\n} from 'graphql';\nimport { isNil } from './common';\n\nexport function parseVariable({\n value,\n variable,\n schema,\n}: {\n value: any;\n variable: VariableDefinitionNode;\n schema: GraphQLSchema;\n}) {\n if (isNil(value)) {\n return;\n }\n\n return resolveVariable({\n value,\n type: variable.type,\n schema,\n });\n}\n\nfunction resolveVariable({\n value,\n type,\n schema,\n}: {\n value: any;\n type: TypeNode;\n schema: GraphQLSchema;\n}): any | any[] {\n if (type.kind === Kind.NAMED_TYPE) {\n const namedType = schema.getType(type.name.value);\n\n if (isScalarType(namedType)) {\n // GraphQLBoolean.serialize expects a boolean or a number only\n if (isEqualType(GraphQLBoolean, namedType)) {\n // we don't support TRUE\n value = value === 'true';\n }\n\n return namedType.serialize(value);\n }\n\n if (isInputObjectType(namedType)) {\n return value && typeof value === 'object' ? value : JSON.parse(value);\n }\n\n return value;\n }\n\n if (type.kind === Kind.LIST_TYPE) {\n return (value as any[]).map(val =>\n resolveVariable({\n value: val,\n type: type.type,\n schema,\n })\n );\n }\n\n if (type.kind === Kind.NON_NULL_TYPE) {\n return resolveVariable({\n value: value,\n type: type.type,\n schema,\n });\n }\n}\n","import * as colors from 'ansi-colors';\n\ntype Level = 'error' | 'warn' | 'info' | 'debug';\n\nconst levels: Level[] = ['error', 'warn', 'info', 'debug'];\n\nconst toLevel = (string: void | string) =>\n levels.includes(string as Level) ? (string as Level) : null;\n\nconst currentLevel: Level = process.env.SOFA_DEBUG\n ? 'debug'\n : toLevel(process.env.SOFA_LOGGER_LEVEL) ?? 'info';\n\nconst log = (level: Level, color: any, args: any[]) => {\n if (levels.indexOf(level) <= levels.indexOf(currentLevel)) {\n console.log(`${color(level)}:`, ...args);\n }\n};\n\nexport const logger = {\n error: (...args: any[]) => {\n log('error', colors.red, args);\n },\n warn: (...args: any[]) => {\n log('warn', colors.yellow, args);\n },\n info: (...args: any[]) => {\n log('info', colors.green, args);\n },\n debug: (...args: any[]) => {\n log('debug', colors.blue, args);\n },\n};\n","import {\n subscribe,\n DocumentNode,\n VariableDefinitionNode,\n ExecutionResult,\n Kind,\n} from 'graphql';\nimport { v4 as uuid } from 'uuid';\nimport axios from 'axios';\nimport { buildOperationNodeForField } from '@graphql-tools/utils';\nimport type { ContextValue } from './types';\nimport type { Sofa } from './sofa';\nimport { getOperationInfo } from './ast';\nimport { parseVariable } from './parse';\nimport { logger } from './logger';\n\nfunction isAsyncIterable(obj: any): obj is AsyncIterable<any> {\n return typeof obj[Symbol.asyncIterator] === 'function';\n}\n\n// To start subscription:\n// - an url that Sofa should trigger\n// - name of a subscription\n// - variables if needed\n// - some sort of an auth token\n// - Sofa should return a unique id of that subscription\n// - respond with OK 200\n\n// To stop subscription\n// - an id is required\n// - respond with OK 200\n\n// To update subscription\n// - an id is required\n// - new set of variables\n\nexport type ID = string;\nexport type SubscriptionFieldName = string;\n\nexport interface StartSubscriptionEvent {\n subscription: SubscriptionFieldName;\n variables: any;\n url: string;\n}\n\nexport interface UpdateSubscriptionEvent {\n id: ID;\n variables: any;\n}\n\nexport interface StopSubscriptionResponse {\n id: ID;\n}\n\ninterface BuiltOperation {\n operationName: string;\n document: DocumentNode;\n variables: ReadonlyArray<VariableDefinitionNode>;\n}\n\ninterface StoredClient {\n name: SubscriptionFieldName;\n url: string;\n iterator: AsyncIterator<any>;\n}\n\nexport class SubscriptionManager {\n private operations = new Map<SubscriptionFieldName, BuiltOperation>();\n private clients = new Map<ID, StoredClient>();\n\n constructor(private sofa: Sofa) {\n this.buildOperations();\n }\n\n public async start(\n event: StartSubscriptionEvent,\n contextValue: ContextValue\n ) {\n const id = uuid();\n const name = event.subscription;\n\n if (!this.operations.has(name)) {\n throw new Error(`Subscription '${name}' is not available`);\n }\n\n const { document, operationName, variables } = this.operations.get(name)!;\n\n logger.info(`[Subscription] Start ${id}`, event);\n\n const result = await this.execute({\n id,\n name,\n url: event.url,\n document,\n operationName,\n variables,\n contextValue,\n });\n\n if (typeof result !== 'undefined') {\n return result;\n }\n\n return { id };\n }\n\n public async stop(id: ID): Promise<StopSubscriptionResponse> {\n logger.info(`[Subscription] Stop ${id}`);\n\n if (!this.clients.has(id)) {\n throw new Error(`Subscription with ID '${id}' does not exist`);\n }\n\n const execution = this.clients.get(id)!;\n\n if (execution.iterator.return) {\n execution.iterator.return();\n }\n\n this.clients.delete(id);\n\n return { id };\n }\n\n public async update(\n event: UpdateSubscriptionEvent,\n contextValue: ContextValue\n ) {\n const { variables, id } = event;\n\n logger.info(`[Subscription] Update ${id}`, event);\n\n if (!this.clients.has(id)) {\n throw new Error(`Subscription with ID '${id}' does not exist`);\n }\n\n const { name: subscription, url } = this.clients.get(id)!;\n\n this.stop(id);\n\n return this.start(\n {\n url,\n subscription,\n variables,\n },\n contextValue\n );\n }\n\n private async execute({\n id,\n document,\n name,\n url,\n operationName,\n variables,\n contextValue,\n }: {\n id: ID;\n name: SubscriptionFieldName;\n url: string;\n document: DocumentNode;\n operationName: string;\n variables: Record<string, any>;\n contextValue: ContextValue;\n }) {\n const variableNodes = this.operations.get(name)!.variables;\n const variableValues = variableNodes.reduce((values, variable) => {\n const value = parseVariable({\n value: variables[variable.variable.name.value],\n variable,\n schema: this.sofa.schema,\n });\n\n if (typeof value === 'undefined') {\n return values;\n }\n\n return {\n ...values,\n [name]: value,\n };\n }, {});\n\n const execution = await subscribe({\n schema: this.sofa.schema,\n document,\n operationName,\n variableValues,\n contextValue,\n });\n\n if (isAsyncIterable(execution)) {\n // successful\n\n // add execution to clients\n this.clients.set(id, {\n name,\n url,\n iterator: execution as any,\n });\n\n // success\n (async () => {\n for await (const result of execution) {\n await this.sendData({\n id,\n result,\n });\n }\n })().then(\n () => {\n // completes\n this.clients.delete(id);\n },\n (e) => {\n logger.info(`Subscription #${id} closed`);\n logger.error(e);\n this.clients.delete(id);\n }\n );\n } else {\n return execution as ExecutionResult;\n }\n }\n\n private async sendData({ id, result }: { id: ID; result: any }) {\n if (!this.clients.has(id)) {\n throw new Error(`Subscription with ID '${id}' does not exist`);\n }\n\n const { url } = this.clients.get(id)!;\n\n logger.info(`[Subscription] Trigger ${id}`);\n\n await axios.post(url, result);\n }\n\n private buildOperations() {\n const subscription = this.sofa.schema.getSubscriptionType();\n\n if (!subscription) {\n return;\n }\n\n const fieldMap = subscription.getFields();\n\n for (const field in fieldMap) {\n const operationNode = buildOperationNodeForField({\n kind: 'subscription',\n field,\n schema: this.sofa.schema,\n models: this.sofa.models,\n ignore: this.sofa.ignore,\n circularReferenceDepth: this.sofa.depthLimit,\n });\n const document: DocumentNode = {\n kind: Kind.DOCUMENT,\n definitions: [operationNode],\n };\n\n const { variables, name: operationName } = getOperationInfo(document)!;\n\n this.operations.set(field, {\n operationName,\n document,\n variables,\n });\n }\n }\n}\n","import {\n DocumentNode,\n print,\n isObjectType,\n isNonNullType,\n Kind,\n} from 'graphql';\nimport * as Trouter from 'trouter';\nimport { buildOperationNodeForField } from '@graphql-tools/utils';\nimport { getOperationInfo, OperationInfo } from './ast';\nimport type { Sofa, Route } from './sofa';\nimport type { RouteInfo, Method, ContextValue } from './types';\nimport { convertName } from './common';\nimport { parseVariable } from './parse';\nimport { StartSubscriptionEvent, SubscriptionManager } from './subscriptions';\nimport { logger } from './logger';\n\nexport type ErrorHandler = (errors: ReadonlyArray<any>) => RouterError;\n\ntype Params = { [key: string]: string };\n\ntype TrouterMethod = 'get' | 'post' | 'put' | 'delete' | 'patch';\n\ntype RouterRequest = {\n method: string;\n url: string;\n body: any;\n contextValue: ContextValue;\n};\ntype RouterResult = {\n type: 'result';\n status: number;\n statusMessage?: string;\n body: any;\n};\ntype RouterError = {\n type: 'error';\n status: number;\n statusMessage?: string;\n error: any;\n};\ntype RouterResponse = RouterResult | RouterError;\ntype Router = (request: RouterRequest) => Promise<null | RouterResponse>;\n\ntype RouteRequest = {\n url: string;\n body: any;\n params: Params;\n contextValue: ContextValue;\n};\ntype RouteMiddleware = (request: RouteRequest) => Promise<RouterResponse>;\n\nexport function createRouter(sofa: Sofa): Router {\n logger.debug('[Sofa] Creating router');\n\n const router = new Trouter<RouteMiddleware>();\n\n const queryType = sofa.schema.getQueryType();\n const mutationType = sofa.schema.getMutationType();\n const subscriptionManager = new SubscriptionManager(sofa);\n\n if (queryType) {\n Object.keys(queryType.getFields()).forEach((fieldName) => {\n const route = createQueryRoute({ sofa, router, fieldName });\n\n if (sofa.onRoute) {\n sofa.onRoute(route);\n }\n });\n }\n\n if (mutationType) {\n Object.keys(mutationType.getFields()).forEach((fieldName) => {\n const route = createMutationRoute({ sofa, router, fieldName });\n\n if (sofa.onRoute) {\n sofa.onRoute(route);\n }\n });\n }\n\n router.post('/webhook', async ({ body, contextValue }) => {\n const { subscription, variables, url }: StartSubscriptionEvent = body;\n try {\n const result = await subscriptionManager.start(\n {\n subscription,\n variables,\n url,\n },\n contextValue\n );\n return {\n type: 'result',\n status: 200,\n statusMessage: 'OK',\n body: result,\n };\n } catch (error) {\n return {\n type: 'error',\n status: 500,\n statusMessage: 'Subscription failed',\n error,\n };\n }\n });\n\n router.post('/webhook/:id', async ({ body, params, contextValue }) => {\n const id: string = params.id;\n const variables: any = body.variables;\n try {\n const result = await subscriptionManager.update(\n {\n id,\n variables,\n },\n contextValue\n );\n return {\n type: 'result',\n status: 200,\n statusMessage: 'OK',\n body: result,\n };\n } catch (error) {\n return {\n type: 'error',\n status: 500,\n statusMessage: 'Subscription failed to update',\n error,\n };\n }\n });\n\n router.delete('/webhook/:id', async ({ params }) => {\n const id: string = params.id;\n try {\n const result = await subscriptionManager.stop(id);\n return {\n type: 'result',\n status: 200,\n statusMessage: 'OK',\n body: result,\n };\n } catch (error) {\n return {\n type: 'error',\n status: 500,\n statusMessage: 'Subscription failed to stop',\n error,\n };\n }\n });\n\n return async ({ method, url, body, contextValue }) => {\n if (!url.startsWith(sofa.basePath)) {\n return null;\n }\n // trim base path and search\n const [slicedUrl] = url.slice(sofa.basePath.length).split('?');\n const trouterMethod = method.toUpperCase() as Trouter.HTTPMethod;\n const obj = router.find(trouterMethod, slicedUrl);\n for (const handler of obj.handlers) {\n return await handler({\n url,\n body,\n params: obj.params,\n contextValue,\n });\n }\n return null;\n };\n}\n\nfunction createQueryRoute({\n sofa,\n router,\n fieldName,\n}: {\n sofa: Sofa;\n router: Trouter;\n fieldName: string;\n}): RouteInfo {\n logger.debug(`[Router] Creating ${fieldName} query`);\n\n const queryType = sofa.schema.getQueryType()!;\n const operationNode = buildOperationNodeForField({\n kind: 'query',\n schema: sofa.schema,\n field: fieldName,\n models: sofa.models,\n ignore: sofa.ignore,\n circularReferenceDepth: sofa.depthLimit,\n });\n const operation: DocumentNode = {\n kind: Kind.DOCUMENT,\n definitions: [operationNode],\n };\n const info = getOperationInfo(operation)!;\n const field = queryType.getFields()[fieldName];\n const fieldType = field.type;\n const isSingle =\n isObjectType(fieldType) ||\n (isNonNullType(fieldType) && isObjectType(fieldType.ofType));\n const hasIdArgument = field.args.some((arg) => arg.name === 'id');\n\n const graphqlPath = `${queryType.name}.${fieldName}`;\n const routeConfig = sofa.routes?.[graphqlPath];\n const route = {\n method: routeConfig?.method ?? 'GET',\n path: routeConfig?.path ?? getPath(fieldName, isSingle && hasIdArgument),\n responseStatus: routeConfig?.responseStatus ?? 200,\n };\n\n router[route.method.toLocaleLowerCase() as TrouterMethod](\n route.path,\n useHandler({ info, route, fieldName, sofa, operation })\n );\n\n logger.debug(\n `[Router] ${fieldName} query available at ${route.method} ${route.path}`\n );\n\n return {\n document: operation,\n path: route.path,\n method: route.method.toUpperCase() as Method,\n };\n}\n\nfunction createMutationRoute({\n sofa,\n router,\n fieldName,\n}: {\n sofa: Sofa;\n router: Trouter;\n fieldName: string;\n}): RouteInfo {\n logger.debug(`[Router] Creating ${fieldName} mutation`);\n\n const mutationType = sofa.schema.getMutationType()!;\n const operationNode = buildOperationNodeForField({\n kind: 'mutation',\n schema: sofa.schema,\n field: fieldName,\n models: sofa.models,\n ignore: sofa.ignore,\n circularReferenceDepth: sofa.depthLimit,\n });\n const operation: DocumentNode = {\n kind: Kind.DOCUMENT,\n definitions: [operationNode],\n };\n const info = getOperationInfo(operation)!;\n\n const graphqlPath = `${mutationType.name}.${fieldName}`;\n const routeConfig = sofa.routes?.[graphqlPath];\n const route = {\n method: routeConfig?.method ?? 'POST',\n path: routeConfig?.path ?? getPath(fieldName),\n responseStatus: routeConfig?.responseStatus ?? 200,\n };\n const { method, path } = route;\n\n router[method.toLowerCase() as TrouterMethod](\n path,\n useHandler({ info, route, fieldName, sofa, operation })\n );\n\n logger.debug(`[Router] ${fieldName} mutation available at ${method} ${path}`);\n\n return {\n document: operation,\n path,\n method,\n };\n}\n\nfunction useHandler(config: {\n sofa: Sofa;\n info: OperationInfo;\n route: Route;\n operation: DocumentNode;\n fieldName: string;\n}): RouteMiddleware {\n const { sofa, operation, fieldName } = config;\n const info = config.info!;\n\n return async ({ url, body, params, contextValue }) => {\n const variableValues = info.variables.reduce((variables, variable) => {\n const name = variable.variable.name.value;\n const value = parseVariable({\n value: pickParam({ url, body, params, name }),\n variable,\n schema: sofa.schema,\n });\n\n if (typeof value === 'undefined') {\n return variables;\n }\n\n return {\n ...variables,\n [name]: value,\n };\n }, {});\n\n const result = await sofa.execute({\n schema: sofa.schema,\n source: print(operation),\n contextValue,\n variableValues,\n operationName: info.operation.name && info.operation.name.value,\n });\n\n if (result.errors) {\n const defaultErrorHandler: ErrorHandler = (errors) => {\n return {\n type: 'error',\n status: 500,\n error: errors[0],\n };\n };\n const errorHandler: ErrorHandler =\n sofa.errorHandler || defaultErrorHandler;\n return errorHandler(result.errors);\n }\n\n return {\n type: 'result',\n status: config.route.responseStatus,\n body: result.data && result.data[fieldName],\n };\n };\n}\n\nfunction getPath(fieldName: string, hasId = false) {\n return `/${convertName(fieldName)}${hasId ? '/:id' : ''}`;\n}\n\nfunction pickParam({\n name,\n url,\n params,\n body,\n}: {\n name: string;\n url: string;\n params: Params;\n body: any;\n}) {\n if (params && params.hasOwnProperty(name)) {\n return params[name];\n }\n const searchParams = new URLSearchParams(url.split('?')[1]);\n if (searchParams.has(name)) {\n return searchParams.get(name);\n }\n if (body && body.hasOwnProperty(name)) {\n return body[name];\n }\n}\n","import {\n GraphQLSchema,\n graphql,\n isObjectType,\n GraphQLObjectType,\n getNamedType,\n GraphQLNamedType,\n isListType,\n isNonNullType,\n GraphQLOutputType,\n} from 'graphql';\n\nimport { Ignore, ExecuteFn, OnRoute, Method } from './types';\nimport { convertName } from './common';\nimport { logger } from './logger';\nimport { ErrorHandler } from './express';\n\n// user passes:\n// - schema\n// - error handler\n// - execute function\n// - context\n\ninterface RouteConfig {\n method?: Method;\n path?: string;\n responseStatus?: number;\n}\n\nexport interface Route {\n method: Method;\n path: string;\n responseStatus: number;\n}\n\nexport interface SofaConfig {\n basePath: string;\n schema: GraphQLSchema;\n execute?: ExecuteFn;\n /**\n * Treats an Object with an ID as not a model.\n * @example [\"User\", \"Message.author\"]\n */\n ignore?: Ignore;\n onRoute?: OnRoute;\n depthLimit?: number;\n errorHandler?: ErrorHandler;\n /**\n * Overwrites the default HTTP route.\n */\n routes?: Record<string, RouteConfig>;\n}\n\nexport interface Sofa {\n basePath: string;\n schema: GraphQLSchema;\n models: string[];\n ignore: Ignore;\n depthLimit: number;\n routes?: Record<string, RouteConfig>;\n execute: ExecuteFn;\n onRoute?: OnRoute;\n errorHandler?: ErrorHandler;\n}\n\nexport function createSofa(config: SofaConfig): Sofa {\n logger.debug('[Sofa] Created');\n\n const models = extractsModels(config.schema);\n const ignore = config.ignore || [];\n const depthLimit = config.depthLimit || 1;\n\n logger.debug(`[Sofa] models: ${models.join(', ')}`);\n logger.debug(`[Sofa] ignore: ${ignore.join(', ')}`);\n\n return {\n execute: graphql,\n models,\n ignore,\n depthLimit,\n ...config,\n };\n}\n\n// Objects and Unions are the only things that are used to define return types\n// and both might contain an ID\n// We don't treat Unions as models because\n// they might represent an Object that is not a model\n// We check it later, when an operation is being built\nfunction extractsModels(schema: GraphQLSchema): string[] {\n const modelMap: {\n [name: string]: {\n list?: boolean;\n single?: boolean;\n };\n } = {};\n const query = schema.getQueryType()!;\n const fields = query.getFields();\n\n // if Query[type] (no args) and Query[type](just id as an argument)\n\n // loop through every field\n for (const fieldName in fields) {\n const field = fields[fieldName];\n const namedType = getNamedType(field.type);\n\n if (hasID(namedType)) {\n if (!modelMap[namedType.name]) {\n modelMap[namedType.name] = {};\n }\n\n if (isArrayOf(field.type, namedType)) {\n // check if type is a list\n // check if name of a field matches a name of a named type (in plural)\n // check if has no non-optional arguments\n // add to registry with `list: true`\n const sameName = isNameEqual(field.name, namedType.name + 's');\n const allOptionalArguments = !field.args.some((arg) =>\n isNonNullType(arg.type)\n );\n\n modelMap[namedType.name].list = sameName && allOptionalArguments;\n } else if (\n isObjectType(field.type) ||\n (isNonNullType(field.type) && isObjectType(field.type.ofType))\n ) {\n // check if type is a graphql object type\n // check if name of a field matches with name of an object type\n // check if has only one argument named `id`\n // add to registry with `single: true`\n const sameName = isNameEqual(field.name, namedType.name);\n const hasIdArgument =\n field.args.length === 1 && field.args[0].name === 'id';\n\n modelMap[namedType.name].single = sameName && hasIdArgument;\n }\n }\n }\n\n return Object.keys(modelMap).filter(\n (name) => modelMap[name].list && modelMap[name].single\n );\n}\n\n// it's dumb but let's leave it for now\nfunction isArrayOf(\n type: GraphQLOutputType,\n expected: GraphQLObjectType\n): boolean {\n if (isOptionalList(type)) {\n return true;\n }\n\n if (isNonNullType(type) && isOptionalList(type.ofType)) {\n return true;\n }\n\n function isOptionalList(list: GraphQLOutputType) {\n if (isListType(list)) {\n if (list.ofType.name === expected.name) {\n return true;\n }\n\n if (\n isNonNullType(list.ofType) &&\n list.ofType.ofType.name === expected.name\n ) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nfunction hasID(type: GraphQLNamedType): type is GraphQLObjectType {\n return isObjectType(type) && !!type.getFields().id;\n}\n\nfunction isNameEqual(a: string, b: string): boolean {\n return convertName(a) === convertName(b);\n}\n","export function mapToPrimitive(type: string) {\n const formatMap: Record<string, any> = {\n Int: {\n type: 'integer',\n format: 'int32',\n },\n Float: {\n type: 'number',\n format: 'float',\n },\n String: {\n type: 'string',\n },\n Boolean: {\n type: 'boolean',\n },\n ID: {\n type: 'string',\n },\n };\n\n if (formatMap[type]) {\n return formatMap[type];\n }\n}\n\nexport function mapToRef(type: string) {\n return `#/components/schemas/${type}`;\n}\n","import {\n GraphQLObjectType,\n GraphQLInputObjectType,\n GraphQLField,\n GraphQLInputField,\n isNonNullType,\n GraphQLOutputType,\n isListType,\n isObjectType,\n isScalarType,\n GraphQLNamedType,\n isEnumType,\n} from 'graphql';\nimport { mapToPrimitive, mapToRef } from './utils';\n\nexport function buildSchemaObjectFromType(\n type: GraphQLObjectType | GraphQLInputObjectType\n): any {\n const required: string[] = [];\n const properties: Record<string, any> = {};\n\n const fields = type.getFields();\n\n for (const fieldName in fields) {\n const field = fields[fieldName];\n\n if (isNonNullType(field.type)) {\n required.push(field.name);\n }\n\n properties[fieldName] = resolveField(field);\n if (field.description) {\n properties[fieldName].description = field.description;\n }\n }\n\n return {\n type: 'object',\n ...(required.length ? { required } : {}),\n properties,\n ...(type.description ? { description: type.description } : {}),\n };\n}\n\nfunction resolveField(field: GraphQLField<any, any> | GraphQLInputField) {\n return resolveFieldType(field.type);\n}\n\n// array -> [type]\n// type -> $ref\n// scalar -> swagger primitive\nexport function resolveFieldType(\n type: GraphQLOutputType | GraphQLNamedType\n): any {\n if (isNonNullType(type)) {\n return resolveFieldType(type.ofType);\n }\n\n if (isListType(type)) {\n return {\n type: 'array',\n items: resolveFieldType(type.ofType),\n };\n }\n\n if (isObjectType(type)) {\n return {\n $ref: mapToRef(type.name),\n };\n }\n\n if (isScalarType(type)) {\n return (\n mapToPrimitive(type.name) || {\n type: 'object',\n }\n );\n }\n\n if (isEnumType(type)) {\n return {\n type: 'string',\n enum: type.astNode?.values?.map((value) => value.name.value),\n };\n }\n\n return {\n type: 'object',\n };\n}\n","import {\n DocumentNode,\n GraphQLSchema,\n VariableDefinitionNode,\n TypeNode,\n OperationDefinitionNode,\n ObjectTypeDefinitionNode,\n FieldNode,\n parse,\n printType,\n Kind,\n} from 'graphql';\n\nimport { getOperationInfo } from '../ast';\nimport { mapToPrimitive, mapToRef } from './utils';\nimport { resolveFieldType } from './types';\nimport { titleCase } from 'title-case';\n\nexport function buildPathFromOperation({\n url,\n schema,\n operation,\n useRequestBody,\n}: {\n url: string;\n schema: GraphQLSchema;\n operation: DocumentNode;\n useRequestBody: boolean;\n}): any {\n const info = getOperationInfo(operation)!;\n\n const description = resolveDescription(schema, info.operation);\n\n return {\n operationId: info.name,\n ...(useRequestBody\n ? {\n requestBody: {\n content: {\n 'application/json': {\n schema: resolveRequestBody(info.operation.variableDefinitions),\n },\n },\n },\n }\n : {\n parameters: resolveParameters(\n url,\n info.operation.variableDefinitions\n ),\n }),\n responses: {\n 200: {\n description,\n content: {\n 'application/json': {\n schema: resolveResponse({\n schema,\n operation: info.operation,\n }),\n },\n },\n },\n },\n };\n}\n\nfunction resolveParameters(\n url: string,\n variables: ReadonlyArray<VariableDefinitionNode> | undefined\n) {\n if (!variables) {\n return [];\n }\n\n return variables.map((variable: any) => {\n return {\n in: isInPath(url, variable.variable.name.value) ? 'path' : 'query',\n name: variable.variable.name.value,\n required: variable.type.kind === Kind.NON_NULL_TYPE,\n schema: resolveParamSchema(variable.type),\n };\n });\n}\n\nfunction resolveRequestBody(\n variables: ReadonlyArray<VariableDefinitionNode> | undefined\n) {\n if (!variables) {\n return {};\n }\n\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n variables.forEach(variable => {\n if (variable.type.kind === Kind.NON_NULL_TYPE) {\n required.push(variable.variable.name.value);\n }\n\n properties[variable.variable.name.value] = resolveParamSchema(\n variable.type\n );\n });\n\n return {\n type: 'object',\n properties,\n ...(required.length ? { required } : {}),\n };\n}\n\n// array -> [type]\n// type -> $ref\n// scalar -> swagger primitive\nfunction resolveParamSchema(type: TypeNode): any {\n if (type.kind === Kind.NON_NULL_TYPE) {\n return resolveParamSchema(type.type);\n }\n\n if (type.kind === Kind.LIST_TYPE) {\n return {\n type: 'array',\n items: resolveParamSchema(type.type),\n };\n }\n\n const primitive = mapToPrimitive(type.name.value);\n\n return (\n primitive || {\n $ref: mapToRef(type.name.value),\n }\n );\n}\n\nfunction resolveResponse({\n schema,\n operation,\n}: {\n schema: GraphQLSchema;\n operation: OperationDefinitionNode;\n}) {\n const operationType = operation.operation;\n const rootField = operation.selectionSet.selections[0];\n\n if (rootField.kind === Kind.FIELD) {\n if (operationType === 'query') {\n const queryType = schema.getQueryType()!;\n const field = queryType.getFields()[rootField.name.value];\n\n return resolveFieldType(field.type);\n }\n\n if (operationType === 'mutation') {\n const mutationType = schema.getMutationType()!;\n const field = mutationType.getFields()[rootField.name.value];\n\n return resolveFieldType(field.type);\n }\n }\n}\n\nfunction isInPath(url: string, param: string): boolean {\n return url.indexOf(`{${param}}`) !== -1;\n}\n\nfunction resolveDescription(\n schema: GraphQLSchema,\n operation: OperationDefinitionNode\n) {\n const selection = operation.selectionSet.selections[0] as FieldNode;\n const fieldName = selection.name.value;\n const typeDefinition = schema.getType(titleCase(operation.operation));\n\n if (!typeDefinition) {\n return '';\n }\n\n const definitionNode =\n typeDefinition.astNode || parse(printType(typeDefinition)).definitions[0];\n\n if (!isObjectTypeDefinitionNode(definitionNode)) {\n return '';\n }\n\n const fieldNode = definitionNode.fields!.find(\n field => field.name.value === fieldName\n );\n const descriptionDefinition = fieldNode && fieldNode.description;\n return descriptionDefinition && descriptionDefinition.value\n ? descriptionDefinition.value\n : '';\n}\n\nfunction isObjectTypeDefinitionNode(\n node: any\n): node is ObjectTypeDefinitionNode {\n return node.kind === Kind.OBJECT_TYPE_DEFINITION;\n}\n","import {\n GraphQLSchema,\n isObjectType,\n isInputObjectType,\n isIntrospectionType,\n} from 'graphql';\nimport { dump as YAMLstringify } from 'js-yaml';\nimport { writeFileSync } from 'fs';\n\nimport { buildSchemaObjectFromType } from './types';\nimport { buildPathFromOperation } from './operations';\nimport { RouteInfo } from '../types';\nimport { OpenAPI } from './interfaces';\n\nexport function OpenAPI({\n schema,\n info,\n components,\n security,\n}: {\n schema: GraphQLSchema;\n info: Record<string, any>;\n components?: Record<string, any>;\n security?: Record<string, any>[];\n}) {\n const types = schema.getTypeMap();\n const swagger: any = {\n openapi: '3.0.0',\n info,\n paths: {},\n components: {\n schemas: {},\n },\n };\n\n for (const typeName in types) {\n const type = types[typeName];\n\n if (\n (isObjectType(type) || isInputObjectType(type)) &&\n !isIntrospectionType(type)\n ) {\n swagger.components!.schemas![typeName] = buildSchemaObjectFromType(type);\n }\n }\n\n if (components) {\n swagger.components = { ...components, ...swagger.components };\n }\n\n if (security) {\n swagger.security = security;\n }\n\n return {\n addRoute(\n info: RouteInfo,\n config?: {\n basePath?: string;\n }\n ) {\n const basePath = config?.basePath || '';\n const path =\n basePath +\n info.path.replace(\n /\\:[a-z0-9]+\\w/i,\n (param) => `{${param.replace(':', '')}}`\n );\n\n if (!swagger.paths[path]) {\n swagger.paths[path] = {};\n }\n\n swagger.paths[path][info.method.toLowerCase()] = buildPathFromOperation({\n url: path,\n operation: info.document,\n schema,\n useRequestBody: ['POST', 'PUT', 'PATCH'].includes(info.method),\n });\n },\n get() {\n return swagger;\n },\n save(filepath: string) {\n const isJSON = /\\.json$/i;\n const isYAML = /.ya?ml$/i;\n\n if (isJSON.test(filepath)) {\n writeOutput(filepath, JSON.stringify(swagger, null, 2));\n } else if (isYAML.test(filepath)) {\n writeOutput(filepath, YAMLstringify(swagger));\n } else {\n throw new Error('We only support JSON and YAML files');\n }\n },\n };\n}\n\nfunction writeOutput(filepath: string, contents: string) {\n writeFileSync(filepath, contents, {\n encoding: 'utf-8',\n });\n}\n","import * as http from 'http';\nimport { createRouter } from './express';\nimport type { ContextValue } from './types';\nimport type { SofaConfig } from './sofa';\nimport { createSofa } from './sofa';\n\nexport { OpenAPI } from './open-api';\n\ntype Request = http.IncomingMessage & {\n method: string;\n url: string;\n originalUrl?: string;\n body?: any;\n};\n\ntype NextFunction = (err?: any) => void;\n\ntype Middleware = (\n req: Request,\n res: http.ServerResponse,\n next: NextFunction\n) => unknown;\n\nexport type ContextFn = (init: { req: any; res: any }) => ContextValue;\n\nexport function isContextFn(context: any): context is ContextFn {\n return typeof context === 'function';\n}\n\ninterface SofaMiddlewareConfig extends SofaConfig {\n context?: ContextValue | ContextFn;\n}\n\nexport function useSofa({\n context,\n ...config\n}: SofaMiddlewareConfig): Middleware {\n const invokeSofa = createSofaRouter(config);\n return async (req, res, next) => {\n try {\n let contextValue: ContextValue = { req };\n if (context) {\n if (typeof context === 'function') {\n contextValue = await context({ req, res });\n } else {\n contextValue = context;\n }\n }\n const response = await invokeSofa({\n method: req.method,\n url: req.originalUrl ?? req.url,\n body: req.body,\n contextValue,\n });\n if (response == null) {\n next();\n } else {\n const headers = {\n 'Content-Type': 'application/json',\n };\n if (response.statusMessage) {\n res.writeHead(response.status, response.statusMessage, headers);\n } else {\n res.writeHead(response.status, headers);\n }\n if (response.type === 'result') {\n res.end(JSON.stringify(response.body));\n }\n if (response.type === 'error') {\n res.end(JSON.stringify(response.error));\n }\n }\n } catch (error) {\n next(error);\n }\n };\n}\n\nexport function createSofaRouter(config: SofaConfig) {\n const sofa = createSofa(config);\n const router = createRouter(sofa);\n return router;\n}\n"],"names":["getOperationAST","paramCase","Kind","isScalarType","isEqualType","GraphQLBoolean","isInputObjectType","colors.red","colors.yellow","colors.green","colors.blue","uuid","subscribe","__asyncValues","buildOperationNodeForField","isObjectType","isNonNullType","print","graphql","getNamedType","isListType","isEnumType","titleCase","parse","printType","isIntrospectionType","YAMLstringify","writeFileSync"],"mappings":"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"}
|
package/index.esm.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/ast.ts","../src/common.ts","../src/parse.ts","../src/logger.ts","../src/subscriptions.ts","../src/express.ts","../src/sofa.ts","../src/open-api/utils.ts","../src/open-api/types.ts","../src/open-api/operations.ts","../src/open-api/index.ts","../src/index.ts"],"sourcesContent":["import {\n getOperationAST,\n DocumentNode,\n OperationDefinitionNode,\n VariableDefinitionNode,\n} from 'graphql';\n\nexport type OperationInfo =\n | {\n operation: OperationDefinitionNode;\n variables: ReadonlyArray<VariableDefinitionNode>;\n name: string;\n }\n | undefined;\n\nexport function getOperationInfo(doc: DocumentNode): OperationInfo {\n const op = getOperationAST(doc, null);\n\n if (!op) {\n return;\n }\n\n return {\n operation: op,\n name: op.name!.value,\n variables: op.variableDefinitions || [],\n };\n}\n","import { paramCase } from 'param-case';\n\nexport function convertName(name: string) {\n return paramCase(name);\n}\n\nexport function isNil<T>(val: T) {\n return val == null;\n}\n","import {\n VariableDefinitionNode,\n GraphQLSchema,\n TypeNode,\n isScalarType,\n isEqualType,\n GraphQLBoolean,\n isInputObjectType,\n Kind,\n} from 'graphql';\nimport { isNil } from './common';\n\nexport function parseVariable({\n value,\n variable,\n schema,\n}: {\n value: any;\n variable: VariableDefinitionNode;\n schema: GraphQLSchema;\n}) {\n if (isNil(value)) {\n return;\n }\n\n return resolveVariable({\n value,\n type: variable.type,\n schema,\n });\n}\n\nfunction resolveVariable({\n value,\n type,\n schema,\n}: {\n value: any;\n type: TypeNode;\n schema: GraphQLSchema;\n}): any | any[] {\n if (type.kind === Kind.NAMED_TYPE) {\n const namedType = schema.getType(type.name.value);\n\n if (isScalarType(namedType)) {\n // GraphQLBoolean.serialize expects a boolean or a number only\n if (isEqualType(GraphQLBoolean, namedType)) {\n // we don't support TRUE\n value = value === 'true';\n }\n\n return namedType.serialize(value);\n }\n\n if (isInputObjectType(namedType)) {\n return value && typeof value === 'object' ? value : JSON.parse(value);\n }\n\n return value;\n }\n\n if (type.kind === Kind.LIST_TYPE) {\n return (value as any[]).map(val =>\n resolveVariable({\n value: val,\n type: type.type,\n schema,\n })\n );\n }\n\n if (type.kind === Kind.NON_NULL_TYPE) {\n return resolveVariable({\n value: value,\n type: type.type,\n schema,\n });\n }\n}\n","import * as colors from 'ansi-colors';\n\ntype Level = 'error' | 'warn' | 'info' | 'debug';\n\nconst levels: Level[] = ['error', 'warn', 'info', 'debug'];\n\nconst toLevel = (string: void | string) =>\n levels.includes(string as Level) ? (string as Level) : null;\n\nconst currentLevel: Level = process.env.SOFA_DEBUG\n ? 'debug'\n : toLevel(process.env.SOFA_LOGGER_LEVEL) ?? 'info';\n\nconst log = (level: Level, color: any, args: any[]) => {\n if (levels.indexOf(level) <= levels.indexOf(currentLevel)) {\n console.log(`${color(level)}:`, ...args);\n }\n};\n\nexport const logger = {\n error: (...args: any[]) => {\n log('error', colors.red, args);\n },\n warn: (...args: any[]) => {\n log('warn', colors.yellow, args);\n },\n info: (...args: any[]) => {\n log('info', colors.green, args);\n },\n debug: (...args: any[]) => {\n log('debug', colors.blue, args);\n },\n};\n","import {\n subscribe,\n DocumentNode,\n VariableDefinitionNode,\n ExecutionResult,\n Kind,\n} from 'graphql';\nimport { v4 as uuid } from 'uuid';\nimport axios from 'axios';\nimport { buildOperationNodeForField } from '@graphql-tools/utils';\nimport type { ContextValue } from './types';\nimport type { Sofa } from './sofa';\nimport { getOperationInfo } from './ast';\nimport { parseVariable } from './parse';\nimport { logger } from './logger';\n\nfunction isAsyncIterable(obj: any): obj is AsyncIterable<any> {\n return typeof obj[Symbol.asyncIterator] === 'function';\n}\n\n// To start subscription:\n// - an url that Sofa should trigger\n// - name of a subscription\n// - variables if needed\n// - some sort of an auth token\n// - Sofa should return a unique id of that subscription\n// - respond with OK 200\n\n// To stop subscription\n// - an id is required\n// - respond with OK 200\n\n// To update subscription\n// - an id is required\n// - new set of variables\n\nexport type ID = string;\nexport type SubscriptionFieldName = string;\n\nexport interface StartSubscriptionEvent {\n subscription: SubscriptionFieldName;\n variables: any;\n url: string;\n}\n\nexport interface UpdateSubscriptionEvent {\n id: ID;\n variables: any;\n}\n\nexport interface StopSubscriptionResponse {\n id: ID;\n}\n\ninterface BuiltOperation {\n operationName: string;\n document: DocumentNode;\n variables: ReadonlyArray<VariableDefinitionNode>;\n}\n\ninterface StoredClient {\n name: SubscriptionFieldName;\n url: string;\n iterator: AsyncIterator<any>;\n}\n\nexport class SubscriptionManager {\n private operations = new Map<SubscriptionFieldName, BuiltOperation>();\n private clients = new Map<ID, StoredClient>();\n\n constructor(private sofa: Sofa) {\n this.buildOperations();\n }\n\n public async start(\n event: StartSubscriptionEvent,\n contextValue: ContextValue\n ) {\n const id = uuid();\n const name = event.subscription;\n\n if (!this.operations.has(name)) {\n throw new Error(`Subscription '${name}' is not available`);\n }\n\n const { document, operationName, variables } = this.operations.get(name)!;\n\n logger.info(`[Subscription] Start ${id}`, event);\n\n const result = await this.execute({\n id,\n name,\n url: event.url,\n document,\n operationName,\n variables,\n contextValue,\n });\n\n if (typeof result !== 'undefined') {\n return result;\n }\n\n return { id };\n }\n\n public async stop(id: ID): Promise<StopSubscriptionResponse> {\n logger.info(`[Subscription] Stop ${id}`);\n\n if (!this.clients.has(id)) {\n throw new Error(`Subscription with ID '${id}' does not exist`);\n }\n\n const execution = this.clients.get(id)!;\n\n if (execution.iterator.return) {\n execution.iterator.return();\n }\n\n this.clients.delete(id);\n\n return { id };\n }\n\n public async update(\n event: UpdateSubscriptionEvent,\n contextValue: ContextValue\n ) {\n const { variables, id } = event;\n\n logger.info(`[Subscription] Update ${id}`, event);\n\n if (!this.clients.has(id)) {\n throw new Error(`Subscription with ID '${id}' does not exist`);\n }\n\n const { name: subscription, url } = this.clients.get(id)!;\n\n this.stop(id);\n\n return this.start(\n {\n url,\n subscription,\n variables,\n },\n contextValue\n );\n }\n\n private async execute({\n id,\n document,\n name,\n url,\n operationName,\n variables,\n contextValue,\n }: {\n id: ID;\n name: SubscriptionFieldName;\n url: string;\n document: DocumentNode;\n operationName: string;\n variables: Record<string, any>;\n contextValue: ContextValue;\n }) {\n const variableNodes = this.operations.get(name)!.variables;\n const variableValues = variableNodes.reduce((values, variable) => {\n const value = parseVariable({\n value: variables[variable.variable.name.value],\n variable,\n schema: this.sofa.schema,\n });\n\n if (typeof value === 'undefined') {\n return values;\n }\n\n return {\n ...values,\n [name]: value,\n };\n }, {});\n\n const execution = await subscribe({\n schema: this.sofa.schema,\n document,\n operationName,\n variableValues,\n contextValue,\n });\n\n if (isAsyncIterable(execution)) {\n // successful\n\n // add execution to clients\n this.clients.set(id, {\n name,\n url,\n iterator: execution as any,\n });\n\n // success\n (async () => {\n for await (const result of execution) {\n await this.sendData({\n id,\n result,\n });\n }\n })().then(\n () => {\n // completes\n this.clients.delete(id);\n },\n (e) => {\n logger.info(`Subscription #${id} closed`);\n logger.error(e);\n this.clients.delete(id);\n }\n );\n } else {\n return execution as ExecutionResult;\n }\n }\n\n private async sendData({ id, result }: { id: ID; result: any }) {\n if (!this.clients.has(id)) {\n throw new Error(`Subscription with ID '${id}' does not exist`);\n }\n\n const { url } = this.clients.get(id)!;\n\n logger.info(`[Subscription] Trigger ${id}`);\n\n await axios.post(url, result);\n }\n\n private buildOperations() {\n const subscription = this.sofa.schema.getSubscriptionType();\n\n if (!subscription) {\n return;\n }\n\n const fieldMap = subscription.getFields();\n\n for (const field in fieldMap) {\n const operationNode = buildOperationNodeForField({\n kind: 'subscription',\n field,\n schema: this.sofa.schema,\n models: this.sofa.models,\n ignore: this.sofa.ignore,\n circularReferenceDepth: this.sofa.depthLimit,\n });\n const document: DocumentNode = {\n kind: Kind.DOCUMENT,\n definitions: [operationNode],\n };\n\n const { variables, name: operationName } = getOperationInfo(document)!;\n\n this.operations.set(field, {\n operationName,\n document,\n variables,\n });\n }\n }\n}\n","import {\n DocumentNode,\n print,\n isObjectType,\n isNonNullType,\n Kind,\n} from 'graphql';\nimport * as Trouter from 'trouter';\nimport { buildOperationNodeForField } from '@graphql-tools/utils';\nimport { getOperationInfo, OperationInfo } from './ast';\nimport type { Sofa, Route } from './sofa';\nimport type { RouteInfo, Method, ContextValue } from './types';\nimport { convertName } from './common';\nimport { parseVariable } from './parse';\nimport { StartSubscriptionEvent, SubscriptionManager } from './subscriptions';\nimport { logger } from './logger';\n\nexport type ErrorHandler = (errors: ReadonlyArray<any>) => RouterError;\n\ntype Params = { [key: string]: string };\n\ntype TrouterMethod = 'get' | 'post' | 'put' | 'delete' | 'patch';\n\ntype RouterRequest = {\n method: string;\n url: string;\n body: any;\n contextValue: ContextValue;\n};\ntype RouterResult = {\n type: 'result';\n status: number;\n statusMessage?: string;\n body: any;\n};\ntype RouterError = {\n type: 'error';\n status: number;\n statusMessage?: string;\n error: any;\n};\ntype RouterResponse = RouterResult | RouterError;\ntype Router = (request: RouterRequest) => Promise<null | RouterResponse>;\n\ntype RouteRequest = {\n url: string;\n body: any;\n params: Params;\n contextValue: ContextValue;\n};\ntype RouteMiddleware = (request: RouteRequest) => Promise<RouterResponse>;\n\nexport function createRouter(sofa: Sofa): Router {\n logger.debug('[Sofa] Creating router');\n\n const router = new Trouter<RouteMiddleware>();\n\n const queryType = sofa.schema.getQueryType();\n const mutationType = sofa.schema.getMutationType();\n const subscriptionManager = new SubscriptionManager(sofa);\n\n if (queryType) {\n Object.keys(queryType.getFields()).forEach((fieldName) => {\n const route = createQueryRoute({ sofa, router, fieldName });\n\n if (sofa.onRoute) {\n sofa.onRoute(route);\n }\n });\n }\n\n if (mutationType) {\n Object.keys(mutationType.getFields()).forEach((fieldName) => {\n const route = createMutationRoute({ sofa, router, fieldName });\n\n if (sofa.onRoute) {\n sofa.onRoute(route);\n }\n });\n }\n\n router.post('/webhook', async ({ body, contextValue }) => {\n const { subscription, variables, url }: StartSubscriptionEvent = body;\n try {\n const result = await subscriptionManager.start(\n {\n subscription,\n variables,\n url,\n },\n contextValue\n );\n return {\n type: 'result',\n status: 200,\n statusMessage: 'OK',\n body: result,\n };\n } catch (error) {\n return {\n type: 'error',\n status: 500,\n statusMessage: 'Subscription failed',\n error,\n };\n }\n });\n\n router.post('/webhook/:id', async ({ body, params, contextValue }) => {\n const id: string = params.id;\n const variables: any = body.variables;\n try {\n const result = await subscriptionManager.update(\n {\n id,\n variables,\n },\n contextValue\n );\n return {\n type: 'result',\n status: 200,\n statusMessage: 'OK',\n body: result,\n };\n } catch (error) {\n return {\n type: 'error',\n status: 500,\n statusMessage: 'Subscription failed to update',\n error,\n };\n }\n });\n\n router.delete('/webhook/:id', async ({ params }) => {\n const id: string = params.id;\n try {\n const result = await subscriptionManager.stop(id);\n return {\n type: 'result',\n status: 200,\n statusMessage: 'OK',\n body: result,\n };\n } catch (error) {\n return {\n type: 'error',\n status: 500,\n statusMessage: 'Subscription failed to stop',\n error,\n };\n }\n });\n\n return async ({ method, url, body, contextValue }) => {\n if (!url.startsWith(sofa.basePath)) {\n return null;\n }\n // trim base path and search\n const [slicedUrl] = url.slice(sofa.basePath.length).split('?');\n const trouterMethod = method.toUpperCase() as Trouter.HTTPMethod;\n const obj = router.find(trouterMethod, slicedUrl);\n for (const handler of obj.handlers) {\n return await handler({\n url,\n body,\n params: obj.params,\n contextValue,\n });\n }\n return null;\n };\n}\n\nfunction createQueryRoute({\n sofa,\n router,\n fieldName,\n}: {\n sofa: Sofa;\n router: Trouter;\n fieldName: string;\n}): RouteInfo {\n logger.debug(`[Router] Creating ${fieldName} query`);\n\n const queryType = sofa.schema.getQueryType()!;\n const operationNode = buildOperationNodeForField({\n kind: 'query',\n schema: sofa.schema,\n field: fieldName,\n models: sofa.models,\n ignore: sofa.ignore,\n circularReferenceDepth: sofa.depthLimit,\n });\n const operation: DocumentNode = {\n kind: Kind.DOCUMENT,\n definitions: [operationNode],\n };\n const info = getOperationInfo(operation)!;\n const field = queryType.getFields()[fieldName];\n const fieldType = field.type;\n const isSingle =\n isObjectType(fieldType) ||\n (isNonNullType(fieldType) && isObjectType(fieldType.ofType));\n const hasIdArgument = field.args.some((arg) => arg.name === 'id');\n\n const graphqlPath = `${queryType.name}.${fieldName}`;\n const routeConfig = sofa.routes?.[graphqlPath];\n const route = {\n method: routeConfig?.method ?? 'GET',\n path: routeConfig?.path ?? getPath(fieldName, isSingle && hasIdArgument),\n responseStatus: routeConfig?.responseStatus ?? 200,\n };\n\n router[route.method.toLocaleLowerCase() as TrouterMethod](\n route.path,\n useHandler({ info, route, fieldName, sofa, operation })\n );\n\n logger.debug(\n `[Router] ${fieldName} query available at ${route.method} ${route.path}`\n );\n\n return {\n document: operation,\n path: route.path,\n method: route.method.toUpperCase() as Method,\n };\n}\n\nfunction createMutationRoute({\n sofa,\n router,\n fieldName,\n}: {\n sofa: Sofa;\n router: Trouter;\n fieldName: string;\n}): RouteInfo {\n logger.debug(`[Router] Creating ${fieldName} mutation`);\n\n const mutationType = sofa.schema.getMutationType()!;\n const operationNode = buildOperationNodeForField({\n kind: 'mutation',\n schema: sofa.schema,\n field: fieldName,\n models: sofa.models,\n ignore: sofa.ignore,\n circularReferenceDepth: sofa.depthLimit,\n });\n const operation: DocumentNode = {\n kind: Kind.DOCUMENT,\n definitions: [operationNode],\n };\n const info = getOperationInfo(operation)!;\n\n const graphqlPath = `${mutationType.name}.${fieldName}`;\n const routeConfig = sofa.routes?.[graphqlPath];\n const route = {\n method: routeConfig?.method ?? 'POST',\n path: routeConfig?.path ?? getPath(fieldName),\n responseStatus: routeConfig?.responseStatus ?? 200,\n };\n const { method, path } = route;\n\n router[method.toLowerCase() as TrouterMethod](\n path,\n useHandler({ info, route, fieldName, sofa, operation })\n );\n\n logger.debug(`[Router] ${fieldName} mutation available at ${method} ${path}`);\n\n return {\n document: operation,\n path,\n method,\n };\n}\n\nfunction useHandler(config: {\n sofa: Sofa;\n info: OperationInfo;\n route: Route;\n operation: DocumentNode;\n fieldName: string;\n}): RouteMiddleware {\n const { sofa, operation, fieldName } = config;\n const info = config.info!;\n\n return async ({ url, body, params, contextValue }) => {\n const variableValues = info.variables.reduce((variables, variable) => {\n const name = variable.variable.name.value;\n const value = parseVariable({\n value: pickParam({ url, body, params, name }),\n variable,\n schema: sofa.schema,\n });\n\n if (typeof value === 'undefined') {\n return variables;\n }\n\n return {\n ...variables,\n [name]: value,\n };\n }, {});\n\n const result = await sofa.execute({\n schema: sofa.schema,\n source: print(operation),\n contextValue,\n variableValues,\n operationName: info.operation.name && info.operation.name.value,\n });\n\n if (result.errors) {\n const defaultErrorHandler: ErrorHandler = (errors) => {\n return {\n type: 'error',\n status: 500,\n error: errors[0],\n };\n };\n const errorHandler: ErrorHandler =\n sofa.errorHandler || defaultErrorHandler;\n return errorHandler(result.errors);\n }\n\n return {\n type: 'result',\n status: config.route.responseStatus,\n body: result.data && result.data[fieldName],\n };\n };\n}\n\nfunction getPath(fieldName: string, hasId = false) {\n return `/${convertName(fieldName)}${hasId ? '/:id' : ''}`;\n}\n\nfunction pickParam({\n name,\n url,\n params,\n body,\n}: {\n name: string;\n url: string;\n params: Params;\n body: any;\n}) {\n if (params && params.hasOwnProperty(name)) {\n return params[name];\n }\n const searchParams = new URLSearchParams(url.split('?')[1]);\n if (searchParams.has(name)) {\n return searchParams.get(name);\n }\n if (body && body.hasOwnProperty(name)) {\n return body[name];\n }\n}\n","import {\n GraphQLSchema,\n graphql,\n isObjectType,\n GraphQLObjectType,\n getNamedType,\n GraphQLNamedType,\n isListType,\n isNonNullType,\n GraphQLOutputType,\n} from 'graphql';\n\nimport { Ignore, ExecuteFn, OnRoute, Method } from './types';\nimport { convertName } from './common';\nimport { logger } from './logger';\nimport { ErrorHandler } from './express';\n\n// user passes:\n// - schema\n// - error handler\n// - execute function\n// - context\n\ninterface RouteConfig {\n method?: Method;\n path?: string;\n responseStatus?: number;\n}\n\nexport interface Route {\n method: Method;\n path: string;\n responseStatus: number;\n}\n\nexport interface SofaConfig {\n basePath: string;\n schema: GraphQLSchema;\n execute?: ExecuteFn;\n /**\n * Treats an Object with an ID as not a model.\n * @example [\"User\", \"Message.author\"]\n */\n ignore?: Ignore;\n onRoute?: OnRoute;\n depthLimit?: number;\n errorHandler?: ErrorHandler;\n /**\n * Overwrites the default HTTP route.\n */\n routes?: Record<string, RouteConfig>;\n}\n\nexport interface Sofa {\n basePath: string;\n schema: GraphQLSchema;\n models: string[];\n ignore: Ignore;\n depthLimit: number;\n routes?: Record<string, RouteConfig>;\n execute: ExecuteFn;\n onRoute?: OnRoute;\n errorHandler?: ErrorHandler;\n}\n\nexport function createSofa(config: SofaConfig): Sofa {\n logger.debug('[Sofa] Created');\n\n const models = extractsModels(config.schema);\n const ignore = config.ignore || [];\n const depthLimit = config.depthLimit || 1;\n\n logger.debug(`[Sofa] models: ${models.join(', ')}`);\n logger.debug(`[Sofa] ignore: ${ignore.join(', ')}`);\n\n return {\n execute: graphql,\n models,\n ignore,\n depthLimit,\n ...config,\n };\n}\n\n// Objects and Unions are the only things that are used to define return types\n// and both might contain an ID\n// We don't treat Unions as models because\n// they might represent an Object that is not a model\n// We check it later, when an operation is being built\nfunction extractsModels(schema: GraphQLSchema): string[] {\n const modelMap: {\n [name: string]: {\n list?: boolean;\n single?: boolean;\n };\n } = {};\n const query = schema.getQueryType()!;\n const fields = query.getFields();\n\n // if Query[type] (no args) and Query[type](just id as an argument)\n\n // loop through every field\n for (const fieldName in fields) {\n const field = fields[fieldName];\n const namedType = getNamedType(field.type);\n\n if (hasID(namedType)) {\n if (!modelMap[namedType.name]) {\n modelMap[namedType.name] = {};\n }\n\n if (isArrayOf(field.type, namedType)) {\n // check if type is a list\n // check if name of a field matches a name of a named type (in plural)\n // check if has no non-optional arguments\n // add to registry with `list: true`\n const sameName = isNameEqual(field.name, namedType.name + 's');\n const allOptionalArguments = !field.args.some((arg) =>\n isNonNullType(arg.type)\n );\n\n modelMap[namedType.name].list = sameName && allOptionalArguments;\n } else if (\n isObjectType(field.type) ||\n (isNonNullType(field.type) && isObjectType(field.type.ofType))\n ) {\n // check if type is a graphql object type\n // check if name of a field matches with name of an object type\n // check if has only one argument named `id`\n // add to registry with `single: true`\n const sameName = isNameEqual(field.name, namedType.name);\n const hasIdArgument =\n field.args.length === 1 && field.args[0].name === 'id';\n\n modelMap[namedType.name].single = sameName && hasIdArgument;\n }\n }\n }\n\n return Object.keys(modelMap).filter(\n (name) => modelMap[name].list && modelMap[name].single\n );\n}\n\n// it's dumb but let's leave it for now\nfunction isArrayOf(\n type: GraphQLOutputType,\n expected: GraphQLObjectType\n): boolean {\n if (isOptionalList(type)) {\n return true;\n }\n\n if (isNonNullType(type) && isOptionalList(type.ofType)) {\n return true;\n }\n\n function isOptionalList(list: GraphQLOutputType) {\n if (isListType(list)) {\n if (list.ofType.name === expected.name) {\n return true;\n }\n\n if (\n isNonNullType(list.ofType) &&\n list.ofType.ofType.name === expected.name\n ) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nfunction hasID(type: GraphQLNamedType): type is GraphQLObjectType {\n return isObjectType(type) && !!type.getFields().id;\n}\n\nfunction isNameEqual(a: string, b: string): boolean {\n return convertName(a) === convertName(b);\n}\n","export function mapToPrimitive(type: string) {\n const formatMap: Record<string, any> = {\n Int: {\n type: 'integer',\n format: 'int32',\n },\n Float: {\n type: 'number',\n format: 'float',\n },\n String: {\n type: 'string',\n },\n Boolean: {\n type: 'boolean',\n },\n ID: {\n type: 'string',\n },\n };\n\n if (formatMap[type]) {\n return formatMap[type];\n }\n}\n\nexport function mapToRef(type: string) {\n return `#/components/schemas/${type}`;\n}\n","import {\n GraphQLObjectType,\n GraphQLInputObjectType,\n GraphQLField,\n GraphQLInputField,\n isNonNullType,\n GraphQLOutputType,\n isListType,\n isObjectType,\n isScalarType,\n GraphQLNamedType,\n isEnumType,\n} from 'graphql';\nimport { mapToPrimitive, mapToRef } from './utils';\n\nexport function buildSchemaObjectFromType(\n type: GraphQLObjectType | GraphQLInputObjectType\n): any {\n const required: string[] = [];\n const properties: Record<string, any> = {};\n\n const fields = type.getFields();\n\n for (const fieldName in fields) {\n const field = fields[fieldName];\n\n if (isNonNullType(field.type)) {\n required.push(field.name);\n }\n\n properties[fieldName] = resolveField(field);\n if (field.description) {\n properties[fieldName].description = field.description;\n }\n }\n\n return {\n type: 'object',\n ...(required.length ? { required } : {}),\n properties,\n ...(type.description ? { description: type.description } : {}),\n };\n}\n\nfunction resolveField(field: GraphQLField<any, any> | GraphQLInputField) {\n return resolveFieldType(field.type);\n}\n\n// array -> [type]\n// type -> $ref\n// scalar -> swagger primitive\nexport function resolveFieldType(\n type: GraphQLOutputType | GraphQLNamedType\n): any {\n if (isNonNullType(type)) {\n return resolveFieldType(type.ofType);\n }\n\n if (isListType(type)) {\n return {\n type: 'array',\n items: resolveFieldType(type.ofType),\n };\n }\n\n if (isObjectType(type)) {\n return {\n $ref: mapToRef(type.name),\n };\n }\n\n if (isScalarType(type)) {\n return (\n mapToPrimitive(type.name) || {\n type: 'object',\n }\n );\n }\n\n if (isEnumType(type)) {\n return {\n type: 'string',\n enum: type.astNode?.values?.map((value) => value.name.value),\n };\n }\n\n return {\n type: 'object',\n };\n}\n","import {\n DocumentNode,\n GraphQLSchema,\n VariableDefinitionNode,\n TypeNode,\n OperationDefinitionNode,\n ObjectTypeDefinitionNode,\n FieldNode,\n parse,\n printType,\n Kind,\n} from 'graphql';\n\nimport { getOperationInfo } from '../ast';\nimport { mapToPrimitive, mapToRef } from './utils';\nimport { resolveFieldType } from './types';\nimport { titleCase } from 'title-case';\n\nexport function buildPathFromOperation({\n url,\n schema,\n operation,\n useRequestBody,\n}: {\n url: string;\n schema: GraphQLSchema;\n operation: DocumentNode;\n useRequestBody: boolean;\n}): any {\n const info = getOperationInfo(operation)!;\n\n const description = resolveDescription(schema, info.operation);\n\n return {\n operationId: info.name,\n ...(useRequestBody\n ? {\n requestBody: {\n content: {\n 'application/json': {\n schema: resolveRequestBody(info.operation.variableDefinitions),\n },\n },\n },\n }\n : {\n parameters: resolveParameters(\n url,\n info.operation.variableDefinitions\n ),\n }),\n responses: {\n 200: {\n description,\n content: {\n 'application/json': {\n schema: resolveResponse({\n schema,\n operation: info.operation,\n }),\n },\n },\n },\n },\n };\n}\n\nfunction resolveParameters(\n url: string,\n variables: ReadonlyArray<VariableDefinitionNode> | undefined\n) {\n if (!variables) {\n return [];\n }\n\n return variables.map((variable: any) => {\n return {\n in: isInPath(url, variable.variable.name.value) ? 'path' : 'query',\n name: variable.variable.name.value,\n required: variable.type.kind === Kind.NON_NULL_TYPE,\n schema: resolveParamSchema(variable.type),\n };\n });\n}\n\nfunction resolveRequestBody(\n variables: ReadonlyArray<VariableDefinitionNode> | undefined\n) {\n if (!variables) {\n return {};\n }\n\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n variables.forEach(variable => {\n if (variable.type.kind === Kind.NON_NULL_TYPE) {\n required.push(variable.variable.name.value);\n }\n\n properties[variable.variable.name.value] = resolveParamSchema(\n variable.type\n );\n });\n\n return {\n type: 'object',\n properties,\n ...(required.length ? { required } : {}),\n };\n}\n\n// array -> [type]\n// type -> $ref\n// scalar -> swagger primitive\nfunction resolveParamSchema(type: TypeNode): any {\n if (type.kind === Kind.NON_NULL_TYPE) {\n return resolveParamSchema(type.type);\n }\n\n if (type.kind === Kind.LIST_TYPE) {\n return {\n type: 'array',\n items: resolveParamSchema(type.type),\n };\n }\n\n const primitive = mapToPrimitive(type.name.value);\n\n return (\n primitive || {\n $ref: mapToRef(type.name.value),\n }\n );\n}\n\nfunction resolveResponse({\n schema,\n operation,\n}: {\n schema: GraphQLSchema;\n operation: OperationDefinitionNode;\n}) {\n const operationType = operation.operation;\n const rootField = operation.selectionSet.selections[0];\n\n if (rootField.kind === Kind.FIELD) {\n if (operationType === 'query') {\n const queryType = schema.getQueryType()!;\n const field = queryType.getFields()[rootField.name.value];\n\n return resolveFieldType(field.type);\n }\n\n if (operationType === 'mutation') {\n const mutationType = schema.getMutationType()!;\n const field = mutationType.getFields()[rootField.name.value];\n\n return resolveFieldType(field.type);\n }\n }\n}\n\nfunction isInPath(url: string, param: string): boolean {\n return url.indexOf(`{${param}}`) !== -1;\n}\n\nfunction resolveDescription(\n schema: GraphQLSchema,\n operation: OperationDefinitionNode\n) {\n const selection = operation.selectionSet.selections[0] as FieldNode;\n const fieldName = selection.name.value;\n const typeDefinition = schema.getType(titleCase(operation.operation));\n\n if (!typeDefinition) {\n return '';\n }\n\n const definitionNode =\n typeDefinition.astNode || parse(printType(typeDefinition)).definitions[0];\n\n if (!isObjectTypeDefinitionNode(definitionNode)) {\n return '';\n }\n\n const fieldNode = definitionNode.fields!.find(\n field => field.name.value === fieldName\n );\n const descriptionDefinition = fieldNode && fieldNode.description;\n return descriptionDefinition && descriptionDefinition.value\n ? descriptionDefinition.value\n : '';\n}\n\nfunction isObjectTypeDefinitionNode(\n node: any\n): node is ObjectTypeDefinitionNode {\n return node.kind === Kind.OBJECT_TYPE_DEFINITION;\n}\n","import {\n GraphQLSchema,\n isObjectType,\n isInputObjectType,\n isIntrospectionType,\n} from 'graphql';\nimport { dump as YAMLstringify } from 'js-yaml';\nimport { writeFileSync } from 'fs';\n\nimport { buildSchemaObjectFromType } from './types';\nimport { buildPathFromOperation } from './operations';\nimport { RouteInfo } from '../types';\nimport { OpenAPI } from './interfaces';\n\nexport function OpenAPI({\n schema,\n info,\n components,\n security,\n}: {\n schema: GraphQLSchema;\n info: Record<string, any>;\n components?: Record<string, any>;\n security?: Record<string, any>[];\n}) {\n const types = schema.getTypeMap();\n const swagger: any = {\n openapi: '3.0.0',\n info,\n paths: {},\n components: {\n schemas: {},\n },\n };\n\n for (const typeName in types) {\n const type = types[typeName];\n\n if (\n (isObjectType(type) || isInputObjectType(type)) &&\n !isIntrospectionType(type)\n ) {\n swagger.components!.schemas![typeName] = buildSchemaObjectFromType(type);\n }\n }\n\n if (components) {\n swagger.components = { ...components, ...swagger.components };\n }\n\n if (security) {\n swagger.security = security;\n }\n\n return {\n addRoute(\n info: RouteInfo,\n config?: {\n basePath?: string;\n }\n ) {\n const basePath = config?.basePath || '';\n const path =\n basePath +\n info.path.replace(\n /\\:[a-z0-9]+\\w/i,\n (param) => `{${param.replace(':', '')}}`\n );\n\n if (!swagger.paths[path]) {\n swagger.paths[path] = {};\n }\n\n swagger.paths[path][info.method.toLowerCase()] = buildPathFromOperation({\n url: path,\n operation: info.document,\n schema,\n useRequestBody: ['POST', 'PUT', 'PATCH'].includes(info.method),\n });\n },\n get() {\n return swagger;\n },\n save(filepath: string) {\n const isJSON = /\\.json$/i;\n const isYAML = /.ya?ml$/i;\n\n if (isJSON.test(filepath)) {\n writeOutput(filepath, JSON.stringify(swagger, null, 2));\n } else if (isYAML.test(filepath)) {\n writeOutput(filepath, YAMLstringify(swagger));\n } else {\n throw new Error('We only support JSON and YAML files');\n }\n },\n };\n}\n\nfunction writeOutput(filepath: string, contents: string) {\n writeFileSync(filepath, contents, {\n encoding: 'utf-8',\n });\n}\n","import * as http from 'http';\nimport { createRouter } from './express';\nimport type { ContextValue } from './types';\nimport type { SofaConfig } from './sofa';\nimport { createSofa } from './sofa';\n\nexport { OpenAPI } from './open-api';\n\ntype Request = http.IncomingMessage & {\n method: string;\n url: string;\n originalUrl?: string;\n body?: any;\n};\n\ntype NextFunction = (err?: any) => void;\n\ntype Middleware = (\n req: Request,\n res: http.ServerResponse,\n next: NextFunction\n) => unknown;\n\nexport type ContextFn = (init: { req: any; res: any }) => ContextValue;\n\nexport function isContextFn(context: any): context is ContextFn {\n return typeof context === 'function';\n}\n\ninterface SofaMiddlewareConfig extends SofaConfig {\n context?: ContextValue | ContextFn;\n}\n\nexport function useSofa({\n context,\n ...config\n}: SofaMiddlewareConfig): Middleware {\n const invokeSofa = createSofaRouter(config);\n return async (req, res, next) => {\n try {\n let contextValue: ContextValue = { req };\n if (context) {\n if (typeof context === 'function') {\n contextValue = await context({ req, res });\n } else {\n contextValue = context;\n }\n }\n const response = await invokeSofa({\n method: req.method,\n url: req.originalUrl ?? req.url,\n body: req.body,\n contextValue,\n });\n if (response == null) {\n next();\n } else {\n const headers = {\n 'Content-Type': 'application/json',\n };\n if (response.statusMessage) {\n res.writeHead(response.status, response.statusMessage, headers);\n } else {\n res.writeHead(response.status, headers);\n }\n if (response.type === 'result') {\n res.end(JSON.stringify(response.body));\n }\n if (response.type === 'error') {\n res.end(JSON.stringify(response.error));\n }\n }\n } catch (error) {\n next(error);\n }\n };\n}\n\nexport function createSofaRouter(config: SofaConfig) {\n const sofa = createSofa(config);\n const router = createRouter(sofa);\n return router;\n}\n"],"names":["colors.red","colors.yellow","colors.green","colors.blue","uuid","YAMLstringify"],"mappings":"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"}
|