soseki 0.0.5 → 0.0.7
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/dist/src/components/browser-router.d.ts +19 -0
- package/dist/src/components/browser-router.d.ts.map +1 -0
- package/dist/src/components/browser-router.jsx +15 -0
- package/dist/src/components/outlet.d.ts +8 -0
- package/dist/src/components/outlet.d.ts.map +1 -0
- package/dist/src/components/outlet.jsx +15 -0
- package/dist/src/components/router.d.ts +21 -0
- package/dist/src/components/router.d.ts.map +1 -0
- package/dist/src/components/router.jsx +138 -0
- package/dist/src/contexts/route-context.d.ts +19 -0
- package/dist/src/contexts/route-context.d.ts.map +1 -0
- package/dist/src/contexts/route-context.js +6 -0
- package/dist/src/contexts/router-context.d.ts +55 -0
- package/dist/src/contexts/router-context.d.ts.map +1 -0
- package/dist/src/contexts/router-context.js +8 -0
- package/dist/src/core/_compare-route-paths.d.ts +11 -0
- package/dist/src/core/_compare-route-paths.d.ts.map +1 -0
- package/dist/src/core/_compare-route-paths.js +92 -0
- package/dist/src/core/_match-route-path.d.ts +22 -0
- package/dist/src/core/_match-route-path.d.ts.map +1 -0
- package/dist/src/core/_match-route-path.js +26 -0
- package/dist/src/core/_process-routes.d.ts +14 -0
- package/dist/src/core/_process-routes.d.ts.map +1 -0
- package/dist/src/core/_process-routes.js +45 -0
- package/dist/src/core/_singleton.d.ts +12 -0
- package/dist/src/core/_singleton.d.ts.map +1 -0
- package/dist/src/core/_singleton.js +18 -0
- package/dist/src/core/_unreachable.d.ts +16 -0
- package/dist/src/core/_unreachable.d.ts.map +1 -0
- package/dist/src/core/_unreachable.js +8 -0
- package/dist/src/core/_valibot.d.ts +25 -0
- package/dist/src/core/_valibot.d.ts.map +1 -0
- package/dist/src/core/_valibot.js +30 -0
- package/dist/src/core/errors.d.ts +182 -0
- package/dist/src/core/errors.d.ts.map +1 -0
- package/dist/src/core/errors.js +166 -0
- package/dist/src/core/expect-history-entry.d.ts +59 -0
- package/dist/src/core/expect-history-entry.d.ts.map +1 -0
- package/dist/src/core/expect-history-entry.js +42 -0
- package/dist/src/core/form-data-to-html-form-element.d.ts +11 -0
- package/dist/src/core/form-data-to-html-form-element.d.ts.map +1 -0
- package/dist/src/core/form-data-to-html-form-element.js +31 -0
- package/dist/src/core/history-entry-id-schema.d.ts +17 -0
- package/dist/src/core/history-entry-id-schema.d.ts.map +1 -0
- package/dist/src/core/history-entry-id-schema.js +9 -0
- package/dist/src/core/history-entry-url-schema.d.ts +18 -0
- package/dist/src/core/history-entry-url-schema.d.ts.map +1 -0
- package/dist/src/core/history-entry-url-schema.js +20 -0
- package/dist/src/core/init-loaders.d.ts +28 -0
- package/dist/src/core/init-loaders.d.ts.map +1 -0
- package/dist/src/core/init-loaders.js +30 -0
- package/dist/src/core/match-routes.d.ts +28 -0
- package/dist/src/core/match-routes.d.ts.map +1 -0
- package/dist/src/core/match-routes.js +31 -0
- package/dist/src/core/readonly-form-data.types.d.ts +74 -0
- package/dist/src/core/readonly-form-data.types.d.ts.map +1 -0
- package/dist/src/core/readonly-url.types.d.ts +164 -0
- package/dist/src/core/readonly-url.types.d.ts.map +1 -0
- package/dist/src/core/redirect-response.d.ts +37 -0
- package/dist/src/core/redirect-response.d.ts.map +1 -0
- package/dist/src/core/redirect-response.js +19 -0
- package/dist/src/core/route-path.d.ts +57 -0
- package/dist/src/core/route-path.d.ts.map +1 -0
- package/dist/src/core/route-path.js +93 -0
- package/dist/src/core/route-request.d.ts +149 -0
- package/dist/src/core/route-request.d.ts.map +1 -0
- package/dist/src/core/route-request.js +41 -0
- package/dist/src/core/route.types.d.ts +296 -0
- package/dist/src/core/route.types.d.ts.map +1 -0
- package/dist/src/core/start-action.d.ts +53 -0
- package/dist/src/core/start-action.d.ts.map +1 -0
- package/dist/src/core/start-action.js +95 -0
- package/dist/src/core/start-loaders.d.ts +63 -0
- package/dist/src/core/start-loaders.d.ts.map +1 -0
- package/dist/src/core/start-loaders.js +138 -0
- package/dist/{core.d.ts → src/core.d.ts} +7 -11
- package/dist/src/core.d.ts.map +1 -0
- package/dist/{core.js → src/core.js} +2 -4
- package/dist/src/engines/engine.types.d.ts +216 -0
- package/dist/src/engines/engine.types.d.ts.map +1 -0
- package/dist/src/engines/navigation-api-engine.d.ts +50 -0
- package/dist/src/engines/navigation-api-engine.d.ts.map +1 -0
- package/dist/src/engines/navigation-api-engine.js +411 -0
- package/dist/src/engines.d.ts +4 -0
- package/dist/src/engines.d.ts.map +1 -0
- package/dist/src/engines.js +1 -0
- package/dist/src/hooks/_use-singleton.d.ts +11 -0
- package/dist/src/hooks/_use-singleton.d.ts.map +1 -0
- package/dist/src/hooks/_use-singleton.js +26 -0
- package/dist/src/hooks/use-action-data.d.ts +17 -0
- package/dist/src/hooks/use-action-data.d.ts.map +1 -0
- package/dist/src/hooks/use-action-data.js +16 -0
- package/dist/src/hooks/use-form-action.d.ts +7 -0
- package/dist/src/hooks/use-form-action.d.ts.map +1 -0
- package/dist/src/hooks/use-form-action.js +9 -0
- package/dist/src/hooks/use-loader-data.d.ts +9 -0
- package/dist/src/hooks/use-loader-data.d.ts.map +1 -0
- package/dist/src/hooks/use-loader-data.js +20 -0
- package/dist/src/hooks/use-navigate.d.ts +53 -0
- package/dist/src/hooks/use-navigate.d.ts.map +1 -0
- package/dist/src/hooks/use-navigate.js +43 -0
- package/dist/{hooks → src/hooks}/use-params.d.ts +2 -2
- package/dist/src/hooks/use-params.d.ts.map +1 -0
- package/dist/{hooks → src/hooks}/use-params.js +1 -1
- package/dist/src/hooks/use-route-context.d.ts +10 -0
- package/dist/src/hooks/use-route-context.d.ts.map +1 -0
- package/dist/src/hooks/use-route-context.js +17 -0
- package/dist/src/hooks/use-router-context.d.ts +12 -0
- package/dist/src/hooks/use-router-context.d.ts.map +1 -0
- package/dist/src/hooks/use-router-context.js +20 -0
- package/dist/src/hooks/use-submit.d.ts +59 -0
- package/dist/src/hooks/use-submit.d.ts.map +1 -0
- package/dist/src/hooks/use-submit.js +38 -0
- package/dist/src/soseki.d.ts +31 -0
- package/dist/src/soseki.d.ts.map +1 -0
- package/dist/src/soseki.js +12 -0
- package/dist/src/utils/redirect.d.ts +11 -0
- package/dist/src/utils/redirect.d.ts.map +1 -0
- package/dist/src/utils/redirect.js +12 -0
- package/package.json +47 -40
- package/src/components/browser-router.tsx +8 -11
- package/src/components/outlet.tsx +3 -2
- package/src/components/router.tsx +139 -145
- package/src/contexts/route-context.ts +6 -5
- package/src/contexts/router-context.ts +36 -19
- package/src/core/_compare-route-paths.ts +48 -34
- package/src/core/_match-route-path.ts +21 -15
- package/src/core/_process-routes.ts +44 -46
- package/src/core/_singleton.ts +13 -38
- package/src/core/_unreachable.ts +12 -7
- package/src/core/_valibot.ts +19 -116
- package/src/core/errors.ts +150 -495
- package/src/core/expect-history-entry.ts +40 -41
- package/src/core/form-data-to-html-form-element.ts +37 -0
- package/src/core/history-entry-id-schema.ts +6 -11
- package/src/core/history-entry-url-schema.ts +25 -18
- package/src/core/init-loaders.ts +35 -57
- package/src/core/match-routes.ts +33 -65
- package/src/core/readonly-form-data.types.ts +48 -28
- package/src/core/readonly-url.types.ts +57 -28
- package/src/core/redirect-response.ts +26 -15
- package/src/core/route-path.ts +114 -0
- package/src/core/route-request.ts +144 -32
- package/src/core/route.types.ts +250 -226
- package/src/core/start-action.ts +164 -0
- package/src/core/start-loaders.ts +190 -212
- package/src/core.ts +8 -15
- package/src/engines/engine.types.ts +204 -166
- package/src/engines/navigation-api-engine.ts +332 -233
- package/src/engines.ts +4 -0
- package/src/hooks/_use-singleton.ts +30 -0
- package/src/hooks/use-action-data.ts +21 -26
- package/src/hooks/use-form-action.ts +4 -5
- package/src/hooks/use-loader-data.ts +16 -18
- package/src/hooks/use-navigate.ts +69 -28
- package/src/hooks/use-params.ts +4 -4
- package/src/hooks/use-route-context.ts +20 -0
- package/src/hooks/use-router-context.ts +25 -0
- package/src/hooks/use-submit.ts +48 -53
- package/src/soseki.ts +27 -34
- package/src/utils/redirect.ts +5 -5
- package/dist/components/action-id.d.ts +0 -19
- package/dist/components/action-id.d.ts.map +0 -1
- package/dist/components/action-id.jsx +0 -14
- package/dist/components/browser-router.d.ts +0 -17
- package/dist/components/browser-router.d.ts.map +0 -1
- package/dist/components/browser-router.jsx +0 -13
- package/dist/components/hidden-input.d.ts +0 -20
- package/dist/components/hidden-input.d.ts.map +0 -1
- package/dist/components/hidden-input.jsx +0 -8
- package/dist/components/outlet.d.ts +0 -8
- package/dist/components/outlet.d.ts.map +0 -1
- package/dist/components/outlet.jsx +0 -15
- package/dist/components/router.d.ts +0 -23
- package/dist/components/router.d.ts.map +0 -1
- package/dist/components/router.jsx +0 -128
- package/dist/contexts/route-context.d.ts +0 -19
- package/dist/contexts/route-context.d.ts.map +0 -1
- package/dist/contexts/route-context.js +0 -6
- package/dist/contexts/router-context.d.ts +0 -46
- package/dist/contexts/router-context.d.ts.map +0 -1
- package/dist/contexts/router-context.js +0 -8
- package/dist/core/_action-id-registry.d.ts +0 -10
- package/dist/core/_action-id-registry.d.ts.map +0 -1
- package/dist/core/_action-id-registry.js +0 -8
- package/dist/core/_capture-stack-trace.d.ts +0 -8
- package/dist/core/_capture-stack-trace.d.ts.map +0 -1
- package/dist/core/_capture-stack-trace.js +0 -12
- package/dist/core/_compare-route-paths.d.ts +0 -11
- package/dist/core/_compare-route-paths.d.ts.map +0 -1
- package/dist/core/_compare-route-paths.js +0 -80
- package/dist/core/_create-html-form-element-form-form-data.d.ts +0 -9
- package/dist/core/_create-html-form-element-form-form-data.d.ts.map +0 -1
- package/dist/core/_create-html-form-element-form-form-data.js +0 -27
- package/dist/core/_encode-pathname.d.ts +0 -10
- package/dist/core/_encode-pathname.d.ts.map +0 -1
- package/dist/core/_encode-pathname.js +0 -16
- package/dist/core/_is-error.d.ts +0 -3
- package/dist/core/_is-error.d.ts.map +0 -1
- package/dist/core/_is-error.js +0 -13
- package/dist/core/_is-promise-like.d.ts +0 -8
- package/dist/core/_is-promise-like.d.ts.map +0 -1
- package/dist/core/_is-promise-like.js +0 -12
- package/dist/core/_match-route-path.d.ts +0 -19
- package/dist/core/_match-route-path.d.ts.map +0 -1
- package/dist/core/_match-route-path.js +0 -22
- package/dist/core/_process-routes.d.ts +0 -9
- package/dist/core/_process-routes.d.ts.map +0 -1
- package/dist/core/_process-routes.js +0 -47
- package/dist/core/_singleton.d.ts +0 -18
- package/dist/core/_singleton.d.ts.map +0 -1
- package/dist/core/_singleton.js +0 -37
- package/dist/core/_unreachable.d.ts +0 -12
- package/dist/core/_unreachable.d.ts.map +0 -1
- package/dist/core/_unreachable.js +0 -8
- package/dist/core/_use-singleton.d.ts +0 -11
- package/dist/core/_use-singleton.d.ts.map +0 -1
- package/dist/core/_use-singleton.js +0 -21
- package/dist/core/_valibot.d.ts +0 -52
- package/dist/core/_valibot.d.ts.map +0 -1
- package/dist/core/_valibot.js +0 -107
- package/dist/core/_weak-id-registry.d.ts +0 -76
- package/dist/core/_weak-id-registry.d.ts.map +0 -1
- package/dist/core/_weak-id-registry.js +0 -67
- package/dist/core/constants.d.ts +0 -5
- package/dist/core/constants.d.ts.map +0 -1
- package/dist/core/constants.js +0 -4
- package/dist/core/data-map.types.d.ts +0 -23
- package/dist/core/data-map.types.d.ts.map +0 -1
- package/dist/core/data-map.types.js +0 -1
- package/dist/core/data-store.types.d.ts +0 -22
- package/dist/core/data-store.types.d.ts.map +0 -1
- package/dist/core/data-store.types.js +0 -1
- package/dist/core/deferred-promise.d.ts +0 -203
- package/dist/core/deferred-promise.d.ts.map +0 -1
- package/dist/core/deferred-promise.js +0 -200
- package/dist/core/errors.d.ts +0 -303
- package/dist/core/errors.d.ts.map +0 -1
- package/dist/core/errors.js +0 -400
- package/dist/core/expect-history-entry.d.ts +0 -52
- package/dist/core/expect-history-entry.d.ts.map +0 -1
- package/dist/core/expect-history-entry.js +0 -38
- package/dist/core/history-entry-id-schema.d.ts +0 -17
- package/dist/core/history-entry-id-schema.d.ts.map +0 -1
- package/dist/core/history-entry-id-schema.js +0 -9
- package/dist/core/history-entry-url-schema.d.ts +0 -20
- package/dist/core/history-entry-url-schema.d.ts.map +0 -1
- package/dist/core/history-entry-url-schema.js +0 -16
- package/dist/core/init-loaders.d.ts +0 -37
- package/dist/core/init-loaders.d.ts.map +0 -1
- package/dist/core/init-loaders.js +0 -38
- package/dist/core/match-routes.d.ts +0 -31
- package/dist/core/match-routes.d.ts.map +0 -1
- package/dist/core/match-routes.js +0 -54
- package/dist/core/readonly-form-data.types.d.ts +0 -32
- package/dist/core/readonly-form-data.types.d.ts.map +0 -1
- package/dist/core/readonly-url.types.d.ts +0 -135
- package/dist/core/readonly-url.types.d.ts.map +0 -1
- package/dist/core/redirect-response.d.ts +0 -29
- package/dist/core/redirect-response.d.ts.map +0 -1
- package/dist/core/redirect-response.js +0 -17
- package/dist/core/route-request.d.ts +0 -52
- package/dist/core/route-request.d.ts.map +0 -1
- package/dist/core/route-request.js +0 -26
- package/dist/core/route.types.d.ts +0 -309
- package/dist/core/route.types.d.ts.map +0 -1
- package/dist/core/start-actions.d.ts +0 -60
- package/dist/core/start-actions.d.ts.map +0 -1
- package/dist/core/start-actions.js +0 -186
- package/dist/core/start-loaders.d.ts +0 -69
- package/dist/core/start-loaders.d.ts.map +0 -1
- package/dist/core/start-loaders.js +0 -154
- package/dist/core.d.ts.map +0 -1
- package/dist/engines/engine.types.d.ts +0 -190
- package/dist/engines/engine.types.d.ts.map +0 -1
- package/dist/engines/navigation-api-engine.d.ts +0 -48
- package/dist/engines/navigation-api-engine.d.ts.map +0 -1
- package/dist/engines/navigation-api-engine.js +0 -332
- package/dist/hooks/_use-route-context.d.ts +0 -10
- package/dist/hooks/_use-route-context.d.ts.map +0 -1
- package/dist/hooks/_use-route-context.js +0 -17
- package/dist/hooks/_use-router-context.d.ts +0 -10
- package/dist/hooks/_use-router-context.d.ts.map +0 -1
- package/dist/hooks/_use-router-context.js +0 -18
- package/dist/hooks/use-action-data.d.ts +0 -23
- package/dist/hooks/use-action-data.d.ts.map +0 -1
- package/dist/hooks/use-action-data.js +0 -16
- package/dist/hooks/use-form-action.d.ts +0 -7
- package/dist/hooks/use-form-action.d.ts.map +0 -1
- package/dist/hooks/use-form-action.js +0 -10
- package/dist/hooks/use-loader-data.d.ts +0 -11
- package/dist/hooks/use-loader-data.d.ts.map +0 -1
- package/dist/hooks/use-loader-data.js +0 -19
- package/dist/hooks/use-navigate.d.ts +0 -39
- package/dist/hooks/use-navigate.d.ts.map +0 -1
- package/dist/hooks/use-navigate.js +0 -26
- package/dist/hooks/use-params.d.ts.map +0 -1
- package/dist/hooks/use-pathname.d.ts +0 -7
- package/dist/hooks/use-pathname.d.ts.map +0 -1
- package/dist/hooks/use-pathname.js +0 -9
- package/dist/hooks/use-submit.d.ts +0 -66
- package/dist/hooks/use-submit.d.ts.map +0 -1
- package/dist/hooks/use-submit.js +0 -35
- package/dist/soseki.d.ts +0 -42
- package/dist/soseki.d.ts.map +0 -1
- package/dist/soseki.js +0 -19
- package/dist/utils/get-action-id.d.ts +0 -8
- package/dist/utils/get-action-id.d.ts.map +0 -1
- package/dist/utils/get-action-id.js +0 -11
- package/dist/utils/href.d.ts +0 -11
- package/dist/utils/href.d.ts.map +0 -1
- package/dist/utils/href.js +0 -12
- package/dist/utils/redirect.d.ts +0 -11
- package/dist/utils/redirect.d.ts.map +0 -1
- package/dist/utils/redirect.js +0 -12
- package/dist/utils/route-index.d.ts +0 -41
- package/dist/utils/route-index.d.ts.map +0 -1
- package/dist/utils/route-index.js +0 -12
- package/dist/utils/route-route.d.ts +0 -62
- package/dist/utils/route-route.d.ts.map +0 -1
- package/dist/utils/route-route.js +0 -25
- package/dist/utils/set-action-id.d.ts +0 -9
- package/dist/utils/set-action-id.d.ts.map +0 -1
- package/dist/utils/set-action-id.js +0 -12
- package/src/components/action-id.tsx +0 -35
- package/src/components/hidden-input.tsx +0 -39
- package/src/core/_action-id-registry.ts +0 -11
- package/src/core/_capture-stack-trace.ts +0 -12
- package/src/core/_create-html-form-element-form-form-data.ts +0 -32
- package/src/core/_encode-pathname.ts +0 -17
- package/src/core/_is-error.ts +0 -16
- package/src/core/_is-promise-like.ts +0 -14
- package/src/core/_use-singleton.ts +0 -24
- package/src/core/_weak-id-registry.ts +0 -125
- package/src/core/constants.ts +0 -4
- package/src/core/data-map.types.ts +0 -28
- package/src/core/data-store.types.ts +0 -25
- package/src/core/deferred-promise.ts +0 -408
- package/src/core/start-actions.ts +0 -274
- package/src/hooks/_use-route-context.ts +0 -19
- package/src/hooks/_use-router-context.ts +0 -25
- package/src/hooks/use-pathname.ts +0 -10
- package/src/utils/get-action-id.ts +0 -12
- package/src/utils/href.ts +0 -17
- package/src/utils/route-index.ts +0 -70
- package/src/utils/route-route.ts +0 -111
- package/src/utils/set-action-id.ts +0 -14
- /package/dist/{core → src/core}/readonly-form-data.types.js +0 -0
- /package/dist/{core → src/core}/readonly-url.types.js +0 -0
- /package/dist/{core → src/core}/route.types.js +0 -0
- /package/dist/{engines → src/engines}/engine.types.js +0 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { NinjaPromise } from "ninja-promise";
|
|
2
|
+
import type { HistoryEntry } from "./expect-history-entry.js";
|
|
3
|
+
import type { HistoryEntryId } from "./history-entry-id-schema.js";
|
|
4
|
+
import type { MatchedRoute } from "./match-routes.js";
|
|
5
|
+
import type { LoaderFunction } from "./route.types.js";
|
|
6
|
+
/**
|
|
7
|
+
* `startLoaders` 関数を実行する際に必要となる引数オブジェクトの型定義です。
|
|
8
|
+
*/
|
|
9
|
+
export type StartLoadersArgs = {
|
|
10
|
+
/**
|
|
11
|
+
* 遷移前にマッチしていたルート情報の配列です。
|
|
12
|
+
*/
|
|
13
|
+
readonly prevRoutes: readonly Pick<MatchedRoute, "path" | "params">[] | null;
|
|
14
|
+
/**
|
|
15
|
+
* 遷移先の URL にマッチしている全ルート情報の配列です。
|
|
16
|
+
*/
|
|
17
|
+
readonly currentRoutes: readonly Pick<MatchedRoute, "path" | "params" | "action" | "loader" | "shouldReload">[];
|
|
18
|
+
/**
|
|
19
|
+
* 遷移前の履歴エントリー情報です。
|
|
20
|
+
*/
|
|
21
|
+
readonly prevEntry: Pick<HistoryEntry, "id" | "url">;
|
|
22
|
+
/**
|
|
23
|
+
* 遷移先(現在)の履歴エントリー情報です。
|
|
24
|
+
*/
|
|
25
|
+
readonly currentEntry: Pick<HistoryEntry, "id" | "url">;
|
|
26
|
+
/**
|
|
27
|
+
* 履歴エントリー ID ごとに、各ローダーの実行結果を多重管理しているグローバルなデータストアです。
|
|
28
|
+
*/
|
|
29
|
+
readonly loaderDataStore: Map<HistoryEntryId, Map<LoaderFunction, NinjaPromise<unknown>>>;
|
|
30
|
+
/** 進行中のローダーの非同期処理を外部から中断するためのシグナルオブジェクトです。 */
|
|
31
|
+
readonly signal: AbortSignal;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* 直前にアクションが実行されていた場合に、追加の文脈として渡されるオプションオブジェクトの型定義です。
|
|
35
|
+
*/
|
|
36
|
+
export type StartLoadersOptions = {
|
|
37
|
+
/**
|
|
38
|
+
* アクション実行時に送信された標準のフォームデータです。
|
|
39
|
+
*/
|
|
40
|
+
readonly formData: FormData;
|
|
41
|
+
/**
|
|
42
|
+
* 直前のアクション関数が返した実行結果データです。
|
|
43
|
+
*/
|
|
44
|
+
readonly actionData: unknown;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* 起動されたローダー群のライフサイクルおよび完了待機を制御するインターフェースです。
|
|
48
|
+
*/
|
|
49
|
+
export interface StartedLoaders {
|
|
50
|
+
/**
|
|
51
|
+
* 現在のフェーズでスケジュールされたすべてのローダーの処理が完了するまで待機します。
|
|
52
|
+
*/
|
|
53
|
+
idle: () => Promise<void>;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 画面遷移やデータ更新の発生に伴い、現在マッチしているルートのローダー関数群を精査し、キャッシュの再利用または読み込みを動的に判定・実行する関数です。
|
|
57
|
+
*
|
|
58
|
+
* @param args ローダーの評価に必要な現旧のルートおよび履歴コンテキストです。
|
|
59
|
+
* @param options 直前のアクション実行コンテキストを含むオプションです。
|
|
60
|
+
* @returns スケジュールされたローダー全体の処理完了を待機するための `StartedLoaders` オブジェクトを返します。
|
|
61
|
+
*/
|
|
62
|
+
export default function startLoaders(args: StartLoadersArgs, options?: StartLoadersOptions): StartedLoaders;
|
|
63
|
+
//# sourceMappingURL=start-loaders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-loaders.d.ts","sourceRoot":"","sources":["../../../src/core/start-loaders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAI7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,SAAS,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,QAAQ,CAAC,EAAE,GAAG,IAAI,CAAC;IAE7E;;OAEG;IACH,QAAQ,CAAC,aAAa,EAAE,SAAS,IAAI,CACnC,YAAY,EACZ,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,cAAc,CACzD,EAAE,CAAC;IAEJ;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC;IAErD;;OAEG;IACH,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC;IAExD;;OAEG;IACH,QAAQ,CAAC,eAAe,EAAE,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,cAAc,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAE1F,8CAA8C;IAC9C,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAC9B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAE5B;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,CAClC,IAAI,EAAE,gBAAgB,EACtB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,cAAc,CAsJhB"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { NinjaPromise } from "ninja-promise";
|
|
2
|
+
import unreachable from "./_unreachable.js";
|
|
3
|
+
import { LoaderConditionError } from "./errors.js";
|
|
4
|
+
import RouteRequest from "./route-request.js";
|
|
5
|
+
/**
|
|
6
|
+
* 画面遷移やデータ更新の発生に伴い、現在マッチしているルートのローダー関数群を精査し、キャッシュの再利用または読み込みを動的に判定・実行する関数です。
|
|
7
|
+
*
|
|
8
|
+
* @param args ローダーの評価に必要な現旧のルートおよび履歴コンテキストです。
|
|
9
|
+
* @param options 直前のアクション実行コンテキストを含むオプションです。
|
|
10
|
+
* @returns スケジュールされたローダー全体の処理完了を待機するための `StartedLoaders` オブジェクトを返します。
|
|
11
|
+
*/
|
|
12
|
+
export default function startLoaders(args, options) {
|
|
13
|
+
const { signal, prevEntry, prevRoutes, currentEntry, currentRoutes, loaderDataStore } = args;
|
|
14
|
+
// アクション契機でのデータリロードであるか、通常の GET 遷移であるかを識別するためのコンテキストを構築します。
|
|
15
|
+
const actionContext = options && {
|
|
16
|
+
formData: options.formData,
|
|
17
|
+
actionData: options.actionData,
|
|
18
|
+
};
|
|
19
|
+
// マッチした配列は「子ルート(詳細度高)」から「親ルート(詳細度低)」の順にソートされているため、先頭の要素から、ルート全体の動的パスパラメーターを一括して回収できます。
|
|
20
|
+
const prevParams = prevRoutes?.[0]?.params || {};
|
|
21
|
+
const prevRoutePathSet = new Set(prevRoutes?.map((r) => r.path));
|
|
22
|
+
// 遷移前の履歴 ID に紐づくローダーデータのキャッシュマップをストアから取得します。
|
|
23
|
+
const prevLoaderDataMap = loaderDataStore.get(prevEntry.id);
|
|
24
|
+
// 今回の実行フェーズで収集・確定させる新しいローダーデータマップを初期化します。
|
|
25
|
+
const currentLoaderDataMap = new Map();
|
|
26
|
+
const request = RouteRequest.new("GET", currentEntry.url, signal);
|
|
27
|
+
// 現在マッチしているすべてのルートセグメントを個別に精査します。
|
|
28
|
+
for (const currentRoute of currentRoutes) {
|
|
29
|
+
const { loader: currentLoader, params: currentParams, shouldReload } = currentRoute;
|
|
30
|
+
// ローダー関数が定義されていないルートセグメントはスキップします。
|
|
31
|
+
if (typeof currentLoader !== "function") {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
// 過去に同じローダー関数が実行され、かつそのキャッシュデータが存在するかをチェックします。
|
|
35
|
+
const prevLoaderData = prevLoaderDataMap?.get(currentLoader);
|
|
36
|
+
if (!prevLoaderData) {
|
|
37
|
+
// 過去のキャッシュが存在しない=今回新しくマッチした未知のルート階層であると判定し、判定の余地なく新規にローダーを起動します。
|
|
38
|
+
const data = NinjaPromise.try(function executeLoader() {
|
|
39
|
+
return currentLoader({
|
|
40
|
+
params: currentParams,
|
|
41
|
+
request,
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
// ローダーの結果を待機、エラーハンドリングする処理は、この結果を参照するコンポーネントに任せます。
|
|
45
|
+
currentLoaderDataMap.set(currentLoader, data);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
// キャッシュが存在する場合、ユーザー定義の `shouldReload` に照らし合わせて再読み込みが必要かを安全に検証します。
|
|
49
|
+
const should = NinjaPromise.try(function executeShouldReload() {
|
|
50
|
+
if (!actionContext) {
|
|
51
|
+
// 通常の GET 遷移時における再読み込み判定用引数を組み立てて実行します。
|
|
52
|
+
return shouldReload({
|
|
53
|
+
prevUrl: prevEntry.url,
|
|
54
|
+
currentUrl: currentEntry.url,
|
|
55
|
+
prevParams,
|
|
56
|
+
currentParams,
|
|
57
|
+
triggerMethod: "GET",
|
|
58
|
+
// 遷移前のルート群に今回精査しているパスが含まれていなければ、新規表示扱いとして、既定値を true とします。
|
|
59
|
+
defaultShouldReload: !prevRoutePathSet.has(currentRoute.path),
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// フォームデータの送信を伴う更新契機の場合の判定引数です。
|
|
64
|
+
return shouldReload({
|
|
65
|
+
...actionContext,
|
|
66
|
+
prevUrl: prevEntry.url,
|
|
67
|
+
currentUrl: prevEntry.url,
|
|
68
|
+
prevParams,
|
|
69
|
+
currentParams,
|
|
70
|
+
triggerMethod: "POST",
|
|
71
|
+
// データ更新後は原則として全再取得が安全なため、既定値を true とします。
|
|
72
|
+
defaultShouldReload: true,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
let data;
|
|
77
|
+
// `shouldReload` の同期的な実行結果に基づいて処理を分岐します。
|
|
78
|
+
switch (should.status) {
|
|
79
|
+
case "pending": {
|
|
80
|
+
// shouldReload は仕様上「同期的」に真偽値を返す必要があります(Promise を返してはならない)。
|
|
81
|
+
// もし pending であれば LoaderConditionError を生成して拒否状態のプロミスとしてラップします。
|
|
82
|
+
const error = new LoaderConditionError({
|
|
83
|
+
url: request.url.href,
|
|
84
|
+
returnValue: should,
|
|
85
|
+
shouldReload,
|
|
86
|
+
});
|
|
87
|
+
data = NinjaPromise.reject(error);
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
case "rejected":
|
|
91
|
+
// shouldReload の実行中に同期的な例外が発生した場合は、そのエラー状態をそのまま引き継ぎ、ハンドリングを画面側に委ねます。
|
|
92
|
+
data = should;
|
|
93
|
+
break;
|
|
94
|
+
case "fulfilled": {
|
|
95
|
+
const { value } = should;
|
|
96
|
+
switch (value) {
|
|
97
|
+
case true:
|
|
98
|
+
// 明示的にリロードの指示が出た場合のみ、ローダーを新規に再実行します。
|
|
99
|
+
data = NinjaPromise.try(function executeLoader() {
|
|
100
|
+
return currentLoader({
|
|
101
|
+
params: currentParams,
|
|
102
|
+
request,
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
break;
|
|
106
|
+
case false:
|
|
107
|
+
// 再読み込みが不要(現状維持)と判定された場合は、前回のキャッシュプロミスをそのまま無加工で引き継ぎます。
|
|
108
|
+
data = prevLoaderData;
|
|
109
|
+
break;
|
|
110
|
+
default: {
|
|
111
|
+
// 戻り値が boolean 型(true / false)ではなかった場合、仕様不適合としてエラーを割り当てます。
|
|
112
|
+
const error = new LoaderConditionError({
|
|
113
|
+
url: request.url.href,
|
|
114
|
+
returnValue: value,
|
|
115
|
+
shouldReload,
|
|
116
|
+
});
|
|
117
|
+
// エラーハンドリングは、このローダーデータを参照するコンポーネントに任せます。
|
|
118
|
+
data = NinjaPromise.reject(error);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
default:
|
|
124
|
+
unreachable(should);
|
|
125
|
+
}
|
|
126
|
+
// 確定したプロミスを今回のマップに登録します。
|
|
127
|
+
currentLoaderDataMap.set(currentLoader, data);
|
|
128
|
+
}
|
|
129
|
+
// 今回の実行フェーズで収集・更新されたローダーデータが存在する場合、グローバルなキャッシュストアへマージして永続化します。
|
|
130
|
+
if (currentLoaderDataMap.size > 0) {
|
|
131
|
+
loaderDataStore.set(currentEntry.id, new Map([...(loaderDataStore.get(currentEntry.id) || []), ...currentLoaderDataMap]));
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
async idle() {
|
|
135
|
+
await Promise.allSettled(currentLoaderDataMap.values());
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
export { default as Router } from "./components/router.jsx";
|
|
2
1
|
export type * from "./components/router.jsx";
|
|
2
|
+
export { default as Router } from "./components/router.jsx";
|
|
3
|
+
/**************************************************************************************************/
|
|
3
4
|
export type * from "./contexts/route-context.js";
|
|
4
5
|
export { default as RouteContext } from "./contexts/route-context.js";
|
|
5
6
|
export type * from "./contexts/router-context.js";
|
|
6
7
|
export { default as RouterContext } from "./contexts/router-context.js";
|
|
7
|
-
|
|
8
|
-
export type * from "./core/data-map.types.js";
|
|
9
|
-
export type * from "./core/data-store.types.js";
|
|
8
|
+
/**************************************************************************************************/
|
|
10
9
|
export type * from "./core/expect-history-entry.js";
|
|
11
10
|
export { default as expectHistoryEntry } from "./core/expect-history-entry.js";
|
|
12
11
|
export type * from "./core/history-entry-id-schema.js";
|
|
@@ -17,13 +16,10 @@ export type * from "./core/init-loaders.js";
|
|
|
17
16
|
export { default as initLoaders } from "./core/init-loaders.js";
|
|
18
17
|
export type * from "./core/match-routes.js";
|
|
19
18
|
export { default as matchRoutes } from "./core/match-routes.js";
|
|
20
|
-
export type * from "./core/
|
|
21
|
-
export { default as
|
|
22
|
-
export type * from "./core/start-
|
|
23
|
-
export { default as
|
|
19
|
+
export type * from "./core/route-path.js";
|
|
20
|
+
export { default as RoutePath } from "./core/route-path.js";
|
|
21
|
+
export type * from "./core/start-action.js";
|
|
22
|
+
export { default as startAction } from "./core/start-action.js";
|
|
24
23
|
export type * from "./core/start-loaders.js";
|
|
25
24
|
export { default as startLoaders } from "./core/start-loaders.js";
|
|
26
|
-
export type * from "./engines/engine.types.js";
|
|
27
|
-
export type * from "./engines/navigation-api-engine.js";
|
|
28
|
-
export { default as NavigationApiEngine } from "./engines/navigation-api-engine.js";
|
|
29
25
|
//# sourceMappingURL=core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/core.ts"],"names":[],"mappings":"AAAA,mBAAmB,yBAAyB,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAE5D,oGAAoG;AAEpG,mBAAmB,6BAA6B,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEtE,mBAAmB,8BAA8B,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAExE,oGAAoG;AAEpG,mBAAmB,gCAAgC,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAE/E,mBAAmB,mCAAmC,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAEpF,mBAAmB,oCAAoC,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAEtF,mBAAmB,wBAAwB,CAAC;AAC5C,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAEhE,mBAAmB,wBAAwB,CAAC;AAC5C,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAEhE,mBAAmB,sBAAsB,CAAC;AAC1C,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAE5D,mBAAmB,wBAAwB,CAAC;AAC5C,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAEhE,mBAAmB,yBAAyB,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
export { default as Router } from "./components/router.jsx";
|
|
2
2
|
export { default as RouteContext } from "./contexts/route-context.js";
|
|
3
3
|
export { default as RouterContext } from "./contexts/router-context.js";
|
|
4
|
-
export { ACTION_ID_FORM_DATA_NAME } from "./core/constants.js";
|
|
5
4
|
export { default as expectHistoryEntry } from "./core/expect-history-entry.js";
|
|
6
5
|
export { default as HistoryEntryIdSchema } from "./core/history-entry-id-schema.js";
|
|
7
6
|
export { default as HistoryEntryUrlSchema } from "./core/history-entry-url-schema.js";
|
|
8
7
|
export { default as initLoaders } from "./core/init-loaders.js";
|
|
9
8
|
export { default as matchRoutes } from "./core/match-routes.js";
|
|
10
|
-
export { default as
|
|
11
|
-
export { default as
|
|
9
|
+
export { default as RoutePath } from "./core/route-path.js";
|
|
10
|
+
export { default as startAction } from "./core/start-action.js";
|
|
12
11
|
export { default as startLoaders } from "./core/start-loaders.js";
|
|
13
|
-
export { default as NavigationApiEngine } from "./engines/navigation-api-engine.js";
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import type { NinjaPromise } from "ninja-promise";
|
|
2
|
+
import type { HistoryEntry } from "../core/expect-history-entry.js";
|
|
3
|
+
import type { HistoryEntryId } from "../core/history-entry-id-schema.js";
|
|
4
|
+
import type { MatchedRoute } from "../core/match-routes.js";
|
|
5
|
+
import type { ReadonlyFormData } from "../core/readonly-form-data.types.js";
|
|
6
|
+
import type { ReadonlyURLSearchParams } from "../core/readonly-url.types.js";
|
|
7
|
+
import type { Route, ActionFunction, LoaderFunction } from "../core/route.types.js";
|
|
8
|
+
/**
|
|
9
|
+
* ルーターが管理する現在の画面の状態を表す型定義です。
|
|
10
|
+
*/
|
|
11
|
+
export type RouterState = {
|
|
12
|
+
/**
|
|
13
|
+
* 現在のアクティブな履歴エントリーです。
|
|
14
|
+
*/
|
|
15
|
+
entry: HistoryEntry;
|
|
16
|
+
/**
|
|
17
|
+
* 現在の URL にマッチしている子から親までの階層的なルートの配列です。
|
|
18
|
+
*/
|
|
19
|
+
routes: readonly [MatchedRoute, ...MatchedRoute[]];
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* 実行中のルーティングエンジンを安全に停止させ、各種イベントリスナーや非同期処理をクリーンアップするための関数インターフェースです。
|
|
23
|
+
*/
|
|
24
|
+
export interface IStopEngine {
|
|
25
|
+
(): void;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* ルーティングエンジンに関わる各種引数や戻り値の型をまとめた名前空間です。
|
|
29
|
+
*/
|
|
30
|
+
export declare namespace IEngine {
|
|
31
|
+
/**
|
|
32
|
+
* ルーター初期化メソッド `init` に渡される引数の型定義です。
|
|
33
|
+
*/
|
|
34
|
+
type InitArgs = {
|
|
35
|
+
/**
|
|
36
|
+
* アプリケーションに登録されているすべての正規化済みルートの定義配列です。
|
|
37
|
+
*/
|
|
38
|
+
routes: readonly Route[];
|
|
39
|
+
/**
|
|
40
|
+
* 各履歴エントリーに紐づくローダーの非同期状態を多重管理する、共有データストアへの参照です。
|
|
41
|
+
*/
|
|
42
|
+
loaderDataStore: Map<HistoryEntryId, Map<LoaderFunction, NinjaPromise<unknown>>>;
|
|
43
|
+
/**
|
|
44
|
+
* 中断シグナルを取得します。
|
|
45
|
+
*/
|
|
46
|
+
getSignal: () => AbortSignal;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* ルーター初期化メソッド `init` が返す初期状態の型定義です。
|
|
50
|
+
*
|
|
51
|
+
* マッチするルートがあればその状態を返し、なければ `null` となります。
|
|
52
|
+
*/
|
|
53
|
+
type InitReturn = RouterState | null;
|
|
54
|
+
/**
|
|
55
|
+
* エンジンの稼働開始メソッド `start` に渡される引数の型定義です。
|
|
56
|
+
*
|
|
57
|
+
* ナビゲーションイベントの監視や状態同期に必要な依存関係を集約します。
|
|
58
|
+
*/
|
|
59
|
+
type StartArgs = {
|
|
60
|
+
/**
|
|
61
|
+
* アプリケーションに登録されているすべての正規化済みルートの定義配列です。
|
|
62
|
+
*/
|
|
63
|
+
routes: readonly Route[];
|
|
64
|
+
/**
|
|
65
|
+
* 各履歴エントリーに紐づくアクションの非同期状態を保持する共有データストアです。
|
|
66
|
+
*/
|
|
67
|
+
actionDataStore: Map<HistoryEntryId, Map<ActionFunction, NinjaPromise<unknown>>>;
|
|
68
|
+
/**
|
|
69
|
+
* 各履歴エントリーに紐づくローダーの非同期状態を保持する共有データストアです。
|
|
70
|
+
*/
|
|
71
|
+
loaderDataStore: Map<HistoryEntryId, Map<LoaderFunction, NinjaPromise<unknown>>>;
|
|
72
|
+
/**
|
|
73
|
+
* エンジン内部で遷移が確定した際、新しい状態を Reactに通知して画面の再描画を要求するための更新関数です。
|
|
74
|
+
*
|
|
75
|
+
* 引数なしの呼び出しは、現在の状態を維持したままの強制再レンダリングを意味します。
|
|
76
|
+
*/
|
|
77
|
+
update: {
|
|
78
|
+
/**
|
|
79
|
+
* 現在の状態を維持したまま強制的に再レンダリングします。
|
|
80
|
+
*/
|
|
81
|
+
(): void;
|
|
82
|
+
/**
|
|
83
|
+
* ルーターの状態を更新します。
|
|
84
|
+
*
|
|
85
|
+
* @param newRouterState 新しいルーターの状態です。
|
|
86
|
+
*/
|
|
87
|
+
(newRouterState: RouterState | null): void;
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* 中断シグナルを取得します。
|
|
91
|
+
*/
|
|
92
|
+
getSignal: () => AbortSignal;
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* エンジンの稼働開始メソッド `start` の戻り値です。
|
|
96
|
+
*
|
|
97
|
+
* 監視イベントのリスナーを解除するためのクリーンアップ関数を返すか、環境によって何も返さない場合があります。
|
|
98
|
+
*/
|
|
99
|
+
type StartReturn = IStopEngine | void;
|
|
100
|
+
/**
|
|
101
|
+
* プログラムからのフォーム送信やクエリー更新を行う `submit` メソッドの引数の型定義です。
|
|
102
|
+
*/
|
|
103
|
+
type SubmitArgs = {
|
|
104
|
+
/**
|
|
105
|
+
* HTTP POST メソッドに相当する、マルチパートまたは URL エンコードされたフォームデータの送信です。
|
|
106
|
+
*/
|
|
107
|
+
type: "FORM_DATA";
|
|
108
|
+
/**
|
|
109
|
+
* 送信する不変のフォームデータ本体です。
|
|
110
|
+
*/
|
|
111
|
+
target: ReadonlyFormData;
|
|
112
|
+
/**
|
|
113
|
+
* アクションの送信先となる対象の URL パス文字列です。
|
|
114
|
+
*/
|
|
115
|
+
action: string;
|
|
116
|
+
} | {
|
|
117
|
+
/**
|
|
118
|
+
* HTTP GET メソッドに相当する、URL の検索クエリーの更新送信です。
|
|
119
|
+
*/
|
|
120
|
+
type: "URL_SEARCH_PARAMS";
|
|
121
|
+
/**
|
|
122
|
+
* 更新対象となる検索クエリーパラメータです。
|
|
123
|
+
*/
|
|
124
|
+
target: ReadonlyURLSearchParams;
|
|
125
|
+
/**
|
|
126
|
+
* クエリーの付与先となる対象の URL パス文字列です。
|
|
127
|
+
*/
|
|
128
|
+
action: string;
|
|
129
|
+
/**
|
|
130
|
+
* 履歴スタックへの追加方法を指定します。
|
|
131
|
+
*
|
|
132
|
+
* - `"push"`: 履歴エントリーの新規追加
|
|
133
|
+
* - `"replace"`: 履歴エントリーの上書き
|
|
134
|
+
*/
|
|
135
|
+
history: "replace" | "push";
|
|
136
|
+
};
|
|
137
|
+
/**
|
|
138
|
+
* 命令的な画面遷移を行う `navigate` メソッドの引数の型定義です。
|
|
139
|
+
*
|
|
140
|
+
* リンクをクリックした際のアドレス遷移か、ブラウザーの「戻る・進む」に相当する相対移動かで分岐します。
|
|
141
|
+
*/
|
|
142
|
+
type NavigateArgs = {
|
|
143
|
+
/**
|
|
144
|
+
* 明示的なアドレス指定による前方移動です。
|
|
145
|
+
*/
|
|
146
|
+
type: "LINK";
|
|
147
|
+
/**
|
|
148
|
+
* 遷移先のアドレス表現の指定です。完全なパス文字列か、部分的なパーツの組み合わせかを選択します。
|
|
149
|
+
*/
|
|
150
|
+
to: {
|
|
151
|
+
/**
|
|
152
|
+
* URL パスで前方移動する形式です。
|
|
153
|
+
*/
|
|
154
|
+
type: "PATH";
|
|
155
|
+
/**
|
|
156
|
+
* URL パスです。
|
|
157
|
+
*/
|
|
158
|
+
path: string;
|
|
159
|
+
} | {
|
|
160
|
+
/**
|
|
161
|
+
* URL の各コンポーネントを個別に指定する形式です。
|
|
162
|
+
*/
|
|
163
|
+
type: "PARTIAL";
|
|
164
|
+
/**
|
|
165
|
+
* 最初のスラッシュ `/` から始まる URL のパス部分です。
|
|
166
|
+
*/
|
|
167
|
+
pathname?: string | undefined;
|
|
168
|
+
/**
|
|
169
|
+
* 先頭のクエスチョンマーク `?` を含む URL のクエリー文字列です。
|
|
170
|
+
*/
|
|
171
|
+
search?: string | undefined;
|
|
172
|
+
/**
|
|
173
|
+
* URL のハッシュ(シャープ記号 `#` を含むフラグメント識別子)です。
|
|
174
|
+
*/
|
|
175
|
+
hash?: string | undefined;
|
|
176
|
+
};
|
|
177
|
+
/**
|
|
178
|
+
* 履歴スタックへの追加方法を指定します。
|
|
179
|
+
*
|
|
180
|
+
* - `"push"`: 履歴エントリーの新規追加
|
|
181
|
+
* - `"replace"`: 履歴エントリーの上書き
|
|
182
|
+
*/
|
|
183
|
+
history: "replace" | "push";
|
|
184
|
+
} | {
|
|
185
|
+
/**
|
|
186
|
+
* 履歴スタック内の相対的な位置移動(例: `-1` で1つ戻る、`2` で2つ進む)です。
|
|
187
|
+
*/
|
|
188
|
+
type: "MOVE";
|
|
189
|
+
/**
|
|
190
|
+
* 履歴を移動させる差分ステップ数です。
|
|
191
|
+
*/
|
|
192
|
+
delta: number;
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* ルーティングエンジンのインターフェース定義です。
|
|
197
|
+
*/
|
|
198
|
+
export interface IEngine {
|
|
199
|
+
/**
|
|
200
|
+
* 現在の URL を基にルーターの初期状態を計算し、同期的に取得します。
|
|
201
|
+
*/
|
|
202
|
+
init(args: IEngine.InitArgs): IEngine.InitReturn;
|
|
203
|
+
/**
|
|
204
|
+
* エンジンを稼働させ、ブラウザーの履歴変更やナビゲーションイベントの継続的な監視を開始します。
|
|
205
|
+
*/
|
|
206
|
+
start(args: IEngine.StartArgs): IEngine.StartReturn;
|
|
207
|
+
/**
|
|
208
|
+
* ユーザーからの意図的なフォームデータまたはクエリーパラメータの送信を検知し、対応するルートのアクションやローダーを起動します。
|
|
209
|
+
*/
|
|
210
|
+
submit(args: IEngine.SubmitArgs): void;
|
|
211
|
+
/**
|
|
212
|
+
* プログラムからの命令的なページ遷移を処理します。
|
|
213
|
+
*/
|
|
214
|
+
navigate(args: IEngine.NavigateArgs): void;
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=engine.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.types.d.ts","sourceRoot":"","sources":["../../../src/engines/engine.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { IEngine } from "./engine.types.js";
|
|
2
|
+
/**
|
|
3
|
+
* モダンブラウザーに搭載されている標準の `Navigation API` を活用し、クライアントサイドにおける高度な SPA ルーティングを制御するエンジンクラスです。
|
|
4
|
+
*/
|
|
5
|
+
export default class NavigationApiEngine implements IEngine {
|
|
6
|
+
/**
|
|
7
|
+
* ブラウザー標準の `navigation` オブジェクトへの参照を保持します。
|
|
8
|
+
*/
|
|
9
|
+
private navigation;
|
|
10
|
+
/**
|
|
11
|
+
* メモリーリークを防ぐため、すでに dispose リスナーを登録済みの履歴エントリー ID を追跡するセットです。
|
|
12
|
+
*/
|
|
13
|
+
private subscribedEntryIds;
|
|
14
|
+
/**
|
|
15
|
+
* 連続して発生した画面遷移を適切にキャンセルするための、最新ナビゲーション用の中断コントローラーです。
|
|
16
|
+
*/
|
|
17
|
+
private navAbortController;
|
|
18
|
+
/**
|
|
19
|
+
* `NavigationApiEngine` クラスのインスタンスを初期化します。
|
|
20
|
+
*
|
|
21
|
+
* 実行環境が `Navigation API` をサポートしていない場合はエラーを投げます。
|
|
22
|
+
*/
|
|
23
|
+
constructor();
|
|
24
|
+
/**
|
|
25
|
+
* 現在のページ URL に基づき、ルーターの初期状態を構築・登録します。
|
|
26
|
+
*
|
|
27
|
+
* @param args ルート定義配列、共通データストア、初期化用のアボートシグナルを含むオブジェクトです。
|
|
28
|
+
* @returns 構築された初期の `RouterState`。適合するルートがないか、履歴が無い場合は `null` を返します。
|
|
29
|
+
*/
|
|
30
|
+
init(args: IEngine.InitArgs): IEngine.InitReturn;
|
|
31
|
+
/**
|
|
32
|
+
* ブラウザーの継続的なナビゲーションイベント(リンククリック、フォーム送信、履歴移動)の監視を開始します。
|
|
33
|
+
*
|
|
34
|
+
* @param args ルート配列、UI側への状態反映関数、各種ストア、シグナル取得関数を含むオブジェクトです。
|
|
35
|
+
*/
|
|
36
|
+
start(args: IEngine.StartArgs): IEngine.StartReturn;
|
|
37
|
+
/**
|
|
38
|
+
* フォームデータまたはクエリーパラメータを、ブラウザーの Navigation API のライフサイクルに載せて命令的に送信します。
|
|
39
|
+
*
|
|
40
|
+
* @param args 送信データの種類に応じたサブミット引数です。
|
|
41
|
+
*/
|
|
42
|
+
submit(args: IEngine.SubmitArgs): void;
|
|
43
|
+
/**
|
|
44
|
+
* 命令的なページ遷移を処理します。
|
|
45
|
+
*
|
|
46
|
+
* @param args 遷移タイプに応じたナビゲーション引数です。
|
|
47
|
+
*/
|
|
48
|
+
navigate(args: IEngine.NavigateArgs): void;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=navigation-api-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigation-api-engine.d.ts","sourceRoot":"","sources":["../../../src/engines/navigation-api-engine.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,mBAAoB,YAAW,OAAO;IACzD;;OAEG;IACH,OAAO,CAAC,UAAU,CAAa;IAE/B;;OAEG;IACH,OAAO,CAAC,kBAAkB,CAAsB;IAEhD;;OAEG;IACH,OAAO,CAAC,kBAAkB,CAAyB;IAEnD;;;;OAIG;;IAwBH;;;;;OAKG;IACH,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,UAAU;IA2BhD;;;;OAIG;IACH,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,WAAW;IAgSnD;;;;OAIG;IACH,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,UAAU,GAAG,IAAI;IAkCtC;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,YAAY,GAAG,IAAI;CAwE3C"}
|