nodeconfigloder 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,92 @@
1
+ /**
2
+ * 処理名: 設定ファイル読み込み・書き込みライブラリ
3
+ *
4
+ * 処理概要:
5
+ * JSON/YAML形式の設定ファイルを読み込み・書き込みするためのクラス。
6
+ * 同期処理で設定ファイルを管理し、フォーマット変換機能を提供する
7
+ *
8
+ * 実装理由:
9
+ * アプリケーション起動時に設定ファイルを即座に読み込む必要があり、
10
+ * JSON/YAMLの双方に対応する必要があるため
11
+ */
12
+ export declare class ConfigLoder {
13
+ private debug;
14
+ /**
15
+ * 処理名: コンストラクタ
16
+ *
17
+ * 処理概要:
18
+ * ConfigLoderインスタンスを初期化する
19
+ *
20
+ * 実装理由:
21
+ * デバッグフラグを設定し、詳細なログ出力をコントロールするため
22
+ * @param {boolean} [debug] デバッグモード(省略可能、デフォルト: false)
23
+ */
24
+ constructor(debug?: boolean);
25
+ /**
26
+ * 処理名: リスト形式の設定ファイル読み込み
27
+ *
28
+ * 処理概要:
29
+ * 改行区切りのテキストファイルを読み込み、配列に変換して返す
30
+ *
31
+ * 実装理由:
32
+ * シンプルなリスト形式の設定を効率的に読み込むため
33
+ * @param {string} filepath ファイルパス
34
+ * @returns {string[]} 行単位に分割された文字列配列
35
+ * @throws {Error} ファイルが存在しないか読み込みに失敗した場合
36
+ */
37
+ readListSync(filepath: string): string[];
38
+ /**
39
+ * 処理名: 設定ファイル読み込み
40
+ *
41
+ * 処理概要:
42
+ * JSON/YAML形式の設定ファイルを読み込み、JSON文字列として返す。
43
+ * YAMLは自動的にJSONに変換される
44
+ *
45
+ * 実装理由:
46
+ * 複数のフォーマットに対応しながら、内部的にはJSONで統一处理するため
47
+ * @param {string} filepath ファイルパス
48
+ * @returns {string} JSON形式の文字列
49
+ * @throws {Error} ファイルが存在しないか読み込みに失敗した場合
50
+ */
51
+ readConfigSync(filepath: string): string;
52
+ /**
53
+ * 処理名: YAML形式への変換
54
+ *
55
+ * 処理概要:
56
+ * JavaScriptオブジェクトをYAML形式のテキストに変換する
57
+ *
58
+ * 実装理由:
59
+ * 設定ファイルの人間が読みやすいYAML形式での出力を実現するため
60
+ * @param {unknown} json 変換元のオブジェクト
61
+ * @returns {string} YAML形式の文字列
62
+ */
63
+ toYamlText(json: unknown): string;
64
+ /**
65
+ * 処理名: JSON形式への変換
66
+ *
67
+ * 処理概要:
68
+ * JavaScriptオブジェクトをフォーマット済みのJSON文字列に変換する
69
+ *
70
+ * 実装理由:
71
+ * 設定ファイルのJSON形式での出力を提供するため
72
+ * @param {unknown} json 変換元のオブジェクト
73
+ * @returns {string} フォーマット済みJSON文字列
74
+ */
75
+ toJsonText(json: unknown): string;
76
+ /**
77
+ * 処理名: 設定ファイル書き込み
78
+ *
79
+ * 処理概要:
80
+ * 設定データをJSONまたはYAML形式で指定されたパスに書き込む。
81
+ * ファイル拡張子から自動的にフォーマットを判定
82
+ *
83
+ * 実装理由:
84
+ * 変更された設定を指定フォーマットで永続化するため
85
+ * @param {string} filepath ファイルパス
86
+ * @param {unknown} data 書き込むデータ
87
+ * @throws {Error} 書き込みに失敗した場合
88
+ */
89
+ writeConfigSync(filepath: string, data: unknown): void;
90
+ }
91
+ export default ConfigLoder;
92
+ //# sourceMappingURL=ConfigLoder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigLoder.d.ts","sourceRoot":"","sources":["../../../src/configloder/ConfigLoder.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;GAUG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAU;IAEvB;;;;;;;;;OASG;gBACS,KAAK,CAAC,EAAE,OAAO;IAI3B;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAYxC;;;;;;;;;;;;OAYG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAexC;;;;;;;;;;OAUG;IACH,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM;IAIjC;;;;;;;;;;OAUG;IACH,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM;IAIjC;;;;;;;;;;;;OAYG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;CAYvD;AAED,eAAe,WAAW,CAAC"}
@@ -0,0 +1,152 @@
1
+ /// <reference types="node" />
2
+ import { EventEmitter } from 'events';
3
+ /**
4
+ * ハッシュツリーのノード型
5
+ */
6
+ interface HashTreeNode {
7
+ __hash: string;
8
+ [key: string]: unknown;
9
+ }
10
+ /**
11
+ * 処理名: 差分検出エンジン
12
+ *
13
+ * 処理概要:
14
+ * ハッシュツリーを使用して2つのJSON構造の差分を効率的に検出する。
15
+ * EventEmitterを継承し、差分を'difference'イベントで通知
16
+ *
17
+ * 実装理由:
18
+ * 大規模な設定ファイルの変更検出において、全体比較ではなく
19
+ * ハッシュツリーの活用で計算量を最小化するため
20
+ */
21
+ export declare class FindDifferences extends EventEmitter {
22
+ private previousHashTree;
23
+ /**
24
+ * 処理名: コンストラクタ
25
+ *
26
+ * 処理概要:
27
+ * FindDifferencesインスタンスを初期化し、前回のハッシュツリーを空の状態で保持
28
+ *
29
+ * 実装理由:
30
+ * EventEmitterの初期化と、差分検出のための状態を保持するため
31
+ */
32
+ constructor();
33
+ /**
34
+ * 処理名: ハッシュ値計算
35
+ *
36
+ * 処理概要:
37
+ * 与えられた値のSHA256ハッシュを計算する
38
+ *
39
+ * 実装理由:
40
+ * オブジェクトの内容をコンパクトに表現し、変更検出の基盤とするため
41
+ * @param {string} value ハッシュ対象の値
42
+ * @returns {string} ハッシュ文字列
43
+ * @private
44
+ */
45
+ private calculateHash;
46
+ /**
47
+ * 処理名: ハッシュツリー構築
48
+ *
49
+ * 処理概要:
50
+ * JSONデータから再帰的にハッシュツリーを構築する。
51
+ * 各ノードには__hashキーで当該ノード以下の変更を示すハッシュを保持
52
+ *
53
+ * 実装理由:
54
+ * 差分検出時に__hashの比較だけで下層の探索を短縮するため
55
+ * @param {unknown} data 構築対象のデータ
56
+ * @returns {HashTreeNode} ハッシュツリー
57
+ * @private
58
+ */
59
+ private buildHashTree;
60
+ /**
61
+ * 処理名: 削除・更新キーの処理
62
+ * @param {HashTreeNode} hashTree ハッシュツリー
63
+ * @param {Record<string, unknown>} jsonData JSON データ
64
+ * @param {string} path パス
65
+ * @returns {void}
66
+ * @private
67
+ */
68
+ private processExistingKeys;
69
+ /**
70
+ * 処理名: キー値の処理
71
+ * @param {HashTreeNode} hashTree ハッシュツリー
72
+ * @param {Record<string, unknown>} jsonData JSON データ
73
+ * @param {string} key キー
74
+ * @param {string} currentPath 現在のパス
75
+ * @returns {void}
76
+ * @private
77
+ */
78
+ private processKeyValue;
79
+ /**
80
+ * 処理名: オブジェクト値の処理
81
+ * @param {HashTreeNode} hashTree ハッシュツリー
82
+ * @param {Record<string, unknown>} jsonValue JSON 値
83
+ * @param {string} key キー
84
+ * @param {string} currentPath 現在のパス
85
+ * @returns {void}
86
+ * @private
87
+ */
88
+ private processObjectValue;
89
+ /**
90
+ * 処理名: プリミティブ値の処理
91
+ * @param {HashTreeNode} hashTree ハッシュツリー
92
+ * @param {unknown} jsonValue JSON 値
93
+ * @param {string} key キー
94
+ * @param {string} currentPath 現在のパス
95
+ * @returns {void}
96
+ * @private
97
+ */
98
+ private processPrimitiveValue;
99
+ /**
100
+ * 処理名: 追加されたキーの処理
101
+ * @param {HashTreeNode} hashTree ハッシュツリー
102
+ * @param {Record<string, unknown>} jsonData JSON データ
103
+ * @param {string} path パス
104
+ * @returns {void}
105
+ * @private
106
+ */
107
+ private processAddedKeys;
108
+ /**
109
+ * 処理名: 差分検出と更新
110
+ *
111
+ * 処理概要:
112
+ * 前回のハッシュツリーと新しいJSONデータを比較し、
113
+ * 追加・削除・更新されたパスを'difference'イベントで通知
114
+ *
115
+ * 実装理由:
116
+ * ハッシュ値の比較で不要な再帰を避け、変更箇所のみを検出するため
117
+ * @param {HashTreeNode} hashTree ハッシュツリー
118
+ * @param {unknown} jsonData JSON データ
119
+ * @param {string} path パス
120
+ * @returns {void}
121
+ * @private
122
+ */
123
+ private findDifferencesAndUpdate;
124
+ /**
125
+ * 処理名: ハッシュツリー初期化
126
+ *
127
+ * 処理概要:
128
+ * 初回読み込み時にハッシュツリーを構築し、前回状態として保持
129
+ *
130
+ * 実装理由:
131
+ * 次回の差分検出の基準となるベースラインを作成するため
132
+ * @param {unknown} jsonData 初回のJSONデータ
133
+ * @returns {HashTreeNode} 構築されたハッシュツリー
134
+ */
135
+ initialize(jsonData: unknown): HashTreeNode;
136
+ /**
137
+ * 処理名: 差分検出
138
+ *
139
+ * 処理概要:
140
+ * 新しいJSONデータと前回のハッシュツリーを比較し、
141
+ * 差分を検出して'difference'イベントで通知。
142
+ * 内部的にハッシュツリーを更新して次回検出に備える
143
+ *
144
+ * 実装理由:
145
+ * ファイル監視やリアルタイム変更検出のため、継続的に差分を検出するため
146
+ * @param {unknown} jsonData 新しいJSONデータ
147
+ * @returns {HashTreeNode} 更新上のハッシュツリー
148
+ */
149
+ detectChanges(jsonData: unknown): HashTreeNode;
150
+ }
151
+ export default FindDifferences;
152
+ //# sourceMappingURL=FindDifferences.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FindDifferences.d.ts","sourceRoot":"","sources":["../../../src/configloder/FindDifferences.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC;;GAEG;AACH,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAUD;;;;;;;;;;GAUG;AACH,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,OAAO,CAAC,gBAAgB,CAAe;IAEvC;;;;;;;;OAQG;;IAMH;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,aAAa;IAIrB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,aAAa;IAyCrB;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;IAqB3B;;;;;;;;OAQG;IACH,OAAO,CAAC,eAAe;IAcvB;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;IA2B1B;;;;;;;;OAQG;IACH,OAAO,CAAC,qBAAqB;IAgB7B;;;;;;;OAOG;IACH,OAAO,CAAC,gBAAgB;IAqBxB;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,wBAAwB;IAsBhC;;;;;;;;;;OAUG;IACH,UAAU,CAAC,QAAQ,EAAE,OAAO,GAAG,YAAY;IAI3C;;;;;;;;;;;;OAYG;IACH,aAAa,CAAC,QAAQ,EAAE,OAAO,GAAG,YAAY;CAI/C;AAED,eAAe,eAAe,CAAC"}
@@ -0,0 +1,108 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ /**
4
+ * 処理名: 設定値のシリアライズ・暗号化ライブラリ
5
+ *
6
+ * 処理概要:
7
+ * JavaScriptの設定オブジェクトをシリアライズ・デシリアライズする。
8
+ * 正規表現、Buffer、環境変数、シークレット情報の特殊なハンドリングをサポート
9
+ *
10
+ * 実装理由:
11
+ * 複雑な設定オブジェクト(正規表現、バイナリデータ、暗号情報)を
12
+ * JSON形式で安全に保存・復元するため
13
+ */
14
+ export declare class Serializer {
15
+ private crypto;
16
+ private debug;
17
+ /**
18
+ * 処理名: コンストラクタ
19
+ *
20
+ * 処理概要:
21
+ * Serializerインスタンスを初期化し、暗号化キーとデバッグフラグを設定
22
+ * 実装理由:
23
+ * 暗号化・複号化処理で使用する秘密鍵を保持するため
24
+ * @param {Buffer} cryptokey 暗号化用の秘密鍵
25
+ * @param {boolean} [debug] デバッグモード
26
+ */
27
+ constructor(cryptokey: Buffer, debug?: boolean);
28
+ /**
29
+ * 処理名: 暗号化キー生成
30
+ * 処理概要:
31
+ * パスワードから暗号化キーを生成する。
32
+ * パスワードが指定されない場合はランダムに生成
33
+ *
34
+ * 実装理由:
35
+ * 安全な暗号化キー生成のためにscrypt関数を使用
36
+ * @param {string} [password] 暗号化パスワード
37
+ * @returns {Buffer} 32バイトの暗号化キー
38
+ */
39
+ static generatekey(password?: string): Buffer;
40
+ /**
41
+ * 処理名: RegExp デシリアライズ処理
42
+ * @param {unknown} value 値
43
+ * @returns {unknown} 処理済み値
44
+ * @private
45
+ */
46
+ private deserializeRegExp;
47
+ /**
48
+ * 処理名: Buffer デシリアライズ処理
49
+ * @param {unknown} value 値
50
+ * @returns {unknown} 処理済み値
51
+ * @private
52
+ */
53
+ private deserializeBuffer;
54
+ /**
55
+ * 処理名: Secret デシリアライズ処理
56
+ * @param {unknown} value 値
57
+ * @returns {unknown} 処理済み値
58
+ * @private
59
+ */
60
+ private deserializeSecret;
61
+ /**
62
+ * 処理名: Env デシリアライズ処理
63
+ * @param {unknown} value 値
64
+ * @returns {unknown} 処理済み値
65
+ * @private
66
+ */
67
+ private deserializeEnv;
68
+ /**
69
+ * 処理名: リバイバー関数
70
+ * @param {string} _key キー名
71
+ * @param {unknown} value 値
72
+ * @returns {unknown} 処理済み値
73
+ * @private
74
+ */
75
+ private reviver;
76
+ /**
77
+ * 処理名: JSON文字列のデシリアライズ
78
+ *
79
+ * 処理概要:
80
+ * JSON文字列を復元し、特殊なtype値を持つオブジェクトを
81
+ * 適切なJavaScriptオブジェクトに変換する
82
+ *
83
+ * 実装理由:
84
+ * 保存されたシリアライズデータから元の正規表現、Buffer、Secret等を
85
+ * 復元するため
86
+ * @param {string} json JSON文字列
87
+ * @returns {unknown} デシリアライズされたオブジェクト
88
+ * @throws {Error} デシリアライズに失敗した場合
89
+ */
90
+ deserializeObject(json: string): unknown;
91
+ /**
92
+ * 処理名: JavaScriptコードのシリアライズ
93
+ *
94
+ * 処理概要:
95
+ * JavaScriptコード文字列を実行し、正規表現・Buffer・環境変数・Secret等の
96
+ * 特殊なオブジェクトを適切にシリアライズ可能な形式に変換
97
+ *
98
+ * 実装理由:
99
+ * module.exportsで定義された設定オブジェクトに対し、
100
+ * カスタムtoJSONメソッドを動的に追加してシリアライズ処理を統一するため
101
+ * @param {string} jsCode JavaScriptのコード文字列
102
+ * @returns {unknown} シリアライズされた設定オブジェクト
103
+ * @throws {Error} コード実行に失敗した場合
104
+ */
105
+ serializeObject(jsCode: string): unknown;
106
+ }
107
+ export default Serializer;
108
+ //# sourceMappingURL=Serializer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Serializer.d.ts","sourceRoot":"","sources":["../../../src/configloder/Serializer.ts"],"names":[],"mappings":";;AAMA;;;;;;;;;;GAUG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAIZ;IACF,OAAO,CAAC,KAAK,CAAU;IAEvB;;;;;;;;;OASG;gBACS,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;IAS9C;;;;;;;;;;OAUG;IACH,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM;IAO7C;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAczB;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAKzB;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAazB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAQtB;;;;;;OAMG;IACH,OAAO,CAAC,OAAO;IAyBf;;;;;;;;;;;;;OAaG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAQxC;;;;;;;;;;;;;OAaG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;CA+CzC;AAED,eAAe,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * 処理名: ConfigLoder ユニットテスト
3
+ *
4
+ * 処理概要:
5
+ * ConfigLoderクラスの各メソッドをテストする
6
+ *
7
+ * 実装理由:
8
+ * ファイル読み込み・書き込み・フォーマット変換の機能を検証するため
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=ConfigLoder.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigLoder.test.d.ts","sourceRoot":"","sources":["../../../../test/unit/configloder/ConfigLoder.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * 処理名: FindDifferences ユニットテスト
3
+ *
4
+ * 処理概要:
5
+ * FindDifferencesクラスの差分検出機能をテストする
6
+ *
7
+ * 実装理由:
8
+ * ハッシュツリーベースの差分検出アルゴリズムが正しく動作することを検証するため
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=FindDifferences.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FindDifferences.test.d.ts","sourceRoot":"","sources":["../../../../test/unit/configloder/FindDifferences.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * 処理名: Serializer ユニットテスト
3
+ *
4
+ * 処理概要:
5
+ * Serializerクラスのシリアライズ・デシリアライズ機能をテストする
6
+ *
7
+ * 実装理由:
8
+ * 正規表現、Buffer、Secret等の特殊なオブジェクトの安全な処理を検証するため
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=Serializer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Serializer.test.d.ts","sourceRoot":"","sources":["../../../../test/unit/configloder/Serializer.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "nodeconfigloder",
3
+ "version": "1.0.0",
4
+ "description": "Flexible configuration file loader with support for multiple formats including JSON, YAML, and JavaScript",
5
+ "keywords": [
6
+ "config",
7
+ "configuration",
8
+ "loader",
9
+ "json",
10
+ "yaml",
11
+ "cli"
12
+ ],
13
+ "main": "dist/configloder.bundle.js",
14
+ "files": [
15
+ "dist",
16
+ "package.json",
17
+ "README.md",
18
+ "LICENSE"
19
+ ],
20
+ "bin": {
21
+ "configtool": "dist/conftool.bundle.js"
22
+ },
23
+ "scripts": {
24
+ "test": "jest --config jest.unit.config.js",
25
+ "build": "cross-env NODE_ENV=test webpack",
26
+ "test:ci": "jest --config jest.unit.config.js --coverage",
27
+ "lint": "eslint .",
28
+ "docs": "typedoc --config typedoc.js",
29
+ "depcruise": "depcruise src --config .dependency-cruiser.js"
30
+ },
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "git+https://github.com/nojaja/NodeConfigLoder.git"
34
+ },
35
+ "author": "nojaja <free.riccia@gmail.com> (https://github.com/nojaja)",
36
+ "license": "MIT",
37
+ "bugs": {
38
+ "url": "https://github.com/nojaja/NodeConfigLoder/issues"
39
+ },
40
+ "homepage": "https://github.com/nojaja/NodeConfigLoder#readme",
41
+ "devDependencies": {
42
+ "@babel/preset-env": "^7.23.0",
43
+ "@eslint/js": "^8.54.0",
44
+ "@nojaja/pathutil": "^1.0.3",
45
+ "@types/jest": "^29.5.8",
46
+ "@types/js-yaml": "^4.0.9",
47
+ "@types/node": "^20.10.6",
48
+ "@types/source-map-support": "^0.5.10",
49
+ "@typescript-eslint/eslint-plugin": "^6.17.0",
50
+ "@typescript-eslint/parser": "^6.17.0",
51
+ "babel-jest": "^29.7.0",
52
+ "commander": "^8.3.0",
53
+ "cross-env": "^7.0.3",
54
+ "dependency-cruiser": "^17.3.5",
55
+ "eslint": "^8.54.0",
56
+ "eslint-plugin-jsdoc": "^46.9.1",
57
+ "eslint-plugin-sonarjs": "^0.23.0",
58
+ "jest": "^29.7.0",
59
+ "js-yaml": "^4.1.0",
60
+ "log4js": "^6.9.1",
61
+ "object-path": "^0.11.8",
62
+ "ts-jest": "^29.1.1",
63
+ "ts-loader": "^9.5.1",
64
+ "typedoc": "^0.25.4",
65
+ "typescript": "5.3.3",
66
+ "webpack": "^5.74.0",
67
+ "webpack-cli": "^4.10.0"
68
+ }
69
+ }