class-resolver 2.2.0 → 4.0.1

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-ja.md DELETED
@@ -1,374 +0,0 @@
1
- # Simple Class resolver
2
-
3
- クラスベースのリゾルバーを使用して責任連鎖パターンを実装するための軽量なTypeScript/JavaScriptライブラリです。
4
-
5
- ## 特徴
6
-
7
- - さまざまなタイプのリクエストを処理するためのシンプルで直感的なAPI
8
- - TypeScriptによる型安全な実装
9
- - 柔軟なリゾルバー登録(コンストラクタ、setUpdaters、addUpdater)
10
- - 異なる処理ロジックを持つ複数のリゾルバーのサポート
11
- - サポートされていないタイプに対する明確なエラー処理
12
- - より良い型安全性のためのジェネリック型サポート
13
- - **サポートされていないタイプのためのフォールバックハンドラーサポート**
14
- - **メソッドチェーンサポートによる流れるようなAPI**
15
-
16
- ## インストール
17
-
18
- ```bash
19
- npm install class-resolver
20
- # または
21
- yarn add class-resolver
22
- ```
23
-
24
- ## 基本的な使い方
25
-
26
- ```typescript
27
- const Resolver = require('class-resolver')
28
-
29
- class ExampleClass {
30
- supports(type) {
31
- return type === 'hoge'
32
- }
33
- handle() {
34
- return 'hoge'
35
- }
36
- }
37
- class ExampleClass2 {
38
- supports(type) {
39
- return type === 'fuga'
40
- }
41
- handle() {
42
- return 'fuga'
43
- }
44
- }
45
-
46
- const resolver = new Resolver(new ExampleClass(), new ExampleClass2())
47
- const c = resolver.resolve('hoge')
48
- console.log(c.handle()) // 出力: hoge
49
-
50
- const c2 = resolver.resolve('fuga')
51
- console.log(c2.handle()) // 出力: fuga
52
-
53
- try {
54
- resolver.resolve('xxx') // これはエラーをスローします
55
- } catch (e) {
56
- console.log(e) // Error: Unsupported type: xxx
57
- }
58
- ```
59
-
60
- ## フォールバックハンドラーの使い方
61
-
62
- フォールバックハンドラーを使用すると、サポートされていないタイプをエラーをスローすることなく適切に処理できます:
63
-
64
- ```typescript
65
- const resolver = new Resolver(new ExampleClass(), new ExampleClass2())
66
-
67
- // サポートされていないタイプのためのフォールバックハンドラーを設定
68
- resolver.setFallbackHandler((type) => {
69
- return `フォールバック: ${type}`
70
- })
71
-
72
- // これでサポートされていないタイプはエラーをスローせずにフォールバックハンドラーが使用されます
73
- const result = resolver.resolve('xxx')
74
- console.log(result.handle('xxx')) // 出力: フォールバック: xxx
75
-
76
- // サポートされているタイプは通常通り動作します
77
- const c = resolver.resolve('hoge')
78
- console.log(c.handle()) // 出力: hoge
79
- ```
80
-
81
- ## 高度な使い方
82
-
83
- ### TypeScriptとパラメータの使用
84
-
85
- ```typescript
86
- import Resolver from 'class-resolver';
87
- import { ResolveTarget } from 'class-resolver';
88
-
89
- // より良い型安全性のためにジェネリクスを使用
90
- class MessageFormatter implements ResolveTarget<[string, number], string> {
91
- supports(type: string): boolean {
92
- return type === 'greeting'
93
- }
94
-
95
- handle(name: string, count: number): string {
96
- return `Hello ${name}, this is message #${count}!`
97
- }
98
- }
99
-
100
- class ErrorFormatter implements ResolveTarget<[string, number], string> {
101
- supports(type: string): boolean {
102
- return type === 'error'
103
- }
104
-
105
- handle(message: string, code: number): string {
106
- return `Error ${code}: ${message}`
107
- }
108
- }
109
-
110
- // より良い型安全性のためにジェネリック型を指定
111
- const resolver = new Resolver<ResolveTarget<[string, number], string>>(
112
- new MessageFormatter(),
113
- new ErrorFormatter()
114
- )
115
-
116
- // グリーティングフォーマッターの使用
117
- const greeting = resolver.resolve('greeting')
118
- console.log(greeting.handle('John', 1)) // 出力: Hello John, this is message #1!
119
-
120
- // エラーフォーマッターの使用
121
- const error = resolver.resolve('error')
122
- console.log(error.handle('Not Found', 404)) // 出力: Error 404: Not Found
123
- ```
124
-
125
- ### 動的リゾルバー登録
126
-
127
- ```typescript
128
- // より良い型安全性のためにジェネリック型を指定
129
- const resolver = new Resolver<ResolveTarget<[string, number], string>>()
130
-
131
- // 初期化後にリゾルバーを追加
132
- resolver.setUpdaters(new MessageFormatter(), new ErrorFormatter())
133
-
134
- // または一つずつ追加
135
- resolver.addUpdater(new MessageFormatter())
136
- resolver.addUpdater(new ErrorFormatter())
137
- ```
138
-
139
- ### TypeScriptでのフォールバックハンドラー
140
-
141
- フォールバックハンドラーは完全な型安全性を維持し、リゾルバーの設定から自動的に型を推論します:
142
-
143
- ```typescript
144
- // 特定の型でリゾルバーを作成
145
- const resolver = new Resolver<ResolveTarget<[string, number], string>>(
146
- new MessageFormatter()
147
- )
148
-
149
- // 同じ型シグネチャでフォールバックハンドラーを設定
150
- resolver.setFallbackHandler((name: string, count: number): string => {
151
- return `${name}のデフォルトの挨拶(メッセージ #${count})`
152
- })
153
-
154
- // フォールバックハンドラーはサポートされていないタイプに使用されます
155
- const result = resolver.resolve('unknown').handle('田中', 5)
156
- console.log(result) // 出力: 田中 のデフォルトの挨拶(メッセージ #5)
157
-
158
- // メソッドチェーンもサポートされています
159
- resolver
160
- .setFallbackHandler((name: string, count: number): string => {
161
- return `カスタムフォールバック: ${name} - ${count}`
162
- })
163
- .addUpdater(new ErrorFormatter())
164
- ```
165
-
166
- ## ジェネリック型サポート
167
-
168
- バージョン2.0.0から、class-resolverはより良い型安全性のためにジェネリック型をサポートしています:
169
-
170
- ```typescript
171
- // ジェネリクスを使用したインターフェースの定義
172
- interface ResolveTarget<TArgs extends any[] = any[], TReturn = any> {
173
- supports(type: string): boolean;
174
- handle(...args: TArgs): TReturn;
175
- }
176
-
177
- // 特定の型でインターフェースを実装するクラスを定義
178
- class StringFormatter implements ResolveTarget<[string], string> {
179
- supports(type: string): boolean {
180
- return type === 'string-format';
181
- }
182
-
183
- handle(input: string): string {
184
- return input.toUpperCase();
185
- }
186
- }
187
-
188
- // 特定の型でリゾルバーを作成
189
- const resolver = new Resolver<ResolveTarget<[string], string>>(new StringFormatter());
190
- const formatter = resolver.resolve('string-format');
191
- const result = formatter.handle('hello'); // resultはstring型として型付けされます
192
- ```
193
-
194
- ## ユースケース
195
-
196
- 1. **コマンドパターンの実装**: 特定のハンドラーで異なるタイプのコマンドを処理
197
- 2. **フォーマット変換**: タイプに基づいてデータを異なるフォーマット間で変換
198
- 3. **リクエスト処理**: 専用のハンドラーで異なるタイプのリクエストを処理
199
- 4. **プラグインシステム**: 異なるプラグインが特定のタイプの操作を処理するプラグインシステムを実装
200
- 5. **メッセージフォーマット**: 特定のフォーマッターで異なるタイプのメッセージをフォーマット
201
- 6. **適切な機能低下**: フォールバックハンドラーを使用して未知のタイプのデフォルト動作を提供
202
- 7. **APIバージョニング**: フォールバックを使用して後方互換性のある動作で異なるAPIバージョンを処理
203
- 8. **フィーチャーフラグ**: フォールバックを使用して基本的な機能にフィーチャーフラグを実装
204
-
205
- ## エラー処理
206
-
207
- リゾルバーは以下の場合にエラーをスローします:
208
- - リゾルバーが登録されていない場合: `"Unasigned resolve target."`
209
- - サポートされていないタイプを解決しようとした場合: `"Unsupported type: xxx"`
210
-
211
- ### フォールバックハンドラーによるエラー防止
212
-
213
- フォールバックハンドラーを使用すると、サポートされていないタイプのエラーを防ぐことができます:
214
-
215
- ```typescript
216
- const resolver = new Resolver(new ExampleClass())
217
-
218
- // フォールバックハンドラーなし - エラーがスローされる
219
- try {
220
- resolver.resolve('unknown')
221
- } catch (e) {
222
- console.log(e) // Error: Unsupported type: unknown
223
- }
224
-
225
- // フォールバックハンドラーあり - エラーはスローされない
226
- resolver.setFallbackHandler((type) => `デフォルト: ${type}`)
227
- const result = resolver.resolve('unknown') // エラーなし、フォールバックが使用される
228
- console.log(result.handle('unknown')) // 出力: デフォルト: unknown
229
- ```
230
-
231
- ## アップグレードガイド
232
-
233
- ### 1.xから2.0.0へのアップグレード
234
-
235
- バージョン2.0.0では、より良い型安全性のためにジェネリック型サポートが導入されました。この変更はJavaScriptユーザーにとって後方互換性がありますが、TypeScriptユーザーはコードを更新する必要があるかもしれません。
236
-
237
- #### TypeScriptユーザーの変更点
238
-
239
- 1. `ResolveTarget`インターフェースがジェネリクスをサポートするようになりました:
240
- ```typescript
241
- // 以前 (1.x)
242
- interface ResolveTarget {
243
- supports(type: string): boolean;
244
- handle(...args: any[]): any;
245
- }
246
-
247
- // 以後 (2.0.0)
248
- interface ResolveTarget<TArgs extends any[] = any[], TReturn = any> {
249
- supports(type: string): boolean;
250
- handle(...args: TArgs): TReturn;
251
- }
252
- ```
253
-
254
- 2. `Resolver`クラスがジェネリクスをサポートするようになりました:
255
- ```typescript
256
- // 以前 (1.x)
257
- class Resolver {
258
- // ...
259
- }
260
-
261
- // 以後 (2.0.0)
262
- class Resolver<TBase extends ResolveTarget = ResolveTarget> {
263
- // ...
264
- }
265
- ```
266
-
267
- #### 移行手順
268
-
269
- 1. デフォルトの`any`型を使用してTypeScriptを使用している場合、コードは変更なしで引き続き動作するはずです。
270
-
271
- 2. 改善された型安全性を活用するには、クラスの実装を更新してください:
272
- ```typescript
273
- // 以前 (1.x)
274
- class MyHandler implements ResolveTarget {
275
- supports(type: string): boolean {
276
- return type === 'my-type';
277
- }
278
- handle(name: string): string {
279
- return `Hello ${name}`;
280
- }
281
- }
282
-
283
- // 以後 (2.0.0)
284
- class MyHandler implements ResolveTarget<[string], string> {
285
- supports(type: string): boolean {
286
- return type === 'my-type';
287
- }
288
- handle(name: string): string {
289
- return `Hello ${name}`;
290
- }
291
- }
292
- ```
293
-
294
- 3. 新しいResolverを作成する際に、ジェネリック型を指定してください:
295
- ```typescript
296
- // 以前 (1.x)
297
- const resolver = new Resolver(new MyHandler());
298
-
299
- // 以後 (2.0.0)
300
- const resolver = new Resolver<ResolveTarget<[string], string>>(new MyHandler());
301
- ```
302
-
303
- 4. 混合ハンドラータイプがある場合は、ユニオン型を使用するか、デフォルトの`any`型を引き続き使用できます:
304
- ```typescript
305
- // ユニオン型の使用
306
- type MyHandlers = ResolveTarget<[string], string> | ResolveTarget<[number], boolean>;
307
- const resolver = new Resolver<MyHandlers>(new StringHandler(), new NumberHandler());
308
-
309
- // またはデフォルトのany型を引き続き使用
310
- const resolver = new Resolver(new StringHandler(), new NumberHandler());
311
- ```
312
-
313
- ## 貢献
314
-
315
- ```bash
316
- $ npm install
317
- $ git checkout -b YOUR_TOPIC_BRANCH
318
- $ npm test
319
- $ npm run build
320
- $ git add ./
321
- $ git commit -m "YOUR UPDATE DESCRIPTION"
322
- $ git push YOUR_ORIGIN YOUR_TOPIC_BRANCH
323
- ```
324
-
325
- ## サンプル
326
-
327
- このライブラリには、使用方法を示すサンプルが含まれています。サンプルを実行するには:
328
-
329
- ```bash
330
- # サンプルディレクトリに移動
331
- cd example
332
-
333
- # 依存関係をインストール
334
- npm install
335
-
336
- # ビルドを実行
337
- npm run build
338
-
339
- # サンプルを実行
340
- npm test
341
- ```
342
-
343
- ### JavaScriptサンプル
344
-
345
- JavaScriptでの基本的な使用例は`index.js`ファイルにあります:
346
-
347
- ```bash
348
- node index.js
349
- ```
350
-
351
- ### TypeScriptサンプル
352
-
353
- TypeScriptでの使用例は`libs/index.ts`ファイルにあります。v2.0.0からはジェネリクスをサポートしており、型安全性が向上しています:
354
-
355
- ```typescript
356
- import Resolver, { ResolveTarget } from 'class-resolver';
357
-
358
- // ジェネリクスを使用して引数と戻り値の型を指定
359
- class StringFormatter implements ResolveTarget<[string], string> {
360
- supports(type: string): boolean {
361
- return type === 'string-format';
362
- }
363
-
364
- handle(input: string): string {
365
- return input.toUpperCase();
366
- }
367
- }
368
-
369
- // Resolverにも型パラメータを指定
370
- const resolver = new Resolver<ResolveTarget<[string], string>>(new StringFormatter());
371
- const formatter = resolver.resolve('string-format');
372
- const result = formatter.handle('hello'); // resultはstring型として型付けされます
373
- console.log(result); // "HELLO"
374
- ```