Code coverage report for lib/expressPaginate.js

Statements: 100% (60 / 60)      Branches: 95.83% (46 / 48)      Functions: 100% (12 / 12)      Lines: 100% (60 / 60)      Ignored: none     

All files » lib/ » expressPaginate.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 1191           1   1 2     1 3 3   3 3 3   3 1     3 1     3 1     3 1     3 1     3 1       1 3 3   3   3 1 1   2 2 2           3 1     3       1 3 3 1   2       1 3 3 1   2       1 1   1   1   1     1 3     1 3     1 1   1   1   1   1    
var url = require('url'),
	_ = require('lodash'),
	clone = require('clone'),
	HttpError = require('http-errors'),
	querystring = require('querystring');
 
var exports = module.exports = {};
 
function decode(encoded) {
	return querystring.parse(new Buffer(querystring.unescape(encoded), 'base64').toString('utf8'));
}
 
exports.setQueryParams = function setQueryParams(req, defaultPageSize, maxPageSize) {
	defaultPageSize = (typeof defaultPageSize === 'number') ? defaultPageSize : 10;
	maxPageSize = (typeof maxPageSize === 'number') ? maxPageSize : 50;
 
	req.query.page = parseInt(req.query.page, 10) || 1;
	req.query.currentPage = parseInt(req.query.currentPage, 10) || req.query.page;
	req.query.pageSize = parseInt(req.query.pageSize, 10) || defaultPageSize;
 
	if (req.query.pageSize > maxPageSize) {
		req.query.pageSize = maxPageSize;
	}
 
	if (req.query.page < 1) {
		req.query.page = 1;
	}
 
	if (req.query.currentPage < 1) {
		req.query.currentPage = req.query.page;
	}
 
	if (req.query.pageSize < 1) {
		req.query.pageSize = 1;
	}
 
	if (req.query.before) {
		req.query.before = decode(req.query.before);
	}
 
	if (req.query.after) {
		req.query.after = decode(req.query.after);
	}
};
 
exports.href = function href(req) {
	return function(prev, params) {
		var query = clone(req.query);
 
		query = _.omit(query, [prev ? 'after' : 'before', 'last']);
 
		if (typeof prev === 'object') {
			params = prev;
			prev = false;
		} else {
			prev = (typeof prev === 'boolean') ? prev : false;
			query.page += prev ? -1 : 1;
			query.page = (query.page < 1) ? 1 : query.page;
		}
 
		// allow overriding querystring params
		// (useful for sorting and filtering)
		// another alias for `_.assign` is `_.extend`
		if (typeof params === 'object') {
			query = _.assign(query, params);
		}
 
		return url.parse(req.originalUrl).pathname + '?' + querystring.stringify(query);
	};
};
 
exports.hasNextPages = function hasNextPages(req) {
	return function(numPages) {
		if (typeof numPages !== 'number' || numPages < 0) {
			throw new HttpError(500, '`numPages` is not a number >= 0');
		}
		return req.query.page < numPages;
	};
};
 
exports.hasPreviousPages = function hasPreviousPages(req) {
	return function(numPages) {
		if (typeof numPages !== 'number' || numPages < 0) {
			throw new HttpError(500, '`numPages` is not a number >= 0');
		}
		return req.query.page > 1 && req.query.page <= numPages;
	};
};
 
exports.firstPage = function firstPage(req) {
	var query = clone(req.query);
 
	query.page = 1;
 
	query = _.omit(query, ['before', 'after', 'last']);
 
	return url.parse(req.originalUrl).pathname + '?' + querystring.stringify(query);
};
 
exports.prevPage = function prevPage(req, numPages) {
	return exports.hasPreviousPages(req)(numPages) ? exports.href(req)(true) : undefined;
};
 
exports.nextPage = function nextPage(req, numPages) {
	return exports.hasNextPages(req)(numPages) ? exports.href(req)(false) : undefined;
};
 
exports.lastPage = function lastPage(req, numPages) {
	var query = clone(req.query);
 
	query.page = numPages;
 
	query = _.omit(query, ['before', 'after']);
 
	query.last = true;
 
	return url.parse(req.originalUrl).pathname + '?' + querystring.stringify(query);
};