This commit is contained in:
sharpshark28 2018-02-22 19:14:15 -06:00
parent 182b8be1d4
commit 01ca521789
4 changed files with 104 additions and 85 deletions

11
.eslintrc.js Normal file
View file

@ -0,0 +1,11 @@
module.exports = {
"extends": "standard",
"plugins": [
"standard",
"promise",
"jest"
],
"env": {
"jest/globals": true
}
};

View file

@ -1,55 +1,55 @@
module.exports = class Query { module.exports = class Query {
constructor (data) { constructor (data) {
this.data = data.map(item => { this.data = data.map(item => {
item.sortScore = 0; item.sortScore = 0
return item; return item
}); })
} }
get results () { get results () {
return this.data; return this.data
} }
filter (func) { filter (func) {
this.data = this.data.filter(func); this.data = this.data.filter(func)
return this; return this
} }
filterBy (key, func) { filterBy (key, func) {
this.data = this.data.filter(item => func(item[key])); this.data = this.data.filter(item => func(item[key]))
return this; return this
} }
search (key, term, score = 0) { search (key, term, score = 0) {
switch (typeof term) { switch (typeof term) {
case 'boolean': case 'boolean':
this.data = this.data.filter(item => item[key] === term); this.data = this.data.filter(item => item[key] === term)
break; break
case 'string': case 'string':
this.data = this.data.filter(item => { this.data = this.data.filter(item => {
let regFind = new RegExp(term, 'gi'); let regFind = new RegExp(term, 'gi')
let termMatches = (item[key].match(regFind) || []).length; let termMatches = (item[key].match(regFind) || []).length
item.sortScore += termMatches; item.sortScore += termMatches
return termMatches; return termMatches
}); })
break; break
} }
return this; return this
} }
sort (key = 'sortScore') { sort (key = 'sortScore') {
this.data = this.data.sort((a, b) => { this.data = this.data.sort((a, b) => {
if (a[key] < b[key]) return -1; if (a[key] < b[key]) return -1
if (a[key] > b[key]) return 1; if (a[key] > b[key]) return 1
return 0; return 0
}); })
return this; return this
} }
paginate (page = 1, perPage = 10) { paginate (page = 1, perPage = 10) {
let min = page * perPage - perPage; let min = page * perPage - perPage
let max = min + perPage; let max = min + perPage
this.data = this.data.slice(min, max); this.data = this.data.slice(min, max)
return this; return this
}
} }
};

View file

