@joymerrevent/porters-connect 0.13.0 → 0.15.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,135 @@
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.15.0] - 2026-09-13
9
+
10
+ **宣言と実物のズレを黙って飲み込まなくなった版**です。**破壊的変更**(読み取りの型不一致が
11
+ `null` ではなくエラーになる)と、**既定の挙動変更**(スロットルの共有単位)を含みます。
12
+
13
+ ### Added
14
+
15
+ - **テナントの項目と宣言を突き合わせる 4 つの API**([ADR-0069][adr69])。いずれも opt-in で、
16
+ 呼ばなければ既存の挙動は変わりません(`field_r` スコープが必要です)。
17
+
18
+ ```ts
19
+ const report = await verifyFields(porters.tenant(1), myFields);
20
+ if (!report.ok) logger.warn({ report }, "宣言がテナントと合っていません");
21
+ ```
22
+
23
+ - `readCustomCatalog(tenant, resource)` — カスタム項目を「alias → Data Type」で返します
24
+ - `verifyFields(tenant, fields)` — 宣言と実物を 5 区分で突き合わせます(**投げません**)
25
+ - `assertFieldsMatch(report)` — 落としたい運用のための 1 行
26
+ - `generateFieldDecls(tenant, resources)` — `defineFields` の呼び出しをソース文字列で生成します
27
+
28
+ - **Field Read で Process の項目カタログを読めます**(RV-37)。`t.field.search({ resource: "process" })`
29
+ がこれまで型エラーで書けなかったのは、同じ事実の対応表が 2 つあり片方から抜けていたためで、
30
+ 判断ではなく書き落としでした。`ResourceType` に `"process"` が増える**拡張**です。
31
+
32
+ - **スロットルを差し替えられるようになりました**([ADR-0073][adr73])。`createThrottle` /
33
+ `Throttle` / `ThrottleOptions` / `PortersClientOptions.throttle` を公開しています。
34
+
35
+ ```ts
36
+ // バッチには控えめな枠を割り当てる
37
+ const porters = new PortersClient({
38
+ host,
39
+ appId,
40
+ appSecret,
41
+ throttle: createThrottle({ readPerMin: 500 }),
42
+ });
43
+ ```
44
+
45
+ `Throttle` は `take(write: boolean): Promise<void>` の 1 メソッドなので、Redis などに載せれば
46
+ **プロセスを跨いだ協調**も書けます。ライブラリはそこまでやりません(月次の累積管理と同じ線引き)。
47
+
48
+ - **公開 API の全記号のリファレンス**を `docs/usage/api/` に用意しました([ADR-0068][adr68])。
49
+ JSDoc から生成した 179 ページで、生成漏れは CI が落とします。パッケージの中身は変わりません。
50
+
51
+ ### Changed
52
+
53
+ - **(破壊的)宣言型と実データの形が食い違うと、`null` ではなくエラーになります**(RV-36)。
54
+ 実物が Option の項目を `f.singlelineText()` と宣言していた場合、これまでは読み取りが黙って
55
+ `null` を返し、「その項目は空だった」と区別が付きませんでした。いまは
56
+ `PortersResourceError`(`category: "validation"`)で**項目名つきに**失敗します。
57
+
58
+ 判定は**形の食い違いだけ**です(スカラが来るべき所に入れ子、またはその逆)。それより細かい違いは
59
+ 許容して `null` のままにしてあります — 弾くと偽の警報になるためです。
60
+ 宣言が正しいかを**事前に**確かめたいなら、上記の `verifyFields` を使ってください。
61
+
62
+ - **(挙動変更)スロットルがクライアントごとではなく、ホストごとの共有になりました**
63
+ ([ADR-0073][adr73]・RV-43)。1 分あたりの上限を自制するバケットはこれまで `PortersClient` ごとに
64
+ 作られており、**ガイドが勧めるとおりテナント別にクライアントを立てると、その数だけ上限が並んで**
65
+ いました。PORTERS から見えるのは合計なので、50 テナントなら上限の 50 倍まで出せた計算です。
66
+
67
+ 同じホストを向くクライアントは、同じバケットを通るようになりました。**以前より待つことがあります**
68
+ が、それが本来の上限です。共有から降りたいときは上記の `throttle` を渡してください。
69
+ ローカルのフェイクサーバーは別ホストなので、本番向けの枠を食いません。
70
+
71
+ - **日時の変換失敗が `PortersError` の系統になりました**(RV-36)。以前は素の `RangeError` が飛び、
72
+ ガイドが勧める `instanceof PortersError` の分岐から漏れていました。読み(応答が引き金)は
73
+ `PortersResourceError`、書き・`condition`(渡した値が引き金)は `PortersConfigError` で、
74
+ `category` はどちらも `validation` です。
75
+
76
+ ### 移行
77
+
78
+ - **型不一致でエラーが出るようになった場合、宣言かテナントのどちらかが実際に間違っています。**
79
+ `verifyFields` を起動時に 1 回呼べば、どの項目がどうズレているかが分かります。
80
+ - **スロットル**は設定変更不要です。同じホストへ複数クライアントを立てていた場合のみ、
81
+ スループットが上限内に収まります(それが正しい状態です)。
82
+
83
+ ## [0.14.0] - 2026-09-09
84
+
85
+ **PORTERS の Data Type 17 種すべてを型で表せるようになった版**です([ADR-0060][adr60] の完了条件 D3)。
86
+ 破壊的変更はありません。追加された `Link` / `Image` は**標準項目に 1 つも存在せず**、テナントが作った
87
+ カスタム項目としてのみ現れるため、恩恵を受けるのは当該項目を持つテナントだけです。
88
+
89
+ ### Added
90
+
91
+ - **`Image`(画像)と `Link` の 2 型に対応しました**([ADR-0064][adr64])。どちらも `defineFields` の
92
+ 宣言が唯一の入口です(標準項目に存在しないため、宣言しない限り型にも読み取り結果にも現れません)。
93
+
94
+ ```ts
95
+ const fields = defineFields({
96
+ resume: (f) => ({ U_photo: f.image(), U_contact: f.link() }),
97
+ });
98
+ ```
99
+
100
+ - **`image` クエリ**で、Image 項目の `ContentType` / `Content`(Base64 本体)を読めます。
101
+ **既定は `FileName` のみ**(PORTERS 自身の既定)なので、一覧取得が画像本体で重くなりません。
102
+ 選んだサブタグだけが戻り型に出ます。
103
+
104
+ ```ts
105
+ const r = await t.resume.get(id, {
106
+ image: { U_photo: ["FileName", "Content"] },
107
+ });
108
+ r?.U_photo; // { FileName: string | null; Content: string | null }
109
+ ```
110
+
111
+ - **Image の書き込みに対応しました**。約 15000 文字のリクエスト長ガードは画像を含む書き込みでだけ外し、
112
+ かわりに **decode 後 2MB / ファイル名 255 バイト / mime 4 種(jpeg・gif・png・bmp)** を
113
+ **送信前に**検査して `PortersConfigError` で弾きます。
114
+
115
+ - **`Link` は読み取り時に 3 つの形の union** になります(Contact の ID=`number` / `UserRef` /
116
+ `DepartmentRef`)。PORTERS が種別の判別子を返さないため、**届いた XML の形**で判別します。
117
+ 書き込みは ID のみです。
118
+
119
+ ```ts
120
+ const link = r?.U_contact;
121
+ if (typeof link === "number") {
122
+ // Contact の ID。名前などは Contact API で別途取得します
123
+ } else if (link && "P_Mail" in link) {
124
+ // ユーザー型(UserRef)
125
+ }
126
+ ```
127
+
128
+ ### Changed
129
+
130
+ - **一括書き込み(`createMany` / `updateMany`)は画像を受け付けません**。一括は「1 リクエスト
131
+ 約 15000 文字」を前提に 200 件ずつへ分割しており、画像はその前提を壊すためです。何件目が画像を
132
+ 持つかを添えて**送信前に** `PortersConfigError` で落とし、単発の `create` / `update` へ誘導します。
133
+
134
+ - `Image` / `Link` は `condition` / `order` に指定できません(Image は reference が明記、
135
+ Link は記載が無いため安全側に倒しています)。指定すると**コンパイルエラー**になります。
136
+
8
137
  ## [0.13.0] - 2026-09-06
