@wcstack/router 1.30.0 → 1.32.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/index.d.ts CHANGED
@@ -74,7 +74,7 @@ type BuiltinParamTypes = "int" | "float" | "bool" | "uuid" | "slug" | "isoDate"
74
74
  * This is the main entry point for setting up the router.
75
75
  * @param config - Optional partial configuration to override defaults
76
76
  */
77
- declare function bootstrapRouter(config?: Partial<IWritableConfig>): void;
77
+ declare function bootstrapRouter(config?: Partial<IWritableConfig>, registry?: CustomElementRegistry): void;
78
78
 
79
79
  declare function getConfig(): IConfig;
80
80
 
@@ -121,6 +121,8 @@ interface IRoute extends IRouteChildContainer {
121
121
  readonly absoluteSegmentCount: number;
122
122
  readonly segmentInfos: ISegmentInfo[];
123
123
  readonly absoluteSegmentInfos: ISegmentInfo[];
124
+ /** guard 属性の有無。SSR の guard バリア判定に使う(docs/ssr-router-design.md §2-4) */
125
+ readonly hasGuard: boolean;
124
126
  guardHandler: GuardHandler;
125
127
  shouldChange(newParams: Record<string, string>): boolean;
126
128
  guardCheck(matchResult: IRouteMatchResult): Promise<void>;
@@ -129,6 +131,23 @@ interface IRoute extends IRouteChildContainer {
129
131
  setParams(params: Record<string, string>, typedParams: Record<string, any>): void;
130
132
  clearParams(): void;
131
133
  notifyGuardHandlerLoadFailed(): void;
134
+ /**
135
+ * SSR ハイドレーションの採用: サーバー描画済みノード列を内容として引き取る
136
+ * (docs/ssr-router-design.md §4)
137
+ */
138
+ adoptChildNodes(nodes: Node[]): void;
139
+ }
140
+ /**
141
+ * Router 観測面のコミット 1 回分(docs/router-state-contract-design.md §3.4)。
142
+ */
143
+ interface IRouterCommit {
144
+ params: Record<string, string>;
145
+ typedParams: Record<string, any>;
146
+ routeName: string;
147
+ /** "?k=v" 形式または ""。パースは commit 側(Router)が行う */
148
+ search: string;
149
+ /** basename スライス後の path */
150
+ path: string;
132
151
  }
133
152
  interface IRouter extends IRouteChildContainer {
134
153
  readonly basename: string;
@@ -136,7 +155,33 @@ interface IRouter extends IRouteChildContainer {
136
155
  readonly template: HTMLTemplateElement;
137
156
  fallbackRoute: IRoute | null;
138
157
  path: string;
158
+ /** 現在マッチのマージ済み param(文字列・frozen)。fallback・初期化前は {} */
159
+ readonly params: Record<string, string>;
160
+ /** 同上の型変換済み値(frozen) */
161
+ readonly typedParams: Record<string, any>;
162
+ /** 現在 URL のクエリ(Record・last-wins・frozen)。クエリ無しは {} */
163
+ readonly searchParams: Record<string, string>;
164
+ /** 最深マッチルートの name 属性値。fallback 時は fallback ルートの name */
165
+ readonly routeName: string;
139
166
  navigate(path: string): Promise<void>;
167
+ /** navigateUrl(push)の対になる replace 遷移(§4.2) */
168
+ replace(path: string): Promise<void>;
169
+ /**
170
+ * same-match 判定(§4.4)。比較は basename スライス後の path 同士。
171
+ * 最初の成功 commit より前は常に false(初回ガード)。
172
+ */
173
+ isSameMatch(path: string): boolean;
174
+ /**
175
+ * 観測面のコミットと発火(§3.4)。全内部値を先にコミットし、その後で
176
+ * params → route-name → search → path の順に変化したものだけ発火する。
177
+ */
178
+ commitNavigation(commit: IRouterCommit): void;
179
+ /** `announce=` 用 live region。未生成なら null(docs/a11y-design.md §3-4) */
180
+ readonly a11yRegion: HTMLElement | null;
181
+ /** `<wcs-router focus=...>` の属性値(無ければ null) */
182
+ readonly focusPolicy: string | null;
183
+ /** `<wcs-router announce=...>` の属性値(無ければ null) */
184
+ readonly announcePolicy: string | null;
140
185
  }
141
186
  interface IOutlet {
142
187
  routesNode: IRouter;
@@ -150,6 +195,12 @@ interface IOutlet {
150
195
  * Container element that manages route definitions and navigation.
151
196
  */
152
197
  declare class Router extends HTMLElement implements IRouter {
198
+ /**
199
+ * @wcstack/server の待機プロトコル(docs/ssr-router-design.md §3.2)。
200
+ * renderToString はこのフラグを持つ要素の connectedCallbackPromise を待って
201
+ * からシリアライズする — 初期ルート適用の完了がサーバー出力に反映される。
202
+ */
203
+ static hasConnectedCallbackPromise: boolean;
153
204
  static wcBindable: IWcBindable;
154
205
  private _outlet;
155
206
  private _template;
@@ -161,9 +212,35 @@ declare class Router extends HTMLElement implements IRouter {
161
212
  private _listeningPopState;
162
213
  private _listeningNavigate;
163
214
  private _navigateUrl;
215
+ private _replaceUrl;
164
216
  private _disconnectedDuringInit;
165
217
  private _initializing;
218
+ private _a11yRegion;
219
+ private _params;
220
+ private _typedParams;
221
+ private _searchParams;
222
+ private _routeName;
223
+ /** 最初の成功 commit を通過したか(§4.4 の初回ガード) */
224
+ private _hasCommitted;
225
+ private _connectedCallbackPromise;
226
+ private _resolveConnectedCallback;
227
+ private _rejectConnectedCallback;
166
228
  constructor();
229
+ get connectedCallbackPromise(): Promise<void>;
230
+ get a11yRegion(): HTMLElement | null;
231
+ get focusPolicy(): string | null;
232
+ get announcePolicy(): string | null;
233
+ /**
234
+ * `announce=` 用 live region を <wcs-router> 直下に空のまま用意する
235
+ * (docs/a11y-design.md §3-4)。
236
+ * - 告知より**前**から DOM に居ないと SR に読まれないため、announce 時の
237
+ * 遅延生成はできない。
238
+ * - outlet 配下はナビゲーションごとに破棄され、オプトインで shadow root にも
239
+ * なる。document.body 直下は router の寿命を超えて漏れ、マルチ router で
240
+ * 競合する。よって配置は <wcs-router> 直下の一択。
241
+ * - display:none は live region を殺すため、sr-only クリップで隠す。
242
+ */
243
+ private _ensureA11yRegion;
167
244
  /**
168
245
  * Normalize a URL pathname to a route path.
169
246
  * 共通実装は normalizePathname.ts を参照(Link との挙動整合のため)。
@@ -188,6 +265,32 @@ declare class Router extends HTMLElement implements IRouter {
188
265
  * applyRoute 内で設定される値です。
189
266
  */
190
267
  set path(value: string);
268
+ get params(): Record<string, string>;
269
+ get typedParams(): Record<string, any>;
270
+ get searchParams(): Record<string, string>;
271
+ get routeName(): string;
272
+ /**
273
+ * same-match 判定(docs/router-state-contract-design.md §4.4)。
274
+ *
275
+ * 比較は **basename スライス後の path 同士**(`_path` はスライス後で保存済み)。
276
+ * 判定が必要な地点は 2 箇所 — `_onNavigateFunc` の intercept オプション決定時と
277
+ * `applyRoute` の入口分岐 — で、両方がこの単一実装を呼ぶ。
278
+ *
279
+ * 初回ガード: 最初の成功 commit より前には適用しない。初期 `_path = ""` が
280
+ * 正規化後パス(常に `/` 始まり)と一致しないため偶然安全だが、
281
+ * normalizePathname の実装詳細に依存させず規範として明示する。
282
+ */
283
+ isSameMatch(path: string): boolean;
284
+ /**
285
+ * 観測面のコミットと発火(docs/router-state-contract-design.md §3.4)。
286
+ *
287
+ * 全内部値を先にコミットし、その後で初めてイベントを発火する — どのイベントの
288
+ * リスナーから要素プロパティを読んでも、遷移後スナップショットの一貫した値が
289
+ * 見える。発火順序は params → route-name → search → path。`path` を最後に
290
+ * 置くのは、既存例で `path` が「ナビゲーション完了」の信号として使われている
291
+ * ため。各イベントは変化した commit のみ発火する。
292
+ */
293
+ commitNavigation(commit: IRouterCommit): void;
191
294
  get fallbackRoute(): IRoute | null;
192
295
  /**
193
296
  * Routeのfallback属性がある場合にそのルートを設定します。
@@ -195,7 +298,21 @@ declare class Router extends HTMLElement implements IRouter {
195
298
  set fallbackRoute(value: IRoute | null);
196
299
  get navigateUrl(): string | null;
197
300
  set navigateUrl(value: string | null);
301
+ get replaceUrl(): string | null;
302
+ /**
303
+ * navigateUrl と完全同型の null-idle transient(docs/router-state-contract-design.md §4.2)。
304
+ * null は待機・書き込みで replace() を起動・完了で自己リセットして
305
+ * `wcs-router:replace-url-changed`(detail: null)を発火する。
306
+ */
307
+ set replaceUrl(value: string | null);
198
308
  navigate(path: string): Promise<void>;
309
+ /**
310
+ * navigateUrl(push)の対になる replace 遷移(docs/router-state-contract-design.md §4.2)。
311
+ * Navigation API では `navigation.navigate(url, { history: "replace" })`、
312
+ * フォールバックでは `history.replaceState` + applyRoute + 通知。
313
+ */
314
+ replace(path: string): Promise<void>;
315
+ private _performNavigation;
199
316
  /**
200
317
  * basename 配下の URL かどうかを判定する。
201
318
  * basename が空の場合はすべての URL にマッチする。
@@ -205,12 +322,38 @@ declare class Router extends HTMLElement implements IRouter {
205
322
  private _onNavigate;
206
323
  private _onPopState;
207
324
  private _initialize;
325
+ /**
326
+ * サーバー描画済み outlet の採用(docs/ssr-router-design.md §4)。
327
+ *
328
+ * 検証(一意な absolutePath・マーカーの整合・現在 URL のマッチとの一致)を
329
+ * **すべて DOM 変更の前に**行い、途中で断念しても半採用状態を残さない。
330
+ * 成立すれば DOM 変更ゼロで「すでにナビゲート済み」の状態を確立する —
331
+ * state がハイドレートしたバインディングは採用ノード上で生きたままになる。
332
+ *
333
+ * @returns 採用が成立した場合 true。false は呼び出し側(_initialize)が
334
+ * サーバー DOM を破棄して従来描画にフォールバックする。
335
+ */
336
+ private _hydrateFromSsr;
337
+ /**
338
+ * SSR モードの初期ルート描画(docs/ssr-router-design.md §3.2)。
339
+ * 初回描画は transition arbiter に渡らない既存規則(showRouteContent)により
340
+ * 常に同期適用される。navigate / popstate リスナ・a11y region・
341
+ * `wcs:navigate` 通知はサーバーでは不要(connectedCallback 側で登録しない)。
342
+ */
343
+ private _renderForSsr;
344
+ /**
345
+ * 初期表示ルートの内容を binder プロトコルへ差し出す。SSR 描画(_renderForSsr)と
346
+ * ハイドレーション不能時の描き直し(state が先にハイドレートを終えている可能性が
347
+ * ある)の両方から呼ぶ。bind() は冪等なので余分に差し出しても壊れない。
348
+ */
349
+ private _offerInitialContentToBinder;
350
+ /** ルートツリー全体(ネスト含む)への走査 */
351
+ private _forEachRoute;
208
352
  connectedCallback(): Promise<void>;
209
353
  disconnectedCallback(): void;
210
354
  }
211
355
 
212
356
  declare class Route extends HTMLElement implements IRoute {
213
- static wcBindable: IWcBindable;
214
357
  private _core;
215
358
  private _routeParentNode;
216
359
  private _routeChildNodes;
@@ -228,6 +371,13 @@ declare class Route extends HTMLElement implements IRoute {
228
371
  get uuid(): string;
229
372
  get placeHolder(): Comment;
230
373
  get childNodeArray(): Node[];
374
+ /**
375
+ * SSR ハイドレーションの採用(docs/ssr-router-design.md §4)。
376
+ * サーバー描画済みの DOM ノード列をこのルートの内容として引き取る。
377
+ * 以後の hideRoute / showRoute は採用ノードに対して従来どおり動く。
378
+ * template 由来の fresh クローン(自身の childNodes)は不要になるため破棄する。
379
+ */
380
+ adoptChildNodes(nodes: Node[]): void;
231
381
  get routes(): IRoute[];
232
382
  get childIndex(): number;
233
383
  get path(): string;
@@ -245,6 +395,7 @@ declare class Route extends HTMLElement implements IRoute {
245
395
  get segmentCount(): number;
246
396
  get absoluteSegmentCount(): number;
247
397
  get fullpath(): string;
398
+ get hasGuard(): boolean;
248
399
  get guardHandler(): GuardHandler;
249
400
  set guardHandler(value: GuardHandler);
250
401
  setParams(params: Record<string, string>, typedParams: Record<string, any>): void;
@@ -271,8 +422,21 @@ interface RouteParseOptions {
271
422
  guardFallback?: string | null;
272
423
  name?: string;
273
424
  }
425
+ /**
426
+ * NOTE: RouteCore / Route は `static wcBindable` を**宣言しない**
427
+ * (docs/router-state-contract-design.md §5.1 / D2)。
428
+ *
429
+ * `<wcs-route>` は parse 時に clone された detached コントローラであり、live DOM に
430
+ * 入るのは placeholder コメントとスタンプされた子ノードだけ。data-wcs は live DOM
431
+ * 上の属性走査で結線する仕組みなので、宣言しても構造的に到達不能な「果たせない
432
+ * 約束」になる。params / typedParams / routeName の観測面は live DOM に居る
433
+ * `<wcs-router>` に集約した(Router.wcBindable)。
434
+ *
435
+ * `wcs-route:params-changed` / `wcs-route:active-changed` の dispatch は存置する —
436
+ * RouteCore は EventTarget であり、Core 直接消費(signals の正式推奨形)と
437
+ * ユニットテストの観測面として生きている。
438
+ */
274
439
  declare class RouteCore extends EventTarget {
275
- static wcBindable: IWcBindable;
276
440
  private _target;
277
441
  private _parentCore;
278
442
  private _path;
@@ -318,6 +482,12 @@ declare class RouteCore extends EventTarget {
318
482
  setParams(params: Record<string, string>, typedParams: Record<string, any>): void;
319
483
  clearParams(): void;
320
484
  shouldChange(newParams: Record<string, string>): boolean;
485
+ /**
486
+ * guard 属性の有無(parsePath の options.hasGuard)。SSR の guard バリア
487
+ * — guard 付きルートはサーバーで描かない(docs/ssr-router-design.md §2-4)—
488
+ * がハンドラのロードを待たずに判定するために使う。
489
+ */
490
+ get hasGuard(): boolean;
321
491
  get guardHandler(): GuardHandler;
322
492
  set guardHandler(value: GuardHandler);
323
493
  /**