UNPKG

@oxog/kindof

Version:

Zero-dependency advanced type detection library with TypeScript support, plugin system, and 100% test coverage

2,109 lines 63.1 kB
'use strict';

Object.defineProperty(exports, '__esModule', { value: true });

const TYPE_TAG_MAP = {
  "[object Arguments]": "arguments",
  "[object Array]": "array",
  "[object ArrayBuffer]": "arraybuffer",
  "[object AsyncFunction]": "asyncfunction",
  "[object AsyncGeneratorFunction]": "asyncgeneratorfunction",
  "[object BigInt]": "bigint",
  "[object BigInt64Array]": "bigint64array",
  "[object BigUint64Array]": "biguint64array",
  "[object Boolean]": "boolean",
  "[object DataView]": "dataview",
  "[object Date]": "date",
  "[object Error]": "error",
  "[object Float32Array]": "float32array",
  "[object Float64Array]": "float64array",
  "[object Function]": "function",
  "[object GeneratorFunction]": "generatorfunction",
  "[object Int8Array]": "int8array",
  "[object Int16Array]": "int16array",
  "[object Int32Array]": "int32array",
  "[object Map]": "map",
  "[object Number]": "number",
  "[object Object]": "object",
  "[object Promise]": "promise",
  "[object Proxy]": "proxy",
  "[object RegExp]": "regexp",
  "[object Set]": "set",
  "[object SharedArrayBuffer]": "sharedarraybuffer",
  "[object String]": "string",
  "[object Symbol]": "symbol",
  "[object Uint8Array]": "uint8array",
  "[object Uint8ClampedArray]": "uint8clampedarray",
  "[object Uint16Array]": "uint16array",
  "[object Uint32Array]": "uint32array",
  "[object WeakMap]": "weakmap",
  "[object WeakSet]": "weakset",
  "[object Window]": "window",
  "[object HTMLDocument]": "document",
  "[object Document]": "document",
  "[object Null]": "null",
  "[object Undefined]": "undefined"
};

const toString$1 = Object.prototype.toString;
const toStringTag = Symbol.toStringTag;
function getNativeType(value) {
  if (value === void 0) return "undefined";
  if (value === null) return "null";
  const primitiveType = typeof value;
  switch (primitiveType) {
    case "boolean":
      return "boolean";
    case "number":
      return "number";
    case "string":
      return "string";
    case "symbol":
      return "symbol";
    case "bigint":
      return "bigint";
    case "function":
      return getFunctionType(value);
    case "object":
      return getObjectType(value);
    default:
      return null;
  }
}
function getFunctionType(fn) {
  const fnString = fn.toString();
  if (/^class\s/.test(fnString)) {
    return "function";
  }
  if (/^async\s*function\s*\*/.test(fnString) || /^async\s*\*/.test(fnString)) {
    return "asyncgeneratorfunction";
  }
  if (/^async\s/.test(fnString)) {
    return "asyncfunction";
  }
  if (/^function\s*\*/.test(fnString) || /^\*/.test(fnString)) {
    return "generatorfunction";
  }
  const ctorName = fn.constructor?.name;
  if (ctorName === "AsyncFunction") return "asyncfunction";
  if (ctorName === "GeneratorFunction") return "generatorfunction";
  if (ctorName === "AsyncGeneratorFunction") return "asyncgeneratorfunction";
  return "function";
}
function getObjectType(obj) {
  const tag = toString$1.call(obj);
  const mappedType = TYPE_TAG_MAP[tag];
  if (mappedType) {
    return mappedType;
  }
  if (typeof Buffer !== "undefined" && Buffer.isBuffer && Buffer.isBuffer(obj)) {
    return "buffer";
  }
  if (typeof obj === "object" && "callee" in obj && typeof obj.callee === "function") {
    return "arguments";
  }
  if (isStream$1(obj)) {
    return "stream";
  }
  if (isEventEmitter$1(obj)) {
    return "eventemitter";
  }
  if (tag === "[object Object]") {
    const customTag = obj[toStringTag];
    if (typeof customTag === "string") {
      return customTag.toLowerCase();
    }
    const ctor = obj.constructor;
    if (ctor && ctor !== Object) {
      const ctorName = ctor.name;
      if (ctorName && ctorName !== "Object") {
        return ctorName.toLowerCase();
      }
    }
  }
  if (isDOMElement(obj)) {
    return "element";
  }
  if (isDOMNode(obj)) {
    return "node";
  }
  if (isGlobal$1(obj)) {
    return "global";
  }
  return "object";
}
function isStream$1(obj) {
  return obj !== null && typeof obj === "object" && typeof obj.pipe === "function";
}
function isEventEmitter$1(obj) {
  return obj !== null && typeof obj === "object" && typeof obj.on === "function" && typeof obj.emit === "function" && typeof obj.removeListener === "function";
}
function isDOMElement(obj) {
  if (typeof HTMLElement === "undefined") return false;
  return obj instanceof HTMLElement;
}
function isDOMNode(obj) {
  if (typeof Node === "undefined") return false;
  return obj instanceof Node;
}
function isGlobal$1(obj) {
  if (typeof globalThis !== "undefined" && obj === globalThis) return true;
  if (typeof global !== "undefined" && obj === global) return true;
  if (typeof window !== "undefined" && obj === window) return true;
  if (typeof self !== "undefined" && obj === self) return true;
  return false;
}

const WeakMapPrototype = WeakMap.prototype;
const WeakSetPrototype = WeakSet.prototype;
const MapPrototype = Map.prototype;
const SetPrototype = Set.prototype;
const ArrayBufferPrototype = ArrayBuffer.prototype;
const DataViewPrototype = DataView.prototype;
const SharedArrayBufferPrototype = typeof SharedArrayBuffer !== "undefined" ? SharedArrayBuffer.prototype : null;
function checkModernType(value) {
  if (value === null || value === void 0) {
    return null;
  }
  try {
    if (value instanceof Promise || isThenable$1(value)) {
      return "promise";
    }
    if (value instanceof Map || value.__proto__ === MapPrototype) {
      return "map";
    }
    if (value instanceof Set || value.__proto__ === SetPrototype) {
      return "set";
    }
    if (value instanceof WeakMap || value.__proto__ === WeakMapPrototype) {
      return "weakmap";
    }
    if (value instanceof WeakSet || value.__proto__ === WeakSetPrototype) {
      return "weakset";
    }
    if (value instanceof ArrayBuffer || value.__proto__ === ArrayBufferPrototype) {
      return "arraybuffer";
    }
    if (SharedArrayBufferPrototype && (value instanceof SharedArrayBuffer || value.__proto__ === SharedArrayBufferPrototype)) {
      return "sharedarraybuffer";
    }
    if (value instanceof DataView || value.__proto__ === DataViewPrototype) {
      return "dataview";
    }
    if (isProxy$1(value)) {
      return "proxy";
    }
  } catch {
  }
  return null;
}
function isThenable$1(value) {
  return value !== null && (typeof value === "object" || typeof value === "function") && typeof value.then === "function";
}
function isProxy$1(value) {
  try {
    if (typeof value !== "object" && typeof value !== "function") {
      return false;
    }
    new Proxy({}, value);
    const descriptor = Object.getOwnPropertyDescriptor(value, Symbol.toStringTag);
    if (descriptor && !descriptor.configurable && descriptor.value === "Proxy") {
      return true;
    }
    return false;
  } catch {
    return false;
  }
}
function getTypedArrayType(value) {
  if (!ArrayBuffer.isView(value)) {
    return null;
  }
  const proto = Object.getPrototypeOf(value);
  const ctorName = proto?.constructor?.name;
  switch (ctorName) {
    case "Int8Array":
      return "int8array";
    case "Uint8Array":
      return "uint8array";
    case "Uint8ClampedArray":
      return "uint8clampedarray";
    case "Int16Array":
      return "int16array";
    case "Uint16Array":
      return "uint16array";
    case "Int32Array":
      return "int32array";
    case "Uint32Array":
      return "uint32array";
    case "Float32Array":
      return "float32array";
    case "Float64Array":
      return "float64array";
    case "BigInt64Array":
      return "bigint64array";
    case "BigUint64Array":
      return "biguint64array";
    default:
      return null;
  }
}

