@geometra/router 1.0.1

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.
@@ -0,0 +1,51 @@
1
+ function trimSlashes(value) {
2
+ return value.replace(/^\/+|\/+$/g, '');
3
+ }
4
+ function parseRankedSegments(pattern) {
5
+ const trimmed = trimSlashes(pattern);
6
+ if (trimmed === '')
7
+ return [];
8
+ return trimmed.split('/').map((part) => {
9
+ if (part.startsWith('*'))
10
+ return { kind: 'splat' };
11
+ if (part.endsWith('?')) {
12
+ const raw = part.slice(0, -1);
13
+ if (raw.startsWith(':'))
14
+ return { kind: 'optional-param' };
15
+ return { kind: 'optional-static' };
16
+ }
17
+ if (part.startsWith(':'))
18
+ return { kind: 'param' };
19
+ return { kind: 'static' };
20
+ });
21
+ }
22
+ function scoreSegment(segment) {
23
+ switch (segment.kind) {
24
+ case 'static':
25
+ return 500;
26
+ case 'param':
27
+ return 400;
28
+ case 'optional-static':
29
+ return 300;
30
+ case 'optional-param':
31
+ return 200;
32
+ case 'splat':
33
+ return 0;
34
+ }
35
+ }
36
+ export function scorePathPattern(pattern) {
37
+ const segments = parseRankedSegments(pattern);
38
+ return segments.reduce((total, segment) => total + scoreSegment(segment), 0);
39
+ }
40
+ export function comparePatternSpecificity(a, b) {
41
+ const scoreA = scorePathPattern(a);
42
+ const scoreB = scorePathPattern(b);
43
+ if (scoreA !== scoreB)
44
+ return scoreB - scoreA;
45
+ const depthA = parseRankedSegments(a).length;
46
+ const depthB = parseRankedSegments(b).length;
47
+ if (depthA !== depthB)
48
+ return depthB - depthA;
49
+ return 0;
50
+ }
51
+ //# sourceMappingURL=ranking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ranking.js","sourceRoot":"","sources":["../src/ranking.ts"],"names":[],"mappings":"AAIA,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;AACxC,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAe;IAC1C,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;IACpC,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,EAAE,CAAA;IAE7B,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACrC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,OAAgB,EAAE,CAAA;QAC3D,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAC7B,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,OAAO,EAAE,IAAI,EAAE,gBAAyB,EAAE,CAAA;YACnE,OAAO,EAAE,IAAI,EAAE,iBAA0B,EAAE,CAAA;QAC7C,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,OAAgB,EAAE,CAAA;QAC3D,OAAO,EAAE,IAAI,EAAE,QAAiB,EAAE,CAAA;IACpC,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,OAAsB;IAC1C,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,QAAQ;YACX,OAAO,GAAG,CAAA;QACZ,KAAK,OAAO;YACV,OAAO,GAAG,CAAA;QACZ,KAAK,iBAAiB;YACpB,OAAO,GAAG,CAAA;QACZ,KAAK,gBAAgB;YACnB,OAAO,GAAG,CAAA;QACZ,KAAK,OAAO;YACV,OAAO,CAAC,CAAA;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;IAC7C,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAA;AAC9E,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,CAAS,EAAE,CAAS;IAC5D,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAA;IAClC,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAA;IAClC,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,MAAM,GAAG,MAAM,CAAA;IAE7C,MAAM,MAAM,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IAC5C,MAAM,MAAM,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IAC5C,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,MAAM,GAAG,MAAM,CAAA;IAE7C,OAAO,CAAC,CAAA;AACV,CAAC"}
@@ -0,0 +1,25 @@
1
+ export type RedirectResult = {
2
+ kind: 'redirect';
3
+ to: string;
4
+ replace?: boolean;
5
+ };
6
+ export type ResponseResult<T = unknown> = {
7
+ kind: 'response';
8
+ status?: number;
9
+ headers?: Record<string, string>;
10
+ data: T;
11
+ };
12
+ export declare function redirect(to: string, options?: {
13
+ replace?: boolean;
14
+ }): RedirectResult;
15
+ export declare function response<T>(data: T, options?: {
16
+ status?: number;
17
+ headers?: Record<string, string>;
18
+ }): ResponseResult<T>;
19
+ export declare function json<T>(data: T, options?: {
20
+ status?: number;
21
+ headers?: Record<string, string>;
22
+ }): ResponseResult<T>;
23
+ export declare function isRedirectResult(value: unknown): value is RedirectResult;
24
+ export declare function isResponseResult(value: unknown): value is ResponseResult<unknown>;
25
+ //# sourceMappingURL=responses.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../src/responses.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,UAAU,CAAA;IAChB,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,OAAO,IAAI;IACxC,IAAI,EAAE,UAAU,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,IAAI,EAAE,CAAC,CAAA;CACR,CAAA;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,cAAc,CAExF;AAED,wBAAgB,QAAQ,CAAC,CAAC,EACxB,IAAI,EAAE,CAAC,EACP,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAO,GAClE,cAAc,CAAC,CAAC,CAAC,CAOnB;AAED,wBAAgB,IAAI,CAAC,CAAC,EACpB,IAAI,EAAE,CAAC,EACP,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAO,GAClE,cAAc,CAAC,CAAC,CAAC,CAQnB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAExE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAAC,OAAO,CAAC,CAEjF"}
@@ -0,0 +1,27 @@
1
+ export function redirect(to, options = {}) {
2
+ return { kind: 'redirect', to, replace: options.replace };
3
+ }
4
+ export function response(data, options = {}) {
5
+ return {
6
+ kind: 'response',
7
+ status: options.status,
8
+ headers: options.headers,
9
+ data,
10
+ };
11
+ }
12
+ export function json(data, options = {}) {
13
+ return response(data, {
14
+ ...options,
15
+ headers: {
16
+ 'content-type': 'application/json',
17
+ ...(options.headers ?? {}),
18
+ },
19
+ });
20
+ }
21
+ export function isRedirectResult(value) {
22
+ return typeof value === 'object' && value !== null && value.kind === 'redirect';
23
+ }
24
+ export function isResponseResult(value) {
25
+ return typeof value === 'object' && value !== null && value.kind === 'response';
26
+ }
27
+ //# sourceMappingURL=responses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responses.js","sourceRoot":"","sources":["../src/responses.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,QAAQ,CAAC,EAAU,EAAE,UAAiC,EAAE;IACtE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAA;AAC3D,CAAC;AAED,MAAM,UAAU,QAAQ,CACtB,IAAO,EACP,UAAiE,EAAE;IAEnE,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI;KACL,CAAA;AACH,CAAC;AAED,MAAM,UAAU,IAAI,CAClB,IAAO,EACP,UAAiE,EAAE;IAEnE,OAAO,QAAQ,CAAC,IAAI,EAAE;QACpB,GAAG,OAAO;QACV,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;SAC3B;KACF,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAK,KAA4B,CAAC,IAAI,KAAK,UAAU,CAAA;AACzG,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAK,KAA4B,CAAC,IAAI,KAAK,UAAU,CAAA;AACzG,CAAC"}
@@ -0,0 +1,71 @@
1
+ import { type HistoryAdapter, type RouterLocation, type Unsubscribe } from './history.js';
2
+ import { type RouteBranchMatch, type RouteNode } from './tree.js';
3
+ import type { RouteActionSubmission } from './tree.js';
4
+ export type RouterNavigationState = 'idle' | 'navigating' | 'loading' | 'submitting';
5
+ export type NavigationOptions = {
6
+ replace?: boolean;
7
+ restoreScroll?: boolean;
8
+ restoreFocus?: boolean;
9
+ };
10
+ export type RouterErrorPhase = 'loader' | 'action' | 'navigation';
11
+ export type RouterErrorPayload = {
12
+ phase: RouterErrorPhase;
13
+ routeId?: string;
14
+ location: RouterLocation;
15
+ message: string;
16
+ cause?: unknown;
17
+ };
18
+ export type RouterState<T = unknown, TRequestContext = unknown> = {
19
+ location: RouterLocation;
20
+ matches: RouteBranchMatch<T, TRequestContext> | null;
21
+ navigation: RouterNavigationState;
22
+ pending: boolean;
23
+ submitting: boolean;
24
+ loading: boolean;
25
+ loaderData: Record<string, unknown>;
26
+ actionData: Record<string, unknown>;
27
+ error: RouterErrorPayload | null;
28
+ };
29
+ export type RouterSubscriber<T = unknown, TRequestContext = unknown> = (state: RouterState<T, TRequestContext>) => void;
30
+ export type NavigationBlocker = (context: {
31
+ from: RouterLocation;
32
+ to: string;
33
+ replace: boolean;
34
+ }) => boolean | Promise<boolean>;
35
+ export type NavigationRestorationContext<T = unknown, TRequestContext = unknown> = {
36
+ from: RouterLocation;
37
+ to: RouterLocation;
38
+ matches: RouteBranchMatch<T, TRequestContext> | null;
39
+ replace: boolean;
40
+ };
41
+ export type RouterRestorationPolicy<T = unknown, TRequestContext = unknown> = {
42
+ restoreScroll?: (context: NavigationRestorationContext<T, TRequestContext>) => void;
43
+ restoreFocus?: (context: NavigationRestorationContext<T, TRequestContext>) => void;
44
+ };
45
+ export type OptimisticMutation<T = unknown, TRequestContext = unknown> = {
46
+ apply: (state: RouterState<T, TRequestContext>) => RouterState<T, TRequestContext>;
47
+ rollback?: (state: RouterState<T, TRequestContext>, error: unknown, previousState: RouterState<T, TRequestContext>) => RouterState<T, TRequestContext>;
48
+ };
49
+ export type SubmitActionOptions<T = unknown, TRequestContext = unknown> = {
50
+ optimistic?: OptimisticMutation<T, TRequestContext>;
51
+ };
52
+ export interface Router<T = unknown, TRequestContext = unknown> {
53
+ start(): void;
54
+ navigate(to: string, options?: NavigationOptions): Promise<boolean>;
55
+ submitAction(routeId: string, submission?: RouteActionSubmission, options?: SubmitActionOptions<T, TRequestContext>): Promise<boolean>;
56
+ revalidate(): Promise<boolean>;
57
+ subscribe(listener: RouterSubscriber<T, TRequestContext>): Unsubscribe;
58
+ dispose(): void;
59
+ getState(): RouterState<T, TRequestContext>;
60
+ isActive(to: string): boolean;
61
+ isPending(to: string): boolean;
62
+ addBlocker(blocker: NavigationBlocker): Unsubscribe;
63
+ }
64
+ export type CreateRouterOptions<T = unknown, TRequestContext = unknown> = {
65
+ routes: RouteNode<T, TRequestContext>[];
66
+ history?: HistoryAdapter;
67
+ restoration?: RouterRestorationPolicy<T, TRequestContext>;
68
+ requestContext?: TRequestContext | (() => TRequestContext | Promise<TRequestContext>);
69
+ };
70
+ export declare function createRouter<T, TRequestContext = unknown>(options: CreateRouterOptions<T, TRequestContext>): Router<T, TRequestContext>;
71
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
package/dist/router.js ADDED
@@ -0,0 +1,344 @@
1
+ import { createMemoryHistory } from './history.js';
2
+ import { matchRouteTree } from './tree.js';
3
+ import { parseQuery } from './query.js';
4
+ import { isRedirectResult } from './responses.js';
5
+ function withNavigationState(state, navigation) {
6
+ return {
7
+ ...state,
8
+ navigation,
9
+ pending: navigation !== 'idle',
10
+ submitting: navigation === 'submitting',
11
+ loading: navigation === 'loading',
12
+ };
13
+ }
14
+ function createAbortError() {
15
+ const error = new Error('Navigation aborted');
16
+ error.name = 'AbortError';
17
+ return error;
18
+ }
19
+ function isAbortError(error) {
20
+ return typeof error === 'object' && error !== null && error.name === 'AbortError';
21
+ }
22
+ function createRouteDataKey(route, index) {
23
+ return route.id ?? `__route_${index}`;
24
+ }
25
+ async function resolveState(routes, location, signal, requestContextProvider) {
26
+ if (signal.aborted)
27
+ throw createAbortError();
28
+ const matches = matchRouteTree(routes, location.pathname);
29
+ const loaderData = {};
30
+ let redirect = null;
31
+ let error = null;
32
+ if (matches) {
33
+ const query = parseQuery(location.search);
34
+ const requestContext = typeof requestContextProvider === 'function'
35
+ ? await requestContextProvider()
36
+ : requestContextProvider;
37
+ for (let i = 0; i < matches.matches.length; i += 1) {
38
+ const route = matches.matches[i];
39
+ if (!route?.loader)
40
+ continue;
41
+ const key = createRouteDataKey(route, i);
42
+ let result;
43
+ try {
44
+ result = await route.loader({
45
+ params: matches.params,
46
+ query,
47
+ location,
48
+ requestContext,
49
+ signal,
50
+ route,
51
+ });
52
+ }
53
+ catch (cause) {
54
+ if (isAbortError(cause))
55
+ throw cause;
56
+ error = {
57
+ phase: 'loader',
58
+ routeId: route.id,
59
+ location,
60
+ message: cause instanceof Error ? cause.message : 'Route loader failed',
61
+ cause,
62
+ };
63
+ break;
64
+ }
65
+ if (signal.aborted)
66
+ throw createAbortError();
67
+ if (isRedirectResult(result)) {
68
+ redirect = { to: result.to, replace: result.replace ?? false };
69
+ break;
70
+ }
71
+ loaderData[key] = result;
72
+ }
73
+ }
74
+ return {
75
+ location,
76
+ matches,
77
+ loaderData,
78
+ redirect,
79
+ error,
80
+ };
81
+ }
82
+ export function createRouter(options) {
83
+ const history = options.history ?? createMemoryHistory();
84
+ const routes = options.routes;
85
+ let started = false;
86
+ let disposed = false;
87
+ let unlisten = null;
88
+ let state = {
89
+ location: history.location,
90
+ matches: matchRouteTree(routes, history.location.pathname),
91
+ navigation: 'idle',
92
+ pending: false,
93
+ submitting: false,
94
+ loading: false,
95
+ loaderData: {},
96
+ actionData: {},
97
+ error: null,
98
+ };
99
+ let pendingTo = null;
100
+ let pendingNavigation = null;
101
+ const listeners = new Set();
102
+ const blockers = new Set();
103
+ let resolutionVersion = 0;
104
+ let inFlightController = null;
105
+ const emit = () => {
106
+ for (const listener of listeners)
107
+ listener(state);
108
+ };
109
+ const getRequestContext = async () => {
110
+ return typeof options.requestContext === 'function'
111
+ ? await options.requestContext()
112
+ : options.requestContext;
113
+ };
114
+ const applyResolvedLocation = async (location, previousNavigation) => {
115
+ const version = ++resolutionVersion;
116
+ inFlightController?.abort();
117
+ const controller = new AbortController();
118
+ inFlightController = controller;
119
+ let resolved;
120
+ try {
121
+ resolved = await resolveState(routes, location, controller.signal, options.requestContext);
122
+ }
123
+ catch (error) {
124
+ if (isAbortError(error))
125
+ return;
126
+ state = withNavigationState({
127
+ ...state,
128
+ error: {
129
+ phase: 'navigation',
130
+ location,
131
+ message: error instanceof Error ? error.message : 'Navigation failed',
132
+ cause: error,
133
+ },
134
+ }, 'idle');
135
+ previousNavigation?.resolve(false);
136
+ emit();
137
+ return;
138
+ }
139
+ if (disposed || version !== resolutionVersion || controller !== inFlightController) {
140
+ previousNavigation?.resolve(false);
141
+ return;
142
+ }
143
+ if (resolved.redirect) {
144
+ if (resolved.redirect.replace) {
145
+ history.replace(resolved.redirect.to);
146
+ }
147
+ else {
148
+ history.push(resolved.redirect.to);
149
+ }
150
+ previousNavigation?.resolve(true);
151
+ pendingNavigation = null;
152
+ return;
153
+ }
154
+ pendingTo = null;
155
+ state = {
156
+ location: resolved.location,
157
+ matches: resolved.matches,
158
+ loaderData: resolved.loaderData,
159
+ actionData: state.actionData,
160
+ error: resolved.error,
161
+ navigation: state.navigation,
162
+ pending: state.pending,
163
+ submitting: state.submitting,
164
+ loading: state.loading,
165
+ };
166
+ state = withNavigationState(state, 'idle');
167
+ if (previousNavigation) {
168
+ const context = {
169
+ from: previousNavigation.from,
170
+ to: state.location,
171
+ matches: state.matches,
172
+ replace: previousNavigation.replace,
173
+ };
174
+ if (previousNavigation.restoreScroll) {
175
+ options.restoration?.restoreScroll?.(context);
176
+ }
177
+ if (previousNavigation.restoreFocus) {
178
+ options.restoration?.restoreFocus?.(context);
179
+ }
180
+ previousNavigation.resolve(true);
181
+ pendingNavigation = null;
182
+ }
183
+ inFlightController = null;
184
+ emit();
185
+ };
186
+ const onHistoryUpdate = () => {
187
+ const previous = pendingNavigation;
188
+ state = withNavigationState(state, 'loading');
189
+ emit();
190
+ void applyResolvedLocation(history.location, previous);
191
+ };
192
+ const navigateInternal = async (to, navigationOptions) => {
193
+ if (disposed)
194
+ return false;
195
+ const replace = navigationOptions?.replace ?? false;
196
+ const restoreScroll = navigationOptions?.restoreScroll ?? true;
197
+ const restoreFocus = navigationOptions?.restoreFocus ?? true;
198
+ for (const blocker of blockers) {
199
+ const allowed = await blocker({ from: state.location, to, replace });
200
+ if (!allowed)
201
+ return false;
202
+ }
203
+ pendingNavigation?.resolve(false);
204
+ pendingTo = to;
205
+ const completion = new Promise((resolve) => {
206
+ pendingNavigation = {
207
+ from: state.location,
208
+ to,
209
+ replace,
210
+ restoreScroll,
211
+ restoreFocus,
212
+ resolve,
213
+ };
214
+ });
215
+ state = withNavigationState(state, 'navigating');
216
+ emit();
217
+ if (replace) {
218
+ history.replace(to);
219
+ }
220
+ else {
221
+ history.push(to);
222
+ }
223
+ return completion;
224
+ };
225
+ return {
226
+ start() {
227
+ if (disposed || started)
228
+ return;
229
+ unlisten = history.listen(onHistoryUpdate);
230
+ started = true;
231
+ void applyResolvedLocation(history.location, null);
232
+ emit();
233
+ },
234
+ async navigate(to, navigationOptions) {
235
+ return navigateInternal(to, navigationOptions);
236
+ },
237
+ async submitAction(routeId, submission = {}, actionOptions) {
238
+ if (disposed)
239
+ return false;
240
+ const branch = state.matches;
241
+ if (!branch)
242
+ return false;
243
+ const route = branch.matches.find((item) => item.id === routeId);
244
+ if (!route?.action)
245
+ return false;
246
+ const optimisticBaseState = state;
247
+ if (actionOptions?.optimistic) {
248
+ state = actionOptions.optimistic.apply(state);
249
+ emit();
250
+ }
251
+ state = withNavigationState(state, 'submitting');
252
+ emit();
253
+ try {
254
+ const requestContext = await getRequestContext();
255
+ const query = parseQuery(state.location.search);
256
+ const controller = new AbortController();
257
+ const result = await route.action({
258
+ params: branch.params,
259
+ query,
260
+ location: state.location,
261
+ requestContext,
262
+ signal: controller.signal,
263
+ route,
264
+ submission,
265
+ });
266
+ if (isRedirectResult(result)) {
267
+ return navigateInternal(result.to, { replace: result.replace });
268
+ }
269
+ state = {
270
+ ...state,
271
+ error: null,
272
+ actionData: {
273
+ ...state.actionData,
274
+ [routeId]: result,
275
+ },
276
+ };
277
+ emit();
278
+ state = withNavigationState(state, 'loading');
279
+ emit();
280
+ await applyResolvedLocation(state.location, null);
281
+ return true;
282
+ }
283
+ catch (error) {
284
+ const failure = {
285
+ phase: 'action',
286
+ routeId: route.id,
287
+ location: state.location,
288
+ message: error instanceof Error ? error.message : 'Route action failed',
289
+ cause: error,
290
+ };
291
+ if (actionOptions?.optimistic?.rollback) {
292
+ state = actionOptions.optimistic.rollback(state, error, optimisticBaseState);
293
+ }
294
+ else if (actionOptions?.optimistic) {
295
+ state = optimisticBaseState;
296
+ }
297
+ state = { ...state, error: failure };
298
+ state = withNavigationState(state, 'idle');
299
+ emit();
300
+ return false;
301
+ }
302
+ },
303
+ async revalidate() {
304
+ if (disposed)
305
+ return false;
306
+ state = withNavigationState(state, 'loading');
307
+ emit();
308
+ await applyResolvedLocation(state.location, null);
309
+ return true;
310
+ },
311
+ subscribe(listener) {
312
+ listeners.add(listener);
313
+ listener(state);
314
+ return () => listeners.delete(listener);
315
+ },
316
+ dispose() {
317
+ if (disposed)
318
+ return;
319
+ disposed = true;
320
+ started = false;
321
+ inFlightController?.abort();
322
+ inFlightController = null;
323
+ if (unlisten) {
324
+ unlisten();
325
+ unlisten = null;
326
+ }
327
+ listeners.clear();
328
+ },
329
+ getState() {
330
+ return state;
331
+ },
332
+ isActive(to) {
333
+ return state.location.pathname === to;
334
+ },
335
+ isPending(to) {
336
+ return state.pending && (pendingTo === to || (pendingTo === null && state.location.pathname === to));
337
+ },
338
+ addBlocker(blocker) {
339
+ blockers.add(blocker);
340
+ return () => blockers.delete(blocker);
341
+ },
342
+ };
343
+ }
344
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
package/dist/tree.d.ts ADDED
@@ -0,0 +1,43 @@
1
+ import type { ParsedQuery } from './query.js';
2
+ import type { RouterLocation } from './history.js';
3
+ export type RouteLoaderContext<T = unknown, TRequestContext = unknown> = {
4
+ params: Record<string, string>;
5
+ query: ParsedQuery;
6
+ location: RouterLocation;
7
+ requestContext: TRequestContext;
8
+ signal: AbortSignal;
9
+ route: RouteNode<T, TRequestContext>;
10
+ };
11
+ export type RouteActionSubmission = {
12
+ method?: string;
13
+ data?: unknown;
14
+ };
15
+ export type RouteActionContext<T = unknown, TRequestContext = unknown> = {
16
+ params: Record<string, string>;
17
+ query: ParsedQuery;
18
+ location: RouterLocation;
19
+ requestContext: TRequestContext;
20
+ signal: AbortSignal;
21
+ route: RouteNode<T, TRequestContext>;
22
+ submission: RouteActionSubmission;
23
+ };
24
+ export type RouteNode<T = unknown, TRequestContext = unknown> = {
25
+ id?: string;
26
+ path?: string;
27
+ children?: RouteNode<T, TRequestContext>[];
28
+ render?: (context: {
29
+ outlet: T | null;
30
+ params: Record<string, string>;
31
+ pathname: string;
32
+ route: RouteNode<T, TRequestContext>;
33
+ }) => T;
34
+ loader?: (context: RouteLoaderContext<T, TRequestContext>) => unknown | Promise<unknown>;
35
+ action?: (context: RouteActionContext<T, TRequestContext>) => unknown | Promise<unknown>;
36
+ };
37
+ export type RouteBranchMatch<T = unknown, TRequestContext = unknown> = {
38
+ params: Record<string, string>;
39
+ matches: RouteNode<T, TRequestContext>[];
40
+ };
41
+ export declare function matchRouteTree<T, TRequestContext>(routes: RouteNode<T, TRequestContext>[], pathname: string): RouteBranchMatch<T, TRequestContext> | null;
42
+ export declare function renderMatchedOutlet<T, TRequestContext>(branch: RouteBranchMatch<T, TRequestContext>, pathname: string): T | null;
43
+ //# sourceMappingURL=tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../src/tree.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAElD,MAAM,MAAM,kBAAkB,CAAC,CAAC,GAAG,OAAO,EAAE,eAAe,GAAG,OAAO,IAAI;IACvE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,KAAK,EAAE,WAAW,CAAA;IAClB,QAAQ,EAAE,cAAc,CAAA;IACxB,cAAc,EAAE,eAAe,CAAA;IAC/B,MAAM,EAAE,WAAW,CAAA;IACnB,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,eAAe,CAAC,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,CAAA;CACf,CAAA;AAED,MAAM,MAAM,kBAAkB,CAAC,CAAC,GAAG,OAAO,EAAE,eAAe,GAAG,OAAO,IAAI;IACvE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,KAAK,EAAE,WAAW,CAAA;IAClB,QAAQ,EAAE,cAAc,CAAA;IACxB,cAAc,EAAE,eAAe,CAAA;IAC/B,MAAM,EAAE,WAAW,CAAA;IACnB,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,eAAe,CAAC,CAAA;IACpC,UAAU,EAAE,qBAAqB,CAAA;CAClC,CAAA;AAED,MAAM,MAAM,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE,eAAe,GAAG,OAAO,IAAI;IAC9D,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,eAAe,CAAC,EAAE,CAAA;IAC1C,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE;QACjB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAA;QAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC9B,QAAQ,EAAE,MAAM,CAAA;QAChB,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,eAAe,CAAC,CAAA;KACrC,KAAK,CAAC,CAAA;IACP,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC,EAAE,eAAe,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACxF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC,EAAE,eAAe,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACzF,CAAA;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,GAAG,OAAO,EAAE,eAAe,GAAG,OAAO,IAAI;IACrE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,OAAO,EAAE,SAAS,CAAC,CAAC,EAAE,eAAe,CAAC,EAAE,CAAA;CACzC,CAAA;AAkBD,wBAAgB,cAAc,CAAC,CAAC,EAAE,eAAe,EAC/C,MAAM,EAAE,SAAS,CAAC,CAAC,EAAE,eAAe,CAAC,EAAE,EACvC,QAAQ,EAAE,MAAM,GACf,gBAAgB,CAAC,CAAC,EAAE,eAAe,CAAC,GAAG,IAAI,CAsC7C;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,eAAe,EACpD,MAAM,EAAE,gBAAgB,CAAC,CAAC,EAAE,eAAe,CAAC,EAC5C,QAAQ,EAAE,MAAM,GACf,CAAC,GAAG,IAAI,CAcV"}