tg-client-query-builder
Advanced tools
Comparing version 2.14.2 to 2.14.3
@@ -1,3 +0,3 @@ | ||
const QueryBuilder = require('./query-builder'); | ||
const QueryBuilder = require("./query-builder"); | ||
module.exports = QueryBuilder; | ||
module.exports = QueryBuilder; |
{ | ||
"name": "tg-client-query-builder", | ||
"version": "2.14.2", | ||
"version": "2.14.3", | ||
"description": "Teselagen Client Side (browser) SQL Query Builder", | ||
"main": "build/query-builder/index.js", | ||
"repository": "https://github.com/TeselaGen/tg-query.git", | ||
"author": "TeselaGen", | ||
"license": "ISC", | ||
"scripts": { | ||
"prepublishOnly": "yarn build", | ||
"build": "babel --presets=es2015 query-builder/ --out-dir build/query-builder/", | ||
"test": "jest" | ||
}, | ||
"dependencies": { | ||
"lodash": "^4.17.4" | ||
}, | ||
"devDependencies": { | ||
"babel-cli": "^6.26.0", | ||
"babel-preset-latest": "^6.24.1", | ||
"chai": "^4.0.2", | ||
"fs-extra": "^3.0.1", | ||
"jest": "^28.1.2", | ||
"json-beautify": "^1.0.1", | ||
"json-format": "^1.0.1", | ||
"jsonfile": "^3.0.0" | ||
} | ||
} |
@@ -0,22 +1,27 @@ | ||
module.exports = function combineQueries(qry1, qry2, joinOperator, opts) { | ||
if (qry1.__objectType !== "query") | ||
throw new Error("First query is not a query type."); | ||
if (qry2.__objectType !== "query") | ||
throw new Error("Second query is not a query type."); | ||
if (qry1.entity != qry2.entity) | ||
throw new Error( | ||
"Queries are for different entities " + | ||
qry1.entity + | ||
" and " + | ||
qry2.entity | ||
); | ||
if (joinOperator !== "or") joinOperator = "and"; | ||
module.exports = function combineQueries(qry1, qry2, joinOperator, opts){ | ||
if(qry1.__objectType !== 'query') throw new Error("First query is not a query type."); | ||
if(qry2.__objectType !== 'query') throw new Error("Second query is not a query type."); | ||
if(qry1.entity != qry2.entity) throw new Error("Queries are for different entities " + qry1.entity + " and " + qry2.entity); | ||
var combinedFilters = { | ||
type: "group", | ||
operator: joinOperator, | ||
filters: [] | ||
}; | ||
if(joinOperator !== 'or') joinOperator = 'and'; | ||
combinedFilters.filters = qry1.filters.concat(qry2.filters); | ||
var combinedFilters = | ||
{ | ||
type: "group", | ||
operator: joinOperator, | ||
filters: [ ] | ||
}; | ||
combinedFilters.filters = qry1.filters.concat(qry2.filters); | ||
qry1.filters = [combinedFilters]; | ||
qry1.filters = [combinedFilters]; | ||
return qry1; | ||
} | ||
return qry1; | ||
}; |
@@ -0,20 +1,17 @@ | ||
module.exports = (function() { | ||
function FilterExpression(opName, args) { | ||
this.name = opName; | ||
this.args = args; | ||
} | ||
module.exports = (function(){ | ||
function FilterExpression(opName, args){ | ||
this.name = opName; | ||
this.args = args; | ||
} | ||
FilterExpression.prototype.toFilter = function(filterBuilder, argName){ | ||
var filterDef = { | ||
type: "expression", | ||
operator: this.name, | ||
field: argName, | ||
args: this.args | ||
}; | ||
return filterDef; | ||
} | ||
return FilterExpression; | ||
})(); | ||
FilterExpression.prototype.toFilter = function(filterBuilder, argName) { | ||
var filterDef = { | ||
type: "expression", | ||
operator: this.name, | ||
field: argName, | ||
args: this.args | ||
}; | ||
return filterDef; | ||
}; | ||
return FilterExpression; | ||
})(); |
@@ -35,7 +35,11 @@ // valid filters: | ||
if ( | ||
args.some((arg) => { | ||
args.some(arg => { | ||
return !(_.isDate(arg) || _.isString(arg) || _.isNumber(arg)); | ||
}) | ||
) { | ||
throw new Error(`QueryBuilderError: You must pass a date or number as args to ${opName}. You passed: Args ${args.join(",")}`); | ||
throw new Error( | ||
`QueryBuilderError: You must pass a date or number as args to ${opName}. You passed: Args ${args.join( | ||
"," | ||
)}` | ||
); | ||
} | ||
@@ -45,5 +49,7 @@ }; | ||
function isArray(opName) { | ||
return (arg) => { | ||
return arg => { | ||
if (!_.isArray(arg)) { | ||
throw new Error(`QueryBuilderError: You must pass an array for ${opName} filters. You passed: ${arg}`); | ||
throw new Error( | ||
`QueryBuilderError: You must pass an array for ${opName} filters. You passed: ${arg}` | ||
); | ||
} | ||
@@ -53,5 +59,7 @@ }; | ||
function isString(opName) { | ||
return (arg) => { | ||
return arg => { | ||
if (!_.isString(arg)) { | ||
throw new Error(`QueryBuilderError: You must pass a string for ${opName} filters. You passed: ${arg}`); | ||
throw new Error( | ||
`QueryBuilderError: You must pass a string for ${opName} filters. You passed: ${arg}` | ||
); | ||
} | ||
@@ -64,3 +72,5 @@ }; | ||
if (args.length !== argLength) { | ||
throw new Error(`QueryBuilderError: Args for ${opName} are of length ${args.length}, but they should be of length ${argLength}`); | ||
throw new Error( | ||
`QueryBuilderError: Args for ${opName} are of length ${args.length}, but they should be of length ${argLength}` | ||
); | ||
} | ||
@@ -73,95 +83,107 @@ }; | ||
opName: "greaterThan", | ||
sanityChecks: [numberOfArgs("greaterThan", 1), isDateOrNumber("greaterThan")], | ||
sanityChecks: [ | ||
numberOfArgs("greaterThan", 1), | ||
isDateOrNumber("greaterThan") | ||
] | ||
}, | ||
{ | ||
opName: "inList", | ||
sanityChecks: [numberOfArgs("inList", 1), isArray("inList")], | ||
sanityChecks: [numberOfArgs("inList", 1), isArray("inList")] | ||
}, | ||
{ | ||
opName: "lessThan", | ||
sanityChecks: [numberOfArgs("lessThan", 1), isDateOrNumber("lessThan")], | ||
sanityChecks: [numberOfArgs("lessThan", 1), isDateOrNumber("lessThan")] | ||
}, | ||
{ | ||
opName: "lessThanOrEqual", | ||
sanityChecks: [numberOfArgs("lessThanOrEqual", 1), isDateOrNumber("lessThanOrEqual")], | ||
sanityChecks: [ | ||
numberOfArgs("lessThanOrEqual", 1), | ||
isDateOrNumber("lessThanOrEqual") | ||
] | ||
}, | ||
{ | ||
opName: "equals", | ||
sanityChecks: [numberOfArgs("equals", 1)], | ||
sanityChecks: [numberOfArgs("equals", 1)] | ||
}, | ||
{ | ||
opName: "greaterThanOrEqual", | ||
sanityChecks: [numberOfArgs("greaterThanOrEqual", 1), isDateOrNumber("greaterThanOrEqual")], | ||
sanityChecks: [ | ||
numberOfArgs("greaterThanOrEqual", 1), | ||
isDateOrNumber("greaterThanOrEqual") | ||
] | ||
}, | ||
{ | ||
opName: "notEquals", | ||
sanityChecks: [numberOfArgs("notEquals", 1)], | ||
sanityChecks: [numberOfArgs("notEquals", 1)] | ||
}, | ||
{ | ||
opName: "notNull", | ||
sanityChecks: [numberOfArgs("notNull", 0)], | ||
sanityChecks: [numberOfArgs("notNull", 0)] | ||
}, | ||
{ | ||
opName: "isNull", | ||
sanityChecks: [numberOfArgs("isNull", 0)], | ||
sanityChecks: [numberOfArgs("isNull", 0)] | ||
}, | ||
{ | ||
opName: "between", | ||
sanityChecks: [numberOfArgs("between", 2), isDateOrNumber("between")], | ||
sanityChecks: [numberOfArgs("between", 2), isDateOrNumber("between")] | ||
}, | ||
{ | ||
opName: "notInList", | ||
sanityChecks: [numberOfArgs("notInList", 1), isArray("notInList")], | ||
sanityChecks: [numberOfArgs("notInList", 1), isArray("notInList")] | ||
}, | ||
{ | ||
opName: "startsWithExactly", | ||
sanityChecks: [numberOfArgs("startsWith", 1), isString("startsWith")], | ||
sanityChecks: [numberOfArgs("startsWith", 1), isString("startsWith")] | ||
}, | ||
{ | ||
opName: "endsWithExactly", | ||
sanityChecks: [numberOfArgs("endsWith", 1), isString("endsWith")], | ||
sanityChecks: [numberOfArgs("endsWith", 1), isString("endsWith")] | ||
}, | ||
{ | ||
opName: "containsExactly", | ||
sanityChecks: [numberOfArgs("contains", 1), isString("contains")], | ||
sanityChecks: [numberOfArgs("contains", 1), isString("contains")] | ||
}, | ||
{ | ||
opName: "startsWith", | ||
sanityChecks: [numberOfArgs("startsWith", 1), isString("startsWith")], | ||
sanityChecks: [numberOfArgs("startsWith", 1), isString("startsWith")] | ||
}, | ||
{ | ||
opName: "notStartsWith", | ||
sanityChecks: [numberOfArgs("notStartsWith", 1), isString("notStartsWith")], | ||
sanityChecks: [numberOfArgs("notStartsWith", 1), isString("notStartsWith")] | ||
}, | ||
{ | ||
opName: "endsWith", | ||
sanityChecks: [numberOfArgs("endsWith", 1), isString("endsWith")], | ||
sanityChecks: [numberOfArgs("endsWith", 1), isString("endsWith")] | ||
}, | ||
{ | ||
opName: "notEndsWith", | ||
sanityChecks: [numberOfArgs("notEndsWith", 1), isString("notEndsWith")], | ||
sanityChecks: [numberOfArgs("notEndsWith", 1), isString("notEndsWith")] | ||
}, | ||
{ | ||
opName: "contains", | ||
sanityChecks: [numberOfArgs("contains", 1), isString("contains")], | ||
sanityChecks: [numberOfArgs("contains", 1), isString("contains")] | ||
}, | ||
{ | ||
opName: "notContains", | ||
sanityChecks: [numberOfArgs("notContains", 1), isString("notContains")], | ||
sanityChecks: [numberOfArgs("notContains", 1), isString("notContains")] | ||
}, | ||
{ | ||
opName: "upperCase", | ||
sanityChecks: [numberOfArgs("upperCase", 1), isString("upperCase")], | ||
sanityChecks: [numberOfArgs("upperCase", 1), isString("upperCase")] | ||
}, | ||
{ | ||
opName: "lowerCase", | ||
sanityChecks: [numberOfArgs("lowerCase", 1), isString("lowerCase")], | ||
sanityChecks: [numberOfArgs("lowerCase", 1), isString("lowerCase")] | ||
}, | ||
{ | ||
opName: "matchesRegex", | ||
sanityChecks: [numberOfArgs("matchesRegex", 1), isString("matchesRegex")], | ||
sanityChecks: [numberOfArgs("matchesRegex", 1), isString("matchesRegex")] | ||
}, | ||
{ | ||
opName: "matchesSimilar", | ||
sanityChecks: [numberOfArgs("matchesSimilar", 1), isString("matchesSimilar")], | ||
sanityChecks: [ | ||
numberOfArgs("matchesSimilar", 1), | ||
isString("matchesSimilar") | ||
] | ||
}, | ||
@@ -171,7 +193,10 @@ { | ||
sanityChecks: [numberOfArgs("fuzzy", 1), isString("fuzzy")], | ||
transform: (arg) => { | ||
transform: arg => { | ||
// Build Regex String | ||
var matchTerm = ""; | ||
// Split all the search terms | ||
var terms = arg.replace(/\W/g, "").replace(" ", "").split(""); | ||
var terms = arg | ||
.replace(/\W/g, "") | ||
.replace(" ", "") | ||
.split(""); | ||
for (var i = 0; i < terms.length; i++) { | ||
@@ -183,6 +208,6 @@ matchTerm += ".*" + terms[i]; | ||
newOpName: "matchesRegex", | ||
newArgs: [matchTerm], | ||
newArgs: [matchTerm] | ||
}; | ||
}, | ||
}, | ||
} | ||
} | ||
@@ -193,3 +218,3 @@ // 'subString', //tnr: not yet implemented | ||
module.exports = (function () { | ||
module.exports = (function() { | ||
// to be implemented | ||
@@ -228,3 +253,4 @@ // | ||
if (entity == null) throw new Error("You must pass the name of the model being filtered!"); | ||
if (entity == null) | ||
throw new Error("You must pass the name of the model being filtered!"); | ||
@@ -236,3 +262,3 @@ if (typeof entity === "string") { | ||
entity, | ||
filters: [], | ||
filters: [] | ||
}; | ||
@@ -249,6 +275,6 @@ } else { | ||
filters: [], | ||
countExpression: undefined, | ||
countExpression: undefined | ||
}; | ||
this.parentBuilder = subQuery.parentBuilder; | ||
this.toFilter = function (filterBuilder, name) { | ||
this.toFilter = function(filterBuilder, name) { | ||
this.query.foreignKey = name; | ||
@@ -262,10 +288,10 @@ return this.toJSON(); | ||
QueryBuilder.prototype.field = function (fieldName) { | ||
QueryBuilder.prototype.field = function(fieldName) { | ||
return { | ||
__objectType: "field", | ||
field: fieldName, | ||
field: fieldName | ||
}; | ||
}; | ||
QueryBuilder.prototype.related = function (relatedEntity, isArrayRelation) { | ||
QueryBuilder.prototype.related = function(relatedEntity, isArrayRelation) { | ||
var tokens = relatedEntity.split("."); | ||
@@ -281,3 +307,3 @@ var entity = tokens[0]; | ||
QueryBuilder.prototype.notRelated = function (relatedEntity, isArrayRelation) { | ||
QueryBuilder.prototype.notRelated = function(relatedEntity, isArrayRelation) { | ||
var tokens = relatedEntity.split("."); | ||
@@ -293,3 +319,3 @@ var entity = tokens[0]; | ||
QueryBuilder.prototype.toJSON = function () { | ||
QueryBuilder.prototype.toJSON = function() { | ||
let qry = JSON.parse(JSON.stringify(this.query)); | ||
@@ -302,4 +328,4 @@ if (qry.filters.length > 1) { | ||
chainedWith: "and", | ||
filters: qry.filters, | ||
}, | ||
filters: qry.filters | ||
} | ||
]; | ||
@@ -310,3 +336,3 @@ } | ||
QueryBuilder.prototype.convertToFilter = function (argDef, operator) { | ||
QueryBuilder.prototype.convertToFilter = function(argDef, operator) { | ||
var whereArgs = {}; | ||
@@ -337,3 +363,3 @@ var filters = []; | ||
type: "where", | ||
args: whereArgs, | ||
args: whereArgs | ||
}); | ||
@@ -348,3 +374,3 @@ } | ||
operator: operator || "and", | ||
filters, | ||
filters | ||
}; | ||
@@ -354,3 +380,3 @@ return filterDef; | ||
QueryBuilder.prototype.where = function () { | ||
QueryBuilder.prototype.where = function() { | ||
var args = [].slice.call(arguments); | ||
@@ -360,3 +386,3 @@ return this.whereAll(args); | ||
QueryBuilder.prototype.orWhere = function () { | ||
QueryBuilder.prototype.orWhere = function() { | ||
var args = [].slice.call(arguments); | ||
@@ -366,3 +392,3 @@ return this.orWhereAll(args); | ||
QueryBuilder.prototype.andWhere = function () { | ||
QueryBuilder.prototype.andWhere = function() { | ||
var args = [].slice.call(arguments); | ||
@@ -372,3 +398,3 @@ return this.andWhereAll(args); | ||
QueryBuilder.prototype.whereAny = function () { | ||
QueryBuilder.prototype.whereAny = function() { | ||
var args = [].slice.call(arguments); | ||
@@ -378,3 +404,3 @@ return whereAny(this, args); | ||
QueryBuilder.prototype.whereAll = function () { | ||
QueryBuilder.prototype.whereAll = function() { | ||
var args = [].slice.call(arguments); | ||
@@ -384,3 +410,3 @@ return whereAll(this, args); | ||
QueryBuilder.prototype.andWhereAny = function () { | ||
QueryBuilder.prototype.andWhereAny = function() { | ||
var args = [].slice.call(arguments); | ||
@@ -390,3 +416,3 @@ return whereAny(this, args, "and"); | ||
QueryBuilder.prototype.orWhereAny = function () { | ||
QueryBuilder.prototype.orWhereAny = function() { | ||
var args = [].slice.call(arguments); | ||
@@ -396,3 +422,3 @@ return whereAny(this, args, "or"); | ||
QueryBuilder.prototype.andWhereAll = function () { | ||
QueryBuilder.prototype.andWhereAll = function() { | ||
var args = [].slice.call(arguments); | ||
@@ -402,3 +428,3 @@ return whereAll(this, args, "and"); | ||
QueryBuilder.prototype.orWhereAll = function () { | ||
QueryBuilder.prototype.orWhereAll = function() { | ||
var args = [].slice.call(arguments); | ||
@@ -408,7 +434,9 @@ return whereAll(this, args, "or"); | ||
QueryBuilder.prototype.count = function () { | ||
QueryBuilder.prototype.count = function() { | ||
var args = [].slice.call(arguments); | ||
if (this.query.type === "subquery") { | ||
if (this.query.countExpression) { | ||
throw new Error("QueryBuilder subquery can only have one count expression"); | ||
throw new Error( | ||
"QueryBuilder subquery can only have one count expression" | ||
); | ||
} | ||
@@ -427,3 +455,9 @@ this.query.countExpression = args[0].toFilter(this, "count"); | ||
function createSubQueryBuilder(qb, entity, key, isArrayRelation = true, modifier) { | ||
function createSubQueryBuilder( | ||
qb, | ||
entity, | ||
key, | ||
isArrayRelation = true, | ||
modifier | ||
) { | ||
return new QueryBuilder({ | ||
@@ -434,3 +468,3 @@ parentBuilder: qb, | ||
modifier, | ||
isArrayRelation, | ||
isArrayRelation | ||
}); | ||
@@ -449,3 +483,3 @@ } | ||
} | ||
sanityChecks.forEach((sanityCheck) => { | ||
sanityChecks.forEach(sanityCheck => { | ||
sanityCheck(...args); | ||
@@ -475,3 +509,4 @@ }); | ||
function where(filterBuilder, operator, whereArgs, chainedWith) { | ||
if (!Array.isArray(whereArgs)) return where(filterBuilder, operator, [whereArgs], chainedWith); | ||
if (!Array.isArray(whereArgs)) | ||
return where(filterBuilder, operator, [whereArgs], chainedWith); | ||
@@ -482,6 +517,6 @@ var filterDef = { | ||
chainedWith, | ||
filters: [], | ||
filters: [] | ||
}; | ||
whereArgs.forEach((arg) => { | ||
whereArgs.forEach(arg => { | ||
//add check for object type TODO | ||
@@ -488,0 +523,0 @@ var filter = filterBuilder.convertToFilter(arg, operator); |
No repository
Supply chain riskPackage does not have a linked source code repository. Without this field, a package will have no reference to the location of the source code use to generate the package.
Found 1 instance in 1 package
No tests
QualityPackage does not have any tests. This is a strong signal of a poorly maintained or low quality package.
Found 1 instance in 1 package
0
23819
10
782
2
2