diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..40223bd --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,11 @@ +module.exports = { + "extends": "standard", + "plugins": [ + "standard", + "promise", + "jest" + ], + "env": { + "jest/globals": true + } +}; diff --git a/index.js b/index.js index 1f4f2a7..a7c32d9 100644 --- a/index.js +++ b/index.js @@ -1,55 +1,55 @@ module.exports = class Query { constructor (data) { this.data = data.map(item => { - item.sortScore = 0; - return item; - }); + item.sortScore = 0 + return item + }) } get results () { - return this.data; + return this.data } filter (func) { - this.data = this.data.filter(func); - return this; + this.data = this.data.filter(func) + return this } filterBy (key, func) { - this.data = this.data.filter(item => func(item[key])); - return this; + this.data = this.data.filter(item => func(item[key])) + return this } search (key, term, score = 0) { switch (typeof term) { case 'boolean': - this.data = this.data.filter(item => item[key] === term); - break; + this.data = this.data.filter(item => item[key] === term) + break case 'string': this.data = this.data.filter(item => { - let regFind = new RegExp(term, 'gi'); - let termMatches = (item[key].match(regFind) || []).length; - item.sortScore += termMatches; - return termMatches; - }); - break; + let regFind = new RegExp(term, 'gi') + let termMatches = (item[key].match(regFind) || []).length + item.sortScore += termMatches + return termMatches + }) + break } - return this; + return this } sort (key = 'sortScore') { this.data = this.data.sort((a, b) => { - if (a[key] < b[key]) return -1; - if (a[key] > b[key]) return 1; - return 0; - }); - return this; + if (a[key] < b[key]) return -1 + if (a[key] > b[key]) return 1 + return 0 + }) + return this } paginate (page = 1, perPage = 10) { - let min = page * perPage - perPage; - let max = min + perPage; - this.data = this.data.slice(min, max); - return this; + let min = page * perPage - perPage + let max = min + perPage + this.data = this.data.slice(min, max) + return this } -}; +} diff --git a/index.test.js b/index.test.js index 6b78a85..38f4bd9 100644 --- a/index.test.js +++ b/index.test.js @@ -1,109 +1,109 @@ -const Query = require('./index'); -const TestData = require('./testdata.json'); +const Query = require('./index') +const TestData = require('./testdata.json') test('should not modify passed data without chain alterations', () => { let query = new Query(TestData) - .results; + .results - expect(query).toMatchObject(TestData); -}); + expect(query).toMatchObject(TestData) +}) test('should paginate with default params', () => { let query = new Query(TestData) - .paginate() - .results; + .paginate() + .results - expect(query.length).toBe(9); -}); + expect(query.length).toBe(9) +}) test('should paginate with custom page length', () => { let query = new Query(TestData) - .paginate(1, 3) - .results; + .paginate(1, 3) + .results - expect(query.length).toBe(3); + expect(query.length).toBe(3) expect(query[0].name).toBe('Haynes Meadows') -}); +}) test('should paginate to second page with custom page length', () => { let query = new Query(TestData) - .paginate(2, 3) - .results; + .paginate(2, 3) + .results - expect(query.length).toBe(3); + expect(query.length).toBe(3) expect(query[0].name).toBe('Howard Buckley') -}); +}) test('should search by boolean isActive', () => { let query = new Query(TestData) - .search('isActive', true) - .results; + .search('isActive', true) + .results - expect(query.length).toBe(4); -}); + expect(query.length).toBe(4) +}) test('should search by name', () => { let query = new Query(TestData) - .search('name', 'steele') - .results; + .search('name', 'steele') + .results - expect(query.length).toBe(2); -}); + expect(query.length).toBe(2) +}) test('should sort by boolean isActive', () => { let query = new Query(TestData) - .sort('isActive') - .results; + .sort('isActive') + .results - expect(query[0].name).toBe('Katelyn Steele'); -}); + expect(query[0].name).toBe('Katelyn Steele') +}) test('should sort by number netWorth', () => { let query = new Query(TestData) - .sort('netWorth') - .results; + .sort('netWorth') + .results - expect(query[0].name).toBe('Howard Buckley'); // Negative - expect(query[1].name).toBe('Natalia Petty'); // 0 - expect(query[query.length - 1].name).toBe('Newman Mays'); // Richest -}); + expect(query[0].name).toBe('Howard Buckley') // Negative + expect(query[1].name).toBe('Natalia Petty') // 0 + expect(query[query.length - 1].name).toBe('Newman Mays') // Richest +}) test('should sort by string name', () => { let query = new Query(TestData) - .sort('name') - .results; + .sort('name') + .results - expect(query[0].name).toBe('Dudley Conner'); -}); + expect(query[0].name).toBe('Dudley Conner') +}) test('should filter', () => { - let isAgeOver33 = a => a.age > 33; + let isAgeOver33 = a => a.age > 33 let query = new Query(TestData) - .filter(isAgeOver33) - .results; + .filter(isAgeOver33) + .results - expect(query[0].name).toBe('Howard Buckley'); -}); + expect(query[0].name).toBe('Howard Buckley') +}) test('should filter by key', () => { - let isNumGT33 = num => num > 33; + let isNumGT33 = num => num > 33 let query = new Query(TestData) - .filterBy('age', isNumGT33) - .results; + .filterBy('age', isNumGT33) + .results - expect(query[0].name).toBe('Howard Buckley'); -}); + expect(query[0].name).toBe('Howard Buckley') +}) test('should chain everything together', () => { let query = new Query(TestData) - .search('isActive', true) - .sort('name') - .paginate(1, 2) - .results; + .search('isActive', true) + .sort('name') + .paginate(1, 2) + .results - expect(query.length).toBe(2); - expect(query[0].name).toBe('Dudley Conner'); - expect(query[query.length - 1].name).toBe('Haynes Meadows'); -}); + expect(query.length).toBe(2) + expect(query[0].name).toBe('Dudley Conner') + expect(query[query.length - 1].name).toBe('Haynes Meadows') +}) diff --git a/package.json b/package.json index 6c9cd29..0b3f68f 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "main": "index.js", "scripts": { "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": { "type": "git", @@ -18,6 +19,13 @@ }, "homepage": "https://github.com/sharpshark28/json-query-chain#readme", "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", "lcov-badge": "^1.0.4" }