@wcstack/router 1.32.0 → 2.0.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/auto.min.js +1 -1
- package/dist/auto.min.js.map +1 -1
- package/dist/index.d.ts +175 -0
- package/dist/index.esm.js +37 -6
- package/dist/index.esm.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -86,6 +86,13 @@ interface IRouteMatchResult {
|
|
|
86
86
|
lastPath: string;
|
|
87
87
|
}
|
|
88
88
|
type GuardHandler = (toPath: string, fromPath: string) => boolean | Promise<boolean>;
|
|
89
|
+
interface _ILayout {
|
|
90
|
+
readonly uuid: string;
|
|
91
|
+
readonly enableShadowRoot: boolean;
|
|
92
|
+
readonly name: string;
|
|
93
|
+
loadTemplate(): Promise<HTMLTemplateElement>;
|
|
94
|
+
}
|
|
95
|
+
type ILayout = _ILayout & Pick<Element, 'childNodes'>;
|
|
89
96
|
type SegmentType = 'static' | 'param' | 'catch-all';
|
|
90
97
|
interface ISegmentInfo {
|
|
91
98
|
type: SegmentType;
|
|
@@ -188,6 +195,16 @@ interface IOutlet {
|
|
|
188
195
|
readonly rootNode: HTMLElement | ShadowRoot;
|
|
189
196
|
lastRoutes: IRoute[];
|
|
190
197
|
}
|
|
198
|
+
interface ILayoutOutlet {
|
|
199
|
+
layout: ILayout;
|
|
200
|
+
readonly name: string;
|
|
201
|
+
assignParams(params: Record<string, any>): void;
|
|
202
|
+
}
|
|
203
|
+
interface ILink {
|
|
204
|
+
readonly uuid: string;
|
|
205
|
+
readonly router: IRouter;
|
|
206
|
+
readonly anchorElement: HTMLAnchorElement | null;
|
|
207
|
+
}
|
|
191
208
|
|
|
192
209
|
/**
|
|
193
210
|
* AppRoutes - Root component for @wcstack/router
|
|
@@ -500,5 +517,163 @@ declare class RouteCore extends EventTarget {
|
|
|
500
517
|
|
|
501
518
|
declare const VERSION: string;
|
|
502
519
|
|
|
520
|
+
declare class Outlet extends HTMLElement implements IOutlet {
|
|
521
|
+
private _routesNode;
|
|
522
|
+
private _lastRoutes;
|
|
523
|
+
private _initialized;
|
|
524
|
+
constructor();
|
|
525
|
+
get routesNode(): IRouter;
|
|
526
|
+
set routesNode(value: IRouter);
|
|
527
|
+
get rootNode(): HTMLElement | ShadowRoot;
|
|
528
|
+
get lastRoutes(): IRoute[];
|
|
529
|
+
set lastRoutes(value: IRoute[]);
|
|
530
|
+
/**
|
|
531
|
+
* shadowRoot 有効化判定。Layout と挙動を揃え、属性で個別オーバーライド可能にする。
|
|
532
|
+
* - `enable-shadow-root` 属性あり → true
|
|
533
|
+
* - `disable-shadow-root` 属性あり → false
|
|
534
|
+
* - いずれもなし → config.enableShadowRoot を尊重
|
|
535
|
+
*/
|
|
536
|
+
private _resolveEnableShadowRoot;
|
|
537
|
+
private _initialize;
|
|
538
|
+
connectedCallback(): void;
|
|
539
|
+
/**
|
|
540
|
+
* Outlet が disconnect された際の状態クリーンアップ。
|
|
541
|
+
*
|
|
542
|
+
* `_lastRoutes` をクリアすることで、再接続後の applyRoute における diff
|
|
543
|
+
* (既に show 済みのルートは show を skip する判定)が、切断中に外部から
|
|
544
|
+
* 操作された DOM と整合しなくなる事故を防ぐ。
|
|
545
|
+
*
|
|
546
|
+
* 仕様前提として Outlet は Router と一体運用される(Router が `_getOutlet()` で
|
|
547
|
+
* 自身の兄弟に Outlet を配置・参照する)。それでも単独で再接続される
|
|
548
|
+
* エッジケースに備える防衛的措置として `_lastRoutes` のみクリアする。
|
|
549
|
+
* `_initialized` と shadowRoot は維持し、再 attachShadow による
|
|
550
|
+
* InvalidStateError を回避する。
|
|
551
|
+
*/
|
|
552
|
+
disconnectedCallback(): void;
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
declare class Layout extends HTMLElement implements ILayout {
|
|
556
|
+
private _uuid;
|
|
557
|
+
constructor();
|
|
558
|
+
private _loadTemplateFromSource;
|
|
559
|
+
private _loadTemplateFromDocument;
|
|
560
|
+
loadTemplate(): Promise<HTMLTemplateElement>;
|
|
561
|
+
get uuid(): string;
|
|
562
|
+
get enableShadowRoot(): boolean;
|
|
563
|
+
get name(): string;
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
declare class LayoutOutlet extends HTMLElement implements ILayoutOutlet {
|
|
567
|
+
private _layout;
|
|
568
|
+
private _initialized;
|
|
569
|
+
private _initializing;
|
|
570
|
+
private _disconnectedDuringInit;
|
|
571
|
+
private _layoutChildNodes;
|
|
572
|
+
constructor();
|
|
573
|
+
get layout(): ILayout;
|
|
574
|
+
set layout(value: ILayout);
|
|
575
|
+
get name(): string;
|
|
576
|
+
private _initialize;
|
|
577
|
+
connectedCallback(): Promise<void>;
|
|
578
|
+
disconnectedCallback(): void;
|
|
579
|
+
assignParams(params: Record<string, any>): void;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
declare class Link extends HTMLElement implements ILink {
|
|
583
|
+
static get observedAttributes(): string[];
|
|
584
|
+
private _childNodeArray;
|
|
585
|
+
private _uuid;
|
|
586
|
+
private _path;
|
|
587
|
+
private _router;
|
|
588
|
+
private _anchorElement;
|
|
589
|
+
private _initialized;
|
|
590
|
+
private _onClick?;
|
|
591
|
+
constructor();
|
|
592
|
+
get uuid(): string;
|
|
593
|
+
/**
|
|
594
|
+
* 最寄りの Router を返す。
|
|
595
|
+
*
|
|
596
|
+
* 注意: この getter は DOM 走査で Router を探すため、
|
|
597
|
+
* Router がまだ upgrade されていない場合は HTMLElement として返る可能性がある。
|
|
598
|
+
* 通常は registerComponents() で Router を Link より先に upgrade することを推奨する。
|
|
599
|
+
*/
|
|
600
|
+
get router(): Router;
|
|
601
|
+
private _initialize;
|
|
602
|
+
/**
|
|
603
|
+
* URL pathname を正規化する。Router と共通実装を使うことで
|
|
604
|
+
* basenameFileExtensions の取り扱いを揃え、active 判定の取りこぼしを防ぐ。
|
|
605
|
+
*/
|
|
606
|
+
private _normalizePathname;
|
|
607
|
+
private _joinInternalPath;
|
|
608
|
+
/**
|
|
609
|
+
* router が扱う内部ターゲットか。`/` 始まりに加え、`?` 始まり(クエリのみ遷移 —
|
|
610
|
+
* docs/router-state-contract-design.md §4.1)も内部ターゲットとして受理する。
|
|
611
|
+
*/
|
|
612
|
+
private _isInternalTarget;
|
|
613
|
+
private _setAnchorHref;
|
|
614
|
+
connectedCallback(): void;
|
|
615
|
+
/**
|
|
616
|
+
* サーバーが生成した目印付き anchor(直後の兄弟)。クライアントの採用対象
|
|
617
|
+
*/
|
|
618
|
+
private _findSsrAnchor;
|
|
619
|
+
private _connect;
|
|
620
|
+
disconnectedCallback(): void;
|
|
621
|
+
attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
|
|
622
|
+
private _updateActiveState;
|
|
623
|
+
get anchorElement(): HTMLAnchorElement | null;
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
declare class Head extends HTMLElement {
|
|
627
|
+
private _initialized;
|
|
628
|
+
private _childElementArray;
|
|
629
|
+
constructor();
|
|
630
|
+
private _initialize;
|
|
631
|
+
connectedCallback(): void;
|
|
632
|
+
disconnectedCallback(): void;
|
|
633
|
+
get childElementArray(): Element[];
|
|
634
|
+
/**
|
|
635
|
+
* 要素の一意キーを生成(WeakMap でキャッシュ)
|
|
636
|
+
*/
|
|
637
|
+
private _getKey;
|
|
638
|
+
/**
|
|
639
|
+
* 要素の一意キーを計算(実体)
|
|
640
|
+
*/
|
|
641
|
+
private _computeKey;
|
|
642
|
+
/**
|
|
643
|
+
* head 内の要素を key で引ける Map を構築する。
|
|
644
|
+
* `_reapplyHead` のループ前に一度だけ呼び出し、O(N) lookup に置き換えるためのヘルパ。
|
|
645
|
+
*
|
|
646
|
+
* 設計仕様: 同一 key の要素が複数 `document.head` 内に存在する場合は **first-wins**
|
|
647
|
+
* (DOM 順で最初の要素のみ採用)。これは `_captureInitialHead` および
|
|
648
|
+
* `initialHeadValues` の挙動とも整合する。
|
|
649
|
+
* 重複は基本的にユーザーの記述ミスだが、_getKey の粒度(href/name 等の主要属性のみ)に
|
|
650
|
+
* よる「論理的重複」もあり得るため、サイレントに first-wins とする。
|
|
651
|
+
* 厳密な重複検出が必要な場合は呼び出し側で行う。
|
|
652
|
+
*/
|
|
653
|
+
private _buildHeadElementMap;
|
|
654
|
+
/**
|
|
655
|
+
* 初期の<head>状態をキャプチャ
|
|
656
|
+
* document.head内の全ての要素をスキャンして保存する
|
|
657
|
+
*/
|
|
658
|
+
private _captureInitialHead;
|
|
659
|
+
/**
|
|
660
|
+
* スタック全体からheadを再構築
|
|
661
|
+
* 後のHeadが優先される(上書き)
|
|
662
|
+
*/
|
|
663
|
+
private _reapplyHead;
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
declare global {
|
|
667
|
+
interface HTMLElementTagNameMap {
|
|
668
|
+
"wcs-router": Router;
|
|
669
|
+
"wcs-route": Route;
|
|
670
|
+
"wcs-outlet": Outlet;
|
|
671
|
+
"wcs-layout": Layout;
|
|
672
|
+
"wcs-layout-outlet": LayoutOutlet;
|
|
673
|
+
"wcs-link": Link;
|
|
674
|
+
"wcs-head": Head;
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
|
|
503
678
|
export { Route, RouteCore, Router, VERSION, bootstrapRouter, getConfig };
|
|
504
679
|
export type { IWritableConfig, IWritableTagNames, RouteParseOptions };
|
package/dist/index.esm.js
CHANGED
|
@@ -2234,6 +2234,12 @@ class Router extends HTMLElement {
|
|
|
2234
2234
|
this._resolveConnectedCallback = resolve;
|
|
2235
2235
|
this._rejectConnectedCallback = reject;
|
|
2236
2236
|
});
|
|
2237
|
+
// 初期化の失敗は reject として配管するが、この Promise は readiness プロトコルの
|
|
2238
|
+
// 消費者(renderToString / @wcstack/testing の mount)が居るときだけ await される。
|
|
2239
|
+
// 誰も await しない通常のページやユニットテストで reject を「未処理」として
|
|
2240
|
+
// 報告させないよう、ここで観測済みにしておく。await する側には従来どおり
|
|
2241
|
+
// reject が届く(別の consumer が付いても settled 結果は共有される)。
|
|
2242
|
+
this._connectedCallbackPromise.catch(() => { });
|
|
2237
2243
|
}
|
|
2238
2244
|
get connectedCallbackPromise() {
|
|
2239
2245
|
return this._connectedCallbackPromise;
|
|
@@ -2695,10 +2701,17 @@ class Router extends HTMLElement {
|
|
|
2695
2701
|
rootNode.appendChild(fragment);
|
|
2696
2702
|
}
|
|
2697
2703
|
await applyRoute(this, this.outlet, fullPath, this._path, window.location.search || "");
|
|
2698
|
-
if (adoptable) {
|
|
2699
|
-
//
|
|
2700
|
-
//
|
|
2701
|
-
//
|
|
2704
|
+
if (adoptable || getBinder() !== null) {
|
|
2705
|
+
// 初期描画の内容を binder へ差し出す。
|
|
2706
|
+
// - adoptable(描き直し): state がサーバー DOM を既にハイドレート済み(初期走査
|
|
2707
|
+
// 完了後)の場合、破棄と同時にそのバインドは死んでいる。
|
|
2708
|
+
// - binder が既に居る: state の初回走査が router の挿入より先に完了し得る
|
|
2709
|
+
// (`json=` の state は I/O 無しで走査を終える。/auto の文書順ではなく
|
|
2710
|
+
// bootstrap を先に済ませてから HTML を流し込むテストハーネス
|
|
2711
|
+
// — @wcstack/testing の mount() — で起きる。_renderForSsr と同じ理由)。
|
|
2712
|
+
// bind() は冪等なので、走査に間に合っていた分を再度渡しても壊れない。
|
|
2713
|
+
// binder が居なければ渡さない: state を読まないページで保留キューに
|
|
2714
|
+
// ノードを溜め続けないため(後から来る state は走査で拾う)。
|
|
2702
2715
|
this._offerInitialContentToBinder();
|
|
2703
2716
|
}
|
|
2704
2717
|
this._notifyLocationChange();
|
|
@@ -3015,7 +3028,25 @@ class Router extends HTMLElement {
|
|
|
3015
3028
|
}
|
|
3016
3029
|
if (!this._initialized) {
|
|
3017
3030
|
this._disconnectedDuringInit = false;
|
|
3018
|
-
|
|
3031
|
+
try {
|
|
3032
|
+
// ストリーミング型パーサ(happy-dom: `document.body.innerHTML = ...` の途中)は
|
|
3033
|
+
// 開始タグの時点で connectedCallback を呼び、子(<template>)がまだ無い。
|
|
3034
|
+
// SSR 経路と同じく 1 microtask 譲れば同期パースが完走して子が揃う。
|
|
3035
|
+
// ブラウザの deferred なバンドルでは upgrade 時に子が揃っているので、
|
|
3036
|
+
// template が既にあるときは譲らない(従来どおり)。
|
|
3037
|
+
if (this._getTemplate() === null) {
|
|
3038
|
+
await Promise.resolve();
|
|
3039
|
+
}
|
|
3040
|
+
await this._initialize();
|
|
3041
|
+
}
|
|
3042
|
+
catch (error) {
|
|
3043
|
+
// reject を配管しないと、初期化の失敗(template 無し・ルート定義無し・
|
|
3044
|
+
// basename 不整合 …)が connectedCallbackPromise を永久に未決着にし、
|
|
3045
|
+
// waitForReady(@wcstack/server / @wcstack/testing)が無言でハングする。
|
|
3046
|
+
// SSR 経路と同じ扱いにする。
|
|
3047
|
+
this._rejectConnectedCallback?.(error);
|
|
3048
|
+
throw error;
|
|
3049
|
+
}
|
|
3019
3050
|
// 初期化中に disconnectedCallback が呼ばれた場合はイベントリスナを登録しない
|
|
3020
3051
|
if (this._disconnectedDuringInit) {
|
|
3021
3052
|
this._resolveConnectedCallback?.();
|
|
@@ -3611,7 +3642,7 @@ function bootstrapRouter(config, registry) {
|
|
|
3611
3642
|
registerComponents(registry);
|
|
3612
3643
|
}
|
|
3613
3644
|
|
|
3614
|
-
var version = "
|
|
3645
|
+
var version = "2.0.0";
|
|
3615
3646
|
var pkg = {
|
|
3616
3647
|
version: version};
|
|
3617
3648
|
|