@joymerrevent/porters-connect 0.18.0 → 0.19.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/CHANGELOG.md CHANGED
@@ -5,6 +5,102 @@
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.19.1] - 2026-09-20
9
+
10
+ **定期レビューで見つけた 7 件を塞いだ版**です。破壊的変更はありません。公開 API の形は変わらず、
11
+ **壊れたときの倒れ方**が変わります。
12
+
13
+ いちばん重いのは **Option の選択肢 alias から書き込み XML を注入できた**こと。PORTERS は Option の値を
14
+ **タグ名**として書くため(`<FieldAlias><OptionAlias/></FieldAlias>`)、その値を検証していないと
15
+ **呼び出し側が指定していないレコードが書き換わり**ます。要素名はエスケープできないので、検証して弾く形にしました
16
+ ([ADR-0085][adr85])。
17
+
18
+ ### Security
19
+
20
+ - **Option の選択肢 alias と書き込み項目 alias を、XML の名前として妥当か検証するようになりました**
21
+ ([ADR-0085][adr85])。公開型が `string[]` なので cast なしで到達でき、`<Item>` を閉じて開き直す文字列を
22
+ 渡すと **well-formed な XML に別レコードを名指す `<Item>` を注入**できていました(更新先が
23
+ すり替わる/頼んでいない項目が書き足される)。
24
+
25
+ ```ts
26
+ await t.candidate.update(10001, { P_Phase: [userInput] });
27
+ // 不正なら送信前に PortersConfigError(category: "validation")
28
+ ```
29
+
30
+ 通るのは **XML の `Name`**(英数字・`_`・`-`・`.`・日本語など。先頭に数字や `-` は置けません)。
31
+ 出典が alias の書式を定めていないので**XML が許すものはすべて許します** — `Option.P_東京` のような
32
+ alias も従来どおり書けます。**本文になる値(テキスト項目など)の扱いは変わりません。**
33
+
34
+ ### Fixed
35
+
36
+ - **`createThrottle` が実質 0 件の上限を受け付けて永久に待つのをやめました**。バケットのトークンは
37
+ `floor(上限 × safety)` 個で、既定 `safety` は 0.9。そのため `createThrottle({ readPerMin: 1 })` は
38
+ 容量 0 になり、**すべての呼び出しが返らなく**なっていました(例外もログも無し)。
39
+
40
+ ```ts
41
+ createThrottle({ readPerMin: 1 }); // PortersConfigError(floor(1 × 0.9) = 0)
42
+ createThrottle({ readPerMin: 2 }); // OK(floor(1.8) = 1)
43
+ ```
44
+
45
+ `readPerMin` / `writePerMin` は**正の整数**、`safety` は **0 より大きく 1 以下**。加えて
46
+ **積が 1 以上**であることを見ます。「1 件も通さない」は `take()` が解決しない `Throttle` を
47
+ 自分で渡してください。
48
+
49
+ - **XML の解析に失敗したとき、例外が必ず `PortersError` になるようになりました**。
50
+ `fast-xml-parser` は `prototype` / `constructor` / `__proto__` をタグ名として拒否します。
51
+ これらは妥当な XML Name なので書き込みは通り、**読み取りだけ**が素の `Error` で落ちていました
52
+ — `catch (e) { if (e instanceof PortersError) … }` に**引っかからず**、アプリの最上位まで
53
+ 素通りします。Read は `PortersResourceError`、認証は `PortersAuthError` に包み、パーサ自身の
54
+ 説明は `cause` に残します。壊れた XML も同じ経路になりました。
55
+
56
+ - **公開 API リファレンス**(`docs/usage/api/`)に残っていた日本語を英語に直しました。
57
+ 公開サーフェスの JSDoc は英語、README とガイドは日本語ファースト、という切り分けは変わりません。
58
+
59
+ ### Changed
60
+
61
+ - **CI が `engines` の下限そのものを走らせるようになりました**。`engines.node` は `>=22.12.0` を
62
+ 約束していますが、テストの Node マトリクスは `22`(その時点の 22 系最新に解決される)だったため、
63
+ **22.12.0 は一度も走っていません**でした。Node 22.12.0 で動かしている場合、そのバージョンが
64
+ 実際に検証されるようになります。
65
+
66
+ - 内部の検査を 2 本増やしました(利用者への影響はありません)。契約後に実機確認する仮定と
67
+ コード側のコメントの対応を双方向で見る検査と、リファレンスへの日本語混入を見る検査です。
68
+ 前者では**コードに仮定があるのに一覧に無いもの**が 3 件見つかり、起票しました。
69
+
70
+ ## [0.19.0] - 2026-09-18
71
+
72
+ **CJS からの入口を開け、Node の下限を 22.12 に上げた版**です。**破壊的変更を 1 つ**含みます
73
+ (`engines.node` の引き上げ)。
74
+
75
+ `require()` は `ERR_PACKAGE_PATH_NOT_EXPORTED`、TypeScript は `TS1479` — 0.18.0 まで、CJS からは
76
+ **実行時もコンパイル時も入口がありませんでした**。別実体(dual)を配るのではなく、`require` 条件を
77
+ **同じ ESM 実体**に向けて塞いでいます([ADR-0082][adr82])。
78
+
79
+ ### Added
80
+
81
+ - **CJS(`require`)から読めるようになりました**([ADR-0082][adr82])。
82
+
83
+ ```js
84
+ const { PortersClient } = require("@joymerrevent/porters-connect");
85
+ ```
86
+
87
+ 配るのは **ESM の 1 ファイルのまま**で、`require` 条件を同じ実体に向けています
88
+ (Node の `require(esm)`)。**CJS 用の別ファイルは配りません** — 実体が 2 つあると
89
+ ESM 側と CJS 側で別のクラスが読まれ、`catch (e) { if (e instanceof PortersError) … }` が
90
+ `false` になって素通りするためです。型は `dist/index.d.cts` を同梱しているので、
91
+ `moduleResolution: node16` の CJS 利用者もそのまま書けます。
92
+
93
+ 0.18.0 までは `exports` が `import` 条件しか持たず、`require()` は
94
+ `ERR_PACKAGE_PATH_NOT_EXPORTED`、TypeScript は `TS1479` で**入口そのものがありません**でした。
95
+
96
+ ### Changed
97
+
98
+ - **(破壊的)Node.js 22.12 以上が必要になりました**([ADR-0082][adr82])。`engines.node` が
99
+ `>=20` → `>=22.12.0` です。`require` 条件を ESM 実体に向ける形は Node の `require(esm)` に
100
+ 載っており、これが既定で有効なのは **22.12.0 以降**だからです(22.0〜22.11 では
101
+ `ERR_REQUIRE_ESM`)。丸めて `>=22` と書くとその範囲に対して嘘になるため、成立する最小の形で
102
+ 宣言しています。Node 20 は **2026-04-30 に EOL** で、テストの Node マトリクスからも外しました。
103
+
8
104
  ## [0.18.0] - 2026-09-17
