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,14 @@
1
+ /**
2
+ * Text namespace
3
+ * PineScript `text.format_*` constants for `label.set_text_formatting` and `box.set_text_formatting`.
4
+ *
5
+ * The values are flags that add up, as in PineScript (`text.format_bold + text.format_italic`).
6
+ * They are the values PineScript uses for drawn labels and boxes.
7
+ */
8
+
9
+ /** No formatting. */
10
+ export const format_none = 0;
11
+ /** Bold text. */
12
+ export const format_bold = 1;
13
+ /** Italic text. */
14
+ export const format_italic = 2;
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Date strings of `timestamp(dateString)`: IETF RFC 2822 and ISO 8601.
3
+ *
4
+ * Accepted forms (case-insensitive), all with an optional time zone at the end:
5
+ * - "2020-02-20", "2020-2-5", "2020/02/20", "2020-02-20 14:48", "2020-02-20 9:30:15"
6
+ * - "2020-02-20T14:48:00", "2020-02-20T14:48:00.250", "2020-02-20T14:48:00+05:30"
7
+ * - "20 Feb 2020", "5-Jan-2024", "Thu, 20 Feb 2020 14:48:00", "20 February 2020 14:48"
8
+ * - "Feb 20 2020 14:48:05", "Jan 5, 2024 09:30"
9
+ *
10
+ * Time zones: "UT", "UTC", "GMT", "+0530", "-05:00", "GMT+5", "UTC-0300", and the RFC 2822
11
+ * names EST, EDT, CST, CDT, MST, MDT, PST, PDT. After a "T" time, only numeric offsets.
12
+ * Without a time the time is 00:00. Without a time zone the time zone is GMT+0.
13
+ * "24:00" is midnight at the end of the day.
14
+ *
15
+ * "Z", "2024-01-01T09:30:00 GMT", "24:30" and "09:30:60" are compile errors in PineScript, and
16
+ * errors here.
17
+ */
18
+
19
+ const MONTHS = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];
20
+ const FULL_MONTHS = [
21
+ 'january', 'february', 'march', 'april', 'may', 'june',
22
+ 'july', 'august', 'september', 'october', 'november', 'december',
23
+ ];
24
+
25
+ /** RFC 2822 obsolete zone names, in hours from UTC. */
26
+ const ZONE_NAMES: Record<string, number> = {
27
+ ut: 0, utc: 0, gmt: 0,
28
+ est: -5, edt: -4, cst: -6, cdt: -5, mst: -7, mdt: -6, pst: -8, pdt: -7,
29
+ };
30
+
31
+ const TIME = String.raw`(\d{1,2}):(\d{2})(?::(\d{2})(?:\.(\d{1,3})\d*)?)?`;
32
+ const ZONE = String.raw`(ut|utc|gmt|[ecmp][sd]t|(?:utc|gmt)?\s*[+-]\d{1,2}(?::?\d{2})?)`;
33
+ const NUMERIC_ZONE = String.raw`([+-]\d{2}(?::?\d{2})?)`;
34
+ const DATE = String.raw`(\d{4})([-/])(\d{1,2})\2(\d{1,2})`;
35
+ const WEEKDAY = String.raw`(?:[a-z]{3,9},?\s+)?`;
36
+
37
+ const ISO_T = new RegExp(String.raw`^${DATE}t${TIME}\s*${NUMERIC_ZONE}?$`, 'i');
38
+ const ISO = new RegExp(String.raw`^${DATE}(?:\s+${TIME})?\s*${ZONE}?$`, 'i');
39
+ const DAY_FIRST = new RegExp(String.raw`^${WEEKDAY}(\d{1,2})(?:\s+|-)([a-z]+)\.?,?(?:\s+|-)(\d{4})(?:,?\s+${TIME})?\s*${ZONE}?$`, 'i');
40
+ const MONTH_FIRST = new RegExp(String.raw`^${WEEKDAY}([a-z]+)\.?\s+(\d{1,2}),?\s+(\d{4})(?:,?\s+${TIME})?\s*${ZONE}?$`, 'i');
41
+
42
+ /** Month number (1-12) of an English month name or its prefix of 3+ letters ("Sep", "Sept", "September"). */
43
+ function monthNumber(name: string): number {
44
+ const lower = name.toLowerCase();
45
+ const i = FULL_MONTHS.findIndex((full, k) => lower.startsWith(MONTHS[k]!) && full.startsWith(lower));
46
+ return i + 1;
47
+ }
48
+
49
+ /** Zone offset in minutes from UTC. */
50
+ function zoneMinutes(zone: string | undefined): number {
51
+ if (!zone) return 0;
52
+ const lower = zone.toLowerCase().replace(/\s+/g, '');
53
+ const named = ZONE_NAMES[lower];
54
+ if (named !== undefined) return named * 60;
55
+ const m = /^(?:utc|gmt)?([+-])(\d{1,2})(?::?(\d{2}))?$/.exec(lower);
56
+ if (!m) return NaN;
57
+ const minutes = Number(m[2]) * 60 + (m[3] ? Number(m[3]) : 0);
58
+ return m[1] === '-' ? -minutes : minutes;
59
+ }
60
+
61
+ /**
62
+ * Parses a PineScript date string into a UNIX time in milliseconds.
63
+ * @throws SyntaxError when the string is not in a supported form
64
+ */
65
+ export function parseDateString(dateString: string): number {
66
+ const text = dateString.trim();
67
+ let year: string, month: number, day: string;
68
+ let rest: Array<string | undefined>;
69
+
70
+ let m: RegExpExecArray | null;
71
+ if ((m = ISO_T.exec(text) ?? ISO.exec(text))) {
72
+ [year, month, day] = [m[1]!, Number(m[3]), m[4]!];
73
+ rest = m.slice(5);
74
+ } else if ((m = DAY_FIRST.exec(text))) {
75
+ [day, month, year] = [m[1]!, monthNumber(m[2]!), m[3]!];
76
+ rest = m.slice(4);
77
+ } else if ((m = MONTH_FIRST.exec(text))) {
78
+ [month, day, year] = [monthNumber(m[1]!), m[2]!, m[3]!];
79
+ rest = m.slice(4);
80
+ } else {
81
+ throw new SyntaxError(`Invalid date string "${dateString}": use RFC 2822 or ISO 8601 ("20 Feb 2020", "2020-02-20T14:48:00")`);
82
+ }
83
+
84
+ const [hour = '0', minute = '0', second = '0', millis = '0', zone] = rest;
85
+ const d = Number(day);
86
+ const h = Number(hour);
87
+ const mi = Number(minute);
88
+ const s = Number(second);
89
+ const offset = zoneMinutes(zone);
90
+ const endOfDay = h === 24 && mi === 0 && s === 0 && Number(millis) === 0;
91
+ if (month < 1 || month > 12 || d < 1 || d > 31 || (h > 23 && !endOfDay) || mi > 59 || s > 59 || Number.isNaN(offset)) {
92
+ throw new SyntaxError(`Invalid date string "${dateString}": a field is out of range`);
93
+ }
94
+ const ms = Number(millis.padEnd(3, '0'));
95
+ return Date.UTC(Number(year), month - 1, d, h, mi, s, ms) - offset * 60_000;
96
+ }
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Time namespace
3
+ * Mirrors PineScript's time and calendar functions.
4
+ *
5
+ * Every function takes an explicit time zone: UTC/GMT offset notation ("UTC-5",
6
+ * "GMT+0530", "UTC+05:30") or an IANA name ("America/New_York"). The PineScript
7
+ * default time zone (the exchange time zone, `syminfo.timezone`) is not known here.
8
+ */
9
+
10
+ import type { int, simple_int } from '../types/index.js';
11
+ import { zonedFields, zonedToUnix } from './timezone.js';
12
+ import { parseDateString } from './datestring.js';
13
+ import { inSession as sessionContains } from './session.js';
14
+
15
+ /**
16
+ * Returns the current time in milliseconds
17
+ */
18
+ export function now(): int {
19
+ return Date.now();
20
+ }
21
+
22
+ /**
23
+ * Returns the UNIX time (ms) of a date and time.
24
+ *
25
+ * - `timestamp(dateString)`: RFC 2822 or ISO 8601 date string ("20 Feb 2020",
26
+ * "2020-02-20T14:48:00", "2024-01-01 09:30 +0000", "04 Dec 1995 00:12:00 GMT+5").
27
+ * Without a time the time is 00:00; without a time zone the time zone is GMT+0.
28
+ * - `timestamp(timezone, year, month, day, hour?, minute?, second?)`: calendar fields in `timezone`.
29
+ * A wall-clock time that occurs twice resolves to the later instant; a missing one is
30
+ * shifted forward by the gap (as in PineScript).
31
+ * - `timestamp(year, month, day, hour?, minute?, second?)`: calendar fields in the time zone
32
+ * of the host. PineScript reads them in the exchange time zone, which is not known here:
33
+ * use the `timezone` form for PineScript values.
34
+ *
35
+ * Out-of-range fields roll over (month 13 is January of the next year).
36
+ *
37
+ * @example
38
+ * ```typescript
39
+ * time.timestamp('2024-01-02'); // 1704153600000
40
+ * time.timestamp('America/New_York', 2024, 1, 2, 9, 30); // 1704205800000
41
+ * ```
42
+ */
43
+ export function timestamp(dateString: string): int;
44
+ export function timestamp(
45
+ timezone: string,
46
+ year: simple_int,
47
+ month: simple_int,
48
+ day: simple_int,
49
+ hour?: simple_int,
50
+ minute?: simple_int,
51
+ second?: simple_int
52
+ ): int;
53
+ export function timestamp(
54
+ year: simple_int,
55
+ month: simple_int,
56
+ day: simple_int,
57
+ hour?: simple_int,
58
+ minute?: simple_int,
59
+ second?: simple_int
60
+ ): int;
61
+ export function timestamp(first: string | simple_int, ...rest: Array<simple_int | undefined>): int {
62
+ if (typeof first === 'string') {
63
+ if (rest.length === 0) return parseDateString(first);
64
+ const [year, month, day, hour, minute, second] = rest as [number, number, number, number?, number?, number?];
65
+ return zonedToUnix(first, year, month, day, hour ?? 0, minute ?? 0, second ?? 0);
66
+ }
67
+ const [month, day, hour, minute, second] = rest as [number, number, number?, number?, number?];
68
+ return new Date(first, month - 1, day, hour || 0, minute || 0, second || 0).getTime();
69
+ }
70
+
71
+ // ── Calendar fields ──────────────────────────────────────────────────────────
72
+
73
+ function field(time: number, timezone: string, pick: (f: ReturnType<typeof zonedFields>) => number): int {
74
+ return Number.isNaN(time) ? NaN : pick(zonedFields(time, timezone));
75
+ }
76
+
77
+ /**
78
+ * Year of a UNIX time (ms) in `timezone`.
79
+ */
80
+ export function year(time: int, timezone: string): int {
81
+ return field(time, timezone, (f) => f.year);
82
+ }
83
+
84
+ /**
85
+ * Month (1-12) of a UNIX time (ms) in `timezone`.
86
+ */
87
+ export function month(time: int, timezone: string): int {
88
+ return field(time, timezone, (f) => f.month);
89
+ }
90
+
91
+ /**
92
+ * Day of the month (1-31) of a UNIX time (ms) in `timezone`.
93
+ */
94
+ export function dayofmonth(time: int, timezone: string): int {
95
+ return field(time, timezone, (f) => f.day);
96
+ }
97
+
98
+ /**
99
+ * Day of the week of a UNIX time (ms) in `timezone`: 1 = Sunday, 2 = Monday ... 7 = Saturday
100
+ * (PineScript `dayofweek.sunday` ... `dayofweek.saturday`).
101
+ */
102
+ export function dayofweek(time: int, timezone: string): int {
103
+ return field(time, timezone, (f) => f.dayOfWeek);
104
+ }
105
+
106
+ /**
107
+ * Week number of the year of a UNIX time (ms) in `timezone`.
108
+ *
109
+ * Weeks start on Monday and follow ISO 8601: week 1 is the week that contains the
110
+ * first Thursday of the year, so the first days of January can be in week 52 or 53
111
+ * of the previous year. The PineScript reference does not define the rule.
112
+ */
113
+ export function weekofyear(time: int, timezone: string): int {
114
+ return field(time, timezone, (f) => {
115
+ const date = Date.UTC(f.year, f.month - 1, f.day);
116
+ const mondayBased = (f.dayOfWeek + 5) % 7; // Monday = 0 ... Sunday = 6
117
+ const thursday = new Date(date + (3 - mondayBased) * 86_400_000);
118
+ const yearStart = Date.UTC(thursday.getUTCFullYear(), 0, 1);
119
+ return 1 + Math.floor((thursday.getTime() - yearStart) / (7 * 86_400_000));
120
+ });
121
+ }
122
+
123
+ /**
124
+ * Hour (0-23) of a UNIX time (ms) in `timezone`.
125
+ */
126
+ export function hour(time: int, timezone: string): int {
127
+ return field(time, timezone, (f) => f.hour);
128
+ }
129
+
130
+ /**
131
+ * Minute (0-59) of a UNIX time (ms) in `timezone`.
132
+ */
133
+ export function minute(time: int, timezone: string): int {
134
+ return field(time, timezone, (f) => f.minute);
135
+ }
136
+
137
+ /**
138
+ * Second (0-59) of a UNIX time (ms) in `timezone`.
139
+ */
140
+ export function second(time: int, timezone: string): int {
141
+ return field(time, timezone, (f) => f.second);
142
+ }
143
+
144
+ // ── Sessions ─────────────────────────────────────────────────────────────────
145
+
146
+ /**
147
+ * True when a bar opening at `time` is inside `session`, with the session hours read in `timezone`.
148
+ *
149
+ * This is the session test of PineScript `time(timeframe, session, timezone)`, which returns
150
+ * `na` for bars outside the session: `na(time("1", "0930-1600", "America/New_York"))` is
151
+ * `!time.inSession(barTime, "0930-1600", "America/New_York")`.
152
+ *
153
+ * Session format: "HHmm-HHmm", several periods separated by commas, optional days after
154
+ * ":" (1 = Sunday ... 7 = Saturday), e.g. "0930-1600:23456" or "1000-1100,1400-1500".
155
+ * Without days, one period covers every day and several periods cover Monday to Friday.
156
+ * A period includes its start and excludes its end. An overnight period ("1800-0930")
157
+ * belongs to the day it ends. "0000-0000" and "24x7" cover the whole day.
158
+ */
159
+ export function inSession(time: int, session: string, timezone: string): boolean {
160
+ return sessionContains(time, session, timezone);
161
+ }
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Session strings ("0930-1600", "0930-1600:23456", "1000-1100,1400-1500:23456", "24x7").
3
+ *
4
+ * Format `<periods>[:<days>]`:
5
+ * - a period is "HHmm-HHmm"; several periods are separated by commas
6
+ * - days are digits 1 (Sunday) to 7 (Saturday). Without days, a single period covers every
7
+ * day, and several periods cover Monday to Friday ("23456"), as in PineScript
8
+ * - an end before the start is an overnight period that ends on the next day, and it
9
+ * belongs to the day it ends: "1700-1700:23456" starts Sunday 17:00 and covers Monday
10
+ * - "0000-0000" and "24x7" are the 24-hour session of every day
11
+ */
12
+
13
+ import { zonedFields } from './timezone.js';
14
+
15
+ interface Period {
16
+ /** Minutes after midnight, 0-1439 */
17
+ start: number;
18
+ end: number;
19
+ }
20
+
21
+ interface ParsedSession {
22
+ periods: Period[];
23
+ /** Included days, indexed 1 (Sunday) to 7 (Saturday) */
24
+ days: boolean[];
25
+ }
26
+
27
+ const PERIOD = /^(\d{2})(\d{2})-(\d{2})(\d{2})$/;
28
+
29
+ const sessions = new Map<string, ParsedSession>();
30
+
31
+ function parseSession(session: string): ParsedSession {
32
+ let parsed = sessions.get(session);
33
+ if (parsed) return parsed;
34
+
35
+ const invalid = () => new SyntaxError(`Invalid session "${session}": expected "HHmm-HHmm[,HHmm-HHmm...][:days]"`);
36
+ const text = session.trim() === '24x7' ? '0000-0000' : session.replace(/\s+/g, '');
37
+ const [periodText = '', dayText, extra] = text.split(':');
38
+ if (extra !== undefined || periodText === '') throw invalid();
39
+
40
+ const periods = periodText.split(',').map((p) => {
41
+ const m = PERIOD.exec(p);
42
+ if (!m) throw invalid();
43
+ const [h1, m1, h2, m2] = [m[1], m[2], m[3], m[4]].map(Number) as [number, number, number, number];
44
+ if (h1 > 23 || h2 > 23 || m1 > 59 || m2 > 59) throw invalid();
45
+ return { start: h1 * 60 + m1, end: h2 * 60 + m2 };
46
+ });
47
+
48
+ const dayDigits = dayText ?? (periods.length > 1 ? '23456' : '1234567');
49
+ if (!/^[1-7]+$/.test(dayDigits)) throw invalid();
50
+ const days = new Array<boolean>(8).fill(false);
51
+ for (const d of dayDigits) days[Number(d)] = true;
52
+
53
+ parsed = { periods, days };
54
+ sessions.set(session, parsed);
55
+ return parsed;
56
+ }
57
+
58
+ /**
59
+ * True when `time` falls inside `session`, with the session hours read in `timezone`.
60
+ * A period includes its start minute and excludes its end minute.
61
+ */
62
+ export function inSession(time: number, session: string, timezone: string): boolean {
63
+ if (Number.isNaN(time)) return false;
64
+ const { periods, days } = parseSession(session);
65
+ const f = zonedFields(time, timezone);
66
+ const minute = f.hour * 60 + f.minute;
67
+ const nextDay = (f.dayOfWeek % 7) + 1;
68
+
69
+ for (const { start, end } of periods) {
70
+ if (start < end || (start === 0 && end === 0)) {
71
+ if (minute >= start && (minute < end || end === 0) && days[f.dayOfWeek]) return true;
72
+ } else {
73
+ // Overnight (24 hours when start === end): the part from `start` belongs to the next day.
74
+ if (minute >= start && days[nextDay]) return true;
75
+ if (minute < end && days[f.dayOfWeek]) return true;
76
+ }
77
+ }
78
+ return false;
79
+ }
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Time zone resolution for the calendar functions.
3
+ *
4
+ * PineScript accepts two time zone notations:
5
+ * - UTC/GMT offset notation: "UTC", "UTC-5", "UTC+05:30", "GMT+0530", "GMT+05:30:00", up to ±18:00
6
+ * - IANA time zone database names, case-sensitive: "America/New_York", "Etc/UTC", "US/Eastern", "CET"
7
+ *
8
+ * "utc+2", "america/new_york", "UTC+5:3", "UTC+5:30:15", "GMT+18:01", "EST", "MST" and "HST" are
9
+ * errors in PineScript, and so here.
10
+ *
11
+ * Offsets of IANA zones (daylight saving time and historical changes included)
12
+ * come from the host's `Intl.DateTimeFormat`, so no time zone data ships with the library.
13
+ */
14
+
15
+ const MS_PER_SECOND = 1000;
16
+ const MS_PER_DAY = 86_400_000;
17
+ const MAX_OFFSET_SECONDS = 18 * 3600;
18
+
19
+ const OFFSET_NOTATION = /^(?:UTC|GMT)(?:([+-])(\d{1,2})(?::?(\d{2})(?::?(\d{2}))?)?)?$/;
20
+
21
+ /** Time zone database names that PineScript rejects although `Intl` accepts them. */
22
+ const REJECTED_NAMES = new Set(['EST', 'MST', 'HST']);
23
+
24
+ let canonicalNames: Map<string, string> | undefined;
25
+
26
+ /** False when `name` is a wrong-case spelling of a time zone name (`Intl` matches names case-insensitively). */
27
+ function hasTimeZoneCase(name: string): boolean {
28
+ if (name.split('/').some((segment) => !/^[A-Z]/.test(segment))) return false;
29
+ canonicalNames ??= new Map(Intl.supportedValuesOf('timeZone').map((n) => [n.toLowerCase(), n]));
30
+ const canonical = canonicalNames.get(name.toLowerCase());
31
+ return canonical === undefined || canonical === name;
32
+ }
33
+
34
+ type Zone =
35
+ | { readonly kind: 'fixed'; readonly offsetMs: number }
36
+ | {
37
+ readonly kind: 'iana';
38
+ readonly format: Intl.DateTimeFormat;
39
+ /** Offset of each UTC hour (`floor(time / 1 h)`); null for an hour with an offset change inside */
40
+ readonly hours: Map<number, number | null>;
41
+ };
42
+
43
+ const MS_PER_HOUR = 3_600_000;
44
+ /** Cached hours per zone before the cache restarts (about 11 years of hours) */
45
+ const MAX_CACHED_HOURS = 100_000;
46
+
47
+ const zones = new Map<string, Zone>();
48
+
49
+ function resolveZone(timezone: string): Zone {
50
+ let zone = zones.get(timezone);
51
+ if (zone) return zone;
52
+
53
+ const invalid = () =>
54
+ new RangeError(
55
+ `Invalid time zone "${timezone}": use UTC/GMT offset notation ("UTC-5", "GMT+0530") or an IANA name ("America/New_York")`
56
+ );
57
+ const m = OFFSET_NOTATION.exec(timezone);
58
+ if (m) {
59
+ const [, sign, h = '0', mi = '0', s] = m;
60
+ const minutes = Number(mi);
61
+ const seconds = s === undefined ? 0 : Number(s);
62
+ if (minutes > 59 || seconds > 59 || (s !== undefined && h.length !== 2)) throw invalid();
63
+ const offsetSeconds = Number(h) * 3600 + minutes * 60 + seconds;
64
+ if (offsetSeconds > MAX_OFFSET_SECONDS) throw invalid();
65
+ zone = { kind: 'fixed', offsetMs: (sign === '-' ? -offsetSeconds : offsetSeconds) * MS_PER_SECOND };
66
+ } else {
67
+ if (REJECTED_NAMES.has(timezone) || !hasTimeZoneCase(timezone)) throw invalid();
68
+ let format: Intl.DateTimeFormat;
69
+ try {
70
+ format = new Intl.DateTimeFormat('en-US', {
71
+ timeZone: timezone,
72
+ hourCycle: 'h23',
73
+ year: 'numeric',
74
+ month: 'numeric',
75
+ day: 'numeric',
76
+ hour: 'numeric',
77
+ minute: 'numeric',
78
+ second: 'numeric',
79
+ });
80
+ } catch {
81
+ throw invalid();
82
+ }
83
+ zone = { kind: 'iana', format, hours: new Map() };
84
+ }
85
+ zones.set(timezone, zone);
86
+ return zone;
87
+ }
88
+
89
+ /**
90
+ * Offset of the zone from UTC at instant `time`, in milliseconds (local = UTC + offset).
91
+ * An offset change happens at most once in a UTC hour, so when the first and the last second of the hour have the
92
+ * same offset, the whole hour has it: it is computed once and cached.
93
+ */
94
+ function offsetAt(zone: Zone, time: number): number {
95
+ if (zone.kind === 'fixed') return zone.offsetMs;
96
+ const hour = Math.floor(time / MS_PER_HOUR);
97
+ let offset = zone.hours.get(hour);
98
+ if (offset === undefined) {
99
+ const first = formattedOffset(zone.format, hour * MS_PER_HOUR);
100
+ const last = formattedOffset(zone.format, hour * MS_PER_HOUR + MS_PER_HOUR - MS_PER_SECOND);
101
+ offset = first === last ? first : null;
102
+ if (zone.hours.size >= MAX_CACHED_HOURS) zone.hours.clear();
103
+ zone.hours.set(hour, offset);
104
+ }
105
+ return offset ?? formattedOffset(zone.format, time);
106
+ }
107
+
108
+ /** Offset of the zone at instant `time` (whole second), from the host's `Intl` time zone data. */
109
+ function formattedOffset(format: Intl.DateTimeFormat, time: number): number {
110
+ const wholeSecond = Math.floor(time / 1000) * 1000;
111
+ const f: Record<string, number> = {};
112
+ for (const part of format.formatToParts(wholeSecond)) {
113
+ if (part.type !== 'literal') f[part.type] = Number(part.value);
114
+ }
115
+ const local = Date.UTC(f.year!, f.month! - 1, f.day!, f.hour!, f.minute!, f.second!);
116
+ return local - wholeSecond;
117
+ }
118
+
119
+ /** Calendar fields of a UNIX time in a time zone. */
120
+ export interface ZonedFields {
121
+ year: number;
122
+ /** 1-12 */
123
+ month: number;
124
+ /** 1-31 */
125
+ day: number;
126
+ hour: number;
127
+ minute: number;
128
+ second: number;
129
+ /** 1 = Sunday ... 7 = Saturday (PineScript dayofweek numbering) */
130
+ dayOfWeek: number;
131
+ }
132
+
133
+ /** Offset of `timezone` from UTC at `time`, in milliseconds (local = UTC + offset). */
134
+ export function zoneOffset(time: number, timezone: string): number {
135
+ return offsetAt(resolveZone(timezone), time);
136
+ }
137
+
138
+ /** Splits a UNIX time (ms) into calendar fields in `timezone`. */
139
+ export function zonedFields(time: number, timezone: string): ZonedFields {
140
+ const local = new Date(time + offsetAt(resolveZone(timezone), time));
141
+ return {
142
+ year: local.getUTCFullYear(),
143
+ month: local.getUTCMonth() + 1,
144
+ day: local.getUTCDate(),
145
+ hour: local.getUTCHours(),
146
+ minute: local.getUTCMinutes(),
147
+ second: local.getUTCSeconds(),
148
+ dayOfWeek: local.getUTCDay() + 1,
149
+ };
150
+ }
151
+
152
+ /**
153
+ * Converts a wall-clock date and time in `timezone` to a UNIX time (ms).
154
+ * Out-of-range fields roll over like `Date.UTC` (month 13 is January of the next year).
155
+ *
156
+ * As in PineScript: wall-clock times that occur twice (end of daylight saving time)
157
+ * resolve to the later instant, and wall-clock times that do not exist (start of
158
+ * daylight saving time) are shifted forward by the length of the gap.
159
+ */
160
+ export function zonedToUnix(
161
+ timezone: string,
162
+ year: number,
163
+ month: number,
164
+ day: number,
165
+ hour: number = 0,
166
+ minute: number = 0,
167
+ second: number = 0
168
+ ): number {
169
+ const zone = resolveZone(timezone);
170
+ const local = Date.UTC(year, month - 1, day, hour, minute, second);
171
+ if (zone.kind === 'fixed') return local - zone.offsetMs;
172
+
173
+ // At most one offset transition happens within a day of `local`: the offsets
174
+ // one day before and one day after are the two candidates.
175
+ const before = offsetAt(zone, local - MS_PER_DAY);
176
+ const after = offsetAt(zone, local + MS_PER_DAY);
177
+ const candidates = [local - before, local - after].filter((t) => local - offsetAt(zone, t) === t);
178
+ if (candidates.length) return Math.max(...candidates);
179
+ return local - before;
180
+ }
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Timeframe namespace
3
+ * Mirrors PineScript's timeframe string functions.
4
+ *
5
+ * Timeframe strings: a multiplier and a unit letter, "S" seconds, "D" days,
6
+ * "W" weeks, "M" months, "T" ticks, no letter for minutes ("60" is one hour, "1H" is not valid).
7
+ * Without a multiplier, 1 is used ("D" is "1D").
8
+ */
9
+
10
+ import type { int, simple_string } from '../types/index.js';
11
+
12
+ const SECONDS_PER_MINUTE = 60;
13
+ const SECONDS_PER_DAY = 86_400;
14
+ const SECONDS_PER_WEEK = 604_800;
15
+ /** PineScript uses 365/12 days (30.4167) for one month. */
16
+ const SECONDS_PER_MONTH = 2_628_003;
17
+ /** From 365 days, `from_seconds` returns "12M". */
18
+ const SECONDS_365_DAYS = 365 * SECONDS_PER_DAY;
19
+
20
+ const UNIT_SECONDS: Record<string, number> = {
21
+ S: 1,
22
+ '': SECONDS_PER_MINUTE,
23
+ D: SECONDS_PER_DAY,
24
+ W: SECONDS_PER_WEEK,
25
+ M: SECONDS_PER_MONTH,
26
+ };
27
+
28
+ /** Second-based timeframes that `from_seconds` can return. */
29
+ const SECOND_TIMEFRAMES = [1, 5, 10, 15, 30];
30
+
31
+ /**
32
+ * Converts a timeframe string into seconds.
33
+ *
34
+ * As in PineScript: months count 2,628,003 seconds (365/12 days), any multiplier is
35
+ * accepted ("13M", "1441", "7S"), and tick timeframes ("1T") give NaN.
36
+ *
37
+ * @param timeframe - Timeframe string, e.g. "1", "60", "1D", "W", "3M", "30S"
38
+ * @returns Number of seconds in the timeframe
39
+ * @throws RangeError for an empty string (the chart timeframe is not known here) and for
40
+ * strings that are not timeframes ("1H", "1d")
41
+ *
42
+ * @example
43
+ * ```typescript
44
+ * timeframe.in_seconds('60'); // 3600
45
+ * timeframe.in_seconds('1D'); // 86400
46
+ * timeframe.in_seconds('M'); // 2628003
47
+ * ```
48
+ */
49
+ export function in_seconds(timeframe: simple_string): int {
50
+ const text = timeframe.trim();
51
+ if (text === '') {
52
+ throw new RangeError('timeframe.in_seconds() needs a timeframe: the chart timeframe is not known here');
53
+ }
54
+ // Multiplier before the unit ("30S"), or after it ("S30"), as PineScript accepts both.
55
+ const before = /^(\d*)([SDWMT]?)$/.exec(text);
56
+ const after = before ? null : /^([SDWMT])(\d+)$/.exec(text);
57
+ if (!before && !after) throw new RangeError(`Invalid timeframe "${timeframe}"`);
58
+ const [digits, unit] = before ? [before[1]!, before[2]!] : [after![2]!, after![1]!];
59
+ if (unit === 'T') return NaN;
60
+ const multiplier = digits === '' ? 1 : Number(digits);
61
+ return multiplier * UNIT_SECONDS[unit]!;
62
+ }
63
+
64
+ /**
65
+ * Converts a number of seconds into a valid timeframe string.
66
+ *
67
+ * PineScript rules:
68
+ * - when no valid timeframe has exactly this duration, the next higher one is returned:
69
+ * 1 second or less gives "1S", 2-5 seconds give "5S", 31-60 seconds give "1",
70
+ * 604,799 seconds give "7D"
71
+ * - when several timeframes have exactly this duration, the larger unit is used:
72
+ * 604,800 seconds give "1W", not "7D"; months are used for exact multiples of 2,628,003 seconds
73
+ * - from 31,536,000 seconds (365 days) the result is "12M"
74
+ *
75
+ * @param seconds - Number of seconds
76
+ * @returns Timeframe string
77
+ *
78
+ * @example
79
+ * ```typescript
80
+ * timeframe.from_seconds(3600); // "60"
81
+ * timeframe.from_seconds(86400); // "1D"
82
+ * timeframe.from_seconds(604800); // "1W"
83
+ * ```
84
+ */
85
+ export function from_seconds(seconds: int): simple_string {
86
+ if (Number.isNaN(seconds)) throw new RangeError('timeframe.from_seconds() needs a number of seconds');
87
+ if (seconds >= SECONDS_365_DAYS) return '12M';
88
+
89
+ // Exact durations, larger unit first.
90
+ if (seconds > 0) {
91
+ if (seconds % SECONDS_PER_MONTH === 0) return `${seconds / SECONDS_PER_MONTH}M`;
92
+ if (seconds % SECONDS_PER_WEEK === 0) return `${seconds / SECONDS_PER_WEEK}W`;
93
+ if (seconds % SECONDS_PER_DAY === 0) return `${seconds / SECONDS_PER_DAY}D`;
94
+ if (seconds % SECONDS_PER_MINUTE === 0 && seconds < SECONDS_PER_DAY) return `${seconds / SECONDS_PER_MINUTE}`;
95
+ }
96
+
97
+ // Next higher valid timeframe.
98
+ const second = SECOND_TIMEFRAMES.find((m) => seconds <= m);
99
+ if (second !== undefined) return `${second}S`;
100
+ if (seconds < SECONDS_PER_DAY) return `${Math.ceil(seconds / SECONDS_PER_MINUTE)}`;
101
+ return `${Math.ceil(seconds / SECONDS_PER_DAY)}D`;
102
+ }
103
+
104
+ /** Properties of a chart timeframe, as PineScript's `timeframe.*` variables give them. */
105
+ export interface TimeframeInfo {
106
+ /** Timeframe string with its multiplier: "1D", "60", "1S" (PineScript `timeframe.period`) */
107
+ period: string;
108
+ multiplier: number;
109
+ isintraday: boolean;
110
+ isdaily: boolean;
111
+ isweekly: boolean;
112
+ ismonthly: boolean;
113
+ isminutes: boolean;
114
+ isseconds: boolean;
115
+ isticks: boolean;
116
+ isdwm: boolean;
117
+ }
118
+
119
+ /**
120
+ * Describes a chart timeframe like PineScript's `timeframe.*` variables.
121
+ * The period always carries its multiplier: "D" becomes "1D".
122
+ *
123
+ * @param timeframe - Chart timeframe string, e.g. "5", "60", "D", "1W", "30S"
124
+ * @throws RangeError for strings that are not timeframes
125
+ */
126
+ export function info(timeframe: simple_string): TimeframeInfo {
127
+ const text = timeframe.trim();
128
+ const m = /^(\d*)([SDWMT]?)$/.exec(text);
129
+ if (!m || text === '') throw new RangeError(`Invalid timeframe "${timeframe}"`);
130
+ const unit = m[2]!;
131
+ const multiplier = m[1] === '' ? 1 : Number(m[1]);
132
+ return {
133
+ period: unit === '' ? String(multiplier) : `${multiplier}${unit}`,
134
+ multiplier,
135
+ isintraday: unit === '' || unit === 'S' || unit === 'T',
136
+ isdaily: unit === 'D',
137
+ isweekly: unit === 'W',
138
+ ismonthly: unit === 'M',
139
+ isminutes: unit === '',
140
+ isseconds: unit === 'S',
141
+ isticks: unit === 'T',
142
+ isdwm: unit === 'D' || unit === 'W' || unit === 'M',
143
+ };
144
+ }