@elite-dangerous-almanac/core 0.1.0-beta.1

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 (357) hide show
  1. package/LICENSE +48 -0
  2. package/PROVENANCE/SNAPSHOTS.md +36 -0
  3. package/PROVENANCE/astro/SOURCES.md +94 -0
  4. package/PROVENANCE/commodities/SOURCES.md +41 -0
  5. package/PROVENANCE/materials/SOURCES.md +69 -0
  6. package/PROVENANCE/ships/SOURCES.md +1580 -0
  7. package/README.md +148 -0
  8. package/THIRD_PARTY_NOTICES.md +202 -0
  9. package/dist/astro/codex-region-lookup.d.ts +169 -0
  10. package/dist/astro/codex-region-lookup.js +1 -0
  11. package/dist/astro/codex-region-lookup.js.map +1 -0
  12. package/dist/astro/codex-region.d.ts +149 -0
  13. package/dist/astro/codex-region.js +1 -0
  14. package/dist/astro/codex-region.js.map +1 -0
  15. package/dist/astro/galaxy-grid.d.ts +83 -0
  16. package/dist/astro/galaxy-grid.js +1 -0
  17. package/dist/astro/galaxy-grid.js.map +1 -0
  18. package/dist/astro/hand-authored-regions.d.ts +121 -0
  19. package/dist/astro/hand-authored-regions.js +1 -0
  20. package/dist/astro/hand-authored-regions.js.map +1 -0
  21. package/dist/astro/index.d.ts +140 -0
  22. package/dist/astro/index.js +1 -0
  23. package/dist/astro/index.js.map +1 -0
  24. package/dist/astro/mass-code.d.ts +55 -0
  25. package/dist/astro/mass-code.js +1 -0
  26. package/dist/astro/mass-code.js.map +1 -0
  27. package/dist/astro/naming-region-origins.d.ts +4 -0
  28. package/dist/astro/naming-region-origins.js +1 -0
  29. package/dist/astro/naming-region-origins.js.map +1 -0
  30. package/dist/astro/nebulae-all.d.ts +40 -0
  31. package/dist/astro/nebulae-all.js +1 -0
  32. package/dist/astro/nebulae-all.js.map +1 -0
  33. package/dist/astro/nebulae-planetary.d.ts +37 -0
  34. package/dist/astro/nebulae-planetary.js +1 -0
  35. package/dist/astro/nebulae-planetary.js.map +1 -0
  36. package/dist/astro/nebulae-procgen.d.ts +36 -0
  37. package/dist/astro/nebulae-procgen.js +1 -0
  38. package/dist/astro/nebulae-procgen.js.map +1 -0
  39. package/dist/astro/nebulae-real.d.ts +37 -0
  40. package/dist/astro/nebulae-real.js +1 -0
  41. package/dist/astro/nebulae-real.js.map +1 -0
  42. package/dist/astro/nebulae.d.ts +169 -0
  43. package/dist/astro/nebulae.js +1 -0
  44. package/dist/astro/nebulae.js.map +1 -0
  45. package/dist/astro/permit-locked-regions.d.ts +54 -0
  46. package/dist/astro/permit-locked-regions.js +1 -0
  47. package/dist/astro/permit-locked-regions.js.map +1 -0
  48. package/dist/astro/permit-locked-systems.d.ts +74 -0
  49. package/dist/astro/permit-locked-systems.js +1 -0
  50. package/dist/astro/permit-locked-systems.js.map +1 -0
  51. package/dist/astro/permit-locks.d.ts +130 -0
  52. package/dist/astro/permit-locks.js +1 -0
  53. package/dist/astro/permit-locks.js.map +1 -0
  54. package/dist/astro/procedural-system.d.ts +228 -0
  55. package/dist/astro/procedural-system.js +1 -0
  56. package/dist/astro/procedural-system.js.map +1 -0
  57. package/dist/astro/sector-name.d.ts +87 -0
  58. package/dist/astro/sector-name.js +1 -0
  59. package/dist/astro/sector-name.js.map +1 -0
  60. package/dist/astro/system-address-input.d.ts +76 -0
  61. package/dist/astro/system-address-input.js +1 -0
  62. package/dist/astro/system-address-input.js.map +1 -0
  63. package/dist/astro/system-address.d.ts +4 -0
  64. package/dist/astro/system-address.js +1 -0
  65. package/dist/astro/system-address.js.map +1 -0
  66. package/dist/astro/system-name.d.ts +187 -0
  67. package/dist/astro/system-name.js +1 -0
  68. package/dist/astro/system-name.js.map +1 -0
  69. package/dist/chunk-2FHHMYDC.js +1 -0
  70. package/dist/chunk-2FHHMYDC.js.map +1 -0
  71. package/dist/chunk-462OKHXR.js +1 -0
  72. package/dist/chunk-462OKHXR.js.map +1 -0
  73. package/dist/chunk-5H74FKY7.js +1 -0
  74. package/dist/chunk-5H74FKY7.js.map +1 -0
  75. package/dist/chunk-6LUEKHO5.js +1 -0
  76. package/dist/chunk-6LUEKHO5.js.map +1 -0
  77. package/dist/chunk-76XKY2Y2.js +1 -0
  78. package/dist/chunk-76XKY2Y2.js.map +1 -0
  79. package/dist/chunk-7EE5VIHR.js +1 -0
  80. package/dist/chunk-7EE5VIHR.js.map +1 -0
  81. package/dist/chunk-A3NM7SAJ.js +1 -0
  82. package/dist/chunk-A3NM7SAJ.js.map +1 -0
  83. package/dist/chunk-A6XPYSVR.js +1 -0
  84. package/dist/chunk-A6XPYSVR.js.map +1 -0
  85. package/dist/chunk-AA3K5XUE.js +1 -0
  86. package/dist/chunk-AA3K5XUE.js.map +1 -0
  87. package/dist/chunk-AVZI6VKA.js +1 -0
  88. package/dist/chunk-AVZI6VKA.js.map +1 -0
  89. package/dist/chunk-B5TT26XE.js +1 -0
  90. package/dist/chunk-B5TT26XE.js.map +1 -0
  91. package/dist/chunk-BNILZXJD.js +1 -0
  92. package/dist/chunk-BNILZXJD.js.map +1 -0
  93. package/dist/chunk-BRDQUJXV.js +1 -0
  94. package/dist/chunk-BRDQUJXV.js.map +1 -0
  95. package/dist/chunk-BTPV5CIF.js +1 -0
  96. package/dist/chunk-BTPV5CIF.js.map +1 -0
  97. package/dist/chunk-CI3ACMRA.js +1 -0
  98. package/dist/chunk-CI3ACMRA.js.map +1 -0
  99. package/dist/chunk-COE5ADYJ.js +1 -0
  100. package/dist/chunk-COE5ADYJ.js.map +1 -0
  101. package/dist/chunk-CWAX3BSH.js +1 -0
  102. package/dist/chunk-CWAX3BSH.js.map +1 -0
  103. package/dist/chunk-DACZE3HX.js +1 -0
  104. package/dist/chunk-DACZE3HX.js.map +1 -0
  105. package/dist/chunk-DURKO7JU.js +1 -0
  106. package/dist/chunk-DURKO7JU.js.map +1 -0
  107. package/dist/chunk-E45EDCYH.js +1 -0
  108. package/dist/chunk-E45EDCYH.js.map +1 -0
  109. package/dist/chunk-ELIZXUMI.js +1 -0
  110. package/dist/chunk-ELIZXUMI.js.map +1 -0
  111. package/dist/chunk-EYGVDJ2I.js +1 -0
  112. package/dist/chunk-EYGVDJ2I.js.map +1 -0
  113. package/dist/chunk-FGXWVFN6.js +1 -0
  114. package/dist/chunk-FGXWVFN6.js.map +1 -0
  115. package/dist/chunk-GJCB2Z72.js +1 -0
  116. package/dist/chunk-GJCB2Z72.js.map +1 -0
  117. package/dist/chunk-HI7FCS3G.js +1 -0
  118. package/dist/chunk-HI7FCS3G.js.map +1 -0
  119. package/dist/chunk-HKXXFIRI.js +1 -0
  120. package/dist/chunk-HKXXFIRI.js.map +1 -0
  121. package/dist/chunk-HTB52N6S.js +1 -0
  122. package/dist/chunk-HTB52N6S.js.map +1 -0
  123. package/dist/chunk-I7PIDRMU.js +1 -0
  124. package/dist/chunk-I7PIDRMU.js.map +1 -0
  125. package/dist/chunk-IH4NXKVW.js +1 -0
  126. package/dist/chunk-IH4NXKVW.js.map +1 -0
  127. package/dist/chunk-INNFH37U.js +1 -0
  128. package/dist/chunk-INNFH37U.js.map +1 -0
  129. package/dist/chunk-J2PNZQY4.js +1 -0
  130. package/dist/chunk-J2PNZQY4.js.map +1 -0
  131. package/dist/chunk-JQG4C67D.js +1 -0
  132. package/dist/chunk-JQG4C67D.js.map +1 -0
  133. package/dist/chunk-JTQVWIGL.js +1 -0
  134. package/dist/chunk-JTQVWIGL.js.map +1 -0
  135. package/dist/chunk-JWJ7RSZC.js +1 -0
  136. package/dist/chunk-JWJ7RSZC.js.map +1 -0
  137. package/dist/chunk-K3AMV27L.js +1 -0
  138. package/dist/chunk-K3AMV27L.js.map +1 -0
  139. package/dist/chunk-K7F6WC4T.js +1 -0
  140. package/dist/chunk-K7F6WC4T.js.map +1 -0
  141. package/dist/chunk-K7L7SMIR.js +1 -0
  142. package/dist/chunk-K7L7SMIR.js.map +1 -0
  143. package/dist/chunk-KG4EWDZZ.js +1 -0
  144. package/dist/chunk-KG4EWDZZ.js.map +1 -0
  145. package/dist/chunk-KMFUCORC.js +1 -0
  146. package/dist/chunk-KMFUCORC.js.map +1 -0
  147. package/dist/chunk-L2ZZXEZM.js +1 -0
  148. package/dist/chunk-L2ZZXEZM.js.map +1 -0
  149. package/dist/chunk-L747RVPO.js +1 -0
  150. package/dist/chunk-L747RVPO.js.map +1 -0
  151. package/dist/chunk-MFV4VZFP.js +1 -0
  152. package/dist/chunk-MFV4VZFP.js.map +1 -0
  153. package/dist/chunk-NWPK6Q3S.js +1 -0
  154. package/dist/chunk-NWPK6Q3S.js.map +1 -0
  155. package/dist/chunk-PMJG7PHU.js +1 -0
  156. package/dist/chunk-PMJG7PHU.js.map +1 -0
  157. package/dist/chunk-PP2VSA6M.js +1 -0
  158. package/dist/chunk-PP2VSA6M.js.map +1 -0
  159. package/dist/chunk-Q22LXT53.js +1 -0
  160. package/dist/chunk-Q22LXT53.js.map +1 -0
  161. package/dist/chunk-Q5MR36RW.js +1 -0
  162. package/dist/chunk-Q5MR36RW.js.map +1 -0
  163. package/dist/chunk-Q5XOGATC.js +1 -0
  164. package/dist/chunk-Q5XOGATC.js.map +1 -0
  165. package/dist/chunk-QTDBO7R2.js +1 -0
  166. package/dist/chunk-QTDBO7R2.js.map +1 -0
  167. package/dist/chunk-R4OD62HV.js +1 -0
  168. package/dist/chunk-R4OD62HV.js.map +1 -0
  169. package/dist/chunk-RD73TFGS.js +1 -0
  170. package/dist/chunk-RD73TFGS.js.map +1 -0
  171. package/dist/chunk-RIT6MOO5.js +1 -0
  172. package/dist/chunk-RIT6MOO5.js.map +1 -0
  173. package/dist/chunk-RVSXKQHE.js +1 -0
  174. package/dist/chunk-RVSXKQHE.js.map +1 -0
  175. package/dist/chunk-S4DBNX2B.js +1 -0
  176. package/dist/chunk-S4DBNX2B.js.map +1 -0
  177. package/dist/chunk-S4UWCHL6.js +1 -0
  178. package/dist/chunk-S4UWCHL6.js.map +1 -0
  179. package/dist/chunk-SQS7672E.js +1 -0
  180. package/dist/chunk-SQS7672E.js.map +1 -0
  181. package/dist/chunk-TLNHETGC.js +1 -0
  182. package/dist/chunk-TLNHETGC.js.map +1 -0
  183. package/dist/chunk-U6TMCYA6.js +1 -0
  184. package/dist/chunk-U6TMCYA6.js.map +1 -0
  185. package/dist/chunk-V4C6FIE2.js +1 -0
  186. package/dist/chunk-V4C6FIE2.js.map +1 -0
  187. package/dist/chunk-VXVUEF5U.js +1 -0
  188. package/dist/chunk-VXVUEF5U.js.map +1 -0
  189. package/dist/chunk-VZXL5KBR.js +1 -0
  190. package/dist/chunk-VZXL5KBR.js.map +1 -0
  191. package/dist/chunk-VZZ2XIRE.js +1 -0
  192. package/dist/chunk-VZZ2XIRE.js.map +1 -0
  193. package/dist/chunk-WV5YM7H5.js +1 -0
  194. package/dist/chunk-WV5YM7H5.js.map +1 -0
  195. package/dist/chunk-Y2MUIE5W.js +1 -0
  196. package/dist/chunk-Y2MUIE5W.js.map +1 -0
  197. package/dist/chunk-Z43DN4PY.js +1 -0
  198. package/dist/chunk-Z43DN4PY.js.map +1 -0
  199. package/dist/chunk-Z4GTTB7I.js +1 -0
  200. package/dist/chunk-Z4GTTB7I.js.map +1 -0
  201. package/dist/chunk-Z4OUB4SJ.js +1 -0
  202. package/dist/chunk-Z4OUB4SJ.js.map +1 -0
  203. package/dist/chunk-ZFT56QFR.js +1 -0
  204. package/dist/chunk-ZFT56QFR.js.map +1 -0
  205. package/dist/chunk-ZNCXENNB.js +1 -0
  206. package/dist/chunk-ZNCXENNB.js.map +1 -0
  207. package/dist/commodities/commodities-all.d.ts +25 -0
  208. package/dist/commodities/commodities-all.js +1 -0
  209. package/dist/commodities/commodities-all.js.map +1 -0
  210. package/dist/commodities/commodities-rare.d.ts +34 -0
  211. package/dist/commodities/commodities-rare.js +1 -0
  212. package/dist/commodities/commodities-rare.js.map +1 -0
  213. package/dist/commodities/commodities-standard.d.ts +34 -0
  214. package/dist/commodities/commodities-standard.js +1 -0
  215. package/dist/commodities/commodities-standard.js.map +1 -0
  216. package/dist/commodities/commodities.d.ts +142 -0
  217. package/dist/commodities/commodities.js +1 -0
  218. package/dist/commodities/commodities.js.map +1 -0
  219. package/dist/commodities/index.d.ts +30 -0
  220. package/dist/commodities/index.js +1 -0
  221. package/dist/commodities/index.js.map +1 -0
  222. package/dist/galactic-position-shLkm4Qg.d.ts +30 -0
  223. package/dist/materials/index.d.ts +47 -0
  224. package/dist/materials/index.js +1 -0
  225. package/dist/materials/index.js.map +1 -0
  226. package/dist/materials/materials-all.d.ts +26 -0
  227. package/dist/materials/materials-all.js +1 -0
  228. package/dist/materials/materials-all.js.map +1 -0
  229. package/dist/materials/materials-encoded.d.ts +31 -0
  230. package/dist/materials/materials-encoded.js +1 -0
  231. package/dist/materials/materials-encoded.js.map +1 -0
  232. package/dist/materials/materials-manufactured.d.ts +32 -0
  233. package/dist/materials/materials-manufactured.js +1 -0
  234. package/dist/materials/materials-manufactured.js.map +1 -0
  235. package/dist/materials/materials-raw.d.ts +31 -0
  236. package/dist/materials/materials-raw.js +1 -0
  237. package/dist/materials/materials-raw.js.map +1 -0
  238. package/dist/materials/materials.d.ts +277 -0
  239. package/dist/materials/materials.js +1 -0
  240. package/dist/materials/materials.js.map +1 -0
  241. package/dist/materials/micro-resources-all.d.ts +28 -0
  242. package/dist/materials/micro-resources-all.js +1 -0
  243. package/dist/materials/micro-resources-all.js.map +1 -0
  244. package/dist/materials/micro-resources-component.d.ts +29 -0
  245. package/dist/materials/micro-resources-component.js +1 -0
  246. package/dist/materials/micro-resources-component.js.map +1 -0
  247. package/dist/materials/micro-resources-consumable.d.ts +29 -0
  248. package/dist/materials/micro-resources-consumable.js +1 -0
  249. package/dist/materials/micro-resources-consumable.js.map +1 -0
  250. package/dist/materials/micro-resources-data.d.ts +29 -0
  251. package/dist/materials/micro-resources-data.js +1 -0
  252. package/dist/materials/micro-resources-data.js.map +1 -0
  253. package/dist/materials/micro-resources-item.d.ts +29 -0
  254. package/dist/materials/micro-resources-item.js +1 -0
  255. package/dist/materials/micro-resources-item.js.map +1 -0
  256. package/dist/materials/micro-resources.d.ts +136 -0
  257. package/dist/materials/micro-resources.js +1 -0
  258. package/dist/materials/micro-resources.js.map +1 -0
  259. package/dist/ship-loadout-Ba63RDf-.d.ts +1059 -0
  260. package/dist/ships/ammunition.d.ts +107 -0
  261. package/dist/ships/ammunition.js +1 -0
  262. package/dist/ships/ammunition.js.map +1 -0
  263. package/dist/ships/armour.d.ts +134 -0
  264. package/dist/ships/armour.js +1 -0
  265. package/dist/ships/armour.js.map +1 -0
  266. package/dist/ships/blueprint-costs.d.ts +128 -0
  267. package/dist/ships/blueprint-costs.js +1 -0
  268. package/dist/ships/blueprint-costs.js.map +1 -0
  269. package/dist/ships/blueprint-journal.d.ts +116 -0
  270. package/dist/ships/blueprint-journal.js +1 -0
  271. package/dist/ships/blueprint-journal.js.map +1 -0
  272. package/dist/ships/blueprints.d.ts +103 -0
  273. package/dist/ships/blueprints.js +1 -0
  274. package/dist/ships/blueprints.js.map +1 -0
  275. package/dist/ships/decorative-modifications.d.ts +176 -0
  276. package/dist/ships/decorative-modifications.js +1 -0
  277. package/dist/ships/decorative-modifications.js.map +1 -0
  278. package/dist/ships/engineering-options.d.ts +246 -0
  279. package/dist/ships/engineering-options.js +1 -0
  280. package/dist/ships/engineering-options.js.map +1 -0
  281. package/dist/ships/engineering.d.ts +229 -0
  282. package/dist/ships/engineering.js +1 -0
  283. package/dist/ships/engineering.js.map +1 -0
  284. package/dist/ships/experimental-effect-costs.d.ts +56 -0
  285. package/dist/ships/experimental-effect-costs.js +1 -0
  286. package/dist/ships/experimental-effect-costs.js.map +1 -0
  287. package/dist/ships/experimental-effects.d.ts +62 -0
  288. package/dist/ships/experimental-effects.js +1 -0
  289. package/dist/ships/experimental-effects.js.map +1 -0
  290. package/dist/ships/index.d.ts +205 -0
  291. package/dist/ships/index.js +1 -0
  292. package/dist/ships/index.js.map +1 -0
  293. package/dist/ships/jump-range.d.ts +115 -0
  294. package/dist/ships/jump-range.js +1 -0
  295. package/dist/ships/jump-range.js.map +1 -0
  296. package/dist/ships/loadout-calculations.d.ts +109 -0
  297. package/dist/ships/loadout-calculations.js +1 -0
  298. package/dist/ships/loadout-calculations.js.map +1 -0
  299. package/dist/ships/loadout-validation.d.ts +80 -0
  300. package/dist/ships/loadout-validation.js +1 -0
  301. package/dist/ships/loadout-validation.js.map +1 -0
  302. package/dist/ships/module-capabilities.d.ts +205 -0
  303. package/dist/ships/module-capabilities.js +1 -0
  304. package/dist/ships/module-capabilities.js.map +1 -0
  305. package/dist/ships/modules-all.d.ts +43 -0
  306. package/dist/ships/modules-all.js +1 -0
  307. package/dist/ships/modules-all.js.map +1 -0
  308. package/dist/ships/modules-core.d.ts +40 -0
  309. package/dist/ships/modules-core.js +1 -0
  310. package/dist/ships/modules-core.js.map +1 -0
  311. package/dist/ships/modules-hardpoint.d.ts +42 -0
  312. package/dist/ships/modules-hardpoint.js +1 -0
  313. package/dist/ships/modules-hardpoint.js.map +1 -0
  314. package/dist/ships/modules-internal.d.ts +40 -0
  315. package/dist/ships/modules-internal.js +1 -0
  316. package/dist/ships/modules-internal.js.map +1 -0
  317. package/dist/ships/modules-utility.d.ts +40 -0
  318. package/dist/ships/modules-utility.js +1 -0
  319. package/dist/ships/modules-utility.js.map +1 -0
  320. package/dist/ships/modules.d.ts +755 -0
  321. package/dist/ships/modules.js +1 -0
  322. package/dist/ships/modules.js.map +1 -0
  323. package/dist/ships/power.d.ts +168 -0
  324. package/dist/ships/power.js +1 -0
  325. package/dist/ships/power.js.map +1 -0
  326. package/dist/ships/pre-engineered-stats.d.ts +147 -0
  327. package/dist/ships/pre-engineered-stats.js +1 -0
  328. package/dist/ships/pre-engineered-stats.js.map +1 -0
  329. package/dist/ships/pre-engineered.d.ts +215 -0
  330. package/dist/ships/pre-engineered.js +1 -0
  331. package/dist/ships/pre-engineered.js.map +1 -0
  332. package/dist/ships/resistances.d.ts +208 -0
  333. package/dist/ships/resistances.js +1 -0
  334. package/dist/ships/resistances.js.map +1 -0
  335. package/dist/ships/shields.d.ts +221 -0
  336. package/dist/ships/shields.js +1 -0
  337. package/dist/ships/shields.js.map +1 -0
  338. package/dist/ships/ship-loadout.d.ts +16 -0
  339. package/dist/ships/ship-loadout.js +1 -0
  340. package/dist/ships/ship-loadout.js.map +1 -0
  341. package/dist/ships/ships.d.ts +191 -0
  342. package/dist/ships/ships.js +1 -0
  343. package/dist/ships/ships.js.map +1 -0
  344. package/dist/ships/slef.d.ts +318 -0
  345. package/dist/ships/slef.js +1 -0
  346. package/dist/ships/slef.js.map +1 -0
  347. package/dist/ships/slots.d.ts +418 -0
  348. package/dist/ships/slots.js +1 -0
  349. package/dist/ships/slots.js.map +1 -0
  350. package/dist/ships/source-purchase.d.ts +132 -0
  351. package/dist/ships/source-purchase.js +1 -0
  352. package/dist/ships/source-purchase.js.map +1 -0
  353. package/dist/ships/weapons.d.ts +380 -0
  354. package/dist/ships/weapons.js +1 -0
  355. package/dist/ships/weapons.js.map +1 -0
  356. package/dist/system-address-DYsN1qOT.d.ts +313 -0
  357. package/package.json +375 -0
