@typed/fp
Version:
Data Structures and Resources for fp-ts
656 lines (482 loc) • 14.2 kB
Markdown
---
title: Path.ts
nav_order: 39
parent: Modules
---
## Path overview
Added in v0.13.0
---
<h2 class="text-delta">Table of contents</h2>
- [Combinator](#combinator)
- [formatPart](#formatpart)
- [pathJoin](#pathjoin)
- [removeLeadingSlash](#removeleadingslash)
- [Constructor](#constructor)
- [oneOrMore](#oneormore)
- [optional](#optional)
- [param](#param)
- [prefix](#prefix)
- [queryParam](#queryparam)
- [queryParams](#queryparams)
- [unnamed](#unnamed)
- [zeroOrMore](#zeroormore)
- [Model](#model)
- [OneOrMore (type alias)](#oneormore-type-alias)
- [Optional (type alias)](#optional-type-alias)
- [Param (type alias)](#param-type-alias)
- [Prefix (type alias)](#prefix-type-alias)
- [QueryParam (type alias)](#queryparam-type-alias)
- [QueryParams (type alias)](#queryparams-type-alias)
- [Unnamed (type alias)](#unnamed-type-alias)
- [ZeroOrMore (type alias)](#zeroormore-type-alias)
- [Type-level](#type-level)
- [AppendPrefix (type alias)](#appendprefix-type-alias)
- [FindNextIndex (type alias)](#findnextindex-type-alias)
- [FormatPart (type alias)](#formatpart-type-alias)
- [InpterpolateParts (type alias)](#inpterpolateparts-type-alias)
- [InpterpolatePartsWithNext (type alias)](#inpterpolatepartswithnext-type-alias)
- [Interpolate (type alias)](#interpolate-type-alias)
- [InterpolatePart (type alias)](#interpolatepart-type-alias)
- [InterpolateQueryParamPart (type alias)](#interpolatequeryparampart-type-alias)
- [InterpolateUnnamedPart (type alias)](#interpolateunnamedpart-type-alias)
- [ParamsOf (type alias)](#paramsof-type-alias)
- [PartToParam (type alias)](#parttoparam-type-alias)
- [PartsToParams (type alias)](#partstoparams-type-alias)
- [PathJoin (type alias)](#pathjoin-type-alias)
- [PathToParts (type alias)](#pathtoparts-type-alias)
- [PathToQuery (type alias)](#pathtoquery-type-alias)
- [QueryParamsOf (type alias)](#queryparamsof-type-alias)
- [QueryParamsToParts (type alias)](#queryparamstoparts-type-alias)
- [QueryToParams (type alias)](#querytoparams-type-alias)
- [RemoveLeadingSlash (type alias)](#removeleadingslash-type-alias)
---
# Combinator
## formatPart
Formats a piece of a path
**Signature**
```ts
export declare const formatPart: (part: string) => string
```
Added in v0.13.0
## pathJoin
**Signature**
```ts
export declare const pathJoin: <P extends readonly string[]>(...parts: P) => PathJoin<P>
```
Added in v0.13.0
## removeLeadingSlash
**Signature**
```ts
export declare const removeLeadingSlash: <A extends string>(a: A) => RemoveLeadingSlash<A>
```
Added in v0.13.0
# Constructor
## oneOrMore
one or more path parts will be matched to this param
**Signature**
```ts
export declare const oneOrMore: <A extends string>(param: A) => `:${A}+`
```
Added in v0.13.0
## optional
**Signature**
```ts
export declare const optional: <A extends string>(param: A) => `${A}?`
```
Added in v0.13.0
## param
**Signature**
```ts
export declare const param: <A extends string>(param: A) => `:${A}`
```
Added in v0.13.0
## prefix
**Signature**
```ts
export declare const prefix: <P extends string, A extends `:${string}` | '(.*)'>(
prefix: P,
param: A,
) => `{${P}${A}}`
```
Added in v0.13.0
## queryParam
Construct query params
**Signature**
```ts
export declare const queryParam: <K extends string, V extends string>(
key: K,
value: V,
) => QueryParam<K, V>
```
Added in v0.13.0
## queryParams
**Signature**
```ts
export declare const queryParams: <P extends readonly [any, ...any[]]>(
...params: P
) => QueryParams<P, ''>
```
Added in v0.13.0
## unnamed
**Signature**
```ts
export declare const unnamed: '(.*)'
```
Added in v0.13.0
## zeroOrMore
**Signature**
```ts
export declare const zeroOrMore: <A extends string>(param: A) => `:${A}*`
```
Added in v0.13.0
# Model
## OneOrMore (type alias)
**Signature**
```ts
export type OneOrMore<A extends string> = `${Param<A>}+`
```
Added in v0.13.0
## Optional (type alias)
Template for optional path parts
**Signature**
```ts
export type Optional<A extends string> = `${A}?`
```
Added in v0.13.0
## Param (type alias)
Template for parameters
**Signature**
```ts
export type Param<A extends string> = `:${A}`
```
Added in v0.13.0
## Prefix (type alias)
Construct a custom prefix
**Signature**
```ts
export type Prefix<P extends string, A extends string> = `{${P}${A}}`
```
Added in v0.13.0
## QueryParam (type alias)
Construct query params
**Signature**
```ts
export type QueryParam<K extends string, V extends string> = `` extends V ? K : `${K}=${V}`
```
Added in v0.13.0
## QueryParams (type alias)
Creates the path-to-regexp syntax for query parameters
**Signature**
```ts
export type QueryParams<
Q extends readonly QueryParam<any, any>[],
R extends string = ``,
> = Q extends readonly [infer Head, ...infer Tail]
? QueryParams<
A.Cast<Tail, readonly QueryParam<any, any>[]>,
`` extends R ? `\\?${A.Cast<Head, string>}` : `${R}&${A.Cast<Head, string>}`
>
: R
```
Added in v0.13.0
## Unnamed (type alias)
**Signature**
```ts
export type Unnamed = typeof unnamed
```
Added in v0.13.0
## ZeroOrMore (type alias)
zero or more path parts will be matched to this param
**Signature**
```ts
export type ZeroOrMore<A extends string> = `${Param<A>}*`
```
Added in v0.13.0
# Type-level
## AppendPrefix (type alias)
**Signature**
```ts
export type AppendPrefix<
R extends readonly any[],
Pre extends string,
P extends string,
> = R extends readonly [...infer Init, infer L]
? readonly [...Init, `${A.Cast<L, string>}${Pre}${P}`]
: R
```
Added in v0.13.0
## FindNextIndex (type alias)
**Signature**
```ts
export type FindNextIndex<AST, I extends number = 0> = I extends keyof AST
? FindNextIndex<AST, N.Add<I, 1>>
: I
```
Added in v0.13.0
## FormatPart (type alias)
**Signature**
```ts
export type FormatPart<P extends string> = `` extends P
? P
: RemoveLeadingSlash<P> extends `\\?${infer _}`
? RemoveLeadingSlash<P>
: RemoveLeadingSlash<P> extends `{${infer _}`
? RemoveLeadingSlash<P>
: P extends QueryParam<infer _, infer _> | QueryParams<infer _, infer _>
? P
: `/${RemoveLeadingSlash<P>}`
```
Added in v0.13.0
## InpterpolateParts (type alias)
**Signature**
```ts
export type InpterpolateParts<
Parts extends readonly any[],
Params extends {},
R extends readonly any[] = [],
AST = {},
> = Parts extends readonly [infer H, ...infer T]
? H extends Optional<Prefix<infer Pre, Unnamed>>
? FindNextIndex<AST> extends keyof Params
? InpterpolateParts<
T,
Params,
AppendPrefix<R, Pre, `${A.Cast<Params[FindNextIndex<AST>], string | number>}`>,
AST & Record<H, Params[FindNextIndex<AST>]>
>
: InpterpolateParts<T, Params, R, AST>
: H extends Prefix<infer Pre, Unnamed>
? InpterpolateParts<
T,
Params,
AppendPrefix<
R,
Pre,
`${A.Cast<Params[A.Cast<FindNextIndex<AST>, keyof Params>], string | number>}`
>,
AST & Record<H, Params[A.Cast<FindNextIndex<AST>, keyof Params>]>
>
: H extends Optional<Prefix<infer Pre, Param<infer P>>>
? P extends keyof Params
? InpterpolateParts<
T,
Params,
AppendPrefix<R, Pre, A.Cast<Params[A.Cast<P, keyof Params>], string>>,
AST & Record<H, Params[A.Cast<P, keyof Params>]>
>
: InpterpolateParts<T, Params, R, AST>
: H extends Prefix<infer Pre, Param<infer P>>
? InpterpolateParts<
T,
Params,
AppendPrefix<R, Pre, A.Cast<Params[A.Cast<P, keyof Params>], string>>,
AST & Record<H, Params[A.Cast<P, keyof Params>]>
>
: InterpolatePart<H, Params, AST> extends readonly [infer A, infer B]
? InpterpolatePartsWithNext<T, Params, R, readonly [A, B]>
: InpterpolateParts<T, Params, R, AST>
: readonly [R, AST]
```
Added in v0.13.0
## InpterpolatePartsWithNext (type alias)
**Signature**
```ts
export type InpterpolatePartsWithNext<
Parts extends readonly any[],
Params extends {},
R extends readonly any[],
Next extends readonly [any, any],
> = InpterpolateParts<Parts, Params, readonly [...R, Next[0]], Next[1]>
```
Added in v0.13.0
## Interpolate (type alias)
**Signature**
```ts
export type Interpolate<
P extends string,
Params extends ParamsOf<P>,
> = P extends `${infer Head}\\?${infer Tail}`
? PathJoin<
InterpolateWithQueryParams<
SplitQueryParams<Tail>,
Params,
InpterpolateParts<PathToParts<Head>, Params>
>[0]
>
: PathJoin<InpterpolateParts<PathToParts<P>, Params>[0]>
```
Added in v0.13.0
## InterpolatePart (type alias)
**Signature**
```ts
export type InterpolatePart<P, Params, AST> = P extends Optional<Param<infer R>>
? R extends keyof Params
? readonly [Params[R], AST & Record<R, Params[R]>]
: readonly ['', AST]
: P extends Param<infer R>
? R extends keyof Params
? readonly [Params[R], AST & Record<R, Params[R]>]
: readonly [P, AST]
: P extends Unnamed
? FindNextIndex<AST> extends keyof Params
? InterpolateUnnamedPart<Params, FindNextIndex<AST>, AST>
: readonly [P, AST]
: P extends Prefix<infer Pre, Param<infer R>>
? R extends keyof Params
? [`${Pre}${A.Cast<Params[R], string>}`, AST & Record<R, Params[R]>]
: []
: P extends Optional<Prefix<infer Pre, Param<infer R>>>
? R extends keyof Params
? [`${Pre}${A.Cast<Params[R], string>}`, AST & Partial<Record<R, Params[R]>>]
: []
: readonly [P, AST]
```
Added in v0.13.0
## InterpolateQueryParamPart (type alias)
**Signature**
```ts
export type InterpolateQueryParamPart<
Part,
Params,
Previous extends readonly [readonly string[], any],
First extends boolean,
> = Part extends QueryParam<infer K, infer V>
? InterpolateQueryParamPartWithKey<
First extends true ? `?${K}` : `&${K}`,
Previous[0],
InterpolatePart<V, Params, Previous[1]>,
First
>
: readonly [[[...Previous[0], Part], Previous[1]], false]
```
Added in v0.13.0
## InterpolateUnnamedPart (type alias)
**Signature**
```ts
export type InterpolateUnnamedPart<Params, K extends keyof Params, AST> = readonly [
Params[K],
AST & Record<K, Params[K]>,
]
```
Added in v0.13.0
## ParamsOf (type alias)
**Signature**
```ts
export type ParamsOf<A extends string> = Compact<PartsToParams<PathToParts<A>>>
```
Added in v0.13.0
## PartToParam (type alias)
**Signature**
```ts
export type PartToParam<A extends string, AST> = A extends `\\${infer R}`
? PartsToParams<QueryParamsToParts<R, []>, AST>
: A extends Unnamed
? {
readonly [K in FindNextIndex<AST> extends number ? FindNextIndex<AST> : never]: string
}
: A extends `${infer _}${Unnamed}}?`
? { readonly [K in FindNextIndex<AST> extends number ? FindNextIndex<AST> : never]?: string }
: A extends `${infer _}${Unnamed}}`
? { readonly [K in FindNextIndex<AST> extends number ? FindNextIndex<AST> : never]: string }
: A extends `${infer _}${Param<infer R>}}?`
? { readonly [K in R]?: string }
: A extends `${infer _}${Param<infer R>}}`
? { readonly [K in R]: string }
: A extends `${infer _}${Param<infer R>}?`
? { readonly [K in R]?: string }
: A extends `${infer _}${Param<infer R>}+`
? { readonly [K in R]: readonly [string, ...string[]] }
: A extends `${infer _}${Param<infer R>}*`
? { readonly [K in R]: readonly string[] }
: A extends `${infer _}${Param<infer R>}`
? { readonly [K in R]: string }
: {}
```
Added in v0.13.0
## PartsToParams (type alias)
**Signature**
```ts
export type PartsToParams<A extends ReadonlyArray<string>, AST = {}> = A extends readonly [
infer Head,
...infer Tail
]
? PartsToParams<A.Cast<Tail, readonly string[]>, AST & PartToParam<A.Cast<Head, string>, AST>>
: AST
```
Added in v0.13.0
## PathJoin (type alias)
Composes other path parts into a single path
**Signature**
```ts
export type PathJoin<A extends ReadonlyArray<string>> = A extends readonly [
infer Head,
...infer Tail
]
? `${FormatPart<A.Cast<Head, string>>}${PathJoin<A.Cast<Tail, ReadonlyArray<string>>>}`
: ``
```
Added in v0.13.0
## PathToParts (type alias)
**Signature**
```ts
export type PathToParts<P> = P extends `${infer Head}\\?${infer Tail}`
? readonly [...PathToParts<Head>, `\\?${Tail}`]
: P extends `${infer Head}/${infer Tail}`
? readonly [...PathToParts<Head>, ...PathToParts<Tail>]
: P extends `${infer Head}{${infer Q}}?${infer Tail}`
? readonly [...PathToParts<Head>, `{${Q}}?`, ...PathToParts<`${Tail}`>]
: P extends `${infer Head}{${infer Q}}${infer Tail}`
? readonly [...PathToParts<Head>, `{${Q}}`, ...PathToParts<`${Tail}`>]
: `` extends P
? readonly []
: readonly [P]
```
Added in v0.13.0
## PathToQuery (type alias)
**Signature**
```ts
export type PathToQuery<P extends string> = P extends `${infer _}\\${infer Q}` ? Q : ``
```
Added in v0.13.0
## QueryParamsOf (type alias)
**Signature**
```ts
export type QueryParamsOf<P extends string> = Compact<QueryToParams<PathToQuery<P>>>
```
Added in v0.13.0
## QueryParamsToParts (type alias)
**Signature**
```ts
export type QueryParamsToParts<
Q extends string,
R extends ReadonlyArray<string>,
> = Q extends `\\?${infer Q}`
? QueryParamsToParts<Q, R>
: Q extends `?${infer Q}`
? QueryParamsToParts<Q, R>
: Q extends `${infer Head}&${infer Tail}`
? QueryParamsToParts<Tail, QueryParamsToParts<Head, R>>
: readonly [...R, QueryParamValue<Q>]
```
Added in v0.13.0
## QueryToParams (type alias)
**Signature**
```ts
export type QueryToParams<Q extends string, AST = {}> = Q extends `${infer Head}&${infer Tail}`
? QueryToParams<Tail, QueryToParams<Head, AST>>
: Q extends `?${infer K}`
? QueryToParams<K, AST>
: Q extends `${infer K}?`
? AST & Partial<QueryParamAst<K>>
: Q extends `${infer K}`
? AST & QueryParamAst<K>
: AST
```
Added in v0.13.0
## RemoveLeadingSlash (type alias)
Remove forward slashes prefixes recursively
**Signature**
```ts
export type RemoveLeadingSlash<A> = A extends `/${infer R}` ? RemoveLeadingSlash<R> : A
```
Added in v0.13.0