From 04f9147db6c0b3aff3347a62659f3dfb21fc3f94 Mon Sep 17 00:00:00 2001 From: おさむのひと <46447427+samunohito@users.noreply.github.com> Date: Mon, 8 Jan 2024 14:44:43 +0900 Subject: refactor(frontend): router.ts解きほぐし (#12907) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor(frontend): router.ts解きほぐし * add debug hmr option * fix comment * fix not working * add comment * fix name * Update definition.ts --------- Co-authored-by: syuilo --- packages/frontend/src/nirax.ts | 126 +++++++++++++++++++++++++++++++++-------- 1 file changed, 103 insertions(+), 23 deletions(-) (limited to 'packages/frontend/src/nirax.ts') diff --git a/packages/frontend/src/nirax.ts b/packages/frontend/src/nirax.ts index 9755bdcb18..a56aa6419e 100644 --- a/packages/frontend/src/nirax.ts +++ b/packages/frontend/src/nirax.ts @@ -5,11 +5,11 @@ // NIRAX --- A lightweight router -import { EventEmitter } from 'eventemitter3'; import { Component, onMounted, shallowRef, ShallowRef } from 'vue'; +import { EventEmitter } from 'eventemitter3'; import { safeURIDecode } from '@/scripts/safe-uri-decode.js'; -type RouteDef = { +export type RouteDef = { path: string; component: Component; query?: Record; @@ -27,6 +27,27 @@ type ParsedPath = (string | { optional?: boolean; })[]; +export type RouterEvent = { + change: (ctx: { + beforePath: string; + path: string; + resolved: Resolved; + key: string; + }) => void; + replace: (ctx: { + path: string; + key: string; + }) => void; + push: (ctx: { + beforePath: string; + path: string; + route: RouteDef | null; + props: Map | null; + key: string; + }) => void; + same: () => void; +} + export type Resolved = { route: RouteDef; props: Map; child?: Resolved; }; function parsePath(path: string): ParsedPath { @@ -54,26 +75,85 @@ function parsePath(path: string): ParsedPath { return res; } -export class Router extends EventEmitter<{ - change: (ctx: { - beforePath: string; - path: string; - resolved: Resolved; - key: string; - }) => void; - replace: (ctx: { - path: string; - key: string; - }) => void; - push: (ctx: { - beforePath: string; - path: string; - route: RouteDef | null; - props: Map | null; - key: string; - }) => void; - same: () => void; -}> { +export interface IRouter extends EventEmitter { + current: Resolved; + currentRef: ShallowRef; + currentRoute: ShallowRef; + navHook: ((path: string, flag?: any) => boolean) | null; + + resolve(path: string): Resolved | null; + + getCurrentPath(): any; + + getCurrentKey(): string; + + push(path: string, flag?: any): void; + + replace(path: string, key?: string | null): void; + + /** @see EventEmitter */ + eventNames(): Array>; + + /** @see EventEmitter */ + listeners>( + event: T + ): Array>; + + /** @see EventEmitter */ + listenerCount( + event: EventEmitter.EventNames + ): number; + + /** @see EventEmitter */ + emit>( + event: T, + ...args: EventEmitter.EventArgs + ): boolean; + + /** @see EventEmitter */ + on>( + event: T, + fn: EventEmitter.EventListener, + context?: any + ): this; + + /** @see EventEmitter */ + addListener>( + event: T, + fn: EventEmitter.EventListener, + context?: any + ): this; + + /** @see EventEmitter */ + once>( + event: T, + fn: EventEmitter.EventListener, + context?: any + ): this; + + /** @see EventEmitter */ + removeListener>( + event: T, + fn?: EventEmitter.EventListener, + context?: any, + once?: boolean | undefined + ): this; + + /** @see EventEmitter */ + off>( + event: T, + fn?: EventEmitter.EventListener, + context?: any, + once?: boolean | undefined + ): this; + + /** @see EventEmitter */ + removeAllListeners( + event?: EventEmitter.EventNames + ): this; +} + +export class Router extends EventEmitter implements IRouter { private routes: RouteDef[]; public current: Resolved; public currentRef: ShallowRef = shallowRef(); @@ -277,7 +357,7 @@ export class Router extends EventEmitter<{ } } -export function useScrollPositionManager(getScrollContainer: () => HTMLElement, router: Router) { +export function useScrollPositionManager(getScrollContainer: () => HTMLElement, router: IRouter) { const scrollPosStore = new Map(); onMounted(() => { -- cgit v1.2.3-freya