lakutata
Version:
An IoC-based universal application framework.
393 lines (324 loc) • 10 kB
JavaScript
;
Object.defineProperty(exports, Symbol.toStringTag, {
value: "Module"
});
const e = require("util");
const r = require("./Errors.cjs");
const t = require("./InjectionMode.cjs");
const n = require("./Lifetime.cjs");
const i = require("./ListModules.cjs");
const s = require("./LoadModules.cjs");
const o = require("./Resolvers.cjs");
const c = require("./Utils.cjs");
const a = require("../base/internal/ObjectLifetime.cjs");
const u = require("../helpers/As.cjs");
const l = require("../base/internal/ObjectWeakRefs.cjs");
require("../../exceptions/di/DependencyInjectionException.cjs");
require("../base/abstracts/Exception.cjs");
require("../base/internal/BasicInfo.cjs");
require("../../../vendor/Package.6.cjs");
require("../../../vendor/Package.5.cjs");
require("../../../vendor/Package.7.cjs");
require("../base/internal/ThrowWarning.cjs");
require("../helpers/Templating.cjs");
require("../base/internal/CamelCase.cjs");
require("../helpers/NoCase.cjs");
require("../base/internal/ConstructorSymbol.cjs");
require("../../constants/DIMetadataKey.cjs");
require("../../../vendor/Package.4.cjs");
require("node:crypto");
require("../../../vendor/Package.2.cjs");
require("../../../vendor/Package.1.cjs");
require("../base/internal/DataValidator.cjs");
require("node:util/types");
require("../validation/VLD.cjs");
require("../../../vendor/Package.11.cjs");
require("url");
require("../../../vendor/Package.10.cjs");
require("../../exceptions/dto/InvalidValueException.cjs");
require("../../../vendor/Package.9.cjs");
require("../helpers/IsHtml.cjs");
require("../helpers/IsXML.cjs");
require("../../constants/DTOMetadataKey.cjs");
require("../helpers/ObjectConstructor.cjs");
require("../helpers/ObjectParentConstructors.cjs");
require("../helpers/ObjectParentConstructor.cjs");
require("../helpers/ObjectPrototype.cjs");
require("../../../vendor/Package.8.cjs");
require("os");
require("path");
require("stream");
require("events");
require("fs");
require("./ParamParser.cjs");
require("./FunctionTokenizer.cjs");
require("../../exceptions/di/LifetimeLockedException.cjs");
function f(e) {
if (e && e.__esModule) return e;
const r = Object.create(null, {
[Symbol.toStringTag]: {
value: "Module"
}
});
if (e) {
for (const t in e) {
if (t !== "default") {
const n = Object.getOwnPropertyDescriptor(e, t);
Object.defineProperty(r, t, n.get ? n : {
enumerable: true,
get: () => e[t]
});
}
}
}
r.default = e;
return Object.freeze(r);
}
const d = f(e);
function j(e) {
return import(e);
}
const p = Symbol("familyTree");
const q = Symbol("rollUpRegistrations");
const g = "DependencyInjectionContainerCradle";
function m(e = {}) {
return b(e);
}
function b(e, f, y) {
e = {
injectionMode: t.InjectionMode.PROXY,
strict: false,
...e
};
const h = y ?? [];
const v = {};
const O = new Proxy({
[d.inspect.custom]: D
}, {
get: (e, r) => C(r),
set: (e, r) => {
throw new Error(`Attempted setting property "${r}" on container cradle - this is not allowed.`);
},
ownKeys() {
return Array.from(O);
},
getOwnPropertyDescriptor(e, r) {
const t = S();
if (Object.getOwnPropertyDescriptor(t, r)) {
return {
enumerable: true,
configurable: true
};
}
return undefined;
}
});
const P = {
options: e,
cradle: O,
inspect: L,
cache: new Map,
loadModules: x,
createScope: E,
register: T,
build: R,
resolve: C,
hasRegistration: N,
dispose: A,
getRegistration: M,
[d.inspect.custom]: L,
[q]: S,
get registrations() {
return S();
}
};
const w = f ? [ P ].concat(u.As(f)[p]) : [ P ];
P[p] = w;
const I = c.last(w);
return P;
function L() {
return `[DependencyInjectionContainer (${f ? "scoped, " : ""}registrations: ${Object.keys(P.registrations).length})]`;
}
function S() {
return {
...f && f[q](),
...v
};
}
function* k() {
const e = S();
for (const r in e) {
yield r;
}
}
function E() {
return b(e, P, h);
}
function T(t, i) {
const s = c.nameValueToObject(t, i);
const o = [ ...Object.keys(s), ...Object.getOwnPropertySymbols(s) ];
for (const t of o) {
const i = s[t];
if (e.strict && i.lifetime === n.Lifetime.SINGLETON) {
if (f) {
throw new r.DependencyInjectionRegistrationError(t, "Cannot register a singleton on a scoped container.");
}
}
v[t] = i;
}
return P;
}
function D() {
return Object.prototype.toString.call(O);
}
function M(e) {
const r = v[e];
if (r) {
return r;
}
if (f) {
return f.getRegistration(e);
}
return null;
}
function C(t, i) {
i = i || {};
try {
const s = M(t);
if (h.some((({name: e}) => e === t))) {
throw new r.DependencyInjectionResolutionError(t, h, "Cyclic dependencies detected.");
}
if (t === "toJSON") {
return D;
}
if (t === "constructor") {
return m;
}
if (!s) {
switch (t) {
case d.inspect.custom:
case "inspect":
case "toString":
return D;
case Symbol.toStringTag:
return g;
case "then":
return undefined;
case Symbol.iterator:
return k;
}
if (i.allowUnregistered) {
return undefined;
}
throw new r.DependencyInjectionResolutionError(t, h);
}
const o = s.lifetime || n.Lifetime.TRANSIENT;
if (e.strict && !s.isLeakSafe) {
const e = h.findIndex((({lifetime: e}) => n.isLifetimeLonger(e, o)));
if (e > -1) {
throw new r.DependencyInjectionResolutionError(t, h, `Dependency '${t.toString()}' has a shorter lifetime than its ancestor: '${h[e].name.toString()}'`);
}
}
h.push({
name: t,
lifetime: o
});
let c;
let u;
switch (o) {
case n.Lifetime.TRANSIENT:
u = s.resolve(P);
break;
case n.Lifetime.APPLICATION_SINGLETON:
c = I.cache.get(t);
if (!c) {
u = s.resolve(e.strict ? I : P);
I.cache.set(t, {
resolver: s,
value: u
});
} else {
u = c.value;
}
break;
case n.Lifetime.MODULE_SINGLETON:
case n.Lifetime.SINGLETON:
c = P.cache.get(t);
if (c !== undefined) {
u = c.value;
break;
}
u = s.resolve(P);
P.cache.set(t, {
resolver: s,
value: u
});
break;
case n.Lifetime.SCOPED:
c = P.cache.get(t);
if (c !== undefined) {
u = c.value;
break;
}
u = s.resolve(P);
P.cache.set(t, {
resolver: s,
value: u
});
break;
default:
throw new r.DependencyInjectionResolutionError(t, h, `Unknown lifetime "${s.lifetime}"`);
}
h.pop();
if (a.GetObjectLifetime(u.constructor) === n.Lifetime.TRANSIENT) l.AppendObjectWeakRefs(this, u);
return u;
} catch (e) {
h.length = 0;
throw e;
}
}
function N(e) {
return !!M(e);
}
function R(e, t) {
if (e && e.resolve) {
return e.resolve(P);
}
const n = "build";
const i = "targetOrResolver";
r.DependencyInjectionTypeError.assert(e, n, i, "a registration, function or class", e);
r.DependencyInjectionTypeError.assert(typeof e === "function", n, i, "a function or class", e);
const s = c.isClass(e) ? o.asClass(e, t) : o.asFunction(e, t);
return s.resolve(P);
}
function x(r, t) {
const n = {
require: e.require || function(e) {
return require(e);
},
listModules: i.listModules,
container: P
};
if (t?.esModules) {
n.require = j;
return s.loadModules(n, r, t).then((() => P));
} else {
s.loadModules(n, r, t);
return P;
}
}
async function A() {
const e = Array.from(P.cache.entries());
P.cache.clear();
return Promise.all(e.map((async ([, e]) => {
const {resolver: r, value: t} = e;
const n = r;
if (n.dispose) {
await Promise.resolve();
return n.dispose(t);
}
return Promise.resolve();
}))).then((() => undefined));
}
}
exports.createContainer = m;