bgg-sdk
Version:
Node SDK for querying the Board Game Geek (BGG) XML2 API
842 lines (822 loc) • 27.3 kB
JavaScript
;
var __create = Object.create;
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
for (var prop in b || (b = {}))
if (__hasOwnProp.call(b, prop))
__defNormalProp(a, prop, b[prop]);
if (__getOwnPropSymbols)
for (var prop of __getOwnPropSymbols(b)) {
if (__propIsEnum.call(b, prop))
__defNormalProp(a, prop, b[prop]);
}
return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var __async = (__this, __arguments, generator) => {
return new Promise((resolve, reject) => {
var fulfilled = (value) => {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
};
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
step((generator = generator.apply(__this, __arguments)).next());
});
};
// src/index.ts
var src_exports = {};
__export(src_exports, {
ContentTypes: () => contentTypes_exports,
ParamTypes: () => params_exports,
PayloadTypes: () => payloads_exports,
bgg: () => bgg,
default: () => src_default
});
module.exports = __toCommonJS(src_exports);
// src/lib/axios.ts
var import_axios = __toESM(require("axios"));
var import_axios_retry = __toESM(require("axios-retry"));
var import_xml_js = __toESM(require("xml-js"));
var axios = import_axios.default.create({
baseURL: "https://boardgamegeek.com/xmlapi2/"
});
(0, import_axios_retry.default)(axios, {
retries: 3,
retryDelay: import_axios_retry.default.exponentialDelay
});
axios.interceptors.response.use(
(response) => {
try {
const jsonData = import_xml_js.default.xml2js(response.data, { compact: true });
response.data = jsonData;
return response;
} catch (error) {
throw new Error("Failed to parse XML data from BGG");
}
},
(error) => {
return Promise.reject(`Unexpected error calling BGG API: ${error.stack}`);
}
);
// src/lib/helpers.ts
var enforceArray = (value) => {
if (!value)
return [];
if (Array.isArray(value))
return value;
return [value];
};
// src/routes/collection.ts
var transformParams = (params) => {
var _a;
return __spreadProps(__spreadValues({}, params), {
id: (_a = params.id) == null ? void 0 : _a.join(",")
});
};
var transformData = (data) => {
if (!data.items) {
return null;
}
return {
attributes: {
termsOfUse: data.items._attributes.termsofuse,
totalItems: data.items._attributes.totalitems,
pubDate: data.items._attributes.pubdate
},
items: enforceArray(data.items.item).map((data2) => {
var _a, _b, _c;
return {
id: data2._attributes.objectid,
collId: data2._attributes.collid,
type: data2._attributes.objecttype,
name: data2.name._text,
yearPublished: (_a = data2.yearpublished) == null ? void 0 : _a._text,
image: (_b = data2.image) == null ? void 0 : _b._text,
thumbnail: (_c = data2.thumbnail) == null ? void 0 : _c._text,
status: {
own: data2.status._attributes.own,
prevOwned: data2.status._attributes.prevowned,
forTrade: data2.status._attributes.fortrade,
want: data2.status._attributes.want,
wantToPlay: data2.status._attributes.wanttoplay,
wantToBuy: data2.status._attributes.wanttobuy,
wishList: data2.status._attributes.wishlist,
preOrdered: data2.status._attributes.preordered,
lastModified: data2.status._attributes.lastmodified
},
numPlays: data2.numplays._text
};
})
};
};
var collection = (params) => __async(void 0, null, function* () {
const { data } = yield axios.get("/collection", {
params: transformParams(params)
});
return transformData(data);
});
// src/routes/family.ts
var transformParams2 = (params) => {
var _a;
return __spreadProps(__spreadValues({}, params), {
id: params.id.join(","),
type: (_a = params.type) == null ? void 0 : _a.join(",")
});
};
var transformData2 = (data) => {
return {
attributes: {
termsOfUse: data.items._attributes.termsofuse
},
items: enforceArray(data.items.item).map((data2) => {
return {
id: data2._attributes.id,
type: data2._attributes.type,
thumbnail: data2.thumbnail._text,
image: data2.image._text,
description: data2.description._text,
names: enforceArray(data2.name).map((name) => ({
type: name._attributes.type,
sortIndex: name._attributes.sortindex,
value: name._attributes.value
})),
links: enforceArray(data2.link).map((link) => ({
type: link._attributes.type,
id: link._attributes.id,
value: link._attributes.value,
inbound: link._attributes.inbound === "true"
}))
};
})
};
};
var family = (params) => __async(void 0, null, function* () {
const { data } = yield axios.get("/family", {
params: transformParams2(params)
});
return transformData2(data);
});
// src/routes/forum.ts
var transformData3 = (data) => {
return {
attributes: {
id: data.forum._attributes.id,
title: data.forum._attributes.title,
numThreads: data.forum._attributes.numthreads,
numPosts: data.forum._attributes.numposts,
lastPostDate: data.forum._attributes.lastpostdate,
noPosting: data.forum._attributes.noposting,
termsOfUse: data.forum._attributes.termsofuse
},
threads: enforceArray(data.forum.threads.thread).map((thread2) => ({
id: thread2._attributes.id,
subject: thread2._attributes.subject,
author: thread2._attributes.author,
numArticles: thread2._attributes.numarticles,
postDate: thread2._attributes.postdate,
lastPostDate: thread2._attributes.lastpostdate
}))
};
};
var forum = (params) => __async(void 0, null, function* () {
try {
const { data } = yield axios.get("/forum", {
params
});
return transformData3(data);
} catch (error) {
return null;
}
});
// src/routes/forumList.ts
var transformData4 = (data) => {
return {
attributes: {
type: data.forums._attributes.type,
termsOfUse: data.forums._attributes.termsofuse,
id: data.forums._attributes.id
},
forums: enforceArray(data.forums.forum).map((forum2) => ({
id: forum2._attributes.id,
groupId: forum2._attributes.groupid,
title: forum2._attributes.title,
noPosting: forum2._attributes.noposting,
description: forum2._attributes.description,
numThreads: forum2._attributes.numthreads,
numPosts: forum2._attributes.numposts,
lastPostDate: forum2._attributes.lastpostdate
}))
};
};
var forumList = (params) => __async(void 0, null, function* () {
const { data } = yield axios.get("/forumlist", {
params
});
return transformData4(data);
});
// src/routes/guild.ts
var transformData5 = (data) => {
if ("error" in data.guild) {
return {
attributes: {
termsOfUse: data.guild._attributes.termsofuse
},
guild: null
};
}
return {
attributes: {
termsOfUse: data.guild._attributes.termsofuse,
id: data.guild._attributes.id,
name: data.guild._attributes.name,
created: data.guild._attributes.created
},
guild: {
id: data.guild._attributes.id,
name: data.guild._attributes.name,
created: data.guild._attributes.created,
category: data.guild.category._text,
website: data.guild.website._text,
manager: data.guild.manager._text,
description: data.guild.description._text,
location: {
addr1: data.guild.location.addr1._text,
addr2: data.guild.location.addr2._text,
city: data.guild.location.city._text,
stateorprovince: data.guild.location.stateorprovince._text,
postalcode: data.guild.location.postalcode._text,
country: data.guild.location.country._text
},
members: data.guild.members && {
count: data.guild.members._attributes.count,
page: data.guild.members._attributes.page,
member: enforceArray(data.guild.members.member).map((member) => ({
name: member._attributes.name,
date: member._attributes.date
}))
}
}
};
};
var guild = (params) => __async(void 0, null, function* () {
const { data } = yield axios.get("/guild", {
params
});
return transformData5(data);
});
// src/routes/hot.ts
var transformParams3 = (args) => {
if (!args)
return void 0;
return {
type: args.type.join(",")
};
};
var transformData6 = (data) => {
return {
attributes: {
termsofuse: data.items._attributes.termsofuse
},
items: enforceArray(data.items.item).map((data2) => {
var _a;
return {
id: data2._attributes.id,
rank: data2._attributes.rank,
name: data2.name._attributes.value,
yearPublished: (_a = data2.yearpublished) == null ? void 0 : _a._attributes.value,
thumbnail: data2.thumbnail._attributes.value
};
})
};
};
var hot = (params) => __async(void 0, null, function* () {
const { data } = yield axios.get("/hot", {
params: transformParams3(params)
});
return transformData6(data);
});
// src/routes/search.ts
var endpoint = "/search";
var transformParams4 = (args) => {
return __spreadProps(__spreadValues({}, args), {
type: args.type ? args.type.join(",") : void 0
});
};
var transformData7 = (data) => {
return {
attributes: {
termsofuse: data.items._attributes.termsofuse
},
items: enforceArray(data.items.item).map((data2) => {
var _a;
return {
id: data2._attributes.id,
type: data2._attributes.type,
name: data2.name._attributes.value,
yearPublished: (_a = data2.yearpublished) == null ? void 0 : _a._attributes.value
};
})
};
};
var search = (args) => __async(void 0, null, function* () {
const params = transformParams4(args);
const { data } = yield axios.get(endpoint, { params });
return transformData7(data);
});
// src/routes/thing.ts
var endpoint2 = "/thing";
var transformParams5 = (args) => {
var _a;
return __spreadProps(__spreadValues({}, args), {
id: args.id.join(","),
type: (_a = args.type) == null ? void 0 : _a.join(",")
});
};
var transformPollLanguageDependence = (poll) => {
return {
name: poll._attributes.name,
title: poll._attributes.title,
totalvotes: poll._attributes.totalvotes,
results: enforceArray(poll.results.result).map((result) => {
return {
level: result._attributes.level,
value: result._attributes.value,
numvotes: result._attributes.numvotes
};
})
};
};
var transformPollSuggestedPlayerAge = (poll) => {
return {
name: poll._attributes.name,
title: poll._attributes.title,
totalvotes: poll._attributes.totalvotes,
results: enforceArray(poll.results.result).map((result) => {
return {
value: result._attributes.value,
numvotes: result._attributes.numvotes
};
})
};
};
var transformPollSuggestedNumPlayers = (poll) => {
return {
name: poll._attributes.name,
title: poll._attributes.title,
totalvotes: poll._attributes.totalvotes,
results: enforceArray(poll.results).map((result) => {
return {
numplayers: result._attributes.numplayers,
result: enforceArray(result.result).map((result2) => {
return {
value: result2._attributes.value,
numvotes: result2._attributes.numvotes
};
})
};
})
};
};
var transformPoll = (apiPolls) => {
const polls = [];
apiPolls.forEach((apiPoll) => {
switch (apiPoll._attributes.name) {
case "language_dependence": {
polls.push(
transformPollLanguageDependence(
apiPoll
)
);
break;
}
case "suggested_playerage": {
polls.push(
transformPollSuggestedPlayerAge(
apiPoll
)
);
break;
}
case "suggested_numplayers": {
polls.push(
transformPollSuggestedNumPlayers(
apiPoll
)
);
break;
}
}
});
return polls;
};
var transformData8 = (data) => {
return {
attributes: {
termsofuse: data.items._attributes.termsofuse
},
items: enforceArray(data.items.item).map((data2) => {
var _a, _b;
return {
id: data2._attributes.id,
type: data2._attributes.type,
thumbnail: (_a = data2.thumbnail) == null ? void 0 : _a._text,
image: (_b = data2.image) == null ? void 0 : _b._text,
names: enforceArray(data2.name).map((name) => {
return {
type: name._attributes.type,
sortindex: name._attributes.sortindex,
value: name._attributes.value
};
}),
description: data2.description._text,
yearPublished: data2.yearpublished._attributes.value,
minPlayers: data2.minplayers._attributes.value,
maxPlayers: data2.maxplayers._attributes.value,
playingTime: data2.playingtime._attributes.value,
minPlayTime: data2.minplaytime._attributes.value,
maxPlayTime: data2.maxplaytime._attributes.value,
minAge: data2.minage._attributes.value,
links: enforceArray(data2.link).map((link) => {
return {
type: link._attributes.type,
id: link._attributes.id,
value: link._attributes.value
};
}),
polls: transformPoll(enforceArray(data2.poll)),
comments: data2.comments && {
page: data2.comments._attributes.page,
total: data2.comments._attributes.totalitems,
comment: enforceArray(data2.comments.comment).map((comment) => {
return {
username: comment._attributes.username,
rating: comment._attributes.rating,
value: comment._attributes.value
};
})
},
marketplace: data2.marketplacelistings && {
listings: enforceArray(data2.marketplacelistings.listing).map(
(listing) => {
return {
listDate: listing.listdate._attributes.value,
price: {
currency: listing.price._attributes.currency,
value: listing.price._attributes.value
},
condition: listing.condition._attributes.value,
notes: listing.notes._attributes.value,
link: {
href: listing.link._attributes.href,
title: listing.link._attributes.title
}
};
}
)
},
statistics: data2.statistics && {
page: data2.statistics._attributes.page,
ratings: {
usersRated: data2.statistics.ratings.usersrated._attributes.value,
average: data2.statistics.ratings.average._attributes.value,
bayesAverage: data2.statistics.ratings.bayesaverage._attributes.value,
ranks: enforceArray(data2.statistics.ratings.ranks.rank).map(
(rank) => {
return {
type: rank._attributes.type,
id: rank._attributes.id,
name: rank._attributes.name,
friendlyName: rank._attributes.friendlyname,
value: rank._attributes.value,
bayesAverage: rank._attributes.bayesaverage
};
}
)
},
stdDev: data2.statistics.ratings.stddev._attributes.value,
median: data2.statistics.ratings.median._attributes.value,
owned: data2.statistics.ratings.owned._attributes.value,
trading: data2.statistics.ratings.trading._attributes.value,
wanting: data2.statistics.ratings.wanting._attributes.value,
wishing: data2.statistics.ratings.wishing._attributes.value,
numComments: data2.statistics.ratings.numcomments._attributes.value,
numWeights: data2.statistics.ratings.numweights._attributes.value,
averageWeight: data2.statistics.ratings.averageweight._attributes.value
},
versions: data2.versions && enforceArray(data2.versions.item).map((item) => {
var _a2, _b2;
return {
id: item._attributes.id,
type: item._attributes.type,
thumbnail: (_a2 = item.thumbnail) == null ? void 0 : _a2._text,
image: (_b2 = item.image) == null ? void 0 : _b2._text,
links: enforceArray(item.link).map((link) => {
return {
type: link._attributes.type,
id: link._attributes.id,
value: link._attributes.value
};
}),
names: enforceArray(item.name).map((name) => {
return {
type: name._attributes.type,
sortindex: name._attributes.sortindex,
value: name._attributes.value
};
}),
yearPublished: item.yearpublished._attributes.value,
productCode: item.productcode._attributes.value,
width: item.width._attributes.value,
length: item.length._attributes.value,
depth: item.depth._attributes.value,
weight: item.weight._attributes.value
};
}),
videos: data2.videos && {
total: data2.videos._attributes.total,
videos: enforceArray(data2.videos.video).map((video) => {
return {
id: video._attributes.id,
title: video._attributes.title,
category: video._attributes.category,
language: video._attributes.language,
link: video._attributes.link,
username: video._attributes.username,
userid: video._attributes.userid,
postdate: video._attributes.postdate
};
})
}
};
})
};
};
var thing = (params) => __async(void 0, null, function* () {
const { data } = yield axios.get(endpoint2, {
params: transformParams5(params)
});
return transformData8(data);
});
// src/routes/thread.ts
var endpoint3 = "/thread";
var transformData9 = (data) => {
if ("error" in data) {
return null;
}
return {
attributes: {
id: data.thread._attributes.id,
numArticles: data.thread._attributes.numarticles,
link: data.thread._attributes.link,
termsOfUse: data.thread._attributes.termsofuse
},
subject: data.thread.subject._text,
articles: enforceArray(data.thread.articles.article).map((article) => ({
id: article._attributes.id,
username: article._attributes.username,
link: article._attributes.link,
postDate: article._attributes.postdate,
editDate: article._attributes.editdate,
numEdits: article._attributes.numedits,
body: article.body._text
}))
};
};
var thread = (params) => __async(void 0, null, function* () {
const { data } = yield axios.get(endpoint3, {
params
});
return transformData9(data);
});
// src/routes/user.ts
var endpoint4 = "/user";
var transformData10 = (data) => {
return {
termsOfUse: data.user._attributes.termsofuse,
user: {
id: data.user._attributes.id,
name: data.user._attributes.name,
termsOfUse: data.user._attributes.termsofuse,
firstName: data.user.firstname._attributes.value,
lastName: data.user.lastname._attributes.value,
avatarLink: data.user.avatarlink._attributes.value,
yearRegistered: data.user.yearregistered._attributes.value,
lastLogin: data.user.lastlogin._attributes.value,
stateOrProvince: data.user.stateorprovince._attributes.value,
country: data.user.country._attributes.value,
webAddress: data.user.webaddress._attributes.value,
xboxAccount: data.user.xboxaccount._attributes.value,
wiiAccount: data.user.wiiaccount._attributes.value,
psnAccount: data.user.psnaccount._attributes.value,
battlenetAccount: data.user.battlenetaccount._attributes.value,
steamAccount: data.user.steamaccount._attributes.value,
tradeRating: data.user.traderating._attributes.value,
buddies: data.user.buddies && {
total: data.user.buddies._attributes.total,
page: data.user.buddies._attributes.page,
buddy: enforceArray(data.user.buddies.buddy).map((data2) => ({
id: data2._attributes.id,
name: data2._attributes.name
}))
},
guilds: data.user.guilds && {
total: data.user.guilds._attributes.total,
page: data.user.guilds._attributes.page,
guild: enforceArray(data.user.guilds.guild).map((data2) => ({
id: data2._attributes.id,
name: data2._attributes.name
}))
},
hot: data.user.hot && {
domain: data.user.hot._attributes.domain,
item: enforceArray(data.user.hot.item).map((data2) => ({
rank: data2._attributes.rank,
type: data2._attributes.type,
id: data2._attributes.id,
name: data2._attributes.name
}))
},
top: data.user.top && {
domain: data.user.top._attributes.domain,
item: enforceArray(data.user.top.item).map((data2) => ({
rank: data2._attributes.rank,
type: data2._attributes.type,
id: data2._attributes.id,
name: data2._attributes.name
}))
}
}
};
};
var user = (params) => __async(void 0, null, function* () {
try {
const { data } = yield axios.get(endpoint4, {
params
});
return transformData10(data);
} catch (error) {
return null;
}
});
// src/routes/plays/index.ts
var plays_exports = {};
__export(plays_exports, {
id: () => id,
username: () => username
});
// src/routes/plays/username.ts
var transformData11 = (data) => {
if ("div" in data) {
return null;
}
return {
attributes: {
termsofuse: data.plays._attributes.termsofuse,
username: data.plays._attributes.username,
userid: data.plays._attributes.userid,
total: data.plays._attributes.total,
page: data.plays._attributes.page
},
plays: enforceArray(data.plays.play).map((play) => ({
id: play._attributes.id,
date: play._attributes.date,
quantity: play._attributes.quantity,
length: play._attributes.length,
incomplete: play._attributes.incomplete,
nowinstats: play._attributes.nowinstats,
location: play._attributes.location,
item: {
name: play.item._attributes.name,
objecttype: play.item._attributes.objecttype,
objectid: play.item._attributes.objectid,
subtypes: enforceArray(play.item.subtypes.subtype).map(
(subtype) => subtype._attributes.value
)
}
}))
};
};
var username = (params) => __async(void 0, null, function* () {
const { data } = yield axios.get(
"/plays",
{
params
}
);
return transformData11(data);
});
// src/routes/plays/id.ts
var transformData12 = (data) => {
const { play, _attributes } = data.plays;
return {
attributes: {
termsofuse: _attributes.termsofuse,
total: _attributes.total,
page: _attributes.page
},
plays: enforceArray(play).map((play2) => {
var _a;
return {
id: play2._attributes.id,
date: play2._attributes.date,
quantity: play2._attributes.quantity,
length: play2._attributes.length,
incomplete: play2._attributes.incomplete,
nowInStats: play2._attributes.nowinstats,
location: play2._attributes.location,
item: {
name: play2.item._attributes.name,
objectType: play2.item._attributes.objecttype,
objectId: play2.item._attributes.objectid,
subtypes: enforceArray(play2.item.subtypes.subtype).map(
(subtype) => subtype._attributes.value
)
},
players: ((_a = play2.players) == null ? void 0 : _a.player) && enforceArray(play2.players.player).map((player) => ({
username: player._attributes.username,
userid: player._attributes.userid,
name: player._attributes.name,
startPosition: player._attributes.startposition,
color: player._attributes.color,
score: player._attributes.score,
new: player._attributes.new,
rating: player._attributes.rating,
win: player._attributes.win
}))
};
})
};
};
var id = (params) => __async(void 0, null, function* () {
const { data } = yield axios.get("/plays", { params });
return transformData12(data);
});
// src/routes/types/contentTypes.ts
var contentTypes_exports = {};
// src/routes/types/params.ts
var params_exports = {};
// src/routes/types/payloads.ts
var payloads_exports = {};
// src/index.ts
var bgg = {
collection,
family,
forum,
forumList,
guild,
hot,
search,
thing,
thread,
user,
plays: __spreadValues({}, plays_exports)
};
var src_default = bgg;
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
ContentTypes,
ParamTypes,
PayloadTypes,
bgg
});
//# sourceMappingURL=index.js.map