Skip to content

Commit

Permalink
fix: Add validations for aliases (#6426)
Browse files Browse the repository at this point in the history
  • Loading branch information
adusumillipraveen committed Jun 4, 2020
1 parent 08de7af commit 0e21892
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 11 deletions.
20 changes: 20 additions & 0 deletions lib/config/__snapshots__/validation.spec.ts.snap
Expand Up @@ -88,6 +88,24 @@ Array [
]
`;

exports[`config/validation validateConfig(config) errors if aliases depth is more than 1 1`] = `
Array [
Object {
"depName": "Configuration Error",
"message": "Invalid alias object configuration",
},
]
`;

exports[`config/validation validateConfig(config) errors if aliases have invalid url 1`] = `
Array [
Object {
"depName": "Configuration Error",
"message": "Invalid alias object configuration",
},
]
`;

exports[`config/validation validateConfig(config) errors if regexManager fields are missing 1`] = `
Array [
Object {
Expand Down Expand Up @@ -150,3 +168,5 @@ Array [
},
]
`;

exports[`config/validation validateConfig(config) validates valid alias objects 1`] = `Array []`;
46 changes: 46 additions & 0 deletions lib/config/validation.spec.ts
Expand Up @@ -336,5 +336,51 @@ describe('config/validation', () => {
expect(warnings).toHaveLength(0);
expect(errors).toHaveLength(0);
});

it('validates valid alias objects', async () => {
const config = {
aliases: {
example1: 'http://www.example.com',
example2: 'https://www.example2.com/example',
},
};
const { warnings, errors } = await configValidation.validateConfig(
config
);
expect(warnings).toHaveLength(0);
expect(errors).toHaveLength(0);
expect(errors).toMatchSnapshot();
});

it('errors if aliases depth is more than 1', async () => {
const config = {
aliases: {
sample: {
example1: 'http://www.example.com',
},
},
};
const { warnings, errors } = await configValidation.validateConfig(
config
);
expect(warnings).toHaveLength(0);
expect(errors).toHaveLength(1);
expect(errors).toMatchSnapshot();
});

it('errors if aliases have invalid url', async () => {
const config = {
aliases: {
example1: 'noturl',
example2: 'http://www.example.com',
},
};
const { warnings, errors } = await configValidation.validateConfig(
config
);
expect(warnings).toHaveLength(0);
expect(errors).toHaveLength(1);
expect(errors).toMatchSnapshot();
});
});
});
42 changes: 31 additions & 11 deletions lib/config/validation.ts
Expand Up @@ -56,6 +56,17 @@ export async function validateConfig(
return ignoredNodes.includes(key);
}

function validateAliasObject(key: string, val: object): boolean {
if (key === 'aliases') {
for (const value of Object.values(val)) {
if (!is.urlString(value)) {
return false;
}
}
}
return true;
}

for (const [key, val] of Object.entries(config)) {
const currentPath = parentPath ? `${parentPath}.${key}` : key;
if (
Expand Down Expand Up @@ -346,17 +357,26 @@ export async function validateConfig(
}
} else if (type === 'object' && currentPath !== 'compatibility') {
if (is.object(val)) {
const ignoredObjects = options
.filter((option) => option.freeChoice)
.map((option) => option.name);
if (!ignoredObjects.includes(key)) {
const subValidation = await module.exports.validateConfig(
val,
isPreset,
currentPath
);
warnings = warnings.concat(subValidation.warnings);
errors = errors.concat(subValidation.errors);
if (key === 'aliases') {
if (!validateAliasObject(key, val)) {
errors.push({
depName: 'Configuration Error',
message: `Invalid alias object configuration`,
});
}
} else {
const ignoredObjects = options
.filter((option) => option.freeChoice)
.map((option) => option.name);
if (!ignoredObjects.includes(key)) {
const subValidation = await module.exports.validateConfig(
val,
isPreset,
currentPath
);
warnings = warnings.concat(subValidation.warnings);
errors = errors.concat(subValidation.errors);
}
}
} else {
errors.push({
Expand Down

0 comments on commit 0e21892

Please sign in to comment.