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 {
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
}
}
};

View file

@ -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;
.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;
.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;
.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;
.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;
.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;
.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;
.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;
.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;
.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;
.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;
.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')
})

View file

@ -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"
}