wikibase-edit
Version:
Edit Wikibase from NodeJS
96 lines • 3.31 kB
JavaScript
import config from 'config';
import wbkFactory, {} from 'wikibase-sdk';
import WBEdit, {} from '../../../src/lib/index.js';
import { customFetch } from '../../../src/lib/request/fetch.js';
import { objectValues } from '../../../src/lib/utils.js';
import { randomString } from '../../unit/utils.js';
import { getProperty } from './get_property.js';
const wbk = wbkFactory({ instance: config.instance });
const { getEntityIdFromGuid } = wbk;
const wbEdit = WBEdit(config);
// Working around the circular dependency
let addClaim;
async function lateRequire() {
({ addClaim } = await import('./sandbox_snaks.js'));
}
setTimeout(lateRequire, 0);
async function createEntity(data = {}) {
// @ts-expect-error
data.labels = data.labels || { en: randomString() };
const { entity } = await wbEdit.entity.create(data);
// @ts-expect-error
console.log(`created ${entity.type}`, entity.id, data.datatype || '');
return entity;
}
let sandboxItemPromise;
export function getSandboxItem() {
sandboxItemPromise ??= createEntity();
return sandboxItemPromise;
}
export async function getRefreshedEntity(id) {
const url = wbk.getEntities({ ids: id });
const res = await customFetch(url).then(res => res.json());
return res.entities[id];
}
let claimPromise;
export function getSandboxClaim(datatype = 'string') {
claimPromise ??= _getSandboxClaim(datatype);
return claimPromise;
}
async function _getSandboxClaim(datatype) {
const [item, propertyId] = await Promise.all([
getSandboxItem(),
getSandboxPropertyId(datatype),
]);
const propertyClaims = item.claims[propertyId];
if (propertyClaims)
return propertyClaims[0];
const res = await wbEdit.claim.create({ id: item.id, property: propertyId, value: randomString() });
return res.claim;
}
export async function getRefreshedClaim(guid) {
const id = getEntityIdFromGuid(guid);
const entity = await getRefreshedEntity(id);
if ('claims' in entity) {
const { claims } = entity;
for (const propertyClaims of objectValues(claims)) {
for (const claim of propertyClaims) {
if (claim.id === guid)
return claim;
}
}
}
throw new Error(`claim not found: ${guid}`);
}
export async function getSandboxItemId() {
const item = await getSandboxItem();
return item.id;
}
export async function getSandboxPropertyId(datatype) {
const property = await getProperty({ datatype });
return property.id;
}
export async function getSandboxClaimId() {
const claim = await getSandboxClaim();
return claim.id;
}
export async function createItem(data = {}) {
const entity = await createEntity({ ...data, type: 'item' });
return entity;
}
let someEntityIdPromise;
export async function getSomeItemId() {
someEntityIdPromise ??= getSandboxItemId();
return someEntityIdPromise;
}
let someGuid;
export async function getSomeGuid() {
if (someGuid)
return someGuid;
const { guid } = await addClaim({ datatype: 'string', value: randomString() });
someGuid = guid;
return guid;
}
export const getReservedItem = createItem;
export const getReservedItemId = () => createItem().then(entity => entity.id);
//# sourceMappingURL=sandbox_entities.js.map