ui-router-core
Version:
UI-Router Core: Framework agnostic, State-based routing for JavaScript Single Page Apps
155 lines • 5.46 kB
JavaScript
;
/**
* @coreapi
* @module params
*/
/** */
var common_1 = require("../common/common");
var predicates_1 = require("../common/predicates");
var hof_1 = require("../common/hof");
var coreservices_1 = require("../common/coreservices");
var paramType_1 = require("./paramType");
/**
* A registry for parameter types.
*
* This registry manages the built-in (and custom) parameter types.
*
* The built-in parameter types are:
*
* - [[string]]
* - [[path]]
* - [[query]]
* - [[hash]]
* - [[int]]
* - [[bool]]
* - [[date]]
* - [[json]]
* - [[any]]
*/
var ParamTypes = (function () {
/** @internalapi */
function ParamTypes() {
/** @hidden */
this.enqueue = true;
/** @hidden */
this.typeQueue = [];
/** @internalapi */
this.defaultTypes = common_1.pick(ParamTypes.prototype, ["hash", "string", "query", "path", "int", "bool", "date", "json", "any"]);
// Register default types. Store them in the prototype of this.types.
var makeType = function (definition, name) {
return new paramType_1.ParamType(common_1.extend({ name: name }, definition));
};
this.types = common_1.inherit(common_1.map(this.defaultTypes, makeType), {});
}
/** @internalapi */
ParamTypes.prototype.dispose = function () {
this.types = {};
};
/**
* Registers a parameter type
*
* End users should call [[UrlMatcherFactory.type]], which delegates to this method.
*/
ParamTypes.prototype.type = function (name, definition, definitionFn) {
if (!predicates_1.isDefined(definition))
return this.types[name];
if (this.types.hasOwnProperty(name))
throw new Error("A type named '" + name + "' has already been defined.");
this.types[name] = new paramType_1.ParamType(common_1.extend({ name: name }, definition));
if (definitionFn) {
this.typeQueue.push({ name: name, def: definitionFn });
if (!this.enqueue)
this._flushTypeQueue();
}
return this;
};
/** @internalapi */
ParamTypes.prototype._flushTypeQueue = function () {
while (this.typeQueue.length) {
var type = this.typeQueue.shift();
if (type.pattern)
throw new Error("You cannot override a type's .pattern at runtime.");
common_1.extend(this.types[type.name], coreservices_1.services.$injector.invoke(type.def));
}
};
return ParamTypes;
}());
exports.ParamTypes = ParamTypes;
/** @hidden */
function initDefaultTypes() {
var makeDefaultType = function (def) {
var valToString = function (val) {
return val != null ? val.toString() : val;
};
var defaultTypeBase = {
encode: valToString,
decode: valToString,
is: hof_1.is(String),
pattern: /.*/,
equals: function (a, b) { return a == b; },
};
return common_1.extend({}, defaultTypeBase, def);
};
// Default Parameter Type Definitions
common_1.extend(ParamTypes.prototype, {
string: makeDefaultType({}),
path: makeDefaultType({
pattern: /[^/]*/,
}),
query: makeDefaultType({}),
hash: makeDefaultType({
inherit: false,
}),
int: makeDefaultType({
decode: function (val) { return parseInt(val, 10); },
is: function (val) {
return !predicates_1.isNullOrUndefined(val) && this.decode(val.toString()) === val;
},
pattern: /-?\d+/,
}),
bool: makeDefaultType({
encode: function (val) { return val && 1 || 0; },
decode: function (val) { return parseInt(val, 10) !== 0; },
is: hof_1.is(Boolean),
pattern: /0|1/
}),
date: makeDefaultType({
encode: function (val) {
return !this.is(val) ? undefined : [
val.getFullYear(),
('0' + (val.getMonth() + 1)).slice(-2),
('0' + val.getDate()).slice(-2)
].join("-");
},
decode: function (val) {
if (this.is(val))
return val;
var match = this.capture.exec(val);
return match ? new Date(match[1], match[2] - 1, match[3]) : undefined;
},
is: function (val) { return val instanceof Date && !isNaN(val.valueOf()); },
equals: function (l, r) {
return ['getFullYear', 'getMonth', 'getDate']
.reduce(function (acc, fn) { return acc && l[fn]() === r[fn](); }, true);
},
pattern: /[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[0-1])/,
capture: /([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/
}),
json: makeDefaultType({
encode: common_1.toJson,
decode: common_1.fromJson,
is: hof_1.is(Object),
equals: common_1.equals,
pattern: /[^/]*/
}),
// does not encode/decode
any: makeDefaultType({
encode: common_1.identity,
decode: common_1.identity,
is: function () { return true; },
equals: common_1.equals,
}),
});
}
initDefaultTypes();
//# sourceMappingURL=paramTypes.js.map