let typeCache = null;
let cacheEnabled = true;
function kindOfCore(value) {
  if (value === void 0) return "undefined";
  if (value === null) return "null";
  const primitiveType = getPrimitiveType(value);
  if (primitiveType) return primitiveType;
  if (typeof value === "object" && cacheEnabled && typeCache) {
    const cached = typeCache.get(value);
    if (cached) return cached;
  }
  let type = getNativeType(value);
  if (!type || type === "object") {
    const modernType = checkModernType(value);
    if (modernType) {
      type = modernType;
    } else {
      const arrayType = getTypedArrayType(value);
      if (arrayType) {
        type = arrayType;
      } else {
        type = getCustomType(value) || type || "object";
      }
    }
  }
  if (typeof value === "object" && cacheEnabled && type) {
    if (!typeCache) typeCache = /* @__PURE__ */ new WeakMap();
    typeCache.set(value, type);
  }
  return type || "object";
}
function fastKindOf(value) {
  if (value === void 0) return "undefined";
  if (value === null) return "null";
  const primitiveType = typeof value;
  if (primitiveType !== "object" && primitiveType !== "function") {
    return primitiveType;
  }
  if (Array.isArray(value)) return "array";
  if (value instanceof Date) return "date";
  if (value instanceof RegExp) return "regexp";
  if (value instanceof Error) return "error";
  return "object";
}
function kindOfMany(values) {
  const results = new Array(values.length);
  for (let i = 0; i < values.length; i++) {
    results[i] = kindOfCore(values[i]);
  }
  return results;
}
function getDetailedType(value) {
  const type = kindOfCore(value);
  const isPrimitive = value === null || typeof value !== "object" && typeof value !== "function";
  let constructor = null;
  let prototype = null;
  let isIterable = false;
  let isAsync = false;
  let customType = null;
  const metadata = {};
  if (!isPrimitive && value !== null) {
    const obj = value;
    if (obj.constructor) {
      constructor = obj.constructor.name || null;
    }
    const proto = Object.getPrototypeOf(obj);
    if (proto && proto.constructor) {
      prototype = proto.constructor.name || null;
    }
    isIterable = typeof obj[Symbol.iterator] === "function";
    isAsync = typeof obj[Symbol.asyncIterator] === "function" || type === "promise" || type === "asyncfunction" || type === "asyncgeneratorfunction";
    if (obj[Symbol.toStringTag]) {
      customType = String(obj[Symbol.toStringTag]);
    }
    if (type === "array") {
      metadata["length"] = obj.length;
    } else if (type === "map" || type === "set") {
      metadata["size"] = obj.size;
    } else if (type === "arraybuffer" || type === "sharedarraybuffer") {
      metadata["byteLength"] = obj.byteLength;
    } else if (type.includes("array") && obj.buffer) {
      metadata["byteLength"] = obj.byteLength;
      metadata["length"] = obj.length;
    }
  }
  return {
    type,
    constructor,
    prototype,
    isPrimitive,
    isBuiltIn: isBuiltInType(type),
    isNullish: value === null || value === void 0,
    isIterable,
    isAsync,
    customType,
    metadata: Object.keys(metadata).length > 0 ? metadata : void 0
  };
}
function getPrimitiveType(value) {
  const type = typeof value;
  switch (type) {
    case "boolean":
    case "number":
    case "string":
    case "symbol":
    case "bigint":
      return type;
    default:
      return null;
  }
}
function getCustomType(value) {
  try {
    const toStringTag = value[Symbol.toStringTag];
    if (typeof toStringTag === "string") {
      return toStringTag.toLowerCase();
    }
    if (value.constructor && value.constructor !== Object) {
      const ctorName = value.constructor.name;
      if (ctorName && ctorName !== "Object") {
        return ctorName.toLowerCase();
      }
    }
  } catch {
  }
  return null;
}
function isBuiltInType(type) {
  const builtInTypes = /* @__PURE__ */ new Set([
    "undefined",
    "null",
    "boolean",
    "number",
    "string",
    "symbol",
    "bigint",
    "object",
    "array",
    "function",
    "date",
    "regexp",
    "error",
    "map",
    "set",
    "weakmap",
    "weakset",
    "int8array",
    "uint8array",
    "uint8clampedarray",
    "int16array",
    "uint16array",
    "int32array",
    "uint32array",
    "float32array",
    "float64array",
    "bigint64array",
    "biguint64array",
    "promise",
    "generatorfunction",
    "asyncfunction",
    "asyncgeneratorfunction",
    "proxy",
    "dataview",
    "arraybuffer",
    "sharedarraybuffer",
    "arguments"
  ]);
  return builtInTypes.has(type);
}
function enableCache() {
  cacheEnabled = true;
  if (!typeCache) typeCache = /* @__PURE__ */ new WeakMap();
}
function disableCache() {
  cacheEnabled = false;
  typeCache = null;
}
function clearCache() {
  if (typeCache) {
    typeCache = /* @__PURE__ */ new WeakMap();
  }
}

function isUndefined(value) {
  return value === void 0;
}
function isNull(value) {
  return value === null;
}
function isBoolean(value) {
  return typeof value === "boolean";
}
function isNumber(value) {
  return typeof value === "number";
}
function isString(value) {
  return typeof value === "string";
}
function isSymbol(value) {
  return typeof value === "symbol";
}
function isBigInt(value) {
  return typeof value === "bigint";
}
function isPrimitive(value) {
  return value === null || typeof value !== "object" && typeof value !== "function";
}
function isNullish(value) {
  return value === null || value === void 0;
}
function isFalsy(value) {
  return !value;
}
function isTruthy(value) {
  return !!value;
}
function isInteger(value) {
  return typeof value === "number" && Number.isInteger(value);
}
function isSafeInteger(value) {
  return typeof value === "number" && Number.isSafeInteger(value);
}
function isFinite(value) {
  return typeof value === "number" && Number.isFinite(value);
}
function isNaN$1(value) {
  return typeof value === "number" && Number.isNaN(value);
}
function isInfinity(value) {
  return value === Infinity || value === -Infinity;
}
function isEmptyString(value) {
  return value === "";
}
function isNumericString(value) {
  if (typeof value !== "string") return false;
  if (value === "") return false;
  return !isNaN$1(Number(value)) && !isNaN$1(parseFloat(value));
}
function isJsonString(value) {
  if (typeof value !== "string") return false;
  try {
    JSON.parse(value);
    return true;
  } catch {
    return false;
  }
}

