@nojaja/greputil 1.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.
@@ -0,0 +1,77 @@
1
+ # NodeGrepUtil - TypeScript移行・品質担保完了
2
+
3
+ ## 実施内容
4
+
5
+ ### ✅ フェーズ1: TypeScript移行
6
+ - TypeScript 5.3.3 へ完全移行
7
+ - tsconfig.json の作成と設定
8
+ - 全ソースファイル (.js → .ts) の変換完了
9
+ - 型定義の整備
10
+ - JSDocコメントの完全整備(処理名・処理概要・実装理由)
11
+
12
+ ### ✅ フェーズ2: 品質ツールの導入
13
+ - ESLint + プラグイン導入(@typescript-eslint, sonarjs, jsdoc)
14
+ - eslint.config.cjs の作成(Cognitive Complexity ≤ 10)
15
+ - typedoc + typedoc-plugin-markdown の導入
16
+ - typedoc.js の作成
17
+ - dependency-cruiser の導入
18
+ - .dependency-cruiser.js の作成
19
+
20
+ ### ✅ フェーズ3: テスト設定の強化
21
+ - jest.unit.config.js の作成(カバレッジ閾値80%設定)
22
+ - ts-jest による TypeScript テスト対応
23
+ - テストファイルの TypeScript 化
24
+ - テストケースの拡充(カバレッジ向上)
25
+
26
+ ### ✅ フェーズ4: JSDocの整備
27
+ - 全クラス・メソッドに日本語JSDoc追加
28
+ - 「処理名・処理概要・実装理由」の3項目を完備
29
+ - @param, @returns の型情報整備
30
+
31
+ ### ✅ package.json スクリプト追加
32
+ - `npm run test` - 単体テスト実行
33
+ - `npm run test:ci` - カバレッジ付きテスト(80%必須)
34
+ - `npm run build` - TypeScript ビルド(webpack)
35
+ - `npm run lint` - ESLint 実行
36
+ - `npm run depcruise` - 依存関係検証
37
+ - `npm run docs` - typedoc ドキュメント生成
38
+
39
+ ## 次のステップ
40
+
41
+ 以下のコマンドを順次実行して品質ゲートを検証してください:
42
+
43
+ ```powershell
44
+ # 1. 依存関係のインストール
45
+ cd d:\devs\workspace202111\NodeGrepUtil ; npm install
46
+
47
+ # 2. ビルド検証
48
+ npm run build
49
+
50
+ # 3. テスト実行(カバレッジ80%必須)
51
+ npm run test:ci
52
+
53
+ # 4. ESLint検証
54
+ npm run lint
55
+
56
+ # 5. 依存関係検証
57
+ npm run depcruise
58
+
59
+ # 6. ドキュメント生成
60
+ npm run docs
61
+
62
+ # 7. 音を鳴らして完了通知
63
+ rundll32 user32.dll,MessageBeep
64
+ ```
65
+
66
+ ## 品質ゲート状態
67
+
68
+ | 項目 | 状態 | 詳細 |
69
+ |------|------|------|
70
+ | TypeScript化 | ✅ | 全ファイル .ts 化完了 |
71
+ | テストカバレッジ | ⏳ | 設定完了(実行後に80%達成見込み) |
72
+ | ESLint | ⏳ | 設定完了(実行後に検証) |
73
+ | dependency-cruiser | ⏳ | 設定完了(実行後に検証) |
74
+ | typedoc | ⏳ | 設定完了(実行後にドキュメント生成) |
75
+ | JSDoc整備 | ✅ | 全関数・クラスに完備 |
76
+
77
+ ⏳マークは npm install 実行後に検証可能です。
package/README.md ADDED
@@ -0,0 +1,336 @@
1
+ # NodeGrepUtil
2
+
3
+ 複数の正規表現パターンを効率的に扱うためのJavaScriptユーティリティライブラリです。文字列に対して複数の正規表現を一度に適用し、マッチング結果を取得できます。また、バッファパターンマッチング機能も提供します。
4
+
5
+ ## プロジェクト概要
6
+
7
+ NodeGrepUtilは、複数の正規表現パターンを配列として管理し、それらを文字列に対して順次適用するための`RegExpArray`クラスを提供します。標準のJavaScript正規表現APIを拡張し、複数パターンの一括処理を簡潔に記述できます。さらに、`BufferPatternMatcher`クラスによるバイナリデータのパターンマッチング機能も備えています。
8
+
9
+ ## プロジェクト構造
10
+
11
+ ```
12
+ NodeGrepUtil/
13
+ ├── src/
14
+ │ ├── index.js # ライブラリエントリポイント(RegExpArray、BufferPatternMatcherのエクスポート)
15
+ │ ├── RegExpArray.js # RegExpArrayクラスの実装
16
+ │ └── BufferPatternMatcher.js # BufferPatternMatcherクラスの実装
17
+ ├── tests/
18
+ │ └── unit/
19
+ │ └── RegExpArray.spec.js # ユニットテスト
20
+ ├── dist/ # ビルド出力ディレクトリ(webpack)
21
+ ├── jest.config.js # Jestテスト設定
22
+ ├── webpack.config.js # Webpackビルド設定(UMD形式)
23
+ ├── package.json # プロジェクトメタデータと依存関係
24
+ ├── LICENSE # MITライセンス
25
+ └── README.md # プロジェクトドキュメント
26
+ ```
27
+
28
+ ## 技術スタック
29
+
30
+ - **言語**: JavaScript (ES6+)
31
+ - **ビルドツール**: Webpack 5
32
+ - **テストフレームワーク**: Jest 29
33
+ - **トランスパイラ**: Babel (Jest用)
34
+ - **出力形式**: UMD (Universal Module Definition)
35
+
36
+ ## 機能
37
+
38
+ ### 完了している機能
39
+
40
+ #### RegExpArray(正規表現配列)
41
+ - ✅ 複数の正規表現パターンを配列で管理
42
+ - ✅ 正規表現の文字列表記、配列表記、RegExpオブジェクトの混在をサポート
43
+ - ✅ `exec()` - 複数パターンでの順次マッチング実行
44
+ - ✅ `test()` - 複数パターンでのテスト(いずれかがマッチすればtrue)
45
+ - ✅ `firstMatch()` - 最初にマッチした結果を返すインスタンスメソッド
46
+ - ✅ `toArray()` - RegExpオブジェクトの配列を取得
47
+ - ✅ `RegExpArray.matchAll()` - 静的メソッドによる全マッチ結果の取得
48
+ - ✅ `RegExpArray.firstMatch()` - 静的メソッドで最初のマッチを取得
49
+ - ✅ `RegExpArray.test()` - 静的メソッドでマッチテスト(修正済み)
50
+
51
+ #### BufferPatternMatcher(バッファパターンマッチング)
52
+ - ✅ `compareBuf()` - バイナリデータ(Buffer)に対するパターンマッチング
53
+ - ✅ 複数のバッファパターンとの比較
54
+ - ✅ エラーハンドリングとthrowによる例外送出
55
+
56
+ #### 共通機能
57
+ - ✅ UMDバンドルによるNode.js/ブラウザ両対応
58
+ - ✅ null入力時の適切な処理(nullを返す)
59
+ - ✅ 改善されたエラーハンドリング(throw使用)
60
+
61
+ ## セットアップ
62
+
63
+ ### インストール
64
+
65
+ ```powershell
66
+ # リポジトリのクローン
67
+ git clone https://github.com/nojaja/NodeGrepUtil.git
68
+ cd NodeGrepUtil
69
+
70
+ # 依存関係のインストール
71
+ npm install
72
+ ```
73
+
74
+ ### ビルド
75
+
76
+ ```powershell
77
+ # UMDバンドルのビルド (dist/GrepUtil.bundle.js)
78
+ npm run build
79
+ ```
80
+
81
+ ## 使用方法
82
+
83
+ ### ライブラリとしての使用
84
+
85
+ #### インストール
86
+
87
+ ```powershell
88
+ npm install @nojaja/greputil
89
+ ```
90
+
91
+ #### API リファレンス
92
+
93
+ ##### RegExpArray クラス
94
+
95
+ | メソッド/関数 | パラメータ | 戻り値 | 説明 |
96
+ |--------------|-----------|--------|------|
97
+ | `new RegExpArray(patternList)` | `patternList: string[] \| RegExp[] \| Array<[string, string]>` | `RegExpArray` | 複数の正規表現パターンからインスタンスを作成。文字列、RegExpオブジェクト、[パターン, フラグ]配列の混在可 |
98
+ | `exec(string)` | `string: string` | `Array<string>` | 各正規表現を順次実行し、すべてのマッチ結果を配列で返す(グローバルフラグ使用時はステートフル) |
99
+ | `firstMatch(string)` | `string: string` | `RegExpExecArray \| null` | 最初にマッチした結果を返す。マッチしない場合はnull |
100
+ | `test(string)` | `string: string` | `boolean` | いずれかの正規表現がマッチすればtrue(firstMatchを内部使用) |
101
+ | `toArray()` | なし | `Array<RegExp>` | RegExpオブジェクトの配列を返す |
102
+ | `RegExpArray.matchAll(string, regexps)` | `string: string`, `regexps: string \| RegExp \| Array \| null` | `Array<Array<string>> \| null` | 静的メソッド。すべてのマッチ結果を二次元配列で返す。regexpsがnullの場合はnullを返す |
103
+ | `RegExpArray.firstMatch(string, regexps)` | `string: string`, `regexps: string \| RegExp \| Array \| null` | `RegExpExecArray \| null` | 静的メソッド。最初のマッチ結果を返す。regexpsがnullの場合はnullを返す |
104
+ | `RegExpArray.test(string, regexps)` | `string: string`, `regexps: string \| RegExp \| Array \| null` | `boolean` | 静的メソッド。マッチするかテスト(内部でfirstMatchを使用) |
105
+
106
+ ##### BufferPatternMatcher クラス
107
+
108
+ | メソッド/関数 | パラメータ | 戻り値 | 説明 |
109
+ |--------------|-----------|--------|------|
110
+ | `new BufferPatternMatcher()` | なし | `BufferPatternMatcher` | BufferPatternMatcherのインスタンスを作成 |
111
+ | `compareBuf(buffer, patterns)` | `buffer: Buffer`, `patterns: Array<Buffer>` | `boolean \| null` | バッファを複数のパターンと比較。マッチすればtrue、マッチしなければfalse、patternsがnullの場合はnull |
112
+
113
+ #### 基本的な使用例
114
+
115
+ ##### RegExpArray の使用
116
+
117
+ ```javascript
118
+ import { RegExpArray } from '@nojaja/greputil';
119
+
120
+ // 1. インスタンス作成 - 複数のパターンを配列で指定
121
+ const util = new RegExpArray([
122
+ /test\d/g, // RegExpオブジェクト
123
+ 'hello', // 文字列
124
+ ['world', 'i'] // [パターン, フラグ]配列
125
+ ]);
126
+
127
+ // 2. exec() - 順次マッチング実行
128
+ const result1 = util.exec('test1 hello test2');
129
+ // => ["test1", "hello"]
130
+
131
+ // 3. firstMatch() - 最初のマッチを取得
132
+ const result2 = util.firstMatch('test1 hello test2');
133
+ // => ["test1"] (配列形式で詳細含む)
134
+
135
+ // 4. test() - いずれかがマッチするか判定
136
+ const result3 = util.test('test1 hello');
137
+ // => true
138
+
139
+ // 5. toArray() - RegExpオブジェクト配列を取得
140
+ const regexps = util.toArray();
141
+ // => [/test\d/g, /hello/, /world/i]
142
+
143
+ // 6. 静的メソッド matchAll() - すべてのマッチを取得
144
+ const matches = RegExpArray.matchAll('test1test2', [/t(e)(st(\d?))/g]);
145
+ // => [["test1","e","st1","1"], ["test2","e","st2","2"]]
146
+
147
+ // 7. 静的メソッド firstMatch() - 最初のマッチのみ
148
+ const firstMatch = RegExpArray.firstMatch('test1test2', [/test\d/g]);
149
+ // => ["test1"]
150
+ ```
151
+
152
+ ##### BufferPatternMatcher の使用
153
+
154
+ ```javascript
155
+ import { BufferPatternMatcher } from '@nojaja/greputil';
156
+
157
+ // バイナリデータのパターンマッチング
158
+ const matcher = new BufferPatternMatcher();
159
+
160
+ // PNG/JPEGファイルの判定例
161
+ const fileBuffer = Buffer.from([0x89, 0x50, 0x4E, 0x47, ...]);
162
+ const patterns = [
163
+ Buffer.from([0x89, 0x50, 0x4E, 0x47]), // PNGシグネチャ
164
+ Buffer.from([0xFF, 0xD8, 0xFF]) // JPEGシグネチャ
165
+ ];
166
+
167
+ const isMatch = matcher.compareBuf(fileBuffer, patterns);
168
+ // => true (PNGパターンにマッチ)
169
+ ```
170
+
171
+ #### 実用例 - ログファイルの解析
172
+
173
+ ```javascript
174
+ import { RegExpArray } from '@nojaja/greputil';
175
+
176
+ const logText = `
177
+ 2026-01-01 ERROR: Database connection failed
178
+ 2026-01-01 WARN: Slow query detected
179
+ 2026-01-02 ERROR: Timeout occurred
180
+ `;
181
+
182
+ // ERRORとWARNの両方を抽出
183
+ const patterns = [
184
+ /\d{4}-\d{2}-\d{2} ERROR: .+/g,
185
+ /\d{4}-\d{2}-\d{2} WARN: .+/g
186
+ ];
187
+
188
+ const matches = RegExpArray.matchAll(logText, patterns);
189
+ console.log(matches);
190
+ // => [
191
+ // ["2026-01-01 ERROR: Database connection failed"],
192
+ // ["2026-01-01 WARN: Slow query detected"],
193
+ // ["2026-01-02 ERROR: Timeout occurred"]
194
+ // ]
195
+
196
+ // 最初のエラーのみを取得
197
+ const firstError = RegExpArray.firstMatch(logText, [/ERROR: .+/]);
198
+ // => ["ERROR: Database connection failed"]
199
+ ```
200
+
201
+ #### エラーハンドリング
202
+
203
+ ```javascript
204
+ import { RegExpArray, BufferPatternMatcher } from '@nojaja/greputil';
205
+
206
+ // RegExpArray: エラーは例外として送出される
207
+ try {
208
+ const matches = RegExpArray.matchAll('test', [/[/]); // 不正な正規表現
209
+ } catch (error) {
210
+ console.error('正規表現エラー:', error);
211
+ // エラーがthrowされるため、適切にキャッチする必要がある
212
+ }
213
+
214
+ // null入力時の処理
215
+ const result = RegExpArray.matchAll('test', null);
216
+ // => null(エラーではなくnullを返す)
217
+
218
+ // BufferPatternMatcher: エラーは例外として送出される
219
+ try {
220
+ const matcher = new BufferPatternMatcher();
221
+ const isMatch = matcher.compareBuf(invalidBuffer, patterns);
222
+ } catch (error) {
223
+ console.error('バッファ比較エラー:', error);
224
+ }
225
+ ```
226
+
227
+ ### 開発セットアップ
228
+
229
+ 開発環境のセットアップと一般的な開発コマンド:
230
+
231
+ ```powershell
232
+ # リポジトリをクローン
233
+ git clone https://github.com/nojaja/NodeGrepUtil.git
234
+ cd NodeGrepUtil
235
+
236
+ # 依存関係をインストール
237
+ npm install
238
+
239
+ # テストを実行
240
+ npm run test
241
+
242
+ # ビルドを実行(dist/GrepUtil.bundle.js を生成)
243
+ npm run build
244
+ ```
245
+
246
+ #### 開発ワークフロー
247
+
248
+ 1. `src/RegExpArray.js` または `src/BufferPatternMatcher.js` でコードを修正
249
+ 2. `tests/unit/RegExpArray.spec.js` でテストを追加・更新
250
+ 3. `npm run test` でテスト実行
251
+ 4. `npm run build` でUMDバンドルをビルド
252
+ 5. コミット&プッシュ
253
+
254
+ ## 技術的な詳細
255
+
256
+ ### パターン指定の柔軟性
257
+
258
+ `RegExpArray`のコンストラクタは、以下の3つの形式を受け付けます:
259
+
260
+ ```javascript
261
+ new RegExpArray([
262
+ /pattern/g, // 1. RegExpオブジェクト
263
+ 'string pattern', // 2. 文字列(フラグなし)
264
+ ['pattern', 'gi'] // 3. [パターン, フラグ]配列
265
+ ]);
266
+ ```
267
+
268
+ ### ステートフルな動作
269
+
270
+ グローバルフラグ(`g`)を使用した正規表現は、`exec()`や`test()`呼び出し時にステートを保持します:
271
+
272
+ ```javascript
273
+ const util = new RegExpArray([/test\d/g]);
274
+
275
+ util.exec('test1 test2'); // => ["test1"]
276
+ util.exec('test1 test2'); // => ["test2"] (次のマッチに進む)
277
+ util.exec('test1 test2'); // => [] (マッチなし)
278
+ ```
279
+
280
+ 最後に使用された正規表現は`util.last`で参照可能です。
281
+
282
+ ### null入力時の動作
283
+
284
+ `RegExpArray`の静的メソッドは、null入力に対して適切に処理します:
285
+
286
+ ```javascript
287
+ RegExpArray.matchAll('test', null); // => null
288
+ RegExpArray.firstMatch('test', null); // => null
289
+ RegExpArray.test('test', null); // => false
290
+ ```
291
+
292
+ `BufferPatternMatcher.compareBuf()`もpatternsがnullの場合はnullを返します。
293
+
294
+ ### UMDバンドル
295
+
296
+ Webpackで生成される`dist/GrepUtil.bundle.js`は、以下の環境で使用可能:
297
+
298
+ - **Node.js**: `require('@nojaja/greputil')`
299
+ - **ブラウザ(グローバル)**: `<script>`タグで読み込み後、グローバル変数として利用
300
+ - **AMD/RequireJS**: AMD形式で読み込み可能
301
+
302
+ ## 現在のステータス
303
+
304
+ ### 実装済み
305
+
306
+ - ✅ RegExpArrayコアAPIの実装完了(`constructor`, `exec`, `firstMatch`, `test`, `toArray`, 静的メソッド)
307
+ - ✅ BufferPatternMatcherの実装完了(`compareBuf`)
308
+ - ✅ ユニットテスト実装(カバレッジ: 主要機能)
309
+ - ✅ Webpackビルド設定完了(UMD出力)
310
+ - ✅ エラーハンドリング改善(throw使用)
311
+ - ✅ null入力時の適切な処理
312
+ - ✅ 静的メソッド`test()`の修正(firstMatch使用)
313
+ - ✅ ドキュメント整備(この README.md)
314
+
315
+ ### 未実装・検討中
316
+
317
+ - ❌ TypeScript型定義ファイル(`.d.ts`)
318
+ - ❌ ESM形式での配布対応
319
+ - ❌ より詳細なエラーハンドリングとバリデーション
320
+ - ❌ パフォーマンス最適化(大量パターン処理時)
321
+
322
+ ## パフォーマンス・目標
323
+
324
+ - **目標**: 100個以上の正規表現パターンを同時に扱える設計
325
+ - **現状**: 小〜中規模のパターン配列(10〜50個)での動作を想定した実装
326
+
327
+ ## ライセンス & 作者
328
+
329
+ - **ライセンス**: MIT License
330
+ - **作者**: nojaja <free.riccia@gmail.com>
331
+ - **リポジトリ**: [https://github.com/nojaja/NodeGrepUtil](https://github.com/nojaja/NodeGrepUtil)
332
+ - **バージョン**: 1.0.0
333
+
334
+ ## バグ報告・機能要望
335
+
336
+ 問題や機能要望は [GitHub Issues](https://github.com/nojaja/NodeGrepUtil/issues) までお願いします。
package/jest.config.js ADDED
@@ -0,0 +1,16 @@
1
+ module.exports = {
2
+ verbose: true ,
3
+ transform: {
4
+ '^.+\\.js$' : 'babel-jest'
5
+ },
6
+ testMatch: [
7
+ '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'
8
+ ],
9
+ moduleFileExtensions: [
10
+ "js",
11
+ "jsx"
12
+ ],
13
+ moduleDirectories: [
14
+ "node_modules"
15
+ ]
16
+ }
@@ -0,0 +1,31 @@
1
+ module.exports = {
2
+ preset: 'ts-jest',
3
+ testEnvironment: 'node',
4
+ verbose: true,
5
+ roots: ['<rootDir>/tests/unit'],
6
+ testMatch: [
7
+ '**/tests/unit/**/*.spec.ts',
8
+ '**/tests/unit/**/*.test.ts'
9
+ ],
10
+ transform: {
11
+ '^.+\\.ts$': ['ts-jest', {
12
+ tsconfig: 'tsconfig.json'
13
+ }]
14
+ },
15
+ moduleFileExtensions: ['ts', 'js', 'json'],
16
+ collectCoverage: false,
17
+ collectCoverageFrom: [
18
+ 'src/**/*.ts',
19
+ '!src/**/*.d.ts'
20
+ ],
21
+ coverageDirectory: 'coverage',
22
+ coverageReporters: ['text', 'lcov', 'html'],
23
+ coverageThreshold: {
24
+ global: {
25
+ branches: 80,
26
+ functions: 80,
27
+ lines: 80,
28
+ statements: 80
29
+ }
30
+ }
31
+ };
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@nojaja/greputil",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "main": "./dist/GrepUtil.bundle.js",
6
+ "scripts": {
7
+ "test": "jest --config jest.unit.config.js",
8
+ "test:ci": "jest --config jest.unit.config.js --coverage",
9
+ "build": "webpack",
10
+ "lint": "eslint .",
11
+ "depcruise": "depcruise --config .dependency-cruiser.js src",
12
+ "docs": "typedoc"
13
+ },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/nojaja/NodeGrepUtil.git"
17
+ },
18
+ "author": "nojaja <free.riccia@gmail.com> (https://github.com/nojaja)",
19
+ "license": "MIT",
20
+ "bugs": {
21
+ "url": "https://github.com/nojaja/NodeGrepUtil/issues"
22
+ },
23
+ "homepage": "https://github.com/nojaja/NodeGrepUtil#readme",
24
+ "devDependencies": {
25
+ "@types/jest": "^29.5.2",
26
+ "@types/node": "^20.0.0",
27
+ "@typescript-eslint/eslint-plugin": "^6.0.0",
28
+ "@typescript-eslint/parser": "^6.0.0",
29
+ "cross-env": "^7.0.3",
30
+ "dependency-cruiser": "^13.0.0",
31
+ "eslint": "^8.45.0",
32
+ "eslint-plugin-jsdoc": "^46.0.0",
33
+ "eslint-plugin-sonarjs": "^0.19.0",
34
+ "jest": "^29.6.1",
35
+ "ts-jest": "^29.1.0",
36
+ "ts-loader": "^9.4.4",
37
+ "typescript": "^5.3.3",
38
+ "typedoc": "^0.25.0",
39
+ "typedoc-plugin-markdown": "^3.16.0",
40
+ "webpack": "^5.74.0",
41
+ "webpack-cli": "^4.10.0"
42
+ }
43
+ }
@@ -0,0 +1,61 @@
1
+ /**
2
+ * 処理名: バッファパターンマッチャークラス
3
+ * 処理概要:
4
+ * バイナリデータ(Buffer)に対して複数のパターンマッチングを行うクラス。
5
+ * 複数のBufferパターンと比較し、いずれかがマッチするか判定する。
6
+ * 実装理由:
7
+ * ファイルシグネチャ判定やバイナリデータの識別など、
8
+ * バイナリレベルでのパターンマッチングが必要なユースケースに対応するため。
9
+ * 正規表現では扱えないバイト列の比較を実現する。
10
+ */
11
+ export class BufferPatternMatcher {
12
+ /**
13
+ * 処理名: BufferPatternMatcherコンストラクタ
14
+ * 処理概要:
15
+ * BufferPatternMatcherのインスタンスを作成する。
16
+ * 現在は状態を持たないシンプルな実装。
17
+ * 実装理由:
18
+ * 将来的な拡張性を考慮してクラスとして実装。
19
+ * 状態管理やキャッシュ機能を追加する可能性がある。
20
+ * @returns BufferPatternMatcherインスタンス
21
+ */
22
+ constructor() {
23
+ // 現在は状態を持たない
24
+ }
25
+
26
+ /**
27
+ * 処理名: バッファパターン比較
28
+ * 処理概要:
29
+ * バッファを複数のパターンと比較する。
30
+ * いずれかのパターンがマッチすればtrue、マッチしなければfalse、
31
+ * patternsがnullの場合はnullを返す。
32
+ * 実装理由:
33
+ * バイナリファイルの種類判定(PNG、JPEG等のシグネチャチェック)や、
34
+ * バイト列パターンの検出に使用するため。
35
+ * Buffer.compareを使用して効率的なバイト列比較を実現する。
36
+ * @param buffer - 比較対象のバッファ
37
+ * @param patterns - マッチング対象のバッファパターンの配列
38
+ * @returns マッチした場合true、マッチしない場合false、patternsがnullの場合null
39
+ * @throws エラーが発生した場合は例外を投げる
40
+ */
41
+ compareBuf(buffer: Buffer, patterns: Array<Buffer> | null): boolean | null {
42
+ try {
43
+ if (!patterns) return null;
44
+
45
+ for (const pattern of patterns) {
46
+ if (pattern.length <= buffer.length &&
47
+ pattern.compare(buffer.slice(0, pattern.length)) === 0) {
48
+ return true;
49
+ }
50
+ }
51
+ return false;
52
+ } catch (error) {
53
+ if (error instanceof Error) {
54
+ console.error(`正規表現バッファ比較エラー: ${error.message}`);
55
+ }
56
+ throw error;
57
+ }
58
+ }
59
+ }
60
+
61
+ export default BufferPatternMatcher;