@lgriffin/esi.ts 9.6.0 → 10.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 (259) hide show
  1. package/CHANGELOG.md +787 -388
  2. package/LICENSE +26 -26
  3. package/README.md +974 -1030
  4. package/dist/EsiClient.d.ts +4 -0
  5. package/dist/EsiClient.d.ts.map +1 -1
  6. package/dist/EsiClientBuilder.d.ts.map +1 -1
  7. package/dist/auth/EsiTokenManager.d.ts +200 -0
  8. package/dist/auth/EsiTokenManager.d.ts.map +1 -0
  9. package/dist/auth/EveSsoClient.d.ts +88 -0
  10. package/dist/auth/EveSsoClient.d.ts.map +1 -0
  11. package/dist/auth/errors.d.ts +42 -0
  12. package/dist/auth/errors.d.ts.map +1 -0
  13. package/dist/auth/index.d.ts +14 -0
  14. package/dist/auth/index.d.ts.map +1 -0
  15. package/dist/auth/jwt.d.ts +43 -0
  16. package/dist/auth/jwt.d.ts.map +1 -0
  17. package/dist/auth/pkce.d.ts +21 -0
  18. package/dist/auth/pkce.d.ts.map +1 -0
  19. package/dist/auth/storage/FileTokenStorage.d.ts +44 -0
  20. package/dist/auth/storage/FileTokenStorage.d.ts.map +1 -0
  21. package/dist/auth/storage/MemoryTokenStorage.d.ts +18 -0
  22. package/dist/auth/storage/MemoryTokenStorage.d.ts.map +1 -0
  23. package/dist/auth/types.d.ts +42 -0
  24. package/dist/auth/types.d.ts.map +1 -0
  25. package/dist/chunk-3ZI5A37L.mjs +1065 -0
  26. package/dist/chunk-3ZI5A37L.mjs.map +1 -0
  27. package/dist/chunk-7A72QFDF.mjs +416 -0
  28. package/dist/chunk-7A72QFDF.mjs.map +1 -0
  29. package/dist/chunk-BBSHKVPI.js +71 -0
  30. package/dist/chunk-BBSHKVPI.js.map +1 -0
  31. package/dist/chunk-HPSACXX3.js +416 -0
  32. package/dist/chunk-HPSACXX3.js.map +1 -0
  33. package/dist/chunk-JIW4BXLP.mjs +17 -0
  34. package/dist/chunk-JIW4BXLP.mjs.map +1 -0
  35. package/dist/chunk-MSJHIJXA.js +1065 -0
  36. package/dist/chunk-MSJHIJXA.js.map +1 -0
  37. package/dist/chunk-PZ5AY32C.js +10 -0
  38. package/dist/chunk-PZ5AY32C.js.map +1 -0
  39. package/dist/chunk-R7D7M2LQ.mjs +71 -0
  40. package/dist/chunk-R7D7M2LQ.mjs.map +1 -0
  41. package/dist/chunk-SAQBXXTM.js +2614 -0
  42. package/dist/chunk-SAQBXXTM.js.map +1 -0
  43. package/dist/chunk-VZS32UQ3.mjs +2614 -0
  44. package/dist/chunk-VZS32UQ3.mjs.map +1 -0
  45. package/dist/clients/AllianceClient.d.ts +2 -0
  46. package/dist/clients/AllianceClient.d.ts.map +1 -1
  47. package/dist/clients/AssetsClient.d.ts +2 -0
  48. package/dist/clients/AssetsClient.d.ts.map +1 -1
  49. package/dist/clients/BaseEsiClient.d.ts +1 -0
  50. package/dist/clients/BaseEsiClient.d.ts.map +1 -1
  51. package/dist/clients/CalendarClient.d.ts +2 -0
  52. package/dist/clients/CalendarClient.d.ts.map +1 -1
  53. package/dist/clients/CharacterClient.d.ts +8 -0
  54. package/dist/clients/CharacterClient.d.ts.map +1 -1
  55. package/dist/clients/ClonesClient.d.ts +1 -0
  56. package/dist/clients/ClonesClient.d.ts.map +1 -1
  57. package/dist/clients/ContactsClient.d.ts +6 -0
  58. package/dist/clients/ContactsClient.d.ts.map +1 -1
  59. package/dist/clients/ContractsClient.d.ts +14 -8
  60. package/dist/clients/ContractsClient.d.ts.map +1 -1
  61. package/dist/clients/CorporationProjectsClient.d.ts +22 -12
  62. package/dist/clients/CorporationProjectsClient.d.ts.map +1 -1
  63. package/dist/clients/CorporationsClient.d.ts +17 -0
  64. package/dist/clients/CorporationsClient.d.ts.map +1 -1
  65. package/dist/clients/FactionClient.d.ts +4 -4
  66. package/dist/clients/FactionClient.d.ts.map +1 -1
  67. package/dist/clients/FittingsClient.d.ts +1 -0
  68. package/dist/clients/FittingsClient.d.ts.map +1 -1
  69. package/dist/clients/FleetClient.d.ts +2 -0
  70. package/dist/clients/FleetClient.d.ts.map +1 -1
  71. package/dist/clients/FreelanceJobsClient.d.ts +3 -3
  72. package/dist/clients/FreelanceJobsClient.d.ts.map +1 -1
  73. package/dist/clients/IndustryClient.d.ts +11 -3
  74. package/dist/clients/IndustryClient.d.ts.map +1 -1
  75. package/dist/clients/KillmailsClient.d.ts +2 -0
  76. package/dist/clients/KillmailsClient.d.ts.map +1 -1
  77. package/dist/clients/LoyaltyClient.d.ts +2 -0
  78. package/dist/clients/LoyaltyClient.d.ts.map +1 -1
  79. package/dist/clients/MailClient.d.ts +8 -3
  80. package/dist/clients/MailClient.d.ts.map +1 -1
  81. package/dist/clients/MarketClient.d.ts +6 -0
  82. package/dist/clients/MarketClient.d.ts.map +1 -1
  83. package/dist/clients/MetaClient.d.ts +3 -2
  84. package/dist/clients/MetaClient.d.ts.map +1 -1
  85. package/dist/clients/PiClient.d.ts +2 -0
  86. package/dist/clients/PiClient.d.ts.map +1 -1
  87. package/dist/clients/SkillsClient.d.ts +1 -0
  88. package/dist/clients/SkillsClient.d.ts.map +1 -1
  89. package/dist/clients/WalletClient.d.ts +7 -3
  90. package/dist/clients/WalletClient.d.ts.map +1 -1
  91. package/dist/clients/WarsClient.d.ts +2 -0
  92. package/dist/clients/WarsClient.d.ts.map +1 -1
  93. package/dist/core/ApiClient.d.ts +8 -0
  94. package/dist/core/ApiClient.d.ts.map +1 -1
  95. package/dist/core/ApiClientBuilder.d.ts +3 -1
  96. package/dist/core/ApiClientBuilder.d.ts.map +1 -1
  97. package/dist/core/ApiRequestHandler.d.ts.map +1 -1
  98. package/dist/core/BatchRequestHandler.d.ts.map +1 -1
  99. package/dist/core/RequestDeduplicator.d.ts +2 -0
  100. package/dist/core/RequestDeduplicator.d.ts.map +1 -1
  101. package/dist/core/RetryStrategy.d.ts +2 -0
  102. package/dist/core/RetryStrategy.d.ts.map +1 -1
  103. package/dist/core/cache/ETagCacheManager.d.ts +4 -0
  104. package/dist/core/cache/ETagCacheManager.d.ts.map +1 -1
  105. package/dist/core/circuitBreaker/CircuitBreaker.d.ts +3 -0
  106. package/dist/core/circuitBreaker/CircuitBreaker.d.ts.map +1 -1
  107. package/dist/core/configureApiClient.d.ts.map +1 -1
  108. package/dist/core/constants.d.ts +2 -2
  109. package/dist/core/constants.d.ts.map +1 -1
  110. package/dist/core/endpoints/EndpointDefinition.d.ts +2 -2
  111. package/dist/core/endpoints/EndpointDefinition.d.ts.map +1 -1
  112. package/dist/core/endpoints/calendarEndpoints.d.ts +7 -7
  113. package/dist/core/endpoints/characterEndpoints.d.ts +2 -2
  114. package/dist/core/endpoints/cloneEndpoints.d.ts +2 -2
  115. package/dist/core/endpoints/contractEndpoints.d.ts +15 -22
  116. package/dist/core/endpoints/contractEndpoints.d.ts.map +1 -1
  117. package/dist/core/endpoints/corporationEndpoints.d.ts +19 -22
  118. package/dist/core/endpoints/corporationEndpoints.d.ts.map +1 -1
  119. package/dist/core/endpoints/corporationProjectEndpoints.d.ts +75 -23
  120. package/dist/core/endpoints/corporationProjectEndpoints.d.ts.map +1 -1
  121. package/dist/core/endpoints/createClient.d.ts +2 -2
  122. package/dist/core/endpoints/createClient.d.ts.map +1 -1
  123. package/dist/core/endpoints/dogmaEndpoints.d.ts +2 -2
  124. package/dist/core/endpoints/factionEndpoints.d.ts +36 -36
  125. package/dist/core/endpoints/factionEndpoints.d.ts.map +1 -1
  126. package/dist/core/endpoints/fleetEndpoints.d.ts +1 -1
  127. package/dist/core/endpoints/freelanceJobsEndpoints.d.ts +131 -122
  128. package/dist/core/endpoints/freelanceJobsEndpoints.d.ts.map +1 -1
  129. package/dist/core/endpoints/industryEndpoints.d.ts +6 -6
  130. package/dist/core/endpoints/industryEndpoints.d.ts.map +1 -1
  131. package/dist/core/endpoints/mailEndpoints.d.ts +3 -5
  132. package/dist/core/endpoints/mailEndpoints.d.ts.map +1 -1
  133. package/dist/core/endpoints/mercenaryEndpoints.d.ts +1 -1
  134. package/dist/core/endpoints/metaEndpoints.d.ts +5 -1
  135. package/dist/core/endpoints/metaEndpoints.d.ts.map +1 -1
  136. package/dist/core/endpoints/piEndpoints.d.ts +2 -2
  137. package/dist/core/endpoints/statusEndpoints.d.ts +1 -1
  138. package/dist/core/endpoints/universeEndpoints.d.ts +22 -22
  139. package/dist/core/endpoints/walletEndpoints.d.ts +2 -3
  140. package/dist/core/endpoints/walletEndpoints.d.ts.map +1 -1
  141. package/dist/core/logger/DefaultLogger.d.ts +31 -0
  142. package/dist/core/logger/DefaultLogger.d.ts.map +1 -0
  143. package/dist/core/logger/ILogger.d.ts +14 -4
  144. package/dist/core/logger/ILogger.d.ts.map +1 -1
  145. package/dist/core/logger/NoopLogger.d.ts +7 -0
  146. package/dist/core/logger/NoopLogger.d.ts.map +1 -0
  147. package/dist/core/logger/clientLog.d.ts +11 -0
  148. package/dist/core/logger/clientLog.d.ts.map +1 -0
  149. package/dist/core/logger/logger.d.ts +11 -3
  150. package/dist/core/logger/logger.d.ts.map +1 -1
  151. package/dist/core/logger/loggerUtil.d.ts +8 -6
  152. package/dist/core/logger/loggerUtil.d.ts.map +1 -1
  153. package/dist/core/logger/resolveLogger.d.ts +10 -0
  154. package/dist/core/logger/resolveLogger.d.ts.map +1 -0
  155. package/dist/core/pagination/AsyncPaginationIterator.d.ts +1 -0
  156. package/dist/core/pagination/AsyncPaginationIterator.d.ts.map +1 -1
  157. package/dist/core/pagination/CursorPaginationHandler.d.ts.map +1 -1
  158. package/dist/core/pagination/PaginationHandler.d.ts.map +1 -1
  159. package/dist/core/rateLimiter/RateLimiter.d.ts +6 -0
  160. package/dist/core/rateLimiter/RateLimiter.d.ts.map +1 -1
  161. package/dist/core/requestPipeline/cachePolicy.d.ts +14 -0
  162. package/dist/core/requestPipeline/cachePolicy.d.ts.map +1 -1
  163. package/dist/core/requestPipeline/fetchExecution.d.ts +1 -1
  164. package/dist/core/requestPipeline/fetchExecution.d.ts.map +1 -1
  165. package/dist/core/requestPipeline/headers.d.ts.map +1 -1
  166. package/dist/core/requestPipeline/index.d.ts +2 -2
  167. package/dist/core/requestPipeline/index.d.ts.map +1 -1
  168. package/dist/core/requestPipeline/paginationOrchestration.d.ts.map +1 -1
  169. package/dist/core/requestPipeline/statusHandling.d.ts +8 -2
  170. package/dist/core/requestPipeline/statusHandling.d.ts.map +1 -1
  171. package/dist/core/util/concurrency.d.ts +29 -0
  172. package/dist/core/util/concurrency.d.ts.map +1 -0
  173. package/dist/errors.d.ts +1 -0
  174. package/dist/errors.d.ts.map +1 -1
  175. package/dist/errors.js +53 -195
  176. package/dist/errors.js.map +1 -1
  177. package/dist/errors.mjs +37 -129
  178. package/dist/errors.mjs.map +1 -1
  179. package/dist/index.d.ts +10 -5
  180. package/dist/index.d.ts.map +1 -1
  181. package/dist/index.js +2597 -3480
  182. package/dist/index.js.map +1 -1
  183. package/dist/index.mjs +2250 -3024
  184. package/dist/index.mjs.map +1 -1
  185. package/dist/schemas/calendar.d.ts +9 -7
  186. package/dist/schemas/calendar.d.ts.map +1 -1
  187. package/dist/schemas/character.d.ts +2 -2
  188. package/dist/schemas/clones.d.ts +2 -2
  189. package/dist/schemas/common.d.ts +11 -1
  190. package/dist/schemas/common.d.ts.map +1 -1
  191. package/dist/schemas/contracts.d.ts +69 -6
  192. package/dist/schemas/contracts.d.ts.map +1 -1
  193. package/dist/schemas/corporation-projects.d.ts +96 -9
  194. package/dist/schemas/corporation-projects.d.ts.map +1 -1
  195. package/dist/schemas/corporation.d.ts +34 -22
  196. package/dist/schemas/corporation.d.ts.map +1 -1
  197. package/dist/schemas/dogma.d.ts +2 -2
  198. package/dist/schemas/faction-warfare.d.ts +125 -12
  199. package/dist/schemas/faction-warfare.d.ts.map +1 -1
  200. package/dist/schemas/fleet.d.ts +1 -1
  201. package/dist/schemas/freelance-jobs.d.ts +52 -22
  202. package/dist/schemas/freelance-jobs.d.ts.map +1 -1
  203. package/dist/schemas/index.js +420 -2474
  204. package/dist/schemas/index.js.map +1 -1
  205. package/dist/schemas/index.mjs +225 -2060
  206. package/dist/schemas/index.mjs.map +1 -1
  207. package/dist/schemas/industry.d.ts +33 -0
  208. package/dist/schemas/industry.d.ts.map +1 -1
  209. package/dist/schemas/mail.d.ts +24 -5
  210. package/dist/schemas/mail.d.ts.map +1 -1
  211. package/dist/schemas/mercenary.d.ts +1 -1
  212. package/dist/schemas/meta.d.ts +12 -1
  213. package/dist/schemas/meta.d.ts.map +1 -1
  214. package/dist/schemas/pi.d.ts +2 -2
  215. package/dist/schemas/status.d.ts +1 -1
  216. package/dist/schemas/universe.d.ts +22 -22
  217. package/dist/schemas/universe.d.ts.map +1 -1
  218. package/dist/schemas/wallet.d.ts +16 -0
  219. package/dist/schemas/wallet.d.ts.map +1 -1
  220. package/dist/sde/SdeDataProvider.d.ts.map +1 -1
  221. package/dist/sde/index.js +95 -1162
  222. package/dist/sde/index.js.map +1 -1
  223. package/dist/sde/index.mjs +73 -1091
  224. package/dist/sde/index.mjs.map +1 -1
  225. package/dist/sde/ingestion/SdeExtractor.d.ts.map +1 -1
  226. package/dist/sde/ingestion/metadata.d.ts +13 -0
  227. package/dist/sde/ingestion/metadata.d.ts.map +1 -0
  228. package/dist/sde/memory.js +21 -1095
  229. package/dist/sde/memory.js.map +1 -1
  230. package/dist/sde/memory.mjs +13 -1051
  231. package/dist/sde/memory.mjs.map +1 -1
  232. package/dist/sde/optionalPeers.d.ts +25 -0
  233. package/dist/sde/optionalPeers.d.ts.map +1 -0
  234. package/dist/testing/TestDataFactory.d.ts +28 -1
  235. package/dist/testing/TestDataFactory.d.ts.map +1 -1
  236. package/dist/testing/index.js +116 -125
  237. package/dist/testing/index.js.map +1 -1
  238. package/dist/testing/index.mjs +110 -82
  239. package/dist/testing/index.mjs.map +1 -1
  240. package/dist/types/contracts.d.ts +4 -1
  241. package/dist/types/contracts.d.ts.map +1 -1
  242. package/dist/types/corporation-projects.d.ts +5 -1
  243. package/dist/types/corporation-projects.d.ts.map +1 -1
  244. package/dist/types/faction-warfare.d.ts +9 -1
  245. package/dist/types/faction-warfare.d.ts.map +1 -1
  246. package/dist/types/freelance-jobs.d.ts +2 -1
  247. package/dist/types/freelance-jobs.d.ts.map +1 -1
  248. package/dist/types/generated/esi-spec.generated.d.ts +12 -12
  249. package/dist/types/generated/esi-spec.generated.d.ts.map +1 -1
  250. package/dist/types/generated/spec-alignment.check.d.ts +2 -2
  251. package/dist/types/industry.d.ts +2 -1
  252. package/dist/types/industry.d.ts.map +1 -1
  253. package/dist/types/mail.d.ts +2 -1
  254. package/dist/types/mail.d.ts.map +1 -1
  255. package/dist/types/meta.d.ts +2 -1
  256. package/dist/types/meta.d.ts.map +1 -1
  257. package/dist/types/wallet.d.ts +2 -1
  258. package/dist/types/wallet.d.ts.map +1 -1
  259. package/package.json +326 -289
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/sde/index.ts","../../src/sde/SdeDataProvider.ts","../../src/sde/ingestion/constants.ts","../../src/sde/ingestion/SdeExtractor.ts","../../src/sde/errors.ts","../../src/sde/ingestion/transforms.ts","../../src/sde/MemorySdeProvider.ts","../../src/sde/SdeTestDataFactory.ts"],"sourcesContent":["export type { IStaticDataProvider } from './IStaticDataProvider';\r\n\r\nexport { SdeDataProvider } from './SdeDataProvider';\r\nexport { MemorySdeProvider } from './MemorySdeProvider';\r\nexport type { MemorySdeData } from './MemorySdeProvider';\r\n\r\nexport type {\r\n Position3D,\r\n Position2D,\r\n StarStatistics,\r\n StargateDestination,\r\n BlueprintMaterial,\r\n BlueprintProduct,\r\n BlueprintActivity,\r\n BlueprintActivities,\r\n AccountingEntryType,\r\n AgentType,\r\n AgentInSpace,\r\n Ancestry,\r\n AppliedProximityEffect,\r\n Archetype,\r\n AsteroidBelt,\r\n Bloodline,\r\n Blueprint,\r\n EveCategory,\r\n Certificate,\r\n CharacterAttribute,\r\n CharacterTitle,\r\n CloneGrade,\r\n CompressibleType,\r\n Constellation,\r\n ContrabandType,\r\n ControlTowerResource,\r\n CorporationActivity,\r\n CorporationRoleGroup,\r\n CorporationRole,\r\n DbuffCollection,\r\n DogmaAttributeCategory,\r\n DogmaAttribute,\r\n DogmaEffect,\r\n DogmaUnit,\r\n Dungeon,\r\n DynamicItemAttribute,\r\n EpicArc,\r\n ExpertSystem,\r\n Faction,\r\n FighterAbility,\r\n FighterAbilityByType,\r\n FreelanceJobSchema,\r\n GraphicMaterialSet,\r\n Graphic,\r\n EveGroup,\r\n Icon,\r\n IndustryActivity,\r\n IndustryAssemblyLine,\r\n IndustryInstallationType,\r\n IndustryModifierSource,\r\n IndustryTargetFilter,\r\n Landmark,\r\n LinkWithShip,\r\n MarketGroup,\r\n Mastery,\r\n MercenaryTacticalOperation,\r\n MetaGroup,\r\n MetenoxMoonDrill,\r\n MilitaryCampaignObjective,\r\n MilitaryCampaign,\r\n Mission,\r\n Moon,\r\n NotificationType,\r\n NpcCharacter,\r\n NpcCorporationDivision,\r\n NpcCorporation,\r\n NpcStation,\r\n PlanetResource,\r\n PlanetSchematic,\r\n Planet,\r\n ProximityTrap,\r\n Race,\r\n Region,\r\n SchoolMap,\r\n School,\r\n SecondarySun,\r\n ShipTreeElement,\r\n ShipTreeFaction,\r\n ShipTreeGroup,\r\n SkillPlan,\r\n SkinLicense,\r\n SkinMaterial,\r\n SkinrComponentCategory,\r\n SkinrComponentPointValue,\r\n SkinrComponentRarity,\r\n SkinrComponent,\r\n SkinrSlotCategory,\r\n SkinrSlotConfiguration,\r\n SkinrSlotName,\r\n SkinrSlot,\r\n SkinrSlotToMaterial,\r\n SkinrTierThreshold,\r\n Skin,\r\n SolarSystem,\r\n SovereigntyUpgrade,\r\n Stargate,\r\n Star,\r\n StationOperation,\r\n StationService,\r\n StationStandingsRestriction,\r\n SystemDbuffEmitter,\r\n SystemWideEffect,\r\n TranslationLanguage,\r\n TypeBonus,\r\n TypeDogma,\r\n TypeElement,\r\n TypeList,\r\n TypeMaterial,\r\n EveType,\r\n} from './types';\r\n\r\nexport type { SdeVersionInfo } from './version';\r\n\r\nexport {\r\n SdeError,\r\n SdeDatabaseError,\r\n SdeValidationError,\r\n SdeVersionMismatchError,\r\n isSdeError,\r\n isSdeDatabaseError,\r\n isSdeValidationError,\r\n isSdeVersionMismatch,\r\n} from './errors';\r\n\r\nexport { SdeTestDataFactory } from './SdeTestDataFactory';\r\n","import * as fs from 'node:fs';\r\nimport * as path from 'node:path';\r\nimport * as yaml from 'js-yaml';\r\nimport type { IStaticDataProvider } from './IStaticDataProvider';\r\nimport type {\r\n EveType,\r\n EveGroup,\r\n EveCategory,\r\n Region,\r\n Constellation,\r\n SolarSystem,\r\n Stargate,\r\n Star,\r\n Planet,\r\n Moon,\r\n AsteroidBelt,\r\n Faction,\r\n Race,\r\n Bloodline,\r\n Ancestry,\r\n NpcCorporation,\r\n NpcStation,\r\n MarketGroup,\r\n MetaGroup,\r\n Icon,\r\n Graphic,\r\n DogmaAttribute,\r\n DogmaEffect,\r\n Blueprint,\r\n PlanetSchematic,\r\n AgentType,\r\n AgentInSpace,\r\n Certificate,\r\n CharacterAttribute,\r\n CloneGrade,\r\n CorporationActivity,\r\n DogmaAttributeCategory,\r\n DogmaUnit,\r\n IndustryActivity,\r\n Landmark,\r\n NotificationType,\r\n NpcCharacter,\r\n NpcCorporationDivision,\r\n School,\r\n SecondarySun,\r\n Skin,\r\n SkinLicense,\r\n StationOperation,\r\n StationService,\r\n TypeDogma,\r\n TypeMaterial,\r\n TypeBonus,\r\n Mission,\r\n Dungeon,\r\n EpicArc,\r\n} from './types';\r\nimport type { SdeVersionInfo } from './version';\r\nimport { SDE_FILE_REGISTRY } from './ingestion/constants';\r\nimport type { SdeFileSpec } from './ingestion/constants';\r\nimport { SdeExtractor } from './ingestion/SdeExtractor';\r\nimport { transformRecordNative } from './ingestion/transforms';\r\nimport { SdeError } from './errors';\r\n\r\nexport class SdeDataProvider implements IStaticDataProvider {\r\n private entities = new Map<\r\n string,\r\n Map<number | string, Record<string, unknown>>\r\n >();\r\n private fkIndexes = new Map<\r\n string,\r\n Map<unknown, Record<string, unknown>[]>\r\n >();\r\n private versionInfo: SdeVersionInfo;\r\n\r\n private constructor(version: SdeVersionInfo) {\r\n this.versionInfo = version;\r\n }\r\n\r\n static fromDirectory(dirPath: string): SdeDataProvider {\r\n const resolvedDir = path.resolve(dirPath);\r\n if (!fs.existsSync(resolvedDir)) {\r\n throw new SdeError(`SDE directory not found: ${resolvedDir}`);\r\n }\r\n\r\n let version: SdeVersionInfo = {\r\n version: 'unknown',\r\n buildDate: 'unknown',\r\n importedAt: new Date().toISOString(),\r\n };\r\n\r\n const metaPath = path.join(resolvedDir, '_sde.yaml');\r\n if (fs.existsSync(metaPath)) {\r\n const metaContent = fs.readFileSync(metaPath, 'utf-8');\r\n const parsed = yaml.load(metaContent) as Record<string, unknown>;\r\n const sdeBlock = (parsed.sde ?? parsed) as Record<string, unknown>;\r\n const bn = sdeBlock.buildNumber;\r\n const rd = sdeBlock.releaseDate;\r\n version = {\r\n version:\r\n typeof bn === 'string' || typeof bn === 'number'\r\n ? String(bn)\r\n : 'unknown',\r\n buildDate:\r\n typeof rd === 'string' || typeof rd === 'number'\r\n ? String(rd)\r\n : 'unknown',\r\n importedAt: new Date().toISOString(),\r\n };\r\n }\r\n\r\n const provider = new SdeDataProvider(version);\r\n\r\n for (const spec of SDE_FILE_REGISTRY) {\r\n const filePath = path.join(resolvedDir, spec.yamlFile);\r\n if (!fs.existsSync(filePath)) continue;\r\n\r\n const content = fs.readFileSync(filePath, 'utf-8');\r\n const parsed = yaml.load(content) as Record<\r\n string | number,\r\n Record<string, unknown>\r\n > | null;\r\n if (!parsed || typeof parsed !== 'object') continue;\r\n\r\n provider.loadRecords(spec, parsed);\r\n }\r\n\r\n return provider;\r\n }\r\n\r\n static fromZip(zipPath: string): SdeDataProvider {\r\n const resolvedPath = path.resolve(zipPath);\r\n if (!fs.existsSync(resolvedPath)) {\r\n throw new SdeError(`SDE ZIP file not found: ${resolvedPath}`);\r\n }\r\n\r\n const extractor = new SdeExtractor();\r\n const metadata = extractor.readMetadata(resolvedPath);\r\n\r\n const version: SdeVersionInfo = {\r\n version: metadata.buildNumber || 'unknown',\r\n buildDate: metadata.releaseDate || 'unknown',\r\n importedAt: new Date().toISOString(),\r\n };\r\n\r\n const provider = new SdeDataProvider(version);\r\n\r\n const yamlFiles = SDE_FILE_REGISTRY.map((s) => s.yamlFile);\r\n const parsedFiles = extractor.parseFiles(resolvedPath, yamlFiles);\r\n const specMap = new Map(SDE_FILE_REGISTRY.map((s) => [s.yamlFile, s]));\r\n\r\n for (const file of parsedFiles) {\r\n const spec = specMap.get(file.filename);\r\n if (!spec) continue;\r\n\r\n const rawEntries: Record<string | number, Record<string, unknown>> = {};\r\n for (const [key, value] of file.records) {\r\n rawEntries[key] = value;\r\n }\r\n provider.loadRecords(spec, rawEntries);\r\n }\r\n\r\n return provider;\r\n }\r\n\r\n private loadRecords(\r\n spec: SdeFileSpec,\r\n raw: Record<string | number, Record<string, unknown>>,\r\n ): void {\r\n const records = new Map<number | string, Record<string, unknown>>();\r\n for (const [key, value] of Object.entries(raw)) {\r\n if (value == null || typeof value !== 'object') continue;\r\n const id = spec.idType === 'string' ? key : Number(key);\r\n const transformed = transformRecordNative(id, value, spec);\r\n records.set(id, transformed);\r\n }\r\n this.entities.set(spec.tableName, records);\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // Generic helpers\r\n // ---------------------------------------------------------------\r\n\r\n private getById<T>(tableName: string, id: number | string): T | null {\r\n const table = this.entities.get(tableName);\r\n if (!table) return null;\r\n const row = table.get(id);\r\n return (row as T) ?? null;\r\n }\r\n\r\n private getByFk<T>(\r\n tableName: string,\r\n fkField: string,\r\n fkValue: unknown,\r\n ): T[] {\r\n const indexKey = `${tableName}:${fkField}`;\r\n let index = this.fkIndexes.get(indexKey);\r\n if (!index) {\r\n index = new Map();\r\n const table = this.entities.get(tableName);\r\n if (table) {\r\n for (const row of table.values()) {\r\n const val = row[fkField];\r\n if (val == null) continue;\r\n const existing = index.get(val);\r\n if (existing) existing.push(row);\r\n else index.set(val, [row]);\r\n }\r\n }\r\n this.fkIndexes.set(indexKey, index);\r\n }\r\n return (index.get(fkValue) ?? []) as T[];\r\n }\r\n\r\n private getAllRecords<T>(tableName: string): T[] {\r\n const table = this.entities.get(tableName);\r\n if (!table) return [];\r\n return Array.from(table.values()) as T[];\r\n }\r\n\r\n private search<T>(\r\n tableName: string,\r\n field: string,\r\n query: string,\r\n limit: number,\r\n ): T[] {\r\n const table = this.entities.get(tableName);\r\n if (!table) return [];\r\n const lowerQuery = query.toLowerCase();\r\n const results: T[] = [];\r\n for (const row of table.values()) {\r\n const val = row[field];\r\n if (typeof val === 'string' && val.toLowerCase().includes(lowerQuery)) {\r\n results.push(row as T);\r\n if (results.length >= limit) break;\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n private filterBy<T>(\r\n tableName: string,\r\n predicate: (row: Record<string, unknown>) => boolean,\r\n ): T[] {\r\n const table = this.entities.get(tableName);\r\n if (!table) return [];\r\n const results: T[] = [];\r\n for (const row of table.values()) {\r\n if (predicate(row)) results.push(row as T);\r\n }\r\n return results;\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // Generic entity accessors (for niche entities)\r\n // ---------------------------------------------------------------\r\n\r\n getEntity<T = Record<string, unknown>>(\r\n tableName: string,\r\n id: number | string,\r\n ): T | null {\r\n return this.getById<T>(tableName, id);\r\n }\r\n\r\n getAllEntities<T = Record<string, unknown>>(tableName: string): T[] {\r\n return this.getAllRecords<T>(tableName);\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // Types, Groups, Categories\r\n // ---------------------------------------------------------------\r\n\r\n getType(typeId: number): EveType | null {\r\n return this.getById<EveType>('eve_types', typeId);\r\n }\r\n\r\n getTypesByGroup(groupId: number): EveType[] {\r\n return this.getByFk<EveType>('eve_types', 'groupId', groupId);\r\n }\r\n\r\n getGroup(groupId: number): EveGroup | null {\r\n return this.getById<EveGroup>('eve_groups', groupId);\r\n }\r\n\r\n getGroupsByCategory(categoryId: number): EveGroup[] {\r\n return this.getByFk<EveGroup>('eve_groups', 'categoryId', categoryId);\r\n }\r\n\r\n getCategory(categoryId: number): EveCategory | null {\r\n return this.getById<EveCategory>('eve_categories', categoryId);\r\n }\r\n\r\n getAllCategories(): EveCategory[] {\r\n return this.getAllRecords<EveCategory>('eve_categories');\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // Regions, Constellations, Solar Systems, Stargates\r\n // ---------------------------------------------------------------\r\n\r\n getRegion(regionId: number): Region | null {\r\n return this.getById<Region>('eve_regions', regionId);\r\n }\r\n\r\n getAllRegions(): Region[] {\r\n return this.getAllRecords<Region>('eve_regions');\r\n }\r\n\r\n getConstellation(constellationId: number): Constellation | null {\r\n return this.getById<Constellation>('eve_constellations', constellationId);\r\n }\r\n\r\n getConstellationsByRegion(regionId: number): Constellation[] {\r\n return this.getByFk<Constellation>(\r\n 'eve_constellations',\r\n 'regionId',\r\n regionId,\r\n );\r\n }\r\n\r\n getSolarSystem(systemId: number): SolarSystem | null {\r\n return this.getById<SolarSystem>('eve_solar_systems', systemId);\r\n }\r\n\r\n getSolarSystemsByConstellation(constellationId: number): SolarSystem[] {\r\n return this.getByFk<SolarSystem>(\r\n 'eve_solar_systems',\r\n 'constellationId',\r\n constellationId,\r\n );\r\n }\r\n\r\n getStargate(stargateId: number): Stargate | null {\r\n return this.getById<Stargate>('eve_stargates', stargateId);\r\n }\r\n\r\n getStargatesBySystem(systemId: number): Stargate[] {\r\n return this.getByFk<Stargate>('eve_stargates', 'solarSystemId', systemId);\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // Search\r\n // ---------------------------------------------------------------\r\n\r\n searchTypesByName(query: string, limit = 25): EveType[] {\r\n return this.search<EveType>('eve_types', 'name', query, limit);\r\n }\r\n\r\n searchSolarSystemsByName(query: string, limit = 25): SolarSystem[] {\r\n return this.search<SolarSystem>('eve_solar_systems', 'name', query, limit);\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // Universe\r\n // ---------------------------------------------------------------\r\n\r\n getStar(starId: number): Star | null {\r\n return this.getById<Star>('eve_stars', starId);\r\n }\r\n\r\n getStarBySystem(systemId: number): Star | null {\r\n const stars = this.getByFk<Star>('eve_stars', 'solarSystemId', systemId);\r\n return stars[0] ?? null;\r\n }\r\n\r\n getPlanet(planetId: number): Planet | null {\r\n return this.getById<Planet>('eve_planets', planetId);\r\n }\r\n\r\n getPlanetsBySystem(systemId: number): Planet[] {\r\n return this.getByFk<Planet>('eve_planets', 'solarSystemId', systemId);\r\n }\r\n\r\n getMoon(moonId: number): Moon | null {\r\n return this.getById<Moon>('eve_moons', moonId);\r\n }\r\n\r\n getMoonsBySystem(systemId: number): Moon[] {\r\n return this.getByFk<Moon>('eve_moons', 'solarSystemId', systemId);\r\n }\r\n\r\n getAsteroidBelt(asteroidBeltId: number): AsteroidBelt | null {\r\n return this.getById<AsteroidBelt>('eve_asteroid_belts', asteroidBeltId);\r\n }\r\n\r\n getAsteroidBeltsBySystem(systemId: number): AsteroidBelt[] {\r\n return this.getByFk<AsteroidBelt>(\r\n 'eve_asteroid_belts',\r\n 'solarSystemId',\r\n systemId,\r\n );\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // Character/Lore\r\n // ---------------------------------------------------------------\r\n\r\n getFaction(factionId: number): Faction | null {\r\n return this.getById<Faction>('eve_factions', factionId);\r\n }\r\n\r\n getAllFactions(): Faction[] {\r\n return this.getAllRecords<Faction>('eve_factions');\r\n }\r\n\r\n getRace(raceId: number): Race | null {\r\n return this.getById<Race>('eve_races', raceId);\r\n }\r\n\r\n getAllRaces(): Race[] {\r\n return this.getAllRecords<Race>('eve_races');\r\n }\r\n\r\n getBloodline(bloodlineId: number): Bloodline | null {\r\n return this.getById<Bloodline>('eve_bloodlines', bloodlineId);\r\n }\r\n\r\n getBloodlinesByRace(raceId: number): Bloodline[] {\r\n return this.getByFk<Bloodline>('eve_bloodlines', 'raceId', raceId);\r\n }\r\n\r\n getAncestry(ancestryId: number): Ancestry | null {\r\n return this.getById<Ancestry>('eve_ancestries', ancestryId);\r\n }\r\n\r\n getAncestriesByBloodline(bloodlineId: number): Ancestry[] {\r\n return this.getByFk<Ancestry>('eve_ancestries', 'bloodlineId', bloodlineId);\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // NPC Infrastructure\r\n // ---------------------------------------------------------------\r\n\r\n getNpcCorporation(corporationId: number): NpcCorporation | null {\r\n return this.getById<NpcCorporation>('eve_npc_corporations', corporationId);\r\n }\r\n\r\n getNpcCorporationsByFaction(factionId: number): NpcCorporation[] {\r\n return this.getByFk<NpcCorporation>(\r\n 'eve_npc_corporations',\r\n 'factionId',\r\n factionId,\r\n );\r\n }\r\n\r\n getNpcStation(stationId: number): NpcStation | null {\r\n return this.getById<NpcStation>('eve_npc_stations', stationId);\r\n }\r\n\r\n getNpcStationsBySystem(systemId: number): NpcStation[] {\r\n return this.getByFk<NpcStation>(\r\n 'eve_npc_stations',\r\n 'solarSystemId',\r\n systemId,\r\n );\r\n }\r\n\r\n getNpcStationsByOwner(ownerId: number): NpcStation[] {\r\n return this.getByFk<NpcStation>('eve_npc_stations', 'ownerId', ownerId);\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // Market\r\n // ---------------------------------------------------------------\r\n\r\n getMarketGroup(marketGroupId: number): MarketGroup | null {\r\n return this.getById<MarketGroup>('eve_market_groups', marketGroupId);\r\n }\r\n\r\n getMarketGroupsByParent(parentGroupId: number): MarketGroup[] {\r\n return this.getByFk<MarketGroup>(\r\n 'eve_market_groups',\r\n 'parentGroupId',\r\n parentGroupId,\r\n );\r\n }\r\n\r\n getRootMarketGroups(): MarketGroup[] {\r\n return this.filterBy<MarketGroup>(\r\n 'eve_market_groups',\r\n (r) => r.parentGroupId == null,\r\n );\r\n }\r\n\r\n getTypesByMarketGroup(marketGroupId: number): EveType[] {\r\n return this.getByFk<EveType>('eve_types', 'marketGroupId', marketGroupId);\r\n }\r\n\r\n searchMarketGroupsByName(query: string, limit = 25): MarketGroup[] {\r\n return this.search<MarketGroup>('eve_market_groups', 'name', query, limit);\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // Meta/UI\r\n // ---------------------------------------------------------------\r\n\r\n getMetaGroup(metaGroupId: number): MetaGroup | null {\r\n return this.getById<MetaGroup>('eve_meta_groups', metaGroupId);\r\n }\r\n\r\n getAllMetaGroups(): MetaGroup[] {\r\n return this.getAllRecords<MetaGroup>('eve_meta_groups');\r\n }\r\n\r\n getIcon(iconId: number): Icon | null {\r\n return this.getById<Icon>('eve_icons', iconId);\r\n }\r\n\r\n getGraphic(graphicId: number): Graphic | null {\r\n return this.getById<Graphic>('eve_graphics', graphicId);\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // Dogma\r\n // ---------------------------------------------------------------\r\n\r\n getDogmaAttribute(attributeId: number): DogmaAttribute | null {\r\n return this.getById<DogmaAttribute>('eve_dogma_attributes', attributeId);\r\n }\r\n\r\n searchDogmaAttributesByName(query: string, limit = 25): DogmaAttribute[] {\r\n return this.search<DogmaAttribute>(\r\n 'eve_dogma_attributes',\r\n 'name',\r\n query,\r\n limit,\r\n );\r\n }\r\n\r\n getDogmaEffect(effectId: number): DogmaEffect | null {\r\n return this.getById<DogmaEffect>('eve_dogma_effects', effectId);\r\n }\r\n\r\n searchDogmaEffectsByName(query: string, limit = 25): DogmaEffect[] {\r\n return this.search<DogmaEffect>('eve_dogma_effects', 'name', query, limit);\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // Industry\r\n // ---------------------------------------------------------------\r\n\r\n getBlueprint(blueprintTypeId: number): Blueprint | null {\r\n return this.getById<Blueprint>('eve_blueprints', blueprintTypeId);\r\n }\r\n\r\n getPlanetSchematic(planetSchematicId: number): PlanetSchematic | null {\r\n return this.getById<PlanetSchematic>(\r\n 'eve_planet_schematics',\r\n planetSchematicId,\r\n );\r\n }\r\n\r\n getAllPlanetSchematics(): PlanetSchematic[] {\r\n return this.getAllRecords<PlanetSchematic>('eve_planet_schematics');\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // Agent System\r\n // ---------------------------------------------------------------\r\n\r\n getAgentType(agentTypeId: number): AgentType | null {\r\n return this.getById<AgentType>('eve_agent_types', agentTypeId);\r\n }\r\n\r\n getAllAgentTypes(): AgentType[] {\r\n return this.getAllRecords<AgentType>('eve_agent_types');\r\n }\r\n\r\n getAgentInSpace(characterId: number): AgentInSpace | null {\r\n return this.getById<AgentInSpace>('eve_agents_in_space', characterId);\r\n }\r\n\r\n getAgentsInSpaceBySystem(systemId: number): AgentInSpace[] {\r\n return this.getByFk<AgentInSpace>(\r\n 'eve_agents_in_space',\r\n 'solarSystemId',\r\n systemId,\r\n );\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // Certificates\r\n // ---------------------------------------------------------------\r\n\r\n getCertificate(certificateId: number): Certificate | null {\r\n return this.getById<Certificate>('eve_certificates', certificateId);\r\n }\r\n\r\n getAllCertificates(): Certificate[] {\r\n return this.getAllRecords<Certificate>('eve_certificates');\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // Character Attributes\r\n // ---------------------------------------------------------------\r\n\r\n getCharacterAttribute(attributeId: number): CharacterAttribute | null {\r\n return this.getById<CharacterAttribute>(\r\n 'eve_character_attributes',\r\n attributeId,\r\n );\r\n }\r\n\r\n getAllCharacterAttributes(): CharacterAttribute[] {\r\n return this.getAllRecords<CharacterAttribute>('eve_character_attributes');\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // NPC Characters\r\n // ---------------------------------------------------------------\r\n\r\n getNpcCharacter(characterId: number): NpcCharacter | null {\r\n return this.getById<NpcCharacter>('eve_npc_characters', characterId);\r\n }\r\n\r\n getNpcCharactersByCorporation(corporationId: number): NpcCharacter[] {\r\n return this.getByFk<NpcCharacter>(\r\n 'eve_npc_characters',\r\n 'corporationId',\r\n corporationId,\r\n );\r\n }\r\n\r\n searchNpcCharactersByName(query: string, limit = 25): NpcCharacter[] {\r\n return this.search<NpcCharacter>(\r\n 'eve_npc_characters',\r\n 'name',\r\n query,\r\n limit,\r\n );\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // Clone Grades\r\n // ---------------------------------------------------------------\r\n\r\n getCloneGrade(cloneGradeId: number): CloneGrade | null {\r\n return this.getById<CloneGrade>('eve_clone_grades', cloneGradeId);\r\n }\r\n\r\n getAllCloneGrades(): CloneGrade[] {\r\n return this.getAllRecords<CloneGrade>('eve_clone_grades');\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // Corporation Reference\r\n // ---------------------------------------------------------------\r\n\r\n getCorporationActivity(\r\n corporationActivityId: number,\r\n ): CorporationActivity | null {\r\n return this.getById<CorporationActivity>(\r\n 'eve_corporation_activities',\r\n corporationActivityId,\r\n );\r\n }\r\n\r\n getAllCorporationActivities(): CorporationActivity[] {\r\n return this.getAllRecords<CorporationActivity>(\r\n 'eve_corporation_activities',\r\n );\r\n }\r\n\r\n getNpcCorporationDivision(\r\n npcCorporationDivisionId: number,\r\n ): NpcCorporationDivision | null {\r\n return this.getById<NpcCorporationDivision>(\r\n 'eve_npc_corporation_divisions',\r\n npcCorporationDivisionId,\r\n );\r\n }\r\n\r\n getAllNpcCorporationDivisions(): NpcCorporationDivision[] {\r\n return this.getAllRecords<NpcCorporationDivision>(\r\n 'eve_npc_corporation_divisions',\r\n );\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // Dogma Reference\r\n // ---------------------------------------------------------------\r\n\r\n getDogmaAttributeCategory(\r\n attributeCategoryId: number,\r\n ): DogmaAttributeCategory | null {\r\n return this.getById<DogmaAttributeCategory>(\r\n 'eve_dogma_attribute_categories',\r\n attributeCategoryId,\r\n );\r\n }\r\n\r\n getAllDogmaAttributeCategories(): DogmaAttributeCategory[] {\r\n return this.getAllRecords<DogmaAttributeCategory>(\r\n 'eve_dogma_attribute_categories',\r\n );\r\n }\r\n\r\n getDogmaUnit(unitId: number): DogmaUnit | null {\r\n return this.getById<DogmaUnit>('eve_dogma_units', unitId);\r\n }\r\n\r\n getAllDogmaUnits(): DogmaUnit[] {\r\n return this.getAllRecords<DogmaUnit>('eve_dogma_units');\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // Industry Reference\r\n // ---------------------------------------------------------------\r\n\r\n getIndustryActivity(industryActivityId: number): IndustryActivity | null {\r\n return this.getById<IndustryActivity>(\r\n 'eve_industry_activities',\r\n industryActivityId,\r\n );\r\n }\r\n\r\n getAllIndustryActivities(): IndustryActivity[] {\r\n return this.getAllRecords<IndustryActivity>('eve_industry_activities');\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // Landmarks\r\n // ---------------------------------------------------------------\r\n\r\n getLandmark(landmarkId: number): Landmark | null {\r\n return this.getById<Landmark>('eve_landmarks', landmarkId);\r\n }\r\n\r\n getAllLandmarks(): Landmark[] {\r\n return this.getAllRecords<Landmark>('eve_landmarks');\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // Notifications\r\n // ---------------------------------------------------------------\r\n\r\n getNotificationType(notificationTypeId: number): NotificationType | null {\r\n return this.getById<NotificationType>(\r\n 'eve_notification_types',\r\n notificationTypeId,\r\n );\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // Schools\r\n // ---------------------------------------------------------------\r\n\r\n getSchool(schoolId: number): School | null {\r\n return this.getById<School>('eve_schools', schoolId);\r\n }\r\n\r\n getAllSchools(): School[] {\r\n return this.getAllRecords<School>('eve_schools');\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // Secondary Suns\r\n // ---------------------------------------------------------------\r\n\r\n getSecondarySun(secondarySunId: number): SecondarySun | null {\r\n return this.getById<SecondarySun>('eve_secondary_suns', secondarySunId);\r\n }\r\n\r\n getSecondarySunsBySystem(systemId: number): SecondarySun[] {\r\n return this.getByFk<SecondarySun>(\r\n 'eve_secondary_suns',\r\n 'solarSystemId',\r\n systemId,\r\n );\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // Skins\r\n // ---------------------------------------------------------------\r\n\r\n getSkin(skinId: number): Skin | null {\r\n return this.getById<Skin>('eve_skins', skinId);\r\n }\r\n\r\n getSkinLicense(licenseTypeId: number): SkinLicense | null {\r\n return this.getById<SkinLicense>('eve_skin_licenses', licenseTypeId);\r\n }\r\n\r\n getSkinLicensesBySkin(skinId: number): SkinLicense[] {\r\n return this.getByFk<SkinLicense>('eve_skin_licenses', 'skinId', skinId);\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // Station Operations & Services\r\n // ---------------------------------------------------------------\r\n\r\n getStationOperation(stationOperationId: number): StationOperation | null {\r\n return this.getById<StationOperation>(\r\n 'eve_station_operations',\r\n stationOperationId,\r\n );\r\n }\r\n\r\n getAllStationOperations(): StationOperation[] {\r\n return this.getAllRecords<StationOperation>('eve_station_operations');\r\n }\r\n\r\n getStationService(stationServiceId: number): StationService | null {\r\n return this.getById<StationService>(\r\n 'eve_station_services',\r\n stationServiceId,\r\n );\r\n }\r\n\r\n getAllStationServices(): StationService[] {\r\n return this.getAllRecords<StationService>('eve_station_services');\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // Type Properties\r\n // ---------------------------------------------------------------\r\n\r\n getTypeDogma(typeId: number): TypeDogma | null {\r\n return this.getById<TypeDogma>('eve_type_dogma', typeId);\r\n }\r\n\r\n getTypeMaterial(typeId: number): TypeMaterial | null {\r\n return this.getById<TypeMaterial>('eve_type_materials', typeId);\r\n }\r\n\r\n getTypeBonus(typeId: number): TypeBonus | null {\r\n return this.getById<TypeBonus>('eve_type_bonuses', typeId);\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // Missions & Content\r\n // ---------------------------------------------------------------\r\n\r\n getMission(missionId: number): Mission | null {\r\n return this.getById<Mission>('eve_missions', missionId);\r\n }\r\n\r\n getDungeon(dungeonId: number): Dungeon | null {\r\n return this.getById<Dungeon>('eve_dungeons', dungeonId);\r\n }\r\n\r\n getEpicArc(epicArcId: number): EpicArc | null {\r\n return this.getById<EpicArc>('eve_epic_arcs', epicArcId);\r\n }\r\n\r\n getAllEpicArcs(): EpicArc[] {\r\n return this.getAllRecords<EpicArc>('eve_epic_arcs');\r\n }\r\n\r\n // ---------------------------------------------------------------\r\n // Version & Lifecycle\r\n // ---------------------------------------------------------------\r\n\r\n getVersion(): SdeVersionInfo {\r\n return { ...this.versionInfo };\r\n }\r\n\r\n close(): void {\r\n this.entities.clear();\r\n this.fkIndexes.clear();\r\n }\r\n}\r\n","export const SDE_DOWNLOAD_URL =\r\n 'https://developers.eveonline.com/static-data/eve-online-static-data-latest-yaml.zip';\r\n\r\nexport const SDE_LATEST_BUILD_URL =\r\n 'https://developers.eveonline.com/static-data/tranquility/latest.jsonl';\r\n\r\nexport const SDE_BUILD_NUMBER_HEADER = 'x-sde-build-number';\r\n\r\nexport const SDE_METADATA_FILENAME = '_sde.yaml';\r\n\r\nexport interface SdeFileSpec {\r\n readonly yamlFile: string;\r\n readonly tableName: string;\r\n readonly idAttribute: string;\r\n readonly idType: 'number' | 'string';\r\n readonly injectId: boolean;\r\n}\r\n\r\nexport const SDE_FILE_REGISTRY: readonly SdeFileSpec[] = [\r\n // --- Universe / Map ---\r\n {\r\n yamlFile: 'mapRegions.yaml',\r\n tableName: 'eve_regions',\r\n idAttribute: 'regionId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'mapConstellations.yaml',\r\n tableName: 'eve_constellations',\r\n idAttribute: 'constellationId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'mapSolarSystems.yaml',\r\n tableName: 'eve_solar_systems',\r\n idAttribute: 'systemId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'mapStargates.yaml',\r\n tableName: 'eve_stargates',\r\n idAttribute: 'stargateId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'mapStars.yaml',\r\n tableName: 'eve_stars',\r\n idAttribute: 'starId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'mapPlanets.yaml',\r\n tableName: 'eve_planets',\r\n idAttribute: 'planetId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'mapMoons.yaml',\r\n tableName: 'eve_moons',\r\n idAttribute: 'moonId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'mapAsteroidBelts.yaml',\r\n tableName: 'eve_asteroid_belts',\r\n idAttribute: 'asteroidBeltId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'mapSecondarySuns.yaml',\r\n tableName: 'eve_secondary_suns',\r\n idAttribute: 'secondarySunId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n\r\n // --- Type System ---\r\n {\r\n yamlFile: 'types.yaml',\r\n tableName: 'eve_types',\r\n idAttribute: 'typeId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'groups.yaml',\r\n tableName: 'eve_groups',\r\n idAttribute: 'groupId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'categories.yaml',\r\n tableName: 'eve_categories',\r\n idAttribute: 'categoryId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'metaGroups.yaml',\r\n tableName: 'eve_meta_groups',\r\n idAttribute: 'metaGroupId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'typeDogma.yaml',\r\n tableName: 'eve_type_dogma',\r\n idAttribute: 'typeId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'typeBonus.yaml',\r\n tableName: 'eve_type_bonuses',\r\n idAttribute: 'typeId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'typeElements.yaml',\r\n tableName: 'eve_type_elements',\r\n idAttribute: 'typeId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'typeLists.yaml',\r\n tableName: 'eve_type_lists',\r\n idAttribute: 'typeListId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'typeMaterials.yaml',\r\n tableName: 'eve_type_materials',\r\n idAttribute: 'typeId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'compressibleTypes.yaml',\r\n tableName: 'eve_compressible_types',\r\n idAttribute: 'typeId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'contrabandTypes.yaml',\r\n tableName: 'eve_contraband_types',\r\n idAttribute: 'typeId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n\r\n // --- Dogma ---\r\n {\r\n yamlFile: 'dogmaAttributes.yaml',\r\n tableName: 'eve_dogma_attributes',\r\n idAttribute: 'attributeId',\r\n idType: 'number',\r\n injectId: false,\r\n },\r\n {\r\n yamlFile: 'dogmaEffects.yaml',\r\n tableName: 'eve_dogma_effects',\r\n idAttribute: 'effectId',\r\n idType: 'number',\r\n injectId: false,\r\n },\r\n {\r\n yamlFile: 'dogmaAttributeCategories.yaml',\r\n tableName: 'eve_dogma_attribute_categories',\r\n idAttribute: 'attributeCategoryId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'dogmaUnits.yaml',\r\n tableName: 'eve_dogma_units',\r\n idAttribute: 'unitId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n\r\n // --- Industry ---\r\n {\r\n yamlFile: 'blueprints.yaml',\r\n tableName: 'eve_blueprints',\r\n idAttribute: 'blueprintTypeId',\r\n idType: 'number',\r\n injectId: false,\r\n },\r\n {\r\n yamlFile: 'planetSchematics.yaml',\r\n tableName: 'eve_planet_schematics',\r\n idAttribute: 'planetSchematicId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'planetResources.yaml',\r\n tableName: 'eve_planet_resources',\r\n idAttribute: 'planetId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n\r\n // --- Market ---\r\n {\r\n yamlFile: 'marketGroups.yaml',\r\n tableName: 'eve_market_groups',\r\n idAttribute: 'marketGroupId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n\r\n // --- NPCs / Agents ---\r\n {\r\n yamlFile: 'agentTypes.yaml',\r\n tableName: 'eve_agent_types',\r\n idAttribute: 'agentTypeId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'agentsInSpace.yaml',\r\n tableName: 'eve_agents_in_space',\r\n idAttribute: 'characterId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'npcCharacters.yaml',\r\n tableName: 'eve_npc_characters',\r\n idAttribute: 'characterId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'npcCorporations.yaml',\r\n tableName: 'eve_npc_corporations',\r\n idAttribute: 'corporationId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'npcCorporationDivisions.yaml',\r\n tableName: 'eve_npc_corporation_divisions',\r\n idAttribute: 'npcCorporationDivisionId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'npcStations.yaml',\r\n tableName: 'eve_npc_stations',\r\n idAttribute: 'stationId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'factions.yaml',\r\n tableName: 'eve_factions',\r\n idAttribute: 'factionId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n\r\n // --- Character / Lore ---\r\n {\r\n yamlFile: 'races.yaml',\r\n tableName: 'eve_races',\r\n idAttribute: 'raceId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'bloodlines.yaml',\r\n tableName: 'eve_bloodlines',\r\n idAttribute: 'bloodlineId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'ancestries.yaml',\r\n tableName: 'eve_ancestries',\r\n idAttribute: 'ancestryId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'characterAttributes.yaml',\r\n tableName: 'eve_character_attributes',\r\n idAttribute: 'attributeId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'characterTitles.yaml',\r\n tableName: 'eve_character_titles',\r\n idAttribute: 'characterTitleId',\r\n idType: 'string',\r\n injectId: false,\r\n },\r\n {\r\n yamlFile: 'cloneGrades.yaml',\r\n tableName: 'eve_clone_grades',\r\n idAttribute: 'cloneGradeId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n\r\n // --- SKINs ---\r\n {\r\n yamlFile: 'skins.yaml',\r\n tableName: 'eve_skins',\r\n idAttribute: 'skinId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'skinLicenses.yaml',\r\n tableName: 'eve_skin_licenses',\r\n idAttribute: 'licenseTypeId',\r\n idType: 'number',\r\n injectId: false,\r\n },\r\n {\r\n yamlFile: 'skinMaterials.yaml',\r\n tableName: 'eve_skin_materials',\r\n idAttribute: 'skinMaterialId',\r\n idType: 'number',\r\n injectId: false,\r\n },\r\n\r\n // --- SKINR ---\r\n {\r\n yamlFile: 'skinrComponents.yaml',\r\n tableName: 'eve_skinr_components',\r\n idAttribute: 'skinrComponentId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'skinrComponentCategories.yaml',\r\n tableName: 'eve_skinr_component_categories',\r\n idAttribute: 'skinrComponentCategoryId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'skinrComponentRarities.yaml',\r\n tableName: 'eve_skinr_component_rarities',\r\n idAttribute: 'skinrComponentRarityId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'skinrComponentPointValues.yaml',\r\n tableName: 'eve_skinr_component_point_values',\r\n idAttribute: 'skinrComponentCategoryId',\r\n idType: 'number',\r\n injectId: false,\r\n },\r\n {\r\n yamlFile: 'skinrSlots.yaml',\r\n tableName: 'eve_skinr_slots',\r\n idAttribute: 'skinrSlotId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'skinrSlotCategories.yaml',\r\n tableName: 'eve_skinr_slot_categories',\r\n idAttribute: 'skinrSlotCategoryId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'skinrSlotConfigurations.yaml',\r\n tableName: 'eve_skinr_slot_configurations',\r\n idAttribute: 'skinrSlotConfigurationId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'skinrSlotNames.yaml',\r\n tableName: 'eve_skinr_slot_names',\r\n idAttribute: 'skinrSlotNameId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'skinrTierThresholds.yaml',\r\n tableName: 'eve_skinr_tier_thresholds',\r\n idAttribute: 'shipTreeGroupId',\r\n idType: 'number',\r\n injectId: false,\r\n },\r\n\r\n // --- Ship Tree ---\r\n {\r\n yamlFile: 'shipTreeElements.yaml',\r\n tableName: 'eve_ship_tree_elements',\r\n idAttribute: 'shipTreeElementId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'shipTreeFactions.yaml',\r\n tableName: 'eve_ship_tree_factions',\r\n idAttribute: 'factionId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'shipTreeGroups.yaml',\r\n tableName: 'eve_ship_tree_groups',\r\n idAttribute: 'shipTreeGroupId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n\r\n // --- Graphics ---\r\n {\r\n yamlFile: 'graphics.yaml',\r\n tableName: 'eve_graphics',\r\n idAttribute: 'graphicId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'graphicMaterialSets.yaml',\r\n tableName: 'eve_graphic_material_sets',\r\n idAttribute: 'materialSetId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'icons.yaml',\r\n tableName: 'eve_icons',\r\n idAttribute: 'iconId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n\r\n // --- Stations ---\r\n {\r\n yamlFile: 'stationOperations.yaml',\r\n tableName: 'eve_station_operations',\r\n idAttribute: 'stationOperationId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'stationServices.yaml',\r\n tableName: 'eve_station_services',\r\n idAttribute: 'stationServiceId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n\r\n // --- Sovereignty ---\r\n {\r\n yamlFile: 'sovereigntyUpgrades.yaml',\r\n tableName: 'eve_sovereignty_upgrades',\r\n idAttribute: 'typeId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n\r\n // --- Certificates / Masteries ---\r\n {\r\n yamlFile: 'certificates.yaml',\r\n tableName: 'eve_certificates',\r\n idAttribute: 'certificateId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'masteries.yaml',\r\n tableName: 'eve_masteries',\r\n idAttribute: 'typeId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n\r\n // --- Misc ---\r\n {\r\n yamlFile: 'archetypes.yaml',\r\n tableName: 'eve_archetypes',\r\n idAttribute: 'archetypeId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'controlTowerResources.yaml',\r\n tableName: 'eve_control_tower_resources',\r\n idAttribute: 'typeId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'corporationActivities.yaml',\r\n tableName: 'eve_corporation_activities',\r\n idAttribute: 'corporationActivityId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'dbuffCollections.yaml',\r\n tableName: 'eve_dbuff_collections',\r\n idAttribute: 'dbuffCollectionId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'dungeons.yaml',\r\n tableName: 'eve_dungeons',\r\n idAttribute: 'dungeonId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'dynamicItemAttributes.yaml',\r\n tableName: 'eve_dynamic_item_attributes',\r\n idAttribute: 'dynamicItemAttributeId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'epicArcs.yaml',\r\n tableName: 'eve_epic_arcs',\r\n idAttribute: 'epicArcId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'freelanceJobSchemas.yaml',\r\n tableName: 'eve_freelance_job_schemas',\r\n idAttribute: 'freelanceJobSchemaGroupId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'landmarks.yaml',\r\n tableName: 'eve_landmarks',\r\n idAttribute: 'landmarkId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'mercenaryTacticalOperations.yaml',\r\n tableName: 'eve_mercenary_tactical_operations',\r\n idAttribute: 'mercenaryTacticalOperationId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'militaryCampaigns.yaml',\r\n tableName: 'eve_military_campaigns',\r\n idAttribute: 'militaryCampaignId',\r\n idType: 'string',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'militaryCampaignObjectives.yaml',\r\n tableName: 'eve_military_campaign_objectives',\r\n idAttribute: 'militaryCampaignObjectiveId',\r\n idType: 'string',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'missions.yaml',\r\n tableName: 'eve_missions',\r\n idAttribute: 'missionId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n\r\n // --- Translation ---\r\n {\r\n yamlFile: 'translationLanguages.yaml',\r\n tableName: 'eve_translation_languages',\r\n idAttribute: 'translationLanguageId',\r\n idType: 'string',\r\n injectId: true,\r\n },\r\n\r\n // --- Industry (extended) ---\r\n {\r\n yamlFile: 'industryActivities.yaml',\r\n tableName: 'eve_industry_activities',\r\n idAttribute: 'industryActivityId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'industryAssemblyLines.yaml',\r\n tableName: 'eve_industry_assembly_lines',\r\n idAttribute: 'assemblyLineId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'industryInstallationTypes.yaml',\r\n tableName: 'eve_industry_installation_types',\r\n idAttribute: 'installationTypeId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'industryModifierSources.yaml',\r\n tableName: 'eve_industry_modifier_sources',\r\n idAttribute: 'modifierSourceId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'industryTargetFilters.yaml',\r\n tableName: 'eve_industry_target_filters',\r\n idAttribute: 'targetFilterId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n\r\n // --- Fighters ---\r\n {\r\n yamlFile: 'fighterAbilities.yaml',\r\n tableName: 'eve_fighter_abilities',\r\n idAttribute: 'fighterAbilityId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'fighterAbilitiesByType.yaml',\r\n tableName: 'eve_fighter_abilities_by_type',\r\n idAttribute: 'typeId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n\r\n // --- Corporation ---\r\n {\r\n yamlFile: 'corporationRoles.yaml',\r\n tableName: 'eve_corporation_roles',\r\n idAttribute: 'corporationRoleId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'corporationRoleGroups.yaml',\r\n tableName: 'eve_corporation_role_groups',\r\n idAttribute: 'corporationRoleGroupId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n\r\n // --- Schools / Education ---\r\n {\r\n yamlFile: 'schools.yaml',\r\n tableName: 'eve_schools',\r\n idAttribute: 'schoolId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'schoolMap.yaml',\r\n tableName: 'eve_school_map',\r\n idAttribute: 'schoolMapId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'skillPlans.yaml',\r\n tableName: 'eve_skill_plans',\r\n idAttribute: 'skillPlanId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'expertSystems.yaml',\r\n tableName: 'eve_expert_systems',\r\n idAttribute: 'expertSystemId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n\r\n // --- Notifications ---\r\n {\r\n yamlFile: 'notificationTypes.yaml',\r\n tableName: 'eve_notification_types',\r\n idAttribute: 'notificationTypeId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'accountingEntryTypes.yaml',\r\n tableName: 'eve_accounting_entry_types',\r\n idAttribute: 'accountingEntryTypeId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n\r\n // --- Effects / Traps / Dbuffs ---\r\n {\r\n yamlFile: 'appliedProximityEffects.yaml',\r\n tableName: 'eve_applied_proximity_effects',\r\n idAttribute: 'appliedProximityEffectId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'proximityTrap.yaml',\r\n tableName: 'eve_proximity_traps',\r\n idAttribute: 'proximityTrapId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'systemDbuffEmitters.yaml',\r\n tableName: 'eve_system_dbuff_emitters',\r\n idAttribute: 'systemDbuffEmitterId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'systemWideEffects.yaml',\r\n tableName: 'eve_system_wide_effects',\r\n idAttribute: 'systemWideEffectId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n {\r\n yamlFile: 'linkWithShip.yaml',\r\n tableName: 'eve_link_with_ship',\r\n idAttribute: 'linkWithShipId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n\r\n // --- Station (extended) ---\r\n {\r\n yamlFile: 'stationStandingsRestrictions.yaml',\r\n tableName: 'eve_station_standings_restrictions',\r\n idAttribute: 'stationStandingsRestrictionId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n\r\n // --- SKINR (extended) ---\r\n {\r\n yamlFile: 'skinrSlotsToMaterials.yaml',\r\n tableName: 'eve_skinr_slots_to_materials',\r\n idAttribute: 'skinrSlotToMaterialId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n\r\n // --- Metenox ---\r\n {\r\n yamlFile: 'metenoxMoonDrill.yaml',\r\n tableName: 'eve_metenox_moon_drill',\r\n idAttribute: 'metenoxMoonDrillId',\r\n idType: 'number',\r\n injectId: true,\r\n },\r\n] as const;\r\n","import AdmZip from 'adm-zip';\r\nimport * as yaml from 'js-yaml';\r\nimport { SDE_METADATA_FILENAME } from './constants';\r\nimport { SdeError } from '../errors';\r\n\r\nexport interface SdeMetadata {\r\n buildNumber: string;\r\n releaseDate: string;\r\n}\r\n\r\nexport interface ParsedSdeFile {\r\n filename: string;\r\n records: Map<string | number, Record<string, unknown>>;\r\n}\r\n\r\nfunction findEntry(\r\n zip: AdmZip,\r\n filename: string,\r\n): AdmZip.IZipEntry | undefined {\r\n const basename = filename.replace(/^.*[\\\\/]/, '');\r\n return zip.getEntries().find((entry) => {\r\n if (entry.isDirectory) return false;\r\n const entryBasename = entry.entryName.replace(/^.*[\\\\/]/, '');\r\n return (\r\n entryBasename === basename ||\r\n entry.entryName === filename ||\r\n entry.entryName === `sde/${filename}`\r\n );\r\n });\r\n}\r\n\r\nfunction readEntryAsString(entry: AdmZip.IZipEntry): string {\r\n const buffer = entry.getData();\r\n return buffer.toString('utf-8');\r\n}\r\n\r\nexport class SdeExtractor {\r\n readMetadata(zipPath: string): SdeMetadata {\r\n const zip = new AdmZip(zipPath);\r\n const entry = findEntry(zip, SDE_METADATA_FILENAME);\r\n\r\n if (!entry) {\r\n throw new SdeError(\r\n `Metadata file '${SDE_METADATA_FILENAME}' not found in archive: ${zipPath}`,\r\n );\r\n }\r\n\r\n const content = readEntryAsString(entry);\r\n const parsed = yaml.load(content) as Record<string, unknown>;\r\n\r\n const bn = parsed.buildNumber;\r\n const rd = parsed.releaseDate;\r\n return {\r\n buildNumber:\r\n typeof bn === 'string' || typeof bn === 'number' ? String(bn) : '',\r\n releaseDate:\r\n typeof rd === 'string' || typeof rd === 'number' ? String(rd) : '',\r\n };\r\n }\r\n\r\n parseFile(zipPath: string, filename: string): ParsedSdeFile {\r\n const zip = new AdmZip(zipPath);\r\n return this.parseFileFromZip(zip, filename);\r\n }\r\n\r\n parseFiles(zipPath: string, filenames: string[]): ParsedSdeFile[] {\r\n const zip = new AdmZip(zipPath);\r\n const results: ParsedSdeFile[] = [];\r\n\r\n for (const filename of filenames) {\r\n const entry = findEntry(zip, filename);\r\n if (!entry) {\r\n // File not present in this SDE build — skip silently\r\n continue;\r\n }\r\n results.push(this.parseEntryAsFile(entry, filename));\r\n }\r\n\r\n return results;\r\n }\r\n\r\n extractAll(zipPath: string, outputDir: string): void {\r\n const zip = new AdmZip(zipPath);\r\n zip.extractAllTo(outputDir, true);\r\n }\r\n\r\n listFiles(zipPath: string): string[] {\r\n const zip = new AdmZip(zipPath);\r\n return zip\r\n .getEntries()\r\n .filter(\r\n (entry) => !entry.isDirectory && entry.entryName.endsWith('.yaml'),\r\n )\r\n .map((entry) => entry.entryName);\r\n }\r\n\r\n private parseFileFromZip(zip: AdmZip, filename: string): ParsedSdeFile {\r\n const entry = findEntry(zip, filename);\r\n\r\n if (!entry) {\r\n throw new SdeError(`File '${filename}' not found in archive`);\r\n }\r\n\r\n return this.parseEntryAsFile(entry, filename);\r\n }\r\n\r\n private parseEntryAsFile(\r\n entry: AdmZip.IZipEntry,\r\n filename: string,\r\n ): ParsedSdeFile {\r\n const content = readEntryAsString(entry);\r\n const parsed = yaml.load(content) as Record<\r\n string | number,\r\n Record<string, unknown>\r\n >;\r\n const records = new Map<string | number, Record<string, unknown>>(\r\n Object.entries(parsed).map(([key, value]) => {\r\n const numKey = Number(key);\r\n return [Number.isNaN(numKey) ? key : numKey, value];\r\n }),\r\n );\r\n\r\n return { filename, records };\r\n }\r\n}\r\n","export class SdeError extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = 'SdeError';\r\n }\r\n}\r\n\r\nexport class SdeDatabaseError extends SdeError {\r\n public override readonly cause: unknown;\r\n\r\n constructor(message: string, cause?: unknown) {\r\n super(message);\r\n this.name = 'SdeDatabaseError';\r\n this.cause = cause;\r\n }\r\n}\r\n\r\nexport class SdeValidationError extends SdeError {\r\n public readonly validationError: unknown;\r\n public readonly entityType: string;\r\n public readonly entityId?: number;\r\n\r\n constructor(entityType: string, validationError: unknown, entityId?: number) {\r\n const idSuffix = entityId !== undefined ? ` (id: ${entityId})` : '';\r\n super(`SDE validation failed for ${entityType}${idSuffix}`);\r\n this.name = 'SdeValidationError';\r\n this.validationError = validationError;\r\n this.entityType = entityType;\r\n this.entityId = entityId;\r\n }\r\n}\r\n\r\nexport class SdeVersionMismatchError extends SdeError {\r\n public readonly expected: string;\r\n public readonly actual: string;\r\n\r\n constructor(expected: string, actual: string) {\r\n super(`SDE version mismatch: expected ${expected}, got ${actual}`);\r\n this.name = 'SdeVersionMismatchError';\r\n this.expected = expected;\r\n this.actual = actual;\r\n }\r\n}\r\n\r\nexport function isSdeError(error: unknown): error is SdeError {\r\n return error instanceof SdeError;\r\n}\r\n\r\nexport function isSdeDatabaseError(error: unknown): error is SdeDatabaseError {\r\n return error instanceof SdeDatabaseError;\r\n}\r\n\r\nexport function isSdeValidationError(\r\n error: unknown,\r\n): error is SdeValidationError {\r\n return error instanceof SdeValidationError;\r\n}\r\n\r\nexport function isSdeVersionMismatch(\r\n error: unknown,\r\n): error is SdeVersionMismatchError {\r\n return error instanceof SdeVersionMismatchError;\r\n}\r\n","export type SqliteValue = string | number | null;\r\n\r\nexport function extractLocale(\r\n field: unknown,\r\n locale: string = 'en',\r\n fallback: string = '',\r\n): string {\r\n if (field == null) return fallback;\r\n if (typeof field === 'string') return field;\r\n if (typeof field === 'object' && !Array.isArray(field)) {\r\n const map = field as Record<string, unknown>;\r\n // eslint-disable-next-line security/detect-object-injection\r\n const value = map[locale];\r\n if (typeof value === 'string') return value;\r\n return fallback;\r\n }\r\n return fallback;\r\n}\r\n\r\nexport function normalizeSdeFieldName(name: string): string {\r\n return name.replace(/ID(?=[A-Z]|$)/g, 'Id');\r\n}\r\n\r\n// eslint-disable-next-line sonarjs/function-return-type -- union return is intentional\r\nexport function toSqliteValue(value: unknown): SqliteValue {\r\n if (value == null) return null;\r\n if (typeof value === 'boolean') return value ? 1 : 0;\r\n if (typeof value === 'number') return value;\r\n if (typeof value === 'string') return value;\r\n if (typeof value === 'object') return JSON.stringify(value);\r\n return null;\r\n}\r\n\r\nfunction isLocaleMap(value: unknown): value is Record<string, string> {\r\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\r\n return false;\r\n }\r\n return 'en' in (value as Record<string, unknown>);\r\n}\r\n\r\nexport function transformRecord(\r\n entityId: number | string,\r\n raw: Record<string, unknown>,\r\n spec: { idAttribute: string; injectId: boolean },\r\n): Record<string, SqliteValue> {\r\n const row: Record<string, SqliteValue> = {};\r\n\r\n if (spec.injectId) {\r\n row[spec.idAttribute] =\r\n typeof entityId === 'string' ? entityId : Number(entityId);\r\n }\r\n\r\n for (const [key, value] of Object.entries(raw)) {\r\n const normalizedKey = normalizeSdeFieldName(key);\r\n\r\n if (isLocaleMap(value)) {\r\n row[normalizedKey] = extractLocale(value);\r\n } else {\r\n row[normalizedKey] = toSqliteValue(value);\r\n }\r\n }\r\n\r\n return row;\r\n}\r\n\r\nfunction normalizeNested(value: unknown): unknown {\r\n if (value == null || typeof value !== 'object') return value;\r\n if (Array.isArray(value)) return value.map(normalizeNested);\r\n const obj = value as Record<string, unknown>;\r\n if (isLocaleMap(obj)) return extractLocale(obj);\r\n const out: Record<string, unknown> = {};\r\n for (const [k, v] of Object.entries(obj)) {\r\n out[normalizeSdeFieldName(k)] = normalizeNested(v);\r\n }\r\n return out;\r\n}\r\n\r\nexport function transformRecordNative(\r\n entityId: number | string,\r\n raw: Record<string, unknown>,\r\n spec: { idAttribute: string; injectId: boolean },\r\n): Record<string, unknown> {\r\n const row: Record<string, unknown> = {};\r\n\r\n if (spec.injectId) {\r\n row[spec.idAttribute] =\r\n typeof entityId === 'string' ? entityId : Number(entityId);\r\n }\r\n\r\n for (const [key, value] of Object.entries(raw)) {\r\n const normalizedKey = normalizeSdeFieldName(key);\r\n\r\n if (isLocaleMap(value)) {\r\n row[normalizedKey] = extractLocale(value);\r\n } else {\r\n row[normalizedKey] = normalizeNested(value);\r\n }\r\n }\r\n\r\n return row;\r\n}\r\n","import type { IStaticDataProvider } from './IStaticDataProvider';\r\nimport type {\r\n EveType,\r\n EveGroup,\r\n EveCategory,\r\n Region,\r\n Constellation,\r\n SolarSystem,\r\n Stargate,\r\n Star,\r\n Planet,\r\n Moon,\r\n AsteroidBelt,\r\n Faction,\r\n Race,\r\n Bloodline,\r\n Ancestry,\r\n NpcCorporation,\r\n NpcStation,\r\n MarketGroup,\r\n MetaGroup,\r\n Icon,\r\n Graphic,\r\n DogmaAttribute,\r\n DogmaEffect,\r\n Blueprint,\r\n PlanetSchematic,\r\n AgentType,\r\n AgentInSpace,\r\n Certificate,\r\n CharacterAttribute,\r\n CloneGrade,\r\n CorporationActivity,\r\n DogmaAttributeCategory,\r\n DogmaUnit,\r\n IndustryActivity,\r\n Landmark,\r\n NotificationType,\r\n NpcCharacter,\r\n NpcCorporationDivision,\r\n School,\r\n SecondarySun,\r\n Skin,\r\n SkinLicense,\r\n StationOperation,\r\n StationService,\r\n TypeDogma,\r\n TypeMaterial,\r\n TypeBonus,\r\n Mission,\r\n Dungeon,\r\n EpicArc,\r\n} from './types';\r\nimport type { SdeVersionInfo } from './version';\r\n\r\nexport interface MemorySdeData {\r\n types?: EveType[];\r\n groups?: EveGroup[];\r\n categories?: EveCategory[];\r\n regions?: Region[];\r\n constellations?: Constellation[];\r\n solarSystems?: SolarSystem[];\r\n stargates?: Stargate[];\r\n stars?: Star[];\r\n planets?: Planet[];\r\n moons?: Moon[];\r\n asteroidBelts?: AsteroidBelt[];\r\n factions?: Faction[];\r\n races?: Race[];\r\n bloodlines?: Bloodline[];\r\n ancestries?: Ancestry[];\r\n npcCorporations?: NpcCorporation[];\r\n npcStations?: NpcStation[];\r\n marketGroups?: MarketGroup[];\r\n metaGroups?: MetaGroup[];\r\n icons?: Icon[];\r\n graphics?: Graphic[];\r\n dogmaAttributes?: DogmaAttribute[];\r\n dogmaEffects?: DogmaEffect[];\r\n blueprints?: Blueprint[];\r\n planetSchematics?: PlanetSchematic[];\r\n agentTypes?: AgentType[];\r\n agentsInSpace?: AgentInSpace[];\r\n certificates?: Certificate[];\r\n characterAttributes?: CharacterAttribute[];\r\n cloneGrades?: CloneGrade[];\r\n corporationActivities?: CorporationActivity[];\r\n dogmaAttributeCategories?: DogmaAttributeCategory[];\r\n dogmaUnits?: DogmaUnit[];\r\n industryActivities?: IndustryActivity[];\r\n landmarks?: Landmark[];\r\n notificationTypes?: NotificationType[];\r\n npcCharacters?: NpcCharacter[];\r\n npcCorporationDivisions?: NpcCorporationDivision[];\r\n schools?: School[];\r\n secondarySuns?: SecondarySun[];\r\n skins?: Skin[];\r\n skinLicenses?: SkinLicense[];\r\n stationOperations?: StationOperation[];\r\n stationServices?: StationService[];\r\n typeDogma?: TypeDogma[];\r\n typeMaterials?: TypeMaterial[];\r\n typeBonuses?: TypeBonus[];\r\n missions?: Mission[];\r\n dungeons?: Dungeon[];\r\n epicArcs?: EpicArc[];\r\n version?: Partial<SdeVersionInfo>;\r\n}\r\n\r\nexport class MemorySdeProvider implements IStaticDataProvider {\r\n private data: Map<string, Map<number | string, unknown>> = new Map();\r\n private versionInfo: SdeVersionInfo;\r\n\r\n constructor(data: MemorySdeData = {}) {\r\n const register = <T>(\r\n key: string,\r\n items: T[] | undefined,\r\n idFn: (item: T) => number | string,\r\n ): void => {\r\n this.data.set(\r\n key,\r\n new Map((items ?? []).map((item) => [idFn(item), item])),\r\n );\r\n };\r\n\r\n register('eve_types', data.types, (t) => t.typeId);\r\n register('eve_groups', data.groups, (g) => g.groupId);\r\n register('eve_categories', data.categories, (c) => c.categoryId);\r\n register('eve_regions', data.regions, (r) => r.regionId);\r\n register(\r\n 'eve_constellations',\r\n data.constellations,\r\n (c) => c.constellationId,\r\n );\r\n register('eve_solar_systems', data.solarSystems, (s) => s.systemId);\r\n register('eve_stargates', data.stargates, (s) => s.stargateId);\r\n register('eve_stars', data.stars, (s) => s.starId);\r\n register('eve_planets', data.planets, (p) => p.planetId);\r\n register('eve_moons', data.moons, (m) => m.moonId);\r\n register('eve_asteroid_belts', data.asteroidBelts, (a) => a.asteroidBeltId);\r\n register('eve_factions', data.factions, (f) => f.factionId);\r\n register('eve_races', data.races, (r) => r.raceId);\r\n register('eve_bloodlines', data.bloodlines, (b) => b.bloodlineId);\r\n register('eve_ancestries', data.ancestries, (a) => a.ancestryId);\r\n register(\r\n 'eve_npc_corporations',\r\n data.npcCorporations,\r\n (c) => c.corporationId,\r\n );\r\n register('eve_npc_stations', data.npcStations, (s) => s.stationId);\r\n register('eve_market_groups', data.marketGroups, (g) => g.marketGroupId);\r\n register('eve_meta_groups', data.metaGroups, (g) => g.metaGroupId);\r\n register('eve_icons', data.icons, (i) => i.iconId);\r\n register('eve_graphics', data.graphics, (g) => g.graphicId);\r\n register(\r\n 'eve_dogma_attributes',\r\n data.dogmaAttributes,\r\n (a) => a.attributeId,\r\n );\r\n register('eve_dogma_effects', data.dogmaEffects, (e) => e.effectId);\r\n register('eve_blueprints', data.blueprints, (b) => b.blueprintTypeId);\r\n register(\r\n 'eve_planet_schematics',\r\n data.planetSchematics,\r\n (s) => s.planetSchematicId,\r\n );\r\n register('eve_agent_types', data.agentTypes, (a) => a.agentTypeId);\r\n register('eve_agents_in_space', data.agentsInSpace, (a) => a.characterId);\r\n register('eve_certificates', data.certificates, (c) => c.certificateId);\r\n register(\r\n 'eve_character_attributes',\r\n data.characterAttributes,\r\n (c) => c.attributeId,\r\n );\r\n register('eve_clone_grades', data.cloneGrades, (c) => c.cloneGradeId);\r\n register(\r\n 'eve_corporation_activities',\r\n data.corporationActivities,\r\n (c) => c.corporationActivityId,\r\n );\r\n register(\r\n 'eve_dogma_attribute_categories',\r\n data.dogmaAttributeCategories,\r\n (d) => d.attributeCategoryId,\r\n );\r\n register('eve_dogma_units', data.dogmaUnits, (d) => d.unitId);\r\n register(\r\n 'eve_industry_activities',\r\n data.industryActivities,\r\n (i) => i.industryActivityId,\r\n );\r\n register('eve_landmarks', data.landmarks, (l) => l.landmarkId);\r\n register(\r\n 'eve_notification_types',\r\n data.notificationTypes,\r\n (n) => n.notificationTypeId,\r\n );\r\n register('eve_npc_characters', data.npcCharacters, (n) => n.characterId);\r\n register(\r\n 'eve_npc_corporation_divisions',\r\n data.npcCorporationDivisions,\r\n (n) => n.npcCorporationDivisionId,\r\n );\r\n register('eve_schools', data.schools, (s) => s.schoolId);\r\n register('eve_secondary_suns', data.secondarySuns, (s) => s.secondarySunId);\r\n register('eve_skins', data.skins, (s) => s.skinId);\r\n register('eve_skin_licenses', data.skinLicenses, (s) => s.licenseTypeId);\r\n register(\r\n 'eve_station_operations',\r\n data.stationOperations,\r\n (s) => s.stationOperationId,\r\n );\r\n register(\r\n 'eve_station_services',\r\n data.stationServices,\r\n (s) => s.stationServiceId,\r\n );\r\n register('eve_type_dogma', data.typeDogma, (t) => t.typeId);\r\n register('eve_type_materials', data.typeMaterials, (t) => t.typeId);\r\n register('eve_type_bonuses', data.typeBonuses, (t) => t.typeId);\r\n register('eve_missions', data.missions, (m) => m.missionId);\r\n register('eve_dungeons', data.dungeons, (d) => d.dungeonId);\r\n register('eve_epic_arcs', data.epicArcs, (e) => e.epicArcId);\r\n\r\n this.versionInfo = {\r\n version: data.version?.version ?? '1.0.0-test',\r\n buildDate: data.version?.buildDate ?? '2024-01-01T00:00:00Z',\r\n importedAt: data.version?.importedAt ?? '2024-01-01T00:00:00Z',\r\n checksum: data.version?.checksum,\r\n };\r\n }\r\n\r\n private getById<T>(table: string, id: number | string): T | null {\r\n return (this.data.get(table)?.get(id) as T) ?? null;\r\n }\r\n\r\n private getAllFrom<T>(table: string): T[] {\r\n const map = this.data.get(table);\r\n return map ? (Array.from(map.values()) as T[]) : [];\r\n }\r\n\r\n private filterBy<T>(table: string, field: string, value: unknown): T[] {\r\n return this.getAllFrom<T>(table).filter(\r\n (item) => (item as Record<string, unknown>)[field] === value,\r\n );\r\n }\r\n\r\n private searchBy<T>(\r\n table: string,\r\n field: string,\r\n query: string,\r\n limit = 25,\r\n ): T[] {\r\n const lowerQuery = query.toLowerCase();\r\n const results: T[] = [];\r\n for (const item of this.getAllFrom<T>(table)) {\r\n const val = (item as Record<string, unknown>)[field];\r\n if (typeof val === 'string' && val.toLowerCase().includes(lowerQuery)) {\r\n results.push(item);\r\n if (results.length >= limit) break;\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n // --- Types, Groups, Categories ---\r\n getType(typeId: number): EveType | null {\r\n return this.getById('eve_types', typeId);\r\n }\r\n getTypesByGroup(groupId: number): EveType[] {\r\n return this.filterBy('eve_types', 'groupId', groupId);\r\n }\r\n getGroup(groupId: number): EveGroup | null {\r\n return this.getById('eve_groups', groupId);\r\n }\r\n getGroupsByCategory(categoryId: number): EveGroup[] {\r\n return this.filterBy('eve_groups', 'categoryId', categoryId);\r\n }\r\n getCategory(categoryId: number): EveCategory | null {\r\n return this.getById('eve_categories', categoryId);\r\n }\r\n getAllCategories(): EveCategory[] {\r\n return this.getAllFrom('eve_categories');\r\n }\r\n\r\n // --- Regions, Constellations, Solar Systems, Stargates ---\r\n getRegion(regionId: number): Region | null {\r\n return this.getById('eve_regions', regionId);\r\n }\r\n getAllRegions(): Region[] {\r\n return this.getAllFrom('eve_regions');\r\n }\r\n getConstellation(constellationId: number): Constellation | null {\r\n return this.getById('eve_constellations', constellationId);\r\n }\r\n getConstellationsByRegion(regionId: number): Constellation[] {\r\n return this.filterBy('eve_constellations', 'regionId', regionId);\r\n }\r\n getSolarSystem(systemId: number): SolarSystem | null {\r\n return this.getById('eve_solar_systems', systemId);\r\n }\r\n getSolarSystemsByConstellation(constellationId: number): SolarSystem[] {\r\n return this.filterBy(\r\n 'eve_solar_systems',\r\n 'constellationId',\r\n constellationId,\r\n );\r\n }\r\n getStargate(stargateId: number): Stargate | null {\r\n return this.getById('eve_stargates', stargateId);\r\n }\r\n getStargatesBySystem(systemId: number): Stargate[] {\r\n return this.filterBy('eve_stargates', 'solarSystemId', systemId);\r\n }\r\n\r\n // --- Search ---\r\n searchTypesByName(query: string, limit = 25): EveType[] {\r\n return this.searchBy('eve_types', 'name', query, limit);\r\n }\r\n searchSolarSystemsByName(query: string, limit = 25): SolarSystem[] {\r\n return this.searchBy('eve_solar_systems', 'name', query, limit);\r\n }\r\n\r\n // --- Universe ---\r\n getStar(starId: number): Star | null {\r\n return this.getById('eve_stars', starId);\r\n }\r\n getStarBySystem(systemId: number): Star | null {\r\n return (\r\n this.filterBy<Star>('eve_stars', 'solarSystemId', systemId)[0] ?? null\r\n );\r\n }\r\n getPlanet(planetId: number): Planet | null {\r\n return this.getById('eve_planets', planetId);\r\n }\r\n getPlanetsBySystem(systemId: number): Planet[] {\r\n return this.filterBy('eve_planets', 'solarSystemId', systemId);\r\n }\r\n getMoon(moonId: number): Moon | null {\r\n return this.getById('eve_moons', moonId);\r\n }\r\n getMoonsBySystem(systemId: number): Moon[] {\r\n return this.filterBy('eve_moons', 'solarSystemId', systemId);\r\n }\r\n getAsteroidBelt(asteroidBeltId: number): AsteroidBelt | null {\r\n return this.getById('eve_asteroid_belts', asteroidBeltId);\r\n }\r\n getAsteroidBeltsBySystem(systemId: number): AsteroidBelt[] {\r\n return this.filterBy('eve_asteroid_belts', 'solarSystemId', systemId);\r\n }\r\n\r\n // --- Character/Lore ---\r\n getFaction(factionId: number): Faction | null {\r\n return this.getById('eve_factions', factionId);\r\n }\r\n getAllFactions(): Faction[] {\r\n return this.getAllFrom('eve_factions');\r\n }\r\n getRace(raceId: number): Race | null {\r\n return this.getById('eve_races', raceId);\r\n }\r\n getAllRaces(): Race[] {\r\n return this.getAllFrom('eve_races');\r\n }\r\n getBloodline(bloodlineId: number): Bloodline | null {\r\n return this.getById('eve_bloodlines', bloodlineId);\r\n }\r\n getBloodlinesByRace(raceId: number): Bloodline[] {\r\n return this.filterBy('eve_bloodlines', 'raceId', raceId);\r\n }\r\n getAncestry(ancestryId: number): Ancestry | null {\r\n return this.getById('eve_ancestries', ancestryId);\r\n }\r\n getAncestriesByBloodline(bloodlineId: number): Ancestry[] {\r\n return this.filterBy('eve_ancestries', 'bloodlineId', bloodlineId);\r\n }\r\n\r\n // --- NPC Infrastructure ---\r\n getNpcCorporation(corporationId: number): NpcCorporation | null {\r\n return this.getById('eve_npc_corporations', corporationId);\r\n }\r\n getNpcCorporationsByFaction(factionId: number): NpcCorporation[] {\r\n return this.filterBy('eve_npc_corporations', 'factionId', factionId);\r\n }\r\n getNpcStation(stationId: number): NpcStation | null {\r\n return this.getById('eve_npc_stations', stationId);\r\n }\r\n getNpcStationsBySystem(systemId: number): NpcStation[] {\r\n return this.filterBy('eve_npc_stations', 'solarSystemId', systemId);\r\n }\r\n getNpcStationsByOwner(ownerId: number): NpcStation[] {\r\n return this.filterBy('eve_npc_stations', 'ownerId', ownerId);\r\n }\r\n\r\n // --- Market ---\r\n getMarketGroup(marketGroupId: number): MarketGroup | null {\r\n return this.getById('eve_market_groups', marketGroupId);\r\n }\r\n getMarketGroupsByParent(parentGroupId: number): MarketGroup[] {\r\n return this.filterBy('eve_market_groups', 'parentGroupId', parentGroupId);\r\n }\r\n getRootMarketGroups(): MarketGroup[] {\r\n return this.getAllFrom<MarketGroup>('eve_market_groups').filter(\r\n (g) => g.parentGroupId === null,\r\n );\r\n }\r\n getTypesByMarketGroup(marketGroupId: number): EveType[] {\r\n return this.filterBy('eve_types', 'marketGroupId', marketGroupId);\r\n }\r\n searchMarketGroupsByName(query: string, limit = 25): MarketGroup[] {\r\n return this.searchBy('eve_market_groups', 'name', query, limit);\r\n }\r\n\r\n // --- Meta/UI ---\r\n getMetaGroup(metaGroupId: number): MetaGroup | null {\r\n return this.getById('eve_meta_groups', metaGroupId);\r\n }\r\n getAllMetaGroups(): MetaGroup[] {\r\n return this.getAllFrom('eve_meta_groups');\r\n }\r\n getIcon(iconId: number): Icon | null {\r\n return this.getById('eve_icons', iconId);\r\n }\r\n getGraphic(graphicId: number): Graphic | null {\r\n return this.getById('eve_graphics', graphicId);\r\n }\r\n\r\n // --- Dogma ---\r\n getDogmaAttribute(attributeId: number): DogmaAttribute | null {\r\n return this.getById('eve_dogma_attributes', attributeId);\r\n }\r\n searchDogmaAttributesByName(query: string, limit = 25): DogmaAttribute[] {\r\n return this.searchBy('eve_dogma_attributes', 'name', query, limit);\r\n }\r\n getDogmaEffect(effectId: number): DogmaEffect | null {\r\n return this.getById('eve_dogma_effects', effectId);\r\n }\r\n searchDogmaEffectsByName(query: string, limit = 25): DogmaEffect[] {\r\n return this.searchBy('eve_dogma_effects', 'name', query, limit);\r\n }\r\n getDogmaAttributeCategory(\r\n attributeCategoryId: number,\r\n ): DogmaAttributeCategory | null {\r\n return this.getById('eve_dogma_attribute_categories', attributeCategoryId);\r\n }\r\n getAllDogmaAttributeCategories(): DogmaAttributeCategory[] {\r\n return this.getAllFrom('eve_dogma_attribute_categories');\r\n }\r\n getDogmaUnit(unitId: number): DogmaUnit | null {\r\n return this.getById('eve_dogma_units', unitId);\r\n }\r\n getAllDogmaUnits(): DogmaUnit[] {\r\n return this.getAllFrom('eve_dogma_units');\r\n }\r\n\r\n // --- Industry ---\r\n getBlueprint(blueprintTypeId: number): Blueprint | null {\r\n return this.getById('eve_blueprints', blueprintTypeId);\r\n }\r\n getPlanetSchematic(planetSchematicId: number): PlanetSchematic | null {\r\n return this.getById('eve_planet_schematics', planetSchematicId);\r\n }\r\n getAllPlanetSchematics(): PlanetSchematic[] {\r\n return this.getAllFrom('eve_planet_schematics');\r\n }\r\n getIndustryActivity(industryActivityId: number): IndustryActivity | null {\r\n return this.getById('eve_industry_activities', industryActivityId);\r\n }\r\n getAllIndustryActivities(): IndustryActivity[] {\r\n return this.getAllFrom('eve_industry_activities');\r\n }\r\n\r\n // --- Agent System ---\r\n getAgentType(agentTypeId: number): AgentType | null {\r\n return this.getById('eve_agent_types', agentTypeId);\r\n }\r\n getAllAgentTypes(): AgentType[] {\r\n return this.getAllFrom('eve_agent_types');\r\n }\r\n getAgentInSpace(characterId: number): AgentInSpace | null {\r\n return this.getById('eve_agents_in_space', characterId);\r\n }\r\n getAgentsInSpaceBySystem(systemId: number): AgentInSpace[] {\r\n return this.filterBy('eve_agents_in_space', 'solarSystemId', systemId);\r\n }\r\n\r\n // --- Certificates ---\r\n getCertificate(certificateId: number): Certificate | null {\r\n return this.getById('eve_certificates', certificateId);\r\n }\r\n getAllCertificates(): Certificate[] {\r\n return this.getAllFrom('eve_certificates');\r\n }\r\n\r\n // --- Character Attributes ---\r\n getCharacterAttribute(attributeId: number): CharacterAttribute | null {\r\n return this.getById('eve_character_attributes', attributeId);\r\n }\r\n getAllCharacterAttributes(): CharacterAttribute[] {\r\n return this.getAllFrom('eve_character_attributes');\r\n }\r\n\r\n // --- NPC Characters ---\r\n getNpcCharacter(characterId: number): NpcCharacter | null {\r\n return this.getById('eve_npc_characters', characterId);\r\n }\r\n getNpcCharactersByCorporation(corporationId: number): NpcCharacter[] {\r\n return this.filterBy('eve_npc_characters', 'corporationId', corporationId);\r\n }\r\n searchNpcCharactersByName(query: string, limit = 25): NpcCharacter[] {\r\n return this.searchBy('eve_npc_characters', 'name', query, limit);\r\n }\r\n\r\n // --- Clone Grades ---\r\n getCloneGrade(cloneGradeId: number): CloneGrade | null {\r\n return this.getById('eve_clone_grades', cloneGradeId);\r\n }\r\n getAllCloneGrades(): CloneGrade[] {\r\n return this.getAllFrom('eve_clone_grades');\r\n }\r\n\r\n // --- Corporation Reference ---\r\n getCorporationActivity(\r\n corporationActivityId: number,\r\n ): CorporationActivity | null {\r\n return this.getById('eve_corporation_activities', corporationActivityId);\r\n }\r\n getAllCorporationActivities(): CorporationActivity[] {\r\n return this.getAllFrom('eve_corporation_activities');\r\n }\r\n getNpcCorporationDivision(\r\n npcCorporationDivisionId: number,\r\n ): NpcCorporationDivision | null {\r\n return this.getById(\r\n 'eve_npc_corporation_divisions',\r\n npcCorporationDivisionId,\r\n );\r\n }\r\n getAllNpcCorporationDivisions(): NpcCorporationDivision[] {\r\n return this.getAllFrom('eve_npc_corporation_divisions');\r\n }\r\n\r\n // --- Landmarks ---\r\n getLandmark(landmarkId: number): Landmark | null {\r\n return this.getById('eve_landmarks', landmarkId);\r\n }\r\n getAllLandmarks(): Landmark[] {\r\n return this.getAllFrom('eve_landmarks');\r\n }\r\n\r\n // --- Notifications ---\r\n getNotificationType(notificationTypeId: number): NotificationType | null {\r\n return this.getById('eve_notification_types', notificationTypeId);\r\n }\r\n\r\n // --- Schools ---\r\n getSchool(schoolId: number): School | null {\r\n return this.getById('eve_schools', schoolId);\r\n }\r\n getAllSchools(): School[] {\r\n return this.getAllFrom('eve_schools');\r\n }\r\n\r\n // --- Secondary Suns ---\r\n getSecondarySun(secondarySunId: number): SecondarySun | null {\r\n return this.getById('eve_secondary_suns', secondarySunId);\r\n }\r\n getSecondarySunsBySystem(systemId: number): SecondarySun[] {\r\n return this.filterBy('eve_secondary_suns', 'solarSystemId', systemId);\r\n }\r\n\r\n // --- Skins ---\r\n getSkin(skinId: number): Skin | null {\r\n return this.getById('eve_skins', skinId);\r\n }\r\n getSkinLicense(licenseTypeId: number): SkinLicense | null {\r\n return this.getById('eve_skin_licenses', licenseTypeId);\r\n }\r\n getSkinLicensesBySkin(skinId: number): SkinLicense[] {\r\n return this.filterBy('eve_skin_licenses', 'skinId', skinId);\r\n }\r\n\r\n // --- Station Operations & Services ---\r\n getStationOperation(stationOperationId: number): StationOperation | null {\r\n return this.getById('eve_station_operations', stationOperationId);\r\n }\r\n getAllStationOperations(): StationOperation[] {\r\n return this.getAllFrom('eve_station_operations');\r\n }\r\n getStationService(stationServiceId: number): StationService | null {\r\n return this.getById('eve_station_services', stationServiceId);\r\n }\r\n getAllStationServices(): StationService[] {\r\n return this.getAllFrom('eve_station_services');\r\n }\r\n\r\n // --- Type Extensions ---\r\n getTypeDogma(typeId: number): TypeDogma | null {\r\n return this.getById('eve_type_dogma', typeId);\r\n }\r\n getTypeMaterial(typeId: number): TypeMaterial | null {\r\n return this.getById('eve_type_materials', typeId);\r\n }\r\n getTypeBonus(typeId: number): TypeBonus | null {\r\n return this.getById('eve_type_bonuses', typeId);\r\n }\r\n\r\n // --- Missions & Content ---\r\n getMission(missionId: number): Mission | null {\r\n return this.getById('eve_missions', missionId);\r\n }\r\n getDungeon(dungeonId: number): Dungeon | null {\r\n return this.getById('eve_dungeons', dungeonId);\r\n }\r\n getEpicArc(epicArcId: number): EpicArc | null {\r\n return this.getById('eve_epic_arcs', epicArcId);\r\n }\r\n getAllEpicArcs(): EpicArc[] {\r\n return this.getAllFrom('eve_epic_arcs');\r\n }\r\n\r\n // --- Generic accessor ---\r\n getEntity<T = Record<string, unknown>>(\r\n tableName: string,\r\n id: number | string,\r\n ): T | null {\r\n return this.getById<T>(tableName, id);\r\n }\r\n\r\n getAllEntities<T = Record<string, unknown>>(tableName: string): T[] {\r\n return this.getAllFrom<T>(tableName);\r\n }\r\n\r\n // --- Version & Lifecycle ---\r\n getVersion(): SdeVersionInfo {\r\n return { ...this.versionInfo };\r\n }\r\n\r\n close(): void {\r\n this.data.clear();\r\n }\r\n}\r\n","import type {\r\n EveType,\r\n EveGroup,\r\n EveCategory,\r\n Region,\r\n Constellation,\r\n SolarSystem,\r\n Stargate,\r\n Star,\r\n Planet,\r\n Moon,\r\n AsteroidBelt,\r\n Faction,\r\n Race,\r\n Bloodline,\r\n Ancestry,\r\n NpcCorporation,\r\n NpcStation,\r\n MarketGroup,\r\n MetaGroup,\r\n Icon,\r\n Graphic,\r\n DogmaAttribute,\r\n DogmaEffect,\r\n Blueprint,\r\n PlanetSchematic,\r\n} from './types';\r\nimport type { SdeVersionInfo } from './version';\r\nimport type { MemorySdeData } from './MemorySdeProvider';\r\n\r\nexport class SdeTestDataFactory {\r\n static createEveType(overrides: Partial<EveType> = {}): EveType {\r\n return {\r\n typeId: 34,\r\n groupId: 18,\r\n mass: 1,\r\n name: 'Tritanium',\r\n portionSize: 1,\r\n published: true,\r\n packagedVolume: null,\r\n volume: 0.01,\r\n radius: null,\r\n description: 'The most common mineral in the known universe.',\r\n graphicId: 20,\r\n soundId: null,\r\n iconId: null,\r\n raceId: null,\r\n basePrice: 4,\r\n marketGroupId: 1857,\r\n capacity: null,\r\n isRepackable: null,\r\n ...overrides,\r\n };\r\n }\r\n\r\n static createEveGroup(overrides: Partial<EveGroup> = {}): EveGroup {\r\n return {\r\n groupId: 18,\r\n anchorable: false,\r\n anchored: false,\r\n categoryId: 4,\r\n fittableNonSingleton: false,\r\n name: 'Mineral',\r\n published: true,\r\n useBasePrice: true,\r\n iconId: null,\r\n ...overrides,\r\n };\r\n }\r\n\r\n static createEveCategory(overrides: Partial<EveCategory> = {}): EveCategory {\r\n return {\r\n categoryId: 4,\r\n name: 'Material',\r\n published: true,\r\n iconId: null,\r\n ...overrides,\r\n };\r\n }\r\n\r\n static createRegion(overrides: Partial<Region> = {}): Region {\r\n return {\r\n regionId: 10000002,\r\n constellationIDs: [20000020],\r\n description: 'The Forge is the industrial heart of the Caldari State.',\r\n factionId: 500001,\r\n name: 'The Forge',\r\n nebulaId: 10,\r\n position: { x: -9.6e16, y: 6.0e16, z: -1.1e17 },\r\n wormholeClassId: 0,\r\n ...overrides,\r\n };\r\n }\r\n\r\n static createConstellation(\r\n overrides: Partial<Constellation> = {},\r\n ): Constellation {\r\n return {\r\n constellationId: 20000020,\r\n factionId: 500001,\r\n name: 'Kimotoro',\r\n position: { x: -9.7e16, y: 6.1e16, z: -1.15e17 },\r\n regionId: 10000002,\r\n solarSystemIDs: [30000142, 30000144],\r\n wormholeClassId: 0,\r\n ...overrides,\r\n };\r\n }\r\n\r\n static createSolarSystem(overrides: Partial<SolarSystem> = {}): SolarSystem {\r\n return {\r\n systemId: 30000142,\r\n border: false,\r\n constellationId: 20000020,\r\n hub: true,\r\n international: false,\r\n luminosity: 0.02142,\r\n name: 'Jita',\r\n planetIDs: [40009077],\r\n position: { x: -1.29e17, y: 6.07e16, z: -1.12e17 },\r\n position2D: { x: -1.29e17, y: -1.12e17 },\r\n radius: 4.67e12,\r\n regionId: 10000002,\r\n regional: false,\r\n securityClass: 'B',\r\n securityStatus: 0.9459991455078125,\r\n starId: 40009082,\r\n stargateIDs: [50001248],\r\n corridor: null,\r\n fringe: null,\r\n wormholeClassId: null,\r\n visualEffect: null,\r\n ...overrides,\r\n };\r\n }\r\n\r\n static createStargate(overrides: Partial<Stargate> = {}): Stargate {\r\n return {\r\n stargateId: 50001248,\r\n destination: { solarSystemId: 30000144, stargateId: 50001249 },\r\n position: { x: 1.5e12, y: 3.2e11, z: -8.7e11 },\r\n solarSystemId: 30000142,\r\n typeId: 16,\r\n ...overrides,\r\n };\r\n }\r\n\r\n static createStar(overrides: Partial<Star> = {}): Star {\r\n return {\r\n starId: 40009082,\r\n radius: 346600000,\r\n solarSystemId: 30000142,\r\n statistics: {\r\n age: 76000000000,\r\n life: 100000000000,\r\n luminosity: 0.02142,\r\n locked: false,\r\n spectralClass: 'K7 V',\r\n temperature: 4000,\r\n },\r\n typeId: 3796,\r\n ...overrides,\r\n };\r\n }\r\n\r\n static createPlanet(overrides: Partial<Planet> = {}): Planet {\r\n return {\r\n planetId: 40009077,\r\n asteroidBeltIDs: [40009079],\r\n attributes: {},\r\n celestialIndex: 1,\r\n moonIDs: [40009078],\r\n orbitId: 40009082,\r\n position: { x: 1.2e13, y: 1e11, z: -3.5e12 },\r\n radius: 2330000,\r\n solarSystemId: 30000142,\r\n statistics: {},\r\n typeId: 2015,\r\n npcStationIDs: null,\r\n ...overrides,\r\n };\r\n }\r\n\r\n static createMoon(overrides: Partial<Moon> = {}): Moon {\r\n return {\r\n moonId: 40009078,\r\n attributes: {},\r\n celestialIndex: 1,\r\n orbitId: 40009077,\r\n orbitIndex: 1,\r\n position: { x: 1.21e13, y: 1.01e11, z: -3.51e12 },\r\n radius: 240000,\r\n solarSystemId: 30000142,\r\n statistics: {},\r\n typeId: 14,\r\n npcStationIDs: null,\r\n ...overrides,\r\n };\r\n }\r\n\r\n static createAsteroidBelt(\r\n overrides: Partial<AsteroidBelt> = {},\r\n ): AsteroidBelt {\r\n return {\r\n asteroidBeltId: 40009079,\r\n celestialIndex: 1,\r\n orbitId: 40009077,\r\n orbitIndex: 1,\r\n position: { x: 1.19e13, y: 9.9e10, z: -3.49e12 },\r\n radius: 50000,\r\n solarSystemId: 30000142,\r\n statistics: {},\r\n typeId: 15,\r\n ...overrides,\r\n };\r\n }\r\n\r\n static createFaction(overrides: Partial<Faction> = {}): Faction {\r\n return {\r\n factionId: 500001,\r\n corporationId: 1000035,\r\n description: 'The Caldari State is a corporate dictatorship.',\r\n flatLogo: 'res:/ui/texture/corps/caldari.png',\r\n flatLogoWithName: 'res:/ui/texture/corps/caldari_name.png',\r\n iconId: 1439,\r\n memberRaces: [1],\r\n militiaCorporationId: 1000180,\r\n name: 'Caldari State',\r\n shortDescription: 'Caldari',\r\n sizeFactor: 5,\r\n solarSystemId: 30000142,\r\n uniqueName: true,\r\n ...overrides,\r\n };\r\n }\r\n\r\n static createRace(overrides: Partial<Race> = {}): Race {\r\n return {\r\n raceId: 1,\r\n description: 'The Caldari State is a corporate dictatorship.',\r\n iconId: 1439,\r\n name: 'Caldari',\r\n shipTypeId: 601,\r\n skills: {},\r\n ...overrides,\r\n };\r\n }\r\n\r\n static createBloodline(overrides: Partial<Bloodline> = {}): Bloodline {\r\n return {\r\n bloodlineId: 1,\r\n charisma: 3,\r\n corporationId: 1000006,\r\n description: 'The Deteis are regarded as the face of the Caldari State.',\r\n iconId: 1383,\r\n intelligence: 7,\r\n memory: 7,\r\n name: 'Deteis',\r\n perception: 5,\r\n raceId: 1,\r\n willpower: 5,\r\n ...overrides,\r\n };\r\n }\r\n\r\n static createAncestry(overrides: Partial<Ancestry> = {}): Ancestry {\r\n return {\r\n ancestryId: 1,\r\n bloodlineId: 1,\r\n charisma: 0,\r\n description: 'Born and raised in a capsule.',\r\n iconId: 1664,\r\n intelligence: 0,\r\n memory: 0,\r\n name: 'Tube Child',\r\n perception: 0,\r\n shortDescription: 'Raised in a capsule.',\r\n willpower: 2,\r\n ...overrides,\r\n };\r\n }\r\n\r\n static createNpcCorporation(\r\n overrides: Partial<NpcCorporation> = {},\r\n ): NpcCorporation {\r\n return {\r\n corporationId: 1000035,\r\n ceoId: 3004451,\r\n deleted: false,\r\n description: 'The Caldari Navy is the armed forces of the Caldari State.',\r\n extent: 'G',\r\n hasPlayerPersonnelManager: false,\r\n initialPrice: 0,\r\n memberLimit: 0,\r\n minSecurity: 0,\r\n minimumJoinStanding: 0,\r\n name: 'Caldari Navy',\r\n sendCharTerminationMessage: true,\r\n shares: 100000,\r\n size: 'H',\r\n stationId: 60003760,\r\n taxRate: 0,\r\n tickerName: 'CN',\r\n uniqueName: true,\r\n allowedMemberRaces: null,\r\n corporationTrades: null,\r\n divisions: null,\r\n enemyId: null,\r\n factionId: 500001,\r\n friendId: null,\r\n iconId: 1439,\r\n investors: null,\r\n lpOfferTables: null,\r\n mainActivityId: null,\r\n raceId: 1,\r\n sizeFactor: null,\r\n solarSystemId: 30000142,\r\n secondaryActivityId: null,\r\n ...overrides,\r\n };\r\n }\r\n\r\n static createNpcStation(overrides: Partial<NpcStation> = {}): NpcStation {\r\n return {\r\n stationId: 60003760,\r\n celestialIndex: 4,\r\n operationId: 1,\r\n orbitId: 40009081,\r\n orbitIndex: 4,\r\n ownerId: 1000035,\r\n position: { x: 1.58e14, y: 9.63e12, z: 1.06e14 },\r\n reprocessingEfficiency: 0.5,\r\n reprocessingHangarFlag: 4,\r\n reprocessingStationsTake: 0.05,\r\n solarSystemId: 30000142,\r\n typeId: 1529,\r\n useOperationName: true,\r\n ...overrides,\r\n };\r\n }\r\n\r\n static createMarketGroup(overrides: Partial<MarketGroup> = {}): MarketGroup {\r\n return {\r\n marketGroupId: 1857,\r\n description: 'Refined minerals used in manufacturing.',\r\n hasTypes: true,\r\n iconId: 22,\r\n name: 'Minerals',\r\n parentGroupId: 1031,\r\n ...overrides,\r\n };\r\n }\r\n\r\n static createMetaGroup(overrides: Partial<MetaGroup> = {}): MetaGroup {\r\n return {\r\n metaGroupId: 1,\r\n color: { r: 255, g: 255, b: 255, a: 255 },\r\n name: 'Tech I',\r\n iconId: null,\r\n iconSuffix: null,\r\n description: null,\r\n ...overrides,\r\n };\r\n }\r\n\r\n static createIcon(overrides: Partial<Icon> = {}): Icon {\r\n return {\r\n iconId: 22,\r\n iconFile: 'res:/UI/Texture/Icons/22_32_2.png',\r\n ...overrides,\r\n };\r\n }\r\n\r\n static createGraphic(overrides: Partial<Graphic> = {}): Graphic {\r\n return {\r\n graphicId: 20,\r\n graphicFile: 'res:/dx9/model/worldobject/asteroid/oreveld001.red',\r\n iconFolder: null,\r\n sofFactionName: null,\r\n sofHullName: null,\r\n sofRaceName: null,\r\n ...overrides,\r\n };\r\n }\r\n\r\n static createDogmaAttribute(\r\n overrides: Partial<DogmaAttribute> = {},\r\n ): DogmaAttribute {\r\n return {\r\n attributeId: 9,\r\n attributeCategoryId: 1,\r\n dataType: 2,\r\n defaultValue: 0,\r\n description: 'Hit points for a ship.',\r\n displayWhenZero: false,\r\n highIsGood: true,\r\n name: 'hp',\r\n published: true,\r\n stackable: false,\r\n displayName: null,\r\n iconId: null,\r\n tooltipDescription: null,\r\n tooltipTitle: null,\r\n unitId: 1,\r\n chargeRechargeTimeId: null,\r\n maxAttributeId: null,\r\n minAttributeId: null,\r\n ...overrides,\r\n };\r\n }\r\n\r\n static createDogmaEffect(overrides: Partial<DogmaEffect> = {}): DogmaEffect {\r\n return {\r\n effectId: 11,\r\n disallowAutoRepeat: false,\r\n dischargeAttributeId: 0,\r\n durationAttributeId: 0,\r\n effectCategoryId: 0,\r\n electronicChance: false,\r\n guid: 'effects.LowSlotModifier',\r\n isAssistance: false,\r\n isOffensive: false,\r\n isWarpSafe: true,\r\n name: 'lowSlotModifier',\r\n propulsionChance: false,\r\n published: true,\r\n rangeChance: false,\r\n distribution: null,\r\n falloffAttributeId: null,\r\n rangeAttributeId: null,\r\n trackingSpeedAttributeId: null,\r\n description: null,\r\n displayName: null,\r\n iconId: null,\r\n modifierInfo: null,\r\n ...overrides,\r\n };\r\n }\r\n\r\n static createBlueprint(overrides: Partial<Blueprint> = {}): Blueprint {\r\n return {\r\n activities: {\r\n manufacturing: {\r\n time: 6000,\r\n materials: [\r\n { typeId: 34, quantity: 100 },\r\n { typeId: 35, quantity: 50 },\r\n ],\r\n products: [{ typeId: 587, quantity: 1 }],\r\n },\r\n },\r\n blueprintTypeId: 787,\r\n maxProductionLimit: 10,\r\n ...overrides,\r\n };\r\n }\r\n\r\n static createPlanetSchematic(\r\n overrides: Partial<PlanetSchematic> = {},\r\n ): PlanetSchematic {\r\n return {\r\n planetSchematicId: 65,\r\n cycleTime: 1800,\r\n name: 'Bacteria',\r\n pins: [],\r\n types: [],\r\n ...overrides,\r\n };\r\n }\r\n\r\n static createVersionInfo(\r\n overrides: Partial<SdeVersionInfo> = {},\r\n ): SdeVersionInfo {\r\n return {\r\n version: '2024-01-15.1',\r\n buildDate: '2024-01-15T00:00:00Z',\r\n importedAt: '2024-01-16T12:00:00Z',\r\n checksum: 'abc123def456',\r\n ...overrides,\r\n };\r\n }\r\n\r\n static createHierarchicalTestData(): MemorySdeData {\r\n const category = this.createEveCategory();\r\n const group = this.createEveGroup({ categoryId: category.categoryId });\r\n const type1 = this.createEveType({\r\n typeId: 34,\r\n name: 'Tritanium',\r\n groupId: group.groupId,\r\n });\r\n const type2 = this.createEveType({\r\n typeId: 35,\r\n name: 'Pyerite',\r\n groupId: group.groupId,\r\n });\r\n const type3 = this.createEveType({\r\n typeId: 36,\r\n name: 'Mexallon',\r\n groupId: group.groupId,\r\n });\r\n\r\n const region = this.createRegion();\r\n const constellation = this.createConstellation({\r\n regionId: region.regionId,\r\n });\r\n const system1 = this.createSolarSystem({\r\n systemId: 30000142,\r\n name: 'Jita',\r\n constellationId: constellation.constellationId,\r\n regionId: region.regionId,\r\n });\r\n const system2 = this.createSolarSystem({\r\n systemId: 30000144,\r\n name: 'Perimeter',\r\n constellationId: constellation.constellationId,\r\n regionId: region.regionId,\r\n securityStatus: 0.9,\r\n });\r\n const stargate = this.createStargate({\r\n solarSystemId: system1.systemId,\r\n destination: { solarSystemId: system2.systemId, stargateId: 50001249 },\r\n });\r\n\r\n const star = this.createStar({ solarSystemId: system1.systemId });\r\n const planet = this.createPlanet({ solarSystemId: system1.systemId });\r\n const moon = this.createMoon({ solarSystemId: system1.systemId });\r\n const asteroidBelt = this.createAsteroidBelt({\r\n solarSystemId: system1.systemId,\r\n });\r\n\r\n const race = this.createRace();\r\n const faction = this.createFaction({ memberRaces: [race.raceId] });\r\n const bloodline = this.createBloodline({ raceId: race.raceId });\r\n const ancestry = this.createAncestry({\r\n bloodlineId: bloodline.bloodlineId,\r\n });\r\n const npcCorp = this.createNpcCorporation({\r\n factionId: faction.factionId,\r\n raceId: race.raceId,\r\n });\r\n const npcStation = this.createNpcStation({\r\n solarSystemId: system1.systemId,\r\n ownerId: npcCorp.corporationId,\r\n });\r\n\r\n const rootMarketGroup = this.createMarketGroup({\r\n marketGroupId: 1031,\r\n name: 'Manufacture & Research',\r\n parentGroupId: null,\r\n hasTypes: false,\r\n });\r\n const marketGroup = this.createMarketGroup({\r\n parentGroupId: rootMarketGroup.marketGroupId,\r\n });\r\n const metaGroup = this.createMetaGroup();\r\n const icon = this.createIcon();\r\n const graphic = this.createGraphic();\r\n\r\n const dogmaAttribute = this.createDogmaAttribute();\r\n const dogmaEffect = this.createDogmaEffect();\r\n const blueprint = this.createBlueprint();\r\n const planetSchematic = this.createPlanetSchematic();\r\n\r\n return {\r\n categories: [category],\r\n groups: [group],\r\n types: [type1, type2, type3],\r\n regions: [region],\r\n constellations: [constellation],\r\n solarSystems: [system1, system2],\r\n stargates: [stargate],\r\n stars: [star],\r\n planets: [planet],\r\n moons: [moon],\r\n asteroidBelts: [asteroidBelt],\r\n factions: [faction],\r\n races: [race],\r\n bloodlines: [bloodline],\r\n ancestries: [ancestry],\r\n npcCorporations: [npcCorp],\r\n npcStations: [npcStation],\r\n marketGroups: [rootMarketGroup, marketGroup],\r\n metaGroups: [metaGroup],\r\n icons: [icon],\r\n graphics: [graphic],\r\n dogmaAttributes: [dogmaAttribute],\r\n dogmaEffects: [dogmaEffect],\r\n blueprints: [blueprint],\r\n planetSchematics: [planetSchematic],\r\n version: this.createVersionInfo(),\r\n };\r\n }\r\n}\r\n"],"mappings":"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","names":["yaml","AdmZip"]}
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"]}