UNPKG

ui-router-core

Version:

UI-Router Core: Framework agnostic, State-based routing for JavaScript Single Page Apps

155 lines 5.46 kB
"use strict"; /** * @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