function isObject(value) {
  return value !== null && typeof value === "object";
}
function isArray(value) {
  return Array.isArray(value);
}
function isFunction(value) {
  return typeof value === "function";
}
function isDate(value) {
  return value instanceof Date;
}
function isRegExp(value) {
  return value instanceof RegExp;
}
function isError(value) {
  return value instanceof Error || value !== null && typeof value === "object" && "name" in value && "message" in value && "stack" in value;
}
function isPromise(value) {
  return value instanceof Promise || value !== null && typeof value === "object" && "then" in value && typeof value.then === "function";
}
function isArguments(value) {
  return Object.prototype.toString.call(value) === "[object Arguments]";
}
function isBuffer(value) {
  return typeof Buffer !== "undefined" && value !== null && typeof value === "object" && "isBuffer" in Buffer && Buffer.isBuffer(value);
}
function isPlainObject(value) {
  if (!isObject(value)) return false;
  const proto = Object.getPrototypeOf(value);
  if (proto === null) return true;
  const Ctor = Object.prototype.hasOwnProperty.call(proto, "constructor") && proto.constructor;
  return typeof Ctor === "function" && Ctor instanceof Ctor && Function.prototype.toString.call(Ctor) === Function.prototype.toString.call(Object);
}
function isEmpty(value) {
  if (value === null || value === void 0) return true;
  if (typeof value === "string" || Array.isArray(value)) return value.length === 0;
  if (value instanceof Map || value instanceof Set) return value.size === 0;
  if (isPlainObject(value)) return Object.keys(value).length === 0;
  return false;
}
function isEmptyArray(value) {
  return Array.isArray(value) && value.length === 0;
}
function isEmptyObject(value) {
  return isPlainObject(value) && Object.keys(value).length === 0;
}
function hasLength(value) {
  return value !== null && value !== void 0 && (typeof value === "object" || typeof value === "string") && (typeof value === "string" || "length" in value) && typeof value.length === "number";
}
function hasSize(value) {
  return value !== null && value !== void 0 && typeof value === "object" && "size" in value && typeof value.size === "number";
}
function isArrayLike(value) {
  return value !== null && value !== void 0 && typeof value !== "function" && hasLength(value) && value.length >= 0 && value.length <= Number.MAX_SAFE_INTEGER;
}
function isIterable(value) {
  return value !== null && value !== void 0 && typeof value[Symbol.iterator] === "function";
}
function isAsyncIterable(value) {
  return value !== null && value !== void 0 && typeof value[Symbol.asyncIterator] === "function";
}
function isConstructor(value) {
  if (typeof value !== "function") return false;
  try {
    const testObj = {};
    const BoundTest = value.bind(testObj);
    new BoundTest();
    return true;
  } catch {
    return false;
  }
}
function isThenable(value) {
  return value !== null && (typeof value === "object" || typeof value === "function") && "then" in value && typeof value.then === "function";
}
function isObservable(value) {
  return value !== null && typeof value === "object" && "subscribe" in value && typeof value.subscribe === "function";
}
function isGenerator(value) {
  return value !== null && typeof value === "object" && typeof value.next === "function" && typeof value.throw === "function" && typeof value.return === "function";
}
function isAsyncGenerator(value) {
  return value !== null && typeof value === "object" && typeof value.next === "function" && typeof value.throw === "function" && typeof value.return === "function" && isAsyncIterable(value);
}
function isGeneratorFunction(value) {
  if (typeof value !== "function") return false;
  const name = value.constructor?.name;
  return name === "GeneratorFunction" || /^function\s*\*/.test(value.toString());
}
function isAsyncFunction(value) {
  if (typeof value !== "function") return false;
  const name = value.constructor?.name;
  return name === "AsyncFunction" || /^async\s/.test(value.toString());
}
function isAsyncGeneratorFunction(value) {
  if (typeof value !== "function") return false;
  const name = value.constructor?.name;
  return name === "AsyncGeneratorFunction" || /^async\s*function\s*\*/.test(value.toString());
}
function isProxy(value) {
  try {
    if (typeof value !== "object" && typeof value !== "function") return false;
    if (value === null) return false;
    const testHandler = {
      get() {
        throw new Error("proxy trap");
      }
    };
    const proxy = new Proxy({}, testHandler);
    const isProxyLike = Object.prototype.toString.call(value) === Object.prototype.toString.call(proxy);
    return isProxyLike;
  } catch {
    return false;
  }
}
function isTypeError(value) {
  return value instanceof TypeError;
}
function isRangeError(value) {
  return value instanceof RangeError;
}
function isSyntaxError(value) {
  return value instanceof SyntaxError;
}
function isReferenceError(value) {
  return value instanceof ReferenceError;
}
function isEvalError(value) {
  return value instanceof EvalError;
}
function isURIError(value) {
  return value instanceof URIError;
}
function isStream(value) {
  return value !== null && typeof value === "object" && typeof value.pipe === "function";
}
function isEventEmitter(value) {
  return value !== null && typeof value === "object" && typeof value.on === "function" && typeof value.emit === "function" && typeof value.removeListener === "function";
}
function isElement(value) {
  return typeof Element !== "undefined" && value instanceof Element;
}
function isNode(value) {
  return typeof Node !== "undefined" && value instanceof Node;
}
function isWindow(value) {
  return typeof Window !== "undefined" && value instanceof Window;
}
function isDocument(value) {
  return typeof Document !== "undefined" && value instanceof Document;
}
function isGlobal(value) {
  if (typeof globalThis !== "undefined" && value === globalThis) return true;
  if (typeof global !== "undefined" && value === global) return true;
  if (typeof window !== "undefined" && value === window) return true;
  if (typeof self !== "undefined" && value === self) return true;
  return false;
}

function isMap(value) {
  return value instanceof Map;
}
function isSet(value) {
  return value instanceof Set;
}
function isWeakMap(value) {
  return value instanceof WeakMap;
}
function isWeakSet(value) {
  return value instanceof WeakSet;
}
function isDataView(value) {
  return value instanceof DataView;
}
function isArrayBuffer(value) {
  return value instanceof ArrayBuffer;
}
function isSharedArrayBuffer(value) {
  return typeof SharedArrayBuffer !== "undefined" && value instanceof SharedArrayBuffer;
}
function isTypedArray(value) {
  return ArrayBuffer.isView(value) && !(value instanceof DataView);
}
function isInt8Array(value) {
  return value instanceof Int8Array;
}
function isUint8Array(value) {
  return value instanceof Uint8Array;
}
function isUint8ClampedArray(value) {
  return value instanceof Uint8ClampedArray;
}
function isInt16Array(value) {
  return value instanceof Int16Array;
}
function isUint16Array(value) {
  return value instanceof Uint16Array;
}
function isInt32Array(value) {
  return value instanceof Int32Array;
}
function isUint32Array(value) {
  return value instanceof Uint32Array;
}
function isFloat32Array(value) {
  return value instanceof Float32Array;
}
function isFloat64Array(value) {
  return value instanceof Float64Array;
}
function isBigInt64Array(value) {
  return typeof BigInt64Array !== "undefined" && value instanceof BigInt64Array;
}
function isBigUint64Array(value) {
  return typeof BigUint64Array !== "undefined" && value instanceof BigUint64Array;
}

function isType(value, type) {
  return kindOfCore(value) === type;
}
function assertType(value, type) {
  if (kindOfCore(value) !== type) {
    throw new TypeError(`Expected type "${type}" but got "${kindOfCore(value)}"`);
  }
}
function ensureType(value, type, defaultValue) {
  return isType(value, type) ? value : defaultValue;
}

function validateSchema(value, schema, options = {}) {
  const errors = [];
  const context = {
    path: options.path || "",
    strict: options.strict ?? true,
    coerce: options.coerce ?? false,
    partial: options.partial ?? false
  };
  validateValue(value, schema, context, errors);
  return {
    valid: errors.length === 0,
    errors
  };
}
function validateValue(value, schema, context, errors) {
  if (typeof schema === "string") {
    const actualType = kindOfCore(value);
    if (actualType !== schema) {
      errors.push({
        path: context.path || "root",
        expected: schema,
        actual: actualType,
        message: `Expected type "${schema}" but got "${actualType}"`
      });
    }
  } else if (Array.isArray(schema)) {
    if (!Array.isArray(value)) {
      errors.push({
        path: context.path || "root",
        expected: "array",
        actual: kindOfCore(value),
        message: `Expected array but got "${kindOfCore(value)}"`
      });
      return;
    }
    const itemSchema = schema[0];
    if (itemSchema) {
      value.forEach((item, index) => {
        validateValue(
          item,
          itemSchema,
          { ...context, path: `${context.path}[${index}]` },
          errors
        );
      });
    }
  } else if (schema && typeof schema === "object") {
    if (typeof value !== "object" || value === null) {
      errors.push({
        path: context.path || "root",
        expected: "object",
        actual: kindOfCore(value),
        message: `Expected object but got "${kindOfCore(value)}"`
      });
      return;
    }
    const obj = value;
    const schemaObj = schema;
    if (!context.partial) {
      for (const key of Object.keys(schemaObj)) {
        if (!(key in obj)) {
          errors.push({
            path: context.path ? `${context.path}.${key}` : key,
            expected: typeof schemaObj[key] === "string" ? schemaObj[key] : kindOfCore(schemaObj[key]),
            actual: "undefined",
            message: `Missing required property "${key}"`
          });
        }
      }
    }
    for (const key of Object.keys(obj)) {
      if (key in schemaObj) {
        const schemaValue = schemaObj[key];
        if (schemaValue !== void 0) {
          validateValue(
            obj[key],
            schemaValue,
            { ...context, path: context.path ? `${context.path}.${key}` : key },
            errors
          );
        }
      } else if (context.strict) {
        errors.push({
          path: context.path ? `${context.path}.${key}` : key,
          expected: "undefined",
          actual: kindOfCore(obj[key]),
          message: `Unexpected property "${key}"`
        });
      }
    }
  }
}
function createValidator(schema, options) {
  return (value) => validateSchema(value, schema, options);
}

