'use strict'; /* exported minErrConfig, errorHandlingConfig, isValidObjectMaxDepth */ var minErrConfig = { objectMaxDepth: 5, urlErrorParamsEnabled: true }; /** * @ngdoc function * @name angular.errorHandlingConfig * @module ng * @kind function * * @description * Configure several aspects of error handling in AngularJS if used as a setter or return the * current configuration if used as a getter. The following options are supported: * * - **objectMaxDepth**: The maximum depth to which objects are traversed when stringified for error messages. * * Omitted or undefined options will leave the corresponding configuration values unchanged. * * @param {Object=} config - The configuration object. May only contain the options that need to be * updated. Supported keys: * * * `objectMaxDepth` **{Number}** - The max depth for stringifying objects. Setting to a * non-positive or non-numeric value, removes the max depth limit. * Default: 5 * * * `urlErrorParamsEnabled` **{Boolean}** - Specifies whether the generated error url will * contain the parameters of the thrown error. Disabling the parameters can be useful if the * generated error url is very long. * * Default: true. When used without argument, it returns the current value. */ function errorHandlingConfig(config) { if (isObject(config)) { if (isDefined(config.objectMaxDepth)) { minErrConfig.objectMaxDepth = isValidObjectMaxDepth(config.objectMaxDepth) ? config.objectMaxDepth : NaN; } if (isDefined(config.urlErrorParamsEnabled) && isBoolean(config.urlErrorParamsEnabled)) { minErrConfig.urlErrorParamsEnabled = config.urlErrorParamsEnabled; } } else { return minErrConfig; } } /** * @private * @param {Number} maxDepth * @return {boolean} */ function isValidObjectMaxDepth(maxDepth) { return isNumber(maxDepth) && maxDepth > 0; } /** * @description * * This object provides a utility for producing rich Error messages within * AngularJS. 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. * @param {function} ErrorConstructor Custom error constructor to be instantiated when returning * error from returned function, for cases when a particular type of error is useful. * @returns {function(code:string, template:string, ...templateArgs): Error} minErr instance */ function minErr(module, ErrorConstructor) { ErrorConstructor = ErrorConstructor || Error; var url = 'https://errors.angularjs.org/"NG_VERSION_FULL"/'; var regex = url.replace('.', '\\.') + '[\\s\\S]*'; var errRegExp = new RegExp(regex, 'g'); return function() { var code = arguments[0], template = arguments[1], message = '[' + (module ? module + ':' : '') + code + '] ', templateArgs = sliceArgs(arguments, 2).map(function(arg) { return toDebugString(arg, minErrConfig.objectMaxDepth); }), paramPrefix, i; // A minErr message has two parts: the message itself and the url that contains the // encoded message. // The message's parameters can contain other error messages which also include error urls. // To prevent the messages from getting too long, we strip the error urls from the parameters. message += template.replace(/\{\d+\}/g, function(match) { var index = +match.slice(1, -1); if (index < templateArgs.length) { return templateArgs[index].replace(errRegExp, ''); } return match; }); message += '\n' + url + (module ? module + '/' : '') + code; if (minErrConfig.urlErrorParamsEnabled) { for (i = 0, paramPrefix = '?'; i < templateArgs.length; i++, paramPrefix = '&') { message += paramPrefix + 'p' + i + '=' + encodeURIComponent(templateArgs[i]); } } return new ErrorConstructor(message); }; }