wiki-entity
Version:
Wiki entity fetcher
107 lines (106 loc) • 4.36 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateParams = exports.getManyEntities = exports.getEntities = void 0;
const request_1 = require("../request");
const types_1 = require("../types");
const utils_1 = require("../utils");
const API_URL = "https://www.wikidata.org/w/api.php";
function getEntities(params) {
return __awaiter(this, void 0, void 0, function* () {
const qs = {
action: "wbgetentities",
ids: params.ids && params.ids.join("|"),
titles: params.titles && params.titles.join("|"),
props: (params.props || [
types_1.WikidataPropsParam.info,
types_1.WikidataPropsParam.sitelinks,
types_1.WikidataPropsParam.aliases,
types_1.WikidataPropsParam.labels,
types_1.WikidataPropsParam.descriptions,
types_1.WikidataPropsParam.claims,
types_1.WikidataPropsParam.datatype
]).join("|"),
languages: params.languages,
redirects: params.redirect || "yes",
format: "json",
sites: ""
};
if (params.titles) {
qs.sites = (params.language || "en") + "wiki";
}
else {
delete qs.sites;
}
const data = yield (0, request_1.default)(API_URL, {
params: qs,
timeout: params.httpTimeout
});
if (hasError(data))
throw getError(data);
const entities = (data && data.entities) || {};
for (let id of Object.keys(entities)) {
const entity = entities[id];
if (entity.redirects && entity.redirects.to)
entity.redirectsToId = entity.redirects.to;
if (entity.redirects && entity.redirects.from)
entity.redirectsFromId = entity.redirects.from;
if (!(0, utils_1.isValidWikiId)(id) || ~Object.keys(entities[id]).indexOf("missing")) {
delete entities[id];
}
}
return entities;
});
}
exports.getEntities = getEntities;
function getManyEntities(params) {
return __awaiter(this, void 0, void 0, function* () {
validateParams(params);
const keyName = !!params.ids ? "ids" : "titles";
const keyValues = params[keyName];
const max = 50;
const countParts = keyValues.length / max + 1;
const parts = [];
for (var i = 0; i < countParts && i < 10; i++) {
const partParams = Object.assign({}, params);
partParams[keyName] = keyValues.slice(i * max, (i + 1) * max);
if (partParams[keyName].length > 0) {
parts.push(getEntities(partParams));
}
}
const results = yield Promise.all(parts);
if (results.length === 0) {
return null;
}
if (results.length > 1) {
for (var i = 1; i < results.length; i++) {
Object.assign(results[0], results[i]);
}
}
return results[0];
});
}
exports.getManyEntities = getManyEntities;
function validateParams(params) {
if (!params.ids && !params.titles) {
throw new Error("Invalid params: `ids` or `titles` are required");
}
}
exports.validateParams = validateParams;
function getError(data) {
return ((data &&
data.error &&
new Error(data.error.info || "Wikidata Api Error")) ||
new Error("NO error"));
}
function hasError(data) {
return !!data.error;
}