fix(router): throw when generating non-terminal link
Closes #3979 Closes #4092
This commit is contained in:
parent
f91c087c46
commit
8aec215ca0
|
@ -200,6 +200,7 @@ export class RouteRegistry {
|
||||||
generate(linkParams: any[], parentComponent: any): Instruction {
|
generate(linkParams: any[], parentComponent: any): Instruction {
|
||||||
let segments = [];
|
let segments = [];
|
||||||
let componentCursor = parentComponent;
|
let componentCursor = parentComponent;
|
||||||
|
var lastInstructionIsTerminal = false;
|
||||||
|
|
||||||
for (let i = 0; i < linkParams.length; i += 1) {
|
for (let i = 0; i < linkParams.length; i += 1) {
|
||||||
let segment = linkParams[i];
|
let segment = linkParams[i];
|
||||||
|
@ -233,9 +234,26 @@ export class RouteRegistry {
|
||||||
}
|
}
|
||||||
segments.push(response);
|
segments.push(response);
|
||||||
componentCursor = response.componentType;
|
componentCursor = response.componentType;
|
||||||
|
lastInstructionIsTerminal = response.terminal;
|
||||||
}
|
}
|
||||||
|
|
||||||
var instruction: Instruction = this._generateRedirects(componentCursor);
|
var instruction: Instruction = null;
|
||||||
|
|
||||||
|
if (!lastInstructionIsTerminal) {
|
||||||
|
instruction = this._generateRedirects(componentCursor);
|
||||||
|
|
||||||
|
if (isPresent(instruction)) {
|
||||||
|
let lastInstruction = instruction;
|
||||||
|
while (isPresent(lastInstruction.child)) {
|
||||||
|
lastInstruction = lastInstruction.child;
|
||||||
|
}
|
||||||
|
lastInstructionIsTerminal = lastInstruction.component.terminal;
|
||||||
|
}
|
||||||
|
if (!lastInstructionIsTerminal) {
|
||||||
|
throw new BaseException(
|
||||||
|
`Link "${ListWrapper.toJSON(linkParams)}" does not resolve to a terminal instruction.`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
while (segments.length > 0) {
|
while (segments.length > 0) {
|
||||||
|
|
|
@ -79,9 +79,8 @@ export function main() {
|
||||||
expect(url).toEqual('first/one/second/two');
|
expect(url).toEqual('first/one/second/two');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should geneate params as an empty StringMap when no params are given', () => {
|
it('should generate params as an empty StringMap when no params are given', () => {
|
||||||
registry.config(RootHostCmp,
|
registry.config(RootHostCmp, new Route({path: '/test', component: DummyCmpA, as: 'test'}));
|
||||||
new Route({path: '/test/...', component: DummyParentParamCmp, as: 'test'}));
|
|
||||||
var instruction = registry.generate(['test'], RootHostCmp);
|
var instruction = registry.generate(['test'], RootHostCmp);
|
||||||
expect(instruction.component.params).toEqual({});
|
expect(instruction.component.params).toEqual({});
|
||||||
});
|
});
|
||||||
|
@ -232,6 +231,13 @@ export function main() {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should throw when linkParams are not terminal', () => {
|
||||||
|
registry.config(RootHostCmp,
|
||||||
|
new Route({path: '/first/...', component: DummyParentCmp, as: 'first'}));
|
||||||
|
expect(() => { registry.generate(['first'], RootHostCmp); })
|
||||||
|
.toThrowError('Link "["first"]" does not resolve to a terminal instruction.');
|
||||||
|
});
|
||||||
|
|
||||||
it('should match matrix params on child components and query params on the root component',
|
it('should match matrix params on child components and query params on the root component',
|
||||||
inject([AsyncTestCompleter], (async) => {
|
inject([AsyncTestCompleter], (async) => {
|
||||||
registry.config(RootHostCmp, new Route({path: '/first/...', component: DummyParentCmp}));
|
registry.config(RootHostCmp, new Route({path: '/first/...', component: DummyParentCmp}));
|
||||||
|
|
Loading…
Reference in New Issue