9
138
 
10
139
  **User マスタが PORTERS の全 17 項目を返すようになった版**です。破壊的変更はありませんが、
@@ -484,7 +613,7 @@
484
613
  - `exchangeAuthorizationCode(code)` — redirect の `?code=` をトークンに交換し内部保存(成功時 `void`・失敗時 throw)。
485
614
  - `clearTokens()` — ローカルの cache + トークンストアを破棄。
486
615
  - `ensureAuthenticated()` / `getToken()` — トークンのウォームアップ/取得(Refresh Token は返さない)。カスタム auth ストラテジでも動作。
487
- - カスタムストラテジ下では credential 依存メソッドが `PortersConfigError`。新規 export 型 `AuthApi` / `AuthorizationUrlOptions` / `RevokeUrlOptions`。利用手順は [docs/guide/oauth.md][oauth-guide]。
616
+ - カスタムストラテジ下では credential 依存メソッドが `PortersConfigError`。新規 export 型 `AuthApi` / `AuthorizationUrlOptions` / `RevokeUrlOptions`。利用手順は [docs/howto/authenticate.md][oauth-guide]。
488
617
 
489
618
  ### Fixed
490
619
 
@@ -544,10 +673,10 @@
544
673
  - **日時**: ISO 8601(UTC)⇄ PORTERS 形式の正規化(業務タイムゾーン変換はしない)。
