UNPKG

@graphql-mocks/falso

Version:

Fake GraphQL queries with graphql-mocks and Falso

119 lines (117 loc) 5.95 kB
'use strict'; var typeUtils = require('graphql-mocks/graphql/type-utils'); var falso = require('@ngneat/falso'); var graphql = require('graphql'); var guessFalsoFn = require('./guess-falso-fn.js'); function _interopNamespaceDefault(e) { var n = Object.create(null); if (e) { Object.keys(e).forEach(function (k) { if (k !== 'default') { var d = Object.getOwnPropertyDescriptor(e, k); Object.defineProperty(n, k, d.get ? d : { enumerable: true, get: function () { return e[k]; } }); } }); } n.default = e; return Object.freeze(n); } var falso__namespace = /*#__PURE__*/_interopNamespaceDefault(falso); function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min) + min); } function booleanChance(percentage) { return getRandomInt(0, 100) < Math.floor(percentage); } function falsoFieldResolver(options) { return function internalFalsoResolver(parent, _args, _context, info) { var _info$parentType, _options$fields, _options$fields$paren, _fieldOptions$possibl, _ref, _fieldOptions$nullPer, _ref2, _fieldOptions$nullLis, _ref3, _fieldOptions$listCou; const parentTypeName = (_info$parentType = info.parentType) === null || _info$parentType === void 0 ? void 0 : _info$parentType.name; const { fieldName, returnType } = info; if (parent && fieldName in parent) { return parent[fieldName]; } const unwrappedReturnType = typeUtils.unwrap(returnType); const isList = typeUtils.hasListType(returnType); const isNonNull = graphql.isNonNullType(returnType); const fieldOptions = (_options$fields = options.fields) === null || _options$fields === void 0 ? void 0 : (_options$fields$paren = _options$fields[parentTypeName]) === null || _options$fields$paren === void 0 ? void 0 : _options$fields$paren[fieldName]; let fieldValues = (_fieldOptions$possibl = fieldOptions === null || fieldOptions === void 0 ? void 0 : fieldOptions.possibleValues) !== null && _fieldOptions$possibl !== void 0 ? _fieldOptions$possibl : []; const nullPercentage = (_ref = (_fieldOptions$nullPer = fieldOptions === null || fieldOptions === void 0 ? void 0 : fieldOptions.nullPercentage) !== null && _fieldOptions$nullPer !== void 0 ? _fieldOptions$nullPer : options === null || options === void 0 ? void 0 : options.nullPercentage) !== null && _ref !== void 0 ? _ref : 10; const nullListPercentage = (_ref2 = (_fieldOptions$nullLis = fieldOptions === null || fieldOptions === void 0 ? void 0 : fieldOptions.nullListPercentage) !== null && _fieldOptions$nullLis !== void 0 ? _fieldOptions$nullLis : options === null || options === void 0 ? void 0 : options.nullListPercentage) !== null && _ref2 !== void 0 ? _ref2 : nullPercentage; const [defaultMin, defaultMax] = [0, 10]; const listCountOption = (_ref3 = (_fieldOptions$listCou = fieldOptions === null || fieldOptions === void 0 ? void 0 : fieldOptions.listCount) !== null && _fieldOptions$listCou !== void 0 ? _fieldOptions$listCou : options === null || options === void 0 ? void 0 : options.listCount) !== null && _ref3 !== void 0 ? _ref3 : { min: defaultMin, max: defaultMax }; const { min, max } = typeof listCountOption === 'number' ? { min: listCountOption, max: listCountOption } : listCountOption; const listCount = getRandomInt(min, max); if (graphql.isEnumType(unwrappedReturnType)) { fieldValues = unwrappedReturnType.getValues().map(value => value.value); } const getValue = (allowNull, nullPercentage) => { var _options, _options2; let value = null; let options = [...fieldValues].map(option => option == null ? null : option); if ((_options = options) !== null && _options !== void 0 && _options.length && !allowNull) { options = options.filter(option => option != null); } if ((_options2 = options) !== null && _options2 !== void 0 && _options2.length) { // use random option from specified values value = falso__namespace.rand(options); } else if (typeof (fieldOptions === null || fieldOptions === void 0 ? void 0 : fieldOptions.falsoFn) === 'string') { // use a specified falso function const { falsoFn } = fieldOptions; // eslint-disable-next-line @typescript-eslint/no-explicit-any if (!falso__namespace[falsoFn]) { throw new Error(`Could not find falso function at "falso.${falsoFn}", double-check the falso docs`); } // eslint-disable-next-line @typescript-eslint/no-explicit-any const fn = falso__namespace[falsoFn]; value = fn(); } else { value = guessFalsoFn.guessFalsoFn(fieldName, returnType)(); } if (allowNull) { value = booleanChance(nullPercentage) ? null : value; } else if (value == null) { value = guessFalsoFn.guessFalsoFn(fieldName, returnType)(); } return value; }; if (graphql.isObjectType(unwrappedReturnType) || graphql.isAbstractType(unwrappedReturnType)) { // handles list case where the *number* to resolve is determined here // but the actual data of each field is handled in follow up recursive // resolving for each individual field. if (isList) { return new Array(listCount).fill({}); } // otherwise, return and let future resolvers figure // out the scalar field data return {}; } if (isList) { const allowNullListItems = !graphql.isNonNullType(typeUtils.listItemType(returnType)); return !isNonNull && booleanChance(nullPercentage) ? null : new Array(listCount).fill(null).map(() => getValue(allowNullListItems, nullListPercentage)); } else { return getValue(!isNonNull, nullPercentage); } }; } exports.falsoFieldResolver = falsoFieldResolver; //# sourceMappingURL=falso-field-resolver.js.map