angular2-platform-node
Version:
Universal (isomorphic) javascript support for Angular2
214 lines • 7.74 kB
JavaScript
"use strict";
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var core_1 = require('@angular/core');
var common_1 = require('@angular/common');
var tokens_1 = require('./tokens');
var nodeUrl = require('url');
var NodeLocation = (function () {
function NodeLocation(config) {
this.assign(config);
}
Object.defineProperty(NodeLocation.prototype, "origin", {
get: function () {
return this.protocol + '//' + this.hostname + ':' + this.port;
},
enumerable: true,
configurable: true
});
NodeLocation.prototype.parse = function (url) {
return nodeUrl.parse(url);
};
NodeLocation.prototype.format = function (obj) {
return nodeUrl.format(obj);
};
NodeLocation.prototype.assign = function (parsed) {
this.pathname = parsed.pathname || '';
this.search = parsed.search || '';
this.hash = parsed.hash || '';
this.host = parsed.host;
this.hostname = parsed.hostname;
this.href = parsed.href;
this.port = parsed.port;
this.protocol = parsed.protocol;
return this;
};
NodeLocation.prototype.toJSON = function () {
var config = {
hash: this.hash,
host: this.host,
hostname: this.hostname,
href: this.href,
pathname: this.pathname,
port: this.port,
protocol: this.protocol,
search: this.search
};
return config;
};
return NodeLocation;
}());
exports.NodeLocation = NodeLocation;
var State = (function () {
function State(state, title, url) {
this.state = state;
this.title = title;
this.url = url;
}
State.prototype.toJSON = function () {
return {
state: this.state,
title: this.title,
url: this.url
};
};
return State;
}());
exports.State = State;
var PopStateEvent = (function () {
function PopStateEvent(state) {
this.state = state;
this.type = 'popstate';
}
PopStateEvent.prototype.toJSON = function () {
return {
state: this.state
};
};
return PopStateEvent;
}());
exports.PopStateEvent = PopStateEvent;
var NodePlatformLocation = (function (_super) {
__extends(NodePlatformLocation, _super);
function NodePlatformLocation(originUrl, requestUrl, baseUrl) {
_super.call(this);
this._stack = [];
this._stackIndex = -1;
this._popStateListeners = [];
this._baseUrl = '/';
this._originUrl = originUrl;
this._baseUrl = baseUrl || '/';
this.pushState(null, null, requestUrl);
}
NodePlatformLocation.prototype.updateUrl = function (originUrl, baseUrl) {
if (baseUrl === void 0) { baseUrl = '/'; }
this._originUrl = originUrl;
this._baseUrl = baseUrl || '/';
};
Object.defineProperty(NodePlatformLocation.prototype, "search", {
get: function () { return this._loc.search; },
enumerable: true,
configurable: true
});
Object.defineProperty(NodePlatformLocation.prototype, "hash", {
get: function () { return this._loc.hash; },
enumerable: true,
configurable: true
});
Object.defineProperty(NodePlatformLocation.prototype, "pathname", {
get: function () { return this._loc.pathname; },
set: function (newPathname) { this._loc.pathname = newPathname; },
enumerable: true,
configurable: true
});
NodePlatformLocation.prototype.getBaseHrefFromDOM = function () {
throw new Error("\n Attempt to get base href from DOM on the server.\n You have to provide a value for the APP_BASE_HREF token through DI.\n ");
};
NodePlatformLocation.prototype.getBaseHref = function () { return this._baseUrl; };
NodePlatformLocation.prototype.path = function () { return this._loc.pathname; };
NodePlatformLocation.prototype.pushState = function (state, title, url) {
this._stack.push(new State(state, title, url));
this._stackIndex++;
this._updateLocation();
};
NodePlatformLocation.prototype.replaceState = function (state, title, url) {
this._stack[this._stackIndex] = new State(state, title, url);
this._updateLocation();
};
NodePlatformLocation.prototype.onPopState = function (fn) { this._popStateListeners.push(fn); };
NodePlatformLocation.prototype.onHashChange = function (_fn) { };
NodePlatformLocation.prototype.back = function () {
if (this._stackIndex === 0) {
return;
}
this._stackIndex--;
this._updateLocation();
this._callPopStateListeners();
};
NodePlatformLocation.prototype.forward = function () {
if (this._stackIndex === this._stack.length - 1) {
return;
}
this._stackIndex++;
this._updateLocation();
this._callPopStateListeners();
};
NodePlatformLocation.prototype.prepareExternalUrl = function (internal) {
return joinWithSlash(this._baseUrl, internal);
};
NodePlatformLocation.prototype.toJSON = function () {
return {
location: this._loc,
stack: this._stack,
stackIndex: this._stackIndex,
popStateListeners: this._popStateListeners,
baseHref: this._baseUrl
};
};
NodePlatformLocation.prototype._updateLocation = function () {
var state = this._stack[this._stackIndex];
var url = state.url;
this._setLocationByUrl(url);
};
NodePlatformLocation.prototype._setLocationByUrl = function (url) {
var resolvedOriginBase = nodeUrl.resolve(this._originUrl, this._baseUrl);
var resolvedWithUrl = nodeUrl.resolve(resolvedOriginBase, url);
var nodeLocation = nodeUrl.parse(resolvedWithUrl);
this._loc = new NodeLocation(nodeLocation);
};
NodePlatformLocation.prototype._callPopStateListeners = function () {
var state = this._stack[this._stackIndex].state;
var event = new PopStateEvent(state);
this._popStateListeners.forEach(function (listener) { return listener(event); });
};
NodePlatformLocation.decorators = [
{ type: core_1.Injectable },
];
NodePlatformLocation.ctorParameters = [
{ type: undefined, decorators: [{ type: core_1.Optional }, { type: core_1.Inject, args: [tokens_1.ORIGIN_URL,] },] },
{ type: undefined, decorators: [{ type: core_1.Optional }, { type: core_1.Inject, args: [tokens_1.REQUEST_URL,] },] },
{ type: undefined, decorators: [{ type: core_1.Optional }, { type: core_1.Inject, args: [common_1.APP_BASE_HREF,] },] },
];
return NodePlatformLocation;
}(common_1.PlatformLocation));
exports.NodePlatformLocation = NodePlatformLocation;
function joinWithSlash(start, end) {
if (start.length === 0) {
return end;
}
if (end.length === 0) {
return start;
}
var slashes = 0;
if (start.endsWith('/')) {
slashes++;
}
if (end.startsWith('/')) {
slashes++;
}
if (slashes === 2) {
return start + end.substring(1);
}
if (slashes === 1) {
return start + end;
}
return start + '/' + end;
}
exports.joinWithSlash = joinWithSlash;
exports.NODE_LOCATION_PROVIDERS = [
{ provide: common_1.PlatformLocation, useClass: NodePlatformLocation }
];
//# sourceMappingURL=node-location.js.map