UNPKG

skema

Version:

Skema provides a handy & composable way to validate / transform / purify the input data.

74 lines (56 loc) 1.63 kB
// Something that has compatible problem for browsers // TODO: #6 import {error} from './error' import {isObject, isString} from './util' // import symbol from 'symbol-for' const getTypeName = name => isObject(name) ? name.name || name : name // TODO: #6 supports browsers or fallback export class Types { constructor () { // Use WeakMap so that it could be GCed this._map = new WeakMap this._hash = Object.create(null) } get (name, strict) { const value = isObject(name) ? this._map.get(name) : this._hash[name] if (strict && !value) { throw error('UNKNOWN_TYPE', getTypeName(name)) } return value } set (alias, skema) { if (isObject(alias)) { return this._setMap(alias, skema) } if (isString(alias)) { return this._setHash(alias, skema) } } _setMap (name, skema) { if (this._map.has(name)) { return this._redefine(name) } this._map.set(name, skema) } _redefine (name) { throw error('REDECLARE_TYPE', getTypeName(name)) } _setHash (name, skema) { if (name in this._hash) { return this._redefine(name) } this._hash[name] = skema } } // TODO: #6 supports browsers or fallback export const symbol = Symbol export const TYPE_SKEMA = symbol.for('skema') export const isSkema = subject => !!subject && subject[TYPE_SKEMA] === true export const TYPE_ERROR = symbol.for('skema:error') export const isError = subject => !!subject && subject[TYPE_ERROR] export const SHAPE = symbol.for('skema:shape') export const CUSTOM_INSPECT_SYMBOL = symbol.for('nodejs.util.inspect.custom')