Skip to content

Commit

Permalink
feat(router): add support for relative paths (#14)
Browse files Browse the repository at this point in the history
Closes #2, #17
  • Loading branch information
meeroslav committed Jul 19, 2020
1 parent 194fbbd commit ceb4d80
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 1 deletion.
6 changes: 5 additions & 1 deletion libs/angular-routing/src/lib/router.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,10 @@ export class Router {
}

serializeUrl(url: string, queryParams?: Params, hash?: string) {
// if relative path
if (!url.startsWith('/')) {
url = this.urlParser.joinUrls(this.location.path(), url);
}
return (
url +
(queryParams ? `?${queryString.stringify(queryParams)}` : '') +
Expand All @@ -70,7 +74,7 @@ export class Router {
}

parseSearchParams(searchParams: URLSearchParams) {
let queryParams: Params = {};
const queryParams: Params = {};

searchParams.forEach((value, key) => {
queryParams[key] = value;
Expand Down
32 changes: 32 additions & 0 deletions libs/angular-routing/src/lib/url-parser.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import { UrlParser } from 'angular-routing';

describe('UrlParser', () => {
let parser: UrlParser;

beforeEach(() => {
parser = new UrlParser();
});

describe('joinUrls', () => {
it('should join two urls', () => {
expect(parser.joinUrls('path1/path2', 'path3/path4'))
.toEqual('path1/path2/path3/path4');
});
it('should strip off original query params', () => {
expect(parser.joinUrls('path1/path2?param1=value1', 'path3/path4'))
.toEqual('path1/path2/path3/path4');
});
it('should leave query params on target url', () => {
expect(parser.joinUrls('path1/path2', 'path3/path4?param1=value1'))
.toEqual('path1/path2/path3/path4?param1=value1');
});
it('should ignore cwd on segment', () => {
expect(parser.joinUrls('path1/path2', './path3/path4?param1=value1'))
.toEqual('path1/path2/path3/path4?param1=value1');
});
it('should apply ".." to go back through segments', () => {
expect(parser.joinUrls('path1/path2', '../../path3/path4?param1=value1'))
.toEqual('path3/path4?param1=value1');
});
});
});
20 changes: 20 additions & 0 deletions libs/angular-routing/src/lib/url-parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,24 @@ export class UrlParser {
parse(url: string, base?: string | URL): URL {
return new URL(url, base);
}

joinUrls(currentUrl: string, url: string): string {
const currentUrlSegments = currentUrl
.split('#')[0] // remove hash
.split('?')[0] // remove query params
.split('/');
const urlSegments = url.split('/');

return urlSegments
.reduce((segments, segment) => {
if (segment === '.') {
return segments;
}
if (segment === '..') {
return segments.slice(0, -1);
}
return [...segments, segment];
}, currentUrlSegments)
.join('/');
}
}

0 comments on commit ceb4d80

Please sign in to comment.