UNPKG

rollun-ts-rql

Version:

RQL query object and serializer written in TypeScript

1 lines 7.73 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports["default"]=void 0;var _AbstractLogicalNode=_interopRequireDefault(require("./nodes/logicalNodes/AbstractLogicalNode"));var _AbstractArrayNode=_interopRequireDefault(require("./nodes/arrayNodes/AbstractArrayNode"));var _AbstractScalarNode=_interopRequireDefault(require("./nodes/scalarNodes/AbstractScalarNode"));var _AggregateFunctionNode=_interopRequireDefault(require("./nodes/aggregateNodes/AggregateFunctionNode"));var _Glob=_interopRequireDefault(require("./parser/Glob"));var _AbstractBinaryNode=_interopRequireDefault(require("./nodes/binaryNodes/AbstractBinaryNode"));function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}function _slicedToArray(arr,i){return _arrayWithHoles(arr)||_iterableToArrayLimit(arr,i)||_unsupportedIterableToArray(arr,i)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure 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 _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 _iterableToArrayLimit(arr,i){if(typeof Symbol==="undefined"||!(Symbol.iterator in Object(arr)))return;var _arr=[];var _n=true;var _d=false;var _e=undefined;try{for(var _i=arr[Symbol.iterator](),_s;!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break}}catch(err){_d=true;_e=err}finally{try{if(!_n&&_i["return"]!=null)_i["return"]()}finally{if(_d)throw _e}}return _arr}function _arrayWithHoles(arr){if(Array.isArray(arr))return arr}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}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,descriptor.key,descriptor)}}function _createClass(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);return Constructor}var QueryStringifier=function(){function QueryStringifier(){_classCallCheck(this,QueryStringifier)}_createClass(QueryStringifier,null,[{key:"stringify",value:function stringify(query){var _this=this;var result=Object.entries(query).reduce(function(accumulator,item){var _item=_slicedToArray(item,2),key=_item[0],node=_item[1];accumulator+=_this.parseTopLevelNode(key,node);return accumulator+_this.addUnion(accumulator)},"");return result.substr(-1)==="&"?result.substring(0,result.length-1):result}},{key:"encodeRql",value:function encodeRql(value){var encodedValue=encodeURIComponent(value);while(encodedValue.match(/[\(\)\-\_\.\~\!\*\'\!]/g)){encodedValue=encodedValue.replace("(","%28").replace(")","%29").replace("-","%2D").replace("_","%5F").replace(".","%2E").replace("~","%7E").replace("*","%2A").replace("'","%27").replace("!","%21")}return encodedValue}},{key:"parseTopLevelNode",value:function parseTopLevelNode(key,node){var cleanKey=key;if(cleanKey[0]==="_"){cleanKey=key.slice(1)}var methodName="parse".concat(cleanKey[0].toUpperCase()).concat(cleanKey.slice(1));var handler=this[methodName];if(handler){return this[methodName](node)}else{throw new Error("Node parser with name \"".concat(methodName,"\" is not a function!"))}}},{key:"parseGroupNode",value:function parseGroupNode(node){var _this2=this;if(!node){return""}var fieldsAmount=node.fields.length;var nodeArguments=node.fields.map(function(field,index){return _this2.encodeRql(field)+(index+1<fieldsAmount?",":"")});return"groupby(".concat(nodeArguments.join(""),")")}},{key:"parseSelectNode",value:function parseSelectNode(node){if(node){var encodedFieldNames=node.fields.map(function(fieldName){if(fieldName instanceof _AggregateFunctionNode["default"]){return"".concat(QueryStringifier.encodeRql(fieldName["function"]),"(").concat(QueryStringifier.encodeRql(fieldName.field.toString()),")")}else{return QueryStringifier.encodeRql(fieldName)}});return"select(".concat(encodedFieldNames.join(","),")")}return""}},{key:"parseSortNode",value:function parseSortNode(node){var _this3=this;var result;if(node){result=Object.entries(node.sortOptions).reduce(function(accumulator,currentItem){var _currentItem=_slicedToArray(currentItem,2),field=_currentItem[0],direction=_currentItem[1];var parsedDirection=direction===1?"+":"-";accumulator+="".concat(parsedDirection).concat(_this3.encodeRql(field),",");return accumulator},"sort(");if(result.endsWith(",")){result=result.substring(0,result.length-1)}result+=")"}else{result=""}return result}},{key:"parseLimitNode",value:function parseLimitNode(node){return node?"limit(".concat(node.limit,",").concat(node.offset,")"):""}},{key:"parseQueryNode",value:function parseQueryNode(node){var _this4=this;var result="";switch(true){case node instanceof _AbstractLogicalNode["default"]:var logicalNode=node;var nodeName=logicalNode.name;result+=logicalNode.subNodes.reduce(function(accumulator,currentItem){return accumulator+"".concat(_this4.parseQueryNode(currentItem),",")},result);result=result.substr(-1)===","?result.substring(0,result.length-1):result;result="".concat(nodeName,"(").concat(result,")");break;case node instanceof _AbstractScalarNode["default"]:var scalarNode=node;var nodeValue=scalarNode.value instanceof _Glob["default"]?scalarNode.value.toString():scalarNode.value;result="".concat(QueryStringifier.withEncoding(scalarNode.name,{isField:true}),"(").concat(QueryStringifier.withEncoding(scalarNode.field,{isField:true}),",").concat(QueryStringifier.withType(QueryStringifier.withEncoding(nodeValue)),")");break;case node instanceof _AbstractArrayNode["default"]:var arrayNode=node;var encodedValues=arrayNode.values.map(function(value){return QueryStringifier.withType(QueryStringifier.withEncoding(value))});result="".concat(QueryStringifier.withEncoding(arrayNode.name,{isField:true}),"(").concat(QueryStringifier.withEncoding(arrayNode.field,{isField:true}),",(").concat(encodedValues.join(","),"))");break;case node instanceof _AbstractBinaryNode["default"]:var binaryOperatorNode=node;result="".concat(binaryOperatorNode.name,"(").concat(QueryStringifier.encodeRql(binaryOperatorNode.field),")");break;}return result}},{key:"withType",value:function withType(value){return"".concat(typeof value==="string"&&value!=="null()"&&value!==""?"string:":"").concat(value)}},{key:"withEncoding",value:function withEncoding(value){var _ref=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{},_ref$isField=_ref.isField,isField=_ref$isField===void 0?false:_ref$isField;if(isField){if(!value){throw new Error("Invalid field value: [".concat(value,"], expected number or string"))}return typeof value==="number"?value:QueryStringifier.encodeRql(value.toString())}return value===""||value===null||value===undefined||value==="null()"?"null()":typeof value==="number"?value:QueryStringifier.encodeRql(value.toString())}},{key:"addUnion",value:function addUnion(queryString){return queryString!==""&&queryString.substr(-1)!=="&"?"&":""}}]);return QueryStringifier}();exports["default"]=QueryStringifier;