@iyulab/router 0.9.2 → 0.10.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/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.10.0] - 2026-06-11
4
+
5
+ ### Changed
6
+ - Click interception now checks route matching before `preventDefault()`: same-origin anchors that do not match any registered route are passed through to native browser navigation instead of rendering the fallback (soft-404). This fixes apps with `basepath: '/'` greedily intercepting every same-origin link — e.g. cross-app links on a shared host (ISSUE-1781049600-router-basepath-root-greedy-intercept)
7
+
8
+ ### Added
9
+ - Vitest-based test infrastructure (`npm test`) with coverage for anchor click interception behavior
10
+
11
+ ## [0.9.3] - 2026-04-24
12
+
13
+ ### Fixed
14
+ - Document click handler now scopes interception to the router's `_rootElement` instead of `document`, preventing accidental capture of clicks outside the router's DOM subtree
15
+ - Click handler no longer intercepts same-origin anchors pointing outside `basepath` — when `basepath` is not `/`, links targeting paths outside the basepath are passed through to browser navigation instead of falling through to the fallback route
16
+
3
17
  ## [0.9.2] - 2026-04-13
4
18
 
5
19
  ### Fixed
@@ -0,0 +1,38 @@
1
+ import { RouteContext } from './types/RouteContext.js';
2
+ import { RouterConfig } from './types/RouterConfig.js';
3
+ import { RouteConfig } from './types/RouteConfig.js';
4
+ import { NavigateOptions } from './types/NavigateOptions.js';
5
+ /**
6
+ * `lit-element`, `react`를 지원하는 SPA 클라이언트 라우터 객체입니다.
7
+ */
8
+ export declare class Router {
9
+ private readonly _rootElement;
10
+ private readonly _basepath;
11
+ private readonly _routes;
12
+ private readonly _fallback?;
13
+ private readonly _enter?;
14
+ private readonly _tracker;
15
+ /** 현재 라우팅 요청 ID */
16
+ private _requestID?;
17
+ /** 현재 라우팅 정보 */
18
+ private _context?;
19
+ constructor(config: RouterConfig);
20
+ /** 객체를 정리하고 이벤트 리스너를 제거합니다. */
21
+ destroy(): void;
22
+ /** 라우터의 기본 경로 반환 */
23
+ get basepath(): string;
24
+ /** 등록된 라우트 정보 반환 */
25
+ get routes(): RouteConfig[];
26
+ /** 현재 라우팅 정보 반환 */
27
+ get context(): RouteContext | undefined;
28
+ /**
29
+ * 지정한 경로의 클라이언트 라우팅을 수행합니다. 상대경로일 경우 basepath와 조합되어 이동합니다.
30
+ * @param href 이동할 경로
31
+ * @param options 네비게이션 옵션
32
+ */
33
+ go(href: string, options?: NavigateOptions): Promise<undefined>;
34
+ /** 브라우저 히스토리 이벤트가 발생시 라우팅 처리 */
35
+ private handleWindowPopstate;
36
+ /** 클릭 이벤트에서 라우터로 처리할 앵커를 찾아 클라이언트 라우팅 수행 */
37
+ private handleRootElementClick;
38
+ }
@@ -0,0 +1,16 @@
1
+ import { LitElement } from 'lit';
2
+ import { RouteError } from '../types/RouteError.js';
3
+ /**
4
+ * 라우팅 중 발생한 에러 정보를 사용자에게 전달하기 위한 기본 컴포넌트 입니다.
5
+ */
6
+ export declare class UErrorPage extends LitElement {
7
+ constructor(error?: RouteError);
8
+ /** 표시할 에러 정보 */
9
+ error?: RouteError;
10
+ render(): import('lit-html').TemplateResult<1>;
11
+ /** 기본 에러 정보 반환 */
12
+ private getDefaultError;
13
+ /** 에러 코드에 따른 기본 아이콘 반환 */
14
+ private getErrorIcon;
15
+ static styles: import('lit').CSSResult;
16
+ }
@@ -0,0 +1,57 @@
1
+ import { LitElement, PropertyValues } from 'lit';
2
+ /**
3
+ * - 클라이언트 라우팅을 지원하는 링크 엘리먼트입니다.
4
+ * - 내부 링크는 클라이언트 라우팅을 수행하고, 외부 링크는 브라우저 기본 네비게이션을 사용합니다.
5
+ * - Ctrl/Meta/Shift/Alt, 중클릭/우클릭 등은 브라우저 기본 동작(새 탭, 컨텍스트 메뉴 등)을 그대로 유지합니다.
6
+ */
7
+ export declare class ULink extends LitElement {
8
+ /** 외부 링크 여부 */
9
+ private isExternal;
10
+ /**
11
+ * 링크 대상 target 속성
12
+ *
13
+ * - `_self`: 현재 창에서 링크 열기 (기본값)
14
+ * - `_blank`: 새 탭/창에서 링크 열기
15
+ * - `_parent`: 부모 프레임에서 링크 열기
16
+ * - `_top`: 최상위 프레임에서 링크 열기
17
+ */
18
+ target?: string;
19
+ /**
20
+ * 링크 관계 rel 속성
21
+ *
22
+ * - `noopener`: target이 _blank인 경우 보안 강화 (window.opener 차단)
23
+ * - `noreferrer`: target이 _blank인 경우 보안 강화 + Referer 헤더 제거
24
+ * - `external`: 외부 링크임을 명시 (SEO/접근성에 도움)
25
+ * - `nofollow`: 검색 엔진이 링크를 따라가지 않도록 지시 (SEO에 영향)
26
+ * - 그 외 rel 값도 그대로 전달됩니다.
27
+ */
28
+ rel?: string;
29
+ /**
30
+ * 링크 대상 URL, 다음 사항에 따라 SPA 라우팅 또는 브라우저 네비게이션이 결정됩니다.
31
+ *
32
+ * - 속성을 정의하지 않으면 설정에서 지정한 `basepath`로 SPA 라우팅합니다.
33
+ * - http(s)로 시작하면 외부 링크로 간주하고 브라우저 네비게이션을 사용합니다.
34
+ * - 절대경로(/...)의 경우 `basepath`로 시작하면 SPA 라우팅합니다, 이외 브라우저 네비게이션을 사용합니다.
35
+ * - 상대경로는 (basepath + 상대경로)로 결합하여 SPA 라우팅합니다.
36
+ * - ?로 시작하면 현재 경로에 쿼리스트링을 추가하여 SPA 라우팅합니다.
37
+ * - #으로 시작하면 브라우저 기본 동작을 사용합니다.
38
+ */
39
+ href?: string;
40
+ connectedCallback(): void;
41
+ disconnectedCallback(): void;
42
+ protected willUpdate(changedProperties: PropertyValues): void;
43
+ render(): import('lit-html').TemplateResult<1>;
44
+ /** a 태그에 주입할 href 값을 계산합니다. */
45
+ private compute;
46
+ /**
47
+ * 클릭 가로채기 핸들러
48
+ * - 좌클릭(0) + 보조키 없음(ctrl/meta/shift/alt 없음) + target이 _self일 때만 SPA 라우팅 고려
49
+ * - 그 외(중클릭/우클릭/보조키/target=_blank 등)는 브라우저 기본 동작 유지
50
+ */
51
+ private handleClick;
52
+ /** 클라이언트 라우팅을 위해 popstate 이벤트를 발생시킵니다. */
53
+ private dispatchPopstate;
54
+ /** basepath를 state에서 꺼내는 헬퍼 */
55
+ private getBasepath;
56
+ static styles: import('lit').CSSResult;
57
+ }
@@ -0,0 +1,30 @@
1
+ /** 렌더링 옵션 */
2
+ interface RenderOption {
3
+ /** 교차 렌더링 방지 ID */
4
+ id?: string;
5
+ /** 강제 렌더링 여부 */
6
+ force?: boolean;
7
+ }
8
+ /**
9
+ * LitElement 또는 React 컴포넌트를 렌더링해주는 웹컴포넌트 입니다.
10
+ */
11
+ declare class UOutlet extends HTMLElement {
12
+ /** 교차 렌더링 방지 id */
13
+ private routeId?;
14
+ /** 실제 렌더링 컨텐츠 */
15
+ private root?;
16
+ /**
17
+ * 주어진 렌더링 옵션에 따라 컨텐츠를 렌더링합니다.
18
+ */
19
+ render(value: unknown, options?: RenderOption): Promise<void>;
20
+ /**
21
+ * 기존 DOM을 삭제하여, 초기 상태로 되돌립니다.
22
+ */
23
+ reset(): void;
24
+ }
25
+ declare global {
26
+ interface HTMLElementTagNameMap {
27
+ 'u-outlet': UOutlet;
28
+ }
29
+ }
30
+ export { UOutlet };
package/dist/index.d.ts CHANGED
@@ -1,517 +1,12 @@
1
- import { CSSResult } from 'lit';
2
- import { LitElement } from 'lit';
3
- import { PropertyValues } from 'lit';
4
- import { TemplateResult } from 'lit-html';
5
-
6
- /**
7
- * enter 가드가 false를 반환하여 접근이 거부되었을 때 발생하는 에러
8
- */
9
- export declare class AccessDeniedError extends RouteError {
10
- constructor(path: string);
11
- }
12
-
13
- /**
14
- * 공통 라우트 속성
15
- */
16
- declare interface BaseRouteConfig {
17
- /**
18
- * 라우터에서 사용하는 식별자
19
- */
20
- id?: string;
21
- /**
22
- * 브라우저의 타이틀이 설정에 따라 변경됩니다.
23
- */
24
- title?: string;
25
- /**
26
- * 라우터 경로는 string 또는 URLPattern을 사용할 수 있습니다.
27
- * string일 경우 자동으로 URLPattern으로 변환됩니다.
28
- * @default '/'
29
- * @example
30
- * - "/user/:id/:name"
31
- * - "/user/:id/:name?"
32
- * - "/user/:id/:name*"
33
- * - "/user/:id/:name+"
34
- * @link
35
- * https://developer.mozilla.org/en-US/docs/Web/API/URLPattern
36
- */
37
- path?: string | URLPattern;
38
- /**
39
- * 라우트 정보를 받아 렌더링 결과를 반환합니다.
40
- * @param ctx 현재 라우팅 정보 및, 진행 상태 콜백을 포함하는 Context 객체가 인자로 전달됩니다.
41
- * @example
42
- * ```typescript
43
- * const route = {
44
- * path: '/user:id',
45
- * render: async (ctx) => {
46
- * // 사용자 정보를 비동기로 가져오는 예시
47
- * const userId = ctx.params.id;
48
- * ctx.progress(30);
49
- * const userData = await fetchUserData(userId);
50
- * ctx.progress(70);
51
- * return html`<user-profile .data=${userData}></user-profile>`;
52
- * }
53
- * }
54
- * ```
55
- */
56
- render?: (ctx: RouteContext) => Promise<unknown> | unknown;
57
- /**
58
- * 이 라우트 진입 전에 호출되는 enter 함수입니다.
59
- * - `string` 반환: 해당 경로로 redirect
60
- * - `false` 반환: 네비게이션 취소
61
- * - `true` 반환: 통과
62
- * @example
63
- * ```typescript
64
- * { path: '/admin', enter: (ctx) => ctx.metadata.role === 'admin' || '/forbidden' }
65
- * ```
66
- */
67
- enter?: (ctx: RouteContext) => Promise<string | boolean> | string | boolean;
68
- /**
69
- * 라우터 URL 변경시 렌더링을 강제할지 여부
70
- * - 기본값으로 children을 가질때 false로 설정되며, children이 없을 경우 true로 설정됩니다.
71
- * - true로 설정하면 기존 렌더링을 무시하고 새로 렌더링합니다.
72
- */
73
- force?: boolean;
74
- /**
75
- * 경로 매칭시 대소문자 구분 여부
76
- * @default false
77
- */
78
- ignoreCase?: boolean;
79
- /**
80
- * 라우트에 연결할 메타데이터
81
- * - 인증, SEO, 분석 등의 용도로 사용할 수 있습니다.
82
- * @example
83
- * ```typescript
84
- * { path: '/admin', metadata: { requiresAuth: true, role: 'admin' } }
85
- * ```
86
- */
87
- metadata?: Record<string, unknown>;
88
- }
89
-
90
- /**
91
- * 컨텐츠 로드시 나타나는 에러
92
- */
93
- export declare class ContentLoadError extends RouteError {
94
- constructor(original?: Error | any);
95
- }
96
-
97
- /**
98
- * 컨텐츠 렌더링시 발생하는 에러
99
- */
100
- export declare class ContentRenderError extends RouteError {
101
- constructor(original?: Error | any);
102
- }
103
-
104
- export declare interface FallbackRouteConfig {
105
- /**
106
- * 브라우저의 타이틀이 설정에 따라 변경됩니다.
107
- */
108
- title?: string;
109
- /**
110
- * 라우팅 실패 시 표시할 렌더링 결과를 반환합니다.
111
- * - 오류가 발생할 경우 또는 렌더링 결과가 false일 경우 호출됩니다.
112
- * @param ctx 현재 라우팅 정보 및 오류 정보를 포함하는 Context 객체가 인자로 전달됩니다.
113
- * @example
114
- * ```typescript
115
- * const fallbackRoute = {
116
- * title: 'Not Found',
117
- * render: (ctx) => {
118
- * if (ctx.error) {
119
- * return html`<error-page .error=${ctx.error}></error-page>`;
120
- * }
121
- * return html`<not-found-page></not-found-page>`;
122
- * }
123
- * }
124
- * ```
125
- */
126
- render?: (ctx: FallbackRouteContext) => Promise<unknown> | unknown;
127
- }
128
-
129
- export declare interface FallbackRouteContext extends RouteContext {
130
- /**
131
- * 라우팅 에러 정보
132
- * - 라우팅 중 발생한 에러 정보를 포함합니다.
133
- */
134
- error: RouteError;
135
- }
136
-
137
- declare interface IndexRouteConfig extends BaseRouteConfig {
138
- /**
139
- * 현재 경로의 인덱스 라우트임을 나타냅니다.
140
- * - 인덱스 라우트는 부모 경로와 동일한 경로를 가지며, path는 자동으로 설정됩니다.
141
- */
142
- index: true;
143
- }
144
-
145
- /**
146
- * go() 메서드에 전달할 네비게이션 옵션
147
- */
148
- export declare interface NavigateOptions {
149
- /**
150
- * 리다이렉트로 인한 네비게이션 여부.
151
- * - `true`이면 히스토리에 새 항목을 추가하지 않고 현재 항목을 교체합니다(replaceState).
152
- * - 뒤로가기 버튼이 리다이렉트 경유지를 건너뛰게 됩니다.
153
- * - 리다이렉트 사이클 감지에 사용됩니다.
154
- * @default false
155
- */
156
- isRedirect?: boolean;
157
- /**
158
- * 히스토리에 새 항목을 추가하지 않고 현재 항목을 교체합니다(replaceState).
159
- * - `isRedirect`와 달리 리다이렉트 체인 추적에는 영향을 주지 않습니다.
160
- * @default false
161
- */
162
- replace?: boolean;
163
- /**
164
- * pushState / replaceState 호출 시 함께 저장할 커스텀 상태 객체.
165
- * - `history.state`로 다시 읽을 수 있습니다.
166
- * @example { from: '/login', referrer: 'email-link' }
167
- */
168
- state?: Record<string, unknown>;
169
- }
170
-
171
- declare interface NonIndexRouteConfig extends BaseRouteConfig {
172
- /**
173
- * 인덱스 라우트가 아님을 나타냅니다.
174
- */
175
- index?: false;
176
- /**
177
- * 하위 라우트 설정, 재귀적으로 RouteConfig 배열을 가질 수 있습니다.
178
- * - 하위 라우트가 있는 경우, 부모 라우트의 경로를 기준으로 매칭됩니다.
179
- */
180
- children?: RouteConfig[];
181
- }
182
-
183
- /**
184
- * 페이지를 찾을 수 없을 때 발생하는 에러
185
- */
186
- export declare class NotFoundError extends RouteError {
187
- constructor(path: string, original?: Error | any);
188
- }
189
-
190
- /**
191
- * u-outlet 요소를 찾을 수 없을 때 발생하는 에러
192
- */
193
- export declare class OutletMissingError extends RouteError {
194
- constructor();
195
- }
196
-
197
- /** 렌더링 옵션 */
198
- declare interface RenderOption {
199
- /** 교차 렌더링 방지 ID */
200
- id?: string;
201
- /** 강제 렌더링 여부 */
202
- force?: boolean;
203
- }
204
-
205
- /**
206
- * 라우트 시작 이벤트
207
- */
208
- export declare class RouteBeginEvent extends RouteEvent {
209
- constructor(context: RouteContext);
210
- }
211
-
212
- export declare type RouteConfig = IndexRouteConfig | NonIndexRouteConfig;
213
-
214
- /**
215
- * 라우터 정보
216
- */
217
- export declare interface RouteContext {
218
- /**
219
- * 전체 URL 정보
220
- * - 도메인 이름을 포함한 URL의 전체 경로입니다.
221
- * @example https://www.iyulab.com/home/user/1?name=iyu#profile
222
- */
223
- href: string;
224
- /**
225
- * URL 도메인 이름
226
- * - URL의 도메인 이름입니다.
227
- * @example https://www.iyulab.com
228
- */
229
- origin: string;
230
- /**
231
- * 라우터 URL 기본 경로
232
- * - 라우터의 현재 basepath입니다.
233
- * @example
234
- * if basepath is /app/:id
235
- * set basepath to /app/123
236
- */
237
- basepath: string;
238
- /**
239
- * 라우터 URL 전체 경로
240
- * - 도메인 이름을 제외한 URL의 전체 경로입니다.
241
- * @example /home/user/1?name=iyu#profile
242
- */
243
- path: string;
244
- /**
245
- * 라우터 URL 절대 경로
246
- * - 쿼리스트링과 해시를 제외한 URL 경로입니다.
247
- * @example /home/user/1
248
- */
249
- pathname: string;
250
- /**
251
- * 라우터 URL 파라미터
252
- * - URLPattern을 사용하여 파싱된 파라미터입니다.
253
- * @example 만약 URL이 /user/:id/:name 일경우
254
- * ```typescript
255
- * const id = params.id;
256
- * const name = params.name;
257
- * ```
258
- */
259
- params: {
260
- [key: string]: string | undefined;
261
- };
262
- /**
263
- * 라우터 URL 쿼리스트링
264
- * - URLSearchParams를 사용하여 파싱된 쿼리스트링입니다.
265
- * @example 만약 URL이 ?page=1&size=10 일경우
266
- * ```typescript
267
- * const page = query.get('page');
268
- * const size = query.get('size');
269
- * ```
270
- */
271
- query: URLSearchParams;
272
- /**
273
- * 라우터 URL 해시
274
- * - URL의 해시값입니다. 해시값은 하나만 사용할 수 있습니다.
275
- * - #profile#user 두개 이상의 해시값은 하나로 취급합니다.
276
- * @example #profile
277
- */
278
- hash?: string;
279
- /**
280
- * 현재 라우팅의 진행 상태를 업데이트하여, window 객체의 'route-progress' 이벤트를 트리거합니다.
281
- * 여러 라우팅이 호출되는 경우, 가장 최근의 라우팅의 진행 상태만 반영되며, 나머지는 무시됩니다.
282
- * @param value 진행 상태 값 (0~100)
283
- */
284
- progress: (value: number) => void;
285
- /**
286
- * 매칭된 라우트 체인의 병합된 메타데이터
287
- * - 부모 라우트에서 자식 라우트 순서로 병합됩니다.
288
- */
289
- metadata: Record<string, unknown>;
290
- }
291
-
292
- /**
293
- * 라우트 완료 이벤트
294
- */
295
- export declare class RouteDoneEvent extends RouteEvent {
296
- constructor(context: RouteContext);
297
- }
298
-
299
- /**
300
- * 라우팅 에러 정보
301
- */
302
- export declare class RouteError extends Error {
303
- /**
304
- * 에러 코드
305
- * - HTTP 상태 코드 또는 커스텀 에러 코드
306
- * @example 404, 500, 'ROUTE_NOT_FOUND'
307
- */
308
- code: number | string;
309
- /**
310
- * 원본 에러 객체
311
- * - 원본 Error 객체 또는 예외 정보
312
- */
313
- original?: Error | any;
314
- /**
315
- * 에러 발생 시간
316
- * - 에러가 발생한 시간 (ISO 8601 형식)
317
- */
318
- timestamp: string;
319
- constructor(code: number | string, message: string, original?: Error | any);
320
- }
321
-
322
- /**
323
- * 라우트 에러 이벤트
324
- */
325
- export declare class RouteErrorEvent extends RouteEvent {
326
- /** 에러 정보 */
327
- readonly error: RouteError;
328
- constructor(context: RouteContext, error: RouteError);
329
- }
330
-
331
- /** 라우터 이벤트 기본 클래스 */
332
- declare abstract class RouteEvent extends Event {
333
- /** 라우팅 정보 */
334
- readonly context: RouteContext;
335
- /** 이벤트 발생 시간 */
336
- readonly timestamp: string;
337
- constructor(type: string, context: RouteContext, cancelable?: boolean);
338
- /** 이벤트가 취소되었는지 확인 */
339
- get cancelled(): boolean;
340
- /** 이벤트 취소 */
341
- cancel(): void;
342
- }
343
-
344
- /**
345
- * 라우트 진행 이벤트
346
- */
347
- export declare class RouteProgressEvent extends RouteEvent {
348
- /** 진행 상태 값 (0~100) */
349
- readonly progress: number;
350
- constructor(context: RouteContext, progress: number);
351
- }
352
-
353
- /**
354
- * `lit-element`, `react`를 지원하는 SPA 클라이언트 라우터 객체입니다.
355
- */
356
- export declare class Router {
357
- private readonly _rootElement;
358
- private readonly _basepath;
359
- private readonly _routes;
360
- private readonly _fallback?;
361
- private readonly _enter?;
362
- private readonly _tracker;
363
- /** 현재 라우팅 요청 ID */
364
- private _requestID?;
365
- /** 현재 라우팅 정보 */
366
- private _context?;
367
- constructor(config: RouterConfig);
368
- /** 객체를 정리하고 이벤트 리스너를 제거합니다. */
369
- destroy(): void;
370
- /** 라우터의 기본 경로 반환 */
371
- get basepath(): string;
372
- /** 등록된 라우트 정보 반환 */
373
- get routes(): RouteConfig[];
374
- /** 현재 라우팅 정보 반환 */
375
- get context(): RouteContext | undefined;
376
- /**
377
- * 지정한 경로의 클라이언트 라우팅을 수행합니다. 상대경로일 경우 basepath와 조합되어 이동합니다.
378
- * @param href 이동할 경로
379
- * @param options 네비게이션 옵션
380
- */
381
- go(href: string, options?: NavigateOptions): Promise<undefined>;
382
- /** 브라우저 히스토리 이벤트가 발생시 라우팅 처리 */
383
- private handleWindowPopstate;
384
- /** 클릭 이벤트에서 라우터로 처리할 앵커를 찾아 클라이언트 라우팅 수행 */
385
- private handleDocumentClick;
386
- }
387
-
388
- /**
389
- * 라우터 설정
390
- */
391
- export declare interface RouterConfig {
392
- /**
393
- * 라우터가 연결될 최상위 엘리먼트
394
- */
395
- root: HTMLElement;
396
- /**
397
- * 라우터의 기본 경로
398
- * - 라우터의 기본 경로는 URL의 시작점입니다.
399
- * - URLPattern을 사용하여 경로를 탐색합니다.
400
- * @default '/'
401
- */
402
- basepath?: string;
403
- /**
404
- * 라우트 설정
405
- * - 라우트는 URLPattern을 사용하여 경로를 탐색합니다.
406
- * - 라우트는 렌더링할 엘리먼트 또는 컴포넌트를 지정합니다.
407
- */
408
- routes?: RouteConfig[];
409
- /**
410
- * 모든 라우트 전환 전에 호출되는 글로벌 enter 함수입니다.
411
- * - `string` 반환: 해당 경로로 redirect
412
- * - `false` 반환: 네비게이션 취소
413
- * - `true` 반환: 통과
414
- * @example
415
- * ```typescript
416
- * enter: async (ctx) => {
417
- * if (!isAuthenticated() && ctx.pathname !== '/login') return '/login';
418
- * }
419
- * ```
420
- */
421
- enter?: (ctx: RouteContext) => Promise<string | boolean> | string | boolean;
422
- /**
423
- * 라우트 매칭 실패 또는 오류 발생 시 대체 라우트 설정
424
- * - 지정된 설정이 없을 경우, 기본 오류 페이지가 렌더링됩니다.
425
- */
426
- fallback?: FallbackRouteConfig;
427
- /**
428
- * `a` 태그 클릭 시 클라이언트 라우팅을 수행할지 여부를 설정합니다.
429
- * @default true
430
- */
431
- useIntercept?: boolean;
432
- /**
433
- * 초기 로드 시 현재 URL로 라우팅을 자동으로 수행할지 여부를 설정합니다.
434
- * @default true
435
- */
436
- initialLoad?: boolean;
437
- }
438
-
439
- /**
440
- * - 클라이언트 라우팅을 지원하는 링크 엘리먼트입니다.
441
- * - 내부 링크는 클라이언트 라우팅을 수행하고, 외부 링크는 브라우저 기본 네비게이션을 사용합니다.
442
- * - Ctrl/Meta/Shift/Alt, 중클릭/우클릭 등은 브라우저 기본 동작(새 탭, 컨텍스트 메뉴 등)을 그대로 유지합니다.
443
- */
444
- export declare class ULink extends LitElement {
445
- /** 외부 링크 여부 */
446
- private isExternal;
447
- /**
448
- * 링크 대상 target 속성
449
- *
450
- * - `_self`: 현재 창에서 링크 열기 (기본값)
451
- * - `_blank`: 새 탭/창에서 링크 열기
452
- * - `_parent`: 부모 프레임에서 링크 열기
453
- * - `_top`: 최상위 프레임에서 링크 열기
454
- */
455
- target?: string;
456
- /**
457
- * 링크 관계 rel 속성
458
- *
459
- * - `noopener`: target이 _blank인 경우 보안 강화 (window.opener 차단)
460
- * - `noreferrer`: target이 _blank인 경우 보안 강화 + Referer 헤더 제거
461
- * - `external`: 외부 링크임을 명시 (SEO/접근성에 도움)
462
- * - `nofollow`: 검색 엔진이 링크를 따라가지 않도록 지시 (SEO에 영향)
463
- * - 그 외 rel 값도 그대로 전달됩니다.
464
- */
465
- rel?: string;
466
- /**
467
- * 링크 대상 URL, 다음 사항에 따라 SPA 라우팅 또는 브라우저 네비게이션이 결정됩니다.
468
- *
469
- * - 속성을 정의하지 않으면 설정에서 지정한 `basepath`로 SPA 라우팅합니다.
470
- * - http(s)로 시작하면 외부 링크로 간주하고 브라우저 네비게이션을 사용합니다.
471
- * - 절대경로(/...)의 경우 `basepath`로 시작하면 SPA 라우팅합니다, 이외 브라우저 네비게이션을 사용합니다.
472
- * - 상대경로는 (basepath + 상대경로)로 결합하여 SPA 라우팅합니다.
473
- * - ?로 시작하면 현재 경로에 쿼리스트링을 추가하여 SPA 라우팅합니다.
474
- * - #으로 시작하면 브라우저 기본 동작을 사용합니다.
475
- */
476
- href?: string;
477
- connectedCallback(): void;
478
- disconnectedCallback(): void;
479
- protected willUpdate(changedProperties: PropertyValues): void;
480
- render(): TemplateResult<1>;
481
- /** a 태그에 주입할 href 값을 계산합니다. */
482
- private compute;
483
- /**
484
- * 클릭 가로채기 핸들러
485
- * - 좌클릭(0) + 보조키 없음(ctrl/meta/shift/alt 없음) + target이 _self일 때만 SPA 라우팅 고려
486
- * - 그 외(중클릭/우클릭/보조키/target=_blank 등)는 브라우저 기본 동작 유지
487
- */
488
- private handleClick;
489
- /** 클라이언트 라우팅을 위해 popstate 이벤트를 발생시킵니다. */
490
- private dispatchPopstate;
491
- /** basepath를 state에서 꺼내는 헬퍼 */
492
- private getBasepath;
493
- static styles: CSSResult;
494
- }
495
-
496
- /**
497
- * LitElement 또는 React 컴포넌트를 렌더링해주는 웹컴포넌트 입니다.
498
- */
499
- export declare class UOutlet extends HTMLElement {
500
- /** 교차 렌더링 방지 id */
501
- private routeId?;
502
- /** 실제 렌더링 컨텐츠 */
503
- private root?;
504
- /**
505
- * 주어진 렌더링 옵션에 따라 컨텐츠를 렌더링합니다.
506
- */
507
- render(value: unknown, options?: RenderOption): Promise<void>;
508
- /**
509
- * 기존 DOM을 삭제하여, 초기 상태로 되돌립니다.
510
- */
511
- reset(): void;
512
- }
513
-
514
- export { }
1
+ export * from './types/NavigateOptions';
2
+ export * from './types/RouteConfig';
3
+ export * from './types/RouteContext';
4
+ export * from './types/RouteError';
5
+ export * from './types/RouteEvent';
6
+ export * from './types/RouterConfig';
7
+ export * from './components/UOutlet';
8
+ export * from './components/ULink';
9
+ export { Router } from './Router';
515
10
 
516
11
  declare global {
517
12
  interface WindowEventMap {