1 | import { asArray } from './helpers.js';
|
2 | import { MapperKind } from './Interfaces.js';
|
3 | import { mapSchema } from './mapSchema.js';
|
4 | function 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 | }
|
21 | export 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 | }
|