ibm-graphql-query-generator
Version:
Randomly generate a GraphQL query using a GraphQL schema
120 lines • 4.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const graphql_1 = require("graphql");
const generate_query_1 = require("./generate-query");
function doMatch(a, b) {
return a === b || a === '*' || b === '*';
}
function matchVarName(query, candidates) {
// Case: exact match
if (candidates.includes(query)) {
return query;
}
const queryParts = query.split(/__(?!__)/g);
if (!(queryParts.length === 2 || queryParts.length === 3)) {
throw new Error(`Invalid variable name query: ${query}`);
}
for (let candidate of candidates) {
const candidateParts = candidate.split(/__(?!__)/g);
if (!(candidateParts.length === 2 || candidateParts.length === 3)) {
throw new Error(`Invalid variable name: ${candidate}`);
}
if (candidateParts.length === queryParts.length) {
const match = candidateParts.every((candPart, i) => {
return doMatch(candPart, queryParts[i]);
});
if (match) {
return candidate;
}
}
}
return null;
}
exports.matchVarName = matchVarName;
function getProvider(varName, providerMap) {
const providerKey = matchVarName(varName, Object.keys(providerMap));
if (providerKey) {
return {
providerFound: true,
provider: providerMap[providerKey]
};
}
else {
return {
providerFound: false,
provider: null
};
}
}
exports.getProvider = getProvider;
function getRandomEnum(type) {
const typeDef = type.astNode;
if (typeof typeDef !== 'undefined' &&
typeDef.kind === graphql_1.Kind.ENUM_TYPE_DEFINITION) {
let value = typeDef.values[Math.floor(Math.random() * typeDef.values.length)];
return value.name.value;
}
}
exports.getRandomEnum = getRandomEnum;
function isEnumType(type) {
const typeDef = type.astNode;
if (typeof typeDef !== 'undefined' &&
typeDef.kind === graphql_1.Kind.ENUM_TYPE_DEFINITION) {
return true;
}
return false;
}
exports.isEnumType = isEnumType;
function getProviderValue(varName, config, providedValues, argType) {
const { providerFound, provider } = getProvider(varName, config.providerMap);
return {
providerFound,
value: typeof provider === 'function'
? provider(providedValues, argType)
: provider
};
}
exports.getProviderValue = getProviderValue;
function getDefaultArgValue(schema, config, type) {
var _a, _b;
if (type.kind === 'NonNullType') {
return getDefaultArgValue(schema, config, type.type);
}
else if (type.kind === 'ListType') {
return [getDefaultArgValue(schema, config, type.type)];
}
else {
// Built in GraphQL scalars
if (type.name.value === 'Int') {
return 10;
}
else if (type.name.value === 'Float') {
return 10.0;
}
else if (type.name.value === 'Boolean') {
return true;
}
// Recurse if the type is an input object
const typeDef = schema.getType(type.name.value);
if (typeDef && ((_a = typeDef.astNode) === null || _a === void 0 ? void 0 : _a.kind) === 'InputObjectTypeDefinition') {
const fields = (_b = typeDef.astNode) === null || _b === void 0 ? void 0 : _b.fields;
if (fields) {
// Identify requiredArguments
const requiredArguments = Object.entries(fields)
.map(([_, value]) => value)
.filter((type) => {
return generate_query_1.considerArgument(type, config);
});
// Recurse into required arguments and compose object value
return requiredArguments.reduce((obj, arg) => {
obj[arg.name.value] = getDefaultArgValue(schema, config, arg.type);
return obj;
}, {});
}
}
}
// Unknown default value
return 'PLACEHOLDER';
}
exports.getDefaultArgValue = getDefaultArgValue;
//# sourceMappingURL=provide-variables.js.map