function toString(value) {
  const type = kindOfCore(value);
  switch (type) {
    case "string":
      return value;
    case "number":
    case "boolean":
    case "bigint":
      return String(value);
    case "symbol":
      return value.toString();
    case "undefined":
      return "undefined";
    case "null":
      return "null";
    case "date":
      return value.toISOString();
    case "regexp":
      return value.toString();
    case "function":
      return value.toString();
    case "array":
      return JSON.stringify(value);
    case "object":
      try {
        return JSON.stringify(value);
      } catch {
        return Object.prototype.toString.call(value);
      }
    default:
      return String(value);
  }
}
function toNumber(value) {
  const type = kindOfCore(value);
  switch (type) {
    case "number":
      return value;
    case "string": {
      const num = Number(value);
      return isNaN(num) ? null : num;
    }
    case "boolean":
      return value ? 1 : 0;
    case "null":
      return 0;
    case "bigint": {
      const bigIntValue = Number(value);
      return bigIntValue > Number.MAX_SAFE_INTEGER || bigIntValue < Number.MIN_SAFE_INTEGER ? null : bigIntValue;
    }
    case "date":
      return value.getTime();
    default:
      return null;
  }
}
function toBoolean(value) {
  const type = kindOfCore(value);
  switch (type) {
    case "boolean":
      return value;
    case "string": {
      const str = value.toLowerCase();
      return str !== "" && str !== "false" && str !== "0" && str !== "no" && str !== "null" && str !== "undefined";
    }
    case "number":
      return value !== 0 && !isNaN(value);
    case "null":
    case "undefined":
      return false;
    case "array":
      return value.length > 0;
    case "object":
      return Object.keys(value).length > 0;
    default:
      return !!value;
  }
}
function toBigInt(value) {
  const type = kindOfCore(value);
  switch (type) {
    case "bigint":
      return value;
    case "number":
      if (Number.isInteger(value)) {
        return BigInt(value);
      }
      return null;
    case "string":
      try {
        return BigInt(value);
      } catch {
        return null;
      }
    case "boolean":
      return BigInt(value ? 1 : 0);
    default:
      return null;
  }
}
function toSymbol(value) {
  const type = kindOfCore(value);
  switch (type) {
    case "symbol":
      return value;
    case "string":
      return Symbol(value);
    case "number":
      return Symbol(String(value));
    default:
      return Symbol(toString(value));
  }
}

function toArray(value) {
  const type = kindOfCore(value);
  switch (type) {
    case "array":
      return value;
    case "string":
      return Array.from(value);
    case "set":
      return Array.from(value);
    case "map":
      return Array.from(value);
    case "arguments":
      return Array.from(value);
    case "null":
    case "undefined":
      return [];
    default:
      if (value !== null && typeof value === "object" && "length" in value) {
        return Array.from(value);
      }
      return [value];
  }
}
function toObject(value) {
  const type = kindOfCore(value);
  switch (type) {
    case "object":
      return value;
    case "array": {
      const arr = value;
      const obj = {};
      arr.forEach((item, index) => {
        obj[index] = item;
      });
      return obj;
    }
    case "map": {
      const map = value;
      const obj = {};
      for (const [key, val] of map) {
        obj[String(key)] = val;
      }
      return obj;
    }
    case "set": {
      const set = value;
      const obj = {};
      let index = 0;
      for (const item of set) {
        obj[index++] = item;
      }
      return obj;
    }
    case "string": {
      const str = value;
      const obj = {};
      for (let i = 0; i < str.length; i++) {
        obj[i] = str[i];
      }
      return obj;
    }
    case "null":
    case "undefined":
      return {};
    default:
      return { value };
  }
}
function toMap(value) {
  const type = kindOfCore(value);
  switch (type) {
    case "map":
      return value;
    case "object": {
      const obj = value;
      const map = /* @__PURE__ */ new Map();
      for (const [key, val] of Object.entries(obj)) {
        map.set(key, val);
      }
      return map;
    }
    case "array": {
      const arr = value;
      const map = /* @__PURE__ */ new Map();
      arr.forEach((item, index) => {
        map.set(index, item);
      });
      return map;
    }
    case "set": {
      const set = value;
      const map = /* @__PURE__ */ new Map();
      let index = 0;
      for (const item of set) {
        map.set(index++, item);
      }
      return map;
    }
    default:
      return null;
  }
}
function toSet(value) {
  const type = kindOfCore(value);
  switch (type) {
    case "set":
      return value;
    case "array":
      return new Set(value);
    case "string":
      return new Set(Array.from(value));
    case "map":
      return new Set(value.values());
    case "object":
      return new Set(Object.values(value));
    default:
      return value !== null && value !== void 0 ? /* @__PURE__ */ new Set([value]) : /* @__PURE__ */ new Set();
  }
}
function toDate(value) {
  const type = kindOfCore(value);
  switch (type) {
    case "date":
      return value;
    case "string": {
      const date = new Date(value);
      return isNaN(date.getTime()) ? null : date;
    }
    case "number": {
      const date = new Date(value);
      return isNaN(date.getTime()) ? null : date;
    }
    default:
      return null;
  }
}
function toRegExp(value) {
  const type = kindOfCore(value);
  switch (type) {
    case "regexp":
      return value;
    case "string":
      try {
        return new RegExp(value);
      } catch {
        return null;
      }
    default:
      return null;
  }
}
function toError(value) {
  const type = kindOfCore(value);
  switch (type) {
    case "error":
      return value;
    case "string":
      return new Error(value);
    case "object":
      if (value && typeof value === "object" && "message" in value) {
        return new Error(String(value.message));
      }
      return new Error(String(value));
    default:
      return new Error(String(value));
  }
}
function toFunction(value) {
  const type = kindOfCore(value);
  switch (type) {
    case "function":
    case "asyncfunction":
    case "generatorfunction":
    case "asyncgeneratorfunction":
      return value;
    case "string":
      try {
        return new Function("return " + String(value));
      } catch {
        return null;
      }
    default:
      return null;
  }
}
function toPromise(value) {
  const type = kindOfCore(value);
  switch (type) {
    case "promise":
      return value;
    case "function":
      try {
        const result = value();
        return Promise.resolve(result);
      } catch (error) {
        return Promise.reject(error);
      }
    default:
      return Promise.resolve(value);
  }
}
function toBuffer(value) {
  if (typeof Buffer === "undefined") {
    return null;
  }
  const type = kindOfCore(value);
  switch (type) {
    case "buffer":
      return value;
    case "string":
      return Buffer.from(value);
    case "array":
      return Buffer.from(value);
    case "uint8array":
      return Buffer.from(value);
    case "arraybuffer":
      return Buffer.from(value);
    default:
      return null;
  }
}
function toTypedArray(value, TypedArrayConstructor) {
  const type = kindOfCore(value);
  switch (type) {
    case "arraybuffer":
      return new TypedArrayConstructor(value);
    case "array": {
      const arr = value;
      const buffer = new ArrayBuffer(arr.length * 4);
      const view = new TypedArrayConstructor(buffer);
      for (let i = 0; i < arr.length; i++) {
        view[i] = arr[i];
      }
      return view;
    }
    default:
      if (type.includes("array") && value instanceof ArrayBuffer) {
        return new TypedArrayConstructor(value);
      }
      return null;
  }
}

