nano-injector 1.0.3 → 1.0.5

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/lib/Provider.js CHANGED
@@ -1,59 +1,60 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getProviderName = exports.getProviderID = exports.isProvider = exports.createProvider = void 0;
4
- const InjectorsStack_1 = require("./InjectorsStack");
5
- /**
6
- * Symbol used for storing the id of a provider
7
- */
8
- const ID_SYMBOL = Symbol('id');
9
- /**
10
- * Symbol used for storing the name of a provider
11
- */
12
- const NAME_SYMBOL = Symbol('name');
13
- let PROVIDER_ID = 0;
14
- /**
15
- * Creates the new provider for some value with a specific type
16
- * @param name name for this provider used mainly for debugging purposes
17
- */
18
- function createProvider(name) {
19
- function provider(defValue) {
20
- const hasDefaultValue = arguments.length > 0;
21
- const { activeInjector } = InjectorsStack_1.InjectorsStack;
22
- if (hasDefaultValue) {
23
- return activeInjector.tryGetValue(provider, defValue);
24
- }
25
- return activeInjector.getValue(provider);
26
- }
27
- provider[NAME_SYMBOL] = name;
28
- provider[ID_SYMBOL] = PROVIDER_ID++;
29
- return provider;
30
- }
31
- exports.createProvider = createProvider;
32
- /**
33
- * Determines whether the received value is a provider
34
- * @param value value which should be tested
35
- */
36
- function isProvider(value) {
37
- if (typeof value !== 'function') {
38
- return false;
39
- }
40
- const provider = value;
41
- return typeof provider[ID_SYMBOL] !== 'undefined';
42
- }
43
- exports.isProvider = isProvider;
44
- /**
45
- * Returns the id of the specified provider
46
- * @param provider
47
- */
48
- function getProviderID(provider) {
49
- return provider[ID_SYMBOL];
50
- }
51
- exports.getProviderID = getProviderID;
52
- /**
53
- * Returns the name of the specified provider
54
- * @param provider
55
- */
56
- function getProviderName(provider) {
57
- return provider[NAME_SYMBOL];
58
- }
59
- exports.getProviderName = getProviderName;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createProvider = createProvider;
4
+ exports.isProvider = isProvider;
5
+ exports.getProviderID = getProviderID;
6
+ exports.getProviderName = getProviderName;
7
+ const InjectorsStack_1 = require("./InjectorsStack");
8
+ /**
9
+ * Symbol used to store the unique ID of a provider.
10
+ */
11
+ const ID_SYMBOL = Symbol('id');
12
+ /**
13
+ * Symbol used for storing the name of a provider
14
+ */
15
+ const NAME_SYMBOL = Symbol('name');
16
+ let PROVIDER_ID = 0;
17
+ /**
18
+ * Creates a new provider for a specific value type.
19
+ * @param name name for this provider used mainly for debugging purposes
20
+ */
21
+ function createProvider(name) {
22
+ function callback(defValue) {
23
+ const hasDefaultValue = arguments.length > 0;
24
+ const { activeInjector } = InjectorsStack_1.InjectorsStack;
25
+ if (hasDefaultValue) {
26
+ return activeInjector.tryGetValue(provider, defValue);
27
+ }
28
+ return activeInjector.getValue(provider);
29
+ }
30
+ const provider = Object.assign(callback, {
31
+ [NAME_SYMBOL]: name,
32
+ [ID_SYMBOL]: PROVIDER_ID++,
33
+ });
34
+ return provider;
35
+ }
36
+ /**
37
+ * Determines whether the given value is a provider.
38
+ * @param value value which should be tested
39
+ */
40
+ function isProvider(value) {
41
+ if (typeof value !== 'function') {
42
+ return false;
43
+ }
44
+ const provider = value;
45
+ return typeof provider[ID_SYMBOL] !== 'undefined';
46
+ }
47
+ /**
48
+ * Returns the unique ID of the specified provider.
49
+ * @param provider
50
+ */
51
+ function getProviderID(provider) {
52
+ return provider[ID_SYMBOL];
53
+ }
54
+ /**
55
+ * Returns the name of the specified provider
56
+ * @param provider
57
+ */
58
+ function getProviderName(provider) {
59
+ return provider[NAME_SYMBOL];
60
+ }
package/lib/index.js CHANGED
@@ -1,14 +1,18 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
- }) : (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- o[k2] = m[k];
8
- }));
9
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
- };
12
- Object.defineProperty(exports, "__esModule", { value: true });
13
- __exportStar(require("./Injector"), exports);
14
- __exportStar(require("./Provider"), exports);
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./Injector"), exports);
18
+ __exportStar(require("./Provider"), exports);
package/package.json CHANGED
@@ -1,57 +1,52 @@
1
- {
2
- "name": "nano-injector",
3
- "version": "1.0.3",
4
- "description": "Miniature dependency injection library for TypeScript and JavaScript",
5
- "main": "./lib/index.js",
6
- "types": "./typings/index.d.ts",
7
- "scripts": {
8
- "clear": "rimraf typings docs lib",
9
- "prepublishOnly": "npm run clear && npm test && npm run build",
10
- "precommit": "npm run clear && npm run lint && npm test && npm run build && npm run docs",
11
- "lint": "ts-standard",
12
- "lintfix": "ts-standard --fix",
13
- "build": "tsc",
14
- "docs": "typedoc src/index.ts",
15
- "test": "ts-mocha -p ./tsconfig.json ./test/*.test.ts"
16
- },
17
- "repository": {
18
- "type": "git",
19
- "url": "git+ssh://git@github.com/protoukr/nano-injector"
20
- },
21
- "files": [
22
- "lib",
23
- "typings"
24
- ],
25
- "keywords": [
26
- "typescript",
27
- "dependency injection",
28
- "di",
29
- "ioc",
30
- "inversion of control"
31
- ],
32
- "author": "Roman Pukhalskyi",
33
- "license": "MIT",
34
- "bugs": {
35
- "url": "https://github.com/protoukr/nano-injector/issues"
36
- },
37
- "homepage": "https://github.com/protoukr/nano-injector",
38
- "ts-standard": {
39
- "ignore": [
40
- "lib",
41
- "docs",
42
- "typings"
43
- ]
44
- },
45
- "devDependencies": {
46
- "@types/chai": "^4.2.22",
47
- "@types/mocha": "^8.2.3",
48
- "chai": "^4.3.4",
49
- "mocha": "^8.4.0",
50
- "rimraf": "^3.0.2",
51
- "ts-mocha": "^8.0.0",
52
- "ts-node": "^10.4.0",
53
- "ts-standard": "^11.0.0",
54
- "typedoc": "^0.22.10",
55
- "typescript": "^4.4.3"
56
- }
57
- }
1
+ {
2
+ "name": "nano-injector",
3
+ "version": "1.0.5",
4
+ "description": "Miniature dependency injection library for TypeScript and JavaScript",
5
+ "keywords": [
6
+ "typescript",
7
+ "dependency injection",
8
+ "di",
9
+ "ioc",
10
+ "inversion of control"
11
+ ],
12
+ "homepage": "https://github.com/protoukr/nano-injector",
13
+ "bugs": {
14
+ "url": "https://github.com/protoukr/nano-injector/issues"
15
+ },
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+ssh://git@github.com/protoukr/nano-injector"
19
+ },
20
+ "license": "MIT",
21
+ "author": "Roman Pukhalskyi",
22
+ "main": "./lib/index.js",
23
+ "types": "./typings/index.d.ts",
24
+ "files": [
25
+ "lib",
26
+ "typings"
27
+ ],
28
+ "scripts": {
29
+ "prebuild": "npm run clean",
30
+ "build": "tsc",
31
+ "clean": "rimraf typings docs lib",
32
+ "docs": "typedoc src/index.ts",
33
+ "example": "npx ts-node ./examples/index.ts",
34
+ "format:check": "prettier --check .",
35
+ "format:fix": "prettier --write .",
36
+ "prepublishOnly": "npm run verify",
37
+ "test": "jest",
38
+ "verify": "npm run format:check && npm test && npm run build"
39
+ },
40
+ "devDependencies": {
41
+ "@types/jest": "^30.0.0",
42
+ "@types/node": "^24.10.9",
43
+ "jest": "^30.2.0",
44
+ "prettier": "^3.8.1",
45
+ "prettier-plugin-packagejson": "^3.0.0",
46
+ "rimraf": "^3.0.2",
47
+ "ts-jest": "^29.4.6",
48
+ "ts-node": "^10.9.2",
49
+ "typedoc": "^0.28.16",
50
+ "typescript": "^5.9.3"
51
+ }
52
+ }
@@ -1,47 +1,44 @@
1
- import { Injector } from './Injector';
2
- export declare class NoCreationMethodSpecifiedError extends Error {
3
- constructor();
4
- }
5
- /**
6
- * Class through which is defined how to create value for this binder
7
- */
8
- export declare class Binder<T> {
9
- private readonly injector;
10
- private value;
11
- private ctor;
12
- private factory;
13
- private isSingleton;
14
- constructor(injector: Injector);
15
- /**
16
- * Creates the new value if needed through previously defined method, and returns it
17
- */
18
- getValue(): T;
19
- /**
20
- * Directly defines value for this binder
21
- * @param value
22
- */
23
- toValue(value: T): Binder<T>;
24
- /**
25
- * Defines constructor as a method for creating value. All previously defined methods
26
- * will be ignored
27
- * @param ctor
28
- */
29
- toConstructor(ctor: new () => T): Binder<T>;
30
- /**
31
- * Defines factory as a method for creating value. All previously defined methods
32
- * will be ignored
33
- * @param factory
34
- */
35
- toFactory(factory: (injector: Injector) => T): Binder<T>;
36
- /**
37
- * Defines whether value should be a singleton. If yes the value will be created only once
38
- * and the same instance will be returned forever
39
- * @param value
40
- */
41
- asSingleton(value?: boolean): Binder<T>;
42
- /**
43
- * Creates value through previously defined method
44
- * @private
45
- */
46
- private createValue;
47
- }
1
+ import { Injector } from './Injector';
2
+ export declare class NoCreationMethodSpecifiedError extends Error {
3
+ constructor();
4
+ }
5
+ /**
6
+ * A class that defines how to create a value for this binder.
7
+ */
8
+ export declare class Binder<T> {
9
+ private readonly injector;
10
+ private value;
11
+ private ctor;
12
+ private factory;
13
+ private isSingleton;
14
+ constructor(injector: Injector);
15
+ /**
16
+ * Creates a new value (if needed) using the defined creation method, and returns it.
17
+ */
18
+ getValue(): T;
19
+ /**
20
+ * Sets a specific value for this binder.
21
+ * @param value
22
+ */
23
+ toValue(value: T): Binder<T>;
24
+ /**
25
+ * Use a class constructor to create the value. Previous creation methods are cleared.
26
+ * @param ctor
27
+ */
28
+ toConstructor(ctor: new () => T): Binder<T>;
29
+ /**
30
+ * Use a factory function to create the value. Previous creation methods are cleared.
31
+ * @param factory
32
+ */
33
+ toFactory(factory: (injector: Injector) => T): Binder<T>;
34
+ /**
35
+ * Configures whether the value should be a singleton. If true, the value is created once and reused for all subsequent requests.
36
+ * @param value
37
+ */
38
+ asSingleton(value?: boolean): Binder<T>;
39
+ /**
40
+ * Creates the value using the configured creation method.
41
+ * @private
42
+ */
43
+ private createValue;
44
+ }
@@ -1,96 +1,93 @@
1
- import { Binder } from './Binder';
2
- import { Provider, ProviderValueType } from './Provider';
3
- /**
4
- * Thrown when circular dependency is detected
5
- */
6
- export declare class CircularDependencyError extends Error {
7
- constructor(providers: Array<Provider<unknown>>);
8
- }
9
- export declare class NoBinderError extends Error {
10
- constructor(provider: Provider<unknown>);
11
- }
12
- declare type UnionToIntersection<T> = (T extends any ? (k: T) => void : never) extends (k: infer R) => void ? R : never;
13
- /**
14
- * Provider which every injector binds itself to
15
- */
16
- export declare const $Injector: Provider<Injector>;
17
- /**
18
- * Main entity in the library, which holds provider's bindings and through which
19
- * dependencies are resolved
20
- */
21
- export declare class Injector {
22
- private readonly binders;
23
- private readonly resolvingProviders;
24
- private readonly name;
25
- private readonly parent;
26
- private readonly logger;
27
- /**
28
- * @param params.name name of the injector which can be useful mainly for debugging purposes
29
- * @param params.parent parent injector for the composition of injectors
30
- * @param params.logger specific log function if the custom output is required
31
- */
32
- constructor(params?: {
33
- name?: string;
34
- parent?: Injector;
35
- logger?: (msg: string) => unknown;
36
- });
37
- /**
38
- * Creates new binder and joins it to the specified providers. If the provider
39
- * is already bound, then overriding occurs
40
- * @param providers providers which the binder should be joined to
41
- */
42
- bindProvider<ProviderT extends Array<Provider<unknown>>, ValueT extends UnionToIntersection<ProviderT extends Array<Provider<infer R>> ? R : never>>(...providers: ProviderT): Binder<ValueT>;
43
- /**
44
- * Resolves all providers to their values and assigns them to the specified instance
45
- * @param instance
46
- * @param providers
47
- */
48
- injectValues<T extends object, K extends keyof T>(instance: T, providers: Record<K, Provider<T[K]>>): void;
49
- /**
50
- * Activates this injector and creates new instance of the type with the provided arguments
51
- * @param type
52
- * @param args
53
- */
54
- createInstance<ClassT extends new (...args: unknown[]) => unknown>(type: ClassT, ...args: ConstructorParameters<ClassT>): InstanceType<ClassT>;
55
- /**
56
- * Activates this injector and calls the function with provided arguments
57
- * @param func function which should be called
58
- * @param args args which should be passed to the called function
59
- */
60
- callFunc<FuncT extends (...args: unknown[]) => unknown>(func: FuncT, ...args: Parameters<FuncT>): ReturnType<FuncT>;
61
- /**
62
- * Returns bound to the specified provider value. If the value is not found
63
- * exception is thrown
64
- * @param provider
65
- */
66
- getValue<ProviderT extends Provider<unknown>>(provider: ProviderT): ProviderValueType<ProviderT>;
67
- /**
68
- * Returns bound to the specified provider value. If the value is not found
69
- * default value is returned
70
- * @param provider
71
- */
72
- tryGetValue<ProviderT extends Provider<unknown>>(provider: ProviderT): ProviderValueType<ProviderT> | undefined;
73
- tryGetValue<ProviderT extends Provider<unknown>, DefValT>(provider: ProviderT, defVal: DefValT): ProviderValueType<ProviderT> | DefValT;
74
- private pushResolvingProvider;
75
- private popResolvingProvder;
76
- private getBinder;
77
- /**
78
- * Finds binder for the specified provider recursively up to the root injector
79
- * @param provider
80
- * @private
81
- */
82
- private tryGetBinderRecursively;
83
- /**
84
- * Checks is there circular dependency and throws error if so
85
- * @param provider
86
- * @private
87
- */
88
- private checkCircularDependency;
89
- /**
90
- * Temporary activates this injector calls provided function and returns its value
91
- * @param func
92
- * @private
93
- */
94
- private activateAndCall;
95
- }
96
- export {};
1
+ import { Binder } from './Binder';
2
+ import { Provider, ProviderValueType } from './Provider';
3
+ /**
4
+ * Error thrown when a circular dependency is detected.
5
+ */
6
+ export declare class CircularDependencyError extends Error {
7
+ constructor(providers: Array<Provider<unknown>>);
8
+ }
9
+ export declare class NoBinderError extends Error {
10
+ constructor(provider: Provider<unknown>);
11
+ }
12
+ type UnionToIntersection<T> = (T extends any ? (k: T) => void : never) extends (k: infer R) => void ? R : never;
13
+ /**
14
+ * The provider to which every injector binds itself.
15
+ */
16
+ export declare const $Injector: Provider<Injector>;
17
+ /**
18
+ * The central entity of the library. It holds provider bindings and resolves dependencies.
19
+ */
20
+ export declare class Injector {
21
+ private readonly binders;
22
+ private readonly resolvingProviders;
23
+ private readonly name;
24
+ private readonly parent;
25
+ private readonly logger;
26
+ /**
27
+ * @param params.name Name of the injector (useful for debugging).
28
+ * @param params.parent Parent injector for composing injectors.
29
+ * @param params.logger Custom logger function.
30
+ */
31
+ constructor(params?: {
32
+ name?: string;
33
+ parent?: Injector;
34
+ logger?: (msg: string) => unknown;
35
+ });
36
+ /**
37
+ * Creates a new binder and links it to the specified providers.
38
+ * If a provider is already bound, the binding is overridden.
39
+ * @param providers The providers to bind.
40
+ */
41
+ bindProvider<ProviderT extends Array<Provider<unknown>>, ValueT extends UnionToIntersection<ProviderT extends Array<Provider<infer R>> ? R : never>>(...providers: ProviderT): Binder<ValueT>;
42
+ /**
43
+ * Resolves specific providers to their values and assigns them to the instance's properties.
44
+ * @param instance
45
+ * @param providers
46
+ */
47
+ injectValues<T extends object, K extends keyof T>(instance: T, providers: Record<K, Provider<T[K]>>): void;
48
+ /**
49
+ * Activates the injector and creates a new instance of the given class using the provided arguments.
50
+ * @param type
51
+ * @param args
52
+ */
53
+ createInstance<ClassT extends new (...args: any[]) => unknown>(type: ClassT, ...args: ConstructorParameters<ClassT>): InstanceType<ClassT>;
54
+ /**
55
+ * Activates the injector and calls the given function with the provided arguments.
56
+ * @param func function which should be called
57
+ * @param args args which should be passed to the called function
58
+ */
59
+ callFunc<FuncT extends (...args: any[]) => unknown>(func: FuncT, ...args: Parameters<FuncT>): ReturnType<FuncT>;
60
+ /**
61
+ * Returns the value bound to the specified provider. Throws an exception if the value is not found.
62
+ * @param provider
63
+ */
64
+ getValue<ProviderT extends Provider<unknown>>(provider: ProviderT): ProviderValueType<ProviderT>;
65
+ /**
66
+ * Returns the value bound to the specified provider, or the default value if the bound value is not found.
67
+ * @param provider
68
+ */
69
+ tryGetValue<ProviderT extends Provider<unknown>>(provider: ProviderT): ProviderValueType<ProviderT> | undefined;
70
+ tryGetValue<ProviderT extends Provider<unknown>, DefValT>(provider: ProviderT, defVal: DefValT): ProviderValueType<ProviderT> | DefValT;
71
+ private pushResolvingProvider;
72
+ private popResolvingProvder;
73
+ private getBinder;
74
+ /**
75
+ * Recursively looks up the binder for the specified provider, traversing up to the root injector.
76
+ * @param provider
77
+ * @private
78
+ */
79
+ private tryGetBinderRecursively;
80
+ /**
81
+ * Checks for circular dependencies and throws an error if one is detected.
82
+ * @param provider
83
+ * @private
84
+ */
85
+ private checkCircularDependency;
86
+ /**
87
+ * Temporarily activates this injector to execute the provided function and return its result.
88
+ * @param func
89
+ * @private
90
+ */
91
+ private activateAndCall;
92
+ }
93
+ export {};
@@ -1,16 +1,16 @@
1
- import { Injector } from './Injector';
2
- export declare class NoActiveInjectorError extends Error {
3
- constructor();
4
- }
5
- /**
6
- * Private class for holding current active injector
7
- */
8
- declare class _InjectorsStack {
9
- private readonly injectors;
10
- private _activeInjector?;
11
- get activeInjector(): Injector;
12
- push(injector: Injector): void;
13
- pop(): void;
14
- }
15
- export declare const InjectorsStack: _InjectorsStack;
16
- export {};
1
+ import { Injector } from './Injector';
2
+ export declare class NoActiveInjectorError extends Error {
3
+ constructor();
4
+ }
5
+ /**
6
+ * Private class to manage the stack of active injectors.
7
+ */
8
+ declare class _InjectorsStack {
9
+ private readonly injectors;
10
+ private _activeInjector?;
11
+ get activeInjector(): Injector;
12
+ push(injector: Injector): void;
13
+ pop(): void;
14
+ }
15
+ export declare const InjectorsStack: _InjectorsStack;
16
+ export {};