@lgriffin/esi.ts 10.2.1 → 11.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 (428) hide show
  1. package/CHANGELOG.md +399 -33
  2. package/LICENSE +667 -19
  3. package/NOTICE +19 -0
  4. package/README.md +149 -902
  5. package/dist/EsiClient.d.mts +5 -36
  6. package/dist/EsiClient.d.ts +5 -36
  7. package/dist/EsiClient.d.ts.map +1 -1
  8. package/dist/EsiClientBuilder.d.mts +128 -1
  9. package/dist/EsiClientBuilder.d.ts +128 -1
  10. package/dist/EsiClientBuilder.d.ts.map +1 -1
  11. package/dist/adapters/PipelineTransport.d.ts +16 -0
  12. package/dist/adapters/PipelineTransport.d.ts.map +1 -0
  13. package/dist/auth/EsiTokenManager.d.mts +62 -21
  14. package/dist/auth/EsiTokenManager.d.ts +62 -21
  15. package/dist/auth/EsiTokenManager.d.ts.map +1 -1
  16. package/dist/auth/EveSsoClient.d.mts +9 -9
  17. package/dist/auth/EveSsoClient.d.ts +9 -9
  18. package/dist/auth/EveSsoClient.d.ts.map +1 -1
  19. package/dist/auth/errors.d.mts +2 -2
  20. package/dist/auth/errors.d.ts +2 -2
  21. package/dist/auth/errors.d.ts.map +1 -1
  22. package/dist/auth/jwt.d.mts +7 -7
  23. package/dist/auth/jwt.d.ts +7 -7
  24. package/dist/auth/jwt.d.ts.map +1 -1
  25. package/dist/auth/storage/FileTokenStorage.d.mts +1 -1
  26. package/dist/auth/storage/FileTokenStorage.d.ts +1 -1
  27. package/dist/auth/storage/FileTokenStorage.d.ts.map +1 -1
  28. package/dist/{chunk-BBSHKVPI.js → chunk-CM63VGGF.js} +1 -1
  29. package/dist/chunk-CM63VGGF.js.map +1 -0
  30. package/dist/chunk-DFRTIZK4.js +275 -0
  31. package/dist/chunk-DFRTIZK4.js.map +1 -0
  32. package/dist/{chunk-VZS32UQ3.mjs → chunk-HXS7ZVEL.mjs} +129 -28
  33. package/dist/chunk-HXS7ZVEL.mjs.map +1 -0
  34. package/dist/chunk-JNFQXEWZ.mjs +275 -0
  35. package/dist/chunk-JNFQXEWZ.mjs.map +1 -0
  36. package/dist/chunk-KIY3XA5Q.mjs +2980 -0
  37. package/dist/chunk-KIY3XA5Q.mjs.map +1 -0
  38. package/dist/{chunk-R7D7M2LQ.mjs → chunk-MGOE2YNH.mjs} +1 -1
  39. package/dist/chunk-MGOE2YNH.mjs.map +1 -0
  40. package/dist/{chunk-SAQBXXTM.js → chunk-MRKZ55XI.js} +130 -29
  41. package/dist/chunk-MRKZ55XI.js.map +1 -0
  42. package/dist/chunk-NKFIHGC6.js +2980 -0
  43. package/dist/chunk-NKFIHGC6.js.map +1 -0
  44. package/dist/{chunk-MSJHIJXA.js → chunk-S73PKM2Y.js} +20 -5
  45. package/dist/chunk-S73PKM2Y.js.map +1 -0
  46. package/dist/{chunk-3ZI5A37L.mjs → chunk-YUHGSPQ7.mjs} +19 -4
  47. package/dist/chunk-YUHGSPQ7.mjs.map +1 -0
  48. package/dist/client/identity.d.mts +20 -0
  49. package/dist/client/identity.d.ts +20 -0
  50. package/dist/client/identity.d.ts.map +1 -0
  51. package/dist/client/index.d.mts +11 -0
  52. package/dist/client/index.d.ts +11 -0
  53. package/dist/client/index.d.ts.map +1 -0
  54. package/dist/client/index.js +6607 -0
  55. package/dist/client/index.js.map +1 -0
  56. package/dist/client/index.mjs +6607 -0
  57. package/dist/client/index.mjs.map +1 -0
  58. package/dist/client/runtime.d.mts +67 -0
  59. package/dist/client/runtime.d.ts +67 -0
  60. package/dist/client/runtime.d.ts.map +1 -0
  61. package/dist/clients/BaseEsiClient.d.ts.map +1 -1
  62. package/dist/clients/ClientRegistry.d.mts +45 -0
  63. package/dist/clients/ClientRegistry.d.ts +45 -0
  64. package/dist/clients/ClientRegistry.d.ts.map +1 -0
  65. package/dist/clients/CorporationsClient.d.mts +3 -3
  66. package/dist/clients/CorporationsClient.d.ts +3 -3
  67. package/dist/clients/CorporationsClient.d.ts.map +1 -1
  68. package/dist/clients/MailClient.d.mts +2 -2
  69. package/dist/clients/MailClient.d.ts +2 -2
  70. package/dist/clients/MailClient.d.ts.map +1 -1
  71. package/dist/clients/MetaClient.d.mts +3 -2
  72. package/dist/clients/MetaClient.d.ts +3 -2
  73. package/dist/clients/MetaClient.d.ts.map +1 -1
  74. package/dist/clients/MilitaryCampaignsClient.d.mts +14 -7
  75. package/dist/clients/MilitaryCampaignsClient.d.ts +14 -7
  76. package/dist/clients/MilitaryCampaignsClient.d.ts.map +1 -1
  77. package/dist/clients/RouteClient.d.mts +4 -4
  78. package/dist/clients/RouteClient.d.ts +4 -4
  79. package/dist/clients/RouteClient.d.ts.map +1 -1
  80. package/dist/clients/SkillsClient.d.mts +1 -1
  81. package/dist/clients/SkillsClient.d.ts +1 -1
  82. package/dist/clients/SkillsClient.d.ts.map +1 -1
  83. package/dist/clients/SkyhooksClient.d.mts +4 -3
  84. package/dist/clients/SkyhooksClient.d.ts +4 -3
  85. package/dist/clients/SkyhooksClient.d.ts.map +1 -1
  86. package/dist/core/ApiClient.d.mts +11 -0
  87. package/dist/core/ApiClient.d.ts +11 -0
  88. package/dist/core/ApiClient.d.ts.map +1 -1
  89. package/dist/core/ApiClientBuilder.d.ts.map +1 -1
  90. package/dist/core/ApiRequestHandler.d.ts +2 -1
  91. package/dist/core/ApiRequestHandler.d.ts.map +1 -1
  92. package/dist/core/BatchRequestHandler.d.mts +13 -2
  93. package/dist/core/BatchRequestHandler.d.ts +13 -2
  94. package/dist/core/BatchRequestHandler.d.ts.map +1 -1
  95. package/dist/core/EsiClientConfig.d.mts +60 -0
  96. package/dist/core/EsiClientConfig.d.ts +60 -0
  97. package/dist/core/EsiClientConfig.d.ts.map +1 -0
  98. package/dist/core/RetryStrategy.d.mts +3 -3
  99. package/dist/core/RetryStrategy.d.ts +3 -3
  100. package/dist/core/RetryStrategy.d.ts.map +1 -1
  101. package/dist/core/cache/ETagCacheManager.d.mts +9 -4
  102. package/dist/core/cache/ETagCacheManager.d.ts +9 -4
  103. package/dist/core/cache/ETagCacheManager.d.ts.map +1 -1
  104. package/dist/core/cache/cacheKey.d.ts +31 -6
  105. package/dist/core/cache/cacheKey.d.ts.map +1 -1
  106. package/dist/core/circuitBreaker/CircuitBreaker.d.mts +8 -12
  107. package/dist/core/circuitBreaker/CircuitBreaker.d.ts +8 -12
  108. package/dist/core/circuitBreaker/CircuitBreaker.d.ts.map +1 -1
  109. package/dist/core/clock.d.ts +8 -0
  110. package/dist/core/clock.d.ts.map +1 -0
  111. package/dist/core/configureApiClient.d.mts +1 -1
  112. package/dist/core/configureApiClient.d.ts +1 -1
  113. package/dist/core/configureApiClient.d.ts.map +1 -1
  114. package/dist/core/constants.d.ts +3 -3
  115. package/dist/core/constants.d.ts.map +1 -1
  116. package/dist/core/endpoints/EndpointDefinition.d.mts +17 -0
  117. package/dist/core/endpoints/EndpointDefinition.d.ts +17 -0
  118. package/dist/core/endpoints/EndpointDefinition.d.ts.map +1 -1
  119. package/dist/core/endpoints/assetEndpoints.d.mts +12 -0
  120. package/dist/core/endpoints/assetEndpoints.d.ts +12 -0
  121. package/dist/core/endpoints/assetEndpoints.d.ts.map +1 -1
  122. package/dist/core/endpoints/characterEndpoints.d.mts +10 -0
  123. package/dist/core/endpoints/characterEndpoints.d.ts +10 -0
  124. package/dist/core/endpoints/characterEndpoints.d.ts.map +1 -1
  125. package/dist/core/endpoints/contactEndpoints.d.mts +1 -0
  126. package/dist/core/endpoints/contactEndpoints.d.ts +1 -0
  127. package/dist/core/endpoints/contactEndpoints.d.ts.map +1 -1
  128. package/dist/core/endpoints/contractEndpoints.d.mts +2 -0
  129. package/dist/core/endpoints/contractEndpoints.d.ts +2 -0
  130. package/dist/core/endpoints/contractEndpoints.d.ts.map +1 -1
  131. package/dist/core/endpoints/corporationEndpoints.d.mts +16 -3
  132. package/dist/core/endpoints/corporationEndpoints.d.ts +16 -3
  133. package/dist/core/endpoints/corporationEndpoints.d.ts.map +1 -1
  134. package/dist/core/endpoints/createClient.d.mts +2 -2
  135. package/dist/core/endpoints/createClient.d.ts +2 -2
  136. package/dist/core/endpoints/createClient.d.ts.map +1 -1
  137. package/dist/core/endpoints/esi-cache-ttls.generated.d.ts.map +1 -1
  138. package/dist/core/endpoints/esi-rate-limit-groups.generated.d.ts.map +1 -1
  139. package/dist/core/endpoints/esi-scopes.generated.d.ts.map +1 -1
  140. package/dist/core/endpoints/fittingEndpoints.d.mts +3 -0
  141. package/dist/core/endpoints/fittingEndpoints.d.ts +3 -0
  142. package/dist/core/endpoints/fittingEndpoints.d.ts.map +1 -1
  143. package/dist/core/endpoints/fleetEndpoints.d.mts +6 -0
  144. package/dist/core/endpoints/fleetEndpoints.d.ts +6 -0
  145. package/dist/core/endpoints/fleetEndpoints.d.ts.map +1 -1
  146. package/dist/core/endpoints/industryEndpoints.d.mts +2 -2
  147. package/dist/core/endpoints/industryEndpoints.d.ts +2 -2
  148. package/dist/core/endpoints/mailEndpoints.d.mts +2 -0
  149. package/dist/core/endpoints/mailEndpoints.d.ts +2 -0
  150. package/dist/core/endpoints/mailEndpoints.d.ts.map +1 -1
  151. package/dist/core/endpoints/mercenaryEndpoints.d.mts +1 -1
  152. package/dist/core/endpoints/mercenaryEndpoints.d.ts +1 -1
  153. package/dist/core/endpoints/metaEndpoints.d.mts +23 -8
  154. package/dist/core/endpoints/metaEndpoints.d.ts +23 -8
  155. package/dist/core/endpoints/metaEndpoints.d.ts.map +1 -1
  156. package/dist/core/endpoints/militaryCampaignEndpoints.d.mts +78 -49
  157. package/dist/core/endpoints/militaryCampaignEndpoints.d.ts +78 -49
  158. package/dist/core/endpoints/militaryCampaignEndpoints.d.ts.map +1 -1
  159. package/dist/core/endpoints/paragonHubEndpoints.d.mts +5 -5
  160. package/dist/core/endpoints/paragonHubEndpoints.d.ts +5 -5
  161. package/dist/core/endpoints/skyhookEndpoints.d.mts +10 -8
  162. package/dist/core/endpoints/skyhookEndpoints.d.ts +10 -8
  163. package/dist/core/endpoints/skyhookEndpoints.d.ts.map +1 -1
  164. package/dist/core/logger/DefaultLogger.d.mts +20 -1
  165. package/dist/core/logger/DefaultLogger.d.ts +20 -1
  166. package/dist/core/logger/DefaultLogger.d.ts.map +1 -1
  167. package/dist/core/logger/ILogger.d.mts +9 -0
  168. package/dist/core/logger/ILogger.d.ts +9 -0
  169. package/dist/core/logger/ILogger.d.ts.map +1 -1
  170. package/dist/core/logger/NoopLogger.d.ts.map +1 -1
  171. package/dist/core/logger/clientLog.d.ts.map +1 -1
  172. package/dist/core/logger/loggerUtil.d.ts.map +1 -1
  173. package/dist/core/logger/redactLog.d.ts +23 -0
  174. package/dist/core/logger/redactLog.d.ts.map +1 -0
  175. package/dist/core/pagination/CursorPaginationHandler.d.mts +2 -1
  176. package/dist/core/pagination/CursorPaginationHandler.d.ts +2 -1
  177. package/dist/core/pagination/CursorPaginationHandler.d.ts.map +1 -1
  178. package/dist/core/ports/CacheStore.d.mts +32 -0
  179. package/dist/core/ports/CacheStore.d.ts +32 -0
  180. package/dist/core/ports/CacheStore.d.ts.map +1 -0
  181. package/dist/core/ports/Clock.d.mts +13 -0
  182. package/dist/core/ports/Clock.d.ts +13 -0
  183. package/dist/core/ports/Clock.d.ts.map +1 -0
  184. package/dist/core/ports/HttpTransport.d.mts +7 -0
  185. package/dist/core/ports/HttpTransport.d.ts +7 -0
  186. package/dist/core/ports/HttpTransport.d.ts.map +1 -0
  187. package/dist/core/ports/Identity.d.mts +31 -0
  188. package/dist/core/ports/Identity.d.ts +31 -0
  189. package/dist/core/ports/Identity.d.ts.map +1 -0
  190. package/dist/core/ports/Logger.d.mts +17 -0
  191. package/dist/core/ports/Logger.d.ts +17 -0
  192. package/dist/core/ports/Logger.d.ts.map +1 -0
  193. package/dist/core/ports/OperationTransport.d.mts +42 -0
  194. package/dist/core/ports/OperationTransport.d.ts +42 -0
  195. package/dist/core/ports/OperationTransport.d.ts.map +1 -0
  196. package/dist/core/ports/TokenProvider.d.mts +7 -0
  197. package/dist/core/ports/TokenProvider.d.ts +7 -0
  198. package/dist/core/ports/TokenProvider.d.ts.map +1 -0
  199. package/dist/core/ports/index.d.mts +14 -0
  200. package/dist/core/ports/index.d.ts +14 -0
  201. package/dist/core/ports/index.d.ts.map +1 -0
  202. package/dist/core/rateLimiter/RateLimiter.d.mts +11 -4
  203. package/dist/core/rateLimiter/RateLimiter.d.ts +11 -4
  204. package/dist/core/rateLimiter/RateLimiter.d.ts.map +1 -1
  205. package/dist/core/requestPipeline/cachePolicy.d.ts +5 -3
  206. package/dist/core/requestPipeline/cachePolicy.d.ts.map +1 -1
  207. package/dist/core/requestPipeline/fetchExecution.d.ts +3 -1
  208. package/dist/core/requestPipeline/fetchExecution.d.ts.map +1 -1
  209. package/dist/core/requestPipeline/headers.d.ts +1 -1
  210. package/dist/core/requestPipeline/headers.d.ts.map +1 -1
  211. package/dist/core/requestPipeline/index.d.ts +3 -5
  212. package/dist/core/requestPipeline/index.d.ts.map +1 -1
  213. package/dist/core/requestPipeline/paginationOrchestration.d.ts +1 -1
  214. package/dist/core/requestPipeline/paginationOrchestration.d.ts.map +1 -1
  215. package/dist/core/requestPipeline/statusHandling.d.ts +3 -3
  216. package/dist/core/requestPipeline/statusHandling.d.ts.map +1 -1
  217. package/dist/core/util/callerIdentity.d.ts +10 -0
  218. package/dist/core/util/callerIdentity.d.ts.map +1 -0
  219. package/dist/core/util/concurrency.d.ts +2 -2
  220. package/dist/core/util/concurrency.d.ts.map +1 -1
  221. package/dist/core/util/error.d.mts +92 -3
  222. package/dist/core/util/error.d.ts +92 -3
  223. package/dist/core/util/error.d.ts.map +1 -1
  224. package/dist/core/util/retry.d.mts +4 -4
  225. package/dist/core/util/retry.d.ts +4 -4
  226. package/dist/core/util/retry.d.ts.map +1 -1
  227. package/dist/core/util/validation.d.ts +6 -0
  228. package/dist/core/util/validation.d.ts.map +1 -1
  229. package/dist/errors.d.mts +2 -3
  230. package/dist/errors.d.ts +2 -3
  231. package/dist/errors.d.ts.map +1 -1
  232. package/dist/errors.js +29 -3
  233. package/dist/errors.js.map +1 -1
  234. package/dist/errors.mjs +28 -2
  235. package/dist/generated/operations.generated.d.mts +9379 -0
  236. package/dist/generated/operations.generated.d.ts +9379 -0
  237. package/dist/generated/operations.generated.d.ts.map +1 -0
  238. package/dist/index.d.mts +4 -4
  239. package/dist/index.d.ts +4 -4
  240. package/dist/index.d.ts.map +1 -1
  241. package/dist/index.js +699 -2864
  242. package/dist/index.js.map +1 -1
  243. package/dist/index.mjs +358 -2523
  244. package/dist/index.mjs.map +1 -1
  245. package/dist/schemas/character.d.mts +5 -0
  246. package/dist/schemas/character.d.ts +5 -0
  247. package/dist/schemas/character.d.ts.map +1 -1
  248. package/dist/schemas/contacts.d.mts +2 -0
  249. package/dist/schemas/contacts.d.ts +2 -0
  250. package/dist/schemas/contacts.d.ts.map +1 -1
  251. package/dist/schemas/corporation.d.mts +24 -3
  252. package/dist/schemas/corporation.d.ts +24 -3
  253. package/dist/schemas/corporation.d.ts.map +1 -1
  254. package/dist/schemas/fittings.d.mts +4 -0
  255. package/dist/schemas/fittings.d.ts +4 -0
  256. package/dist/schemas/fittings.d.ts.map +1 -1
  257. package/dist/schemas/fleet.d.mts +8 -0
  258. package/dist/schemas/fleet.d.ts +8 -0
  259. package/dist/schemas/fleet.d.ts.map +1 -1
  260. package/dist/schemas/index.js +24 -2
  261. package/dist/schemas/index.js.map +1 -1
  262. package/dist/schemas/index.mjs +23 -1
  263. package/dist/schemas/industry.d.mts +2 -2
  264. package/dist/schemas/industry.d.ts +2 -2
  265. package/dist/schemas/mail.d.mts +4 -0
  266. package/dist/schemas/mail.d.ts +4 -0
  267. package/dist/schemas/mail.d.ts.map +1 -1
  268. package/dist/schemas/mercenary.d.mts +1 -1
  269. package/dist/schemas/mercenary.d.ts +1 -1
  270. package/dist/schemas/meta.d.mts +18 -9
  271. package/dist/schemas/meta.d.ts +18 -9
  272. package/dist/schemas/meta.d.ts.map +1 -1
  273. package/dist/schemas/military-campaigns.d.mts +54 -10
  274. package/dist/schemas/military-campaigns.d.ts +54 -10
  275. package/dist/schemas/military-campaigns.d.ts.map +1 -1
  276. package/dist/schemas/paragon-hub.d.mts +4 -4
  277. package/dist/schemas/paragon-hub.d.ts +4 -4
  278. package/dist/schemas/skyhooks.d.mts +18 -6
  279. package/dist/schemas/skyhooks.d.ts +18 -6
  280. package/dist/schemas/skyhooks.d.ts.map +1 -1
  281. package/dist/sde/clock.d.ts +11 -0
  282. package/dist/sde/clock.d.ts.map +1 -0
  283. package/dist/sde/domain/characters/schemas.d.ts +149 -0
  284. package/dist/sde/domain/characters/schemas.d.ts.map +1 -0
  285. package/dist/sde/domain/characters/types.d.mts +163 -0
  286. package/dist/sde/domain/characters/types.d.ts +163 -0
  287. package/dist/sde/domain/characters/types.d.ts.map +1 -0
  288. package/dist/sde/domain/content/schemas.d.ts +84 -0
  289. package/dist/sde/domain/content/schemas.d.ts.map +1 -0
  290. package/dist/sde/domain/content/types.d.mts +91 -0
  291. package/dist/sde/domain/content/types.d.ts +91 -0
  292. package/dist/sde/domain/content/types.d.ts.map +1 -0
  293. package/dist/sde/domain/corporations/schemas.d.ts +113 -0
  294. package/dist/sde/domain/corporations/schemas.d.ts.map +1 -0
  295. package/dist/sde/domain/corporations/types.d.mts +118 -0
  296. package/dist/sde/domain/corporations/types.d.ts +118 -0
  297. package/dist/sde/domain/corporations/types.d.ts.map +1 -0
  298. package/dist/sde/domain/dogma/schemas.d.ts +76 -0
  299. package/dist/sde/domain/dogma/schemas.d.ts.map +1 -0
  300. package/dist/sde/domain/dogma/types.d.mts +80 -0
  301. package/dist/sde/domain/dogma/types.d.ts +80 -0
  302. package/dist/sde/domain/dogma/types.d.ts.map +1 -0
  303. package/dist/sde/domain/industry/schemas.d.ts +204 -0
  304. package/dist/sde/domain/industry/schemas.d.ts.map +1 -0
  305. package/dist/sde/domain/industry/types.d.mts +88 -0
  306. package/dist/sde/domain/industry/types.d.ts +88 -0
  307. package/dist/sde/domain/industry/types.d.ts.map +1 -0
  308. package/dist/sde/domain/market/schemas.d.ts +24 -0
  309. package/dist/sde/domain/market/schemas.d.ts.map +1 -0
  310. package/dist/sde/domain/market/types.d.mts +25 -0
  311. package/dist/sde/domain/market/types.d.ts +25 -0
  312. package/dist/sde/domain/market/types.d.ts.map +1 -0
  313. package/dist/sde/domain/schemas.d.ts +15 -0
  314. package/dist/sde/domain/schemas.d.ts.map +1 -0
  315. package/dist/sde/domain/skins/schemas.d.ts +109 -0
  316. package/dist/sde/domain/skins/schemas.d.ts.map +1 -0
  317. package/dist/sde/domain/skins/types.d.mts +121 -0
  318. package/dist/sde/domain/skins/types.d.ts +121 -0
  319. package/dist/sde/domain/skins/types.d.ts.map +1 -0
  320. package/dist/sde/domain/types/schemas.d.ts +163 -0
  321. package/dist/sde/domain/types/schemas.d.ts.map +1 -0
  322. package/dist/sde/domain/types/types.d.mts +182 -0
  323. package/dist/sde/domain/types/types.d.ts +182 -0
  324. package/dist/sde/domain/types/types.d.ts.map +1 -0
  325. package/dist/sde/domain/types.d.mts +16 -0
  326. package/dist/sde/domain/types.d.ts +16 -0
  327. package/dist/sde/domain/types.d.ts.map +1 -0
  328. package/dist/sde/domain/ui/schemas.d.ts +42 -0
  329. package/dist/sde/domain/ui/schemas.d.ts.map +1 -0
  330. package/dist/sde/domain/ui/types.d.mts +45 -0
  331. package/dist/sde/domain/ui/types.d.ts +45 -0
  332. package/dist/sde/domain/ui/types.d.ts.map +1 -0
  333. package/dist/sde/domain/universe/schemas.d.ts +239 -0
  334. package/dist/sde/domain/universe/schemas.d.ts.map +1 -0
  335. package/dist/sde/domain/universe/types.d.mts +206 -0
  336. package/dist/sde/domain/universe/types.d.ts +206 -0
  337. package/dist/sde/domain/universe/types.d.ts.map +1 -0
  338. package/dist/sde/domain/version/schemas.d.ts +11 -0
  339. package/dist/sde/domain/version/schemas.d.ts.map +1 -0
  340. package/dist/sde/errors.d.mts +1 -1
  341. package/dist/sde/errors.d.ts +1 -1
  342. package/dist/sde/errors.d.ts.map +1 -1
  343. package/dist/sde/index.d.mts +7 -6
  344. package/dist/sde/index.d.ts +7 -6
  345. package/dist/sde/index.d.ts.map +1 -1
  346. package/dist/sde/index.js +31 -21
  347. package/dist/sde/index.js.map +1 -1
  348. package/dist/sde/index.mjs +26 -16
  349. package/dist/sde/index.mjs.map +1 -1
  350. package/dist/sde/ingestion/SdeDatabaseBuilder.d.ts +11 -0
  351. package/dist/sde/ingestion/SdeDatabaseBuilder.d.ts.map +1 -1
  352. package/dist/sde/ingestion/SdeDownloader.d.ts +2 -2
  353. package/dist/sde/ingestion/SdeDownloader.d.ts.map +1 -1
  354. package/dist/sde/memory.d.mts +5 -5
  355. package/dist/sde/memory.d.ts +5 -5
  356. package/dist/sde/memory.d.ts.map +1 -1
  357. package/dist/sde/memory.js +2 -2
  358. package/dist/sde/memory.mjs +1 -1
  359. package/dist/sde/{IStaticDataProvider.d.mts → ports/IStaticDataProvider.d.mts} +9 -2
  360. package/dist/sde/{IStaticDataProvider.d.ts → ports/IStaticDataProvider.d.ts} +9 -2
  361. package/dist/sde/ports/IStaticDataProvider.d.ts.map +1 -0
  362. package/dist/sde/{MemorySdeProvider.d.mts → providers/memory/MemorySdeProvider.d.mts} +3 -3
  363. package/dist/sde/{MemorySdeProvider.d.ts → providers/memory/MemorySdeProvider.d.ts} +3 -3
  364. package/dist/sde/providers/memory/MemorySdeProvider.d.ts.map +1 -0
  365. package/dist/sde/providers/order.d.ts +10 -0
  366. package/dist/sde/providers/order.d.ts.map +1 -0
  367. package/dist/sde/{SdeDataProvider.d.mts → providers/yaml/SdeDataProvider.d.mts} +14 -5
  368. package/dist/sde/{SdeDataProvider.d.ts → providers/yaml/SdeDataProvider.d.ts} +14 -5
  369. package/dist/sde/providers/yaml/SdeDataProvider.d.ts.map +1 -0
  370. package/dist/sde/{SdeTestDataFactory.d.mts → testing/SdeTestDataFactory.d.mts} +3 -3
  371. package/dist/sde/{SdeTestDataFactory.d.ts → testing/SdeTestDataFactory.d.ts} +3 -3
  372. package/dist/sde/testing/SdeTestDataFactory.d.ts.map +1 -0
  373. package/dist/sde/version.d.mts +1 -1
  374. package/dist/sde/version.d.ts +1 -1
  375. package/dist/sde/version.d.ts.map +1 -1
  376. package/dist/testing/TestDataFactory.d.mts +21 -3
  377. package/dist/testing/TestDataFactory.d.ts +21 -3
  378. package/dist/testing/TestDataFactory.d.ts.map +1 -1
  379. package/dist/testing/index.d.mts +1 -0
  380. package/dist/testing/index.d.ts +1 -0
  381. package/dist/testing/index.d.ts.map +1 -1
  382. package/dist/testing/index.js +157 -10
  383. package/dist/testing/index.js.map +1 -1
  384. package/dist/testing/index.mjs +155 -8
  385. package/dist/testing/index.mjs.map +1 -1
  386. package/dist/testing/mockTransport.d.mts +87 -0
  387. package/dist/testing/mockTransport.d.ts +87 -0
  388. package/dist/testing/mockTransport.d.ts.map +1 -0
  389. package/dist/types/generated/esi-spec.generated.d.mts +230 -10
  390. package/dist/types/generated/esi-spec.generated.d.ts +230 -10
  391. package/dist/types/generated/esi-spec.generated.d.ts.map +1 -1
  392. package/dist/types/military-campaigns.d.mts +4 -1
  393. package/dist/types/military-campaigns.d.ts +4 -1
  394. package/dist/types/military-campaigns.d.ts.map +1 -1
  395. package/dist/types/skyhooks.d.mts +2 -1
  396. package/dist/types/skyhooks.d.ts +2 -1
  397. package/dist/types/skyhooks.d.ts.map +1 -1
  398. package/package.json +167 -131
  399. package/dist/chunk-3ZI5A37L.mjs.map +0 -1
  400. package/dist/chunk-4W66ONJI.mjs +0 -413
  401. package/dist/chunk-4W66ONJI.mjs.map +0 -1
  402. package/dist/chunk-BBSHKVPI.js.map +0 -1
  403. package/dist/chunk-MSJHIJXA.js.map +0 -1
  404. package/dist/chunk-N3B65VLB.js +0 -413
  405. package/dist/chunk-N3B65VLB.js.map +0 -1
  406. package/dist/chunk-R7D7M2LQ.mjs.map +0 -1
  407. package/dist/chunk-SAQBXXTM.js.map +0 -1
  408. package/dist/chunk-VZS32UQ3.mjs.map +0 -1
  409. package/dist/config/jest/globalSetup.d.ts +0 -2
  410. package/dist/config/jest/globalSetup.d.ts.map +0 -1
  411. package/dist/config/jest/globalTeardown.d.ts +0 -2
  412. package/dist/config/jest/globalTeardown.d.ts.map +0 -1
  413. package/dist/config/jest/jest.setup.d.ts +0 -3
  414. package/dist/config/jest/jest.setup.d.ts.map +0 -1
  415. package/dist/core/ClientRegistry.d.mts +0 -45
  416. package/dist/core/ClientRegistry.d.ts +0 -45
  417. package/dist/core/ClientRegistry.d.ts.map +0 -1
  418. package/dist/core/logger/logger.d.ts +0 -12
  419. package/dist/core/logger/logger.d.ts.map +0 -1
  420. package/dist/sde/IStaticDataProvider.d.ts.map +0 -1
  421. package/dist/sde/MemorySdeProvider.d.ts.map +0 -1
  422. package/dist/sde/SdeDataProvider.d.ts.map +0 -1
  423. package/dist/sde/SdeTestDataFactory.d.ts.map +0 -1
  424. package/dist/sde/schemas.d.ts +0 -1121
  425. package/dist/sde/schemas.d.ts.map +0 -1
  426. package/dist/sde/types.d.mts +0 -1039
  427. package/dist/sde/types.d.ts +0 -1039
  428. package/dist/sde/types.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/ESI.ts/ESI.ts/dist/sde/index.js","../../src/sde/SdeDataProvider.ts","../../src/sde/ingestion/constants.ts","../../src/sde/optionalPeers.ts","../../src/sde/ingestion/metadata.ts","../../src/sde/ingestion/SdeExtractor.ts","../../src/sde/ingestion/transforms.ts"],"names":[],"mappings":"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","file":"/home/runner/work/ESI.ts/ESI.ts/dist/sde/index.js","sourcesContent":[null,"import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { IStaticDataProvider } from './IStaticDataProvider';\nimport type {\n EveType,\n EveGroup,\n EveCategory,\n Region,\n Constellation,\n SolarSystem,\n Stargate,\n Star,\n Planet,\n Moon,\n AsteroidBelt,\n Faction,\n Race,\n Bloodline,\n Ancestry,\n NpcCorporation,\n NpcStation,\n MarketGroup,\n MetaGroup,\n Icon,\n Graphic,\n DogmaAttribute,\n DogmaEffect,\n Blueprint,\n PlanetSchematic,\n AgentType,\n AgentInSpace,\n Certificate,\n CharacterAttribute,\n CloneGrade,\n CorporationActivity,\n DogmaAttributeCategory,\n DogmaUnit,\n IndustryActivity,\n Landmark,\n NotificationType,\n NpcCharacter,\n NpcCorporationDivision,\n School,\n SecondarySun,\n Skin,\n SkinLicense,\n StationOperation,\n StationService,\n TypeDogma,\n TypeMaterial,\n TypeBonus,\n Mission,\n Dungeon,\n EpicArc,\n} from './types';\nimport type { SdeVersionInfo } from './version';\nimport {\n SDE_FILE_REGISTRY,\n SDE_METADATA_FILENAME,\n} from './ingestion/constants';\nimport type { SdeFileSpec } from './ingestion/constants';\nimport { SdeExtractor } from './ingestion/SdeExtractor';\nimport type { SdeMetadata } from './ingestion/SdeExtractor';\nimport { parseSdeMetadata } from './ingestion/metadata';\nimport { transformRecordNative } from './ingestion/transforms';\nimport { SdeError } from './errors';\nimport { loadJsYaml } from './optionalPeers';\n\nfunction toVersionInfo(metadata: SdeMetadata | undefined): SdeVersionInfo {\n return {\n version: metadata?.buildNumber || 'unknown',\n buildDate: metadata?.releaseDate || 'unknown',\n importedAt: new Date().toISOString(),\n };\n}\n\nexport class SdeDataProvider implements IStaticDataProvider {\n private entities = new Map<\n string,\n Map<number | string, Record<string, unknown>>\n >();\n private fkIndexes = new Map<\n string,\n Map<unknown, Record<string, unknown>[]>\n >();\n private versionInfo: SdeVersionInfo;\n\n private constructor(version: SdeVersionInfo) {\n this.versionInfo = version;\n }\n\n static fromDirectory(dirPath: string): SdeDataProvider {\n const resolvedDir = path.resolve(dirPath);\n if (!fs.existsSync(resolvedDir)) {\n throw new SdeError(`SDE directory not found: ${resolvedDir}`);\n }\n\n const metaPath = path.join(resolvedDir, SDE_METADATA_FILENAME);\n const metadata = fs.existsSync(metaPath)\n ? parseSdeMetadata(fs.readFileSync(metaPath, 'utf-8'))\n : undefined;\n\n const provider = new SdeDataProvider(toVersionInfo(metadata));\n\n for (const spec of SDE_FILE_REGISTRY) {\n const filePath = path.join(resolvedDir, spec.yamlFile);\n if (!fs.existsSync(filePath)) continue;\n\n const content = fs.readFileSync(filePath, 'utf-8');\n const parsed = loadJsYaml().load(content) as Record<\n string | number,\n Record<string, unknown>\n > | null;\n if (!parsed || typeof parsed !== 'object') continue;\n\n provider.loadRecords(spec, parsed);\n }\n\n return provider;\n }\n\n static fromZip(zipPath: string): SdeDataProvider {\n const resolvedPath = path.resolve(zipPath);\n if (!fs.existsSync(resolvedPath)) {\n throw new SdeError(`SDE ZIP file not found: ${resolvedPath}`);\n }\n\n const extractor = new SdeExtractor();\n const metadata = extractor.readMetadata(resolvedPath);\n\n const provider = new SdeDataProvider(toVersionInfo(metadata));\n\n const yamlFiles = SDE_FILE_REGISTRY.map((s) => s.yamlFile);\n const parsedFiles = extractor.parseFiles(resolvedPath, yamlFiles);\n const specMap = new Map(SDE_FILE_REGISTRY.map((s) => [s.yamlFile, s]));\n\n for (const file of parsedFiles) {\n const spec = specMap.get(file.filename);\n if (!spec) continue;\n\n const rawEntries: Record<string | number, Record<string, unknown>> = {};\n for (const [key, value] of file.records) {\n rawEntries[key] = value;\n }\n provider.loadRecords(spec, rawEntries);\n }\n\n return provider;\n }\n\n private loadRecords(\n spec: SdeFileSpec,\n raw: Record<string | number, Record<string, unknown>>,\n ): void {\n const records = new Map<number | string, Record<string, unknown>>();\n for (const [key, value] of Object.entries(raw)) {\n if (value == null || typeof value !== 'object') continue;\n const id = spec.idType === 'string' ? key : Number(key);\n const transformed = transformRecordNative(id, value, spec);\n records.set(id, transformed);\n }\n this.entities.set(spec.tableName, records);\n }\n\n // ---------------------------------------------------------------\n // Generic helpers\n // ---------------------------------------------------------------\n\n private getById<T>(tableName: string, id: number | string): T | null {\n const table = this.entities.get(tableName);\n if (!table) return null;\n const row = table.get(id);\n return (row as T) ?? null;\n }\n\n private getByFk<T>(\n tableName: string,\n fkField: string,\n fkValue: unknown,\n ): T[] {\n const indexKey = `${tableName}:${fkField}`;\n let index = this.fkIndexes.get(indexKey);\n if (!index) {\n index = new Map();\n const table = this.entities.get(tableName);\n if (table) {\n for (const row of table.values()) {\n const val = row[fkField];\n if (val == null) continue;\n const existing = index.get(val);\n if (existing) existing.push(row);\n else index.set(val, [row]);\n }\n }\n this.fkIndexes.set(indexKey, index);\n }\n return (index.get(fkValue) ?? []) as T[];\n }\n\n private getAllRecords<T>(tableName: string): T[] {\n const table = this.entities.get(tableName);\n if (!table) return [];\n return Array.from(table.values()) as T[];\n }\n\n private search<T>(\n tableName: string,\n field: string,\n query: string,\n limit: number,\n ): T[] {\n const table = this.entities.get(tableName);\n if (!table) return [];\n const lowerQuery = query.toLowerCase();\n const results: T[] = [];\n for (const row of table.values()) {\n const val = row[field];\n if (typeof val === 'string' && val.toLowerCase().includes(lowerQuery)) {\n results.push(row as T);\n if (results.length >= limit) break;\n }\n }\n return results;\n }\n\n private filterBy<T>(\n tableName: string,\n predicate: (row: Record<string, unknown>) => boolean,\n ): T[] {\n const table = this.entities.get(tableName);\n if (!table) return [];\n const results: T[] = [];\n for (const row of table.values()) {\n if (predicate(row)) results.push(row as T);\n }\n return results;\n }\n\n // ---------------------------------------------------------------\n // Generic entity accessors (for niche entities)\n // ---------------------------------------------------------------\n\n getEntity<T = Record<string, unknown>>(\n tableName: string,\n id: number | string,\n ): T | null {\n return this.getById<T>(tableName, id);\n }\n\n getAllEntities<T = Record<string, unknown>>(tableName: string): T[] {\n return this.getAllRecords<T>(tableName);\n }\n\n // ---------------------------------------------------------------\n // Types, Groups, Categories\n // ---------------------------------------------------------------\n\n getType(typeId: number): EveType | null {\n return this.getById<EveType>('eve_types', typeId);\n }\n\n getTypesByGroup(groupId: number): EveType[] {\n return this.getByFk<EveType>('eve_types', 'groupId', groupId);\n }\n\n getGroup(groupId: number): EveGroup | null {\n return this.getById<EveGroup>('eve_groups', groupId);\n }\n\n getGroupsByCategory(categoryId: number): EveGroup[] {\n return this.getByFk<EveGroup>('eve_groups', 'categoryId', categoryId);\n }\n\n getCategory(categoryId: number): EveCategory | null {\n return this.getById<EveCategory>('eve_categories', categoryId);\n }\n\n getAllCategories(): EveCategory[] {\n return this.getAllRecords<EveCategory>('eve_categories');\n }\n\n // ---------------------------------------------------------------\n // Regions, Constellations, Solar Systems, Stargates\n // ---------------------------------------------------------------\n\n getRegion(regionId: number): Region | null {\n return this.getById<Region>('eve_regions', regionId);\n }\n\n getAllRegions(): Region[] {\n return this.getAllRecords<Region>('eve_regions');\n }\n\n getConstellation(constellationId: number): Constellation | null {\n return this.getById<Constellation>('eve_constellations', constellationId);\n }\n\n getConstellationsByRegion(regionId: number): Constellation[] {\n return this.getByFk<Constellation>(\n 'eve_constellations',\n 'regionId',\n regionId,\n );\n }\n\n getSolarSystem(systemId: number): SolarSystem | null {\n return this.getById<SolarSystem>('eve_solar_systems', systemId);\n }\n\n getSolarSystemsByConstellation(constellationId: number): SolarSystem[] {\n return this.getByFk<SolarSystem>(\n 'eve_solar_systems',\n 'constellationId',\n constellationId,\n );\n }\n\n getStargate(stargateId: number): Stargate | null {\n return this.getById<Stargate>('eve_stargates', stargateId);\n }\n\n getStargatesBySystem(systemId: number): Stargate[] {\n return this.getByFk<Stargate>('eve_stargates', 'solarSystemId', systemId);\n }\n\n // ---------------------------------------------------------------\n // Search\n // ---------------------------------------------------------------\n\n searchTypesByName(query: string, limit = 25): EveType[] {\n return this.search<EveType>('eve_types', 'name', query, limit);\n }\n\n searchSolarSystemsByName(query: string, limit = 25): SolarSystem[] {\n return this.search<SolarSystem>('eve_solar_systems', 'name', query, limit);\n }\n\n // ---------------------------------------------------------------\n // Universe\n // ---------------------------------------------------------------\n\n getStar(starId: number): Star | null {\n return this.getById<Star>('eve_stars', starId);\n }\n\n getStarBySystem(systemId: number): Star | null {\n const stars = this.getByFk<Star>('eve_stars', 'solarSystemId', systemId);\n return stars[0] ?? null;\n }\n\n getPlanet(planetId: number): Planet | null {\n return this.getById<Planet>('eve_planets', planetId);\n }\n\n getPlanetsBySystem(systemId: number): Planet[] {\n return this.getByFk<Planet>('eve_planets', 'solarSystemId', systemId);\n }\n\n getMoon(moonId: number): Moon | null {\n return this.getById<Moon>('eve_moons', moonId);\n }\n\n getMoonsBySystem(systemId: number): Moon[] {\n return this.getByFk<Moon>('eve_moons', 'solarSystemId', systemId);\n }\n\n getAsteroidBelt(asteroidBeltId: number): AsteroidBelt | null {\n return this.getById<AsteroidBelt>('eve_asteroid_belts', asteroidBeltId);\n }\n\n getAsteroidBeltsBySystem(systemId: number): AsteroidBelt[] {\n return this.getByFk<AsteroidBelt>(\n 'eve_asteroid_belts',\n 'solarSystemId',\n systemId,\n );\n }\n\n // ---------------------------------------------------------------\n // Character/Lore\n // ---------------------------------------------------------------\n\n getFaction(factionId: number): Faction | null {\n return this.getById<Faction>('eve_factions', factionId);\n }\n\n getAllFactions(): Faction[] {\n return this.getAllRecords<Faction>('eve_factions');\n }\n\n getRace(raceId: number): Race | null {\n return this.getById<Race>('eve_races', raceId);\n }\n\n getAllRaces(): Race[] {\n return this.getAllRecords<Race>('eve_races');\n }\n\n getBloodline(bloodlineId: number): Bloodline | null {\n return this.getById<Bloodline>('eve_bloodlines', bloodlineId);\n }\n\n getBloodlinesByRace(raceId: number): Bloodline[] {\n return this.getByFk<Bloodline>('eve_bloodlines', 'raceId', raceId);\n }\n\n getAncestry(ancestryId: number): Ancestry | null {\n return this.getById<Ancestry>('eve_ancestries', ancestryId);\n }\n\n getAncestriesByBloodline(bloodlineId: number): Ancestry[] {\n return this.getByFk<Ancestry>('eve_ancestries', 'bloodlineId', bloodlineId);\n }\n\n // ---------------------------------------------------------------\n // NPC Infrastructure\n // ---------------------------------------------------------------\n\n getNpcCorporation(corporationId: number): NpcCorporation | null {\n return this.getById<NpcCorporation>('eve_npc_corporations', corporationId);\n }\n\n getNpcCorporationsByFaction(factionId: number): NpcCorporation[] {\n return this.getByFk<NpcCorporation>(\n 'eve_npc_corporations',\n 'factionId',\n factionId,\n );\n }\n\n getNpcStation(stationId: number): NpcStation | null {\n return this.getById<NpcStation>('eve_npc_stations', stationId);\n }\n\n getNpcStationsBySystem(systemId: number): NpcStation[] {\n return this.getByFk<NpcStation>(\n 'eve_npc_stations',\n 'solarSystemId',\n systemId,\n );\n }\n\n getNpcStationsByOwner(ownerId: number): NpcStation[] {\n return this.getByFk<NpcStation>('eve_npc_stations', 'ownerId', ownerId);\n }\n\n // ---------------------------------------------------------------\n // Market\n // ---------------------------------------------------------------\n\n getMarketGroup(marketGroupId: number): MarketGroup | null {\n return this.getById<MarketGroup>('eve_market_groups', marketGroupId);\n }\n\n getMarketGroupsByParent(parentGroupId: number): MarketGroup[] {\n return this.getByFk<MarketGroup>(\n 'eve_market_groups',\n 'parentGroupId',\n parentGroupId,\n );\n }\n\n getRootMarketGroups(): MarketGroup[] {\n return this.filterBy<MarketGroup>(\n 'eve_market_groups',\n (r) => r.parentGroupId == null,\n );\n }\n\n getTypesByMarketGroup(marketGroupId: number): EveType[] {\n return this.getByFk<EveType>('eve_types', 'marketGroupId', marketGroupId);\n }\n\n searchMarketGroupsByName(query: string, limit = 25): MarketGroup[] {\n return this.search<MarketGroup>('eve_market_groups', 'name', query, limit);\n }\n\n // ---------------------------------------------------------------\n // Meta/UI\n // ---------------------------------------------------------------\n\n getMetaGroup(metaGroupId: number): MetaGroup | null {\n return this.getById<MetaGroup>('eve_meta_groups', metaGroupId);\n }\n\n getAllMetaGroups(): MetaGroup[] {\n return this.getAllRecords<MetaGroup>('eve_meta_groups');\n }\n\n getIcon(iconId: number): Icon | null {\n return this.getById<Icon>('eve_icons', iconId);\n }\n\n getGraphic(graphicId: number): Graphic | null {\n return this.getById<Graphic>('eve_graphics', graphicId);\n }\n\n // ---------------------------------------------------------------\n // Dogma\n // ---------------------------------------------------------------\n\n getDogmaAttribute(attributeId: number): DogmaAttribute | null {\n return this.getById<DogmaAttribute>('eve_dogma_attributes', attributeId);\n }\n\n searchDogmaAttributesByName(query: string, limit = 25): DogmaAttribute[] {\n return this.search<DogmaAttribute>(\n 'eve_dogma_attributes',\n 'name',\n query,\n limit,\n );\n }\n\n getDogmaEffect(effectId: number): DogmaEffect | null {\n return this.getById<DogmaEffect>('eve_dogma_effects', effectId);\n }\n\n searchDogmaEffectsByName(query: string, limit = 25): DogmaEffect[] {\n return this.search<DogmaEffect>('eve_dogma_effects', 'name', query, limit);\n }\n\n // ---------------------------------------------------------------\n // Industry\n // ---------------------------------------------------------------\n\n getBlueprint(blueprintTypeId: number): Blueprint | null {\n return this.getById<Blueprint>('eve_blueprints', blueprintTypeId);\n }\n\n getPlanetSchematic(planetSchematicId: number): PlanetSchematic | null {\n return this.getById<PlanetSchematic>(\n 'eve_planet_schematics',\n planetSchematicId,\n );\n }\n\n getAllPlanetSchematics(): PlanetSchematic[] {\n return this.getAllRecords<PlanetSchematic>('eve_planet_schematics');\n }\n\n // ---------------------------------------------------------------\n // Agent System\n // ---------------------------------------------------------------\n\n getAgentType(agentTypeId: number): AgentType | null {\n return this.getById<AgentType>('eve_agent_types', agentTypeId);\n }\n\n getAllAgentTypes(): AgentType[] {\n return this.getAllRecords<AgentType>('eve_agent_types');\n }\n\n getAgentInSpace(characterId: number): AgentInSpace | null {\n return this.getById<AgentInSpace>('eve_agents_in_space', characterId);\n }\n\n getAgentsInSpaceBySystem(systemId: number): AgentInSpace[] {\n return this.getByFk<AgentInSpace>(\n 'eve_agents_in_space',\n 'solarSystemId',\n systemId,\n );\n }\n\n // ---------------------------------------------------------------\n // Certificates\n // ---------------------------------------------------------------\n\n getCertificate(certificateId: number): Certificate | null {\n return this.getById<Certificate>('eve_certificates', certificateId);\n }\n\n getAllCertificates(): Certificate[] {\n return this.getAllRecords<Certificate>('eve_certificates');\n }\n\n // ---------------------------------------------------------------\n // Character Attributes\n // ---------------------------------------------------------------\n\n getCharacterAttribute(attributeId: number): CharacterAttribute | null {\n return this.getById<CharacterAttribute>(\n 'eve_character_attributes',\n attributeId,\n );\n }\n\n getAllCharacterAttributes(): CharacterAttribute[] {\n return this.getAllRecords<CharacterAttribute>('eve_character_attributes');\n }\n\n // ---------------------------------------------------------------\n // NPC Characters\n // ---------------------------------------------------------------\n\n getNpcCharacter(characterId: number): NpcCharacter | null {\n return this.getById<NpcCharacter>('eve_npc_characters', characterId);\n }\n\n getNpcCharactersByCorporation(corporationId: number): NpcCharacter[] {\n return this.getByFk<NpcCharacter>(\n 'eve_npc_characters',\n 'corporationId',\n corporationId,\n );\n }\n\n searchNpcCharactersByName(query: string, limit = 25): NpcCharacter[] {\n return this.search<NpcCharacter>(\n 'eve_npc_characters',\n 'name',\n query,\n limit,\n );\n }\n\n // ---------------------------------------------------------------\n // Clone Grades\n // ---------------------------------------------------------------\n\n getCloneGrade(cloneGradeId: number): CloneGrade | null {\n return this.getById<CloneGrade>('eve_clone_grades', cloneGradeId);\n }\n\n getAllCloneGrades(): CloneGrade[] {\n return this.getAllRecords<CloneGrade>('eve_clone_grades');\n }\n\n // ---------------------------------------------------------------\n // Corporation Reference\n // ---------------------------------------------------------------\n\n getCorporationActivity(\n corporationActivityId: number,\n ): CorporationActivity | null {\n return this.getById<CorporationActivity>(\n 'eve_corporation_activities',\n corporationActivityId,\n );\n }\n\n getAllCorporationActivities(): CorporationActivity[] {\n return this.getAllRecords<CorporationActivity>(\n 'eve_corporation_activities',\n );\n }\n\n getNpcCorporationDivision(\n npcCorporationDivisionId: number,\n ): NpcCorporationDivision | null {\n return this.getById<NpcCorporationDivision>(\n 'eve_npc_corporation_divisions',\n npcCorporationDivisionId,\n );\n }\n\n getAllNpcCorporationDivisions(): NpcCorporationDivision[] {\n return this.getAllRecords<NpcCorporationDivision>(\n 'eve_npc_corporation_divisions',\n );\n }\n\n // ---------------------------------------------------------------\n // Dogma Reference\n // ---------------------------------------------------------------\n\n getDogmaAttributeCategory(\n attributeCategoryId: number,\n ): DogmaAttributeCategory | null {\n return this.getById<DogmaAttributeCategory>(\n 'eve_dogma_attribute_categories',\n attributeCategoryId,\n );\n }\n\n getAllDogmaAttributeCategories(): DogmaAttributeCategory[] {\n return this.getAllRecords<DogmaAttributeCategory>(\n 'eve_dogma_attribute_categories',\n );\n }\n\n getDogmaUnit(unitId: number): DogmaUnit | null {\n return this.getById<DogmaUnit>('eve_dogma_units', unitId);\n }\n\n getAllDogmaUnits(): DogmaUnit[] {\n return this.getAllRecords<DogmaUnit>('eve_dogma_units');\n }\n\n // ---------------------------------------------------------------\n // Industry Reference\n // ---------------------------------------------------------------\n\n getIndustryActivity(industryActivityId: number): IndustryActivity | null {\n return this.getById<IndustryActivity>(\n 'eve_industry_activities',\n industryActivityId,\n );\n }\n\n getAllIndustryActivities(): IndustryActivity[] {\n return this.getAllRecords<IndustryActivity>('eve_industry_activities');\n }\n\n // ---------------------------------------------------------------\n // Landmarks\n // ---------------------------------------------------------------\n\n getLandmark(landmarkId: number): Landmark | null {\n return this.getById<Landmark>('eve_landmarks', landmarkId);\n }\n\n getAllLandmarks(): Landmark[] {\n return this.getAllRecords<Landmark>('eve_landmarks');\n }\n\n // ---------------------------------------------------------------\n // Notifications\n // ---------------------------------------------------------------\n\n getNotificationType(notificationTypeId: number): NotificationType | null {\n return this.getById<NotificationType>(\n 'eve_notification_types',\n notificationTypeId,\n );\n }\n\n // ---------------------------------------------------------------\n // Schools\n // ---------------------------------------------------------------\n\n getSchool(schoolId: number): School | null {\n return this.getById<School>('eve_schools', schoolId);\n }\n\n getAllSchools(): School[] {\n return this.getAllRecords<School>('eve_schools');\n }\n\n // ---------------------------------------------------------------\n // Secondary Suns\n // ---------------------------------------------------------------\n\n getSecondarySun(secondarySunId: number): SecondarySun | null {\n return this.getById<SecondarySun>('eve_secondary_suns', secondarySunId);\n }\n\n getSecondarySunsBySystem(systemId: number): SecondarySun[] {\n return this.getByFk<SecondarySun>(\n 'eve_secondary_suns',\n 'solarSystemId',\n systemId,\n );\n }\n\n // ---------------------------------------------------------------\n // Skins\n // ---------------------------------------------------------------\n\n getSkin(skinId: number): Skin | null {\n return this.getById<Skin>('eve_skins', skinId);\n }\n\n getSkinLicense(licenseTypeId: number): SkinLicense | null {\n return this.getById<SkinLicense>('eve_skin_licenses', licenseTypeId);\n }\n\n getSkinLicensesBySkin(skinId: number): SkinLicense[] {\n return this.getByFk<SkinLicense>('eve_skin_licenses', 'skinId', skinId);\n }\n\n // ---------------------------------------------------------------\n // Station Operations & Services\n // ---------------------------------------------------------------\n\n getStationOperation(stationOperationId: number): StationOperation | null {\n return this.getById<StationOperation>(\n 'eve_station_operations',\n stationOperationId,\n );\n }\n\n getAllStationOperations(): StationOperation[] {\n return this.getAllRecords<StationOperation>('eve_station_operations');\n }\n\n getStationService(stationServiceId: number): StationService | null {\n return this.getById<StationService>(\n 'eve_station_services',\n stationServiceId,\n );\n }\n\n getAllStationServices(): StationService[] {\n return this.getAllRecords<StationService>('eve_station_services');\n }\n\n // ---------------------------------------------------------------\n // Type Properties\n // ---------------------------------------------------------------\n\n getTypeDogma(typeId: number): TypeDogma | null {\n return this.getById<TypeDogma>('eve_type_dogma', typeId);\n }\n\n getTypeMaterial(typeId: number): TypeMaterial | null {\n return this.getById<TypeMaterial>('eve_type_materials', typeId);\n }\n\n getTypeBonus(typeId: number): TypeBonus | null {\n return this.getById<TypeBonus>('eve_type_bonuses', typeId);\n }\n\n // ---------------------------------------------------------------\n // Missions & Content\n // ---------------------------------------------------------------\n\n getMission(missionId: number): Mission | null {\n return this.getById<Mission>('eve_missions', missionId);\n }\n\n getDungeon(dungeonId: number): Dungeon | null {\n return this.getById<Dungeon>('eve_dungeons', dungeonId);\n }\n\n getEpicArc(epicArcId: number): EpicArc | null {\n return this.getById<EpicArc>('eve_epic_arcs', epicArcId);\n }\n\n getAllEpicArcs(): EpicArc[] {\n return this.getAllRecords<EpicArc>('eve_epic_arcs');\n }\n\n // ---------------------------------------------------------------\n // Version & Lifecycle\n // ---------------------------------------------------------------\n\n getVersion(): SdeVersionInfo {\n return { ...this.versionInfo };\n }\n\n close(): void {\n this.entities.clear();\n this.fkIndexes.clear();\n }\n}\n","export const SDE_DOWNLOAD_URL =\n 'https://developers.eveonline.com/static-data/eve-online-static-data-latest-yaml.zip';\n\nexport const SDE_LATEST_BUILD_URL =\n 'https://developers.eveonline.com/static-data/tranquility/latest.jsonl';\n\nexport const SDE_BUILD_NUMBER_HEADER = 'x-sde-build-number';\n\nexport const SDE_METADATA_FILENAME = '_sde.yaml';\n\nexport interface SdeFileSpec {\n readonly yamlFile: string;\n readonly tableName: string;\n readonly idAttribute: string;\n readonly idType: 'number' | 'string';\n readonly injectId: boolean;\n}\n\nexport const SDE_FILE_REGISTRY: readonly SdeFileSpec[] = [\n // --- Universe / Map ---\n {\n yamlFile: 'mapRegions.yaml',\n tableName: 'eve_regions',\n idAttribute: 'regionId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'mapConstellations.yaml',\n tableName: 'eve_constellations',\n idAttribute: 'constellationId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'mapSolarSystems.yaml',\n tableName: 'eve_solar_systems',\n idAttribute: 'systemId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'mapStargates.yaml',\n tableName: 'eve_stargates',\n idAttribute: 'stargateId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'mapStars.yaml',\n tableName: 'eve_stars',\n idAttribute: 'starId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'mapPlanets.yaml',\n tableName: 'eve_planets',\n idAttribute: 'planetId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'mapMoons.yaml',\n tableName: 'eve_moons',\n idAttribute: 'moonId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'mapAsteroidBelts.yaml',\n tableName: 'eve_asteroid_belts',\n idAttribute: 'asteroidBeltId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'mapSecondarySuns.yaml',\n tableName: 'eve_secondary_suns',\n idAttribute: 'secondarySunId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Type System ---\n {\n yamlFile: 'types.yaml',\n tableName: 'eve_types',\n idAttribute: 'typeId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'groups.yaml',\n tableName: 'eve_groups',\n idAttribute: 'groupId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'categories.yaml',\n tableName: 'eve_categories',\n idAttribute: 'categoryId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'metaGroups.yaml',\n tableName: 'eve_meta_groups',\n idAttribute: 'metaGroupId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'typeDogma.yaml',\n tableName: 'eve_type_dogma',\n idAttribute: 'typeId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'typeBonus.yaml',\n tableName: 'eve_type_bonuses',\n idAttribute: 'typeId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'typeElements.yaml',\n tableName: 'eve_type_elements',\n idAttribute: 'typeId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'typeLists.yaml',\n tableName: 'eve_type_lists',\n idAttribute: 'typeListId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'typeMaterials.yaml',\n tableName: 'eve_type_materials',\n idAttribute: 'typeId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'compressibleTypes.yaml',\n tableName: 'eve_compressible_types',\n idAttribute: 'typeId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'contrabandTypes.yaml',\n tableName: 'eve_contraband_types',\n idAttribute: 'typeId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Dogma ---\n {\n yamlFile: 'dogmaAttributes.yaml',\n tableName: 'eve_dogma_attributes',\n idAttribute: 'attributeId',\n idType: 'number',\n injectId: false,\n },\n {\n yamlFile: 'dogmaEffects.yaml',\n tableName: 'eve_dogma_effects',\n idAttribute: 'effectId',\n idType: 'number',\n injectId: false,\n },\n {\n yamlFile: 'dogmaAttributeCategories.yaml',\n tableName: 'eve_dogma_attribute_categories',\n idAttribute: 'attributeCategoryId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'dogmaUnits.yaml',\n tableName: 'eve_dogma_units',\n idAttribute: 'unitId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Industry ---\n {\n yamlFile: 'blueprints.yaml',\n tableName: 'eve_blueprints',\n idAttribute: 'blueprintTypeId',\n idType: 'number',\n injectId: false,\n },\n {\n yamlFile: 'planetSchematics.yaml',\n tableName: 'eve_planet_schematics',\n idAttribute: 'planetSchematicId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'planetResources.yaml',\n tableName: 'eve_planet_resources',\n idAttribute: 'planetId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Market ---\n {\n yamlFile: 'marketGroups.yaml',\n tableName: 'eve_market_groups',\n idAttribute: 'marketGroupId',\n idType: 'number',\n injectId: true,\n },\n\n // --- NPCs / Agents ---\n {\n yamlFile: 'agentTypes.yaml',\n tableName: 'eve_agent_types',\n idAttribute: 'agentTypeId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'agentsInSpace.yaml',\n tableName: 'eve_agents_in_space',\n idAttribute: 'characterId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'npcCharacters.yaml',\n tableName: 'eve_npc_characters',\n idAttribute: 'characterId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'npcCorporations.yaml',\n tableName: 'eve_npc_corporations',\n idAttribute: 'corporationId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'npcCorporationDivisions.yaml',\n tableName: 'eve_npc_corporation_divisions',\n idAttribute: 'npcCorporationDivisionId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'npcStations.yaml',\n tableName: 'eve_npc_stations',\n idAttribute: 'stationId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'factions.yaml',\n tableName: 'eve_factions',\n idAttribute: 'factionId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Character / Lore ---\n {\n yamlFile: 'races.yaml',\n tableName: 'eve_races',\n idAttribute: 'raceId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'bloodlines.yaml',\n tableName: 'eve_bloodlines',\n idAttribute: 'bloodlineId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'ancestries.yaml',\n tableName: 'eve_ancestries',\n idAttribute: 'ancestryId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'characterAttributes.yaml',\n tableName: 'eve_character_attributes',\n idAttribute: 'attributeId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'characterTitles.yaml',\n tableName: 'eve_character_titles',\n idAttribute: 'characterTitleId',\n idType: 'string',\n injectId: false,\n },\n {\n yamlFile: 'cloneGrades.yaml',\n tableName: 'eve_clone_grades',\n idAttribute: 'cloneGradeId',\n idType: 'number',\n injectId: true,\n },\n\n // --- SKINs ---\n {\n yamlFile: 'skins.yaml',\n tableName: 'eve_skins',\n idAttribute: 'skinId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'skinLicenses.yaml',\n tableName: 'eve_skin_licenses',\n idAttribute: 'licenseTypeId',\n idType: 'number',\n injectId: false,\n },\n {\n yamlFile: 'skinMaterials.yaml',\n tableName: 'eve_skin_materials',\n idAttribute: 'skinMaterialId',\n idType: 'number',\n injectId: false,\n },\n\n // --- SKINR ---\n {\n yamlFile: 'skinrComponents.yaml',\n tableName: 'eve_skinr_components',\n idAttribute: 'skinrComponentId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'skinrComponentCategories.yaml',\n tableName: 'eve_skinr_component_categories',\n idAttribute: 'skinrComponentCategoryId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'skinrComponentRarities.yaml',\n tableName: 'eve_skinr_component_rarities',\n idAttribute: 'skinrComponentRarityId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'skinrComponentPointValues.yaml',\n tableName: 'eve_skinr_component_point_values',\n idAttribute: 'skinrComponentCategoryId',\n idType: 'number',\n injectId: false,\n },\n {\n yamlFile: 'skinrSlots.yaml',\n tableName: 'eve_skinr_slots',\n idAttribute: 'skinrSlotId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'skinrSlotCategories.yaml',\n tableName: 'eve_skinr_slot_categories',\n idAttribute: 'skinrSlotCategoryId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'skinrSlotConfigurations.yaml',\n tableName: 'eve_skinr_slot_configurations',\n idAttribute: 'skinrSlotConfigurationId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'skinrSlotNames.yaml',\n tableName: 'eve_skinr_slot_names',\n idAttribute: 'skinrSlotNameId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'skinrTierThresholds.yaml',\n tableName: 'eve_skinr_tier_thresholds',\n idAttribute: 'shipTreeGroupId',\n idType: 'number',\n injectId: false,\n },\n\n // --- Ship Tree ---\n {\n yamlFile: 'shipTreeElements.yaml',\n tableName: 'eve_ship_tree_elements',\n idAttribute: 'shipTreeElementId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'shipTreeFactions.yaml',\n tableName: 'eve_ship_tree_factions',\n idAttribute: 'factionId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'shipTreeGroups.yaml',\n tableName: 'eve_ship_tree_groups',\n idAttribute: 'shipTreeGroupId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Graphics ---\n {\n yamlFile: 'graphics.yaml',\n tableName: 'eve_graphics',\n idAttribute: 'graphicId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'graphicMaterialSets.yaml',\n tableName: 'eve_graphic_material_sets',\n idAttribute: 'materialSetId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'icons.yaml',\n tableName: 'eve_icons',\n idAttribute: 'iconId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Stations ---\n {\n yamlFile: 'stationOperations.yaml',\n tableName: 'eve_station_operations',\n idAttribute: 'stationOperationId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'stationServices.yaml',\n tableName: 'eve_station_services',\n idAttribute: 'stationServiceId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Sovereignty ---\n {\n yamlFile: 'sovereigntyUpgrades.yaml',\n tableName: 'eve_sovereignty_upgrades',\n idAttribute: 'typeId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Certificates / Masteries ---\n {\n yamlFile: 'certificates.yaml',\n tableName: 'eve_certificates',\n idAttribute: 'certificateId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'masteries.yaml',\n tableName: 'eve_masteries',\n idAttribute: 'typeId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Misc ---\n {\n yamlFile: 'archetypes.yaml',\n tableName: 'eve_archetypes',\n idAttribute: 'archetypeId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'controlTowerResources.yaml',\n tableName: 'eve_control_tower_resources',\n idAttribute: 'typeId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'corporationActivities.yaml',\n tableName: 'eve_corporation_activities',\n idAttribute: 'corporationActivityId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'dbuffCollections.yaml',\n tableName: 'eve_dbuff_collections',\n idAttribute: 'dbuffCollectionId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'dungeons.yaml',\n tableName: 'eve_dungeons',\n idAttribute: 'dungeonId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'dynamicItemAttributes.yaml',\n tableName: 'eve_dynamic_item_attributes',\n idAttribute: 'dynamicItemAttributeId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'epicArcs.yaml',\n tableName: 'eve_epic_arcs',\n idAttribute: 'epicArcId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'freelanceJobSchemas.yaml',\n tableName: 'eve_freelance_job_schemas',\n idAttribute: 'freelanceJobSchemaGroupId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'landmarks.yaml',\n tableName: 'eve_landmarks',\n idAttribute: 'landmarkId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'mercenaryTacticalOperations.yaml',\n tableName: 'eve_mercenary_tactical_operations',\n idAttribute: 'mercenaryTacticalOperationId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'militaryCampaigns.yaml',\n tableName: 'eve_military_campaigns',\n idAttribute: 'militaryCampaignId',\n idType: 'string',\n injectId: true,\n },\n {\n yamlFile: 'militaryCampaignObjectives.yaml',\n tableName: 'eve_military_campaign_objectives',\n idAttribute: 'militaryCampaignObjectiveId',\n idType: 'string',\n injectId: true,\n },\n {\n yamlFile: 'missions.yaml',\n tableName: 'eve_missions',\n idAttribute: 'missionId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Translation ---\n {\n yamlFile: 'translationLanguages.yaml',\n tableName: 'eve_translation_languages',\n idAttribute: 'translationLanguageId',\n idType: 'string',\n injectId: true,\n },\n\n // --- Industry (extended) ---\n {\n yamlFile: 'industryActivities.yaml',\n tableName: 'eve_industry_activities',\n idAttribute: 'industryActivityId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'industryAssemblyLines.yaml',\n tableName: 'eve_industry_assembly_lines',\n idAttribute: 'assemblyLineId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'industryInstallationTypes.yaml',\n tableName: 'eve_industry_installation_types',\n idAttribute: 'installationTypeId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'industryModifierSources.yaml',\n tableName: 'eve_industry_modifier_sources',\n idAttribute: 'modifierSourceId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'industryTargetFilters.yaml',\n tableName: 'eve_industry_target_filters',\n idAttribute: 'targetFilterId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Fighters ---\n {\n yamlFile: 'fighterAbilities.yaml',\n tableName: 'eve_fighter_abilities',\n idAttribute: 'fighterAbilityId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'fighterAbilitiesByType.yaml',\n tableName: 'eve_fighter_abilities_by_type',\n idAttribute: 'typeId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Corporation ---\n {\n yamlFile: 'corporationRoles.yaml',\n tableName: 'eve_corporation_roles',\n idAttribute: 'corporationRoleId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'corporationRoleGroups.yaml',\n tableName: 'eve_corporation_role_groups',\n idAttribute: 'corporationRoleGroupId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Schools / Education ---\n {\n yamlFile: 'schools.yaml',\n tableName: 'eve_schools',\n idAttribute: 'schoolId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'schoolMap.yaml',\n tableName: 'eve_school_map',\n idAttribute: 'schoolMapId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'skillPlans.yaml',\n tableName: 'eve_skill_plans',\n idAttribute: 'skillPlanId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'expertSystems.yaml',\n tableName: 'eve_expert_systems',\n idAttribute: 'expertSystemId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Notifications ---\n {\n yamlFile: 'notificationTypes.yaml',\n tableName: 'eve_notification_types',\n idAttribute: 'notificationTypeId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'accountingEntryTypes.yaml',\n tableName: 'eve_accounting_entry_types',\n idAttribute: 'accountingEntryTypeId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Effects / Traps / Dbuffs ---\n {\n yamlFile: 'appliedProximityEffects.yaml',\n tableName: 'eve_applied_proximity_effects',\n idAttribute: 'appliedProximityEffectId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'proximityTrap.yaml',\n tableName: 'eve_proximity_traps',\n idAttribute: 'proximityTrapId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'systemDbuffEmitters.yaml',\n tableName: 'eve_system_dbuff_emitters',\n idAttribute: 'systemDbuffEmitterId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'systemWideEffects.yaml',\n tableName: 'eve_system_wide_effects',\n idAttribute: 'systemWideEffectId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'linkWithShip.yaml',\n tableName: 'eve_link_with_ship',\n idAttribute: 'linkWithShipId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Station (extended) ---\n {\n yamlFile: 'stationStandingsRestrictions.yaml',\n tableName: 'eve_station_standings_restrictions',\n idAttribute: 'stationStandingsRestrictionId',\n idType: 'number',\n injectId: true,\n },\n\n // --- SKINR (extended) ---\n {\n yamlFile: 'skinrSlotsToMaterials.yaml',\n tableName: 'eve_skinr_slots_to_materials',\n idAttribute: 'skinrSlotToMaterialId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Metenox ---\n {\n yamlFile: 'metenoxMoonDrill.yaml',\n tableName: 'eve_metenox_moon_drill',\n idAttribute: 'metenoxMoonDrillId',\n idType: 'number',\n injectId: true,\n },\n] as const;\n","import { createRequire } from 'node:module';\nimport type * as JsYaml from 'js-yaml';\nimport type AdmZip from 'adm-zip';\nimport { SdeError } from './errors';\n\n/**\n * Loads js-yaml and adm-zip, the optional peer dependencies of\n * `@lgriffin/esi.ts/sde`, on first use instead of at import time, so the\n * entry point loads in an install that has neither.\n *\n * The loading is synchronous because `SdeDataProvider.fromDirectory` and\n * `fromZip` are. `require` is created from this file's location so the peers\n * resolve from wherever the package is installed: in the CommonJS bundle\n * `__filename` is Node's own; in the ES module bundle tsup's `shims` option\n * defines it from `import.meta.url`.\n */\n\ntype OptionalPeer = 'js-yaml' | 'adm-zip';\n\ntype RequireFn = (id: string) => unknown;\n\nconst requireFromPackage: RequireFn = createRequire(__filename);\n\nfunction isMissing(err: unknown, peer: OptionalPeer): boolean {\n if (!(err instanceof Error)) return false;\n const code = (err as NodeJS.ErrnoException).code;\n // A MODULE_NOT_FOUND raised for something inside the peer is not \"missing\".\n return (\n (code === 'MODULE_NOT_FOUND' || code === 'ERR_MODULE_NOT_FOUND') &&\n err.message.includes(`'${peer}'`)\n );\n}\n\n/**\n * Requires an optional peer. When it is not installed, throws an `SdeError`\n * naming the package, what needs it and the command that installs it. Any\n * other failure while loading the peer is rethrown unchanged.\n */\nexport function requireOptionalPeer<T>(\n peer: OptionalPeer,\n neededFor: string,\n load: RequireFn = requireFromPackage,\n): T {\n try {\n return load(peer) as T;\n } catch (err) {\n if (isMissing(err, peer)) {\n throw new SdeError(\n `${peer} is required to ${neededFor}. It is an optional peer dependency of @lgriffin/esi.ts; install it with: npm install ${peer}`,\n );\n }\n throw err;\n }\n}\n\nexport function loadJsYaml(): typeof JsYaml {\n return requireOptionalPeer<typeof JsYaml>('js-yaml', 'parse SDE YAML files');\n}\n\nexport function loadAdmZip(): typeof AdmZip {\n return requireOptionalPeer<typeof AdmZip>('adm-zip', 'read SDE ZIP archives');\n}\n","import { loadJsYaml } from '../optionalPeers';\nimport type { SdeMetadata } from './SdeExtractor';\n\nfunction asText(value: unknown): string {\n return typeof value === 'string' || typeof value === 'number'\n ? String(value)\n : '';\n}\n\n/**\n * Parses the contents of an SDE `_sde.yaml` file. The fields may sit at the\n * top level or be nested under an `sde:` key; the nested block wins when both\n * are present. A field that is missing or is not a string or number comes back\n * as an empty string.\n *\n * `SdeDataProvider.fromDirectory` and `SdeExtractor.readMetadata` (behind\n * `fromZip`) both read metadata through this function, so the two layouts give\n * the same result whichever way the SDE is loaded.\n */\nexport function parseSdeMetadata(content: string): SdeMetadata {\n const parsed = loadJsYaml().load(content) as Record<string, unknown>;\n const block = (parsed.sde ?? parsed) as Record<string, unknown>;\n return {\n buildNumber: asText(block.buildNumber),\n releaseDate: asText(block.releaseDate),\n };\n}\n","import type AdmZip from 'adm-zip';\nimport { SDE_METADATA_FILENAME } from './constants';\nimport { SdeError } from '../errors';\nimport { loadAdmZip, loadJsYaml } from '../optionalPeers';\nimport { parseSdeMetadata } from './metadata';\n\nexport interface SdeMetadata {\n buildNumber: string;\n releaseDate: string;\n}\n\nexport interface ParsedSdeFile {\n filename: string;\n records: Map<string | number, Record<string, unknown>>;\n}\n\nfunction findEntry(\n zip: AdmZip,\n filename: string,\n): AdmZip.IZipEntry | undefined {\n const basename = filename.replace(/^.*[\\\\/]/, '');\n return zip.getEntries().find((entry) => {\n if (entry.isDirectory) return false;\n const entryBasename = entry.entryName.replace(/^.*[\\\\/]/, '');\n return (\n entryBasename === basename ||\n entry.entryName === filename ||\n entry.entryName === `sde/${filename}`\n );\n });\n}\n\nfunction openZip(zipPath: string): AdmZip {\n const Zip = loadAdmZip();\n return new Zip(zipPath);\n}\n\nfunction readEntryAsString(entry: AdmZip.IZipEntry): string {\n const buffer = entry.getData();\n return buffer.toString('utf-8');\n}\n\nexport class SdeExtractor {\n readMetadata(zipPath: string): SdeMetadata {\n const zip = openZip(zipPath);\n const entry = findEntry(zip, SDE_METADATA_FILENAME);\n\n if (!entry) {\n throw new SdeError(\n `Metadata file '${SDE_METADATA_FILENAME}' not found in archive: ${zipPath}`,\n );\n }\n\n return parseSdeMetadata(readEntryAsString(entry));\n }\n\n parseFile(zipPath: string, filename: string): ParsedSdeFile {\n const zip = openZip(zipPath);\n return this.parseFileFromZip(zip, filename);\n }\n\n parseFiles(zipPath: string, filenames: string[]): ParsedSdeFile[] {\n const zip = openZip(zipPath);\n const results: ParsedSdeFile[] = [];\n\n for (const filename of filenames) {\n const entry = findEntry(zip, filename);\n if (!entry) {\n // File not present in this SDE build — skip silently\n continue;\n }\n results.push(this.parseEntryAsFile(entry, filename));\n }\n\n return results;\n }\n\n extractAll(zipPath: string, outputDir: string): void {\n const zip = openZip(zipPath);\n zip.extractAllTo(outputDir, true);\n }\n\n listFiles(zipPath: string): string[] {\n const zip = openZip(zipPath);\n return zip\n .getEntries()\n .filter(\n (entry) => !entry.isDirectory && entry.entryName.endsWith('.yaml'),\n )\n .map((entry) => entry.entryName);\n }\n\n private parseFileFromZip(zip: AdmZip, filename: string): ParsedSdeFile {\n const entry = findEntry(zip, filename);\n\n if (!entry) {\n throw new SdeError(`File '${filename}' not found in archive`);\n }\n\n return this.parseEntryAsFile(entry, filename);\n }\n\n private parseEntryAsFile(\n entry: AdmZip.IZipEntry,\n filename: string,\n ): ParsedSdeFile {\n const content = readEntryAsString(entry);\n const parsed = loadJsYaml().load(content) as Record<\n string | number,\n Record<string, unknown>\n >;\n const records = new Map<string | number, Record<string, unknown>>(\n Object.entries(parsed).map(([key, value]) => {\n const numKey = Number(key);\n return [Number.isNaN(numKey) ? key : numKey, value];\n }),\n );\n\n return { filename, records };\n }\n}\n","export type SqliteValue = string | number | null;\n\nexport function extractLocale(\n field: unknown,\n locale: string = 'en',\n fallback: string = '',\n): string {\n if (field == null) return fallback;\n if (typeof field === 'string') return field;\n if (typeof field === 'object' && !Array.isArray(field)) {\n const map = field as Record<string, unknown>;\n // eslint-disable-next-line security/detect-object-injection\n const value = map[locale];\n if (typeof value === 'string') return value;\n return fallback;\n }\n return fallback;\n}\n\nexport function normalizeSdeFieldName(name: string): string {\n return name.replace(/ID(?=[A-Z]|$)/g, 'Id');\n}\n\n// eslint-disable-next-line sonarjs/function-return-type -- union return is intentional\nexport function toSqliteValue(value: unknown): SqliteValue {\n if (value == null) return null;\n if (typeof value === 'boolean') return value ? 1 : 0;\n if (typeof value === 'number') return value;\n if (typeof value === 'string') return value;\n if (typeof value === 'object') return JSON.stringify(value);\n return null;\n}\n\nfunction isLocaleMap(value: unknown): value is Record<string, string> {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n return 'en' in (value as Record<string, unknown>);\n}\n\nexport function transformRecord(\n entityId: number | string,\n raw: Record<string, unknown>,\n spec: { idAttribute: string; injectId: boolean },\n): Record<string, SqliteValue> {\n const row: Record<string, SqliteValue> = {};\n\n if (spec.injectId) {\n row[spec.idAttribute] =\n typeof entityId === 'string' ? entityId : Number(entityId);\n }\n\n for (const [key, value] of Object.entries(raw)) {\n const normalizedKey = normalizeSdeFieldName(key);\n\n if (isLocaleMap(value)) {\n row[normalizedKey] = extractLocale(value);\n } else {\n row[normalizedKey] = toSqliteValue(value);\n }\n }\n\n return row;\n}\n\nfunction normalizeNested(value: unknown): unknown {\n if (value == null || typeof value !== 'object') return value;\n if (Array.isArray(value)) return value.map(normalizeNested);\n const obj = value as Record<string, unknown>;\n if (isLocaleMap(obj)) return extractLocale(obj);\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n out[normalizeSdeFieldName(k)] = normalizeNested(v);\n }\n return out;\n}\n\nexport function transformRecordNative(\n entityId: number | string,\n raw: Record<string, unknown>,\n spec: { idAttribute: string; injectId: boolean },\n): Record<string, unknown> {\n const row: Record<string, unknown> = {};\n\n if (spec.injectId) {\n row[spec.idAttribute] =\n typeof entityId === 'string' ? entityId : Number(entityId);\n }\n\n for (const [key, value] of Object.entries(raw)) {\n const normalizedKey = normalizeSdeFieldName(key);\n\n if (isLocaleMap(value)) {\n row[normalizedKey] = extractLocale(value);\n } else {\n row[normalizedKey] = normalizeNested(value);\n }\n }\n\n return row;\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/ESI.ts/ESI.ts/dist/sde/index.js","../../src/sde/providers/yaml/SdeDataProvider.ts","../../src/sde/ingestion/constants.ts","../../src/sde/optionalPeers.ts","../../src/sde/ingestion/metadata.ts","../../src/sde/ingestion/SdeExtractor.ts","../../src/sde/ingestion/transforms.ts","../../src/sde/clock.ts"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,uDAA6B;AAC7B,gCAA6B;AAC7B;AACA;ACfA,+DAAoB;AACpB,uEAAsB;ADiBtB;AACA;AEXO,IAAM,sBAAA,EAAwB,WAAA;AAU9B,IAAM,kBAAA,EAA4C;AAAA;AAAA,EAEvD;AAAA,IACE,QAAA,EAAU,iBAAA;AAAA,IACV,SAAA,EAAW,aAAA;AAAA,IACX,WAAA,EAAa,UAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,wBAAA;AAAA,IACV,SAAA,EAAW,oBAAA;AAAA,IACX,WAAA,EAAa,iBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,sBAAA;AAAA,IACV,SAAA,EAAW,mBAAA;AAAA,IACX,WAAA,EAAa,UAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,mBAAA;AAAA,IACV,SAAA,EAAW,eAAA;AAAA,IACX,WAAA,EAAa,YAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,eAAA;AAAA,IACV,SAAA,EAAW,WAAA;AAAA,IACX,WAAA,EAAa,QAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,iBAAA;AAAA,IACV,SAAA,EAAW,aAAA;AAAA,IACX,WAAA,EAAa,UAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,eAAA;AAAA,IACV,SAAA,EAAW,WAAA;AAAA,IACX,WAAA,EAAa,QAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,uBAAA;AAAA,IACV,SAAA,EAAW,oBAAA;AAAA,IACX,WAAA,EAAa,gBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,uBAAA;AAAA,IACV,SAAA,EAAW,oBAAA;AAAA,IACX,WAAA,EAAa,gBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA;AAAA,EAGA;AAAA,IACE,QAAA,EAAU,YAAA;AAAA,IACV,SAAA,EAAW,WAAA;AAAA,IACX,WAAA,EAAa,QAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,aAAA;AAAA,IACV,SAAA,EAAW,YAAA;AAAA,IACX,WAAA,EAAa,SAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,iBAAA;AAAA,IACV,SAAA,EAAW,gBAAA;AAAA,IACX,WAAA,EAAa,YAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,iBAAA;AAAA,IACV,SAAA,EAAW,iBAAA;AAAA,IACX,WAAA,EAAa,aAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,gBAAA;AAAA,IACV,SAAA,EAAW,gBAAA;AAAA,IACX,WAAA,EAAa,QAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,gBAAA;AAAA,IACV,SAAA,EAAW,kBAAA;AAAA,IACX,WAAA,EAAa,QAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,mBAAA;AAAA,IACV,SAAA,EAAW,mBAAA;AAAA,IACX,WAAA,EAAa,QAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,gBAAA;AAAA,IACV,SAAA,EAAW,gBAAA;AAAA,IACX,WAAA,EAAa,YAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,oBAAA;AAAA,IACV,SAAA,EAAW,oBAAA;AAAA,IACX,WAAA,EAAa,QAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,wBAAA;AAAA,IACV,SAAA,EAAW,wBAAA;AAAA,IACX,WAAA,EAAa,QAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,sBAAA;AAAA,IACV,SAAA,EAAW,sBAAA;AAAA,IACX,WAAA,EAAa,QAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA;AAAA,EAGA;AAAA,IACE,QAAA,EAAU,sBAAA;AAAA,IACV,SAAA,EAAW,sBAAA;AAAA,IACX,WAAA,EAAa,aAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,mBAAA;AAAA,IACV,SAAA,EAAW,mBAAA;AAAA,IACX,WAAA,EAAa,UAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,+BAAA;AAAA,IACV,SAAA,EAAW,gCAAA;AAAA,IACX,WAAA,EAAa,qBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,iBAAA;AAAA,IACV,SAAA,EAAW,iBAAA;AAAA,IACX,WAAA,EAAa,QAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA;AAAA,EAGA;AAAA,IACE,QAAA,EAAU,iBAAA;AAAA,IACV,SAAA,EAAW,gBAAA;AAAA,IACX,WAAA,EAAa,iBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,uBAAA;AAAA,IACV,SAAA,EAAW,uBAAA;AAAA,IACX,WAAA,EAAa,mBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,sBAAA;AAAA,IACV,SAAA,EAAW,sBAAA;AAAA,IACX,WAAA,EAAa,UAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA;AAAA,EAGA;AAAA,IACE,QAAA,EAAU,mBAAA;AAAA,IACV,SAAA,EAAW,mBAAA;AAAA,IACX,WAAA,EAAa,eAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA;AAAA,EAGA;AAAA,IACE,QAAA,EAAU,iBAAA;AAAA,IACV,SAAA,EAAW,iBAAA;AAAA,IACX,WAAA,EAAa,aAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,oBAAA;AAAA,IACV,SAAA,EAAW,qBAAA;AAAA,IACX,WAAA,EAAa,aAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,oBAAA;AAAA,IACV,SAAA,EAAW,oBAAA;AAAA,IACX,WAAA,EAAa,aAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,sBAAA;AAAA,IACV,SAAA,EAAW,sBAAA;AAAA,IACX,WAAA,EAAa,eAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,8BAAA;AAAA,IACV,SAAA,EAAW,+BAAA;AAAA,IACX,WAAA,EAAa,0BAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,kBAAA;AAAA,IACV,SAAA,EAAW,kBAAA;AAAA,IACX,WAAA,EAAa,WAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,eAAA;AAAA,IACV,SAAA,EAAW,cAAA;AAAA,IACX,WAAA,EAAa,WAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA;AAAA,EAGA;AAAA,IACE,QAAA,EAAU,YAAA;AAAA,IACV,SAAA,EAAW,WAAA;AAAA,IACX,WAAA,EAAa,QAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,iBAAA;AAAA,IACV,SAAA,EAAW,gBAAA;AAAA,IACX,WAAA,EAAa,aAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,iBAAA;AAAA,IACV,SAAA,EAAW,gBAAA;AAAA,IACX,WAAA,EAAa,YAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,0BAAA;AAAA,IACV,SAAA,EAAW,0BAAA;AAAA,IACX,WAAA,EAAa,aAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,sBAAA;AAAA,IACV,SAAA,EAAW,sBAAA;AAAA,IACX,WAAA,EAAa,kBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,kBAAA;AAAA,IACV,SAAA,EAAW,kBAAA;AAAA,IACX,WAAA,EAAa,cAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA;AAAA,EAGA;AAAA,IACE,QAAA,EAAU,YAAA;AAAA,IACV,SAAA,EAAW,WAAA;AAAA,IACX,WAAA,EAAa,QAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,mBAAA;AAAA,IACV,SAAA,EAAW,mBAAA;AAAA,IACX,WAAA,EAAa,eAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,oBAAA;AAAA,IACV,SAAA,EAAW,oBAAA;AAAA,IACX,WAAA,EAAa,gBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA;AAAA,EAGA;AAAA,IACE,QAAA,EAAU,sBAAA;AAAA,IACV,SAAA,EAAW,sBAAA;AAAA,IACX,WAAA,EAAa,kBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,+BAAA;AAAA,IACV,SAAA,EAAW,gCAAA;AAAA,IACX,WAAA,EAAa,0BAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,6BAAA;AAAA,IACV,SAAA,EAAW,8BAAA;AAAA,IACX,WAAA,EAAa,wBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,gCAAA;AAAA,IACV,SAAA,EAAW,kCAAA;AAAA,IACX,WAAA,EAAa,0BAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,iBAAA;AAAA,IACV,SAAA,EAAW,iBAAA;AAAA,IACX,WAAA,EAAa,aAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,0BAAA;AAAA,IACV,SAAA,EAAW,2BAAA;AAAA,IACX,WAAA,EAAa,qBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,8BAAA;AAAA,IACV,SAAA,EAAW,+BAAA;AAAA,IACX,WAAA,EAAa,0BAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,qBAAA;AAAA,IACV,SAAA,EAAW,sBAAA;AAAA,IACX,WAAA,EAAa,iBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,0BAAA;AAAA,IACV,SAAA,EAAW,2BAAA;AAAA,IACX,WAAA,EAAa,iBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA;AAAA,EAGA;AAAA,IACE,QAAA,EAAU,uBAAA;AAAA,IACV,SAAA,EAAW,wBAAA;AAAA,IACX,WAAA,EAAa,mBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,uBAAA;AAAA,IACV,SAAA,EAAW,wBAAA;AAAA,IACX,WAAA,EAAa,WAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,qBAAA;AAAA,IACV,SAAA,EAAW,sBAAA;AAAA,IACX,WAAA,EAAa,iBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA;AAAA,EAGA;AAAA,IACE,QAAA,EAAU,eAAA;AAAA,IACV,SAAA,EAAW,cAAA;AAAA,IACX,WAAA,EAAa,WAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,0BAAA;AAAA,IACV,SAAA,EAAW,2BAAA;AAAA,IACX,WAAA,EAAa,eAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,YAAA;AAAA,IACV,SAAA,EAAW,WAAA;AAAA,IACX,WAAA,EAAa,QAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA;AAAA,EAGA;AAAA,IACE,QAAA,EAAU,wBAAA;AAAA,IACV,SAAA,EAAW,wBAAA;AAAA,IACX,WAAA,EAAa,oBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,sBAAA;AAAA,IACV,SAAA,EAAW,sBAAA;AAAA,IACX,WAAA,EAAa,kBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA;AAAA,EAGA;AAAA,IACE,QAAA,EAAU,0BAAA;AAAA,IACV,SAAA,EAAW,0BAAA;AAAA,IACX,WAAA,EAAa,QAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA;AAAA,EAGA;AAAA,IACE,QAAA,EAAU,mBAAA;AAAA,IACV,SAAA,EAAW,kBAAA;AAAA,IACX,WAAA,EAAa,eAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,gBAAA;AAAA,IACV,SAAA,EAAW,eAAA;AAAA,IACX,WAAA,EAAa,QAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA;AAAA,EAGA;AAAA,IACE,QAAA,EAAU,iBAAA;AAAA,IACV,SAAA,EAAW,gBAAA;AAAA,IACX,WAAA,EAAa,aAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,4BAAA;AAAA,IACV,SAAA,EAAW,6BAAA;AAAA,IACX,WAAA,EAAa,QAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,4BAAA;AAAA,IACV,SAAA,EAAW,4BAAA;AAAA,IACX,WAAA,EAAa,uBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,uBAAA;AAAA,IACV,SAAA,EAAW,uBAAA;AAAA,IACX,WAAA,EAAa,mBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,eAAA;AAAA,IACV,SAAA,EAAW,cAAA;AAAA,IACX,WAAA,EAAa,WAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,4BAAA;AAAA,IACV,SAAA,EAAW,6BAAA;AAAA,IACX,WAAA,EAAa,wBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,eAAA;AAAA,IACV,SAAA,EAAW,eAAA;AAAA,IACX,WAAA,EAAa,WAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,0BAAA;AAAA,IACV,SAAA,EAAW,2BAAA;AAAA,IACX,WAAA,EAAa,2BAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,gBAAA;AAAA,IACV,SAAA,EAAW,eAAA;AAAA,IACX,WAAA,EAAa,YAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,kCAAA;AAAA,IACV,SAAA,EAAW,mCAAA;AAAA,IACX,WAAA,EAAa,8BAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,wBAAA;AAAA,IACV,SAAA,EAAW,wBAAA;AAAA,IACX,WAAA,EAAa,oBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,iCAAA;AAAA,IACV,SAAA,EAAW,kCAAA;AAAA,IACX,WAAA,EAAa,6BAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,eAAA;AAAA,IACV,SAAA,EAAW,cAAA;AAAA,IACX,WAAA,EAAa,WAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA;AAAA,EAGA;AAAA,IACE,QAAA,EAAU,2BAAA;AAAA,IACV,SAAA,EAAW,2BAAA;AAAA,IACX,WAAA,EAAa,uBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA;AAAA,EAGA;AAAA,IACE,QAAA,EAAU,yBAAA;AAAA,IACV,SAAA,EAAW,yBAAA;AAAA,IACX,WAAA,EAAa,oBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,4BAAA;AAAA,IACV,SAAA,EAAW,6BAAA;AAAA,IACX,WAAA,EAAa,gBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,gCAAA;AAAA,IACV,SAAA,EAAW,iCAAA;AAAA,IACX,WAAA,EAAa,oBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,8BAAA;AAAA,IACV,SAAA,EAAW,+BAAA;AAAA,IACX,WAAA,EAAa,kBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,4BAAA;AAAA,IACV,SAAA,EAAW,6BAAA;AAAA,IACX,WAAA,EAAa,gBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA;AAAA,EAGA;AAAA,IACE,QAAA,EAAU,uBAAA;AAAA,IACV,SAAA,EAAW,uBAAA;AAAA,IACX,WAAA,EAAa,kBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,6BAAA;AAAA,IACV,SAAA,EAAW,+BAAA;AAAA,IACX,WAAA,EAAa,QAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA;AAAA,EAGA;AAAA,IACE,QAAA,EAAU,uBAAA;AAAA,IACV,SAAA,EAAW,uBAAA;AAAA,IACX,WAAA,EAAa,mBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,4BAAA;AAAA,IACV,SAAA,EAAW,6BAAA;AAAA,IACX,WAAA,EAAa,wBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA;AAAA,EAGA;AAAA,IACE,QAAA,EAAU,cAAA;AAAA,IACV,SAAA,EAAW,aAAA;AAAA,IACX,WAAA,EAAa,UAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,gBAAA;AAAA,IACV,SAAA,EAAW,gBAAA;AAAA,IACX,WAAA,EAAa,aAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,iBAAA;AAAA,IACV,SAAA,EAAW,iBAAA;AAAA,IACX,WAAA,EAAa,aAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,oBAAA;AAAA,IACV,SAAA,EAAW,oBAAA;AAAA,IACX,WAAA,EAAa,gBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA;AAAA,EAGA;AAAA,IACE,QAAA,EAAU,wBAAA;AAAA,IACV,SAAA,EAAW,wBAAA;AAAA,IACX,WAAA,EAAa,oBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,2BAAA;AAAA,IACV,SAAA,EAAW,4BAAA;AAAA,IACX,WAAA,EAAa,uBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA;AAAA,EAGA;AAAA,IACE,QAAA,EAAU,8BAAA;AAAA,IACV,SAAA,EAAW,+BAAA;AAAA,IACX,WAAA,EAAa,0BAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,oBAAA;AAAA,IACV,SAAA,EAAW,qBAAA;AAAA,IACX,WAAA,EAAa,iBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,0BAAA;AAAA,IACV,SAAA,EAAW,2BAAA;AAAA,IACX,WAAA,EAAa,sBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,wBAAA;AAAA,IACV,SAAA,EAAW,yBAAA;AAAA,IACX,WAAA,EAAa,oBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,mBAAA;AAAA,IACV,SAAA,EAAW,oBAAA;AAAA,IACX,WAAA,EAAa,gBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA;AAAA,EAGA;AAAA,IACE,QAAA,EAAU,mCAAA;AAAA,IACV,SAAA,EAAW,oCAAA;AAAA,IACX,WAAA,EAAa,+BAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA;AAAA,EAGA;AAAA,IACE,QAAA,EAAU,4BAAA;AAAA,IACV,SAAA,EAAW,8BAAA;AAAA,IACX,WAAA,EAAa,uBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,CAAA;AAAA;AAAA,EAGA;AAAA,IACE,QAAA,EAAU,uBAAA;AAAA,IACV,SAAA,EAAW,wBAAA;AAAA,IACX,WAAA,EAAa,oBAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ;AACF,CAAA;AFpBA;AACA;AGpvBA,gCAA8B;AAqB9B,IAAM,mBAAA,EAAgC,mCAAA,UAAwB,CAAA;AAE9D,SAAS,SAAA,CAAU,GAAA,EAAc,IAAA,EAA6B;AAC5D,EAAA,GAAA,CAAI,CAAA,CAAE,IAAA,WAAe,KAAA,CAAA,EAAQ,OAAO,KAAA;AACpC,EAAA,MAAM,KAAA,EAAQ,GAAA,CAA8B,IAAA;AAE5C,EAAA,OAAA,CACG,KAAA,IAAS,mBAAA,GAAsB,KAAA,IAAS,sBAAA,EAAA,GACzC,GAAA,CAAI,OAAA,CAAQ,QAAA,CAAS,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAG,CAAA;AAEpC;AAOO,SAAS,mBAAA,CACd,IAAA,EACA,SAAA,EACA,KAAA,EAAkB,kBAAA,EACf;AACH,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,IAAI,CAAA;AAAA,EAClB,EAAA,MAAA,CAAS,GAAA,EAAK;AACZ,IAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,IAAI,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,8BAAA;AAAA,QACR,CAAA,EAAA;AACF,MAAA;AACF,IAAA;AACA,IAAA;AACF,EAAA;AACF;AAEgB;AACP,EAAA;AACT;AAEgB;AACP,EAAA;AACT;AHitBS;AACA;AI5wBA;AACA,EAAA;AAGT;AAYgB;AACR,EAAA;AACA,EAAA;AACC,EAAA;AACL,IAAA;AACA,IAAA;AACF,EAAA;AACF;AJiwBS;AACA;AK5wBA;AAID,EAAA;AACC,EAAA;AACD,IAAA;AACJ,IAAA;AACA,IAAA;AAKD,EAAA;AACH;AAES;AACD,EAAA;AACC,EAAA;AACT;AAES;AACD,EAAA;AACC,EAAA;AACT;AAEa;AACX,EAAA;AACE,IAAA;AACA,IAAA;AAEK,IAAA;AACH,MAAA;AACE,QAAA;AACF,MAAA;AACF,IAAA;AAEA,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACA,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACA,IAAA;AAEA,IAAA;AACE,MAAA;AACA,MAAA;AAEE,QAAA;AACF,MAAA;AACA,MAAA;AACF,IAAA;AAEA,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACI,IAAA;AACN,EAAA;AAEA,EAAA;AACE,IAAA;AACA,IAAA;AAGK,MAAA;AAEF,IAAA;AACL,EAAA;AAEQ,EAAA;AACN,IAAA;AAEK,IAAA;AACH,MAAA;AACF,IAAA;AAEA,IAAA;AACF,EAAA;AAEQ,EAAA;AAIN,IAAA;AACA,IAAA;AAIA,IAAA;AACE,MAAA;AACE,QAAA;AACA,QAAA;AACD,MAAA;AACH,IAAA;AAEA,IAAA;AACF,EAAA;AACF;AL6uBS;AACA;AMp2BO;AAKV,EAAA;AACA,EAAA;AACA,EAAA;AACF,IAAA;AAEA,IAAA;AACI,IAAA;AACJ,IAAA;AACF,EAAA;AACO,EAAA;AACT;AAEgB;AACP,EAAA;AACT;AAYS;AACH,EAAA;AACF,IAAA;AACF,EAAA;AACO,EAAA;AACT;AA2BS;AACH,EAAA;AACA,EAAA;AACE,EAAA;AACF,EAAA;AACE,EAAA;AACN,EAAA;AACM,IAAA;AACN,EAAA;AACO,EAAA;AACT;AAEgB;AAKR,EAAA;AAEF,EAAA;AACE,IAAA;AAEN,EAAA;AAEA,EAAA;AACE,IAAA;AAEI,IAAA;AACF,MAAA;AACF,IAAA;AACE,MAAA;AACF,IAAA;AACF,EAAA;AAEO,EAAA;AACT;ANizBS;AACA;AO54BI;AACN,EAAA;AACE,EAAA;AACT;AP84BS;AACA;AC50BA;AAIA,EAAA;AACL,IAAA;AACA,IAAA;AACA,IAAA;AACF,EAAA;AACF;AAEa;AACH,iBAAA;AAIA,kBAAA;AAIA,EAAA;AAEA,EAAA;AACD,IAAA;AACP,EAAA;AAEO,EAAA;AAIL,IAAA;AACQ,IAAA;AACN,MAAA;AACF,IAAA;AAEA,IAAA;AACA,IAAA;AAIA,IAAA;AACE,MAAA;AACF,IAAA;AAEA,IAAA;AACE,MAAA;AACA,MAAA;AAEA,MAAA;AACA,MAAA;AAIA,MAAA;AAEA,MAAA;AACF,IAAA;AAEA,IAAA;AACF,EAAA;AAEO,EAAA;AAIL,IAAA;AACQ,IAAA;AACN,MAAA;AACF,IAAA;AAEA,IAAA;AACA,IAAA;AAEA,IAAA;AACE,MAAA;AACF,IAAA;AAEA,IAAA;AACA,IAAA;AACA,IAAA;AAEA,IAAA;AACE,MAAA;AACA,MAAA;AAEA,MAAA;AACA,MAAA;AACE,QAAA;AACF,MAAA;AACA,MAAA;AACF,IAAA;AAEA,IAAA;AACF,EAAA;AAEQ,EAAA;AAIN,IAAA;AACA,IAAA;AACE,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACK,IAAA;AACP,EAAA;AAAA;AAAA;AAAA;AAMQ,EAAA;AACN,IAAA;AACK,IAAA;AACL,IAAA;AACA,IAAA;AACF,EAAA;AAEQ,EAAA;AAKN,IAAA;AACI,IAAA;AACC,IAAA;AACH,MAAA;AACA,MAAA;AACA,MAAA;AACE,QAAA;AACE,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AAA+B,UAAA;AAEjC,QAAA;AACF,MAAA;AACA,MAAA;AACF,IAAA;AACA,IAAA;AACF,EAAA;AAEQ,EAAA;AACN,IAAA;AACK,IAAA;AACL,IAAA;AACF,EAAA;AAGE,EAAA;AAKA,IAAA;AACK,IAAA;AACL,IAAA;AACA,IAAA;AACA,IAAA;AACE,MAAA;AACA,MAAA;AACE,QAAA;AACA,QAAA;AACF,MAAA;AACF,IAAA;AACA,IAAA;AACF,EAAA;AAEQ,EAAA;AAIN,IAAA;AACK,IAAA;AACL,IAAA;AACA,IAAA;AACE,MAAA;AACF,IAAA;AACA,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AAIE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACE,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACE,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACA,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACE,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACE,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACE,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACE,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACE,MAAA;AACC,MAAA;AACH,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACE,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACE,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACE,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AACE,IAAA;AACE,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACE,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACE,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AAGE,IAAA;AACE,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACE,MAAA;AACF,IAAA;AACF,EAAA;AAEA,EAAA;AAGE,IAAA;AACE,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACE,MAAA;AACF,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AAGE,IAAA;AACE,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACE,MAAA;AACF,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AACE,IAAA;AACE,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AACE,IAAA;AACE,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACE,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AACE,IAAA;AACE,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACE,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACE,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAMA,EAAA;AACE,IAAA;AACF,EAAA;AAEA,EAAA;AACO,IAAA;AACA,IAAA;AACP,EAAA;AACF;AD0oBS;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/ESI.ts/ESI.ts/dist/sde/index.js","sourcesContent":[null,"import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { Clock } from '../../../core/ports/Clock';\nimport type { IStaticDataProvider } from '../../ports/IStaticDataProvider';\nimport type {\n EveType,\n EveGroup,\n EveCategory,\n Region,\n Constellation,\n SolarSystem,\n Stargate,\n Star,\n Planet,\n Moon,\n AsteroidBelt,\n Faction,\n Race,\n Bloodline,\n Ancestry,\n NpcCorporation,\n NpcStation,\n MarketGroup,\n MetaGroup,\n Icon,\n Graphic,\n DogmaAttribute,\n DogmaEffect,\n Blueprint,\n PlanetSchematic,\n AgentType,\n AgentInSpace,\n Certificate,\n CharacterAttribute,\n CloneGrade,\n CorporationActivity,\n DogmaAttributeCategory,\n DogmaUnit,\n IndustryActivity,\n Landmark,\n NotificationType,\n NpcCharacter,\n NpcCorporationDivision,\n School,\n SecondarySun,\n Skin,\n SkinLicense,\n StationOperation,\n StationService,\n TypeDogma,\n TypeMaterial,\n TypeBonus,\n Mission,\n Dungeon,\n EpicArc,\n} from '../../domain/types';\nimport type { SdeVersionInfo } from '../../version';\nimport { sortedById } from '../order';\nimport {\n SDE_FILE_REGISTRY,\n SDE_METADATA_FILENAME,\n} from '../../ingestion/constants';\nimport type { SdeFileSpec } from '../../ingestion/constants';\nimport { SdeExtractor } from '../../ingestion/SdeExtractor';\nimport type { SdeMetadata } from '../../ingestion/SdeExtractor';\nimport { parseSdeMetadata } from '../../ingestion/metadata';\nimport { transformRecordNative } from '../../ingestion/transforms';\nimport { SdeError } from '../../errors';\nimport { loadJsYaml } from '../../optionalPeers';\nimport { systemClock } from '../../clock';\n\n/** Options for {@link SdeDataProvider.fromDirectory} and {@link SdeDataProvider.fromZip}. */\nexport interface SdeDataProviderOptions {\n /**\n * Where `importedAt` in {@link SdeVersionInfo} reads the time from.\n * Defaults to the wall clock; a test passes a fixed one.\n */\n clock?: Clock;\n}\n\nfunction toVersionInfo(\n metadata: SdeMetadata | undefined,\n clock: Clock,\n): SdeVersionInfo {\n return {\n version: metadata?.buildNumber || 'unknown',\n buildDate: metadata?.releaseDate || 'unknown',\n importedAt: new Date(clock.now()).toISOString(),\n };\n}\n\nexport class SdeDataProvider implements IStaticDataProvider {\n private entities = new Map<\n string,\n Map<number | string, Record<string, unknown>>\n >();\n private fkIndexes = new Map<\n string,\n Map<unknown, Record<string, unknown>[]>\n >();\n private versionInfo: SdeVersionInfo;\n\n private constructor(version: SdeVersionInfo) {\n this.versionInfo = version;\n }\n\n static fromDirectory(\n dirPath: string,\n options: SdeDataProviderOptions = {},\n ): SdeDataProvider {\n const resolvedDir = path.resolve(dirPath);\n if (!fs.existsSync(resolvedDir)) {\n throw new SdeError(`SDE directory not found: ${resolvedDir}`);\n }\n\n const metaPath = path.join(resolvedDir, SDE_METADATA_FILENAME);\n const metadata = fs.existsSync(metaPath)\n ? parseSdeMetadata(fs.readFileSync(metaPath, 'utf-8'))\n : undefined;\n\n const provider = new SdeDataProvider(\n toVersionInfo(metadata, options.clock ?? systemClock),\n );\n\n for (const spec of SDE_FILE_REGISTRY) {\n const filePath = path.join(resolvedDir, spec.yamlFile);\n if (!fs.existsSync(filePath)) continue;\n\n const content = fs.readFileSync(filePath, 'utf-8');\n const parsed = loadJsYaml().load(content) as Record<\n string | number,\n Record<string, unknown>\n > | null;\n if (!parsed || typeof parsed !== 'object') continue;\n\n provider.loadRecords(spec, parsed);\n }\n\n return provider;\n }\n\n static fromZip(\n zipPath: string,\n options: SdeDataProviderOptions = {},\n ): SdeDataProvider {\n const resolvedPath = path.resolve(zipPath);\n if (!fs.existsSync(resolvedPath)) {\n throw new SdeError(`SDE ZIP file not found: ${resolvedPath}`);\n }\n\n const extractor = new SdeExtractor();\n const metadata = extractor.readMetadata(resolvedPath);\n\n const provider = new SdeDataProvider(\n toVersionInfo(metadata, options.clock ?? systemClock),\n );\n\n const yamlFiles = SDE_FILE_REGISTRY.map((s) => s.yamlFile);\n const parsedFiles = extractor.parseFiles(resolvedPath, yamlFiles);\n const specMap = new Map(SDE_FILE_REGISTRY.map((s) => [s.yamlFile, s]));\n\n for (const file of parsedFiles) {\n const spec = specMap.get(file.filename);\n if (!spec) continue;\n\n const rawEntries: Record<string | number, Record<string, unknown>> = {};\n for (const [key, value] of file.records) {\n rawEntries[key] = value;\n }\n provider.loadRecords(spec, rawEntries);\n }\n\n return provider;\n }\n\n private loadRecords(\n spec: SdeFileSpec,\n raw: Record<string | number, Record<string, unknown>>,\n ): void {\n const rows: Array<[number | string, Record<string, unknown>]> = [];\n for (const [key, value] of Object.entries(raw)) {\n if (value == null || typeof value !== 'object') continue;\n const id = spec.idType === 'string' ? key : Number(key);\n rows.push([id, transformRecordNative(id, value, spec)]);\n }\n this.entities.set(spec.tableName, new Map(sortedById(rows, ([id]) => id)));\n }\n\n // ---------------------------------------------------------------\n // Generic helpers\n // ---------------------------------------------------------------\n\n private getById<T>(tableName: string, id: number | string): T | null {\n const table = this.entities.get(tableName);\n if (!table) return null;\n const row = table.get(id);\n return (row as T) ?? null;\n }\n\n private getByFk<T>(\n tableName: string,\n fkField: string,\n fkValue: unknown,\n ): T[] {\n const indexKey = `${tableName}:${fkField}`;\n let index = this.fkIndexes.get(indexKey);\n if (!index) {\n index = new Map();\n const table = this.entities.get(tableName);\n if (table) {\n for (const row of table.values()) {\n const val = row[fkField];\n if (val == null) continue;\n const existing = index.get(val);\n if (existing) existing.push(row);\n else index.set(val, [row]);\n }\n }\n this.fkIndexes.set(indexKey, index);\n }\n return (index.get(fkValue) ?? []) as T[];\n }\n\n private getAllRecords<T>(tableName: string): T[] {\n const table = this.entities.get(tableName);\n if (!table) return [];\n return Array.from(table.values()) as T[];\n }\n\n private search<T>(\n tableName: string,\n field: string,\n query: string,\n limit: number,\n ): T[] {\n const table = this.entities.get(tableName);\n if (!table) return [];\n const lowerQuery = query.toLowerCase();\n const results: T[] = [];\n for (const row of table.values()) {\n const val = row[field];\n if (typeof val === 'string' && val.toLowerCase().includes(lowerQuery)) {\n results.push(row as T);\n if (results.length >= limit) break;\n }\n }\n return results;\n }\n\n private filterBy<T>(\n tableName: string,\n predicate: (row: Record<string, unknown>) => boolean,\n ): T[] {\n const table = this.entities.get(tableName);\n if (!table) return [];\n const results: T[] = [];\n for (const row of table.values()) {\n if (predicate(row)) results.push(row as T);\n }\n return results;\n }\n\n // ---------------------------------------------------------------\n // Generic entity accessors (for niche entities)\n // ---------------------------------------------------------------\n\n getEntity<T = Record<string, unknown>>(\n tableName: string,\n id: number | string,\n ): T | null {\n return this.getById<T>(tableName, id);\n }\n\n getAllEntities<T = Record<string, unknown>>(tableName: string): T[] {\n return this.getAllRecords<T>(tableName);\n }\n\n // ---------------------------------------------------------------\n // Types, Groups, Categories\n // ---------------------------------------------------------------\n\n getType(typeId: number): EveType | null {\n return this.getById<EveType>('eve_types', typeId);\n }\n\n getTypesByGroup(groupId: number): EveType[] {\n return this.getByFk<EveType>('eve_types', 'groupId', groupId);\n }\n\n getGroup(groupId: number): EveGroup | null {\n return this.getById<EveGroup>('eve_groups', groupId);\n }\n\n getGroupsByCategory(categoryId: number): EveGroup[] {\n return this.getByFk<EveGroup>('eve_groups', 'categoryId', categoryId);\n }\n\n getCategory(categoryId: number): EveCategory | null {\n return this.getById<EveCategory>('eve_categories', categoryId);\n }\n\n getAllCategories(): EveCategory[] {\n return this.getAllRecords<EveCategory>('eve_categories');\n }\n\n // ---------------------------------------------------------------\n // Regions, Constellations, Solar Systems, Stargates\n // ---------------------------------------------------------------\n\n getRegion(regionId: number): Region | null {\n return this.getById<Region>('eve_regions', regionId);\n }\n\n getAllRegions(): Region[] {\n return this.getAllRecords<Region>('eve_regions');\n }\n\n getConstellation(constellationId: number): Constellation | null {\n return this.getById<Constellation>('eve_constellations', constellationId);\n }\n\n getConstellationsByRegion(regionId: number): Constellation[] {\n return this.getByFk<Constellation>(\n 'eve_constellations',\n 'regionId',\n regionId,\n );\n }\n\n getSolarSystem(systemId: number): SolarSystem | null {\n return this.getById<SolarSystem>('eve_solar_systems', systemId);\n }\n\n getSolarSystemsByConstellation(constellationId: number): SolarSystem[] {\n return this.getByFk<SolarSystem>(\n 'eve_solar_systems',\n 'constellationId',\n constellationId,\n );\n }\n\n getStargate(stargateId: number): Stargate | null {\n return this.getById<Stargate>('eve_stargates', stargateId);\n }\n\n getStargatesBySystem(systemId: number): Stargate[] {\n return this.getByFk<Stargate>('eve_stargates', 'solarSystemId', systemId);\n }\n\n // ---------------------------------------------------------------\n // Search\n // ---------------------------------------------------------------\n\n searchTypesByName(query: string, limit = 25): EveType[] {\n return this.search<EveType>('eve_types', 'name', query, limit);\n }\n\n searchSolarSystemsByName(query: string, limit = 25): SolarSystem[] {\n return this.search<SolarSystem>('eve_solar_systems', 'name', query, limit);\n }\n\n // ---------------------------------------------------------------\n // Universe\n // ---------------------------------------------------------------\n\n getStar(starId: number): Star | null {\n return this.getById<Star>('eve_stars', starId);\n }\n\n getStarBySystem(systemId: number): Star | null {\n const stars = this.getByFk<Star>('eve_stars', 'solarSystemId', systemId);\n return stars[0] ?? null;\n }\n\n getPlanet(planetId: number): Planet | null {\n return this.getById<Planet>('eve_planets', planetId);\n }\n\n getPlanetsBySystem(systemId: number): Planet[] {\n return this.getByFk<Planet>('eve_planets', 'solarSystemId', systemId);\n }\n\n getMoon(moonId: number): Moon | null {\n return this.getById<Moon>('eve_moons', moonId);\n }\n\n getMoonsBySystem(systemId: number): Moon[] {\n return this.getByFk<Moon>('eve_moons', 'solarSystemId', systemId);\n }\n\n getAsteroidBelt(asteroidBeltId: number): AsteroidBelt | null {\n return this.getById<AsteroidBelt>('eve_asteroid_belts', asteroidBeltId);\n }\n\n getAsteroidBeltsBySystem(systemId: number): AsteroidBelt[] {\n return this.getByFk<AsteroidBelt>(\n 'eve_asteroid_belts',\n 'solarSystemId',\n systemId,\n );\n }\n\n // ---------------------------------------------------------------\n // Character/Lore\n // ---------------------------------------------------------------\n\n getFaction(factionId: number): Faction | null {\n return this.getById<Faction>('eve_factions', factionId);\n }\n\n getAllFactions(): Faction[] {\n return this.getAllRecords<Faction>('eve_factions');\n }\n\n getRace(raceId: number): Race | null {\n return this.getById<Race>('eve_races', raceId);\n }\n\n getAllRaces(): Race[] {\n return this.getAllRecords<Race>('eve_races');\n }\n\n getBloodline(bloodlineId: number): Bloodline | null {\n return this.getById<Bloodline>('eve_bloodlines', bloodlineId);\n }\n\n getBloodlinesByRace(raceId: number): Bloodline[] {\n return this.getByFk<Bloodline>('eve_bloodlines', 'raceId', raceId);\n }\n\n getAncestry(ancestryId: number): Ancestry | null {\n return this.getById<Ancestry>('eve_ancestries', ancestryId);\n }\n\n getAncestriesByBloodline(bloodlineId: number): Ancestry[] {\n return this.getByFk<Ancestry>('eve_ancestries', 'bloodlineId', bloodlineId);\n }\n\n // ---------------------------------------------------------------\n // NPC Infrastructure\n // ---------------------------------------------------------------\n\n getNpcCorporation(corporationId: number): NpcCorporation | null {\n return this.getById<NpcCorporation>('eve_npc_corporations', corporationId);\n }\n\n getNpcCorporationsByFaction(factionId: number): NpcCorporation[] {\n return this.getByFk<NpcCorporation>(\n 'eve_npc_corporations',\n 'factionId',\n factionId,\n );\n }\n\n getNpcStation(stationId: number): NpcStation | null {\n return this.getById<NpcStation>('eve_npc_stations', stationId);\n }\n\n getNpcStationsBySystem(systemId: number): NpcStation[] {\n return this.getByFk<NpcStation>(\n 'eve_npc_stations',\n 'solarSystemId',\n systemId,\n );\n }\n\n getNpcStationsByOwner(ownerId: number): NpcStation[] {\n return this.getByFk<NpcStation>('eve_npc_stations', 'ownerId', ownerId);\n }\n\n // ---------------------------------------------------------------\n // Market\n // ---------------------------------------------------------------\n\n getMarketGroup(marketGroupId: number): MarketGroup | null {\n return this.getById<MarketGroup>('eve_market_groups', marketGroupId);\n }\n\n getMarketGroupsByParent(parentGroupId: number): MarketGroup[] {\n return this.getByFk<MarketGroup>(\n 'eve_market_groups',\n 'parentGroupId',\n parentGroupId,\n );\n }\n\n getRootMarketGroups(): MarketGroup[] {\n return this.filterBy<MarketGroup>(\n 'eve_market_groups',\n (r) => r.parentGroupId == null,\n );\n }\n\n getTypesByMarketGroup(marketGroupId: number): EveType[] {\n return this.getByFk<EveType>('eve_types', 'marketGroupId', marketGroupId);\n }\n\n searchMarketGroupsByName(query: string, limit = 25): MarketGroup[] {\n return this.search<MarketGroup>('eve_market_groups', 'name', query, limit);\n }\n\n // ---------------------------------------------------------------\n // Meta/UI\n // ---------------------------------------------------------------\n\n getMetaGroup(metaGroupId: number): MetaGroup | null {\n return this.getById<MetaGroup>('eve_meta_groups', metaGroupId);\n }\n\n getAllMetaGroups(): MetaGroup[] {\n return this.getAllRecords<MetaGroup>('eve_meta_groups');\n }\n\n getIcon(iconId: number): Icon | null {\n return this.getById<Icon>('eve_icons', iconId);\n }\n\n getGraphic(graphicId: number): Graphic | null {\n return this.getById<Graphic>('eve_graphics', graphicId);\n }\n\n // ---------------------------------------------------------------\n // Dogma\n // ---------------------------------------------------------------\n\n getDogmaAttribute(attributeId: number): DogmaAttribute | null {\n return this.getById<DogmaAttribute>('eve_dogma_attributes', attributeId);\n }\n\n searchDogmaAttributesByName(query: string, limit = 25): DogmaAttribute[] {\n return this.search<DogmaAttribute>(\n 'eve_dogma_attributes',\n 'name',\n query,\n limit,\n );\n }\n\n getDogmaEffect(effectId: number): DogmaEffect | null {\n return this.getById<DogmaEffect>('eve_dogma_effects', effectId);\n }\n\n searchDogmaEffectsByName(query: string, limit = 25): DogmaEffect[] {\n return this.search<DogmaEffect>('eve_dogma_effects', 'name', query, limit);\n }\n\n // ---------------------------------------------------------------\n // Industry\n // ---------------------------------------------------------------\n\n getBlueprint(blueprintTypeId: number): Blueprint | null {\n return this.getById<Blueprint>('eve_blueprints', blueprintTypeId);\n }\n\n getPlanetSchematic(planetSchematicId: number): PlanetSchematic | null {\n return this.getById<PlanetSchematic>(\n 'eve_planet_schematics',\n planetSchematicId,\n );\n }\n\n getAllPlanetSchematics(): PlanetSchematic[] {\n return this.getAllRecords<PlanetSchematic>('eve_planet_schematics');\n }\n\n // ---------------------------------------------------------------\n // Agent System\n // ---------------------------------------------------------------\n\n getAgentType(agentTypeId: number): AgentType | null {\n return this.getById<AgentType>('eve_agent_types', agentTypeId);\n }\n\n getAllAgentTypes(): AgentType[] {\n return this.getAllRecords<AgentType>('eve_agent_types');\n }\n\n getAgentInSpace(characterId: number): AgentInSpace | null {\n return this.getById<AgentInSpace>('eve_agents_in_space', characterId);\n }\n\n getAgentsInSpaceBySystem(systemId: number): AgentInSpace[] {\n return this.getByFk<AgentInSpace>(\n 'eve_agents_in_space',\n 'solarSystemId',\n systemId,\n );\n }\n\n // ---------------------------------------------------------------\n // Certificates\n // ---------------------------------------------------------------\n\n getCertificate(certificateId: number): Certificate | null {\n return this.getById<Certificate>('eve_certificates', certificateId);\n }\n\n getAllCertificates(): Certificate[] {\n return this.getAllRecords<Certificate>('eve_certificates');\n }\n\n // ---------------------------------------------------------------\n // Character Attributes\n // ---------------------------------------------------------------\n\n getCharacterAttribute(attributeId: number): CharacterAttribute | null {\n return this.getById<CharacterAttribute>(\n 'eve_character_attributes',\n attributeId,\n );\n }\n\n getAllCharacterAttributes(): CharacterAttribute[] {\n return this.getAllRecords<CharacterAttribute>('eve_character_attributes');\n }\n\n // ---------------------------------------------------------------\n // NPC Characters\n // ---------------------------------------------------------------\n\n getNpcCharacter(characterId: number): NpcCharacter | null {\n return this.getById<NpcCharacter>('eve_npc_characters', characterId);\n }\n\n getNpcCharactersByCorporation(corporationId: number): NpcCharacter[] {\n return this.getByFk<NpcCharacter>(\n 'eve_npc_characters',\n 'corporationId',\n corporationId,\n );\n }\n\n searchNpcCharactersByName(query: string, limit = 25): NpcCharacter[] {\n return this.search<NpcCharacter>(\n 'eve_npc_characters',\n 'name',\n query,\n limit,\n );\n }\n\n // ---------------------------------------------------------------\n // Clone Grades\n // ---------------------------------------------------------------\n\n getCloneGrade(cloneGradeId: number): CloneGrade | null {\n return this.getById<CloneGrade>('eve_clone_grades', cloneGradeId);\n }\n\n getAllCloneGrades(): CloneGrade[] {\n return this.getAllRecords<CloneGrade>('eve_clone_grades');\n }\n\n // ---------------------------------------------------------------\n // Corporation Reference\n // ---------------------------------------------------------------\n\n getCorporationActivity(\n corporationActivityId: number,\n ): CorporationActivity | null {\n return this.getById<CorporationActivity>(\n 'eve_corporation_activities',\n corporationActivityId,\n );\n }\n\n getAllCorporationActivities(): CorporationActivity[] {\n return this.getAllRecords<CorporationActivity>(\n 'eve_corporation_activities',\n );\n }\n\n getNpcCorporationDivision(\n npcCorporationDivisionId: number,\n ): NpcCorporationDivision | null {\n return this.getById<NpcCorporationDivision>(\n 'eve_npc_corporation_divisions',\n npcCorporationDivisionId,\n );\n }\n\n getAllNpcCorporationDivisions(): NpcCorporationDivision[] {\n return this.getAllRecords<NpcCorporationDivision>(\n 'eve_npc_corporation_divisions',\n );\n }\n\n // ---------------------------------------------------------------\n // Dogma Reference\n // ---------------------------------------------------------------\n\n getDogmaAttributeCategory(\n attributeCategoryId: number,\n ): DogmaAttributeCategory | null {\n return this.getById<DogmaAttributeCategory>(\n 'eve_dogma_attribute_categories',\n attributeCategoryId,\n );\n }\n\n getAllDogmaAttributeCategories(): DogmaAttributeCategory[] {\n return this.getAllRecords<DogmaAttributeCategory>(\n 'eve_dogma_attribute_categories',\n );\n }\n\n getDogmaUnit(unitId: number): DogmaUnit | null {\n return this.getById<DogmaUnit>('eve_dogma_units', unitId);\n }\n\n getAllDogmaUnits(): DogmaUnit[] {\n return this.getAllRecords<DogmaUnit>('eve_dogma_units');\n }\n\n // ---------------------------------------------------------------\n // Industry Reference\n // ---------------------------------------------------------------\n\n getIndustryActivity(industryActivityId: number): IndustryActivity | null {\n return this.getById<IndustryActivity>(\n 'eve_industry_activities',\n industryActivityId,\n );\n }\n\n getAllIndustryActivities(): IndustryActivity[] {\n return this.getAllRecords<IndustryActivity>('eve_industry_activities');\n }\n\n // ---------------------------------------------------------------\n // Landmarks\n // ---------------------------------------------------------------\n\n getLandmark(landmarkId: number): Landmark | null {\n return this.getById<Landmark>('eve_landmarks', landmarkId);\n }\n\n getAllLandmarks(): Landmark[] {\n return this.getAllRecords<Landmark>('eve_landmarks');\n }\n\n // ---------------------------------------------------------------\n // Notifications\n // ---------------------------------------------------------------\n\n getNotificationType(notificationTypeId: number): NotificationType | null {\n return this.getById<NotificationType>(\n 'eve_notification_types',\n notificationTypeId,\n );\n }\n\n // ---------------------------------------------------------------\n // Schools\n // ---------------------------------------------------------------\n\n getSchool(schoolId: number): School | null {\n return this.getById<School>('eve_schools', schoolId);\n }\n\n getAllSchools(): School[] {\n return this.getAllRecords<School>('eve_schools');\n }\n\n // ---------------------------------------------------------------\n // Secondary Suns\n // ---------------------------------------------------------------\n\n getSecondarySun(secondarySunId: number): SecondarySun | null {\n return this.getById<SecondarySun>('eve_secondary_suns', secondarySunId);\n }\n\n getSecondarySunsBySystem(systemId: number): SecondarySun[] {\n return this.getByFk<SecondarySun>(\n 'eve_secondary_suns',\n 'solarSystemId',\n systemId,\n );\n }\n\n // ---------------------------------------------------------------\n // Skins\n // ---------------------------------------------------------------\n\n getSkin(skinId: number): Skin | null {\n return this.getById<Skin>('eve_skins', skinId);\n }\n\n getSkinLicense(licenseTypeId: number): SkinLicense | null {\n return this.getById<SkinLicense>('eve_skin_licenses', licenseTypeId);\n }\n\n getSkinLicensesBySkin(skinId: number): SkinLicense[] {\n return this.getByFk<SkinLicense>('eve_skin_licenses', 'skinId', skinId);\n }\n\n // ---------------------------------------------------------------\n // Station Operations & Services\n // ---------------------------------------------------------------\n\n getStationOperation(stationOperationId: number): StationOperation | null {\n return this.getById<StationOperation>(\n 'eve_station_operations',\n stationOperationId,\n );\n }\n\n getAllStationOperations(): StationOperation[] {\n return this.getAllRecords<StationOperation>('eve_station_operations');\n }\n\n getStationService(stationServiceId: number): StationService | null {\n return this.getById<StationService>(\n 'eve_station_services',\n stationServiceId,\n );\n }\n\n getAllStationServices(): StationService[] {\n return this.getAllRecords<StationService>('eve_station_services');\n }\n\n // ---------------------------------------------------------------\n // Type Properties\n // ---------------------------------------------------------------\n\n getTypeDogma(typeId: number): TypeDogma | null {\n return this.getById<TypeDogma>('eve_type_dogma', typeId);\n }\n\n getTypeMaterial(typeId: number): TypeMaterial | null {\n return this.getById<TypeMaterial>('eve_type_materials', typeId);\n }\n\n getTypeBonus(typeId: number): TypeBonus | null {\n return this.getById<TypeBonus>('eve_type_bonuses', typeId);\n }\n\n // ---------------------------------------------------------------\n // Missions & Content\n // ---------------------------------------------------------------\n\n getMission(missionId: number): Mission | null {\n return this.getById<Mission>('eve_missions', missionId);\n }\n\n getDungeon(dungeonId: number): Dungeon | null {\n return this.getById<Dungeon>('eve_dungeons', dungeonId);\n }\n\n getEpicArc(epicArcId: number): EpicArc | null {\n return this.getById<EpicArc>('eve_epic_arcs', epicArcId);\n }\n\n getAllEpicArcs(): EpicArc[] {\n return this.getAllRecords<EpicArc>('eve_epic_arcs');\n }\n\n // ---------------------------------------------------------------\n // Version & Lifecycle\n // ---------------------------------------------------------------\n\n getVersion(): SdeVersionInfo {\n return { ...this.versionInfo };\n }\n\n close(): void {\n this.entities.clear();\n this.fkIndexes.clear();\n }\n}\n","export const SDE_DOWNLOAD_URL =\n 'https://developers.eveonline.com/static-data/eve-online-static-data-latest-yaml.zip';\n\nexport const SDE_LATEST_BUILD_URL =\n 'https://developers.eveonline.com/static-data/tranquility/latest.jsonl';\n\nexport const SDE_BUILD_NUMBER_HEADER = 'x-sde-build-number';\n\nexport const SDE_METADATA_FILENAME = '_sde.yaml';\n\nexport interface SdeFileSpec {\n readonly yamlFile: string;\n readonly tableName: string;\n readonly idAttribute: string;\n readonly idType: 'number' | 'string';\n readonly injectId: boolean;\n}\n\nexport const SDE_FILE_REGISTRY: readonly SdeFileSpec[] = [\n // --- Universe / Map ---\n {\n yamlFile: 'mapRegions.yaml',\n tableName: 'eve_regions',\n idAttribute: 'regionId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'mapConstellations.yaml',\n tableName: 'eve_constellations',\n idAttribute: 'constellationId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'mapSolarSystems.yaml',\n tableName: 'eve_solar_systems',\n idAttribute: 'systemId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'mapStargates.yaml',\n tableName: 'eve_stargates',\n idAttribute: 'stargateId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'mapStars.yaml',\n tableName: 'eve_stars',\n idAttribute: 'starId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'mapPlanets.yaml',\n tableName: 'eve_planets',\n idAttribute: 'planetId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'mapMoons.yaml',\n tableName: 'eve_moons',\n idAttribute: 'moonId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'mapAsteroidBelts.yaml',\n tableName: 'eve_asteroid_belts',\n idAttribute: 'asteroidBeltId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'mapSecondarySuns.yaml',\n tableName: 'eve_secondary_suns',\n idAttribute: 'secondarySunId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Type System ---\n {\n yamlFile: 'types.yaml',\n tableName: 'eve_types',\n idAttribute: 'typeId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'groups.yaml',\n tableName: 'eve_groups',\n idAttribute: 'groupId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'categories.yaml',\n tableName: 'eve_categories',\n idAttribute: 'categoryId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'metaGroups.yaml',\n tableName: 'eve_meta_groups',\n idAttribute: 'metaGroupId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'typeDogma.yaml',\n tableName: 'eve_type_dogma',\n idAttribute: 'typeId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'typeBonus.yaml',\n tableName: 'eve_type_bonuses',\n idAttribute: 'typeId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'typeElements.yaml',\n tableName: 'eve_type_elements',\n idAttribute: 'typeId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'typeLists.yaml',\n tableName: 'eve_type_lists',\n idAttribute: 'typeListId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'typeMaterials.yaml',\n tableName: 'eve_type_materials',\n idAttribute: 'typeId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'compressibleTypes.yaml',\n tableName: 'eve_compressible_types',\n idAttribute: 'typeId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'contrabandTypes.yaml',\n tableName: 'eve_contraband_types',\n idAttribute: 'typeId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Dogma ---\n {\n yamlFile: 'dogmaAttributes.yaml',\n tableName: 'eve_dogma_attributes',\n idAttribute: 'attributeId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'dogmaEffects.yaml',\n tableName: 'eve_dogma_effects',\n idAttribute: 'effectId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'dogmaAttributeCategories.yaml',\n tableName: 'eve_dogma_attribute_categories',\n idAttribute: 'attributeCategoryId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'dogmaUnits.yaml',\n tableName: 'eve_dogma_units',\n idAttribute: 'unitId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Industry ---\n {\n yamlFile: 'blueprints.yaml',\n tableName: 'eve_blueprints',\n idAttribute: 'blueprintTypeId',\n idType: 'number',\n injectId: false,\n },\n {\n yamlFile: 'planetSchematics.yaml',\n tableName: 'eve_planet_schematics',\n idAttribute: 'planetSchematicId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'planetResources.yaml',\n tableName: 'eve_planet_resources',\n idAttribute: 'planetId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Market ---\n {\n yamlFile: 'marketGroups.yaml',\n tableName: 'eve_market_groups',\n idAttribute: 'marketGroupId',\n idType: 'number',\n injectId: true,\n },\n\n // --- NPCs / Agents ---\n {\n yamlFile: 'agentTypes.yaml',\n tableName: 'eve_agent_types',\n idAttribute: 'agentTypeId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'agentsInSpace.yaml',\n tableName: 'eve_agents_in_space',\n idAttribute: 'characterId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'npcCharacters.yaml',\n tableName: 'eve_npc_characters',\n idAttribute: 'characterId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'npcCorporations.yaml',\n tableName: 'eve_npc_corporations',\n idAttribute: 'corporationId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'npcCorporationDivisions.yaml',\n tableName: 'eve_npc_corporation_divisions',\n idAttribute: 'npcCorporationDivisionId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'npcStations.yaml',\n tableName: 'eve_npc_stations',\n idAttribute: 'stationId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'factions.yaml',\n tableName: 'eve_factions',\n idAttribute: 'factionId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Character / Lore ---\n {\n yamlFile: 'races.yaml',\n tableName: 'eve_races',\n idAttribute: 'raceId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'bloodlines.yaml',\n tableName: 'eve_bloodlines',\n idAttribute: 'bloodlineId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'ancestries.yaml',\n tableName: 'eve_ancestries',\n idAttribute: 'ancestryId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'characterAttributes.yaml',\n tableName: 'eve_character_attributes',\n idAttribute: 'attributeId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'characterTitles.yaml',\n tableName: 'eve_character_titles',\n idAttribute: 'characterTitleId',\n idType: 'string',\n injectId: false,\n },\n {\n yamlFile: 'cloneGrades.yaml',\n tableName: 'eve_clone_grades',\n idAttribute: 'cloneGradeId',\n idType: 'number',\n injectId: true,\n },\n\n // --- SKINs ---\n {\n yamlFile: 'skins.yaml',\n tableName: 'eve_skins',\n idAttribute: 'skinId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'skinLicenses.yaml',\n tableName: 'eve_skin_licenses',\n idAttribute: 'licenseTypeId',\n idType: 'number',\n injectId: false,\n },\n {\n yamlFile: 'skinMaterials.yaml',\n tableName: 'eve_skin_materials',\n idAttribute: 'skinMaterialId',\n idType: 'number',\n injectId: false,\n },\n\n // --- SKINR ---\n {\n yamlFile: 'skinrComponents.yaml',\n tableName: 'eve_skinr_components',\n idAttribute: 'skinrComponentId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'skinrComponentCategories.yaml',\n tableName: 'eve_skinr_component_categories',\n idAttribute: 'skinrComponentCategoryId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'skinrComponentRarities.yaml',\n tableName: 'eve_skinr_component_rarities',\n idAttribute: 'skinrComponentRarityId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'skinrComponentPointValues.yaml',\n tableName: 'eve_skinr_component_point_values',\n idAttribute: 'skinrComponentCategoryId',\n idType: 'number',\n injectId: false,\n },\n {\n yamlFile: 'skinrSlots.yaml',\n tableName: 'eve_skinr_slots',\n idAttribute: 'skinrSlotId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'skinrSlotCategories.yaml',\n tableName: 'eve_skinr_slot_categories',\n idAttribute: 'skinrSlotCategoryId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'skinrSlotConfigurations.yaml',\n tableName: 'eve_skinr_slot_configurations',\n idAttribute: 'skinrSlotConfigurationId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'skinrSlotNames.yaml',\n tableName: 'eve_skinr_slot_names',\n idAttribute: 'skinrSlotNameId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'skinrTierThresholds.yaml',\n tableName: 'eve_skinr_tier_thresholds',\n idAttribute: 'shipTreeGroupId',\n idType: 'number',\n injectId: false,\n },\n\n // --- Ship Tree ---\n {\n yamlFile: 'shipTreeElements.yaml',\n tableName: 'eve_ship_tree_elements',\n idAttribute: 'shipTreeElementId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'shipTreeFactions.yaml',\n tableName: 'eve_ship_tree_factions',\n idAttribute: 'factionId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'shipTreeGroups.yaml',\n tableName: 'eve_ship_tree_groups',\n idAttribute: 'shipTreeGroupId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Graphics ---\n {\n yamlFile: 'graphics.yaml',\n tableName: 'eve_graphics',\n idAttribute: 'graphicId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'graphicMaterialSets.yaml',\n tableName: 'eve_graphic_material_sets',\n idAttribute: 'materialSetId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'icons.yaml',\n tableName: 'eve_icons',\n idAttribute: 'iconId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Stations ---\n {\n yamlFile: 'stationOperations.yaml',\n tableName: 'eve_station_operations',\n idAttribute: 'stationOperationId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'stationServices.yaml',\n tableName: 'eve_station_services',\n idAttribute: 'stationServiceId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Sovereignty ---\n {\n yamlFile: 'sovereigntyUpgrades.yaml',\n tableName: 'eve_sovereignty_upgrades',\n idAttribute: 'typeId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Certificates / Masteries ---\n {\n yamlFile: 'certificates.yaml',\n tableName: 'eve_certificates',\n idAttribute: 'certificateId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'masteries.yaml',\n tableName: 'eve_masteries',\n idAttribute: 'typeId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Misc ---\n {\n yamlFile: 'archetypes.yaml',\n tableName: 'eve_archetypes',\n idAttribute: 'archetypeId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'controlTowerResources.yaml',\n tableName: 'eve_control_tower_resources',\n idAttribute: 'typeId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'corporationActivities.yaml',\n tableName: 'eve_corporation_activities',\n idAttribute: 'corporationActivityId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'dbuffCollections.yaml',\n tableName: 'eve_dbuff_collections',\n idAttribute: 'dbuffCollectionId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'dungeons.yaml',\n tableName: 'eve_dungeons',\n idAttribute: 'dungeonId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'dynamicItemAttributes.yaml',\n tableName: 'eve_dynamic_item_attributes',\n idAttribute: 'dynamicItemAttributeId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'epicArcs.yaml',\n tableName: 'eve_epic_arcs',\n idAttribute: 'epicArcId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'freelanceJobSchemas.yaml',\n tableName: 'eve_freelance_job_schemas',\n idAttribute: 'freelanceJobSchemaGroupId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'landmarks.yaml',\n tableName: 'eve_landmarks',\n idAttribute: 'landmarkId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'mercenaryTacticalOperations.yaml',\n tableName: 'eve_mercenary_tactical_operations',\n idAttribute: 'mercenaryTacticalOperationId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'militaryCampaigns.yaml',\n tableName: 'eve_military_campaigns',\n idAttribute: 'militaryCampaignId',\n idType: 'string',\n injectId: true,\n },\n {\n yamlFile: 'militaryCampaignObjectives.yaml',\n tableName: 'eve_military_campaign_objectives',\n idAttribute: 'militaryCampaignObjectiveId',\n idType: 'string',\n injectId: true,\n },\n {\n yamlFile: 'missions.yaml',\n tableName: 'eve_missions',\n idAttribute: 'missionId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Translation ---\n {\n yamlFile: 'translationLanguages.yaml',\n tableName: 'eve_translation_languages',\n idAttribute: 'translationLanguageId',\n idType: 'string',\n injectId: true,\n },\n\n // --- Industry (extended) ---\n {\n yamlFile: 'industryActivities.yaml',\n tableName: 'eve_industry_activities',\n idAttribute: 'industryActivityId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'industryAssemblyLines.yaml',\n tableName: 'eve_industry_assembly_lines',\n idAttribute: 'assemblyLineId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'industryInstallationTypes.yaml',\n tableName: 'eve_industry_installation_types',\n idAttribute: 'installationTypeId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'industryModifierSources.yaml',\n tableName: 'eve_industry_modifier_sources',\n idAttribute: 'modifierSourceId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'industryTargetFilters.yaml',\n tableName: 'eve_industry_target_filters',\n idAttribute: 'targetFilterId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Fighters ---\n {\n yamlFile: 'fighterAbilities.yaml',\n tableName: 'eve_fighter_abilities',\n idAttribute: 'fighterAbilityId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'fighterAbilitiesByType.yaml',\n tableName: 'eve_fighter_abilities_by_type',\n idAttribute: 'typeId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Corporation ---\n {\n yamlFile: 'corporationRoles.yaml',\n tableName: 'eve_corporation_roles',\n idAttribute: 'corporationRoleId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'corporationRoleGroups.yaml',\n tableName: 'eve_corporation_role_groups',\n idAttribute: 'corporationRoleGroupId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Schools / Education ---\n {\n yamlFile: 'schools.yaml',\n tableName: 'eve_schools',\n idAttribute: 'schoolId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'schoolMap.yaml',\n tableName: 'eve_school_map',\n idAttribute: 'schoolMapId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'skillPlans.yaml',\n tableName: 'eve_skill_plans',\n idAttribute: 'skillPlanId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'expertSystems.yaml',\n tableName: 'eve_expert_systems',\n idAttribute: 'expertSystemId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Notifications ---\n {\n yamlFile: 'notificationTypes.yaml',\n tableName: 'eve_notification_types',\n idAttribute: 'notificationTypeId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'accountingEntryTypes.yaml',\n tableName: 'eve_accounting_entry_types',\n idAttribute: 'accountingEntryTypeId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Effects / Traps / Dbuffs ---\n {\n yamlFile: 'appliedProximityEffects.yaml',\n tableName: 'eve_applied_proximity_effects',\n idAttribute: 'appliedProximityEffectId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'proximityTrap.yaml',\n tableName: 'eve_proximity_traps',\n idAttribute: 'proximityTrapId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'systemDbuffEmitters.yaml',\n tableName: 'eve_system_dbuff_emitters',\n idAttribute: 'systemDbuffEmitterId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'systemWideEffects.yaml',\n tableName: 'eve_system_wide_effects',\n idAttribute: 'systemWideEffectId',\n idType: 'number',\n injectId: true,\n },\n {\n yamlFile: 'linkWithShip.yaml',\n tableName: 'eve_link_with_ship',\n idAttribute: 'linkWithShipId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Station (extended) ---\n {\n yamlFile: 'stationStandingsRestrictions.yaml',\n tableName: 'eve_station_standings_restrictions',\n idAttribute: 'stationStandingsRestrictionId',\n idType: 'number',\n injectId: true,\n },\n\n // --- SKINR (extended) ---\n {\n yamlFile: 'skinrSlotsToMaterials.yaml',\n tableName: 'eve_skinr_slots_to_materials',\n idAttribute: 'skinrSlotToMaterialId',\n idType: 'number',\n injectId: true,\n },\n\n // --- Metenox ---\n {\n yamlFile: 'metenoxMoonDrill.yaml',\n tableName: 'eve_metenox_moon_drill',\n idAttribute: 'metenoxMoonDrillId',\n idType: 'number',\n injectId: true,\n },\n] as const;\n","import { createRequire } from 'node:module';\nimport type * as JsYaml from 'js-yaml';\nimport type AdmZip from 'adm-zip';\nimport { SdeError } from './errors';\n\n/**\n * Loads js-yaml and adm-zip, the optional peer dependencies of\n * `@lgriffin/esi.ts/sde`, on first use instead of at import time, so the\n * entry point loads in an install that has neither.\n *\n * The loading is synchronous because `SdeDataProvider.fromDirectory` and\n * `fromZip` are. `require` is created from this file's location so the peers\n * resolve from wherever the package is installed: in the CommonJS bundle\n * `__filename` is Node's own; in the ES module bundle tsup's `shims` option\n * defines it from `import.meta.url`.\n */\n\ntype OptionalPeer = 'js-yaml' | 'adm-zip';\n\ntype RequireFn = (id: string) => unknown;\n\nconst requireFromPackage: RequireFn = createRequire(__filename);\n\nfunction isMissing(err: unknown, peer: OptionalPeer): boolean {\n if (!(err instanceof Error)) return false;\n const code = (err as NodeJS.ErrnoException).code;\n // A MODULE_NOT_FOUND raised for something inside the peer is not \"missing\".\n return (\n (code === 'MODULE_NOT_FOUND' || code === 'ERR_MODULE_NOT_FOUND') &&\n err.message.includes(`'${peer}'`)\n );\n}\n\n/**\n * Requires an optional peer. When it is not installed, throws an `SdeError`\n * naming the package, what needs it and the command that installs it. Any\n * other failure while loading the peer is rethrown unchanged.\n */\nexport function requireOptionalPeer<T>(\n peer: OptionalPeer,\n neededFor: string,\n load: RequireFn = requireFromPackage,\n): T {\n try {\n return load(peer) as T;\n } catch (err) {\n if (isMissing(err, peer)) {\n throw new SdeError(\n `${peer} is required to ${neededFor}. It is an optional peer dependency of @lgriffin/esi.ts; install it with: npm install ${peer}`,\n );\n }\n throw err;\n }\n}\n\nexport function loadJsYaml(): typeof JsYaml {\n return requireOptionalPeer<typeof JsYaml>('js-yaml', 'parse SDE YAML files');\n}\n\nexport function loadAdmZip(): typeof AdmZip {\n return requireOptionalPeer<typeof AdmZip>('adm-zip', 'read SDE ZIP archives');\n}\n","import { loadJsYaml } from '../optionalPeers';\nimport type { SdeMetadata } from './SdeExtractor';\n\nfunction asText(value: unknown): string {\n return typeof value === 'string' || typeof value === 'number'\n ? String(value)\n : '';\n}\n\n/**\n * Parses the contents of an SDE `_sde.yaml` file. The fields may sit at the\n * top level or be nested under an `sde:` key; the nested block wins when both\n * are present. A field that is missing or is not a string or number comes back\n * as an empty string.\n *\n * `SdeDataProvider.fromDirectory` and `SdeExtractor.readMetadata` (behind\n * `fromZip`) both read metadata through this function, so the two layouts give\n * the same result whichever way the SDE is loaded.\n */\nexport function parseSdeMetadata(content: string): SdeMetadata {\n const parsed = loadJsYaml().load(content) as Record<string, unknown>;\n const block = (parsed.sde ?? parsed) as Record<string, unknown>;\n return {\n buildNumber: asText(block.buildNumber),\n releaseDate: asText(block.releaseDate),\n };\n}\n","import type AdmZip from 'adm-zip';\nimport { SDE_METADATA_FILENAME } from './constants';\nimport { SdeError } from '../errors';\nimport { loadAdmZip, loadJsYaml } from '../optionalPeers';\nimport { parseSdeMetadata } from './metadata';\n\nexport interface SdeMetadata {\n buildNumber: string;\n releaseDate: string;\n}\n\nexport interface ParsedSdeFile {\n filename: string;\n records: Map<string | number, Record<string, unknown>>;\n}\n\nfunction findEntry(\n zip: AdmZip,\n filename: string,\n): AdmZip.IZipEntry | undefined {\n const basename = filename.replace(/^.*[\\\\/]/, '');\n return zip.getEntries().find((entry) => {\n if (entry.isDirectory) return false;\n const entryBasename = entry.entryName.replace(/^.*[\\\\/]/, '');\n return (\n entryBasename === basename ||\n entry.entryName === filename ||\n entry.entryName === `sde/${filename}`\n );\n });\n}\n\nfunction openZip(zipPath: string): AdmZip {\n const Zip = loadAdmZip();\n return new Zip(zipPath);\n}\n\nfunction readEntryAsString(entry: AdmZip.IZipEntry): string {\n const buffer = entry.getData();\n return buffer.toString('utf-8');\n}\n\nexport class SdeExtractor {\n readMetadata(zipPath: string): SdeMetadata {\n const zip = openZip(zipPath);\n const entry = findEntry(zip, SDE_METADATA_FILENAME);\n\n if (!entry) {\n throw new SdeError(\n `Metadata file '${SDE_METADATA_FILENAME}' not found in archive: ${zipPath}`,\n );\n }\n\n return parseSdeMetadata(readEntryAsString(entry));\n }\n\n parseFile(zipPath: string, filename: string): ParsedSdeFile {\n const zip = openZip(zipPath);\n return this.parseFileFromZip(zip, filename);\n }\n\n parseFiles(zipPath: string, filenames: string[]): ParsedSdeFile[] {\n const zip = openZip(zipPath);\n const results: ParsedSdeFile[] = [];\n\n for (const filename of filenames) {\n const entry = findEntry(zip, filename);\n if (!entry) {\n // File not present in this SDE build — skip silently\n continue;\n }\n results.push(this.parseEntryAsFile(entry, filename));\n }\n\n return results;\n }\n\n extractAll(zipPath: string, outputDir: string): void {\n const zip = openZip(zipPath);\n zip.extractAllTo(outputDir, true);\n }\n\n listFiles(zipPath: string): string[] {\n const zip = openZip(zipPath);\n return zip\n .getEntries()\n .filter(\n (entry) => !entry.isDirectory && entry.entryName.endsWith('.yaml'),\n )\n .map((entry) => entry.entryName);\n }\n\n private parseFileFromZip(zip: AdmZip, filename: string): ParsedSdeFile {\n const entry = findEntry(zip, filename);\n\n if (!entry) {\n throw new SdeError(`File '${filename}' not found in archive`);\n }\n\n return this.parseEntryAsFile(entry, filename);\n }\n\n private parseEntryAsFile(\n entry: AdmZip.IZipEntry,\n filename: string,\n ): ParsedSdeFile {\n const content = readEntryAsString(entry);\n const parsed = loadJsYaml().load(content) as Record<\n string | number,\n Record<string, unknown>\n >;\n const records = new Map<string | number, Record<string, unknown>>(\n Object.entries(parsed).map(([key, value]) => {\n const numKey = Number(key);\n return [Number.isNaN(numKey) ? key : numKey, value];\n }),\n );\n\n return { filename, records };\n }\n}\n","export type SqliteValue = string | number | null;\n\nexport function extractLocale(\n field: unknown,\n locale: string = 'en',\n fallback: string = '',\n): string {\n if (field == null) return fallback;\n if (typeof field === 'string') return field;\n if (typeof field === 'object' && !Array.isArray(field)) {\n const map = field as Record<string, unknown>;\n // eslint-disable-next-line security/detect-object-injection\n const value = map[locale];\n if (typeof value === 'string') return value;\n return fallback;\n }\n return fallback;\n}\n\nexport function normalizeSdeFieldName(name: string): string {\n return name.replace(/ID(?=[A-Z]|$)/g, 'Id');\n}\n\n// eslint-disable-next-line sonarjs/function-return-type -- union return is intentional\nexport function toSqliteValue(value: unknown): SqliteValue {\n if (value == null) return null;\n if (typeof value === 'boolean') return value ? 1 : 0;\n if (typeof value === 'number') return value;\n if (typeof value === 'string') return value;\n if (typeof value === 'object') return JSON.stringify(value);\n return null;\n}\n\nfunction isLocaleMap(value: unknown): value is Record<string, string> {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n return 'en' in (value as Record<string, unknown>);\n}\n\nexport function transformRecord(\n entityId: number | string,\n raw: Record<string, unknown>,\n spec: { idAttribute: string; injectId: boolean },\n): Record<string, SqliteValue> {\n const row: Record<string, SqliteValue> = {};\n\n if (spec.injectId) {\n row[spec.idAttribute] =\n typeof entityId === 'string' ? entityId : Number(entityId);\n }\n\n for (const [key, value] of Object.entries(raw)) {\n const normalizedKey = normalizeSdeFieldName(key);\n\n if (isLocaleMap(value)) {\n row[normalizedKey] = extractLocale(value);\n } else {\n row[normalizedKey] = toSqliteValue(value);\n }\n }\n\n return row;\n}\n\nfunction normalizeNested(value: unknown): unknown {\n if (value == null || typeof value !== 'object') return value;\n if (Array.isArray(value)) return value.map(normalizeNested);\n const obj = value as Record<string, unknown>;\n if (isLocaleMap(obj)) return extractLocale(obj);\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n out[normalizeSdeFieldName(k)] = normalizeNested(v);\n }\n return out;\n}\n\nexport function transformRecordNative(\n entityId: number | string,\n raw: Record<string, unknown>,\n spec: { idAttribute: string; injectId: boolean },\n): Record<string, unknown> {\n const row: Record<string, unknown> = {};\n\n if (spec.injectId) {\n row[spec.idAttribute] =\n typeof entityId === 'string' ? entityId : Number(entityId);\n }\n\n for (const [key, value] of Object.entries(raw)) {\n const normalizedKey = normalizeSdeFieldName(key);\n\n if (isLocaleMap(value)) {\n row[normalizedKey] = extractLocale(value);\n } else {\n row[normalizedKey] = normalizeNested(value);\n }\n }\n\n return row;\n}\n","/**\n * The SDE's real clock. The SDE shares no code with the pipeline (CHARTER\n * ARCH-10, `npm run lint:layers`), so it cannot take `systemClock` from\n * `src/core/clock.ts`; it implements the same `Clock` port itself, and this\n * is the one module under `src/sde` allowed to read the wall clock\n * (`npm run lint:determinism`). Code that needs time takes a `Clock` and\n * defaults to this one.\n */\nimport type { Clock } from '../core/ports/Clock';\n\nexport const systemClock: Clock = {\n now: () => Date.now(),\n sleep: (ms) => new Promise((resolve) => setTimeout(resolve, ms)),\n};\n"]}
@@ -8,13 +8,14 @@ import {
8
8
  isSdeDatabaseError,
9
9
  isSdeError,
10
10
  isSdeValidationError,
11
- isSdeVersionMismatch
12
- } from "../chunk-3ZI5A37L.mjs";
11
+ isSdeVersionMismatch,
12
+ sortedById
13
+ } from "../chunk-YUHGSPQ7.mjs";
13
14
  import {
14
15
  __filename
15
16
  } from "../chunk-JIW4BXLP.mjs";
