graphql-query-builder-json
Version:
This is a query builder to build any query, mutation, subscription from a json object
158 lines (157 loc) • 4.55 kB
JavaScript
;
var input = {
type: "query",
name: "fetchBooks",
data: {
name: "user",
args: [
[
"input",
"USER",
{
firstName: "qweqwe",
lastName: "qwerty"
}
],
["userId", "String!", 3011]
],
props: [
"id",
"email",
"status",
"firstName",
{
name: "addresses",
type: "union",
props: ["streetNumber", "streetName", "zip"]
}
]
}
};
var testInput = {
type: "query",
name: "fetchBooks",
data: {
entity: "user",
project: [
{
fields: [
"id",
"email",
"status",
"firstName",
{
abc: ["some", "value"]
},
"lastName"
]
},
{
type: "union",
fragment: "addresses",
fields: ["streetNumber", "streetName", "zip"]
}
],
args: [
{
name: "input",
scaler: "USER",
value: {
firstName: "qweqwe",
lastName: "qwerty"
}
},
{
name: "userId",
scaler: "String!",
value: 3011
}
]
}
};
var build = function (input) {
var query = "";
var variables = {};
var tag = function (number) { return "$var" + number; };
var prepareArgs = function (args) {
var result = {
args: "",
vars: {},
argsMap: []
};
var _args = args.map(function (arg, index) {
var _tag = tag(index + 1);
result.vars[_tag] = arg.value;
result.argsMap.push({
tag: _tag,
mapTo: arg.name
});
return _tag + ": " + arg.scaler;
});
result.args = "( " + _args.join(", ") + " )";
return result;
};
//
//
var prepareEntity = function (data) {
var _a = prepareArgs(data.args), args = _a.args, vars = _a.vars, argsMap = _a.argsMap;
var _params = argsMap.map(function (arg) {
return arg.mapTo + ": " + arg.tag;
});
var entity = data.entity + " ( " + _params.join(", ") + " )";
return {
args: args,
vars: vars,
entity: entity
};
};
//
//
var prepareProjection = function (projection) {
var selection = [];
var getFields = function (fields, result) {
if (result === void 0) { result = []; }
fields.forEach(function (field) {
if (typeof field === "object") {
for (var _i = 0, _a = Object.entries(field); _i < _a.length; _i++) {
var _b = _a[_i], key = _b[0], _fields = _b[1];
result.push(key + " {");
getFields(_fields, result);
result.push("}");
}
}
else {
result.push(" " + field + " ");
}
});
return result.join("\n");
};
projection.forEach(function (project) {
if (project.type) {
if (project.type === "interface" || project.type === "union") {
selection.push("... on " + project.fragment + " {");
selection.push(getFields(project.fields));
selection.push("}");
}
}
else {
selection.push(getFields(project.fields));
}
});
return selection.join("\t");
};
var _a = prepareEntity(input.data), entity = _a.entity, args = _a.args, vars = _a.vars;
var projection = prepareProjection(input.data.project);
//
//
//
query = "\n " + input.type + " " + input.name + " " + args + " {\n " + entity + " {\n " + projection + "\n }\n }\n ";
query = query.replace(/\n|\t/g, "").trim();
variables = vars;
return {
query: query,
variables: variables
};
};
var result = build(testInput);
console.info(result);