function coerceType(value, targetType) {
  const currentType = kindOfCore(value);
  if (currentType === targetType) {
    return value;
  }
  switch (targetType) {
    case "string":
      return toString(value);
    case "number":
      return toNumber(value);
    case "boolean":
      return toBoolean(value);
    case "bigint":
      return toBigInt(value);
    case "symbol":
      return toSymbol(value);
    case "undefined":
      return void 0;
    case "null":
      return null;
    case "array":
      if (currentType === "object" && value !== null) {
        const arr = Array.from(value);
        return arr.length > 0 ? arr : null;
      }
      return null;
    case "object":
      if (currentType === "array") {
        const obj = {};
        value.forEach((item, index) => {
          obj[index] = item;
        });
        return obj;
      }
      return null;
    case "date":
      if (currentType === "string") {
        const date = new Date(value);
        return isNaN(date.getTime()) ? null : date;
      }
      return null;
    default:
      return null;
  }
}

class PerformanceMonitor {
  constructor() {
    this.metrics = /* @__PURE__ */ new Map();
    this.enabled = false;
  }
  enable() {
    this.enabled = true;
  }
  disable() {
    this.enabled = false;
  }
  isEnabled() {
    return this.enabled;
  }
  startTimer(operation) {
    if (!this.enabled) {
      return () => {
      };
    }
    const start = performance.now();
    return () => {
      const duration = performance.now() - start;
      this.recordMetric(operation, duration);
    };
  }
  recordCacheHit(operation) {
    if (!this.enabled) return;
    const metric = this.getOrCreateMetric(operation);
    metric.cacheHits++;
  }
  recordCacheMiss(operation) {
    if (!this.enabled) return;
    const metric = this.getOrCreateMetric(operation);
    metric.cacheMisses++;
  }
  recordMetric(operation, duration) {
    const metric = this.getOrCreateMetric(operation);
    metric.totalCalls++;
    metric.totalTime += duration;
    metric.averageTime = metric.totalTime / metric.totalCalls;
    metric.minTime = Math.min(metric.minTime, duration);
    metric.maxTime = Math.max(metric.maxTime, duration);
  }
  getOrCreateMetric(operation) {
    if (!this.metrics.has(operation)) {
      this.metrics.set(operation, {
        totalCalls: 0,
        totalTime: 0,
        averageTime: 0,
        minTime: Infinity,
        maxTime: 0,
        cacheHits: 0,
        cacheMisses: 0
      });
    }
    const metric = this.metrics.get(operation);
    if (!metric) {
      throw new Error(`Metric '${operation}' should exist after creation`);
    }
    return metric;
  }
  getMetrics(operation) {
    if (operation) {
      return this.metrics.get(operation) || this.getOrCreateMetric(operation);
    }
    return new Map(this.metrics);
  }
  reset(operation) {
    if (operation) {
      this.metrics.delete(operation);
    } else {
      this.metrics.clear();
    }
  }
  getReport() {
    const report = ["Performance Report:", ""];
    for (const [operation, metrics] of this.metrics) {
      report.push(`${operation}:`);
      report.push(`  Total calls: ${metrics.totalCalls}`);
      report.push(`  Total time: ${metrics.totalTime.toFixed(2)}ms`);
      report.push(`  Average time: ${metrics.averageTime.toFixed(2)}ms`);
      report.push(`  Min time: ${metrics.minTime.toFixed(2)}ms`);
      report.push(`  Max time: ${metrics.maxTime.toFixed(2)}ms`);
      report.push(`  Cache hits: ${metrics.cacheHits}`);
      report.push(`  Cache misses: ${metrics.cacheMisses}`);
      if (metrics.cacheHits + metrics.cacheMisses > 0) {
        const hitRate = metrics.cacheHits / (metrics.cacheHits + metrics.cacheMisses) * 100;
        report.push(`  Cache hit rate: ${hitRate.toFixed(1)}%`);
      }
      report.push("");
    }
    return report.join("\n");
  }
}
const performanceMonitor = new PerformanceMonitor();

function inspect(value, options = {}) {
  const opts = {
    depth: 2,
    colors: false,
    showHidden: false,
    showProxy: true,
    maxArrayLength: 100,
    maxStringLength: 200,
    breakLength: 80,
    compact: false,
    sorted: false,
    getters: false,
    ...options
  };
  return inspectValue(value, opts, 0, /* @__PURE__ */ new Set());
}
function inspectValue(value, options, depth, seen) {
  if (depth > options.depth) {
    return "[Object]";
  }
  if (value === null) return "null";
  if (value === void 0) return "undefined";
  const type = kindOfCore(value);
  if (type === "string") {
    return inspectString(value, options);
  }
  if (type === "number" || type === "boolean" || type === "symbol" || type === "bigint") {
    return String(value);
  }
  if (typeof value === "object" && value !== null) {
    if (seen.has(value)) {
      return "[Circular]";
    }
    seen.add(value);
  }
  try {
    switch (type) {
      case "array":
        return inspectArray(value, options, depth, seen);
      case "object":
        return inspectObject(value, options, depth, seen);
      case "function":
        return inspectFunction(value, options);
      case "date":
        return inspectDate(value, options);
      case "regexp":
        return inspectRegExp(value, options);
      case "error":
        return inspectError(value, options);
      case "map":
        return inspectMap(value, options, depth, seen);
      case "set":
        return inspectSet(value, options, depth, seen);
      case "promise":
        return inspectPromise(value, options);
      default:
        return inspectGeneric(value, type, options);
    }
  } finally {
    if (typeof value === "object" && value !== null) {
      seen.delete(value);
    }
  }
}
function inspectString(str, options) {
  if (str.length > options.maxStringLength) {
    return `'${str.slice(0, options.maxStringLength)}...'`;
  }
  return `'${str}'`;
}
function inspectArray(arr, options, depth, seen) {
  if (arr.length === 0) return "[]";
  const maxLength = Math.min(arr.length, options.maxArrayLength);
  const items = [];
  for (let i = 0; i < maxLength; i++) {
    items.push(inspectValue(arr[i], options, depth + 1, seen));
  }
  if (arr.length > maxLength) {
    items.push(`... ${arr.length - maxLength} more items`);
  }
  if (options.compact) {
    return `[${items.join(", ")}]`;
  }
  const joined = items.join(", ");
  if (joined.length <= options.breakLength) {
    return `[${joined}]`;
  }
  return `[
${items.map((item) => `  ${item}`).join(",\n")}
]`;
}
function inspectObject(obj, options, depth, seen) {
  const keys = options.showHidden ? Object.getOwnPropertyNames(obj) : Object.keys(obj);
  if (keys.length === 0) return "{}";
  if (options.sorted) {
    keys.sort();
  }
  const items = [];
  for (const key of keys) {
    try {
      const value = obj[key];
      const inspected = inspectValue(value, options, depth + 1, seen);
      items.push(`${key}: ${inspected}`);
    } catch (error) {
      items.push(`${key}: [Error: ${error.message}]`);
    }
  }
  if (options.compact) {
    return `{${items.join(", ")}}`;
  }
  const joined = items.join(", ");
  if (joined.length <= options.breakLength) {
    return `{${joined}}`;
  }
  return `{
${items.map((item) => `  ${item}`).join(",\n")}
}`;
}
function inspectFunction(fn, _options) {
  const name = fn.name || "anonymous";
  const type = getDetailedType(fn);
  if (type.type === "asyncfunction") {
    return `[AsyncFunction: ${name}]`;
  } else if (type.type === "generatorfunction") {
    return `[GeneratorFunction: ${name}]`;
  } else if (type.type === "asyncgeneratorfunction") {
    return `[AsyncGeneratorFunction: ${name}]`;
  }
  return `[Function: ${name}]`;
}
function inspectDate(date, _options) {
  return `${date.toISOString()}`;
}
function inspectRegExp(regex, _options) {
  return regex.toString();
}
function inspectError(error, _options) {
  return `${error.name}: ${error.message}`;
}
function inspectMap(map, options, depth, seen) {
  if (map.size === 0) return "Map(0) {}";
  const items = [];
  let count = 0;
  for (const [key, value] of map) {
    if (count >= options.maxArrayLength) {
      items.push(`... ${map.size - count} more items`);
      break;
    }
    const keyStr = inspectValue(key, options, depth + 1, seen);
    const valueStr = inspectValue(value, options, depth + 1, seen);
    items.push(`${keyStr} => ${valueStr}`);
    count++;
  }
  return `Map(${map.size}) {${items.join(", ")}}`;
}
function inspectSet(set, options, depth, seen) {
  if (set.size === 0) return "Set(0) {}";
  const items = [];
  let count = 0;
  for (const value of set) {
    if (count >= options.maxArrayLength) {
      items.push(`... ${set.size - count} more items`);
      break;
    }
    items.push(inspectValue(value, options, depth + 1, seen));
    count++;
  }
  return `Set(${set.size}) {${items.join(", ")}}`;
}
function inspectPromise(_promise, _options) {
  return "Promise { <pending> }";
}
function inspectGeneric(value, type, _options) {
  if (value && typeof value === "object" && value.constructor) {
    return `${value.constructor.name} {}`;
  }
  return `[${type}]`;
}
function inspectType(value) {
  const detailed = getDetailedType(value);
  const parts = [];
  parts.push(`Type: ${detailed.type}`);
  if (detailed.constructor) {
    parts.push(`Constructor: ${detailed.constructor}`);
  }
  if (detailed.customType) {
    parts.push(`Custom Type: ${detailed.customType}`);
  }
  const flags = [];
  if (detailed.isPrimitive) flags.push("primitive");
  if (detailed.isBuiltIn) flags.push("built-in");
  if (detailed.isNullish) flags.push("nullish");
  if (detailed.isIterable) flags.push("iterable");
  if (detailed.isAsync) flags.push("async");
  if (flags.length > 0) {
    parts.push(`Flags: ${flags.join(", ")}`);
  }
  if (detailed.metadata) {
    const metadata = Object.entries(detailed.metadata).map(([key, value2]) => `${key}: ${value2}`).join(", ");
    parts.push(`Metadata: {${metadata}}`);
  }
  return parts.join("\n");
}

