@khapu2906/treasure-chest 1.0.4 → 1.3.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 +490 -27
- package/dist/cjs/Container.js +491 -0
- package/dist/cjs/Container.js.map +1 -0
- package/dist/cjs/Lazy.js +46 -0
- package/dist/cjs/Lazy.js.map +1 -0
- package/dist/cjs/Scope.js +93 -0
- package/dist/cjs/Scope.js.map +1 -0
- package/dist/cjs/index.js +40 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/types.js +8 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/esm/Container.js +487 -0
- package/dist/esm/Container.js.map +1 -0
- package/dist/esm/Lazy.js +42 -0
- package/dist/esm/Lazy.js.map +1 -0
- package/dist/esm/Scope.js +89 -0
- package/dist/esm/Scope.js.map +1 -0
- package/dist/esm/index.js +34 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/types.js +7 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/types/Container.d.ts +299 -0
- package/dist/types/Container.d.ts.map +1 -0
- package/dist/types/Lazy.d.ts +34 -0
- package/dist/types/Lazy.d.ts.map +1 -0
- package/dist/types/Scope.d.ts +60 -0
- package/dist/types/Scope.d.ts.map +1 -0
- package/dist/types/index.d.ts +34 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/types.d.ts +77 -0
- package/dist/types/types.d.ts.map +1 -0
- package/package.json +63 -16
- package/dist/index.d.ts +0 -53
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -110
- package/dist/index.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,22 +1,66 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@khapu2906/treasure-chest",
|
|
3
|
-
"version": "1.0
|
|
4
|
-
"description": "A container
|
|
5
|
-
"main": "dist/index.js",
|
|
6
|
-
"
|
|
3
|
+
"version": "1.3.0",
|
|
4
|
+
"description": "A lightweight TypeScript dependency injection container for managing service dependencies",
|
|
5
|
+
"main": "dist/cjs/index.js",
|
|
6
|
+
"module": "dist/esm/index.js",
|
|
7
|
+
"types": "dist/types/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/types/index.d.ts",
|
|
11
|
+
"import": "./dist/esm/index.js",
|
|
12
|
+
"require": "./dist/cjs/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
7
15
|
"files": [
|
|
8
|
-
"dist"
|
|
16
|
+
"dist",
|
|
17
|
+
"README.md",
|
|
18
|
+
"LICENSE"
|
|
9
19
|
],
|
|
10
20
|
"scripts": {
|
|
11
|
-
"build": "
|
|
12
|
-
"
|
|
21
|
+
"build": "npm run clean && npm run build:cjs && npm run build:esm && npm run build:types",
|
|
22
|
+
"build:cjs": "tsc -p tsconfig.cjs.json",
|
|
23
|
+
"build:esm": "tsc -p tsconfig.esm.json",
|
|
24
|
+
"build:types": "tsc -p tsconfig.types.json",
|
|
25
|
+
"clean": "rm -rf dist",
|
|
26
|
+
"test": "vitest run",
|
|
27
|
+
"test:watch": "vitest",
|
|
13
28
|
"test:ui": "vitest --ui",
|
|
14
|
-
"
|
|
29
|
+
"test:coverage": "vitest run --coverage",
|
|
30
|
+
"bench": "tsx benchmarks/performance.ts",
|
|
31
|
+
"example": "tsx",
|
|
32
|
+
"example:01": "tsx examples/01-basic-usage.ts",
|
|
33
|
+
"example:02": "tsx examples/02-dependency-injection.ts",
|
|
34
|
+
"example:03": "tsx examples/03-conditional-binding.ts",
|
|
35
|
+
"example:04": "tsx examples/04-contextual-binding.ts",
|
|
36
|
+
"example:05": "tsx examples/05-alias.ts",
|
|
37
|
+
"example:06": "tsx examples/06-scoped-lifecycle.ts",
|
|
38
|
+
"example:07": "tsx examples/07-lazy-loading.ts",
|
|
39
|
+
"example:08": "tsx examples/08-child-containers.ts",
|
|
40
|
+
"example:09": "tsx examples/09-circular-dependency.ts",
|
|
41
|
+
"example:10": "tsx examples/10-middleware.ts",
|
|
42
|
+
"example:11": "tsx examples/11-composition.ts",
|
|
43
|
+
"example:12": "tsx examples/12-singleton-vs-composition.ts",
|
|
44
|
+
"example:13": "tsx examples/13-hybrid-architecture.ts",
|
|
45
|
+
"example:14": "tsx examples/14-explain-composition.ts",
|
|
46
|
+
"examples": "npm run example:01 && npm run example:02 && npm run example:03 && npm run example:04 && npm run example:05 && npm run example:06 && npm run example:07 && npm run example:08 && npm run example:09 && npm run example:10 && npm run example:11 && npm run example:12 && npm run example:13 && npm run example:14",
|
|
47
|
+
"lint": "eslint . --ext .ts",
|
|
48
|
+
"lint:fix": "eslint . --ext .ts --fix",
|
|
49
|
+
"format": "prettier --write \"**/*.{ts,json,md}\"",
|
|
50
|
+
"format:check": "prettier --check \"**/*.{ts,json,md}\"",
|
|
51
|
+
"prepublishOnly": "npm run lint && npm run format:check && npm run build && npm test"
|
|
15
52
|
},
|
|
16
53
|
"keywords": [
|
|
17
54
|
"container",
|
|
18
|
-
"
|
|
19
|
-
"
|
|
55
|
+
"dependency-injection",
|
|
56
|
+
"di",
|
|
57
|
+
"ioc",
|
|
58
|
+
"inversion-of-control",
|
|
59
|
+
"service-container",
|
|
60
|
+
"typescript",
|
|
61
|
+
"singleton",
|
|
62
|
+
"transient",
|
|
63
|
+
"contextual-binding"
|
|
20
64
|
],
|
|
21
65
|
"author": "Kent Phung",
|
|
22
66
|
"license": "DIB",
|
|
@@ -30,10 +74,13 @@
|
|
|
30
74
|
"homepage": "https://github.com/khapu2906/treasure-chest#readme",
|
|
31
75
|
"devDependencies": {
|
|
32
76
|
"@types/node": "^24.10.0",
|
|
33
|
-
"typescript": "^
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
"
|
|
37
|
-
"
|
|
77
|
+
"@typescript-eslint/eslint-plugin": "^8.20.0",
|
|
78
|
+
"@typescript-eslint/parser": "^8.20.0",
|
|
79
|
+
"@vitest/coverage-v8": "^4.0.7",
|
|
80
|
+
"eslint": "^9.17.0",
|
|
81
|
+
"prettier": "^3.4.2",
|
|
82
|
+
"tsx": "^4.19.2",
|
|
83
|
+
"typescript": "^5.9.3",
|
|
84
|
+
"vitest": "^4.0.7"
|
|
38
85
|
}
|
|
39
|
-
}
|
|
86
|
+
}
|
package/dist/index.d.ts
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Treasure Chest Service Container in TypeScript
|
|
3
|
-
* Supports:
|
|
4
|
-
* - bind / singleton
|
|
5
|
-
* - conditional binding
|
|
6
|
-
* - contextual binding
|
|
7
|
-
* - alias
|
|
8
|
-
* - resolve
|
|
9
|
-
*/
|
|
10
|
-
type FactoryFn<T> = (c: Container) => T;
|
|
11
|
-
type ConditionFn = (c: Container) => boolean;
|
|
12
|
-
export declare class Container {
|
|
13
|
-
private bindings;
|
|
14
|
-
private instances;
|
|
15
|
-
private aliases;
|
|
16
|
-
private currentContext?;
|
|
17
|
-
/**
|
|
18
|
-
* Bind a dependency (default: transient)
|
|
19
|
-
*/
|
|
20
|
-
bind<T>(key: string, factory: FactoryFn<T>, condition?: ConditionFn): void;
|
|
21
|
-
/**
|
|
22
|
-
* Bind a dependency as singleton (only one instance created)
|
|
23
|
-
*/
|
|
24
|
-
singleton<T>(key: string, factory: FactoryFn<T>, condition?: ConditionFn): void;
|
|
25
|
-
/**
|
|
26
|
-
* Add an alias for an existing key
|
|
27
|
-
*/
|
|
28
|
-
alias(aliasKey: string, originalKey: string): void;
|
|
29
|
-
/**
|
|
30
|
-
* Internal: find correct binding based on key + condition + context
|
|
31
|
-
*/
|
|
32
|
-
private findBinding;
|
|
33
|
-
/**
|
|
34
|
-
* Resolve an instance from the container
|
|
35
|
-
*/
|
|
36
|
-
resolve<T>(key: string, context?: string): T;
|
|
37
|
-
/**
|
|
38
|
-
* Contextual binding:
|
|
39
|
-
* Example:
|
|
40
|
-
* container.when('UserService').needs('UserRepo').give(...)
|
|
41
|
-
*/
|
|
42
|
-
when(context: string): {
|
|
43
|
-
needs: (depKey: string) => {
|
|
44
|
-
give: (factory: FactoryFn<any>) => void;
|
|
45
|
-
};
|
|
46
|
-
};
|
|
47
|
-
/**
|
|
48
|
-
* Clear all bindings and instances (useful for testing)
|
|
49
|
-
*/
|
|
50
|
-
reset(): void;
|
|
51
|
-
}
|
|
52
|
-
export {};
|
|
53
|
-
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,KAAK,CAAC,CAAC;AACxC,KAAK,WAAW,GAAG,CAAC,CAAC,EAAE,SAAS,KAAK,OAAO,CAAC;AAU7C,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,SAAS,CAA2B;IAC5C,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,cAAc,CAAC,CAAS;IAEhC;;OAEG;IACH,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,WAAW;IAInE;;OAEG;IACH,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,WAAW;IAIxE;;OAEG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAI3C;;OAEG;IACH,OAAO,CAAC,WAAW;IAsBnB;;OAEG;IACH,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC;IA8B5C;;;;OAIG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM;wBAEA,MAAM;4BACJ,SAAS,CAAC,GAAG,CAAC;;;IAYpC;;OAEG;IACH,KAAK;CAMN"}
|
package/dist/index.js
DELETED
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Treasure Chest Service Container in TypeScript
|
|
4
|
-
* Supports:
|
|
5
|
-
* - bind / singleton
|
|
6
|
-
* - conditional binding
|
|
7
|
-
* - contextual binding
|
|
8
|
-
* - alias
|
|
9
|
-
* - resolve
|
|
10
|
-
*/
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.Container = void 0;
|
|
13
|
-
class Container {
|
|
14
|
-
constructor() {
|
|
15
|
-
this.bindings = [];
|
|
16
|
-
this.instances = {};
|
|
17
|
-
this.aliases = {};
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Bind a dependency (default: transient)
|
|
21
|
-
*/
|
|
22
|
-
bind(key, factory, condition) {
|
|
23
|
-
this.bindings.push({ key, factory, singleton: false, condition });
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Bind a dependency as singleton (only one instance created)
|
|
27
|
-
*/
|
|
28
|
-
singleton(key, factory, condition) {
|
|
29
|
-
this.bindings.push({ key, factory, singleton: true, condition });
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Add an alias for an existing key
|
|
33
|
-
*/
|
|
34
|
-
alias(aliasKey, originalKey) {
|
|
35
|
-
this.aliases[aliasKey] = originalKey;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Internal: find correct binding based on key + condition + context
|
|
39
|
-
*/
|
|
40
|
-
findBinding(key, context) {
|
|
41
|
-
const realKey = this.aliases[key] || key;
|
|
42
|
-
const bindings = this.bindings.filter((b) => b.key === realKey);
|
|
43
|
-
if (bindings.length === 0) {
|
|
44
|
-
throw new Error(`No binding found for key: ${realKey}`);
|
|
45
|
-
}
|
|
46
|
-
// Priority:
|
|
47
|
-
// 1. Binding with context and condition true
|
|
48
|
-
// 2. Binding without context but condition true
|
|
49
|
-
// 3. Binding default first
|
|
50
|
-
const match = bindings.find((b) => b.context === context && (!b.condition || b.condition(this))) ||
|
|
51
|
-
bindings.find((b) => !b.context && (!b.condition || b.condition(this))) ||
|
|
52
|
-
bindings[0];
|
|
53
|
-
return match;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Resolve an instance from the container
|
|
57
|
-
*/
|
|
58
|
-
resolve(key, context) {
|
|
59
|
-
const prevContext = this.currentContext;
|
|
60
|
-
this.currentContext = context || key;
|
|
61
|
-
// Get real key (resolve alias)
|
|
62
|
-
const realKey = this.aliases[key] || key;
|
|
63
|
-
const binding = this.findBinding(key, this.currentContext);
|
|
64
|
-
// Create unique cache key for contextual singletons
|
|
65
|
-
const cacheKey = binding.context
|
|
66
|
-
? `${realKey}::${binding.context}`
|
|
67
|
-
: realKey;
|
|
68
|
-
// Return existing singleton instance
|
|
69
|
-
if (binding.singleton && this.instances[cacheKey]) {
|
|
70
|
-
this.currentContext = prevContext;
|
|
71
|
-
return this.instances[cacheKey];
|
|
72
|
-
}
|
|
73
|
-
const instance = binding.factory(this);
|
|
74
|
-
if (binding.singleton) {
|
|
75
|
-
this.instances[cacheKey] = instance;
|
|
76
|
-
}
|
|
77
|
-
this.currentContext = prevContext;
|
|
78
|
-
return instance;
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Contextual binding:
|
|
82
|
-
* Example:
|
|
83
|
-
* container.when('UserService').needs('UserRepo').give(...)
|
|
84
|
-
*/
|
|
85
|
-
when(context) {
|
|
86
|
-
return {
|
|
87
|
-
needs: (depKey) => ({
|
|
88
|
-
give: (factory) => {
|
|
89
|
-
this.bindings.push({
|
|
90
|
-
key: depKey,
|
|
91
|
-
factory,
|
|
92
|
-
singleton: false,
|
|
93
|
-
context,
|
|
94
|
-
});
|
|
95
|
-
},
|
|
96
|
-
}),
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Clear all bindings and instances (useful for testing)
|
|
101
|
-
*/
|
|
102
|
-
reset() {
|
|
103
|
-
this.bindings = [];
|
|
104
|
-
this.instances = {};
|
|
105
|
-
this.aliases = {};
|
|
106
|
-
this.currentContext = undefined;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
exports.Container = Container;
|
|
110
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|