UNPKG

@backland/schema

Version:

TypeScript schema declaration and validation library with static type inference

140 lines (137 loc) 7.87 kB
"use strict"; 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