oakscriptjs 0.8.2 → 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 (546) 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 -7981
  461. package/dist/index.d.ts +0 -64
  462. package/dist/index.d.ts.map +0 -1
  463. package/dist/index.mjs +0 -7964
  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 -126
  503. package/dist/runtime/types.d.ts.map +0 -1
  504. package/dist/script/index.cjs +0 -6377
  505. package/dist/script/index.d.ts +0 -713
  506. package/dist/script/index.d.ts.map +0 -1
  507. package/dist/script/index.mjs +0 -6360
  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/running-sum.d.ts +0 -3
  526. package/dist/ta/running-sum.d.ts.map +0 -1
  527. package/dist/ta-series.d.ts +0 -143
  528. package/dist/ta-series.d.ts.map +0 -1
  529. package/dist/text/index.d.ts +0 -4
  530. package/dist/text/index.d.ts.map +0 -1
  531. package/dist/time/datestring.d.ts +0 -2
  532. package/dist/time/datestring.d.ts.map +0 -1
  533. package/dist/time/index.d.ts +0 -15
  534. package/dist/time/index.d.ts.map +0 -1
  535. package/dist/time/session.d.ts +0 -2
  536. package/dist/time/session.d.ts.map +0 -1
  537. package/dist/time/timezone.d.ts +0 -13
  538. package/dist/time/timezone.d.ts.map +0 -1
  539. package/dist/timeframe/index.d.ts +0 -17
  540. package/dist/timeframe/index.d.ts.map +0 -1
  541. package/dist/types/index.d.ts +0 -181
  542. package/dist/types/index.d.ts.map +0 -1
  543. package/dist/types/metadata.d.ts +0 -132
  544. package/dist/types/metadata.d.ts.map +0 -1
  545. package/dist/utils/index.d.ts +0 -26
  546. package/dist/utils/index.d.ts.map +0 -1
