import { Observable } from '@tanbo/stream'; import { Router } from './router'; import { UrlTree } from './url-parser'; export interface QueryParams { [key: string]: string | string[]; } export declare abstract class Navigator { baseUrl: string; abstract urlTree: UrlTree; protected constructor(baseUrl: string); abstract onUrlChanged: Observable; abstract get pathname(): string; abstract to(pathName: string, relative: Router, queryParams?: QueryParams, hash?: string | null): boolean; abstract replace(pathName: string, relative: Router, queryParams?: QueryParams, hash?: string | null): boolean; abstract join(pathName: string, relative: Router, queryParams?: QueryParams, hash?: string | null): string; abstract back(): void; abstract forward(): void; abstract go(offset: number): void; /** 当前一次由 Router 触发的地址变更已被对应页面接受 */ abstract confirmNavigation(): void; /** 当前一次由 Router 触发的地址变更被页面守卫拒绝,需要回滚地址栏 */ abstract cancelNavigation(): void; abstract destroy(): void; } export interface UrlFormatParams { queryParams?: QueryParams; hash?: string | null; } export declare function formatUrl(pathname: string, urlFormatParams: UrlFormatParams): string; export declare function formatQueryParams(queryParams: QueryParams): string; export interface NavigatorParams { pathname: string; queryParams: QueryParams; hash: string | null; } export interface NavigatorHooks { beforeEach?(currentParams: NavigatorParams, nextParams: NavigatorParams, next: () => void): void; afterEach?(params: NavigatorParams): void; } export declare class BrowserNavigator extends Navigator { private hooks; onUrlChanged: Observable; private pendingNavigation; /** 挂载在 location 上的路径前缀;'' 或 '/' 表示站点根,不做剥离 */ private get basePathPrefix(); get pathname(): string; private urlParser; urlTree: UrlTree; private urlChangeEvent; private subscription; constructor(baseUrl: string, hooks?: NavigatorHooks); to(pathName: string, relative: Router, queryParams?: QueryParams, hash?: string | null): boolean; replace(pathName: string, relative: Router, queryParams?: QueryParams, hash?: string | null): boolean; join(pathname: string, relative: Router, queryParams?: QueryParams, hash?: string | null): string; back(): void; forward(): void; go(offset: number): void; confirmNavigation(): void; cancelNavigation(): void; destroy(): void; private runHooks; private stripBaseFromLocationPathname; /** * 按与 `history.pushState` / `replaceState` 写入会话的 URL 解析 urlTree(与传入 `join` 的相对路径一致)。 * History 更新后若仍仅从 `Location` 读路径,可能与实际会话 URL 不一致(如 Location 与 document 的同步时序、部分宿主环境)。 */ private readUrlTreeFromHistoryHref; private readUrlTreeFromLocation; private getCurrentUrl; }