sandly 0.1.0 → 0.2.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 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
- *Sandly* stands for **Services & Layers** - reflecting the framework's core concepts of organizing code into composable service layers.
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,7 +17,7 @@ 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.Class('DatabaseService') {
20
+ class DatabaseService extends Tag.Service('DatabaseService') {
21
21
  query() {
22
22
  return ['data'];
23
23
  }
@@ -26,10 +26,10 @@ class DatabaseService extends Tag.Class('DatabaseService') {
26
26
  const c = container().register(DatabaseService, () => new DatabaseService());
27
27
 
28
28
  // ✅ TypeScript knows DatabaseService is available
29
- const db = await c.get(DatabaseService);
29
+ const db = await c.resolve(DatabaseService);
30
30
 
31
31
  // ❌ Compile error - UserService not registered
32
- const user = await c.get(UserService); // Type error
32
+ const user = await c.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.get(DatabaseService))
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.get(DatabaseService)) // Uses runtime DB
76
+ async (c) => new UserService(await c.resolve(DatabaseService)) // Uses runtime DB
77
77
  );
78
78
 
79
79
  try {
80
- const userService = await requestContainer.get(UserService);
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.Class('EmailService') {
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.Class('UserService') {
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.get(EmailService))
116
+ async (c) => new UserService(await c.resolve(EmailService))
117
117
  );
118
118
 
119
- const userService = await app.get(UserService);
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.get(EmailService))
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.Class('DatabaseService') {
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(await c.get(ConfigTag), await c.get(ApiKeyTag))
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.get(DatabaseService),
184
- await c.get(CacheService)
186
+ await c.resolve(DatabaseService),
187
+ await c.resolve(CacheService)
185
188
  )
186
189
  )
187
190
  );