9
105
 
10
106
  **「どのリソースか」の受け取り方を 1 つの規則に揃えた版**です。**破壊的変更を 4 つ**含みます
@@ -1025,13 +1121,17 @@ Attachment)あるのに、受け口の形が 3 つとも違っていました
1025
1121
  [adr79]: docs/adr/0079-resource-by-name.md
1026
1122
  [adr80]: docs/adr/0080-resource-parameter-binding.md
1027
1123
  [adr81]: docs/adr/0081-attachment-read-parameters.md
1124
+ [adr82]: docs/adr/0082-module-format-and-node-baseline.md
1028
1125
  [limits]: docs/usage/concepts/limits.md
1029
1126
  [failures]: docs/usage/howto/handle-failures.md
1127
+ [adr85]: docs/adr/0085-option-alias-validation.md
1030
1128
  [lv]: docs/live-verification.md
1031
1129
  [ref]: docs/usage/reference/README.md
1032
1130
  [kac]: https://keepachangelog.com/en/1.1.0/
1033
1131
  [semver]: https://semver.org/
1034
- [unreleased]: https://github.com/Joymerrevent/porters-connect/compare/v0.18.0...HEAD
1132
+ [unreleased]: https://github.com/Joymerrevent/porters-connect/compare/v0.19.1...HEAD
1133
+ [0.19.1]: https://github.com/Joymerrevent/porters-connect/compare/v0.19.0...v0.19.1
1134
+ [0.19.0]: https://github.com/Joymerrevent/porters-connect/compare/v0.18.0...v0.19.0
1035
1135
  [0.18.0]: https://github.com/Joymerrevent/porters-connect/compare/v0.17.0...v0.18.0
