UNPKG

lakutata

Version:

An IoC-based universal application framework.

393 lines (324 loc) 10 kB
"use strict"; 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;