oakscriptjs 0.8.1 → 0.9.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 (544) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +31 -9
  3. package/dist/cjs/array/index.d.ts +701 -0
  4. package/dist/cjs/array/index.d.ts.map +1 -0
  5. package/dist/cjs/array/index.js +392 -0
  6. package/dist/cjs/array/index.js.map +7 -0
  7. package/dist/cjs/box/index.d.ts +444 -0
  8. package/dist/cjs/box/index.d.ts.map +1 -0
  9. package/dist/cjs/box/index.js +246 -0
  10. package/dist/cjs/box/index.js.map +7 -0
  11. package/dist/cjs/callsite/index.d.ts +61 -0
  12. package/dist/cjs/callsite/index.d.ts.map +1 -0
  13. package/dist/cjs/callsite/index.js +65 -0
  14. package/dist/cjs/callsite/index.js.map +7 -0
  15. package/dist/cjs/chartpoint/index.d.ts +90 -0
  16. package/dist/cjs/chartpoint/index.d.ts.map +1 -0
  17. package/dist/cjs/chartpoint/index.js +56 -0
  18. package/dist/cjs/chartpoint/index.js.map +7 -0
  19. package/dist/cjs/color/index.d.ts +285 -0
  20. package/dist/cjs/color/index.d.ts.map +1 -0
  21. package/dist/cjs/color/index.js +143 -0
  22. package/dist/cjs/color/index.js.map +7 -0
  23. package/dist/cjs/compare/index.d.ts +26 -0
  24. package/dist/cjs/compare/index.d.ts.map +1 -0
  25. package/dist/cjs/compare/index.js +50 -0
  26. package/dist/cjs/compare/index.js.map +7 -0
  27. package/dist/cjs/drawing/registry.d.ts +42 -0
  28. package/dist/cjs/drawing/registry.d.ts.map +1 -0
  29. package/dist/cjs/drawing/registry.js +87 -0
  30. package/dist/cjs/drawing/registry.js.map +7 -0
  31. package/dist/cjs/index.d.ts +85 -0
  32. package/dist/cjs/index.d.ts.map +1 -0
  33. package/dist/cjs/index.js +184 -0
  34. package/dist/cjs/index.js.map +7 -0
  35. package/dist/cjs/indicator.d.ts +117 -0
  36. package/dist/cjs/indicator.d.ts.map +1 -0
  37. package/dist/cjs/indicator.js +74 -0
  38. package/dist/cjs/indicator.js.map +7 -0
  39. package/dist/cjs/input.d.ts +196 -0
  40. package/dist/cjs/input.d.ts.map +1 -0
  41. package/dist/cjs/input.js +197 -0
  42. package/dist/cjs/input.js.map +7 -0
  43. package/dist/cjs/label/index.d.ts +303 -0
  44. package/dist/cjs/label/index.d.ts.map +1 -0
  45. package/dist/cjs/label/index.js +190 -0
  46. package/dist/cjs/label/index.js.map +7 -0
  47. package/dist/cjs/lib/index.d.ts +8 -0
  48. package/dist/cjs/lib/index.d.ts.map +1 -0
  49. package/dist/cjs/lib/index.js +19 -0
  50. package/dist/cjs/lib/index.js.map +7 -0
  51. package/dist/{lib → cjs/lib}/zigzag/index.d.ts +4 -1
  52. package/dist/cjs/lib/zigzag/index.d.ts.map +1 -0
  53. package/dist/cjs/lib/zigzag/index.js +27 -0
  54. package/dist/cjs/lib/zigzag/index.js.map +7 -0
  55. package/dist/cjs/lib/zigzag/zigzag.d.ts +100 -0
  56. package/dist/cjs/lib/zigzag/zigzag.d.ts.map +1 -0
  57. package/dist/cjs/lib/zigzag/zigzag.js +207 -0
  58. package/dist/cjs/lib/zigzag/zigzag.js.map +7 -0
  59. package/dist/cjs/line/index.d.ts +342 -0
  60. package/dist/cjs/line/index.d.ts.map +1 -0
  61. package/dist/cjs/line/index.js +193 -0
  62. package/dist/cjs/line/index.js.map +7 -0
  63. package/dist/cjs/linefill/index.d.ts +124 -0
  64. package/dist/cjs/linefill/index.d.ts.map +1 -0
  65. package/dist/cjs/linefill/index.js +56 -0
  66. package/dist/cjs/linefill/index.js.map +7 -0
  67. package/dist/cjs/map/index.d.ts +69 -0
  68. package/dist/cjs/map/index.d.ts.map +1 -0
  69. package/dist/cjs/map/index.js +80 -0
  70. package/dist/cjs/map/index.js.map +7 -0
  71. package/dist/cjs/math/index.d.ts +560 -0
  72. package/dist/cjs/math/index.d.ts.map +1 -0
  73. package/dist/cjs/math/index.js +441 -0
  74. package/dist/cjs/math/index.js.map +7 -0
  75. package/dist/cjs/matrix/index.d.ts +1231 -0
  76. package/dist/cjs/matrix/index.d.ts.map +1 -0
  77. package/dist/cjs/matrix/index.js +1200 -0
  78. package/dist/cjs/matrix/index.js.map +7 -0
  79. package/dist/cjs/package.json +1 -0
  80. package/dist/cjs/plot.d.ts +76 -0
  81. package/dist/cjs/plot.d.ts.map +1 -0
  82. package/dist/cjs/plot.js +51 -0
  83. package/dist/cjs/plot.js.map +7 -0
  84. package/dist/cjs/polyline/index.d.ts +115 -0
  85. package/dist/cjs/polyline/index.d.ts.map +1 -0
  86. package/dist/cjs/polyline/index.js +76 -0
  87. package/dist/cjs/polyline/index.js.map +7 -0
  88. package/dist/cjs/runtime/adapters/LightweightChartsAdapter.d.ts +86 -0
  89. package/dist/cjs/runtime/adapters/LightweightChartsAdapter.d.ts.map +1 -0
  90. package/dist/cjs/runtime/adapters/LightweightChartsAdapter.js +141 -0
  91. package/dist/cjs/runtime/adapters/LightweightChartsAdapter.js.map +7 -0
  92. package/dist/cjs/runtime/adapters/SimpleInputAdapter.d.ts +59 -0
  93. package/dist/cjs/runtime/adapters/SimpleInputAdapter.d.ts.map +1 -0
  94. package/dist/cjs/runtime/adapters/SimpleInputAdapter.js +117 -0
  95. package/dist/cjs/runtime/adapters/SimpleInputAdapter.js.map +7 -0
  96. package/dist/{runtime → cjs/runtime}/index.d.ts +12 -5
  97. package/dist/cjs/runtime/index.d.ts.map +1 -0
  98. package/dist/cjs/runtime/index.js +49 -0
  99. package/dist/cjs/runtime/index.js.map +7 -0
  100. package/dist/cjs/runtime/inputs.d.ts +91 -0
  101. package/dist/cjs/runtime/inputs.d.ts.map +1 -0
  102. package/dist/cjs/runtime/inputs.js +262 -0
  103. package/dist/cjs/runtime/inputs.js.map +7 -0
  104. package/dist/cjs/runtime/runtime.d.ts +70 -0
  105. package/dist/cjs/runtime/runtime.d.ts.map +1 -0
  106. package/dist/cjs/runtime/runtime.js +148 -0
  107. package/dist/cjs/runtime/runtime.js.map +7 -0
  108. package/dist/cjs/runtime/series.d.ts +362 -0
  109. package/dist/cjs/runtime/series.d.ts.map +1 -0
  110. package/dist/cjs/runtime/series.js +560 -0
  111. package/dist/cjs/runtime/series.js.map +7 -0
  112. package/dist/cjs/runtime/types.d.ts +282 -0
  113. package/dist/cjs/runtime/types.d.ts.map +1 -0
  114. package/dist/cjs/runtime/types.js +17 -0
  115. package/dist/cjs/runtime/types.js.map +7 -0
  116. package/dist/cjs/script/index.d.ts +987 -0
  117. package/dist/cjs/script/index.d.ts.map +1 -0
  118. package/dist/cjs/script/index.js +1169 -0
  119. package/dist/cjs/script/index.js.map +7 -0
  120. package/dist/cjs/security/resample.d.ts +63 -0
  121. package/dist/cjs/security/resample.d.ts.map +1 -0
  122. package/dist/cjs/security/resample.js +84 -0
  123. package/dist/cjs/security/resample.js.map +7 -0
  124. package/dist/cjs/session/bars.d.ts +80 -0
  125. package/dist/cjs/session/bars.d.ts.map +1 -0
  126. package/dist/cjs/session/bars.js +219 -0
  127. package/dist/cjs/session/bars.js.map +7 -0
  128. package/dist/cjs/session/calendar.d.ts +70 -0
  129. package/dist/cjs/session/calendar.d.ts.map +1 -0
  130. package/dist/cjs/session/calendar.js +164 -0
  131. package/dist/cjs/session/calendar.js.map +7 -0
  132. package/dist/cjs/str/dateformat.d.ts +15 -0
  133. package/dist/cjs/str/dateformat.d.ts.map +1 -0
  134. package/dist/cjs/str/dateformat.js +149 -0
  135. package/dist/cjs/str/dateformat.js.map +7 -0
  136. package/dist/cjs/str/index.d.ts +459 -0
  137. package/dist/cjs/str/index.d.ts.map +1 -0
  138. package/dist/cjs/str/index.js +143 -0
  139. package/dist/cjs/str/index.js.map +7 -0
  140. package/dist/cjs/str/messageformat.d.ts +14 -0
  141. package/dist/cjs/str/messageformat.d.ts.map +1 -0
  142. package/dist/cjs/str/messageformat.js +114 -0
  143. package/dist/cjs/str/messageformat.js.map +7 -0
  144. package/dist/cjs/str/numberformat.d.ts +19 -0
  145. package/dist/cjs/str/numberformat.d.ts.map +1 -0
  146. package/dist/cjs/str/numberformat.js +170 -0
  147. package/dist/cjs/str/numberformat.js.map +7 -0
  148. package/dist/{strategy → cjs/strategy}/index.d.ts +50 -0
  149. package/dist/cjs/strategy/index.d.ts.map +1 -0
  150. package/dist/cjs/strategy/index.js +92 -0
  151. package/dist/cjs/strategy/index.js.map +7 -0
  152. package/dist/cjs/ta/index.d.ts +1397 -0
  153. package/dist/cjs/ta/index.d.ts.map +1 -0
  154. package/dist/cjs/ta/index.js +1715 -0
  155. package/dist/cjs/ta/index.js.map +7 -0
  156. package/dist/cjs/ta/running-sum.d.ts +30 -0
  157. package/dist/cjs/ta/running-sum.d.ts.map +1 -0
  158. package/dist/cjs/ta/running-sum.js +99 -0
  159. package/dist/cjs/ta/running-sum.js.map +7 -0
  160. package/dist/cjs/ta-series.d.ts +558 -0
  161. package/dist/cjs/ta-series.d.ts.map +1 -0
  162. package/dist/cjs/ta-series.js +606 -0
  163. package/dist/cjs/ta-series.js.map +7 -0
  164. package/dist/cjs/text/index.d.ts +14 -0
  165. package/dist/cjs/text/index.d.ts.map +1 -0
  166. package/dist/cjs/text/index.js +29 -0
  167. package/dist/cjs/text/index.js.map +7 -0
  168. package/dist/cjs/time/datestring.d.ts +23 -0
  169. package/dist/cjs/time/datestring.d.ts.map +1 -0
  170. package/dist/cjs/time/datestring.js +106 -0
  171. package/dist/cjs/time/datestring.js.map +7 -0
  172. package/dist/cjs/time/index.d.ts +89 -0
  173. package/dist/cjs/time/index.d.ts.map +1 -0
  174. package/dist/cjs/time/index.js +85 -0
  175. package/dist/cjs/time/index.js.map +7 -0
  176. package/dist/cjs/time/session.d.ts +17 -0
  177. package/dist/cjs/time/session.d.ts.map +1 -0
  178. package/dist/cjs/time/session.js +65 -0
  179. package/dist/cjs/time/session.js.map +7 -0
  180. package/dist/cjs/time/timezone.d.ts +40 -0
  181. package/dist/cjs/time/timezone.d.ts.map +1 -0
  182. package/dist/cjs/time/timezone.js +125 -0
  183. package/dist/cjs/time/timezone.js.map +7 -0
  184. package/dist/cjs/timeframe/index.d.ts +73 -0
  185. package/dist/cjs/timeframe/index.d.ts.map +1 -0
  186. package/dist/cjs/timeframe/index.js +85 -0
  187. package/dist/cjs/timeframe/index.js.map +7 -0
  188. package/dist/cjs/types/index.d.ts +343 -0
  189. package/dist/cjs/types/index.d.ts.map +1 -0
  190. package/dist/cjs/types/index.js +32 -0
  191. package/dist/cjs/types/index.js.map +7 -0
  192. package/dist/cjs/types/metadata.d.ts +300 -0
  193. package/dist/cjs/types/metadata.d.ts.map +1 -0
  194. package/dist/cjs/types/metadata.js +17 -0
  195. package/dist/cjs/types/metadata.js.map +7 -0
  196. package/dist/cjs/utils/index.d.ts +167 -0
  197. package/dist/cjs/utils/index.d.ts.map +1 -0
  198. package/dist/cjs/utils/index.js +209 -0
  199. package/dist/cjs/utils/index.js.map +7 -0
  200. package/dist/esm/array/index.d.ts +701 -0
  201. package/dist/esm/array/index.d.ts.map +1 -0
  202. package/dist/esm/array/index.js +983 -0
  203. package/dist/esm/array/index.js.map +1 -0
  204. package/dist/esm/box/index.d.ts +444 -0
  205. package/dist/esm/box/index.d.ts.map +1 -0
  206. package/dist/esm/box/index.js +602 -0
  207. package/dist/esm/box/index.js.map +1 -0
  208. package/dist/esm/callsite/index.d.ts +61 -0
  209. package/dist/esm/callsite/index.d.ts.map +1 -0
  210. package/dist/esm/callsite/index.js +97 -0
  211. package/dist/esm/callsite/index.js.map +1 -0
  212. package/dist/esm/chartpoint/index.d.ts +90 -0
  213. package/dist/esm/chartpoint/index.d.ts.map +1 -0
  214. package/dist/esm/chartpoint/index.js +113 -0
  215. package/dist/esm/chartpoint/index.js.map +1 -0
  216. package/dist/esm/color/index.d.ts +285 -0
  217. package/dist/esm/color/index.d.ts.map +1 -0
  218. package/dist/esm/color/index.js +373 -0
  219. package/dist/esm/color/index.js.map +1 -0
  220. package/dist/esm/compare/index.d.ts +26 -0
  221. package/dist/esm/compare/index.d.ts.map +1 -0
  222. package/dist/esm/compare/index.js +39 -0
  223. package/dist/esm/compare/index.js.map +1 -0
  224. package/dist/esm/drawing/registry.d.ts +42 -0
  225. package/dist/esm/drawing/registry.d.ts.map +1 -0
  226. package/dist/esm/drawing/registry.js +89 -0
  227. package/dist/esm/drawing/registry.js.map +1 -0
  228. package/dist/esm/index.d.ts +85 -0
  229. package/dist/esm/index.d.ts.map +1 -0
  230. package/dist/esm/index.js +96 -0
  231. package/dist/esm/index.js.map +1 -0
  232. package/dist/esm/indicator.d.ts +117 -0
  233. package/dist/esm/indicator.d.ts.map +1 -0
  234. package/dist/esm/indicator.js +84 -0
  235. package/dist/esm/indicator.js.map +1 -0
  236. package/dist/esm/input.d.ts +196 -0
  237. package/dist/esm/input.d.ts.map +1 -0
  238. package/dist/esm/input.js +183 -0
  239. package/dist/esm/input.js.map +1 -0
  240. package/dist/esm/label/index.d.ts +303 -0
  241. package/dist/esm/label/index.d.ts.map +1 -0
  242. package/dist/esm/label/index.js +417 -0
  243. package/dist/esm/label/index.js.map +1 -0
  244. package/dist/esm/lib/index.d.ts +8 -0
  245. package/dist/esm/lib/index.d.ts.map +1 -0
  246. package/dist/esm/lib/index.js +8 -0
  247. package/dist/esm/lib/index.js.map +1 -0
  248. package/dist/esm/lib/zigzag/index.d.ts +5 -0
  249. package/dist/esm/lib/zigzag/index.d.ts.map +1 -0
  250. package/dist/esm/lib/zigzag/index.js +5 -0
  251. package/dist/esm/lib/zigzag/index.js.map +1 -0
  252. package/dist/esm/lib/zigzag/zigzag.d.ts +100 -0
  253. package/dist/esm/lib/zigzag/zigzag.d.ts.map +1 -0
  254. package/dist/esm/lib/zigzag/zigzag.js +229 -0
  255. package/dist/esm/lib/zigzag/zigzag.js.map +1 -0
  256. package/dist/esm/line/index.d.ts +342 -0
  257. package/dist/esm/line/index.d.ts.map +1 -0
  258. package/dist/esm/line/index.js +470 -0
  259. package/dist/esm/line/index.js.map +1 -0
  260. package/dist/esm/linefill/index.d.ts +124 -0
  261. package/dist/esm/linefill/index.d.ts.map +1 -0
  262. package/dist/esm/linefill/index.js +144 -0
  263. package/dist/esm/linefill/index.js.map +1 -0
  264. package/dist/esm/map/index.d.ts +69 -0
  265. package/dist/esm/map/index.d.ts.map +1 -0
  266. package/dist/esm/map/index.js +106 -0
  267. package/dist/esm/map/index.js.map +1 -0
  268. package/dist/esm/math/index.d.ts +560 -0
  269. package/dist/esm/math/index.d.ts.map +1 -0
  270. package/dist/esm/math/index.js +495 -0
  271. package/dist/esm/math/index.js.map +1 -0
  272. package/dist/esm/matrix/index.d.ts +1231 -0
  273. package/dist/esm/matrix/index.d.ts.map +1 -0
  274. package/dist/esm/matrix/index.js +2450 -0
  275. package/dist/esm/matrix/index.js.map +1 -0
  276. package/dist/esm/plot.d.ts +76 -0
  277. package/dist/esm/plot.d.ts.map +1 -0
  278. package/dist/esm/plot.js +63 -0
  279. package/dist/esm/plot.js.map +1 -0
  280. package/dist/esm/polyline/index.d.ts +115 -0
  281. package/dist/esm/polyline/index.d.ts.map +1 -0
  282. package/dist/esm/polyline/index.js +157 -0
  283. package/dist/esm/polyline/index.js.map +1 -0
  284. package/dist/esm/runtime/adapters/LightweightChartsAdapter.d.ts +86 -0
  285. package/dist/esm/runtime/adapters/LightweightChartsAdapter.d.ts.map +1 -0
  286. package/dist/esm/runtime/adapters/LightweightChartsAdapter.js +140 -0
  287. package/dist/esm/runtime/adapters/LightweightChartsAdapter.js.map +1 -0
  288. package/dist/esm/runtime/adapters/SimpleInputAdapter.d.ts +59 -0
  289. package/dist/esm/runtime/adapters/SimpleInputAdapter.d.ts.map +1 -0
  290. package/dist/esm/runtime/adapters/SimpleInputAdapter.js +115 -0
  291. package/dist/esm/runtime/adapters/SimpleInputAdapter.js.map +1 -0
  292. package/dist/esm/runtime/index.d.ts +13 -0
  293. package/dist/esm/runtime/index.d.ts.map +1 -0
  294. package/dist/esm/runtime/index.js +14 -0
  295. package/dist/esm/runtime/index.js.map +1 -0
  296. package/dist/esm/runtime/inputs.d.ts +91 -0
  297. package/dist/esm/runtime/inputs.d.ts.map +1 -0
  298. package/dist/esm/runtime/inputs.js +334 -0
  299. package/dist/esm/runtime/inputs.js.map +1 -0
  300. package/dist/esm/runtime/runtime.d.ts +70 -0
  301. package/dist/esm/runtime/runtime.d.ts.map +1 -0
  302. package/dist/esm/runtime/runtime.js +193 -0
  303. package/dist/esm/runtime/runtime.js.map +1 -0
  304. package/dist/esm/runtime/series.d.ts +362 -0
  305. package/dist/esm/runtime/series.d.ts.map +1 -0
  306. package/dist/esm/runtime/series.js +583 -0
  307. package/dist/esm/runtime/series.js.map +1 -0
  308. package/dist/esm/runtime/types.d.ts +282 -0
  309. package/dist/esm/runtime/types.d.ts.map +1 -0
  310. package/dist/esm/runtime/types.js +7 -0
  311. package/dist/esm/runtime/types.js.map +1 -0
  312. package/dist/esm/script/index.d.ts +987 -0
  313. package/dist/esm/script/index.d.ts.map +1 -0
  314. package/dist/esm/script/index.js +1289 -0
  315. package/dist/esm/script/index.js.map +1 -0
  316. package/dist/esm/security/resample.d.ts +63 -0
  317. package/dist/esm/security/resample.d.ts.map +1 -0
  318. package/dist/esm/security/resample.js +110 -0
  319. package/dist/esm/security/resample.js.map +1 -0
  320. package/dist/esm/session/bars.d.ts +80 -0
  321. package/dist/esm/session/bars.d.ts.map +1 -0
  322. package/dist/esm/session/bars.js +232 -0
  323. package/dist/esm/session/bars.js.map +1 -0
  324. package/dist/esm/session/calendar.d.ts +70 -0
  325. package/dist/esm/session/calendar.d.ts.map +1 -0
  326. package/dist/esm/session/calendar.js +172 -0
  327. package/dist/esm/session/calendar.js.map +1 -0
  328. package/dist/esm/str/dateformat.d.ts +15 -0
  329. package/dist/esm/str/dateformat.d.ts.map +1 -0
  330. package/dist/esm/str/dateformat.js +136 -0
  331. package/dist/esm/str/dateformat.js.map +1 -0
  332. package/dist/esm/str/index.d.ts +459 -0
  333. package/dist/esm/str/index.d.ts.map +1 -0
  334. package/dist/esm/str/index.js +540 -0
  335. package/dist/esm/str/index.js.map +1 -0
  336. package/dist/esm/str/messageformat.d.ts +14 -0
  337. package/dist/esm/str/messageformat.d.ts.map +1 -0
  338. package/dist/esm/str/messageformat.js +111 -0
  339. package/dist/esm/str/messageformat.js.map +1 -0
  340. package/dist/esm/str/numberformat.d.ts +19 -0
  341. package/dist/esm/str/numberformat.d.ts.map +1 -0
  342. package/dist/esm/str/numberformat.js +189 -0
  343. package/dist/esm/str/numberformat.js.map +1 -0
  344. package/dist/esm/strategy/index.d.ts +245 -0
  345. package/dist/esm/strategy/index.d.ts.map +1 -0
  346. package/dist/esm/strategy/index.js +84 -0
  347. package/dist/esm/strategy/index.js.map +1 -0
  348. package/dist/esm/ta/index.d.ts +1397 -0
  349. package/dist/esm/ta/index.d.ts.map +1 -0
  350. package/dist/esm/ta/index.js +3227 -0
  351. package/dist/esm/ta/index.js.map +1 -0
  352. package/dist/esm/ta/running-sum.d.ts +30 -0
  353. package/dist/esm/ta/running-sum.d.ts.map +1 -0
  354. package/dist/esm/ta/running-sum.js +113 -0
  355. package/dist/esm/ta/running-sum.js.map +1 -0
  356. package/dist/esm/ta-series.d.ts +558 -0
  357. package/dist/esm/ta-series.d.ts.map +1 -0
  358. package/dist/esm/ta-series.js +910 -0
  359. package/dist/esm/ta-series.js.map +1 -0
  360. package/dist/esm/text/index.d.ts +14 -0
  361. package/dist/esm/text/index.d.ts.map +1 -0
  362. package/dist/esm/text/index.js +14 -0
  363. package/dist/esm/text/index.js.map +1 -0
  364. package/dist/esm/time/datestring.d.ts +23 -0
  365. package/dist/esm/time/datestring.d.ts.map +1 -0
  366. package/dist/esm/time/datestring.js +94 -0
  367. package/dist/esm/time/datestring.js.map +1 -0
  368. package/dist/esm/time/index.d.ts +89 -0
  369. package/dist/esm/time/index.d.ts.map +1 -0
  370. package/dist/esm/time/index.js +108 -0
  371. package/dist/esm/time/index.js.map +1 -0
  372. package/dist/esm/time/session.d.ts +17 -0
  373. package/dist/esm/time/session.d.ts.map +1 -0
  374. package/dist/esm/time/session.js +69 -0
  375. package/dist/esm/time/session.js.map +1 -0
  376. package/dist/esm/time/timezone.d.ts +40 -0
  377. package/dist/esm/time/timezone.d.ts.map +1 -0
  378. package/dist/esm/time/timezone.js +144 -0
  379. package/dist/esm/time/timezone.js.map +1 -0
  380. package/dist/esm/timeframe/index.d.ts +73 -0
  381. package/dist/esm/timeframe/index.d.ts.map +1 -0
  382. package/dist/esm/timeframe/index.js +131 -0
  383. package/dist/esm/timeframe/index.js.map +1 -0
  384. package/dist/esm/types/index.d.ts +343 -0
  385. package/dist/esm/types/index.d.ts.map +1 -0
  386. package/dist/esm/types/index.js +17 -0
  387. package/dist/esm/types/index.js.map +1 -0
  388. package/dist/esm/types/metadata.d.ts +300 -0
  389. package/dist/esm/types/metadata.d.ts.map +1 -0
  390. package/dist/esm/types/metadata.js +7 -0
  391. package/dist/esm/types/metadata.js.map +1 -0
  392. package/dist/esm/utils/index.d.ts +167 -0
  393. package/dist/esm/utils/index.d.ts.map +1 -0
  394. package/dist/esm/utils/index.js +295 -0
  395. package/dist/esm/utils/index.js.map +1 -0
  396. package/package.json +53 -23
  397. package/src/array/index.ts +1056 -0
  398. package/src/box/index.ts +680 -0
  399. package/src/callsite/index.ts +104 -0
  400. package/src/chartpoint/index.ts +126 -0
  401. package/src/color/index.ts +411 -0
  402. package/src/compare/index.ts +46 -0
  403. package/src/drawing/registry.ts +106 -0
  404. package/src/index.ts +201 -0
  405. package/src/indicator.ts +185 -0
  406. package/src/input.ts +280 -0
  407. package/src/label/index.ts +490 -0
  408. package/src/lib/index.ts +8 -0
  409. package/src/lib/zigzag/index.ts +13 -0
  410. package/src/lib/zigzag/zigzag.ts +318 -0
  411. package/src/line/index.ts +530 -0
  412. package/src/linefill/index.ts +152 -0
  413. package/src/map/index.ts +115 -0
  414. package/src/math/index.ts +1071 -0
  415. package/src/matrix/index.ts +2697 -0
  416. package/src/plot.ts +121 -0
  417. package/src/polyline/index.ts +184 -0
  418. package/src/runtime/adapters/LightweightChartsAdapter.ts +201 -0
  419. package/src/runtime/adapters/SimpleInputAdapter.ts +132 -0
  420. package/src/runtime/index.ts +52 -0
  421. package/src/runtime/inputs.ts +377 -0
  422. package/src/runtime/runtime.ts +241 -0
  423. package/src/runtime/series.ts +644 -0
  424. package/src/runtime/types.ts +292 -0
  425. package/src/script/index.ts +1865 -0
  426. package/src/security/resample.ts +119 -0
  427. package/src/session/bars.ts +262 -0
  428. package/src/session/calendar.ts +199 -0
  429. package/src/str/dateformat.ts +104 -0
  430. package/src/str/index.ts +557 -0
  431. package/src/str/messageformat.ts +109 -0
  432. package/src/str/numberformat.ts +197 -0
  433. package/src/strategy/index.ts +281 -0
  434. package/src/ta/index.ts +3580 -0
  435. package/src/ta/running-sum.ts +117 -0
  436. package/src/ta-series.ts +1036 -0
  437. package/src/text/index.ts +14 -0
  438. package/src/time/datestring.ts +96 -0
  439. package/src/time/index.ts +161 -0
  440. package/src/time/session.ts +79 -0
  441. package/src/time/timezone.ts +180 -0
  442. package/src/timeframe/index.ts +144 -0
  443. package/src/types/index.ts +398 -0
  444. package/src/types/metadata.ts +334 -0
  445. package/src/utils/index.ts +334 -0
  446. package/dist/array/index.d.ts +0 -57
  447. package/dist/array/index.d.ts.map +0 -1
  448. package/dist/box/index.d.ts +0 -37
  449. package/dist/box/index.d.ts.map +0 -1
  450. package/dist/callsite/index.d.ts +0 -7
  451. package/dist/callsite/index.d.ts.map +0 -1
  452. package/dist/chartpoint/index.d.ts +0 -8
  453. package/dist/chartpoint/index.d.ts.map +0 -1
  454. package/dist/color/index.d.ts +0 -28
  455. package/dist/color/index.d.ts.map +0 -1
  456. package/dist/compare/index.d.ts +0 -8
  457. package/dist/compare/index.d.ts.map +0 -1
  458. package/dist/drawing/registry.d.ts +0 -19
  459. package/dist/drawing/registry.d.ts.map +0 -1
  460. package/dist/index.cjs +0 -7979
  461. package/dist/index.d.ts +0 -64
  462. package/dist/index.d.ts.map +0 -1
  463. package/dist/index.mjs +0 -7962
  464. package/dist/indicator.d.ts +0 -42
  465. package/dist/indicator.d.ts.map +0 -1
  466. package/dist/input.d.ts +0 -47
  467. package/dist/input.d.ts.map +0 -1
  468. package/dist/label/index.d.ts +0 -30
  469. package/dist/label/index.d.ts.map +0 -1
  470. package/dist/lib/index.d.ts +0 -2
  471. package/dist/lib/index.d.ts.map +0 -1
  472. package/dist/lib/zigzag/index.d.ts.map +0 -1
  473. package/dist/lib/zigzag/zigzag.d.ts +0 -47
  474. package/dist/lib/zigzag/zigzag.d.ts.map +0 -1
  475. package/dist/line/index.d.ts +0 -30
  476. package/dist/line/index.d.ts.map +0 -1
  477. package/dist/linefill/index.d.ts +0 -10
  478. package/dist/linefill/index.d.ts.map +0 -1
  479. package/dist/map/index.d.ts +0 -14
  480. package/dist/map/index.d.ts.map +0 -1
  481. package/dist/math/index.d.ts +0 -53
  482. package/dist/math/index.d.ts.map +0 -1
  483. package/dist/matrix/index.d.ts +0 -52
  484. package/dist/matrix/index.d.ts.map +0 -1
  485. package/dist/plot.d.ts +0 -20
  486. package/dist/plot.d.ts.map +0 -1
  487. package/dist/polyline/index.d.ts +0 -11
  488. package/dist/polyline/index.d.ts.map +0 -1
  489. package/dist/runtime/adapters/LightweightChartsAdapter.d.ts +0 -15
  490. package/dist/runtime/adapters/LightweightChartsAdapter.d.ts.map +0 -1
  491. package/dist/runtime/adapters/SimpleInputAdapter.d.ts +0 -16
  492. package/dist/runtime/adapters/SimpleInputAdapter.d.ts.map +0 -1
  493. package/dist/runtime/index.cjs +0 -600
  494. package/dist/runtime/index.d.ts.map +0 -1
  495. package/dist/runtime/index.mjs +0 -577
  496. package/dist/runtime/inputs.d.ts +0 -13
  497. package/dist/runtime/inputs.d.ts.map +0 -1
  498. package/dist/runtime/runtime.d.ts +0 -16
  499. package/dist/runtime/runtime.d.ts.map +0 -1
  500. package/dist/runtime/series.d.ts +0 -60
  501. package/dist/runtime/series.d.ts.map +0 -1
  502. package/dist/runtime/types.d.ts +0 -122
  503. package/dist/runtime/types.d.ts.map +0 -1
  504. package/dist/script/index.cjs +0 -6372
  505. package/dist/script/index.d.ts +0 -709
  506. package/dist/script/index.d.ts.map +0 -1
  507. package/dist/script/index.mjs +0 -6355
  508. package/dist/security/resample.d.ts +0 -13
  509. package/dist/security/resample.d.ts.map +0 -1
  510. package/dist/session/bars.d.ts +0 -34
  511. package/dist/session/bars.d.ts.map +0 -1
  512. package/dist/session/calendar.d.ts +0 -31
  513. package/dist/session/calendar.d.ts.map +0 -1
  514. package/dist/str/dateformat.d.ts +0 -2
  515. package/dist/str/dateformat.d.ts.map +0 -1
  516. package/dist/str/index.d.ts +0 -24
  517. package/dist/str/index.d.ts.map +0 -1
  518. package/dist/str/messageformat.d.ts +0 -2
  519. package/dist/str/messageformat.d.ts.map +0 -1
  520. package/dist/str/numberformat.d.ts +0 -3
  521. package/dist/str/numberformat.d.ts.map +0 -1
  522. package/dist/strategy/index.d.ts.map +0 -1
  523. package/dist/ta/index.d.ts +0 -72
  524. package/dist/ta/index.d.ts.map +0 -1
  525. package/dist/ta-series.d.ts +0 -143
  526. package/dist/ta-series.d.ts.map +0 -1
  527. package/dist/text/index.d.ts +0 -4
  528. package/dist/text/index.d.ts.map +0 -1
  529. package/dist/time/datestring.d.ts +0 -2
  530. package/dist/time/datestring.d.ts.map +0 -1
  531. package/dist/time/index.d.ts +0 -15
  532. package/dist/time/index.d.ts.map +0 -1
  533. package/dist/time/session.d.ts +0 -2
  534. package/dist/time/session.d.ts.map +0 -1
  535. package/dist/time/timezone.d.ts +0 -13
  536. package/dist/time/timezone.d.ts.map +0 -1
  537. package/dist/timeframe/index.d.ts +0 -17
  538. package/dist/timeframe/index.d.ts.map +0 -1
  539. package/dist/types/index.d.ts +0 -181
  540. package/dist/types/index.d.ts.map +0 -1
  541. package/dist/types/metadata.d.ts +0 -131
  542. package/dist/types/metadata.d.ts.map +0 -1
  543. package/dist/utils/index.d.ts +0 -26
  544. package/dist/utils/index.d.ts.map +0 -1
