@venizia/ignis-inversion 0.0.6 → 0.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 +18 -18
- package/dist/cjs/binding/binding.d.ts +32 -0
- package/dist/cjs/binding/binding.d.ts.map +1 -0
- package/dist/cjs/binding/binding.js +114 -0
- package/dist/cjs/binding/binding.js.map +1 -0
- package/dist/cjs/binding/common/constants.d.ts +19 -0
- package/dist/cjs/binding/common/constants.d.ts.map +1 -0
- package/dist/cjs/binding/common/constants.js +37 -0
- package/dist/cjs/binding/common/constants.js.map +1 -0
- package/dist/cjs/binding/common/index.d.ts +3 -0
- package/dist/cjs/binding/common/index.d.ts.map +1 -0
- package/dist/cjs/binding/common/index.js +19 -0
- package/dist/cjs/binding/common/index.js.map +1 -0
- package/dist/cjs/binding/common/types.d.ts +28 -0
- package/dist/cjs/binding/common/types.d.ts.map +1 -0
- package/dist/cjs/binding/common/types.js +8 -0
- package/dist/cjs/binding/common/types.js.map +1 -0
- package/dist/cjs/binding/index.d.ts +3 -0
- package/dist/cjs/binding/index.d.ts.map +1 -0
- package/dist/cjs/binding/index.js +19 -0
- package/dist/cjs/binding/index.js.map +1 -0
- package/dist/cjs/common/app-error.d.ts.map +1 -1
- package/dist/cjs/common/app-error.js +6 -1
- package/dist/cjs/common/app-error.js.map +1 -1
- package/dist/cjs/common/index.d.ts +0 -1
- package/dist/cjs/common/index.d.ts.map +1 -1
- package/dist/cjs/common/index.js +0 -1
- package/dist/cjs/common/index.js.map +1 -1
- package/dist/cjs/common/types.d.ts +14 -38
- package/dist/cjs/common/types.d.ts.map +1 -1
- package/dist/cjs/common/types.js +18 -44
- package/dist/cjs/common/types.js.map +1 -1
- package/dist/cjs/container/abstract.d.ts +71 -0
- package/dist/cjs/container/abstract.d.ts.map +1 -0
- package/dist/cjs/container/abstract.js +17 -0
- package/dist/cjs/container/abstract.js.map +1 -0
- package/dist/cjs/container/base.d.ts +69 -0
- package/dist/cjs/container/base.d.ts.map +1 -0
- package/dist/cjs/container/base.js +117 -0
- package/dist/cjs/container/base.js.map +1 -0
- package/dist/cjs/container/common/index.d.ts +2 -0
- package/dist/cjs/container/common/index.d.ts.map +1 -0
- package/dist/cjs/container/common/index.js +18 -0
- package/dist/cjs/container/common/index.js.map +1 -0
- package/dist/cjs/container/common/types.d.ts +60 -0
- package/dist/cjs/container/common/types.d.ts.map +1 -0
- package/dist/cjs/container/common/types.js +3 -0
- package/dist/cjs/container/common/types.js.map +1 -0
- package/dist/cjs/container/container.d.ts +10 -0
- package/dist/cjs/container/container.d.ts.map +1 -0
- package/dist/cjs/container/container.js +45 -0
- package/dist/cjs/container/container.js.map +1 -0
- package/dist/cjs/container/index.d.ts +5 -0
- package/dist/cjs/container/index.d.ts.map +1 -0
- package/dist/cjs/container/index.js +21 -0
- package/dist/cjs/container/index.js.map +1 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/{common/keys.d.ts → metadata/common/constants.d.ts} +1 -1
- package/dist/cjs/metadata/common/constants.d.ts.map +1 -0
- package/dist/cjs/{common/keys.js → metadata/common/constants.js} +1 -1
- package/dist/cjs/metadata/common/constants.js.map +1 -0
- package/dist/cjs/metadata/common/index.d.ts +2 -0
- package/dist/cjs/metadata/common/index.d.ts.map +1 -0
- package/dist/cjs/metadata/common/index.js +18 -0
- package/dist/cjs/metadata/common/index.js.map +1 -0
- package/dist/cjs/metadata/index.d.ts +1 -0
- package/dist/cjs/metadata/index.d.ts.map +1 -1
- package/dist/cjs/metadata/index.js +1 -0
- package/dist/cjs/metadata/index.js.map +1 -1
- package/dist/cjs/metadata/injectors.d.ts +3 -2
- package/dist/cjs/metadata/injectors.d.ts.map +1 -1
- package/dist/cjs/metadata/injectors.js.map +1 -1
- package/dist/cjs/registry/common/index.d.ts +2 -0
- package/dist/cjs/registry/common/index.d.ts.map +1 -0
- package/dist/cjs/registry/common/index.js +18 -0
- package/dist/cjs/registry/common/index.js.map +1 -0
- package/dist/cjs/registry/common/types.d.ts +17 -0
- package/dist/cjs/registry/common/types.d.ts.map +1 -0
- package/dist/cjs/registry/common/types.js +3 -0
- package/dist/cjs/registry/common/types.js.map +1 -0
- package/dist/cjs/registry/index.d.ts +3 -0
- package/dist/cjs/registry/index.d.ts.map +1 -0
- package/dist/cjs/registry/index.js +19 -0
- package/dist/cjs/registry/index.js.map +1 -0
- package/dist/{esm → cjs/registry}/registry.d.ts +8 -7
- package/dist/cjs/registry/registry.d.ts.map +1 -0
- package/dist/cjs/{registry.js → registry/registry.js} +11 -13
- package/dist/cjs/registry/registry.js.map +1 -0
- package/dist/esm/binding/binding.d.ts +32 -0
- package/dist/esm/binding/binding.d.ts.map +1 -0
- package/dist/esm/binding/binding.js +110 -0
- package/dist/esm/binding/binding.js.map +1 -0
- package/dist/esm/binding/common/constants.d.ts +19 -0
- package/dist/esm/binding/common/constants.d.ts.map +1 -0
- package/dist/esm/binding/common/constants.js +28 -0
- package/dist/esm/binding/common/constants.js.map +1 -0
- package/dist/esm/binding/common/index.d.ts +3 -0
- package/dist/esm/binding/common/index.d.ts.map +1 -0
- package/dist/esm/binding/common/index.js +3 -0
- package/dist/esm/binding/common/index.js.map +1 -0
- package/dist/esm/binding/common/types.d.ts +28 -0
- package/dist/esm/binding/common/types.d.ts.map +1 -0
- package/dist/esm/binding/common/types.js +4 -0
- package/dist/esm/binding/common/types.js.map +1 -0
- package/dist/esm/binding/index.d.ts +3 -0
- package/dist/esm/binding/index.d.ts.map +1 -0
- package/dist/esm/binding/index.js +3 -0
- package/dist/esm/binding/index.js.map +1 -0
- package/dist/esm/common/app-error.d.ts.map +1 -1
- package/dist/esm/common/app-error.js +3 -1
- package/dist/esm/common/app-error.js.map +1 -1
- package/dist/esm/common/index.d.ts +0 -1
- package/dist/esm/common/index.d.ts.map +1 -1
- package/dist/esm/common/index.js +0 -1
- package/dist/esm/common/index.js.map +1 -1
- package/dist/esm/common/types.d.ts +14 -38
- package/dist/esm/common/types.d.ts.map +1 -1
- package/dist/esm/common/types.js +17 -35
- package/dist/esm/common/types.js.map +1 -1
- package/dist/esm/container/abstract.d.ts +71 -0
- package/dist/esm/container/abstract.d.ts.map +1 -0
- package/dist/esm/container/abstract.js +13 -0
- package/dist/esm/container/abstract.js.map +1 -0
- package/dist/esm/container/base.d.ts +69 -0
- package/dist/esm/container/base.d.ts.map +1 -0
- package/dist/esm/container/base.js +113 -0
- package/dist/esm/container/base.js.map +1 -0
- package/dist/esm/container/common/index.d.ts +2 -0
- package/dist/esm/container/common/index.d.ts.map +1 -0
- package/dist/esm/container/common/index.js +2 -0
- package/dist/esm/container/common/index.js.map +1 -0
- package/dist/esm/container/common/types.d.ts +60 -0
- package/dist/esm/container/common/types.d.ts.map +1 -0
- package/dist/esm/container/common/types.js +2 -0
- package/dist/esm/container/common/types.js.map +1 -0
- package/dist/esm/container/container.d.ts +10 -0
- package/dist/esm/container/container.d.ts.map +1 -0
- package/dist/esm/container/container.js +41 -0
- package/dist/esm/container/container.js.map +1 -0
- package/dist/esm/container/index.d.ts +5 -0
- package/dist/esm/container/index.d.ts.map +1 -0
- package/dist/esm/container/index.js +5 -0
- package/dist/esm/container/index.js.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/{common/keys.d.ts → metadata/common/constants.d.ts} +1 -1
- package/dist/esm/metadata/common/constants.d.ts.map +1 -0
- package/dist/esm/{common/keys.js → metadata/common/constants.js} +1 -1
- package/dist/esm/metadata/common/constants.js.map +1 -0
- package/dist/esm/metadata/common/index.d.ts +2 -0
- package/dist/esm/metadata/common/index.d.ts.map +1 -0
- package/dist/esm/metadata/common/index.js +2 -0
- package/dist/esm/metadata/common/index.js.map +1 -0
- package/dist/esm/metadata/index.d.ts +1 -0
- package/dist/esm/metadata/index.d.ts.map +1 -1
- package/dist/esm/metadata/index.js +1 -0
- package/dist/esm/metadata/index.js.map +1 -1
- package/dist/esm/metadata/injectors.d.ts +3 -2
- package/dist/esm/metadata/injectors.d.ts.map +1 -1
- package/dist/esm/metadata/injectors.js.map +1 -1
- package/dist/esm/registry/common/index.d.ts +2 -0
- package/dist/esm/registry/common/index.d.ts.map +1 -0
- package/dist/esm/registry/common/index.js +2 -0
- package/dist/esm/registry/common/index.js.map +1 -0
- package/dist/esm/registry/common/types.d.ts +17 -0
- package/dist/esm/registry/common/types.d.ts.map +1 -0
- package/dist/esm/registry/common/types.js +2 -0
- package/dist/esm/registry/common/types.js.map +1 -0
- package/dist/esm/registry/index.d.ts +3 -0
- package/dist/esm/registry/index.d.ts.map +1 -0
- package/dist/esm/registry/index.js +3 -0
- package/dist/esm/registry/index.js.map +1 -0
- package/dist/{cjs → esm/registry}/registry.d.ts +8 -7
- package/dist/esm/registry/registry.d.ts.map +1 -0
- package/dist/esm/{registry.js → registry/registry.js} +5 -7
- package/dist/esm/registry/registry.js.map +1 -0
- package/package.json +5 -5
- package/dist/cjs/common/keys.d.ts.map +0 -1
- package/dist/cjs/common/keys.js.map +0 -1
- package/dist/cjs/container.d.ts +0 -89
- package/dist/cjs/container.d.ts.map +0 -1
- package/dist/cjs/container.js +0 -245
- package/dist/cjs/container.js.map +0 -1
- package/dist/cjs/registry.d.ts.map +0 -1
- package/dist/cjs/registry.js.map +0 -1
- package/dist/esm/common/keys.d.ts.map +0 -1
- package/dist/esm/common/keys.js.map +0 -1
- package/dist/esm/container.d.ts +0 -89
- package/dist/esm/container.d.ts.map +0 -1
- package/dist/esm/container.js +0 -240
- package/dist/esm/container.js.map +0 -1
- package/dist/esm/registry.d.ts.map +0 -1
- package/dist/esm/registry.js.map +0 -1
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
[](https://opensource.org/licenses/MIT)
|
|
9
9
|
[](https://www.typescriptlang.org/)
|
|
10
10
|
|
|
11
|
-
A ~350-line Dependency Injection & Inversion of Control (IoC) container featuring decorator-based constructor and property injection, fluent Binding API, singleton/transient scoping, namespace auto-tagging, Provider pattern, and tag-based discovery. Part of the [
|
|
11
|
+
A ~350-line Dependency Injection & Inversion of Control (IoC) container featuring decorator-based constructor and property injection, fluent Binding API, singleton/transient scoping, namespace auto-tagging, Provider pattern, and tag-based discovery. Part of the [IGNIS Framework](https://github.com/VENIZIA-AI/ignis).
|
|
12
12
|
|
|
13
13
|
[Installation](#installation) • [Quick Start](#quick-start) • [API Reference](#container) • [Documentation](https://venizia-ai.github.io/ignis)
|
|
14
14
|
|
|
@@ -28,7 +28,7 @@ A ~350-line Dependency Injection & Inversion of Control (IoC) container featurin
|
|
|
28
28
|
|
|
29
29
|
## Philosophy
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
IGNIS Inversion takes the best ideas from **LoopBack 4**'s IoC system -- decorator-based injection, fluent binding configuration, namespace-driven organization -- and strips them down to ~350 lines of focused, zero-overhead container logic. No complex module system, no provider hierarchies, no framework lock-in. Just a fast, type-safe container that works with any TypeScript project.
|
|
32
32
|
|
|
33
33
|
**Why this exists:**
|
|
34
34
|
|
|
@@ -39,7 +39,7 @@ Ignis Inversion takes the best ideas from **LoopBack 4**'s IoC system -- decorat
|
|
|
39
39
|
| **InversifyJS** | Powerful but heavy for projects that need a simple, fast container |
|
|
40
40
|
| **tsyringe** | Minimal but lacks fluent configuration, tagging, and property injection |
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
IGNIS Inversion gives you **constructor injection, property injection, singleton/transient scoping, tag-based discovery, and a provider pattern** -- all in a single dependency with no runtime overhead.
|
|
43
43
|
|
|
44
44
|
---
|
|
45
45
|
|
|
@@ -79,7 +79,7 @@ Ignis Inversion gives you **constructor injection, property injection, singleton
|
|
|
79
79
|
- [Cache Management](#cache-management)
|
|
80
80
|
- [Real-World Example: Mini Application](#real-world-example-mini-application)
|
|
81
81
|
- [Container Independence](#container-independence)
|
|
82
|
-
- [Integration with Other
|
|
82
|
+
- [Integration with Other IGNIS Packages](#integration-with-other-ignis-packages)
|
|
83
83
|
- [How Core Uses Inversion](#how-core-uses-inversion)
|
|
84
84
|
- [How Boot Uses Inversion](#how-boot-uses-inversion)
|
|
85
85
|
- [MetadataRegistry Extension via Mixins](#metadataregistry-extension-via-mixins)
|
|
@@ -440,7 +440,7 @@ class OrderService {
|
|
|
440
440
|
|
|
441
441
|
### Binding Keys
|
|
442
442
|
|
|
443
|
-
|
|
443
|
+
IGNIS uses a **namespace-based naming convention** for binding keys. This keeps large applications organized and enables tag-based discovery.
|
|
444
444
|
|
|
445
445
|
```typescript
|
|
446
446
|
import { BindingKeys } from '@venizia/ignis-inversion';
|
|
@@ -497,7 +497,7 @@ export class BaseHelper {
|
|
|
497
497
|
- **Binding** sets `scope` to its binding key string (e.g., `'services.UserService'`).
|
|
498
498
|
- **MetadataRegistry** sets `scope` to `'MetadataRegistry'`.
|
|
499
499
|
|
|
500
|
-
`BaseHelper` exists so that every DI primitive carries a human-readable label for logging and debugging. In the full
|
|
500
|
+
`BaseHelper` exists so that every DI primitive carries a human-readable label for logging and debugging. In the full IGNIS framework, the core package extends `BaseHelper` with a `Logger` instance, but the inversion package keeps it minimal.
|
|
501
501
|
|
|
502
502
|
---
|
|
503
503
|
|
|
@@ -1015,7 +1015,7 @@ const pool = container.get<Pool>({ key: 'datasources.Pool' });
|
|
|
1015
1015
|
|
|
1016
1016
|
The container detects class-based providers using `isClassProvider()`, which checks whether the target has a `prototype.value` method. If detected, the provider is instantiated via `container.instantiate()` (which performs full two-phase DI on the provider class), and then its `value(container)` method is called.
|
|
1017
1017
|
|
|
1018
|
-
The full
|
|
1018
|
+
The full IGNIS framework also provides a `BaseProvider<T>` abstract class (in `@venizia/ignis` core) that extends `BaseHelper` and implements `IProvider<T>`, giving providers access to scoped logging.
|
|
1019
1019
|
|
|
1020
1020
|
---
|
|
1021
1021
|
|
|
@@ -1287,7 +1287,7 @@ This design is intentional: metadata describes the class's **dependencies**, whi
|
|
|
1287
1287
|
|
|
1288
1288
|
---
|
|
1289
1289
|
|
|
1290
|
-
## Integration with Other
|
|
1290
|
+
## Integration with Other IGNIS Packages
|
|
1291
1291
|
|
|
1292
1292
|
### How Core Uses Inversion
|
|
1293
1293
|
|
|
@@ -1951,10 +1951,10 @@ BindingKeys.build({ namespace: 'services', key: '' });
|
|
|
1951
1951
|
|
|
1952
1952
|
InversifyJS uses similar concepts but with different API shapes. Here is a mapping:
|
|
1953
1953
|
|
|
1954
|
-
| InversifyJS |
|
|
1954
|
+
| InversifyJS | IGNIS Inversion | Notes |
|
|
1955
1955
|
|:------------|:----------------|:------|
|
|
1956
|
-
| `@injectable()` | `@injectable({})` |
|
|
1957
|
-
| `@inject(TYPES.Logger)` | `@inject({ key: 'services.Logger' })` |
|
|
1956
|
+
| `@injectable()` | `@injectable({})` | IGNIS requires an options object (can be empty) |
|
|
1957
|
+
| `@inject(TYPES.Logger)` | `@inject({ key: 'services.Logger' })` | IGNIS uses options objects, supports string or symbol keys |
|
|
1958
1958
|
| `container.bind<T>(TYPES.Logger).to(Logger)` | `container.bind({ key: 'services.Logger' }).toClass(Logger)` | Fluent chain on options-based `bind()` |
|
|
1959
1959
|
| `container.bind<T>(TYPES.Logger).to(Logger).inSingletonScope()` | `container.bind({ key: 'services.Logger' }).toClass(Logger).setScope('singleton')` | Scope via `setScope()` |
|
|
1960
1960
|
| `container.bind<T>(TYPES.Config).toConstantValue(val)` | `container.bind({ key: 'config' }).toValue(val)` | `toValue` instead of `toConstantValue` |
|
|
@@ -1992,7 +1992,7 @@ const svc = container.get<UserService>(TYPES.UserService);
|
|
|
1992
1992
|
```
|
|
1993
1993
|
|
|
1994
1994
|
```typescript
|
|
1995
|
-
//
|
|
1995
|
+
// IGNIS Inversion equivalent
|
|
1996
1996
|
@injectable({})
|
|
1997
1997
|
class UserService {
|
|
1998
1998
|
constructor(
|
|
@@ -2014,7 +2014,7 @@ const svc = container.get<UserService>({ key: 'services.UserService' });
|
|
|
2014
2014
|
|
|
2015
2015
|
tsyringe uses a token-based approach with a global container. Here is the mapping:
|
|
2016
2016
|
|
|
2017
|
-
| tsyringe |
|
|
2017
|
+
| tsyringe | IGNIS Inversion | Notes |
|
|
2018
2018
|
|:---------|:----------------|:------|
|
|
2019
2019
|
| `@injectable()` | `@injectable({})` | Similar, options object required |
|
|
2020
2020
|
| `@inject('token')` | `@inject({ key: 'token' })` | Options object |
|
|
@@ -2023,15 +2023,15 @@ tsyringe uses a token-based approach with a global container. Here is the mappin
|
|
|
2023
2023
|
| `container.register('token', { useFactory: fn })` | `container.bind({ key: 'token' }).toProvider(fn)` | Factory/provider |
|
|
2024
2024
|
| `container.resolve(Cls)` | `container.resolve(Cls)` or `container.instantiate(Cls)` | Nearly identical |
|
|
2025
2025
|
| `@singleton()` | `@injectable({})` + `.setScope('singleton')` | Scope on binding, not decorator |
|
|
2026
|
-
| `container.createChildContainer()` | N/A |
|
|
2026
|
+
| `container.createChildContainer()` | N/A | IGNIS has no child containers |
|
|
2027
2027
|
| `@injectAll('token')` | `container.findByTag({ tag }).map(b => b.getValue(container))` | Use tag discovery |
|
|
2028
2028
|
|
|
2029
2029
|
**Key differences from tsyringe:**
|
|
2030
2030
|
|
|
2031
|
-
-
|
|
2032
|
-
-
|
|
2033
|
-
-
|
|
2034
|
-
- Property injection is supported natively in
|
|
2031
|
+
- IGNIS does not have a global container -- you always create explicit `Container` instances.
|
|
2032
|
+
- IGNIS has no child containers. Each container is independent.
|
|
2033
|
+
- IGNIS uses namespace-based string keys with auto-tagging, rather than string/symbol tokens.
|
|
2034
|
+
- Property injection is supported natively in IGNIS (tsyringe only supports constructor injection).
|
|
2035
2035
|
|
|
2036
2036
|
---
|
|
2037
2037
|
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { BaseHelper } from '../common/base-helper';
|
|
2
|
+
import { TClass, TConstValue } from '../common/types';
|
|
3
|
+
import type { IContainer } from '../container/common/types';
|
|
4
|
+
import { BindingValueTypes, TBindingScope } from './common/constants';
|
|
5
|
+
import { IBinding, TBindingProvider, TBindingResolverValue } from './common/types';
|
|
6
|
+
export declare class Binding<T = any> extends BaseHelper implements IBinding<T> {
|
|
7
|
+
key: string;
|
|
8
|
+
private bindScope;
|
|
9
|
+
private tags;
|
|
10
|
+
private cached?;
|
|
11
|
+
private resolver;
|
|
12
|
+
constructor(opts: {
|
|
13
|
+
key: string;
|
|
14
|
+
});
|
|
15
|
+
static bind<T = any>(opts: {
|
|
16
|
+
key: string;
|
|
17
|
+
}): Binding<T>;
|
|
18
|
+
toClass(value: TClass<T>): this;
|
|
19
|
+
toValue(value: T): this;
|
|
20
|
+
toProvider(value: TBindingProvider<T>): this;
|
|
21
|
+
getBindingMeta(opts: {
|
|
22
|
+
type: TConstValue<typeof BindingValueTypes>;
|
|
23
|
+
}): TBindingResolverValue<T>;
|
|
24
|
+
setScope(scope: TBindingScope): this;
|
|
25
|
+
setTags(...tags: string[]): this;
|
|
26
|
+
hasTag(tag: string): boolean;
|
|
27
|
+
getTags(): string[];
|
|
28
|
+
getScope(): TBindingScope;
|
|
29
|
+
getValue(container?: IContainer): T;
|
|
30
|
+
clearCache(): void;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=binding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binding.d.ts","sourceRoot":"","sources":["../../../src/binding/binding.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAiB,iBAAiB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,QAAQ,EAAmB,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEpG,qBAAa,OAAO,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,UAAW,YAAW,QAAQ,CAAC,CAAC,CAAC;IACrE,GAAG,EAAE,MAAM,CAAC;IAEZ,OAAO,CAAC,SAAS,CAA0C;IAC3D,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,MAAM,CAAC,CAAI;IAEnB,OAAO,CAAC,QAAQ,CAG4D;gBAEhE,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE;WAajB,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,CAAC;IAIhE,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IAK/B,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAKvB,UAAU,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI;IAK5C,cAAc,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,WAAW,CAAC,OAAO,iBAAiB,CAAC,CAAA;KAAE,GAAG,qBAAqB,CAAC,CAAC,CAAC;IAU/F,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAKpC,OAAO,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IAKhC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B,OAAO,IAAI,MAAM,EAAE;IAInB,QAAQ,IAAI,aAAa;IAIzB,QAAQ,CAAC,SAAS,CAAC,EAAE,UAAU,GAAG,CAAC;IAuDnC,UAAU;CAOX"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Binding = void 0;
|
|
4
|
+
const app_error_1 = require("../common/app-error");
|
|
5
|
+
const base_helper_1 = require("../common/base-helper");
|
|
6
|
+
const constants_1 = require("./common/constants");
|
|
7
|
+
const types_1 = require("./common/types");
|
|
8
|
+
class Binding extends base_helper_1.BaseHelper {
|
|
9
|
+
constructor(opts) {
|
|
10
|
+
super({ scope: opts.key });
|
|
11
|
+
this.bindScope = constants_1.BindingScopes.TRANSIENT;
|
|
12
|
+
this.tags = new Set([]);
|
|
13
|
+
this.key = opts.key;
|
|
14
|
+
const keyParts = this.key.split('.');
|
|
15
|
+
if (keyParts.length > 1) {
|
|
16
|
+
const [namespace] = keyParts;
|
|
17
|
+
this.setTags(namespace);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
static bind(opts) {
|
|
21
|
+
return new Binding(opts);
|
|
22
|
+
}
|
|
23
|
+
toClass(value) {
|
|
24
|
+
this.resolver = { type: constants_1.BindingValueTypes.CLASS, value };
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
toValue(value) {
|
|
28
|
+
this.resolver = { type: constants_1.BindingValueTypes.VALUE, value };
|
|
29
|
+
return this;
|
|
30
|
+
}
|
|
31
|
+
toProvider(value) {
|
|
32
|
+
this.resolver = { type: constants_1.BindingValueTypes.PROVIDER, value };
|
|
33
|
+
return this;
|
|
34
|
+
}
|
|
35
|
+
getBindingMeta(opts) {
|
|
36
|
+
if (this.resolver.type !== opts.type) {
|
|
37
|
+
throw (0, app_error_1.getError)({
|
|
38
|
+
message: `[getBindingMeta] Invalid resolver type, only ${this.resolver.type} is allowd | resolverType: ${this.resolver.type} | optType: ${opts.type}`,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return this.resolver.value;
|
|
42
|
+
}
|
|
43
|
+
setScope(scope) {
|
|
44
|
+
this.bindScope = scope;
|
|
45
|
+
return this;
|
|
46
|
+
}
|
|
47
|
+
setTags(...tags) {
|
|
48
|
+
tags.forEach(t => this.tags.add(t));
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
hasTag(tag) {
|
|
52
|
+
return this.tags.has(tag);
|
|
53
|
+
}
|
|
54
|
+
getTags() {
|
|
55
|
+
return Array.from(this.tags);
|
|
56
|
+
}
|
|
57
|
+
getScope() {
|
|
58
|
+
return this.bindScope;
|
|
59
|
+
}
|
|
60
|
+
getValue(container) {
|
|
61
|
+
if (this.bindScope === constants_1.BindingScopes.SINGLETON && this.cached !== undefined) {
|
|
62
|
+
return this.cached;
|
|
63
|
+
}
|
|
64
|
+
let instance;
|
|
65
|
+
const { type: resolverType } = this.resolver;
|
|
66
|
+
switch (resolverType) {
|
|
67
|
+
case constants_1.BindingValueTypes.VALUE: {
|
|
68
|
+
instance = this.resolver.value;
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
case constants_1.BindingValueTypes.PROVIDER: {
|
|
72
|
+
const provider = this.resolver.value;
|
|
73
|
+
if (!container) {
|
|
74
|
+
throw (0, app_error_1.getError)({
|
|
75
|
+
message: `[getValue] Invalid context/container to get provider value | type: ${resolverType} | key: ${this.key}`,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
if (!(0, types_1.isClassProvider)(provider)) {
|
|
79
|
+
instance = provider(container);
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
const p = container.instantiate(provider);
|
|
83
|
+
instance = p.value(container);
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
case constants_1.BindingValueTypes.CLASS: {
|
|
87
|
+
if (!container) {
|
|
88
|
+
throw (0, app_error_1.getError)({
|
|
89
|
+
message: `[getValue] Invalid context/container to instantiate class | type: ${resolverType} | key: ${this.key}`,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
instance = container.instantiate(this.resolver.value);
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
default: {
|
|
96
|
+
throw (0, app_error_1.getError)({
|
|
97
|
+
message: `[getValue] Invalid value type | valueType: ${resolverType}`,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (this.bindScope === constants_1.BindingScopes.SINGLETON) {
|
|
102
|
+
this.cached = instance;
|
|
103
|
+
}
|
|
104
|
+
return instance;
|
|
105
|
+
}
|
|
106
|
+
clearCache() {
|
|
107
|
+
if (!this.cached) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
this.cached = undefined;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
exports.Binding = Binding;
|
|
114
|
+
//# sourceMappingURL=binding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binding.js","sourceRoot":"","sources":["../../../src/binding/binding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { TConstValue } from '../../common/types';
|
|
2
|
+
export declare class BindingScopes {
|
|
3
|
+
static readonly SINGLETON = "singleton";
|
|
4
|
+
static readonly TRANSIENT = "transient";
|
|
5
|
+
}
|
|
6
|
+
export type TBindingScope = TConstValue<typeof BindingScopes>;
|
|
7
|
+
export declare class BindingValueTypes {
|
|
8
|
+
static readonly CLASS = "class";
|
|
9
|
+
static readonly VALUE = "value";
|
|
10
|
+
static readonly PROVIDER = "provider";
|
|
11
|
+
}
|
|
12
|
+
export type TBindingValueType = TConstValue<typeof BindingValueTypes>;
|
|
13
|
+
export declare class BindingKeys {
|
|
14
|
+
static build(opts: {
|
|
15
|
+
namespace: string;
|
|
16
|
+
key: string;
|
|
17
|
+
}): string;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/binding/common/constants.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,qBAAa,aAAa;IACxB,MAAM,CAAC,QAAQ,CAAC,SAAS,eAAe;IACxC,MAAM,CAAC,QAAQ,CAAC,SAAS,eAAe;CACzC;AACD,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,aAAa,CAAC,CAAC;AAE9D,qBAAa,iBAAiB;IAC5B,MAAM,CAAC,QAAQ,CAAC,KAAK,WAAW;IAChC,MAAM,CAAC,QAAQ,CAAC,KAAK,WAAW;IAChC,MAAM,CAAC,QAAQ,CAAC,QAAQ,cAAc;CACvC;AACD,MAAM,MAAM,iBAAiB,GAAG,WAAW,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEtE,qBAAa,WAAW;IACtB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE;CAgBtD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.BindingKeys = exports.BindingValueTypes = exports.BindingScopes = void 0;
|
|
7
|
+
const isEmpty_1 = __importDefault(require("lodash/isEmpty"));
|
|
8
|
+
const app_error_1 = require("../../common/app-error");
|
|
9
|
+
class BindingScopes {
|
|
10
|
+
static { this.SINGLETON = 'singleton'; }
|
|
11
|
+
static { this.TRANSIENT = 'transient'; }
|
|
12
|
+
}
|
|
13
|
+
exports.BindingScopes = BindingScopes;
|
|
14
|
+
class BindingValueTypes {
|
|
15
|
+
static { this.CLASS = 'class'; }
|
|
16
|
+
static { this.VALUE = 'value'; }
|
|
17
|
+
static { this.PROVIDER = 'provider'; }
|
|
18
|
+
}
|
|
19
|
+
exports.BindingValueTypes = BindingValueTypes;
|
|
20
|
+
class BindingKeys {
|
|
21
|
+
static build(opts) {
|
|
22
|
+
const { namespace, key } = opts;
|
|
23
|
+
const keyParts = [];
|
|
24
|
+
if (!(0, isEmpty_1.default)(namespace)) {
|
|
25
|
+
keyParts.push(namespace);
|
|
26
|
+
}
|
|
27
|
+
if ((0, isEmpty_1.default)(key)) {
|
|
28
|
+
throw (0, app_error_1.getError)({
|
|
29
|
+
message: `[BindingKeys][build] Invalid key to build | key: ${key}`,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
keyParts.push(key);
|
|
33
|
+
return keyParts.join('.');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.BindingKeys = BindingKeys;
|
|
37
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/binding/common/constants.ts"],"names":[],"mappings":";;;;;;AAAA,6DAAqC;AACrC,sDAAkD;AAGlD,MAAa,aAAa;aACR,cAAS,GAAG,WAAW,CAAC;aACxB,cAAS,GAAG,WAAW,CAAC;;AAF1C,sCAGC;AAGD,MAAa,iBAAiB;aACZ,UAAK,GAAG,OAAO,CAAC;aAChB,UAAK,GAAG,OAAO,CAAC;aAChB,aAAQ,GAAG,UAAU,CAAC;;AAHxC,8CAIC;AAGD,MAAa,WAAW;IACtB,MAAM,CAAC,KAAK,CAAC,IAAwC;QACnD,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAChC,MAAM,QAAQ,GAAkB,EAAE,CAAC;QACnC,IAAI,CAAC,IAAA,iBAAO,EAAC,SAAS,CAAC,EAAE,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3B,CAAC;QAED,IAAI,IAAA,iBAAO,EAAC,GAAG,CAAC,EAAE,CAAC;YACjB,MAAM,IAAA,oBAAQ,EAAC;gBACb,OAAO,EAAE,oDAAoD,GAAG,EAAE;aACnE,CAAC,CAAC;QACL,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;CACF;AAjBD,kCAiBC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/binding/common/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
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("./constants"), exports);
|
|
18
|
+
__exportStar(require("./types"), exports);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/binding/common/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,0CAAwB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { IContainer } from '../../container/common/types';
|
|
2
|
+
import { TClass, TConstValue } from '../../common/types';
|
|
3
|
+
import type { BindingValueTypes, TBindingScope } from './constants';
|
|
4
|
+
export interface IProvider<T> {
|
|
5
|
+
value(container: IContainer): T;
|
|
6
|
+
}
|
|
7
|
+
export declare const isClassProvider: <T>(target: any) => target is TClass<IProvider<T>>;
|
|
8
|
+
export type TBindingProvider<T> = (<C extends IContainer>(container: C) => T) | TClass<IProvider<T>>;
|
|
9
|
+
/** What a binding's resolver holds - a class, a plain value, or a provider. */
|
|
10
|
+
export type TBindingResolverValue<T> = TClass<T> | T | TBindingProvider<T>;
|
|
11
|
+
export interface IBinding<T = any> {
|
|
12
|
+
/** Normalized at construction - a symbol key arrives here as its string form. */
|
|
13
|
+
key: string;
|
|
14
|
+
toClass(value: TClass<T>): this;
|
|
15
|
+
toValue(value: T): this;
|
|
16
|
+
toProvider(value: TBindingProvider<T>): this;
|
|
17
|
+
getBindingMeta(opts: {
|
|
18
|
+
type: TConstValue<typeof BindingValueTypes>;
|
|
19
|
+
}): TBindingResolverValue<T>;
|
|
20
|
+
setScope(scope: TBindingScope): this;
|
|
21
|
+
getScope(): TBindingScope;
|
|
22
|
+
setTags(...tags: string[]): this;
|
|
23
|
+
hasTag(tag: string): boolean;
|
|
24
|
+
getTags(): string[];
|
|
25
|
+
getValue(container?: IContainer): T;
|
|
26
|
+
clearCache(): void;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/binding/common/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEpE,MAAM,WAAW,SAAS,CAAC,CAAC;IAC1B,KAAK,CAAC,SAAS,EAAE,UAAU,GAAG,CAAC,CAAC;CACjC;AAED,eAAO,MAAM,eAAe,GAAI,CAAC,EAAE,QAAQ,GAAG,KAAG,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAI7E,CAAC;AAEF,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAC5B,CAAC,CAAC,CAAC,SAAS,UAAU,EAAE,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAErE,+EAA+E;AAC/E,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAE3E,MAAM,WAAW,QAAQ,CAAC,CAAC,GAAG,GAAG;IAC/B,iFAAiF;IACjF,GAAG,EAAE,MAAM,CAAC;IAEZ,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAChC,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IACxB,UAAU,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAC7C,cAAc,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,WAAW,CAAC,OAAO,iBAAiB,CAAC,CAAA;KAAE,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAEhG,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IACrC,QAAQ,IAAI,aAAa,CAAC;IAC1B,OAAO,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACjC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7B,OAAO,IAAI,MAAM,EAAE,CAAC;IAEpB,QAAQ,CAAC,SAAS,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;IACpC,UAAU,IAAI,IAAI,CAAC;CACpB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isClassProvider = void 0;
|
|
4
|
+
const isClassProvider = (target) => {
|
|
5
|
+
return (typeof target === 'function' && target.prototype && typeof target.prototype.value === 'function');
|
|
6
|
+
};
|
|
7
|
+
exports.isClassProvider = isClassProvider;
|
|
8
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/binding/common/types.ts"],"names":[],"mappings":";;;AAQO,MAAM,eAAe,GAAG,CAAI,MAAW,EAAkC,EAAE;IAChF,OAAO,CACL,OAAO,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,SAAS,IAAI,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,KAAK,UAAU,CACjG,CAAC;AACJ,CAAC,CAAC;AAJW,QAAA,eAAe,mBAI1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/binding/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
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("./binding"), exports);
|
|
18
|
+
__exportStar(require("./common"), exports);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/binding/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAA0B;AAC1B,2CAAyB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-error.d.ts","sourceRoot":"","sources":["../../../src/common/app-error.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app-error.d.ts","sourceRoot":"","sources":["../../../src/common/app-error.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,WAAW;;;;;8BAOJ,CAAC;AAErB,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEjD,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAEpB,IAAI,EAAE,MAAM;IAWxB,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM;CAG7B;AAED,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,qBAEpC,CAAC"}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.getError = exports.ApplicationError = exports.ErrorSchema = void 0;
|
|
7
|
+
const omit_1 = __importDefault(require("lodash/omit"));
|
|
4
8
|
const zod_1 = require("zod");
|
|
5
9
|
exports.ErrorSchema = zod_1.z
|
|
6
10
|
.object({
|
|
@@ -12,10 +16,11 @@ exports.ErrorSchema = zod_1.z
|
|
|
12
16
|
.catchall(zod_1.z.any());
|
|
13
17
|
class ApplicationError extends Error {
|
|
14
18
|
constructor(opts) {
|
|
15
|
-
const { message, messageCode, statusCode = 400,
|
|
19
|
+
const { message, messageCode, statusCode = 400, ...rest } = opts;
|
|
16
20
|
super(message);
|
|
17
21
|
this.statusCode = statusCode;
|
|
18
22
|
this.messageCode = messageCode;
|
|
23
|
+
const extra = (0, omit_1.default)(rest, ['name']);
|
|
19
24
|
this.extra = Object.keys(extra).length > 0 ? extra : undefined;
|
|
20
25
|
}
|
|
21
26
|
static getError(opts) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-error.js","sourceRoot":"","sources":["../../../src/common/app-error.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app-error.js","sourceRoot":"","sources":["../../../src/common/app-error.ts"],"names":[],"mappings":";;;;;;AAAA,uDAA+B;AAC/B,6BAAwB;AAEX,QAAA,WAAW,GAAG,OAAC;KACzB,MAAM,CAAC;IACN,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE;CACpB,CAAC;KACD,QAAQ,CAAC,OAAC,CAAC,GAAG,EAAE,CAAC,CAAC;AAIrB,MAAa,gBAAiB,SAAQ,KAAK;IAKzC,YAAY,IAAY;QACtB,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;QACjE,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAE/B,MAAM,KAAK,GAAG,IAAA,cAAI,EAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACjE,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,IAAY;QAC1B,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;CACF;AAnBD,4CAmBC;AAEM,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE;IACvC,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC,CAAC;AAFW,QAAA,QAAQ,YAEnB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC"}
|
package/dist/cjs/common/index.js
CHANGED
|
@@ -16,7 +16,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./app-error"), exports);
|
|
18
18
|
__exportStar(require("./base-helper"), exports);
|
|
19
|
-
__exportStar(require("./keys"), exports);
|
|
20
19
|
__exportStar(require("./logger"), exports);
|
|
21
20
|
__exportStar(require("./types"), exports);
|
|
22
21
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,gDAA8B;AAC9B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,gDAA8B;AAC9B,2CAAyB;AACzB,0CAAwB"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Container } from './../container';
|
|
2
1
|
export type TNullable<T> = T | undefined | null;
|
|
3
2
|
export type ValueOrPromise<T> = T | Promise<T>;
|
|
4
3
|
export type ValueOf<T> = T[keyof T];
|
|
@@ -8,45 +7,22 @@ export type TClass<T> = TConstructor<T> & {
|
|
|
8
7
|
[property: string]: any;
|
|
9
8
|
};
|
|
10
9
|
export type TConstValue<T extends TClass<any>> = Extract<ValueOf<T>, string | number>;
|
|
11
|
-
export
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
export type TBindingKey = string | symbol;
|
|
11
|
+
/**
|
|
12
|
+
* The single predicate that tells a CONSTRUCTOR from a RESOLVER. Everything downstream branches on
|
|
13
|
+
* it: the boot booters (is this export an artifact?), the controller factories and `resolveValue`
|
|
14
|
+
* (`isClass(entity) ? entity : entity()`).
|
|
15
|
+
*
|
|
16
|
+
* `typeof x === 'function' && x.prototype !== undefined` is not enough - it is true of EVERY
|
|
17
|
+
* non-arrow function, so a helper exported next to an artifact got bound and `new`-ed, and a
|
|
18
|
+
* `function () { return User; }` resolver was returned instead of being called.
|
|
19
|
+
*
|
|
20
|
+
* The source check is sound because the whole toolchain targets ES2024: a class is emitted as
|
|
21
|
+
* `class`, never as an ES5 constructor function. A consumer bundling this package down to ES5 would
|
|
22
|
+
* break the predicate.
|
|
23
|
+
*/
|
|
14
24
|
export declare const isClass: <T>(target: any) => target is TClass<T>;
|
|
15
|
-
export declare const isClassProvider: <T>(target: any) => target is TClass<IProvider<T>>;
|
|
16
|
-
/** Distinguishes class constructors from arrow/regular functions via named prototype. */
|
|
17
|
-
export declare const isClassConstructor: (fn: Function) => boolean;
|
|
18
|
-
export declare class BindingScopes {
|
|
19
|
-
static readonly SINGLETON = "singleton";
|
|
20
|
-
static readonly TRANSIENT = "transient";
|
|
21
|
-
}
|
|
22
|
-
export type TBindingScope = TConstValue<typeof BindingScopes>;
|
|
23
|
-
export declare class BindingValueTypes {
|
|
24
|
-
static readonly CLASS = "class";
|
|
25
|
-
static readonly VALUE = "value";
|
|
26
|
-
static readonly PROVIDER = "provider";
|
|
27
|
-
}
|
|
28
|
-
export type TBindingValueType = TConstValue<typeof BindingValueTypes>;
|
|
29
25
|
export interface IBindingTag {
|
|
30
26
|
[name: string]: any;
|
|
31
27
|
}
|
|
32
|
-
export declare class BindingKeys {
|
|
33
|
-
static build(opts: {
|
|
34
|
-
namespace: string;
|
|
35
|
-
key: string;
|
|
36
|
-
}): string;
|
|
37
|
-
}
|
|
38
|
-
export interface IPropertyMetadata {
|
|
39
|
-
bindingKey: string | symbol;
|
|
40
|
-
isOptional?: boolean;
|
|
41
|
-
[key: string]: any;
|
|
42
|
-
}
|
|
43
|
-
export interface IInjectMetadata {
|
|
44
|
-
key: string | symbol;
|
|
45
|
-
index: number;
|
|
46
|
-
isOptional?: boolean;
|
|
47
|
-
}
|
|
48
|
-
export interface IInjectableMetadata {
|
|
49
|
-
scope?: TBindingScope;
|
|
50
|
-
tags?: Record<string, any>;
|
|
51
|
-
}
|
|
52
28
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/common/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/common/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC;AAEhD,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAC/C,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAEpC,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AACxD,MAAM,MAAM,oBAAoB,CAAC,CAAC,IAAI,QAAQ,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AACzE,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG;IAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,CAAC;AAEtE,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;AAEtF,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,OAAO,GAAI,CAAC,EAAE,QAAQ,GAAG,KAAG,MAAM,IAAI,MAAM,CAAC,CAAC,CAM1D,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC;CACrB"}
|