Skip to content

Commit e5845fa

Browse files
committed
Deprecated 'inject' option in favor of 'provide'
1 parent 991cf3e commit e5845fa

File tree

70 files changed

+1551
-758
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

70 files changed

+1551
-758
lines changed

docs/assemblerjs/core-concepts/assemblage.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ The `@Assemblage` decorator accepts a configuration object:
5252
```typescript
5353
@Assemblage({
5454
singleton: true, // Default: true - share instance across the application
55-
inject: [], // Dependencies to inject
55+
provide: [], // Dependencies to provide (recommended)
5656
use: [], // Objects/instances to register
5757
tags: [], // Tags for grouping
5858
events: [], // Event channels to register
@@ -69,7 +69,8 @@ export class MyService implements AbstractAssemblage {
6969
| Option | Type | Default | Description |
7070
|--------|------|---------|-------------|
7171
| `singleton` | `boolean` | `true` | If `true`, one instance is shared. If `false`, new instance per injection. |
72-
| `inject` | `Array` | `[]` | Dependencies to inject (see [Dependency Injection](./dependency-injection.md)) |
72+
| `provide` | `Array` | `[]` | Dependencies to provide (see [Dependency Injection](./dependency-injection.md)) |
73+
| `inject` | `Array` | `[]` | **⚠️ Deprecated** - Use `provide` instead. Will be removed in a future version. |
7374
| `use` | `Array` | `[]` | Objects/instances to register for `@Use()` decorator |
7475
| `tags` | `string[]` | `[]` | Tags for grouping (see [Tags](../features/tags.md)) |
7576
| `events` | `string[]` | `[]` | Event channels to register (see [Events](../features/events.md)) |

docs/assemblerjs/core-concepts/dependency-injection.md

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
# Dependency Injection
22

3-
Dependencies are declared in the `inject` property of the `@Assemblage` decorator and injected via the constructor.
3+
Dependencies are declared in the `provide` property of the `@Assemblage` decorator and injected via the constructor.
4+
5+
> **Note:** The `inject` property is deprecated in favor of `provide`. While `inject` still works, it will be removed in a future version.
46
57
## Basic Injection
68

7-
The simplest form injects a concrete class:
9+
The simplest form provides a concrete class:
810

911
```typescript
1012
@Assemblage({
11-
inject: [[ConcreteClass]],
13+
provide: [[ConcreteClass]],
1214
})
1315
class MyApp implements AbstractAssemblage {
1416
constructor(private service: ConcreteClass) {
@@ -23,7 +25,7 @@ Bind an abstraction to a concrete implementation:
2325

2426
```typescript
2527
@Assemblage({
26-
inject: [
28+
provide: [
2729
[AbstractClass, ConcreteClass], // AbstractClass must implement AbstractAssemblage
2830
],
2931
})
@@ -49,7 +51,7 @@ Pass configuration to dependencies:
4951

5052
```typescript
5153
@Assemblage({
52-
inject: [
54+
provide: [
5355
[DatabaseService, { host: 'localhost', port: 5432 }],
5456
],
5557
})
@@ -71,7 +73,7 @@ Inject multiple dependencies:
7173

7274
```typescript
7375
@Assemblage({
74-
inject: [
76+
provide: [
7577
[Logger],
7678
[DatabaseService],
7779
[CacheService],
@@ -88,7 +90,7 @@ class MyApp implements AbstractAssemblage {
8890
}
8991
```
9092

91-
**Note:** Dependencies are resolved by type using TypeScript's reflection system. The order of constructor parameters doesn't need to match the `inject` array order.
93+
**Note:** Dependencies are resolved by type using TypeScript's reflection system. The order of constructor parameters doesn't need to match the `provide` array order.
9294

9395
## Dependency Resolution
9496

Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
# Migration Guide: `inject``provide`
2+
3+
## Overview
4+
5+
The `inject` option in the `@Assemblage` decorator has been deprecated in favor of `provide`. This change improves semantic clarity: you **provide** dependencies to a class rather than **inject** them.
6+
7+
## Why the Change?
8+
9+
The term "provide" better describes what happens at the decorator level:
10+
- You **provide** a list of dependencies that the class needs
11+
- The DI container **injects** those dependencies into the constructor
12+
13+
This aligns better with dependency injection terminology used in other frameworks.
14+
15+
## Backward Compatibility
16+
17+
**Your existing code continues to work** - No breaking changes
18+
⚠️ **Console warnings** will appear when using `inject`
19+
🔮 **Future removal** - `inject` will be removed in a future major version
20+
21+
## Migration Steps
22+
23+
### Before (Deprecated)
24+
```typescript
25+
@Assemblage({
26+
inject: [[Logger], [Database]]
27+
})
28+
class UserService {
29+
constructor(
30+
private logger: Logger,
31+
private database: Database
32+
) {}
33+
}
34+
```
35+
36+
### After (Recommended)
37+
```typescript
38+
@Assemblage({
39+
provide: [[Logger], [Database]]
40+
})
41+
class UserService {
42+
constructor(
43+
private logger: Logger,
44+
private database: Database
45+
) {}
46+
}
47+
```
48+
49+
## Examples
50+
51+
### Simple Dependency
52+
53+
**Before:**
54+
```typescript
55+
@Assemblage({
56+
inject: [[ConcreteService]]
57+
})
58+
class MyApp implements AbstractAssemblage {
59+
constructor(private service: ConcreteService) {}
60+
}
61+
```
62+
63+
**After:**
64+
```typescript
65+
@Assemblage({
66+
provide: [[ConcreteService]]
67+
})
68+
class MyApp implements AbstractAssemblage {
69+
constructor(private service: ConcreteService) {}
70+
}
71+
```
72+
73+
### With Abstraction
74+
75+
**Before:**
76+
```typescript
77+
@Assemblage({
78+
inject: [[AbstractLogger, ConsoleLogger]]
79+
})
80+
class MyApp implements AbstractAssemblage {
81+
constructor(private logger: AbstractLogger) {}
82+
}
83+
```
84+
85+
**After:**
86+
```typescript
87+
@Assemblage({
88+
provide: [[AbstractLogger, ConsoleLogger]]
89+
})
90+
class MyApp implements AbstractAssemblage {
91+
constructor(private logger: AbstractLogger) {}
92+
}
93+
```
94+
95+
### With Configuration
96+
97+
**Before:**
98+
```typescript
99+
@Assemblage({
100+
inject: [[DatabaseService, { host: 'localhost', port: 5432 }]]
101+
})
102+
class MyApp implements AbstractAssemblage {
103+
constructor(private db: DatabaseService) {}
104+
}
105+
```
106+
107+
**After:**
108+
```typescript
109+
@Assemblage({
110+
provide: [[DatabaseService, { host: 'localhost', port: 5432 }]]
111+
})
112+
class MyApp implements AbstractAssemblage {
113+
constructor(private db: DatabaseService) {}
114+
}
115+
```
116+
117+
### Multiple Dependencies
118+
119+
**Before:**
120+
```typescript
121+
@Assemblage({
122+
inject: [
123+
[Logger],
124+
[DatabaseService],
125+
[CacheService]
126+
]
127+
})
128+
class MyApp implements AbstractAssemblage {
129+
constructor(
130+
private logger: Logger,
131+
private db: DatabaseService,
132+
private cache: CacheService
133+
) {}
134+
}
135+
```
136+
137+
**After:**
138+
```typescript
139+
@Assemblage({
140+
provide: [
141+
[Logger],
142+
[DatabaseService],
143+
[CacheService]
144+
]
145+
})
146+
class MyApp implements AbstractAssemblage {
147+
constructor(
148+
private logger: Logger,
149+
private db: DatabaseService,
150+
private cache: CacheService
151+
) {}
152+
}
153+
```
154+
155+
## Automated Migration
156+
157+
You can use a simple search and replace in your IDE:
158+
159+
**Find:**
160+
```regex
161+
inject:\s*\[
162+
```
163+
164+
**Replace with:**
165+
```
166+
provide: [
167+
```
168+
169+
This will update all occurrences in your codebase.
170+
171+
## Transition Behavior
172+
173+
If both options are present, `provide` takes precedence:
174+
175+
```typescript
176+
@Assemblage({
177+
inject: [[OldService]], // ⚠️ Ignored
178+
provide: [[NewService]] // ✅ Used
179+
})
180+
class MyService {
181+
constructor(private service: NewService) {} // NewService is injected
182+
}
183+
```
184+
185+
A console warning will notify you of this situation.
186+
187+
## Deprecation Timeline
188+
189+
- **Current Version**: `provide` introduced, `inject` deprecated with warnings
190+
- **Future Major Version**: `inject` will be completely removed
191+
192+
## FAQ
193+
194+
### Q: Do I need to migrate immediately?
195+
**A:** No, but it's recommended. Your code will continue working, but you'll see deprecation warnings in the console.
196+
197+
### Q: Is there any behavioral difference?
198+
**A:** No. `provide` works exactly like `inject`. It's purely a semantic improvement.
199+
200+
### Q: What happens if I use both?
201+
**A:** `provide` takes priority, and you'll see a warning. Choose one or the other.
202+
203+
### Q: How do I silence the warnings?
204+
**A:** Replace all `inject:` with `provide:` in your `@Assemblage` decorators.
205+
206+
### Q: Will TypeScript autocomplete work?
207+
**A:** Yes! Full TypeScript support is maintained for both options during the transition period.
208+
209+
## Need Help?
210+
211+
If you encounter any issues during migration, please:
212+
- Check the [Dependency Injection](../core-concepts/dependency-injection.md) guide
213+
- Review the [Assemblage](../core-concepts/assemblage.md) documentation
214+
- Open an issue on GitHub

docs/assemblerjs/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class Logger implements AbstractAssemblage {
3030
}
3131
}
3232

33-
@Assemblage({ inject: [[Logger]] })
33+
@Assemblage({ provide: [[Logger]] })
3434
class App implements AbstractAssemblage {
3535
constructor(private logger: Logger) {}
3636

packages/assemblerjs/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ class Logger implements AbstractAssemblage {
8383

8484
// Define an application that depends on Logger
8585
@Assemblage({
86-
inject: [[Logger]], // Declare dependencies
86+
provide: [[Logger]], // Declare dependencies
8787
})
8888
class App implements AbstractAssemblage {
8989
constructor(private logger: Logger) {}

packages/assemblerjs/coverage/coverage-final.json

Lines changed: 39 additions & 39 deletions
Large diffs are not rendered by default.

packages/assemblerjs/coverage/coverage-summary.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
1-
{"total": {"lines":{"total":1152,"covered":1023,"skipped":0,"pct":88.8},"statements":{"total":1215,"covered":1056,"skipped":0,"pct":86.91},"functions":{"total":327,"covered":299,"skipped":0,"pct":91.43},"branches":{"total":648,"covered":476,"skipped":0,"pct":73.45},"branchesTrue":{"total":0,"covered":0,"skipped":0,"pct":100}}
1+
{"total": {"lines":{"total":1181,"covered":1069,"skipped":0,"pct":90.51},"statements":{"total":1246,"covered":1104,"skipped":0,"pct":88.6},"functions":{"total":335,"covered":308,"skipped":0,"pct":91.94},"branches":{"total":677,"covered":511,"skipped":0,"pct":75.48},"branchesTrue":{"total":0,"covered":0,"skipped":0,"pct":100}}
22
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/assemblage/lib/decorator.ts": {"lines":{"total":8,"covered":8,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":8,"covered":8,"skipped":0,"pct":100},"branches":{"total":2,"covered":2,"skipped":0,"pct":100}}
33
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/assemblage/lib/helpers.ts": {"lines":{"total":6,"covered":5,"skipped":0,"pct":83.33},"functions":{"total":3,"covered":2,"skipped":0,"pct":66.66},"statements":{"total":6,"covered":5,"skipped":0,"pct":83.33},"branches":{"total":2,"covered":2,"skipped":0,"pct":100}}
44
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/assemblage/lib/definition/inject.ts": {"lines":{"total":21,"covered":20,"skipped":0,"pct":95.23},"functions":{"total":16,"covered":15,"skipped":0,"pct":93.75},"statements":{"total":23,"covered":22,"skipped":0,"pct":95.65},"branches":{"total":4,"covered":4,"skipped":0,"pct":100}}
5-
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/assemblage/lib/definition/schema.ts": {"lines":{"total":59,"covered":59,"skipped":0,"pct":100},"functions":{"total":33,"covered":33,"skipped":0,"pct":100},"statements":{"total":59,"covered":59,"skipped":0,"pct":100},"branches":{"total":46,"covered":46,"skipped":0,"pct":100}}
5+
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/assemblage/lib/definition/schema.ts": {"lines":{"total":67,"covered":66,"skipped":0,"pct":98.5},"functions":{"total":37,"covered":36,"skipped":0,"pct":97.29},"statements":{"total":67,"covered":66,"skipped":0,"pct":98.5},"branches":{"total":60,"covered":60,"skipped":0,"pct":100}}
66
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/assemblage/lib/definition/use.ts": {"lines":{"total":11,"covered":10,"skipped":0,"pct":90.9},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":11,"covered":10,"skipped":0,"pct":90.9},"branches":{"total":12,"covered":9,"skipped":0,"pct":75}}
77
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/assembler/lib/assembler-builder.ts": {"lines":{"total":32,"covered":28,"skipped":0,"pct":87.5},"functions":{"total":4,"covered":3,"skipped":0,"pct":75},"statements":{"total":32,"covered":28,"skipped":0,"pct":87.5},"branches":{"total":6,"covered":4,"skipped":0,"pct":66.66}}
88
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/assembler/lib/assembler.ts": {"lines":{"total":39,"covered":38,"skipped":0,"pct":97.43},"functions":{"total":16,"covered":15,"skipped":0,"pct":93.75},"statements":{"total":39,"covered":38,"skipped":0,"pct":97.43},"branches":{"total":12,"covered":12,"skipped":0,"pct":100}}
99
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/assembler/lib/context-provider.ts": {"lines":{"total":3,"covered":3,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":3,"covered":3,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}}
10-
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/assembler/lib/cycle-detector.ts": {"lines":{"total":35,"covered":8,"skipped":0,"pct":22.85},"functions":{"total":8,"covered":4,"skipped":0,"pct":50},"statements":{"total":38,"covered":8,"skipped":0,"pct":21.05},"branches":{"total":16,"covered":0,"skipped":0,"pct":0}}
11-
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/assembler/lib/debug-logger.ts": {"lines":{"total":64,"covered":51,"skipped":0,"pct":79.68},"functions":{"total":30,"covered":25,"skipped":0,"pct":83.33},"statements":{"total":73,"covered":54,"skipped":0,"pct":73.97},"branches":{"total":66,"covered":41,"skipped":0,"pct":62.12}}
10+
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/assembler/lib/cycle-detector.ts": {"lines":{"total":34,"covered":27,"skipped":0,"pct":79.41},"functions":{"total":8,"covered":6,"skipped":0,"pct":75},"statements":{"total":37,"covered":27,"skipped":0,"pct":72.97},"branches":{"total":14,"covered":8,"skipped":0,"pct":57.14}}
11+
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/assembler/lib/debug-logger.ts": {"lines":{"total":81,"covered":66,"skipped":0,"pct":81.48},"functions":{"total":34,"covered":29,"skipped":0,"pct":85.29},"statements":{"total":92,"covered":71,"skipped":0,"pct":77.17},"branches":{"total":80,"covered":51,"skipped":0,"pct":63.75}}
1212
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/assembler/lib/hook-manager.ts": {"lines":{"total":41,"covered":35,"skipped":0,"pct":85.36},"functions":{"total":11,"covered":8,"skipped":0,"pct":72.72},"statements":{"total":50,"covered":38,"skipped":0,"pct":76},"branches":{"total":24,"covered":15,"skipped":0,"pct":62.5}}
13-
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/assembler/lib/injectable-manager.ts": {"lines":{"total":92,"covered":65,"skipped":0,"pct":70.65},"functions":{"total":13,"covered":12,"skipped":0,"pct":92.3},"statements":{"total":105,"covered":68,"skipped":0,"pct":64.76},"branches":{"total":79,"covered":34,"skipped":0,"pct":43.03}}
13+
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/assembler/lib/injectable-manager.ts": {"lines":{"total":97,"covered":70,"skipped":0,"pct":72.16},"functions":{"total":13,"covered":12,"skipped":0,"pct":92.3},"statements":{"total":110,"covered":73,"skipped":0,"pct":66.36},"branches":{"total":81,"covered":36,"skipped":0,"pct":44.44}}
1414
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/assembler/lib/object-manager.ts": {"lines":{"total":21,"covered":20,"skipped":0,"pct":95.23},"functions":{"total":6,"covered":6,"skipped":0,"pct":100},"statements":{"total":21,"covered":20,"skipped":0,"pct":95.23},"branches":{"total":12,"covered":8,"skipped":0,"pct":66.66}}
1515
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/assembler/lib/resolution-strategies.ts": {"lines":{"total":13,"covered":13,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":13,"covered":13,"skipped":0,"pct":100},"branches":{"total":4,"covered":4,"skipped":0,"pct":100}}
1616
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/events/lib/helpers.ts": {"lines":{"total":26,"covered":22,"skipped":0,"pct":84.61},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":27,"covered":23,"skipped":0,"pct":85.18},"branches":{"total":16,"covered":10,"skipped":0,"pct":62.5}}
1717
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/events/lib/collection/listener-collection.ts": {"lines":{"total":52,"covered":45,"skipped":0,"pct":86.53},"functions":{"total":24,"covered":20,"skipped":0,"pct":83.33},"statements":{"total":53,"covered":46,"skipped":0,"pct":86.79},"branches":{"total":16,"covered":12,"skipped":0,"pct":75}}
1818
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/events/lib/manager/event-manager.ts": {"lines":{"total":55,"covered":48,"skipped":0,"pct":87.27},"functions":{"total":17,"covered":15,"skipped":0,"pct":88.23},"statements":{"total":56,"covered":49,"skipped":0,"pct":87.5},"branches":{"total":22,"covered":19,"skipped":0,"pct":86.36}}
1919
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/injectable/lib/dependencies.ts": {"lines":{"total":42,"covered":40,"skipped":0,"pct":95.23},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":44,"covered":42,"skipped":0,"pct":95.45},"branches":{"total":21,"covered":17,"skipped":0,"pct":80.95}}
2020
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/injectable/lib/injectable-builder.ts": {"lines":{"total":18,"covered":16,"skipped":0,"pct":88.88},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":18,"covered":16,"skipped":0,"pct":88.88},"branches":{"total":12,"covered":8,"skipped":0,"pct":66.66}}
21-
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/injectable/lib/injectable.ts": {"lines":{"total":115,"covered":108,"skipped":0,"pct":93.91},"functions":{"total":19,"covered":18,"skipped":0,"pct":94.73},"statements":{"total":117,"covered":110,"skipped":0,"pct":94.01},"branches":{"total":105,"covered":84,"skipped":0,"pct":80}}
21+
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/injectable/lib/injectable.ts": {"lines":{"total":115,"covered":108,"skipped":0,"pct":93.91},"functions":{"total":19,"covered":18,"skipped":0,"pct":94.73},"statements":{"total":117,"covered":110,"skipped":0,"pct":94.01},"branches":{"total":106,"covered":85,"skipped":0,"pct":80.18}}
2222
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/transversals/decorators/affect.ts": {"lines":{"total":7,"covered":7,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":7,"covered":7,"skipped":0,"pct":100},"branches":{"total":4,"covered":4,"skipped":0,"pct":100}}
2323
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/transversals/lib/decorators.ts": {"lines":{"total":25,"covered":25,"skipped":0,"pct":100},"functions":{"total":10,"covered":10,"skipped":0,"pct":100},"statements":{"total":25,"covered":25,"skipped":0,"pct":100},"branches":{"total":17,"covered":17,"skipped":0,"pct":100}}
2424
,"/Users/benoitlahoz/Documents/Development/assemblerjs/packages/assemblerjs/src/features/transversals/lib/pointcut-matcher.ts": {"lines":{"total":15,"covered":14,"skipped":0,"pct":93.33},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":15,"covered":14,"skipped":0,"pct":93.33},"branches":{"total":6,"covered":5,"skipped":0,"pct":83.33}}

0 commit comments

Comments
 (0)