@ -1,109 +1,109 @@
const Query = require('./index'); const Query = require('./index')
const TestData = require('./testdata.json'); const TestData = require('./testdata.json')
test('should not modify passed data without chain alterations', () => { test('should not modify passed data without chain alterations', () => {
let query = new Query(TestData) let query = new Query(TestData)
.results; .results
expect(query).toMatchObject(TestData); expect(query).toMatchObject(TestData)
}); })
test('should paginate with default params', () => { test('should paginate with default params', () => {
let query = new Query(TestData) let query = new Query(TestData)
.paginate() .paginate()
.results; .results
expect(query.length).toBe(9); expect(query.length).toBe(9)
}); })
test('should paginate with custom page length', () => { test('should paginate with custom page length', () => {
let query = new Query(TestData) let query = new Query(TestData)
.paginate(1, 3) .paginate(1, 3)
.results; .results
expect(query.length).toBe(3); expect(query.length).toBe(3)
expect(query[0].name).toBe('Haynes Meadows') expect(query[0].name).toBe('Haynes Meadows')
}); })
test('should paginate to second page with custom page length', () => { test('should paginate to second page with custom page length', () => {
let query = new Query(TestData) let query = new Query(TestData)
.paginate(2, 3) .paginate(2, 3)
.results; .results
expect(query.length).toBe(3); expect(query.length).toBe(3)
expect(query[0].name).toBe('Howard Buckley') expect(query[0].name).toBe('Howard Buckley')
}); })
test('should search by boolean isActive', () => { test('should search by boolean isActive', () => {
let query = new Query(TestData) let query = new Query(TestData)
.search('isActive', true) .search('isActive', true)
.results; .results
expect(query.length).toBe(4); expect(query.length).toBe(4)
}); })
test('should search by name', () => { test('should search by name', () => {
let query = new Query(TestData) let query = new Query(TestData)
.search('name', 'steele') .search('name', 'steele')
.results; .results
expect(query.length).toBe(2); expect(query.length).toBe(2)
}); })
test('should sort by boolean isActive', () => { test('should sort by boolean isActive', () => {
let query = new Query(TestData) let query = new Query(TestData)
.sort('isActive') .sort('isActive')
.results; .results
expect(query[0].name).toBe('Katelyn Steele'); expect(query[0].name).toBe('Katelyn Steele')
}); })
test('should sort by number netWorth', () => { test('should sort by number netWorth', () => {
let query = new Query(TestData) let query = new Query(TestData)
.sort('netWorth') .sort('netWorth')
.results; .results
expect(query[0].name).toBe('Howard Buckley'); // Negative expect(query[0].name).toBe('Howard Buckley') // Negative
expect(query[1].name).toBe('Natalia Petty'); // 0 expect(query[1].name).toBe('Natalia Petty') // 0
expect(query[query.length - 1].name).toBe('Newman Mays'); // Richest expect(query[query.length - 1].name).toBe('Newman Mays') // Richest
}); })
test('should sort by string name', () => { test('should sort by string name', () => {
let query = new Query(TestData) let query = new Query(TestData)
.sort('name') .sort('name')
.results; .results
expect(query[0].name).toBe('Dudley Conner'); expect(query[0].name).toBe('Dudley Conner')
}); })
test('should filter', () => { test('should filter', () => {
let isAgeOver33 = a => a.age > 33; let isAgeOver33 = a => a.age > 33
let query = new Query(TestData) let query = new Query(TestData)
.filter(isAgeOver33) .filter(isAgeOver33)
.results; .results
expect(query[0].name).toBe('Howard Buckley'); expect(query[0].name).toBe('Howard Buckley')
}); })
test('should filter by key', () => { test('should filter by key', () => {
let isNumGT33 = num => num > 33; let isNumGT33 = num => num > 33
let query = new Query(TestData) let query = new Query(TestData)
.filterBy('age', isNumGT33) .filterBy('age', isNumGT33)
.results; .results
expect(query[0].name).toBe('Howard Buckley'); expect(query[0].name).toBe('Howard Buckley')
}); })
test('should chain everything together', () => { test('should chain everything together', () => {
let query = new Query(TestData) let query = new Query(TestData)
.search('isActive', true) .search('isActive', true)
.sort('name') .sort('name')
.paginate(1, 2) .paginate(1, 2)
.results; .results
expect(query.length).toBe(2); expect(query.length).toBe(2)
expect(query[0].name).toBe('Dudley Conner'); expect(query[0].name).toBe('Dudley Conner')
expect(query[query.length - 1].name).toBe('Haynes Meadows'); expect(query[query.length - 1].name).toBe('Haynes Meadows')
}); })

View file

@ -5,7 +5,8 @@
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"test": "jest --coverage && npm run badge", "test": "jest --coverage && npm run badge",
"badge": "lcov-badge coverage/lcov.info -o coverage.svg" "badge": "lcov-badge coverage/lcov.info -o coverage.svg",
"lint": "eslint ./*.js"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@ -18,6 +19,13 @@
}, },
"homepage": "https://github.com/sharpshark28/json-query-chain#readme", "homepage": "https://github.com/sharpshark28/json-query-chain#readme",
"devDependencies": { "devDependencies": {
"eslint": "^4.18.1",
"eslint-config-standard": "^11.0.0",
"eslint-plugin-import": "^2.9.0",
"eslint-plugin-jest": "^21.12.2",
"eslint-plugin-node": "^6.0.0",
"eslint-plugin-promise": "^3.6.0",
"eslint-plugin-standard": "^3.0.1",
"jest": "^20.0.4", "jest": "^20.0.4",
"lcov-badge": "^1.0.4" "lcov-badge": "^1.0.4"
} }