@lootlog/sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +50 -0
- package/dist/activity.d.ts +491 -0
- package/dist/activity.d.ts.map +1 -0
- package/dist/activity.js +231 -0
- package/dist/activity.js.map +1 -0
- package/dist/battlelog.d.ts +2238 -0
- package/dist/battlelog.d.ts.map +1 -0
- package/dist/battlelog.js +639 -0
- package/dist/battlelog.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +11692 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +4673 -0
- package/dist/main.js.map +1 -0
- package/dist/mutators-CaBTxpi-.js +10 -0
- package/dist/mutators-CaBTxpi-.js.map +1 -0
- package/dist/mutators-Da_vMUva.d.ts +9 -0
- package/dist/mutators-Da_vMUva.d.ts.map +1 -0
- package/dist/realtime.d.ts +1000 -0
- package/dist/realtime.d.ts.map +1 -0
- package/dist/realtime.js +1443 -0
- package/dist/realtime.js.map +1 -0
- package/dist/search.d.ts +233 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +126 -0
- package/dist/search.js.map +1 -0
- package/dist/transport-BHbtsYo_.d.ts +38 -0
- package/dist/transport-BHbtsYo_.d.ts.map +1 -0
- package/dist/transport-CIfewyM7.js +202 -0
- package/dist/transport-CIfewyM7.js.map +1 -0
- package/openapi/activity.json +1608 -0
- package/openapi/battlelog.json +7180 -0
- package/openapi/main.json +38959 -0
- package/openapi/search.json +922 -0
- package/package.json +80 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","names":[],"sources":["../src/generated/search.ts"],"sourcesContent":["/**\n * Generated by orval 🍺\n * Do not edit manually.\n * Search API\n * Meilisearch-powered search microservice\n * OpenAPI spec version: 1.0\n */\nimport { searchFetch } from '../mutators';\n/**\n * Player search hit\n */\nexport interface PlayerHitDtoOutput {\n id: string;\n name: string;\n lvl: number;\n prof: string;\n icon: string;\n characterId: number;\n accountId: number;\n world: string;\n}\n\nexport type _SearchUnavailableEncodedTag = typeof _SearchUnavailableEncodedTag[keyof typeof _SearchUnavailableEncodedTag];\n\n\nexport const _SearchUnavailableEncodedTag = {\n SearchUnavailable: 'SearchUnavailable',\n} as const;\n\nexport interface SearchUnavailableEncoded {\n _tag: _SearchUnavailableEncodedTag;\n message: string;\n}\n\nexport type NpcHitDtoOutputType = typeof NpcHitDtoOutputType[keyof typeof NpcHitDtoOutputType];\n\n\nexport const NpcHitDtoOutputType = {\n COMMON: 'COMMON',\n ELITE: 'ELITE',\n ELITE2: 'ELITE2',\n ELITE3: 'ELITE3',\n HERO: 'HERO',\n EVENT_HERO: 'EVENT_HERO',\n COLOSSUS: 'COLOSSUS',\n TITAN: 'TITAN',\n NPC: 'NPC',\n} as const;\n\n/**\n * NPC search hit\n */\nexport interface NpcHitDtoOutput {\n id: number;\n prof: string;\n icon: string;\n name: string;\n lvl: number;\n wt: number;\n type: NpcHitDtoOutputType;\n margonemType: number;\n world: string;\n}\n\n/**\n * Item search hit\n */\nexport type SearchItemsResponseDtoOutputHitsItem = {\n id: number;\n name: string;\n icon: string;\n stat: string;\n lvl: number;\n /** @nullable */\n rarity: string | null;\n /** @nullable */\n type: string | null;\n worlds: string[];\n};\n\nexport type SearchItemsResponseDtoOutputFacetDistribution = {[key: string]: {[key: string]: number}};\n\nexport type SearchItemsResponseDtoOutputFacetStats = {[key: string]: {\n min: number;\n max: number;\n}};\n\n/**\n * Item search results\n */\nexport interface SearchItemsResponseDtoOutput {\n hits: SearchItemsResponseDtoOutputHitsItem[];\n estimatedTotalHits: number;\n facetDistribution: SearchItemsResponseDtoOutputFacetDistribution;\n facetStats: SearchItemsResponseDtoOutputFacetStats;\n}\n\n/**\n * Item search hit\n */\nexport type SearchAllResponseDtoOutputItemsItem = {\n id: number;\n name: string;\n icon: string;\n stat: string;\n lvl: number;\n /** @nullable */\n rarity: string | null;\n /** @nullable */\n type: string | null;\n worlds: string[];\n};\n\n/**\n * Player search hit\n */\nexport type SearchAllResponseDtoOutputPlayersItem = {\n id: string;\n name: string;\n lvl: number;\n prof: string;\n icon: string;\n characterId: number;\n accountId: number;\n world: string;\n};\n\nexport type SearchAllResponseDtoOutputNpcsItemType = typeof SearchAllResponseDtoOutputNpcsItemType[keyof typeof SearchAllResponseDtoOutputNpcsItemType];\n\n\nexport const SearchAllResponseDtoOutputNpcsItemType = {\n COMMON: 'COMMON',\n ELITE: 'ELITE',\n ELITE2: 'ELITE2',\n ELITE3: 'ELITE3',\n HERO: 'HERO',\n EVENT_HERO: 'EVENT_HERO',\n COLOSSUS: 'COLOSSUS',\n TITAN: 'TITAN',\n NPC: 'NPC',\n} as const;\n\n/**\n * NPC search hit\n */\nexport type SearchAllResponseDtoOutputNpcsItem = {\n id: number;\n prof: string;\n icon: string;\n name: string;\n lvl: number;\n wt: number;\n type: SearchAllResponseDtoOutputNpcsItemType;\n margonemType: number;\n world: string;\n};\n\n/**\n * Aggregated search results\n */\nexport interface SearchAllResponseDtoOutput {\n items: SearchAllResponseDtoOutputItemsItem[];\n players: SearchAllResponseDtoOutputPlayersItem[];\n npcs: SearchAllResponseDtoOutputNpcsItem[];\n}\n\nexport type PlayersControllerGetPlayersParams = {\nlimit?: number;\nsearch?: string | string[];\nworld?: string;\n};\n\nexport type PlayersControllerGetPlayers401 = {\n message: string;\n};\n\nexport type PlayersControllerGetPlayers403 = {\n message: string;\n};\n\nexport type PlayersControllerGetPlayers429 = {\n message: string;\n};\n\nexport type NpcsControllerGetNpcsParams = {\n/**\n * @items.minimum -9007199254740991\n * @items.maximum 9007199254740991\n */\nids?: number[];\nlimit?: number;\nsearch?: string | string[];\nworld?: string;\n};\n\nexport type NpcsControllerGetNpcs401 = {\n message: string;\n};\n\nexport type NpcsControllerGetNpcs403 = {\n message: string;\n};\n\nexport type NpcsControllerGetNpcs429 = {\n message: string;\n};\n\nexport type ItemsControllerGetItemsParams = {\nlimit?: number;\noffset?: number;\nsearch?: string;\nworld?: string;\nfilter?: string | string[];\nfacets?: string[];\nsort?: string[];\n};\n\nexport type ItemsControllerGetItems401 = {\n message: string;\n};\n\nexport type ItemsControllerGetItems403 = {\n message: string;\n};\n\nexport type ItemsControllerGetItems429 = {\n message: string;\n};\n\nexport type AllControllerSearchAllParams = {\nlimit?: number;\nsearch?: string;\nworld?: string;\n};\n\nexport type AllControllerSearchAll401 = {\n message: string;\n};\n\nexport type AllControllerSearchAll403 = {\n message: string;\n};\n\nexport type AllControllerSearchAll429 = {\n message: string;\n};\n\nexport const getPlayersControllerGetPlayersUrl = (params?: PlayersControllerGetPlayersParams,) => {\n const normalizedParams = new URLSearchParams();\n\n Object.entries(params || {}).forEach(([key, value]) => {\n const explodeParameters = [\"search\"];\n\n if (Array.isArray(value) && explodeParameters.includes(key)) {\n value.forEach((v) => {\n normalizedParams.append(key, v === null ? 'null' : String(v));\n });\n return;\n }\n\n if (value !== undefined) {\n normalizedParams.append(key, value === null ? 'null' : String(value))\n }\n });\n\n const stringifiedParams = normalizedParams.toString();\n\n return stringifiedParams.length > 0 ? `/players?${stringifiedParams}` : `/players`\n}\n\n/**\n * @summary Search players by name\n */\nexport const playersControllerGetPlayers = async (params?: PlayersControllerGetPlayersParams, options?: Parameters<typeof searchFetch>[1]): Promise<PlayerHitDtoOutput[]> => {\n\n return searchFetch<PlayerHitDtoOutput[]>(getPlayersControllerGetPlayersUrl(params),\n {\n ...options,\n method: 'GET'\n\n\n }\n);}\n\n\n\nexport const getNpcsControllerGetNpcsUrl = (params?: NpcsControllerGetNpcsParams,) => {\n const normalizedParams = new URLSearchParams();\n\n Object.entries(params || {}).forEach(([key, value]) => {\n const explodeParameters = [\"ids\",\"search\"];\n\n if (Array.isArray(value) && explodeParameters.includes(key)) {\n value.forEach((v) => {\n normalizedParams.append(key, v === null ? 'null' : String(v));\n });\n return;\n }\n\n if (value !== undefined) {\n normalizedParams.append(key, value === null ? 'null' : String(value))\n }\n });\n\n const stringifiedParams = normalizedParams.toString();\n\n return stringifiedParams.length > 0 ? `/npcs?${stringifiedParams}` : `/npcs`\n}\n\n/**\n * @summary Search NPCs by name\n */\nexport const npcsControllerGetNpcs = async (params?: NpcsControllerGetNpcsParams, options?: Parameters<typeof searchFetch>[1]): Promise<NpcHitDtoOutput[]> => {\n\n return searchFetch<NpcHitDtoOutput[]>(getNpcsControllerGetNpcsUrl(params),\n {\n ...options,\n method: 'GET'\n\n\n }\n);}\n\n\n\nexport const getItemsControllerGetItemsUrl = (params?: ItemsControllerGetItemsParams,) => {\n const normalizedParams = new URLSearchParams();\n\n Object.entries(params || {}).forEach(([key, value]) => {\n const explodeParameters = [\"filter\",\"facets\",\"sort\"];\n\n if (Array.isArray(value) && explodeParameters.includes(key)) {\n value.forEach((v) => {\n normalizedParams.append(key, v === null ? 'null' : String(v));\n });\n return;\n }\n\n if (value !== undefined) {\n normalizedParams.append(key, value === null ? 'null' : String(value))\n }\n });\n\n const stringifiedParams = normalizedParams.toString();\n\n return stringifiedParams.length > 0 ? `/items?${stringifiedParams}` : `/items`\n}\n\n/**\n * @summary Search items with filters, sorting, and facets\n */\nexport const itemsControllerGetItems = async (params?: ItemsControllerGetItemsParams, options?: Parameters<typeof searchFetch>[1]): Promise<SearchItemsResponseDtoOutput> => {\n\n return searchFetch<SearchItemsResponseDtoOutput>(getItemsControllerGetItemsUrl(params),\n {\n ...options,\n method: 'GET'\n\n\n }\n);}\n\n\n\nexport const getAllControllerSearchAllUrl = (params?: AllControllerSearchAllParams,) => {\n const normalizedParams = new URLSearchParams();\n\n Object.entries(params || {}).forEach(([key, value]) => {\n\n if (value !== undefined) {\n normalizedParams.append(key, value === null ? 'null' : String(value))\n }\n });\n\n const stringifiedParams = normalizedParams.toString();\n\n return stringifiedParams.length > 0 ? `/all?${stringifiedParams}` : `/all`\n}\n\n/**\n * @summary Search across all categories\n */\nexport const allControllerSearchAll = async (params?: AllControllerSearchAllParams, options?: Parameters<typeof searchFetch>[1]): Promise<SearchAllResponseDtoOutput> => {\n\n return searchFetch<SearchAllResponseDtoOutput>(getAllControllerSearchAllUrl(params),\n {\n ...options,\n method: 'GET'\n\n\n }\n);}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
//#region ../client/src/transport.d.ts
|
|
2
|
+
declare const API_SERVICES: readonly ["activity", "auth", "battlelog", "main", "search"];
|
|
3
|
+
type ApiService = (typeof API_SERVICES)[number];
|
|
4
|
+
type FetchImplementation = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
|
|
5
|
+
type ApiRequestContext = {
|
|
6
|
+
method: string;
|
|
7
|
+
service: ApiService;
|
|
8
|
+
url: string;
|
|
9
|
+
};
|
|
10
|
+
type ApiServiceConfig = {
|
|
11
|
+
baseUrl: string;
|
|
12
|
+
credentials?: RequestCredentials;
|
|
13
|
+
fetch?: FetchImplementation;
|
|
14
|
+
getHeaders?: () => HeadersInit | Promise<HeadersInit>;
|
|
15
|
+
onError?: (error: ApiError<unknown>, context: ApiRequestContext) => void;
|
|
16
|
+
};
|
|
17
|
+
type ApiClientOverride = Partial<ApiServiceConfig>;
|
|
18
|
+
type ApiRequestOptions = RequestInit & {
|
|
19
|
+
apiClient?: ApiClientOverride;
|
|
20
|
+
};
|
|
21
|
+
declare class ApiError<TData = unknown> extends Error {
|
|
22
|
+
readonly cause: unknown;
|
|
23
|
+
readonly status?: number;
|
|
24
|
+
readonly data: TData | undefined;
|
|
25
|
+
readonly url: string;
|
|
26
|
+
readonly method: string;
|
|
27
|
+
constructor({ cause, data, message, method, status, url }: {
|
|
28
|
+
cause?: unknown;
|
|
29
|
+
data?: TData;
|
|
30
|
+
message: string;
|
|
31
|
+
method: string;
|
|
32
|
+
status?: number;
|
|
33
|
+
url: string;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { ApiServiceConfig as n, ApiRequestOptions as t };
|
|
38
|
+
//# sourceMappingURL=transport-BHbtsYo_.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-BHbtsYo_.d.ts","names":[],"sources":["../../client/src/transport.ts"],"mappings":";cAEM;KAQM,qBAAqB;KAE5B,uBACH,OAAO,cAAc,KACrB,OAAO,gBACJ,QAAQ;KAED;EACV;EACA,SAAS;EACT;;KAGU;EACV;EACA,cAAc;EACd,QAAQ;EACR,mBAAmB,cAAc,QAAQ;EACzC,WAAW,OAAO,mBAAmB,SAAS;;KAGpC,oBAAoB,QAAQ;KAE5B,oBAAoB;EAC9B,YAAY;;cA8BD,SAAS,yBAAyB;WAC7B;WACA;WACA,MAAM;WACN;WACA;EAEhB,cACE,OACA,MACA,SACA,QACA,QACA;IAEA;IACA,OAAO;IACP;IACA;IACA;IACA"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { Predicate } from "effect";
|
|
2
|
+
Predicate.isObject;
|
|
3
|
+
/** Keeps property lookup available on legacy payloads, including arrays. */
|
|
4
|
+
const isObjectRecord = (value) => Predicate.isObjectOrArray(value);
|
|
5
|
+
//#endregion
|
|
6
|
+
//#region ../client/src/transport.ts
|
|
7
|
+
const API_SERVICES = [
|
|
8
|
+
"activity",
|
|
9
|
+
"auth",
|
|
10
|
+
"battlelog",
|
|
11
|
+
"main",
|
|
12
|
+
"search"
|
|
13
|
+
];
|
|
14
|
+
var ApiError = class extends Error {
|
|
15
|
+
cause;
|
|
16
|
+
status;
|
|
17
|
+
data;
|
|
18
|
+
url;
|
|
19
|
+
method;
|
|
20
|
+
constructor({ cause, data, message, method, status, url }) {
|
|
21
|
+
super(message);
|
|
22
|
+
this.cause = cause;
|
|
23
|
+
this.name = "ApiError";
|
|
24
|
+
this.status = status;
|
|
25
|
+
this.data = data;
|
|
26
|
+
this.url = url;
|
|
27
|
+
this.method = method;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
const serviceConfigurations = /* @__PURE__ */ new Map();
|
|
31
|
+
const configurationRegistrations = [];
|
|
32
|
+
const rebuildServiceConfigurations = () => {
|
|
33
|
+
serviceConfigurations.clear();
|
|
34
|
+
for (const registration of configurationRegistrations) for (const service of API_SERVICES) {
|
|
35
|
+
const configuration = registration.configurations[service];
|
|
36
|
+
if (configuration) serviceConfigurations.set(service, configuration);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
const configureApiClients = (configurations) => {
|
|
40
|
+
const registration = { configurations };
|
|
41
|
+
configurationRegistrations.push(registration);
|
|
42
|
+
rebuildServiceConfigurations();
|
|
43
|
+
let restored = false;
|
|
44
|
+
return () => {
|
|
45
|
+
if (restored) return;
|
|
46
|
+
restored = true;
|
|
47
|
+
const registrationIndex = configurationRegistrations.indexOf(registration);
|
|
48
|
+
if (registrationIndex !== -1) {
|
|
49
|
+
configurationRegistrations.splice(registrationIndex, 1);
|
|
50
|
+
rebuildServiceConfigurations();
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
const getApiMessageFromData = (data) => {
|
|
55
|
+
if (typeof data === "string") return data.trim() || void 0;
|
|
56
|
+
if (!isObjectRecord(data)) return;
|
|
57
|
+
const rawMessage = data.message;
|
|
58
|
+
const message = Array.isArray(rawMessage) ? rawMessage[0] : rawMessage;
|
|
59
|
+
return typeof message === "string" ? message.trim() || void 0 : void 0;
|
|
60
|
+
};
|
|
61
|
+
const encodeQueryComponent = (value) => {
|
|
62
|
+
return encodeURIComponent(value).replace(/[!'()*]/g, (character) => `%${character.charCodeAt(0).toString(16).toUpperCase()}`);
|
|
63
|
+
};
|
|
64
|
+
const appendQueryValue = (entries, key, value, ancestors) => {
|
|
65
|
+
if (value === null || value === void 0) return;
|
|
66
|
+
if (Array.isArray(value)) {
|
|
67
|
+
for (const item of value) appendQueryValue(entries, key, item, ancestors);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (value instanceof Date) {
|
|
71
|
+
entries.push(`${encodeQueryComponent(key)}=${encodeQueryComponent(value.toISOString())}`);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (isObjectRecord(value)) {
|
|
75
|
+
if (ancestors.has(value)) throw new RangeError("Cannot serialize circular query parameters");
|
|
76
|
+
ancestors.add(value);
|
|
77
|
+
for (const [nestedKey, nestedValue] of Object.entries(value)) appendQueryValue(entries, `${key}[${nestedKey}]`, nestedValue, ancestors);
|
|
78
|
+
ancestors.delete(value);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
entries.push(`${encodeQueryComponent(key)}=${encodeQueryComponent(String(value))}`);
|
|
82
|
+
};
|
|
83
|
+
const serializeQueryParams = (params) => {
|
|
84
|
+
const entries = [];
|
|
85
|
+
const ancestors = /* @__PURE__ */ new Set();
|
|
86
|
+
for (const [key, value] of Object.entries(params)) appendQueryValue(entries, key, value, ancestors);
|
|
87
|
+
return entries.join("&");
|
|
88
|
+
};
|
|
89
|
+
const isAbsoluteUrl = (value) => {
|
|
90
|
+
return /^[a-z][a-z\d+.-]*:\/\//i.test(value);
|
|
91
|
+
};
|
|
92
|
+
const buildRequestUrl = ({ baseUrl, params, path }) => {
|
|
93
|
+
const normalizedBaseUrl = baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
|
|
94
|
+
const normalizedPath = path.replace(/^\/+/, "");
|
|
95
|
+
const url = isAbsoluteUrl(path) ? new URL(path) : new URL(normalizedPath, normalizedBaseUrl);
|
|
96
|
+
const query = params ? serializeQueryParams(params) : "";
|
|
97
|
+
if (query) url.search = query;
|
|
98
|
+
return url;
|
|
99
|
+
};
|
|
100
|
+
const isJsonContentType = (contentType) => {
|
|
101
|
+
return Boolean(contentType?.includes("application/json") || contentType?.includes("+json"));
|
|
102
|
+
};
|
|
103
|
+
const parseResponse = async (response) => {
|
|
104
|
+
const responseText = await response.text();
|
|
105
|
+
if (!responseText) return;
|
|
106
|
+
if (!isJsonContentType(response.headers.get("content-type"))) return responseText;
|
|
107
|
+
try {
|
|
108
|
+
return JSON.parse(responseText);
|
|
109
|
+
} catch {
|
|
110
|
+
return responseText;
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
const resolveBaseUrl = (service, override, serviceConfiguration, path) => {
|
|
114
|
+
const baseUrl = override?.baseUrl ?? serviceConfiguration?.baseUrl ?? (isAbsoluteUrl(path) ? new URL(path).origin : void 0);
|
|
115
|
+
if (!baseUrl) throw new Error(`Missing base URL for ${service} API request`);
|
|
116
|
+
return baseUrl;
|
|
117
|
+
};
|
|
118
|
+
const resolveFetchImplementation = (service, override, serviceConfiguration) => {
|
|
119
|
+
const fetchImplementation = override?.fetch ?? serviceConfiguration?.fetch;
|
|
120
|
+
if (!fetchImplementation && typeof fetch === "undefined") throw new Error(`Fetch is unavailable for ${service} API request`);
|
|
121
|
+
return fetchImplementation;
|
|
122
|
+
};
|
|
123
|
+
const resolveRequestConfiguration = (service, override, path) => {
|
|
124
|
+
const serviceConfiguration = serviceConfigurations.get(service);
|
|
125
|
+
const baseUrl = resolveBaseUrl(service, override, serviceConfiguration, path);
|
|
126
|
+
const fetchImplementation = resolveFetchImplementation(service, override, serviceConfiguration);
|
|
127
|
+
return {
|
|
128
|
+
baseUrl,
|
|
129
|
+
credentials: override?.credentials ?? serviceConfiguration?.credentials,
|
|
130
|
+
fetch: fetchImplementation,
|
|
131
|
+
getHeaders: override?.getHeaders ?? serviceConfiguration?.getHeaders,
|
|
132
|
+
onError: override?.onError ?? serviceConfiguration?.onError
|
|
133
|
+
};
|
|
134
|
+
};
|
|
135
|
+
const notifyError = (onError, error, service) => {
|
|
136
|
+
try {
|
|
137
|
+
onError?.(error, {
|
|
138
|
+
method: error.method,
|
|
139
|
+
service,
|
|
140
|
+
url: error.url
|
|
141
|
+
});
|
|
142
|
+
} catch {}
|
|
143
|
+
};
|
|
144
|
+
const executeFetch = async ({ configuration, headers, method, requestInit, service, url }) => {
|
|
145
|
+
try {
|
|
146
|
+
const requestOptions = {
|
|
147
|
+
...requestInit,
|
|
148
|
+
credentials: requestInit.credentials ?? configuration.credentials,
|
|
149
|
+
headers
|
|
150
|
+
};
|
|
151
|
+
const fetchImplementation = configuration.fetch;
|
|
152
|
+
if (fetchImplementation) return await fetchImplementation.call(globalThis, url, requestOptions);
|
|
153
|
+
return await fetch(url, requestOptions);
|
|
154
|
+
} catch (caughtError) {
|
|
155
|
+
const error = new ApiError({
|
|
156
|
+
cause: caughtError,
|
|
157
|
+
message: caughtError instanceof Error ? caughtError.message : "Network request failed",
|
|
158
|
+
method,
|
|
159
|
+
url: url.toString()
|
|
160
|
+
});
|
|
161
|
+
notifyError(configuration.onError, error, service);
|
|
162
|
+
throw error;
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
const executeApiRequest = async (service, path, options = {}) => {
|
|
166
|
+
const { apiClient, headers: requestHeaders, ...requestInit } = options;
|
|
167
|
+
const configuration = resolveRequestConfiguration(service, apiClient, path);
|
|
168
|
+
const url = buildRequestUrl({
|
|
169
|
+
baseUrl: configuration.baseUrl,
|
|
170
|
+
path
|
|
171
|
+
});
|
|
172
|
+
const headers = new Headers(await configuration.getHeaders?.());
|
|
173
|
+
new Headers(requestHeaders).forEach((value, key) => {
|
|
174
|
+
headers.set(key, value);
|
|
175
|
+
});
|
|
176
|
+
const method = requestInit.method ?? "GET";
|
|
177
|
+
const response = await executeFetch({
|
|
178
|
+
configuration,
|
|
179
|
+
headers,
|
|
180
|
+
method,
|
|
181
|
+
requestInit,
|
|
182
|
+
service,
|
|
183
|
+
url
|
|
184
|
+
});
|
|
185
|
+
const data = await parseResponse(response);
|
|
186
|
+
if (!response.ok) {
|
|
187
|
+
const error = new ApiError({
|
|
188
|
+
data,
|
|
189
|
+
message: getApiMessageFromData(data) || response.statusText || "Request failed",
|
|
190
|
+
method,
|
|
191
|
+
status: response.status,
|
|
192
|
+
url: url.toString()
|
|
193
|
+
});
|
|
194
|
+
notifyError(configuration.onError, error, service);
|
|
195
|
+
throw error;
|
|
196
|
+
}
|
|
197
|
+
return data;
|
|
198
|
+
};
|
|
199
|
+
//#endregion
|
|
200
|
+
export { executeApiRequest as n, configureApiClients as t };
|
|
201
|
+
|
|
202
|
+
//# sourceMappingURL=transport-CIfewyM7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-CIfewyM7.js","names":["isObject"],"sources":["../../schema/src/records.ts","../../client/src/transport.ts"],"sourcesContent":["import { Predicate } from \"effect\";\n\nexport const isRecord = Predicate.isObject;\n\n/** Keeps property lookup available on legacy payloads, including arrays. */\nexport const isObjectRecord = (\n value: unknown,\n): value is Record<string, unknown> => Predicate.isObjectOrArray(value);\n","import { isObjectRecord as isObject } from \"@lootlog/schema/records\";\n\nconst API_SERVICES = [\n \"activity\",\n \"auth\",\n \"battlelog\",\n \"main\",\n \"search\",\n] as const;\n\nexport type ApiService = (typeof API_SERVICES)[number];\n\ntype FetchImplementation = (\n input: RequestInfo | URL,\n init?: RequestInit,\n) => Promise<Response>;\n\nexport type ApiRequestContext = {\n method: string;\n service: ApiService;\n url: string;\n};\n\nexport type ApiServiceConfig = {\n baseUrl: string;\n credentials?: RequestCredentials;\n fetch?: FetchImplementation;\n getHeaders?: () => HeadersInit | Promise<HeadersInit>;\n onError?: (error: ApiError<unknown>, context: ApiRequestContext) => void;\n};\n\nexport type ApiClientOverride = Partial<ApiServiceConfig>;\n\nexport type ApiRequestOptions = RequestInit & {\n apiClient?: ApiClientOverride;\n};\n\nexport type ApiClientRequestOptions = ApiRequestOptions & {\n params?: RawQueryParameters;\n};\n\n// Query serialization preserves nested values and delegates scalar coercion to String.\ntype RawQueryParameters = Record<string, unknown>;\n\nexport type ApiClient = {\n get<T>(path: string, options?: ApiClientRequestOptions): Promise<T>;\n post<T>(\n path: string,\n body?: unknown,\n options?: ApiClientRequestOptions,\n ): Promise<T>;\n put<T>(\n path: string,\n body?: unknown,\n options?: ApiClientRequestOptions,\n ): Promise<T>;\n patch<T>(\n path: string,\n body?: unknown,\n options?: ApiClientRequestOptions,\n ): Promise<T>;\n delete<T>(path: string, options?: ApiClientRequestOptions): Promise<T>;\n};\n\nexport class ApiError<TData = unknown> extends Error {\n public readonly cause: unknown;\n public readonly status?: number;\n public readonly data: TData | undefined;\n public readonly url: string;\n public readonly method: string;\n\n public constructor({\n cause,\n data,\n message,\n method,\n status,\n url,\n }: {\n cause?: unknown;\n data?: TData;\n message: string;\n method: string;\n status?: number;\n url: string;\n }) {\n super(message);\n this.cause = cause;\n this.name = \"ApiError\";\n this.status = status;\n this.data = data;\n this.url = url;\n this.method = method;\n }\n}\n\nconst serviceConfigurations = new Map<ApiService, ApiServiceConfig>();\n\nconst configurationRegistrations: Array<{\n configurations: Partial<Record<ApiService, ApiServiceConfig>>;\n}> = [];\n\nconst rebuildServiceConfigurations = (): void => {\n serviceConfigurations.clear();\n\n for (const registration of configurationRegistrations) {\n for (const service of API_SERVICES) {\n const configuration = registration.configurations[service];\n\n if (configuration) {\n serviceConfigurations.set(service, configuration);\n }\n }\n }\n};\n\nexport const configureApiClients = (\n configurations: Partial<Record<ApiService, ApiServiceConfig>>,\n) => {\n const registration = { configurations };\n configurationRegistrations.push(registration);\n rebuildServiceConfigurations();\n\n let restored = false;\n\n return () => {\n if (restored) {\n return;\n }\n\n restored = true;\n const registrationIndex = configurationRegistrations.indexOf(registration);\n\n if (registrationIndex !== -1) {\n configurationRegistrations.splice(registrationIndex, 1);\n rebuildServiceConfigurations();\n }\n };\n};\n\nconst getApiMessageFromData = (data: unknown): string | undefined => {\n if (typeof data === \"string\") {\n return data.trim() || undefined;\n }\n\n if (!isObject(data)) {\n return undefined;\n }\n\n const rawMessage = data.message;\n const message = Array.isArray(rawMessage) ? rawMessage[0] : rawMessage;\n\n return typeof message === \"string\" ? message.trim() || undefined : undefined;\n};\n\nconst encodeQueryComponent = (value: string) => {\n return encodeURIComponent(value).replace(\n /[!'()*]/g,\n (character) => `%${character.charCodeAt(0).toString(16).toUpperCase()}`,\n );\n};\n\nconst appendQueryValue = (\n entries: string[],\n key: string,\n value: unknown,\n ancestors: Set<object>,\n): void => {\n if (value === null || value === undefined) {\n return;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n appendQueryValue(entries, key, item, ancestors);\n }\n\n return;\n }\n\n if (value instanceof Date) {\n entries.push(\n `${encodeQueryComponent(key)}=${encodeQueryComponent(value.toISOString())}`,\n );\n\n return;\n }\n\n if (isObject(value)) {\n if (ancestors.has(value)) {\n throw new RangeError(\"Cannot serialize circular query parameters\");\n }\n\n ancestors.add(value);\n\n for (const [nestedKey, nestedValue] of Object.entries(value)) {\n appendQueryValue(entries, `${key}[${nestedKey}]`, nestedValue, ancestors);\n }\n\n ancestors.delete(value);\n\n return;\n }\n\n entries.push(\n `${encodeQueryComponent(key)}=${encodeQueryComponent(String(value))}`,\n );\n};\n\nconst serializeQueryParams = (params: RawQueryParameters) => {\n const entries: string[] = [];\n const ancestors = new Set<object>();\n\n for (const [key, value] of Object.entries(params)) {\n appendQueryValue(entries, key, value, ancestors);\n }\n\n return entries.join(\"&\");\n};\n\nconst isAbsoluteUrl = (value: string) => {\n return /^[a-z][a-z\\d+.-]*:\\/\\//i.test(value);\n};\n\nconst buildRequestUrl = ({\n baseUrl,\n params,\n path,\n}: {\n baseUrl: string;\n params?: RawQueryParameters;\n path: string;\n}) => {\n const normalizedBaseUrl = baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n const normalizedPath = path.replace(/^\\/+/, \"\");\n\n const url = isAbsoluteUrl(path)\n ? new URL(path)\n : new URL(normalizedPath, normalizedBaseUrl);\n\n const query = params ? serializeQueryParams(params) : \"\";\n\n if (query) {\n url.search = query;\n }\n\n return url;\n};\n\nconst isJsonContentType = (contentType: string | null) => {\n return Boolean(\n contentType?.includes(\"application/json\") || contentType?.includes(\"+json\"),\n );\n};\n\nconst parseResponse = async (response: Response) => {\n const responseText = await response.text();\n\n if (!responseText) {\n return undefined;\n }\n\n if (!isJsonContentType(response.headers.get(\"content-type\"))) {\n return responseText;\n }\n\n try {\n const parsed: unknown = JSON.parse(responseText);\n\n return parsed;\n } catch {\n return responseText;\n }\n};\n\nconst isBinaryBody = (body: unknown): body is BodyInit => {\n return (\n typeof body === \"string\" ||\n (typeof Blob !== \"undefined\" && body instanceof Blob) ||\n (typeof FormData !== \"undefined\" && body instanceof FormData) ||\n (typeof URLSearchParams !== \"undefined\" &&\n body instanceof URLSearchParams) ||\n (typeof ArrayBuffer !== \"undefined\" && body instanceof ArrayBuffer) ||\n (typeof ArrayBuffer !== \"undefined\" && ArrayBuffer.isView(body))\n );\n};\n\nconst createRequestBody = (\n body: unknown,\n headers: Headers,\n): BodyInit | undefined => {\n if (body === undefined) {\n return undefined;\n }\n\n if (isBinaryBody(body)) {\n return body;\n }\n\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\");\n }\n\n return JSON.stringify(body);\n};\n\nconst resolveBaseUrl = (\n service: ApiService,\n override: ApiClientOverride | undefined,\n serviceConfiguration: ApiClientOverride | undefined,\n path: string,\n) => {\n const baseUrl =\n override?.baseUrl ??\n serviceConfiguration?.baseUrl ??\n (isAbsoluteUrl(path) ? new URL(path).origin : undefined);\n\n if (!baseUrl) {\n throw new Error(`Missing base URL for ${service} API request`);\n }\n\n return baseUrl;\n};\n\nconst resolveFetchImplementation = (\n service: ApiService,\n override: ApiClientOverride | undefined,\n serviceConfiguration: ApiClientOverride | undefined,\n) => {\n const fetchImplementation = override?.fetch ?? serviceConfiguration?.fetch;\n\n if (!fetchImplementation && typeof fetch === \"undefined\") {\n throw new Error(`Fetch is unavailable for ${service} API request`);\n }\n\n return fetchImplementation;\n};\n\nconst resolveRequestConfiguration = (\n service: ApiService,\n override: ApiClientOverride | undefined,\n path: string,\n) => {\n const serviceConfiguration = serviceConfigurations.get(service);\n const baseUrl = resolveBaseUrl(service, override, serviceConfiguration, path);\n\n const fetchImplementation = resolveFetchImplementation(\n service,\n override,\n serviceConfiguration,\n );\n\n return {\n baseUrl,\n credentials: override?.credentials ?? serviceConfiguration?.credentials,\n fetch: fetchImplementation,\n getHeaders: override?.getHeaders ?? serviceConfiguration?.getHeaders,\n onError: override?.onError ?? serviceConfiguration?.onError,\n };\n};\n\nconst notifyError = (\n onError: ApiServiceConfig[\"onError\"],\n error: ApiError<unknown>,\n service: ApiService,\n) => {\n try {\n onError?.(error, {\n method: error.method,\n service,\n url: error.url,\n });\n } catch {\n // Error observers must not replace the request error.\n }\n};\n\nconst executeFetch = async ({\n configuration,\n headers,\n method,\n requestInit,\n service,\n url,\n}: {\n configuration: ReturnType<typeof resolveRequestConfiguration>;\n headers: Headers;\n method: string;\n requestInit: RequestInit;\n service: ApiService;\n url: URL;\n}) => {\n try {\n const requestOptions = {\n ...requestInit,\n credentials: requestInit.credentials ?? configuration.credentials,\n headers,\n };\n\n const fetchImplementation = configuration.fetch;\n\n if (fetchImplementation) {\n return await fetchImplementation.call(globalThis, url, requestOptions);\n }\n\n return await fetch(url, requestOptions);\n } catch (caughtError) {\n const error = new ApiError({\n cause: caughtError,\n message:\n caughtError instanceof Error\n ? caughtError.message\n : \"Network request failed\",\n method,\n url: url.toString(),\n });\n\n notifyError(configuration.onError, error, service);\n throw error;\n }\n};\n\nexport const executeApiRequest = async <TData>(\n service: ApiService,\n path: string,\n options: ApiRequestOptions = {},\n): Promise<TData> => {\n const { apiClient, headers: requestHeaders, ...requestInit } = options;\n const configuration = resolveRequestConfiguration(service, apiClient, path);\n\n const url = buildRequestUrl({\n baseUrl: configuration.baseUrl,\n path,\n });\n\n const headers = new Headers(await configuration.getHeaders?.());\n\n new Headers(requestHeaders).forEach((value, key) => {\n headers.set(key, value);\n });\n\n const method = requestInit.method ?? \"GET\";\n\n const response = await executeFetch({\n configuration,\n headers,\n method,\n requestInit,\n service,\n url,\n });\n\n const data = await parseResponse(response);\n\n if (!response.ok) {\n const error = new ApiError({\n data,\n message:\n getApiMessageFromData(data) || response.statusText || \"Request failed\",\n method,\n status: response.status,\n url: url.toString(),\n });\n\n notifyError(configuration.onError, error, service);\n throw error;\n }\n\n // SAFETY: generated callers supply TData from the matching OpenAPI response contract.\n // This transport decodes content types; endpoint-specific validation belongs to the service contract.\n return data as TData;\n};\n\nconst requestWithBody = <TData>(\n service: ApiService,\n method: string,\n path: string,\n body: unknown,\n options: ApiClientRequestOptions = {},\n) => {\n try {\n const { params, ...requestOptions } = options;\n\n const configuration = resolveRequestConfiguration(\n service,\n requestOptions.apiClient,\n path,\n );\n\n const url = buildRequestUrl({\n baseUrl: configuration.baseUrl,\n params,\n path,\n });\n\n const headers = new Headers(requestOptions.headers);\n const requestBody = createRequestBody(body, headers);\n\n return executeApiRequest<TData>(service, url.toString(), {\n ...requestOptions,\n body: requestBody,\n headers,\n method,\n });\n } catch (error) {\n return Promise.reject(error);\n }\n};\n\nexport const createApiClient = (\n service: ApiService,\n overrides?: ApiClientOverride,\n): ApiClient => {\n const withOverrides = (\n options: ApiClientRequestOptions = {},\n ): ApiClientRequestOptions => ({\n ...options,\n apiClient: {\n ...overrides,\n ...options.apiClient,\n },\n });\n\n return {\n get: <TData>(path: string, options?: ApiClientRequestOptions) =>\n requestWithBody<TData>(\n service,\n \"GET\",\n path,\n undefined,\n withOverrides(options),\n ),\n post: <TData>(\n path: string,\n body?: unknown,\n options?: ApiClientRequestOptions,\n ) =>\n requestWithBody<TData>(\n service,\n \"POST\",\n path,\n body,\n withOverrides(options),\n ),\n put: <TData>(\n path: string,\n body?: unknown,\n options?: ApiClientRequestOptions,\n ) =>\n requestWithBody<TData>(\n service,\n \"PUT\",\n path,\n body,\n withOverrides(options),\n ),\n patch: <TData>(\n path: string,\n body?: unknown,\n options?: ApiClientRequestOptions,\n ) =>\n requestWithBody<TData>(\n service,\n \"PATCH\",\n path,\n body,\n withOverrides(options),\n ),\n delete: <TData>(path: string, options?: ApiClientRequestOptions) =>\n requestWithBody<TData>(\n service,\n \"DELETE\",\n path,\n undefined,\n withOverrides(options),\n ),\n };\n};\n\nexport const isApiError = (error: unknown): error is ApiError<unknown> => {\n return error instanceof ApiError;\n};\n\n/** Read a raw API error field without normalizing display text or array messages. */\nexport const getApiErrorStringField = (\n cause: unknown,\n field: \"message\" | \"code\" | \"notificationId\",\n): string | undefined => {\n if (!isApiError(cause) || !isObject(cause.data)) return undefined;\n const value = cause.data[field];\n\n return typeof value === \"string\" ? value : undefined;\n};\n\nexport const getApiErrorStatus = (error: unknown) => {\n if (isApiError(error)) {\n return error.status;\n }\n\n if (isObject(error) && typeof error.statusCode === \"number\") {\n return error.statusCode;\n }\n\n if (isObject(error) && typeof error.status === \"number\") {\n return error.status;\n }\n\n return undefined;\n};\n\nexport const getApiErrorMessage = (error: unknown) => {\n if (isApiError(error)) {\n return getApiMessageFromData(error.data) ?? error.message;\n }\n\n if (error instanceof Error && error.message.trim()) {\n return error.message;\n }\n\n return undefined;\n};\n"],"mappings":"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"}
|