@esm2cjs/is
Version:
Type check values. This is a fork of sindresorhus/is, but with CommonJS support.
444 lines (443 loc) • 19.8 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var esm_exports = {};
__export(esm_exports, {
assert: () => assert,
default: () => esm_default
});
module.exports = __toCommonJS(esm_exports);
const typedArrayTypeNames = [
"Int8Array",
"Uint8Array",
"Uint8ClampedArray",
"Int16Array",
"Uint16Array",
"Int32Array",
"Uint32Array",
"Float32Array",
"Float64Array",
"BigInt64Array",
"BigUint64Array"
];
function isTypedArrayName(name) {
return typedArrayTypeNames.includes(name);
}
const objectTypeNames = [
"Function",
"Generator",
"AsyncGenerator",
"GeneratorFunction",
"AsyncGeneratorFunction",
"AsyncFunction",
"Observable",
"Array",
"Buffer",
"Blob",
"Object",
"RegExp",
"Date",
"Error",
"Map",
"Set",
"WeakMap",
"WeakSet",
"WeakRef",
"ArrayBuffer",
"SharedArrayBuffer",
"DataView",
"Promise",
"URL",
"FormData",
"URLSearchParams",
"HTMLElement",
"NaN",
...typedArrayTypeNames
];
function isObjectTypeName(name) {
return objectTypeNames.includes(name);
}
const primitiveTypeNames = [
"null",
"undefined",
"string",
"number",
"bigint",
"boolean",
"symbol"
];
function isPrimitiveTypeName(name) {
return primitiveTypeNames.includes(name);
}
function isOfType(type) {
return (value) => typeof value === type;
}
const { toString } = Object.prototype;
const getObjectType = (value) => {
const objectTypeName = toString.call(value).slice(8, -1);
if (/HTML\w+Element/.test(objectTypeName) && is.domElement(value)) {
return "HTMLElement";
}
if (isObjectTypeName(objectTypeName)) {
return objectTypeName;
}
return void 0;
};
const isObjectOfType = (type) => (value) => getObjectType(value) === type;
function is(value) {
if (value === null) {
return "null";
}
switch (typeof value) {
case "undefined": {
return "undefined";
}
case "string": {
return "string";
}
case "number": {
return Number.isNaN(value) ? "NaN" : "number";
}
case "boolean": {
return "boolean";
}
case "function": {
return "Function";
}
case "bigint": {
return "bigint";
}
case "symbol": {
return "symbol";
}
default:
}
if (is.observable(value)) {
return "Observable";
}
if (is.array(value)) {
return "Array";
}
if (is.buffer(value)) {
return "Buffer";
}
const tagType = getObjectType(value);
if (tagType) {
return tagType;
}
if (value instanceof String || value instanceof Boolean || value instanceof Number) {
throw new TypeError("Please don't use object wrappers for primitive types");
}
return "Object";
}
is.undefined = isOfType("undefined");
is.string = isOfType("string");
const isNumberType = isOfType("number");
is.number = (value) => isNumberType(value) && !is.nan(value);
is.positiveNumber = (value) => is.number(value) && value > 0;
is.negativeNumber = (value) => is.number(value) && value < 0;
is.bigint = isOfType("bigint");
is.function_ = isOfType("function");
is.null_ = (value) => value === null;
is.class_ = (value) => is.function_(value) && value.toString().startsWith("class ");
is.boolean = (value) => value === true || value === false;
is.symbol = isOfType("symbol");
is.numericString = (value) => is.string(value) && !is.emptyStringOrWhitespace(value) && !Number.isNaN(Number(value));
is.array = (value, assertion) => {
if (!Array.isArray(value)) {
return false;
}
if (!is.function_(assertion)) {
return true;
}
return value.every((element) => assertion(element));
};
is.buffer = (value) => {
var _a, _b, _c;
return (_c = (_b = (_a = value == null ? void 0 : value.constructor) == null ? void 0 : _a.isBuffer) == null ? void 0 : _b.call(_a, value)) != null ? _c : false;
};
is.blob = (value) => isObjectOfType("Blob")(value);
is.nullOrUndefined = (value) => is.null_(value) || is.undefined(value);
is.object = (value) => !is.null_(value) && (typeof value === "object" || is.function_(value));
is.iterable = (value) => is.function_(value == null ? void 0 : value[Symbol.iterator]);
is.asyncIterable = (value) => is.function_(value == null ? void 0 : value[Symbol.asyncIterator]);
is.generator = (value) => is.iterable(value) && is.function_(value == null ? void 0 : value.next) && is.function_(value == null ? void 0 : value.throw);
is.asyncGenerator = (value) => is.asyncIterable(value) && is.function_(value.next) && is.function_(value.throw);
is.nativePromise = (value) => isObjectOfType("Promise")(value);
const hasPromiseApi = (value) => is.function_(value == null ? void 0 : value.then) && is.function_(value == null ? void 0 : value.catch);
is.promise = (value) => is.nativePromise(value) || hasPromiseApi(value);
is.generatorFunction = isObjectOfType("GeneratorFunction");
is.asyncGeneratorFunction = (value) => getObjectType(value) === "AsyncGeneratorFunction";
is.asyncFunction = (value) => getObjectType(value) === "AsyncFunction";
is.boundFunction = (value) => is.function_(value) && !value.hasOwnProperty("prototype");
is.regExp = isObjectOfType("RegExp");
is.date = isObjectOfType("Date");
is.error = isObjectOfType("Error");
is.map = (value) => isObjectOfType("Map")(value);
is.set = (value) => isObjectOfType("Set")(value);
is.weakMap = (value) => isObjectOfType("WeakMap")(value);
is.weakSet = (value) => isObjectOfType("WeakSet")(value);
is.weakRef = (value) => isObjectOfType("WeakRef")(value);
is.int8Array = isObjectOfType("Int8Array");
is.uint8Array = isObjectOfType("Uint8Array");
is.uint8ClampedArray = isObjectOfType("Uint8ClampedArray");
is.int16Array = isObjectOfType("Int16Array");
is.uint16Array = isObjectOfType("Uint16Array");
is.int32Array = isObjectOfType("Int32Array");
is.uint32Array = isObjectOfType("Uint32Array");
is.float32Array = isObjectOfType("Float32Array");
is.float64Array = isObjectOfType("Float64Array");
is.bigInt64Array = isObjectOfType("BigInt64Array");
is.bigUint64Array = isObjectOfType("BigUint64Array");
is.arrayBuffer = isObjectOfType("ArrayBuffer");
is.sharedArrayBuffer = isObjectOfType("SharedArrayBuffer");
is.dataView = isObjectOfType("DataView");
is.enumCase = (value, targetEnum) => Object.values(targetEnum).includes(value);
is.directInstanceOf = (instance, class_) => Object.getPrototypeOf(instance) === class_.prototype;
is.urlInstance = (value) => isObjectOfType("URL")(value);
is.urlString = (value) => {
if (!is.string(value)) {
return false;
}
try {
new URL(value);
return true;
} catch {
return false;
}
};
is.truthy = (value) => Boolean(value);
is.falsy = (value) => !value;
is.nan = (value) => Number.isNaN(value);
is.primitive = (value) => is.null_(value) || isPrimitiveTypeName(typeof value);
is.integer = (value) => Number.isInteger(value);
is.safeInteger = (value) => Number.isSafeInteger(value);
is.plainObject = (value) => {
if (typeof value !== "object" || value === null) {
return false;
}
const prototype = Object.getPrototypeOf(value);
return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in value) && !(Symbol.iterator in value);
};
is.typedArray = (value) => isTypedArrayName(getObjectType(value));
const isValidLength = (value) => is.safeInteger(value) && value >= 0;
is.arrayLike = (value) => !is.nullOrUndefined(value) && !is.function_(value) && isValidLength(value.length);
is.tupleLike = (value, guards) => {
if (is.array(guards) && is.array(value) && guards.length === value.length) {
return guards.every((guard, index) => guard(value[index]));
}
return false;
};
is.inRange = (value, range) => {
if (is.number(range)) {
return value >= Math.min(0, range) && value <= Math.max(range, 0);
}
if (is.array(range) && range.length === 2) {
return value >= Math.min(...range) && value <= Math.max(...range);
}
throw new TypeError(`Invalid range: ${JSON.stringify(range)}`);
};
const NODE_TYPE_ELEMENT = 1;
const DOM_PROPERTIES_TO_CHECK = [
"innerHTML",
"ownerDocument",
"style",
"attributes",
"nodeValue"
];
is.domElement = (value) => is.object(value) && value.nodeType === NODE_TYPE_ELEMENT && is.string(value.nodeName) && !is.plainObject(value) && DOM_PROPERTIES_TO_CHECK.every((property) => property in value);
is.observable = (value) => {
var _a, _b;
if (!value) {
return false;
}
if (value === ((_a = value[Symbol.observable]) == null ? void 0 : _a.call(value))) {
return true;
}
if (value === ((_b = value["@@observable"]) == null ? void 0 : _b.call(value))) {
return true;
}
return false;
};
is.nodeStream = (value) => is.object(value) && is.function_(value.pipe) && !is.observable(value);
is.infinite = (value) => value === Number.POSITIVE_INFINITY || value === Number.NEGATIVE_INFINITY;
const isAbsoluteMod2 = (remainder) => (value) => is.integer(value) && Math.abs(value % 2) === remainder;
is.evenInteger = isAbsoluteMod2(0);
is.oddInteger = isAbsoluteMod2(1);
is.emptyArray = (value) => is.array(value) && value.length === 0;
is.nonEmptyArray = (value) => is.array(value) && value.length > 0;
is.emptyString = (value) => is.string(value) && value.length === 0;
const isWhiteSpaceString = (value) => is.string(value) && !/\S/.test(value);
is.emptyStringOrWhitespace = (value) => is.emptyString(value) || isWhiteSpaceString(value);
is.nonEmptyString = (value) => is.string(value) && value.length > 0;
is.nonEmptyStringAndNotWhitespace = (value) => is.string(value) && !is.emptyStringOrWhitespace(value);
is.emptyObject = (value) => is.object(value) && !is.map(value) && !is.set(value) && Object.keys(value).length === 0;
is.nonEmptyObject = (value) => is.object(value) && !is.map(value) && !is.set(value) && Object.keys(value).length > 0;
is.emptySet = (value) => is.set(value) && value.size === 0;
is.nonEmptySet = (value) => is.set(value) && value.size > 0;
is.emptyMap = (value) => is.map(value) && value.size === 0;
is.nonEmptyMap = (value) => is.map(value) && value.size > 0;
is.propertyKey = (value) => is.any([is.string, is.number, is.symbol], value);
is.formData = (value) => isObjectOfType("FormData")(value);
is.urlSearchParams = (value) => isObjectOfType("URLSearchParams")(value);
const predicateOnArray = (method, predicate, values) => {
if (!is.function_(predicate)) {
throw new TypeError(`Invalid predicate: ${JSON.stringify(predicate)}`);
}
if (values.length === 0) {
throw new TypeError("Invalid number of values");
}
return method.call(values, predicate);
};
is.any = (predicate, ...values) => {
const predicates = is.array(predicate) ? predicate : [predicate];
return predicates.some((singlePredicate) => predicateOnArray(Array.prototype.some, singlePredicate, values));
};
is.all = (predicate, ...values) => predicateOnArray(Array.prototype.every, predicate, values);
const assertType = (condition, description, value, options = {}) => {
if (!condition) {
const { multipleValues } = options;
const valuesMessage = multipleValues ? `received values of types ${[
...new Set(value.map((singleValue) => `\`${is(singleValue)}\``))
].join(", ")}` : `received value of type \`${is(value)}\``;
throw new TypeError(`Expected value which is \`${description}\`, ${valuesMessage}.`);
}
};
const assert = {
undefined: (value) => assertType(is.undefined(value), "undefined", value),
string: (value) => assertType(is.string(value), "string", value),
number: (value) => assertType(is.number(value), "number", value),
positiveNumber: (value) => assertType(is.positiveNumber(value), "positive number", value),
negativeNumber: (value) => assertType(is.negativeNumber(value), "negative number", value),
bigint: (value) => assertType(is.bigint(value), "bigint", value),
function_: (value) => assertType(is.function_(value), "Function", value),
null_: (value) => assertType(is.null_(value), "null", value),
class_: (value) => assertType(is.class_(value), "Class", value),
boolean: (value) => assertType(is.boolean(value), "boolean", value),
symbol: (value) => assertType(is.symbol(value), "symbol", value),
numericString: (value) => assertType(is.numericString(value), "string with a number", value),
array: (value, assertion) => {
const assert2 = assertType;
assert2(is.array(value), "Array", value);
if (assertion) {
value.forEach(assertion);
}
},
buffer: (value) => assertType(is.buffer(value), "Buffer", value),
blob: (value) => assertType(is.blob(value), "Blob", value),
nullOrUndefined: (value) => assertType(is.nullOrUndefined(value), "null or undefined", value),
object: (value) => assertType(is.object(value), "Object", value),
iterable: (value) => assertType(is.iterable(value), "Iterable", value),
asyncIterable: (value) => assertType(is.asyncIterable(value), "AsyncIterable", value),
generator: (value) => assertType(is.generator(value), "Generator", value),
asyncGenerator: (value) => assertType(is.asyncGenerator(value), "AsyncGenerator", value),
nativePromise: (value) => assertType(is.nativePromise(value), "native Promise", value),
promise: (value) => assertType(is.promise(value), "Promise", value),
generatorFunction: (value) => assertType(is.generatorFunction(value), "GeneratorFunction", value),
asyncGeneratorFunction: (value) => assertType(is.asyncGeneratorFunction(value), "AsyncGeneratorFunction", value),
asyncFunction: (value) => assertType(is.asyncFunction(value), "AsyncFunction", value),
boundFunction: (value) => assertType(is.boundFunction(value), "Function", value),
regExp: (value) => assertType(is.regExp(value), "RegExp", value),
date: (value) => assertType(is.date(value), "Date", value),
error: (value) => assertType(is.error(value), "Error", value),
map: (value) => assertType(is.map(value), "Map", value),
set: (value) => assertType(is.set(value), "Set", value),
weakMap: (value) => assertType(is.weakMap(value), "WeakMap", value),
weakSet: (value) => assertType(is.weakSet(value), "WeakSet", value),
weakRef: (value) => assertType(is.weakRef(value), "WeakRef", value),
int8Array: (value) => assertType(is.int8Array(value), "Int8Array", value),
uint8Array: (value) => assertType(is.uint8Array(value), "Uint8Array", value),
uint8ClampedArray: (value) => assertType(is.uint8ClampedArray(value), "Uint8ClampedArray", value),
int16Array: (value) => assertType(is.int16Array(value), "Int16Array", value),
uint16Array: (value) => assertType(is.uint16Array(value), "Uint16Array", value),
int32Array: (value) => assertType(is.int32Array(value), "Int32Array", value),
uint32Array: (value) => assertType(is.uint32Array(value), "Uint32Array", value),
float32Array: (value) => assertType(is.float32Array(value), "Float32Array", value),
float64Array: (value) => assertType(is.float64Array(value), "Float64Array", value),
bigInt64Array: (value) => assertType(is.bigInt64Array(value), "BigInt64Array", value),
bigUint64Array: (value) => assertType(is.bigUint64Array(value), "BigUint64Array", value),
arrayBuffer: (value) => assertType(is.arrayBuffer(value), "ArrayBuffer", value),
sharedArrayBuffer: (value) => assertType(is.sharedArrayBuffer(value), "SharedArrayBuffer", value),
dataView: (value) => assertType(is.dataView(value), "DataView", value),
enumCase: (value, targetEnum) => assertType(is.enumCase(value, targetEnum), "EnumCase", value),
urlInstance: (value) => assertType(is.urlInstance(value), "URL", value),
urlString: (value) => assertType(is.urlString(value), "string with a URL", value),
truthy: (value) => assertType(is.truthy(value), "truthy", value),
falsy: (value) => assertType(is.falsy(value), "falsy", value),
nan: (value) => assertType(is.nan(value), "NaN", value),
primitive: (value) => assertType(is.primitive(value), "primitive", value),
integer: (value) => assertType(is.integer(value), "integer", value),
safeInteger: (value) => assertType(is.safeInteger(value), "integer", value),
plainObject: (value) => assertType(is.plainObject(value), "plain object", value),
typedArray: (value) => assertType(is.typedArray(value), "TypedArray", value),
arrayLike: (value) => assertType(is.arrayLike(value), "array-like", value),
tupleLike: (value, guards) => assertType(is.tupleLike(value, guards), "tuple-like", value),
domElement: (value) => assertType(is.domElement(value), "HTMLElement", value),
observable: (value) => assertType(is.observable(value), "Observable", value),
nodeStream: (value) => assertType(is.nodeStream(value), "Node.js Stream", value),
infinite: (value) => assertType(is.infinite(value), "infinite number", value),
emptyArray: (value) => assertType(is.emptyArray(value), "empty array", value),
nonEmptyArray: (value) => assertType(is.nonEmptyArray(value), "non-empty array", value),
emptyString: (value) => assertType(is.emptyString(value), "empty string", value),
emptyStringOrWhitespace: (value) => assertType(is.emptyStringOrWhitespace(value), "empty string or whitespace", value),
nonEmptyString: (value) => assertType(is.nonEmptyString(value), "non-empty string", value),
nonEmptyStringAndNotWhitespace: (value) => assertType(is.nonEmptyStringAndNotWhitespace(value), "non-empty string and not whitespace", value),
emptyObject: (value) => assertType(is.emptyObject(value), "empty object", value),
nonEmptyObject: (value) => assertType(is.nonEmptyObject(value), "non-empty object", value),
emptySet: (value) => assertType(is.emptySet(value), "empty set", value),
nonEmptySet: (value) => assertType(is.nonEmptySet(value), "non-empty set", value),
emptyMap: (value) => assertType(is.emptyMap(value), "empty map", value),
nonEmptyMap: (value) => assertType(is.nonEmptyMap(value), "non-empty map", value),
propertyKey: (value) => assertType(is.propertyKey(value), "PropertyKey", value),
formData: (value) => assertType(is.formData(value), "FormData", value),
urlSearchParams: (value) => assertType(is.urlSearchParams(value), "URLSearchParams", value),
evenInteger: (value) => assertType(is.evenInteger(value), "even integer", value),
oddInteger: (value) => assertType(is.oddInteger(value), "odd integer", value),
directInstanceOf: (instance, class_) => assertType(is.directInstanceOf(instance, class_), "T", instance),
inRange: (value, range) => assertType(is.inRange(value, range), "in range", value),
any: (predicate, ...values) => assertType(is.any(predicate, ...values), "predicate returns truthy for any value", values, { multipleValues: true }),
all: (predicate, ...values) => assertType(is.all(predicate, ...values), "predicate returns truthy for all values", values, { multipleValues: true })
};
Object.defineProperties(is, {
class: {
value: is.class_
},
function: {
value: is.function_
},
null: {
value: is.null_
}
});
Object.defineProperties(assert, {
class: {
value: assert.class_
},
function: {
value: assert.function_
},
null: {
value: assert.null_
}
});
var esm_default = is;
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
assert
});
//# sourceMappingURL=index.js.map