Eslint
This commit is contained in:
parent
182b8be1d4
commit
01ca521789
4 changed files with 104 additions and 85 deletions
11
.eslintrc.js
Normal file
11
.eslintrc.js
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
module.exports = {
|
||||||
|
"extends": "standard",
|
||||||
|
"plugins": [
|
||||||
|
"standard",
|
||||||
|
"promise",
|
||||||
|
"jest"
|
||||||
|
],
|
||||||
|
"env": {
|
||||||
|
"jest/globals": true
|
||||||
|
}
|
||||||
|
};
|
54
index.js
54
index.js
|
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
|
@ -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')
|
||||||
});
|
})
|
||||||
|
|
10
package.json
10
package.json
|
@ -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"
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue