@opra/common
Version:
Opra common package
78 lines (77 loc) • 2.44 kB
JavaScript
"use strict";
var _a, _b;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DataTypeMap = void 0;
const index_js_1 = require("../../helpers/index.js");
const constants_js_1 = require("../constants.js");
const data_type_js_1 = require("../data-type/data-type.js");
const kMap = Symbol.for('kMap');
const kCtorMap = Symbol.for('kCtorMap');
/**
* @class DataTypeMap
*/
class DataTypeMap {
constructor() {
this[_a] = new index_js_1.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(constants_js_1.DATATYPE_METADATA, nameOrCtor);
name = metadata?.name;
}
if (!name && typeof nameOrCtor === 'object') {
const metadata = nameOrCtor[constants_js_1.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 data_type_js_1.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]();
}
}
exports.DataTypeMap = DataTypeMap;