@lgriffin/esi.ts 7.4.0 → 9.0.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.
Files changed (348) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +100 -24
  3. package/dist/EsiClient.d.ts +3 -0
  4. package/dist/EsiClient.d.ts.map +1 -1
  5. package/dist/EsiClientBuilder.d.ts +1 -0
  6. package/dist/EsiClientBuilder.d.ts.map +1 -1
  7. package/dist/clients/AllianceClient.d.ts +3 -0
  8. package/dist/clients/AllianceClient.d.ts.map +1 -1
  9. package/dist/clients/BaseEsiClient.d.ts +1 -1
  10. package/dist/clients/BaseEsiClient.d.ts.map +1 -1
  11. package/dist/clients/CalendarClient.d.ts +3 -0
  12. package/dist/clients/CalendarClient.d.ts.map +1 -1
  13. package/dist/clients/CharacterClient.d.ts +10 -2
  14. package/dist/clients/CharacterClient.d.ts.map +1 -1
  15. package/dist/clients/ClonesClient.d.ts +2 -0
  16. package/dist/clients/ClonesClient.d.ts.map +1 -1
  17. package/dist/clients/ContactsClient.d.ts +7 -0
  18. package/dist/clients/ContactsClient.d.ts.map +1 -1
  19. package/dist/clients/CorporationsClient.d.ts +18 -0
  20. package/dist/clients/CorporationsClient.d.ts.map +1 -1
  21. package/dist/clients/FittingsClient.d.ts +2 -0
  22. package/dist/clients/FittingsClient.d.ts.map +1 -1
  23. package/dist/clients/FleetClient.d.ts +3 -0
  24. package/dist/clients/FleetClient.d.ts.map +1 -1
  25. package/dist/clients/IndustryClient.d.ts +9 -0
  26. package/dist/clients/IndustryClient.d.ts.map +1 -1
  27. package/dist/clients/LoyaltyClient.d.ts +3 -0
  28. package/dist/clients/LoyaltyClient.d.ts.map +1 -1
  29. package/dist/clients/MailClient.d.ts +6 -0
  30. package/dist/clients/MailClient.d.ts.map +1 -1
  31. package/dist/clients/MarketClient.d.ts +13 -22
  32. package/dist/clients/MarketClient.d.ts.map +1 -1
  33. package/dist/clients/PiClient.d.ts +3 -0
  34. package/dist/clients/PiClient.d.ts.map +1 -1
  35. package/dist/clients/SkillsClient.d.ts +2 -0
  36. package/dist/clients/SkillsClient.d.ts.map +1 -1
  37. package/dist/clients/WalletClient.d.ts +1 -0
  38. package/dist/clients/WalletClient.d.ts.map +1 -1
  39. package/dist/clients/WarsClient.d.ts +3 -0
  40. package/dist/clients/WarsClient.d.ts.map +1 -1
  41. package/dist/config/jest/globalSetup.d.ts.map +1 -1
  42. package/dist/config/jest/globalTeardown.d.ts.map +1 -1
  43. package/dist/core/ApiClient.d.ts +14 -6
  44. package/dist/core/ApiClient.d.ts.map +1 -1
  45. package/dist/core/ApiRequestHandler.d.ts +3 -11
  46. package/dist/core/ApiRequestHandler.d.ts.map +1 -1
  47. package/dist/core/IDeduplicator.d.ts +6 -0
  48. package/dist/core/IDeduplicator.d.ts.map +1 -0
  49. package/dist/core/IRetryStrategy.d.ts +5 -0
  50. package/dist/core/IRetryStrategy.d.ts.map +1 -0
  51. package/dist/core/RequestDeduplicator.d.ts +2 -1
  52. package/dist/core/RequestDeduplicator.d.ts.map +1 -1
  53. package/dist/core/RetryStrategy.d.ts +19 -0
  54. package/dist/core/RetryStrategy.d.ts.map +1 -0
  55. package/dist/core/circuitBreaker/CircuitBreaker.d.ts +11 -1
  56. package/dist/core/circuitBreaker/CircuitBreaker.d.ts.map +1 -1
  57. package/dist/core/circuitBreaker/ICircuitBreaker.d.ts +23 -0
  58. package/dist/core/circuitBreaker/ICircuitBreaker.d.ts.map +1 -0
  59. package/dist/core/configureApiClient.d.ts +18 -0
  60. package/dist/core/configureApiClient.d.ts.map +1 -0
  61. package/dist/core/endpoints/EndpointDefinition.d.ts +2 -0
  62. package/dist/core/endpoints/EndpointDefinition.d.ts.map +1 -1
  63. package/dist/core/endpoints/calendarEndpoints.d.ts +1 -1
  64. package/dist/core/endpoints/characterEndpoints.d.ts +3 -3
  65. package/dist/core/endpoints/contactEndpoints.d.ts +7 -3
  66. package/dist/core/endpoints/contactEndpoints.d.ts.map +1 -1
  67. package/dist/core/endpoints/corporationEndpoints.d.ts +4 -1
  68. package/dist/core/endpoints/corporationEndpoints.d.ts.map +1 -1
  69. package/dist/core/endpoints/createClient.d.ts +18 -1
  70. package/dist/core/endpoints/createClient.d.ts.map +1 -1
  71. package/dist/core/endpoints/dogmaEndpoints.d.ts +17 -0
  72. package/dist/core/endpoints/dogmaEndpoints.d.ts.map +1 -1
  73. package/dist/core/endpoints/esi-scopes.generated.d.ts +1 -1
  74. package/dist/core/endpoints/esi-scopes.generated.d.ts.map +1 -1
  75. package/dist/core/endpoints/fleetEndpoints.d.ts +5 -0
  76. package/dist/core/endpoints/fleetEndpoints.d.ts.map +1 -1
  77. package/dist/core/endpoints/mailEndpoints.d.ts +13 -0
  78. package/dist/core/endpoints/mailEndpoints.d.ts.map +1 -1
  79. package/dist/core/endpoints/marketEndpoints.d.ts +29 -48
  80. package/dist/core/endpoints/marketEndpoints.d.ts.map +1 -1
  81. package/dist/core/endpoints/piEndpoints.d.ts +3 -0
  82. package/dist/core/endpoints/piEndpoints.d.ts.map +1 -1
  83. package/dist/core/endpoints/universeEndpoints.d.ts +13 -2
  84. package/dist/core/endpoints/universeEndpoints.d.ts.map +1 -1
  85. package/dist/core/endpoints/walletEndpoints.d.ts +4 -0
  86. package/dist/core/endpoints/walletEndpoints.d.ts.map +1 -1
  87. package/dist/core/logger/logger.d.ts +2 -1
  88. package/dist/core/logger/logger.d.ts.map +1 -1
  89. package/dist/core/pagination/AsyncPaginationIterator.d.ts +4 -1
  90. package/dist/core/pagination/AsyncPaginationIterator.d.ts.map +1 -1
  91. package/dist/core/pagination/CursorPaginationHandler.d.ts +15 -6
  92. package/dist/core/pagination/CursorPaginationHandler.d.ts.map +1 -1
  93. package/dist/core/pagination/PaginationHandler.d.ts +7 -6
  94. package/dist/core/pagination/PaginationHandler.d.ts.map +1 -1
  95. package/dist/core/rateLimiter/RateLimiter.d.ts +8 -2
  96. package/dist/core/rateLimiter/RateLimiter.d.ts.map +1 -1
  97. package/dist/core/requestPipeline/cachePolicy.d.ts +31 -0
  98. package/dist/core/requestPipeline/cachePolicy.d.ts.map +1 -0
  99. package/dist/core/requestPipeline/dependencies.d.ts +10 -0
  100. package/dist/core/requestPipeline/dependencies.d.ts.map +1 -0
  101. package/dist/core/requestPipeline/fetchExecution.d.ts +28 -0
  102. package/dist/core/requestPipeline/fetchExecution.d.ts.map +1 -0
  103. package/dist/core/requestPipeline/headers.d.ts +11 -0
  104. package/dist/core/requestPipeline/headers.d.ts.map +1 -0
  105. package/dist/core/requestPipeline/index.d.ts +10 -0
  106. package/dist/core/requestPipeline/index.d.ts.map +1 -0
  107. package/dist/core/requestPipeline/middlewareBridge.d.ts +15 -0
  108. package/dist/core/requestPipeline/middlewareBridge.d.ts.map +1 -0
  109. package/dist/core/requestPipeline/paginationOrchestration.d.ts +15 -0
  110. package/dist/core/requestPipeline/paginationOrchestration.d.ts.map +1 -0
  111. package/dist/core/requestPipeline/statusHandling.d.ts +18 -0
  112. package/dist/core/requestPipeline/statusHandling.d.ts.map +1 -0
  113. package/dist/core/util/error.d.ts +6 -1
  114. package/dist/core/util/error.d.ts.map +1 -1
  115. package/dist/errors.d.ts +4 -0
  116. package/dist/errors.d.ts.map +1 -0
  117. package/dist/errors.js +196 -0
  118. package/dist/errors.js.map +1 -0
  119. package/dist/errors.mjs +146 -0
  120. package/dist/errors.mjs.map +1 -0
  121. package/dist/index.d.ts +9 -2
  122. package/dist/index.d.ts.map +1 -1
  123. package/dist/index.js +9937 -176
  124. package/dist/index.js.map +1 -0
  125. package/dist/index.mjs +9834 -0
  126. package/dist/index.mjs.map +1 -0
  127. package/dist/schemas/calendar.d.ts +1 -1
  128. package/dist/schemas/character.d.ts +1 -10
  129. package/dist/schemas/character.d.ts.map +1 -1
  130. package/dist/schemas/common.d.ts +9 -0
  131. package/dist/schemas/common.d.ts.map +1 -1
  132. package/dist/schemas/contacts.d.ts +2 -1
  133. package/dist/schemas/contacts.d.ts.map +1 -1
  134. package/dist/schemas/corporation.d.ts +4 -9
  135. package/dist/schemas/corporation.d.ts.map +1 -1
  136. package/dist/schemas/dogma.d.ts +17 -0
  137. package/dist/schemas/dogma.d.ts.map +1 -1
  138. package/dist/schemas/fleet.d.ts +1 -0
  139. package/dist/schemas/fleet.d.ts.map +1 -1
  140. package/dist/schemas/index.js +2085 -46
  141. package/dist/schemas/index.js.map +1 -0
  142. package/dist/schemas/index.mjs +1914 -0
  143. package/dist/schemas/index.mjs.map +1 -0
  144. package/dist/schemas/market.d.ts +91 -4
  145. package/dist/schemas/market.d.ts.map +1 -1
  146. package/dist/schemas/pi.d.ts +3 -0
  147. package/dist/schemas/pi.d.ts.map +1 -1
  148. package/dist/schemas/sovereignty.d.ts +2 -0
  149. package/dist/schemas/sovereignty.d.ts.map +1 -1
  150. package/dist/schemas/universe.d.ts +11 -2
  151. package/dist/schemas/universe.d.ts.map +1 -1
  152. package/dist/schemas/wallet.d.ts +2 -0
  153. package/dist/schemas/wallet.d.ts.map +1 -1
  154. package/dist/testing/TestDataFactory.d.ts.map +1 -1
  155. package/dist/testing/index.d.ts +2 -0
  156. package/dist/testing/index.d.ts.map +1 -0
  157. package/dist/testing/index.js +935 -0
  158. package/dist/testing/index.js.map +1 -0
  159. package/dist/testing/index.mjs +898 -0
  160. package/dist/testing/index.mjs.map +1 -0
  161. package/dist/types/character.d.ts +2 -1
  162. package/dist/types/character.d.ts.map +1 -1
  163. package/dist/types/generated/esi-spec.generated.d.ts +3 -3
  164. package/dist/types/generated/esi-spec.generated.d.ts.map +1 -1
  165. package/dist/types/generated/spec-alignment.check.d.ts +9 -0
  166. package/dist/types/generated/spec-alignment.check.d.ts.map +1 -1
  167. package/dist/types/market.d.ts +7 -1
  168. package/dist/types/market.d.ts.map +1 -1
  169. package/package.json +33 -6
  170. package/dist/EsiClient.js +0 -251
  171. package/dist/EsiClientBuilder.js +0 -217
  172. package/dist/clients/AccessListsClient.js +0 -20
  173. package/dist/clients/AllianceClient.js +0 -72
  174. package/dist/clients/AssetsClient.js +0 -81
  175. package/dist/clients/BaseEsiClient.js +0 -40
  176. package/dist/clients/CalendarClient.js +0 -54
  177. package/dist/clients/CharacterClient.js +0 -149
  178. package/dist/clients/ClonesClient.js +0 -31
  179. package/dist/clients/ContactsClient.js +0 -104
  180. package/dist/clients/ContractsClient.js +0 -111
  181. package/dist/clients/CorporationsClient.js +0 -227
  182. package/dist/clients/DogmaClient.js +0 -55
  183. package/dist/clients/FactionClient.js +0 -79
  184. package/dist/clients/FittingsClient.js +0 -42
  185. package/dist/clients/FleetClient.js +0 -162
  186. package/dist/clients/FreelanceJobsClient.js +0 -76
  187. package/dist/clients/IncursionsClient.js +0 -19
  188. package/dist/clients/IndustryClient.js +0 -88
  189. package/dist/clients/InsuranceClient.js +0 -19
  190. package/dist/clients/KillmailsClient.js +0 -47
  191. package/dist/clients/LocationClient.js +0 -41
  192. package/dist/clients/LoyaltyClient.js +0 -30
  193. package/dist/clients/MailClient.js +0 -108
  194. package/dist/clients/MarketClient.js +0 -131
  195. package/dist/clients/MercenaryClient.js +0 -27
  196. package/dist/clients/MetaClient.js +0 -56
  197. package/dist/clients/PiClient.js +0 -51
  198. package/dist/clients/RouteClient.js +0 -24
  199. package/dist/clients/SearchClient.js +0 -22
  200. package/dist/clients/SkillsClient.js +0 -41
  201. package/dist/clients/SkyhooksClient.js +0 -35
  202. package/dist/clients/SovereigntyClient.js +0 -27
  203. package/dist/clients/StatusClient.js +0 -19
  204. package/dist/clients/UiClient.js +0 -58
  205. package/dist/clients/UniverseClient.js +0 -277
  206. package/dist/clients/WalletClient.js +0 -82
  207. package/dist/clients/WarsClient.js +0 -37
  208. package/dist/config/configManager.js +0 -47
  209. package/dist/config/jest/globalSetup.js +0 -7
  210. package/dist/config/jest/globalTeardown.js +0 -7
  211. package/dist/config/jest/jest.setup.js +0 -29
  212. package/dist/core/ApiClient.js +0 -123
  213. package/dist/core/ApiClientBuilder.js +0 -54
  214. package/dist/core/ApiRequestHandler.js +0 -444
  215. package/dist/core/BatchRequestHandler.js +0 -66
  216. package/dist/core/ClientRegistry.js +0 -116
  217. package/dist/core/EsiDiagnostics.js +0 -47
  218. package/dist/core/RequestDeduplicator.js +0 -26
  219. package/dist/core/cache/ETagCacheManager.js +0 -184
  220. package/dist/core/cache/ICache.js +0 -2
  221. package/dist/core/circuitBreaker/CircuitBreaker.js +0 -156
  222. package/dist/core/constants.js +0 -7
  223. package/dist/core/endpoints/EndpointDefinition.js +0 -2
  224. package/dist/core/endpoints/accessListEndpoints.js +0 -13
  225. package/dist/core/endpoints/allianceEndpoints.js +0 -34
  226. package/dist/core/endpoints/assetEndpoints.js +0 -51
  227. package/dist/core/endpoints/buildEndpointPath.js +0 -44
  228. package/dist/core/endpoints/calendarEndpoints.js +0 -35
  229. package/dist/core/endpoints/characterEndpoints.js +0 -104
  230. package/dist/core/endpoints/cloneEndpoints.js +0 -21
  231. package/dist/core/endpoints/contactEndpoints.js +0 -72
  232. package/dist/core/endpoints/contractEndpoints.js +0 -70
  233. package/dist/core/endpoints/corporationEndpoints.js +0 -161
  234. package/dist/core/endpoints/createClient.js +0 -175
  235. package/dist/core/endpoints/dogmaEndpoints.js +0 -40
  236. package/dist/core/endpoints/esi-cache-ttls.generated.js +0 -133
  237. package/dist/core/endpoints/esi-rate-limit-groups.generated.js +0 -153
  238. package/dist/core/endpoints/esi-scopes.generated.js +0 -135
  239. package/dist/core/endpoints/factionEndpoints.js +0 -57
  240. package/dist/core/endpoints/fittingEndpoints.js +0 -27
  241. package/dist/core/endpoints/fleetEndpoints.js +0 -101
  242. package/dist/core/endpoints/freelanceJobsEndpoints.js +0 -51
  243. package/dist/core/endpoints/incursionEndpoints.js +0 -13
  244. package/dist/core/endpoints/industryEndpoints.js +0 -61
  245. package/dist/core/endpoints/insuranceEndpoints.js +0 -13
  246. package/dist/core/endpoints/killmailEndpoints.js +0 -28
  247. package/dist/core/endpoints/locationEndpoints.js +0 -27
  248. package/dist/core/endpoints/loyaltyEndpoints.js +0 -21
  249. package/dist/core/endpoints/mailEndpoints.js +0 -68
  250. package/dist/core/endpoints/marketEndpoints.js +0 -84
  251. package/dist/core/endpoints/mercenaryEndpoints.js +0 -19
  252. package/dist/core/endpoints/metaEndpoints.js +0 -12
  253. package/dist/core/endpoints/piEndpoints.js +0 -36
  254. package/dist/core/endpoints/routeEndpoints.js +0 -14
  255. package/dist/core/endpoints/searchEndpoints.js +0 -14
  256. package/dist/core/endpoints/skillEndpoints.js +0 -29
  257. package/dist/core/endpoints/skyhookEndpoints.js +0 -25
  258. package/dist/core/endpoints/sovereigntyEndpoints.js +0 -19
  259. package/dist/core/endpoints/statusEndpoints.js +0 -12
  260. package/dist/core/endpoints/uiEndpoints.js +0 -39
  261. package/dist/core/endpoints/universeEndpoints.js +0 -210
  262. package/dist/core/endpoints/walletEndpoints.js +0 -50
  263. package/dist/core/endpoints/warEndpoints.js +0 -28
  264. package/dist/core/logger/ILogger.js +0 -2
  265. package/dist/core/logger/logger.js +0 -16
  266. package/dist/core/logger/loggerUtil.js +0 -30
  267. package/dist/core/middleware/Middleware.js +0 -42
  268. package/dist/core/pagination/AsyncPaginationIterator.js +0 -27
  269. package/dist/core/pagination/CursorPaginationHandler.js +0 -148
  270. package/dist/core/pagination/PaginationHandler.js +0 -115
  271. package/dist/core/rateLimiter/IRateLimiter.js +0 -2
  272. package/dist/core/rateLimiter/RateLimiter.js +0 -307
  273. package/dist/core/util/error.js +0 -122
  274. package/dist/core/util/headersUtil.js +0 -37
  275. package/dist/core/util/retry.js +0 -9
  276. package/dist/core/util/sleep.js +0 -6
  277. package/dist/core/util/stringUtil.js +0 -6
  278. package/dist/core/util/testHelpers.js +0 -9
  279. package/dist/core/util/validation.js +0 -52
  280. package/dist/schemas/access-lists.js +0 -14
  281. package/dist/schemas/alliance.js +0 -28
  282. package/dist/schemas/assets.js +0 -26
  283. package/dist/schemas/calendar.js +0 -43
  284. package/dist/schemas/character.js +0 -122
  285. package/dist/schemas/clones.js +0 -21
  286. package/dist/schemas/common.js +0 -34
  287. package/dist/schemas/contacts.js +0 -15
  288. package/dist/schemas/contracts.js +0 -58
  289. package/dist/schemas/corporation.js +0 -192
  290. package/dist/schemas/dogma.js +0 -42
  291. package/dist/schemas/faction-warfare.js +0 -92
  292. package/dist/schemas/fittings.js +0 -15
  293. package/dist/schemas/fleet.js +0 -48
  294. package/dist/schemas/freelance-jobs.js +0 -99
  295. package/dist/schemas/incursions.js +0 -14
  296. package/dist/schemas/industry.js +0 -75
  297. package/dist/schemas/insurance.js +0 -12
  298. package/dist/schemas/killmails.js +0 -42
  299. package/dist/schemas/location.js +0 -20
  300. package/dist/schemas/loyalty.js +0 -20
  301. package/dist/schemas/mail.js +0 -38
  302. package/dist/schemas/market.js +0 -39
  303. package/dist/schemas/mercenary.js +0 -22
  304. package/dist/schemas/pi.js +0 -85
  305. package/dist/schemas/skills.js +0 -30
  306. package/dist/schemas/skyhooks.js +0 -30
  307. package/dist/schemas/sovereignty.js +0 -70
  308. package/dist/schemas/status.js +0 -10
  309. package/dist/schemas/universe.js +0 -245
  310. package/dist/schemas/wallet.js +0 -29
  311. package/dist/schemas/wars.js +0 -31
  312. package/dist/testing/TestDataFactory.js +0 -823
  313. package/dist/types/access-lists.js +0 -2
  314. package/dist/types/alliance.js +0 -2
  315. package/dist/types/api-responses.js +0 -73
  316. package/dist/types/assets.js +0 -2
  317. package/dist/types/branded.js +0 -6
  318. package/dist/types/calendar.js +0 -2
  319. package/dist/types/character.js +0 -2
  320. package/dist/types/clones.js +0 -2
  321. package/dist/types/common.js +0 -2
  322. package/dist/types/contacts.js +0 -2
  323. package/dist/types/contracts.js +0 -2
  324. package/dist/types/corporation.js +0 -2
  325. package/dist/types/dogma.js +0 -2
  326. package/dist/types/faction-warfare.js +0 -2
  327. package/dist/types/fittings.js +0 -2
  328. package/dist/types/fleet.js +0 -2
  329. package/dist/types/freelance-jobs.js +0 -2
  330. package/dist/types/generated/esi-spec.generated.js +0 -6
  331. package/dist/types/generated/spec-alignment.check.js +0 -14
  332. package/dist/types/incursions.js +0 -2
  333. package/dist/types/industry.js +0 -2
  334. package/dist/types/insurance.js +0 -2
  335. package/dist/types/killmails.js +0 -2
  336. package/dist/types/location.js +0 -2
  337. package/dist/types/loyalty.js +0 -2
  338. package/dist/types/mail.js +0 -2
  339. package/dist/types/market.js +0 -2
  340. package/dist/types/mercenary.js +0 -2
  341. package/dist/types/pi.js +0 -2
  342. package/dist/types/skills.js +0 -2
  343. package/dist/types/skyhooks.js +0 -2
  344. package/dist/types/sovereignty.js +0 -2
  345. package/dist/types/status.js +0 -2
  346. package/dist/types/universe.js +0 -2
  347. package/dist/types/wallet.js +0 -2
  348. package/dist/types/wars.js +0 -2
