@iyulab/router 0.1.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/LICENSE +21 -0
- package/README.md +240 -0
- package/dist/main.cjs.js +32729 -0
- package/dist/main.d.ts +382 -0
- package/dist/main.es.js +32731 -0
- package/dist/main.umd.js +32729 -0
- package/package.json +52 -0
package/dist/main.d.ts
ADDED
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
import { ComponentType } from 'react';
|
|
2
|
+
import { CSSResult } from 'lit';
|
|
3
|
+
import { LitElement } from 'lit';
|
|
4
|
+
import { ReactWebComponent } from '@lit/react';
|
|
5
|
+
import { TemplateResult } from 'lit-html';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* 현재 경로상의 basepath를 반환합니다.
|
|
9
|
+
* @example
|
|
10
|
+
* catchBasePath('/app/:id') => '/app/123'
|
|
11
|
+
*/
|
|
12
|
+
export declare function catchBasepath(basepath: string): string;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* pathname 경로를 조합하여 반환합니다.
|
|
16
|
+
* - 절대 경로로 반환됩니다.
|
|
17
|
+
*/
|
|
18
|
+
export declare function combinePath(...paths: string[]): string;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* 랜덤한 ID를 생성합니다.
|
|
22
|
+
* - https일 경우 crypto.randomUUID()를 사용합니다.
|
|
23
|
+
* - 그 외의 경우 crypto.getRandomValues()를 사용합니다.
|
|
24
|
+
*/
|
|
25
|
+
export declare function getRandomID(): string;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* /foo/* -> /foo/bar/baz 와 같은 와일드카드 패턴을 처리하기 위한 함수
|
|
29
|
+
*/
|
|
30
|
+
export declare function getTailGroup(groups: {
|
|
31
|
+
[key: string]: string | undefined;
|
|
32
|
+
}): string | undefined;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* 인덱스 라우트는 path가 없는 라우트입니다.
|
|
36
|
+
*/
|
|
37
|
+
export declare type IndexRoute = {
|
|
38
|
+
/**
|
|
39
|
+
* 라우터의 basepath를 따르는 라우트입니다.
|
|
40
|
+
*/
|
|
41
|
+
index: true;
|
|
42
|
+
path?: undefined;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export declare const Link: ReactWebComponent<ULink, {}>;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* 인덱스 라우트가 아닌 라우트는 path가 필수입니다.
|
|
49
|
+
*/
|
|
50
|
+
export declare type NonIndexRoute = {
|
|
51
|
+
index?: undefined;
|
|
52
|
+
/**
|
|
53
|
+
* 라우터 경로는 URLPattern을 사용하여 비교합니다.
|
|
54
|
+
* @example
|
|
55
|
+
* - /user/:id/:name
|
|
56
|
+
* - /user/:id/:name?
|
|
57
|
+
* - /user/:id/:name*
|
|
58
|
+
* - /user/:id/:name+
|
|
59
|
+
* - /user/:id/:name{1,3}
|
|
60
|
+
* @link
|
|
61
|
+
* https://developer.mozilla.org/en-US/docs/Web/API/URLPattern
|
|
62
|
+
*/
|
|
63
|
+
path: string;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export declare const Outlet: ReactWebComponent<UOutlet, {}>;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* URL 문자열을 파싱하여 새로운 URL 정보를 반환합니다.
|
|
70
|
+
* - ?로 시작하는 쿼리스트링, #으로 시작하는 해시값은 현재 경로에서 추가됩니다.
|
|
71
|
+
* - 상대경로는 basepath를 기준으로 절대경로로 변환됩니다.
|
|
72
|
+
*/
|
|
73
|
+
export declare function parseURL(url: string, basepath: string): RouteInfo;
|
|
74
|
+
|
|
75
|
+
declare interface RenderComponentOption extends RenderOption {
|
|
76
|
+
component: ComponentType;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
declare interface RenderElementOption extends RenderOption {
|
|
80
|
+
element: typeof LitElement | string;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
declare interface RenderOption {
|
|
84
|
+
id?: string;
|
|
85
|
+
force?: boolean;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* 라우트 타입
|
|
90
|
+
*/
|
|
91
|
+
export declare type Route = (NonIndexRoute | IndexRoute) & {
|
|
92
|
+
/**
|
|
93
|
+
* 라우터에서 사용하는 식별자
|
|
94
|
+
*/
|
|
95
|
+
id?: string;
|
|
96
|
+
/**
|
|
97
|
+
* 라우터 URL 변경시 렌더링을 강제할지 여부
|
|
98
|
+
* - 기본값으로 children을 가질때 false로 설정되며, children이 없을 경우 true로 설정됩니다.
|
|
99
|
+
* - true로 설정하면 기존 렌더링을 무시하고 새로 렌더링합니다.
|
|
100
|
+
*/
|
|
101
|
+
force?: boolean;
|
|
102
|
+
/**
|
|
103
|
+
* 라우터에서 사용하는 URLPattern
|
|
104
|
+
*/
|
|
105
|
+
pattern?: URLPattern;
|
|
106
|
+
/**
|
|
107
|
+
* 엘리먼트 또는 컴포넌트를 렌더링하기 전에 호출되는 함수
|
|
108
|
+
* @param 라우터 URL 정보
|
|
109
|
+
*/
|
|
110
|
+
loader?: (url: RouteURL) => Promise<any>;
|
|
111
|
+
/**
|
|
112
|
+
* 브라우저의 타이틀이 설정에 따라 변경됩니다.
|
|
113
|
+
*/
|
|
114
|
+
title?: string;
|
|
115
|
+
/**
|
|
116
|
+
* 중첩 라우트
|
|
117
|
+
*/
|
|
118
|
+
children?: Route[];
|
|
119
|
+
/**
|
|
120
|
+
* 렌더링할 LitElement
|
|
121
|
+
* - LitElement 클래스 또는 태그 이름을 사용합니다.
|
|
122
|
+
* @example
|
|
123
|
+
* ```typescript
|
|
124
|
+
* import { UserPage } from './pages';
|
|
125
|
+
* const route = {
|
|
126
|
+
* path: '/user',
|
|
127
|
+
* element: 'user-page' | UserPage,
|
|
128
|
+
* }
|
|
129
|
+
* ```
|
|
130
|
+
*/
|
|
131
|
+
element?: typeof LitElement | string;
|
|
132
|
+
/**
|
|
133
|
+
* 렌더링할 ReactComponent
|
|
134
|
+
* - ReactComponent의 모듈을 사용합니다.
|
|
135
|
+
* @example
|
|
136
|
+
* ```typescript
|
|
137
|
+
* import { UserPage } from './pages';
|
|
138
|
+
* const route = {
|
|
139
|
+
* path: '/user',
|
|
140
|
+
* component: UserPage,
|
|
141
|
+
* }
|
|
142
|
+
* ```
|
|
143
|
+
*/
|
|
144
|
+
component?: ComponentType;
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* 라우터 정보
|
|
149
|
+
*/
|
|
150
|
+
export declare interface RouteInfo extends RouteURL {
|
|
151
|
+
/**
|
|
152
|
+
* 엘리먼트 또는 컴포넌트 렌더링 전에 호출되는 함수에서 반환된 데이터
|
|
153
|
+
*/
|
|
154
|
+
data?: any;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export declare class Router {
|
|
158
|
+
private readonly _rootElement;
|
|
159
|
+
private readonly _notfound;
|
|
160
|
+
private readonly _basepath;
|
|
161
|
+
private readonly _routes;
|
|
162
|
+
private _routeInfo?;
|
|
163
|
+
private requestID?;
|
|
164
|
+
get basepath(): string;
|
|
165
|
+
get routeInfo(): RouteInfo | undefined;
|
|
166
|
+
constructor(config: RouterConfig);
|
|
167
|
+
/**
|
|
168
|
+
* 라우터 연결
|
|
169
|
+
*/
|
|
170
|
+
connect(): void;
|
|
171
|
+
/**
|
|
172
|
+
* 라우터 연결 해제
|
|
173
|
+
*/
|
|
174
|
+
disconnect(): void;
|
|
175
|
+
/**
|
|
176
|
+
* 지정한 경로로 이동
|
|
177
|
+
* - 클라이언트 사이드 라우팅을 수행합니다.
|
|
178
|
+
* - 상대경로일 경우 basepath와 조합되어 이동합니다.
|
|
179
|
+
* - 라우터에 포함되지 않은 경로로 이동할 경우 다른 방법으로 처리하세요.
|
|
180
|
+
* @param href 이동할 경로
|
|
181
|
+
*/
|
|
182
|
+
go(href: string): Promise<void>;
|
|
183
|
+
/**
|
|
184
|
+
* 라우터 기본 경로로 이동
|
|
185
|
+
*/
|
|
186
|
+
goBase(): Promise<void>;
|
|
187
|
+
/**
|
|
188
|
+
* 라우트 URLPattern 생성
|
|
189
|
+
*/
|
|
190
|
+
private setRoutes;
|
|
191
|
+
/**
|
|
192
|
+
* URLPattern을 필요할 때 동적으로 생성
|
|
193
|
+
*/
|
|
194
|
+
private ensurePattern;
|
|
195
|
+
/**
|
|
196
|
+
* 경로와 일치하는 라우트를 찾습니다.
|
|
197
|
+
* URLPattern을 사용하여 경로를 비교하고 재귀적으로 자식 라우트도 검색합니다.
|
|
198
|
+
*/
|
|
199
|
+
private getRoutes;
|
|
200
|
+
/**
|
|
201
|
+
* 라우팅 진행률 Dispatch
|
|
202
|
+
*/
|
|
203
|
+
private dispatchProgress;
|
|
204
|
+
/**
|
|
205
|
+
* 브라우저 히스토리 이벤트가 발생했을 때 라우팅 처리
|
|
206
|
+
*/
|
|
207
|
+
private onPopstate;
|
|
208
|
+
/**
|
|
209
|
+
* Outlet 엘리먼트를 찾습니다.
|
|
210
|
+
*/
|
|
211
|
+
private getOutlet;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* 라우터 설정
|
|
216
|
+
*/
|
|
217
|
+
export declare interface RouterConfig {
|
|
218
|
+
/**
|
|
219
|
+
* 라우터가 연결될 최상위 엘리먼트
|
|
220
|
+
*/
|
|
221
|
+
root: HTMLElement;
|
|
222
|
+
/**
|
|
223
|
+
* 라우터의 기본 경로
|
|
224
|
+
* - 라우터의 기본 경로는 URL의 시작점입니다.
|
|
225
|
+
* - URLPattern을 사용하여 경로를 탐색합니다.
|
|
226
|
+
*/
|
|
227
|
+
basepath?: string;
|
|
228
|
+
/**
|
|
229
|
+
* 라우트 설정
|
|
230
|
+
* - 라우트는 URLPattern을 사용하여 경로를 탐색합니다.
|
|
231
|
+
* - 라우트는 렌더링할 엘리먼트 또는 컴포넌트를 지정합니다.
|
|
232
|
+
*/
|
|
233
|
+
routes: Route[];
|
|
234
|
+
/**
|
|
235
|
+
* 라우터가 URL을 찾지 못했을 때 렌더링할 엘리먼트
|
|
236
|
+
*/
|
|
237
|
+
notfound: typeof LitElement | string;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* 라우터 URL 정보
|
|
242
|
+
*/
|
|
243
|
+
export declare interface RouteURL {
|
|
244
|
+
/**
|
|
245
|
+
* 전체 URL 정보
|
|
246
|
+
* - 도메인 이름을 포함한 URL의 전체 경로입니다.
|
|
247
|
+
* @example https://www.iyulab.com/home/user/1?name=iyu#profile
|
|
248
|
+
*/
|
|
249
|
+
href: string;
|
|
250
|
+
/**
|
|
251
|
+
* URL 도메인 이름
|
|
252
|
+
* - URL의 도메인 이름입니다.
|
|
253
|
+
* @example https://www.iyulab.com
|
|
254
|
+
*/
|
|
255
|
+
origin: string;
|
|
256
|
+
/**
|
|
257
|
+
* 라우터 URL 기본 경로
|
|
258
|
+
* - 라우터의 현재 basepath입니다.
|
|
259
|
+
* @example
|
|
260
|
+
* if basepath is /app/:id
|
|
261
|
+
* set basepath to /app/123
|
|
262
|
+
*/
|
|
263
|
+
basepath: string;
|
|
264
|
+
/**
|
|
265
|
+
* 라우터 URL 전체 경로
|
|
266
|
+
* - 도메인 이름을 제외한 URL의 전체 경로입니다.
|
|
267
|
+
* @example /home/user/1?name=iyu#profile
|
|
268
|
+
*/
|
|
269
|
+
path: string;
|
|
270
|
+
/**
|
|
271
|
+
* 라우터 URL 절대 경로
|
|
272
|
+
* - 쿼리스트링과 해시를 제외한 URL 경로입니다.
|
|
273
|
+
* @example /home/user/1
|
|
274
|
+
*/
|
|
275
|
+
pathname: string;
|
|
276
|
+
/**
|
|
277
|
+
* 라우터 URL 파라미터
|
|
278
|
+
* - URLPattern을 사용하여 파싱된 파라미터입니다.
|
|
279
|
+
* @example 만약 URL이 /user/:id/:name 일경우
|
|
280
|
+
* ```typescript
|
|
281
|
+
* const id = params.id;
|
|
282
|
+
* const name = params.name;
|
|
283
|
+
* ```
|
|
284
|
+
*/
|
|
285
|
+
params: {
|
|
286
|
+
[key: string]: string | undefined;
|
|
287
|
+
};
|
|
288
|
+
/**
|
|
289
|
+
* 라우터 URL 쿼리스트링
|
|
290
|
+
* - URLSearchParams를 사용하여 파싱된 쿼리스트링입니다.
|
|
291
|
+
* @example 만약 URL이 ?page=1&size=10 일경우
|
|
292
|
+
* ```typescript
|
|
293
|
+
* const page = query.get('page');
|
|
294
|
+
* const size = query.get('size');
|
|
295
|
+
* ```
|
|
296
|
+
*/
|
|
297
|
+
query: URLSearchParams;
|
|
298
|
+
/**
|
|
299
|
+
* 라우터 URL 해시
|
|
300
|
+
* - URL의 해시값입니다. 해시값은 하나만 사용할 수 있습니다.
|
|
301
|
+
* - #profile#user 두개 이상의 해시값은 하나로 취급합니다.
|
|
302
|
+
* @example #profile
|
|
303
|
+
*/
|
|
304
|
+
hash?: string;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
export declare class ULink extends LitElement {
|
|
308
|
+
private static externalLinks;
|
|
309
|
+
private isExternalLink;
|
|
310
|
+
/**
|
|
311
|
+
* a 태그의 href 속성 및 새로운 페이지로 이동할 때 사용될 링크입니다.
|
|
312
|
+
*/
|
|
313
|
+
link: string;
|
|
314
|
+
/**
|
|
315
|
+
* - 속성을 정의하지 않으면 basepath로 이동합니다.
|
|
316
|
+
* - http 로 시작하면 새로운 페이지를 로드합니다.
|
|
317
|
+
* - 절대경로일 경우 basepath로 시작하면 클라이언트 라우팅을 합니다. 그렇지 않으면 새로운 페이지를 로드합니다.
|
|
318
|
+
* - 상대경로로 시작하면 (현재의 basepath + 상대경로)로 클라이언트 라우팅을 합니다.
|
|
319
|
+
* - ?로 시작하면 현재 경로에 쿼리스트링을 추가하고, 클라이언트 라우팅을 합니다.
|
|
320
|
+
* - #으로 시작하면 현재 경로에 해시를 추가하고, hashchange 이벤트를 발생시킵니다.
|
|
321
|
+
*/
|
|
322
|
+
href?: string;
|
|
323
|
+
connectedCallback(): void;
|
|
324
|
+
disconnectedCallback(): void;
|
|
325
|
+
protected updated(changedProperties: any): Promise<void>;
|
|
326
|
+
render(): TemplateResult<1>;
|
|
327
|
+
/**
|
|
328
|
+
* 링크 엘리먼트의 마우스 이벤트 핸들러
|
|
329
|
+
* - 새로운 탭에서 열기: 마우스 중간 버튼 또는 Ctrl 키를 누릅니다.
|
|
330
|
+
* - 새로운 페이지로 이동: http로 시작하거나 절대경로일 경우 새로운 페이지로 이동합니다.
|
|
331
|
+
* - 클라이언트 라우팅: 상대경로로 시작하면 클라이언트 라우팅을 합니다.
|
|
332
|
+
*/
|
|
333
|
+
private handleMouseEvent;
|
|
334
|
+
/**
|
|
335
|
+
* 클라이언트 라우팅을 위해 popstate 이벤트를 발생시킵니다.
|
|
336
|
+
*/
|
|
337
|
+
private dispatchPopstate;
|
|
338
|
+
/**
|
|
339
|
+
* 클라이언트 라우팅을 위해 hashchange 이벤트를 발생시킵니다.
|
|
340
|
+
* - 해시이벤트를 받으면 현재 페이지에서 해당 태그위치로 스크롤합니다.
|
|
341
|
+
* - 스크롤 조절은 따로 구현해야 합니다.
|
|
342
|
+
*/
|
|
343
|
+
private dispatchHashchange;
|
|
344
|
+
/**
|
|
345
|
+
* link로 사용할 URL을 반환합니다.
|
|
346
|
+
*/
|
|
347
|
+
private getLink;
|
|
348
|
+
/**
|
|
349
|
+
* 기본 a 태그의 클릭 이벤트를 막습니다.
|
|
350
|
+
*/
|
|
351
|
+
private preventClickEvent;
|
|
352
|
+
/**
|
|
353
|
+
* 외부 링크인지 확인합니다.
|
|
354
|
+
*/
|
|
355
|
+
private checkExternalLink;
|
|
356
|
+
static styles: CSSResult;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
export declare class UOutlet extends LitElement {
|
|
360
|
+
private routeId?;
|
|
361
|
+
private root?;
|
|
362
|
+
private reactRoot?;
|
|
363
|
+
private litRoot?;
|
|
364
|
+
protected createRenderRoot(): this;
|
|
365
|
+
render(): TemplateResult<1>;
|
|
366
|
+
/**
|
|
367
|
+
* 기존 렌더링된 DOM을 제거하고, LitElement를 삽입합니다.
|
|
368
|
+
* - 이전 ID와 동일하고, 강제 렌더링이 아닌 경우, 이전 DOM을 반환합니다.
|
|
369
|
+
*/
|
|
370
|
+
renderElement({ id, element, force }: RenderElementOption): Promise<Element | null | undefined>;
|
|
371
|
+
/**
|
|
372
|
+
* 기존 렌더링된 DOM을 제거하고, React 컴포넌트를 삽입합니다.
|
|
373
|
+
* - 이전 ID와 동일하고, 강제 렌더링이 아닌 경우, 이전 DOM을 반환합니다.
|
|
374
|
+
*/
|
|
375
|
+
renderComponent({ id, component, force }: RenderComponentOption): Promise<HTMLDivElement | undefined>;
|
|
376
|
+
/**
|
|
377
|
+
* 기존 DOM을 라이프 사이클에 맞게 제거합니다.
|
|
378
|
+
*/
|
|
379
|
+
clearRoot(): void;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
export { }
|