@lgriffin/esi.ts 10.0.0 → 10.2.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 (255) hide show
  1. package/CHANGELOG.md +142 -0
  2. package/README.md +14 -5
  3. package/dist/EsiClient.d.mts +140 -0
  4. package/dist/EsiClientBuilder.d.mts +75 -0
  5. package/dist/auth/EsiTokenManager.d.mts +200 -0
  6. package/dist/auth/EveSsoClient.d.mts +88 -0
  7. package/dist/auth/errors.d.mts +42 -0
  8. package/dist/auth/index.d.mts +14 -0
  9. package/dist/auth/jwt.d.mts +43 -0
  10. package/dist/auth/pkce.d.mts +21 -0
  11. package/dist/auth/storage/FileTokenStorage.d.mts +44 -0
  12. package/dist/auth/storage/MemoryTokenStorage.d.mts +18 -0
  13. package/dist/auth/types.d.mts +42 -0
  14. package/dist/{chunk-7A72QFDF.mjs → chunk-D5L5HZVF.mjs} +3 -2
  15. package/dist/chunk-D5L5HZVF.mjs.map +1 -0
  16. package/dist/{chunk-HPSACXX3.js → chunk-XIB2OXEZ.js} +3 -2
  17. package/dist/chunk-XIB2OXEZ.js.map +1 -0
  18. package/dist/clients/AccessListsClient.d.mts +25 -0
  19. package/dist/clients/AllianceClient.d.mts +59 -0
  20. package/dist/clients/AssetsClient.d.mts +65 -0
  21. package/dist/clients/BaseEsiClient.d.mts +19 -0
  22. package/dist/clients/CalendarClient.d.mts +48 -0
  23. package/dist/clients/CharacterClient.d.mts +134 -0
  24. package/dist/clients/ClonesClient.d.mts +27 -0
  25. package/dist/clients/ContactsClient.d.mts +96 -0
  26. package/dist/clients/ContractsClient.d.mts +91 -0
  27. package/dist/clients/CorporationProjectsClient.d.mts +54 -0
  28. package/dist/clients/CorporationsClient.d.mts +219 -0
  29. package/dist/clients/CosmeticsClient.d.mts +11 -0
  30. package/dist/clients/DogmaClient.d.mts +42 -0
  31. package/dist/clients/FactionClient.d.mts +60 -0
  32. package/dist/clients/FittingsClient.d.mts +38 -0
  33. package/dist/clients/FleetClient.d.mts +134 -0
  34. package/dist/clients/FreelanceJobsClient.d.mts +61 -0
  35. package/dist/clients/IncursionsClient.d.mts +14 -0
  36. package/dist/clients/IndustryClient.d.mts +86 -0
  37. package/dist/clients/InsuranceClient.d.mts +14 -0
  38. package/dist/clients/KillmailsClient.d.mts +37 -0
  39. package/dist/clients/LocationClient.d.mts +32 -0
  40. package/dist/clients/LoyaltyClient.d.mts +28 -0
  41. package/dist/clients/MailClient.d.mts +104 -0
  42. package/dist/clients/MarketClient.d.mts +102 -0
  43. package/dist/clients/MercenaryClient.d.mts +42 -0
  44. package/dist/clients/MetaClient.d.mts +45 -0
  45. package/dist/clients/MilitaryCampaignsClient.d.mts +53 -0
  46. package/dist/clients/ParagonHubClient.d.mts +13 -0
  47. package/dist/clients/PiClient.d.mts +45 -0
  48. package/dist/clients/RouteClient.d.mts +25 -0
  49. package/dist/clients/SearchClient.d.mts +17 -0
  50. package/dist/clients/SkillsClient.d.mts +39 -0
  51. package/dist/clients/SkyhooksClient.d.mts +48 -0
  52. package/dist/clients/SovereigntyClient.d.mts +20 -0
  53. package/dist/clients/StatusClient.d.mts +14 -0
  54. package/dist/clients/UiClient.d.mts +44 -0
  55. package/dist/clients/UniverseClient.d.mts +212 -0
  56. package/dist/clients/WalletClient.d.mts +70 -0
  57. package/dist/clients/WarsClient.d.mts +33 -0
  58. package/dist/core/ApiClient.d.mts +73 -0
  59. package/dist/core/ApiClientBuilder.d.mts +24 -0
  60. package/dist/core/ApiRequestHandler.d.ts.map +1 -1
  61. package/dist/core/BatchRequestHandler.d.mts +12 -0
  62. package/dist/core/ClientRegistry.d.mts +45 -0
  63. package/dist/core/EsiDiagnostics.d.mts +35 -0
  64. package/dist/core/IDeduplicator.d.mts +22 -0
  65. package/dist/core/IDeduplicator.d.ts +16 -0
  66. package/dist/core/IDeduplicator.d.ts.map +1 -1
  67. package/dist/core/IRetryStrategy.d.mts +5 -0
  68. package/dist/core/RequestDeduplicator.d.mts +21 -0
  69. package/dist/core/RequestDeduplicator.d.ts +11 -0
  70. package/dist/core/RequestDeduplicator.d.ts.map +1 -1
  71. package/dist/core/RetryStrategy.d.mts +21 -0
  72. package/dist/core/cache/ETagCacheManager.d.mts +75 -0
  73. package/dist/core/cache/ICache.d.mts +27 -0
  74. package/dist/core/cache/cacheKey.d.ts +11 -0
  75. package/dist/core/cache/cacheKey.d.ts.map +1 -1
  76. package/dist/core/circuitBreaker/CircuitBreaker.d.mts +52 -0
  77. package/dist/core/circuitBreaker/CircuitBreaker.d.ts.map +1 -1
  78. package/dist/core/circuitBreaker/ICircuitBreaker.d.mts +23 -0
  79. package/dist/core/configureApiClient.d.mts +18 -0
  80. package/dist/core/constants.d.ts +2 -2
  81. package/dist/core/endpoints/EndpointDefinition.d.mts +63 -0
  82. package/dist/core/endpoints/accessListEndpoints.d.mts +34 -0
  83. package/dist/core/endpoints/allianceEndpoints.d.mts +43 -0
  84. package/dist/core/endpoints/assetEndpoints.d.mts +76 -0
  85. package/dist/core/endpoints/buildEndpointPath.d.mts +7 -0
  86. package/dist/core/endpoints/calendarEndpoints.d.mts +54 -0
  87. package/dist/core/endpoints/characterEndpoints.d.mts +185 -0
  88. package/dist/core/endpoints/cloneEndpoints.d.mts +32 -0
  89. package/dist/core/endpoints/contactEndpoints.d.mts +106 -0
  90. package/dist/core/endpoints/contractEndpoints.d.mts +168 -0
  91. package/dist/core/endpoints/corporationEndpoints.d.mts +324 -0
  92. package/dist/core/endpoints/corporationProjectEndpoints.d.mts +102 -0
  93. package/dist/core/endpoints/cosmeticsEndpoints.d.mts +52 -0
  94. package/dist/core/endpoints/createClient.d.mts +69 -0
  95. package/dist/core/endpoints/dogmaEndpoints.d.mts +89 -0
  96. package/dist/core/endpoints/esi-cache-ttls.generated.d.ts.map +1 -1
  97. package/dist/core/endpoints/esi-rate-limit-groups.generated.d.mts +7 -0
  98. package/dist/core/endpoints/esi-rate-limit-groups.generated.d.ts.map +1 -1
  99. package/dist/core/endpoints/esi-scopes.generated.d.mts +3 -0
  100. package/dist/core/endpoints/esi-scopes.generated.d.ts.map +1 -1
  101. package/dist/core/endpoints/factionEndpoints.d.mts +194 -0
  102. package/dist/core/endpoints/fittingEndpoints.d.mts +34 -0
  103. package/dist/core/endpoints/fleetEndpoints.d.mts +137 -0
  104. package/dist/core/endpoints/freelanceJobsEndpoints.d.mts +181 -0
  105. package/dist/core/endpoints/incursionEndpoints.d.mts +19 -0
  106. package/dist/core/endpoints/industryEndpoints.d.mts +138 -0
  107. package/dist/core/endpoints/insuranceEndpoints.d.mts +17 -0
  108. package/dist/core/endpoints/killmailEndpoints.d.mts +62 -0
  109. package/dist/core/endpoints/locationEndpoints.d.mts +37 -0
  110. package/dist/core/endpoints/loyaltyEndpoints.d.mts +32 -0
  111. package/dist/core/endpoints/mailEndpoints.d.mts +111 -0
  112. package/dist/core/endpoints/marketEndpoints.d.mts +191 -0
  113. package/dist/core/endpoints/mercenaryEndpoints.d.mts +79 -0
  114. package/dist/core/endpoints/metaEndpoints.d.mts +50 -0
  115. package/dist/core/endpoints/militaryCampaignEndpoints.d.mts +87 -0
  116. package/dist/core/endpoints/paragonHubEndpoints.d.mts +163 -0
  117. package/dist/core/endpoints/piEndpoints.d.mts +101 -0
  118. package/dist/core/endpoints/routeEndpoints.d.mts +14 -0
  119. package/dist/core/endpoints/searchEndpoints.d.mts +26 -0
  120. package/dist/core/endpoints/skillEndpoints.d.mts +52 -0
  121. package/dist/core/endpoints/skyhookEndpoints.d.mts +111 -0
  122. package/dist/core/endpoints/sovereigntyEndpoints.d.mts +59 -0
  123. package/dist/core/endpoints/statusEndpoints.d.mts +14 -0
  124. package/dist/core/endpoints/uiEndpoints.d.mts +43 -0
  125. package/dist/core/endpoints/universeEndpoints.d.mts +456 -0
  126. package/dist/core/endpoints/walletEndpoints.d.mts +98 -0
  127. package/dist/core/endpoints/warEndpoints.d.mts +51 -0
  128. package/dist/core/logger/DefaultLogger.d.mts +31 -0
  129. package/dist/core/logger/ILogger.d.mts +17 -0
  130. package/dist/core/logger/NoopLogger.d.mts +7 -0
  131. package/dist/core/logger/loggerUtil.d.mts +11 -0
  132. package/dist/core/middleware/Middleware.d.mts +30 -0
  133. package/dist/core/pagination/AsyncPaginationIterator.d.mts +12 -0
  134. package/dist/core/pagination/CursorPaginationHandler.d.mts +68 -0
  135. package/dist/core/rateLimiter/IRateLimiter.d.mts +27 -0
  136. package/dist/core/rateLimiter/RateLimiter.d.mts +62 -0
  137. package/dist/core/rateLimiter/RateLimiter.d.ts.map +1 -1
  138. package/dist/core/requestPipeline/cachePolicy.d.ts +11 -1
  139. package/dist/core/requestPipeline/cachePolicy.d.ts.map +1 -1
  140. package/dist/core/requestPipeline/fetchExecution.d.ts.map +1 -1
  141. package/dist/core/requestPipeline/index.d.ts +1 -1
  142. package/dist/core/requestPipeline/index.d.ts.map +1 -1
  143. package/dist/core/requestPipeline/paginationOrchestration.d.ts +1 -1
  144. package/dist/core/requestPipeline/paginationOrchestration.d.ts.map +1 -1
  145. package/dist/core/requestPipeline/statusHandling.d.ts +6 -0
  146. package/dist/core/requestPipeline/statusHandling.d.ts.map +1 -1
  147. package/dist/core/util/error.d.mts +37 -0
  148. package/dist/core/util/retry.d.mts +8 -0
  149. package/dist/core/util/retry.d.ts.map +1 -1
  150. package/dist/errors.d.mts +5 -0
  151. package/dist/errors.js +2 -2
  152. package/dist/errors.mjs +1 -1
  153. package/dist/index.d.mts +81 -0
  154. package/dist/index.js +373 -195
  155. package/dist/index.js.map +1 -1
  156. package/dist/index.mjs +266 -88
  157. package/dist/index.mjs.map +1 -1
  158. package/dist/schemas/access-lists.d.mts +16 -0
  159. package/dist/schemas/alliance.d.mts +26 -0
  160. package/dist/schemas/assets.d.mts +24 -0
  161. package/dist/schemas/calendar.d.mts +27 -0
  162. package/dist/schemas/character.d.mts +109 -0
  163. package/dist/schemas/clones.d.mts +17 -0
  164. package/dist/schemas/common.d.mts +74 -0
  165. package/dist/schemas/contacts.d.mts +14 -0
  166. package/dist/schemas/contracts.d.mts +104 -0
  167. package/dist/schemas/corporation-projects.d.mts +104 -0
  168. package/dist/schemas/corporation.d.mts +193 -0
  169. package/dist/schemas/cosmetics.d.mts +58 -0
  170. package/dist/schemas/dogma.d.mts +57 -0
  171. package/dist/schemas/esiEnum.d.mts +3 -0
  172. package/dist/schemas/faction-warfare.d.mts +203 -0
  173. package/dist/schemas/fittings.d.mts +13 -0
  174. package/dist/schemas/fleet.d.mts +37 -0
  175. package/dist/schemas/freelance-jobs.d.mts +171 -0
  176. package/dist/schemas/incursions.d.mts +12 -0
  177. package/dist/schemas/index.d.mts +39 -0
  178. package/dist/schemas/industry.d.mts +99 -0
  179. package/dist/schemas/insurance.d.mts +10 -0
  180. package/dist/schemas/killmails.d.mts +38 -0
  181. package/dist/schemas/location.d.mts +18 -0
  182. package/dist/schemas/loyalty.d.mts +18 -0
  183. package/dist/schemas/mail.d.mts +53 -0
  184. package/dist/schemas/market.d.mts +123 -0
  185. package/dist/schemas/mercenary.d.mts +74 -0
  186. package/dist/schemas/meta.d.mts +36 -0
  187. package/dist/schemas/military-campaigns.d.mts +26 -0
  188. package/dist/schemas/paragon-hub.d.mts +96 -0
  189. package/dist/schemas/pi.d.mts +71 -0
  190. package/dist/schemas/skills.d.mts +28 -0
  191. package/dist/schemas/skyhooks.d.mts +129 -0
  192. package/dist/schemas/sovereignty.d.mts +56 -0
  193. package/dist/schemas/status.d.mts +8 -0
  194. package/dist/schemas/universe.d.mts +285 -0
  195. package/dist/schemas/wallet.d.mts +45 -0
  196. package/dist/schemas/wars.d.mts +27 -0
  197. package/dist/sde/IStaticDataProvider.d.mts +106 -0
  198. package/dist/sde/MemorySdeProvider.d.mts +167 -0
  199. package/dist/sde/SdeDataProvider.d.mts +119 -0
  200. package/dist/sde/SdeTestDataFactory.d.mts +33 -0
  201. package/dist/sde/errors.d.mts +23 -0
  202. package/dist/sde/index.d.mts +9 -0
  203. package/dist/sde/memory.d.mts +8 -0
  204. package/dist/sde/types.d.mts +1039 -0
  205. package/dist/sde/version.d.mts +7 -0
  206. package/dist/testing/TestDataFactory.d.mts +172 -0
  207. package/dist/testing/index.d.mts +2 -0
  208. package/dist/testing/index.js +2 -2
  209. package/dist/testing/index.mjs +1 -1
  210. package/dist/types/access-lists.d.mts +5 -0
  211. package/dist/types/alliance.d.mts +7 -0
  212. package/dist/types/api-responses.d.mts +40 -0
  213. package/dist/types/assets.d.mts +6 -0
  214. package/dist/types/branded.d.mts +23 -0
  215. package/dist/types/calendar.d.mts +6 -0
  216. package/dist/types/character.d.mts +17 -0
  217. package/dist/types/clones.d.mts +4 -0
  218. package/dist/types/common.d.mts +19 -0
  219. package/dist/types/contacts.d.mts +5 -0
  220. package/dist/types/contracts.d.mts +9 -0
  221. package/dist/types/corporation-projects.d.mts +10 -0
  222. package/dist/types/corporation.d.mts +19 -0
  223. package/dist/types/cosmetics.d.mts +8 -0
  224. package/dist/types/dogma.d.mts +6 -0
  225. package/dist/types/faction-warfare.d.mts +17 -0
  226. package/dist/types/fittings.d.mts +4 -0
  227. package/dist/types/fleet.d.mts +7 -0
  228. package/dist/types/freelance-jobs.d.mts +12 -0
  229. package/dist/types/generated/esi-spec.generated.d.mts +2136 -0
  230. package/dist/types/generated/esi-spec.generated.d.ts +164 -16
  231. package/dist/types/generated/esi-spec.generated.d.ts.map +1 -1
  232. package/dist/types/generated/spec-alignment.check.d.ts +2 -2
  233. package/dist/types/incursions.d.mts +4 -0
  234. package/dist/types/industry.d.mts +11 -0
  235. package/dist/types/insurance.d.mts +4 -0
  236. package/dist/types/killmails.d.mts +5 -0
  237. package/dist/types/location.d.mts +6 -0
  238. package/dist/types/loyalty.d.mts +5 -0
  239. package/dist/types/mail.d.mts +6 -0
  240. package/dist/types/market.d.mts +12 -0
  241. package/dist/types/mercenary.d.mts +7 -0
  242. package/dist/types/meta.d.mts +9 -0
  243. package/dist/types/military-campaigns.d.mts +6 -0
  244. package/dist/types/paragon-hub.d.mts +8 -0
  245. package/dist/types/pi.d.mts +6 -0
  246. package/dist/types/skills.d.mts +5 -0
  247. package/dist/types/skyhooks.d.mts +8 -0
  248. package/dist/types/sovereignty.d.mts +6 -0
  249. package/dist/types/status.d.mts +4 -0
  250. package/dist/types/universe.d.mts +27 -0
  251. package/dist/types/wallet.d.mts +6 -0
  252. package/dist/types/wars.d.mts +4 -0
  253. package/package.json +92 -24
  254. package/dist/chunk-7A72QFDF.mjs.map +0 -1
  255. package/dist/chunk-HPSACXX3.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -5,6 +5,148 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [10.2.0](https://github.com/lgriffin/ESI.ts/compare/v10.1.1...v10.2.0) (2026-09-19)
9
+
10
+
11
+ ### Added
12
+
13
+ * **release:** attach a signed CycloneDX SBOM to each release ([bf6c045](https://github.com/lgriffin/ESI.ts/commit/bf6c0458b81fc9123ca29f712db8a89948e2b382))
14
+ * **release:** attach a signed CycloneDX SBOM to each release ([1e29d7d](https://github.com/lgriffin/ESI.ts/commit/1e29d7de39237ecd250dcac3ef90da54a9c52df3))
15
+
16
+
17
+ ### Testing
18
+
19
+ * **contract:** re-record ESI payloads whose shape changed ([2ea4198](https://github.com/lgriffin/ESI.ts/commit/2ea4198d8832d12618e9f9a9da0720ffb9b07f55))
20
+ * **contract:** recorded ESI payloads changed shape ([06fa27a](https://github.com/lgriffin/ESI.ts/commit/06fa27ab0516af9f9d450059cb0cb3fcd6463345))
21
+
22
+ ## [10.1.1](https://github.com/lgriffin/ESI.ts/compare/v10.1.0...v10.1.1) (2026-09-18)
23
+
24
+
25
+ ### Documentation
26
+
27
+ * **mutation:** record the first complete sharded run, and fix what it exposed ([7acf195](https://github.com/lgriffin/ESI.ts/commit/7acf1950d5781dad571e2f79e52d03324683f7bd))
28
+ * **mutation:** record the first complete sharded run, and fix what it exposed ([3209241](https://github.com/lgriffin/ESI.ts/commit/32092415c551cbc7cc75266fa7158ab884040aad))
29
+
30
+ ## [10.1.0](https://github.com/lgriffin/ESI.ts/compare/v10.0.0...v10.1.0) (2026-09-18)
31
+
32
+
33
+ ### Added
34
+
35
+ * **dedupe:** detach in-flight reads of a path a write has just changed ([0339db7](https://github.com/lgriffin/ESI.ts/commit/0339db70d2cd34827c5575f1d731006fa1500ea0))
36
+ * **dedupe:** detach in-flight reads of a path a write has just changed ([e3a3d91](https://github.com/lgriffin/ESI.ts/commit/e3a3d91d2ef74759245cd43affb2e109040bf221))
37
+ * **release:** verify what npm serves, not only what CI built ([999125c](https://github.com/lgriffin/ESI.ts/commit/999125cd2c167410cdba7f35590afe6b5fa025d8))
38
+ * **release:** verify what npm serves, not only what CI built ([281e008](https://github.com/lgriffin/ESI.ts/commit/281e008d9fd65e45619f73c6abeb7a48dbc70831))
39
+
40
+
41
+ ### Fixed
42
+
43
+ * add the composition and concurrency test tier and fix the five pipeline races it found ([c7a7642](https://github.com/lgriffin/ESI.ts/commit/c7a764213ebc34fc47bd8396863b4f8f7938f4a1))
44
+ * **bdd:** escape backslashes in the job summary's table cells ([751d098](https://github.com/lgriffin/ESI.ts/commit/751d098f4d2fa81c86c80e7a8e8221991c81495d))
45
+ * **benchmark:** keep the harness filter a substring and gate the soak heap trend on Node 20 ([d559157](https://github.com/lgriffin/ESI.ts/commit/d5591576dcdb2823a7df8e2692597b7fc92575fe))
46
+ * **cache:** do not store a read that a write overtook while it was in flight ([e2f3141](https://github.com/lgriffin/ESI.ts/commit/e2f3141b2a4713bf4a46c2ea58ad42e02bc40814))
47
+ * **cache:** keep the stored ETag when a late 304 names an older one ([bb63097](https://github.com/lgriffin/ESI.ts/commit/bb6309753938f8868fcb1ea9684d44989933086a))
48
+ * **cache:** refetch when a 304 arrives for an entry evicted in flight ([4ae476e](https://github.com/lgriffin/ESI.ts/commit/4ae476e9462ae1eac33569b9d4c70bb36ad545d3))
49
+ * **ci:** pack the downloaded dist with npm 11 ([7e7ff71](https://github.com/lgriffin/ESI.ts/commit/7e7ff7131a3b383cae3ae65c79f677a28f1369b7))
50
+ * **circuit-breaker:** count the call that opens half-open as the first probe ([b418625](https://github.com/lgriffin/ESI.ts/commit/b418625bbf7ade64217fde9970bd76229dbb8ffd))
51
+ * **circuit-breaker:** keep an open circuit open when an earlier call succeeds ([03b27a5](https://github.com/lgriffin/ESI.ts/commit/03b27a5e1e641ddcf015f5e08f1420966c60b4ce))
52
+ * **ci:** read the attw report from a file so CI gets the whole JSON ([dac266d](https://github.com/lgriffin/ESI.ts/commit/dac266d5ec13b5bb2ba13a0a6f7a94b25da0ba0c))
53
+ * **dedupe:** key in-flight requests by identity as well as endpoint ([5bab05c](https://github.com/lgriffin/ESI.ts/commit/5bab05c85cfb8067baecffd8e740f6c1c27b6629))
54
+ * **dedupe:** key in-flight requests by identity as well as endpoint ([5d662d9](https://github.com/lgriffin/ESI.ts/commit/5d662d9699aab9f9bb34af93a8fb5809a02ccde6))
55
+ * five defects found by new model-based property tests (circuit breaker, pagination cache, backoff) ([80fcafa](https://github.com/lgriffin/ESI.ts/commit/80fcafa5bb99aed93348c30722c090e526b85fb7))
56
+ * **generate:** generate from the compatibility date the client actually sends ([ff781bd](https://github.com/lgriffin/ESI.ts/commit/ff781bd54777b2c3fda5189772e431e4d9de3657))
57
+ * **generate:** generate from the compatibility date the client actually sends ([5ea4a2f](https://github.com/lgriffin/ESI.ts/commit/5ea4a2fe0891bcba5c3d08171bb3d858639ea3f4))
58
+ * **mutation:** escape backslashes in the job summary table cells ([9ab23fa](https://github.com/lgriffin/ESI.ts/commit/9ab23fa685f68288b138dad749aed9bf871c215f))
59
+ * **package:** ship ES module declarations for the import condition ([2090682](https://github.com/lgriffin/ESI.ts/commit/20906829b64a093e8d66e2b6890cf2bbadb012c7))
60
+ * **package:** ship ES module declarations for the import condition ([d53fe91](https://github.com/lgriffin/ESI.ts/commit/d53fe914a156faad1835c1e748cd500254e57b69))
61
+ * **pagination:** cache an authenticated paginated result under the token-scoped key ([23313ff](https://github.com/lgriffin/ESI.ts/commit/23313ff95cf45a043ce2c27ea61d483969701366))
62
+ * **pagination:** never revalidate page 1 alone when a later page exhausts its retries ([8c48085](https://github.com/lgriffin/ESI.ts/commit/8c48085366af3eeb278be8bf033b45e53d353962))
63
+ * **pipeline:** name the status when an error response has no reason phrase ([94827fb](https://github.com/lgriffin/ESI.ts/commit/94827fb5652d8e76b27d509eb3eabb2ae21c6ecc))
64
+ * **pipeline:** time out and retry a response body that stalls or resets ([8e8753f](https://github.com/lgriffin/ESI.ts/commit/8e8753f36c272cbd796f93a92776c8c3d3fd7d0a))
65
+ * **rate-limiter:** honour Retry-After given as an HTTP date ([1fb7cba](https://github.com/lgriffin/ESI.ts/commit/1fb7cba9a6b553f969fa2466f181018102d63bf3))
66
+ * **rate-limit:** keep the error-limit back-off when a late response reports budget left ([1c7279b](https://github.com/lgriffin/ESI.ts/commit/1c7279b9223702e64943e71bef3278488b4762d6))
67
+ * **release:** keep the canary off the shared npm cache ([8604246](https://github.com/lgriffin/ESI.ts/commit/86042464188ec6603f681d5564984275acd40866))
68
+ * **release:** publish the tarball that was tested and signed ([8c7c25f](https://github.com/lgriffin/ESI.ts/commit/8c7c25f77413349eca764f542015e944a55f738f))
69
+ * **release:** publish the tarball that was tested and signed ([c4ac638](https://github.com/lgriffin/ESI.ts/commit/c4ac6389a1844ddddc37fb7d380377e296e90ba1))
70
+ * **retry:** return a zero backoff instead of NaN past attempt 1023 ([ae36c02](https://github.com/lgriffin/ESI.ts/commit/ae36c022ce2c05fc33474110a801bd9121cb2438))
71
+ * **retry:** serve a retry from a fresh cache entry a concurrent call stored ([de5f7ee](https://github.com/lgriffin/ESI.ts/commit/de5f7eee75b89a45bbbe8e909462145ea805fba1))
72
+ * **type-mutation:** resolve entry points whose types sit under a condition ([1dd356d](https://github.com/lgriffin/ESI.ts/commit/1dd356d7874ecad0ff5b81a2f56695f408b0ad93))
73
+ * **type-mutation:** resolve entry points whose types sit under a condition ([330c69e](https://github.com/lgriffin/ESI.ts/commit/330c69e78b7854e6a7a9718fa2ce0fff4257c3ef))
74
+ * **types:** escape backslashes before pipes in the type mutation survivor table ([8d7d4de](https://github.com/lgriffin/ESI.ts/commit/8d7d4de6278cd968070c0c58f3e5e781815ad512))
75
+
76
+
77
+ ### Changed
78
+
79
+ * **bdd:** share the feature outline and feature bindings ([f75f261](https://github.com/lgriffin/ESI.ts/commit/f75f261958addd53fb22571ac649de9153b8cdab))
80
+ * **ci:** lint the packed tarball and budget each exports sub-path's size ([63c5f26](https://github.com/lgriffin/ESI.ts/commit/63c5f26d19236d6ab397e5e95b5d3ee3328aead9))
81
+ * **ci:** run the properties nightly at 10000 runs and document the tier ([06c79d2](https://github.com/lgriffin/ESI.ts/commit/06c79d268c85cd654d8f8e48b6b93ceb4d2cfc5d))
82
+ * **ci:** sample four overlapping calls nightly in seeded random order ([510b940](https://github.com/lgriffin/ESI.ts/commit/510b940f2cdf10abdbaaa38097f289143d7bf307))
83
+ * **lint:** lint tests/ for focused, skipped, assertion-free and silenced tests ([9bdf6bf](https://github.com/lgriffin/ESI.ts/commit/9bdf6bf174fe0476a213389ca4103fe90b00898c))
84
+ * **scripts:** check that every npm script points at a file that exists ([7b1fe81](https://github.com/lgriffin/ESI.ts/commit/7b1fe81b2cc52ac958a34490fdcd445eb57b2528))
85
+ * **scripts:** check that every npm script points at a file that exists ([55b03c7](https://github.com/lgriffin/ESI.ts/commit/55b03c77f0b6d636b7ec6ce6837f2bf642cb48c9))
86
+ * **scripts:** run every offline CI tier locally with one command ([14fc738](https://github.com/lgriffin/ESI.ts/commit/14fc738a13e5a8e6c782b032c708e46243b66087))
87
+ * **scripts:** run every offline CI tier locally with one command ([31197ac](https://github.com/lgriffin/ESI.ts/commit/31197accc81750b20a7412421e7b9e3ada57f9c6))
88
+
89
+
90
+ ### Documentation
91
+
92
+ * **agents:** pin the semver rules against drift, and fix a retired config reference ([52ad44f](https://github.com/lgriffin/ESI.ts/commit/52ad44fa6e79018d21d0fafac6c98ab42117fe44))
93
+ * **agents:** pin the semver rules against drift, and fix a retired config reference ([d2af258](https://github.com/lgriffin/ESI.ts/commit/d2af258aa7a2d82a12eb56a014432f1d14c1a558))
94
+ * **bdd:** document the execution check, bug tags and when a Rule is protection ([fa0be02](https://github.com/lgriffin/ESI.ts/commit/fa0be0281996fd5e7fadeffcadbece5c81299b59))
95
+ * **contract:** name the real reason those endpoints cannot be recorded ([1b864da](https://github.com/lgriffin/ESI.ts/commit/1b864da3c9688833cf90ac748acb775f135d39b5))
96
+ * **contract:** name the real reason those endpoints cannot be recorded ([b8ea80d](https://github.com/lgriffin/ESI.ts/commit/b8ea80d3861813490fe012fcc1abda57bdce5485))
97
+ * declare TypeScript 5.4 as the oldest supported version ([f9e5f66](https://github.com/lgriffin/ESI.ts/commit/f9e5f66c4a3065ac82d8f0dab809b44d931e2a0a))
98
+ * describe the benchmark and heap soak tier ([f28cc2c](https://github.com/lgriffin/ESI.ts/commit/f28cc2c9d74115ebffce382a27ed362d96e5401a))
99
+ * **mutation:** record the measured pull request job timings ([62c70c9](https://github.com/lgriffin/ESI.ts/commit/62c70c93c7f0904a4804e64a8c7a62d971e79cea))
100
+ * **testing:** describe the composition and concurrency tier ([e1ee338](https://github.com/lgriffin/ESI.ts/commit/e1ee338f738a35c8bcdcfc461304a8d8c560e0c3))
101
+ * **testing:** describe the fault tier and the decisions it pins ([39416c7](https://github.com/lgriffin/ESI.ts/commit/39416c72167ab589dce475912a75832fc2318c1e))
102
+ * **testing:** describe the recorded payload replay tier ([1b190f3](https://github.com/lgriffin/ESI.ts/commit/1b190f31e4c2d10de462905f83681881ecb9ee20))
103
+ * **testing:** map the suite in C4 and refresh the tier counts ([06facdb](https://github.com/lgriffin/ESI.ts/commit/06facdb6994e41bff84eea7ca5fe1fe649066ba6))
104
+
105
+
106
+ ### Testing
107
+
108
+ * **bdd:** let the transport seam fail an exchange the way a network does ([8f0a7a9](https://github.com/lgriffin/ESI.ts/commit/8f0a7a9d9eb4dc9c7eeb9a2ffe1d958ca64d7f2f))
109
+ * **bdd:** prove every scenario executes, name JUnit cases by Rule, and link [@bug](https://github.com/bug) to a tracker ([752de4c](https://github.com/lgriffin/ESI.ts/commit/752de4caa193c8fbb6d4f6d79de2a54fc071a46f))
110
+ * **bdd:** report every scenario by Rule and fail when one did not run ([b04a2d7](https://github.com/lgriffin/ESI.ts/commit/b04a2d7818754cd3daa1b504ed17d2fe1af4bd23))
111
+ * **bdd:** state what the performance scenarios verify, not a latency budget ([12b4461](https://github.com/lgriffin/ESI.ts/commit/12b44616b7b2f7e59cac06fc27e1d9eaed797815))
112
+ * **benchmark:** decide regressions statistically, not by percentage ([a3da1f8](https://github.com/lgriffin/ESI.ts/commit/a3da1f875fd2853e4312b41b2a3aaa799f49db9b))
113
+ * **benchmark:** measure the client hot paths with a mitata harness ([307b978](https://github.com/lgriffin/ESI.ts/commit/307b97850e4d5127b1572b6bed9313dcee17b698))
114
+ * **benchmark:** soak the pipeline for 100 000 requests and watch the heap ([34ab5ec](https://github.com/lgriffin/ESI.ts/commit/34ab5eca8c4918ee9f1147e0ff41318078e81d43))
115
+ * **benchmark:** statistical benchmark comparison, heap soak and a smoke-only latency spec ([1c62567](https://github.com/lgriffin/ESI.ts/commit/1c625674c1befaa90bf39438f931e16f15eb4119))
116
+ * **composition:** add a deterministic interleaving scheduler at the transport seam ([9ebbedb](https://github.com/lgriffin/ESI.ts/commit/9ebbedbc0935e3351e3fad55f56984cf9ea0d457))
117
+ * **composition:** escape backslashes in the printed reproduce command ([d96de7b](https://github.com/lgriffin/ESI.ts/commit/d96de7ba999268d0438661d67b407e8df945d86b))
118
+ * **composition:** explore retry inside an opening circuit and stale-on-error during a refresh ([309658d](https://github.com/lgriffin/ESI.ts/commit/309658d9490261e7eef84b5a6de1da12e16e161a))
119
+ * **composition:** explore three overlapping calls on PRs and four nightly ([4122f14](https://github.com/lgriffin/ESI.ts/commit/4122f14693ed1927f957836304999db42078393e))
120
+ * **consumer:** check the tarball as a matrix of consumer cells ([81c0cd0](https://github.com/lgriffin/ESI.ts/commit/81c0cd0cd97f548b35266991aad7c1ec805a233d))
121
+ * **consumer:** stop esbuild once the tree-shaking check has run ([9e9bea3](https://github.com/lgriffin/ESI.ts/commit/9e9bea30affcc0fdd73a015c9cb516f8b3d79144))
122
+ * **consumer:** widen the consumer contract to a Node x TypeScript x resolution matrix ([14880dd](https://github.com/lgriffin/ESI.ts/commit/14880dd5e341ec66f0871d5fadd5092e1e681b52))
123
+ * **contract:** assert replay failures through named helpers the lint knows ([48cd863](https://github.com/lgriffin/ESI.ts/commit/48cd863d5f74d0ea38c42f3bf2b60cdc236bcde9))
124
+ * **contract:** assert replay failures through named helpers the lint knows ([53e4b03](https://github.com/lgriffin/ESI.ts/commit/53e4b032ba437a71841086ec68541ea9fa78f295))
125
+ * **contract:** re-record ESI payloads whose shape changed ([bfe9af5](https://github.com/lgriffin/ESI.ts/commit/bfe9af5bb1ef26b639c5f836446633d7fb76a924))
126
+ * **contract:** re-record ESI payloads whose shape changed ([1f1be53](https://github.com/lgriffin/ESI.ts/commit/1f1be53fdec4f2a42ba260d5113c3e85d4dc0a4c))
127
+ * **contract:** record public ESI payloads and replay them through the client pipeline ([60d897e](https://github.com/lgriffin/ESI.ts/commit/60d897e45f845bb729cda580730412c5bb2d4ecb))
128
+ * **contract:** record sanitised public ESI payloads as fixtures ([d08cae6](https://github.com/lgriffin/ESI.ts/commit/d08cae62d9dc09ca86f773602641f89363044c69))
129
+ * **contract:** recorded ESI payloads changed shape ([184d67f](https://github.com/lgriffin/ESI.ts/commit/184d67f781e32c6be8763eb93ef8a4ffa293c509))
130
+ * **contract:** recorded ESI payloads changed shape ([6d1bbe8](https://github.com/lgriffin/ESI.ts/commit/6d1bbe83f3ecd2239b3abffe5df472b2b02ccdfe))
131
+ * **contract:** replay recorded ESI payloads through the client pipeline ([ee8f0df](https://github.com/lgriffin/ESI.ts/commit/ee8f0dff5dd527ad089d77c5246456f48fa08c9b))
132
+ * **docs:** type-check documentation examples against the packed package ([7746ada](https://github.com/lgriffin/ESI.ts/commit/7746ada98d04b8af72a005cc3645efc205e83cc3))
133
+ * **faults:** add a 400 served while the cache holds an entry ([d85b4fb](https://github.com/lgriffin/ESI.ts/commit/d85b4fba2c2e496337b46f3dce6ff1974870775e))
134
+ * **faults:** add a status the client has no text for, without a reason phrase ([1fe646a](https://github.com/lgriffin/ESI.ts/commit/1fe646a526ece7434966e0211c4a933071aad0b5))
135
+ * **faults:** add a transport fault catalogue run through the real pipeline ([1f5f055](https://github.com/lgriffin/ESI.ts/commit/1f5f055c2721cb7da9e67518d6237425b599e980))
136
+ * **faults:** assert through the helpers the suite-health lint knows ([0064539](https://github.com/lgriffin/ESI.ts/commit/0064539656221bdd30e1b0559da5d9854ee88e5c))
137
+ * **faults:** drop the x-pages gap the pagination fix closed ([6e367d6](https://github.com/lgriffin/ESI.ts/commit/6e367d6f1b6f6e864654384ba656cb00b709efa2))
138
+ * **faults:** drop the x-pages gap the pagination fix closed ([2f89d91](https://github.com/lgriffin/ESI.ts/commit/2f89d919c531c2b06f1eb41539e4c5ed71f4297a))
139
+ * **faults:** fault injection and fuzzing tier (transport fault catalogue) ([e3cee50](https://github.com/lgriffin/ESI.ts/commit/e3cee50f55a9f4c75b3d73569c55b1a608580acf))
140
+ * **faults:** fuzz every endpoint's payloads from its Zod schema nightly ([49dc045](https://github.com/lgriffin/ESI.ts/commit/49dc045d33fb538483e046c1c525d1982c7a0512))
141
+ * **fuzz:** model-based properties with a vacuity check for every property ([d2890ab](https://github.com/lgriffin/ESI.ts/commit/d2890ab5b6e1b9de690b6ba4ac7c08d8e33af253))
142
+ * **fuzz:** require eager pagination repeat calls to come from the cache ([cc57bc8](https://github.com/lgriffin/ESI.ts/commit/cc57bc8507f76af3614ddfc8441b6172fcde73d1))
143
+ * **fuzz:** respell all occurrences in cache-key lookalikes; ratchet export baseline ([1554338](https://github.com/lgriffin/ESI.ts/commit/155433898d56a6f52055f13f4847cf5ca025c56d))
144
+ * **mutation:** gate changed files per directory and prove the gate can fail ([c9a1b44](https://github.com/lgriffin/ESI.ts/commit/c9a1b4436643d529d30049eceaad8fb088a9b029))
145
+ * reference the exports v10 added and drop ContractBid from the export baseline ([dcb2081](https://github.com/lgriffin/ESI.ts/commit/dcb208160d195fef9cbfe226c61c9cc16a9c187d))
146
+ * reference the exports v10 added and drop ContractBid from the export baseline ([2633694](https://github.com/lgriffin/ESI.ts/commit/26336943d3897e1a8af85b82d0f9cc5754f54b75))
147
+ * **spec-audit:** require a tracker tag beside every [@bug](https://github.com/bug) ([04ad7a0](https://github.com/lgriffin/ESI.ts/commit/04ad7a00ed0e1b009c39db799740b2e32bbbcaa0))
148
+ * **types:** mutate the built declarations nightly and ratchet the tsd kill score ([5d0a8a8](https://github.com/lgriffin/ESI.ts/commit/5d0a8a8c3ba32ac383e01de768040ac9d075bd64))
149
+
8
150
  ## [10.0.0](https://github.com/lgriffin/ESI.ts/compare/v9.9.0...v10.0.0) (2026-09-17)
9
151
 
10
152
 
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![npm version](https://badge.fury.io/js/%40lgriffin%2Fesi.ts.svg)](https://badge.fury.io/js/%40lgriffin%2Fesi.ts)
4
4
  [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
5
- [![TypeScript](https://img.shields.io/badge/TypeScript-6.0%2B-blue)](https://www.typescriptlang.org/)
5
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.4%2B-blue)](https://www.typescriptlang.org/)
6
6
  [![CI/CD Pipeline](https://github.com/lgriffin/ESI.ts/actions/workflows/ci.yml/badge.svg)](https://github.com/lgriffin/ESI.ts/actions/workflows/ci.yml)
7
7
  [![Coverage](https://img.shields.io/badge/coverage-95%25%2B-brightgreen)](https://github.com/lgriffin/ESI.ts)
8
8
  [![npm downloads](https://img.shields.io/npm/dm/%40lgriffin/esi.ts)](https://www.npmjs.com/package/@lgriffin/esi.ts)
@@ -60,6 +60,8 @@ A generated client faithfully reproduces these spec bugs. ESI.ts fixes them.
60
60
  npm install @lgriffin/esi.ts
61
61
  ```
62
62
 
63
+ Requires Node.js 18 or later. TypeScript projects need TypeScript 5.4 or later, with ES module or CommonJS code under `node16`, `nodenext` or `bundler` module resolution; the consumer contract checks each of those against the published tarball.
64
+
63
65
  ### Building from Source
64
66
 
65
67
  ```bash
@@ -595,7 +597,12 @@ const order: EsiSpec.MarketsRegionIdOrdersGet = {
595
597
  volume_remain: 1000,
596
598
  volume_total: 5000,
597
599
  is_buy_order: false,
598
- // ...
600
+ duration: 90,
601
+ issued: '2026-09-01T12:00:00Z',
602
+ location_id: 60003760,
603
+ system_id: 30000142,
604
+ min_volume: 1,
605
+ range: 'region',
599
606
  };
600
607
  ```
601
608
 
@@ -824,7 +831,9 @@ console.log(`Best sell: ${Math.min(...sellOrders.map((o) => o.price))}`);
824
831
 
825
832
  Always call `shutdown()` when you're done to clean up cache timers:
826
833
 
827
- ```typescript
834
+ ```typescript runnable
835
+ import { EsiClient } from '@lgriffin/esi.ts';
836
+
828
837
  const client = new EsiClient();
829
838
  try {
830
839
  const status = await client.status.getStatus();
@@ -860,7 +869,7 @@ npm run bdd # BDD scenario tests only
860
869
  npm run contract # Contract tests (skipped without ESI_LIVE_TESTS=true)
861
870
  npm run fuzz # Property-based fuzz tests (601 tests)
862
871
  npm run mutation # Mutation testing (Stryker)
863
- npm run benchmark # Performance benchmark tests
872
+ npm run benchmark # Micro-benchmarks (mitata); npm run soak for the heap soak
864
873
  npm run test:types # tsd consumer type tests
865
874
  ```
866
875
 
@@ -908,7 +917,7 @@ npm run bdd # BDD scenario tests
908
917
  ESI_LIVE_TESTS=true npm run contract:live # Deep contract tests against live ESI spec (fails without the variable)
909
918
  npm run fuzz # Property-based fuzz tests (fast-check)
910
919
  npm run mutation # Mutation testing (Stryker)
911
- npm run benchmark # Performance benchmark tests
920
+ npm run benchmark # Micro-benchmarks (mitata)
912
921
  npm run test:types # Consumer type tests (tsd)
913
922
  npm run mock:esi # Start Prism mock ESI server on port 4010
914
923
 
@@ -0,0 +1,140 @@
1
+ import { TokenProvider } from './core/ApiClient.mjs';
2
+ import { RequestInterceptor, ResponseInterceptor } from './core/middleware/Middleware.mjs';
3
+ import { AllianceClient } from './clients/AllianceClient.mjs';
4
+ import { AssetsClient } from './clients/AssetsClient.mjs';
5
+ import { CalendarClient } from './clients/CalendarClient.mjs';
6
+ import { CharacterClient } from './clients/CharacterClient.mjs';
7
+ import { ClonesClient } from './clients/ClonesClient.mjs';
8
+ import { ContactsClient } from './clients/ContactsClient.mjs';
9
+ import { ContractsClient } from './clients/ContractsClient.mjs';
10
+ import { CorporationsClient } from './clients/CorporationsClient.mjs';
11
+ import { CorporationProjectsClient } from './clients/CorporationProjectsClient.mjs';
12
+ import { DogmaClient } from './clients/DogmaClient.mjs';
13
+ import { FactionClient } from './clients/FactionClient.mjs';
14
+ import { FittingsClient } from './clients/FittingsClient.mjs';
15
+ import { FleetClient } from './clients/FleetClient.mjs';
16
+ import { IncursionsClient } from './clients/IncursionsClient.mjs';
17
+ import { IndustryClient } from './clients/IndustryClient.mjs';
18
+ import { InsuranceClient } from './clients/InsuranceClient.mjs';
19
+ import { KillmailsClient } from './clients/KillmailsClient.mjs';
20
+ import { LocationClient } from './clients/LocationClient.mjs';
21
+ import { LoyaltyClient } from './clients/LoyaltyClient.mjs';
22
+ import { MailClient } from './clients/MailClient.mjs';
23
+ import { MarketClient } from './clients/MarketClient.mjs';
24
+ import { PiClient } from './clients/PiClient.mjs';
25
+ import { RouteClient } from './clients/RouteClient.mjs';
26
+ import { SearchClient } from './clients/SearchClient.mjs';
27
+ import { CharacterSkillsClient } from './clients/SkillsClient.mjs';
28
+ import { SovereigntyClient } from './clients/SovereigntyClient.mjs';
29
+ import { StatusClient } from './clients/StatusClient.mjs';
30
+ import { UiClient } from './clients/UiClient.mjs';
31
+ import { UniverseClient } from './clients/UniverseClient.mjs';
32
+ import { WalletClient } from './clients/WalletClient.mjs';
33
+ import { WarsClient } from './clients/WarsClient.mjs';
34
+ import { MetaClient } from './clients/MetaClient.mjs';
35
+ import { FreelanceJobsClient } from './clients/FreelanceJobsClient.mjs';
36
+ import { CosmeticsClient } from './clients/CosmeticsClient.mjs';
37
+ import { ParagonHubClient } from './clients/ParagonHubClient.mjs';
38
+ import { SkyhooksClient } from './clients/SkyhooksClient.mjs';
39
+ import { MercenaryClient } from './clients/MercenaryClient.mjs';
40
+ import { AccessListsClient } from './clients/AccessListsClient.mjs';
41
+ import { MilitaryCampaignsClient } from './clients/MilitaryCampaignsClient.mjs';
42
+ import { ETagCacheConfig } from './core/cache/ETagCacheManager.mjs';
43
+ import { CircuitBreakerConfig } from './core/circuitBreaker/CircuitBreaker.mjs';
44
+ import { RateLimiterConfig } from './core/rateLimiter/RateLimiter.mjs';
45
+ import { RetryConfig } from './core/util/retry.mjs';
46
+ import { IRetryStrategy } from './core/IRetryStrategy.mjs';
47
+ import { EsiDiagnostics } from './core/EsiDiagnostics.mjs';
48
+ import { BatchOptions, BatchResult } from './core/BatchRequestHandler.mjs';
49
+ export type EsiDatasource = 'tranquility' | 'singularity';
50
+ export interface EsiClientConfig {
51
+ clientId?: string;
52
+ baseUrl?: string;
53
+ accessToken?: string;
54
+ datasource?: EsiDatasource;
55
+ onTokenRefresh?: TokenProvider;
56
+ timeout?: number;
57
+ retryAttempts?: number;
58
+ retryConfig?: RetryConfig;
59
+ retryStrategy?: IRetryStrategy;
60
+ enableETagCache?: boolean;
61
+ etagCacheConfig?: ETagCacheConfig;
62
+ enableCircuitBreaker?: boolean;
63
+ circuitBreakerConfig?: CircuitBreakerConfig;
64
+ unsafeAllowCustomHost?: boolean;
65
+ enableRequestDeduplication?: boolean;
66
+ language?: string;
67
+ compatibilityDate?: string;
68
+ rateLimiterConfig?: RateLimiterConfig;
69
+ requestInterceptors?: RequestInterceptor[];
70
+ responseInterceptors?: ResponseInterceptor[];
71
+ validateResponse?: boolean;
72
+ validateRequest?: boolean;
73
+ /** Custom logger for this client. Falls back to the global logger, then pino. */
74
+ logger?: import('./core/logger/ILogger.mjs').ILogger;
75
+ /** Log level for the default pino logger (`error|warn|info|debug|trace`). Overrides `ESI_LOG_LEVEL`. */
76
+ logLevel?: import('./core/logger/DefaultLogger.mjs').LogLevel;
77
+ }
78
+ export declare class EsiClient {
79
+ private apiClient;
80
+ private clients;
81
+ private etagCacheEnabled;
82
+ private _diagnostics;
83
+ private deduplicator;
84
+ constructor(config?: EsiClientConfig);
85
+ private getClient;
86
+ get alliance(): AllianceClient;
87
+ get assets(): AssetsClient;
88
+ get calendar(): CalendarClient;
89
+ get characters(): CharacterClient;
90
+ get clones(): ClonesClient;
91
+ get contacts(): ContactsClient;
92
+ get contracts(): ContractsClient;
93
+ get corporations(): CorporationsClient;
94
+ get corporationProjects(): CorporationProjectsClient;
95
+ get dogma(): DogmaClient;
96
+ get factions(): FactionClient;
97
+ get fittings(): FittingsClient;
98
+ get fleets(): FleetClient;
99
+ get incursions(): IncursionsClient;
100
+ get industry(): IndustryClient;
101
+ get insurance(): InsuranceClient;
102
+ get killmails(): KillmailsClient;
103
+ get location(): LocationClient;
104
+ get loyalty(): LoyaltyClient;
105
+ get mail(): MailClient;
106
+ get market(): MarketClient;
107
+ get pi(): PiClient;
108
+ get route(): RouteClient;
109
+ get search(): SearchClient;
110
+ get skills(): CharacterSkillsClient;
111
+ get sovereignty(): SovereigntyClient;
112
+ get status(): StatusClient;
113
+ get ui(): UiClient;
114
+ get universe(): UniverseClient;
115
+ get wallet(): WalletClient;
116
+ get wars(): WarsClient;
117
+ get meta(): MetaClient;
118
+ get freelanceJobs(): FreelanceJobsClient;
119
+ get cosmetics(): CosmeticsClient;
120
+ get paragonHub(): ParagonHubClient;
121
+ get skyhooks(): SkyhooksClient;
122
+ get mercenary(): MercenaryClient;
123
+ get militaryCampaigns(): MilitaryCampaignsClient;
124
+ get accessLists(): AccessListsClient;
125
+ addRequestInterceptor(fn: RequestInterceptor): () => void;
126
+ addResponseInterceptor(fn: ResponseInterceptor): () => void;
127
+ setAccessToken(token: string): void;
128
+ setTokenProvider(provider: TokenProvider | undefined): void;
129
+ get diagnostics(): EsiDiagnostics;
130
+ getCacheStats(): import("./index.mjs").CacheStats | null;
131
+ clearCache(): void;
132
+ updateCacheConfig(newConfig: Partial<ETagCacheConfig>): void;
133
+ getCircuitBreakerStats(): import("./index.mjs").CircuitBreakerStats | null;
134
+ resetCircuitBreaker(endpoint?: string): void;
135
+ batch<K, T>(keys: K[], fetcher: (key: K) => Promise<T>, options?: BatchOptions): Promise<BatchResult<K, T>>;
136
+ batchPost<T>(ids: number[], poster: (chunk: number[]) => Promise<T[]>, chunkSize?: number): Promise<T[]>;
137
+ shutdown(): void;
138
+ }
139
+ export declare function getDefaultClient(): EsiClient;
140
+ //# sourceMappingURL=EsiClient.d.ts.map
@@ -0,0 +1,75 @@
1
+ import { ApiClientType, ClientInstance, AllianceClient, AssetsClient, CalendarClient, CharacterClient, ClonesClient, ContactsClient, ContractsClient, CorporationsClient, DogmaClient, FactionClient, FittingsClient, FleetClient, IncursionsClient, IndustryClient, InsuranceClient, KillmailsClient, LocationClient, LoyaltyClient, MailClient, MarketClient, PiClient, RouteClient, SearchClient, CharacterSkillsClient, SovereigntyClient, StatusClient, UiClient, UniverseClient, WalletClient, WarsClient, MetaClient, FreelanceJobsClient, SkyhooksClient, MercenaryClient, AccessListsClient } from './core/ClientRegistry.mjs';
2
+ import { EsiClientConfig } from './EsiClient.mjs';
3
+ export { ApiClientType, ClientInstance };
4
+ export declare class CustomEsiClient {
5
+ private apiClient;
6
+ private clients;
7
+ private enabledClients;
8
+ private deduplicator;
9
+ constructor(config: EsiClientConfig & {
10
+ clients: ApiClientType[];
11
+ });
12
+ getClient(clientType: ApiClientType): ClientInstance | undefined;
13
+ hasClient(clientType: ApiClientType): boolean;
14
+ getEnabledClients(): ApiClientType[];
15
+ get alliance(): AllianceClient | undefined;
16
+ get assets(): AssetsClient | undefined;
17
+ get calendar(): CalendarClient | undefined;
18
+ get characters(): CharacterClient | undefined;
19
+ get clones(): ClonesClient | undefined;
20
+ get contacts(): ContactsClient | undefined;
21
+ get contracts(): ContractsClient | undefined;
22
+ get corporations(): CorporationsClient | undefined;
23
+ get dogma(): DogmaClient | undefined;
24
+ get factions(): FactionClient | undefined;
25
+ get fittings(): FittingsClient | undefined;
26
+ get fleets(): FleetClient | undefined;
27
+ get incursions(): IncursionsClient | undefined;
28
+ get industry(): IndustryClient | undefined;
29
+ get insurance(): InsuranceClient | undefined;
30
+ get killmails(): KillmailsClient | undefined;
31
+ get location(): LocationClient | undefined;
32
+ get loyalty(): LoyaltyClient | undefined;
33
+ get mail(): MailClient | undefined;
34
+ get market(): MarketClient | undefined;
35
+ get pi(): PiClient | undefined;
36
+ get route(): RouteClient | undefined;
37
+ get search(): SearchClient | undefined;
38
+ get skills(): CharacterSkillsClient | undefined;
39
+ get sovereignty(): SovereigntyClient | undefined;
40
+ get status(): StatusClient | undefined;
41
+ get ui(): UiClient | undefined;
42
+ get universe(): UniverseClient | undefined;
43
+ get wallet(): WalletClient | undefined;
44
+ get wars(): WarsClient | undefined;
45
+ get meta(): MetaClient | undefined;
46
+ get freelanceJobs(): FreelanceJobsClient | undefined;
47
+ get skyhooks(): SkyhooksClient | undefined;
48
+ get mercenary(): MercenaryClient | undefined;
49
+ get accessLists(): AccessListsClient | undefined;
50
+ shutdown(): void;
51
+ }
52
+ export declare class EsiApiFactory {
53
+ static createAllianceClient(config?: EsiClientConfig): AllianceClient;
54
+ static createCharacterClient(config?: EsiClientConfig): CharacterClient;
55
+ static createCorporationClient(config?: EsiClientConfig): CorporationsClient;
56
+ static createMarketClient(config?: EsiClientConfig): MarketClient;
57
+ static createUniverseClient(config?: EsiClientConfig): UniverseClient;
58
+ static createFleetClient(config?: EsiClientConfig): FleetClient;
59
+ static createAssetsClient(config?: EsiClientConfig): AssetsClient;
60
+ static createWalletClient(config?: EsiClientConfig): WalletClient;
61
+ static createMailClient(config?: EsiClientConfig): MailClient;
62
+ static createClient(clientType: ApiClientType, config?: EsiClientConfig): ClientInstance;
63
+ private static buildApiClient;
64
+ }
65
+ export declare class EsiClientBuilder {
66
+ private clients;
67
+ private config;
68
+ addClient(clientType: ApiClientType): this;
69
+ addClients(clientTypes: ApiClientType[]): this;
70
+ withConfig(config: EsiClientConfig): this;
71
+ withClientId(clientId: string): this;
72
+ withAccessToken(accessToken: string): this;
73
+ build(): CustomEsiClient;
74
+ }
75
+ //# sourceMappingURL=EsiClientBuilder.d.ts.map
@@ -0,0 +1,200 @@
1
+ import { EsiClient, EsiClientConfig } from '../EsiClient.mjs';
2
+ import type { FetchLike, TokenProvider } from '../core/ApiClient.mjs';
3
+ import type { ILogger } from '../core/logger/ILogger.mjs';
4
+ import { EveSsoClient, AuthorizationUrlOptions, ExchangeCodeOptions } from './EveSsoClient.mjs';
5
+ import type { ITokenStorage, StoredToken } from './types.mjs';
6
+ export interface EsiTokenManagerConfig {
7
+ /** The application's SSO client id. */
8
+ clientId: string;
9
+ /** The application's SSO client secret. Omit for a public (PKCE) client. */
10
+ clientSecret?: string;
11
+ /** Redirect URI registered for the application. */
12
+ callbackUrl?: string;
13
+ /** Where tokens are persisted. Defaults to {@link MemoryTokenStorage}. */
14
+ storage?: ITokenStorage;
15
+ /** Pre-built SSO client. When given, `clientId`, `clientSecret`, `callbackUrl` and `fetch` are ignored for SSO calls. */
16
+ ssoClient?: EveSsoClient;
17
+ /** Custom fetch for SSO calls. Defaults to `globalThis.fetch`. */
18
+ fetch?: FetchLike;
19
+ /**
20
+ * How long before expiry a token counts as stale, in milliseconds.
21
+ * Defaults to 60 000 (one minute).
22
+ */
23
+ refreshSkewMs?: number;
24
+ /**
25
+ * When true (the default), {@link EsiTokenManager.getToken} refreshes a
26
+ * stale token before returning it. When false it returns the stored token
27
+ * as-is and refresh only happens through {@link EsiTokenManager.refresh},
28
+ * {@link EsiTokenManager.refreshAll}, or the 401 path of a created client.
29
+ */
30
+ autoRefresh?: boolean;
31
+ /** Called after a token is refreshed and persisted. */
32
+ onRefresh?: (token: StoredToken) => void;
33
+ /** Called when a refresh fails for a reason other than revocation. */
34
+ onRefreshError?: (characterId: number, error: Error) => void;
35
+ /** Called when SSO reports a character's refresh token as invalid. */
36
+ onRevoked?: (characterId: number) => void;
37
+ /** Logger for refresh activity. Defaults to the library logger. */
38
+ logger?: ILogger;
39
+ /** Clock override for tests. */
40
+ now?: () => number;
41
+ }
42
+ export interface AddCharacterOptions extends ExchangeCodeOptions {
43
+ /**
44
+ * When the character already has a stored token, revoke its refresh token
45
+ * at SSO before replacing it. Defaults to false.
46
+ */
47
+ revokeReplaced?: boolean;
48
+ }
49
+ export interface RemoveCharacterOptions {
50
+ /** Revoke the refresh token at SSO before deleting it. Defaults to false. */
51
+ revoke?: boolean;
52
+ }
53
+ export interface RefreshAllOptions {
54
+ /** Maximum simultaneous SSO requests. Defaults to 5. */
55
+ concurrency?: number;
56
+ /**
57
+ * Only refresh tokens that expire within this many milliseconds (after
58
+ * applying the refresh skew). Omit to refresh every token.
59
+ */
60
+ expiringWithinMs?: number;
61
+ /** Abort the run; remaining tokens are reported as skipped. */
62
+ signal?: AbortSignal;
63
+ /**
64
+ * Progress callback, invoked after each token settles. A callback that
65
+ * throws does not stop the run; the exception is discarded.
66
+ */
67
+ onProgress?: (completed: number, total: number) => void;
68
+ }
69
+ export type RefreshStatus = 'refreshed' | 'skipped' | 'failed' | 'revoked';
70
+ export interface RefreshResult {
71
+ characterId: number;
72
+ status: RefreshStatus;
73
+ /** New expiry in epoch milliseconds, when refreshed. */
74
+ expiresAt?: number;
75
+ /** The error, when failed or revoked. */
76
+ error?: Error;
77
+ /** True when the failure was an SSO 429 or 5xx and can be retried later. */
78
+ retryable?: boolean;
79
+ /** Why the token was skipped. */
80
+ reason?: 'not-stale' | 'aborted';
81
+ }
82
+ /** Lightweight view of a stored character, without the secrets. */
83
+ export interface CharacterSummary {
84
+ characterId: number;
85
+ characterName: string;
86
+ scopes: string[];
87
+ expiresAt: number;
88
+ revoked: boolean;
89
+ }
90
+ /** EsiClient options a manager-created client accepts; token fields are supplied by the manager. */
91
+ export type ManagedClientConfig = Omit<EsiClientConfig, 'accessToken' | 'onTokenRefresh'>;
92
+ /**
93
+ * Keeps one valid SSO token per character on top of a pluggable
94
+ * {@link ITokenStorage}, refreshing ahead of expiry, coalescing concurrent
95
+ * refreshes, persisting rotated refresh tokens, and recording revocations so
96
+ * SSO is not hammered with a dead refresh token.
97
+ */
98
+ export declare class EsiTokenManager {
99
+ private readonly storage;
100
+ private readonly sso;
101
+ private readonly refreshSkewMs;
102
+ private readonly autoRefresh;
103
+ private readonly logger;
104
+ private readonly now;
105
+ private readonly hooks;
106
+ private readonly inFlight;
107
+ /**
108
+ * Per-character write generation. Bumped whenever a record is replaced or
109
+ * removed so a refresh that was already waiting on SSO can tell its result
110
+ * is stale and must not be persisted over the newer state.
111
+ */
112
+ private readonly generations;
113
+ constructor(config: EsiTokenManagerConfig);
114
+ /** The SSO client used for all token traffic. */
115
+ getSsoClient(): EveSsoClient;
116
+ /** The storage adapter backing this manager. */
117
+ getStorage(): ITokenStorage;
118
+ /** Build the SSO login URL. See {@link EveSsoClient.getAuthorizationUrl}. */
119
+ getAuthorizationUrl(options: AuthorizationUrlOptions): string;
120
+ /**
121
+ * Exchange an authorization code and store the resulting token under the
122
+ * character it belongs to. An existing token for that character is
123
+ * replaced; storage never holds two entries for one character.
124
+ */
125
+ addCharacter(code: string, options?: AddCharacterOptions): Promise<StoredToken>;
126
+ /**
127
+ * Import tokens obtained elsewhere (a previous library version, another
128
+ * tool, a migration). The character identity is decoded from the access
129
+ * token; `expiresIn` is in seconds and defaults to the JWT `exp` claim.
130
+ */
131
+ importToken(token: {
132
+ accessToken: string;
133
+ refreshToken: string;
134
+ expiresIn?: number;
135
+ }): Promise<StoredToken>;
136
+ /** Delete a character's token, optionally revoking it at SSO first. */
137
+ removeCharacter(characterId: number, options?: RemoveCharacterOptions): Promise<void>;
138
+ /** The stored record for a character, or null. */
139
+ getStoredToken(characterId: number): Promise<StoredToken | null>;
140
+ /** Every stored token. */
141
+ listTokens(): Promise<StoredToken[]>;
142
+ /** Every stored character without its secrets. */
143
+ listCharacters(): Promise<CharacterSummary[]>;
144
+ /** True when the stored token grants every listed scope. */
145
+ hasScopes(characterId: number, scopes: readonly string[]): Promise<boolean>;
146
+ /**
147
+ * A usable access token for the character. With `autoRefresh` on, a token
148
+ * inside the refresh skew is refreshed first.
149
+ *
150
+ * @throws CharacterNotFoundError when no token is stored
151
+ * @throws TokenRevokedError when the character's refresh token is revoked
152
+ */
153
+ getToken(characterId: number): Promise<string>;
154
+ /**
155
+ * Refresh a character's token through SSO regardless of expiry. Concurrent
156
+ * calls for the same character share one SSO request.
157
+ */
158
+ refresh(characterId: number): Promise<StoredToken>;
159
+ /**
160
+ * Refresh stored tokens with bounded concurrency. Per-character failures
161
+ * never reject: each character gets its own {@link RefreshResult}. The one
162
+ * rejection is a failing `storage.list()`, because with no records there
163
+ * is no character to attribute the fault to and a silent empty run would
164
+ * hide a broken store from a scheduler.
165
+ */
166
+ refreshAll(options?: RefreshAllOptions): Promise<RefreshResult[]>;
167
+ /**
168
+ * A {@link TokenProvider} bound to a character, for `onTokenRefresh`. Every
169
+ * invocation refreshes through SSO (coalesced), because the client only
170
+ * calls it after ESI has rejected the current token.
171
+ */
172
+ tokenProviderFor(characterId: number): TokenProvider;
173
+ /**
174
+ * An {@link EsiClient} whose access token and refresh provider are bound to
175
+ * the character. The token is validated (and refreshed if stale) first.
176
+ */
177
+ createClient(characterId: number, config?: ManagedClientConfig): Promise<EsiClient>;
178
+ private isStale;
179
+ private requireStored;
180
+ private generationOf;
181
+ private bumpGeneration;
182
+ /**
183
+ * After an SSO round trip, decide whether the refresh still owns the
184
+ * character's record. Returns null when it does. When the record was
185
+ * replaced meanwhile, returns the current record so the caller hands out
186
+ * the newer credentials; when it was removed, throws CharacterNotFoundError.
187
+ */
188
+ private supersededBy;
189
+ private doRefresh;
190
+ private refreshOne;
191
+ private storeResponse;
192
+ /**
193
+ * Build the record to persist. When adding a character the access token
194
+ * must decode, because it is the only source of the character id. On a
195
+ * refresh the identity is already known, so a token that does not decode
196
+ * (a proxy, a future SSO format) keeps the previous record's identity.
197
+ */
198
+ private buildStoredToken;
199
+ }
200
+ //# sourceMappingURL=EsiTokenManager.d.ts.map