@vielzeug/conduit 1.0.4 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/errors.js CHANGED
@@ -1,21 +1,24 @@
1
1
  //#region src/errors.ts
2
- var e = (e) => e.description ?? "anonymous", t = class e extends Error {
3
- constructor(e, t) {
4
- super(e, t), this.name = new.target.name, Object.setPrototypeOf(this, new.target.prototype);
5
- }
2
+ function e(e) {
3
+ return e.description ?? "anonymous";
4
+ }
5
+ var t = class e extends Error {
6
6
  static is(t) {
7
7
  return t instanceof e;
8
8
  }
9
+ constructor(e, t) {
10
+ super(e, t), this.name = new.target.name, Object.setPrototypeOf(this, new.target.prototype);
11
+ }
9
12
  }, n = class extends t {
10
13
  cycle;
11
14
  constructor(t) {
12
15
  super(`Circular dependency detected: ${t.map(e).join(" -> ")}`), this.cycle = t;
13
16
  }
14
17
  }, r = class extends t {
15
- token;
16
18
  containerName;
17
- constructor(t, n = "unknown") {
18
- super(`No provider registered for token: ${e(t)} (in container '${n}')`), this.token = t, this.containerName = n;
19
+ token;
20
+ constructor(t, n) {
21
+ super(`No provider registered for token: ${e(t)} (in container '${n}')`), this.containerName = n, this.token = t;
19
22
  }
20
23
  }, i = class extends t {
21
24
  token;
@@ -23,31 +26,23 @@ var e = (e) => e.description ?? "anonymous", t = class e extends Error {
23
26
  super(`Token "${e(t)}" is already registered.`), this.token = t;
24
27
  }
25
28
  }, a = class extends t {
29
+ requiredScope;
26
30
  token;
27
- lifetime;
28
31
  constructor(t, n) {
29
- let r = n === "transient" ? "transient factories are never cached" : typeof n == "symbol" ? `named-scope "${n.description ?? "anonymous"}" instance has not been resolved yet in this scope` : "the instance has not been resolved yet; call await container.resolve() or container.resolveAll() first";
30
- super(`Token "${e(t)}" cannot be resolved synchronously: ${r}.`), this.token = t, this.lifetime = n;
32
+ super(`Token "${e(t)}" requires scope "${n.description ?? "anonymous"}".`), this.requiredScope = n, this.token = t;
31
33
  }
32
34
  }, o = class extends t {
33
- token;
34
- requiredScope;
35
- constructor(t, n) {
36
- let r = n?.description ?? "anonymous";
37
- super(n ? `Token "${e(t)}" requires scope "${r}" but no matching scope container was found in the hierarchy.` : `Token "${e(t)}" requires a scope container but was resolved from the root.`), this.token = t, this.requiredScope = n;
38
- }
39
- }, s = class extends t {
40
35
  containerName;
41
- constructor(e = "unknown") {
42
- super(`Cannot use a disposed container (container '${e}').`), this.containerName = e;
36
+ constructor(e) {
37
+ super(`Cannot use disposed container '${e}'.`), this.containerName = e;
43
38
  }
44
- }, c = class extends t {
45
- containerName;
39
+ }, s = class extends t {
40
+ errors;
46
41
  constructor(e) {
47
- super(`Container '${e}' is frozen and cannot accept new registrations.`), this.containerName = e;
42
+ super(`Container disposal failed with ${e.length} cleanup error${e.length === 1 ? "" : "s"}.`), this.errors = e;
48
43
  }
49
44
  };
50
45
  //#endregion
51
- export { n as ConduitCircularDependencyError, s as ConduitDisposedError, i as ConduitDuplicateRegistrationError, t as ConduitError, c as ConduitFrozenError, r as ConduitProviderNotFoundError, o as ConduitScopedResolutionError, a as ConduitSyncResolutionError, e as tokenName };
46
+ export { n as ConduitCircularDependencyError, s as ConduitDisposeError, o as ConduitDisposedError, i as ConduitDuplicateRegistrationError, t as ConduitError, r as ConduitProviderNotFoundError, a as ConduitScopedResolutionError, e as tokenName };
52
47
 
53
48
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","names":[],"sources":["../src/errors.ts"],"sourcesContent":["import type { Lifetime, ScopeToken, Token } from './types.js';\n\nexport const tokenName = (t: Token<any>): string => t.description ?? 'anonymous';\n\n/** Base class for all conduit errors. Use `instanceof ConduitError` to catch any conduit-originated error. */\nexport class ConduitError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n static is(err: unknown): err is ConduitError {\n return err instanceof ConduitError;\n }\n}\n\nexport class ConduitCircularDependencyError extends ConduitError {\n /** The token path that forms the cycle. */\n readonly cycle: Token<any>[];\n\n constructor(path: Token<any>[]) {\n super(`Circular dependency detected: ${path.map(tokenName).join(' -> ')}`);\n this.cycle = path;\n }\n}\n\nexport class ConduitProviderNotFoundError extends ConduitError {\n /** The token that could not be found. */\n readonly token: Token<any>;\n /** The container name at the time of the lookup. */\n readonly containerName: string;\n\n constructor(tok: Token<any>, containerName = 'unknown') {\n super(`No provider registered for token: ${tokenName(tok)} (in container '${containerName}')`);\n this.token = tok;\n this.containerName = containerName;\n }\n}\n\nexport class ConduitDuplicateRegistrationError extends ConduitError {\n /** The token that was registered twice. */\n readonly token: Token<any>;\n\n constructor(tok: Token<any>) {\n super(`Token \"${tokenName(tok)}\" is already registered.`);\n this.token = tok;\n }\n}\n\nexport class ConduitSyncResolutionError extends ConduitError {\n /** The token that could not be resolved synchronously. */\n readonly token: Token<any>;\n /** The lifetime that prevented synchronous resolution. */\n readonly lifetime: Lifetime;\n\n constructor(tok: Token<any>, lifetime: Lifetime) {\n const reason =\n lifetime === 'transient'\n ? 'transient factories are never cached'\n : typeof lifetime === 'symbol'\n ? `named-scope \"${(lifetime as symbol).description ?? 'anonymous'}\" instance has not been resolved yet in this scope`\n : 'the instance has not been resolved yet; call await container.resolve() or container.resolveAll() first';\n\n super(`Token \"${tokenName(tok)}\" cannot be resolved synchronously: ${reason}.`);\n this.token = tok;\n this.lifetime = lifetime;\n }\n}\n\nexport class ConduitScopedResolutionError extends ConduitError {\n /** The token that required a scope container. */\n readonly token: Token<any>;\n /** The required scope token, if any. */\n readonly requiredScope: ScopeToken | undefined;\n\n constructor(tok: Token<any>, requiredScope?: ScopeToken) {\n const scopeName = requiredScope?.description ?? 'anonymous';\n\n super(\n requiredScope\n ? `Token \"${tokenName(tok)}\" requires scope \"${scopeName}\" but no matching scope container was found in the hierarchy.`\n : `Token \"${tokenName(tok)}\" requires a scope container but was resolved from the root.`,\n );\n this.token = tok;\n this.requiredScope = requiredScope;\n }\n}\n\nexport class ConduitDisposedError extends ConduitError {\n /** The name of the container that was already disposed. */\n readonly containerName: string;\n\n constructor(containerName = 'unknown') {\n super(`Cannot use a disposed container (container '${containerName}').`);\n this.containerName = containerName;\n }\n}\n\nexport class ConduitFrozenError extends ConduitError {\n /** The name of the container that is frozen. */\n readonly containerName: string;\n\n constructor(containerName: string) {\n super(`Container '${containerName}' is frozen and cannot accept new registrations.`);\n this.containerName = containerName;\n }\n}\n"],"mappings":";AAEA,IAAa,KAAa,MAA0B,EAAE,eAAe,aAGxD,IAAb,MAAa,UAAqB,MAAM;CACtC,YAAY,GAAiB,GAAqB;EAGhD,AAFA,MAAM,GAAS,CAAI,GACnB,KAAK,OAAO,IAAI,OAAO,MACvB,OAAO,eAAe,MAAM,IAAI,OAAO,SAAS;CAClD;CAEA,OAAO,GAAG,GAAmC;EAC3C,OAAO,aAAe;CACxB;AACF,GAEa,IAAb,cAAoD,EAAa;CAE/D;CAEA,YAAY,GAAoB;EAE9B,AADA,MAAM,iCAAiC,EAAK,IAAI,CAAS,CAAC,CAAC,KAAK,MAAM,GAAG,GACzE,KAAK,QAAQ;CACf;AACF,GAEa,IAAb,cAAkD,EAAa;CAE7D;CAEA;CAEA,YAAY,GAAiB,IAAgB,WAAW;EAGtD,AAFA,MAAM,qCAAqC,EAAU,CAAG,EAAE,kBAAkB,EAAc,GAAG,GAC7F,KAAK,QAAQ,GACb,KAAK,gBAAgB;CACvB;AACF,GAEa,IAAb,cAAuD,EAAa;CAElE;CAEA,YAAY,GAAiB;EAE3B,AADA,MAAM,UAAU,EAAU,CAAG,EAAE,yBAAyB,GACxD,KAAK,QAAQ;CACf;AACF,GAEa,IAAb,cAAgD,EAAa;CAE3D;CAEA;CAEA,YAAY,GAAiB,GAAoB;EAC/C,IAAM,IACJ,MAAa,cACT,yCACA,OAAO,KAAa,WAClB,gBAAiB,EAAoB,eAAe,YAAY,sDAChE;EAIR,AAFA,MAAM,UAAU,EAAU,CAAG,EAAE,sCAAsC,EAAO,EAAE,GAC9E,KAAK,QAAQ,GACb,KAAK,WAAW;CAClB;AACF,GAEa,IAAb,cAAkD,EAAa;CAE7D;CAEA;CAEA,YAAY,GAAiB,GAA4B;EACvD,IAAM,IAAY,GAAe,eAAe;EAQhD,AANA,MACE,IACI,UAAU,EAAU,CAAG,EAAE,oBAAoB,EAAU,iEACvD,UAAU,EAAU,CAAG,EAAE,6DAC/B,GACA,KAAK,QAAQ,GACb,KAAK,gBAAgB;CACvB;AACF,GAEa,IAAb,cAA0C,EAAa;CAErD;CAEA,YAAY,IAAgB,WAAW;EAErC,AADA,MAAM,+CAA+C,EAAc,IAAI,GACvE,KAAK,gBAAgB;CACvB;AACF,GAEa,IAAb,cAAwC,EAAa;CAEnD;CAEA,YAAY,GAAuB;EAEjC,AADA,MAAM,cAAc,EAAc,iDAAiD,GACnF,KAAK,gBAAgB;CACvB;AACF"}
1
+ {"version":3,"file":"errors.js","names":[],"sources":["../src/errors.ts"],"sourcesContent":["import type { ScopeToken, Token } from './types.js';\n\nexport function tokenName(token: Token<unknown>): string {\n return token.description ?? 'anonymous';\n}\n\nexport class ConduitError extends Error {\n static is(error: unknown): error is ConduitError {\n return error instanceof ConduitError;\n }\n\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ConduitCircularDependencyError extends ConduitError {\n readonly cycle: Token<unknown>[];\n\n constructor(cycle: Token<unknown>[]) {\n super(`Circular dependency detected: ${cycle.map(tokenName).join(' -> ')}`);\n this.cycle = cycle;\n }\n}\n\nexport class ConduitProviderNotFoundError extends ConduitError {\n readonly containerName: string;\n readonly token: Token<unknown>;\n\n constructor(token: Token<unknown>, containerName: string) {\n super(`No provider registered for token: ${tokenName(token)} (in container '${containerName}')`);\n this.containerName = containerName;\n this.token = token;\n }\n}\n\nexport class ConduitDuplicateRegistrationError extends ConduitError {\n readonly token: Token<unknown>;\n\n constructor(token: Token<unknown>) {\n super(`Token \"${tokenName(token)}\" is already registered.`);\n this.token = token;\n }\n}\n\nexport class ConduitScopedResolutionError extends ConduitError {\n readonly requiredScope: ScopeToken;\n readonly token: Token<unknown>;\n\n constructor(token: Token<unknown>, requiredScope: ScopeToken) {\n super(`Token \"${tokenName(token)}\" requires scope \"${requiredScope.description ?? 'anonymous'}\".`);\n this.requiredScope = requiredScope;\n this.token = token;\n }\n}\n\nexport class ConduitDisposedError extends ConduitError {\n readonly containerName: string;\n\n constructor(containerName: string) {\n super(`Cannot use disposed container '${containerName}'.`);\n this.containerName = containerName;\n }\n}\n\nexport class ConduitDisposeError extends ConduitError {\n readonly errors: unknown[];\n\n constructor(errors: unknown[]) {\n super(`Container disposal failed with ${errors.length} cleanup error${errors.length === 1 ? '' : 's'}.`);\n this.errors = errors;\n }\n}\n"],"mappings":";AAEA,SAAgB,EAAU,GAA+B;CACvD,OAAO,EAAM,eAAe;AAC9B;AAEA,IAAa,IAAb,MAAa,UAAqB,MAAM;CACtC,OAAO,GAAG,GAAuC;EAC/C,OAAO,aAAiB;CAC1B;CAEA,YAAY,GAAiB,GAAwB;EAGnD,AAFA,MAAM,GAAS,CAAO,GACtB,KAAK,OAAO,WAAW,MACvB,OAAO,eAAe,MAAM,WAAW,SAAS;CAClD;AACF,GAEa,IAAb,cAAoD,EAAa;CAC/D;CAEA,YAAY,GAAyB;EAEnC,AADA,MAAM,iCAAiC,EAAM,IAAI,CAAS,CAAC,CAAC,KAAK,MAAM,GAAG,GAC1E,KAAK,QAAQ;CACf;AACF,GAEa,IAAb,cAAkD,EAAa;CAC7D;CACA;CAEA,YAAY,GAAuB,GAAuB;EAGxD,AAFA,MAAM,qCAAqC,EAAU,CAAK,EAAE,kBAAkB,EAAc,GAAG,GAC/F,KAAK,gBAAgB,GACrB,KAAK,QAAQ;CACf;AACF,GAEa,IAAb,cAAuD,EAAa;CAClE;CAEA,YAAY,GAAuB;EAEjC,AADA,MAAM,UAAU,EAAU,CAAK,EAAE,yBAAyB,GAC1D,KAAK,QAAQ;CACf;AACF,GAEa,IAAb,cAAkD,EAAa;CAC7D;CACA;CAEA,YAAY,GAAuB,GAA2B;EAG5D,AAFA,MAAM,UAAU,EAAU,CAAK,EAAE,oBAAoB,EAAc,eAAe,YAAY,GAAG,GACjG,KAAK,gBAAgB,GACrB,KAAK,QAAQ;CACf;AACF,GAEa,IAAb,cAA0C,EAAa;CACrD;CAEA,YAAY,GAAuB;EAEjC,AADA,MAAM,kCAAkC,EAAc,GAAG,GACzD,KAAK,gBAAgB;CACvB;AACF,GAEa,IAAb,cAAyC,EAAa;CACpD;CAEA,YAAY,GAAmB;EAE7B,AADA,MAAM,kCAAkC,EAAO,OAAO,gBAAgB,EAAO,WAAW,IAAI,KAAK,IAAI,EAAE,GACvG,KAAK,SAAS;CAChB;AACF"}
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./errors.cjs"),t=require("./container.cjs"),n=require("./types.cjs"),r=require("./utils.cjs");exports.ConduitCircularDependencyError=e.ConduitCircularDependencyError,exports.ConduitDisposedError=e.ConduitDisposedError,exports.ConduitDuplicateRegistrationError=e.ConduitDuplicateRegistrationError,exports.ConduitError=e.ConduitError,exports.ConduitFrozenError=e.ConduitFrozenError,exports.ConduitProviderNotFoundError=e.ConduitProviderNotFoundError,exports.ConduitScopedResolutionError=e.ConduitScopedResolutionError,exports.ConduitSyncResolutionError=e.ConduitSyncResolutionError,exports.createContainer=t.createContainer,exports.loadModules=r.loadModules,exports.resolveOptional=r.resolveOptional,exports.resolveOrDefault=r.resolveOrDefault,exports.resolveSyncOptional=r.resolveSyncOptional,exports.resolveSyncOrDefault=r.resolveSyncOrDefault,exports.scope=n.scope,exports.token=n.token,exports.tryResolve=r.tryResolve,exports.trySyncResolve=r.trySyncResolve;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./errors.cjs"),t=require("./container.cjs"),n=require("./types.cjs");exports.ConduitCircularDependencyError=e.ConduitCircularDependencyError,exports.ConduitDisposeError=e.ConduitDisposeError,exports.ConduitDisposedError=e.ConduitDisposedError,exports.ConduitDuplicateRegistrationError=e.ConduitDuplicateRegistrationError,exports.ConduitError=e.ConduitError,exports.ConduitProviderNotFoundError=e.ConduitProviderNotFoundError,exports.ConduitScopedResolutionError=e.ConduitScopedResolutionError,exports.createContainer=t.createContainer,exports.scope=n.scope,exports.token=n.token;
package/dist/index.d.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  export { createContainer } from './container';
2
- export { ConduitCircularDependencyError, ConduitDisposedError, ConduitError, ConduitFrozenError, ConduitDuplicateRegistrationError, ConduitProviderNotFoundError, ConduitScopedResolutionError, ConduitSyncResolutionError, } from './errors';
3
- export type { Container, ContainerEvent, ContainerEventListener, ContainerGraph, ContainerModule, ContainerNode, FactoryOptions, FactoryResolver, InferTokenTypes, Lifetime, ResolveInterceptor, ResolveResult, ScopeToken, Token, ValueOptions, } from './types';
2
+ export { ConduitCircularDependencyError, ConduitDisposeError, ConduitDisposedError, ConduitDuplicateRegistrationError, ConduitError, ConduitProviderNotFoundError, ConduitScopedResolutionError, } from './errors';
3
+ export type { Container, FactoryOptions, InferTokens, Lifetime, ScopeToken, Token, ValueOptions } from './types';
4
4
  export { scope, token } from './types';
5
- export { loadModules, resolveSyncOptional, resolveSyncOrDefault, resolveOptional, resolveOrDefault, tryResolve, trySyncResolve, } from './utils';
6
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EACL,8BAA8B,EAC9B,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EAClB,iCAAiC,EACjC,4BAA4B,EAC5B,4BAA4B,EAC5B,0BAA0B,GAC3B,MAAM,UAAU,CAAC;AAClB,YAAY,EACV,SAAS,EACT,cAAc,EACd,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,aAAa,EACb,cAAc,EACd,eAAe,EACf,eAAe,EACf,QAAQ,EACR,kBAAkB,EAClB,aAAa,EACb,UAAU,EACV,KAAK,EACL,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,cAAc,GACf,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EACL,8BAA8B,EAC9B,mBAAmB,EACnB,oBAAoB,EACpB,iCAAiC,EACjC,YAAY,EACZ,4BAA4B,EAC5B,4BAA4B,GAC7B,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACjH,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,4 @@
1
- import { ConduitCircularDependencyError as e, ConduitDisposedError as t, ConduitDuplicateRegistrationError as n, ConduitError as r, ConduitFrozenError as i, ConduitProviderNotFoundError as a, ConduitScopedResolutionError as o, ConduitSyncResolutionError as s } from "./errors.js";
2
- import { createContainer as c } from "./container.js";
3
- import { scope as l, token as u } from "./types.js";
4
- import { loadModules as d, resolveOptional as f, resolveOrDefault as p, resolveSyncOptional as m, resolveSyncOrDefault as h, tryResolve as g, trySyncResolve as _ } from "./utils.js";
5
- export { e as ConduitCircularDependencyError, t as ConduitDisposedError, n as ConduitDuplicateRegistrationError, r as ConduitError, i as ConduitFrozenError, a as ConduitProviderNotFoundError, o as ConduitScopedResolutionError, s as ConduitSyncResolutionError, c as createContainer, d as loadModules, f as resolveOptional, p as resolveOrDefault, m as resolveSyncOptional, h as resolveSyncOrDefault, l as scope, u as token, g as tryResolve, _ as trySyncResolve };
1
+ import { ConduitCircularDependencyError as e, ConduitDisposeError as t, ConduitDisposedError as n, ConduitDuplicateRegistrationError as r, ConduitError as i, ConduitProviderNotFoundError as a, ConduitScopedResolutionError as o } from "./errors.js";
2
+ import { createContainer as s } from "./container.js";
3
+ import { scope as c, token as l } from "./types.js";
4
+ export { e as ConduitCircularDependencyError, t as ConduitDisposeError, n as ConduitDisposedError, r as ConduitDuplicateRegistrationError, i as ConduitError, a as ConduitProviderNotFoundError, o as ConduitScopedResolutionError, s as createContainer, c as scope, l as token };
@@ -1 +1 @@
1
- {"version":3,"file":"types.cjs","names":[],"sources":["../src/types.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\n// Token\n// ---------------------------------------------------------------------------\n\nexport type Token<T = unknown> = symbol & { __type?: T };\n\nexport function token<T>(description: string): Token<T> {\n return Symbol(description) as Token<T>;\n}\n\n// ---------------------------------------------------------------------------\n// ScopeToken — named lifecycle scopes\n// ---------------------------------------------------------------------------\n\nexport type ScopeToken = symbol & { __scopeToken?: never };\n\n/**\n * Creates a named scope token. Factories registered with a ScopeToken lifetime\n * are only resolvable from a container created with createScope(scopeToken).\n */\nexport function scope(name: string): ScopeToken {\n return Symbol(name) as ScopeToken;\n}\n\n// ---------------------------------------------------------------------------\n// Lifetime & options\n// ---------------------------------------------------------------------------\n\n/** Caching strategy for factory registrations. Named scopes use a ScopeToken. */\nexport type Lifetime = 'singleton' | 'transient' | ScopeToken;\n\nexport type ValueOptions<T> = {\n dispose?: (instance: T) => Promise<void> | void;\n};\n\nexport type FactoryOptions<T> = {\n /** Optional statically-declared dependencies. Used for early validation in `freeze()`. */\n deps?: readonly Token<any>[];\n dispose?: (instance: T) => Promise<void> | void;\n lifetime?: Lifetime;\n};\n\n// ---------------------------------------------------------------------------\n// Resolver — injected into factories\n// ---------------------------------------------------------------------------\n\n/** Minimal resolver passed to every factory function. */\nexport interface FactoryResolver {\n resolve<T>(tok: Token<T>): Promise<T>;\n /**\n * Resolve synchronously. Works for value providers and already-resolved\n * singleton/scoped instances. Throws `ConduitSyncResolutionError` if the instance\n * has not been resolved yet.\n */\n resolveSync<T>(tok: Token<T>): T;\n}\n\n// ---------------------------------------------------------------------------\n// ContainerModule — grouping and async setup\n// ---------------------------------------------------------------------------\n\nexport type ContainerModule = (container: Container) => Promise<void> | void;\n\n// ---------------------------------------------------------------------------\n// Events — observable container state\n// ---------------------------------------------------------------------------\n\nexport type ContainerEvent =\n | { description: string; kind: 'factory' | 'value'; source: string; type: 'register' }\n | { description: string; source: string; type: 'resolve' }\n | { source: string; type: 'dispose' };\n\nexport type ContainerEventListener = (event: ContainerEvent) => void;\n\n// ---------------------------------------------------------------------------\n// Result type\n// ---------------------------------------------------------------------------\n\nexport type ResolveResult<T> = { ok: true; value: T } | { error: unknown; ok: false };\n\n/**\n * Infer the resolved-value tuple type from a `readonly` array of tokens.\n * Mirrors the return type of `resolveMany`.\n *\n * @example\n * const TOKENS = [AuthToken, LoggerToken] as const;\n * type Services = InferTokenTypes<typeof TOKENS>;\n * // → [AuthService, Logger]\n */\nexport type InferTokenTypes<T extends readonly Token<any>[]> = {\n [K in keyof T]: T[K] extends Token<infer U> ? U : never;\n};\n\n/** Interceptor called after every successful resolution. Receives the token and resolved value. */\nexport type ResolveInterceptor = <T>(tok: Token<T>, value: T) => void;\n\n// ---------------------------------------------------------------------------\n// ContainerGraph — inspect() output\n// ---------------------------------------------------------------------------\n\nexport type ContainerNode = {\n /** Statically-declared dependency token descriptions (from `deps:` option). */\n deps?: string[];\n description: string;\n kind: 'factory' | 'value';\n /** 'singleton', 'transient', or 'scope:<name>' for named scopes. */\n lifetime?: 'singleton' | 'transient' | `scope:${string}`;\n};\n\nexport type ContainerGraph = {\n nodes: ContainerNode[];\n};\n\n// ---------------------------------------------------------------------------\n// Container public interface\n// ---------------------------------------------------------------------------\n\nexport interface Container {\n /** Delegates to `dispose()`. Enables `await using` declarations. */\n [Symbol.asyncDispose](): Promise<void>;\n /** Human-readable identifier for this container. Set via createContainer({ name }). */\n readonly name: string;\n\n /** `AbortSignal` aborted when the container is disposed. Use to tie external lifecycles to this container. */\n readonly disposalSignal: AbortSignal;\n\n /** Whether the container has been disposed. */\n readonly disposed: boolean;\n\n /** Register a static value. */\n value<T>(tok: Token<T>, val: T, opts?: ValueOptions<T>): this;\n\n /**\n * Register a factory. The factory receives a `FactoryResolver` to resolve\n * its own dependencies lazily via `resolver.resolve(Token)`.\n */\n factory<T>(tok: Token<T>, fn: (resolver: FactoryResolver) => Promise<T> | T, opts?: FactoryOptions<T>): this;\n\n /** Check whether a token is registered (walks parent chain). */\n has<T>(tok: Token<T>): boolean;\n\n /** Resolve a single registered provider. */\n resolve<T>(tok: Token<T>): Promise<T>;\n\n /**\n * Resolve a token synchronously.\n * Works for value registrations and already-resolved singleton/scope instances.\n * Throws `ConduitSyncResolutionError` for transient factories or unresolved singletons.\n * Rethrows the cached rejection if the factory previously failed.\n */\n resolveSync<T>(tok: Token<T>): T;\n\n /**\n * Resolve multiple tokens in parallel, returning a typed tuple.\n */\n resolveMany<const D extends Token<any>[]>(\n toks: D,\n ): Promise<{ [K in keyof D]: D[K] extends Token<infer U> ? U : never }>;\n\n /**\n * Eagerly resolve all registered singleton factories across the entire\n * container hierarchy. Useful for startup validation and pre-warming\n * `resolveSync()` hot paths.\n *\n * Pass `{ includeScoped: true }` to also pre-warm named-scope factories\n * registered on the current scope container.\n */\n resolveAll(opts?: { includeScoped?: boolean }): Promise<void>;\n\n /**\n * Return a serializable graph of every registered token.\n * By default traverses the full parent chain (deep: true).\n */\n inspect(opts?: { deep?: boolean }): ContainerGraph;\n\n /**\n * Validate the registration graph without freezing it.\n * Checks statically-declared `deps`: throws `ConduitProviderNotFoundError` if a\n * declared dep is missing, or `ConduitCircularDependencyError` if they form a cycle.\n * Throws `ConduitDisposedError` if the container is already disposed.\n */\n validate(): this;\n\n /**\n * Freeze the container, locking it against further registrations.\n * After `freeze()`, `value()` and `factory()` throw `ConduitFrozenError`.\n * Validates statically-declared `deps`: throws `ConduitProviderNotFoundError` if a\n * declared dep is missing, or `ConduitCircularDependencyError` if they form a cycle.\n * Idempotent — calling `freeze()` again on an already-frozen container is a no-op.\n * Note: cycle detection for lazy (undeclared) deps happens at resolve time.\n */\n freeze(): this;\n\n /**\n * Create a child scope container. If `scopeToken` is provided, factories\n * registered with that token as their lifetime are resolved and cached here.\n * Omit `scopeToken` for a plain child container with no named scope.\n */\n createScope(scopeToken?: ScopeToken, opts?: { name?: string }): Container;\n\n /**\n * Subscribe to container events (register, resolve, dispose).\n * Events propagate up to parent containers. Returns an unsubscribe function.\n */\n on(listener: ContainerEventListener): () => void;\n\n /**\n * Register an interceptor called after every successful resolution.\n * Returns an unsubscribe function. Interceptor errors are swallowed.\n */\n onResolve(interceptor: ResolveInterceptor): () => void;\n\n /** Dispose the container, running all registered cleanup hooks in parallel. */\n dispose(): Promise<void>;\n}\n"],"mappings":"AAMA,SAAgB,EAAS,EAA+B,CACtD,OAAO,OAAO,CAAW,CAC3B,CAYA,SAAgB,EAAM,EAA0B,CAC9C,OAAO,OAAO,CAAI,CACpB"}
1
+ {"version":3,"file":"types.cjs","names":[],"sources":["../src/types.ts"],"sourcesContent":["declare const tokenBrand: unique symbol;\ndeclare const scopeBrand: unique symbol;\n\nexport type Token<T = unknown> = symbol & { readonly [tokenBrand]: T };\nexport type ScopeToken = symbol & { readonly [scopeBrand]: true };\n\nexport function token<T>(description: string): Token<T> {\n return Symbol(description) as Token<T>;\n}\n\nexport function scope(name: string): ScopeToken {\n return Symbol(name) as ScopeToken;\n}\n\nexport type Lifetime = 'singleton' | 'transient' | ScopeToken;\n\nexport type ValueOptions<T> = Readonly<{\n dispose?: (value: T) => Promise<void> | void;\n}>;\n\nexport type FactoryOptions<T> = Readonly<{\n dispose?: (value: T) => Promise<void> | void;\n lifetime?: Lifetime;\n}>;\n\nexport type InferTokens<T extends readonly Token<unknown>[]> = {\n [K in keyof T]: T[K] extends Token<infer Value> ? Value : never;\n};\n\nexport interface Container {\n [Symbol.asyncDispose](): Promise<void>;\n readonly disposalSignal: AbortSignal;\n readonly disposed: boolean;\n readonly name: string;\n\n value<T>(token: Token<T>, value: T, options?: ValueOptions<T>): this;\n\n factory<T, Dependencies extends readonly Token<unknown>[]>(\n token: Token<T>,\n dependencies: Dependencies,\n create: (...values: InferTokens<Dependencies>) => Promise<T> | T,\n options?: FactoryOptions<T>,\n ): this;\n\n has<T>(token: Token<T>): boolean;\n resolve<T>(token: Token<T>): Promise<T>;\n validate(): this;\n createScope(scope?: ScopeToken, options?: { name?: string }): Container;\n dispose(): Promise<void>;\n}\n"],"mappings":"AAMA,SAAgB,EAAS,EAA+B,CACtD,OAAO,OAAO,CAAW,CAC3B,CAEA,SAAgB,EAAM,EAA0B,CAC9C,OAAO,OAAO,CAAI,CACpB"}
package/dist/types.d.ts CHANGED
@@ -1,169 +1,38 @@
1
+ declare const tokenBrand: unique symbol;
2
+ declare const scopeBrand: unique symbol;
1
3
  export type Token<T = unknown> = symbol & {
2
- __type?: T;
4
+ readonly [tokenBrand]: T;
3
5
  };
4
- export declare function token<T>(description: string): Token<T>;
5
6
  export type ScopeToken = symbol & {
6
- __scopeToken?: never;
7
+ readonly [scopeBrand]: true;
7
8
  };
8
- /**
9
- * Creates a named scope token. Factories registered with a ScopeToken lifetime
10
- * are only resolvable from a container created with createScope(scopeToken).
11
- */
9
+ export declare function token<T>(description: string): Token<T>;
12
10
  export declare function scope(name: string): ScopeToken;
13
- /** Caching strategy for factory registrations. Named scopes use a ScopeToken. */
14
11
  export type Lifetime = 'singleton' | 'transient' | ScopeToken;
15
- export type ValueOptions<T> = {
16
- dispose?: (instance: T) => Promise<void> | void;
17
- };
18
- export type FactoryOptions<T> = {
19
- /** Optional statically-declared dependencies. Used for early validation in `freeze()`. */
20
- deps?: readonly Token<any>[];
21
- dispose?: (instance: T) => Promise<void> | void;
12
+ export type ValueOptions<T> = Readonly<{
13
+ dispose?: (value: T) => Promise<void> | void;
14
+ }>;
15
+ export type FactoryOptions<T> = Readonly<{
16
+ dispose?: (value: T) => Promise<void> | void;
22
17
  lifetime?: Lifetime;
23
- };
24
- /** Minimal resolver passed to every factory function. */
25
- export interface FactoryResolver {
26
- resolve<T>(tok: Token<T>): Promise<T>;
27
- /**
28
- * Resolve synchronously. Works for value providers and already-resolved
29
- * singleton/scoped instances. Throws `ConduitSyncResolutionError` if the instance
30
- * has not been resolved yet.
31
- */
32
- resolveSync<T>(tok: Token<T>): T;
33
- }
34
- export type ContainerModule = (container: Container) => Promise<void> | void;
35
- export type ContainerEvent = {
36
- description: string;
37
- kind: 'factory' | 'value';
38
- source: string;
39
- type: 'register';
40
- } | {
41
- description: string;
42
- source: string;
43
- type: 'resolve';
44
- } | {
45
- source: string;
46
- type: 'dispose';
47
- };
48
- export type ContainerEventListener = (event: ContainerEvent) => void;
49
- export type ResolveResult<T> = {
50
- ok: true;
51
- value: T;
52
- } | {
53
- error: unknown;
54
- ok: false;
55
- };
56
- /**
57
- * Infer the resolved-value tuple type from a `readonly` array of tokens.
58
- * Mirrors the return type of `resolveMany`.
59
- *
60
- * @example
61
- * const TOKENS = [AuthToken, LoggerToken] as const;
62
- * type Services = InferTokenTypes<typeof TOKENS>;
63
- * // → [AuthService, Logger]
64
- */
65
- export type InferTokenTypes<T extends readonly Token<any>[]> = {
66
- [K in keyof T]: T[K] extends Token<infer U> ? U : never;
67
- };
68
- /** Interceptor called after every successful resolution. Receives the token and resolved value. */
69
- export type ResolveInterceptor = <T>(tok: Token<T>, value: T) => void;
70
- export type ContainerNode = {
71
- /** Statically-declared dependency token descriptions (from `deps:` option). */
72
- deps?: string[];
73
- description: string;
74
- kind: 'factory' | 'value';
75
- /** 'singleton', 'transient', or 'scope:<name>' for named scopes. */
76
- lifetime?: 'singleton' | 'transient' | `scope:${string}`;
77
- };
78
- export type ContainerGraph = {
79
- nodes: ContainerNode[];
18
+ }>;
19
+ export type InferTokens<T extends readonly Token<unknown>[]> = {
20
+ [K in keyof T]: T[K] extends Token<infer Value> ? Value : never;
80
21
  };
81
22
  export interface Container {
82
- /** Delegates to `dispose()`. Enables `await using` declarations. */
83
23
  [Symbol.asyncDispose](): Promise<void>;
84
- /** Human-readable identifier for this container. Set via createContainer({ name }). */
85
- readonly name: string;
86
- /** `AbortSignal` aborted when the container is disposed. Use to tie external lifecycles to this container. */
87
24
  readonly disposalSignal: AbortSignal;
88
- /** Whether the container has been disposed. */
89
25
  readonly disposed: boolean;
90
- /** Register a static value. */
91
- value<T>(tok: Token<T>, val: T, opts?: ValueOptions<T>): this;
92
- /**
93
- * Register a factory. The factory receives a `FactoryResolver` to resolve
94
- * its own dependencies lazily via `resolver.resolve(Token)`.
95
- */
96
- factory<T>(tok: Token<T>, fn: (resolver: FactoryResolver) => Promise<T> | T, opts?: FactoryOptions<T>): this;
97
- /** Check whether a token is registered (walks parent chain). */
98
- has<T>(tok: Token<T>): boolean;
99
- /** Resolve a single registered provider. */
100
- resolve<T>(tok: Token<T>): Promise<T>;
101
- /**
102
- * Resolve a token synchronously.
103
- * Works for value registrations and already-resolved singleton/scope instances.
104
- * Throws `ConduitSyncResolutionError` for transient factories or unresolved singletons.
105
- * Rethrows the cached rejection if the factory previously failed.
106
- */
107
- resolveSync<T>(tok: Token<T>): T;
108
- /**
109
- * Resolve multiple tokens in parallel, returning a typed tuple.
110
- */
111
- resolveMany<const D extends Token<any>[]>(toks: D): Promise<{
112
- [K in keyof D]: D[K] extends Token<infer U> ? U : never;
113
- }>;
114
- /**
115
- * Eagerly resolve all registered singleton factories across the entire
116
- * container hierarchy. Useful for startup validation and pre-warming
117
- * `resolveSync()` hot paths.
118
- *
119
- * Pass `{ includeScoped: true }` to also pre-warm named-scope factories
120
- * registered on the current scope container.
121
- */
122
- resolveAll(opts?: {
123
- includeScoped?: boolean;
124
- }): Promise<void>;
125
- /**
126
- * Return a serializable graph of every registered token.
127
- * By default traverses the full parent chain (deep: true).
128
- */
129
- inspect(opts?: {
130
- deep?: boolean;
131
- }): ContainerGraph;
132
- /**
133
- * Validate the registration graph without freezing it.
134
- * Checks statically-declared `deps`: throws `ConduitProviderNotFoundError` if a
135
- * declared dep is missing, or `ConduitCircularDependencyError` if they form a cycle.
136
- * Throws `ConduitDisposedError` if the container is already disposed.
137
- */
26
+ readonly name: string;
27
+ value<T>(token: Token<T>, value: T, options?: ValueOptions<T>): this;
28
+ factory<T, Dependencies extends readonly Token<unknown>[]>(token: Token<T>, dependencies: Dependencies, create: (...values: InferTokens<Dependencies>) => Promise<T> | T, options?: FactoryOptions<T>): this;
29
+ has<T>(token: Token<T>): boolean;
30
+ resolve<T>(token: Token<T>): Promise<T>;
138
31
  validate(): this;
139
- /**
140
- * Freeze the container, locking it against further registrations.
141
- * After `freeze()`, `value()` and `factory()` throw `ConduitFrozenError`.
142
- * Validates statically-declared `deps`: throws `ConduitProviderNotFoundError` if a
143
- * declared dep is missing, or `ConduitCircularDependencyError` if they form a cycle.
144
- * Idempotent — calling `freeze()` again on an already-frozen container is a no-op.
145
- * Note: cycle detection for lazy (undeclared) deps happens at resolve time.
146
- */
147
- freeze(): this;
148
- /**
149
- * Create a child scope container. If `scopeToken` is provided, factories
150
- * registered with that token as their lifetime are resolved and cached here.
151
- * Omit `scopeToken` for a plain child container with no named scope.
152
- */
153
- createScope(scopeToken?: ScopeToken, opts?: {
32
+ createScope(scope?: ScopeToken, options?: {
154
33
  name?: string;
155
34
  }): Container;
156
- /**
157
- * Subscribe to container events (register, resolve, dispose).
158
- * Events propagate up to parent containers. Returns an unsubscribe function.
159
- */
160
- on(listener: ContainerEventListener): () => void;
161
- /**
162
- * Register an interceptor called after every successful resolution.
163
- * Returns an unsubscribe function. Interceptor errors are swallowed.
164
- */
165
- onResolve(interceptor: ResolveInterceptor): () => void;
166
- /** Dispose the container, running all registered cleanup hooks in parallel. */
167
35
  dispose(): Promise<void>;
168
36
  }
37
+ export {};
169
38
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,UAAU,EAAE,OAAO,MAAM,CAAC;AACxC,OAAO,CAAC,MAAM,UAAU,EAAE,OAAO,MAAM,CAAC;AAExC,MAAM,MAAM,KAAK,CAAC,CAAC,GAAG,OAAO,IAAI,MAAM,GAAG;IAAE,QAAQ,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;CAAE,CAAC;AACvE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,CAAC,UAAU,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAElE,wBAAgB,KAAK,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAEtD;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAE9C;AAED,MAAM,MAAM,QAAQ,GAAG,WAAW,GAAG,WAAW,GAAG,UAAU,CAAC;AAE9D,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,QAAQ,CAAC;IACrC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC9C,CAAC,CAAC;AAEH,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,QAAQ,CAAC;IACvC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC7C,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB,CAAC,CAAC;AAEH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,SAAS,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI;KAC5D,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,MAAM,KAAK,CAAC,GAAG,KAAK,GAAG,KAAK;CAChE,CAAC;AAEF,MAAM,WAAW,SAAS;IACxB,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAErE,OAAO,CAAC,CAAC,EAAE,YAAY,SAAS,SAAS,KAAK,CAAC,OAAO,CAAC,EAAE,EACvD,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EACf,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,WAAW,CAAC,YAAY,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAChE,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,GAC1B,IAAI,CAAC;IAER,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;IACjC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACxC,QAAQ,IAAI,IAAI,CAAC;IACjB,WAAW,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IACxE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../src/types.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\n// Token\n// ---------------------------------------------------------------------------\n\nexport type Token<T = unknown> = symbol & { __type?: T };\n\nexport function token<T>(description: string): Token<T> {\n return Symbol(description) as Token<T>;\n}\n\n// ---------------------------------------------------------------------------\n// ScopeToken — named lifecycle scopes\n// ---------------------------------------------------------------------------\n\nexport type ScopeToken = symbol & { __scopeToken?: never };\n\n/**\n * Creates a named scope token. Factories registered with a ScopeToken lifetime\n * are only resolvable from a container created with createScope(scopeToken).\n */\nexport function scope(name: string): ScopeToken {\n return Symbol(name) as ScopeToken;\n}\n\n// ---------------------------------------------------------------------------\n// Lifetime & options\n// ---------------------------------------------------------------------------\n\n/** Caching strategy for factory registrations. Named scopes use a ScopeToken. */\nexport type Lifetime = 'singleton' | 'transient' | ScopeToken;\n\nexport type ValueOptions<T> = {\n dispose?: (instance: T) => Promise<void> | void;\n};\n\nexport type FactoryOptions<T> = {\n /** Optional statically-declared dependencies. Used for early validation in `freeze()`. */\n deps?: readonly Token<any>[];\n dispose?: (instance: T) => Promise<void> | void;\n lifetime?: Lifetime;\n};\n\n// ---------------------------------------------------------------------------\n// Resolver — injected into factories\n// ---------------------------------------------------------------------------\n\n/** Minimal resolver passed to every factory function. */\nexport interface FactoryResolver {\n resolve<T>(tok: Token<T>): Promise<T>;\n /**\n * Resolve synchronously. Works for value providers and already-resolved\n * singleton/scoped instances. Throws `ConduitSyncResolutionError` if the instance\n * has not been resolved yet.\n */\n resolveSync<T>(tok: Token<T>): T;\n}\n\n// ---------------------------------------------------------------------------\n// ContainerModule — grouping and async setup\n// ---------------------------------------------------------------------------\n\nexport type ContainerModule = (container: Container) => Promise<void> | void;\n\n// ---------------------------------------------------------------------------\n// Events — observable container state\n// ---------------------------------------------------------------------------\n\nexport type ContainerEvent =\n | { description: string; kind: 'factory' | 'value'; source: string; type: 'register' }\n | { description: string; source: string; type: 'resolve' }\n | { source: string; type: 'dispose' };\n\nexport type ContainerEventListener = (event: ContainerEvent) => void;\n\n// ---------------------------------------------------------------------------\n// Result type\n// ---------------------------------------------------------------------------\n\nexport type ResolveResult<T> = { ok: true; value: T } | { error: unknown; ok: false };\n\n/**\n * Infer the resolved-value tuple type from a `readonly` array of tokens.\n * Mirrors the return type of `resolveMany`.\n *\n * @example\n * const TOKENS = [AuthToken, LoggerToken] as const;\n * type Services = InferTokenTypes<typeof TOKENS>;\n * // → [AuthService, Logger]\n */\nexport type InferTokenTypes<T extends readonly Token<any>[]> = {\n [K in keyof T]: T[K] extends Token<infer U> ? U : never;\n};\n\n/** Interceptor called after every successful resolution. Receives the token and resolved value. */\nexport type ResolveInterceptor = <T>(tok: Token<T>, value: T) => void;\n\n// ---------------------------------------------------------------------------\n// ContainerGraph — inspect() output\n// ---------------------------------------------------------------------------\n\nexport type ContainerNode = {\n /** Statically-declared dependency token descriptions (from `deps:` option). */\n deps?: string[];\n description: string;\n kind: 'factory' | 'value';\n /** 'singleton', 'transient', or 'scope:<name>' for named scopes. */\n lifetime?: 'singleton' | 'transient' | `scope:${string}`;\n};\n\nexport type ContainerGraph = {\n nodes: ContainerNode[];\n};\n\n// ---------------------------------------------------------------------------\n// Container public interface\n// ---------------------------------------------------------------------------\n\nexport interface Container {\n /** Delegates to `dispose()`. Enables `await using` declarations. */\n [Symbol.asyncDispose](): Promise<void>;\n /** Human-readable identifier for this container. Set via createContainer({ name }). */\n readonly name: string;\n\n /** `AbortSignal` aborted when the container is disposed. Use to tie external lifecycles to this container. */\n readonly disposalSignal: AbortSignal;\n\n /** Whether the container has been disposed. */\n readonly disposed: boolean;\n\n /** Register a static value. */\n value<T>(tok: Token<T>, val: T, opts?: ValueOptions<T>): this;\n\n /**\n * Register a factory. The factory receives a `FactoryResolver` to resolve\n * its own dependencies lazily via `resolver.resolve(Token)`.\n */\n factory<T>(tok: Token<T>, fn: (resolver: FactoryResolver) => Promise<T> | T, opts?: FactoryOptions<T>): this;\n\n /** Check whether a token is registered (walks parent chain). */\n has<T>(tok: Token<T>): boolean;\n\n /** Resolve a single registered provider. */\n resolve<T>(tok: Token<T>): Promise<T>;\n\n /**\n * Resolve a token synchronously.\n * Works for value registrations and already-resolved singleton/scope instances.\n * Throws `ConduitSyncResolutionError` for transient factories or unresolved singletons.\n * Rethrows the cached rejection if the factory previously failed.\n */\n resolveSync<T>(tok: Token<T>): T;\n\n /**\n * Resolve multiple tokens in parallel, returning a typed tuple.\n */\n resolveMany<const D extends Token<any>[]>(\n toks: D,\n ): Promise<{ [K in keyof D]: D[K] extends Token<infer U> ? U : never }>;\n\n /**\n * Eagerly resolve all registered singleton factories across the entire\n * container hierarchy. Useful for startup validation and pre-warming\n * `resolveSync()` hot paths.\n *\n * Pass `{ includeScoped: true }` to also pre-warm named-scope factories\n * registered on the current scope container.\n */\n resolveAll(opts?: { includeScoped?: boolean }): Promise<void>;\n\n /**\n * Return a serializable graph of every registered token.\n * By default traverses the full parent chain (deep: true).\n */\n inspect(opts?: { deep?: boolean }): ContainerGraph;\n\n /**\n * Validate the registration graph without freezing it.\n * Checks statically-declared `deps`: throws `ConduitProviderNotFoundError` if a\n * declared dep is missing, or `ConduitCircularDependencyError` if they form a cycle.\n * Throws `ConduitDisposedError` if the container is already disposed.\n */\n validate(): this;\n\n /**\n * Freeze the container, locking it against further registrations.\n * After `freeze()`, `value()` and `factory()` throw `ConduitFrozenError`.\n * Validates statically-declared `deps`: throws `ConduitProviderNotFoundError` if a\n * declared dep is missing, or `ConduitCircularDependencyError` if they form a cycle.\n * Idempotent — calling `freeze()` again on an already-frozen container is a no-op.\n * Note: cycle detection for lazy (undeclared) deps happens at resolve time.\n */\n freeze(): this;\n\n /**\n * Create a child scope container. If `scopeToken` is provided, factories\n * registered with that token as their lifetime are resolved and cached here.\n * Omit `scopeToken` for a plain child container with no named scope.\n */\n createScope(scopeToken?: ScopeToken, opts?: { name?: string }): Container;\n\n /**\n * Subscribe to container events (register, resolve, dispose).\n * Events propagate up to parent containers. Returns an unsubscribe function.\n */\n on(listener: ContainerEventListener): () => void;\n\n /**\n * Register an interceptor called after every successful resolution.\n * Returns an unsubscribe function. Interceptor errors are swallowed.\n */\n onResolve(interceptor: ResolveInterceptor): () => void;\n\n /** Dispose the container, running all registered cleanup hooks in parallel. */\n dispose(): Promise<void>;\n}\n"],"mappings":";AAMA,SAAgB,EAAS,GAA+B;CACtD,OAAO,OAAO,CAAW;AAC3B;AAYA,SAAgB,EAAM,GAA0B;CAC9C,OAAO,OAAO,CAAI;AACpB"}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../src/types.ts"],"sourcesContent":["declare const tokenBrand: unique symbol;\ndeclare const scopeBrand: unique symbol;\n\nexport type Token<T = unknown> = symbol & { readonly [tokenBrand]: T };\nexport type ScopeToken = symbol & { readonly [scopeBrand]: true };\n\nexport function token<T>(description: string): Token<T> {\n return Symbol(description) as Token<T>;\n}\n\nexport function scope(name: string): ScopeToken {\n return Symbol(name) as ScopeToken;\n}\n\nexport type Lifetime = 'singleton' | 'transient' | ScopeToken;\n\nexport type ValueOptions<T> = Readonly<{\n dispose?: (value: T) => Promise<void> | void;\n}>;\n\nexport type FactoryOptions<T> = Readonly<{\n dispose?: (value: T) => Promise<void> | void;\n lifetime?: Lifetime;\n}>;\n\nexport type InferTokens<T extends readonly Token<unknown>[]> = {\n [K in keyof T]: T[K] extends Token<infer Value> ? Value : never;\n};\n\nexport interface Container {\n [Symbol.asyncDispose](): Promise<void>;\n readonly disposalSignal: AbortSignal;\n readonly disposed: boolean;\n readonly name: string;\n\n value<T>(token: Token<T>, value: T, options?: ValueOptions<T>): this;\n\n factory<T, Dependencies extends readonly Token<unknown>[]>(\n token: Token<T>,\n dependencies: Dependencies,\n create: (...values: InferTokens<Dependencies>) => Promise<T> | T,\n options?: FactoryOptions<T>,\n ): this;\n\n has<T>(token: Token<T>): boolean;\n resolve<T>(token: Token<T>): Promise<T>;\n validate(): this;\n createScope(scope?: ScopeToken, options?: { name?: string }): Container;\n dispose(): Promise<void>;\n}\n"],"mappings":";AAMA,SAAgB,EAAS,GAA+B;CACtD,OAAO,OAAO,CAAW;AAC3B;AAEA,SAAgB,EAAM,GAA0B;CAC9C,OAAO,OAAO,CAAI;AACpB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vielzeug/conduit",
3
- "version": "1.0.4",
3
+ "version": "2.0.0",
4
4
  "description": "Lightweight dependency injection container — singletons, transient instances, factories, and named scopes",
5
5
  "type": "module",
6
6
  "files": [
@@ -35,9 +35,9 @@
35
35
  "node": ">=22"
36
36
  },
37
37
  "devDependencies": {
38
- "@types/node": "^26.1.0",
38
+ "@types/node": "^26.1.2",
39
39
  "typescript": "^6.0.3",
40
- "vite": "^8.1.3",
40
+ "vite": "^8.2.0",
41
41
  "vitest": "^4.1.10"
42
42
  }
43
43
  }
package/dist/_dev.cjs DELETED
@@ -1,2 +0,0 @@
1
- var e=!globalThis.__CONDUIT_PROD__;function t(t,...n){e&&console.error(`[@vielzeug/conduit] ${t}`,...n)}exports.error=t;
2
- //# sourceMappingURL=_dev.cjs.map
package/dist/_dev.cjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"_dev.cjs","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __CONDUIT_PROD__?: boolean }).__CONDUIT_PROD__;\n\n/** @internal */\nexport function error(msg: string, ...args: unknown[]): void {\n if (isDev) console.error(`[@vielzeug/conduit] ${msg}`, ...args);\n}\n"],"mappings":"AAAA,IAAM,EAAQ,CAAE,WAA8C,iBAG9D,SAAgB,EAAM,EAAa,GAAG,EAAuB,CACvD,GAAO,QAAQ,MAAM,uBAAuB,IAAO,GAAG,CAAI,CAChE"}
package/dist/_dev.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=_dev.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"_dev.d.ts","sourceRoot":"","sources":["../src/_dev.ts"],"names":[],"mappings":""}
package/dist/_dev.js DELETED
@@ -1,9 +0,0 @@
1
- //#region src/_dev.ts
2
- var e = !globalThis.__CONDUIT_PROD__;
3
- function t(t, ...n) {
4
- e && console.error(`[@vielzeug/conduit] ${t}`, ...n);
5
- }
6
- //#endregion
7
- export { t as error };
8
-
9
- //# sourceMappingURL=_dev.js.map
package/dist/_dev.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"_dev.js","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __CONDUIT_PROD__?: boolean }).__CONDUIT_PROD__;\n\n/** @internal */\nexport function error(msg: string, ...args: unknown[]): void {\n if (isDev) console.error(`[@vielzeug/conduit] ${msg}`, ...args);\n}\n"],"mappings":";AAAA,IAAM,IAAQ,CAAE,WAA8C;AAG9D,SAAgB,EAAM,GAAa,GAAG,GAAuB;CAC3D,AAAI,KAAO,QAAQ,MAAM,uBAAuB,KAAO,GAAG,CAAI;AAChE"}
package/dist/conduit.d.ts DELETED
@@ -1,5 +0,0 @@
1
- export * from './container.js';
2
- export * from './errors.js';
3
- export * from './types.js';
4
- export * from './utils.js';
5
- //# sourceMappingURL=conduit.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"conduit.d.ts","sourceRoot":"","sources":["../src/conduit.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
package/dist/utils.cjs DELETED
@@ -1,2 +0,0 @@
1
- const e=require("./errors.cjs");async function t(t,n){try{return await t.resolve(n)}catch(t){if(t instanceof e.ConduitProviderNotFoundError)return;throw t}}async function n(e,n,r){let i=await t(e,n);return i===void 0?r:i}async function r(t,n){try{return{ok:!0,value:await t.resolve(n)}}catch(t){if(t instanceof e.ConduitProviderNotFoundError)return{error:t,ok:!1};throw t}}function i(t,n){try{return t.resolveSync(n)}catch(t){if(t instanceof e.ConduitProviderNotFoundError)return;throw t}}function a(e,t,n){let r=i(e,t);return r===void 0?n:r}function o(t,n){try{return{ok:!0,value:t.resolveSync(n)}}catch(t){if(t instanceof e.ConduitProviderNotFoundError)return{error:t,ok:!1};throw t}}async function s(e,...t){for(let n of t)await n(e);return e}exports.loadModules=s,exports.resolveOptional=t,exports.resolveOrDefault=n,exports.resolveSyncOptional=i,exports.resolveSyncOrDefault=a,exports.tryResolve=r,exports.trySyncResolve=o;
2
- //# sourceMappingURL=utils.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.cjs","names":[],"sources":["../src/utils.ts"],"sourcesContent":["import type { Container, ContainerModule, ResolveResult, Token } from './types.js';\n\nimport { ConduitProviderNotFoundError } from './errors.js';\n\n/**\n * Resolve a token, returning `undefined` when not registered.\n * Re-throws any error other than `ConduitProviderNotFoundError`.\n */\nexport async function resolveOptional<T>(container: Container, tok: Token<T>): Promise<T | undefined> {\n try {\n return await container.resolve(tok);\n } catch (error) {\n if (error instanceof ConduitProviderNotFoundError) return undefined;\n\n throw error;\n }\n}\n\n/**\n * Resolve a token, returning `defaultValue` when not registered.\n * Re-throws any error other than `ConduitProviderNotFoundError`.\n */\nexport async function resolveOrDefault<T>(container: Container, tok: Token<T>, defaultValue: T): Promise<T> {\n const result = await resolveOptional(container, tok);\n\n return result === undefined ? defaultValue : result;\n}\n\n/**\n * Resolve a token, returning a result object instead of throwing.\n * Returns `{ ok: true, value }` on success or `{ ok: false, error }` when the\n * token is not registered. Re-throws all other errors — including\n * `ConduitDisposedError` and `ConduitCircularDependencyError`.\n */\nexport async function tryResolve<T>(container: Container, tok: Token<T>): Promise<ResolveResult<T>> {\n try {\n const value = await container.resolve(tok);\n\n return { ok: true, value };\n } catch (error) {\n if (error instanceof ConduitProviderNotFoundError) return { error, ok: false };\n\n throw error;\n }\n}\n\n/**\n * Resolve a token synchronously, returning `undefined` when not registered.\n * Re-throws `ConduitSyncResolutionError`, `ConduitScopedResolutionError`, and `ConduitDisposedError`.\n */\nexport function resolveSyncOptional<T>(container: Container, tok: Token<T>): T | undefined {\n try {\n return container.resolveSync(tok);\n } catch (error) {\n if (error instanceof ConduitProviderNotFoundError) return undefined;\n\n throw error;\n }\n}\n\n/**\n * Resolve a token synchronously, returning `defaultValue` when not registered.\n * Re-throws `ConduitSyncResolutionError`, `ConduitScopedResolutionError`, and `ConduitDisposedError`.\n */\nexport function resolveSyncOrDefault<T>(container: Container, tok: Token<T>, defaultValue: T): T {\n const result = resolveSyncOptional(container, tok);\n\n return result === undefined ? defaultValue : result;\n}\n\n/**\n * Resolve a token synchronously, returning a result object instead of throwing.\n * Returns `{ ok: true, value }` on success or `{ ok: false, error }` when the\n * token is not registered. Re-throws all other errors — including\n * `ConduitSyncResolutionError`, `ConduitDisposedError`, and `ConduitScopedResolutionError`.\n */\nexport function trySyncResolve<T>(container: Container, tok: Token<T>): ResolveResult<T> {\n try {\n const value = container.resolveSync(tok);\n\n return { ok: true, value };\n } catch (error) {\n if (error instanceof ConduitProviderNotFoundError) return { error, ok: false };\n\n throw error;\n }\n}\n\n/**\n * Apply container modules sequentially (each module may be async).\n * Returns the container for chaining.\n */\nexport async function loadModules(container: Container, ...modules: ContainerModule[]): Promise<Container> {\n for (const mod of modules) await mod(container);\n\n return container;\n}\n"],"mappings":"gCAQA,eAAsB,EAAmB,EAAsB,EAAuC,CACpG,GAAI,CACF,OAAO,MAAM,EAAU,QAAQ,CAAG,CACpC,OAAS,EAAO,CACd,GAAI,aAAiB,EAAA,6BAA8B,OAEnD,MAAM,CACR,CACF,CAMA,eAAsB,EAAoB,EAAsB,EAAe,EAA6B,CAC1G,IAAM,EAAS,MAAM,EAAgB,EAAW,CAAG,EAEnD,OAAO,IAAW,IAAA,GAAY,EAAe,CAC/C,CAQA,eAAsB,EAAc,EAAsB,EAA0C,CAClG,GAAI,CAGF,MAAO,CAAE,GAAI,GAAM,MAAA,MAFC,EAAU,QAAQ,CAAG,CAEhB,CAC3B,OAAS,EAAO,CACd,GAAI,aAAiB,EAAA,6BAA8B,MAAO,CAAE,QAAO,GAAI,EAAM,EAE7E,MAAM,CACR,CACF,CAMA,SAAgB,EAAuB,EAAsB,EAA8B,CACzF,GAAI,CACF,OAAO,EAAU,YAAY,CAAG,CAClC,OAAS,EAAO,CACd,GAAI,aAAiB,EAAA,6BAA8B,OAEnD,MAAM,CACR,CACF,CAMA,SAAgB,EAAwB,EAAsB,EAAe,EAAoB,CAC/F,IAAM,EAAS,EAAoB,EAAW,CAAG,EAEjD,OAAO,IAAW,IAAA,GAAY,EAAe,CAC/C,CAQA,SAAgB,EAAkB,EAAsB,EAAiC,CACvF,GAAI,CAGF,MAAO,CAAE,GAAI,GAAM,MAFL,EAAU,YAAY,CAEjB,CAAM,CAC3B,OAAS,EAAO,CACd,GAAI,aAAiB,EAAA,6BAA8B,MAAO,CAAE,QAAO,GAAI,EAAM,EAE7E,MAAM,CACR,CACF,CAMA,eAAsB,EAAY,EAAsB,GAAG,EAAgD,CACzG,IAAK,IAAM,KAAO,EAAS,MAAM,EAAI,CAAS,EAE9C,OAAO,CACT"}
package/dist/utils.d.ts DELETED
@@ -1,41 +0,0 @@
1
- import type { Container, ContainerModule, ResolveResult, Token } from './types.js';
2
- /**
3
- * Resolve a token, returning `undefined` when not registered.
4
- * Re-throws any error other than `ConduitProviderNotFoundError`.
5
- */
6
- export declare function resolveOptional<T>(container: Container, tok: Token<T>): Promise<T | undefined>;
7
- /**
8
- * Resolve a token, returning `defaultValue` when not registered.
9
- * Re-throws any error other than `ConduitProviderNotFoundError`.
10
- */
11
- export declare function resolveOrDefault<T>(container: Container, tok: Token<T>, defaultValue: T): Promise<T>;
12
- /**
13
- * Resolve a token, returning a result object instead of throwing.
14
- * Returns `{ ok: true, value }` on success or `{ ok: false, error }` when the
15
- * token is not registered. Re-throws all other errors — including
16
- * `ConduitDisposedError` and `ConduitCircularDependencyError`.
17
- */
18
- export declare function tryResolve<T>(container: Container, tok: Token<T>): Promise<ResolveResult<T>>;
19
- /**
20
- * Resolve a token synchronously, returning `undefined` when not registered.
21
- * Re-throws `ConduitSyncResolutionError`, `ConduitScopedResolutionError`, and `ConduitDisposedError`.
22
- */
23
- export declare function resolveSyncOptional<T>(container: Container, tok: Token<T>): T | undefined;
24
- /**
25
- * Resolve a token synchronously, returning `defaultValue` when not registered.
26
- * Re-throws `ConduitSyncResolutionError`, `ConduitScopedResolutionError`, and `ConduitDisposedError`.
27
- */
28
- export declare function resolveSyncOrDefault<T>(container: Container, tok: Token<T>, defaultValue: T): T;
29
- /**
30
- * Resolve a token synchronously, returning a result object instead of throwing.
31
- * Returns `{ ok: true, value }` on success or `{ ok: false, error }` when the
32
- * token is not registered. Re-throws all other errors — including
33
- * `ConduitSyncResolutionError`, `ConduitDisposedError`, and `ConduitScopedResolutionError`.
34
- */
35
- export declare function trySyncResolve<T>(container: Container, tok: Token<T>): ResolveResult<T>;
36
- /**
37
- * Apply container modules sequentially (each module may be async).
38
- * Returns the container for chaining.
39
- */
40
- export declare function loadModules(container: Container, ...modules: ContainerModule[]): Promise<Container>;
41
- //# sourceMappingURL=utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAInF;;;GAGG;AACH,wBAAsB,eAAe,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAQpG;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAI1G;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAUlG;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,CAQzF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,CAI/F;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAUvF;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAIzG"}
package/dist/utils.js DELETED
@@ -1,62 +0,0 @@
1
- import { ConduitProviderNotFoundError as e } from "./errors.js";
2
- //#region src/utils.ts
3
- async function t(t, n) {
4
- try {
5
- return await t.resolve(n);
6
- } catch (t) {
7
- if (t instanceof e) return;
8
- throw t;
9
- }
10
- }
11
- async function n(e, n, r) {
12
- let i = await t(e, n);
13
- return i === void 0 ? r : i;
14
- }
15
- async function r(t, n) {
16
- try {
17
- return {
18
- ok: !0,
19
- value: await t.resolve(n)
20
- };
21
- } catch (t) {
22
- if (t instanceof e) return {
23
- error: t,
24
- ok: !1
25
- };
26
- throw t;
27
- }
28
- }
29
- function i(t, n) {
30
- try {
31
- return t.resolveSync(n);
32
- } catch (t) {
33
- if (t instanceof e) return;
34
- throw t;
35
- }
36
- }
37
- function a(e, t, n) {
38
- let r = i(e, t);
39
- return r === void 0 ? n : r;
40
- }
41
- function o(t, n) {
42
- try {
43
- return {
44
- ok: !0,
45
- value: t.resolveSync(n)
46
- };
47
- } catch (t) {
48
- if (t instanceof e) return {
49
- error: t,
50
- ok: !1
51
- };
52
- throw t;
53
- }
54
- }
55
- async function s(e, ...t) {
56
- for (let n of t) await n(e);
57
- return e;
58
- }
59
- //#endregion
60
- export { s as loadModules, t as resolveOptional, n as resolveOrDefault, i as resolveSyncOptional, a as resolveSyncOrDefault, r as tryResolve, o as trySyncResolve };
61
-
62
- //# sourceMappingURL=utils.js.map