wikibase-cli
Version:
A command-line interface to Wikibase
76 lines (62 loc) • 2.53 kB
JavaScript
import { getStatementsKey } from 'wikibase-edit/lib/parse_instance.js'
import { isPropertyId, simplifyClaims, simplifyPropertyClaims } from 'wikibase-sdk'
import { yellow } from '#lib/chalk'
import errors_ from '#lib/errors'
import { exitOnMissingInstance } from '#lib/exit_on_missing'
import getEntities from '#lib/get_entities'
import { getEntityLabel } from '#lib/get_entities_labels'
import logClaims from '#lib/log_claims'
import { outputFactory } from '#lib/output'
import program from '#lib/program'
import { tolerantIdParserFactory } from '#lib/tolerant_id_parser'
await program
.option('-a, --all', 'include all claims, not only the truthy ones')
.option('-t, --type <type>', 'Keep only claims with the specified datatype')
.process('claims')
const parseId = tolerantIdParserFactory()
exitOnMissingInstance(program.instance)
let [ id, ...filter ] = program.args
id = id && parseId(id)
let prop, value, pattern
if (isPropertyId(filter[0])) {
prop = filter[0]
value = filter[1]
} else {
pattern = filter.join(' ')
}
const { lang } = program
const output = outputFactory(program)
if (!(id && lang)) program.helpAndExit(0)
// Working around a weird behavior of commander that inverts arguments
// when an option is passed before
if (id && prop && id[0] === 'P' && prop[0] === 'Q') {
[ id, prop ] = [ prop, id ]
}
const run = async () => {
const entities = await getEntities({ props: 'claims', ids: [ id ] })
const entity = entities[id]
if (!entity) {
errors_.exitMessage(`entity not found: ${program.instance}/entity/${id}`)
}
const statementsKey = getStatementsKey(program.instance)
const keepNonTruthy = program.all === true
if (isPropertyId(prop) && value != null) {
const propClaims = entity[statementsKey][prop]
if (!propClaims) throw new Error(`no claims found for this property: ${prop}`)
const ids = simplifyPropertyClaims(propClaims, { keepIds: true, keepNonTruthy })
.filter(simplifyClaim => simplifyClaim.value === value)
.map(simplifyClaim => simplifyClaim.id)
return output(ids)
}
const simplifiedClaims = simplifyClaims(entity[statementsKey], { keepNonTruthy, keepTypes: true })
if (!prop) return logClaims({ program, simplifiedClaims, pattern, resort: true })
if (simplifiedClaims[prop] != null) {
const values = simplifiedClaims[prop].map(({ value }) => value)
return output(values)
}
const label = await getEntityLabel(prop)
console.log(yellow('no statement found'), label)
}
run()
.catch(errors_.exit)