@iyulab/router 0.15.1 → 0.15.2

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.
@@ -1,151 +0,0 @@
1
- import { RouteContext, FallbackRouteContext } from './RouteContext';
2
- /**
3
- * 공통 라우트 속성
4
- */
5
- interface BaseRouteConfig {
6
- /**
7
- * 라우터에서 사용하는 식별자
8
- */
9
- id?: string;
10
- /**
11
- * 브라우저의 타이틀이 설정에 따라 변경됩니다.
12
- */
13
- title?: string;
14
- /**
15
- * 라우터 경로는 string 또는 URLPattern을 사용할 수 있습니다.
16
- * string일 경우 자동으로 URLPattern으로 변환됩니다.
17
- * @default '/'
18
- * @example
19
- * - "/user/:id/:name"
20
- * - "/user/:id/:name?"
21
- * - "/user/:id/:name*"
22
- * - "/user/:id/:name+"
23
- * @link
24
- * https://developer.mozilla.org/en-US/docs/Web/API/URLPattern
25
- */
26
- path?: string | URLPattern;
27
- /**
28
- * 라우트 정보를 받아 렌더링 결과를 반환합니다.
29
- * @param ctx 현재 라우팅 정보 및, 진행 상태 콜백을 포함하는 Context 객체가 인자로 전달됩니다.
30
- * @example
31
- * ```typescript
32
- * const route = {
33
- * path: '/user:id',
34
- * render: async (ctx) => {
35
- * // 사용자 정보를 비동기로 가져오는 예시
36
- * const userId = ctx.params.id;
37
- * ctx.progress(30);
38
- * const userData = await fetchUserData(userId);
39
- * ctx.progress(70);
40
- * return html`<user-profile .data=${userData}></user-profile>`;
41
- * }
42
- * }
43
- * ```
44
- * @remarks
45
- * `render`는 Lit `TemplateResult`, `HTMLElement`, **또는 React 엘리먼트**를 반환할 수 있습니다.
46
- * React 엘리먼트를 직접 반환하면 내부 `<u-outlet>`이 `createRoot`/`root.unmount()`를
47
- * 자동으로 관리합니다 — React 루트를 직접 만들어 컨테이너 `HTMLElement`로 감싸 반환하면
48
- * 이 자동 해제 지점을 우회하게 되어 라우트 전환마다 unmount가 호출되지 않는 누수가 생깁니다.
49
- * @example
50
- * ```tsx
51
- * const route = {
52
- * path: '/users/:id',
53
- * render: (ctx) => <UserProfilePage userId={ctx.params.id} />, // React 엘리먼트를 직접 반환
54
- * };
55
- * ```
56
- */
57
- render?: (ctx: RouteContext) => Promise<unknown> | unknown;
58
- /**
59
- * 이 라우트 진입 전에 호출되는 enter 함수입니다.
60
- * - `string` 반환: 해당 경로로 redirect
61
- * - `false` 반환: 네비게이션 취소
62
- * - `true` 반환: 통과
63
- * @example
64
- * ```typescript
65
- * { path: '/admin', enter: (ctx) => ctx.metadata.role === 'admin' || '/forbidden' }
66
- * ```
67
- */
68
- enter?: (ctx: RouteContext) => Promise<string | boolean> | string | boolean;
69
- /**
70
- * 이 라우트의 콘텐츠를 **언제 새로 만들 것인가**를 정하는 식별 키입니다.
71
- *
72
- * 네비게이션마다 `key(ctx)`를 계산해 직전 값과 비교합니다.
73
- * - 키가 **바뀌면** 기존 콘텐츠를 내리고 새로 마운트합니다.
74
- * - 키가 **같으면** 콘텐츠를 유지한 채 `render(ctx)`의 결과로 **제자리 갱신**합니다 —
75
- * Lit 템플릿은 같은 파트에 다시 렌더(DOM·요소 상태 유지, 바인딩만 갱신), React 엘리먼트는
76
- * 같은 root에 다시 렌더(컴포넌트 상태 유지, props만 갱신), `HTMLElement`는 기존 인스턴스를
77
- * 그대로 둡니다(조정할 수단이 없습니다). 새 `ctx`는 따로 전달되지 않고 `render(ctx)`를
78
- * 통해 도달합니다.
79
- *
80
- * 기본값: 자식 라우트가 없으면 `ctx => ctx.href`(URL이 조금이라도 바뀌면 새로), 자식 라우트가
81
- * 있으면 상수(레이아웃은 유지하고 자식만 바뀝니다).
82
- *
83
- * @example
84
- * ```typescript
85
- * // 쿼리스트링만 바뀌면 페이지를 유지하고 prop만 갱신 — 목록 상태·스크롤이 살아남습니다
86
- * { path: '/orders', key: ctx => ctx.pathname,
87
- * render: ctx => html`<orders-page .selectedId=${ctx.query.get('id')}></orders-page>` }
88
- * // params가 바뀌어도 유지
89
- * { path: '/orders/:id', key: () => 'orders', render: ctx => html`...` }
90
- * ```
91
- */
92
- key?: (ctx: RouteContext) => string;
93
- /**
94
- * 경로 매칭시 대소문자 구분 여부
95
- * @default false
96
- */
97
- ignoreCase?: boolean;
98
- /**
99
- * 라우트에 연결할 메타데이터
100
- * - 인증, SEO, 분석 등의 용도로 사용할 수 있습니다.
101
- * @example
102
- * ```typescript
103
- * { path: '/admin', metadata: { requiresAuth: true, role: 'admin' } }
104
- * ```
105
- */
106
- metadata?: Record<string, unknown>;
107
- }
108
- interface IndexRouteConfig extends BaseRouteConfig {
109
- /**
110
- * 현재 경로의 인덱스 라우트임을 나타냅니다.
111
- * - 인덱스 라우트는 부모 경로와 동일한 경로를 가지며, path는 자동으로 설정됩니다.
112
- */
113
- index: true;
114
- }
115
- interface NonIndexRouteConfig extends BaseRouteConfig {
116
- /**
117
- * 인덱스 라우트가 아님을 나타냅니다.
118
- */
119
- index?: false;
120
- /**
121
- * 하위 라우트 설정, 재귀적으로 RouteConfig 배열을 가질 수 있습니다.
122
- * - 하위 라우트가 있는 경우, 부모 라우트의 경로를 기준으로 매칭됩니다.
123
- */
124
- children?: RouteConfig[];
125
- }
126
- export type RouteConfig = IndexRouteConfig | NonIndexRouteConfig;
127
- export interface FallbackRouteConfig {
128
- /**
129
- * 브라우저의 타이틀이 설정에 따라 변경됩니다.
130
- */
131
- title?: string;
132
- /**
133
- * 라우팅 실패 시 표시할 렌더링 결과를 반환합니다.
134
- * - 오류가 발생할 경우 또는 렌더링 결과가 false일 경우 호출됩니다.
135
- * @param ctx 현재 라우팅 정보 및 오류 정보를 포함하는 Context 객체가 인자로 전달됩니다.
136
- * @example
137
- * ```typescript
138
- * const fallbackRoute = {
139
- * title: 'Not Found',
140
- * render: (ctx) => {
141
- * if (ctx.error) {
142
- * return html`<error-page .error=${ctx.error}></error-page>`;
143
- * }
144
- * return html`<not-found-page></not-found-page>`;
145
- * }
146
- * }
147
- * ```
148
- */
149
- render?: (ctx: FallbackRouteContext) => Promise<unknown> | unknown;
150
- }
151
- export {};
@@ -1,85 +0,0 @@
1
- import { RouteError } from './RouteError';
2
- /**
3
- * 라우터 정보
4
- */
5
- export interface RouteContext {
6
- /**
7
- * 전체 URL 정보
8
- * - 도메인 이름을 포함한 URL의 전체 경로입니다.
9
- * @example https://www.iyulab.com/home/user/1?name=iyu#profile
10
- */
11
- href: string;
12
- /**
13
- * URL 도메인 이름
14
- * - URL의 도메인 이름입니다.
15
- * @example https://www.iyulab.com
16
- */
17
- origin: string;
18
- /**
19
- * 라우터 URL 기본 경로
20
- * - 라우터의 현재 basepath입니다.
21
- * @example
22
- * if basepath is /app/:id
23
- * set basepath to /app/123
24
- */
25
- basepath: string;
26
- /**
27
- * 라우터 URL 전체 경로
28
- * - 도메인 이름을 제외한 URL의 전체 경로입니다.
29
- * @example /home/user/1?name=iyu#profile
30
- */
31
- path: string;
32
- /**
33
- * 라우터 URL 절대 경로
34
- * - 쿼리스트링과 해시를 제외한 URL 경로입니다.
35
- * @example /home/user/1
36
- */
37
- pathname: string;
38
- /**
39
- * 라우터 URL 파라미터
40
- * - URLPattern을 사용하여 파싱된 파라미터입니다.
41
- * @example 만약 URL이 /user/:id/:name 일경우
42
- * ```typescript
43
- * const id = params.id;
44
- * const name = params.name;
45
- * ```
46
- */
47
- params: {
48
- [key: string]: string | undefined;
49
- };
50
- /**
51
- * 라우터 URL 쿼리스트링
52
- * - URLSearchParams를 사용하여 파싱된 쿼리스트링입니다.
53
- * @example 만약 URL이 ?page=1&size=10 일경우
54
- * ```typescript
55
- * const page = query.get('page');
56
- * const size = query.get('size');
57
- * ```
58
- */
59
- query: URLSearchParams;
60
- /**
61
- * 라우터 URL 해시
62
- * - URL의 해시값입니다. 해시값은 하나만 사용할 수 있습니다.
63
- * - #profile#user 두개 이상의 해시값은 하나로 취급합니다.
64
- * @example #profile
65
- */
66
- hash?: string;
67
- /**
68
- * 현재 라우팅의 진행 상태를 업데이트하여, window 객체의 'route-progress' 이벤트를 트리거합니다.
69
- * 여러 라우팅이 호출되는 경우, 가장 최근의 라우팅의 진행 상태만 반영되며, 나머지는 무시됩니다.
70
- * @param value 진행 상태 값 (0~100)
71
- */
72
- progress: (value: number) => void;
73
- /**
74
- * 매칭된 라우트 체인의 병합된 메타데이터
75
- * - 부모 라우트에서 자식 라우트 순서로 병합됩니다.
76
- */
77
- metadata: Record<string, unknown>;
78
- }
79
- export interface FallbackRouteContext extends RouteContext {
80
- /**
81
- * 라우팅 에러 정보
82
- * - 라우팅 중 발생한 에러 정보를 포함합니다.
83
- */
84
- error: RouteError;
85
- }
@@ -1,52 +0,0 @@
1
- /**
2
- * 라우팅 에러 정보
3
- */
4
- export declare class RouteError extends Error {
5
- /**
6
- * 에러 코드
7
- * - HTTP 상태 코드 또는 커스텀 에러 코드
8
- * @example 404, 500, 'ROUTE_NOT_FOUND'
9
- */
10
- code: number | string;
11
- /**
12
- * 원본 에러 객체
13
- * - 원본 Error 객체 또는 예외 정보
14
- */
15
- original?: Error | any;
16
- /**
17
- * 에러 발생 시간
18
- * - 에러가 발생한 시간 (ISO 8601 형식)
19
- */
20
- timestamp: string;
21
- constructor(code: number | string, message: string, original?: Error | any);
22
- }
23
- /**
24
- * 페이지를 찾을 수 없을 때 발생하는 에러
25
- */
26
- export declare class NotFoundError extends RouteError {
27
- constructor(path: string, original?: Error | any);
28
- }
29
- /**
30
- * enter 가드가 false를 반환하여 접근이 거부되었을 때 발생하는 에러
31
- */
32
- export declare class AccessDeniedError extends RouteError {
33
- constructor(path: string);
34
- }
35
- /**
36
- * u-outlet 요소를 찾을 수 없을 때 발생하는 에러
37
- */
38
- export declare class OutletMissingError extends RouteError {
39
- constructor();
40
- }
41
- /**
42
- * 컨텐츠 로드시 나타나는 에러
43
- */
44
- export declare class ContentLoadError extends RouteError {
45
- constructor(original?: Error | any);
46
- }
47
- /**
48
- * 컨텐츠 렌더링시 발생하는 에러
49
- */
50
- export declare class ContentRenderError extends RouteError {
51
- constructor(original?: Error | any);
52
- }
@@ -1,54 +0,0 @@
1
- import { RouteContext } from './RouteContext';
2
- import { RouteError } from './RouteError';
3
- /** 라우터 이벤트 기본 클래스 */
4
- declare abstract class RouteEvent extends Event {
5
- /** 라우팅 정보 */
6
- readonly context: RouteContext;
7
- /** 이벤트 발생 시간 */
8
- readonly timestamp: string;
9
- constructor(type: string, context: RouteContext, cancelable?: boolean);
10
- /** 이벤트가 취소되었는지 확인 */
11
- get cancelled(): boolean;
12
- /** 이벤트 취소 */
13
- cancel(): void;
14
- }
15
- /**
16
- * 라우트 시작 이벤트
17
- */
18
- export declare class RouteBeginEvent extends RouteEvent {
19
- constructor(context: RouteContext);
20
- }
21
- /**
22
- * 라우트 진행 이벤트
23
- */
24
- export declare class RouteProgressEvent extends RouteEvent {
25
- /** 진행 상태 값 (0~100) */
26
- readonly progress: number;
27
- constructor(context: RouteContext, progress: number);
28
- }
29
- /**
30
- * 라우트 완료 이벤트
31
- */
32
- export declare class RouteDoneEvent extends RouteEvent {
33
- constructor(context: RouteContext);
34
- }
35
- /**
36
- * 라우트 에러 이벤트
37
- */
38
- export declare class RouteErrorEvent extends RouteEvent {
39
- /** 에러 정보 */
40
- readonly error: RouteError;
41
- constructor(context: RouteContext, error: RouteError);
42
- }
43
- /**
44
- * 전역 WindowEventMap에 라우터 이벤트 타입
45
- */
46
- declare global {
47
- interface WindowEventMap {
48
- 'route-begin': RouteBeginEvent;
49
- 'route-progress': RouteProgressEvent;
50
- 'route-done': RouteDoneEvent;
51
- 'route-error': RouteErrorEvent;
52
- }
53
- }
54
- export {};
@@ -1,52 +0,0 @@
1
- import { FallbackRouteConfig, RouteConfig } from './RouteConfig';
2
- import { RouteContext } from './RouteContext';
3
- /**
4
- * 라우터 설정
5
- */
6
- export interface RouterConfig {
7
- /**
8
- * 라우터가 연결될 최상위 엘리먼트
9
- */
10
- root: HTMLElement;
11
- /**
12
- * 라우터의 기본 경로
13
- * - 라우터의 기본 경로는 URL의 시작점입니다.
14
- * - URLPattern을 사용하여 경로를 탐색합니다.
15
- * @default '/'
16
- */
17
- basepath?: string;
18
- /**
19
- * 라우트 설정
20
- * - 라우트는 URLPattern을 사용하여 경로를 탐색합니다.
21
- * - 라우트는 렌더링할 엘리먼트 또는 컴포넌트를 지정합니다.
22
- */
23
- routes?: RouteConfig[];
24
- /**
25
- * 모든 라우트 전환 전에 호출되는 글로벌 enter 함수입니다.
26
- * - `string` 반환: 해당 경로로 redirect
27
- * - `false` 반환: 네비게이션 취소
28
- * - `true` 반환: 통과
29
- * @example
30
- * ```typescript
31
- * enter: async (ctx) => {
32
- * if (!isAuthenticated() && ctx.pathname !== '/login') return '/login';
33
- * }
34
- * ```
35
- */
36
- enter?: (ctx: RouteContext) => Promise<string | boolean> | string | boolean;
37
- /**
38
- * 라우트 매칭 실패 또는 오류 발생 시 대체 라우트 설정
39
- * - 지정된 설정이 없을 경우, 기본 오류 페이지가 렌더링됩니다.
40
- */
41
- fallback?: FallbackRouteConfig;
42
- /**
43
- * `a` 태그 클릭 시 클라이언트 라우팅을 수행할지 여부를 설정합니다.
44
- * @default true
45
- */
46
- useIntercept?: boolean;
47
- /**
48
- * 초기 로드 시 현재 URL로 라우팅을 자동으로 수행할지 여부를 설정합니다.
49
- * @default true
50
- */
51
- initialLoad?: boolean;
52
- }