ts-ioc-container 68.0.0 → 68.1.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/README.md CHANGED
@@ -1792,6 +1792,8 @@ Constructor parameters that should pick up positional args from `ProviderOptions
1792
1792
 
1793
1793
  `argsFn(predicate)` is the general form: it iterates the runtime `args` array and returns the **first argument matching** `predicate(value, index)` — think `args.find(predicate)`. `arg(index)` is just a shortcut for matching by position: `arg(0)` is `argsFn((value, index) => index === 0)`. `args` is `(scope, options) => options.args`, i.e. it returns the runtime args array as-is. Every `InjectFn` receives `(scope, options)`, where `options.args` is the runtime args array.
1794
1794
 
1795
+ `findOrFail(predicate)` is the strict, variadic counterpart for places that take the raw args list — `singleton(findOrFail(isUserId))` keys a per-argument singleton, for example. It returns the first argument matching `predicate(value)` and throws `ArgumentNotFoundError` when none does, instead of silently handing out `undefined`.
1796
+
1795
1797
  ### Immutable token chaining
1796
1798
 
1797
1799
  `token.args(...)`, `token.argsFn(...)`, and `token.lazy()` all return **new token instances** — the parent token is never mutated. This allows the same token to be specialized in multiple independent ways (one-way linked list: parent → many children).
@@ -3398,3 +3400,4 @@ The product-facing error contract is described in
3398
3400
  - [MethodNotImplementedError.ts](..%2F..%2Flib%2Ferrors%2FMethodNotImplementedError.ts)
3399
3401
  - [DependencyMissingKeyError.ts](..%2F..%2Flib%2Ferrors%2FDependencyMissingKeyError.ts)
3400
3402
  - [ContainerDisposedError.ts](..%2F..%2Flib%2Ferrors%2FContainerDisposedError.ts)
3403
+ - [ArgumentNotFoundError.ts](..%2F..%2Flib%2Ferrors%2FArgumentNotFoundError.ts)
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ArgumentNotFoundError = void 0;
4
+ const ContainerError_1 = require("./ContainerError");
5
+ class ArgumentNotFoundError extends ContainerError_1.ContainerError {
6
+ name = 'ArgumentNotFoundError';
7
+ constructor(message = 'Argument not found') {
8
+ super(message);
9
+ Object.setPrototypeOf(this, ArgumentNotFoundError.prototype);
10
+ }
11
+ }
12
+ exports.ArgumentNotFoundError = ArgumentNotFoundError;
package/cjm/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.sequential = exports.injectProp = exports.createHookExecutionContext = exports.createHookContextFactory = exports.HookContext = exports.toHookFn = exports.hasHooks = exports.hook = exports.getHooks = exports.TypedEventDisposedError = exports.UnsupportedTokenTypeError = exports.CannonSingletonApplyTwiceError = exports.ProviderDisposedError = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyMissingKeyError = exports.ContainerNotFoundError = exports.DependencyNotFoundError = exports.ContainerError = exports.Registration = exports.onResolve = exports.appendArgsFn = exports.appendArgs = exports.decorate = exports.singleton = exports.autoResolve = exports.lazy = exports.scopeAccess = exports.scope = exports.bindTo = exports.register = exports.toRegistrationFn = exports.toProviderFn = exports.toBindToken = exports.registerPipe = exports.isProviderPipe = exports.Provider = exports.ProxyInjector = exports.SimpleInjector = exports.resolveArgs = exports.argsFn = exports.args = exports.arg = exports.inject = exports.MetadataInjector = exports.Injector = exports.EmptyContainer = exports.AutoResolveModule = exports.Container = exports.isDependencyKey = void 0;
4
- exports.ProxyRegistry = exports.pipe = exports.select = exports.TypedEvent = exports.getConstructorChain = exports.memoize = exports.once = exports.shallowCache = exports.debounce = exports.throttle = exports.runAtOnce = exports.runInOrder = exports.handleAsyncError = exports.handleError = exports.getMethodTags = exports.addMethodTag = exports.getMethodLabels = exports.addMethodLabel = exports.getMethodMeta = exports.addMethodMeta = exports.getParamTags = exports.addParamTag = exports.getParamLabels = exports.addParamLabel = exports.getParamMeta = exports.addParamMeta = exports.getClassTags = exports.addClassTag = exports.getClassLabels = exports.addClassLabel = exports.getClassMeta = exports.addClassMeta = exports.resolveConstructor = exports.GroupInstanceToken = exports.ConstantToken = exports.FunctionToken = exports.SingleToken = exports.ClassToken = exports.toSingleAlias = exports.SingleAliasToken = exports.toGroupAlias = exports.GroupAliasToken = exports.argToToken = exports.toMappedToken = exports.toToken = exports.InjectionToken = exports.toTask = exports.HookCollector = exports.oncePerInstance = exports.parallel = void 0;
5
- exports.Is = exports.unwrapProxy = void 0;
3
+ exports.injectProp = exports.createHookExecutionContext = exports.createHookContextFactory = exports.HookContext = exports.toHookFn = exports.hasHooks = exports.hook = exports.getHooks = exports.ArgumentNotFoundError = exports.TypedEventDisposedError = exports.UnsupportedTokenTypeError = exports.CannonSingletonApplyTwiceError = exports.ProviderDisposedError = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyMissingKeyError = exports.ContainerNotFoundError = exports.DependencyNotFoundError = exports.ContainerError = exports.Registration = exports.onResolve = exports.appendArgsFn = exports.appendArgs = exports.decorate = exports.singleton = exports.autoResolve = exports.lazy = exports.scopeAccess = exports.scope = exports.bindTo = exports.register = exports.toRegistrationFn = exports.toProviderFn = exports.toBindToken = exports.registerPipe = exports.isProviderPipe = exports.Provider = exports.ProxyInjector = exports.SimpleInjector = exports.resolveArgs = exports.argsFn = exports.args = exports.arg = exports.inject = exports.MetadataInjector = exports.Injector = exports.EmptyContainer = exports.AutoResolveModule = exports.Container = exports.isDependencyKey = void 0;
4
+ exports.pipe = exports.select = exports.TypedEvent = exports.getConstructorChain = exports.memoize = exports.once = exports.shallowCache = exports.debounce = exports.throttle = exports.runAtOnce = exports.runInOrder = exports.handleAsyncError = exports.handleError = exports.getMethodTags = exports.addMethodTag = exports.getMethodLabels = exports.addMethodLabel = exports.getMethodMeta = exports.addMethodMeta = exports.getParamTags = exports.addParamTag = exports.getParamLabels = exports.addParamLabel = exports.getParamMeta = exports.addParamMeta = exports.getClassTags = exports.addClassTag = exports.getClassLabels = exports.addClassLabel = exports.getClassMeta = exports.addClassMeta = exports.resolveConstructor = exports.GroupInstanceToken = exports.ConstantToken = exports.FunctionToken = exports.SingleToken = exports.ClassToken = exports.toSingleAlias = exports.SingleAliasToken = exports.toGroupAlias = exports.GroupAliasToken = exports.argToToken = exports.toMappedToken = exports.toToken = exports.InjectionToken = exports.toTask = exports.HookCollector = exports.oncePerInstance = exports.parallel = exports.sequential = void 0;
5
+ exports.Is = exports.unwrapProxy = exports.ProxyRegistry = exports.findOrFail = void 0;
6
6
  var IContainer_1 = require("./container/IContainer");
7
7
  Object.defineProperty(exports, "isDependencyKey", { enumerable: true, get: function () { return IContainer_1.isDependencyKey; } });
8
8
  var Container_1 = require("./container/Container");
@@ -65,6 +65,8 @@ var UnsupportedTokenTypeError_1 = require("./errors/UnsupportedTokenTypeError");
65
65
  Object.defineProperty(exports, "UnsupportedTokenTypeError", { enumerable: true, get: function () { return UnsupportedTokenTypeError_1.UnsupportedTokenTypeError; } });
66
66
  var TypedEventDisposedError_1 = require("./errors/TypedEventDisposedError");
67
67
  Object.defineProperty(exports, "TypedEventDisposedError", { enumerable: true, get: function () { return TypedEventDisposedError_1.TypedEventDisposedError; } });
68
+ var ArgumentNotFoundError_1 = require("./errors/ArgumentNotFoundError");
69
+ Object.defineProperty(exports, "ArgumentNotFoundError", { enumerable: true, get: function () { return ArgumentNotFoundError_1.ArgumentNotFoundError; } });
68
70
  var hook_1 = require("./hooks/hook");
69
71
  Object.defineProperty(exports, "getHooks", { enumerable: true, get: function () { return hook_1.getHooks; } });
70
72
  Object.defineProperty(exports, "hook", { enumerable: true, get: function () { return hook_1.hook; } });
@@ -152,6 +154,8 @@ var select_1 = require("./select");
152
154
  Object.defineProperty(exports, "select", { enumerable: true, get: function () { return select_1.select; } });
153
155
  var fp_1 = require("./utils/fp");
154
156
  Object.defineProperty(exports, "pipe", { enumerable: true, get: function () { return fp_1.pipe; } });
157
+ var array_1 = require("./utils/array");
158
+ Object.defineProperty(exports, "findOrFail", { enumerable: true, get: function () { return array_1.findOrFail; } });
155
159
  var ProxyRegistry_1 = require("./utils/ProxyRegistry");
156
160
  Object.defineProperty(exports, "ProxyRegistry", { enumerable: true, get: function () { return ProxyRegistry_1.ProxyRegistry; } });
157
161
  Object.defineProperty(exports, "unwrapProxy", { enumerable: true, get: function () { return ProxyRegistry_1.unwrapProxy; } });
@@ -1,9 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Filter = void 0;
3
+ exports.findOrFail = exports.Filter = void 0;
4
+ const ArgumentNotFoundError_1 = require("../errors/ArgumentNotFoundError");
4
5
  exports.Filter = {
5
6
  exclude: (arr) => {
6
7
  const excludeSet = arr instanceof Array ? new Set(arr) : arr;
7
8
  return (v) => !excludeSet.has(v);
8
9
  },
9
10
  };
11
+ const findOrFail = (predicate) => (...args) => {
12
+ const index = args.findIndex((arg) => predicate(arg));
13
+ if (index === -1) {
14
+ throw new ArgumentNotFoundError_1.ArgumentNotFoundError();
15
+ }
16
+ return args[index];
17
+ };
18
+ exports.findOrFail = findOrFail;
@@ -0,0 +1,8 @@
1
+ import { ContainerError } from './ContainerError.js';
2
+ export class ArgumentNotFoundError extends ContainerError {
3
+ name = 'ArgumentNotFoundError';
4
+ constructor(message = 'Argument not found') {
5
+ super(message);
6
+ Object.setPrototypeOf(this, ArgumentNotFoundError.prototype);
7
+ }
8
+ }
package/esm/index.js CHANGED
@@ -19,6 +19,7 @@ export { ProviderDisposedError } from './errors/ProviderDisposedError.js';
19
19
  export { CannonSingletonApplyTwiceError } from './errors/CannonSingletonApplyTwiceError.js';
20
20
  export { UnsupportedTokenTypeError } from './errors/UnsupportedTokenTypeError.js';
21
21
  export { TypedEventDisposedError } from './errors/TypedEventDisposedError.js';
22
+ export { ArgumentNotFoundError } from './errors/ArgumentNotFoundError.js';
22
23
  export { getHooks, hook, hasHooks, toHookFn, } from './hooks/hook.js';
23
24
  export { HookContext, createHookContextFactory, createHookExecutionContext, } from './hooks/HookContext.js';
24
25
  export { injectProp } from './hooks/injectProp.js';
@@ -48,5 +49,6 @@ export { getConstructorChain } from './utils/getConstructorChain.js';
48
49
  export { TypedEvent } from './utils/TypedEvent.js';
49
50
  export { select } from './select.js';
50
51
  export { pipe } from './utils/fp.js';
52
+ export { findOrFail } from './utils/array.js';
51
53
  export { ProxyRegistry, unwrapProxy } from './utils/ProxyRegistry.js';
52
54
  export { Is } from './utils/basic.js';
@@ -1,6 +1,14 @@
1
+ import { ArgumentNotFoundError } from '../errors/ArgumentNotFoundError.js';
1
2
  export const Filter = {
2
3
  exclude: (arr) => {
3
4
  const excludeSet = arr instanceof Array ? new Set(arr) : arr;
4
5
  return (v) => !excludeSet.has(v);
5
6
  },
6
7
  };
8
+ export const findOrFail = (predicate) => (...args) => {
9
+ const index = args.findIndex((arg) => predicate(arg));
10
+ if (index === -1) {
11
+ throw new ArgumentNotFoundError();
12
+ }
13
+ return args[index];
14
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ts-ioc-container",
3
- "version": "68.0.0",
3
+ "version": "68.1.0",
4
4
  "description": "Fast, lightweight TypeScript dependency injection container with a clean API, scoped lifecycles, decorators, tokens, hooks, lazy injection, customizable providers, and no global container objects.",
5
5
  "publishConfig": {
6
6
  "access": "public",
@@ -0,0 +1,5 @@
1
+ import { ContainerError } from './ContainerError.js';
2
+ export declare class ArgumentNotFoundError extends ContainerError {
3
+ name: string;
4
+ constructor(message?: string);
5
+ }
@@ -20,6 +20,7 @@ export { ProviderDisposedError } from './errors/ProviderDisposedError.js';
20
20
  export { CannonSingletonApplyTwiceError } from './errors/CannonSingletonApplyTwiceError.js';
21
21
  export { UnsupportedTokenTypeError } from './errors/UnsupportedTokenTypeError.js';
22
22
  export { TypedEventDisposedError } from './errors/TypedEventDisposedError.js';
23
+ export { ArgumentNotFoundError } from './errors/ArgumentNotFoundError.js';
23
24
  export { getHooks, hook, hasHooks, toHookFn, type HookFn, type HookClass, type HookType, type InjectFn, type HooksOfClass, } from './hooks/hook.js';
24
25
  export { HookContext, createHookContextFactory, createHookExecutionContext, type CreateHookExecutionContext, type IHookContext, } from './hooks/HookContext.js';
25
26
  export { injectProp } from './hooks/injectProp.js';
@@ -50,5 +51,6 @@ export { TypedEvent, type ITypedEvent, type TypedEventListener, type Unsubscribe
50
51
  export { type ExecutionContext } from './ExecutionContext.js';
51
52
  export { select } from './select.js';
52
53
  export { pipe, type MapFn } from './utils/fp.js';
54
+ export { findOrFail, type Predicate } from './utils/array.js';
53
55
  export { ProxyRegistry, unwrapProxy, type IProxyRegistry } from './utils/ProxyRegistry.js';
54
56
  export { type Branded, type constructor, type Instance, Is } from './utils/basic.js';
@@ -1,3 +1,5 @@
1
+ export type Predicate<T> = (value: T) => boolean;
1
2
  export declare const Filter: {
2
3
  exclude: <T>(arr: Set<T> | T[]) => (v: T) => boolean;
3
4
  };
5
+ export declare const findOrFail: <T>(predicate: Predicate<T>) => (...args: unknown[]) => T;