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