@graphql-mocks/falso
Version:
Fake GraphQL queries with graphql-mocks and Falso
119 lines (117 loc) • 5.95 kB
JavaScript
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
;