@gqlts/runtime
Version:
Gqlts runtime client
128 lines • 6.24 kB
JavaScript
import { __read, __spreadArray } from "tslib";
import { getFieldFromPath } from './getFieldFromPath';
function parseRequest(request, ctx, path, opt) {
if (Array.isArray(request)) {
var _a = __read(request, 2), args_1 = _a[0], fields = _a[1];
var argNames = Object.keys(args_1);
if (argNames.length === 0) {
return parseRequest(fields, ctx, path, opt);
}
var field_1 = getFieldFromPath(ctx.root, path);
return "(".concat(argNames.map(function (argName) {
ctx.varCounter++;
var varName = "v".concat(ctx.varCounter);
var typing = field_1.args && field_1.args[argName];
if (!typing && !(opt === null || opt === void 0 ? void 0 : opt.skipTypingCheck)) {
throw new Error("No typing defined for argument `".concat(argName, "` in path `").concat(path.join('.'), "`"));
}
var varType = typing;
var value = args_1 === null || args_1 === void 0 ? void 0 : args_1[argName];
var inferredTypeFromValue;
// Check if the value is not undefined and if the type is not defined
if ((opt === null || opt === void 0 ? void 0 : opt.skipTypingCheck) && !typing) {
var valueType = typeof value;
switch (valueType) {
case 'string':
inferredTypeFromValue = 'String';
break;
case 'number':
inferredTypeFromValue = 'Int';
break;
case 'boolean':
inferredTypeFromValue = 'Boolean';
break;
case 'object':
if (value === null) {
inferredTypeFromValue = 'Null';
}
else if (Array.isArray(value)) {
inferredTypeFromValue = '[String]'; // Assuming array of strings for simplicity
}
else {
inferredTypeFromValue = 'Object';
}
break;
}
if (!inferredTypeFromValue) {
throw new Error("No typing defined for argument `".concat(argName, "` in path `").concat(path.join('.'), "`"));
}
varType = varType || [{ name: inferredTypeFromValue, scalar: [], fields: {} }, inferredTypeFromValue];
console.warn("Infer type for argument `".concat(argName, "` in path `").concat(path.join('.'), "` as `").concat(inferredTypeFromValue, "` - consider adding typing and updating the schema"));
}
ctx.variables[varName] = {
value: value,
typing: varType,
};
return "".concat(argName, ":$").concat(varName);
}), ")").concat(parseRequest(fields, ctx, path, opt));
}
else if (typeof request === 'object' && request !== null) {
var fields_1 = request;
var fieldNames = Object.keys(fields_1).filter(function (k) { return Boolean(fields_1[k]); });
if (fieldNames.length === 0) {
throw new Error('Field selection should not be empty');
}
var type = path.length > 0 ? getFieldFromPath(ctx.root, path).type : ctx.root;
var scalarFields = type.scalar;
var scalarFieldsFragment = void 0;
if (fieldNames.includes('__scalar')) {
var falsyFieldNames_1 = new Set(Object.keys(fields_1).filter(function (k) { return !Boolean(fields_1[k]); }));
if (scalarFields === null || scalarFields === void 0 ? void 0 : scalarFields.length) {
ctx.fragmentCounter++;
scalarFieldsFragment = "f".concat(ctx.fragmentCounter);
ctx.fragments.push("fragment ".concat(scalarFieldsFragment, " on ").concat(type.name, "{").concat(scalarFields
.filter(function (f) { return !falsyFieldNames_1.has(f); })
.join(','), "}"));
}
}
var fieldsSelection = fieldNames
.filter(function (f) { return !['__scalar', '__name'].includes(f); })
.map(function (f) {
var parsed = parseRequest(fields_1[f], ctx, __spreadArray(__spreadArray([], __read(path), false), [f], false), opt);
if (f.startsWith('on_')) {
ctx.fragmentCounter++;
var implementationFragment = "f".concat(ctx.fragmentCounter);
var typeMatch = f.match(/^on_(.+)/);
if (!typeMatch || !typeMatch[1])
throw new Error("Invalid fragment type in field: ".concat(f));
ctx.fragments.push("fragment ".concat(implementationFragment, " on ").concat(typeMatch[1]).concat(parsed));
return "...".concat(implementationFragment);
}
else {
return "".concat(f).concat(parsed);
}
})
.concat(scalarFieldsFragment ? ["...".concat(scalarFieldsFragment)] : [])
.join(',');
return "{".concat(fieldsSelection, "}");
}
else {
return '';
}
}
export function generateGraphqlOperation(operation, root, fields, opt) {
var ctx = {
root: root,
varCounter: 0,
variables: {},
fragmentCounter: 0,
fragments: [],
};
var result = parseRequest(fields, ctx, [], opt);
var varNames = Object.keys(ctx.variables);
var varsString = varNames.length > 0
? "(".concat(varNames.map(function (v) {
var variableType = ctx.variables[v].typing[1];
return "$".concat(v, ":").concat(variableType);
}), ")")
: '';
var operationName = fields.__name || '';
return {
query: __spreadArray(["".concat(operation, " ").concat(operationName).concat(varsString).concat(result)], __read(ctx.fragments), false).join(','),
variables: Object.keys(ctx.variables).reduce(function (r, v) {
r[v] = ctx.variables[v].value;
return r;
}, {}),
};
}
//# sourceMappingURL=generateGraphqlOperation.js.map