Commit 8a948a20 authored by Fatih Acet's avatar Fatih Acet

Merge branch 'kp-add-ignore-rules-for-object-convert-util' into 'master'

Support for ignore rules in 'convertObjectPropsToCamelCase' helper

See merge request gitlab-org/gitlab-ce!24790
parents 82711faa 93e58bf9
...@@ -614,10 +614,18 @@ export const spriteIcon = (icon, className = '') => { ...@@ -614,10 +614,18 @@ export const spriteIcon = (icon, className = '') => {
/** /**
* This method takes in object with snake_case property names * This method takes in object with snake_case property names
* and returns new object with camelCase property names * and returns a new object with camelCase property names
* *
* Reasoning for this method is to ensure consistent property * Reasoning for this method is to ensure consistent property
* naming conventions across JS code. * naming conventions across JS code.
*
* This method also supports additional params in `options` object
*
* @param {Object} obj - Object to be converted.
* @param {Object} options - Object containing additional options.
* @param {boolean} options.deep - FLag to allow deep object converting
* @param {Array[]} dropKeys - List of properties to discard while building new object
* @param {Array[]} ignoreKeyNames - List of properties to leave intact (as snake_case) while building new object
*/ */
export const convertObjectPropsToCamelCase = (obj = {}, options = {}) => { export const convertObjectPropsToCamelCase = (obj = {}, options = {}) => {
if (obj === null) { if (obj === null) {
...@@ -625,12 +633,26 @@ export const convertObjectPropsToCamelCase = (obj = {}, options = {}) => { ...@@ -625,12 +633,26 @@ export const convertObjectPropsToCamelCase = (obj = {}, options = {}) => {
} }
const initial = Array.isArray(obj) ? [] : {}; const initial = Array.isArray(obj) ? [] : {};
const { deep = false, dropKeys = [], ignoreKeyNames = [] } = options;
return Object.keys(obj).reduce((acc, prop) => { return Object.keys(obj).reduce((acc, prop) => {
const result = acc; const result = acc;
const val = obj[prop]; const val = obj[prop];
if (options.deep && (isObject(val) || Array.isArray(val))) { // Drop properties from new object if
// there are any mentioned in options
if (dropKeys.indexOf(prop) > -1) {
return acc;
}
// Skip converting properties in new object
// if there are any mentioned in options
if (ignoreKeyNames.indexOf(prop) > -1) {
result[prop] = obj[prop];
return acc;
}
if (deep && (isObject(val) || Array.isArray(val))) {
result[convertToCamelCase(prop)] = convertObjectPropsToCamelCase(val, options); result[convertToCamelCase(prop)] = convertObjectPropsToCamelCase(val, options);
} else { } else {
result[convertToCamelCase(prop)] = obj[prop]; result[convertToCamelCase(prop)] = obj[prop];
......
...@@ -680,7 +680,25 @@ describe('common_utils', () => { ...@@ -680,7 +680,25 @@ describe('common_utils', () => {
}); });
}); });
describe('deep: true', () => { describe('with options', () => {
const objWithoutChildren = {
project_name: 'GitLab CE',
group_name: 'GitLab.org',
license_type: 'MIT',
};
const objWithChildren = {
project_name: 'GitLab CE',
group_name: 'GitLab.org',
license_type: 'MIT',
tech_stack: {
backend: 'Ruby',
frontend_framework: 'Vue',
database: 'PostgreSQL',
},
};
describe('when options.deep is true', () => {
it('converts object with child objects', () => { it('converts object with child objects', () => {
const obj = { const obj = {
snake_key: { snake_key: {
...@@ -727,6 +745,68 @@ describe('common_utils', () => { ...@@ -727,6 +745,68 @@ describe('common_utils', () => {
]); ]);
}); });
}); });
describe('when options.dropKeys is provided', () => {
it('discards properties mentioned in `dropKeys` array', () => {
expect(
commonUtils.convertObjectPropsToCamelCase(objWithoutChildren, {
dropKeys: ['group_name'],
}),
).toEqual({
projectName: 'GitLab CE',
licenseType: 'MIT',
});
});
it('discards properties mentioned in `dropKeys` array when `deep` is true', () => {
expect(
commonUtils.convertObjectPropsToCamelCase(objWithChildren, {
deep: true,
dropKeys: ['group_name', 'database'],
}),
).toEqual({
projectName: 'GitLab CE',
licenseType: 'MIT',
techStack: {
backend: 'Ruby',
frontendFramework: 'Vue',
},
});
});
});
describe('when options.ignoreKeyNames is provided', () => {
it('leaves properties mentioned in `ignoreKeyNames` array intact', () => {
expect(
commonUtils.convertObjectPropsToCamelCase(objWithoutChildren, {
ignoreKeyNames: ['group_name'],
}),
).toEqual({
projectName: 'GitLab CE',
licenseType: 'MIT',
group_name: 'GitLab.org',
});
});
it('leaves properties mentioned in `ignoreKeyNames` array intact when `deep` is true', () => {
expect(
commonUtils.convertObjectPropsToCamelCase(objWithChildren, {
deep: true,
ignoreKeyNames: ['group_name', 'frontend_framework'],
}),
).toEqual({
projectName: 'GitLab CE',
group_name: 'GitLab.org',
licenseType: 'MIT',
techStack: {
backend: 'Ruby',
frontend_framework: 'Vue',
database: 'PostgreSQL',
},
});
});
});
});
}); });
describe('roundOffFloat', () => { describe('roundOffFloat', () => {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment