UNPKG

@gqlts/runtime

Version:

Gqlts runtime client

128 lines 6.24 kB
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