545
674
  - **動的カスタム項目**: `defineFields` でテナント固有の `U_` / `A_` を宣言し、型安全に read / write(ADR-0023)。
546
675
  - **評価用サンドボックス**: 公開モック `createMockTransport` で契約なし・オフライン動作(ADR-0024)。
547
- - **エラー対処ガイド**: [docs/guide/error-handling.md][guide](症状別早見表+2 系統のコード対応表)。
676
+ - **エラー対処ガイド**: [docs/howto/handle-failures.md][guide](症状別早見表+2 系統のコード対応表)。
548
677
  - **配布**: ESM / Node.js 18+ / 型定義同梱 / MIT。`X-P-ConnectAPI-Version: 2` を既定送信(PORTERS 8.x・9.x 想定)。
549
678
 
550
- [guide]: docs/guide/error-handling.md
679
+ [guide]: docs/usage/howto/handle-failures.md
551
680
  [adr44]: docs/adr/0044-http-status-handling.md
552
681
  [adr45]: docs/adr/0045-write-response-root-code.md
553
682
  [adr46]: docs/adr/0046-guard-error-contract.md
@@ -556,27 +685,33 @@
556
685
  [adr50]: docs/adr/0050-auth-http-status-handling.md
557
686
  [adr51]: docs/adr/0051-read-envelope-identification.md
558
687
  [adr47]: docs/adr/0047-access-point-scheme.md
559
- [oauth-guide]: docs/guide/oauth.md
688
+ [oauth-guide]: docs/usage/howto/authenticate.md
560
689
  [adr19]: docs/adr/0019-static-resource-types.md
561
690
  [adr20]: docs/adr/0020-read-field-default.md
562
691
  [adr35]: docs/adr/0035-usage-documentation-structure.md
563
- [custom-fields-guide]: docs/guide/custom-fields.md
564
- [read-query-guide]: docs/guide/read-query.md
692
+ [custom-fields-guide]: docs/usage/howto/custom-fields.md
693
+ [read-query-guide]: docs/usage/howto/search-records.md
565
694
  [adr55]: docs/adr/0055-partition-binding-guard.md
566
695
  [adr56]: docs/adr/0056-deleted-flag-typing.md
567
696
  [adr57]: docs/adr/0057-itemstate-existing-explicit.md
568
697
  [adr58]: docs/adr/0058-reference-expansion-read.md
569
698
  [adr59]: docs/adr/0059-read-field-bare-alias.md
570
699
  [adr60]: docs/adr/0060-full-resource-coverage-direction.md
700
+ [adr64]: docs/adr/0064-link-image-types.md
571
701
  [adr61]: docs/adr/0061-phase-resource-surface.md
572
702
  [adr63]: docs/adr/0063-idempotency-guard-scope.md
573
703
  [rv22]: docs/reviews/rv/0022-ratelimit-create-no-retry.md
574
704
  [rv32]: docs/reviews/rv/0032-searchall-query-mutation.md
575
- [write-constraints]: docs/guide/write-constraints.md
705
+ [write-constraints]: docs/usage/concepts/limits.md
706
+ [adr68]: docs/adr/0068-api-reference-tooling.md
707
+ [adr69]: docs/adr/0069-tenant-field-catalog-tooling.md
708
+ [adr73]: docs/adr/0073-throttle-sharing.md
576
709
  [lv]: docs/live-verification.md
577
710
  [kac]: https://keepachangelog.com/en/1.1.0/
578
711
  [semver]: https://semver.org/
579
- [unreleased]: https://github.com/Joymerrevent/porters-connect/compare/v0.12.1...HEAD
712
+ [unreleased]: https://github.com/Joymerrevent/porters-connect/compare/v0.14.0...HEAD
713
+ [0.15.0]: https://github.com/Joymerrevent/porters-connect/compare/v0.14.0...v0.15.0
714
+ [0.14.0]: https://github.com/Joymerrevent/porters-connect/compare/v0.13.0...v0.14.0
580
715
  [0.13.0]: https://github.com/Joymerrevent/porters-connect/compare/v0.12.1...v0.13.0
581
716
  [0.12.1]: https://github.com/Joymerrevent/porters-connect/compare/v0.12.0...v0.12.1
582
717
  [0.12.0]: https://github.com/Joymerrevent/porters-connect/compare/v0.11.0...v0.12.0