Skip to content
This repository was archived by the owner on Feb 26, 2024. It is now read-only.

Commit 0269b0a

Browse files
steveschmittwardbell
authored andcommitted
fix: make it work in node for universal (#102)
Was referencing `window.document` to parse the path. Use different technique because that doesn't exist in node. Chose to use regEx which is platform agnostic.
1 parent 8ac7902 commit 0269b0a

6 files changed

+119
-29
lines changed

bundles/in-memory-web-api.umd.js

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -612,7 +612,7 @@ var InMemoryBackendService = (function () {
612612
this.inMemDbService = inMemDbService;
613613
this.config = new InMemoryBackendConfig();
614614
this.resetDb();
615-
var loc = this.getLocation('./');
615+
var loc = this.getLocation('/');
616616
this.config.host = loc.host; // default to app web server host
617617
this.config.rootPath = loc.pathname; // default to path when app is served (e.g.'/')
618618
Object.assign(this.config, config || {});
@@ -861,11 +861,38 @@ var InMemoryBackendService = (function () {
861861
});
862862
};
863863
InMemoryBackendService.prototype.getLocation = function (href) {
864-
var l = document.createElement('a');
865-
l.href = href;
866-
return l;
864+
if (!href.startsWith('http')) {
865+
// get the document iff running in browser
866+
var doc = (typeof document === 'undefined') ? undefined : document;
867+
// add host info to url before parsing. Use a fake host when not in browser.
868+
var base = doc ? doc.location.protocol + '//' + doc.location.host : 'http://fake';
869+
href = href.startsWith('/') ? base + href : base + '/' + href;
870+
}
871+
var uri = this.parseuri(href);
872+
var loc = {
873+
host: uri.host,
874+
protocol: uri.protocol,
875+
port: uri.port,
876+
pathname: uri.path,
877+
search: uri.query ? '?' + uri.query : ''
878+
};
879+
return loc;
867880
};
868881

882+
// Adapted from parseuri package - http://blog.stevenlevithan.com/archives/parseuri
883+
InMemoryBackendService.prototype.parseuri = function (str) {
884+
// tslint:disable-next-line:max-line-length
885+
var URL_REGEX = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/;
886+
var key = ['source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port',
887+
'relative', 'path', 'directory', 'file', 'query', 'anchor'];
888+
var m = URL_REGEX.exec(str);
889+
var uri = {};
890+
var i = 14;
891+
while (i--) {
892+
uri[key[i]] = m[i] || '';
893+
}
894+
return uri;
895+
};
869896
InMemoryBackendService.prototype.indexOf = function (collection, id) {
870897
return collection.findIndex(function (item) { return item.id === id; });
871898
};

in-memory-backend.service.d.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,14 @@ export declare class InMemoryBackendService {
241241
protected findById(collection: any[], id: number | string): any;
242242
protected genId(collection: any): any;
243243
protected get({id, query, collection, collectionName, headers, req}: RequestInfo): ResponseOptions;
244-
protected getLocation(href: string): HTMLAnchorElement;
244+
protected getLocation(href: string): {
245+
host: any;
246+
protocol: any;
247+
port: any;
248+
pathname: any;
249+
search: string;
250+
};
251+
protected parseuri(str: string): any;
245252
protected indexOf(collection: any[], id: number): number;
246253
protected parseId(collection: {
247254
id: any;

in-memory-backend.service.js

Lines changed: 31 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

in-memory-backend.service.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
[{"__symbolic":"module","version":3,"metadata":{"createErrorResponse":{"__symbolic":"function","parameters":["req","status","message"],"value":{"__symbolic":"error","message":"Expression form not supported","line":20,"character":21}},"createObservableResponse":{"__symbolic":"function","parameters":["req","resOptions"],"value":{"__symbolic":"error","message":"Function call not supported","line":31,"character":36}},"emitResponse":{"__symbolic":"function"},"InMemoryDbService":{"__symbolic":"class","members":{"createDb":[{"__symbolic":"method"}]}},"InMemoryBackendConfigArgs":{"__symbolic":"class"},"removeTrailingSlash":{"__symbolic":"function","parameters":["path"],"value":{"__symbolic":"error","message":"Expression form not supported","line":137,"character":22}},"InMemoryBackendConfig":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable"}}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"InMemoryBackendConfigArgs"}]}]}},"isSuccess":{"__symbolic":"function","parameters":["status"],"value":{"__symbolic":"binop","operator":"&&","left":{"__symbolic":"binop","operator":">=","left":{"__symbolic":"reference","name":"status"},"right":200},"right":{"__symbolic":"binop","operator":"<","left":{"__symbolic":"reference","name":"status"},"right":300}}},"setStatusText":{"__symbolic":"function"},"InMemoryBackendService":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable"}}],"members":{"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[null,null,[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject"},"arguments":[{"__symbolic":"reference","name":"InMemoryBackendConfig"}]},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Optional"}}]],"parameters":[{"__symbolic":"reference","module":"@angular/core","name":"Injector"},{"__symbolic":"reference","name":"InMemoryDbService"},{"__symbolic":"reference","name":"InMemoryBackendConfigArgs"}]}],"createConnection":[{"__symbolic":"method"}],"handleRequest":[{"__symbolic":"method"}],"addDelay":[{"__symbolic":"method"}],"applyQuery":[{"__symbolic":"method"}],"clone":[{"__symbolic":"method"}],"collectionHandler":[{"__symbolic":"method"}],"commands":[{"__symbolic":"method"}],"delete":[{"__symbolic":"method"}],"findById":[{"__symbolic":"method"}],"genId":[{"__symbolic":"method"}],"get":[{"__symbolic":"method"}],"getLocation":[{"__symbolic":"method"}],"indexOf":[{"__symbolic":"method"}],"parseId":[{"__symbolic":"method"}],"parseUrl":[{"__symbolic":"method"}],"post":[{"__symbolic":"method"}],"put":[{"__symbolic":"method"}],"removeById":[{"__symbolic":"method"}],"resetDb":[{"__symbolic":"method"}],"setPassThruBackend":[{"__symbolic":"method"}]}}}},{"__symbolic":"module","version":1,"metadata":{"createErrorResponse":{"__symbolic":"function","parameters":["req","status","message"],"value":{"__symbolic":"error","message":"Expression form not supported","line":20,"character":21}},"createObservableResponse":{"__symbolic":"function","parameters":["req","resOptions"],"value":{"__symbolic":"error","message":"Function call not supported","line":31,"character":36}},"emitResponse":{"__symbolic":"function"},"InMemoryDbService":{"__symbolic":"class","members":{"createDb":[{"__symbolic":"method"}]}},"InMemoryBackendConfigArgs":{"__symbolic":"class"},"removeTrailingSlash":{"__symbolic":"function","parameters":["path"],"value":{"__symbolic":"error","message":"Expression form not supported","line":137,"character":22}},"InMemoryBackendConfig":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable"}}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"InMemoryBackendConfigArgs"}]}]}},"isSuccess":{"__symbolic":"function","parameters":["status"],"value":{"__symbolic":"binop","operator":"&&","left":{"__symbolic":"binop","operator":">=","left":{"__symbolic":"reference","name":"status"},"right":200},"right":{"__symbolic":"binop","operator":"<","left":{"__symbolic":"reference","name":"status"},"right":300}}},"setStatusText":{"__symbolic":"function"},"InMemoryBackendService":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable"}}],"members":{"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[null,null,[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject"},"arguments":[{"__symbolic":"reference","name":"InMemoryBackendConfig"}]},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Optional"}}]],"parameters":[{"__symbolic":"reference","module":"@angular/core","name":"Injector"},{"__symbolic":"reference","name":"InMemoryDbService"},{"__symbolic":"reference","name":"InMemoryBackendConfigArgs"}]}],"createConnection":[{"__symbolic":"method"}],"handleRequest":[{"__symbolic":"method"}],"addDelay":[{"__symbolic":"method"}],"applyQuery":[{"__symbolic":"method"}],"clone":[{"__symbolic":"method"}],"collectionHandler":[{"__symbolic":"method"}],"commands":[{"__symbolic":"method"}],"delete":[{"__symbolic":"method"}],"findById":[{"__symbolic":"method"}],"genId":[{"__symbolic":"method"}],"get":[{"__symbolic":"method"}],"getLocation":[{"__symbolic":"method"}],"indexOf":[{"__symbolic":"method"}],"parseId":[{"__symbolic":"method"}],"parseUrl":[{"__symbolic":"method"}],"post":[{"__symbolic":"method"}],"put":[{"__symbolic":"method"}],"removeById":[{"__symbolic":"method"}],"resetDb":[{"__symbolic":"method"}],"setPassThruBackend":[{"__symbolic":"method"}]}}}}]
1+
[{"__symbolic":"module","version":3,"metadata":{"createErrorResponse":{"__symbolic":"function","parameters":["req","status","message"],"value":{"__symbolic":"error","message":"Expression form not supported","line":21,"character":21}},"createObservableResponse":{"__symbolic":"function","parameters":["req","resOptions"],"value":{"__symbolic":"error","message":"Function call not supported","line":32,"character":36}},"emitResponse":{"__symbolic":"function"},"InMemoryDbService":{"__symbolic":"class","members":{"createDb":[{"__symbolic":"method"}]}},"InMemoryBackendConfigArgs":{"__symbolic":"class"},"removeTrailingSlash":{"__symbolic":"function","parameters":["path"],"value":{"__symbolic":"error","message":"Expression form not supported","line":138,"character":22}},"InMemoryBackendConfig":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable"}}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"InMemoryBackendConfigArgs"}]}]}},"isSuccess":{"__symbolic":"function","parameters":["status"],"value":{"__symbolic":"binop","operator":"&&","left":{"__symbolic":"binop","operator":">=","left":{"__symbolic":"reference","name":"status"},"right":200},"right":{"__symbolic":"binop","operator":"<","left":{"__symbolic":"reference","name":"status"},"right":300}}},"setStatusText":{"__symbolic":"function"},"InMemoryBackendService":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable"}}],"members":{"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[null,null,[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject"},"arguments":[{"__symbolic":"reference","name":"InMemoryBackendConfig"}]},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Optional"}}]],"parameters":[{"__symbolic":"reference","module":"@angular/core","name":"Injector"},{"__symbolic":"reference","name":"InMemoryDbService"},{"__symbolic":"reference","name":"InMemoryBackendConfigArgs"}]}],"createConnection":[{"__symbolic":"method"}],"handleRequest":[{"__symbolic":"method"}],"addDelay":[{"__symbolic":"method"}],"applyQuery":[{"__symbolic":"method"}],"clone":[{"__symbolic":"method"}],"collectionHandler":[{"__symbolic":"method"}],"commands":[{"__symbolic":"method"}],"delete":[{"__symbolic":"method"}],"findById":[{"__symbolic":"method"}],"genId":[{"__symbolic":"method"}],"get":[{"__symbolic":"method"}],"getLocation":[{"__symbolic":"method"}],"parseuri":[{"__symbolic":"method"}],"indexOf":[{"__symbolic":"method"}],"parseId":[{"__symbolic":"method"}],"parseUrl":[{"__symbolic":"method"}],"post":[{"__symbolic":"method"}],"put":[{"__symbolic":"method"}],"removeById":[{"__symbolic":"method"}],"resetDb":[{"__symbolic":"method"}],"setPassThruBackend":[{"__symbolic":"method"}]}}}},{"__symbolic":"module","version":1,"metadata":{"createErrorResponse":{"__symbolic":"function","parameters":["req","status","message"],"value":{"__symbolic":"error","message":"Expression form not supported","line":21,"character":21}},"createObservableResponse":{"__symbolic":"function","parameters":["req","resOptions"],"value":{"__symbolic":"error","message":"Function call not supported","line":32,"character":36}},"emitResponse":{"__symbolic":"function"},"InMemoryDbService":{"__symbolic":"class","members":{"createDb":[{"__symbolic":"method"}]}},"InMemoryBackendConfigArgs":{"__symbolic":"class"},"removeTrailingSlash":{"__symbolic":"function","parameters":["path"],"value":{"__symbolic":"error","message":"Expression form not supported","line":138,"character":22}},"InMemoryBackendConfig":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable"}}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"InMemoryBackendConfigArgs"}]}]}},"isSuccess":{"__symbolic":"function","parameters":["status"],"value":{"__symbolic":"binop","operator":"&&","left":{"__symbolic":"binop","operator":">=","left":{"__symbolic":"reference","name":"status"},"right":200},"right":{"__symbolic":"binop","operator":"<","left":{"__symbolic":"reference","name":"status"},"right":300}}},"setStatusText":{"__symbolic":"function"},"InMemoryBackendService":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable"}}],"members":{"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[null,null,[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject"},"arguments":[{"__symbolic":"reference","name":"InMemoryBackendConfig"}]},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Optional"}}]],"parameters":[{"__symbolic":"reference","module":"@angular/core","name":"Injector"},{"__symbolic":"reference","name":"InMemoryDbService"},{"__symbolic":"reference","name":"InMemoryBackendConfigArgs"}]}],"createConnection":[{"__symbolic":"method"}],"handleRequest":[{"__symbolic":"method"}],"addDelay":[{"__symbolic":"method"}],"applyQuery":[{"__symbolic":"method"}],"clone":[{"__symbolic":"method"}],"collectionHandler":[{"__symbolic":"method"}],"commands":[{"__symbolic":"method"}],"delete":[{"__symbolic":"method"}],"findById":[{"__symbolic":"method"}],"genId":[{"__symbolic":"method"}],"get":[{"__symbolic":"method"}],"getLocation":[{"__symbolic":"method"}],"parseuri":[{"__symbolic":"method"}],"indexOf":[{"__symbolic":"method"}],"parseId":[{"__symbolic":"method"}],"parseUrl":[{"__symbolic":"method"}],"post":[{"__symbolic":"method"}],"put":[{"__symbolic":"method"}],"removeById":[{"__symbolic":"method"}],"resetDb":[{"__symbolic":"method"}],"setPassThruBackend":[{"__symbolic":"method"}]}}}}]

0 commit comments

Comments
 (0)