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