@@ -0,0 +1,377 @@
1
+ /**
2
+ * @fileoverview Idempotent input registration functions
3
+ * These functions mirror PineScript's input functions with idempotent semantics:
4
+ * - First call registers the input with default value
5
+ * - Subsequent calls return the current stored value (possibly user-updated)
6
+ * @module runtime/inputs
7
+ */
8
+
9
+ import type { InputConfig, InputOptions } from './types.js';
10
+ import { getContext, recalculate } from './runtime.js';
11
+
12
+ // Track registered inputs for idempotent registration
13
+ const registeredInputs = new Map<string, boolean>();
14
+
15
+ // Track if we should auto-recalculate on input change
16
+ let autoRecalculateEnabled = false;
17
+
18
+ /**
19
+ * Enable automatic recalculation when inputs change
20
+ */
21
+ export function enableAutoRecalculate(): void {
22
+ autoRecalculateEnabled = true;
23
+ }
24
+
25
+ /**
26
+ * Disable automatic recalculation
27
+ */
28
+ export function disableAutoRecalculate(): void {
29
+ autoRecalculateEnabled = false;
30
+ }
31
+
32
+ /**
33
+ * Reset registered inputs (for testing or context changes)
34
+ * @internal
35
+ */
36
+ export function resetInputs(): void {
37
+ registeredInputs.clear();
38
+ inputCounter = 0;
39
+ }
40
+
41
+ // Counter for generating unique input IDs when no title is provided
42
+ let inputCounter = 0;
43
+
44
+ /**
45
+ * Generate a unique input ID from title or default
46
+ * @param title - Optional title
47
+ * @param defval - Default value for fallback
48
+ * @param type - Input type
49
+ * @returns Unique input ID
50
+ */
51
+ function generateInputId(title: string | undefined, defval: unknown, type: string): string {
52
+ if (title) {
53
+ return title.replace(/\s+/g, '_');
54
+ }
55
+ // Use counter to ensure uniqueness when no title is provided
56
+ return `${type}_${inputCounter++}_${String(defval)}`;
57
+ }
58
+
59
+ /**
60
+ * Register an integer input
61
+ * First call registers with defval, subsequent calls return current value
62
+ * @param defval - Default value
63
+ * @param title - Display title (optional)
64
+ * @param options - Additional options: min, max, step (optional)
65
+ * @returns Current integer value
66
+ */
67
+ export function input_int(defval: number, title?: string, options?: InputOptions): number {
68
+ const context = getContext();
69
+ if (!context) {
70
+ // No context - return default value
71
+ return Math.floor(defval);
72
+ }
73
+
74
+ const id = generateInputId(title, defval, 'int');
75
+ const config: InputConfig = {
76
+ id,
77
+ type: 'int',
78
+ defval: Math.floor(defval),
79
+ title,
80
+ min: options?.min,
81
+ max: options?.max,
82
+ step: options?.step ?? 1,
83
+ };
84
+
85
+ // Check if already registered (idempotent)
86
+ if (!registeredInputs.has(id)) {
87
+ // First call - register the input
88
+ context.inputs.registerInput(config);
89
+ registeredInputs.set(id, true);
90
+
91
+ // Set up auto-recalculate on change if not already done
92
+ if (autoRecalculateEnabled) {
93
+ context.inputs.onInputChange((changedId) => {
94
+ if (changedId === id) {
95
+ recalculate();
96
+ }
97
+ });
98
+ }
99
+ }
100
+
101
+ // Return current value (may have been updated by user)
102
+ const value = context.inputs.getValue(id);
103
+ return typeof value === 'number' ? Math.floor(value) : Math.floor(defval);
104
+ }
105
+
106
+ /**
107
+ * Register a float input
108
+ * First call registers with defval, subsequent calls return current value
109
+ * @param defval - Default value
110
+ * @param title - Display title (optional)
111
+ * @param options - Additional options: min, max, step (optional)
112
+ * @returns Current float value
113
+ */
114
+ export function input_float(defval: number, title?: string, options?: InputOptions): number {
115
+ const context = getContext();
116
+ if (!context) {
117
+ // No context - return default value
118
+ return defval;
119
+ }
120
+
121
+ const id = generateInputId(title, defval, 'float');
122
+ const config: InputConfig = {
123
+ id,
124
+ type: 'float',
125
+ defval,
126
+ title,
127
+ min: options?.min,
128
+ max: options?.max,
129
+ step: options?.step ?? 0.1,
130
+ };
131
+
132
+ // Check if already registered (idempotent)
133
+ if (!registeredInputs.has(id)) {
134
+ context.inputs.registerInput(config);
135
+ registeredInputs.set(id, true);
136
+
137
+ if (autoRecalculateEnabled) {
138
+ context.inputs.onInputChange((changedId) => {
139
+ if (changedId === id) {
140
+ recalculate();
141
+ }
142
+ });
143
+ }
144
+ }
145
+
146
+ const value = context.inputs.getValue(id);
147
+ return typeof value === 'number' ? value : defval;
148
+ }
149
+
150
+ /**
151
+ * Register a boolean input
152
+ * First call registers with defval, subsequent calls return current value
153
+ * @param defval - Default value
154
+ * @param title - Display title (optional)
155
+ * @returns Current boolean value
156
+ */
157
+ export function input_bool(defval: boolean, title?: string): boolean {
158
+ const context = getContext();
159
+ if (!context) {
160
+ return defval;
161
+ }
162
+
163
+ const id = generateInputId(title, defval, 'bool');
164
+ const config: InputConfig = {
165
+ id,
166
+ type: 'bool',
167
+ defval,
168
+ title,
169
+ };
170
+
171
+ if (!registeredInputs.has(id)) {
172
+ context.inputs.registerInput(config);
173
+ registeredInputs.set(id, true);
174
+
175
+ if (autoRecalculateEnabled) {
176
+ context.inputs.onInputChange((changedId) => {
177
+ if (changedId === id) {
178
+ recalculate();
179
+ }
180
+ });
181
+ }
182
+ }
183
+
184
+ const value = context.inputs.getValue(id);
185
+ return typeof value === 'boolean' ? value : defval;
186
+ }
187
+
188
+ /**
189
+ * Register a string input
190
+ * First call registers with defval, subsequent calls return current value
191
+ * @param defval - Default value
192
+ * @param title - Display title (optional)
193
+ * @param options - Array of string options for dropdown (optional)
194
+ * @returns Current string value
195
+ */
196
+ export function input_string(defval: string, title?: string, options?: string[]): string {
197
+ const context = getContext();
198
+ if (!context) {
199
+ return defval;
200
+ }
201
+
202
+ const id = generateInputId(title, defval, 'string');
203
+ const config: InputConfig = {
204
+ id,
205
+ type: 'string',
206
+ defval,
207
+ title,
208
+ options,
209
+ };
210
+
211
+ if (!registeredInputs.has(id)) {
212
+ context.inputs.registerInput(config);
213
+ registeredInputs.set(id, true);
214
+
215
+ if (autoRecalculateEnabled) {
216
+ context.inputs.onInputChange((changedId) => {
217
+ if (changedId === id) {
218
+ recalculate();
219
+ }
220
+ });
221
+ }
222
+ }
223
+
224
+ const value = context.inputs.getValue(id);
225
+ return typeof value === 'string' ? value : defval;
226
+ }
227
+
228
+ /**
229
+ * Registers `config` once (idempotent) and returns the current stored value.
230
+ */
231
+ function registerOnce(config: InputConfig): unknown {
232
+ const context = getContext()!;
233
+ if (!registeredInputs.has(config.id)) {
234
+ context.inputs.registerInput(config);
235
+ registeredInputs.set(config.id, true);
236
+
237
+ if (autoRecalculateEnabled) {
238
+ context.inputs.onInputChange((changedId) => {
239
+ if (changedId === config.id) {
240
+ recalculate();
241
+ }
242
+ });
243
+ }
244
+ }
245
+ return context.inputs.getValue(config.id);
246
+ }
247
+
248
+ /**
249
+ * Register a timeframe input (PineScript `input.timeframe`)
250
+ * First call registers with defval, subsequent calls return current value
251
+ * @param defval - Default timeframe string ("60", "1D", "W"); "" means the chart timeframe
252
+ * @param title - Display title (optional)
253
+ * @param options - Array of timeframe options for dropdown (optional)
254
+ * @returns Current timeframe string
255
+ */
256
+ export function input_timeframe(defval: string, title?: string, options?: string[]): string {
257
+ if (!getContext()) {
258
+ return defval;
259
+ }
260
+ const value = registerOnce({ id: generateInputId(title, defval, 'timeframe'), type: 'timeframe', defval, title, options });
261
+ return typeof value === 'string' ? value : defval;
262
+ }
263
+
264
+ /**
265
+ * Register a session input (PineScript `input.session`)
266
+ * First call registers with defval, subsequent calls return current value
267
+ * @param defval - Default session string ("0930-1600", "0930-1600:23456")
268
+ * @param title - Display title (optional)
269
+ * @param options - Array of session options for dropdown (optional)
270
+ * @returns Current session string
271
+ */
272
+ export function input_session(defval: string, title?: string, options?: string[]): string {
273
+ if (!getContext()) {
274
+ return defval;
275
+ }
276
+ const value = registerOnce({ id: generateInputId(title, defval, 'session'), type: 'session', defval, title, options });
277
+ return typeof value === 'string' ? value : defval;
278
+ }
279
+
280
+ /**
281
+ * Register a date/time input (PineScript `input.time`)
282
+ * First call registers with defval, subsequent calls return current value
283
+ * @param defval - Default UNIX time in milliseconds, e.g. `time.timestamp("2024-01-01")`
284
+ * @param title - Display title (optional)
285
+ * @returns Current UNIX time in milliseconds
286
+ */
287
+ export function input_time(defval: number, title?: string): number {
288
+ if (!getContext()) {
289
+ return defval;
290
+ }
291
+ const value = registerOnce({ id: generateInputId(title, defval, 'time'), type: 'time', defval, title });
292
+ return typeof value === 'number' ? value : defval;
293
+ }
294
+
295
+ /**
296
+ * Register a source input (returns a data series from OHLCV)
297
+ * First call registers with defval, subsequent calls return current value
298
+ * @param defval - Default source name ('close', 'open', 'high', 'low', 'volume', 'hl2', 'hlc3', 'ohlc4')
299
+ * @param title - Display title (optional)
300
+ * @returns Array of values for the selected source
301
+ */
302
+ export function input_source(defval: string, title?: string): number[] {
303
+ const context = getContext();
304
+ if (!context) {
305
+ return [];
306
+ }
307
+
308
+ const id = generateInputId(title, defval, 'source');
309
+ const config: InputConfig = {
310
+ id,
311
+ type: 'source',
312
+ defval,
313
+ title,
314
+ options: ['open', 'high', 'low', 'close', 'volume', 'hl2', 'hlc3', 'ohlc4'],
315
+ };
316
+
317
+ if (!registeredInputs.has(id)) {
318
+ context.inputs.registerInput(config);
319
+ registeredInputs.set(id, true);
320
+
321
+ if (autoRecalculateEnabled) {
322
+ context.inputs.onInputChange((changedId) => {
323
+ if (changedId === id) {
324
+ recalculate();
325
+ }
326
+ });
327
+ }
328
+ }
329
+
330
+ const sourceName = (context.inputs.getValue(id) as string) ?? defval;
331
+
332
+ return getSourceData(context.ohlcv, sourceName);
333
+ }
334
+
335
+ /**
336
+ * Get data array for a source name
337
+ * @param ohlcv - OHLCV data
338
+ * @param sourceName - Source name
339
+ * @returns Array of values
340
+ */
341
+ function getSourceData(
342
+ ohlcv: { open: number[]; high: number[]; low: number[]; close: number[]; volume: number[] },
343
+ sourceName: string
344
+ ): number[] {
345
+ switch (sourceName) {
346
+ case 'open':
347
+ return ohlcv.open;
348
+ case 'high':
349
+ return ohlcv.high;
350
+ case 'low':
351
+ return ohlcv.low;
352
+ case 'close':
353
+ return ohlcv.close;
354
+ case 'volume':
355
+ return ohlcv.volume;
356
+ case 'hl2':
357
+ return ohlcv.high.map((h, i) => {
358
+ const l = ohlcv.low[i];
359
+ return l !== undefined ? (h + l) / 2 : NaN;
360
+ });
361
+ case 'hlc3':
362
+ return ohlcv.high.map((h, i) => {
363
+ const l = ohlcv.low[i];
364
+ const c = ohlcv.close[i];
365
+ return l !== undefined && c !== undefined ? (h + l + c) / 3 : NaN;
366
+ });
367
+ case 'ohlc4':
368
+ return ohlcv.open.map((o, i) => {
369
+ const h = ohlcv.high[i];
370
+ const l = ohlcv.low[i];
371
+ const c = ohlcv.close[i];
372
+ return h !== undefined && l !== undefined && c !== undefined ? (o + h + l + c) / 4 : NaN;
373
+ });
374
+ default:
375
+ return ohlcv.close;
376
+ }
377
+ }
@@ -0,0 +1,241 @@
1
+ /**
2
+ * @fileoverview OakScriptJS Runtime - Context management and plot functions
3
+ * This module provides the global runtime context for indicator execution
4
+ * @module runtime/runtime
5
+ */
6
+
7
+ import type { OakScriptContext, SeriesHandle, SeriesOptions } from './types.js';
8
+
9
+ // Global context state
10
+ let context: OakScriptContext | null = null;
11
+
12
+ // Registered calculate function for recalculation
13
+ let calculateFn: (() => void) | null = null;
14
+
15
+ // Track active plots for cleanup
16
+ interface ActivePlot {
17
+ id: string;
18
+ series: SeriesHandle;
19
+ }
20
+
21
+ const activePlots: ActivePlot[] = [];
22
+
23
+ // Counter for generating unique plot IDs
24
+ let plotCounter = 0;
25
+
26
+ /**
27
+ * Set the global OakScript context
28
+ * Must be called by host application before any indicator calculation
29
+ * @param ctx - The context object with chart and input adapters
30
+ */
31
+ export function setContext(ctx: OakScriptContext): void {
32
+ context = ctx;
33
+ // Reset plot counter and clear active plots when context changes
34
+ plotCounter = 0;
35
+ clearPlots();
36
+ }
37
+
38
+ /**
39
+ * Clear the global context
40
+ * Call when detaching/removing an indicator
41
+ */
42
+ export function clearContext(): void {
43
+ clearPlots();
44
+ context = null;
45
+ calculateFn = null;
46
+ plotCounter = 0;
47
+ }
48
+
49
+ /**
50
+ * Get the current global context
51
+ * @returns The current context or null if not set
52
+ */
53
+ export function getContext(): OakScriptContext | null {
54
+ return context;
55
+ }
56
+
57
+ /**
58
+ * Register the calculate function for recalculation
59
+ * Indicators call this to enable automatic recalculation on input changes
60
+ * @param fn - The calculate function to register
61
+ */
62
+ export function registerCalculate(fn: () => void): void {
63
+ calculateFn = fn;
64
+ }
65
+
66
+ /**
67
+ * Trigger recalculation of the current indicator
68
+ * Clears existing plots and re-invokes the registered calculate function
69
+ */
70
+ export function recalculate(): void {
71
+ if (calculateFn) {
72
+ clearPlots();
73
+ plotCounter = 0;
74
+ calculateFn();
75
+ }
76
+ }
77
+
78
+ /**
79
+ * Clear all active plots from the chart
80
+ * Called internally before recalculation
81
+ */
82
+ export function clearPlots(): void {
83
+ if (context) {
84
+ for (const plot of activePlots) {
85
+ try {
86
+ context.chart.removeSeries(plot.series);
87
+ } catch {
88
+ // Ignore errors during cleanup
89
+ }
90
+ }
91
+ }
92
+ activePlots.length = 0;
93
+ }
94
+
95
+ /**
96
+ * Map plot style string to lightweight-charts series type
97
+ * @param style - Plot style string
98
+ * @returns Series type string
99
+ */
100
+ function getSeriesType(style?: string): string {
101
+ switch (style) {
102
+ case 'histogram':
103
+ case 'columns':
104
+ return 'histogram';
105
+ case 'area':
106
+ case 'areabr':
107
+ return 'area';
108
+ case 'circles':
109
+ case 'cross':
110
+ return 'line'; // Use line with markers
111
+ default:
112
+ return 'line';
113
+ }
114
+ }
115
+
116
+ /**
117
+ * Map line style string to numeric value
118
+ * @param style - Line style string
119
+ * @returns Numeric line style
120
+ */
121
+ function getLineStyle(style?: string): number {
122
+ switch (style) {
123
+ case 'dotted':
124
+ return 1;
125
+ case 'dashed':
126
+ return 2;
127
+ case 'solid':
128
+ default:
129
+ return 0;
130
+ }
131
+ }
132
+
133
+ /**
134
+ * Plot a series on the chart
135
+ * @param series - Array of values to plot
136
+ * @param title - Plot title (optional)
137
+ * @param color - Plot color (optional)
138
+ * @param linewidth - Line width (optional)
139
+ * @param style - Plot style (optional)
140
+ * @returns Unique plot ID for this plot
141
+ */
142
+ export function plot(
143
+ series: number[],
144
+ title?: string,
145
+ color?: string,
146
+ linewidth?: number,
147
+ style?: string,
148
+ colors?: string[]
149
+ ): string {
150
+ if (!context) {
151
+ throw new Error('OakScript context not set. Call setContext() before plotting.');
152
+ }
153
+
154
+ const plotId = `plot_${plotCounter++}${title ? '_' + title.replace(/\s+/g, '_') : ''}`;
155
+
156
+ const seriesType = getSeriesType(style);
157
+ const options: SeriesOptions = {
158
+ color: color,
159
+ lineWidth: linewidth,
160
+ lineStyle: getLineStyle(style),
161
+ };
162
+
163
+ // Create series on chart
164
+ const seriesHandle = context.chart.addSeries(seriesType, options);
165
+
166
+ // Convert series data to time-value pairs
167
+ const data: Array<{ time: number; value: number; color?: string }> = [];
168
+ for (let index = 0; index < series.length; index++) {
169
+ const value = series[index];
170
+ const time = context.ohlcv.time[index];
171
+ if (time !== undefined && value !== undefined && !Number.isNaN(value)) {
172
+ const point: { time: number; value: number; color?: string } = { time, value };
173
+ if (colors && colors[index]) {
174
+ point.color = colors[index];
175
+ }
176
+ data.push(point);
177
+ }
178
+ }
179
+
180
+ // Set the data
181
+ seriesHandle.setData(data);
182
+
183
+ // Track the plot for cleanup
184
+ activePlots.push({ id: plotId, series: seriesHandle });
185
+
186
+ return plotId;
187
+ }
188
+
189
+ /**
190
+ * Draw a horizontal line on the chart
191
+ * @param price - Y-axis value for the line
192
+ * @param title - Line title (optional)
193
+ * @param color - Line color (optional)
194
+ * @param linestyle - Line style (optional, default dashed as PineScript)
195
+ * @param linewidth - Line width (optional)
196
+ * @returns Unique hline ID
197
+ */
198
+ export function hline(
199
+ price: number,
200
+ title?: string,
201
+ color?: string,
202
+ linestyle?: string,
203
+ linewidth?: number
204
+ ): string {
205
+ if (!context) {
206
+ throw new Error('OakScript context not set. Call setContext() before creating hlines.');
207
+ }
208
+
209
+ const hlineId = `hline_${plotCounter++}${title ? '_' + title.replace(/\s+/g, '_') : ''}`;
210
+
211
+ const options: SeriesOptions = {
212
+ color: color,
213
+ lineWidth: linewidth,
214
+ lineStyle: getLineStyle(linestyle ?? 'dashed'),
215
+ };
216
+
217
+ // Create a line series for the hline
218
+ const seriesHandle = context.chart.addSeries('line', options);
219
+
220
+ // Create horizontal line data (constant value across all time points)
221
+ const data = context.ohlcv.time.map(time => ({
222
+ time: time,
223
+ value: price,
224
+ }));
225
+
226
+ seriesHandle.setData(data);
227
+
228
+ // Track the hline for cleanup
229
+ activePlots.push({ id: hlineId, series: seriesHandle });
230
+
231
+ return hlineId;
232
+ }
233
+
234
+ /**
235
+ * Get the active plots array (for testing purposes)
236
+ * @returns Array of active plots
237
+ * @internal
238
+ */
239
+ export function getActivePlots(): ReadonlyArray<ActivePlot> {
240
+ return activePlots;
241
+ }