sandly 0.1.0 → 0.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 +20 -17
- package/dist/index.d.ts +394 -226
- package/dist/index.js +319 -136
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
A dependency injection framework for TypeScript that emphasizes complete type safety, modular architecture, and scope management.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
_Sandly_ stands for **Services & Layers** - reflecting the framework's core concepts of organizing code into composable service layers.
|
|
8
8
|
|
|
9
9
|
## Key Features
|
|
10
10
|
|
|
@@ -17,19 +17,19 @@ A dependency injection framework for TypeScript that emphasizes complete type sa
|
|
|
17
17
|
```typescript
|
|
18
18
|
import { container, Tag } from 'sandly';
|
|
19
19
|
|
|
20
|
-
class DatabaseService extends Tag.
|
|
20
|
+
class DatabaseService extends Tag.Service('DatabaseService') {
|
|
21
21
|
query() {
|
|
22
22
|
return ['data'];
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
const
|
|
26
|
+
const container = Container.empty().register(DatabaseService, () => new DatabaseService());
|
|
27
27
|
|
|
28
28
|
// ✅ TypeScript knows DatabaseService is available
|
|
29
|
-
const db = await
|
|
29
|
+
const db = await container.resolve(DatabaseService);
|
|
30
30
|
|
|
31
31
|
// ❌ Compile error - UserService not registered
|
|
32
|
-
const user = await
|
|
32
|
+
const user = await container.resolve(UserService); // Type error
|
|
33
33
|
```
|
|
34
34
|
|
|
35
35
|
### Modular Architecture with Layers
|
|
@@ -47,7 +47,7 @@ const userServiceLayer = layer<typeof DatabaseService, typeof UserService>(
|
|
|
47
47
|
(container) =>
|
|
48
48
|
container.register(
|
|
49
49
|
UserService,
|
|
50
|
-
async (c) => new UserService(await c.
|
|
50
|
+
async (c) => new UserService(await c.resolve(DatabaseService))
|
|
51
51
|
)
|
|
52
52
|
);
|
|
53
53
|
|
|
@@ -73,11 +73,11 @@ export const handler = async (event, context) => {
|
|
|
73
73
|
// Create request scope for this invocation
|
|
74
74
|
const requestContainer = runtime.child('request').register(
|
|
75
75
|
UserService,
|
|
76
|
-
async (c) => new UserService(await c.
|
|
76
|
+
async (c) => new UserService(await c.resolve(DatabaseService)) // Uses runtime DB
|
|
77
77
|
);
|
|
78
78
|
|
|
79
79
|
try {
|
|
80
|
-
const userService = await requestContainer.
|
|
80
|
+
const userService = await requestContainer.resolve(UserService);
|
|
81
81
|
return await userService.handleRequest(event);
|
|
82
82
|
} finally {
|
|
83
83
|
await requestContainer.destroy(); // Cleanup request scope
|
|
@@ -92,13 +92,13 @@ export const handler = async (event, context) => {
|
|
|
92
92
|
```typescript
|
|
93
93
|
import { container, Tag } from 'sandly';
|
|
94
94
|
|
|
95
|
-
class EmailService extends Tag.
|
|
95
|
+
class EmailService extends Tag.Service('EmailService') {
|
|
96
96
|
sendEmail(to: string, subject: string) {
|
|
97
97
|
return { messageId: 'msg-123' };
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
-
class UserService extends Tag.
|
|
101
|
+
class UserService extends Tag.Service('UserService') {
|
|
102
102
|
constructor(private emailService: EmailService) {
|
|
103
103
|
super();
|
|
104
104
|
}
|
|
@@ -113,10 +113,10 @@ const app = container()
|
|
|
113
113
|
.register(EmailService, () => new EmailService())
|
|
114
114
|
.register(
|
|
115
115
|
UserService,
|
|
116
|
-
async (c) => new UserService(await c.
|
|
116
|
+
async (c) => new UserService(await c.resolve(EmailService))
|
|
117
117
|
);
|
|
118
118
|
|
|
119
|
-
const userService = await app.
|
|
119
|
+
const userService = await app.resolve(UserService);
|
|
120
120
|
```
|
|
121
121
|
|
|
122
122
|
### Service Pattern with Auto-Composition
|
|
@@ -127,7 +127,7 @@ import { service, Layer } from 'sandly';
|
|
|
127
127
|
const emailService = service(EmailService, () => new EmailService());
|
|
128
128
|
const userService = service(
|
|
129
129
|
UserService,
|
|
130
|
-
async (container) => new UserService(await container.
|
|
130
|
+
async (container) => new UserService(await container.resolve(EmailService))
|
|
131
131
|
);
|
|
132
132
|
|
|
133
133
|
// Automatic dependency resolution
|
|
@@ -140,7 +140,7 @@ const app = emailService().provide(userService()).register(container());
|
|
|
140
140
|
const ApiKeyTag = Tag.of('apiKey')<string>();
|
|
141
141
|
const ConfigTag = Tag.of('config')<{ dbUrl: string }>();
|
|
142
142
|
|
|
143
|
-
class DatabaseService extends Tag.
|
|
143
|
+
class DatabaseService extends Tag.Service('DatabaseService') {
|
|
144
144
|
constructor(
|
|
145
145
|
private config: Inject<typeof ConfigTag>,
|
|
146
146
|
private apiKey: Inject<typeof ApiKeyTag>
|
|
@@ -155,7 +155,10 @@ const app = container()
|
|
|
155
155
|
.register(
|
|
156
156
|
DatabaseService,
|
|
157
157
|
async (c) =>
|
|
158
|
-
new DatabaseService(
|
|
158
|
+
new DatabaseService(
|
|
159
|
+
await c.resolve(ConfigTag),
|
|
160
|
+
await c.resolve(ApiKeyTag)
|
|
161
|
+
)
|
|
159
162
|
);
|
|
160
163
|
```
|
|
161
164
|
|
|
@@ -180,8 +183,8 @@ const userServiceLayer = layer<
|
|
|
180
183
|
UserService,
|
|
181
184
|
async (c) =>
|
|
182
185
|
new UserService(
|
|
183
|
-
await c.
|
|
184
|
-
await c.
|
|
186
|
+
await c.resolve(DatabaseService),
|
|
187
|
+
await c.resolve(CacheService)
|
|
185
188
|
)
|
|
186
189
|
)
|
|
187
190
|
);
|