@aiquants/auth-react-router 0.15.0 → 0.16.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/dist/admin.d.ts CHANGED
@@ -1,33 +1,13 @@
1
- import * as react_router from 'react-router';
2
- import { AuthUser, AuthGroup, AuthGroupMember, AuthAllowlistEntry, AuthDirectoryMembershipMode, AuthDirectoryStatus, AuthDirectoryCatalogSnapshot, AuthDirectoryCatalogGroup } from '@aiquants/auth-core';
3
- import React__default from 'react';
4
-
5
- /**
6
- * Labels and i18n strings for the user administration UI.
7
- * ユーザー管理 UI で使用するラベルと i18n 文字列の定義。
8
- *
9
- * パッケージ既定は **英語** ([defaultUserAdminLabels])。日本語で使う場合はアプリ側が
10
- * [jaUserAdminLabels] を明示的に注入する (認可管理 `@aiquants/authz-react-router` と同じ規約)。
11
- * UI 文字列はすべて本モジュールに集約し、コンポーネント側へ直書きしないこと — 直書きすると
12
- * 日本語以外の利用者がその箇所を差し替えられなくなる。
13
- */
1
+ import { VirtualScrollLocale } from "@aiquants/virtualscroll";
2
+ import * as react_router from "react-router";
3
+ import { AuthUser, AuthGroup, AuthGroupMember, AuthAllowlistEntry, AuthDirectoryMembershipMode, AuthDirectoryStatus, AuthDirectoryCatalogSnapshot, AuthDirectoryCatalogGroup } from "@aiquants/auth-core";
4
+ import React__default from "react";
5
+ type UserAdminLocale = VirtualScrollLocale;
14
6
  type UserAdminLabels = {
15
7
  title: string;
16
- /**
17
- * BCP 47 locale used to format dates. 日付整形に使う BCP 47 ロケール。
18
- *
19
- * 実行環境任せにするとサーバーとブラウザで別の文字列になり、水和が壊れる。
20
- */
21
- locale: string;
22
- /** IANA time zone used to format dates. 日付整形に使う IANA タイムゾーン。 */
8
+ locale: UserAdminLocale;
9
+ formatLocale: string;
23
10
  timeZone: string;
24
- /**
25
- * Strings shared by more than one view. 複数のビューが共有する文言。
26
- *
27
- * ビューごとに同じ語を持たせると、ある画面の「削除」だけを言い換えることが **できなく
28
- * なる** (実装がどのビューのキーを読んでいるかは呼び出し側から見えない)。共有する語は
29
- * ここ 1 か所に置く。
30
- */
31
11
  common: {
32
12
  create: string;
33
13
  edit: string;
@@ -37,70 +17,30 @@ type UserAdminLabels = {
37
17
  actions: string;
38
18
  status: string;
39
19
  id: string;
40
- /** 変更不能な供給元 (環境変数など) 由来の行に出す表示。 */
41
20
  readOnly: string;
42
- /** 上流所有のグループに出す編集不可の表示。 */
43
21
  managedUpstream: string;
44
- /** `#{id}` の表示。記号の位置は言語で変わる。 */
45
22
  idTemplate: string;
46
- /** 値が無いことの表示 (説明欄など)。 */
47
23
  none: string;
48
24
  };
49
- /** アクションが拒否・失敗したときの文言。 */
50
25
  errors: {
51
- /** 一覧に無い上流キーを指定した。`{key}` に受け取った値。 */
52
26
  unknownUpstream: string;
53
- /** その上流グループは既に別のローカルグループへ連携している。`{key}` / `{group}`。 */
54
27
  alreadyLinked: string;
55
- /** ディレクトリ未設定の配備で連携を求められたときの説明。 */
56
28
  directoryDisabled: string;
57
- /** 必須欄が欠けている、または読めない値だったことの説明。 */
58
29
  invalidField: string;
59
- /**
60
- * Shown for an intent this screen does not perform. この画面が行わない intent への文言。
61
- *
62
- * ⚠️ 受け取った値を含めない。認可より手前で返るため、認証を通っていない相手にも届く。
63
- */
64
30
  unknownIntent: string;
65
- /**
66
- * Operator-facing names for the form fields. 欄の、操作者に見える名前。
67
- *
68
- * ⚠️ `invalidField` の `{field}` に **通信上のキー** を差し込まない。日本語の文の中に
69
- * `membershipMode` のような識別子が現れ、画面のどの欄を指すのか操作者には判らない。
70
- * 表に無い欄はキーのまま出す (出さないより、判りにくくても出すほうがよい)。
71
- */
72
31
  fieldNames: Record<string, string>;
73
- /** 許可リストの種別が既定の 2 値でなかったことの説明。 */
74
32
  invalidAllowlistType: string;
75
- /** 想定外の失敗 (原文はサーバーのログにだけ残す)。 */
76
33
  unexpected: string;
77
- /**
78
- * Shown when the actor lacks permission for the attempted operation.
79
- * 操作の権限が無いときに出す文言。
80
- *
81
- * ガードの例外メッセージをそのまま返してはならない。テナント ID・アプリキー・
82
- * 拒否理由といった内部の語彙が、権限を持たない相手にそのまま渡る。
83
- */
84
34
  forbidden: string;
85
- /**
86
- * Shown when the request body exceeds the ceiling. 本文が上限を越えたときの文言。
87
- *
88
- * この画面が送るのは短い文字列だけなので、越えるのは誤操作か攻撃である。どちらにも
89
- * 同じ文言を返す (どこで弾かれたかを細かく教えない)。
90
- */
91
35
  requestTooLarge: string;
92
36
  };
93
- /** シェル (タブ枠) の見出し。 */
94
37
  heading: string;
95
- /** シェルが描く自己権限バッジの文言。 */
96
38
  permissions: {
97
39
  label: string;
98
40
  canWrite: string;
99
41
  canRead: string;
100
- /** 削除だけを持つ主体の表示 (読み書きが無いことを「権限なし」と描かない)。 */
101
42
  canDelete: string;
102
43
  none: string;
103
- /** 未結線・取得失敗・付与ゼロのいずれも「不明」であり、許可ではない。 */
104
44
  unknown: string;
105
45
  };
106
46
  tabs: {
@@ -112,10 +52,8 @@ type UserAdminLabels = {
112
52
  };
113
53
  usersView: {
114
54
  title: string;
115
- /** 並べ替えの読み上げ名。`{column}` は列名。 */
116
55
  sortBy: string;
117
56
  searchPlaceholder: string;
118
- /** 検索欄の読み上げ名。プレースホルダは入力すると消えるため名前にならない。 */
119
57
  searchLabel: string;
120
58
  addUser: string;
121
59
  editUser: string;
@@ -125,58 +63,33 @@ type UserAdminLabels = {
125
63
  inactive: string;
126
64
  activate: string;
127
65
  deactivate: string;
128
- /** 行ごとの読み上げ名。`{user}` を利用者名へ置換する。 */
129
66
  editUserAria: string;
130
67
  activateAria: string;
131
68
  deactivateAria: string;
132
- /** 無効化はサインインを止める。確認を取る。 */
133
- /** 検索で 0 件になったときの文言 (「登録が無い」と区別する)。 */
134
69
  emptyFiltered: string;
135
- /** 一覧の絞り込み結果を読み上げるための文言。 */
136
70
  listSummary: string;
137
- /** 昇順で並べ替え中の列の読み上げ名。 */
138
71
  sortedAscending: string;
139
- /** 降順で並べ替え中の列の読み上げ名。 */
140
72
  sortedDescending: string;
141
73
  confirmDeactivate: string;
142
74
  empty: string;
143
75
  };
144
76
  groupsView: {
145
- /** 検索語に一致しないときの説明。空状態と混ぜると「消えた」と誤読される。 */
146
77
  emptyFiltered: string;
147
- /** 作成方法の切替。ローカルに作るか、上流のグループから作るか。 */
148
- /** 作成方法を選ぶ操作群の読み上げ名。 */
149
78
  createModeLabel: string;
150
79
  createModeLocal: string;
151
80
  createModeUpstream: string;
152
- /** 上流グループを選ぶ欄。 */
153
81
  pickUpstream: string;
154
82
  pickUpstreamPlaceholder: string;
155
- /** 選択肢 1 件の副題。`{count}` はメンバー数。 */
156
83
  upstreamOptionMembers: string;
157
- /** すでに連携済みの選択肢に付ける表示。 */
158
84
  upstreamAlreadyLinked: string;
159
- /** 候補一覧が引けなかったときの説明。`{reason}` に理由。 */
160
- /** 候補は引けたが、この配備の連携プロバイダ名が決まっていないことの説明。 */
161
85
  providerUnset: string;
162
- /** 候補を選ぶまで作成できないことの説明 (押せないボタンの理由)。 */
163
86
  pickUpstreamFirst: string;
164
- /**
165
- * Shown when every upstream group is already linked. 上流のすべてが連携済みのときの文言。
166
- *
167
- * ⚠️ この場面で「先に選べ」と言ってはならない。従いようのない指示になる。
168
- */
169
87
  allUpstreamLinked: string;
170
- /** 上流を読めたが 1 件も無かったことの説明。 */
171
88
  catalogEmpty: string;
172
89
  catalogUnavailable: string;
173
- /** 上流へ届かないときの案内 (作成対話向け — この対話にアドレス欄は無い)。 */
174
90
  catalogUnavailableHere: string;
175
- /** 候補一覧をいつ観測したか。 */
176
91
  catalogObservedAt: string;
177
- /** 観測が配備の許す鮮度を越えている旨。 */
178
92
  catalogStale: string;
179
- /** 候補一覧を引けなかった理由の文言 (上流の例外文は使わない)。 */
180
93
  catalogFailures: {
181
94
  denied: string;
182
95
  rateLimited: string;
@@ -184,9 +97,7 @@ type UserAdminLabels = {
184
97
  neverObserved: string;
185
98
  unknown: string;
186
99
  };
187
- /** 上流から作る場合の説明 (何が起きるかを先に伝える)。 */
188
100
  createUpstreamNotice: string;
189
- /** グループのメンバー面へ移動する操作。 */
190
101
  openMembers: string;
191
102
  openMembersAria: string;
192
103
  title: string;
@@ -197,12 +108,9 @@ type UserAdminLabels = {
197
108
  groupKey: string;
198
109
  name: string;
199
110
  description: string;
200
- /** 所属人数。`{count}` を人数へ置換する。 */
201
111
  memberCountTemplate: string;
202
112
  confirmDelete: string;
203
- /** 連携付きで作る前の確認。`{group}` / `{upstream}`。委譲は元に戻しづらい。 */
204
113
  confirmCreateLinked: string;
205
- /** 行ごとの読み上げ名。`{group}` をグループ名へ置換する。 */
206
114
  editGroupAria: string;
207
115
  deleteGroupAria: string;
208
116
  noDescription: string;
@@ -212,33 +120,22 @@ type UserAdminLabels = {
212
120
  };
213
121
  groupMembersView: {
214
122
  title: string;
215
- /** 利用者の絞り込み。数百人の一覧を目で追わせない。 */
216
123
  searchLabel: string;
217
124
  searchPlaceholder: string;
218
- /** 所属している人だけに絞る切替。`{count}` は該当数。 */
219
125
  onlyMembers: string;
220
- /** 絞り込み結果が空のときの説明。 */
221
126
  emptyFiltered: string;
222
- /** 一覧の要約。`{shown}` / `{total}` / `{members}`。 */
223
127
  summary: string;
224
128
  selectGroup: string;
225
129
  selectPrompt: string;
226
- /** グループが 1 つも無い配備での説明 (「選べ」は従えない指示になる)。 */
227
130
  noGroups: string;
228
- /** 所属だけに絞った結果 0 件になったときの説明。 */
229
131
  emptyNoMembers: string;
230
- /** 利用者が 1 人も登録されていない配備での説明。 */
231
132
  noUsers: string;
232
- /** 深いリンクが指すグループが見つからず、代替を出していることの説明。 */
233
133
  deepLinkMissed: string;
234
134
  actionAdd: string;
235
135
  actionRemove: string;
236
- /** 行ごとの読み上げ名。`{user}` を利用者名へ置換する。 */
237
136
  actionAddAria: string;
238
137
  actionRemoveAria: string;
239
- /** 上流所有グループで編集を出さない理由。押せない理由を書かないと故障に見える。 */
240
138
  upstreamNotice: string;
241
- /** 見出し。`{group}` をグループ名へ置換する。語順が言語で変わるため位置指定にする。 */
242
139
  membersOfTemplate: string;
243
140
  groupKeyLabel: string;
244
141
  };
@@ -249,19 +146,13 @@ type UserAdminLabels = {
249
146
  type: string;
250
147
  emailType: string;
251
148
  domainType: string;
252
- /** 一覧のバッジ表示 (短縮形)。 */
253
149
  emailTypeShort: string;
254
150
  domainTypeShort: string;
255
- /** グループ単位の許可。上流ディレクトリの所属で判定される。 */
256
151
  groupTypeShort: string;
257
- /** 対象列の見出し。パターンとグループが混在するため「パターン」ではない。 */
258
152
  target: string;
259
153
  description: string;
260
- /** 配備全体が所有する行 (環境変数由来) の所有者表示。 */
261
154
  deploymentOwner: string;
262
- /** 許可の取り消しはサインインを止める。確認を取る。 */
263
155
  confirmDelete: string;
264
- /** 行ごとの読み上げ名。`{target}` を対象へ置換する。 */
265
156
  deleteAria: string;
266
157
  empty: string;
267
158
  };
@@ -272,38 +163,24 @@ type UserAdminLabels = {
272
163
  transitiveMode: string;
273
164
  lastSynced: string;
274
165
  neverSynced: string;
275
- /** 上流に居るがローカルユーザーへ解決できていない人数。`{count}` を人数へ置換する。 */
276
166
  unresolvedTemplate: string;
277
167
  syncPaused: string;
278
168
  syncEnabled: string;
279
169
  syncNow: string;
280
170
  syncQueued: string;
281
- /** 同じ範囲の要求が既に待っていて、積まれなかったことの説明。 */
282
171
  syncAlreadyPending: string;
283
- /** 連携は作れたが、その直後の同期要求を積めなかったときの告知。 */
284
172
  linkSyncNotQueued: string;
285
- /** 同期が滞っていることの警告。停止はセキュリティ事象である。 */
286
173
  staleWarning: string;
287
174
  disabledWarning: string;
288
- /** 停止件数。`{paused}` / `{total}` を件数へ置換する。 */
289
175
  pausedTemplate: string;
290
- /** 失敗したグループの列挙。`{groups}` を名前の並びへ置換する。 */
291
176
  erroredTemplate: string;
292
- /** 失敗理由付きの 1 件。`{group}` / `{reason}`。 */
293
177
  erroredItemTemplate: string;
294
- /** 列挙の区切り。言語で変わる。 */
295
178
  listSeparator: string;
296
- /** 滞留警告に添える最終成功時刻。`{at}`。 */
297
179
  oldestSyncedTemplate: string;
298
- /** 未処理の同期要求。`{count}`。 */
299
180
  pendingTemplate: string;
300
- /** 連携先が 1 つも残っていないときの説明。 */
301
181
  nothingToLink: string;
302
- /** グループが 1 つも無い配備での説明 (「全部が連携済み」と区別する)。 */
303
182
  noGroupsToLink: string;
304
- /** 未結線の配備で操作を出さない理由。 */
305
183
  notWiredNotice: string;
306
- /** 行ごとの読み上げ名。`{group}` をグループ名へ置換する。 */
307
184
  syncNowAria: string;
308
185
  syncQueuedAria: string;
309
186
  pauseAria: string;
@@ -311,54 +188,34 @@ type UserAdminLabels = {
311
188
  allowGroupAria: string;
312
189
  disallowGroupAria: string;
313
190
  unlinkAria: string;
314
- /** グループ単位のサインイン許可を外す確認。 */
315
191
  confirmDisallow: string;
316
192
  link: string;
317
193
  unlink: string;
318
194
  externalKey: string;
319
195
  empty: string;
320
- /** 連携するグループを選ぶ欄。 */
321
196
  selectGroup: string;
322
- /** 選択欄が自前で持つ文言。渡さないと英語のまま出る。 */
323
- /** 選択欄の入力の手引き。 */
324
197
  pickUpstreamPlaceholder: string;
325
198
  pickerNoOptions: string;
326
199
  pickerClear: string;
327
200
  pickerToggle: string;
328
- /** 選択中の値の読み上げ。`{value}`。 */
329
201
  pickerSelected: string;
330
- /** 候補件数の読み上げ。`{count}`。 */
331
202
  pickerAvailable: string;
332
- /** 上流グループのアドレス入力。 */
333
203
  externalKeyPlaceholder: string;
334
- /** 連携解除の確認。台帳と許可設定が消える。 */
335
- /** 連携を作る前の確認 (元へ戻すには連携解除という別の操作が要る)。 */
336
204
  confirmLink: string;
337
205
  confirmUnlink: string;
338
- /** 同期の一時停止・再開。 */
339
206
  pause: string;
340
207
  resume: string;
341
- /** 許可グループに加える / 外す。 */
342
208
  allowGroup: string;
343
209
  disallowGroup: string;
344
- /** グループ名と鍵の併記。`{name}` / `{key}`。 */
345
210
  groupOptionTemplate: string;
346
211
  };
347
212
  };
348
- /**
349
- * Package default labels (English).
350
- * パッケージ既定ラベル (英語)。
351
- */
352
213
  declare const defaultUserAdminLabels: UserAdminLabels;
353
- /**
354
- * Standard Japanese labels for user administration (opt-in).
355
- * ユーザー管理の標準日本語ラベル (アプリ側で明示注入して使う)。
356
- */
357
214
  declare const jaUserAdminLabels: UserAdminLabels;
358
- /** セクション単位の部分上書き。 */
359
215
  type PartialUserAdminLabels = {
360
216
  title?: string;
361
- locale?: string;
217
+ locale?: UserAdminLocale;
218
+ formatLocale?: string;
362
219
  timeZone?: string;
363
220
  common?: Partial<UserAdminLabels["common"]>;
364
221
  errors?: Partial<UserAdminLabels["errors"]>;
@@ -371,16 +228,7 @@ type PartialUserAdminLabels = {
371
228
  allowlistView?: Partial<UserAdminLabels["allowlistView"]>;
372
229
  directoryView?: Partial<UserAdminLabels["directoryView"]>;
373
230
  };
374
- /**
375
- * Shallow per-section merge over the English defaults.
376
- * 英語既定に対してセクション単位で浅くマージする処理。
377
- */
378
231
  declare function resolveUserAdminLabels(over?: PartialUserAdminLabels): UserAdminLabels;
379
-
380
- /**
381
- * Server store interface for managing users, groups, memberships, and allowlists.
382
- * ユーザー・グループ・所属・アロワリストを管理するサーバー層ストアのインターフェース。
383
- */
384
232
  type UserAdminStore = {
385
233
  listUsers: () => Promise<AuthUser[]>;
386
234
  createUser: (data: {
@@ -413,35 +261,14 @@ type UserAdminStore = {
413
261
  description?: string;
414
262
  }) => Promise<AuthAllowlistEntry>;
415
263
  removeAllowlistEntry: (id: number) => Promise<void>;
416
- /**
417
- * Allows every member of an externally-sourced group to sign in.
418
- * 外部供給グループのメンバー全員にサインインを許可する処理。
419
- *
420
- * 判定は上流メンバー台帳を読むため、ローカル管理のグループを渡しても誰にも何も与えない。
421
- * ストアはそれを拒否すること (無言の no-op を作らない)。
422
- */
423
264
  addAllowlistGroup: (groupId: number, description?: string) => Promise<void>;
424
265
  removeAllowlistGroup: (id: number) => Promise<void>;
425
- /**
426
- * Links a local group to a group in the upstream directory.
427
- * ローカルグループを上流ディレクトリのグループへ結び付ける処理。
428
- *
429
- * リンク後、そのグループの名称と所属は上流が所有する。ロール割当はローカルのままである。
430
- */
431
266
  linkDirectoryGroup: (groupId: number, data: {
432
267
  provider: string;
433
268
  externalId: string;
434
269
  externalKey: string;
435
270
  membershipMode: AuthDirectoryMembershipMode;
436
271
  }) => Promise<void>;
437
- /**
438
- * Creates a local group and links it to an upstream group as one indivisible step.
439
- * ローカルグループの作成と上流への連携を、分割不可能な 1 手として行う処理。
440
- *
441
- * ⚠️ **途中で失敗したら何も残してはならない。** 作成だけが成功すると、運用者には「連携に
442
- * 失敗した」ではなく「知らないグループが増えた」と見える。実装は 1 つのトランザクションで
443
- * 行うこと (作成 → 連携の順に別々の書込を並べると、この不可分性は成立しない)。
444
- */
445
272
  createLinkedGroup: (data: {
446
273
  groupKey: string;
447
274
  name: string;
@@ -451,161 +278,45 @@ type UserAdminStore = {
451
278
  externalKey: string;
452
279
  membershipMode: AuthDirectoryMembershipMode;
453
280
  }) => Promise<AuthGroup>;
454
- /** Stops following the upstream, keeping the memberships already projected. 連携の解除。 */
455
281
  unlinkDirectoryGroup: (groupId: number) => Promise<void>;
456
- /** Pauses or resumes synchronization for one group. 1 グループの同期を停止・再開する処理。 */
457
282
  setDirectorySyncEnabled: (groupId: number, isSyncEnabled: boolean) => Promise<void>;
458
- /**
459
- * Queues a "sync now" request. 「今すぐ同期」の要求を積む処理。
460
- *
461
- * ⚠️ 戻り値を `void` にしてはならない。同じ範囲の要求が既に待っているとき、積み増さないのは
462
- * 正しい (押した数だけ上流への全件走査が並ぶ) が、それを成功と区別せずに返すと、押しても
463
- * 反応しない画面ができる — しかも詰まった 1 行が以後の押下すべてを飲み込む。
464
- *
465
- * @param groupId Target group, or `null` for the whole tenant. 対象グループ (`null` でテナント全件)。
466
- * @param actor Who asked, for the audit record. 要求した主体 (監査記録用)。
467
- * @returns Whether it was queued or already waiting. 積んだか、既に待っていたか。
468
- */
469
283
  requestDirectorySync: (groupId: number | null, actor: string) => Promise<UserAdminSyncRequestOutcome>;
470
- /** Health of the synchronization, for the header warning. 同期の健全性 (警告表示用)。 */
471
284
  getDirectoryStatus: () => Promise<AuthDirectoryStatus>;
472
285
  };
473
- /**
474
- * Creates an in-memory UserAdminStore initialized with optional seed data.
475
- * シードデータで初期化されるメモリ上の UserAdminStore を作成する。
476
- */
477
286
  declare function createInMemoryUserAdminStore(initial?: {
478
287
  users?: AuthUser[];
479
288
  groups?: AuthGroup[];
480
289
  groupMembers?: AuthGroupMember[];
481
290
  allowlist?: AuthAllowlistEntry[];
482
291
  }): UserAdminStore;
483
- /**
484
- * Normalizes an upstream key for comparison. 上流キーを比較用に正規化する処理。
485
- *
486
- * 前後の空白と大文字小文字を同一視する。**画面と実装で正規化がずれると**、選択欄は「未連携」と
487
- * 見なすキーをサーバーが「連携済み」と見なす、といった食い違いが生まれる。1 か所に置く。
488
- *
489
- * @param key Raw upstream key. 生の上流キー。
490
- * @returns The comparable form. 比較可能な形。
491
- */
492
292
  declare function normalizeUpstreamKey(key: string): string;
493
- /**
494
- * An error whose own text is meant for the operator to read.
495
- * 文面を **運用者に読ませるつもりで** 投げるエラー。
496
- *
497
- * ⚠️ ストアの例外文をそのまま画面へ返してはならない。ドライバの例外はスキーマ名・表名・制約名・
498
- * 衝突した値・接続先をそのまま含み、それが閲覧権限しか持たない主体の画面に出る。一方で
499
- * 「最後の管理者は外せません」のような業務上の拒否理由は、読めなければ操作そのものが行き詰まる。
500
- * 両者は文面からは区別できないので、**投げる側が宣言する**。宣言の無い例外は一般的な文言になる。
501
- *
502
- * ホストのストアは、この class を継承しても `operatorFacing: true` を持たせてもよい
503
- * (別パッケージのエラー型を継承できない事情に配慮した二経路である)。
504
- */
505
293
  declare class UserAdminOperatorError extends Error {
506
- /** 運用者向けであることの印。継承できない場合はこの属性だけでもよい。 */
507
294
  readonly operatorFacing = true;
508
295
  constructor(message: string);
509
296
  }
510
- /**
511
- * An input problem the operator can fix, carrying a label key instead of a sentence.
512
- * 運用者が直せる入力の問題。文ではなく **ラベルのキー** を運ぶ。
513
- *
514
- * ⚠️ メッセージを実装側で組むと、既定 (英語) の配備に日本語が出る。文言はラベルに集約し、
515
- * ここでは「どの文言か」と差し替え値だけを運ぶ。
516
- */
517
297
  declare class UserAdminInputError extends Error {
518
298
  readonly labelKey: keyof UserAdminLabels["errors"];
519
299
  readonly values: Record<string, string | number>;
520
300
  constructor(labelKey: keyof UserAdminLabels["errors"], values?: Record<string, string | number>);
521
301
  }
522
- /**
523
- * The only route-args field this module reads. React Router's full `LoaderFunctionArgs` satisfies it, so
524
- * route wiring is unchanged — but declaring the minimum keeps callers (and tests) from fabricating fields
525
- * that are never looked at.
526
- * このモジュールが実際に読むルート引数の全て。React Router の完全な引数はこれを満たすため結線は不変。
527
- */
528
302
  type RouteArgs = {
529
303
  request: Request;
530
304
  };
531
- /**
532
- * The CRUD verb an operation performs. Deliberately a plain string union so this package stays
533
- * independent of any particular authorization library.
534
- * 操作が行う CRUD 種別。特定の認可ライブラリに依存しないよう素の文字列 union で表現する。
535
- */
536
305
  type UserAdminAccess = "read" | "create" | "update" | "delete";
537
- /**
538
- * Access guard the user-admin surface is mounted behind. Deny by throwing
539
- * (a `Response`/`redirect` or an `Error`); returning normally means "allow".
540
- *
541
- * ユーザー管理面をマウントする際の必須アクセスガード。拒否は throw で表現する
542
- * (`Response` / `redirect` / `Error`)。正常 return は「許可」を意味する。
543
- *
544
- * 操作ごとの CRUD 種別を受け取るため、呼び出し側は「削除だけ別権限」といった細分化ができる。
545
- * `intent` は監査ログ用の補助情報(認可判断は `action` で行うこと)。
546
- */
547
306
  type UserAdminGuards = {
548
- /**
549
- * 許可は「正常 return」、拒否は「throw」で表す。返り値は判定に使わない (`void` 契約)。
550
- * 述語のつもりで `false` を返す実装を書くと素通りするため、返り値型で明示的に禁じる。
551
- */
552
307
  requireAccess: (request: Request, context: {
553
308
  action: UserAdminAccess;
554
309
  intent: string;
555
310
  }) => Promise<void> | void;
556
- /**
557
- * Observes a denial that was converted into an in-page error. 画面内エラーへ変換した拒否の観測点。
558
- *
559
- * 拒否を画面内に返すと、既定のエラー経路が拾っていたログが消える。管理面への総当たりが
560
- * 200 番台の列に紛れて見えなくなるため、宿主が記録できる口を開けておく。
561
- */
562
311
  onDenied?: (context: {
563
312
  intent: string;
564
313
  actions: readonly UserAdminAccess[];
565
314
  error: unknown;
566
315
  }) => void;
567
316
  };
568
- /**
569
- * Every intent the permission table knows. 権限表が知っている intent すべて。
570
- *
571
- * ⚠️ 消費側の網羅性検査のために公開する。検査側が intent を手書きで並べる形しか無いと、
572
- * 実装に intent が増えても表は勝手には伸びず、**最も権限の重い新しい intent** だけが
573
- * 無検査で通る状態が静かに生まれる。突き合わせる相手を実装側から提供する。
574
- *
575
- * @returns Intent names, in declaration order. 宣言順の intent 名。
576
- */
577
317
  declare function userAdminIntents(): string[];
578
- /**
579
- * The CRUD verbs one intent requires. 1 つの intent が要求する CRUD 種別。
580
- *
581
- * ⚠️ 消費側が権限表を検査できるようにするために公開する。表そのものは公開しない — 書き換え
582
- * 可能な参照を渡すと、検査の対象が実行時に差し替えられる形になる。
583
- *
584
- * @param intent - Intent name. intent 名。
585
- * @returns The required verbs, or an empty list for an unknown intent. 要求する種別 (未知なら空)。
586
- */
587
318
  declare function userAdminAccessFor(intent: string): readonly UserAdminAccess[];
588
- /**
589
- * One upstream group as the picker shows it. 選択欄に出す上流グループ 1 件。
590
- *
591
- * ⚠️ **別名ではなく `@aiquants/auth-core` の型そのものである。** この形は上流アダプタ・永続化層・
592
- * 管理 UI の 3 層を通る。層ごとに「同じ意味の別の型」を宣言すると、構造的部分型のせいでどの境界も
593
- * 通ってしまい、上流へ足した欄が途中で黙って捨てられる (実測: 別々に宣言していた間は、必須欄を
594
- * 足しても読み手側の境界で `tsc --strict` が 0 を返した)。欄の集合は `auth-core` の型テストが固定
595
- * しているので、足すときは 3 層すべての受け渡しを見直すことになる。
596
- *
597
- * 特定のディレクトリ実装 (Google 等) の型は依然として import しない — `auth-core` は上流に依存
598
- * しない語彙のパッケージであり、`AuthDirectoryStatus` などを既にここから受け取っている。
599
- */
600
319
  type UserAdminCatalogGroup = AuthDirectoryCatalogGroup;
601
- /**
602
- * The upstream catalog as the loader hands it to the views. loader がビューへ渡す上流の候補一覧。
603
- *
604
- * ⚠️ **これは利便性のための読み取りである。** 上流へ届かなくても画面は開かなければならない
605
- * (グループ一覧や許可リストの閲覧は、選択欄の可否とは無関係である)。したがって失敗は
606
- * `reason` として **描画可能な状態** に変換し、例外にしない。認可やサインイン判定のように
607
- * 「判らないなら拒否」であるべき経路とは、意図的に扱いを変えている。
608
- */
609
320
  type UserAdminCatalog = {
610
321
  kind: "ready";
611
322
  groups: UserAdminCatalogGroup[];
@@ -617,48 +328,10 @@ type UserAdminCatalog = {
617
328
  } | {
618
329
  kind: "not-wired";
619
330
  };
620
- /**
621
- * What the catalog port answers: the groups, and when the upstream was actually observed.
622
- * 候補一覧ポートの答え。グループと、上流を実際に観測した時刻。
623
- *
624
- * ⚠️ `observedAt` は省略できない。この一覧は上流を直に叩いた結果とは限らず、資格情報を持つ別の
625
- * プロセスが書いた写しであることが多い。時刻を伴わない一覧は「上流の現在」と区別できず、運用者は
626
- * 既に消えたグループを選ぶ。`null` は **一度も観測していない** ことを意味する (空の答えではない)。
627
- */
628
331
  type UserAdminCatalogSnapshot = AuthDirectoryCatalogSnapshot;
629
- /**
630
- * What a "sync now" request did. 「今すぐ同期」の要求が行ったこと。
631
- *
632
- * `already-pending` は失敗ではない — 同じ範囲の要求が既に待っている。ただし **成功でもない**:
633
- * 何も積まれていないので、待っている行が誰にも拾われなければ何も起きない。
634
- */
635
332
  type UserAdminSyncRequestOutcome = "queued" | "already-pending";
636
- /**
637
- * What the sync request made right after a link was created did.
638
- * 連携の直後に積む同期要求が行ったこと。
639
- *
640
- * `not-queued` は **連携は成功したが要求は積めなかった** ことを表す。要求の失敗を連携の失敗として
641
- * 投げると、運用者には「連携に失敗した」と伝わる一方で上流所有のグループは既に増えている。
642
- * 連携の結果と要求の結果は別の事実なので、別の値で運ぶ。
643
- */
644
333
  type UserAdminLinkSyncOutcome = UserAdminSyncRequestOutcome | "not-queued";
645
- /**
646
- * Why the upstream catalog could not be listed, classified for display.
647
- * 上流の候補一覧を引けなかった理由を、表示のために分類したもの。
648
- *
649
- * ⚠️ **上流の例外文をそのまま画面へ出してはならない。** サービスアカウントのアドレス、借用先、
650
- * 内部 URL、資格情報の断片が混じり得る。管理面を開けるだけの主体に、それらを読ませる理由は無い。
651
- * 原文は `console.error` へ出し、画面にはこの分類に対応する自前の文言を出す。
652
- */
653
334
  type UserAdminCatalogFailure = "denied" | "rateLimited" | "upstreamError" | "neverObserved" | "unknown";
654
- /**
655
- * Neutral per-resource permission summary the admin shell renders in its header badge.
656
- * 管理シェルのヘッダーバッジが描画する、リソース単位の中立な権限サマリ。
657
- *
658
- * この形はこのパッケージ自身の契約であり、特定の認可ライブラリの型を import しない
659
- * (`AGENTS.md` のクロスパッケージ・ハードコード禁止)。`canRead` / `canWrite` / `canDelete` を持つ
660
- * ビューであれば構造的にそのまま渡せる。
661
- */
662
335
  type UserAdminPermission = {
663
336
  canRead: boolean;
664
337
  canWrite: boolean;
@@ -666,55 +339,15 @@ type UserAdminPermission = {
666
339
  };
667
340
  type UserAdminAppConfig = {
668
341
  store: UserAdminStore;
669
- /** セクション単位の部分上書き。既定は英語 (`defaultUserAdminLabels`)。 */
670
342
  labels?: PartialUserAdminLabels;
671
- /**
672
- * Required — omitting a guard would expose the whole user directory and its write actions.
673
- * 必須。省略を許すとユーザー名簿と全更新操作が無防備に露出するため、型で強制する。
674
- */
675
343
  guards: UserAdminGuards;
676
- /**
677
- * Names who is acting, for audit columns. 監査列に残す「誰が」を解決する処理。
678
- *
679
- * ⚠️ 省略すると、要求を積んだ主体が記録されない。同期要求の表は「誰がいつ何を要求し、結果が
680
- * どうだったか」を残すために在り、その `requested_by` が定数だと、乱発を疑ったときに誰の
681
- * ものか判らない — 乱発こそがこの intent に `update` を要求した理由である。
682
- */
683
344
  resolveActor?: (request: Request) => Promise<string> | string;
684
- /**
685
- * Lists the upstream groups the operator may link to. 連携先の候補を列挙するポート。
686
- *
687
- * 任意である。注入しない配備では選択欄を出さず、上流キーの手入力に留まる — 上流へ問い合わせる
688
- * 資格情報を web 側へ置かない構成を選べるようにするためである (同期ジョブだけが鍵を持つ形)。
689
- *
690
- * ⚠️ **失敗しても画面を落としてはならない。** 例外は loader が捕まえて
691
- * `{ kind: "unavailable" }` へ写す。ここが落ちると、グループ一覧すら開けなくなる。
692
- */
693
345
  directoryCatalog?: {
694
346
  listGroups: (request: Request) => Promise<UserAdminCatalogSnapshot>;
695
347
  };
696
- /**
697
- * Per-request self-permission lookup for the header annotation. Resolving to a map of
698
- * {@link UserAdminPermission} shows the badge; rejecting shows an explicit "unknown" badge — never a
699
- * permissive one. Any authz library whose view carries `canRead` / `canWrite` / `canDelete` satisfies it.
700
- * ヘッダー注釈に自分の実効権限を表示するためのリクエスト別権限取得関数。失敗時は「権限不明」表示。
701
- */
702
348
  getMyPermissions?: (request: Request) => Promise<Record<string, UserAdminPermission | undefined>>;
703
- /**
704
- * Display names for the resource keys the badge shows, e.g. `{ authz_admin: "ユーザー管理 UI" }`.
705
- * バッジに出すリソースキーの表示名。未指定のキーはキー文字列をそのまま表示。
706
- *
707
- * 表示名をこのパッケージ側に埋め込むと、別パッケージのリソースキーを名指しすることになる
708
- * (`AGENTS.md` のクロスパッケージ・ハードコード禁止)。中立な差し込み口として受け取る。
709
- */
710
349
  resourceLabels?: Record<string, string>;
711
350
  };
712
- /**
713
- * Creates React Router loader & action handler for user administration.
714
- * ユーザー管理用 React Router の loader および action ハンドラーを作成する。
715
- *
716
- * `config.guards` は必須。loader / action の双方が、処理を始める前にガードを通過させる。
717
- */
718
351
  declare function createUserAdminApp(config: UserAdminAppConfig): {
719
352
  loader: ({ request }: RouteArgs) => Promise<{
720
353
  resourceLabels: Record<string, string> | undefined;
@@ -742,26 +375,10 @@ declare function createUserAdminApp(config: UserAdminAppConfig): {
742
375
  error: string;
743
376
  }>;
744
377
  };
745
-
746
- /**
747
- * How the console keeps itself current while "sync now" requests are waiting for the job.
748
- * 「今すぐ同期」の要求がジョブを待っている間、画面が自分を最新に保つ間隔と上限。
749
- *
750
- * The loader only re-runs after the console's own submissions, so a request the job finishes a few
751
- * seconds later would stay invisible until a reload. While at least one request is pending the
752
- * console re-validates every `intervalMs`, and gives up after `maxMs` so a deployment with no job
753
- * consuming the queue does not poll forever from every open tab.
754
- * ローダーは自分の送信のあとにしか再実行されないため、ジョブが数秒後に終えた要求はリロードまで
755
- * 見えない。未処理の要求が 1 件でもある間は `intervalMs` ごとに再検証し、`maxMs` で諦める
756
- * (キューを消化するジョブが居ない配備で、開いている全タブが永久に叩き続けないため)。
757
- */
758
378
  type PendingSyncPolling = {
759
- /** Milliseconds between re-validations. 再検証の間隔 (ミリ秒)。 */
760
379
  intervalMs: number;
761
- /** Milliseconds after which polling stops for an unchanged pending count. 件数が変わらないまま諦めるまでの時間 (ミリ秒)。 */
762
380
  maxMs: number;
763
381
  };
764
- /** Defaults: every 3 seconds, for up to 5 minutes. 既定値 (3 秒ごと、最長 5 分)。 */
765
382
  declare const DEFAULT_PENDING_SYNC_POLLING: PendingSyncPolling;
766
383
  type UserAdminShellProps = {
767
384
  children?: React__default.ReactNode;
@@ -769,24 +386,10 @@ type UserAdminShellProps = {
769
386
  title: string;
770
387
  annotation: React__default.ReactNode;
771
388
  }) => React__default.ReactNode;
772
- /** Polling while sync requests are pending; defaults to {@link DEFAULT_PENDING_SYNC_POLLING}. 未処理中のポーリング設定。 */
389
+ basePath: string;
773
390
  pendingSyncPolling?: PendingSyncPolling;
774
391
  };
775
- /**
776
- * Shell layout for user administration pages with header annotation delegation.
777
- * ヘッダー注釈委譲を備えたユーザー管理ページのシェルレイアウト。
778
- */
779
- declare function UserAdminShell({ children, renderHeader, pendingSyncPolling }: UserAdminShellProps): React__default.JSX.Element;
780
-
781
- /**
782
- * @module admin/views
783
- * @description The five tab views of the user administration screen.
784
- * ユーザー管理画面を構成する 5 つのタブビュー。
785
- *
786
- * 一覧・検索・所属・許可リスト・ディレクトリ連携を描く。データはすべて loader から渡され、
787
- * 書き込みはビュー唯一の fetcher (`useSubmitThen`) を通す。
788
- */
789
-
392
+ declare function UserAdminShell({ children, renderHeader, pendingSyncPolling, basePath }: UserAdminShellProps): React__default.JSX.Element;
790
393
  type UserAdminLoaderData = {
791
394
  segment: string;
792
395
  users: AuthUser[];
@@ -794,40 +397,14 @@ type UserAdminLoaderData = {
794
397
  groupMembers: AuthGroupMember[];
795
398
  allowlist: AuthAllowlistEntry[];
796
399
  directoryStatus: AuthDirectoryStatus;
797
- /** 上流の候補一覧。選択欄を出す面でのみ `ready` になる。 */
798
400
  catalog: UserAdminCatalog;
799
401
  labels?: UserAdminLabels;
800
402
  };
801
403
  declare function UsersView(): React__default.JSX.Element;
802
- /**
803
- * View for managing user groups (create, edit, delete).
804
- * ユーザーグループ管理ビュー (作成・編集・削除)。
805
- */
806
404
  declare function GroupsView(): React__default.JSX.Element;
807
- /**
808
- * View for managing group member assignments.
809
- * グループメンバー割り当て管理ビュー。
810
- */
811
405
  declare function GroupMembersView(): React__default.JSX.Element;
812
- /**
813
- * View for managing authentication allowlist entries.
814
- * アクセス許可リスト (Allowlist) 管理ビュー。
815
- */
816
406
  declare function AllowlistView(): React__default.JSX.Element;
817
- /**
818
- * View for the upstream directory: what is linked, how fresh it is, and the controls that change it.
819
- * 上流ディレクトリのビュー。何が連携され、どれだけ新しく、それを変える操作を提供する。
820
- *
821
- * このタブが無いと、連携の作成・解除・一時停止・即時同期・グループ単位のサインイン許可という
822
- * 5 つの操作にどこからも到達できない。実装されているのに押せる場所が無い状態は、実装が無いのと
823
- * 変わらないうえ、「許可を消せるが作れない」という片肺の運用を強いる。
824
- */
825
407
  declare function DirectoryView(): React__default.JSX.Element;
826
408
  type AuthUserAdminAppViewProps = UserAdminShellProps;
827
- /**
828
- * Top-level application view component for the user administration UI (`/users/*`).
829
- * ユーザー管理 UI 全体を描画するトップレベルコンポーネント。
830
- */
831
- declare function AuthUserAdminAppView({ renderHeader, pendingSyncPolling }?: AuthUserAdminAppViewProps): React__default.JSX.Element;
832
-
833
- export { AllowlistView, AuthUserAdminAppView, type AuthUserAdminAppViewProps, DEFAULT_PENDING_SYNC_POLLING, DirectoryView, GroupMembersView, GroupsView, type PartialUserAdminLabels, type PendingSyncPolling, type UserAdminAccess, type UserAdminAppConfig, type UserAdminCatalog, type UserAdminCatalogFailure, type UserAdminCatalogGroup, type UserAdminCatalogSnapshot, type UserAdminGuards, UserAdminInputError, type UserAdminLabels, type UserAdminLinkSyncOutcome, type UserAdminLoaderData, UserAdminOperatorError, type UserAdminPermission, UserAdminShell, type UserAdminShellProps, type UserAdminStore, type UserAdminSyncRequestOutcome, UsersView, createInMemoryUserAdminStore, createUserAdminApp, defaultUserAdminLabels, jaUserAdminLabels, normalizeUpstreamKey, resolveUserAdminLabels, userAdminAccessFor, userAdminIntents };
409
+ declare function AuthUserAdminAppView({ renderHeader, pendingSyncPolling, basePath }: AuthUserAdminAppViewProps): React__default.JSX.Element;
410
+ export { AllowlistView, AuthUserAdminAppView, type AuthUserAdminAppViewProps, DEFAULT_PENDING_SYNC_POLLING, DirectoryView, GroupMembersView, GroupsView, type PartialUserAdminLabels, type PendingSyncPolling, type UserAdminAccess, type UserAdminAppConfig, type UserAdminCatalog, type UserAdminCatalogFailure, type UserAdminCatalogGroup, type UserAdminCatalogSnapshot, type UserAdminGuards, UserAdminInputError, type UserAdminLabels, type UserAdminLinkSyncOutcome, type UserAdminLoaderData, type UserAdminLocale, UserAdminOperatorError, type UserAdminPermission, UserAdminShell, type UserAdminShellProps, type UserAdminStore, type UserAdminSyncRequestOutcome, UsersView, createInMemoryUserAdminStore, createUserAdminApp, defaultUserAdminLabels, jaUserAdminLabels, normalizeUpstreamKey, resolveUserAdminLabels, userAdminAccessFor, userAdminIntents };