UNPKG

angular-state-router

Version:

An AngularJS state-based router designed for flexibility and ease of use.

104 lines (77 loc) 2.31 kB
'use strict'; // Parse Object literal name-value pairs var reParseObjectLiteral = /([,{]\s*(("|')(.*?)\3|\w*)|(:\s*([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*)(?:[eE][+-]?\d+)?|true|false|null|("|')(.*?)\7|\[[^\]]*\])))/g; // Match Strings var reString = /^("|')(.*?)\1$/; // TODO Add escaped string quotes \' and \" to string matcher // Match Number (int/float/exponential) var reNumber = /^[+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*)(?:[eE][+-]?\d+)?$/; /** * Parse string value into Boolean/Number/Array/String/null. * * Strings are surrounded by a pair of matching quotes * * @param {String} value A String value to parse * @return {Mixed} A Boolean/Number/Array/String/null */ var _resolveValue = function(value) { // Boolean: true if(value === 'true') { return true; // Boolean: false } else if(value === 'false') { return false; // Null } else if(value === 'null') { return null; // String } else if(value.match(reString)) { return value.substr(1, value.length-2); // Number } else if(value.match(reNumber)) { return +value; // NaN } else if(value === 'NaN') { return NaN; // TODO add matching with Arrays and parse } // Unable to resolve return value; }; // Find values in an object literal var _listify = function(str) { // Trim str = str.replace(/^\s*/, '').replace(/\s*$/, ''); if(str.match(/^\s*{.*}\s*$/) === null) { throw new Error('Parameters expects an Object'); } var sanitizeName = function(name) { return name.replace(/^[\{,]?\s*["']?/, '').replace(/["']?\s*$/, ''); }; var sanitizeValue = function(value) { var str = value.replace(/^(:)?\s*/, '').replace(/\s*$/, ''); return _resolveValue(str); }; return str.match(reParseObjectLiteral).map(function(item, i, list) { return i%2 === 0 ? sanitizeName(item) : sanitizeValue(item); }); }; /** * Create a params Object from string * * @param {String} str A stringified version of Object literal */ var Parameters = function(str) { str = str || ''; // Instance var _self = {}; _listify(str).forEach(function(item, i, list) { if(i%2 === 0) { _self[item] = list[i+1]; } }); return _self; }; module.exports = Parameters; module.exports.resolveValue = _resolveValue; module.exports.listify = _listify;