@classytic/stage 0.3.0 → 0.4.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 (431) hide show
  1. package/dist/_virtual/_rolldown/runtime.mjs +18 -0
  2. package/dist/atomic/aufbau.d.mts +144 -0
  3. package/dist/atomic/aufbau.mjs +384 -0
  4. package/dist/atomic/elements.d.mts +67 -0
  5. package/dist/atomic/elements.mjs +785 -0
  6. package/dist/atomic/emission.d.mts +112 -0
  7. package/dist/atomic/emission.mjs +179 -0
  8. package/dist/atomic/index.d.mts +8 -0
  9. package/dist/atomic/index.mjs +9 -0
  10. package/dist/atomic/periodic.d.mts +82 -0
  11. package/dist/atomic/periodic.mjs +231 -0
  12. package/dist/atomic/properties.d.mts +100 -0
  13. package/dist/atomic/properties.mjs +574 -0
  14. package/dist/atomic/shells.d.mts +137 -0
  15. package/dist/atomic/shells.mjs +170 -0
  16. package/dist/atomic/trends.d.mts +148 -0
  17. package/dist/atomic/trends.mjs +225 -0
  18. package/dist/chem/chromatography.d.mts +66 -0
  19. package/dist/chem/chromatography.mjs +63 -0
  20. package/dist/chem/complex.d.mts +114 -0
  21. package/dist/chem/complex.mjs +234 -0
  22. package/dist/chem/cycle.d.mts +75 -0
  23. package/dist/chem/cycle.mjs +145 -0
  24. package/dist/chem/equation.d.mts +86 -0
  25. package/dist/chem/equation.mjs +168 -0
  26. package/dist/chem/formula.d.mts +90 -0
  27. package/dist/chem/formula.mjs +201 -0
  28. package/dist/chem/functional-groups.d.mts +31 -0
  29. package/dist/chem/functional-groups.mjs +187 -0
  30. package/dist/chem/hazard.d.mts +94 -0
  31. package/dist/chem/hazard.mjs +329 -0
  32. package/dist/chem/index.d.mts +34 -33
  33. package/dist/chem/index.mjs +34 -28
  34. package/dist/chem/ionic.d.mts +98 -0
  35. package/dist/chem/ionic.mjs +156 -0
  36. package/dist/chem/layout.d.mts +46 -0
  37. package/dist/chem/layout.mjs +342 -0
  38. package/dist/chem/lewis.d.mts +79 -0
  39. package/dist/chem/lewis.mjs +163 -0
  40. package/dist/chem/molecular-orbital.d.mts +114 -0
  41. package/dist/chem/molecular-orbital.mjs +201 -0
  42. package/dist/chem/molecule.d.mts +154 -0
  43. package/dist/chem/molecule.mjs +282 -0
  44. package/dist/chem/nmr.d.mts +153 -0
  45. package/dist/chem/nmr.mjs +165 -0
  46. package/dist/chem/polymer.d.mts +65 -0
  47. package/dist/chem/polymer.mjs +179 -0
  48. package/dist/chem/redox.d.mts +138 -0
  49. package/dist/chem/redox.mjs +328 -0
  50. package/dist/chem/relations.d.mts +183 -0
  51. package/dist/chem/relations.mjs +299 -0
  52. package/dist/chem/skeleton.d.mts +51 -0
  53. package/dist/chem/skeleton.mjs +186 -0
  54. package/dist/chem/solution.d.mts +116 -0
  55. package/dist/chem/solution.mjs +186 -0
  56. package/dist/chem/species.d.mts +47 -0
  57. package/dist/chem/species.mjs +128 -0
  58. package/dist/chem/stereo.d.mts +108 -0
  59. package/dist/chem/stereo.mjs +286 -0
  60. package/dist/chem/stoichiometry.d.mts +95 -0
  61. package/dist/chem/stoichiometry.mjs +145 -0
  62. package/dist/chem/synthesis.d.mts +113 -0
  63. package/dist/chem/synthesis.mjs +281 -0
  64. package/dist/chem/vsepr.d.mts +80 -0
  65. package/dist/chem/vsepr.mjs +247 -0
  66. package/dist/circuit/ac.d.mts +163 -0
  67. package/dist/circuit/ac.mjs +452 -0
  68. package/dist/circuit/dc.d.mts +92 -0
  69. package/dist/circuit/dc.mjs +333 -0
  70. package/dist/circuit/index.d.mts +5 -92
  71. package/dist/circuit/index.mjs +5 -332
  72. package/dist/circuit/network.d.mts +99 -0
  73. package/dist/circuit/network.mjs +440 -0
  74. package/dist/circuit/topology.d.mts +102 -0
  75. package/dist/circuit/topology.mjs +143 -0
  76. package/dist/colour/absorption.d.mts +79 -0
  77. package/dist/colour/absorption.mjs +137 -0
  78. package/dist/colour/index.d.mts +6 -0
  79. package/dist/colour/index.mjs +7 -0
  80. package/dist/colour/name.d.mts +14 -0
  81. package/dist/colour/name.mjs +76 -0
  82. package/dist/colour/observer.d.mts +31 -0
  83. package/dist/colour/observer.mjs +46 -0
  84. package/dist/colour/spectrum.d.mts +61 -0
  85. package/dist/colour/spectrum.mjs +108 -0
  86. package/dist/colour/srgb.d.mts +49 -0
  87. package/dist/colour/srgb.mjs +108 -0
  88. package/dist/core/constants.d.mts +138 -0
  89. package/dist/core/constants.mjs +139 -0
  90. package/dist/core/index.d.mts +3 -1
  91. package/dist/core/index.mjs +3 -1
  92. package/dist/core/vec3.d.mts +94 -0
  93. package/dist/core/vec3.mjs +123 -0
  94. package/dist/core/worked.d.mts +35 -0
  95. package/dist/core/worked.mjs +44 -0
  96. package/dist/electro/cell.d.mts +102 -0
  97. package/dist/electro/cell.mjs +170 -0
  98. package/dist/electro/conductivity.d.mts +157 -0
  99. package/dist/electro/conductivity.mjs +156 -0
  100. package/dist/electro/couples.d.mts +114 -0
  101. package/dist/electro/couples.mjs +334 -0
  102. package/dist/electro/electrolysis.d.mts +96 -0
  103. package/dist/electro/electrolysis.mjs +274 -0
  104. package/dist/electro/faraday.d.mts +150 -0
  105. package/dist/electro/faraday.mjs +118 -0
  106. package/dist/electro/index.d.mts +6 -0
  107. package/dist/electro/index.mjs +7 -0
  108. package/dist/finance/accounting/adjustments.d.mts +17 -0
  109. package/dist/finance/accounting/adjustments.mjs +202 -0
  110. package/dist/finance/accounting/analysis.d.mts +8 -0
  111. package/dist/finance/accounting/analysis.mjs +205 -0
  112. package/dist/finance/accounting/clubs.d.mts +21 -0
  113. package/dist/finance/accounting/clubs.mjs +217 -0
  114. package/dist/finance/accounting/company-statements.d.mts +7 -0
  115. package/dist/finance/accounting/company-statements.mjs +150 -0
  116. package/dist/finance/accounting/harness.d.mts +7 -0
  117. package/dist/finance/accounting/harness.mjs +45 -0
  118. package/dist/finance/accounting/index.d.mts +18 -0
  119. package/dist/finance/accounting/index.mjs +18 -0
  120. package/dist/finance/accounting/journalize.d.mts +16 -0
  121. package/dist/finance/accounting/journalize.mjs +128 -0
  122. package/dist/finance/accounting/manufacturing.d.mts +8 -0
  123. package/dist/finance/accounting/manufacturing.mjs +236 -0
  124. package/dist/finance/accounting/partnership.d.mts +7 -0
  125. package/dist/finance/accounting/partnership.mjs +152 -0
  126. package/dist/finance/accounting/period-case.d.mts +6 -0
  127. package/dist/finance/accounting/period-case.mjs +71 -0
  128. package/dist/finance/accounting/post.d.mts +9 -0
  129. package/dist/finance/accounting/post.mjs +84 -0
  130. package/dist/finance/accounting/precision.d.mts +9 -0
  131. package/dist/finance/accounting/precision.mjs +15 -0
  132. package/dist/finance/accounting/rules.d.mts +21 -0
  133. package/dist/finance/accounting/rules.mjs +37 -0
  134. package/dist/finance/accounting/solve.d.mts +28 -0
  135. package/dist/finance/accounting/solve.mjs +92 -0
  136. package/dist/finance/accounting/statements.d.mts +7 -0
  137. package/dist/finance/accounting/statements.mjs +142 -0
  138. package/dist/finance/accounting/types.d.mts +649 -0
  139. package/dist/finance/accounting/validate.d.mts +7 -0
  140. package/dist/finance/accounting/validate.mjs +67 -0
  141. package/dist/finance/accounting/verification.d.mts +24 -0
  142. package/dist/finance/accounting/verification.mjs +386 -0
  143. package/dist/finance/bizsim.d.mts +21 -39
  144. package/dist/finance/bizsim.mjs +276 -97
  145. package/dist/finance/index.d.mts +20 -43
  146. package/dist/finance/index.mjs +19 -77
  147. package/dist/finance/investment-math.d.mts +7 -0
  148. package/dist/finance/investment-math.mjs +18 -0
  149. package/dist/finance/management-accounting/budgeting.d.mts +7 -0
  150. package/dist/finance/management-accounting/budgeting.mjs +189 -0
  151. package/dist/finance/management-accounting/cash-budget.d.mts +7 -0
  152. package/dist/finance/management-accounting/cash-budget.mjs +154 -0
  153. package/dist/finance/management-accounting/costing.d.mts +8 -0
  154. package/dist/finance/management-accounting/costing.mjs +175 -0
  155. package/dist/finance/management-accounting/decisions.d.mts +8 -0
  156. package/dist/finance/management-accounting/decisions.mjs +164 -0
  157. package/dist/finance/management-accounting/index.d.mts +13 -0
  158. package/dist/finance/management-accounting/index.mjs +13 -0
  159. package/dist/finance/management-accounting/integrated-budget.d.mts +8 -0
  160. package/dist/finance/management-accounting/integrated-budget.mjs +67 -0
  161. package/dist/finance/management-accounting/inventory-costing.d.mts +7 -0
  162. package/dist/finance/management-accounting/inventory-costing.mjs +173 -0
  163. package/dist/finance/management-accounting/investment-appraisal.d.mts +7 -0
  164. package/dist/finance/management-accounting/investment-appraisal.mjs +148 -0
  165. package/dist/finance/management-accounting/management-case.d.mts +8 -0
  166. package/dist/finance/management-accounting/management-case.mjs +91 -0
  167. package/dist/finance/management-accounting/master-budget.d.mts +7 -0
  168. package/dist/finance/management-accounting/master-budget.mjs +137 -0
  169. package/dist/finance/management-accounting/production-costing.d.mts +8 -0
  170. package/dist/finance/management-accounting/production-costing.mjs +214 -0
  171. package/dist/finance/management-accounting/types.d.mts +644 -0
  172. package/dist/finance/management-accounting/variances.d.mts +7 -0
  173. package/dist/finance/management-accounting/variances.mjs +150 -0
  174. package/dist/index.d.mts +6 -6
  175. package/dist/index.mjs +1 -1
  176. package/dist/math/analysis.d.mts +61 -0
  177. package/dist/math/analysis.mjs +187 -0
  178. package/dist/math/answer-check.d.mts +50 -0
  179. package/dist/math/answer-check.mjs +106 -0
  180. package/dist/math/calculus.d.mts +4 -9
  181. package/dist/math/calculus.mjs +216 -7
  182. package/dist/math/complex.d.mts +93 -0
  183. package/dist/math/complex.mjs +239 -0
  184. package/dist/math/expr.d.mts +23 -0
  185. package/dist/math/expr.mjs +36 -0
  186. package/dist/math/index.d.mts +8 -22
  187. package/dist/math/index.mjs +8 -37
  188. package/dist/math/latex.mjs +2 -1
  189. package/dist/math/parse.mjs +1 -1
  190. package/dist/math/poly.d.mts +55 -0
  191. package/dist/math/poly.mjs +273 -0
  192. package/dist/math/rearrange.d.mts +14 -0
  193. package/dist/math/rearrange.mjs +125 -0
  194. package/dist/math/solve.d.mts +21 -0
  195. package/dist/math/solve.mjs +75 -0
  196. package/dist/networking/addressing.d.mts +26 -0
  197. package/dist/networking/addressing.mjs +33 -0
  198. package/dist/networking/cloud/access.d.mts +36 -0
  199. package/dist/networking/cloud/access.mjs +95 -0
  200. package/dist/networking/cloud/containers.d.mts +43 -0
  201. package/dist/networking/cloud/containers.mjs +54 -0
  202. package/dist/networking/cloud/edge.d.mts +17 -0
  203. package/dist/networking/cloud/edge.mjs +31 -0
  204. package/dist/networking/cloud/failure-domains.d.mts +19 -0
  205. package/dist/networking/cloud/failure-domains.mjs +22 -0
  206. package/dist/networking/cloud/geo-routing.d.mts +22 -0
  207. package/dist/networking/cloud/geo-routing.mjs +64 -0
  208. package/dist/networking/cloud/index.d.mts +18 -0
  209. package/dist/networking/cloud/index.mjs +19 -0
  210. package/dist/networking/cloud/inference-reliability.d.mts +30 -0
  211. package/dist/networking/cloud/inference-reliability.mjs +76 -0
  212. package/dist/networking/cloud/inference.d.mts +118 -0
  213. package/dist/networking/cloud/inference.mjs +179 -0
  214. package/dist/networking/cloud/infrastructure.d.mts +45 -0
  215. package/dist/networking/cloud/infrastructure.mjs +96 -0
  216. package/dist/networking/cloud/observability.d.mts +24 -0
  217. package/dist/networking/cloud/observability.mjs +34 -0
  218. package/dist/networking/cloud/orchestration.d.mts +32 -0
  219. package/dist/networking/cloud/orchestration.mjs +38 -0
  220. package/dist/networking/cloud/recovery.d.mts +21 -0
  221. package/dist/networking/cloud/recovery.mjs +27 -0
  222. package/dist/networking/cloud/releases.d.mts +42 -0
  223. package/dist/networking/cloud/releases.mjs +135 -0
  224. package/dist/networking/cloud/scaling.d.mts +25 -0
  225. package/dist/networking/cloud/scaling.mjs +65 -0
  226. package/dist/networking/cloud/secrets.d.mts +39 -0
  227. package/dist/networking/cloud/secrets.mjs +68 -0
  228. package/dist/networking/cloud/server-deployment.d.mts +29 -0
  229. package/dist/networking/cloud/server-deployment.mjs +72 -0
  230. package/dist/networking/cloud/storage.d.mts +16 -0
  231. package/dist/networking/cloud/storage.mjs +58 -0
  232. package/dist/networking/cloud/vpc.d.mts +18 -0
  233. package/dist/networking/cloud/vpc.mjs +100 -0
  234. package/dist/networking/delivery.d.mts +34 -0
  235. package/dist/networking/delivery.mjs +52 -0
  236. package/dist/networking/index.d.mts +47 -0
  237. package/dist/networking/index.mjs +47 -0
  238. package/dist/networking/ipv6.d.mts +28 -0
  239. package/dist/networking/ipv6.mjs +17 -0
  240. package/dist/networking/journeys.d.mts +83 -0
  241. package/dist/networking/journeys.mjs +161 -0
  242. package/dist/networking/models/airtime.d.mts +87 -0
  243. package/dist/networking/models/airtime.mjs +130 -0
  244. package/dist/networking/models/cellular.d.mts +157 -0
  245. package/dist/networking/models/cellular.mjs +252 -0
  246. package/dist/networking/models/encapsulation.d.mts +98 -0
  247. package/dist/networking/models/encapsulation.mjs +132 -0
  248. package/dist/networking/models/handover.d.mts +116 -0
  249. package/dist/networking/models/handover.mjs +209 -0
  250. package/dist/networking/models/handshake.d.mts +90 -0
  251. package/dist/networking/models/handshake.mjs +122 -0
  252. package/dist/networking/models/index.d.mts +14 -0
  253. package/dist/networking/models/index.mjs +15 -0
  254. package/dist/networking/models/media.d.mts +82 -0
  255. package/dist/networking/models/media.mjs +188 -0
  256. package/dist/networking/models/satellite.d.mts +86 -0
  257. package/dist/networking/models/satellite.mjs +121 -0
  258. package/dist/networking/models/spectrum.d.mts +83 -0
  259. package/dist/networking/models/spectrum.mjs +235 -0
  260. package/dist/networking/models/switch.d.mts +80 -0
  261. package/dist/networking/models/switch.mjs +155 -0
  262. package/dist/networking/models/vlan.d.mts +62 -0
  263. package/dist/networking/models/vlan.mjs +100 -0
  264. package/dist/networking/models/vpn.d.mts +66 -0
  265. package/dist/networking/models/vpn.mjs +125 -0
  266. package/dist/networking/models/wifi-privacy.d.mts +82 -0
  267. package/dist/networking/models/wifi-privacy.mjs +130 -0
  268. package/dist/networking/models/wifi.d.mts +240 -0
  269. package/dist/networking/models/wifi.mjs +562 -0
  270. package/dist/networking/nat-traversal.d.mts +24 -0
  271. package/dist/networking/nat-traversal.mjs +38 -0
  272. package/dist/networking/protocols.d.mts +17 -0
  273. package/dist/networking/protocols.mjs +57 -0
  274. package/dist/networking/queue.d.mts +12 -0
  275. package/dist/networking/queue.mjs +18 -0
  276. package/dist/networking/route-learning.d.mts +23 -0
  277. package/dist/networking/route-learning.mjs +43 -0
  278. package/dist/networking/routing.d.mts +11 -0
  279. package/dist/networking/routing.mjs +25 -0
  280. package/dist/networking/signals.d.mts +26 -0
  281. package/dist/networking/signals.mjs +35 -0
  282. package/dist/networking/subnet.d.mts +49 -0
  283. package/dist/networking/subnet.mjs +89 -0
  284. package/dist/networking/tcp-reliability.d.mts +24 -0
  285. package/dist/networking/tcp-reliability.mjs +38 -0
  286. package/dist/networking/topology/contract.d.mts +123 -0
  287. package/dist/networking/topology/index.d.mts +4 -0
  288. package/dist/networking/topology/index.mjs +4 -0
  289. package/dist/networking/topology/presets.d.mts +7 -0
  290. package/dist/networking/topology/presets.mjs +302 -0
  291. package/dist/networking/topology/simulation.d.mts +8 -0
  292. package/dist/networking/topology/simulation.mjs +179 -0
  293. package/dist/networking/wireless.d.mts +11 -0
  294. package/dist/networking/wireless.mjs +17 -0
  295. package/dist/optics/imaging.d.mts +218 -0
  296. package/dist/optics/imaging.mjs +276 -0
  297. package/dist/optics/index.d.mts +7 -0
  298. package/dist/optics/index.mjs +8 -0
  299. package/dist/optics/laws.d.mts +70 -0
  300. package/dist/optics/laws.mjs +195 -0
  301. package/dist/optics/prism.d.mts +148 -0
  302. package/dist/optics/prism.mjs +197 -0
  303. package/dist/optics/refraction.d.mts +201 -0
  304. package/dist/optics/refraction.mjs +270 -0
  305. package/dist/optics/wave-optics.d.mts +171 -0
  306. package/dist/optics/wave-optics.mjs +259 -0
  307. package/dist/physics/ac/index.d.mts +183 -0
  308. package/dist/physics/ac/index.mjs +203 -0
  309. package/dist/physics/dynamics/forces.d.mts +98 -0
  310. package/dist/physics/dynamics/forces.mjs +153 -0
  311. package/dist/physics/dynamics/friction.d.mts +76 -0
  312. package/dist/physics/dynamics/friction.mjs +119 -0
  313. package/dist/physics/dynamics/system.d.mts +68 -0
  314. package/dist/physics/dynamics/system.mjs +125 -0
  315. package/dist/physics/electrostatics/index.d.mts +169 -0
  316. package/dist/physics/electrostatics/index.mjs +249 -0
  317. package/dist/physics/energy/centre-of-mass.d.mts +115 -0
  318. package/dist/physics/energy/centre-of-mass.mjs +180 -0
  319. package/dist/physics/energy/conservation.d.mts +81 -0
  320. package/dist/physics/energy/conservation.mjs +129 -0
  321. package/dist/physics/energy/power.d.mts +90 -0
  322. package/dist/physics/energy/power.mjs +167 -0
  323. package/dist/physics/energy/spring.d.mts +73 -0
  324. package/dist/physics/energy/spring.mjs +129 -0
  325. package/dist/physics/energy/store.d.mts +63 -0
  326. package/dist/physics/energy/store.mjs +108 -0
  327. package/dist/physics/energy/theorem.d.mts +65 -0
  328. package/dist/physics/energy/theorem.mjs +113 -0
  329. package/dist/physics/energy/work.d.mts +114 -0
  330. package/dist/physics/energy/work.mjs +219 -0
  331. package/dist/physics/gravitation/body.d.mts +85 -0
  332. package/dist/physics/gravitation/body.mjs +168 -0
  333. package/dist/physics/gravitation/kepler.d.mts +127 -0
  334. package/dist/physics/gravitation/kepler.mjs +216 -0
  335. package/dist/physics/gravitation/law.d.mts +117 -0
  336. package/dist/physics/gravitation/law.mjs +175 -0
  337. package/dist/physics/gravitation/orbit.d.mts +119 -0
  338. package/dist/physics/gravitation/orbit.mjs +202 -0
  339. package/dist/physics/gravitation/potential.d.mts +114 -0
  340. package/dist/physics/gravitation/potential.mjs +202 -0
  341. package/dist/physics/gravitation/variation.d.mts +97 -0
  342. package/dist/physics/gravitation/variation.mjs +175 -0
  343. package/dist/physics/index.d.mts +35 -0
  344. package/dist/physics/index.mjs +36 -0
  345. package/dist/physics/integral-sweep.d.mts +63 -0
  346. package/dist/physics/integral-sweep.mjs +126 -0
  347. package/dist/physics/kinematics/equations.d.mts +47 -0
  348. package/dist/physics/kinematics/equations.mjs +126 -0
  349. package/dist/physics/kinematics/free-fall.d.mts +53 -0
  350. package/dist/physics/kinematics/free-fall.mjs +71 -0
  351. package/dist/physics/kinematics/given.d.mts +16 -0
  352. package/dist/physics/kinematics/given.mjs +55 -0
  353. package/dist/physics/kinematics/roots.d.mts +41 -0
  354. package/dist/physics/kinematics/roots.mjs +72 -0
  355. package/dist/physics/kinematics/solve.d.mts +52 -0
  356. package/dist/physics/kinematics/solve.mjs +172 -0
  357. package/dist/physics/magnetism/biot-savart.d.mts +161 -0
  358. package/dist/physics/magnetism/biot-savart.mjs +353 -0
  359. package/dist/physics/magnetism/flux.d.mts +94 -0
  360. package/dist/physics/magnetism/flux.mjs +313 -0
  361. package/dist/physics/magnetism/geomagnetism.d.mts +151 -0
  362. package/dist/physics/magnetism/geomagnetism.mjs +184 -0
  363. package/dist/physics/magnetism/index.d.mts +12 -0
  364. package/dist/physics/magnetism/index.mjs +74 -0
  365. package/dist/physics/magnetism/lorentz.d.mts +28 -0
  366. package/dist/physics/magnetism/lorentz.mjs +88 -0
  367. package/dist/physics/magnetism/magnetic-force.d.mts +102 -0
  368. package/dist/physics/magnetism/magnetic-force.mjs +169 -0
  369. package/dist/physics/momentum/collide.d.mts +77 -0
  370. package/dist/physics/momentum/collide.mjs +115 -0
  371. package/dist/physics/momentum/impulse.d.mts +89 -0
  372. package/dist/physics/momentum/impulse.mjs +159 -0
  373. package/dist/physics/momentum/planar.d.mts +60 -0
  374. package/dist/physics/momentum/planar.mjs +110 -0
  375. package/dist/physics/projectile.d.mts +107 -0
  376. package/dist/physics/projectile.mjs +185 -0
  377. package/dist/physics/rotation/angular.d.mts +85 -0
  378. package/dist/physics/rotation/angular.mjs +130 -0
  379. package/dist/physics/rotation/circular.d.mts +79 -0
  380. package/dist/physics/rotation/circular.mjs +131 -0
  381. package/dist/physics/rotation/inertia.d.mts +164 -0
  382. package/dist/physics/rotation/inertia.mjs +332 -0
  383. package/dist/physics/rotation/torque.d.mts +65 -0
  384. package/dist/physics/rotation/torque.mjs +134 -0
  385. package/dist/physics/vectors.d.mts +64 -0
  386. package/dist/physics/vectors.mjs +114 -0
  387. package/dist/quantity/index.d.mts +119 -0
  388. package/dist/quantity/index.mjs +417 -0
  389. package/dist/relation/derive.d.mts +74 -0
  390. package/dist/relation/derive.mjs +73 -0
  391. package/dist/relation/index.d.mts +56 -0
  392. package/dist/relation/index.mjs +234 -0
  393. package/dist/scene/evaluators.mjs +1 -1
  394. package/dist/sim/thermal.mjs +45 -20
  395. package/dist/thermo/calorimetry.d.mts +207 -0
  396. package/dist/thermo/calorimetry.mjs +345 -0
  397. package/dist/thermo/cycles.d.mts +142 -0
  398. package/dist/thermo/cycles.mjs +256 -0
  399. package/dist/thermo/entropy.d.mts +87 -0
  400. package/dist/thermo/entropy.mjs +140 -0
  401. package/dist/thermo/expansion.d.mts +130 -0
  402. package/dist/thermo/expansion.mjs +178 -0
  403. package/dist/thermo/gas.d.mts +197 -0
  404. package/dist/thermo/gas.mjs +279 -0
  405. package/dist/thermo/heat-transfer.d.mts +164 -0
  406. package/dist/thermo/heat-transfer.mjs +217 -0
  407. package/dist/thermo/index.d.mts +9 -82
  408. package/dist/thermo/index.mjs +9 -132
  409. package/dist/thermo/processes.d.mts +95 -0
  410. package/dist/thermo/processes.mjs +154 -0
  411. package/dist/thermo/temperature.d.mts +174 -0
  412. package/dist/thermo/temperature.mjs +236 -0
  413. package/dist/waves/damping.d.mts +224 -0
  414. package/dist/waves/damping.mjs +317 -0
  415. package/dist/waves/doppler.d.mts +72 -0
  416. package/dist/waves/doppler.mjs +125 -0
  417. package/dist/waves/index.d.mts +10 -0
  418. package/dist/waves/index.mjs +10 -0
  419. package/dist/waves/pendulum.d.mts +130 -0
  420. package/dist/waves/pendulum.mjs +211 -0
  421. package/dist/waves/pitch.d.mts +125 -0
  422. package/dist/waves/pitch.mjs +158 -0
  423. package/dist/waves/shm.d.mts +170 -0
  424. package/dist/waves/shm.mjs +279 -0
  425. package/dist/waves/springs.d.mts +103 -0
  426. package/dist/waves/springs.mjs +176 -0
  427. package/dist/waves/superposition.d.mts +124 -0
  428. package/dist/waves/superposition.mjs +196 -0
  429. package/dist/waves/wave.d.mts +154 -0
  430. package/dist/waves/wave.mjs +178 -0
  431. package/package.json +74 -2
