@joymerrevent/porters-connect 0.20.0 → 0.21.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/CHANGELOG.md CHANGED
@@ -5,6 +5,103 @@
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.21.0] - 2026-09-21
9
+
10
+ **カスタム項目の宣言を、partition を束ねる `tenant(id)` で受け取るようにした版**です。
11
+ **破壊的変更を 1 つ**含みます(コンストラクタの `fields` の廃止。移行は 1 対 1)。あわせて、
12
+ 利用者が読むもの(公開 JSDoc・使い方ドキュメント・エラーの `hint`)から、保守者向けの識別子と
13
+ 廃止済みのオプション名を取り除きました。
14
+
15
+ ### Changed
16
+
17
+ - **(破壊的)カスタム項目の宣言は `tenant(id, { fields })` で受け取るようになりました**([ADR-0087][adr87])。
18
+ `PortersClientOptions` から `fields` が無くなり、`PortersClient` / `PortersClientOptions` は
19
+ 型引数を取らなくなります。
20
+
21
+ カスタム項目(`U_` / `A_`)は **partition(Company DB)ごとのもの**です — 出典の各リソース記事が
22
+ 「テナント毎に異なる」としています。これまで宣言は client に 1 つしか持てず、項目構成の違う
23
+ テナントを同じ client で扱うと、**別テナントの宣言が黙って適用される**形でした(実物が Option の
24
+ 項目をテキストで読めば値が `null` になり、例外も警告も出ません)。partition を束ねる `tenant(id)` が、
25
+ その partition の項目の形も束ねます。
26
+
27
+ ```ts
28
+ // 変更前
29
+ const porters = new PortersClient({ hostname, appId, appSecret, fields });
30
+ const t = porters.tenant(123);
31
+
32
+ // 変更後
33
+ const porters = new PortersClient({ hostname, appId, appSecret });
34
+ const t = porters.tenant(123, { fields });
35
+ ```
36
+
37
+ - **移行は 1 対 1**です。コンストラクタの `fields` を `tenant()` の第 2 引数に移すだけで、
38
+ `t` 以降のコードは変わりません。`tenant(id)`(第 2 引数なし)はこれまでどおり標準項目だけです。
39
+ - **項目構成の違うテナント群を 1 つの client(1 つのトークン)で扱えます**。
40
+ `porters.tenant(1, { fields: a })` と `porters.tenant(2, { fields: b })` は、それぞれの宣言で
41
+ 読み書きします。client を分けるのは**トークンを分けたいとき**だけになりました。
42
+ - `A_` を App 共通、`U_` をテナント固有にしたい場合は、共通部分を関数にして各テナントの宣言に
43
+ spread します(ライブラリは `A_` と `U_` を区別しません)。書き方は
44
+ [カスタム項目ガイド][howto-custom-fields]にあります。
45
+ - **コンストラクタに `fields` が残っていると、構築時に `PortersConfigError`**(`category: "config"`)で
46
+ 止まります。`hint` が `tenant(id, { fields })` を指します。型でも弾きます(`fields` は `never`)。
47
+ 黙って無視すると宣言が丸ごと捨てられ、カスタム項目が型から消えたまま動いてしまうためです。
48
+ `fields: undefined` は未指定と同じ扱いです。
49
+ - 型を書くときは、`PortersClient<typeof fields>` / `PortersClientOptions<typeof fields>` が
50
+ **コンパイルエラー**になります。スコープを受ける関数は `TenantScope<typeof fields>`(これまでどおり)、
51
+ `tenant()` の引数を切り出すなら新設の `TenantOptions<typeof fields>` で書きます。
52
+ `ReturnType<typeof porters.tenant>` で受けていた関数は、`tenant` がジェネリックになったため
53
+ **広い型(`TenantScope<DeclaredCatalogs>`)**に落ち、カスタム項目が型から消えます(使う箇所で
54
+ コンパイルエラーになります)。`TenantScope<typeof fields>` に書き換えてください。
55
+ - `generateFieldDecls` / `verifyFields` / `readCustomCatalog` は変わりません(もともと `tenant(id)`
56
+ スコープを取ります)。
57
+
58
+ - **公開 API の JSDoc(IDE のホバーと API リファレンスに出る説明文)から、ADR 番号やレビュー指摘番号
59
+ などの保守者向けの識別子を取り除きました**。利用者には意味を持たない情報で、根拠は実装コメントへ
60
+ 移しています。型・メソッドの意味や挙動は変わりません(説明文だけの変更)。同じ識別子が
61
+ 生成物に戻らないよう、API リファレンスと配布する型定義(`dist/index.d.ts`)を検査するようにしました。
62
+
63
+ - **利用者向けドキュメント(`docs/usage/` と README)の本文からも、同じ識別子と設計文書へのリンクを
64
+ 取り除きました**。説明の内容は変わりません。文末の `(ADR-0059)` のような表記が消え、設計文書に
65
+ 委ねていた数か所は本文に書き足しています。PORTERS ヘルプセンターの再取得手順(保守者向け)は
66
+ `CONTRIBUTING.md` へ移しました。あわせて、リリース前に使い方ドキュメント全体を実装と突き合わせ、
67
+ 実装と食い違っていた記述(権限付与未実施のときのエラーの系統、`tenant(id, { fields })` 以前の
68
+ 「client を分ける」案内など)を直しています。
69
+
70
+ ### Fixed
71
+
72
+ - **PORTERS 以外が返した HTTP エラー(`category: "config"`)の `hint`** が、0.18.0 で廃止した
73
+ オプション名 `host` を案内していました。現在の `hostname` / `port` / `scheme` を指すように直しました。
74
+ 挙動は変わりません(説明文だけの変更)。
75
+
76
+ ## [0.20.1] - 2026-09-21
77
+
78
+ **定期レビュー(0.20.0 直後)で見つけた 1 件を塞いだ版**です。破壊的変更はありません。
79
+
80
+ ### Fixed
81
+
82
+ - **`decodeTimeOfDay` が時計の範囲にない時・分・秒を通さなくなりました**。基準日(`1970-01-01` /
83
+ `1970-01-02`)は見ていましたが、時・分・秒は 2 桁かどうかしか見ていなかったため、
84
+ `"1970-01-01T30:00:00Z"` を `"30:00"` として返し、それを `encodeTimeOfDay` に戻すと
85
+ `"1970-01-02T06:00:00Z"`=**入力と別の値**になっていました。[ADR-0086][adr86] が決めた
86
+ 「両方向とも検証する」の decode 側が欠けていた形です。
87
+
88
+ ```ts
89
+ decodeTimeOfDay("1970-01-01T30:00:00Z"); // PortersConfigError(以前は "30:00")
90
+ decodeTimeOfDay("1970-01-01T09:60:00Z"); // PortersConfigError(以前は "09:60")
91
+ decodeTimeOfDay("1970-01-02T02:00:00Z"); // "26:00"(変わらず)
92
+ ```
93
+
94
+ 時は各基準日で `00`〜`23`、分と秒は `00`〜`59`。それ以外は基準日違いと同じ `PortersConfigError`
95
+ (`category: "validation"`)で止まります。**Read で得た ISO をそのまま渡しているコードは無変更**です
96
+ (ライブラリの日時 decode がそもそも不正な時分を通さないため)。エラーになるのは、手で組み立てた
97
+ ISO を渡していた場合だけです。
98
+
99
+ ### Changed
100
+
101
+ - 内部の検査を 1 本増やしました(利用者への影響はありません)。CHANGELOG が名指しした設計 ADR に
102
+ 「世に出た版」が記入されているかをリリース時に見る検査で、0.8.0 以降の設計 ADR 21 本に版を
103
+ 記入し直しました。ADR 索引の「実装」列がふたたび事実と一致します。
104
+
8
105
  ## [0.20.0] - 2026-09-21
