fix(config): validate unique fields names under the same level (#3804)
This commit is contained in:
parent
9b3fd03af1
commit
8047d06afd
@ -27,6 +27,7 @@
|
|||||||
"@iarna/toml": "2.2.5",
|
"@iarna/toml": "2.2.5",
|
||||||
"ajv": "^6.10.0",
|
"ajv": "^6.10.0",
|
||||||
"ajv-errors": "^1.0.1",
|
"ajv-errors": "^1.0.1",
|
||||||
|
"ajv-keywords": "^3.4.1",
|
||||||
"copy-text-to-clipboard": "^2.0.0",
|
"copy-text-to-clipboard": "^2.0.0",
|
||||||
"diacritics": "^1.3.0",
|
"diacritics": "^1.3.0",
|
||||||
"fuzzy": "^0.1.1",
|
"fuzzy": "^0.1.1",
|
||||||
|
@ -182,5 +182,44 @@ describe('config', () => {
|
|||||||
validateConfig(merge({}, validConfig, { collections: [{ sortableFields: [] }] }));
|
validateConfig(merge({}, validConfig, { collections: [{ sortableFields: [] }] }));
|
||||||
}).not.toThrow();
|
}).not.toThrow();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should throw if collection fields names are not unique', () => {
|
||||||
|
expect(() => {
|
||||||
|
validateConfig(
|
||||||
|
merge(validConfig, {
|
||||||
|
collections: [
|
||||||
|
{
|
||||||
|
fields: [
|
||||||
|
{ name: 'title', label: 'title', widget: 'string' },
|
||||||
|
{ name: 'title', label: 'other title', widget: 'string' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}).toThrowError("'collections[0].fields' fields names must be unique");
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not throw if collection fields are unique across nesting levels', () => {
|
||||||
|
expect(() => {
|
||||||
|
validateConfig(
|
||||||
|
merge(validConfig, {
|
||||||
|
collections: [
|
||||||
|
{
|
||||||
|
fields: [
|
||||||
|
{ name: 'title', label: 'title', widget: 'string' },
|
||||||
|
{
|
||||||
|
name: 'object',
|
||||||
|
label: 'Object',
|
||||||
|
widget: 'object',
|
||||||
|
fields: [{ name: 'title', label: 'title', widget: 'string' }],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}).not.toThrow();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import AJV from 'ajv';
|
import AJV from 'ajv';
|
||||||
|
import uniqueItemProperties from 'ajv-keywords/keywords/uniqueItemProperties';
|
||||||
import ajvErrors from 'ajv-errors';
|
import ajvErrors from 'ajv-errors';
|
||||||
import { formatExtensions, frontmatterFormats, extensionFormatters } from 'Formats/formats';
|
import { formatExtensions, frontmatterFormats, extensionFormatters } from 'Formats/formats';
|
||||||
|
|
||||||
@ -19,6 +20,7 @@ const fieldsConfig = {
|
|||||||
},
|
},
|
||||||
required: ['name'],
|
required: ['name'],
|
||||||
},
|
},
|
||||||
|
uniqueItemProperties: ['name'],
|
||||||
};
|
};
|
||||||
|
|
||||||
const viewFilters = {
|
const viewFilters = {
|
||||||
@ -223,11 +225,20 @@ class ConfigError extends Error {
|
|||||||
*/
|
*/
|
||||||
export function validateConfig(config) {
|
export function validateConfig(config) {
|
||||||
const ajv = new AJV({ allErrors: true, jsonPointers: true });
|
const ajv = new AJV({ allErrors: true, jsonPointers: true });
|
||||||
|
uniqueItemProperties(ajv);
|
||||||
ajvErrors(ajv);
|
ajvErrors(ajv);
|
||||||
|
|
||||||
const valid = ajv.validate(getConfigSchema(), config);
|
const valid = ajv.validate(getConfigSchema(), config);
|
||||||
if (!valid) {
|
if (!valid) {
|
||||||
console.error('Config Errors', ajv.errors);
|
const errors = ajv.errors.map(e => {
|
||||||
throw new ConfigError(ajv.errors);
|
// TODO: remove after https://github.com/ajv-validator/ajv-keywords/pull/123 is merged
|
||||||
|
if (e.keyword === 'uniqueItemProperties') {
|
||||||
|
const newError = { ...e, message: 'fields names must be unique' };
|
||||||
|
return newError;
|
||||||
|
}
|
||||||
|
return e;
|
||||||
|
});
|
||||||
|
console.error('Config Errors', errors);
|
||||||
|
throw new ConfigError(errors);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user