@oxog/kindof
Version:
Zero-dependency advanced type detection library with TypeScript support, plugin system, and 100% test coverage
1 lines • 32.5 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../../src/core/constants.ts","../../src/core/native-types.ts","../../src/core/modern-types.ts","../../src/core/kind-of.ts","../../src/validators/schema.ts"],"sourcesContent":["export const PRIMITIVE_TYPES = [\n 'undefined',\n 'null',\n 'boolean',\n 'number',\n 'string',\n 'symbol',\n 'bigint',\n] as const;\n\nexport const OBJECT_TYPES = [\n 'object',\n 'array',\n 'function',\n 'date',\n 'regexp',\n 'error',\n] as const;\n\nexport const COLLECTION_TYPES = [\n 'map',\n 'set',\n 'weakmap',\n 'weakset',\n] as const;\n\nexport const TYPED_ARRAY_TYPES = [\n 'int8array',\n 'uint8array',\n 'uint8clampedarray',\n 'int16array',\n 'uint16array',\n 'int32array',\n 'uint32array',\n 'float32array',\n 'float64array',\n 'bigint64array',\n 'biguint64array',\n] as const;\n\nexport const MODERN_TYPES = [\n 'promise',\n 'generatorfunction',\n 'asyncfunction',\n 'asyncgeneratorfunction',\n 'proxy',\n 'dataview',\n 'arraybuffer',\n 'sharedarraybuffer',\n] as const;\n\nexport const NODE_TYPES = [\n 'buffer',\n 'stream',\n 'eventemitter',\n] as const;\n\nexport const DOM_TYPES = [\n 'element',\n 'node',\n 'window',\n 'document',\n] as const;\n\nexport const SPECIAL_TYPES = [\n 'arguments',\n 'global',\n] as const;\n\nexport const ALL_TYPES = [\n ...PRIMITIVE_TYPES,\n ...OBJECT_TYPES,\n ...COLLECTION_TYPES,\n ...TYPED_ARRAY_TYPES,\n ...MODERN_TYPES,\n ...NODE_TYPES,\n ...DOM_TYPES,\n ...SPECIAL_TYPES,\n] as const;\n\nexport type PrimitiveType = typeof PRIMITIVE_TYPES[number];\nexport type ObjectType = typeof OBJECT_TYPES[number];\nexport type CollectionType = typeof COLLECTION_TYPES[number];\nexport type TypedArrayType = typeof TYPED_ARRAY_TYPES[number];\nexport type ModernType = typeof MODERN_TYPES[number];\nexport type NodeType = typeof NODE_TYPES[number];\nexport type DOMType = typeof DOM_TYPES[number];\nexport type SpecialType = typeof SPECIAL_TYPES[number];\nexport type TypeName = typeof ALL_TYPES[number];\n\nexport const TYPE_TAG_MAP: Record<string, TypeName> = {\n '[object Arguments]': 'arguments',\n '[object Array]': 'array',\n '[object ArrayBuffer]': 'arraybuffer',\n '[object AsyncFunction]': 'asyncfunction',\n '[object AsyncGeneratorFunction]': 'asyncgeneratorfunction',\n '[object BigInt]': 'bigint',\n '[object BigInt64Array]': 'bigint64array',\n '[object BigUint64Array]': 'biguint64array',\n '[object Boolean]': 'boolean',\n '[object DataView]': 'dataview',\n '[object Date]': 'date',\n '[object Error]': 'error',\n '[object Float32Array]': 'float32array',\n '[object Float64Array]': 'float64array',\n '[object Function]': 'function',\n '[object GeneratorFunction]': 'generatorfunction',\n '[object Int8Array]': 'int8array',\n '[object Int16Array]': 'int16array',\n '[object Int32Array]': 'int32array',\n '[object Map]': 'map',\n '[object Number]': 'number',\n '[object Object]': 'object',\n '[object Promise]': 'promise',\n '[object Proxy]': 'proxy',\n '[object RegExp]': 'regexp',\n '[object Set]': 'set',\n '[object SharedArrayBuffer]': 'sharedarraybuffer',\n '[object String]': 'string',\n '[object Symbol]': 'symbol',\n '[object Uint8Array]': 'uint8array',\n '[object Uint8ClampedArray]': 'uint8clampedarray',\n '[object Uint16Array]': 'uint16array',\n '[object Uint32Array]': 'uint32array',\n '[object WeakMap]': 'weakmap',\n '[object WeakSet]': 'weakset',\n '[object Window]': 'window',\n '[object HTMLDocument]': 'document',\n '[object Document]': 'document',\n '[object Null]': 'null',\n '[object Undefined]': 'undefined',\n};","import type { TypeName } from './constants';\nimport { TYPE_TAG_MAP } from './constants';\n\nconst toString = Object.prototype.toString;\nconst toStringTag = Symbol.toStringTag;\n\nexport function getNativeType(value: unknown): TypeName | null {\n if (value === undefined) return 'undefined';\n if (value === null) return 'null';\n\n const primitiveType = typeof value;\n \n switch (primitiveType) {\n case 'boolean': return 'boolean';\n case 'number': return 'number';\n case 'string': return 'string';\n case 'symbol': return 'symbol';\n case 'bigint': return 'bigint';\n case 'function': return getFunctionType(value as (...args: any[]) => any);\n case 'object': return getObjectType(value as object);\n default: return null;\n }\n}\n\nfunction getFunctionType(fn: (...args: any[]) => any): TypeName {\n const fnString = fn.toString();\n \n if (/^class\\s/.test(fnString)) {\n return 'function';\n }\n \n if (/^async\\s*function\\s*\\*/.test(fnString) || /^async\\s*\\*/.test(fnString)) {\n return 'asyncgeneratorfunction';\n }\n \n if (/^async\\s/.test(fnString)) {\n return 'asyncfunction';\n }\n \n if (/^function\\s*\\*/.test(fnString) || /^\\*/.test(fnString)) {\n return 'generatorfunction';\n }\n \n const ctorName = fn.constructor?.name;\n if (ctorName === 'AsyncFunction') return 'asyncfunction';\n if (ctorName === 'GeneratorFunction') return 'generatorfunction';\n if (ctorName === 'AsyncGeneratorFunction') return 'asyncgeneratorfunction';\n \n return 'function';\n}\n\nfunction getObjectType(obj: object): TypeName {\n const tag = toString.call(obj);\n const mappedType = TYPE_TAG_MAP[tag];\n \n if (mappedType) {\n return mappedType;\n }\n \n // Check for special types first, before processing [object Object]\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer && Buffer.isBuffer(obj)) {\n return 'buffer';\n }\n \n if (typeof obj === 'object' && 'callee' in obj && typeof obj.callee === 'function') {\n return 'arguments';\n }\n \n if (isStream(obj)) {\n return 'stream';\n }\n \n if (isEventEmitter(obj)) {\n return 'eventemitter';\n }\n \n if (tag === '[object Object]') {\n const customTag = (obj as any)[toStringTag];\n if (typeof customTag === 'string') {\n return customTag.toLowerCase() as TypeName;\n }\n \n const ctor = obj.constructor;\n if (ctor && ctor !== Object) {\n const ctorName = ctor.name;\n if (ctorName && ctorName !== 'Object') {\n return ctorName.toLowerCase() as TypeName;\n }\n }\n // Don't return 'object' here - continue to check for other types\n }\n \n if (isDOMElement(obj)) {\n return 'element';\n }\n \n if (isDOMNode(obj)) {\n return 'node';\n }\n \n if (isGlobal(obj)) {\n return 'global';\n }\n \n return 'object';\n}\n\nfunction isStream(obj: any): boolean {\n return obj !== null &&\n typeof obj === 'object' &&\n typeof obj.pipe === 'function';\n}\n\nfunction isEventEmitter(obj: any): boolean {\n return obj !== null &&\n typeof obj === 'object' &&\n typeof obj.on === 'function' &&\n typeof obj.emit === 'function' &&\n typeof obj.removeListener === 'function';\n}\n\nfunction isDOMElement(obj: any): boolean {\n if (typeof HTMLElement === 'undefined') return false;\n return obj instanceof HTMLElement;\n}\n\nfunction isDOMNode(obj: any): boolean {\n if (typeof Node === 'undefined') return false;\n return obj instanceof Node;\n}\n\nfunction isGlobal(obj: any): boolean {\n if (typeof globalThis !== 'undefined' && obj === globalThis) return true;\n if (typeof global !== 'undefined' && obj === global) return true;\n if (typeof window !== 'undefined' && obj === window) return true;\n if (typeof self !== 'undefined' && obj === self) return true;\n return false;\n}","import type { TypeName } from './constants';\n\nconst WeakMapPrototype = WeakMap.prototype;\nconst WeakSetPrototype = WeakSet.prototype;\nconst MapPrototype = Map.prototype;\nconst SetPrototype = Set.prototype;\nconst ArrayBufferPrototype = ArrayBuffer.prototype;\nconst DataViewPrototype = DataView.prototype;\nconst SharedArrayBufferPrototype = typeof SharedArrayBuffer !== 'undefined' ? SharedArrayBuffer.prototype : null;\n\nexport function checkModernType(value: unknown): TypeName | null {\n if (value === null || value === undefined) {\n return null;\n }\n\n try {\n if (value instanceof Promise || isThenable(value)) {\n return 'promise';\n }\n\n if (value instanceof Map || (value as any).__proto__ === MapPrototype) {\n return 'map';\n }\n\n if (value instanceof Set || (value as any).__proto__ === SetPrototype) {\n return 'set';\n }\n\n if (value instanceof WeakMap || (value as any).__proto__ === WeakMapPrototype) {\n return 'weakmap';\n }\n\n if (value instanceof WeakSet || (value as any).__proto__ === WeakSetPrototype) {\n return 'weakset';\n }\n\n if (value instanceof ArrayBuffer || (value as any).__proto__ === ArrayBufferPrototype) {\n return 'arraybuffer';\n }\n\n if (SharedArrayBufferPrototype && (value instanceof SharedArrayBuffer || (value as any).__proto__ === SharedArrayBufferPrototype)) {\n return 'sharedarraybuffer';\n }\n\n if (value instanceof DataView || (value as any).__proto__ === DataViewPrototype) {\n return 'dataview';\n }\n\n if (isProxy(value)) {\n return 'proxy';\n }\n } catch {\n // Cross-realm objects might throw\n }\n\n return null;\n}\n\nfunction isThenable(value: any): boolean {\n return value !== null &&\n (typeof value === 'object' || typeof value === 'function') &&\n typeof value.then === 'function';\n}\n\nfunction isProxy(value: any): boolean {\n try {\n // Proxies are detected by checking if they trigger proxy traps\n // when used with certain operations\n if (typeof value !== 'object' && typeof value !== 'function') {\n return false;\n }\n\n // Try to create a proxy with the value as handler\n // If it's already a proxy, this might throw or behave differently\n new Proxy({}, value as ProxyHandler<any>);\n \n // Additional check: see if common proxy behaviors are present\n // This is a heuristic and might not catch all proxies\n const descriptor = Object.getOwnPropertyDescriptor(value, Symbol.toStringTag);\n if (descriptor && !descriptor.configurable && descriptor.value === 'Proxy') {\n return true;\n }\n\n return false;\n } catch {\n // Some proxy operations might throw\n return false;\n }\n}\n\nexport function getTypedArrayType(value: any): TypeName | null {\n if (!ArrayBuffer.isView(value)) {\n return null;\n }\n\n const proto = Object.getPrototypeOf(value);\n const ctorName = proto?.constructor?.name;\n\n switch (ctorName) {\n case 'Int8Array': return 'int8array';\n case 'Uint8Array': return 'uint8array';\n case 'Uint8ClampedArray': return 'uint8clampedarray';\n case 'Int16Array': return 'int16array';\n case 'Uint16Array': return 'uint16array';\n case 'Int32Array': return 'int32array';\n case 'Uint32Array': return 'uint32array';\n case 'Float32Array': return 'float32array';\n case 'Float64Array': return 'float64array';\n case 'BigInt64Array': return 'bigint64array';\n case 'BigUint64Array': return 'biguint64array';\n default: return null;\n }\n}","import type { TypeName } from './constants';\nexport type { TypeName } from './constants';\nimport { getNativeType } from './native-types';\nimport { checkModernType, getTypedArrayType } from './modern-types';\n\n\nexport interface DetailedType {\n type: string;\n constructor: string | null;\n prototype: string | null;\n isPrimitive: boolean;\n isBuiltIn: boolean;\n isNullish: boolean;\n isIterable: boolean;\n isAsync: boolean;\n customType: string | null;\n metadata?: Record<string, any> | undefined;\n}\n\nlet typeCache: WeakMap<object, string> | null = null;\nlet cacheEnabled = true;\n\nexport function kindOfCore(value: unknown): string {\n if (value === undefined) return 'undefined';\n if (value === null) return 'null';\n\n const primitiveType = getPrimitiveType(value);\n if (primitiveType) return primitiveType;\n\n if (typeof value === 'object' && cacheEnabled && typeCache) {\n const cached = typeCache.get(value);\n if (cached) return cached;\n }\n\n let type = getNativeType(value);\n \n if (!type || type === 'object') {\n const modernType = checkModernType(value);\n if (modernType) {\n type = modernType;\n } else {\n const arrayType = getTypedArrayType(value);\n if (arrayType) {\n type = arrayType;\n } else {\n type = getCustomType(value) || type || ('object' as TypeName);\n }\n }\n }\n\n if (typeof value === 'object' && cacheEnabled && type) {\n if (!typeCache) typeCache = new WeakMap();\n typeCache.set(value, type);\n }\n\n return type || 'object';\n}\n\nexport function fastKindOf(value: unknown): string {\n if (value === undefined) return 'undefined';\n if (value === null) return 'null';\n\n const primitiveType = typeof value;\n if (primitiveType !== 'object' && primitiveType !== 'function') {\n return primitiveType;\n }\n\n if (Array.isArray(value)) return 'array';\n if (value instanceof Date) return 'date';\n if (value instanceof RegExp) return 'regexp';\n if (value instanceof Error) return 'error';\n\n return 'object';\n}\n\nexport function kindOfMany(values: unknown[]): string[] {\n const results: string[] = new Array(values.length);\n for (let i = 0; i < values.length; i++) {\n results[i] = kindOfCore(values[i]);\n }\n return results;\n}\n\nexport function getDetailedType(value: unknown): DetailedType {\n const type = kindOfCore(value);\n const isPrimitive = value === null || (typeof value !== 'object' && typeof value !== 'function');\n \n let constructor: string | null = null;\n let prototype: string | null = null;\n let isIterable = false;\n let isAsync = false;\n let customType: string | null = null;\n const metadata: Record<string, any> = {};\n\n if (!isPrimitive && value !== null) {\n const obj = value as any;\n \n if (obj.constructor) {\n constructor = obj.constructor.name || null;\n }\n \n const proto = Object.getPrototypeOf(obj);\n if (proto && proto.constructor) {\n prototype = proto.constructor.name || null;\n }\n \n isIterable = typeof obj[Symbol.iterator] === 'function';\n isAsync = typeof obj[Symbol.asyncIterator] === 'function' || \n type === 'promise' || \n type === 'asyncfunction' || \n type === 'asyncgeneratorfunction';\n \n if (obj[Symbol.toStringTag]) {\n customType = String(obj[Symbol.toStringTag]);\n }\n \n if (type === 'array') {\n metadata['length'] = (obj).length;\n } else if (type === 'map' || type === 'set') {\n metadata['size'] = (obj).size;\n } else if (type === 'arraybuffer' || type === 'sharedarraybuffer') {\n metadata['byteLength'] = (obj).byteLength;\n } else if (type.includes('array') && (obj).buffer) {\n metadata['byteLength'] = (obj).byteLength;\n metadata['length'] = (obj).length;\n }\n }\n\n return {\n type,\n constructor,\n prototype,\n isPrimitive,\n isBuiltIn: isBuiltInType(type),\n isNullish: value === null || value === undefined,\n isIterable,\n isAsync,\n customType,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n };\n}\n\nfunction getPrimitiveType(value: unknown): string | null {\n const type = typeof value;\n switch (type) {\n case 'boolean':\n case 'number':\n case 'string':\n case 'symbol':\n case 'bigint':\n return type;\n default:\n return null;\n }\n}\n\nfunction getCustomType(value: any): TypeName | null {\n try {\n const toStringTag = value[Symbol.toStringTag];\n if (typeof toStringTag === 'string') {\n return toStringTag.toLowerCase() as TypeName;\n }\n\n if (value.constructor && value.constructor !== Object) {\n const ctorName = value.constructor.name;\n if (ctorName && ctorName !== 'Object') {\n return ctorName.toLowerCase() as TypeName;\n }\n }\n } catch {\n // Ignore errors from accessing properties\n }\n\n return null;\n}\n\nfunction isBuiltInType(type: string): boolean {\n const builtInTypes = new Set([\n 'undefined', 'null', 'boolean', 'number', 'string', 'symbol', 'bigint',\n 'object', 'array', 'function', 'date', 'regexp', 'error',\n 'map', 'set', 'weakmap', 'weakset',\n 'int8array', 'uint8array', 'uint8clampedarray', 'int16array', 'uint16array',\n 'int32array', 'uint32array', 'float32array', 'float64array',\n 'bigint64array', 'biguint64array',\n 'promise', 'generatorfunction', 'asyncfunction', 'asyncgeneratorfunction',\n 'proxy', 'dataview', 'arraybuffer', 'sharedarraybuffer',\n 'arguments'\n ]);\n \n return builtInTypes.has(type);\n}\n\nexport function enableCache(): void {\n cacheEnabled = true;\n if (!typeCache) typeCache = new WeakMap();\n}\n\nexport function disableCache(): void {\n cacheEnabled = false;\n typeCache = null;\n}\n\nexport function clearCache(): void {\n if (typeCache) {\n typeCache = new WeakMap();\n }\n}","import { kindOfCore } from '../core/kind-of';\nimport type { ValidationResult, ValidationError, ValidationOptions, SchemaType } from '../types/schema';\n\nexport function validateSchema(\n value: unknown,\n schema: SchemaType,\n options: ValidationOptions = {}\n): ValidationResult {\n const errors: ValidationError[] = [];\n const context = {\n path: options.path || '',\n strict: options.strict ?? true,\n coerce: options.coerce ?? false,\n partial: options.partial ?? false,\n };\n\n validateValue(value, schema, context, errors);\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\nfunction validateValue(\n value: unknown,\n schema: SchemaType,\n context: { path: string; strict: boolean; coerce: boolean; partial: boolean },\n errors: ValidationError[]\n): void {\n if (typeof schema === 'string') {\n // Simple type check\n const actualType = kindOfCore(value);\n if (actualType !== schema) {\n errors.push({\n path: context.path || 'root',\n expected: schema,\n actual: actualType,\n message: `Expected type \"${schema}\" but got \"${actualType}\"`,\n });\n }\n } else if (Array.isArray(schema)) {\n // Array schema\n if (!Array.isArray(value)) {\n errors.push({\n path: context.path || 'root',\n expected: 'array',\n actual: kindOfCore(value),\n message: `Expected array but got \"${kindOfCore(value)}\"`,\n });\n return;\n }\n\n const itemSchema = schema[0];\n if (itemSchema) {\n value.forEach((item, index) => {\n validateValue(\n item,\n itemSchema,\n { ...context, path: `${context.path}[${index}]` },\n errors\n );\n });\n }\n } else if (schema && typeof schema === 'object') {\n // Object schema\n if (typeof value !== 'object' || value === null) {\n errors.push({\n path: context.path || 'root',\n expected: 'object',\n actual: kindOfCore(value),\n message: `Expected object but got \"${kindOfCore(value)}\"`,\n });\n return;\n }\n\n const obj = value as Record<string, unknown>;\n const schemaObj = schema;\n\n // Check required properties\n if (!context.partial) {\n for (const key of Object.keys(schemaObj)) {\n if (!(key in obj)) {\n errors.push({\n path: context.path ? `${context.path}.${key}` : key,\n expected: typeof schemaObj[key] === 'string' ? schemaObj[key] : kindOfCore(schemaObj[key]),\n actual: 'undefined',\n message: `Missing required property \"${key}\"`,\n });\n }\n }\n }\n\n // Validate present properties\n for (const key of Object.keys(obj)) {\n if (key in schemaObj) {\n const schemaValue = schemaObj[key];\n if (schemaValue !== undefined) {\n validateValue(\n obj[key],\n schemaValue,\n { ...context, path: context.path ? `${context.path}.${key}` : key },\n errors\n );\n }\n } else if (context.strict) {\n errors.push({\n path: context.path ? `${context.path}.${key}` : key,\n expected: 'undefined',\n actual: kindOfCore(obj[key]),\n message: `Unexpected property \"${key}\"`,\n });\n }\n }\n }\n}\n\nexport function createValidator(\n schema: SchemaType,\n options?: ValidationOptions\n): (value: unknown) => ValidationResult {\n return (value: unknown) => validateSchema(value, schema, options);\n}"],"names":[],"mappings":"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"}