function isValidType(type) {
  const validTypes = /* @__PURE__ */ new Set([
    "undefined",
    "null",
    "boolean",
    "number",
    "string",
    "symbol",
    "bigint",
    "object",
    "array",
    "function",
    "date",
    "regexp",
    "error",
    "map",
    "set",
    "weakmap",
    "weakset",
    "int8array",
    "uint8array",
    "uint8clampedarray",
    "int16array",
    "uint16array",
    "int32array",
    "uint32array",
    "float32array",
    "float64array",
    "bigint64array",
    "biguint64array",
    "promise",
    "generatorfunction",
    "asyncfunction",
    "asyncgeneratorfunction",
    "proxy",
    "dataview",
    "arraybuffer",
    "sharedarraybuffer",
    "arguments",
    "buffer",
    "stream",
    "eventemitter",
    "element",
    "node",
    "window",
    "document",
    "global"
  ]);
  return validTypes.has(type);
}
function getTypeCategory(type) {
  if (["undefined", "null", "boolean", "number", "string", "symbol", "bigint"].includes(type)) {
    return "primitive";
  }
  if (["object", "array", "function", "date", "regexp", "error"].includes(type)) {
    return "object";
  }
  if (["map", "set", "weakmap", "weakset"].includes(type)) {
    return "collection";
  }
  if (type.includes("array") && type !== "array") {
    return "typedarray";
  }
  if (["promise", "generatorfunction", "asyncfunction", "asyncgeneratorfunction"].includes(type)) {
    return "modern";
  }
  if (["buffer", "stream", "eventemitter"].includes(type)) {
    return "node";
  }
  if (["element", "node", "window", "document"].includes(type)) {
    return "dom";
  }
  return "special";
}
function compareTypes(a, b) {
  return kindOfCore(a) === kindOfCore(b);
}
function isTypeOfAny(value, types) {
  const type = kindOfCore(value);
  return types.includes(type);
}
function isTypeOfAll(values, expectedType) {
  return values.every((value) => kindOfCore(value) === expectedType);
}
function groupByType(values) {
  const groups = /* @__PURE__ */ new Map();
  for (const value of values) {
    const type = kindOfCore(value);
    if (!groups.has(type)) {
      groups.set(type, []);
    }
    const group = groups.get(type);
    if (group) {
      group.push(value);
    }
  }
  return groups;
}
function getTypeStats(values) {
  const stats = {};
  for (const value of values) {
    const type = kindOfCore(value);
    stats[type] = (stats[type] || 0) + 1;
  }
  return stats;
}
function filterByType(values, type) {
  return values.filter((value) => kindOfCore(value) === type);
}
function findByType(values, type) {
  return values.find((value) => kindOfCore(value) === type);
}
function someOfType(values, type) {
  return values.some((value) => kindOfCore(value) === type);
}
function everyOfType(values, type) {
  return values.every((value) => kindOfCore(value) === type);
}
function noneOfType(values, type) {
  return !values.some((value) => kindOfCore(value) === type);
}
function countByType(values, type) {
  return values.filter((value) => kindOfCore(value) === type).length;
}
function getUniqueTypes(values) {
  const types = /* @__PURE__ */ new Set();
  for (const value of values) {
    types.add(kindOfCore(value));
  }
  return Array.from(types);
}
function createTypeMap(values) {
  return groupByType(values);
}
function getMostCommonType(values) {
  if (values.length === 0) return null;
  const stats = getTypeStats(values);
  let maxCount = 0;
  let mostCommon = null;
  for (const [type, count] of Object.entries(stats)) {
    if (count > maxCount) {
      maxCount = count;
      mostCommon = type;
    }
  }
  return mostCommon;
}
function getLeastCommonType(values) {
  if (values.length === 0) return null;
  const stats = getTypeStats(values);
  let minCount = Infinity;
  let leastCommon = null;
  for (const [type, count] of Object.entries(stats)) {
    if (count < minCount) {
      minCount = count;
      leastCommon = type;
    }
  }
  return leastCommon;
}
function isHomogeneous(values) {
  if (values.length === 0) return true;
  const firstType = kindOfCore(values[0]);
  return values.every((value) => kindOfCore(value) === firstType);
}
function isHeterogeneous(values) {
  return !isHomogeneous(values);
}
function partition(values, predicate) {
  const truthy = [];
  const falsy = [];
  for (const value of values) {
    if (predicate(value)) {
      truthy.push(value);
    } else {
      falsy.push(value);
    }
  }
  return [truthy, falsy];
}
function partitionByType(values, type) {
  return partition(values, (value) => kindOfCore(value) === type);
}

