UNPKG

3.78 kBJavaScriptView Raw
1import { asArray } from './helpers.js';
2import { MapperKind } from './Interfaces.js';
3import { mapSchema } from './mapSchema.js';
4function handleDirectiveExtensions(extensions, removeDirectives) {
5 extensions = extensions || {};
6 const { directives: existingDirectives, ...rest } = extensions;
7 const finalExtensions = {
8 ...rest,
9 };
10 if (!removeDirectives) {
11 if (existingDirectives != null) {
12 const directives = {};
13 for (const directiveName in existingDirectives) {
14 directives[directiveName] = [...asArray(existingDirectives[directiveName])];
15 }
16 finalExtensions.directives = directives;
17 }
18 }
19 return finalExtensions;
20}
21export function extractExtensionsFromSchema(schema, removeDirectives = false) {
22 const result = {
23 schemaExtensions: handleDirectiveExtensions(schema.extensions, removeDirectives),
24 types: {},
25 };
26 mapSchema(schema, {
27 [MapperKind.OBJECT_TYPE]: type => {
28 result.types[type.name] = {
29 fields: {},
30 type: 'object',
31 extensions: handleDirectiveExtensions(type.extensions, removeDirectives),
32 };
33 return type;
34 },
35 [MapperKind.INTERFACE_TYPE]: type => {
36 result.types[type.name] = {
37 fields: {},
38 type: 'interface',
39 extensions: handleDirectiveExtensions(type.extensions, removeDirectives),
40 };
41 return type;
42 },
43 [MapperKind.FIELD]: (field, fieldName, typeName) => {
44 result.types[typeName].fields[fieldName] = {
45 arguments: {},
46 extensions: handleDirectiveExtensions(field.extensions, removeDirectives),
47 };
48 const args = field.args;
49 if (args != null) {
50 for (const argName in args) {
51 result.types[typeName].fields[fieldName].arguments[argName] =
52 handleDirectiveExtensions(args[argName].extensions, removeDirectives);
53 }
54 }
55 return field;
56 },
57 [MapperKind.ENUM_TYPE]: type => {
58 result.types[type.name] = {
59 values: {},
60 type: 'enum',
61 extensions: handleDirectiveExtensions(type.extensions, removeDirectives),
62 };
63 return type;
64 },
65 [MapperKind.ENUM_VALUE]: (value, typeName, _schema, valueName) => {
66 result.types[typeName].values[valueName] = handleDirectiveExtensions(value.extensions, removeDirectives);
67 return value;
68 },
69 [MapperKind.SCALAR_TYPE]: type => {
70 result.types[type.name] = {
71 type: 'scalar',
72 extensions: handleDirectiveExtensions(type.extensions, removeDirectives),
73 };
74 return type;
75 },
76 [MapperKind.UNION_TYPE]: type => {
77 result.types[type.name] = {
78 type: 'union',
79 extensions: handleDirectiveExtensions(type.extensions, removeDirectives),
80 };
81 return type;
82 },
83 [MapperKind.INPUT_OBJECT_TYPE]: type => {
84 result.types[type.name] = {
85 fields: {},
86 type: 'input',
87 extensions: handleDirectiveExtensions(type.extensions, removeDirectives),
88 };
89 return type;
90 },
91 [MapperKind.INPUT_OBJECT_FIELD]: (field, fieldName, typeName) => {
92 result.types[typeName].fields[fieldName] = {
93 extensions: handleDirectiveExtensions(field.extensions, removeDirectives),
94 };
95 return field;
96 },
97 });
98 return result;
99}