UNPKG

wiki-entity

Version:
107 lines (106 loc) 4.36 kB
"use strict"; 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; }