@@ -0,0 +1,644 @@
1
+ /**
2
+ * @fileoverview Simplified Series class for lazy time-series computation
3
+ * Represents a time-series of values with lazy evaluation
4
+ * @module runtime/series
5
+ */
6
+
7
+ import * as compare from '../compare/index.js';
8
+ import type { Bar } from '../types/index.js';
9
+
10
+ /**
11
+ * Function that computes a value for each bar
12
+ */
13
+ export type SeriesExtractor = (bar: Bar, index: number, data: Bar[]) => number;
14
+
15
+ /**
16
+ * BarData - Versioned wrapper around Bar[] array for cache invalidation
17
+ *
18
+ * This class wraps a Bar[] array and tracks a version number that increments
19
+ * whenever the data is mutated. Series objects reference this to detect when
20
+ * their cached values need to be recomputed.
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * const barData = new BarData(bars);
25
+ * const close = Series.fromBars(barData, 'close');
26
+ * const values1 = close.toArray(); // Computes and caches
27
+ *
28
+ * barData.push(newBar); // Increments version
29
+ * const values2 = close.toArray(); // Detects stale cache, recomputes
30
+ * ```
31
+ */
32
+ export class BarData {
33
+ private _bars: Bar[];
34
+ private _version: number = 0;
35
+
36
+ /**
37
+ * Create a new BarData wrapper
38
+ * @param bars - Initial bar data (defaults to empty array)
39
+ */
40
+ constructor(bars: Bar[] = []) {
41
+ this._bars = bars;
42
+ }
43
+
44
+ /**
45
+ * Get the current version number
46
+ * Version increments whenever data is mutated
47
+ */
48
+ get version(): number {
49
+ return this._version;
50
+ }
51
+
52
+ /**
53
+ * Get the underlying bar array
54
+ * Note: Direct mutations to this array will NOT increment version
55
+ * Use the provided mutation methods instead
56
+ */
57
+ get bars(): Bar[] {
58
+ return this._bars;
59
+ }
60
+
61
+ /**
62
+ * Get the number of bars
63
+ */
64
+ get length(): number {
65
+ return this._bars.length;
66
+ }
67
+
68
+ /**
69
+ * Add a new bar to the end
70
+ * @param bar - Bar to add
71
+ */
72
+ push(bar: Bar): void {
73
+ this._bars.push(bar);
74
+ this._version++;
75
+ }
76
+
77
+ /**
78
+ * Remove and return the last bar
79
+ * @returns The removed bar, or undefined if empty
80
+ */
81
+ pop(): Bar | undefined {
82
+ const bar = this._bars.pop();
83
+ if (bar !== undefined) {
84
+ this._version++;
85
+ }
86
+ return bar;
87
+ }
88
+
89
+ /**
90
+ * Replace a bar at a specific index
91
+ * @param index - Index to update
92
+ * @param bar - New bar data
93
+ */
94
+ set(index: number, bar: Bar): void {
95
+ if (index >= 0 && index < this._bars.length) {
96
+ this._bars[index] = bar;
97
+ this._version++;
98
+ }
99
+ }
100
+
101
+ /**
102
+ * Update the last bar (useful for real-time/streaming updates)
103
+ * @param bar - New bar data
104
+ */
105
+ updateLast(bar: Bar): void {
106
+ if (this._bars.length > 0) {
107
+ this._bars[this._bars.length - 1] = bar;
108
+ this._version++;
109
+ }
110
+ }
111
+
112
+ /**
113
+ * Replace all bars with new data
114
+ * @param bars - New bar array
115
+ */
116
+ setAll(bars: Bar[]): void {
117
+ this._bars = bars;
118
+ this._version++;
119
+ }
120
+
121
+ /**
122
+ * Manually increment version (for advanced use cases)
123
+ * Call this after direct mutations to the bars array
124
+ */
125
+ invalidate(): void {
126
+ this._version++;
127
+ }
128
+
129
+ /**
130
+ * Get a bar at a specific index
131
+ * @param index - Bar index
132
+ * @returns Bar at that index, or undefined
133
+ */
134
+ at(index: number): Bar | undefined {
135
+ return this._bars[index];
136
+ }
137
+
138
+ /**
139
+ * Create a BarData from an existing Bar array
140
+ * @param bars - Bar array
141
+ * @returns New BarData instance
142
+ */
143
+ static from(bars: Bar[]): BarData {
144
+ return new BarData(bars);
145
+ }
146
+ }
147
+
148
+ /**
149
+ * Series - represents a time-series of values with lazy evaluation
150
+ *
151
+ * Series are lazy - they don't compute values until needed.
152
+ * Operations on Series return new Series with composed extractors.
153
+ *
154
+ * Now supports automatic cache invalidation via BarData versioning
155
+ * and memory-efficient closure chain breaking via materialize().
156
+ *
157
+ * @example
158
+ * ```typescript
159
+ * // Basic usage (backward compatible)
160
+ * const close = Series.fromBars(bars, 'close');
161
+ * const open = Series.fromBars(bars, 'open');
162
+ * const range = close.sub(open); // Creates new Series, doesn't compute yet
163
+ * const values = range.toArray(); // Now computes for all bars
164
+ *
165
+ * // With automatic cache invalidation
166
+ * const barData = new BarData(bars);
167
+ * const close = Series.fromBars(barData, 'close');
168
+ * const values1 = close.toArray(); // Computes and caches
169
+ * barData.push(newBar); // Version increments
170
+ * const values2 = close.toArray(); // Detects stale cache, recomputes
171
+ *
172
+ * // Breaking closure chains for memory efficiency
173
+ * const complex = a.add(b).mul(c).div(d).sub(e);
174
+ * const materialized = complex.materialize(); // Breaks closure chain
175
+ * ```
176
+ */
177
+ export class Series {
178
+ private extractor: SeriesExtractor;
179
+ private dataSource: BarData;
180
+ private cached: number[] | null = null;
181
+ private cachedVersion: number = -1;
182
+
183
+ /**
184
+ * Create a new Series
185
+ *
186
+ * @param data - Bar data (Bar[] or BarData)
187
+ * @param extractor - Function to extract/compute value for each bar
188
+ */
189
+ constructor(data: Bar[] | BarData, extractor: SeriesExtractor) {
190
+ // Support both Bar[] and BarData for backward compatibility
191
+ this.dataSource = data instanceof BarData ? data : new BarData(data);
192
+ this.extractor = extractor;
193
+ }
194
+
195
+ /**
196
+ * Get the underlying bar data
197
+ * @returns Bar array
198
+ */
199
+ get bars(): Bar[] {
200
+ return this.dataSource.bars;
201
+ }
202
+
203
+ /**
204
+ * Get the underlying BarData source
205
+ * @returns BarData instance
206
+ */
207
+ get barData(): BarData {
208
+ return this.dataSource;
209
+ }
210
+
211
+ // ============================================
212
+ // Static Factory Methods
213
+ // ============================================
214
+
215
+ /**
216
+ * Create Series from bar data by extracting a specific field
217
+ * @param bars - Bar data (Bar[] or BarData)
218
+ * @param field - Field to extract ('open', 'high', 'low', 'close', 'volume')
219
+ * @returns Series with extracted field values
220
+ */
221
+ static fromBars(bars: Bar[] | BarData, field: 'open' | 'high' | 'low' | 'close' | 'volume'): Series {
222
+ return new Series(bars, (bar) => bar[field] ?? NaN);
223
+ }
224
+
225
+ /**
226
+ * Create a constant series (same value for all bars)
227
+ * @param bars - Bar data (Bar[] or BarData)
228
+ * @param value - Constant value
229
+ * @returns Series with constant value
230
+ */
231
+ static constant(bars: Bar[] | BarData, value: number): Series {
232
+ return new Series(bars, () => value);
233
+ }
234
+
235
+ /**
236
+ * Create series from array of values
237
+ * @param bars - Bar data (Bar[] or BarData) for time alignment
238
+ * @param values - Array of values
239
+ * @returns Series
240
+ * @throws When read on other bars with a different length than `values` (e.g. a series computed on the
241
+ * chart bars and read inside a `request.security` expression, which runs on the higher-timeframe bars)
242
+ */
243
+ static fromArray(bars: Bar[] | BarData, values: number[]): Series {
244
+ const origin = bars instanceof BarData ? bars.bars : bars;
245
+ return new Series(bars, (_bar, i, data) => {
246
+ if (data !== origin && data.length !== values.length) {
247
+ throw new Error(
248
+ `Series values were computed on other bars (${values.length} values, ${data.length} bars). ` +
249
+ 'Inside request.security(), compute the series inside the expression, e.g. () => ta.ema(close, 10).'
250
+ );
251
+ }
252
+ return values[i] ?? NaN;
253
+ });
254
+ }
255
+
256
+ // ============================================
257
+ // Arithmetic Operations
258
+ // ============================================
259
+
260
+ /**
261
+ * Add two series or a series and a number
262
+ * @param other - Series or number to add
263
+ * @returns New Series representing the sum
264
+ */
265
+ add(other: Series | number): Series {
266
+ return new Series(this.dataSource, (bar, i, data) => {
267
+ const a = this.extractor(bar, i, data);
268
+ const b = typeof other === 'number' ? other : other.extractor(bar, i, data);
269
+ return a + b;
270
+ });
271
+ }
272
+
273
+ /**
274
+ * Subtract two series or subtract a number from a series
275
+ * @param other - Series or number to subtract
276
+ * @returns New Series representing the difference
277
+ */
278
+ sub(other: Series | number): Series {
279
+ return new Series(this.dataSource, (bar, i, data) => {
280
+ const a = this.extractor(bar, i, data);
281
+ const b = typeof other === 'number' ? other : other.extractor(bar, i, data);
282
+ return a - b;
283
+ });
284
+ }
285
+
286
+ /**
287
+ * Multiply two series or a series by a number
288
+ * @param other - Series or number to multiply
289
+ * @returns New Series representing the product
290
+ */
291
+ mul(other: Series | number): Series {
292
+ return new Series(this.dataSource, (bar, i, data) => {
293
+ const a = this.extractor(bar, i, data);
294
+ const b = typeof other === 'number' ? other : other.extractor(bar, i, data);
295
+ return a * b;
296
+ });
297
+ }
298
+
299
+ /**
300
+ * Raise the series to a power (PineScript math.pow on a series)
301
+ * @param exponent - Series or number exponent
302
+ * @returns New Series representing base ** exponent
303
+ */
304
+ pow(exponent: Series | number): Series {
305
+ return new Series(this.dataSource, (bar, i, data) => {
306
+ const a = this.extractor(bar, i, data);
307
+ const b = typeof exponent === 'number' ? exponent : exponent.extractor(bar, i, data);
308
+ return Math.pow(a, b);
309
+ });
310
+ }
311
+
312
+ /**
313
+ * Divide two series or a series by a number
314
+ * @param other - Series or number to divide by
315
+ * @returns New Series representing the quotient
316
+ */
317
+ div(other: Series | number): Series {
318
+ return new Series(this.dataSource, (bar, i, data) => {
319
+ const a = this.extractor(bar, i, data);
320
+ const b = typeof other === 'number' ? other : other.extractor(bar, i, data);
321
+ return a / b; // PineScript: x / 0 is +/-Infinity (na() is true for it), 0 / 0 is na
322
+ });
323
+ }
324
+
325
+ /**
326
+ * Modulo operation
327
+ * @param other - Series or number for modulo
328
+ * @returns New Series representing the remainder
329
+ */
330
+ mod(other: Series | number): Series {
331
+ return new Series(this.dataSource, (bar, i, data) => {
332
+ const a = this.extractor(bar, i, data);
333
+ const b = typeof other === 'number' ? other : other.extractor(bar, i, data);
334
+ return b !== 0 ? a % b : NaN;
335
+ });
336
+ }
337
+
338
+ /**
339
+ * Negation
340
+ * @returns New Series with negated values
341
+ */
342
+ neg(): Series {
343
+ return new Series(this.dataSource, (bar, i, data) => {
344
+ return -this.extractor(bar, i, data);
345
+ });
346
+ }
347
+
348
+ // ============================================
349
+ // Comparison Operations (PineScript operators: tolerance 1e-10, false with na; see src/compare)
350
+ // ============================================
351
+
352
+ /**
353
+ * Greater than comparison
354
+ * @param other - Series or number to compare
355
+ * @returns New Series with 1 where true, 0 where false
356
+ */
357
+ gt(other: Series | number): Series {
358
+ return new Series(this.dataSource, (bar, i, data) => {
359
+ const a = this.extractor(bar, i, data);
360
+ const b = typeof other === 'number' ? other : other.extractor(bar, i, data);
361
+ return compare.gt(a, b) ? 1 : 0;
362
+ });
363
+ }
364
+
365
+ /**
366
+ * Greater than or equal comparison
367
+ * @param other - Series or number to compare
368
+ * @returns New Series with 1 where true, 0 where false
369
+ */
370
+ gte(other: Series | number): Series {
371
+ return new Series(this.dataSource, (bar, i, data) => {
372
+ const a = this.extractor(bar, i, data);
373
+ const b = typeof other === 'number' ? other : other.extractor(bar, i, data);
374
+ return compare.ge(a, b) ? 1 : 0;
375
+ });
376
+ }
377
+
378
+ /**
379
+ * Less than comparison
380
+ * @param other - Series or number to compare
381
+ * @returns New Series with 1 where true, 0 where false
382
+ */
383
+ lt(other: Series | number): Series {
384
+ return new Series(this.dataSource, (bar, i, data) => {
385
+ const a = this.extractor(bar, i, data);
386
+ const b = typeof other === 'number' ? other : other.extractor(bar, i, data);
387
+ return compare.lt(a, b) ? 1 : 0;
388
+ });
389
+ }
390
+
391
+ /**
392
+ * Less than or equal comparison
393
+ * @param other - Series or number to compare
394
+ * @returns New Series with 1 where true, 0 where false
395
+ */
396
+ lte(other: Series | number): Series {
397
+ return new Series(this.dataSource, (bar, i, data) => {
398
+ const a = this.extractor(bar, i, data);
399
+ const b = typeof other === 'number' ? other : other.extractor(bar, i, data);
400
+ return compare.le(a, b) ? 1 : 0;
401
+ });
402
+ }
403
+
404
+ /**
405
+ * Equality comparison
406
+ * @param other - Series or number to compare
407
+ * @returns New Series with 1 where true, 0 where false
408
+ */
409
+ eq(other: Series | number): Series {
410
+ return new Series(this.dataSource, (bar, i, data) => {
411
+ const a = this.extractor(bar, i, data);
412
+ const b = typeof other === 'number' ? other : other.extractor(bar, i, data);
413
+ return compare.eq(a, b) ? 1 : 0;
414
+ });
415
+ }
416
+
417
+ /**
418
+ * Not equal comparison
419
+ * @param other - Series or number to compare
420
+ * @returns New Series with 1 where true, 0 where false
421
+ */
422
+ neq(other: Series | number): Series {
423
+ return new Series(this.dataSource, (bar, i, data) => {
424
+ const a = this.extractor(bar, i, data);
425
+ const b = typeof other === 'number' ? other : other.extractor(bar, i, data);
426
+ return compare.ne(a, b) ? 1 : 0;
427
+ });
428
+ }
429
+
430
+ // ============================================
431
+ // Logical Operations (for boolean series)
432
+ // ============================================
433
+
434
+ /**
435
+ * Logical AND
436
+ * @param other - Series or number (truthy/falsy)
437
+ * @returns New Series with 1 where both true, 0 otherwise
438
+ */
439
+ and(other: Series | number): Series {
440
+ return new Series(this.dataSource, (bar, i, data) => {
441
+ const a = this.extractor(bar, i, data);
442
+ const b = typeof other === 'number' ? other : other.extractor(bar, i, data);
443
+ return a && b ? 1 : 0;
444
+ });
445
+ }
446
+
447
+ /**
448
+ * Logical OR
449
+ * @param other - Series or number (truthy/falsy)
450
+ * @returns New Series with 1 where either true, 0 otherwise
451
+ */
452
+ or(other: Series | number): Series {
453
+ return new Series(this.dataSource, (bar, i, data) => {
454
+ const a = this.extractor(bar, i, data);
455
+ const b = typeof other === 'number' ? other : other.extractor(bar, i, data);
456
+ return a || b ? 1 : 0;
457
+ });
458
+ }
459
+
460
+ /**
461
+ * Logical NOT
462
+ * @returns New Series with inverted boolean values
463
+ */
464
+ not(): Series {
465
+ return new Series(this.dataSource, (bar, i, data) => {
466
+ const a = this.extractor(bar, i, data);
467
+ return !a ? 1 : 0;
468
+ });
469
+ }
470
+
471
+ // ============================================
472
+ // Conditional Selection
473
+ // ============================================
474
+
475
+ /**
476
+ * Bar-by-bar conditional selection (ternary operator for Series)
477
+ * Uses this Series as the condition (truthy = nonzero, falsy = zero/NaN)
478
+ *
479
+ * @param trueValue - Value or Series to use when condition is truthy
480
+ * @param falseValue - Value or Series to use when condition is falsy
481
+ * @returns New Series with bar-by-bar selected values
482
+ *
483
+ * @example
484
+ * ```typescript
485
+ * // PineScript: result = condition ? trueVal : falseVal
486
+ * const result = condition.iff(trueVal, falseVal);
487
+ *
488
+ * // Example: RSI formula uses ternary for edge cases
489
+ * // rsi = down == 0 ? 100 : up == 0 ? 0 : formula
490
+ * const rsi = down.eq(0).iff(100, up.eq(0).iff(0, formula));
491
+ * ```
492
+ */
493
+ iff(trueValue: Series | number, falseValue: Series | number): Series {
494
+ return new Series(this.dataSource, (bar, i, data) => {
495
+ const condition = this.extractor(bar, i, data);
496
+ // Truthy: nonzero and not NaN
497
+ const isTruthy = condition !== 0 && !Number.isNaN(condition);
498
+
499
+ if (isTruthy) {
500
+ return typeof trueValue === 'number' ? trueValue : trueValue.extractor(bar, i, data);
501
+ } else {
502
+ return typeof falseValue === 'number' ? falseValue : falseValue.extractor(bar, i, data);
503
+ }
504
+ });
505
+ }
506
+
507
+ // ============================================
508
+ // Offset/History
509
+ // ============================================
510
+
511
+ /**
512
+ * Access previous bars (like close[1] in PineScript)
513
+ * @param offset - Number of bars back (0 or more)
514
+ * @returns New Series with offset values
515
+ * @throws RangeError when `offset` is negative
516
+ */
517
+ offset(offset: number): Series {
518
+ if (offset < 0) throw new RangeError(`Series.offset(${offset}): the offset cannot be negative (it would read a future bar).`);
519
+ return new Series(this.dataSource, (_bar, i, data) => {
520
+ const targetIndex = i - offset;
521
+ if (targetIndex < 0 || targetIndex >= data.length) {
522
+ return NaN;
523
+ }
524
+ return this.extractor(data[targetIndex]!, targetIndex, data);
525
+ });
526
+ }
527
+
528
+ // ============================================
529
+ // Computation & Access
530
+ // ============================================
531
+
532
+ /**
533
+ * Compute all values for the series
534
+ *
535
+ * Now includes automatic cache invalidation:
536
+ * - Checks if dataSource version has changed since cache was computed
537
+ * - Recomputes if version mismatch detected
538
+ * - Stores version when cache is created
539
+ *
540
+ * @returns Array of computed values
541
+ */
542
+ toArray(): number[] {
543
+ // Check if cache is valid by comparing versions
544
+ if (this.cached !== null && this.cachedVersion === this.dataSource.version) {
545
+ return this.cached;
546
+ }
547
+
548
+ // Recompute and update cache
549
+ const bars = this.dataSource.bars;
550
+ this.cached = bars.map((bar, i) => this.extractor(bar, i, bars));
551
+ this.cachedVersion = this.dataSource.version;
552
+ return this.cached;
553
+ }
554
+
555
+ /**
556
+ * Materialize this Series by eagerly computing values and breaking closure chain
557
+ *
558
+ * This method addresses the closure chain memory leak issue:
559
+ * - Computes all values immediately
560
+ * - Creates a new Series that stores values directly
561
+ * - Breaks references to parent Series objects
562
+ * - Useful for complex expressions to free intermediate Series memory
563
+ *
564
+ * @example
565
+ * ```typescript
566
+ * // Without materialize: keeps a, b, c, d in memory via closures
567
+ * const result = a.add(b).mul(c).div(d).sub(e);
568
+ *
569
+ * // With materialize: breaks chain, frees a, b, c memory
570
+ * const result = a.add(b).mul(c).materialize().div(d).sub(e);
571
+ * ```
572
+ *
573
+ * @returns New Series with computed values and no closure dependencies
574
+ */
575
+ materialize(): Series {
576
+ const values = this.toArray();
577
+ // Create a copy of values to ensure no shared references
578
+ const valuesCopy = [...values];
579
+ return Series.fromArray(this.dataSource, valuesCopy);
580
+ }
581
+
582
+ /**
583
+ * Invalidate cache (when data changes)
584
+ *
585
+ * Note: With BarData versioning, manual invalidation is rarely needed.
586
+ * The cache is automatically invalidated when the underlying BarData changes.
587
+ * This method is kept for backward compatibility and advanced use cases.
588
+ *
589
+ * @internal
590
+ */
591
+ _invalidate(): void {
592
+ this.cached = null;
593
+ this.cachedVersion = -1;
594
+ }
595
+
596
+ /**
597
+ * Compute all values (alias for toArray)
598
+ * @returns Array of computed values
599
+ * @internal
600
+ */
601
+ _compute(): number[] {
602
+ return this.toArray();
603
+ }
604
+
605
+ /**
606
+ * Get value at specific index
607
+ * @param index - Bar index
608
+ * @returns Value at that index
609
+ */
610
+ get(index: number): number {
611
+ const values = this.toArray();
612
+ return values[index] ?? NaN;
613
+ }
614
+
615
+ /**
616
+ * Get the last value (most recent bar)
617
+ * @returns Most recent value
618
+ */
619
+ last(): number {
620
+ const values = this.toArray();
621
+ return values[values.length - 1] ?? NaN;
622
+ }
623
+
624
+ /**
625
+ * Get number of values
626
+ * @returns Length of series
627
+ */
628
+ length(): number {
629
+ return this.dataSource.length;
630
+ }
631
+
632
+ /**
633
+ * Convert series to time-value pairs for charting
634
+ * @returns Array of { time, value } objects
635
+ */
636
+ toTimeValuePairs(): Array<{ time: any; value: number }> {
637
+ const values = this.toArray();
638
+ const bars = this.dataSource.bars;
639
+ return bars.map((bar, i) => ({
640
+ time: bar.time,
641
+ value: values[i]!
642
+ })).filter(point => !Number.isNaN(point.value));
643
+ }
644
+ }