class KindOfExtended {
  constructor() {
    this.plugins = /* @__PURE__ */ new Map();
    this.customTypes = /* @__PURE__ */ new Map();
    this.typeOrder = [];
    const boundFunction = this.detect.bind(this);
    Object.setPrototypeOf(boundFunction, KindOfExtended.prototype);
    Object.assign(boundFunction, this);
    return boundFunction;
  }
  detect(value) {
    for (let i = this.typeOrder.length - 1; i >= 0; i--) {
      const typeName = this.typeOrder[i];
      if (!typeName) continue;
      const checker = this.customTypes.get(typeName);
      if (checker && checker(value)) {
        return typeName;
      }
    }
    return kindOfCore(value);
  }
  use(plugin, options = {}) {
    if (this.plugins.has(plugin.name)) {
      throw new Error(`Plugin "${plugin.name}" is already registered`);
    }
    this.plugins.set(plugin.name, plugin);
    const prefix = options.prefix || "";
    for (const [typeName, checker] of Object.entries(plugin.types)) {
      const fullTypeName = prefix + typeName;
      if (this.customTypes.has(fullTypeName) && !options.override) {
        throw new Error(`Type "${fullTypeName}" is already defined`);
      }
      this.customTypes.set(fullTypeName, checker);
      this.typeOrder.push(fullTypeName);
    }
    if (plugin.setup) {
      plugin.setup(this);
    }
    return this;
  }
  unuse(pluginName) {
    const plugin = this.plugins.get(pluginName);
    if (!plugin) {
      throw new Error(`Plugin "${pluginName}" is not registered`);
    }
    if (plugin.teardown) {
      plugin.teardown();
    }
    for (const typeName of Object.keys(plugin.types)) {
      this.customTypes.delete(typeName);
      const index = this.typeOrder.indexOf(typeName);
      if (index !== -1) {
        this.typeOrder.splice(index, 1);
      }
    }
    this.plugins.delete(pluginName);
    return this;
  }
  defineType(name, checker) {
    if (this.customTypes.has(name)) {
      throw new Error(`Type "${name}" is already defined`);
    }
    this.customTypes.set(name, checker);
    this.typeOrder.push(name);
    return this;
  }
  removeType(name) {
    if (!this.customTypes.has(name)) {
      throw new Error(`Type "${name}" is not defined`);
    }
    this.customTypes.delete(name);
    const index = this.typeOrder.indexOf(name);
    if (index !== -1) {
      this.typeOrder.splice(index, 1);
    }
    return this;
  }
  getCustomTypes() {
    return Object.fromEntries(this.customTypes);
  }
  hasType(name) {
    return this.customTypes.has(name);
  }
}
function createKindOfInstance() {
  return new KindOfExtended();
}
function createPlugin(config) {
  const plugin = {
    name: config.name,
    version: config.version,
    types: config.types
  };
  if (config.setup) {
    plugin.setup = config.setup;
  }
  if (config.teardown) {
    plugin.teardown = config.teardown;
  }
  return plugin;
}

const isReactElement = (value) => {
  return value !== null && typeof value === "object" && "$$typeof" in value && "type" in value && "props" in value;
};
const isReactComponent = (value) => {
  if (typeof value !== "function") return false;
  const fn = value;
  const prototype = fn.prototype;
  if (prototype && prototype.isReactComponent) {
    return true;
  }
  if (fn.name && /^[A-Z]/.test(fn.name)) {
    return true;
  }
  return false;
};
const isReactMemo = (value) => {
  return value !== null && typeof value === "object" && "$$typeof" in value && "type" in value && value.$$typeof?.toString?.() === "Symbol(react.memo)";
};
const isReactForwardRef = (value) => {
  return value !== null && typeof value === "object" && "$$typeof" in value && "render" in value && value.$$typeof?.toString?.() === "Symbol(react.forward_ref)";
};
const isReactLazy = (value) => {
  return value !== null && typeof value === "object" && "$$typeof" in value && "_payload" in value && "_init" in value && value.$$typeof?.toString?.() === "Symbol(react.lazy)";
};
const isReactContext = (value) => {
  return value !== null && typeof value === "object" && "$$typeof" in value && "_currentValue" in value && "Provider" in value && "Consumer" in value;
};
const isReactProvider = (value) => {
  return value !== null && typeof value === "object" && "$$typeof" in value && "_context" in value && value.$$typeof?.toString?.() === "Symbol(react.provider)";
};
const isReactConsumer = (value) => {
  return value !== null && typeof value === "object" && "$$typeof" in value && "_context" in value && value.$$typeof?.toString?.() === "Symbol(react.consumer)";
};
const isReactFragment = (value) => {
  return value !== null && typeof value === "object" && "$$typeof" in value && "type" in value && value.type?.toString?.() === "Symbol(react.fragment)";
};
const isReactPortal = (value) => {
  return value !== null && typeof value === "object" && "$$typeof" in value && "children" in value && "containerInfo" in value && value.$$typeof?.toString?.() === "Symbol(react.portal)";
};
const isReactSuspense = (value) => {
  return value !== null && typeof value === "object" && "$$typeof" in value && "type" in value && value.type?.toString?.() === "Symbol(react.suspense)";
};
const isReactProfiler = (value) => {
  return value !== null && typeof value === "object" && "$$typeof" in value && "type" in value && value.type?.toString?.() === "Symbol(react.profiler)";
};
const isReactStrictMode = (value) => {
  return value !== null && typeof value === "object" && "$$typeof" in value && "type" in value && value.type?.toString?.() === "Symbol(react.strict_mode)";
};
const reactPlugin = createPlugin({
  name: "react",
  version: "1.0.0",
  types: {
    "react.element": isReactElement,
    "react.component": isReactComponent,
    "react.memo": isReactMemo,
    "react.forwardref": isReactForwardRef,
    "react.lazy": isReactLazy,
    "react.context": isReactContext,
    "react.provider": isReactProvider,
    "react.consumer": isReactConsumer,
    "react.fragment": isReactFragment,
    "react.portal": isReactPortal,
    "react.suspense": isReactSuspense,
    "react.profiler": isReactProfiler,
    "react.strictmode": isReactStrictMode
  }
});

