'/teams/123/456'
)
})
+
+ it('sub segments (params + static)', () => {
+ const pattern = new MatcherPatternPathCustomParams(
+ /^\/teams\/([^/]+?)-b-([^/]+?)$/i,
+ {
+ teamId: {},
+ otherId: {},
+ },
+ ['teams', [0, '-b-', 0]]
+ )
+
+ expect(pattern.match('/teams/123-b-456')).toEqual({
+ teamId: '123',
+ otherId: '456',
+ })
+ expect(() => pattern.match('/teams/123-b')).toThrow()
+ expect(() => pattern.match('/teams/123-b-456/c')).toThrow()
+ expect(() => pattern.match('/teams/')).toThrow()
+ expect(pattern.build({ teamId: '123', otherId: '456' })).toBe(
+ '/teams/123-b-456'
+ )
+ })
})
// A better version could be using all the parts to join them
// .e.g ['users', 0, 'profile', 1] -> /users/123/profile/456
// numbers are indexes of the params in the params object keys
- readonly pathParts: Array<string | number>
+ readonly pathParts: Array<string | number | Array<string | number>>
) {
this.paramsKeys = Object.keys(this.params) as Array<keyof TParamsOptions>
}
.map(part => {
if (typeof part === 'string') {
return part
+ } else if (typeof part === 'number') {
+ const paramName = this.paramsKeys[paramIndex++]
+ const paramOptions = this.params[paramName]
+ const value: ReturnType<NonNullable<ParamParser['set']>> = (
+ paramOptions.set || identityFn
+ )(params[paramName])
+
+ return Array.isArray(value)
+ ? value.map(encodeParam).join('/')
+ : encodeParam(value)
+ } else {
+ return part
+ .map(subPart => {
+ if (typeof subPart === 'string') {
+ return subPart
+ }
+
+ const paramName = this.paramsKeys[paramIndex++]
+ const paramOptions = this.params[paramName]
+ const value: ReturnType<NonNullable<ParamParser['set']>> = (
+ paramOptions.set || identityFn
+ )(params[paramName])
+
+ return Array.isArray(value)
+ ? value.map(encodeParam).join('/')
+ : encodeParam(value)
+ })
+ .join('')
}
- const paramName = this.paramsKeys[paramIndex++]
- const paramOptions = this.params[paramName]
- const value: ReturnType<NonNullable<ParamParser['set']>> = (
- paramOptions.set || identityFn
- )(params[paramName])
-
- return Array.isArray(value)
- ? value.map(encodeParam).join('/')
- : encodeParam(value)
})
.filter(identityFn) // filter out empty values
.join('/')