1036
1136
  [0.17.0]: https://github.com/Joymerrevent/porters-connect/compare/v0.16.0...v0.17.0
1037
1137
  [0.16.0]: https://github.com/Joymerrevent/porters-connect/compare/v0.15.1...v0.16.0
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @joymerrevent/porters-connect
2
2
 
3
- [![npm version][npm-badge]][npm] [![License: MIT][mit-badge]][mit] ![Node >= 20][node-badge] [![OpenSSF Scorecard][scorecard-badge]][scorecard] [![OpenSSF Best Practices][bp-badge]][bp]
3
+ [![npm version][npm-badge]][npm] [![License: MIT][mit-badge]][mit] ![Node >= 22.12.0][node-badge] [![OpenSSF Scorecard][scorecard-badge]][scorecard] [![OpenSSF Best Practices][bp-badge]][bp]
4
4
 
5
5
  PORTERS Connect API(旧 HRBC)を **TypeScript から型安全・簡単に**扱うための、
6
6
  [Joymerrevent(ジョイメリベント)][joymerrevent] 製の **非公式(unofficial)** ラッパーです。
@@ -35,7 +35,8 @@ XML レスポンスを型付きオブジェクトに変換し、独自仕様の
35
35
  4. **付与するスコープ**の決定(リソース別に `_r` / `_w`。Read でも複数要ることがあります)。
36
36
 
37
37
  揃えかたは[始める前に][s-prereq]に、権限付与の手順は[認証を通して、疎通を確認する][s-auth]に
38
- あります。実行環境は Node.js 20 以上(ESM)で、型定義は同梱です。
38
+ あります。実行環境は **Node.js 22.12 以上**で、型定義は同梱です。配るのは ESM 1 本ですが、
39
+ CJS からも `require("@joymerrevent/porters-connect")` で読めます([CJS から使う][s-cjs])。
39
40
 
40
41
  契約や権限付与を**待っている間**も、PORTERS に繋がずにコードとテストは書けます
41
42
  ([契約なしでテストを書きたい][test-without-contract])。
@@ -144,7 +145,7 @@ console.log(page.total, page.items[0]?.P_Name);
144
145
  [npm-badge]: https://img.shields.io/npm/v/@joymerrevent/porters-connect
145
146
  [mit]: ./LICENSE
146
147
  [mit-badge]: https://img.shields.io/badge/License-MIT-blue.svg
147
- [node-badge]: https://img.shields.io/badge/node-%3E%3D20-brightgreen.svg
148
+ [node-badge]: https://img.shields.io/badge/node-%3E%3D22.12.0-brightgreen.svg
148
149
  [scorecard]: https://scorecard.dev/viewer/?uri=github.com/Joymerrevent/porters-connect
149
150
  [scorecard-badge]: https://api.scorecard.dev/projects/github.com/Joymerrevent/porters-connect/badge
150
151
  [bp]: https://www.bestpractices.dev/projects/14611
@@ -160,6 +161,7 @@ console.log(page.total, page.items[0]?.P_Name);
160
161
  [c-no-delete]: docs/usage/concepts/no-delete.md
161
162
  [c-partition]: docs/usage/concepts/partition.md
162
163
  [s-auth]: docs/usage/start/authenticate.md
164
+ [s-cjs]: docs/usage/start/install.md#cjs-から-require-する
163
165
  [s-prereq]: docs/usage/start/prerequisites.md
164
166
  [test-without-contract]: docs/usage/howto/test-without-contract.md
165
167
  [docs-index]: docs/usage/index.md