Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

feat(errorHandlingConfig): add an option not to encode stack in URL #16283

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions src/minErr.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
*/

var minErrConfig = {
objectMaxDepth: 5
objectMaxDepth: 5,
isUrlParameters:true
};

/**
Expand All @@ -30,12 +31,17 @@ var minErrConfig = {
* * `objectMaxDepth` **{Number}** - The max depth for stringifying objects. Setting to a
* non-positive or non-numeric value, removes the max depth limit.
* Default: 5
* * `isUrlParameters` **{Boolean}** - Specifies wether the generated url error will contain the paramters or not.
* Default: true
*/
function errorHandlingConfig(config) {
if (isObject(config)) {
if (isDefined(config.objectMaxDepth)) {
minErrConfig.objectMaxDepth = isValidObjectMaxDepth(config.objectMaxDepth) ? config.objectMaxDepth : NaN;
}
if (isDefined(config.isUrlParameters) && isBoolean(config.isUrlParameters)) {
minErrConfig.isUrlParameters = config.isUrlParameters;
}
} else {
return minErrConfig;
}
Expand All @@ -50,6 +56,7 @@ function isValidObjectMaxDepth(maxDepth) {
return isNumber(maxDepth) && maxDepth > 0;
}


/**
* @description
*
Expand Down Expand Up @@ -103,9 +110,10 @@ function minErr(module, ErrorConstructor) {

message += '\nhttp://errors.angularjs.org/"NG_VERSION_FULL"/' +
(module ? module + '/' : '') + code;

for (i = 0, paramPrefix = '?'; i < templateArgs.length; i++, paramPrefix = '&') {
message += paramPrefix + 'p' + i + '=' + encodeURIComponent(templateArgs[i]);
if (minErrConfig.isUrlParameters) {
for (i = 0, paramPrefix = '?'; i < templateArgs.length; i++, paramPrefix = '&') {
message += paramPrefix + 'p' + i + '=' + encodeURIComponent(templateArgs[i]);
}
}

return new ErrorConstructor(message);
Expand Down
61 changes: 45 additions & 16 deletions test/minErrSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,53 @@

describe('errors', function() {
var originalObjectMaxDepthInErrorMessage = minErrConfig.objectMaxDepth;

var originalIsUrlParameters = minErrConfig.isUrlParameters;
afterEach(function() {
minErrConfig.objectMaxDepth = originalObjectMaxDepthInErrorMessage;
minErrConfig.isUrlParameters = originalIsUrlParameters;
});

describe('errorHandlingConfig', function() {
it('should get default objectMaxDepth', function() {
expect(errorHandlingConfig().objectMaxDepth).toBe(5);
describe('objectMaxDepth',function() {
it('should get default objectMaxDepth', function() {
expect(errorHandlingConfig().objectMaxDepth).toBe(5);
});

it('should set objectMaxDepth', function() {
errorHandlingConfig({objectMaxDepth: 3});
expect(errorHandlingConfig().objectMaxDepth).toBe(3);
});

it('should not change objectMaxDepth when undefined is supplied', function() {
errorHandlingConfig({objectMaxDepth: undefined});
expect(errorHandlingConfig().objectMaxDepth).toBe(originalObjectMaxDepthInErrorMessage);
});

they('should set objectMaxDepth to NaN when $prop is supplied',
[NaN, null, true, false, -1, 0], function(maxDepth) {
errorHandlingConfig({objectMaxDepth: maxDepth});
expect(errorHandlingConfig().objectMaxDepth).toBeNaN();
}
);
});

it('should set objectMaxDepth', function() {
errorHandlingConfig({objectMaxDepth: 3});
expect(errorHandlingConfig().objectMaxDepth).toBe(3);
});

it('should not change objectMaxDepth when undefined is supplied', function() {
errorHandlingConfig({objectMaxDepth: undefined});
expect(errorHandlingConfig().objectMaxDepth).toBe(originalObjectMaxDepthInErrorMessage);
describe('isUrlParameters',function() {
it('should get default isUrlParameters', function() {
expect(errorHandlingConfig().isUrlParameters).toBe(true);
});
it('should set isUrlParameters', function() {
errorHandlingConfig({isUrlParameters:false});
expect(errorHandlingConfig().isUrlParameters).toBe(false);
errorHandlingConfig({isUrlParameters:true});
expect(errorHandlingConfig().isUrlParameters).toBe(true);
});
it('should not change its value when non-boolean is supplied', function() {
errorHandlingConfig({isUrlParameters:123});
expect(errorHandlingConfig().isUrlParameters).toBe(originalIsUrlParameters);
});
});

they('should set objectMaxDepth to NaN when $prop is supplied',
[NaN, null, true, false, -1, 0], function(maxDepth) {
errorHandlingConfig({objectMaxDepth: maxDepth});
expect(errorHandlingConfig().objectMaxDepth).toBeNaN();
}
);
});

describe('minErr', function() {
Expand Down Expand Up @@ -164,5 +185,13 @@ describe('errors', function() {
expect(testError('acode', 'aproblem', 'a', 'b', 'value with space').message)
.toMatch(/^[\s\S]*\?p0=a&p1=b&p2=value%20with%20space$/);
});

it('should not generate URL query parameters when isUrlParameters is false', function() {

errorHandlingConfig({isUrlParameters:false});
expect(testError('acode', 'aproblem', 'a', 'b', 'c').message)
.not.toContain('?p0=a&p1=b&p2=c');
});

});
});