core-api/routing: only require args in link call if routeRef has params

This commit is contained in:
Patrik Oldsberg
2020-09-20 14:49:46 +02:00
parent 240366572c
commit 8804c5e338
2 changed files with 8 additions and 10 deletions
+4 -4
View File
@@ -27,7 +27,7 @@ type SubRouteConfig = {
path: string;
};
export class SubRouteRef<T extends { [name in string]: string }>
export class SubRouteRef<T extends { [name in string]: string } | never = never>
implements ReferencedRoute {
constructor(
private readonly parent: ConcreteRoute,
@@ -38,11 +38,11 @@ export class SubRouteRef<T extends { [name in string]: string }>
return this;
}
link(params: T): ConcreteRoute {
link<Args extends T extends never ? [] : [T]>(...args: Args): ConcreteRoute {
return {
[routeReference]: this,
[resolveRoute]: (path: string) => {
const ownPart = generatePath(this.config.path, params);
const ownPart = generatePath(this.config.path, args[0] ?? {});
const parentPart = this.parent[resolveRoute](path);
return parentPart + ownPart;
},
@@ -66,7 +66,7 @@ export class AbsoluteRouteRef implements ConcreteRoute {
return this.config.title;
}
createSubRoute<T extends { [name in string]: string }>(
createSubRoute<T extends { [name in string]: string } | never = never>(
config: SubRouteConfig,
) {
return new SubRouteRef<T>(this, config);
@@ -75,12 +75,10 @@ describe('RouteRefRegistry', () => {
expect(registry.resolveRoute([], [ref1])).toBe('/1');
expect(registry.resolveRoute([], [ref2])).toBe('/2');
expect(registry.resolveRoute([], [ref2a.link({}), ref1])).toBe('/2/a/1');
expect(registry.resolveRoute([], [ref2a.link({}), ref2])).toBe('/2/a/2');
expect(registry.resolveRoute([ref2a.link({})], [ref2])).toBe('/2/a/2');
expect(registry.resolveRoute([ref2a.link({}), ref1], [ref2])).toBe(
'/2/a/2',
);
expect(registry.resolveRoute([], [ref2a.link(), ref1])).toBe('/2/a/1');
expect(registry.resolveRoute([], [ref2a.link(), ref2])).toBe('/2/a/2');
expect(registry.resolveRoute([ref2a.link()], [ref2])).toBe('/2/a/2');
expect(registry.resolveRoute([ref2a.link(), ref1], [ref2])).toBe('/2/a/2');
expect(registry.resolveRoute([], [ref2b.link({ id: 'abc' }), ref1])).toBe(
'/2/b/abc/1',
);