freedom-js-support
Version:
Freedom Javascript Utilities
152 lines (136 loc) • 4.86 kB
JavaScript
const querifier = {
querifyable : ['search','with','searchFields','searchJoin','filter','orderBy'],
/*
* GET THE QUERY PARAMETER STRING
* IF OBJECT: { search: {field1:value1, field2:value2 }}
* TRANSFORMS INTO ?search=field1:value1;field2:value2
* IF STRING field1=value1
* TRANSFORM INTO ?field1=value1
* @returns string
*/
getQueryString(params,encode=false){
if(!params){
//PARAMETER IS EMPTY RETURN
return'';
}
// IF PARAMETER IS ALREADY A STRING THEN SIMPLY RETURN THE STRING
if(typeof params == 'string'){
return params.indexOf('?')!=-1?params:`?${params}`
}
var queries = []
// IF PARAMETER IS AN OBJECT THEN BUILD QUERY STRING FROM OBJECT
if(typeof params == 'object'){
queries = queries.concat(this.querify(params,0,{encode}));
}
if(queries.length === 0){
return '';
}
let queryString = queries.join('&')
return "?" + queryString
},
querify(params,level=1,config={}){
if(!params){
return [];
}
let delimeter = config.delimeter || '=';
var queries = [];
for(let key in params){
var param = params[key];
if( !Boolean(param) || typeof param === 'function' || ( typeof param === 'object' && Object.keys(param).length <= 0)){
continue;
}
const is_array = Array.isArray(param);
const is_queryfyable = this.querifyable.includes(key);
if(typeof param == 'object' && !is_array && is_queryfyable){
queries.push( this.getCriteriaString(param,key,config) );
continue;
}
if(is_array && param.length > 0){
queries.push(`${key}=${param.join( is_queryfyable ? ';' : ',')}`)
}
else if(typeof param == 'object'){
queries = queries.concat(this.querify(param,level+1,config));
}
else if(param || typeof param == 'number'){
queries.push(key+delimeter+param)
}
}
return queries;
},
/*
* TRANSFORMED Criteria Object INTO STRING
* refer to http://andersonandra.de/l5-repository/#using-the-requestcriteria for sample query strings
* @returns string
*/
getCriteriaString(params,name,config={}){
if(!params || !name ){
return;
}
let valueOnly = Boolean(config.valueOnly || false);
let encode = Boolean(config.encode || false);
let criteriaString = Object.keys(params).reduce((searches,key,index)=>{
var value = Array.isArray(params[key]) ? params[key].join(',') : params[key];
const is_empty = ['',null,undefined,'undefined'].includes(value);
if(is_empty){
return searches;
}
searches.push(`${key}:${value}`);
return searches;
},[]).join(';');
if(valueOnly){
return encode ? encodeURIComponent(criteriaString) : criteriaString;
}
return name + "=" + (encode ? encodeURIComponent(criteriaString) : criteriaString);
},
getQueryObject(queryString){
if(!queryString || typeof queryString != 'string'){
return typeof queryString === 'object' ? queryString : "";
}
if(queryString.indexOf('?') === 0 ){
queryString = queryString.slice(1);
}
return this.objectify(queryString);
},
objectify(queryString){
if(!queryString){
return;
}
let query = {}
let splits = queryString.split('&');
for(let index in splits){
let [ queryField,queryValue] = splits[index].split('=');
if(queryValue.indexOf(':') === -1){
query[queryField] = queryValue;
continue;
}
query[queryField] = this.getCriteriaObject(queryValue,queryField);
}
return query;
},
getCriteriaObject(_params,config={}){
if(!_params){
return;
}
let decode = config.decode || false
let params = Array.isArray(_params) ? _params : _params.split(';');
return params.reduce((queryObject,param,key)=>{
let [field,value] = param.split(':');
queryObject[field] = decode ? decodeURIComponent(value) : value;
return queryObject
},{});
}
}
export const VUE_INSTALLER = ( Vue ) => {
if(Vue._querifier){
return;
}
Vue._querifier = querifier
Object.defineProperties(Vue.prototype,{
$_querifier:{
get:() => {
return Vue._querifier;
}
}
})
}
export default querifier