biketag
Version:
The Javascript client API for BikeTag Games
1,083 lines (1,078 loc) • 152 kB
JavaScript
(function(global, factory) {
typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("form-data"), require("imgur"), require("@sanity/client"), require("axios"), require("events"), require("axios-cache-adapter"), require("lodash"), require("tinycache")) : typeof define === "function" && define.amd ? define(["exports", "form-data", "imgur", "@sanity/client", "axios", "events", "axios-cache-adapter", "lodash", "tinycache"], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global.BikeTagClient = {}, null, global.ImgurClient, global.sanityClient, global.axios, global.events, global.axiosCacheAdapter, global.lodash, global.TinyCache));
})(this, function(exports2, FormData, imgur, sanityClient, axios, events, axiosCacheAdapter, lodash, TinyCache) {
"use strict";
var AvailableApis = /* @__PURE__ */ ((AvailableApis2) => {
AvailableApis2["biketag"] = "biketag";
AvailableApis2["imgur"] = "imgur";
AvailableApis2["sanity"] = "sanity";
return AvailableApis2;
})(AvailableApis || {});
var DataTypes = /* @__PURE__ */ ((DataTypes2) => {
DataTypes2[DataTypes2["ambassador"] = 0] = "ambassador";
DataTypes2[DataTypes2["game"] = 1] = "game";
DataTypes2[DataTypes2["player"] = 2] = "player";
DataTypes2[DataTypes2["setting"] = 3] = "setting";
DataTypes2[DataTypes2["tag"] = 4] = "tag";
DataTypes2[DataTypes2["queue"] = 5] = "queue";
DataTypes2[DataTypes2["achievement"] = 6] = "achievement";
return DataTypes2;
})(DataTypes || {});
var GameSettingsKeys = /* @__PURE__ */ ((GameSettingsKeys2) => {
GameSettingsKeys2["achievementsEnabled"] = "achievements::enabled";
return GameSettingsKeys2;
})(GameSettingsKeys || {});
var Errors = /* @__PURE__ */ ((Errors2) => {
Errors2["NotImplemented"] = "method not implemented for adapter: ";
return Errors2;
})(Errors || {});
var HttpStatusCode = /* @__PURE__ */ ((HttpStatusCode2) => {
HttpStatusCode2[HttpStatusCode2["Continue"] = 100] = "Continue";
HttpStatusCode2[HttpStatusCode2["SwitchingProtocols"] = 101] = "SwitchingProtocols";
HttpStatusCode2[HttpStatusCode2["Processing"] = 102] = "Processing";
HttpStatusCode2[HttpStatusCode2["Ok"] = 200] = "Ok";
HttpStatusCode2[HttpStatusCode2["Created"] = 201] = "Created";
HttpStatusCode2[HttpStatusCode2["Accepted"] = 202] = "Accepted";
HttpStatusCode2[HttpStatusCode2["NonAuthoritativeInformation"] = 203] = "NonAuthoritativeInformation";
HttpStatusCode2[HttpStatusCode2["NoContent"] = 204] = "NoContent";
HttpStatusCode2[HttpStatusCode2["ResetContent"] = 205] = "ResetContent";
HttpStatusCode2[HttpStatusCode2["PartialContent"] = 206] = "PartialContent";
HttpStatusCode2[HttpStatusCode2["MultiStatus"] = 207] = "MultiStatus";
HttpStatusCode2[HttpStatusCode2["AlreadyReported"] = 208] = "AlreadyReported";
HttpStatusCode2[HttpStatusCode2["ImUsed"] = 226] = "ImUsed";
HttpStatusCode2[HttpStatusCode2["MultipleChoices"] = 300] = "MultipleChoices";
HttpStatusCode2[HttpStatusCode2["MovedPermanently"] = 301] = "MovedPermanently";
HttpStatusCode2[HttpStatusCode2["Found"] = 302] = "Found";
HttpStatusCode2[HttpStatusCode2["SeeOther"] = 303] = "SeeOther";
HttpStatusCode2[HttpStatusCode2["NotModified"] = 304] = "NotModified";
HttpStatusCode2[HttpStatusCode2["UseProxy"] = 305] = "UseProxy";
HttpStatusCode2[HttpStatusCode2["SwitchProxy"] = 306] = "SwitchProxy";
HttpStatusCode2[HttpStatusCode2["TemporaryRedirect"] = 307] = "TemporaryRedirect";
HttpStatusCode2[HttpStatusCode2["PermanentRedirect"] = 308] = "PermanentRedirect";
HttpStatusCode2[HttpStatusCode2["BadRequest"] = 400] = "BadRequest";
HttpStatusCode2[HttpStatusCode2["Unauthorized"] = 401] = "Unauthorized";
HttpStatusCode2[HttpStatusCode2["PaymentRequired"] = 402] = "PaymentRequired";
HttpStatusCode2[HttpStatusCode2["Forbidden"] = 403] = "Forbidden";
HttpStatusCode2[HttpStatusCode2["NotFound"] = 404] = "NotFound";
HttpStatusCode2[HttpStatusCode2["MethodNotAllowed"] = 405] = "MethodNotAllowed";
HttpStatusCode2[HttpStatusCode2["NotAcceptable"] = 406] = "NotAcceptable";
HttpStatusCode2[HttpStatusCode2["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired";
HttpStatusCode2[HttpStatusCode2["RequestTimeout"] = 408] = "RequestTimeout";
HttpStatusCode2[HttpStatusCode2["Conflict"] = 409] = "Conflict";
HttpStatusCode2[HttpStatusCode2["Gone"] = 410] = "Gone";
HttpStatusCode2[HttpStatusCode2["LengthRequired"] = 411] = "LengthRequired";
HttpStatusCode2[HttpStatusCode2["PreconditionFailed"] = 412] = "PreconditionFailed";
HttpStatusCode2[HttpStatusCode2["PayloadTooLarge"] = 413] = "PayloadTooLarge";
HttpStatusCode2[HttpStatusCode2["UriTooLong"] = 414] = "UriTooLong";
HttpStatusCode2[HttpStatusCode2["UnsupportedMediaType"] = 415] = "UnsupportedMediaType";
HttpStatusCode2[HttpStatusCode2["RangeNotSatisfiable"] = 416] = "RangeNotSatisfiable";
HttpStatusCode2[HttpStatusCode2["ExpectationFailed"] = 417] = "ExpectationFailed";
HttpStatusCode2[HttpStatusCode2["IAmATeapot"] = 418] = "IAmATeapot";
HttpStatusCode2[HttpStatusCode2["MisdirectedRequest"] = 421] = "MisdirectedRequest";
HttpStatusCode2[HttpStatusCode2["UnprocessableEntity"] = 422] = "UnprocessableEntity";
HttpStatusCode2[HttpStatusCode2["Locked"] = 423] = "Locked";
HttpStatusCode2[HttpStatusCode2["FailedDependency"] = 424] = "FailedDependency";
HttpStatusCode2[HttpStatusCode2["UpgradeRequired"] = 426] = "UpgradeRequired";
HttpStatusCode2[HttpStatusCode2["PreconditionRequired"] = 428] = "PreconditionRequired";
HttpStatusCode2[HttpStatusCode2["TooManyRequests"] = 429] = "TooManyRequests";
HttpStatusCode2[HttpStatusCode2["RequestHeaderFieldsTooLarge"] = 431] = "RequestHeaderFieldsTooLarge";
HttpStatusCode2[HttpStatusCode2["UnavailableForLegalReasons"] = 451] = "UnavailableForLegalReasons";
HttpStatusCode2[HttpStatusCode2["InternalServerError"] = 500] = "InternalServerError";
HttpStatusCode2[HttpStatusCode2["NotImplemented"] = 501] = "NotImplemented";
HttpStatusCode2[HttpStatusCode2["BadGateway"] = 502] = "BadGateway";
HttpStatusCode2[HttpStatusCode2["ServiceUnavailable"] = 503] = "ServiceUnavailable";
HttpStatusCode2[HttpStatusCode2["GatewayTimeout"] = 504] = "GatewayTimeout";
HttpStatusCode2[HttpStatusCode2["HttpVersionNotSupported"] = 505] = "HttpVersionNotSupported";
HttpStatusCode2[HttpStatusCode2["VariantAlsoNegotiates"] = 506] = "VariantAlsoNegotiates";
HttpStatusCode2[HttpStatusCode2["InsufficientStorage"] = 507] = "InsufficientStorage";
HttpStatusCode2[HttpStatusCode2["LoopDetected"] = 508] = "LoopDetected";
HttpStatusCode2[HttpStatusCode2["NotExtended"] = 510] = "NotExtended";
HttpStatusCode2[HttpStatusCode2["NetworkAuthenticationRequired"] = 511] = "NetworkAuthenticationRequired";
return HttpStatusCode2;
})(HttpStatusCode || {});
const cacheKeys = {
sanityUrlText: `sanity::`,
imageHashText: `hash::`,
albumHash: `album::`,
hintText: `hint::`,
timeText: `time::`,
playerText: `player::`,
playerData: `playerData::`,
playerIdText: `playerId::`,
gameIdText: `gameId::`,
gameSlugText: `slug::`,
gameText: `game::`,
locationText: `location::`,
discussionText: `discussion::`,
mentionText: `mention::`,
tagNumberText: `tag::`,
imagesText: `images::`,
imageUrlText: `imageUrl::`,
gpsStringText: `gpsString::`,
slugText: `slug::`
};
const createTagObject = (tagData = {}, foundTagData = {}) => {
return {
_id: tagData._id,
_type: tagData._type,
/// Common Tag Data
game: tagData.game ?? "",
slug: tagData.slug ?? "",
name: tagData.name ?? "",
playerId: tagData.playerId ?? "",
tagnumber: tagData.tagnumber ?? 0,
/// Mystery Tag Data
mysteryPlayer: tagData.mysteryPlayer ?? "",
mysteryImage: tagData.mysteryImage,
mysteryImageUrl: tagData.mysteryImageUrl ?? "",
mysteryTime: tagData.mysteryTime ?? 0,
hint: tagData.hint ?? "",
discussionUrl: tagData.discussionUrl ?? "",
mentionUrl: tagData.mentionUrl ?? "",
/// Found Tag Data
foundPlayer: foundTagData.foundPlayer ?? tagData.foundPlayer ?? "",
foundImage: foundTagData.foundImage ?? tagData.foundImage,
foundImageUrl: foundTagData.foundImageUrl ?? tagData.foundImageUrl ?? "",
foundTime: foundTagData.foundTime ?? tagData.foundTime ?? 0,
foundLocation: foundTagData.foundLocation ?? tagData.foundLocation ?? "",
confirmedBoundary: foundTagData.confirmedBoundary ?? tagData.confirmedBoundary ?? false,
gps: foundTagData.gps ?? tagData.gps ?? ""
};
};
const tagDataFields = Object.keys(createTagObject());
const tagDataReferenceFields = ["game", "player"];
const tagDataAssetFields = ["foundImage", "mysteryImage"];
const tagDataObjectFields = {
foundImage: "asset->_ref",
mysteryImage: "asset->_ref"
};
const createGameObject = (gameData = {}) => {
return {
_id: gameData._id,
_type: gameData._type,
name: gameData.name ?? gameData.slug ?? "",
ambassadors: gameData.ambassadors ?? [],
settings: gameData.settings ?? [],
boundary: gameData.boundary ?? {},
mainhash: gameData.mainhash ?? "",
archivehash: gameData.archivehash ?? "",
queuehash: gameData.queuehash ?? "",
logo: gameData.logo,
region: gameData.region ?? { name: gameData.name },
slug: gameData.slug ?? gameData.name ?? ""
};
};
const gameDataReferenceFields = ["region", "settings"];
const gameDataArrayFields = ["ambassadors", "tags", "settings"];
const gameDataCustomFields = {
settings: "[]->{key,value}",
region: "name,description,zipcode,radius,tz"
};
const gameDataFields = Object.keys(createGameObject());
const gameDataObjectFields = {
logo: "asset->_ref"
};
const createPlayerObject = (playerData = {}) => {
return {
_id: playerData._id,
_type: playerData._type,
achievements: playerData.achievements ?? [],
bicon: playerData.bicon ?? "",
games: playerData.games ?? (playerData.game ? [playerData.game] : []),
name: playerData.name ?? "",
slug: playerData.slug ?? "",
tags: playerData.tags ?? []
};
};
const playerDataFields = Object.keys(createPlayerObject());
const playerDataReferenceFields = ["games", "tags", "achievements"];
const playerDataArrayFields = ["games", "tags", "achievements"];
const playerDataAssetFields = [];
const playerDataObjectFields = {};
const createAmbassadorObject = (ambassadorData = {}) => {
return {
id: ambassadorData._id ?? ambassadorData.id ?? "",
address1: ambassadorData.address1 ?? "",
address2: ambassadorData.address2 ?? "",
city: ambassadorData.city ?? "",
country: ambassadorData.country ?? "",
email: ambassadorData.email ?? "",
name: ambassadorData.name ?? "",
phone: ambassadorData.phone ?? "",
player: ambassadorData.player ?? "",
slug: ambassadorData.slug ?? "",
zipcode: ambassadorData.zipcode ?? ""
};
};
const ambassadorDataFields = Object.keys(createAmbassadorObject());
const ambassadorDataReferenceFields = ["player"];
const createSettingObject = (settingData = {}) => {
return {
slug: settingData.slug ?? "",
description: settingData.description ?? "",
name: settingData.name ?? "",
key: settingData.key ?? "",
value: settingData.value ?? ""
};
};
const settingDataFields = Object.keys(createSettingObject());
const createAchievementObject = (achievementData = {}) => {
return {
slug: achievementData.slug ?? "",
description: achievementData.description ?? "",
name: achievementData.name ?? "",
key: achievementData.key ?? "",
value: achievementData.value ?? "",
group: achievementData.group ?? ""
};
};
const achievementDataFields = Object.keys(createAchievementObject());
const putCacheIfExists = (key, value, cache) => {
if (cache) cache.put(key, value);
};
const getCacheIfExists = (key, cache) => {
if (cache) return cache.get(key);
return null;
};
const hasAccessToken = (arg) => {
return arg.accessToken !== void 0;
};
const hasClientKey = (arg) => {
return arg.clientKey !== void 0;
};
const constructTagNumberSlug = (number, game = "") => {
return `${game}-tag-${number}`;
};
const isImgurCredentials = (credentials) => {
return (credentials == null ? void 0 : credentials.clientId) !== void 0 || (credentials == null ? void 0 : credentials.clientSecret) !== void 0 || (credentials == null ? void 0 : credentials.clientId) !== void 0 && (credentials == null ? void 0 : credentials.hash) !== void 0;
};
const isImgurApiReady = (credentials) => {
if (!(credentials.clientId || credentials.hash)) {
return 0;
} else if (credentials.accessToken) {
return 3;
} else if (credentials.clientId && credentials.clientSecret) {
return 2;
}
return 1;
};
const isSanityCredentials = (credentials) => {
return (credentials == null ? void 0 : credentials.projectId) !== void 0;
};
const isSanityApiReady = (credentials) => {
if (credentials.projectId !== void 0 && credentials.dataset !== void 0 && credentials.apiVersion !== void 0) {
return credentials.token !== void 0 ? 3 : 1;
}
return 0;
};
const isBikeTagCredentials = (credentials) => {
return (credentials == null ? void 0 : credentials.game) !== void 0 || (credentials == null ? void 0 : credentials.clientToken) !== void 0 && (credentials == null ? void 0 : credentials.clientKey) !== void 0;
};
const isBikeTagApiReady = (credentials) => {
return credentials ? 1 : 0;
};
const createImgurCredentials = (credentials, defaults = {}) => {
var _a, _b, _c, _d, _e, _f, _g, _h, _i;
return {
hash: ((_a = credentials.hash) == null ? void 0 : _a.length) ? credentials.hash : defaults.hash,
queuehash: ((_b = credentials.queuehash) == null ? void 0 : _b.length) ? credentials.queuehash : defaults.queuehash,
archivehash: ((_c = credentials.archivehash) == null ? void 0 : _c.length) ? credentials.archivehash : defaults.archivehash,
clientId: ((_d = credentials.clientId) == null ? void 0 : _d.length) ? credentials.clientId : defaults.clientId,
clientSecret: ((_e = credentials.clientSecret) == null ? void 0 : _e.length) ? credentials.clientSecret : defaults.clientSecret,
accessToken: ((_f = credentials.accessToken) == null ? void 0 : _f.length) ? credentials.accessToken : defaults.accessToken,
refreshToken: ((_g = credentials.refreshToken) == null ? void 0 : _g.length) ? credentials.refreshToken : defaults.refreshToken,
rapidApiHost: ((_h = credentials.rapidApiHost) == null ? void 0 : _h.length) ? credentials.rapidApiHost : defaults.rapidApiHost,
rapidApiKey: ((_i = credentials.rapidApiKey) == null ? void 0 : _i.length) ? credentials.rapidApiKey : defaults.rapidApiKey
};
};
const assignImgurCredentials = (credentials, defaults = {}) => {
const imgurCredentials = isImgurCredentials(credentials) ? createImgurCredentials(credentials, defaults) : defaults;
return imgurCredentials;
};
const createSanityCredentials = (credentials, defaults = {}) => {
var _a, _b, _c, _d, _e, _f, _g;
return {
useCdn: ((_a = credentials.token) == null ? void 0 : _a.length) ? false : typeof credentials.useCdn !== "undefined" ? credentials.useCdn : typeof defaults.useCdn !== "undefined" ? defaults.useCdn : true,
projectId: ((_b = credentials.projectId) == null ? void 0 : _b.length) ? credentials.projectId : defaults.projectId,
dataset: ((_c = credentials.dataset) == null ? void 0 : _c.length) ? credentials.dataset : defaults.dataset ?? "development",
token: ((_d = credentials.token) == null ? void 0 : _d.length) ? credentials.token : defaults.token ?? "",
password: ((_e = credentials.password) == null ? void 0 : _e.length) ? credentials.password : defaults.password,
username: ((_f = credentials.username) == null ? void 0 : _f.length) ? credentials.username : defaults.username,
apiVersion: ((_g = credentials.apiVersion) == null ? void 0 : _g.length) ? credentials.apiVersion : defaults.apiVersion ?? "2021-06-07"
};
};
const assignSanityCredentials = (credentials, defaults) => {
const sanityCredentials = isSanityCredentials(
credentials
) ? createSanityCredentials(credentials, defaults) : defaults;
return sanityCredentials;
};
const createBikeTagCredentials = (credentials, defaults = {}) => {
var _a, _b, _c, _d, _e, _f;
return {
game: ((_a = credentials.game) == null ? void 0 : _a.length) ? credentials.game : defaults.game,
host: ((_b = credentials.host) == null ? void 0 : _b.length) ? credentials.host : defaults.host,
cached: typeof credentials.cached !== "undefined" ? credentials.cached : defaults.cached,
source: ((_c = credentials.source) == null ? void 0 : _c.length) ? credentials.source : defaults.source,
clientKey: ((_d = credentials.clientKey) == null ? void 0 : _d.length) ? credentials.clientKey : defaults.clientKey,
clientToken: ((_e = credentials.clientToken) == null ? void 0 : _e.length) ? credentials.clientToken : defaults.clientToken,
accessToken: ((_f = credentials.accessToken) == null ? void 0 : _f.length) ? credentials.accessToken : defaults.accessToken
};
};
const assignBikeTagCredentials = (credentials, defaults) => {
const biketagCredentials = isBikeTagCredentials(credentials) ? createBikeTagCredentials(credentials, defaults) : defaults;
return biketagCredentials;
};
const assignBikeTagConfiguration = (config, defaults) => {
const configuration = {};
const parsedConfig = {
biketag: assignBikeTagCredentials(
config,
defaults == null ? void 0 : defaults.biketag
),
sanity: assignSanityCredentials(
config,
defaults == null ? void 0 : defaults.sanity
),
imgur: assignImgurCredentials(
config,
defaults == null ? void 0 : defaults.imgur
)
};
configuration.biketag = config.biketag ? { ...parsedConfig.biketag, ...createBikeTagCredentials(config.biketag) } : parsedConfig.biketag;
configuration.sanity = config.sanity ? { ...parsedConfig.sanity, ...createSanityCredentials(config.sanity) } : parsedConfig.sanity;
configuration.imgur = config.imgur ? { ...parsedConfig.imgur, ...createImgurCredentials(config.imgur) } : parsedConfig.imgur;
return configuration;
};
const sortTags = (tags, sort = "new", limit = 0, time = "all") => {
let sorted = tags;
switch (sort) {
case "top":
sorted = tags.sort((a, b) => b.tagnumber - a.tagnumber);
break;
case "relevance":
sorted = tags.sort((a, b) => {
var _a, _b, _c, _d;
const aHasFoundImage = (_a = a == null ? void 0 : a.foundImageUrl) == null ? void 0 : _a.length;
const aHasMysteryImage = (_b = a == null ? void 0 : a.mysteryImageUrl) == null ? void 0 : _b.length;
const bHasFoundImage = (_c = b == null ? void 0 : b.foundImageUrl) == null ? void 0 : _c.length;
const bHasMysteryImage = (_d = b == null ? void 0 : b.mysteryImageUrl) == null ? void 0 : _d.length;
const aHasBothImages = aHasFoundImage && aHasMysteryImage;
const bHasBothImages = bHasFoundImage && bHasMysteryImage;
const bIsBeforeA = -1;
const aIsBeforeB = 1;
if (!aHasBothImages && !bHasBothImages) {
if (aHasFoundImage && bHasFoundImage) {
return (a == null ? void 0 : a.foundTime) - (b == null ? void 0 : b.foundTime);
} else if (aHasFoundImage) {
return aIsBeforeB;
} else if (bHasFoundImage) {
return aIsBeforeB;
}
} else if (aHasBothImages && bHasBothImages) {
const firstToComplete = (a == null ? void 0 : a.mysteryTime) - (b == null ? void 0 : b.mysteryTime);
return firstToComplete;
} else if (aHasBothImages && !bHasBothImages) {
return bIsBeforeA;
} else if (!aHasBothImages && bHasBothImages) {
return aIsBeforeB;
}
return 0;
});
break;
case "new":
sorted = tags.sort((a, b) => (b == null ? void 0 : b.tagnumber) - (a == null ? void 0 : a.tagnumber));
break;
default:
sorted = tags.sort((a, b) => (a == null ? void 0 : a.tagnumber) - (b == null ? void 0 : b.tagnumber));
break;
}
let timeConstraint = 0;
switch (time) {
case "hour":
timeConstraint = 60 * 60 * 1e3;
break;
case "day":
timeConstraint = 60 * 60 * 24 * 1e3;
break;
case "week":
timeConstraint = 60 * 60 * 24 * 7 * 1e3;
break;
}
if (timeConstraint) {
const afterDate = Date.now() - timeConstraint;
sorted = sorted.filter((t) => t.mysteryTime * 1e3 > afterDate);
}
return limit !== 0 ? sorted.slice(0, limit) : sorted;
};
const sortPlayers = (players, sort = "new", limit = 0) => {
let sorted = players;
switch (sort) {
case "top":
sorted = players.sort((a, b) => b.tags.length - a.tags.length);
break;
case "comments":
sorted = players.sort((a, b) => a.name.localeCompare(b.name));
break;
case "new":
sorted = players.reverse();
break;
}
return limit !== 0 ? sorted.slice(0, limit) : sorted;
};
const sortAmbassadors = (ambassadors, sort = "new", limit = 0) => {
const sorter = (a, b) => b.name.localeCompare(a.name);
let sorted = ambassadors;
switch (sort) {
case "top":
sorted = ambassadors.sort(sorter);
break;
case "new":
sorted = ambassadors.reverse();
break;
}
return limit !== 0 ? sorted.slice(0, limit) : sorted;
};
const sortSettings = (settings, sort = "new", limit = 0) => {
let sorted = settings;
switch (sort) {
case "comments":
sorted = settings.sort((a, b) => a.name.localeCompare(b.name));
break;
case "new":
sorted = settings.reverse();
break;
}
return limit !== 0 ? sorted.slice(0, limit) : sorted;
};
const sortAchievements = (achievements, sort = "new", limit = 0) => {
let sorted = achievements;
switch (sort) {
case "comments":
sorted = achievements.sort((a, b) => a.name.localeCompare(b.name));
break;
case "new":
sorted = achievements.reverse();
break;
}
return limit !== 0 ? sorted.slice(0, limit) : sorted;
};
const getGameAlbumFromCache = async (gameAlbumHash, cache, fallback, useCache = true) => {
const cacheKey = `imgur::${cacheKeys.albumHash}${gameAlbumHash}`;
const existsInCache = getCacheIfExists(cacheKey, useCache ? cache : void 0);
if (existsInCache) {
return existsInCache;
}
if (fallback) {
const putIntoCache = await fallback();
putCacheIfExists(cacheKey, putIntoCache, cache);
return putIntoCache;
}
};
const getTagNumbersFromTextRegex = new RegExp(
/((?:(?:bike\s*)?(?:\s*tag)?)(#|num|number)(\d+)(?:(?:\s*tag)?|(?:\s*proof)?))|((?:bike\s*)?(?:tag\s*)(#|num|number)?\s*(\d+))|((?:(?:found\s*#?)|(?:here'?i?s?\s*))\[?(\d+)\]?)/gi
);
const getPlayerFromTextRegex = new RegExp(
/((?:proof\s*(?:found\s*at\s*)?(?:\(.*\))?\s*by\s*)(.*?(?= on \[|$)))|((?:tag\s*(?:(?:\(\s*hint:\s*)?.*\))?\s*by\s*)(.+?(?= on \[|\r|\n|$))?)|((?:tag\s*(?:(?:\(\s*hint:\s*)?.*\))?\s*by\s*)(.+?(?= on \[|\r|\n))?)|((?:credit goes to:\s*)(.*)(?:\sfor finding))|(?:tag\s*)(?:number\s*)?(\d*)?(?:\s*by\s*)(.+?(?= on \[|$|\n))/i
);
const getFoundLocationFromTextRegex = new RegExp(
/(?:is\s*(?:at|the)?\s*?)(.*?)(?=\s*by\s+|\]|$)|(?:found)\s*(?:at)?\s*\(([^()]+(\([^()]+\)[^()]*)*)\)(.*(?:\)|]|$))|(?:found\s*at\s*\()(.*(?:\)))/im
);
const getConfirmedBoundaryFromTextRegex = new RegExp(
/(\s*\[.*\]✓\s*\(.*\)\s*)/im
);
const getPlayerFromInfoFromTextRegex = new RegExp(
/(?:\[Player\s*)(.*)(?:]\s*\+\()(.*)(?=\))/i
);
const getGameFromInfoFromTextRegex = new RegExp(
/(((?:{\s*)(.*)(?:}))((?:\s*\[)(.*)(?=\])\])?((?:\s*@\()(.*)(?=\))\))?)\s*::\s*(((?:\[BikeTag\s*Game\s*)(.*)(?:]))((?:\s*#\()(.*)(?=\))\))?((?:\s*\|)(.*)(?=\|)\|)?)/i
);
const getGameSlugFromTextRegex = new RegExp(/((\w*)\s*bike\s*tag!?)/i);
const getHintFromTextRegex = new RegExp(/(?:hint:\s*)(.*)\)/i);
const getTimeFromTextRegex = new RegExp(
/(?:on\s+\[(\d+\/\d+\/\d\d)@(\d+:\d+:\d+)\])/i
);
const getGPSLocationFromTextRegex = new RegExp(
/(([0-9]{1,2})[:|°]([0-9]{1,2})[:|'|′]?([0-9]{1,2}(?:\.[0-9]+){0,1})?["|″]([N|S]),?\s*([0-9]{1,3})[:|°]([0-9]{1,2})[:|'|′]?([0-9]{1,2}(?:\.[0-9]+){0,1})?["|″]([E|W]))|((-?\d+(\.\d+)?),\s*(-?\d+(\.\d+)?))/
);
const getImageURLsFromTextRegex = new RegExp(
/https?:\/\/.*?\.[a-z]{2,4}\/.+?(?=\)|\s|$)/gi
);
const getAlbumIdFromTextRegex = new RegExp(
/((?:imgur.com\/)(?:(a|album|gallery)\/)(\w+))/i
);
const getPlayerIdFromTextRegex = RegExp(/\[(.*)\]/i);
const getDiscussionUrlFromTextRegex = RegExp(/{(.*)}/i);
const getGPSCoordinatesValueFromTextRegex = RegExp(/\((.*)\)/i);
const getTagnumberFromSlugRegex = RegExp(/([^-]*)([^-]*)(\d)/);
const getImgurImageHashFromUrlRegex = RegExp(
/(?:imgur.com\/)(.*)(?:\.)/i
);
const getSanityImageUrlHashFromTextRegex = RegExp(
/^(?:image-)(.*?(?=-(-png|-jpg|-jpeg|-gif)))/i
);
const getCreditFromBlueskyTextRegex = RegExp(
/(?:tag\s*)(?:number\s*)?(\d*)?(?:\s*by\s*)(.+?(?=$|\n))/i
);
const BikeTagExpressions = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
getAlbumIdFromTextRegex,
getConfirmedBoundaryFromTextRegex,
getCreditFromBlueskyTextRegex,
getDiscussionUrlFromTextRegex,
getFoundLocationFromTextRegex,
getGPSCoordinatesValueFromTextRegex,
getGPSLocationFromTextRegex,
getGameFromInfoFromTextRegex,
getGameSlugFromTextRegex,
getHintFromTextRegex,
getImageURLsFromTextRegex,
getImgurImageHashFromUrlRegex,
getPlayerFromInfoFromTextRegex,
getPlayerFromTextRegex,
getPlayerIdFromTextRegex,
getSanityImageUrlHashFromTextRegex,
getTagNumbersFromTextRegex,
getTagnumberFromSlugRegex,
getTimeFromTextRegex
}, Symbol.toStringTag, { value: "Module" }));
const getConfirmedBoundarySymbol = "✓";
const getTagnumberFromSlug = (inputText, fallback, cache) => {
if (!inputText.length) return fallback;
const cacheKey = `${cacheKeys.slugText}${inputText}`;
const existingParsed = getCacheIfExists(cacheKey, cache);
if (existingParsed) return existingParsed;
const slugText = getTagnumberFromSlugRegex.exec(inputText);
if (!slugText) {
putCacheIfExists(cacheKey, fallback, cache);
return fallback;
}
const slug = parseInt((slugText[0] || "").trim());
putCacheIfExists(cacheKey, slug, cache);
return slug;
};
const getTagNumbersFromText$1 = (inputText, fallback, cache) => {
if (!inputText.length) return fallback;
const cacheKey = `${cacheKeys.tagNumberText}${inputText}`;
const existingParsed = getCacheIfExists(cacheKey, cache);
if (existingParsed) return existingParsed;
const tagNumberText = inputText.match(getTagNumbersFromTextRegex);
if (!tagNumberText) return fallback || [];
const tagNumbers = tagNumberText.reduce((numbers, text) => {
if (!text) return numbers;
const tagNumberMatches = text.match(/\d+/);
const tagNumber = tagNumberMatches && tagNumberMatches.length ? tagNumberMatches[0] : null;
if (!tagNumber) return numbers;
const number = Number.parseInt(tagNumber);
if (numbers.indexOf(number) == -1) numbers.push(number);
return numbers;
}, []);
if (!tagNumbers.length && fallback) {
putCacheIfExists(cacheKey, fallback, cache);
return fallback;
}
putCacheIfExists(cacheKey, tagNumbers, cache);
return tagNumbers;
};
const getPlayerFromText$1 = (inputText, fallback, cache) => {
if (!inputText.length) return fallback;
const cacheKey = `${cacheKeys.playerText}${inputText}`;
const existingParsed = getCacheIfExists(cacheKey, cache);
if (existingParsed) return existingParsed;
const playerText = getPlayerFromTextRegex.exec(inputText);
if (!playerText) return fallback ?? null;
const tagPlayers = playerText.filter(
(c) => typeof c === "string" && (c.indexOf("tag ") === -1 || c.indexOf("tag") !== 0) && (c.indexOf("proof ") === -1 || c.indexOf("proof") !== 0) && c.indexOf("to:") === -1 && c.indexOf("hint:") === -1 && Number.isInteger(Number.parseInt(c)) === false && (c.indexOf(" by ") === -1 || c.indexOf(" by ") !== 0)
);
if (!tagPlayers.length && fallback) {
putCacheIfExists(cacheKey, fallback, cache);
return fallback;
}
const player = tagPlayers[0];
putCacheIfExists(cacheKey, player, cache);
return player;
};
const getFoundLocationFromText$1 = (inputText, fallback, cache) => {
if (!inputText.length) return fallback;
const cacheKey = `${cacheKeys.locationText}${inputText}`;
const existingParsed = getCacheIfExists(cacheKey, cache);
if (existingParsed) return existingParsed;
const foundLocationText = getFoundLocationFromTextRegex.exec(inputText);
if (!foundLocationText) {
fallback = fallback ?? null;
putCacheIfExists(cacheKey, fallback, cache);
return fallback;
}
const foundLocation = (foundLocationText[1] ?? foundLocationText[2] ?? "").trim();
putCacheIfExists(cacheKey, foundLocation, cache);
return foundLocation;
};
const getHintFromText$1 = (inputText, fallback, cache) => {
if (!inputText.length) return fallback;
const cacheKey = `${cacheKeys.hintText}${inputText}`;
const existingParsed = getCacheIfExists(cacheKey, cache);
if (existingParsed) return existingParsed;
const tagNumberText = inputText.match(getHintFromTextRegex);
if (!tagNumberText) return fallback ?? null;
const tagNumbers = tagNumberText.reduce((numbers, text) => {
const tagNumberMatches = text.match(/\d+/);
const tagNumber = tagNumberMatches && tagNumberMatches.length ? tagNumberMatches[0] : null;
if (!tagNumber) return numbers;
const number = Number.parseInt(tagNumber);
if (numbers.indexOf(number) == -1) numbers.push(number);
return numbers;
}, []);
if (!tagNumbers.length && fallback) {
putCacheIfExists(cacheKey, fallback, cache);
return fallback;
}
putCacheIfExists(cacheKey, tagNumbers, cache);
return tagNumbers;
};
const getGpsStringLocationFromText = (inputText, fallback, cache) => {
if (!(inputText == null ? void 0 : inputText.length)) return fallback;
const cacheKey = `${cacheKeys.gpsStringText}${inputText}`;
const existingParsed = getCacheIfExists(cacheKey, cache);
if (existingParsed) return existingParsed;
inputText = inputText.replace(/\\/g, "");
inputText.match(getGPSLocationFromTextRegex);
const gpsText = getGPSLocationFromTextRegex.exec(inputText);
if (!gpsText) {
fallback = fallback ?? null;
putCacheIfExists(cacheKey, fallback, cache);
return fallback;
}
const gpsString = gpsText[0].split(",").length > 2 ? gpsText[0] : `${gpsText[0]}, 0`;
putCacheIfExists(cacheKey, gpsString, cache);
return gpsString;
};
const getGPSLocationFromText = (inputText, fallback, cache) => {
const gpsString = getGpsStringLocationFromText(inputText, "", cache);
if (gpsString.length) {
const gpsPair = gpsString.split(",");
const gpsLocation = {
lat: parseFloat(gpsPair[0]),
long: parseFloat(gpsPair[1]),
alt: parseFloat(gpsPair[2])
};
return gpsLocation;
}
return fallback ?? {
lat: 0,
long: 0,
alt: 0
};
};
const getImgurAlbumIdFromText = (inputText, fallback, cache) => {
if (!inputText.length) return fallback;
const cacheKey = `${cacheKeys.imageUrlText}${inputText}`;
const existingParsed = getCacheIfExists(cacheKey, cache);
if (existingParsed) return existingParsed;
inputText.match(getAlbumIdFromTextRegex);
const albumbIdMatches = getAlbumIdFromTextRegex.exec(inputText);
const albumbIds = albumbIdMatches.reduce((ids, id) => {
if (id.indexOf("gallery") === -1 && id.indexOf("?") === -1 && id.indexOf("a/") === -1 && id.length > 1) {
ids.push(id);
}
return ids;
}, []);
if (!albumbIds.length && fallback) {
putCacheIfExists(cacheKey, fallback, cache);
return fallback;
}
const albumbId = albumbIds[0];
putCacheIfExists(cacheKey, albumbId, cache);
return albumbId;
};
const getMentionURLsFromText = (inputText, fallback, cache) => {
if (!inputText.length) return fallback;
const cacheKey = `${cacheKeys.mentionText}${inputText}`;
const existingParsed = getCacheIfExists(cacheKey, cache);
if (existingParsed) return existingParsed;
const validImageURLs = ["t.co"];
const selfTextURLs = inputText.match(getImageURLsFromTextRegex);
if (selfTextURLs) {
const tagImageURLs = selfTextURLs.reduce((urls, url) => {
if (!url || !new RegExp(validImageURLs.join("|")).test(url)) return urls;
const ext = /[^.]+$/.test(url) ? "." + /[^.]+$/.exec(url) : "";
if (
// ['.jpg', '.jpeg', '.png', '.bmp'].indexOf(ext) === -1 &&
ext.indexOf(".co") === 0 && url.indexOf("//t.co/") !== -1 && url.length > 2
) ;
urls.push(url);
return urls;
}, []);
if (!tagImageURLs.length && fallback) {
putCacheIfExists(cacheKey, fallback, cache);
return fallback;
}
putCacheIfExists(cacheKey, tagImageURLs, cache);
return tagImageURLs;
}
putCacheIfExists(cacheKey, fallback, cache);
return fallback;
};
const getImageURLsFromText = (inputText, fallback, cache) => {
if (!inputText.length) return fallback;
const cacheKey = `${cacheKeys.imagesText}${inputText}`;
const existingParsed = getCacheIfExists(cacheKey, cache);
if (existingParsed) return existingParsed;
const validImageURLs = ["imgur", "t.co"];
const selfTextURLs = inputText.match(getImageURLsFromTextRegex);
if (selfTextURLs) {
const tagImageURLs = selfTextURLs.reduce((urls, url) => {
if (!url || !new RegExp(validImageURLs.join("|")).test(url)) return urls;
const ext = /[^.]+$/.test(url) ? "." + /[^.]+$/.exec(url) : "";
if ([".jpg", ".jpeg", ".png", ".webp", ".bmp"].indexOf(ext) === -1 && ext.indexOf(".com/") === 0 && url.indexOf("//imgur.com/") !== -1 && url.indexOf("3/album") === -1 && url.indexOf("/a/") === -1 && url.indexOf(".com/gallery") === -1 && url.length > 2) {
url = `${url.replace("//imgur.com", "//i.imgur.com")}.jpg`;
}
urls.push(url);
return urls;
}, []);
if (!tagImageURLs.length && fallback) {
putCacheIfExists(cacheKey, fallback, cache);
return fallback;
}
putCacheIfExists(cacheKey, tagImageURLs, cache);
return tagImageURLs;
}
putCacheIfExists(cacheKey, fallback, cache);
return fallback;
};
const getDiscussionUrlFromText$1 = (inputText, cache) => {
if (!inputText.length) return "";
const cacheKey = `${cacheKeys.discussionText}${inputText}`;
const existingParsed = getCacheIfExists(cacheKey, cache);
if (existingParsed) return existingParsed;
const tagDiscussionLinkMatches = getDiscussionUrlFromTextRegex.exec(inputText);
if (!(tagDiscussionLinkMatches == null ? void 0 : tagDiscussionLinkMatches.length)) {
putCacheIfExists(cacheKey, null, cache);
return null;
}
const discussionUrl = (tagDiscussionLinkMatches[1] || "").trim();
putCacheIfExists(cacheKey, discussionUrl, cache);
return discussionUrl;
};
const getImageHashFromText = (inputText, cache) => {
if (!(inputText == null ? void 0 : inputText.length)) return "";
const cacheKey = `${cacheKeys.imageHashText}${inputText}`;
const existingParsed = getCacheIfExists(cacheKey, cache);
if (existingParsed) return existingParsed;
inputText.match(getImgurImageHashFromUrlRegex);
const imageHashMatches = getImgurImageHashFromUrlRegex.exec(inputText);
if (!imageHashMatches || !imageHashMatches.length) {
putCacheIfExists(cacheKey, null, cache);
return null;
}
const imageHash = (imageHashMatches[1] || "").trim();
putCacheIfExists(cacheKey, imageHash, cache);
return imageHash;
};
const getSanityImageUrlHashFromText = (inputText, cache) => {
if (!inputText.length) return "";
const cacheKey = `${cacheKeys.sanityUrlText}${inputText}`;
const existingParsed = getCacheIfExists(cacheKey, cache);
if (existingParsed) return existingParsed;
const imageUrlMatches = getSanityImageUrlHashFromTextRegex.exec(inputText);
if (!imageUrlMatches || !imageUrlMatches.length) {
putCacheIfExists(cacheKey, null, cache);
return null;
}
const imageHash = (imageUrlMatches[1] || "").trim();
putCacheIfExists(cacheKey, imageHash, cache);
return imageHash;
};
const getImgurFoundImageHashFromBikeTagData = (tag, cache) => {
return getImageHashFromText(tag.foundImageUrl, cache);
};
const getDateStringForImgurDescription = (isodate) => {
if (!isodate) return "";
const date = new Date(isodate * 1e3);
const dateString = `${date.getMonth() + 1}/${date.getDate()}/${date.getFullYear().toString().substring(2)}`;
const timeString = `${date.getHours().toString().padStart(2, "0")}:${date.getMinutes().toString().padStart(2, "0")}:${date.getSeconds().toString().padStart(2, "0")}`;
return ` on [${dateString}@${timeString}]`;
};
const getImgurFoundDescriptionFromBikeTagData = (tag, includeCredit = true, includeDate = true) => `#${tag.tagnumber} proof${tag.foundLocation ? ` found at (${tag.foundLocation})` : ""}${includeCredit ? ` by ${tag.foundPlayer}` : ""}${includeDate ? getDateStringForImgurDescription(tag.foundTime) : ""}`;
const getImgurFoundTitleFromBikeTagData = (tag, fromCombinedTag = false) => {
var _a;
return `${!tag.gps || tag.gps.lat === 0 && tag.gps.long === 0 ? "" : `(${tag.gps.lat ?? 0}, ${tag.gps.long ?? 0}, ${tag.gps.alt ?? 0})`}
${!fromCombinedTag && // don't include the player id from a combined tag in the found tag
((_a = tag.playerId) == null ? void 0 : _a.length) ? `[${tag.playerId}]` : ""}
${tag.confirmedBoundary ? getConfirmedBoundarySymbol : ""}`;
};
const getImgurMysteryImageHashFromBikeTagData = (tag, cache) => {
return getImageHashFromText(tag.mysteryImageUrl, cache);
};
const getImgurMysteryTitleFromBikeTagData = (tag, fromCombinedTag = false) => {
var _a;
return `${!fromCombinedTag && // don't include the gps from a combined tag in the mystery
!tag.gps || tag.gps.lat === 0 && tag.gps.long === 0 ? "" : `(${tag.gps.lat ?? 0}, ${tag.gps.long ?? 0}, ${tag.gps.alt ?? 0})`}
${((_a = tag.playerId) == null ? void 0 : _a.length) ? `[${tag.playerId}]` : ""}
${tag.discussionUrl ? `{${tag.discussionUrl}}` : ""}`;
};
const getImgurMysteryDescriptionFromBikeTagData = (tag, includeCredit = true, includeHint = true, includeDate = true) => `#${tag.tagnumber} tag ${includeHint && tag.hint ? `(hint: ${tag.hint})` : ""}${includeCredit ? ` by ${tag.mysteryPlayer}` : ""}${includeDate ? getDateStringForImgurDescription(tag.mysteryTime) : ""}`;
const getOnlyMysteryTagFromTagData = (tagData) => {
const onlyMysteryTagFields = {
playerId: tagData.playerId,
game: tagData.game,
tagnumber: tagData.tagnumber,
name: tagData.name,
slug: tagData.slug,
mysteryImageUrl: tagData.mysteryImageUrl,
mysteryImage: tagData.mysteryImage,
mysteryPlayer: tagData.mysteryPlayer,
mysteryTime: tagData.mysteryTime,
hint: tagData.hint,
gps: tagData.gps,
discussionUrl: tagData.discussionUrl,
mentionUrl: tagData.mentionUrl,
shareUrl: tagData.shareUrl
};
return createTagObject(onlyMysteryTagFields);
};
const getOnlyFoundTagFromTagData = (tagData) => {
const onlyFoundTagFields = {
playerId: tagData.playerId,
game: tagData.game,
tagnumber: tagData.tagnumber,
name: tagData.name,
slug: tagData.slug,
foundImageUrl: tagData.foundImageUrl,
foundImage: tagData.foundImage,
foundPlayer: tagData.foundPlayer,
foundLocation: tagData.foundLocation,
foundTime: tagData.foundTime
};
return createTagObject(onlyFoundTagFields);
};
const getRedditPostTextFromTagData = (tagData, gameData = {}, wrapInPreTag = true) => {
const host = gameData.host ?? `${tagData.game}.biketag.org`;
const selfPostText = `
[#${tagData.tagnumber} tag by ${tagData.mysteryPlayer}](${tagData.mysteryImageUrl})
Credit goes to: ${tagData.mysteryPlayer} for finding tag #${tagData.tagnumber - 1}!
Found at: ${tagData.foundLocation}](https://${host}/#/${tagData.tagnumber})
See all BikeTags and more, for ${tagData.game}:
[${host}](https://${host}) | [Top 10](https://${host}/#/leaderboard) | [Rules](https://${host}/#/how-to)
${gameData.mapLink}`;
return wrapInPreTag ? `<pre>${selfPostText}</pre>` : selfPostText;
};
const BikeTagGetters = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
getConfirmedBoundarySymbol,
getDateStringForImgurDescription,
getDiscussionUrlFromText: getDiscussionUrlFromText$1,
getFoundLocationFromText: getFoundLocationFromText$1,
getGPSLocationFromText,
getGpsStringLocationFromText,
getHintFromText: getHintFromText$1,
getImageHashFromText,
getImageURLsFromText,
getImgurAlbumIdFromText,
getImgurFoundDescriptionFromBikeTagData,
getImgurFoundImageHashFromBikeTagData,
getImgurFoundTitleFromBikeTagData,
getImgurMysteryDescriptionFromBikeTagData,
getImgurMysteryImageHashFromBikeTagData,
getImgurMysteryTitleFromBikeTagData,
getMentionURLsFromText,
getOnlyFoundTagFromTagData,
getOnlyMysteryTagFromTagData,
getPlayerFromText: getPlayerFromText$1,
getRedditPostTextFromTagData,
getSanityImageUrlHashFromText,
getTagNumbersFromText: getTagNumbersFromText$1,
getTagnumberFromSlug
}, Symbol.toStringTag, { value: "Module" }));
async function deleteTag$1(client, payload) {
var _a;
if (!((_a = payload.slug) == null ? void 0 : _a.length)) {
if (payload.tagnumber) {
payload.slug = `${payload.game}-tag-${payload.tagnumber}`;
} else {
return {
data: null,
success: false,
status: HttpStatusCode.NotAcceptable,
source: AvailableApis[AvailableApis.sanity]
};
}
}
const query = `*[_type == "tag" && _id == ${payload.slug}]`;
return client.delete({ query }).then((result) => {
return {
data: result,
success: true,
status: HttpStatusCode.Ok,
source: AvailableApis[AvailableApis.sanity]
};
});
}
function constructTagFromSanityObject(data, fields = []) {
var _a;
const tagData = fields.length ? fields.reduce((o, f) => {
o[f] = data[f];
return o;
}, {}) : data;
tagDataReferenceFields.forEach((f) => {
if (tagData[f] && typeof tagData[f] !== "undefined") {
tagData[f] = tagData[f].name;
}
});
Object.keys(tagDataObjectFields).forEach((f) => {
if (tagData[f] && typeof tagData[f] !== "undefined") {
const objectTree = tagDataObjectFields[f].split("->");
if (tagData[f]) {
let targetObj = tagData[f];
objectTree.forEach((o) => {
targetObj = targetObj[o] ?? void 0;
});
tagData[f] = targetObj;
}
}
});
tagData.slug = ((_a = tagData.slug) == null ? void 0 : _a.current) ?? "current";
return createTagObject(tagData);
}
function constructObjectIdFromSlug(slug) {
return slug.replace(/\s/g, "_").replace(/\//g, "-").replace(/[^\w\d]/g, "").toLowerCase();
}
async function constructSanityObjectFromTag(client, data, fields = []) {
var _a;
const tagData = fields.length ? fields.reduce((o, f) => {
o[f] = data[f];
return o;
}, {}) : data;
for (const field of tagDataReferenceFields) {
const fieldValue = tagData[field];
if (fieldValue) {
const refQuery = `*[_type == "${field}" && slug.current == "${fieldValue}"]{_id}`;
const referenceObject = await client.fetch(refQuery, {});
let referenceId = "";
if (referenceObject.length) {
referenceId = referenceObject[0]._id;
} else {
const newReferenceObject = await client.createIfNotExists({
_id: constructObjectIdFromSlug(fieldValue),
_type: field,
name: fieldValue
});
referenceId = newReferenceObject._id;
}
tagData[field] = { _type: "reference", _ref: referenceId };
}
}
for (const field of tagDataAssetFields) {
const fieldValue = tagData[field];
if (fieldValue) {
tagData[field] = {
_type: "image",
asset: { _type: "reference", _ref: fieldValue }
};
}
}
tagData._type = "tag";
tagData._id = tagData._id ?? tagData.slug;
tagData.slug = { current: ((_a = tagData.slug) == null ? void 0 : _a.current) ?? tagData.slug };
return createTagObject(tagData);
}
async function constructSanityObjectFromData(client, data, fields = [], dataType, dataReferenceFields = [], dataArrayFields = []) {
var _a;
const biketagData = fields.length ? fields.reduce((o, f) => {
o[f] = data[f];
return o;
}, {}) : data;
for (const field of dataReferenceFields) {
const fieldValue = biketagData[field];
if (fieldValue) {
const fieldValueIsArrayField = dataArrayFields.indexOf(field) !== -1;
const fieldArray = fieldValueIsArrayField ? fieldValue : [fieldValue];
const fieldType = fieldValueIsArrayField ? field.substring(0, field.length - 1) : field;
const fieldReferenceArray = [];
for (const arrayFieldValue of fieldArray) {
const refQuery = `*[_type == "${fieldType}" && slug.current == "${arrayFieldValue}"]{_id}`;
const referenceObject = await client.fetch(refQuery, {});
let referenceId = "";
if (referenceObject.length) {
referenceId = referenceObject[0]._id;
} else {
const newReferenceObject = await client.createIfNotExists({
_id: constructObjectIdFromSlug(arrayFieldValue),
_type: fieldType,
name: arrayFieldValue
});
referenceId = newReferenceObject._ref;
}
fieldReferenceArray.push({
_type: "reference",
_ref: referenceId,
_key: Date.now().toString()
});
}
if (fieldReferenceArray.length) {
biketagData[field] = fieldValueIsArrayField ? fieldReferenceArray : fieldReferenceArray[0];
}
}
}
for (const field of playerDataAssetFields) {
const fieldValue = biketagData[field];
if (fieldValue) {
biketagData[field] = {
_type: "image",
asset: { _type: "reference", _ref: fieldValue }
};
}
}
biketagData._type = dataType;
biketagData.slug = biketagData.slug ?? `${biketagData._type}-${biketagData.name.toLowerCase()}`;
biketagData._id = biketagData._id ?? biketagData.slug;
biketagData.slug = { current: ((_a = biketagData.slug) == null ? void 0 : _a.current) ?? biketagData.slug };
switch (dataType) {
case "player":
return createPlayerObject(biketagData);
case "game":
return createGameObject(biketagData);
case "tag":
return createTagObject(biketagData);
}
return biketagData;
}
function constructGameFromSanityObject(data, fields = []) {
var _a;
const gameData = fields.length ? fields.reduce((o, f) => {
o[f] = data[f];
return o;
}, {}) : data;
if (gameData) {
gameDataReferenceFields.forEach((f) => {
if (gameData[f] && typeof gameData[f] !== "undefined") {
const fieldMap = gameDataCustomFields[f];
if (fieldMap) {
if (gameDataArrayFields.indexOf(f) !== -1) {
const customFieldProperties = fieldMap.replace("[]->{", "").replace("}", "");
const arrayFieldKeys = customFieldProperties.split(",");
const key = arrayFieldKeys[0];
const value = arrayFieldKeys[1];
gameData[f] = gameData[f].reduce((o, kv) => {
o[kv[key]] = kv[value];
return o;
}, []);
} else {
const customFieldNames = fieldMap.split(",");
const customField = customFieldNames.reduce((o, s) => {
if (customFieldNames.indexOf(s) !== -1) {
o[s] = gameData[f][s];
}
return o;
}, {});
gameData[f] = customField;
}
} else {
gameData[f] = gameData[f].name;
}
}
});
Object.keys(gameDataObjectFields).forEach((f) => {
if (gameData[f] && typeof gameData[f] !== "undefined") {
const objectTree = gameDataObjectFields[f].split("->");
if (gameData[f]) {
let target