@@ -0,0 +1,116 @@
1
+ /**
2
+ * **Reading a journal `BlueprintName` against the module it was written for** — the one
3
+ * question that needs the journal-collision catalogue and the engineering menus at the
4
+ * same time.
5
+ *
6
+ * Almost every blueprint id means one recipe wherever it appears, and for those
7
+ * `getBlueprint(id)` is the answer. Three ids are not like that, and this is where that is
8
+ * dealt with. One of the three is `Weapon_Overcharged` on a multi-cannon, so any consumer
9
+ * reading journals from combat ships meets this — it is not the corner case the two scanner
10
+ * ids alone would make it.
11
+ *
12
+ * It lives in its own module because the join depends on both menus and the three
13
+ * colliding journal spellings. Keeping those spellings in a tiny purpose-specific
14
+ * catalogue means this resolver does not load every blueprint grade, modifier and
15
+ * material. `package.test.mjs` guards that package boundary.
16
+ *
17
+ * @packageDocumentation
18
+ */
19
+ /**
20
+ * The blueprint whose numbers a module actually rolls when a journal names `blueprint` on
21
+ * it — the same id back, except where the game spells two different recipes alike.
22
+ *
23
+ * **One `BlueprintName`, two recipes.** Long Range and Wide Angle are offered on the
24
+ * internal sensor suite and on the KWS/manifest/wake scanners, and the game writes the
25
+ * same id for both families. The two roll different stats, in opposite directions:
26
+ *
27
+ * | On a sensor suite | On a utility scanner |
28
+ * | --- | --- |
29
+ * | Long Range: `Mass` ×1.20, `ScannerRange` +0…15% | Long Range: `PowerDraw` ×1.10, `ScannerRange` +0…24% |
30
+ * | Wide Angle: `PowerDraw` ×1.10, `ScannerRange` −4% | Wide Angle: `Mass` ×1.20, `ScannerTimeToScan` +10% |
31
+ *
32
+ * (Grade 1 shown; both pairs share their `SensorTargetScanAngle` leg.) `BLUEPRINTS` keys
33
+ * the scanner side under `Scanner_LongRange` / `Scanner_WideAngle`, which is the spelling
34
+ * the scanner menus list — so on a scanner this resolves `Sensor_LongRange` to
35
+ * `Scanner_LongRange`, and folding the id as written would charge the build mass where the
36
+ * game charges power draw.
37
+ *
38
+ * **One `BlueprintName`, two recipes — again, on the multi-cannons.** The game writes
39
+ * `Weapon_Overcharged` for every weapon's Overcharged, but a multi-cannon's also cuts the
40
+ * clip — 3% at grade 1 falling to 15% at grade 5 — which the recipe the other weapons take
41
+ * does not. `BLUEPRINTS` keys the multi-cannon side under `MC_Overcharged`, the spelling
42
+ * the multi-cannon menus list, so on a multi-cannon this resolves `Weapon_Overcharged` to
43
+ * `MC_Overcharged` and folding the id as written would report a clip the build does not
44
+ * have. This is the common case of the three: 70 of the build corpus's 1902 declared
45
+ * entries go through it, against one for the scanners.
46
+ *
47
+ * The clip penalty is folded on a multi-cannon — anti-xeno ones included — and on nothing
48
+ * else. The cannons, fragment cannons and plasma accelerators take no clip leg, which is
49
+ * the game's own answer on all three groups: journal captures of a large gimballed cannon
50
+ * at grade 5, of a medium fragment cannon at grade 4 and of a medium plasma accelerator at
51
+ * grade 1, each rolled under this id, report no `AmmoClipSize` modifier. See
52
+ * [`data/ships/SOURCES.md`](https://github.com/DarkSession/Elite-Dangerous-Almanac/blob/main/data/ships/SOURCES.md)
53
+ * § "Multi-cannon Overcharged" for the captures.
54
+ *
55
+ * **The pairing is global, not repeated per menu.** A purpose-specific catalogue maps
56
+ * each of the three recipe ids to the colliding id the journal writes. This function
57
+ * supplies the half only a menu knows, by asking which mapped recipe *this module is
58
+ * offered*. Keeping one global map avoids repeating aliases on every scanner or
59
+ * multi-cannon group and silently forgetting the next one.
60
+ *
61
+ * Only the module can settle it, which is why this takes one. It resolves **into** a menu
62
+ * and never out of one: a sensor suite's `Sensor_LongRange` is already its own menu's id
63
+ * and comes back unchanged, and asking for `Scanner_LongRange` on a sensor suite returns
64
+ * it unchanged too — unchanged is not the same as offered, and `getBlueprintsForModule`
65
+ * still says a suite does not take it.
66
+ *
67
+ * **Only the numbers differ, not the price.** All three pairs cost the same materials at
68
+ * every grade, so `getBlueprintCost` from `ships/blueprint-costs` needs no module and
69
+ * either spelling bills correctly; cross-catalogue tests hold upstream to that. It is the
70
+ * stat block that has to be resolved.
71
+ *
72
+ * **Not a generic-spelling resolver.** A generic `Misc_*` id — `Misc_Shielded` where a
73
+ * life support's menu says `LifeSupport_Shielded` — comes back as it went in. That pair is
74
+ * one recipe under two spellings, both published with their own numbers, so the id a
75
+ * caller names is the one to roll. This function exists for the case where the id names no
76
+ * recipe the module has: the game never rolls a sensor suite's Long Range on a scanner.
77
+ *
78
+ * @param symbol - A module symbol, e.g. `"Hpt_CloudScanner_Size0_Class5"`.
79
+ * @param fdname - A blueprint catalogue or journal id, matched case-insensitively and
80
+ * trimmed. Colliding journal spellings are resolved against `symbol`.
81
+ * @returns The id to join to `BLUEPRINTS`, in that catalogue's spelling when a journal
82
+ * name resolved, and otherwise `fdname` exactly as it was passed — byte for byte, so a
83
+ * caller who never meets the collision never sees their own spelling rewritten.
84
+ *
85
+ * @throws {TypeError} If `fdname` is not a string, including when it is missing — this
86
+ * returns an id rather than reporting whether one is known, so there is no miss for a
87
+ * nullish one to be. A nullish `symbol` *is* a miss: an unknown module offers no menu,
88
+ * and `fdname` comes back unchanged.
89
+ * @example
90
+ * ```ts
91
+ * import { resolveBlueprintForModule } from '@elite-dangerous-almanac/core/ships/blueprint-journal';
92
+ *
93
+ * // A wake scanner's Long Range is the scanner recipe, whichever way the build spells it.
94
+ * resolveBlueprintForModule('Hpt_CloudScanner_Size0_Class5', 'Sensor_LongRange');
95
+ * // -> 'Scanner_LongRange'
96
+ * resolveBlueprintForModule('Hpt_CloudScanner_Size0_Class5', 'Scanner_LongRange');
97
+ * // -> 'Scanner_LongRange'
98
+ *
99
+ * // The sensor suite keeps its own, and every other module keeps whatever it was given.
100
+ * resolveBlueprintForModule('Int_Sensors_Size4_Class5', 'Sensor_LongRange');
101
+ * // -> 'Sensor_LongRange'
102
+ * resolveBlueprintForModule('Int_Hyperdrive_Size5_Class5', 'FSD_LongRange');
103
+ * // -> 'FSD_LongRange'
104
+ *
105
+ * // A multi-cannon's Overcharged is the multi-cannon recipe, clip penalty and all.
106
+ * resolveBlueprintForModule('Hpt_MultiCannon_Fixed_Medium', 'Weapon_Overcharged');
107
+ * // -> 'MC_Overcharged'
108
+ * resolveBlueprintForModule('Hpt_ATMultiCannon_Gimbal_Medium', 'Weapon_Overcharged');
109
+ * // -> 'MC_Overcharged'
110
+ * resolveBlueprintForModule('Hpt_BeamLaser_Fixed_Small', 'Weapon_Overcharged');
111
+ * // -> 'Weapon_Overcharged'
112
+ * ```
113
+ */
114
+ declare function resolveBlueprintForModule(symbol: string, fdname: string): string;
115
+
116
+ export { resolveBlueprintForModule };
@@ -0,0 +1 @@
1
+ export{resolveBlueprintForModule}from"../chunk-L2ZZXEZM.js"; //# sourceMappingURL=blueprint-journal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"O"}
@@ -0,0 +1,103 @@
1
+ import { Blueprint, BlueprintGrade } from './engineering.js';
2
+ import './slef.js';
3
+ import './modules.js';
4
+ import './engineering-options.js';
5
+ import './slots.js';
6
+
7
+ /**
8
+ * The **blueprint mechanics catalogue** — every engineering blueprint's per-grade stat
9
+ * modifiers, keyed by the blueprint's Frontier `fdname`
10
+ * (as it appears in a journal `Loadout` event's `Engineering.BlueprintName`).
11
+ *
12
+ * Its own module (and data file) so consumers who never engineer a build do not bundle
13
+ * it. Each grade is a {@link BlueprintGrade} — its `features` (feed to
14
+ * {@link computeModifiers} from `./engineering`) and optional converted
15
+ * `damageDistribution`. Read it with {@link getBlueprintGrade}. Material shopping lists
16
+ * live separately in `ships/blueprint-costs`, so build calculations do not bundle them.
17
+ *
18
+ * Keys are Frontier `fdname`s — normally the exact strings a journal `Loadout` event
19
+ * carries in `Engineering.BlueprintName` (e.g. `"FSD_LongRange"`), not the in-game display
20
+ * names. **Three keys collide**: each is a recipe the game writes under an id another
21
+ * record already answers to:
22
+ * `Scanner_LongRange` and `Scanner_WideAngle` are coriolis keys for recipes the game writes
23
+ * as `Sensor_LongRange` / `Sensor_WideAngle`, the ids it also writes for the sensor suites'
24
+ * different recipes of the same name; `MC_Overcharged` is its multi-cannon Overcharged,
25
+ * which cuts the clip by 3–15% where the `Weapon_Overcharged` the game writes for both
26
+ * leaves it alone. `ships/blueprint-journal` keeps those three spellings apart from this
27
+ * full mechanics catalogue and resolves one against a module.
28
+ *
29
+ * A further 25 keys are the **Operations** ids: 21 recipes a module is *sold*
30
+ * carrying (`ships/pre-engineered`) and four Operations recipes a player rolls at an
31
+ * engineer (`ships/engineering-options`). No journal spelling has been observed for those
32
+ * Operations ids — a gap in the evidence, not a claim that the game writes none.
33
+ *
34
+ * **Every recipe is keyed once.** Anti-Guardian Zone Resistance is
35
+ * `GuardianModule_Sturdy`, the id the game writes on Guardian weapons as well as on
36
+ * Guardian modules; the Inara registry's `recipe_guardianmodule_sturdy` and
37
+ * `recipe_guardianweapon_sturdy` are that registry's own spellings of the same recipe and
38
+ * are not keys here.
39
+ * Enumerate the 107 blueprints with `Object.keys(BLUEPRINTS)`.
40
+ *
41
+ * Data from EDCD/coriolis-data (`modifications/blueprints.json`): `features` from the
42
+ * grade with journal Labels resolved via EDSY; see
43
+ * [`data/ships/SOURCES.md`](https://github.com/DarkSession/Elite-Dangerous-Almanac/blob/main/data/ships/SOURCES.md).
44
+ *
45
+ * @packageDocumentation
46
+ */
47
+
48
+ /**
49
+ * Every blueprint, keyed by Frontier `fdname` (e.g. `"FSD_LongRange"`). Each is a
50
+ * {@link Blueprint} — its display `name` and its per-grade `grades`, where each grade
51
+ * carries its `features` (modifiers) and optional converted `damageDistribution`.
52
+ *
53
+ * @example
54
+ * ```ts
55
+ * import { BLUEPRINTS } from '@elite-dangerous-almanac/core/ships/blueprints';
56
+ *
57
+ * BLUEPRINTS['FSD_LongRange']?.name; // -> 'Increased range'
58
+ * BLUEPRINTS['FSD_LongRange']?.grades['5']?.features; // -> [{ label: 'Integrity', ... }, ...]
59
+ * BLUEPRINTS['BeamLaser_ThermalPlasmaConversion']?.grades['5']?.damageDistribution;
60
+ * // -> { thermal: 0.845, absolute: 0.155 }
61
+ * ```
62
+ */
63
+ declare const BLUEPRINTS: Readonly<Record<string, Blueprint>>;
64
+ /**
65
+ * Look up a blueprint by its Frontier `fdname`, case-insensitively.
66
+ *
67
+ * @param fdname - The blueprint id, e.g. `"FSD_LongRange"`.
68
+ * @returns The blueprint (its `name` and `grades`), or `null` if this catalogue stores no
69
+ * blueprint under that id.
70
+ * @remarks
71
+ * **`null` is not always an unknown id.** The game writes a handful of cosmetic
72
+ * transformations in the same `BlueprintName` / `EngineerModifications` field, and they
73
+ * name no recipe — no grade, no materials, and no engineer who applies one.
74
+ * {@link isDecorativeModification} from `ships/decorative-modifications` is what tells one
75
+ * of those apart from an id this library has never heard of. Note that such an id is not a
76
+ * claim that the module is unmodified: read a fitted one's stats from the journal's own
77
+ * `Engineering.Modifiers`.
78
+ * @throws {TypeError} If `fdname` is present and not a string. A nullish
79
+ * `fdname` is a miss, answered the way an unrecognised one is.
80
+ */
81
+ declare function getBlueprint(fdname: string): Blueprint | null;
82
+ /**
83
+ * Look up one complete grade of a blueprint, case-insensitively.
84
+ *
85
+ * @param fdname - The blueprint id, e.g. `"FSD_LongRange"`.
86
+ * @param grade - The grade, `1`–`5`.
87
+ * @returns The grade record — its modifier `features` and optional converted
88
+ * `damageDistribution` — or `null` if the catalogue holds no such blueprint or grade.
89
+ * See {@link getBlueprint} for what an absent blueprint can mean besides "unknown".
90
+ * @throws {RangeError} If `grade` is not an integer from 1 through 5.
91
+ * @throws {TypeError} If `fdname` is present and not a string. A nullish
92
+ * `fdname` is a miss, answered the way an unrecognised one is.
93
+ * @example
94
+ * ```ts
95
+ * import { getBlueprintGrade } from '@elite-dangerous-almanac/core/ships/blueprints';
96
+ *
97
+ * const grade = getBlueprintGrade('FSD_LongRange', 5);
98
+ * grade?.features; // -> [{ label: 'Integrity', ... }, ...]
99
+ * ```
100
+ */
101
+ declare function getBlueprintGrade(fdname: string, grade: number): BlueprintGrade | null;
102
+
103
+ export { BLUEPRINTS, getBlueprint, getBlueprintGrade };
@@ -0,0 +1 @@
1
+ export{BLUEPRINTS,getBlueprint,getBlueprintGrade}from"../chunk-Q5MR36RW.js"; //# sourceMappingURL=blueprints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"O"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * The **decorative modification catalogue** — the festive transformations the game
3
+ * records in the same field as an engineering blueprint, keyed by the Frontier `fdname`
4
+ * a journal writes (`EngineerModifications` on a `StoredModules` entry,
5
+ * `Engineering.BlueprintName` on a `Loadout` module).
6
+ *
7
+ * **Not engineering.** A decorative modification has no grade, costs no materials, and no
8
+ * engineer offers one. So these ids are **not** in {@link BLUEPRINTS} — there is no recipe
9
+ * to store — and no menu in `ships/engineering-options` lists one, because that catalogue
10
+ * answers what a player may apply. This module is what makes the id resolve to something
11
+ * rather than to nothing.
12
+ *
13
+ * **Not cosmetic-only, either.** A festive launcher fires fireworks rather than flak, and
14
+ * the transformation cuts the module's `Damage` by 99% to match — the one stat any of them
15
+ * moves, carried in {@link DecorativeModification.modifiers}. So a record here is never a
16
+ * claim that the module is unmodified. Feed the modifiers to {@link computeModifiers} to
17
+ * resolve a fitted launcher, the same way a pre-engineered variant's are resolved.
18
+ *
19
+ * Resolving the id is the whole of its job, and it is why it is worth having. A consumer
20
+ * reading a real journal meets `Decorative_Green` on a stored module and needs to tell "an
21
+ * id this library has never heard of" from "an id that is real and names no recipe"; only
22
+ * the second is true here. {@link ShipLoadout.applyBlueprint} reads it for the same
23
+ * reason: it refuses a decorative id, but refuses it by name.
24
+ *
25
+ * Three modifications are known — `Decorative_Green`, `Decorative_Red` and
26
+ * `Decorative_Yellow` — and one module is observed carrying them, the medium turreted
27
+ * Remote Release Flak Launcher (`Hpt_FlakMortar_Turret_Medium`). Enumerate them with
28
+ * `Object.keys(DECORATIVE_MODIFICATIONS)`.
29
+ *
30
+ * Its own module (and data file), a few hundred bytes, so nothing else has to grow to
31
+ * hold three records that belong to none of it.
32
+ *
33
+ * Ids and the module they sit on from a `StoredModules` capture contributed by the
34
+ * repository owner, the `Damage` cut from the same contributor's outfitting panel; EDSY
35
+ * lists the same three transformations and gives them no modifiers, which the cut shows to
36
+ * be an incomplete record. See
37
+ * [`data/ships/SOURCES.md`](https://github.com/DarkSession/Elite-Dangerous-Almanac/blob/main/data/ships/SOURCES.md).
38
+ *
39
+ * @packageDocumentation
40
+ */
41
+ /**
42
+ * One hand-set stat change a decorative modification arrives with.
43
+ *
44
+ * Deliberately the same shape as {@link PreEngineeredModifier}, and for the same reason: a
45
+ * transformation that arrives on the module is a fixed article, not a roll, so there is no
46
+ * `min`/`max` to bound it. The two are kept as separate types because a festive launcher is
47
+ * not a pre-engineered purchase — but anything that handles one handles the other, and
48
+ * {@link computeModifiers} takes both once each value is read as its own `min` and `max`.
49
+ */
50
+ interface DecorativeModifier {
51
+ /** Journal Modifier Label, e.g. `"Damage"`. */
52
+ readonly label: string;
53
+ /** How the value applies to the base stat. */
54
+ readonly method: 'multiplicative' | 'additive' | 'overwrite';
55
+ /**
56
+ * The modifier value: a fraction for `multiplicative` (`-0.99` is `−99%`), an absolute
57
+ * delta for `additive`, and the replacement value for `overwrite`.
58
+ */
59
+ readonly value: number;
60
+ }
61
+ /** One festive transformation a module can carry in place of engineering. */
62
+ interface DecorativeModification {
63
+ /**
64
+ * The festive naming paired with the colour the id spells, e.g. `"Festive Green"`. No
65
+ * registry publishes the outfitting panel's own string for these, so this is what the
66
+ * transformation is known as rather than a sourced label.
67
+ */
68
+ readonly name: string;
69
+ /**
70
+ * Every module symbol observed carrying this transformation, e.g.
71
+ * `["Hpt_FlakMortar_Turret_Medium"]`. Joins to the module catalogues.
72
+ *
73
+ * This is what has been **seen**, not what the game permits: the list comes from a
74
+ * journal capture, so a module absent from it is one no capture has shown carrying
75
+ * the transformation.
76
+ */
77
+ readonly modules: readonly string[];
78
+ /**
79
+ * The stat changes the transformation arrives with — for every one of these, a single
80
+ * `Damage` cut of −99%, which is what turns a flak launcher into a firework launcher.
81
+ *
82
+ * Never empty: a decorative modification names no engineering *recipe*, but it is not
83
+ * inert, and reading it as cosmetic-only would overstate a fitted launcher's damage a
84
+ * hundredfold.
85
+ *
86
+ * @example
87
+ * ```ts
88
+ * import { DECORATIVE_MODIFICATIONS } from '@elite-dangerous-almanac/core/ships/decorative-modifications';
89
+ *
90
+ * DECORATIVE_MODIFICATIONS['Decorative_Green']?.modifiers;
91
+ * // -> [{ label: 'Damage', method: 'multiplicative', value: -0.99 }]
92
+ * // on the medium turreted launcher: 34 damage -> 0.34, 0.17 DPS
93
+ * ```
94
+ */
95
+ readonly modifiers: readonly DecorativeModifier[];
96
+ }
97
+ /**
98
+ * Every decorative modification, keyed by Frontier `fdname` (e.g. `"Decorative_Green"`).
99
+ *
100
+ * @example
101
+ * ```ts
102
+ * import { DECORATIVE_MODIFICATIONS } from '@elite-dangerous-almanac/core/ships/decorative-modifications';
103
+ *
104
+ * Object.keys(DECORATIVE_MODIFICATIONS);
105
+ * // -> ['Decorative_Green', 'Decorative_Red', 'Decorative_Yellow']
106
+ * DECORATIVE_MODIFICATIONS['Decorative_Green']?.modules;
107
+ * // -> ['Hpt_FlakMortar_Turret_Medium']
108
+ * DECORATIVE_MODIFICATIONS['Decorative_Green']?.modifiers;
109
+ * // -> [{ label: 'Damage', method: 'multiplicative', value: -0.99 }]
110
+ * ```
111
+ */
112
+ declare const DECORATIVE_MODIFICATIONS: Readonly<Record<string, DecorativeModification>>;
113
+ /**
114
+ * Look up a decorative modification by its Frontier `fdname`, case-insensitively.
115
+ *
116
+ * @param fdname - The modification id, e.g. `"Decorative_Green"`.
117
+ * @returns The modification — its `name`, the `modules` observed carrying it and the
118
+ * `modifiers` it arrives with — or `null` if the id is not a decorative modification.
119
+ * @throws {TypeError} If `fdname` is present and not a string. A nullish
120
+ * `fdname` is a miss, answered the way an unrecognised one is.
121
+ * @example
122
+ * ```ts
123
+ * import { getDecorativeModification } from '@elite-dangerous-almanac/core/ships/decorative-modifications';
124
+ *
125
+ * getDecorativeModification('decorative_red')?.name; // -> 'Festive Red'
126
+ * getDecorativeModification('FSD_LongRange'); // -> null
127
+ * ```
128
+ */
129
+ declare function getDecorativeModification(fdname: string): DecorativeModification | null;
130
+ /**
131
+ * Whether an id names a decorative modification rather than an engineering blueprint.
132
+ *
133
+ * The question to ask of a journal `EngineerModifications` / `BlueprintName` value that
134
+ * {@link getBlueprint} answered `null` for: `true` means the id is real and names no
135
+ * recipe, and only a `false` here leaves "this library does not know the id" as the
136
+ * remaining reading. It does **not** mean the module is unmodified — read
137
+ * {@link DecorativeModification.modifiers} for what it does change.
138
+ *
139
+ * @param fdname - The id to test, matched case-insensitively and trimmed.
140
+ * @returns `true` when {@link getDecorativeModification} would find it.
141
+ * @throws {TypeError} If `fdname` is present and not a string. A nullish
142
+ * `fdname` is a miss, answered the way an unrecognised one is.
143
+ * @example
144
+ * ```ts
145
+ * import { isDecorativeModification } from '@elite-dangerous-almanac/core/ships/decorative-modifications';
146
+ *
147
+ * isDecorativeModification('Decorative_Yellow'); // -> true
148
+ * isDecorativeModification('Weapon_Efficient'); // -> false
149
+ * ```
150
+ */
151
+ declare function isDecorativeModification(fdname: string): boolean;
152
+ /**
153
+ * Every decorative modification a module has been observed carrying.
154
+ *
155
+ * Matching is case-insensitive and trims whitespace, so a raw journal value can be passed
156
+ * straight in. A module no capture shows carrying one yields an empty array, never
157
+ * `null`, so the result is always safe to iterate — and an empty answer is "none seen on
158
+ * this module", not "this module cannot have one".
159
+ *
160
+ * @param symbol - A module symbol, e.g. `"Hpt_FlakMortar_Turret_Medium"`.
161
+ * @returns The modification ids, in catalogue order. Join to
162
+ * {@link DECORATIVE_MODIFICATIONS}.
163
+ * @throws {TypeError} If `symbol` is present and not a string. A nullish
164
+ * `symbol` is a miss, answered the way an unrecognised one is.
165
+ * @example
166
+ * ```ts
167
+ * import { getDecorativeModificationsForModule } from '@elite-dangerous-almanac/core/ships/decorative-modifications';
168
+ *
169
+ * getDecorativeModificationsForModule('Hpt_FlakMortar_Turret_Medium');
170
+ * // -> ['Decorative_Green', 'Decorative_Red', 'Decorative_Yellow']
171
+ * getDecorativeModificationsForModule('Hpt_BeamLaser_Fixed_Small'); // -> []
172
+ * ```
173
+ */
174
+ declare function getDecorativeModificationsForModule(symbol: string): readonly string[];
175
+
176
+ export { DECORATIVE_MODIFICATIONS, type DecorativeModification, type DecorativeModifier, getDecorativeModification, getDecorativeModificationsForModule, isDecorativeModification };
@@ -0,0 +1 @@
1
+ export{DECORATIVE_MODIFICATIONS,getDecorativeModification,getDecorativeModificationsForModule,isDecorativeModification}from"../chunk-6LUEKHO5.js"; //# sourceMappingURL=decorative-modifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"O"}