You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
2.1 KiB
74 lines
2.1 KiB
"use strict"; |
|
const _ = require("lodash"); |
|
function stringifyRangeBound(bound) { |
|
if (bound === null) { |
|
return ""; |
|
} |
|
if (bound === Infinity || bound === -Infinity) { |
|
return bound.toString().toLowerCase(); |
|
} |
|
return JSON.stringify(bound); |
|
} |
|
function parseRangeBound(bound, parseType) { |
|
if (!bound) { |
|
return null; |
|
} |
|
if (bound === "infinity") { |
|
return Infinity; |
|
} |
|
if (bound === "-infinity") { |
|
return -Infinity; |
|
} |
|
return parseType(bound); |
|
} |
|
function stringify(data) { |
|
if (data === null) |
|
return null; |
|
if (!Array.isArray(data)) |
|
throw new Error("range must be an array"); |
|
if (!data.length) |
|
return "empty"; |
|
if (data.length !== 2) |
|
throw new Error("range array length must be 0 (empty) or 2 (lower and upper bounds)"); |
|
if (Object.prototype.hasOwnProperty.call(data, "inclusive")) { |
|
if (data.inclusive === false) |
|
data.inclusive = [false, false]; |
|
else if (!data.inclusive) |
|
data.inclusive = [true, false]; |
|
else if (data.inclusive === true) |
|
data.inclusive = [true, true]; |
|
} else { |
|
data.inclusive = [true, false]; |
|
} |
|
_.each(data, (value, index) => { |
|
if (_.isObject(value)) { |
|
if (Object.prototype.hasOwnProperty.call(value, "inclusive")) |
|
data.inclusive[index] = !!value.inclusive; |
|
if (Object.prototype.hasOwnProperty.call(value, "value")) |
|
data[index] = value.value; |
|
} |
|
}); |
|
const lowerBound = stringifyRangeBound(data[0]); |
|
const upperBound = stringifyRangeBound(data[1]); |
|
return `${(data.inclusive[0] ? "[" : "(") + lowerBound},${upperBound}${data.inclusive[1] ? "]" : ")"}`; |
|
} |
|
exports.stringify = stringify; |
|
function parse(value, parser) { |
|
if (value === null) |
|
return null; |
|
if (value === "empty") { |
|
return []; |
|
} |
|
let result = value.substring(1, value.length - 1).split(",", 2); |
|
if (result.length !== 2) |
|
return value; |
|
result = result.map((item, index) => { |
|
return { |
|
value: parseRangeBound(item, parser), |
|
inclusive: index === 0 ? value[0] === "[" : value[value.length - 1] === "]" |
|
}; |
|
}); |
|
return result; |
|
} |
|
exports.parse = parse; |
|
//# sourceMappingURL=range.js.map
|
|
|