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 CHANGED
@@ -1,4 +1,4 @@
1
- [![sofa](https://user-images.githubusercontent.com/25294569/63839869-bfac8300-c988-11e9-978e-6b6c16c350de.gif)](https://sofa-api.com)
1
+ [![sofa](https://user-images.githubusercontent.com/25294569/63839869-bfac8300-c988-11e9-978e-6b6c16c350de.gif)](https://www.sofa-api.com)
2
2
 
3
3
  [![npm version](https://badge.fury.io/js/sofa-api.svg)](https://npmjs.com/package/sofa-api)
4
4
  [![Discord Chat](https://img.shields.io/discord/625400653321076807)](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: Record<string, any>;
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 axios = _interopDefault(require('axios'));
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 axios.post(url, result);
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
- return searchParams.get(name);
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
- if (isOptionalList(type)) {
562
- return true;
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 * as Trouter from 'trouter';
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 axios from 'axios';
8
- import { red, yellow, green, blue } from 'ansi-colors';
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 axios.post(url, result);
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
- return searchParams.get(name);
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
- if (isOptionalList(type)) {
556
- return true;
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
@@ -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;
@@ -1,3 +1,3 @@
1
- import { GraphQLObjectType, GraphQLInputObjectType, GraphQLOutputType, GraphQLNamedType } from 'graphql';
1
+ import { GraphQLObjectType, GraphQLInputObjectType, GraphQLType } from 'graphql';
2
2
  export declare function buildSchemaObjectFromType(type: GraphQLObjectType | GraphQLInputObjectType): any;
3
- export declare function resolveFieldType(type: GraphQLOutputType | GraphQLNamedType): any;
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.10.3-alpha.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": "7.2.5",
11
- "@types/js-yaml": "4.0.0",
10
+ "@graphql-tools/utils": "8.6.5",
11
+ "@types/js-yaml": "4.0.5",
12
12
  "ansi-colors": "4.1.1",
13
- "axios": "0.21.1",
14
- "js-yaml": "4.0.0",
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.1.0",
18
- "tslib": "2.1.0",
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.cjs.js",
38
- "module": "index.esm.js",
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
+ }
@@ -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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"}