UNPKG

@apollo/client

Version:

A fully-featured caching GraphQL client.

277 lines (268 loc) 11.4 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var tslib = require('tslib'); var schema = require('@graphql-tools/schema'); var merge = require('@graphql-tools/merge'); var graphql = require('graphql'); var utilities = require('../../utilities'); var utils = require('@graphql-tools/utils'); var core = require('../../core'); var takeRandom = function (arr) { return arr[Math.floor(Math.random() * arr.length)]; }; var createMockSchema = function (staticSchema, mocks) { var _a; var getType = function (typeName) { var type = staticSchema.getType(typeName); if (!type || !(graphql.isObjectType(type) || graphql.isInterfaceType(type))) { throw new Error("".concat(typeName, " does not exist on schema or is not an object or interface")); } return type; }; var getFieldType = function (typeName, fieldName) { if (fieldName === "__typename") { return graphql.GraphQLString; } var type = getType(typeName); var field = type.getFields()[fieldName]; if (!field) { throw new Error("".concat(fieldName, " does not exist on type ").concat(typeName)); } return field.type; }; var generateValueFromType = function (fieldType) { var nullableType = graphql.getNullableType(fieldType); if (graphql.isScalarType(nullableType)) { var mockFn = mocks[nullableType.name]; if (typeof mockFn !== "function") { throw new Error("No mock defined for type \"".concat(nullableType.name, "\"")); } return mockFn(); } else if (graphql.isEnumType(nullableType)) { var mockFn = mocks[nullableType.name]; if (typeof mockFn === "function") return mockFn(); var values = nullableType.getValues().map(function (v) { return v.value; }); return takeRandom(values); } else if (graphql.isObjectType(nullableType)) { return {}; } else if (graphql.isListType(nullableType)) { return tslib.__spreadArray([], new Array(2), true).map(function () { return generateValueFromType(nullableType.ofType); }); } else if (graphql.isAbstractType(nullableType)) { var mock = mocks[nullableType.name]; var typeName = void 0; var values = {}; if (!mock) { typeName = takeRandom(staticSchema.getPossibleTypes(nullableType).map(function (t) { return t.name; })); } else if (typeof mock === "function") { var mockRes = mock(); if (mockRes === null) return null; if (!utilities.isNonNullObject(mockRes)) { throw new Error("Value returned by the mock for ".concat(nullableType.name, " is not an object or null")); } values = mockRes; if (typeof values["__typename"] !== "string") { throw new Error("Please return a __typename in \"".concat(nullableType.name, "\"")); } typeName = values["__typename"]; } else if (utilities.isNonNullObject(mock) && typeof mock["__typename"] === "function") { var mockRes = mock["__typename"](); if (typeof mockRes !== "string") { throw new Error("'__typename' returned by the mock for abstract type ".concat(nullableType.name, " is not a string")); } typeName = mockRes; } else { throw new Error("Please return a __typename in \"".concat(nullableType.name, "\"")); } return typeName; } else { throw new Error("".concat(nullableType, " not implemented")); } }; var isRootType = function (type, schema) { var rootTypeNames = utils.getRootTypeNames(schema); return rootTypeNames.has(type.name); }; var mockResolver = function (source, args, contex, info) { var defaultResolvedValue = graphql.defaultFieldResolver(source, args, contex, info); if (defaultResolvedValue !== undefined) return defaultResolvedValue; if (isRootType(info.parentType, info.schema)) { return { typeName: info.parentType.name, key: "ROOT", fieldName: info.fieldName, fieldArgs: args, }; } if (defaultResolvedValue === undefined) { var fieldType = getFieldType(info.parentType.name, info.fieldName); return generateValueFromType(fieldType); } return undefined; }; return utils.mapSchema(staticSchema, (_a = {}, _a[utils.MapperKind.OBJECT_FIELD] = function (fieldConfig) { var newFieldConfig = tslib.__assign({}, fieldConfig); var oldResolver = fieldConfig.resolve; if (!oldResolver) { newFieldConfig.resolve = mockResolver; } return newFieldConfig; }, _a[utils.MapperKind.ABSTRACT_TYPE] = function (type) { if (type.resolveType != null && type.resolveType.length) { return; } var typeResolver = function (typename) { return typename; }; if (graphql.isUnionType(type)) { return new graphql.GraphQLUnionType(tslib.__assign(tslib.__assign({}, type.toConfig()), { resolveType: typeResolver })); } else { return new graphql.GraphQLInterfaceType(tslib.__assign(tslib.__assign({}, type.toConfig()), { resolveType: typeResolver })); } }, _a)); }; var createTestSchema = function (schemaWithTypeDefs, options) { var _a; var targetResolvers = tslib.__assign({}, options.resolvers); var targetSchema = schema.addResolversToSchema({ schema: createMockSchema(schemaWithTypeDefs, (_a = options.scalars) !== null && _a !== void 0 ? _a : {}), resolvers: targetResolvers, }); var fns = { add: function (_a) { var newResolvers = _a.resolvers; targetResolvers = merge.mergeResolvers([targetResolvers, newResolvers]); targetSchema = schema.addResolversToSchema({ schema: targetSchema, resolvers: targetResolvers, }); return targetSchema; }, fork: function (_a) { var _b; var _c = _a === void 0 ? {} : _a, newResolvers = _c.resolvers; return createTestSchema(targetSchema, { resolvers: (_b = merge.mergeResolvers([targetResolvers, newResolvers])) !== null && _b !== void 0 ? _b : targetResolvers, scalars: options.scalars, }); }, reset: function () { targetSchema = schema.addResolversToSchema({ schema: schemaWithTypeDefs, resolvers: options.resolvers, }); }, }; var schema$1 = new Proxy(targetSchema, { get: function (_target, p) { if (p in fns) { return Reflect.get(fns, p); } var property = Reflect.get(targetSchema, p); if (typeof property === "function") { return property.bind(targetSchema); } return property; }, }); return schema$1; }; function withCleanup(item, cleanup) { var _a; return tslib.__assign(tslib.__assign({}, item), (_a = {}, _a[Symbol.dispose] = function () { cleanup(item); if (Symbol.dispose in item) { item[Symbol.dispose](); } }, _a)); } function wait(ms) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 , new Promise(function (resolve) { return setTimeout(resolve, ms); })]; }); }); } var createSchemaFetch = function (schema, mockFetchOpts) { var _a, _b, _c, _d; if (mockFetchOpts === void 0) { mockFetchOpts = { validate: true }; } var prevFetch = window.fetch; var delayMin = (_b = (_a = mockFetchOpts.delay) === null || _a === void 0 ? void 0 : _a.min) !== null && _b !== void 0 ? _b : 3; var delayMax = (_d = (_c = mockFetchOpts.delay) === null || _c === void 0 ? void 0 : _c.max) !== null && _d !== void 0 ? _d : delayMin + 2; if (delayMin > delayMax) { throw new Error("Please configure a minimum delay that is less than the maximum delay. The default minimum delay is 3ms."); } var mockFetch = function (_uri, options) { return tslib.__awaiter(void 0, void 0, void 0, function () { var randomDelay, body, document, validationErrors, result, stringifiedResult; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: if (!(delayMin > 0)) return [3 , 2]; randomDelay = Math.random() * (delayMax - delayMin) + delayMin; return [4 , wait(randomDelay)]; case 1: _a.sent(); _a.label = 2; case 2: body = JSON.parse(options.body); document = core.gql(body.query); if (mockFetchOpts.validate) { validationErrors = []; try { validationErrors = graphql.validate(schema, document); } catch (e) { validationErrors = [ e instanceof Error ? graphql.GraphQLError.prototype.toJSON.apply(e) : e, ]; } if ((validationErrors === null || validationErrors === void 0 ? void 0 : validationErrors.length) > 0) { return [2 , new Response(JSON.stringify({ errors: validationErrors }))]; } } return [4 , graphql.execute({ schema: schema, document: document, variableValues: body.variables, operationName: body.operationName, })]; case 3: result = _a.sent(); stringifiedResult = JSON.stringify(result); return [2 , new Response(stringifiedResult)]; } }); }); }; function mockGlobal() { window.fetch = mockFetch; var restore = function () { if (window.fetch === mockFetch) { window.fetch = prevFetch; } }; return withCleanup({ restore: restore }, restore); } return Object.assign(mockFetch, { mockGlobal: mockGlobal, }); }; exports.createSchemaFetch = createSchemaFetch; exports.createTestSchema = createTestSchema; //# sourceMappingURL=experimental.cjs.map