9
106
 
10
107
  **PORTERS ヘルプセンターを再取得して見つかった、追いついていなかった変更 2 つを埋めた版**です。
@@ -175,7 +272,7 @@ reference にも実装にも無く、**時分型**(2026/08・PORTERS 9.3.0)
175
272
 
176
273
  PORTERS が `resource=` を **URL パラメータで必須**に要求するエンドポイントは 3 つ(Field / Phase /
177
274
  Attachment)あるのに、受け口の形が 3 つとも違っていました。**パラメータのリソースは `of(name)` で
178
- 束ね、項目の値は宣言した Data Type どおり(数値)**という線を引き、3 本とも `of()` に揃えています。
275
+ 束ね、項目の値は宣言した Data Type どおり(数値)** という線を引き、3 本とも `of()` に揃えています。
179
276
 
180
277
  ### Added
181
278
 
@@ -861,7 +958,7 @@ Attachment)あるのに、受け口の形が 3 つとも違っていました
861
958
  **呼び出し側の書き味は変わりません**。
862
959
  - **App レベルのものは `porters` 側に残ります**(いずれも `partition` を取りません)—
863
960
  `porters.auth.*`(OAuth)と `porters.partition.search()`(partition の発見)。
864
- - 理由: `partition` 未設定のクライアントは**`partition=0`** を全リクエストに載せていました。
961
+ - 理由: `partition` 未設定のクライアントは **`partition=0`** を全リクエストに載せていました。
865
962
  `0` は PORTERS のドキュメントに存在しない値で、由来は最初の PoC の穴埋めです。実際には
