UNPKG

@opra/common

Version:
74 lines (73 loc) 2.28 kB
import { ResponsiveMap } from '../../helpers/index.js'; import { DATATYPE_METADATA } from '../constants.js'; import { DataType } from '../data-type/data-type.js'; const kMap = Symbol.for('kMap'); const kCtorMap = Symbol.for('kCtorMap'); /** * @class DataTypeMap */ export class DataTypeMap { [kMap] = new ResponsiveMap(); [kCtorMap] = new WeakMap(); get size() { return this[kMap].size; } forEach(callbackFn, thisArg) { this[kMap].forEach(callbackFn, thisArg); } get(nameOrCtor) { let name = typeof nameOrCtor === 'string' ? nameOrCtor : this[kCtorMap].get(nameOrCtor); if (!name && typeof nameOrCtor === 'function') { const metadata = Reflect.getMetadata(DATATYPE_METADATA, nameOrCtor); name = metadata?.name; } if (!name && typeof nameOrCtor === 'object') { const metadata = nameOrCtor[DATATYPE_METADATA]; name = metadata?.name; } if (!name) return; const out = this[kMap].get(name); if (!out) return; if (typeof nameOrCtor === 'function' && out.kind === 'ComplexType' && out.ctor !== nameOrCtor) { throw new TypeError(`An other data type with same class (${nameOrCtor.name}) already exists.`); } return out; } set(name, dataType) { this[kMap].set(name, dataType); if (dataType.ctor) this[kCtorMap].set(dataType.ctor, name); else if (dataType.instance) this[kCtorMap].set(dataType.instance, name); } has(nameOrCtor) { if (nameOrCtor instanceof DataType) return !!nameOrCtor.name && this[kMap].has(nameOrCtor.name); const name = typeof nameOrCtor === 'string' ? nameOrCtor : this[kCtorMap].get(nameOrCtor); return name ? this[kMap].has(name) : false; } keys() { return this[kMap].keys(); } values() { return this[kMap].values(); } entries() { return this[kMap].entries(); } sort(compareFn) { this[kMap].sort(compareFn); return this; } [Symbol.iterator]() { return this[kMap][Symbol.iterator](); } }