@@ -1,115 +0,0 @@
1
- "use strict";
2
- /**
3
- * Pagination Handler for ESI API calls
4
- * Handles pagination with proper error handling and empty page detection
5
- */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.PaginationHandler = void 0;
8
- const loggerUtil_1 = require("../logger/loggerUtil");
9
- const constants_1 = require("../constants");
10
- const sleep_1 = require("../util/sleep");
11
- class PaginationHandler {
12
- static DEFAULT_OPTIONS = {
13
- maxPages: 1000, // Reasonable limit to prevent infinite loops
14
- maxRetries: 3,
15
- retryDelayMs: 1000,
16
- stopOnEmptyPage: true,
17
- };
18
- /**
19
- * Fetch remaining pages (2..totalPages) and combine with first page data.
20
- * The caller has already fetched page 1 and knows the total page count.
21
- */
22
- static async fetchRemainingPages(client, endpoint, method, requiresAuth, firstPageData, totalPages, body, options = {}, pageFetch, templatePath) {
23
- const opts = { ...this.DEFAULT_OPTIONS, ...options };
24
- const rateLimiter = client.getRateLimiter();
25
- const allData = [...firstPageData];
26
- const effectiveMaxPage = Math.min(totalPages, opts.maxPages);
27
- if (effectiveMaxPage <= 1) {
28
- return allData;
29
- }
30
- (0, loggerUtil_1.logInfo)(`Fetching pages 2-${effectiveMaxPage} for ${endpoint}...`);
31
- let consecutiveFailures = 0;
32
- for (let page = 2; page <= effectiveMaxPage; page++) {
33
- try {
34
- if (rateLimiter)
35
- await rateLimiter.checkRateLimit(templatePath, method);
36
- const pageData = await this.fetchPageWithRetry(client, endpoint, method, page, requiresAuth, body, opts, pageFetch);
37
- consecutiveFailures = 0;
38
- if (opts.stopOnEmptyPage && (!pageData || pageData.length === 0)) {
39
- (0, loggerUtil_1.logWarn)(`Page ${page} is empty. Stopping pagination.`);
40
- break;
41
- }
42
- allData.push(...pageData);
43
- (0, loggerUtil_1.logInfo)(`Fetched page ${page}/${effectiveMaxPage} (${pageData.length} items)`);
44
- }
45
- catch (error) {
46
- consecutiveFailures++;
47
- (0, loggerUtil_1.logError)(`Failed to fetch page ${page}: ${error instanceof Error ? error.message : String(error)}`);
48
- if (consecutiveFailures >= opts.maxRetries) {
49
- (0, loggerUtil_1.logWarn)(`${consecutiveFailures} consecutive failures. Stopping pagination.`);
50
- break;
51
- }
52
- }
53
- }
54
- (0, loggerUtil_1.logInfo)(`Pagination complete. Fetched ${allData.length} total items from up to ${effectiveMaxPage} pages.`);
55
- return allData;
56
- }
57
- /**
58
- * Fetch a single page with retry logic
59
- */
60
- static async fetchPageWithRetry(client, endpoint, method, page, requiresAuth, body, options, pageFetch) {
61
- let lastError = null;
62
- for (let attempt = 1; attempt <= options.maxRetries; attempt++) {
63
- try {
64
- return await this.fetchSinglePage(client, endpoint, method, page, requiresAuth, body, pageFetch);
65
- }
66
- catch (error) {
67
- lastError = error;
68
- (0, loggerUtil_1.logWarn)(`Attempt ${attempt}/${options.maxRetries} failed for page ${page}: ${error instanceof Error ? error.message : String(error)}`);
69
- if (attempt < options.maxRetries) {
70
- await (0, sleep_1.sleep)(options.retryDelayMs * attempt);
71
- }
72
- }
73
- }
74
- throw (lastError ||
75
- new Error(`Failed to fetch page ${page} after ${options.maxRetries} attempts`));
76
- }
77
- /**
78
- * Fetch a single page.
79
- * Preserves any existing query params on the endpoint and appends page=N.
80
- */
81
- static async fetchSinglePage(client, endpoint, method, page, requiresAuth, body, pageFetch) {
82
- const separator = endpoint.includes('?') ? '&' : '?';
83
- const paginatedEndpoint = `${endpoint}${separator}page=${page}`;
84
- if (pageFetch) {
85
- (0, loggerUtil_1.logInfo)(`Fetching page ${page} via pipeline: ${paginatedEndpoint}`);
86
- return pageFetch(paginatedEndpoint);
87
- }
88
- const url = `${client.getLink()}/${paginatedEndpoint}`;
89
- (0, loggerUtil_1.logInfo)(`Fetching page ${page}: ${url}`);
90
- const response = await fetch(url, {
91
- method,
92
- headers: {
93
- accept: 'gzip, deflate, br',
94
- 'User-Agent': constants_1.USER_AGENT,
95
- 'X-Compatibility-Date': constants_1.COMPATIBILITY_DATE,
96
- ...(requiresAuth
97
- ? { Authorization: client.getAuthorizationHeader() }
98
- : {}),
99
- },
100
- body: body ? JSON.stringify(body) : undefined,
101
- });
102
- if (!response.ok) {
103
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
104
- }
105
- let data;
106
- try {
107
- data = (await response.json());
108
- }
109
- catch (jsonError) {
110
- throw new Error(`Invalid JSON response for page ${page}: ${jsonError instanceof Error ? jsonError.message : String(jsonError)}`);
111
- }
112
- return Array.isArray(data) ? data : [data];
113
- }
114
- }
115
- exports.PaginationHandler = PaginationHandler;
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,307 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RateLimiter = void 0;
4
- const esi_rate_limit_groups_generated_1 = require("../endpoints/esi-rate-limit-groups.generated");
5
- const stringUtil_1 = require("../util/stringUtil");
6
- const loggerUtil_1 = require("../logger/loggerUtil");
7
- const sleep_1 = require("../util/sleep");
8
- function getTokenCost(statusCode) {
9
- if (statusCode >= 200 && statusCode < 300)
10
- return 2;
11
- if (statusCode >= 300 && statusCode < 400)
12
- return 1;
13
- if (statusCode >= 400 && statusCode < 500)
14
- return 5;
15
- if (statusCode >= 500 && statusCode < 600)
16
- return 0;
17
- return 2;
18
- }
19
- const DEFAULT_WINDOW_MS = 900_000;
20
- class RateLimiter {
21
- minDelayMs;
22
- decelerationThreshold;
23
- userKeyExtractor;
24
- lastRequestTime = 0;
25
- isTestMode = false;
26
- errorLimitRemain = 100;
27
- errorLimitReset = 0;
28
- defaultBuckets = new Map();
29
- userBuckets = null;
30
- fallbackBucket;
31
- lastCleanup = 0;
32
- static CLEANUP_INTERVAL_MS = 60_000;
33
- constructor(config) {
34
- this.minDelayMs = config?.minDelayMs ?? 50;
35
- this.decelerationThreshold = config?.decelerationThreshold ?? 0.2;
36
- this.userKeyExtractor = config?.userKeyExtractor;
37
- if (this.userKeyExtractor) {
38
- this.userBuckets = new Map();
39
- }
40
- this.fallbackBucket = this.createFallbackBucket();
41
- }
42
- createFallbackBucket() {
43
- return {
44
- group: '__fallback__',
45
- remaining: -1,
46
- limit: 0,
47
- used: 0,
48
- windowSizeMs: DEFAULT_WINDOW_MS,
49
- blockedUntil: 0,
50
- lastUpdated: 0,
51
- };
52
- }
53
- createBucketFromSpec(spec) {
54
- return {
55
- group: spec.group,
56
- remaining: spec.maxTokens,
57
- limit: spec.maxTokens,
58
- used: 0,
59
- windowSizeMs: spec.windowSizeMs,
60
- blockedUntil: 0,
61
- lastUpdated: 0,
62
- };
63
- }
64
- createBucketForGroup(groupName) {
65
- return {
66
- group: groupName,
67
- remaining: -1,
68
- limit: 0,
69
- used: 0,
70
- windowSizeMs: DEFAULT_WINDOW_MS,
71
- blockedUntil: 0,
72
- lastUpdated: 0,
73
- };
74
- }
75
- lookupGroupSpec(method, templatePath) {
76
- if (!templatePath || !method)
77
- return undefined;
78
- const normalized = templatePath
79
- .replace(/\/$/, '')
80
- .replace(/\{(\w+)\}/g, (_, name) => `{${(0, stringUtil_1.camelToSnake)(name)}}`);
81
- const key = `${method}:${normalized}`;
82
- return esi_rate_limit_groups_generated_1.esiRateLimitGroups[key];
83
- }
84
- resolveBucketMap(requestHeaders) {
85
- if (!this.userBuckets || !this.userKeyExtractor || !requestHeaders) {
86
- return this.defaultBuckets;
87
- }
88
- const userKey = this.userKeyExtractor(requestHeaders);
89
- let userSet = this.userBuckets.get(userKey);
90
- if (!userSet) {
91
- userSet = { groups: new Map(), lastAccessed: Date.now() };
92
- this.userBuckets.set(userKey, userSet);
93
- }
94
- userSet.lastAccessed = Date.now();
95
- return userSet.groups;
96
- }
97
- getBucket(templatePath, method, requestHeaders, groupNameOverride) {
98
- const bucketMap = this.resolveBucketMap(requestHeaders);
99
- const spec = this.lookupGroupSpec(method, templatePath);
100
- const groupName = groupNameOverride ?? spec?.group;
101
- if (!groupName)
102
- return this.fallbackBucket;
103
- let bucket = bucketMap.get(groupName);
104
- if (!bucket) {
105
- bucket = spec
106
- ? this.createBucketFromSpec(spec)
107
- : this.createBucketForGroup(groupName);
108
- bucketMap.set(groupName, bucket);
109
- }
110
- return bucket;
111
- }
112
- cleanupStaleUsers() {
113
- if (!this.userBuckets)
114
- return;
115
- const now = Date.now();
116
- if (now - this.lastCleanup < RateLimiter.CLEANUP_INTERVAL_MS)
117
- return;
118
- this.lastCleanup = now;
119
- for (const [userKey, userSet] of this.userBuckets) {
120
- if (now - userSet.lastAccessed > DEFAULT_WINDOW_MS) {
121
- this.userBuckets.delete(userKey);
122
- }
123
- }
124
- }
125
- updateFromResponse(headers, statusCode, templatePath, method, requestHeaders) {
126
- if (this.isTestMode)
127
- return;
128
- const responseGroup = headers['x-ratelimit-group'] || undefined;
129
- const bucket = this.getBucket(templatePath, method, requestHeaders, responseGroup);
130
- if ('x-ratelimit-remaining' in headers) {
131
- bucket.remaining = parseInt(headers['x-ratelimit-remaining'], 10);
132
- }
133
- if ('x-ratelimit-limit' in headers) {
134
- bucket.limit = parseInt(headers['x-ratelimit-limit'], 10);
135
- }
136
- if ('x-ratelimit-used' in headers) {
137
- bucket.used = parseInt(headers['x-ratelimit-used'], 10);
138
- }
139
- bucket.lastUpdated = Date.now();
140
- if ('retry-after' in headers) {
141
- const retrySeconds = parseInt(headers['retry-after'], 10);
142
- bucket.blockedUntil = Date.now() + retrySeconds * 1000;
143
- }
144
- if (statusCode === 420 || statusCode === 429) {
145
- if (bucket.blockedUntil <= Date.now()) {
146
- bucket.blockedUntil = Date.now() + 60_000;
147
- }
148
- }
149
- if ('x-esi-error-limit-remain' in headers) {
150
- this.errorLimitRemain = parseInt(headers['x-esi-error-limit-remain'], 10);
151
- }
152
- if ('x-esi-error-limit-reset' in headers) {
153
- this.errorLimitReset = parseInt(headers['x-esi-error-limit-reset'], 10);
154
- }
155
- }
156
- updateRateLimitInfo(headers) {
157
- this.updateFromResponse(headers, 200);
158
- }
159
- async checkRateLimit(templatePath, method, requestHeaders) {
160
- if (this.isTestMode)
161
- return;
162
- this.cleanupStaleUsers();
163
- const bucket = this.getBucket(templatePath, method, requestHeaders);
164
- const now = Date.now();
165
- if (bucket.blockedUntil > now) {
166
- const waitTime = bucket.blockedUntil - now;
167
- (0, loggerUtil_1.logWarn)(`[ESI Rate Limit] Group '${bucket.group}' blocked for ${Math.ceil(waitTime / 1000)}s (420/429 received)`);
168
- await (0, sleep_1.sleep)(waitTime);
169
- bucket.blockedUntil = 0;
170
- return;
171
- }
172
- if (this.errorLimitRemain <= 10 && this.errorLimitRemain > 0) {
173
- const resetMs = this.errorLimitReset * 1000;
174
- const delay = Math.min(resetMs, 5000);
175
- if (delay > 0) {
176
- (0, loggerUtil_1.logWarn)(`[ESI Rate Limit] Legacy error limit low (${this.errorLimitRemain}), waiting ${delay}ms`);
177
- await (0, sleep_1.sleep)(delay);
178
- return;
179
- }
180
- }
181
- if (this.errorLimitRemain <= 0 && this.errorLimitReset > 0) {
182
- const waitTime = this.errorLimitReset * 1000;
183
- (0, loggerUtil_1.logWarn)(`[ESI Rate Limit] Legacy error limit exhausted, waiting ${Math.ceil(waitTime / 1000)}s`);
184
- await (0, sleep_1.sleep)(waitTime);
185
- return;
186
- }
187
- if (bucket.remaining >= 0 && bucket.limit > 0) {
188
- const ratio = bucket.remaining / bucket.limit;
189
- if (bucket.remaining <= 0) {
190
- (0, loggerUtil_1.logWarn)(`[ESI Rate Limit] Group '${bucket.group}' token bucket empty, waiting 1s`);
191
- await (0, sleep_1.sleep)(1000);
192
- return;
193
- }
194
- if (ratio <= this.decelerationThreshold) {
195
- const extraDelay = Math.ceil((1 - ratio / this.decelerationThreshold) * 1000);
196
- await (0, sleep_1.sleep)(extraDelay);
197
- return;
198
- }
199
- }
200
- await this.enforceMinDelay();
201
- }
202
- async enforceMinDelay() {
203
- if (this.isTestMode) {
204
- this.lastRequestTime = Date.now();
205
- return;
206
- }
207
- const now = Date.now();
208
- const timeSinceLastRequest = now - this.lastRequestTime;
209
- if (timeSinceLastRequest < this.minDelayMs) {
210
- await (0, sleep_1.sleep)(this.minDelayMs - timeSinceLastRequest);
211
- }
212
- this.lastRequestTime = Date.now();
213
- }
214
- getStatus() {
215
- let worstBucket = this.fallbackBucket;
216
- let worstRatio = Infinity;
217
- const checkBucket = (bucket) => {
218
- if (bucket.limit > 0) {
219
- const ratio = bucket.remaining / bucket.limit;
220
- if (ratio < worstRatio) {
221
- worstRatio = ratio;
222
- worstBucket = bucket;
223
- }
224
- }
225
- };
226
- for (const bucket of this.defaultBuckets.values()) {
227
- checkBucket(bucket);
228
- }
229
- if (this.userBuckets) {
230
- for (const userSet of this.userBuckets.values()) {
231
- for (const bucket of userSet.groups.values()) {
232
- checkBucket(bucket);
233
- }
234
- }
235
- }
236
- return {
237
- remaining: worstBucket.remaining,
238
- limit: worstBucket.limit,
239
- used: worstBucket.used,
240
- group: worstBucket.group === '__fallback__' ? null : worstBucket.group,
241
- errorLimitRemain: this.errorLimitRemain,
242
- errorLimitReset: this.errorLimitReset,
243
- retryAfter: worstBucket.blockedUntil > Date.now()
244
- ? Math.ceil((worstBucket.blockedUntil - Date.now()) / 1000)
245
- : null,
246
- blockedUntil: worstBucket.blockedUntil,
247
- };
248
- }
249
- getGroupStatus(group) {
250
- const bucket = this.defaultBuckets.get(group);
251
- if (!bucket)
252
- return undefined;
253
- return {
254
- group: bucket.group,
255
- remaining: bucket.remaining,
256
- limit: bucket.limit,
257
- used: bucket.used,
258
- windowSizeMs: bucket.windowSizeMs,
259
- blockedUntil: bucket.blockedUntil,
260
- };
261
- }
262
- getAllGroupStatuses() {
263
- const result = new Map();
264
- for (const [name, bucket] of this.defaultBuckets) {
265
- result.set(name, {
266
- group: bucket.group,
267
- remaining: bucket.remaining,
268
- limit: bucket.limit,
269
- used: bucket.used,
270
- windowSizeMs: bucket.windowSizeMs,
271
- blockedUntil: bucket.blockedUntil,
272
- });
273
- }
274
- return result;
275
- }
276
- static getTokenCost(statusCode) {
277
- return getTokenCost(statusCode);
278
- }
279
- isBlocked(group) {
280
- const now = Date.now();
281
- if (group) {
282
- const bucket = this.defaultBuckets.get(group);
283
- return bucket ? bucket.blockedUntil > now : false;
284
- }
285
- if (this.fallbackBucket.blockedUntil > now)
286
- return true;
287
- for (const bucket of this.defaultBuckets.values()) {
288
- if (bucket.blockedUntil > now)
289
- return true;
290
- }
291
- return false;
292
- }
293
- setTestMode(enabled) {
294
- this.isTestMode = enabled;
295
- }
296
- reset() {
297
- this.defaultBuckets.clear();
298
- if (this.userBuckets)
299
- this.userBuckets.clear();
300
- this.fallbackBucket = this.createFallbackBucket();
301
- this.errorLimitRemain = 100;
302
- this.errorLimitReset = 0;
303
- this.lastRequestTime = 0;
304
- this.lastCleanup = 0;
305
- }
306
- }
307
- exports.RateLimiter = RateLimiter;
@@ -1,122 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EsiValidationError = exports.buildError = exports.TimeoutError = exports.EsiError = void 0;
4
- exports.isEsiError = isEsiError;
5
- exports.isRateLimited = isRateLimited;
6
- exports.isNotFound = isNotFound;
7
- exports.isUnauthorized = isUnauthorized;
8
- exports.isForbidden = isForbidden;
9
- exports.isServerError = isServerError;
10
- exports.isTimeout = isTimeout;
11
- exports.isRetryable = isRetryable;
12
- exports.isValidationError = isValidationError;
13
- function sanitizeUrl(url) {
14
- if (!url)
15
- return url;
16
- try {
17
- const parsed = new URL(url);
18
- const sensitiveParams = ['token', 'access_token', 'api_key'];
19
- for (const param of sensitiveParams) {
20
- if (parsed.searchParams.has(param)) {
21
- parsed.searchParams.set(param, '[REDACTED]');
22
- }
23
- }
24
- return parsed.toString();
25
- }
26
- catch {
27
- const qIndex = url.indexOf('?');
28
- return qIndex >= 0 ? url.substring(0, qIndex) + '?[params-redacted]' : url;
29
- }
30
- }
31
- class EsiError extends Error {
32
- statusCode;
33
- requestId;
34
- url;
35
- constructor(statusCode, message, url, requestId) {
36
- super(message);
37
- this.statusCode = statusCode;
38
- this.requestId = requestId;
39
- this.name = 'EsiError';
40
- this.url = sanitizeUrl(url);
41
- }
42
- isRateLimited() {
43
- return this.statusCode === 420 || this.statusCode === 429;
44
- }
45
- isNotFound() {
46
- return this.statusCode === 404;
47
- }
48
- isUnauthorized() {
49
- return this.statusCode === 401;
50
- }
51
- isForbidden() {
52
- return this.statusCode === 403;
53
- }
54
- isServerError() {
55
- return this.statusCode >= 500;
56
- }
57
- isTimeout() {
58
- return this.statusCode === 0;
59
- }
60
- get retryable() {
61
- return (this.statusCode === 0 ||
62
- this.statusCode === 420 ||
63
- this.statusCode === 429 ||
64
- this.statusCode === 502 ||
65
- this.statusCode === 503 ||
66
- this.statusCode === 504);
67
- }
68
- }
69
- exports.EsiError = EsiError;
70
- function isEsiError(error) {
71
- return error instanceof EsiError;
72
- }
73
- function isRateLimited(error) {
74
- return error instanceof EsiError && error.isRateLimited();
75
- }
76
- function isNotFound(error) {
77
- return error instanceof EsiError && error.isNotFound();
78
- }
79
- function isUnauthorized(error) {
80
- return error instanceof EsiError && error.isUnauthorized();
81
- }
82
- function isForbidden(error) {
83
- return error instanceof EsiError && error.isForbidden();
84
- }
85
- function isServerError(error) {
86
- return error instanceof EsiError && error.isServerError();
87
- }
88
- class TimeoutError extends EsiError {
89
- timeoutMs;
90
- constructor(timeoutMs, url, requestId) {
91
- super(0, `Request timed out after ${timeoutMs}ms`, url, requestId);
92
- this.timeoutMs = timeoutMs;
93
- this.name = 'TimeoutError';
94
- }
95
- }
96
- exports.TimeoutError = TimeoutError;
97
- function isTimeout(error) {
98
- return error instanceof TimeoutError;
99
- }
100
- function isRetryable(error) {
101
- return error instanceof EsiError && error.retryable;
102
- }
103
- const buildError = (message, type = 'ERROR', url) => {
104
- const error = new Error(`[${type}] ${message}`);
105
- if (url) {
106
- error.url = url;
107
- }
108
- return error;
109
- };
110
- exports.buildError = buildError;
111
- class EsiValidationError extends EsiError {
112
- validationError;
113
- constructor(url, zodError, requestId) {
114
- super(0, `Response validation failed for ${url}`, url, requestId);
115
- this.name = 'EsiValidationError';
116
- this.validationError = zodError;
117
- }
118
- }
119
- exports.EsiValidationError = EsiValidationError;
120
- function isValidationError(error) {
121
- return error instanceof EsiValidationError;
122
- }
@@ -1,37 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseWarning = parseWarning;
4
- exports.parseHeaders = parseHeaders;
5
- function parseWarning(value) {
6
- if (!value)
7
- return null;
8
- const match = /^(\d{3}) - "([^"]+)"$/.exec(value) ??
9
- /^(\d{3}) - ([^ ].+[^ ])$/.exec(value);
10
- if (!match)
11
- return null;
12
- const [, code, message] = match;
13
- return { code: parseInt(code, 10), message: message };
14
- }
15
- function parseHeaders(fetchHeaders) {
16
- const raw = {};
17
- fetchHeaders.forEach((value, key) => {
18
- raw[key.toLowerCase()] = value;
19
- });
20
- const cursorBefore = raw['x-cursor-before'] ?? null;
21
- const cursorAfter = raw['x-cursor-after'] ?? null;
22
- return {
23
- raw,
24
- xPages: parseInt(raw['x-pages'] ?? '1', 10),
25
- etag: raw['etag'] ?? null,
26
- cacheControl: raw['cache-control'] ?? null,
27
- expires: raw['expires'] ?? null,
28
- lastModified: raw['last-modified'] ?? null,
29
- cursorBefore,
30
- cursorAfter,
31
- hasCursorPagination: 'x-cursor-before' in raw || 'x-cursor-after' in raw,
32
- warning: parseWarning(raw['warning']),
33
- requestId: raw['x-esi-request-id'] ?? null,
34
- date: raw['date'] ?? null,
35
- contentLanguage: raw['content-language'] ?? null,
36
- };
37
- }
@@ -1,9 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.retryDelay = retryDelay;
4
- function retryDelay(attempt, baseMs, maxMs) {
5
- const exponential = baseMs * Math.pow(2, attempt);
6
- // eslint-disable-next-line sonarjs/pseudo-random
7
- const jitter = exponential * (0.75 + Math.random() * 0.5);
8
- return Math.min(jitter, maxMs);
9
- }
@@ -1,6 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.sleep = sleep;
4
- function sleep(ms) {
5
- return new Promise((resolve) => setTimeout(resolve, ms));
6
- }
@@ -1,6 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.camelToSnake = camelToSnake;
4
- function camelToSnake(s) {
5
- return s.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`);
6
- }
@@ -1,9 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getBody = void 0;
4
- /* eslint-disable @typescript-eslint/no-explicit-any */
5
- const getBody = async (apiCall) => {
6
- return apiCall();
7
- };
8
- exports.getBody = getBody;
9
- /* eslint-enable @typescript-eslint/no-explicit-any */
@@ -1,52 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.validatePathParam = validatePathParam;
4
- exports.validateBaseUrl = validateBaseUrl;
5
- exports.validateQueryParam = validateQueryParam;
6
- const error_1 = require("./error");
7
- const UNSAFE_PATH_CHARS = /[/\\?#@!$&'()*+,;=<>{}|^`]/;
8
- function validatePathParam(paramName, value) {
9
- if (value === null || value === undefined || value === '') {
10
- throw (0, error_1.buildError)(`Path parameter '${paramName}' must not be empty`, 'VALIDATION_ERROR');
11
- }
12
- const str = `${value}`;
13
- if (UNSAFE_PATH_CHARS.test(str)) {
14
- throw (0, error_1.buildError)(`Path parameter '${paramName}' contains invalid characters`, 'VALIDATION_ERROR');
15
- }
16
- if (typeof value === 'number' && !Number.isFinite(value)) {
17
- throw (0, error_1.buildError)(`Path parameter '${paramName}' must be a finite number`, 'VALIDATION_ERROR');
18
- }
19
- return str;
20
- }
21
- const ALLOWED_ESI_HOSTS = ['esi.evetech.net'];
22
- function validateBaseUrl(url, allowCustomHost) {
23
- let parsed;
24
- try {
25
- parsed = new URL(url);
26
- }
27
- catch {
28
- throw (0, error_1.buildError)(`Invalid base URL: ${url}`, 'VALIDATION_ERROR');
29
- }
30
- if (parsed.protocol !== 'https:') {
31
- throw (0, error_1.buildError)('Base URL must use HTTPS protocol', 'VALIDATION_ERROR');
32
- }
33
- if (!allowCustomHost && !ALLOWED_ESI_HOSTS.includes(parsed.hostname)) {
34
- throw (0, error_1.buildError)(`Base URL host '${parsed.hostname}' is not in the allowlist. ` +
35
- `Allowed hosts: ${ALLOWED_ESI_HOSTS.join(', ')}. ` +
36
- `Set unsafeAllowCustomHost to bypass this check.`, 'VALIDATION_ERROR');
37
- }
38
- return url.replace(/\/$/, '');
39
- }
40
- function validateQueryParam(paramName, value) {
41
- if (value === null || value === undefined) {
42
- throw (0, error_1.buildError)(`Query parameter '${paramName}' must not be null or undefined`, 'VALIDATION_ERROR');
43
- }
44
- const str = `${value}`;
45
- if (typeof value === 'number' && !Number.isFinite(value)) {
46
- throw (0, error_1.buildError)(`Query parameter '${paramName}' must be a finite number`, 'VALIDATION_ERROR');
47
- }
48
- if (str.length > 2000) {
49
- throw (0, error_1.buildError)(`Query parameter '${paramName}' exceeds maximum length`, 'VALIDATION_ERROR');
50
- }
51
- return str;
52
- }
@@ -1,14 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AccessListSchema = exports.AccessListEntrySchema = void 0;
4
- const zod_1 = require("zod");
5
- exports.AccessListEntrySchema = zod_1.z.looseObject({
6
- entity_id: zod_1.z.number(),
7
- entity_type: zod_1.z.enum(['character', 'corporation', 'alliance']),
8
- access_type: zod_1.z.enum(['allowed', 'blocked']),
9
- });
10
- exports.AccessListSchema = zod_1.z.looseObject({
11
- access_list_id: zod_1.z.number(),
12
- name: zod_1.z.string(),
13
- entries: zod_1.z.array(exports.AccessListEntrySchema),
14
- });