1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.addMocksToSchema = void 0;
|
4 | const graphql_1 = require("graphql");
|
5 | const utils_1 = require("@graphql-tools/utils");
|
6 | const schema_1 = require("@graphql-tools/schema");
|
7 | const types_js_1 = require("./types.js");
|
8 | const utils_js_1 = require("./utils.js");
|
9 | const MockStore_js_1 = require("./MockStore.js");
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 |
|
44 |
|
45 |
|
46 |
|
47 |
|
48 |
|
49 |
|
50 |
|
51 |
|
52 |
|
53 |
|
54 |
|
55 |
|
56 |
|
57 |
|
58 |
|
59 |
|
60 |
|
61 |
|
62 |
|
63 |
|
64 |
|
65 |
|
66 |
|
67 |
|
68 |
|
69 | function addMocksToSchema({ schema, store: maybeStore, mocks, typePolicies, resolvers: resolversOrFnResolvers, preserveResolvers = false, }) {
|
70 | if (!schema) {
|
71 | throw new Error('Must provide schema to mock');
|
72 | }
|
73 | if (!(0, graphql_1.isSchema)(schema)) {
|
74 | throw new Error('Value at "schema" must be of type GraphQLSchema');
|
75 | }
|
76 | if (mocks && !(0, utils_js_1.isObject)(mocks)) {
|
77 | throw new Error('mocks must be of type Object');
|
78 | }
|
79 | const store = maybeStore ||
|
80 | (0, MockStore_js_1.createMockStore)({
|
81 | schema,
|
82 | mocks,
|
83 | typePolicies,
|
84 | });
|
85 | const resolvers = typeof resolversOrFnResolvers === 'function'
|
86 | ? resolversOrFnResolvers(store)
|
87 | : resolversOrFnResolvers;
|
88 | const mockResolver = (source, args, contex, info) => {
|
89 | const defaultResolvedValue = (0, graphql_1.defaultFieldResolver)(source, args, contex, info);
|
90 |
|
91 | if (defaultResolvedValue !== undefined)
|
92 | return defaultResolvedValue;
|
93 | if ((0, types_js_1.isRef)(source)) {
|
94 | return store.get({
|
95 | typeName: source.$ref.typeName,
|
96 | key: source.$ref.key,
|
97 | fieldName: info.fieldName,
|
98 | fieldArgs: args,
|
99 | });
|
100 | }
|
101 |
|
102 |
|
103 | if ((0, utils_js_1.isRootType)(info.parentType, info.schema)) {
|
104 | return store.get({
|
105 | typeName: info.parentType.name,
|
106 | key: 'ROOT',
|
107 | fieldName: info.fieldName,
|
108 | fieldArgs: args,
|
109 | });
|
110 | }
|
111 | if (defaultResolvedValue === undefined) {
|
112 |
|
113 | return store.generateFieldValue(info.parentType.name, info.fieldName);
|
114 | }
|
115 | return undefined;
|
116 | };
|
117 | const typeResolver = data => {
|
118 | if ((0, types_js_1.isRef)(data)) {
|
119 | return data.$ref.typeName;
|
120 | }
|
121 | };
|
122 | const mockSubscriber = () => ({
|
123 | [Symbol.asyncIterator]() {
|
124 | return {
|
125 | async next() {
|
126 | return {
|
127 | done: true,
|
128 | value: {},
|
129 | };
|
130 | },
|
131 | };
|
132 | },
|
133 | });
|
134 | const schemaWithMocks = (0, utils_1.mapSchema)(schema, {
|
135 | [utils_1.MapperKind.OBJECT_FIELD]: fieldConfig => {
|
136 | const newFieldConfig = {
|
137 | ...fieldConfig,
|
138 | };
|
139 | const oldResolver = fieldConfig.resolve;
|
140 | if (!preserveResolvers || !oldResolver) {
|
141 | newFieldConfig.resolve = mockResolver;
|
142 | }
|
143 | else {
|
144 | newFieldConfig.resolve = async (rootObject, args, context, info) => {
|
145 | const [mockedValue, resolvedValue] = await Promise.all([
|
146 | mockResolver(rootObject, args, context, info),
|
147 | oldResolver(rootObject, args, context, info),
|
148 | ]);
|
149 |
|
150 | if (mockedValue instanceof Error) {
|
151 |
|
152 | if (undefined === resolvedValue) {
|
153 | throw mockedValue;
|
154 | }
|
155 | return resolvedValue;
|
156 | }
|
157 | if (resolvedValue instanceof Date && mockedValue instanceof Date) {
|
158 | return undefined !== resolvedValue ? resolvedValue : mockedValue;
|
159 | }
|
160 | if ((0, utils_js_1.isObject)(mockedValue) && (0, utils_js_1.isObject)(resolvedValue)) {
|
161 |
|
162 |
|
163 | const emptyObject = Object.create(Object.getPrototypeOf(resolvedValue));
|
164 | return (0, utils_js_1.copyOwnProps)(emptyObject, resolvedValue, mockedValue);
|
165 | }
|
166 | return undefined !== resolvedValue ? resolvedValue : mockedValue;
|
167 | };
|
168 | }
|
169 | const fieldSubscriber = fieldConfig.subscribe;
|
170 | if (!preserveResolvers || !fieldSubscriber) {
|
171 | newFieldConfig.subscribe = mockSubscriber;
|
172 | }
|
173 | else {
|
174 | newFieldConfig.subscribe = async (rootObject, args, context, info) => {
|
175 | const [mockAsyncIterable, oldAsyncIterable] = await Promise.all([
|
176 | mockSubscriber(rootObject, args, context, info),
|
177 | fieldSubscriber(rootObject, args, context, info),
|
178 | ]);
|
179 | return oldAsyncIterable || mockAsyncIterable;
|
180 | };
|
181 | }
|
182 | return newFieldConfig;
|
183 | },
|
184 | [utils_1.MapperKind.ABSTRACT_TYPE]: type => {
|
185 | if (preserveResolvers && type.resolveType != null && type.resolveType.length) {
|
186 | return;
|
187 | }
|
188 | if ((0, graphql_1.isUnionType)(type)) {
|
189 | return new graphql_1.GraphQLUnionType({
|
190 | ...type.toConfig(),
|
191 | resolveType: typeResolver,
|
192 | });
|
193 | }
|
194 | else {
|
195 | return new graphql_1.GraphQLInterfaceType({
|
196 | ...type.toConfig(),
|
197 | resolveType: typeResolver,
|
198 | });
|
199 | }
|
200 | },
|
201 | });
|
202 | return resolvers
|
203 | ? (0, schema_1.addResolversToSchema)({
|
204 | schema: schemaWithMocks,
|
205 | resolvers: resolvers,
|
206 | })
|
207 | : schemaWithMocks;
|
208 | }
|
209 | exports.addMocksToSchema = addMocksToSchema;
|