@expressots/core
Version:
Expressots - modern, fast, lightweight nodejs web framework (@core)
133 lines (132 loc) • 4.82 kB
JavaScript
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Lookup = void 0;
const ERROR_MSGS = __importStar(require("../constants/error_msgs"));
const clonable_1 = require("../utils/clonable");
class Lookup {
constructor() {
this._map = new Map();
}
getMap() {
return this._map;
}
// adds a new entry to _map
add(serviceIdentifier, value) {
if (serviceIdentifier === null || serviceIdentifier === undefined) {
throw new Error(ERROR_MSGS.NULL_ARGUMENT);
}
if (value === null || value === undefined) {
throw new Error(ERROR_MSGS.NULL_ARGUMENT);
}
const entry = this._map.get(serviceIdentifier);
if (entry !== undefined) {
entry.push(value);
}
else {
this._map.set(serviceIdentifier, [value]);
}
}
// gets the value of a entry by its key (serviceIdentifier)
get(serviceIdentifier) {
if (serviceIdentifier === null || serviceIdentifier === undefined) {
throw new Error(ERROR_MSGS.NULL_ARGUMENT);
}
const entry = this._map.get(serviceIdentifier);
if (entry !== undefined) {
return entry;
}
else {
throw new Error(ERROR_MSGS.KEY_NOT_FOUND);
}
}
// removes a entry from _map by its key (serviceIdentifier)
remove(serviceIdentifier) {
if (serviceIdentifier === null || serviceIdentifier === undefined) {
throw new Error(ERROR_MSGS.NULL_ARGUMENT);
}
if (!this._map.delete(serviceIdentifier)) {
throw new Error(ERROR_MSGS.KEY_NOT_FOUND);
}
}
removeIntersection(lookup) {
this.traverse((serviceIdentifier, value) => {
const lookupActivations = lookup.hasKey(serviceIdentifier)
? lookup.get(serviceIdentifier)
: undefined;
if (lookupActivations !== undefined) {
const filteredValues = value.filter((lookupValue) => !lookupActivations.some((moduleActivation) => lookupValue === moduleActivation));
this._setValue(serviceIdentifier, filteredValues);
}
});
}
removeByCondition(condition) {
const removals = [];
this._map.forEach((entries, key) => {
const updatedEntries = [];
for (const entry of entries) {
const remove = condition(entry);
if (remove) {
removals.push(entry);
}
else {
updatedEntries.push(entry);
}
}
this._setValue(key, updatedEntries);
});
return removals;
}
// returns true if _map contains a key (serviceIdentifier)
hasKey(serviceIdentifier) {
if (serviceIdentifier === null || serviceIdentifier === undefined) {
throw new Error(ERROR_MSGS.NULL_ARGUMENT);
}
return this._map.has(serviceIdentifier);
}
// returns a new Lookup instance; note: this is not a deep clone, only Lookup related data structure (dictionary) is
// cloned, content remains the same
clone() {
const copy = new Lookup();
this._map.forEach((value, key) => {
value.forEach((b) => copy.add(key, (0, clonable_1.isClonable)(b) ? b.clone() : b));
});
return copy;
}
traverse(func) {
this._map.forEach((value, key) => {
func(key, value);
});
}
_setValue(serviceIdentifier, value) {
if (value.length > 0) {
this._map.set(serviceIdentifier, value);
}
else {
this._map.delete(serviceIdentifier);
}
}
}
exports.Lookup = Lookup;
;