mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-03-16 23:30:23 +00:00
75 lines
2.6 KiB
JavaScript
75 lines
2.6 KiB
JavaScript
'use strict';
|
|
|
|
/**
|
|
* @description
|
|
*
|
|
* This object provides a utility for producing rich Error messages within
|
|
* Angular. It can be called as follows:
|
|
*
|
|
* var exampleMinErr = minErr('example');
|
|
* throw exampleMinErr('one', 'This {0} is {1}', foo, bar);
|
|
*
|
|
* The above creates an instance of minErr in the example namespace. The
|
|
* resulting error will have a namespaced error code of example.one. The
|
|
* resulting error will replace {0} with the value of foo, and {1} with the
|
|
* value of bar. The object is not restricted in the number of arguments it can
|
|
* take.
|
|
*
|
|
* If fewer arguments are specified than necessary for interpolation, the extra
|
|
* interpolation markers will be preserved in the final string.
|
|
*
|
|
* Since data will be parsed statically during a build step, some restrictions
|
|
* are applied with respect to how minErr instances are created and called.
|
|
* Instances should have names of the form namespaceMinErr for a minErr created
|
|
* using minErr('namespace') . Error codes, namespaces and template strings
|
|
* should all be static strings, not variables or general expressions.
|
|
*
|
|
* @param {string} module The namespace to use for the new minErr instance.
|
|
* @returns {function(string, string, ...): Error} instance
|
|
*/
|
|
|
|
function minErr(module) {
|
|
return function () {
|
|
var code = arguments[0],
|
|
prefix = '[' + (module ? module + ':' : '') + code + '] ',
|
|
template = arguments[1],
|
|
templateArgs = arguments,
|
|
stringify = function (obj) {
|
|
if (isFunction(obj)) {
|
|
return obj.toString().replace(/ \{[\s\S]*$/, '');
|
|
} else if (isUndefined(obj)) {
|
|
return 'undefined';
|
|
} else if (!isString(obj)) {
|
|
return JSON.stringify(obj);
|
|
}
|
|
return obj;
|
|
},
|
|
message, i;
|
|
|
|
message = prefix + template.replace(/\{\d+\}/g, function (match) {
|
|
var index = +match.slice(1, -1), arg;
|
|
|
|
if (index + 2 < templateArgs.length) {
|
|
arg = templateArgs[index + 2];
|
|
if (isFunction(arg)) {
|
|
return arg.toString().replace(/ ?\{[\s\S]*$/, '');
|
|
} else if (isUndefined(arg)) {
|
|
return 'undefined';
|
|
} else if (!isString(arg)) {
|
|
return toJson(arg);
|
|
}
|
|
return arg;
|
|
}
|
|
return match;
|
|
});
|
|
|
|
message = message + '\nhttp://errors.angularjs.org/' + version.full + '/' +
|
|
(module ? module + '/' : '') + code;
|
|
for (i = 2; i < arguments.length; i++) {
|
|
message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
|
|
encodeURIComponent(stringify(arguments[i]));
|
|
}
|
|
|
|
return new Error(message);
|
|
};
|
|
}
|