@jmespath-community/jmespath
Version:
Typescript implementation of the JMESPath Community specification
144 lines • 4.68 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.mod = exports.div = exports.divide = exports.mul = exports.sub = exports.add = exports.ensureNumbers = exports.ensurePositiveInteger = exports.ensureInteger = exports.isAlphaNum = exports.isNum = exports.isAlpha = exports.isFalse = exports.strictDeepEqual = exports.isObject = void 0;
const isObject = (obj) => {
return obj !== null && Object.prototype.toString.call(obj) === '[object Object]';
};
exports.isObject = isObject;
const strictDeepEqual = (first, second) => {
if (first === second) {
return true;
}
if (typeof first !== typeof second) {
return false;
}
if (Array.isArray(first) && Array.isArray(second)) {
if (first.length !== second.length) {
return false;
}
for (let i = 0; i < first.length; i += 1) {
if (!(0, exports.strictDeepEqual)(first[i], second[i])) {
return false;
}
}
return true;
}
if ((0, exports.isObject)(first) && (0, exports.isObject)(second)) {
const firstEntries = Object.entries(first);
const secondKeys = new Set(Object.keys(second));
if (firstEntries.length !== secondKeys.size) {
return false;
}
for (const [key, value] of firstEntries) {
if (!(0, exports.strictDeepEqual)(value, second[key])) {
return false;
}
secondKeys.delete(key);
}
return secondKeys.size === 0;
}
return false;
};
exports.strictDeepEqual = strictDeepEqual;
const isFalse = (obj) => {
if (typeof obj === 'object') {
if (obj === null) {
return true;
}
if (Array.isArray(obj)) {
return obj.length === 0;
}
// eslint-disable-next-line @typescript-eslint/naming-convention
for (const _key in obj) {
return false;
}
return true;
}
return !(typeof obj === 'number' || obj);
};
exports.isFalse = isFalse;
const isAlpha = (ch) => {
// tslint:disable-next-line: strict-comparisons
return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch === '_';
};
exports.isAlpha = isAlpha;
const isNum = (ch) => {
// tslint:disable-next-line: strict-comparisons
return (ch >= '0' && ch <= '9') || ch === '-';
};
exports.isNum = isNum;
const isAlphaNum = (ch) => {
// tslint:disable-next-line: strict-comparisons
return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || ch === '_';
};
exports.isAlphaNum = isAlphaNum;
const ensureInteger = (value) => {
if (!(typeof value === 'number') || Math.floor(value) !== value) {
throw new Error('invalid-value: expecting an integer.');
}
return value;
};
exports.ensureInteger = ensureInteger;
const ensurePositiveInteger = (value) => {
if (!(typeof value === 'number') || value < 0 || Math.floor(value) !== value) {
throw new Error('invalid-value: expecting a non-negative integer.');
}
return value;
};
exports.ensurePositiveInteger = ensurePositiveInteger;
const ensureNumbers = (...operands) => {
for (let i = 0; i < operands.length; i++) {
if (operands[i] === null || operands[i] === undefined) {
throw new Error('not-a-number: undefined');
}
if (typeof operands[i] !== 'number') {
throw new Error('not-a-number');
}
}
};
exports.ensureNumbers = ensureNumbers;
const notZero = (n) => {
n = +n; // coerce to number
if (!n) {
// matches -0, +0, NaN
throw new Error('not-a-number: divide by zero');
}
return n;
};
const add = (left, right) => {
(0, exports.ensureNumbers)(left, right);
const result = left + right;
return result;
};
exports.add = add;
const sub = (left, right) => {
(0, exports.ensureNumbers)(left, right);
const result = left - right;
return result;
};
exports.sub = sub;
const mul = (left, right) => {
(0, exports.ensureNumbers)(left, right);
const result = left * right;
return result;
};
exports.mul = mul;
const divide = (left, right) => {
(0, exports.ensureNumbers)(left, right);
const result = left / notZero(right);
return result;
};
exports.divide = divide;
const div = (left, right) => {
(0, exports.ensureNumbers)(left, right);
const result = Math.floor(left / notZero(right));
return result;
};
exports.div = div;
const mod = (left, right) => {
(0, exports.ensureNumbers)(left, right);
const result = left % right;
return result;
};
exports.mod = mod;
//# sourceMappingURL=index.js.map