wikibase-edit
Version:
Edit Wikibase from NodeJS
38 lines • 1.85 kB
JavaScript
import { isPropertyId } from 'wikibase-sdk';
import { newError } from '../error.js';
import { arrayIncludes } from '../utils.js';
const validReconciliationKeys = ['mode', 'matchingQualifiers', 'matchingReferences'];
const validReconciliationModes = ['skip-on-value-match', 'skip-on-any-value', 'merge'];
const validOptions = ['all', 'any'];
export function validateReconciliationObject(reconciliation, claim) {
if (typeof reconciliation !== 'object')
throw newError('reconciliation should be an object', { reconciliation });
for (const key of Object.keys(reconciliation)) {
if (!arrayIncludes(validReconciliationKeys, key)) {
throw newError('invalid reconciliation object key', { key, reconciliation, validReconciliationKeys });
}
}
const { mode, matchingQualifiers, matchingReferences } = reconciliation;
if (!claim.remove && !validReconciliationModes.includes(mode)) {
throw newError('invalid reconciliation mode', { mode, validReconciliationModes });
}
validateMatchingPropertyArray('matchingQualifiers', matchingQualifiers);
validateMatchingPropertyArray('matchingReferences', matchingReferences);
}
function validateMatchingPropertyArray(name, array) {
if (array) {
if (!(array instanceof Array)) {
throw newError(`invalid ${name} array`, { [name]: array });
}
for (const id of array) {
const [pid, option] = id.split(':');
if (!isPropertyId(pid)) {
throw newError(`invalid ${name} property id`, { property: pid });
}
if (option && !arrayIncludes(validOptions, option)) {
throw newError(`invalid ${name} property id option: ${option}`, { id, pid, option });
}
}
}
}
//# sourceMappingURL=validate_reconciliation_object.js.map