16
17
 
17
- // src/sde/SdeDataProvider.ts
18
+ // src/sde/providers/yaml/SdeDataProvider.ts
18
19
  import * as fs from "fs";
19
20
  import * as path from "path";
20
21
 
@@ -169,14 +170,14 @@ var SDE_FILE_REGISTRY = [
169
170
  tableName: "eve_dogma_attributes",
170
171
  idAttribute: "attributeId",
171
172
  idType: "number",
172
- injectId: false
173
+ injectId: true
173
174
  },
174
175
  {
175
176
  yamlFile: "dogmaEffects.yaml",
176
177
  tableName: "eve_dogma_effects",
177
178
  idAttribute: "effectId",
178
179
  idType: "number",
179
- injectId: false
180
+ injectId: true
180
181
  },
181
182
  {
182
183
  yamlFile: "dogmaAttributeCategories.yaml",
@@ -917,12 +918,18 @@ function transformRecordNative(entityId, raw, spec) {
917
918
  return row;
918
919
  }
919
920
 
920
- // src/sde/SdeDataProvider.ts
921
- function toVersionInfo(metadata) {
921
+ // src/sde/clock.ts
922
+ var systemClock = {
923
+ now: () => Date.now(),
924
+ sleep: (ms) => new Promise((resolve2) => setTimeout(resolve2, ms))
925
+ };
926
+
927
+ // src/sde/providers/yaml/SdeDataProvider.ts
928
+ function toVersionInfo(metadata, clock) {
922
929
  return {
923
930
  version: metadata?.buildNumber || "unknown",
924
931
  buildDate: metadata?.releaseDate || "unknown",
925
- importedAt: (/* @__PURE__ */ new Date()).toISOString()
932
+ importedAt: new Date(clock.now()).toISOString()
926
933
  };
927
934
  }
928
935
  var SdeDataProvider = class _SdeDataProvider {
@@ -932,14 +939,16 @@ var SdeDataProvider = class _SdeDataProvider {
932
939
  constructor(version) {
933
940
  this.versionInfo = version;
934
941
  }
935
- static fromDirectory(dirPath) {
942
+ static fromDirectory(dirPath, options = {}) {
936
943
  const resolvedDir = path.resolve(dirPath);
937
944
  if (!fs.existsSync(resolvedDir)) {
938
945
  throw new SdeError(`SDE directory not found: ${resolvedDir}`);
939
946
  }
940
947
  const metaPath = path.join(resolvedDir, SDE_METADATA_FILENAME);
941
948
  const metadata = fs.existsSync(metaPath) ? parseSdeMetadata(fs.readFileSync(metaPath, "utf-8")) : void 0;
942
- const provider = new _SdeDataProvider(toVersionInfo(metadata));
949
+ const provider = new _SdeDataProvider(
950
+ toVersionInfo(metadata, options.clock ?? systemClock)
951
+ );
943
952
  for (const spec of SDE_FILE_REGISTRY) {
944
953
  const filePath = path.join(resolvedDir, spec.yamlFile);
945
954
  if (!fs.existsSync(filePath)) continue;
@@ -950,14 +959,16 @@ var SdeDataProvider = class _SdeDataProvider {
950
959
  }
951
960
  return provider;
952
961
  }
953
- static fromZip(zipPath) {
962
+ static fromZip(zipPath, options = {}) {
954
963
  const resolvedPath = path.resolve(zipPath);
955
964
  if (!fs.existsSync(resolvedPath)) {
956
965
  throw new SdeError(`SDE ZIP file not found: ${resolvedPath}`);
957
966
  }
958
967
  const extractor = new SdeExtractor();
959
968
  const metadata = extractor.readMetadata(resolvedPath);
960
- const provider = new _SdeDataProvider(toVersionInfo(metadata));
969
+ const provider = new _SdeDataProvider(
970
+ toVersionInfo(metadata, options.clock ?? systemClock)
971
+ );
961
972
  const yamlFiles = SDE_FILE_REGISTRY.map((s) => s.yamlFile);
962
973
  const parsedFiles = extractor.parseFiles(resolvedPath, yamlFiles);
963
974
  const specMap = new Map(SDE_FILE_REGISTRY.map((s) => [s.yamlFile, s]));
@@ -973,14 +984,13 @@ var SdeDataProvider = class _SdeDataProvider {
973
984
  return provider;
974
985
  }
975
986
  loadRecords(spec, raw) {
976
- const records = /* @__PURE__ */ new Map();
987
+ const rows = [];
977
988
  for (const [key, value] of Object.entries(raw)) {
978
989
  if (value == null || typeof value !== "object") continue;
979
990
  const id = spec.idType === "string" ? key : Number(key);
980
- const transformed = transformRecordNative(id, value, spec);
981
- records.set(id, transformed);
991
+ rows.push([id, transformRecordNative(id, value, spec)]);
982
992
  }
983
- this.entities.set(spec.tableName, records);
993
+ this.entities.set(spec.tableName, new Map(sortedById(rows, ([id]) => id)));
984
994
  }
985
995
  // ---------------------------------------------------------------
986
996
  // Generic helpers