soseki 0.0.9 → 0.0.11
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/dist/src/core/_process-routes.d.ts.map +1 -1
- package/dist/src/core/_process-routes.js +8 -10
- package/dist/src/core/_regexparam.d.ts +37 -0
- package/dist/src/core/_regexparam.d.ts.map +1 -0
- package/dist/src/core/_regexparam.js +1 -0
- package/dist/src/core/errors.d.ts +29 -0
- package/dist/src/core/errors.d.ts.map +1 -1
- package/dist/src/core/errors.js +20 -1
- package/dist/src/core/match-routes.d.ts +2 -2
- package/dist/src/core/match-routes.d.ts.map +1 -1
- package/dist/src/core/match-routes.js +4 -6
- package/dist/src/core/route-pattern-utils.d.ts +163 -0
- package/dist/src/core/route-pattern-utils.d.ts.map +1 -0
- package/dist/src/core/route-pattern-utils.js +222 -0
- package/dist/src/core/route.types.d.ts +27 -65
- package/dist/src/core/route.types.d.ts.map +1 -1
- package/dist/src/core/start-action.d.ts.map +1 -1
- package/dist/src/engines/navigation-api-engine.d.ts.map +1 -1
- package/dist/src/engines/navigation-api-engine.js +7 -9
- package/dist/src/hooks/use-params.d.ts +2 -2
- package/dist/src/hooks/use-params.d.ts.map +1 -1
- package/dist/src/soseki.d.ts +2 -0
- package/dist/src/soseki.d.ts.map +1 -1
- package/dist/src/soseki.js +1 -0
- package/package.json +1 -1
- package/src/core/_process-routes.ts +7 -12
- package/src/core/_regexparam.ts +67 -0
- package/src/core/errors.ts +52 -0
- package/src/core/match-routes.ts +6 -9
- package/src/core/route-pattern-utils.ts +327 -0
- package/src/core/route.types.ts +29 -98
- package/src/core/start-action.ts +2 -2
- package/src/engines/navigation-api-engine.ts +7 -9
- package/src/hooks/use-params.ts +3 -3
- package/src/soseki.ts +3 -0
- package/dist/src/core/_match-route-path.d.ts +0 -22
- package/dist/src/core/_match-route-path.d.ts.map +0 -1
- package/dist/src/core/_match-route-path.js +0 -26
- package/src/core/_match-route-path.ts +0 -45
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_process-routes.d.ts","sourceRoot":"","sources":["../../../src/core/_process-routes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"_process-routes.d.ts","sourceRoot":"","sources":["../../../src/core/_process-routes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE/D;;;;;;;;;;GAUG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,GAAG,SAAS,KAAK,EAAE,CAiC1F"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { parse } from "regexparam";
|
|
2
1
|
import compareRoutePaths from "./_compare-route-paths.js";
|
|
3
|
-
import
|
|
2
|
+
import RoutePatternUtils from "./route-pattern-utils.js";
|
|
4
3
|
/**
|
|
5
4
|
* 定義したルーティング設定の配列を、内部のルーティングエンジンが直接利用可能な正規化済みのルートオブジェクトの配列へと変換します。
|
|
6
5
|
*
|
|
@@ -15,15 +14,16 @@ import RoutePath from "./route-path.js";
|
|
|
15
14
|
export default function processRoutes(routes) {
|
|
16
15
|
return (routes
|
|
17
16
|
.map((route) => {
|
|
18
|
-
const path = RoutePath.encode(route.path);
|
|
19
17
|
const index = route.index === true;
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
18
|
+
const utils = new RoutePatternUtils(route.path, {
|
|
19
|
+
// インデックスルートでないとき allowChild オプションを `true` にして子ルートに対してもマッチするようにします。
|
|
20
|
+
// これにより、前方一致による階層的なマッチングが有効になります。
|
|
21
|
+
allowChild: !index,
|
|
22
|
+
});
|
|
24
23
|
return {
|
|
25
|
-
path,
|
|
24
|
+
path: utils.route,
|
|
26
25
|
index,
|
|
26
|
+
utils,
|
|
27
27
|
action: route.action,
|
|
28
28
|
loader: route.loader,
|
|
29
29
|
// オブジェクト形式またはモジュール形式の双方を安全に評価し、描画対象となる React コンポーネントを確定します。
|
|
@@ -34,8 +34,6 @@ export default function processRoutes(routes) {
|
|
|
34
34
|
typeof route.default === "function"
|
|
35
35
|
? route.default
|
|
36
36
|
: undefined,
|
|
37
|
-
paramKeys,
|
|
38
|
-
pathPattern,
|
|
39
37
|
shouldReload: route.shouldReload || ((args) => args.defaultShouldReload),
|
|
40
38
|
};
|
|
41
39
|
})
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 個別のパスパラメーターを解析し、適切なプロパティーの型オブジェクトへと変換する内部ユーティリティー型です。
|
|
3
|
+
*
|
|
4
|
+
* パラメーターの末尾の形状を条件付き型により詳細に選別します。
|
|
5
|
+
*
|
|
6
|
+
* @template Param 解析対象となる単一のパラメーター文字列です。
|
|
7
|
+
*/
|
|
8
|
+
type ParamRecord<Param extends string> = Param extends `${infer Name}?` ? {
|
|
9
|
+
[K in Name]?: string;
|
|
10
|
+
} : Param extends `${infer Name}.${string}` ? {
|
|
11
|
+
[K in Name]: string;
|
|
12
|
+
} : {
|
|
13
|
+
[K in Param]: string;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* パス文字列のセグメントから動的なパラメーターやワイルドカードを再帰的に抽出し、型安全なオブジェクト構造を構築するユーティリティー型です。
|
|
17
|
+
*
|
|
18
|
+
* 開発者が指定した文字列リテラル型の形状に基づいて、ルーティングに必要なパラメーターの型を静的に決定します。
|
|
19
|
+
*
|
|
20
|
+
* このユーティリティー型は、ライブラリー `regexparam` の改良版です。
|
|
21
|
+
*
|
|
22
|
+
* @template T 解析対象となる URL パス全体の文字列リテラル型です。
|
|
23
|
+
* @see https://github.com/lukeed/regexparam
|
|
24
|
+
* @see https://github.com/lukeed/regexparam/issues/31
|
|
25
|
+
* @see https://github.com/lukeed/regexparam/pull/33
|
|
26
|
+
*/
|
|
27
|
+
export type RouteParams<T extends string> = string extends T ? {
|
|
28
|
+
[K in string]?: string;
|
|
29
|
+
} : T extends `${infer Prev}/*/${infer Rest}` ? RouteParams<Prev> & {
|
|
30
|
+
wild: string;
|
|
31
|
+
} & RouteParams<`/${Rest}`> : T extends `:${infer Rest}` ? RouteParams<`/:${Rest}`> : T extends `${string}:${infer Param}/${infer Rest}` ? ParamRecord<Param> & RouteParams<`/${Rest}`> : T extends `${string}/:${infer Param}` ? ParamRecord<Param> : T extends `${string}/*?` ? {
|
|
32
|
+
"*"?: string;
|
|
33
|
+
} : T extends `${string}/*` ? {
|
|
34
|
+
"*": string;
|
|
35
|
+
} : {};
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=_regexparam.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_regexparam.d.ts","sourceRoot":"","sources":["../../../src/core/_regexparam.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,KAAK,WAAW,CAAC,KAAK,SAAS,MAAM,IAEjC,KAAK,SAAS,GAAG,MAAM,IAAI,GAAG,GAC5B;KAAG,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,MAAM;CAAE,GAG1B,KAAK,SAAS,GAAG,MAAM,IAAI,IAAI,MAAM,EAAE,GACrC;KAAG,CAAC,IAAI,IAAI,GAAG,MAAM;CAAE,GAGzB;KAAG,CAAC,IAAI,KAAK,GAAG,MAAM;CAAE,CAAC;AAE7B;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,IAEpC,MAAM,SAAS,CAAC,GACd;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,MAAM;CAAE,GAG5B,CAAC,SAAS,GAAG,MAAM,IAAI,MAAM,MAAM,IAAI,EAAE,GACrC,WAAW,CAAC,IAAI,CAAC,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,GAG3B,CAAC,SAAS,IAAI,MAAM,IAAI,EAAE,GACxB,WAAW,CAAC,KAAK,IAAI,EAAE,CAAC,GAG1B,CAAC,SAAS,GAAG,MAAM,IAAI,MAAM,KAAK,IAAI,MAAM,IAAI,EAAE,GAC9C,WAAW,CAAC,KAAK,CAAC,GAClB,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,GAG3B,CAAC,SAAS,GAAG,MAAM,KAAK,MAAM,KAAK,EAAE,GACnC,WAAW,CAAC,KAAK,CAAC,GAGpB,CAAC,SAAS,GAAG,MAAM,KAAK,GACtB;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAGlB,CAAC,SAAS,GAAG,MAAM,IAAI,GACrB;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAGjB,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -179,4 +179,33 @@ export declare class LoaderDataNotFoundError extends ErrorBase<LoaderDataNotFoun
|
|
|
179
179
|
*/
|
|
180
180
|
constructor(args: LoaderDataNotFoundErrorArgs);
|
|
181
181
|
}
|
|
182
|
+
/**************************************************************************************************/
|
|
183
|
+
/**
|
|
184
|
+
* ローダーデータの紛失を通知する際に付与されるメタデータの型定義です。
|
|
185
|
+
*/
|
|
186
|
+
export type RoutePatternMismatchErrorMeta = {
|
|
187
|
+
/**
|
|
188
|
+
* ルートパターン文字列です。
|
|
189
|
+
*/
|
|
190
|
+
readonly route: string;
|
|
191
|
+
/**
|
|
192
|
+
* 検証対象のパス文字列です。
|
|
193
|
+
*/
|
|
194
|
+
readonly target: string;
|
|
195
|
+
};
|
|
196
|
+
/**
|
|
197
|
+
* `RoutePatternMismatchError` のインスタンスを初期化する際に渡される引数オブジェクトの型定義です。
|
|
198
|
+
*/
|
|
199
|
+
export type RoutePatternMismatchErrorArgs = ErrorOptions & RoutePatternMismatchErrorMeta;
|
|
200
|
+
/**
|
|
201
|
+
* 対象のパスまたは URL が、指定されたルートパターンに一致しない場合に投げるエラーです。
|
|
202
|
+
*/
|
|
203
|
+
export declare class RoutePatternMismatchError extends ErrorBase<RoutePatternMismatchErrorMeta> {
|
|
204
|
+
/**
|
|
205
|
+
* `RoutePatternMismatchError` クラスの新しいインスタンスを初期化します。
|
|
206
|
+
*
|
|
207
|
+
* @param args 引数オブジェクトです。
|
|
208
|
+
*/
|
|
209
|
+
constructor(args: RoutePatternMismatchErrorArgs);
|
|
210
|
+
}
|
|
182
211
|
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/core/errors.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/core/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/src/core/errors.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var _a, _b, _c, _d, _e, _f, _g;
|
|
1
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
2
2
|
import { I18nErrorBase, setErrorMessage } from "i18n-error-base";
|
|
3
3
|
import { inspect } from "inspect-lite";
|
|
4
4
|
import { isThenable } from "maypromise";
|
|
@@ -164,3 +164,22 @@ _g = LoaderDataNotFoundError;
|
|
|
164
164
|
/*#__PURE__*/ setErrorMessage(LoaderDataNotFoundError, ({ loader }) => loader
|
|
165
165
|
? `ローダーデータが見つかりません(関数名: ${loader.name || "匿名"})`
|
|
166
166
|
: "ローダーが未定義です。", "ja");
|
|
167
|
+
/**
|
|
168
|
+
* 対象のパスまたは URL が、指定されたルートパターンに一致しない場合に投げるエラーです。
|
|
169
|
+
*/
|
|
170
|
+
export class RoutePatternMismatchError extends ErrorBase {
|
|
171
|
+
/**
|
|
172
|
+
* `RoutePatternMismatchError` クラスの新しいインスタンスを初期化します。
|
|
173
|
+
*
|
|
174
|
+
* @param args 引数オブジェクトです。
|
|
175
|
+
*/
|
|
176
|
+
constructor(args) {
|
|
177
|
+
const { route, target, ...options } = args;
|
|
178
|
+
super({ route, target }, ({ route, target }) => `The target path "${target}" does not match the route pattern "${route}"`, options);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
_h = RoutePatternMismatchError;
|
|
182
|
+
(() => {
|
|
183
|
+
_h.prototype.name = "SosekiRoutePatternMismatchError";
|
|
184
|
+
})();
|
|
185
|
+
/*#__PURE__*/ setErrorMessage(RoutePatternMismatchError, ({ route, target }) => `対象パス "${target}" がパターン "${route}" と一致しません`, "ja");
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ReadonlyURL } from "./readonly-url.types.js";
|
|
2
|
-
import type { Route,
|
|
2
|
+
import type { Route, RouteParams } from "./route.types.js";
|
|
3
3
|
/**
|
|
4
4
|
* URL とのマッチングが確認されたルート情報を表す型定義です。
|
|
5
5
|
*
|
|
@@ -9,7 +9,7 @@ export type MatchedRoute = Route & {
|
|
|
9
9
|
/**
|
|
10
10
|
* 現在の URL パスから抽出された、このルート固有の動的パスパラメーターです。
|
|
11
11
|
*/
|
|
12
|
-
readonly params:
|
|
12
|
+
readonly params: RouteParams;
|
|
13
13
|
/**
|
|
14
14
|
* ルートの定義パターン(例: `/users/:id`)に抽出したパラメーター(例: `{ id: "42" }`)を流し込み、具現化されたリクエストパス(例: `/users/42`)です。
|
|
15
15
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"match-routes.d.ts","sourceRoot":"","sources":["../../../src/core/match-routes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"match-routes.d.ts","sourceRoot":"","sources":["../../../src/core/match-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE3D;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG;IACjC;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAE7B;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,OAAO,UAAU,WAAW,CACjC,MAAM,EAAE,SAAS,KAAK,EAAE,EACxB,GAAG,EAAE,WAAW,GACf,SAAS,CAAC,YAAY,EAAE,GAAG,YAAY,EAAE,CAAC,GAAG,IAAI,CAuBnD"}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { inject } from "regexparam";
|
|
2
|
-
import matchRoutePath from "./_match-route-path.js";
|
|
3
1
|
/**
|
|
4
2
|
* 事前に詳細度順でソートされたルート定義の配列から、指定された URL に適合するすべてのルートを探索・抽出し、マッチした順に正規化して返す関数です。
|
|
5
3
|
*
|
|
@@ -14,14 +12,14 @@ export default function matchRoutes(routes, url) {
|
|
|
14
12
|
// 登録されているすべてのルートを前方から順番に走査します。
|
|
15
13
|
// routes 配列は詳細度が高い順に並んでいることが前提となります。
|
|
16
14
|
for (const route of routes) {
|
|
17
|
-
const
|
|
18
|
-
if (
|
|
15
|
+
const params = route.utils.parseSafe(url);
|
|
16
|
+
if (params === null) {
|
|
19
17
|
continue;
|
|
20
18
|
}
|
|
21
19
|
matched.push({
|
|
22
20
|
...route,
|
|
23
|
-
params
|
|
24
|
-
urlPath:
|
|
21
|
+
params,
|
|
22
|
+
urlPath: route.utils.inject(params),
|
|
25
23
|
});
|
|
26
24
|
}
|
|
27
25
|
if (matched.length > 0) {
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import type { RouteParams } from "./_regexparam.js";
|
|
2
|
+
/**
|
|
3
|
+
* 対象の型プロパティーをすべて任意とし、さらに各プロパティー値に undefined を許容する型です。
|
|
4
|
+
*
|
|
5
|
+
* @template T オブジェクトの型定義です。
|
|
6
|
+
*/
|
|
7
|
+
type Optional<T> = {
|
|
8
|
+
readonly [P in keyof T]?: T[P] | undefined;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* ルートパターンの照合処理において、URL の文字列情報を抽出するためのインターフェースです。
|
|
12
|
+
*/
|
|
13
|
+
export interface RoutePatternMatchURL {
|
|
14
|
+
/**
|
|
15
|
+
* ホスト名を除いた URL パス全体の文字列を表します。
|
|
16
|
+
*/
|
|
17
|
+
readonly pathname: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* ルートパターンを解析および処理する際の挙動を設定するオプションです。
|
|
21
|
+
*/
|
|
22
|
+
export type RoutePatternUtilsOptions = {
|
|
23
|
+
/**
|
|
24
|
+
* 子ディレクトリーへの前方一致を許可するかどうかを制御するフラグです。下位パスが存在する場合にも一致とみなす場合に true を指定します。
|
|
25
|
+
*
|
|
26
|
+
* @default false
|
|
27
|
+
*/
|
|
28
|
+
readonly allowChild?: boolean | undefined;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* ルートパターンの解析などを行うユーティリティークラスです。
|
|
32
|
+
*
|
|
33
|
+
* @template TRoutePattern リテラル型で固定されたルートパターンの文字列定義です。
|
|
34
|
+
*/
|
|
35
|
+
export default class RoutePatternUtils<const TRoutePattern extends string = string> {
|
|
36
|
+
/**
|
|
37
|
+
* ルートパターンと対象のパスが一致するかどうかを静的に検証します。
|
|
38
|
+
*
|
|
39
|
+
* @template TRoutePattern パターンの文字列型です。
|
|
40
|
+
* @param routePattern 基準となるルートパターン文字列です。
|
|
41
|
+
* @param target 検証対象のパス文字列またはオブジェクトです。
|
|
42
|
+
* @param options 解析時の振る舞いを制御するオプションです。
|
|
43
|
+
* @returns 一致する場合は true、一致しない場合は false です。
|
|
44
|
+
*/
|
|
45
|
+
static match<const TRoutePattern extends string>(routePattern: TRoutePattern, target: string | RoutePatternMatchURL, options: RoutePatternUtilsOptions): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* 静的な解析を行い、対象のパスからパラメーターを抽出します。一致しない場合はエラーを投げます。
|
|
48
|
+
*
|
|
49
|
+
* @template TRoutePattern パターンの文字列型です。
|
|
50
|
+
* @param routePattern 基準となるルートパターン文字列です。
|
|
51
|
+
* @param target 解析対象のパス文字列またはオブジェクトです。
|
|
52
|
+
* @param options 解析時の振る舞いを制御するオプションです。
|
|
53
|
+
* @returns 抽出されたパラメーターオブジェクトです。
|
|
54
|
+
*/
|
|
55
|
+
static parse<const TRoutePattern extends string>(routePattern: TRoutePattern, target: string | RoutePatternMatchURL, options: RoutePatternUtilsOptions): RouteParams<TRoutePattern>;
|
|
56
|
+
/**
|
|
57
|
+
* 静的な埋め込みを行い、ルートパターンにパラメーターを適用してパスを生成します。
|
|
58
|
+
*
|
|
59
|
+
* @template TRoutePattern パターンの文字列型です。
|
|
60
|
+
* @param routePattern 基準となるルートパターン文字列です。
|
|
61
|
+
* @param params 埋め込むパラメーターのキーと値の組み合わせです。
|
|
62
|
+
* @param options 解析時の振る舞いを制御するオプションです。
|
|
63
|
+
* @returns パラメーターが適用された新しいパス文字列です。
|
|
64
|
+
*/
|
|
65
|
+
static inject<const TRoutePattern extends string>(routePattern: TRoutePattern, params: Readonly<RouteParams<TRoutePattern>>, options: RoutePatternUtilsOptions): string;
|
|
66
|
+
/**
|
|
67
|
+
* 対象のパスに含まれるパラメーターの一部を指定された値で置き換えて、新しいパスを静的に生成します。
|
|
68
|
+
*
|
|
69
|
+
* @template TRoutePattern パターンの文字列型です。
|
|
70
|
+
* @param routePattern 基準となるルートパターン文字列です。
|
|
71
|
+
* @param target 既存のパス文字列またはオブジェクトです。
|
|
72
|
+
* @param params 上書きするパラメーターです。
|
|
73
|
+
* @param options 解析時の振る舞いを制御するオプションです。
|
|
74
|
+
* @returns 置き換え後のパス文字列です。
|
|
75
|
+
*/
|
|
76
|
+
static replace<const TRoutePattern extends string>(routePattern: TRoutePattern, target: string | RoutePatternMatchURL, params: Optional<RouteParams<TRoutePattern>>, options: RoutePatternUtilsOptions): string;
|
|
77
|
+
/**
|
|
78
|
+
* 静的な解析を行い、対象のパスからパラメーターを安全に抽出します。一致しない場合は null を返します。
|
|
79
|
+
*
|
|
80
|
+
* @template TRoutePattern パターンの文字列型です。
|
|
81
|
+
* @param routePattern 基準となるルートパターン文字列です。
|
|
82
|
+
* @param target 解析対象のパス文字列またはオブジェクトです。
|
|
83
|
+
* @param options 解析時の振る舞いを制御するオプションです。
|
|
84
|
+
* @returns 抽出されたパラメーターオブジェクト、一致しない場合は null です。
|
|
85
|
+
*/
|
|
86
|
+
static parseSafe<const TRoutePattern extends string>(routePattern: TRoutePattern, target: string | RoutePatternMatchURL, options: RoutePatternUtilsOptions): RouteParams<TRoutePattern> | null;
|
|
87
|
+
/**
|
|
88
|
+
* 対象のパスに含まれるパラメーターの一部を指定された値で安全に置き換えます。不一致の場合は null を返します。
|
|
89
|
+
*
|
|
90
|
+
* @template TRoutePattern パターンの文字列型です。
|
|
91
|
+
* @param routePattern 基準となるルートパターン文字列です。
|
|
92
|
+
* @param target 既存のパス文字列またはオブジェクトです。
|
|
93
|
+
* @param params 上書きするパラメーターです。
|
|
94
|
+
* @param options 解析時の振る舞いを制御するオプションです。
|
|
95
|
+
* @returns 置き換え後のパス文字列、不一致の場合は null です。
|
|
96
|
+
*/
|
|
97
|
+
static replaceSafe<const TRoutePattern extends string>(routePattern: TRoutePattern, target: string | RoutePatternMatchURL, params: Optional<RouteParams<TRoutePattern>>, options: RoutePatternUtilsOptions): string | null;
|
|
98
|
+
/**
|
|
99
|
+
* インスタンスに保持されるルートパターン文字列です。
|
|
100
|
+
*/
|
|
101
|
+
readonly route: string;
|
|
102
|
+
/**
|
|
103
|
+
* ルートパターンのマッチングとパラメーター抽出に使用する正規表現オブジェクトです。
|
|
104
|
+
*/
|
|
105
|
+
readonly pattern: RegExp;
|
|
106
|
+
/**
|
|
107
|
+
* ルートパターンから抽出されたパラメーター名の配列です。
|
|
108
|
+
*/
|
|
109
|
+
readonly paramKeys: readonly Extract<keyof RouteParams<TRoutePattern>, string>[];
|
|
110
|
+
/**
|
|
111
|
+
* 新しい `RoutePatternUtils` インスタンスを作成します。
|
|
112
|
+
*
|
|
113
|
+
* @param routePattern 解析基準となるルートパターンです。
|
|
114
|
+
* @param options 前方一致などを制御するオプションです。
|
|
115
|
+
*/
|
|
116
|
+
constructor(routePattern: TRoutePattern, options?: RoutePatternUtilsOptions);
|
|
117
|
+
/**
|
|
118
|
+
* パスが構築時のルートパターンに一致するかどうかを評価します。
|
|
119
|
+
*
|
|
120
|
+
* @param target 検証対象のパス文字列またはオブジェクトです。
|
|
121
|
+
* @returns パターンに合致する場合は true、それ以外は false です。
|
|
122
|
+
*/
|
|
123
|
+
match(target: string | RoutePatternMatchURL): boolean;
|
|
124
|
+
/**
|
|
125
|
+
* インスタンスのルートパターンを基に対象パスからパラメーターを抽出します。解析できない場合は、処理が継続できないため例外を投げます。
|
|
126
|
+
*
|
|
127
|
+
* @param target 解析対象のパス文字列またはオブジェクトです。
|
|
128
|
+
* @returns 抽出したパラメーターオブジェクトです。
|
|
129
|
+
*/
|
|
130
|
+
parse(target: string | RoutePatternMatchURL): RouteParams<TRoutePattern>;
|
|
131
|
+
/**
|
|
132
|
+
* 指定されたパラメーター群をルートパターンに埋め込んで、具体的なパス文字列を構築します。
|
|
133
|
+
*
|
|
134
|
+
* @param params パラメーターのキーと値のオブジェクトです。
|
|
135
|
+
* @returns 生成されたパス文字列です。
|
|
136
|
+
*/
|
|
137
|
+
inject(params: Readonly<RouteParams<TRoutePattern>>): string;
|
|
138
|
+
/**
|
|
139
|
+
* 現在のパスに含まれるパラメーター値の一部を、指定された値で上書きした新しいパスを構築します。対象パスがルートパターンと一致しない場合は例外を投げます。
|
|
140
|
+
*
|
|
141
|
+
* @param target 基準となる現在のパス文字列またはオブジェクトです。
|
|
142
|
+
* @param params 変更を適用する一部のパラメーターです。
|
|
143
|
+
* @returns 新しく生成されたパス文字列です。
|
|
144
|
+
*/
|
|
145
|
+
replace(target: string | RoutePatternMatchURL, params: Optional<RouteParams<TRoutePattern>>): string;
|
|
146
|
+
/**
|
|
147
|
+
* パターンに基づきパスの解析を行い、プレースホルダーに該当する箇所をオブジェクトとして抽出します。
|
|
148
|
+
*
|
|
149
|
+
* @param target 解析対象のパス文字列またはオブジェクトです。
|
|
150
|
+
* @returns 抽出に成功した場合はパラメーターのオブジェクト、不一致の場合は null です。
|
|
151
|
+
*/
|
|
152
|
+
parseSafe(target: string | RoutePatternMatchURL): RouteParams<TRoutePattern> | null;
|
|
153
|
+
/**
|
|
154
|
+
* 既存のパスから抽出されたパラメーター値をベースとして、任意のパラメーターのみを上書きしたパス文字列を再構築します。
|
|
155
|
+
*
|
|
156
|
+
* @param target 基にするパス文字列またはオブジェクトです。
|
|
157
|
+
* @param params 上書き指定するパラメーターオブジェクトです。
|
|
158
|
+
* @returns 再構築されたパス文字列、パスが不一致の場合は null です。
|
|
159
|
+
*/
|
|
160
|
+
replaceSafe(target: string | RoutePatternMatchURL, params: Optional<RouteParams<TRoutePattern>>): string | null;
|
|
161
|
+
}
|
|
162
|
+
export {};
|
|
163
|
+
//# sourceMappingURL=route-pattern-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-pattern-utils.d.ts","sourceRoot":"","sources":["../../../src/core/route-pattern-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { inject, parse } from "regexparam";
|
|
2
|
+
import { RoutePatternMismatchError } from "./errors.js";
|
|
3
|
+
import RoutePath from "./route-path.js";
|
|
4
|
+
/**
|
|
5
|
+
* 引数に渡された対象から URL パスを取得し、一貫した形式に正規化します。
|
|
6
|
+
*
|
|
7
|
+
* @param target 文字列または URL 情報を持つオブジェクトです。
|
|
8
|
+
* @returns 正規化されたパス文字列です。
|
|
9
|
+
*/
|
|
10
|
+
function normalizeTarget(target) {
|
|
11
|
+
return new RoutePath(typeof target === "string" ? target : target.pathname).pathname;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* ルートパターンの解析などを行うユーティリティークラスです。
|
|
15
|
+
*
|
|
16
|
+
* @template TRoutePattern リテラル型で固定されたルートパターンの文字列定義です。
|
|
17
|
+
*/
|
|
18
|
+
export default class RoutePatternUtils {
|
|
19
|
+
/**
|
|
20
|
+
* ルートパターンと対象のパスが一致するかどうかを静的に検証します。
|
|
21
|
+
*
|
|
22
|
+
* @template TRoutePattern パターンの文字列型です。
|
|
23
|
+
* @param routePattern 基準となるルートパターン文字列です。
|
|
24
|
+
* @param target 検証対象のパス文字列またはオブジェクトです。
|
|
25
|
+
* @param options 解析時の振る舞いを制御するオプションです。
|
|
26
|
+
* @returns 一致する場合は true、一致しない場合は false です。
|
|
27
|
+
*/
|
|
28
|
+
static match(routePattern, target, options) {
|
|
29
|
+
return new RoutePatternUtils(routePattern, options).match(target);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 静的な解析を行い、対象のパスからパラメーターを抽出します。一致しない場合はエラーを投げます。
|
|
33
|
+
*
|
|
34
|
+
* @template TRoutePattern パターンの文字列型です。
|
|
35
|
+
* @param routePattern 基準となるルートパターン文字列です。
|
|
36
|
+
* @param target 解析対象のパス文字列またはオブジェクトです。
|
|
37
|
+
* @param options 解析時の振る舞いを制御するオプションです。
|
|
38
|
+
* @returns 抽出されたパラメーターオブジェクトです。
|
|
39
|
+
*/
|
|
40
|
+
static parse(routePattern, target, options) {
|
|
41
|
+
return new RoutePatternUtils(routePattern, options).parse(target);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 静的な埋め込みを行い、ルートパターンにパラメーターを適用してパスを生成します。
|
|
45
|
+
*
|
|
46
|
+
* @template TRoutePattern パターンの文字列型です。
|
|
47
|
+
* @param routePattern 基準となるルートパターン文字列です。
|
|
48
|
+
* @param params 埋め込むパラメーターのキーと値の組み合わせです。
|
|
49
|
+
* @param options 解析時の振る舞いを制御するオプションです。
|
|
50
|
+
* @returns パラメーターが適用された新しいパス文字列です。
|
|
51
|
+
*/
|
|
52
|
+
static inject(routePattern, params, options) {
|
|
53
|
+
return new RoutePatternUtils(routePattern, options).inject(params);
|
|
54
|
+
}
|
|
55
|
+
// public static partialInject<const TRoutePattern extends string>(
|
|
56
|
+
// routePattern: TRoutePattern,
|
|
57
|
+
// params: Optional<RouteParams<TRoutePattern>>,
|
|
58
|
+
// options: RoutePatternUtilsOptions = {},
|
|
59
|
+
// ): string {}
|
|
60
|
+
/**
|
|
61
|
+
* 対象のパスに含まれるパラメーターの一部を指定された値で置き換えて、新しいパスを静的に生成します。
|
|
62
|
+
*
|
|
63
|
+
* @template TRoutePattern パターンの文字列型です。
|
|
64
|
+
* @param routePattern 基準となるルートパターン文字列です。
|
|
65
|
+
* @param target 既存のパス文字列またはオブジェクトです。
|
|
66
|
+
* @param params 上書きするパラメーターです。
|
|
67
|
+
* @param options 解析時の振る舞いを制御するオプションです。
|
|
68
|
+
* @returns 置き換え後のパス文字列です。
|
|
69
|
+
*/
|
|
70
|
+
static replace(routePattern, target, params, options) {
|
|
71
|
+
return new RoutePatternUtils(routePattern, options).replace(target, params);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 静的な解析を行い、対象のパスからパラメーターを安全に抽出します。一致しない場合は null を返します。
|
|
75
|
+
*
|
|
76
|
+
* @template TRoutePattern パターンの文字列型です。
|
|
77
|
+
* @param routePattern 基準となるルートパターン文字列です。
|
|
78
|
+
* @param target 解析対象のパス文字列またはオブジェクトです。
|
|
79
|
+
* @param options 解析時の振る舞いを制御するオプションです。
|
|
80
|
+
* @returns 抽出されたパラメーターオブジェクト、一致しない場合は null です。
|
|
81
|
+
*/
|
|
82
|
+
static parseSafe(routePattern, target, options) {
|
|
83
|
+
return new RoutePatternUtils(routePattern, options).parseSafe(target);
|
|
84
|
+
}
|
|
85
|
+
// public static injectSafe<const TRoutePattern extends string>(
|
|
86
|
+
// routePattern: TRoutePattern,
|
|
87
|
+
// params: Readonly<RouteParams<TRoutePattern>>,
|
|
88
|
+
// options: RoutePatternUtilsOptions = {},
|
|
89
|
+
// ): string | null {}
|
|
90
|
+
/**
|
|
91
|
+
* 対象のパスに含まれるパラメーターの一部を指定された値で安全に置き換えます。不一致の場合は null を返します。
|
|
92
|
+
*
|
|
93
|
+
* @template TRoutePattern パターンの文字列型です。
|
|
94
|
+
* @param routePattern 基準となるルートパターン文字列です。
|
|
95
|
+
* @param target 既存のパス文字列またはオブジェクトです。
|
|
96
|
+
* @param params 上書きするパラメーターです。
|
|
97
|
+
* @param options 解析時の振る舞いを制御するオプションです。
|
|
98
|
+
* @returns 置き換え後のパス文字列、不一致の場合は null です。
|
|
99
|
+
*/
|
|
100
|
+
static replaceSafe(routePattern, target, params, options) {
|
|
101
|
+
return new RoutePatternUtils(routePattern, options).replaceSafe(target, params);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 新しい `RoutePatternUtils` インスタンスを作成します。
|
|
105
|
+
*
|
|
106
|
+
* @param routePattern 解析基準となるルートパターンです。
|
|
107
|
+
* @param options 前方一致などを制御するオプションです。
|
|
108
|
+
*/
|
|
109
|
+
constructor(routePattern, options = {}) {
|
|
110
|
+
const { keys, pattern } = parse(routePattern, options.allowChild);
|
|
111
|
+
this.route = routePattern;
|
|
112
|
+
this.pattern = pattern;
|
|
113
|
+
this.paramKeys = keys;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* パスが構築時のルートパターンに一致するかどうかを評価します。
|
|
117
|
+
*
|
|
118
|
+
* @param target 検証対象のパス文字列またはオブジェクトです。
|
|
119
|
+
* @returns パターンに合致する場合は true、それ以外は false です。
|
|
120
|
+
*/
|
|
121
|
+
match(target) {
|
|
122
|
+
target = normalizeTarget(target);
|
|
123
|
+
return this.pattern.test(target);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* インスタンスのルートパターンを基に対象パスからパラメーターを抽出します。解析できない場合は、処理が継続できないため例外を投げます。
|
|
127
|
+
*
|
|
128
|
+
* @param target 解析対象のパス文字列またはオブジェクトです。
|
|
129
|
+
* @returns 抽出したパラメーターオブジェクトです。
|
|
130
|
+
*/
|
|
131
|
+
parse(target) {
|
|
132
|
+
const params = this.parseSafe(target);
|
|
133
|
+
if (params === null) {
|
|
134
|
+
throw new RoutePatternMismatchError({
|
|
135
|
+
route: this.route,
|
|
136
|
+
target: normalizeTarget(target),
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
return params;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* 指定されたパラメーター群をルートパターンに埋め込んで、具体的なパス文字列を構築します。
|
|
143
|
+
*
|
|
144
|
+
* @param params パラメーターのキーと値のオブジェクトです。
|
|
145
|
+
* @returns 生成されたパス文字列です。
|
|
146
|
+
*/
|
|
147
|
+
inject(params) {
|
|
148
|
+
return inject(this.route, params);
|
|
149
|
+
}
|
|
150
|
+
// public partialInject(params: Optional<RouteParams<TRoutePattern>>): string {}
|
|
151
|
+
/**
|
|
152
|
+
* 現在のパスに含まれるパラメーター値の一部を、指定された値で上書きした新しいパスを構築します。対象パスがルートパターンと一致しない場合は例外を投げます。
|
|
153
|
+
*
|
|
154
|
+
* @param target 基準となる現在のパス文字列またはオブジェクトです。
|
|
155
|
+
* @param params 変更を適用する一部のパラメーターです。
|
|
156
|
+
* @returns 新しく生成されたパス文字列です。
|
|
157
|
+
*/
|
|
158
|
+
replace(target, params) {
|
|
159
|
+
const replaced = this.replaceSafe(target, params);
|
|
160
|
+
if (replaced === null) {
|
|
161
|
+
throw new RoutePatternMismatchError({
|
|
162
|
+
route: this.route,
|
|
163
|
+
target: normalizeTarget(target),
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
return replaced;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* パターンに基づきパスの解析を行い、プレースホルダーに該当する箇所をオブジェクトとして抽出します。
|
|
170
|
+
*
|
|
171
|
+
* @param target 解析対象のパス文字列またはオブジェクトです。
|
|
172
|
+
* @returns 抽出に成功した場合はパラメーターのオブジェクト、不一致の場合は null です。
|
|
173
|
+
*/
|
|
174
|
+
parseSafe(target) {
|
|
175
|
+
target = normalizeTarget(target);
|
|
176
|
+
const matches = this.pattern.exec(target);
|
|
177
|
+
if (!matches) {
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
const params = {};
|
|
181
|
+
for (let i = 0, param; i < this.paramKeys.length; i++) {
|
|
182
|
+
// exec メソッドの戻り値のインデックス 0 にはマッチした文字列全体が格納されているため、各パラメーターの値はインデックス 1 以降(i + 1)から取得します。
|
|
183
|
+
param = matches[i + 1];
|
|
184
|
+
// キャプチャーされたセグメントが存在し、かつ文字列型である場合にのみ、対応するパラメーターキーと値をマッピングします。
|
|
185
|
+
// オプショナルなパラメーターが URL 側で省略されている場合は undefined となるため、この条件節により除外されます。
|
|
186
|
+
if (typeof param === "string") {
|
|
187
|
+
params[this.paramKeys[i]] = param;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return params;
|
|
191
|
+
}
|
|
192
|
+
// public injectSafe(params: Readonly<RouteParams<TRoutePattern>>): string | null {
|
|
193
|
+
// if (!this.paramKeys.every((key) => key in params && typeof params[key] === "string")) {
|
|
194
|
+
// return null;
|
|
195
|
+
// }
|
|
196
|
+
// return inject(this.route, params);
|
|
197
|
+
// }
|
|
198
|
+
/**
|
|
199
|
+
* 既存のパスから抽出されたパラメーター値をベースとして、任意のパラメーターのみを上書きしたパス文字列を再構築します。
|
|
200
|
+
*
|
|
201
|
+
* @param target 基にするパス文字列またはオブジェクトです。
|
|
202
|
+
* @param params 上書き指定するパラメーターオブジェクトです。
|
|
203
|
+
* @returns 再構築されたパス文字列、パスが不一致の場合は null です。
|
|
204
|
+
*/
|
|
205
|
+
replaceSafe(target, params) {
|
|
206
|
+
const defaults = this.parseSafe(target);
|
|
207
|
+
if (defaults === null) {
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
const values = {};
|
|
211
|
+
for (const key of this.paramKeys) {
|
|
212
|
+
const param = params[key];
|
|
213
|
+
if (typeof param === "string") {
|
|
214
|
+
values[key] = param;
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
values[key] = defaults[key];
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return inject(this.route, values);
|
|
221
|
+
}
|
|
222
|
+
}
|