UNPKG

wikibase-edit

Version:

Edit Wikibase from NodeJS

108 lines 3.69 kB
import { entityEditBuilders as builders } from '../claim/builders.js'; import { buildReferenceFactory, buildPropSnaksFactory } from '../claim/snak.js'; import { hasSpecialSnaktype } from '../claim/special_snaktype.js'; import { newError } from '../error.js'; import { normalizeDatatype } from '../properties/datatypes_to_builder_datatypes.js'; import { isString, isNumber, isPlainObject, mapValues, forceArray } from '../utils.js'; import { validateGuid, validateRank, validateSnakValue } from '../validate.js'; export function buildClaim(property, properties, claimData, instance) { const datatype = properties[property]; const builderDatatype = normalizeDatatype(datatype); const builder = builders[builderDatatype]; const params = { properties, datatype, property, claimData, builder, instance }; if (isString(claimData) || isNumber(claimData)) { return simpleClaimBuilder(params); } else { if (!isPlainObject(claimData)) throw newError('invalid claim data', { property, claimData }); return fullClaimBuilder(params); } } function simpleClaimBuilder(params) { const { property, datatype, claimData: value, builder, instance } = params; validateSnakValue(property, datatype, value); return builder(property, value, instance); } function fullClaimBuilder(params) { const { properties, datatype, property, claimData, builder, instance } = params; validateClaimParameters(claimData); let { id, value, snaktype, rank, qualifiers, references, remove, reconciliation } = claimData; if (remove === true) { if (!(id || reconciliation)) throw newError("can't remove a claim without an id or reconciliation settings", claimData); if (id) return { id, remove: true }; } let claim; if (value?.snaktype) { claimData.snaktype = snaktype = value.snaktype; } if (hasSpecialSnaktype(claimData)) { claim = builders.specialSnaktype(property, snaktype); } else { // In case of a rich value (monolingual text, quantity, globe coordinate, or time) if (value == null && (claimData.text || claimData.amount || claimData.latitude || claimData.time)) { value = claimData; } validateSnakValue(property, datatype, value); claim = builder(property, value, instance); } if (id) { validateGuid(id); claim.id = id; } if (rank) { validateRank(rank); claim.rank = rank; } if (qualifiers) { claim.qualifiers = mapValues(qualifiers, buildPropSnaksFactory(properties, instance)); } if (references) { claim.references = forceArray(references).map(buildReferenceFactory(properties, instance)); } if (reconciliation) claim.reconciliation = reconciliation; if (remove) claim.remove = remove; return claim; } const validClaimParameters = [ 'id', 'type', 'value', 'snaktype', 'rank', 'qualifiers', 'references', 'remove', 'reconciliation', 'text', 'language', 'amount', 'lowerBound', 'upperBound', 'unit', 'latitude', 'longitude', 'precision', 'globe', 'altitude', 'time', 'timezone', 'before', 'after', 'precision', 'calendarmodel', ]; const validClaimParametersSet = new Set(validClaimParameters); function validateClaimParameters(claimData) { for (const key in claimData) { if (!validClaimParametersSet.has(key)) { throw newError(`invalid claim parameter: ${key}`, { claimData, validClaimParameters }); } } } //# sourceMappingURL=build_claim.js.map