UNPKG

@opra/common

Version:
74 lines (73 loc) 2.25 kB
var _a, _b; 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 { constructor() { this[_a] = new ResponsiveMap(); this[_b] = 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') return out.ctor === nameOrCtor ? out : undefined; 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; } [(_a = kMap, _b = kCtorMap, Symbol.iterator)]() { return this[kMap][Symbol.iterator](); } }