@@ -1,117 +1,296 @@
1
+ import { solveJournal } from "./accounting/solve.mjs";
2
+
1
3
  //#region src/finance/bizsim.ts
2
- const initialBiz = (over = {}) => ({
3
- cash: 0,
4
- inventoryQty: 0,
5
- inventoryValue: 0,
6
- equipment: 0,
7
- loan: 0,
8
- capital: 0,
9
- retained: 0,
10
- revenue: 0,
11
- cogs: 0,
12
- expenses: 0,
13
- ...over
14
- });
15
- /** Apply one action; pure and balance-preserving (assets = liabilities + equity). */
16
- function applyBiz(s, a) {
17
- switch (a.type) {
18
- case "invest": return {
19
- ...s,
20
- cash: s.cash + a.amount,
21
- capital: s.capital + a.amount
22
- };
23
- case "loan": return {
24
- ...s,
25
- cash: s.cash + a.amount,
26
- loan: s.loan + a.amount
27
- };
28
- case "repay": return {
29
- ...s,
30
- cash: s.cash - a.amount,
31
- loan: s.loan - a.amount
32
- };
33
- case "buyEquipment": return {
34
- ...s,
35
- cash: s.cash - a.amount,
36
- equipment: s.equipment + a.amount
37
- };
38
- case "depreciate": return {
39
- ...s,
40
- equipment: s.equipment - a.amount,
41
- expenses: s.expenses + a.amount
42
- };
43
- case "buyStock": return {
44
- ...s,
45
- cash: s.cash - a.qty * a.unitCost,
46
- inventoryQty: s.inventoryQty + a.qty,
47
- inventoryValue: s.inventoryValue + a.qty * a.unitCost
48
- };
4
+ const BIZ_ACCOUNTS = [
5
+ {
6
+ id: "cash",
7
+ name: "Cash",
8
+ category: "Asset"
9
+ },
10
+ {
11
+ id: "inventory",
12
+ name: "Inventory",
13
+ category: "Asset"
14
+ },
15
+ {
16
+ id: "equipment",
17
+ name: "Equipment",
18
+ category: "Asset"
19
+ },
20
+ {
21
+ id: "loan",
22
+ name: "Loan",
23
+ category: "Liability"
24
+ },
25
+ {
26
+ id: "capital",
27
+ name: "Capital",
28
+ category: "Equity"
29
+ },
30
+ {
31
+ id: "retained",
32
+ name: "Retained earnings",
33
+ category: "Equity"
34
+ },
35
+ {
36
+ id: "revenue",
37
+ name: "Revenue",
38
+ category: "Income"
39
+ },
40
+ {
41
+ id: "cogs",
42
+ name: "Cost of sales",
43
+ category: "Expense"
44
+ },
45
+ {
46
+ id: "expenses",
47
+ name: "Operating expenses",
48
+ category: "Expense"
49
+ }
50
+ ];
51
+ function amount(value, label, allowZero = false) {
52
+ if (!Number.isFinite(value) || (allowZero ? value < 0 : value <= 0)) throw new RangeError(`${label} must be ${allowZero ? "non-negative" : "positive"} and finite.`);
53
+ return value;
54
+ }
55
+ function journal(id, narration, debit, credit, value) {
56
+ return {
57
+ id,
58
+ narration,
59
+ lines: [{
60
+ accountId: debit,
61
+ side: "debit",
62
+ amount: value
63
+ }, {
64
+ accountId: credit,
65
+ side: "credit",
66
+ amount: value
67
+ }]
68
+ };
69
+ }
70
+ function books(state) {
71
+ const solution = solveJournal({
72
+ accounts: BIZ_ACCOUNTS,
73
+ entries: state.entries
74
+ });
75
+ if (solution.rejectedEntries.length > 0 || !solution.trialBalance.balances || !solution.equation.balances) throw new Error("Business simulation contains invalid journal data.");
76
+ return solution;
77
+ }
78
+ function natural(solution, accountId) {
79
+ return solution.ledger.find((account) => account.id === accountId)?.normalBalance ?? 0;
80
+ }
81
+ function append(state, entry, inventoryQty = state.inventoryQty) {
82
+ return {
83
+ entries: [...state.entries, entry],
84
+ inventoryQty,
85
+ nextEntryNumber: state.nextEntryNumber + 1
86
+ };
87
+ }
88
+ function actionId(state, type) {
89
+ return `biz-${state.nextEntryNumber}-${type}`;
90
+ }
91
+ function initialBiz(opening = {}) {
92
+ const cash = amount(opening.cash ?? 0, "Opening cash", true);
93
+ const inventoryQty = amount(opening.inventoryQty ?? 0, "Opening inventory quantity", true);
94
+ const inventoryValue = amount(opening.inventoryValue ?? 0, "Opening inventory value", true);
95
+ const equipment = amount(opening.equipment ?? 0, "Opening equipment", true);
96
+ const loan = amount(opening.loan ?? 0, "Opening loan", true);
97
+ const retained = opening.retained ?? 0;
98
+ if (!Number.isFinite(retained)) throw new RangeError("Opening retained earnings must be finite.");
99
+ const inferredCapital = cash + inventoryValue + equipment - loan - retained;
100
+ const capital = opening.capital ?? inferredCapital;
101
+ if (!Number.isFinite(capital)) throw new RangeError("Opening capital must be finite.");
102
+ if (Math.abs(cash + inventoryValue + equipment - loan - capital - retained) >= .005) throw new Error("Opening balances do not satisfy Assets = Liabilities + Equity.");
103
+ if (inventoryQty === 0 && inventoryValue !== 0) throw new Error("Opening inventory value requires a positive inventory quantity.");
104
+ const lines = [];
105
+ for (const [accountId, value, side] of [
106
+ [
107
+ "cash",
108
+ cash,
109
+ "debit"
110
+ ],
111
+ [
112
+ "inventory",
113
+ inventoryValue,
114
+ "debit"
115
+ ],
116
+ [
117
+ "equipment",
118
+ equipment,
119
+ "debit"
120
+ ],
121
+ [
122
+ "loan",
123
+ loan,
124
+ "credit"
125
+ ],
126
+ [
127
+ "capital",
128
+ capital,
129
+ capital >= 0 ? "credit" : "debit"
130
+ ],
131
+ [
132
+ "retained",
133
+ retained,
134
+ retained >= 0 ? "credit" : "debit"
135
+ ]
136
+ ]) if (value !== 0) lines.push({
137
+ accountId,
138
+ side,
139
+ amount: Math.abs(value)
140
+ });
141
+ const state = {
142
+ entries: lines.length === 0 ? [] : [{
143
+ id: "biz-opening",
144
+ narration: "Opening balances",
145
+ lines
146
+ }],
147
+ inventoryQty,
148
+ nextEntryNumber: 1
149
+ };
150
+ books(state);
151
+ return state;
152
+ }
153
+ function applyBiz(state, action) {
154
+ const solution = books(state);
155
+ const id = actionId(state, action.type);
156
+ switch (action.type) {
157
+ case "invest": return append(state, journal(id, "Owner investment", "cash", "capital", amount(action.amount, "Investment")));
158
+ case "loan": return append(state, journal(id, "Loan received", "cash", "loan", amount(action.amount, "Loan proceeds")));
159
+ case "repay": {
160
+ const value = amount(action.amount, "Loan repayment");
161
+ if (value > natural(solution, "loan")) throw new RangeError("Loan repayment exceeds the outstanding loan.");
162
+ return append(state, journal(id, "Loan principal repaid", "loan", "cash", value));
163
+ }
164
+ case "buyEquipment": return append(state, journal(id, "Equipment purchased for cash", "equipment", "cash", amount(action.amount, "Equipment purchase")));
165
+ case "depreciate": {
166
+ const value = amount(action.amount, "Depreciation");
167
+ if (value > natural(solution, "equipment")) throw new RangeError("Depreciation exceeds equipment book value.");
168
+ return append(state, journal(id, "Depreciation charged", "expenses", "equipment", value));
169
+ }
170
+ case "buyStock": {
171
+ const quantity = amount(action.qty, "Stock quantity");
172
+ const cost = quantity * amount(action.unitCost, "Stock unit cost", true);
173
+ if (cost === 0) throw new RangeError("A stock purchase must have a positive total cost.");
174
+ return append(state, journal(id, "Inventory purchased for cash", "inventory", "cash", cost), state.inventoryQty + quantity);
175
+ }
49
176
  case "sell": {
50
- const avg = s.inventoryQty > 0 ? s.inventoryValue / s.inventoryQty : 0;
51
- const qty = Math.min(a.qty, s.inventoryQty);
52
- const cost = qty * avg, sales = qty * a.price;
53
- return {
54
- ...s,
55
- cash: s.cash + sales,
56
- revenue: s.revenue + sales,
57
- cogs: s.cogs + cost,
58
- inventoryQty: s.inventoryQty - qty,
59
- inventoryValue: s.inventoryValue - cost
60
- };
177
+ const quantity = amount(action.qty, "Sale quantity");
178
+ const price = amount(action.price, "Sale price", true);
179
+ if (quantity > state.inventoryQty) throw new RangeError("Sale quantity exceeds inventory on hand.");
180
+ const inventoryValue = natural(solution, "inventory");
181
+ const cost = quantity * (state.inventoryQty === 0 ? 0 : inventoryValue / state.inventoryQty);
182
+ const sales = quantity * price;
183
+ if (sales <= 0) throw new RangeError("A sale must have positive revenue.");
184
+ const lines = [{
185
+ accountId: "cash",
186
+ side: "debit",
187
+ amount: sales
188
+ }, {
189
+ accountId: "revenue",
190
+ side: "credit",
191
+ amount: sales
192
+ }];
193
+ if (cost > 0) lines.push({
194
+ accountId: "cogs",
195
+ side: "debit",
196
+ amount: cost
197
+ }, {
198
+ accountId: "inventory",
199
+ side: "credit",
200
+ amount: cost
201
+ });
202
+ return append(state, {
203
+ id,
204
+ narration: "Inventory sold for cash",
205
+ lines
206
+ }, state.inventoryQty - quantity);
61
207
  }
62
- case "expense": return {
63
- ...s,
64
- cash: s.cash - a.amount,
65
- expenses: s.expenses + a.amount
66
- };
208
+ case "expense": return append(state, journal(id, "Operating expense paid", "expenses", "cash", amount(action.amount, "Expense")));
67
209
  case "closePeriod": {
68
- const net = s.revenue - s.cogs - s.expenses;
69
- return {
70
- ...s,
71
- retained: s.retained + net,
72
- revenue: 0,
73
- cogs: 0,
74
- expenses: 0
75
- };
210
+ const revenue = natural(solution, "revenue");
211
+ const cogs = natural(solution, "cogs");
212
+ const expenses = natural(solution, "expenses");
213
+ if (revenue === 0 && cogs === 0 && expenses === 0) return state;
214
+ const netProfit = revenue - cogs - expenses;
215
+ const lines = [];
216
+ if (revenue > 0) lines.push({
217
+ accountId: "revenue",
218
+ side: "debit",
219
+ amount: revenue
220
+ });
221
+ if (cogs > 0) lines.push({
222
+ accountId: "cogs",
223
+ side: "credit",
224
+ amount: cogs
225
+ });
226
+ if (expenses > 0) lines.push({
227
+ accountId: "expenses",
228
+ side: "credit",
229
+ amount: expenses
230
+ });
231
+ if (netProfit > 0) lines.push({
232
+ accountId: "retained",
233
+ side: "credit",
234
+ amount: netProfit
235
+ });
236
+ else if (netProfit < 0) lines.push({
237
+ accountId: "retained",
238
+ side: "debit",
239
+ amount: Math.abs(netProfit)
240
+ });
241
+ return append(state, {
242
+ id,
243
+ narration: "Close income and expenses to retained earnings",
244
+ lines
245
+ });
76
246
  }
77
- default: return s;
78
247
  }
79
248
  }
80
- /** Run a whole authored scenario from an (optional) starting state. */
81
- function runBiz(actions, init = {}) {
82
- return actions.reduce(applyBiz, initialBiz(init));
249
+ function runBiz(actions, opening = {}) {
250
+ return actions.reduce(applyBiz, initialBiz(opening));
83
251
  }
84
- /** Income statement for the current open period. */
85
- function incomeStatement(s) {
86
- const grossProfit = s.revenue - s.cogs;
252
+ function incomeStatement(state) {
253
+ const solution = books(state);
254
+ const revenue = natural(solution, "revenue");
255
+ const cogs = natural(solution, "cogs");
256
+ const expenses = natural(solution, "expenses");
257
+ const grossProfit = revenue - cogs;
87
258
  return {
88
- revenue: s.revenue,
89
- cogs: s.cogs,
259
+ revenue,
260
+ cogs,
90
261
  grossProfit,
91
- expenses: s.expenses,
92
- netProfit: grossProfit - s.expenses
262
+ expenses,
263
+ netProfit: grossProfit - expenses
93
264
  };
94
265
  }
95
- /** Balance sheet; `balances` is always true by construction (a self-check). */
96
- function balanceSheet(s) {
97
- const totalAssets = s.cash + s.inventoryValue + s.equipment;
98
- const openProfit = s.revenue - s.cogs - s.expenses;
99
- const totalEquity = s.capital + s.retained + openProfit;
100
- const totalLiabilitiesEquity = s.loan + totalEquity;
266
+ function balanceSheet(state) {
267
+ const solution = books(state);
268
+ const cash = natural(solution, "cash");
269
+ const inventory = natural(solution, "inventory");
270
+ const equipment = natural(solution, "equipment");
271
+ const loan = natural(solution, "loan");
272
+ const capital = natural(solution, "capital");
273
+ const retained = natural(solution, "retained");
274
+ const openProfit = solution.equation.profit;
275
+ const totalAssets = cash + inventory + equipment;
276
+ const totalEquity = capital + retained + openProfit;
101
277
  return {
102
- cash: s.cash,
103
- inventory: s.inventoryValue,
104
- equipment: s.equipment,
278
+ cash,
279
+ inventory,
280
+ equipment,
105
281
  totalAssets,
106
- loan: s.loan,
107
- capital: s.capital,
108
- retained: s.retained,
282
+ loan,
283
+ capital,
284
+ retained,
109
285
  openProfit,
110
286
  totalEquity,
111
- totalLiabilitiesEquity,
112
- balances: Math.abs(totalAssets - totalLiabilitiesEquity) < 1e-6
287
+ totalLiabilitiesEquity: loan + totalEquity,
288
+ balances: solution.trialBalance.balances && solution.equation.balances
113
289
  };
114
290
  }
291
+ function businessBooks(state) {
292
+ return books(state);
293
+ }
115
294
 
116
295
  //#endregion
117
- export { applyBiz, balanceSheet, incomeStatement, initialBiz, runBiz };
296
+ export { applyBiz, balanceSheet, businessBooks, incomeStatement, initialBiz, runBiz };
@@ -1,4 +1,22 @@
1
- import { BalanceSheet, BizAction, BizState, IncomeStatement, applyBiz, balanceSheet, incomeStatement, initialBiz, runBiz } from "./bizsim.mjs";
1
+ import { AccountCategory, AccountDefinition, AccountRole, AccountingCase, AccountingCaseResult, AccountingCheck, AccountingDiagnostic, AccountingEquation, AccountingExpectation, AccountingPolicy, AccountingSolution, AdjustmentFact, AdjustmentResult, BankReconciliationItem, BankReconciliationResult, BusinessEvent, ClubMember, ClubMemberState, ClubMemberTiming, ClubStatementFacts, ClubStatementResult, ClubSubscriptionResult, ControlAccountFacts, ControlAccountResult, ExplanationStep, FinancialAnalysisComparison, FinancialAnalysisFacts, FinancialAnalysisResult, FinancialRatioAssessment, FinancialRatioBenchmark, FinancialRatioFamily, FinancialRatioKey, FinancialRatioMetric, FinancialStatements, JournalEntry, JournalLine, LedgerAccount, LedgerPosting, LimitedCompanyStatementFacts, LimitedCompanyStatementResult, ManufacturingAccountFacts, ManufacturingAccountResult, ManufacturingFlowStage, ManufacturingTradingFacts, ManufacturingTradingResult, PartnerAppropriation, PartnerFacts, PartnershipAgreement, PartnershipResult, PostingSide, SoleTraderPeriodCase, SoleTraderPeriodResult, SoleTraderStatementFacts, SoleTraderStatementResult, StatementLine, StatementSection, SuspenseCorrectionFact, SuspenseDiscoveredError, SuspenseMovement, SuspenseReconstructionFacts, SuspenseReconstructionResult, TrialBalance, TrialBalanceErrorDiagnosis, TrialBalanceErrorType, TrialBalanceLine } from "./accounting/types.mjs";
2
+ import { DEFAULT_ACCOUNTING_POLICY, amountScale, fromMinor, toMinor } from "./accounting/precision.mjs";
3
+ import { changeSide, deriveNaturalEquation, normalBalance, statementOf, totalsBalance } from "./accounting/rules.mjs";
4
+ import { validateChart, validateJournalEntry } from "./accounting/validate.mjs";
5
+ import { journalizeBusinessEvent, journalizeBusinessEvents } from "./accounting/journalize.mjs";
6
+ import { applyAdjustments, produceAdjustment } from "./accounting/adjustments.mjs";
7
+ import { createSuspenseCorrection, diagnoseTrialBalanceError, reconcileBank, reconstructSuspenseAccount, solveControlAccount } from "./accounting/verification.mjs";
8
+ import { solveCashSettledSoleTraderScenario, solveSoleTraderStatements } from "./accounting/statements.mjs";
9
+ import { salaryForEqualPartnershipShares, solvePartnershipAppropriation } from "./accounting/partnership.mjs";
10
+ import { solveDividendSettledCompanyScenario, solveLimitedCompanyStatements } from "./accounting/company-statements.mjs";
11
+ import { CLUB_MEMBER_STATES, clubMemberCrossesYear, clubMemberTiming, solveClubStatements, solveClubSubscriptions } from "./accounting/clubs.mjs";
12
+ import { solveManufacturingAccount, solveManufacturingTradingFlow } from "./accounting/manufacturing.mjs";
13
+ import { solveSoleTraderPeriod } from "./accounting/period-case.mjs";
14
+ import { analyzeFinancialPerformance, assessFinancialPerformance, compareFinancialPerformance } from "./accounting/analysis.mjs";
15
+ import { runAccountingCase } from "./accounting/harness.mjs";
16
+ import { deriveEquation, deriveStatements, deriveTrialBalance, postLedger } from "./accounting/post.mjs";
17
+ import { SolveJournalOptions, solveBusinessProblem, solveJournal } from "./accounting/solve.mjs";
18
+ import { BalanceSheet, BizAction, BizOpeningBalances, BizState, IncomeStatement, applyBiz, balanceSheet, businessBooks, incomeStatement, initialBiz, runBiz } from "./bizsim.mjs";
19
+ import { npv, payback } from "./investment-math.mjs";
2
20
 
3
21
  //#region src/finance/index.d.ts
4
22
  /** Simple interest I = P·r·t (interest only, not the total). */
@@ -67,52 +85,11 @@ declare function breakEven({
67
85
  declare function profitAt(units: number, m: CostModel): number;
68
86
  /** Margin of safety = actual output − break-even output (units). */
69
87
  declare function marginOfSafety(currentUnits: number, breakEvenUnits: number): number;
70
- type InvMethod = 'fifo' | 'lifo' | 'avco';
71
- interface InvMove {
72
- type: 'buy' | 'sell';
73
- qty: number;
74
- unitCost?: number;
75
- }
76
- interface InvResult {
77
- cogs: number;
78
- closingValue: number;
79
- closingQty: number;
80
- }
81
- /** Value stock and cost of goods sold under FIFO, LIFO or weighted-average (AVCO). */
82
- declare function inventoryValue(method: InvMethod, moves: InvMove[]): InvResult;
83
88
  /** Economic order quantity: √(2·D·S / H) — demand D, order cost S, holding cost/unit H. */
84
89
  declare function eoq(annualDemand: number, orderCost: number, holdingCostPerUnit: number): number;
85
90
  /** Reorder level = usage during the lead time, plus any buffer (safety) stock. */
86
91
  declare function reorderLevel(usagePerDay: number, leadTimeDays: number, bufferStock?: number): number;
87
92
  /** Split a total cost across cost-centres in proportion to a basis (floor area sq ft, headcount, machine hours…). */
88
93
  declare function apportion(total: number, weights: number[]): number[];
89
- interface FinInputs {
90
- currentAssets: number;
91
- inventory: number;
92
- currentLiabilities: number;
93
- nonCurrentLiabilities: number;
94
- equity: number;
95
- revenue: number;
96
- costOfSales: number;
97
- expenses?: number;
98
- grossProfit?: number;
99
- netProfit?: number;
100
- capitalEmployed?: number;
101
- }
102
- interface Ratios {
103
- current: number;
104
- quick: number;
105
- gearing: number;
106
- grossMargin: number;
107
- netMargin: number;
108
- roce: number;
109
- inventoryTurnover: number;
110
- }
111
- /** Standard analysis ratios from summary figures (liquidity, gearing, profitability, efficiency). */
112
- declare function ratios(f: FinInputs): Ratios;
113
- /** Net present value; `cashflows[0]` is the initial outlay (usually negative). */
114
- declare function npv(rate: number, cashflows: number[]): number;
115
- /** Payback period in years (fractional), from year-0 outlay + yearly inflows. */
116
- declare function payback(cashflows: number[]): number;
117
94
  //#endregion
118
- export { AmortResult, AmortRow, BalanceSheet, BizAction, BizState, BreakEven, CostModel, DepRow, FinInputs, IncomeStatement, InvMethod, InvMove, InvResult, Ratios, amortize, applyBiz, apportion, balanceSheet, breakEven, compoundAmount, compoundInterest, effectiveRate, eoq, futureValue, growthSeries, incomeStatement, initialBiz, inventoryValue, marginOfSafety, npv, payback, presentValue, profitAt, ratios, reducingBalance, reorderLevel, rule72, runBiz, simpleInterest, straightLine };
95
+ export { AccountCategory, AccountDefinition, AccountRole, AccountingCase, AccountingCaseResult, AccountingCheck, AccountingDiagnostic, AccountingEquation, AccountingExpectation, AccountingPolicy, AccountingSolution, AdjustmentFact, AdjustmentResult, AmortResult, AmortRow, BalanceSheet, BankReconciliationItem, BankReconciliationResult, BizAction, BizOpeningBalances, BizState, BreakEven, BusinessEvent, CLUB_MEMBER_STATES, ClubMember, ClubMemberState, ClubMemberTiming, ClubStatementFacts, ClubStatementResult, ClubSubscriptionResult, ControlAccountFacts, ControlAccountResult, CostModel, DEFAULT_ACCOUNTING_POLICY, DepRow, ExplanationStep, FinancialAnalysisComparison, FinancialAnalysisFacts, FinancialAnalysisResult, FinancialRatioAssessment, FinancialRatioBenchmark, FinancialRatioFamily, FinancialRatioKey, FinancialRatioMetric, FinancialStatements, IncomeStatement, JournalEntry, JournalLine, LedgerAccount, LedgerPosting, LimitedCompanyStatementFacts, LimitedCompanyStatementResult, ManufacturingAccountFacts, ManufacturingAccountResult, ManufacturingFlowStage, ManufacturingTradingFacts, ManufacturingTradingResult, PartnerAppropriation, PartnerFacts, PartnershipAgreement, PartnershipResult, PostingSide, SoleTraderPeriodCase, SoleTraderPeriodResult, SoleTraderStatementFacts, SoleTraderStatementResult, SolveJournalOptions, StatementLine, StatementSection, SuspenseCorrectionFact, SuspenseDiscoveredError, SuspenseMovement, SuspenseReconstructionFacts, SuspenseReconstructionResult, TrialBalance, TrialBalanceErrorDiagnosis, TrialBalanceErrorType, TrialBalanceLine, amortize, amountScale, analyzeFinancialPerformance, applyAdjustments, applyBiz, apportion, assessFinancialPerformance, balanceSheet, breakEven, businessBooks, changeSide, clubMemberCrossesYear, clubMemberTiming, compareFinancialPerformance, compoundAmount, compoundInterest, createSuspenseCorrection, deriveEquation, deriveNaturalEquation, deriveStatements, deriveTrialBalance, diagnoseTrialBalanceError, effectiveRate, eoq, fromMinor, futureValue, growthSeries, incomeStatement, initialBiz, journalizeBusinessEvent, journalizeBusinessEvents, marginOfSafety, normalBalance, npv, payback, postLedger, presentValue, produceAdjustment, profitAt, reconcileBank, reconstructSuspenseAccount, reducingBalance, reorderLevel, rule72, runAccountingCase, runBiz, salaryForEqualPartnershipShares, simpleInterest, solveBusinessProblem, solveCashSettledSoleTraderScenario, solveClubStatements, solveClubSubscriptions, solveControlAccount, solveDividendSettledCompanyScenario, solveJournal, solveLimitedCompanyStatements, solveManufacturingAccount, solveManufacturingTradingFlow, solvePartnershipAppropriation, solveSoleTraderPeriod, solveSoleTraderStatements, statementOf, straightLine, toMinor, totalsBalance, validateChart, validateJournalEntry };
@@ -1,4 +1,21 @@
1
- import { applyBiz, balanceSheet, incomeStatement, initialBiz, runBiz } from "./bizsim.mjs";
1
+ import { journalizeBusinessEvent, journalizeBusinessEvents } from "./accounting/journalize.mjs";
2
+ import { DEFAULT_ACCOUNTING_POLICY, amountScale, fromMinor, toMinor } from "./accounting/precision.mjs";
3
+ import { changeSide, deriveNaturalEquation, normalBalance, statementOf, totalsBalance } from "./accounting/rules.mjs";
4
+ import { deriveEquation, deriveStatements, deriveTrialBalance, postLedger } from "./accounting/post.mjs";
5
+ import { validateChart, validateJournalEntry } from "./accounting/validate.mjs";
6
+ import { solveBusinessProblem, solveJournal } from "./accounting/solve.mjs";
7
+ import { applyBiz, balanceSheet, businessBooks, incomeStatement, initialBiz, runBiz } from "./bizsim.mjs";
8
+ import { applyAdjustments, produceAdjustment } from "./accounting/adjustments.mjs";
9
+ import { createSuspenseCorrection, diagnoseTrialBalanceError, reconcileBank, reconstructSuspenseAccount, solveControlAccount } from "./accounting/verification.mjs";
10
+ import { solveCashSettledSoleTraderScenario, solveSoleTraderStatements } from "./accounting/statements.mjs";
11
+ import { salaryForEqualPartnershipShares, solvePartnershipAppropriation } from "./accounting/partnership.mjs";
12
+ import { solveDividendSettledCompanyScenario, solveLimitedCompanyStatements } from "./accounting/company-statements.mjs";
13
+ import { CLUB_MEMBER_STATES, clubMemberCrossesYear, clubMemberTiming, solveClubStatements, solveClubSubscriptions } from "./accounting/clubs.mjs";
14
+ import { solveManufacturingAccount, solveManufacturingTradingFlow } from "./accounting/manufacturing.mjs";
15
+ import { solveSoleTraderPeriod } from "./accounting/period-case.mjs";
16
+ import { analyzeFinancialPerformance, assessFinancialPerformance, compareFinancialPerformance } from "./accounting/analysis.mjs";
17
+ import { runAccountingCase } from "./accounting/harness.mjs";
18
+ import { npv, payback } from "./investment-math.mjs";
2
19
 
3
20
  //#region src/finance/index.ts
4
21
  /** Simple interest I = P·r·t (interest only, not the total). */
@@ -110,52 +127,6 @@ function profitAt(units, m) {
110
127
  function marginOfSafety(currentUnits, breakEvenUnits) {
111
128
  return currentUnits - breakEvenUnits;
112
129
  }
113
- /** Value stock and cost of goods sold under FIFO, LIFO or weighted-average (AVCO). */
114
- function inventoryValue(method, moves) {
115
- let cogs = 0;
116
- if (method === "avco") {
117
- let qty = 0, val = 0;
118
- for (const m of moves) if (m.type === "buy") {
119
- qty += m.qty;
120
- val += m.qty * (m.unitCost ?? 0);
121
- } else {
122
- const avg = qty > 0 ? val / qty : 0;
123
- cogs += m.qty * avg;
124
- val -= m.qty * avg;
125
- qty -= m.qty;
126
- }
127
- return {
128
- cogs,
129
- closingValue: val,
130
- closingQty: qty
131
- };
132
- }
133
- const lots = [];
134
- for (const m of moves) {
135
- if (m.type === "buy") {
136
- lots.push({
137
- qty: m.qty,
138
- cost: m.unitCost ?? 0
139
- });
140
- continue;
141
- }
142
- let need = m.qty;
143
- while (need > 0 && lots.length) {
144
- const idx = method === "fifo" ? 0 : lots.length - 1;
145
- const lot = lots[idx];
146
- const take = Math.min(need, lot.qty);
147
- cogs += take * lot.cost;
148
- lot.qty -= take;
149
- need -= take;
150
- if (lot.qty === 0) lots.splice(idx, 1);
151
- }
152
- }
153
- return {
154
- cogs,
155
- closingValue: lots.reduce((a, l) => a + l.qty * l.cost, 0),
156
- closingQty: lots.reduce((a, l) => a + l.qty, 0)
157
- };
158
- }
159
130
  /** Economic order quantity: √(2·D·S / H) — demand D, order cost S, holding cost/unit H. */
160
131
  function eoq(annualDemand, orderCost, holdingCostPerUnit) {
161
132
  return holdingCostPerUnit > 0 ? Math.sqrt(2 * annualDemand * orderCost / holdingCostPerUnit) : Infinity;
@@ -169,35 +140,6 @@ function apportion(total, weights) {
169
140
  const sum = weights.reduce((a, b) => a + b, 0) || 1;
170
141
  return weights.map((w) => total * w / sum);
171
142
  }
172
- /** Standard analysis ratios from summary figures (liquidity, gearing, profitability, efficiency). */
173
- function ratios(f) {
174
- const grossProfit = f.grossProfit ?? f.revenue - f.costOfSales;
175
- const netProfit = f.netProfit ?? grossProfit - (f.expenses ?? 0);
176
- const capEmp = f.capitalEmployed ?? f.equity + f.nonCurrentLiabilities;
177
- return {
178
- current: f.currentAssets / f.currentLiabilities,
179
- quick: (f.currentAssets - f.inventory) / f.currentLiabilities,
180
- gearing: f.nonCurrentLiabilities / (f.equity + f.nonCurrentLiabilities),
181
- grossMargin: grossProfit / f.revenue,
182
- netMargin: netProfit / f.revenue,
183
- roce: netProfit / capEmp,
184
- inventoryTurnover: f.costOfSales / f.inventory
185
- };
186
- }
187
- /** Net present value; `cashflows[0]` is the initial outlay (usually negative). */
188
- function npv(rate, cashflows) {
189
- return cashflows.reduce((a, cf, t) => a + cf / Math.pow(1 + rate, t), 0);
190
- }
191
- /** Payback period in years (fractional), from year-0 outlay + yearly inflows. */
192
- function payback(cashflows) {
193
- let cum = 0;
194
- for (let t = 0; t < cashflows.length; t++) {
195
- const prev = cum;
196
- cum += cashflows[t];
197
- if (cum >= 0 && t > 0) return t - 1 + -prev / cashflows[t];
198
- }
199
- return Infinity;
200
- }
201
143
 
202
144
  //#endregion
203
- export { amortize, applyBiz, apportion, balanceSheet, breakEven, compoundAmount, compoundInterest, effectiveRate, eoq, futureValue, growthSeries, incomeStatement, initialBiz, inventoryValue, marginOfSafety, npv, payback, presentValue, profitAt, ratios, reducingBalance, reorderLevel, rule72, runBiz, simpleInterest, straightLine };
145
+ export { CLUB_MEMBER_STATES, DEFAULT_ACCOUNTING_POLICY, amortize, amountScale, analyzeFinancialPerformance, applyAdjustments, applyBiz, apportion, assessFinancialPerformance, balanceSheet, breakEven, businessBooks, changeSide, clubMemberCrossesYear, clubMemberTiming, compareFinancialPerformance, compoundAmount, compoundInterest, createSuspenseCorrection, deriveEquation, deriveNaturalEquation, deriveStatements, deriveTrialBalance, diagnoseTrialBalanceError, effectiveRate, eoq, fromMinor, futureValue, growthSeries, incomeStatement, initialBiz, journalizeBusinessEvent, journalizeBusinessEvents, marginOfSafety, normalBalance, npv, payback, postLedger, presentValue, produceAdjustment, profitAt, reconcileBank, reconstructSuspenseAccount, reducingBalance, reorderLevel, rule72, runAccountingCase, runBiz, salaryForEqualPartnershipShares, simpleInterest, solveBusinessProblem, solveCashSettledSoleTraderScenario, solveClubStatements, solveClubSubscriptions, solveControlAccount, solveDividendSettledCompanyScenario, solveJournal, solveLimitedCompanyStatements, solveManufacturingAccount, solveManufacturingTradingFlow, solvePartnershipAppropriation, solveSoleTraderPeriod, solveSoleTraderStatements, statementOf, straightLine, toMinor, totalsBalance, validateChart, validateJournalEntry };
@@ -0,0 +1,7 @@
1
+ //#region src/finance/investment-math.d.ts
2
+ /** Net present value; `cashflows[0]` is the initial outlay, normally negative. */
3
+ declare function npv(rate: number, cashflows: readonly number[]): number;
4
+ /** Payback period with within-period interpolation; returns Infinity when unrecovered. */
5
+ declare function payback(cashflows: readonly number[]): number;
6
+ //#endregion
7
+ export { npv, payback };
@@ -0,0 +1,18 @@
1
+ //#region src/finance/investment-math.ts
2
+ /** Net present value; `cashflows[0]` is the initial outlay, normally negative. */
3
+ function npv(rate, cashflows) {
4
+ return cashflows.reduce((total, cashflow, period) => total + cashflow / Math.pow(1 + rate, period), 0);
5
+ }
6
+ /** Payback period with within-period interpolation; returns Infinity when unrecovered. */
7
+ function payback(cashflows) {
8
+ let cumulative = 0;
9
+ for (let period = 0; period < cashflows.length; period += 1) {
10
+ const previous = cumulative;
11
+ cumulative += cashflows[period];
12
+ if (cumulative >= 0 && period > 0) return period - 1 + -previous / cashflows[period];
13
+ }
14
+ return Number.POSITIVE_INFINITY;
15
+ }
16
+
17
+ //#endregion
18
+ export { npv, payback };
@@ -0,0 +1,7 @@
1
+ import { AccountingPolicy } from "../accounting/types.mjs";
2
+ import { OperatingBudgetFacts, OperatingBudgetResult } from "./types.mjs";
3
+
4
+ //#region src/finance/management-accounting/budgeting.d.ts
5
+ declare function buildOperatingBudget(facts: OperatingBudgetFacts, policy?: AccountingPolicy): OperatingBudgetResult;
6
+ //#endregion
7
+ export { buildOperatingBudget };