866
963
  Result Code **404** を招くため、**設定漏れが「サーバーが 404 を返す」形に化け**ていました。
867
964
  `tenant(id)` を唯一の経路にすることで、**「partition を束ね忘れたクライアント」という状態が
@@ -1195,7 +1292,9 @@ Attachment)あるのに、受け口の形が 3 つとも違っていました
1195
1292
  [ref]: docs/usage/reference/README.md
1196
1293
  [kac]: https://keepachangelog.com/en/1.1.0/
1197
1294
  [semver]: https://semver.org/
1198
- [unreleased]: https://github.com/Joymerrevent/porters-connect/compare/v0.20.0...HEAD
1295
+ [unreleased]: https://github.com/Joymerrevent/porters-connect/compare/v0.21.0...HEAD
1296
+ [0.21.0]: https://github.com/Joymerrevent/porters-connect/compare/v0.20.1...v0.21.0
1297
+ [0.20.1]: https://github.com/Joymerrevent/porters-connect/compare/v0.20.0...v0.20.1
1199
1298
  [0.20.0]: https://github.com/Joymerrevent/porters-connect/compare/v0.19.1...v0.20.0
1200
1299
  [0.19.1]: https://github.com/Joymerrevent/porters-connect/compare/v0.19.0...v0.19.1
1201
1300
  [0.19.0]: https://github.com/Joymerrevent/porters-connect/compare/v0.18.0...v0.19.0
@@ -1230,4 +1329,6 @@ Attachment)あるのに、受け口の形が 3 つとも違っていました
1230
1329
  [gh5]: https://github.com/advisories/GHSA-7w5x-hrqm-74c2
1231
1330
  [fastcheck]: https://github.com/dubzzz/fast-check
1232
1331
  [adr86]: docs/adr/0086-time-of-day-fields.md
1332
+ [adr87]: docs/adr/0087-tenant-scoped-field-declarations.md
1333
+ [howto-custom-fields]: docs/usage/howto/custom-fields.md
1233
1334
  [ref-department]: docs/usage/reference/resource-api/resources/department.md
package/README.md CHANGED
@@ -21,7 +21,7 @@ XML レスポンスを型付きオブジェクトに変換し、独自仕様の
21
21
  - **独自 OAuth を透過**:`code_direct` によるトークン取得・キャッシュ・更新を自動化。
22
22
  - **上限内に自制する**:スロットリング・リトライ(指数バックオフ)・リクエストサイズガード内蔵。
23
23
  - **日時は ISO 8601(UTC)に正規化**。業務タイムゾーン変換はしません(利用側の責務)。
24
- - **PORTERS の全リソースに対応**:データ系 13 種 + Phase + マスタ Read 5 種。
24
+ - **PORTERS の全リソースに対応**:データ系 13 種(Phase・Attachment を含む)+ マスタ Read 5 種。
25
25
 
26
26
  ## 前提
27
27
 
@@ -123,7 +123,7 @@ console.log(page.total, page.items[0]?.P_Name);
123
123
 
124
124
  ## リンク
125
125
 
126
- **この README は「最短で動かす」ところまで**です。網羅は目次側が担当します([ADR-0070][adr70])。
126
+ **この README は「最短で動かす」ところまで**です。網羅は目次側が担当します<!-- 根拠: ADR-0070 -->。
127
127
 
128
128
  - 利用者向け:[docs/usage][docs-index](目次)/[公開 API の全記号][api-ref]/[PORTERS API の事実][ref]
129
129
  - 開発・保守:[docs/README.md][docs-readme](ADR・基本設計・ロードマップ・台帳への入口)
@@ -166,6 +166,5 @@ console.log(page.total, page.items[0]?.P_Name);
166
166
  [test-without-contract]: docs/usage/howto/test-without-contract.md
167
167
  [docs-index]: docs/usage/index.md
168
168
  [docs-resources]: docs/usage/index.md#リソースと操作
169
- [adr70]: ./docs/adr/0070-usage-documentation-architecture.md
170
169
  [docs-readme]: ./docs/README.md
171
170
  [ref]: docs/usage/reference/README.md