Skip to content

Instantly share code, notes, and snippets.

@cvan
Last active May 13, 2019 17:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cvan/d628ccac613bccf118c4e68644009403 to your computer and use it in GitHub Desktop.
Save cvan/d628ccac613bccf118c4e68644009403 to your computer and use it in GitHub Desktop.
QSUtils: a query-string utility for browser/client-side JavaScript. supports case-insensitive, truthy, typed values, defaults. (demo: https://qsutils.glitch.me/)
/**
* QSUtils: a query-string utility for browser/client-side JavaScript.
*
* supports case-insensitive, truthy, typed values, defaults.
*
* demo: https://qsutils.glitch.me/
*/
class QSUtils {
constructor () {
this.qs = new URLSearchParams(window.location.search);
}
get (key, {caseSensitive = false, truthy = false, type = 'string', defaultValue = null} = {}) {
let value = this.qs.get(key);
if (value !== null && !caseSensitive) {
const keyLower = key.toLowerCase();
for (let [qsKey, qsValue] of this.qs.entries()) {
if (keyLower === qsKey.toLowerCase()) {
value = qsValue;
break;
}
}
}
if (defaultValue !== null && typeof type !== defaultValue) {
type = typeof defaultValue;
}
if (truthy) {
value = this.getTruthyValue(value);
}
if (type === 'boolean' && defaultValue !== null && value === false) {
value = defaultValue;
} else if (typeof value !== type) {
if (type === 'integer') {
value = parseInt(value, 10);
if (defaultValue !== null && !Number.isInteger(value)) {
value = defaultValue;
}
} else if (type === 'number' || type === 'float') {
value = parseFloat(value);
if (defaultValue !== null && !Number.isFinite(value)) {
value = defaultValue;
}
} else if (type === 'boolean') {
if (defaultValue !== null && value === false) {
value = defaultValue;
}
}
}
return value;
}
getTruthy (key, opts) {
opts = Object.assign({}, opts, {truthy: true, type: 'boolean'});
return this.get(key, opts);
}
getTruthyValue (value) {
if (typeof value !== 'string') {
return false;
}
const valueLower = value.toLowerCase();
return valueLower === '' || valueLower === '1' || valueLower === 'true' || valueLower === 'yes' || valueLower === 'y' || valueLower === 'on';
}
}
const qs = 'fruit=apple&log=0&verboselog=';
const qsu = new QSUtils(qs);
console.log(qs);
console.log({
debug: qsu.getTruthy('debug', {defaultValue: true}),
fruit: qsu.get('fruit'),
hasVegetable: qsu.getTruthy('hasVegetable', {defaultValue: 'nope'}),
vegetable: qsu.get('vegetable', {defaultValue: 'a vegetable'}),
log: qsu.getTruthy('log'),
verboseLog: qsu.getTruthy('verboseLog')
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment