UNPKG

@graphql-mesh/transform-mock

Version:
154 lines (149 loc) • 8.84 kB
'use strict'; function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } const mock = require('@graphql-tools/mock'); const faker = _interopDefault(require('faker')); const utils = require('@graphql-mesh/utils'); const graphqlScalars = require('graphql-scalars'); const stringInterpolation = require('@graphql-mesh/string-interpolation'); const crossHelpers = require('@graphql-mesh/cross-helpers'); const utils$1 = require('@graphql-tools/utils'); const schema = require('@graphql-tools/schema'); class MockingTransform { constructor({ baseDir, config, importFn }) { this.noWrap = true; this.config = config; this.baseDir = baseDir; this.importFn = importFn; } transformSchema(schema$1, context, transformedSchema) { var _a, _b, _c, _d; const configIf = this.config != null && 'if' in this.config ? this.config.if : true; if (configIf) { const mocks = { ...graphqlScalars.mocks, }; const resolvers = {}; const typeMap = schema$1.getTypeMap(); for (const typeName in typeMap) { const type = typeMap[typeName]; const examples = type.extensions.examples; if (examples === null || examples === void 0 ? void 0 : examples.length) { mocks[typeName] = () => examples[Math.floor(Math.random() * examples.length)]; } } if ((_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.mocks) === null || _b === void 0 ? void 0 : _b.length) { for (const fieldConfig of this.config.mocks) { const fieldConfigIf = 'if' in fieldConfig ? fieldConfig.if : true; if (fieldConfigIf) { const [typeName, fieldName] = fieldConfig.apply.split('.'); if (fieldName) { if (fieldConfig.faker) { let fakerFn; // eslint-disable-line const [service, method] = fieldConfig.faker.split('.'); if (service in faker) { fakerFn = () => faker[service][method](); } else { fakerFn = () => faker.fake(fieldConfig.faker || ''); } resolvers[typeName] = resolvers[typeName] || {}; resolvers[typeName][fieldName] = fakerFn; } else if (fieldConfig.custom) { const exportedVal$ = utils.loadFromModuleExportExpression(fieldConfig.custom, { cwd: this.baseDir, defaultExportName: 'default', importFn: this.importFn, }); resolvers[typeName] = resolvers[typeName] || {}; resolvers[typeName][fieldName] = (root, args, context, info) => { context = context || {}; context.mockStore = store; return exportedVal$.then(exportedVal => typeof exportedVal === 'function' ? exportedVal(root, args, context, info) : exportedVal); }; } else if ('length' in fieldConfig) { resolvers[typeName] = resolvers[typeName] || {}; resolvers[typeName][fieldName] = () => new Array(fieldConfig.length).fill({}); } else if ('updateStore' in fieldConfig) { const getFromStoreKeyFactory = stringInterpolation.getInterpolatedStringFactory(fieldConfig.store.key); const updateStoreFactories = fieldConfig.updateStore.map(updateStoreConfig => ({ updateStoreConfig, keyFactory: stringInterpolation.getInterpolatedStringFactory(updateStoreConfig.key), valueFactory: stringInterpolation.getInterpolatedStringFactory(updateStoreConfig.value), })); resolvers[typeName] = resolvers[typeName] || {}; resolvers[typeName][fieldName] = (root, args, context, info) => { const resolverData = { root, args, context, info, random: Date.now().toString(), env: crossHelpers.process.env }; updateStoreFactories.forEach(({ updateStoreConfig, keyFactory, valueFactory }) => { const key = keyFactory(resolverData); const value = valueFactory(resolverData); store.set(updateStoreConfig.type, key, updateStoreConfig.fieldName, value); }); const key = getFromStoreKeyFactory(resolverData); return store.get(fieldConfig.store.type, key, fieldConfig.store.fieldName); }; } else if ('store' in fieldConfig) { const keyFactory = stringInterpolation.getInterpolatedStringFactory(fieldConfig.store.key); resolvers[typeName] = resolvers[typeName] || {}; resolvers[typeName][fieldName] = (root, args, context, info) => { const key = keyFactory({ root, args, context, info, env: crossHelpers.process.env }); return store.get(fieldConfig.store.type, key, fieldConfig.store.fieldName); }; } } else { if (fieldConfig.faker) { let fakerFn; const [service, method] = fieldConfig.faker.split('.'); if (service in faker) { fakerFn = () => faker[service][method](); } else { fakerFn = () => faker.fake(fieldConfig.faker || ''); } mocks[typeName] = fakerFn; } else if (fieldConfig.custom) { const exportedVal$ = utils.loadFromModuleExportExpression(fieldConfig.custom, { cwd: this.baseDir, defaultExportName: 'default', importFn: this.importFn, }); mocks[typeName] = () => { return exportedVal$.then(exportedVal => typeof exportedVal === 'function' ? exportedVal(store) : exportedVal); }; } } } } } const store = mock.createMockStore({ schema: schema$1, mocks }); if ((_c = this.config) === null || _c === void 0 ? void 0 : _c.initializeStore) { const initializeStoreFn$ = utils.loadFromModuleExportExpression(this.config.initializeStore, { cwd: this.baseDir, defaultExportName: 'default', importFn: this.importFn, }); // eslint-disable-next-line no-void void initializeStoreFn$.then(fn => fn(store)); } const newResolvers = utils$1.getResolversFromSchema(mock.addMocksToSchema({ schema: transformedSchema || schema$1, store, mocks, resolvers, preserveResolvers: (_d = this.config) === null || _d === void 0 ? void 0 : _d.preserveResolvers, }), true); schema.addResolversToSchema({ schema: transformedSchema || schema$1, resolvers: newResolvers, updateResolversInPlace: true, }); } return schema$1; } } module.exports = MockingTransform;