const isReadableStream = (value) => {
  return value !== null && typeof value === "object" && "readable" in value && "read" in value && typeof value.read === "function" && "_readableState" in value;
};
const isWritableStream = (value) => {
  return value !== null && typeof value === "object" && "writable" in value && "write" in value && typeof value.write === "function" && "_writableState" in value;
};
const isDuplexStream = (value) => {
  return isReadableStream(value) && isWritableStream(value);
};
const isTransformStream = (value) => {
  return isDuplexStream(value) && value !== null && typeof value === "object" && "_transform" in value && typeof value._transform === "function";
};
const isServer = (value) => {
  return value !== null && typeof value === "object" && "listen" in value && "close" in value && "address" in value && typeof value.listen === "function";
};
const isIncomingMessage = (value) => {
  return value !== null && typeof value === "object" && "headers" in value && "method" in value && "url" in value && isReadableStream(value);
};
const isServerResponse = (value) => {
  return value !== null && typeof value === "object" && "statusCode" in value && "setHeader" in value && "writeHead" in value && isWritableStream(value);
};
const isChildProcess = (value) => {
  return value !== null && typeof value === "object" && "pid" in value && "kill" in value && "stdin" in value && "stdout" in value && "stderr" in value && typeof value.kill === "function";
};
const isWorker = (value) => {
  return value !== null && typeof value === "object" && "threadId" in value && "postMessage" in value && "terminate" in value && typeof value.postMessage === "function";
};
const isMessagePort = (value) => {
  return value !== null && typeof value === "object" && "postMessage" in value && "start" in value && "close" in value && typeof value.postMessage === "function";
};
const isURL = (value) => {
  return value !== null && typeof value === "object" && "href" in value && "protocol" in value && "hostname" in value && "pathname" in value && "search" in value && "hash" in value && value.constructor?.name === "URL";
};
const isURLSearchParams = (value) => {
  return value !== null && typeof value === "object" && "append" in value && "get" in value && "set" in value && "delete" in value && typeof value.append === "function" && value.constructor?.name === "URLSearchParams";
};
const isTextEncoder = (value) => {
  return value !== null && typeof value === "object" && "encode" in value && typeof value.encode === "function" && value.constructor?.name === "TextEncoder";
};
const isTextDecoder = (value) => {
  return value !== null && typeof value === "object" && "decode" in value && typeof value.decode === "function" && value.constructor?.name === "TextDecoder";
};
const isAbortController = (value) => {
  return value !== null && typeof value === "object" && "signal" in value && "abort" in value && typeof value.abort === "function" && value.constructor?.name === "AbortController";
};
const isAbortSignal = (value) => {
  return value !== null && typeof value === "object" && "aborted" in value && typeof value.aborted === "boolean" && value.constructor?.name === "AbortSignal";
};
const isPerformanceObserver = (value) => {
  return value !== null && typeof value === "object" && "observe" in value && "disconnect" in value && typeof value.observe === "function" && value.constructor?.name === "PerformanceObserver";
};
const isPerformanceEntry = (value) => {
  return value !== null && typeof value === "object" && "name" in value && "entryType" in value && "startTime" in value && "duration" in value && value.constructor?.name?.includes("Performance");
};
const nodePlugin = createPlugin({
  name: "node",
  version: "1.0.0",
  types: {
    "node.readablestream": isReadableStream,
    "node.writablestream": isWritableStream,
    "node.duplexstream": isDuplexStream,
    "node.transformstream": isTransformStream,
    "node.server": isServer,
    "node.incomingmessage": isIncomingMessage,
    "node.serverresponse": isServerResponse,
    "node.childprocess": isChildProcess,
    "node.worker": isWorker,
    "node.messageport": isMessagePort,
    "node.url": isURL,
    "node.urlsearchparams": isURLSearchParams,
    "node.textencoder": isTextEncoder,
    "node.textdecoder": isTextDecoder,
    "node.abortcontroller": isAbortController,
    "node.abortsignal": isAbortSignal,
    "node.performanceobserver": isPerformanceObserver,
    "node.performanceentry": isPerformanceEntry
  }
});

function kindOf(value) {
  return kindOfCore(value);
}
const typeOf = kindOf;
const getType = kindOf;

exports.PerformanceMonitor = PerformanceMonitor;
exports.assertType = assertType;
exports.clearCache = clearCache;
exports.coerceType = coerceType;
exports.compareTypes = compareTypes;
exports.countByType = countByType;
exports.createKindOfInstance = createKindOfInstance;
exports.createPlugin = createPlugin;
exports.createTypeMap = createTypeMap;
exports.createValidator = createValidator;
exports.default = kindOf;
exports.disableCache = disableCache;
exports.enableCache = enableCache;
exports.ensureType = ensureType;
exports.everyOfType = everyOfType;
exports.fastKindOf = fastKindOf;
exports.filterByType = filterByType;
exports.findByType = findByType;
exports.getDetailedType = getDetailedType;
exports.getLeastCommonType = getLeastCommonType;
exports.getMostCommonType = getMostCommonType;
exports.getType = getType;
exports.getTypeCategory = getTypeCategory;
exports.getTypeStats = getTypeStats;
exports.getUniqueTypes = getUniqueTypes;
exports.groupByType = groupByType;
exports.hasLength = hasLength;
exports.hasSize = hasSize;
exports.inspect = inspect;
exports.inspectType = inspectType;
exports.isArguments = isArguments;
exports.isArray = isArray;
exports.isArrayBuffer = isArrayBuffer;
exports.isArrayLike = isArrayLike;
exports.isAsyncFunction = isAsyncFunction;
exports.isAsyncGenerator = isAsyncGenerator;
exports.isAsyncGeneratorFunction = isAsyncGeneratorFunction;
exports.isAsyncIterable = isAsyncIterable;
exports.isBigInt = isBigInt;
exports.isBigInt64Array = isBigInt64Array;
exports.isBigUint64Array = isBigUint64Array;
exports.isBoolean = isBoolean;
exports.isBuffer = isBuffer;
exports.isConstructor = isConstructor;
exports.isDataView = isDataView;
exports.isDate = isDate;
exports.isDocument = isDocument;
exports.isElement = isElement;
exports.isEmpty = isEmpty;
exports.isEmptyArray = isEmptyArray;
exports.isEmptyObject = isEmptyObject;
exports.isEmptyString = isEmptyString;
exports.isError = isError;
exports.isEvalError = isEvalError;
exports.isEventEmitter = isEventEmitter;
exports.isFalsy = isFalsy;
exports.isFinite = isFinite;
exports.isFloat32Array = isFloat32Array;
exports.isFloat64Array = isFloat64Array;
exports.isFunction = isFunction;
exports.isGenerator = isGenerator;
exports.isGeneratorFunction = isGeneratorFunction;
exports.isGlobal = isGlobal;
exports.isHeterogeneous = isHeterogeneous;
exports.isHomogeneous = isHomogeneous;
exports.isInfinity = isInfinity;
exports.isInt16Array = isInt16Array;
exports.isInt32Array = isInt32Array;
exports.isInt8Array = isInt8Array;
exports.isInteger = isInteger;
exports.isIterable = isIterable;
exports.isJsonString = isJsonString;
exports.isMap = isMap;
exports.isNaN = isNaN$1;
exports.isNode = isNode;
exports.isNull = isNull;
exports.isNullish = isNullish;
exports.isNumber = isNumber;
exports.isNumericString = isNumericString;
exports.isObject = isObject;
exports.isObservable = isObservable;
exports.isPlainObject = isPlainObject;
exports.isPrimitive = isPrimitive;
exports.isPromise = isPromise;
exports.isProxy = isProxy;
exports.isRangeError = isRangeError;
exports.isReferenceError = isReferenceError;
exports.isRegExp = isRegExp;
exports.isSafeInteger = isSafeInteger;
exports.isSet = isSet;
exports.isSharedArrayBuffer = isSharedArrayBuffer;
exports.isStream = isStream;
exports.isString = isString;
exports.isSymbol = isSymbol;
exports.isSyntaxError = isSyntaxError;
exports.isThenable = isThenable;
exports.isTruthy = isTruthy;
exports.isType = isType;
exports.isTypeError = isTypeError;
exports.isTypeOfAll = isTypeOfAll;
exports.isTypeOfAny = isTypeOfAny;
exports.isTypedArray = isTypedArray;
exports.isURIError = isURIError;
exports.isUint16Array = isUint16Array;
exports.isUint32Array = isUint32Array;
exports.isUint8Array = isUint8Array;
exports.isUint8ClampedArray = isUint8ClampedArray;
exports.isUndefined = isUndefined;
exports.isValidType = isValidType;
exports.isWeakMap = isWeakMap;
exports.isWeakSet = isWeakSet;
exports.isWindow = isWindow;
exports.kindOf = kindOf;
exports.kindOfMany = kindOfMany;
exports.nodePlugin = nodePlugin;
exports.noneOfType = noneOfType;
exports.partition = partition;
exports.partitionByType = partitionByType;
exports.performanceMonitor = performanceMonitor;
exports.reactPlugin = reactPlugin;
exports.someOfType = someOfType;
exports.toArray = toArray;
exports.toBigInt = toBigInt;
exports.toBoolean = toBoolean;
exports.toBuffer = toBuffer;
exports.toDate = toDate;
exports.toError = toError;
exports.toFunction = toFunction;
exports.toMap = toMap;
exports.toNumber = toNumber;
exports.toObject = toObject;
exports.toPromise = toPromise;
exports.toRegExp = toRegExp;
exports.toSet = toSet;
exports.toString = toString;
exports.toSymbol = toSymbol;
exports.toTypedArray = toTypedArray;
exports.typeOf = typeOf;
exports.validateSchema = validateSchema;
//# sourceMappingURL=index.cjs.map