@backland/schema
Version:
TypeScript schema declaration and validation library with static type inference
140 lines (137 loc) • 7.87 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.QueryBuilder = void 0;
exports.graphGet = graphGet;
var _utils = require("@backland/utils");
var _get = _interopRequireDefault(require("lodash/get"));
var _setWith = _interopRequireDefault(require("lodash/setWith"));
var _objectToQuery = require("./objectToQuery");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
var utilsKey = '$';
var argsKey = '$A';
var functionKey = '$F';
var sepKey = '.';
var specialKeys = new Set([utilsKey, argsKey, functionKey, sepKey, sepKey]);
// Converts a JavaScript object to a GraphQL Query string
// Full support for nested query / mutation nodes and arguments
// Optionally strip specific object keys using the ignoreFields option
// Support for input arguments [OK]
// Support for query aliases via __aliasFor
// Support for Enum values via EnumType
// Support for variables via __variables
// Support for simple directives (such as @client) via __directives
// Support for one or more inline fragments via __on.__typeName
// Support for full fragments via __all_on
// Support for named queries/mutations via __name
var QueryBuilder = /*#__PURE__*/_createClass(function QueryBuilder(builder) {
var _this2 = this;
_classCallCheck(this, QueryBuilder);
_defineProperty(this, "chain", new Set());
_defineProperty(this, "edges", new Map());
_defineProperty(this, "object", {});
_defineProperty(this, "query", '');
_defineProperty(this, "builder", void 0);
_defineProperty(this, "read", function () {
_this2.object = Object.create(null);
var self = _this2;
var chainArray = _toConsumableArray(self.chain.values());
chainArray.forEach(function (entry) {
var isFunction = entry.indexOf(utilsKey) > -1;
var hasArgs = entry.endsWith(argsKey);
if (!isFunction) {
var node = Object.create(null);
(0, _setWith.default)(_this2.object, entry, node);
} else {
var _method;
var parts = entry.split(/(\.|\$F|\$A)/).filter(function (item) {
return item && !specialKeys.has(item);
});
var _args = hasArgs ? parts.pop() : undefined;
var method = hasArgs ? parts.pop() : undefined;
if (method === '$allOn') method = '$all_on';
var isUtil = (_method = method) === null || _method === void 0 ? void 0 : _method.startsWith(utilsKey);
if (isUtil && method) {
method = "__".concat(method.replace(utilsKey, ''));
}
var newEntry = method ? [].concat(_toConsumableArray(parts), [method]) : parts;
if (!isUtil && hasArgs) {
newEntry.push('__args');
}
var newKey = newEntry.filter(function (el) {
return el.indexOf('{') === -1 && el.indexOf(utilsKey) === -1;
}).join(sepKey);
try {
var json = _args ? JSON.parse(_args) : (0, _get.default)(_this2.object, newKey, {});
(0, _setWith.default)(_this2.object, newKey, json);
} catch (e) {
throw new _utils.RuntimeError("failed to convert args", {
args: _args,
entry: entry
});
}
}
});
return _this2.query = (0, _objectToQuery.objectToQuery)(_this2.object, {
includeFalsyKeys: true,
pretty: true
});
});
_defineProperty(this, "build", function () {
var parent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var self = _this2;
var parentName = parent.join('.');
function realItem() {}
Object.defineProperty(realItem, 'name', {
value: parentName
});
self.edges.set(parentName, realItem);
return new Proxy(realItem, {
apply: function apply(_, _this, args) {
var propName = parent.pop();
var next = "$F".concat(propName, "$F");
var argString = ![undefined, ''].includes(args[0]) ? "$A".concat(JSON.stringify(args[0]), "$A") : '';
var newNext = [].concat(_toConsumableArray(parent), ["".concat(next).concat(argString)]);
self.chain.add(newNext.join('.'));
return self.build(newNext);
},
get: function get(_, prop) {
if (prop.startsWith(utilsKey)) {
// prop = '__REMOVE__';
}
if (prop === '0') {
return self.build(parent);
}
var next = [].concat(_toConsumableArray(parent), [prop]);
var field = next.join('.');
self.chain.add(field);
return self.build(next);
},
set: function set(target, p, value) {
target[p] = value;
return true;
}
});
});
this.builder = builder;
builder(this.build());
});
exports.QueryBuilder = QueryBuilder;
function graphGet(builder) {
return new QueryBuilder(builder);
}
//# sourceMappingURL=graphGet.js.map