@invinite-org/chartlang-runtime 1.1.1 → 1.2.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 (226) hide show
  1. package/CHANGELOG.md +236 -0
  2. package/dist/barPoint.d.ts +20 -0
  3. package/dist/barPoint.d.ts.map +1 -0
  4. package/dist/barPoint.js +72 -0
  5. package/dist/barPoint.js.map +1 -0
  6. package/dist/bufferSnapshot.d.ts +102 -0
  7. package/dist/bufferSnapshot.d.ts.map +1 -0
  8. package/dist/bufferSnapshot.js +119 -0
  9. package/dist/bufferSnapshot.js.map +1 -0
  10. package/dist/createScriptRunner.d.ts +6 -3
  11. package/dist/createScriptRunner.d.ts.map +1 -1
  12. package/dist/createScriptRunner.js +29 -5
  13. package/dist/createScriptRunner.js.map +1 -1
  14. package/dist/dep/DepRunner.d.ts.map +1 -1
  15. package/dist/dep/DepRunner.js +1 -0
  16. package/dist/dep/DepRunner.js.map +1 -1
  17. package/dist/emit/draw/boxes/fillBetween.d.ts +45 -0
  18. package/dist/emit/draw/boxes/fillBetween.d.ts.map +1 -0
  19. package/dist/emit/draw/boxes/fillBetween.js +36 -0
  20. package/dist/emit/draw/boxes/fillBetween.js.map +1 -0
  21. package/dist/emit/draw/handle.d.ts +9 -0
  22. package/dist/emit/draw/handle.d.ts.map +1 -1
  23. package/dist/emit/draw/handle.js +65 -10
  24. package/dist/emit/draw/handle.js.map +1 -1
  25. package/dist/emit/draw/namespace.d.ts +4 -3
  26. package/dist/emit/draw/namespace.d.ts.map +1 -1
  27. package/dist/emit/draw/namespace.js +6 -3
  28. package/dist/emit/draw/namespace.js.map +1 -1
  29. package/dist/emit/plot.d.ts +7 -0
  30. package/dist/emit/plot.d.ts.map +1 -1
  31. package/dist/emit/plot.js +13 -0
  32. package/dist/emit/plot.js.map +1 -1
  33. package/dist/execution/dispose.d.ts.map +1 -1
  34. package/dist/execution/dispose.js +16 -0
  35. package/dist/execution/dispose.js.map +1 -1
  36. package/dist/execution/runComputeStep.d.ts.map +1 -1
  37. package/dist/execution/runComputeStep.js +10 -1
  38. package/dist/execution/runComputeStep.js.map +1 -1
  39. package/dist/index.d.ts +1 -1
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +1 -1
  42. package/dist/index.js.map +1 -1
  43. package/dist/persistentStateStore.runtime.d.ts.map +1 -1
  44. package/dist/persistentStateStore.runtime.js +21 -7
  45. package/dist/persistentStateStore.runtime.js.map +1 -1
  46. package/dist/request/index.d.ts +2 -1
  47. package/dist/request/index.d.ts.map +1 -1
  48. package/dist/request/index.js +2 -1
  49. package/dist/request/index.js.map +1 -1
  50. package/dist/request/requestNamespace.d.ts.map +1 -1
  51. package/dist/request/requestNamespace.js +16 -3
  52. package/dist/request/requestNamespace.js.map +1 -1
  53. package/dist/request/security.d.ts +20 -1
  54. package/dist/request/security.d.ts.map +1 -1
  55. package/dist/request/security.js +62 -23
  56. package/dist/request/security.js.map +1 -1
  57. package/dist/request/securityExprRunner.d.ts +133 -0
  58. package/dist/request/securityExprRunner.d.ts.map +1 -0
  59. package/dist/request/securityExprRunner.js +235 -0
  60. package/dist/request/securityExprRunner.js.map +1 -0
  61. package/dist/request/streamBars.d.ts +14 -1
  62. package/dist/request/streamBars.d.ts.map +1 -1
  63. package/dist/request/streamBars.js +39 -1
  64. package/dist/request/streamBars.js.map +1 -1
  65. package/dist/runtimeContext.d.ts +48 -0
  66. package/dist/runtimeContext.d.ts.map +1 -1
  67. package/dist/runtimeContext.js.map +1 -1
  68. package/dist/seriesView.d.ts +42 -17
  69. package/dist/seriesView.d.ts.map +1 -1
  70. package/dist/seriesView.js +65 -42
  71. package/dist/seriesView.js.map +1 -1
  72. package/dist/state/index.d.ts +2 -1
  73. package/dist/state/index.d.ts.map +1 -1
  74. package/dist/state/index.js +2 -1
  75. package/dist/state/index.js.map +1 -1
  76. package/dist/state/lifecycle.d.ts +40 -0
  77. package/dist/state/lifecycle.d.ts.map +1 -1
  78. package/dist/state/lifecycle.js +53 -0
  79. package/dist/state/lifecycle.js.map +1 -1
  80. package/dist/state/seriesPersistence.d.ts +48 -0
  81. package/dist/state/seriesPersistence.d.ts.map +1 -0
  82. package/dist/state/seriesPersistence.js +87 -0
  83. package/dist/state/seriesPersistence.js.map +1 -0
  84. package/dist/state/seriesSlot.d.ts +105 -0
  85. package/dist/state/seriesSlot.d.ts.map +1 -0
  86. package/dist/state/seriesSlot.js +123 -0
  87. package/dist/state/seriesSlot.js.map +1 -0
  88. package/dist/state/stateNamespace.d.ts.map +1 -1
  89. package/dist/state/stateNamespace.js +28 -0
  90. package/dist/state/stateNamespace.js.map +1 -1
  91. package/dist/streamState.d.ts +25 -19
  92. package/dist/streamState.d.ts.map +1 -1
  93. package/dist/streamState.js +40 -66
  94. package/dist/streamState.js.map +1 -1
  95. package/dist/ta/adx.d.ts +3 -2
  96. package/dist/ta/adx.d.ts.map +1 -1
  97. package/dist/ta/adx.js +3 -2
  98. package/dist/ta/adx.js.map +1 -1
  99. package/dist/ta/alma.d.ts +6 -4
  100. package/dist/ta/alma.d.ts.map +1 -1
  101. package/dist/ta/alma.js +19 -6
  102. package/dist/ta/alma.js.map +1 -1
  103. package/dist/ta/atr.d.ts +3 -2
  104. package/dist/ta/atr.d.ts.map +1 -1
  105. package/dist/ta/atr.js +3 -2
  106. package/dist/ta/atr.js.map +1 -1
  107. package/dist/ta/bb.d.ts +3 -2
  108. package/dist/ta/bb.d.ts.map +1 -1
  109. package/dist/ta/bb.js +3 -2
  110. package/dist/ta/bb.js.map +1 -1
  111. package/dist/ta/chaikinOsc.d.ts +3 -2
  112. package/dist/ta/chaikinOsc.d.ts.map +1 -1
  113. package/dist/ta/chaikinOsc.js +3 -2
  114. package/dist/ta/chaikinOsc.js.map +1 -1
  115. package/dist/ta/crossover.d.ts +3 -2
  116. package/dist/ta/crossover.d.ts.map +1 -1
  117. package/dist/ta/crossover.js +3 -2
  118. package/dist/ta/crossover.js.map +1 -1
  119. package/dist/ta/crossunder.d.ts +3 -2
  120. package/dist/ta/crossunder.d.ts.map +1 -1
  121. package/dist/ta/crossunder.js +3 -2
  122. package/dist/ta/crossunder.js.map +1 -1
  123. package/dist/ta/dmi.d.ts +4 -3
  124. package/dist/ta/dmi.d.ts.map +1 -1
  125. package/dist/ta/dmi.js +4 -3
  126. package/dist/ta/dmi.js.map +1 -1
  127. package/dist/ta/ema.d.ts +3 -2
  128. package/dist/ta/ema.d.ts.map +1 -1
  129. package/dist/ta/ema.js +3 -2
  130. package/dist/ta/ema.js.map +1 -1
  131. package/dist/ta/eom.d.ts +3 -1
  132. package/dist/ta/eom.d.ts.map +1 -1
  133. package/dist/ta/eom.js +3 -1
  134. package/dist/ta/eom.js.map +1 -1
  135. package/dist/ta/highestbars.d.ts +25 -0
  136. package/dist/ta/highestbars.d.ts.map +1 -0
  137. package/dist/ta/highestbars.js +106 -0
  138. package/dist/ta/highestbars.js.map +1 -0
  139. package/dist/ta/historicalVolatility.d.ts +3 -2
  140. package/dist/ta/historicalVolatility.d.ts.map +1 -1
  141. package/dist/ta/historicalVolatility.js +3 -2
  142. package/dist/ta/historicalVolatility.js.map +1 -1
  143. package/dist/ta/ichimoku.d.ts +3 -1
  144. package/dist/ta/ichimoku.d.ts.map +1 -1
  145. package/dist/ta/ichimoku.js +3 -1
  146. package/dist/ta/ichimoku.js.map +1 -1
  147. package/dist/ta/lowestbars.d.ts +25 -0
  148. package/dist/ta/lowestbars.d.ts.map +1 -0
  149. package/dist/ta/lowestbars.js +102 -0
  150. package/dist/ta/lowestbars.js.map +1 -0
  151. package/dist/ta/macd.d.ts +3 -2
  152. package/dist/ta/macd.d.ts.map +1 -1
  153. package/dist/ta/macd.js +3 -2
  154. package/dist/ta/macd.js.map +1 -1
  155. package/dist/ta/massIndex.d.ts +3 -2
  156. package/dist/ta/massIndex.d.ts.map +1 -1
  157. package/dist/ta/massIndex.js +3 -2
  158. package/dist/ta/massIndex.js.map +1 -1
  159. package/dist/ta/mfi.d.ts +3 -1
  160. package/dist/ta/mfi.d.ts.map +1 -1
  161. package/dist/ta/mfi.js +3 -1
  162. package/dist/ta/mfi.js.map +1 -1
  163. package/dist/ta/netVolume.d.ts +3 -1
  164. package/dist/ta/netVolume.d.ts.map +1 -1
  165. package/dist/ta/netVolume.js +3 -1
  166. package/dist/ta/netVolume.js.map +1 -1
  167. package/dist/ta/nvi.d.ts +3 -1
  168. package/dist/ta/nvi.d.ts.map +1 -1
  169. package/dist/ta/nvi.js +3 -1
  170. package/dist/ta/nvi.js.map +1 -1
  171. package/dist/ta/persistence.d.ts.map +1 -1
  172. package/dist/ta/persistence.js +1 -40
  173. package/dist/ta/persistence.js.map +1 -1
  174. package/dist/ta/ppo.d.ts +3 -2
  175. package/dist/ta/ppo.d.ts.map +1 -1
  176. package/dist/ta/ppo.js +3 -2
  177. package/dist/ta/ppo.js.map +1 -1
  178. package/dist/ta/pvi.d.ts +3 -1
  179. package/dist/ta/pvi.d.ts.map +1 -1
  180. package/dist/ta/pvi.js +3 -1
  181. package/dist/ta/pvi.js.map +1 -1
  182. package/dist/ta/pvo.d.ts +3 -1
  183. package/dist/ta/pvo.d.ts.map +1 -1
  184. package/dist/ta/pvo.js +3 -1
  185. package/dist/ta/pvo.js.map +1 -1
  186. package/dist/ta/pvt.d.ts +3 -1
  187. package/dist/ta/pvt.d.ts.map +1 -1
  188. package/dist/ta/pvt.js +3 -1
  189. package/dist/ta/pvt.js.map +1 -1
  190. package/dist/ta/registry.d.ts +7 -1
  191. package/dist/ta/registry.d.ts.map +1 -1
  192. package/dist/ta/registry.js +4 -0
  193. package/dist/ta/registry.js.map +1 -1
  194. package/dist/ta/rsi.d.ts +3 -2
  195. package/dist/ta/rsi.d.ts.map +1 -1
  196. package/dist/ta/rsi.js +3 -2
  197. package/dist/ta/rsi.js.map +1 -1
  198. package/dist/ta/rvi.d.ts +3 -2
  199. package/dist/ta/rvi.d.ts.map +1 -1
  200. package/dist/ta/rvi.js +3 -2
  201. package/dist/ta/rvi.js.map +1 -1
  202. package/dist/ta/sma.d.ts +6 -3
  203. package/dist/ta/sma.d.ts.map +1 -1
  204. package/dist/ta/sma.js +6 -3
  205. package/dist/ta/sma.js.map +1 -1
  206. package/dist/ta/stdev.d.ts +3 -2
  207. package/dist/ta/stdev.d.ts.map +1 -1
  208. package/dist/ta/stdev.js +3 -2
  209. package/dist/ta/stdev.js.map +1 -1
  210. package/dist/ta/trendStrengthIndex.d.ts +3 -2
  211. package/dist/ta/trendStrengthIndex.d.ts.map +1 -1
  212. package/dist/ta/trendStrengthIndex.js +3 -2
  213. package/dist/ta/trendStrengthIndex.js.map +1 -1
  214. package/dist/ta/trix.d.ts +4 -3
  215. package/dist/ta/trix.d.ts.map +1 -1
  216. package/dist/ta/trix.js +4 -3
  217. package/dist/ta/trix.js.map +1 -1
  218. package/dist/ta/vortex.d.ts +3 -2
  219. package/dist/ta/vortex.d.ts.map +1 -1
  220. package/dist/ta/vortex.js +3 -2
  221. package/dist/ta/vortex.js.map +1 -1
  222. package/package.json +3 -3
  223. package/dist/ta/lib/applyOffset.d.ts +0 -19
  224. package/dist/ta/lib/applyOffset.d.ts.map +0 -1
  225. package/dist/ta/lib/applyOffset.js +0 -38
  226. package/dist/ta/lib/applyOffset.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"vortex.js","sourceRoot":"","sources":["../../src/ta/vortex.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,yEAAyE;AACzE,mEAAmE;AACnE,qEAAqE;AACrE,gBAAgB;AAChB,qEAAqE;AACrE,4DAA4D;AAC5D,+DAA+D;AAC/D,uEAAuE;AACvE,kEAAkE;AAClE,uEAAuE;AACvE,qEAAqE;AACrE,+CAA+C;AAI/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAuB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAsCzE,SAAS,MAAM;IACX,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC;IAC3C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,GAAW,EAAE,SAAiB;IAC3D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,GAAG,GAAG,CAAC;IACnD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC;AACvF,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc,EAAE,QAAgB;IAC9C,MAAM,UAAU,GAAG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACpD,OAAO;QACH,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;YAClB,IAAI,EAAE,cAAc,CAAS,UAAU,CAAC;YACxC,KAAK,EAAE,cAAc,CAAS,WAAW,CAAC;SAC7C,CAAC;QACF,UAAU;QACV,WAAW;QACX,MAAM;QACN,YAAY,EAAE,IAAI,iBAAiB,CAAC,MAAM,CAAC;QAC3C,aAAa,EAAE,IAAI,iBAAiB,CAAC,MAAM,CAAC;QAC5C,QAAQ,EAAE,IAAI,iBAAiB,CAAC,MAAM,CAAC;QACvC,WAAW,EAAE,CAAC;QACd,YAAY,EAAE,CAAC;QACf,SAAS,EAAE,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC,GAAG;QACpB,OAAO,EAAE,MAAM,CAAC,GAAG;QACnB,SAAS,EAAE,MAAM,CAAC,GAAG;QACrB,YAAY,EAAE,MAAM,CAAC,GAAG;QACxB,WAAW,EAAE,MAAM,CAAC,GAAG;QACvB,aAAa,EAAE,MAAM,CAAC,GAAG;QACzB,qBAAqB,EAAE,CAAC;QACxB,sBAAsB,EAAE,CAAC;QACzB,mBAAmB,EAAE,CAAC;QACtB,WAAW,EAAE,CAAC;QACd,YAAY,EAAE,CAAC;QACf,SAAS,EAAE,CAAC;QACZ,QAAQ,EAAE,CAAC;QACX,cAAc,EAAE,IAAI,GAAG,EAAE;KAC5B,CAAC;AACN,CAAC;AAED,SAAS,eAAe,CAAC,IAAgB,EAAE,MAAc;IACrD,IAAI,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC;IACrC,IAAI,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,qBAAqB,CAAS,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC;YAC5D,KAAK,EAAE,qBAAqB,CAAS,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;SACjE,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAS,MAAM,CAAC,GAAW,EAAE,GAAW;IACpC,qEAAqE;IACrE,qEAAqE;IACrE,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IACnF,OAAO,GAAG,GAAG,GAAG,CAAC;AACrB,CAAC;AAED,SAAS,SAAS,CACd,IAAgB,EAChB,IAAY,EACZ,GAAW,EACX,KAAa;IAEb,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7E,gCAAgC;QAChC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;IACnD,CAAC;IAED,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;IAEnB,kEAAkE;IAClE,iEAAiE;IACjE,qBAAqB;IACrB,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,WAAW,CAAC;IAC9C,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,YAAY,CAAC;IAChD,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC;IAE1C,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnF,+DAA+D;IAC/D,mCAAmC;IACnC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC;IAClC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC;IAChC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC;IACpC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACrB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;IACnB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IAEvB,iEAAiE;IACjE,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC;QACrC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC;QACvC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC;IACrC,CAAC;SAAM,CAAC;QACJ,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACzB,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC;IAC3B,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC;IAC7B,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;IAErB,kEAAkE;IAClE,iEAAiE;IACjE,mDAAmD;IACnD,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;IACnD,CAAC;IACD,OAAO;QACH,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC;QAC9C,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC;KACnD,CAAC;AACN,CAAC;AAED,SAAS,QAAQ,CACb,IAAgB,EAChB,IAAY,EACZ,GAAW,EACX,KAAa;IAEb,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;IACjF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;IACnD,CAAC;IACD,sDAAsD;IACtD,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IACpD,oEAAoE;IACpE,iEAAiE;IACjE,kDAAkD;IAClD,sBAAsB;IACtB,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzF,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3F,+DAA+D;IAC/D,iEAAiE;IACjE,2DAA2D;IAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;IAC3E,MAAM,YAAY,GAAG,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;IAC/E,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACjE,OAAO;QACH,IAAI,EAAE,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC;QACpC,KAAK,EAAE,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC;KACzC,CAAC;AACN,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,MAAM,CAAC,MAAc,EAAE,MAAc,EAAE,IAAiB;IACpE,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAA2B,CAAC;IACpE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,IAAI,GAAG,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzD,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;IAC3B,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QACrE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACJ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QACtE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;AACpD,CAAC","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/vortex.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape — NOT invinite's\n// IndicatorPlugin shape. Vortex reads `bar.high` / `bar.low` /\n// `bar.close` directly (mirrors Pine's `ta.vortex(length)` — no source\n// param) and maintains rolling running-sum windows over `vmPlus`,\n// `vmMinus`, and TR for O(1) per-bar updates. NaN-on-zero-TR semantics\n// per chartlang task spec §6 (invinite emits 0 on zero TR; chartlang\n// emits NaN to surface the degenerate window).\n\nimport type { VortexOpts, VortexResult } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\n\ntype VortexSlot = {\n readonly result: VortexResult;\n readonly plusBuffer: Float64RingBuffer;\n readonly minusBuffer: Float64RingBuffer;\n readonly length: number;\n readonly vmPlusWindow: Float64RingBuffer;\n readonly vmMinusWindow: Float64RingBuffer;\n readonly trWindow: Float64RingBuffer;\n runningPlus: number;\n runningMinus: number;\n runningTr: number;\n prevHigh: number;\n prevLow: number;\n prevClose: number;\n /** Snapshots captured at the prior close so tick replay can read\n * against the bar-before-current. */\n prevPrevHigh: number;\n prevPrevLow: number;\n prevPrevClose: number;\n /** Running sums AS OF THE PRIOR CLOSE — used by tick replay to\n * substitute the tick's contribution. */\n prevClosedRunningPlus: number;\n prevClosedRunningMinus: number;\n prevClosedRunningTr: number;\n /** Tail values evicted on the current close (the\n * `length`-bars-ago slot at the moment the current close advanced\n * the window). Used by tick replay to recompute the running sum\n * with the tick's substituted contribution. */\n evictedPlus: number;\n evictedMinus: number;\n evictedTr: number;\n /** Number of CLOSED bars folded into the slot so far. */\n barCount: number;\n readonly shiftedResults: Map<number, VortexResult>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.vortex called outside an active script step\");\n }\n return ctx;\n}\n\nfunction trueRange(high: number, low: number, prevClose: number): number {\n if (!Number.isFinite(prevClose)) return high - low;\n return Math.max(high - low, Math.abs(high - prevClose), Math.abs(low - prevClose));\n}\n\nfunction initSlot(length: number, capacity: number): VortexSlot {\n const plusBuffer = new Float64RingBuffer(capacity);\n const minusBuffer = new Float64RingBuffer(capacity);\n return {\n result: Object.freeze({\n plus: makeSeriesView<number>(plusBuffer),\n minus: makeSeriesView<number>(minusBuffer),\n }),\n plusBuffer,\n minusBuffer,\n length,\n vmPlusWindow: new Float64RingBuffer(length),\n vmMinusWindow: new Float64RingBuffer(length),\n trWindow: new Float64RingBuffer(length),\n runningPlus: 0,\n runningMinus: 0,\n runningTr: 0,\n prevHigh: Number.NaN,\n prevLow: Number.NaN,\n prevClose: Number.NaN,\n prevPrevHigh: Number.NaN,\n prevPrevLow: Number.NaN,\n prevPrevClose: Number.NaN,\n prevClosedRunningPlus: 0,\n prevClosedRunningMinus: 0,\n prevClosedRunningTr: 0,\n evictedPlus: 0,\n evictedMinus: 0,\n evictedTr: 0,\n barCount: 0,\n shiftedResults: new Map(),\n };\n}\n\nfunction resultForOffset(slot: VortexSlot, offset: number): VortexResult {\n if (offset === 0) return slot.result;\n let cached = slot.shiftedResults.get(offset);\n if (cached === undefined) {\n cached = Object.freeze({\n plus: makeShiftedSeriesView<number>(slot.plusBuffer, offset),\n minus: makeShiftedSeriesView<number>(slot.minusBuffer, offset),\n });\n slot.shiftedResults.set(offset, cached);\n }\n return cached;\n}\n\nfunction divide(num: number, den: number): number {\n // chartlang task spec §6: zero-TR window → NaN (degenerate; invinite\n // emits 0). Surface as NaN so script-author conditionals can branch.\n if (den === 0 || !Number.isFinite(den) || !Number.isFinite(num)) return Number.NaN;\n return num / den;\n}\n\nfunction closeStep(\n slot: VortexSlot,\n high: number,\n low: number,\n close: number,\n): { plus: number; minus: number } {\n if (!Number.isFinite(high) || !Number.isFinite(low) || !Number.isFinite(close)) {\n // Hold state forward; emit NaN.\n return { plus: Number.NaN, minus: Number.NaN };\n }\n\n slot.barCount += 1;\n\n // Snapshot prior running sums (post-prior-close state — these are\n // the values tick replay needs to re-derive the head against the\n // PRIOR closed bar).\n slot.prevClosedRunningPlus = slot.runningPlus;\n slot.prevClosedRunningMinus = slot.runningMinus;\n slot.prevClosedRunningTr = slot.runningTr;\n\n const tr = trueRange(high, low, slot.prevClose);\n const vmPlus = Number.isFinite(slot.prevLow) ? Math.abs(high - slot.prevLow) : 0;\n const vmMinus = Number.isFinite(slot.prevHigh) ? Math.abs(low - slot.prevHigh) : 0;\n\n // Capture prev-prev BEFORE overwriting prev (tick replay reads\n // against the bar-before-current).\n slot.prevPrevHigh = slot.prevHigh;\n slot.prevPrevLow = slot.prevLow;\n slot.prevPrevClose = slot.prevClose;\n slot.prevHigh = high;\n slot.prevLow = low;\n slot.prevClose = close;\n\n // Roll the windows; capture evicted tail values for tick replay.\n if (slot.vmPlusWindow.length >= slot.length) {\n slot.evictedPlus = slot.vmPlusWindow.at(slot.length - 1);\n slot.evictedMinus = slot.vmMinusWindow.at(slot.length - 1);\n slot.evictedTr = slot.trWindow.at(slot.length - 1);\n slot.runningPlus -= slot.evictedPlus;\n slot.runningMinus -= slot.evictedMinus;\n slot.runningTr -= slot.evictedTr;\n } else {\n slot.evictedPlus = 0;\n slot.evictedMinus = 0;\n slot.evictedTr = 0;\n }\n slot.vmPlusWindow.append(vmPlus);\n slot.vmMinusWindow.append(vmMinus);\n slot.trWindow.append(tr);\n slot.runningPlus += vmPlus;\n slot.runningMinus += vmMinus;\n slot.runningTr += tr;\n\n // Warmup: first defined output at `barCount === length + 1` (i.e.\n // bar index `length` zero-based). The seed window completes when\n // the `length`-th VM/TR triple has been folded in.\n if (slot.barCount <= slot.length) {\n return { plus: Number.NaN, minus: Number.NaN };\n }\n return {\n plus: divide(slot.runningPlus, slot.runningTr),\n minus: divide(slot.runningMinus, slot.runningTr),\n };\n}\n\nfunction tickStep(\n slot: VortexSlot,\n high: number,\n low: number,\n close: number,\n): { plus: number; minus: number } {\n if (slot.barCount <= slot.length) return { plus: Number.NaN, minus: Number.NaN };\n if (!Number.isFinite(high) || !Number.isFinite(low) || !Number.isFinite(close)) {\n return { plus: Number.NaN, minus: Number.NaN };\n }\n // Tick replay against the BAR BEFORE the current bar.\n const tr = trueRange(high, low, slot.prevPrevClose);\n // Defensive: `prevPrev*` is seeded by the prior close-side advance,\n // so by the time `barCount > length` (the guard above) these are\n // finite. The `: 0` fallback is defence-in-depth.\n /* c8 ignore next 2 */\n const vmPlus = Number.isFinite(slot.prevPrevLow) ? Math.abs(high - slot.prevPrevLow) : 0;\n const vmMinus = Number.isFinite(slot.prevPrevHigh) ? Math.abs(low - slot.prevPrevHigh) : 0;\n // Re-derive the running sums by starting from the prior closed\n // sums, subtracting the head bar's evicted tail (captured at the\n // close-side advance), and adding the tick's contribution.\n const runningPlus = slot.prevClosedRunningPlus - slot.evictedPlus + vmPlus;\n const runningMinus = slot.prevClosedRunningMinus - slot.evictedMinus + vmMinus;\n const runningTr = slot.prevClosedRunningTr - slot.evictedTr + tr;\n return {\n plus: divide(runningPlus, runningTr),\n minus: divide(runningMinus, runningTr),\n };\n}\n\n/**\n * Vortex Indicator (Botes & Siepman, 2010) — paired `+VI` / `−VI`\n * trend-direction lines. Reads `bar.high` / `bar.low` / `bar.close`\n * directly (mirrors Pine's `ta.vortex(length)` — no source param).\n * Maintains rolling running-sum windows over the per-bar `vmPlus`,\n * `vmMinus`, and TR series for O(1) per-bar updates. Returns a cached\n * `{ plus, minus }` record (same identity every bar).\n *\n * @formula TR[t] = max(high − low, |high − prevClose|, |low − prevClose|) ;\n * vmPlus[t] = |high[t] − low[t-1]| ;\n * vmMinus[t] = |low[t] − high[t-1]| ;\n * plus[t] = Σ(vmPlus, length) / Σ(TR, length) ;\n * minus[t] = Σ(vmMinus, length) / Σ(TR, length) ;\n * NaN when Σ(TR, length) === 0 (degenerate flat window).\n * @warmup length\n * @since 0.2\n * @stable\n *\n * `opts.offset` shifts both series in lockstep —\n * `series.current` on each output returns the value `offset` bars ago.\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const v = ta.vortex(\"slot\", 14);\n * // plot(v.plus);\n * // plot(v.minus);\n */\nexport function vortex(slotId: string, length: number, opts?: VortexOpts): VortexResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as VortexSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const bar = ctx.stream.bar;\n if (ctx.isTick) {\n const { plus, minus } = tickStep(slot, bar.high, bar.low, bar.close);\n slot.plusBuffer.replaceHead(plus);\n slot.minusBuffer.replaceHead(minus);\n } else {\n const { plus, minus } = closeStep(slot, bar.high, bar.low, bar.close);\n slot.plusBuffer.append(plus);\n slot.minusBuffer.append(minus);\n }\n return resultForOffset(slot, opts?.offset ?? 0);\n}\n"]}
1
+ {"version":3,"file":"vortex.js","sourceRoot":"","sources":["../../src/ta/vortex.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/vortex.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape — NOT invinite's\n// IndicatorPlugin shape. Vortex reads `bar.high` / `bar.low` /\n// `bar.close` directly (mirrors Pine's `ta.vortex(length)` — no source\n// param) and maintains rolling running-sum windows over `vmPlus`,\n// `vmMinus`, and TR for O(1) per-bar updates. NaN-on-zero-TR semantics\n// per chartlang task spec §6 (invinite emits 0 on zero TR; chartlang\n// emits NaN to surface the degenerate window).\n\nimport type { VortexOpts, VortexResult } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\n\ntype VortexSlot = {\n readonly result: VortexResult;\n readonly plusBuffer: Float64RingBuffer;\n readonly minusBuffer: Float64RingBuffer;\n readonly length: number;\n readonly vmPlusWindow: Float64RingBuffer;\n readonly vmMinusWindow: Float64RingBuffer;\n readonly trWindow: Float64RingBuffer;\n runningPlus: number;\n runningMinus: number;\n runningTr: number;\n prevHigh: number;\n prevLow: number;\n prevClose: number;\n /** Snapshots captured at the prior close so tick replay can read\n * against the bar-before-current. */\n prevPrevHigh: number;\n prevPrevLow: number;\n prevPrevClose: number;\n /** Running sums AS OF THE PRIOR CLOSE — used by tick replay to\n * substitute the tick's contribution. */\n prevClosedRunningPlus: number;\n prevClosedRunningMinus: number;\n prevClosedRunningTr: number;\n /** Tail values evicted on the current close (the\n * `length`-bars-ago slot at the moment the current close advanced\n * the window). Used by tick replay to recompute the running sum\n * with the tick's substituted contribution. */\n evictedPlus: number;\n evictedMinus: number;\n evictedTr: number;\n /** Number of CLOSED bars folded into the slot so far. */\n barCount: number;\n readonly shiftedResults: Map<number, VortexResult>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.vortex called outside an active script step\");\n }\n return ctx;\n}\n\nfunction trueRange(high: number, low: number, prevClose: number): number {\n if (!Number.isFinite(prevClose)) return high - low;\n return Math.max(high - low, Math.abs(high - prevClose), Math.abs(low - prevClose));\n}\n\nfunction initSlot(length: number, capacity: number): VortexSlot {\n const plusBuffer = new Float64RingBuffer(capacity);\n const minusBuffer = new Float64RingBuffer(capacity);\n return {\n result: Object.freeze({\n plus: makeSeriesView<number>(plusBuffer),\n minus: makeSeriesView<number>(minusBuffer),\n }),\n plusBuffer,\n minusBuffer,\n length,\n vmPlusWindow: new Float64RingBuffer(length),\n vmMinusWindow: new Float64RingBuffer(length),\n trWindow: new Float64RingBuffer(length),\n runningPlus: 0,\n runningMinus: 0,\n runningTr: 0,\n prevHigh: Number.NaN,\n prevLow: Number.NaN,\n prevClose: Number.NaN,\n prevPrevHigh: Number.NaN,\n prevPrevLow: Number.NaN,\n prevPrevClose: Number.NaN,\n prevClosedRunningPlus: 0,\n prevClosedRunningMinus: 0,\n prevClosedRunningTr: 0,\n evictedPlus: 0,\n evictedMinus: 0,\n evictedTr: 0,\n barCount: 0,\n shiftedResults: new Map(),\n };\n}\n\nfunction resultForOffset(slot: VortexSlot, offset: number): VortexResult {\n if (offset === 0) return slot.result;\n let cached = slot.shiftedResults.get(offset);\n if (cached === undefined) {\n cached = Object.freeze({\n plus: makeShiftedSeriesView<number>(slot.plusBuffer, offset),\n minus: makeShiftedSeriesView<number>(slot.minusBuffer, offset),\n });\n slot.shiftedResults.set(offset, cached);\n }\n return cached;\n}\n\nfunction divide(num: number, den: number): number {\n // chartlang task spec §6: zero-TR window → NaN (degenerate; invinite\n // emits 0). Surface as NaN so script-author conditionals can branch.\n if (den === 0 || !Number.isFinite(den) || !Number.isFinite(num)) return Number.NaN;\n return num / den;\n}\n\nfunction closeStep(\n slot: VortexSlot,\n high: number,\n low: number,\n close: number,\n): { plus: number; minus: number } {\n if (!Number.isFinite(high) || !Number.isFinite(low) || !Number.isFinite(close)) {\n // Hold state forward; emit NaN.\n return { plus: Number.NaN, minus: Number.NaN };\n }\n\n slot.barCount += 1;\n\n // Snapshot prior running sums (post-prior-close state — these are\n // the values tick replay needs to re-derive the head against the\n // PRIOR closed bar).\n slot.prevClosedRunningPlus = slot.runningPlus;\n slot.prevClosedRunningMinus = slot.runningMinus;\n slot.prevClosedRunningTr = slot.runningTr;\n\n const tr = trueRange(high, low, slot.prevClose);\n const vmPlus = Number.isFinite(slot.prevLow) ? Math.abs(high - slot.prevLow) : 0;\n const vmMinus = Number.isFinite(slot.prevHigh) ? Math.abs(low - slot.prevHigh) : 0;\n\n // Capture prev-prev BEFORE overwriting prev (tick replay reads\n // against the bar-before-current).\n slot.prevPrevHigh = slot.prevHigh;\n slot.prevPrevLow = slot.prevLow;\n slot.prevPrevClose = slot.prevClose;\n slot.prevHigh = high;\n slot.prevLow = low;\n slot.prevClose = close;\n\n // Roll the windows; capture evicted tail values for tick replay.\n if (slot.vmPlusWindow.length >= slot.length) {\n slot.evictedPlus = slot.vmPlusWindow.at(slot.length - 1);\n slot.evictedMinus = slot.vmMinusWindow.at(slot.length - 1);\n slot.evictedTr = slot.trWindow.at(slot.length - 1);\n slot.runningPlus -= slot.evictedPlus;\n slot.runningMinus -= slot.evictedMinus;\n slot.runningTr -= slot.evictedTr;\n } else {\n slot.evictedPlus = 0;\n slot.evictedMinus = 0;\n slot.evictedTr = 0;\n }\n slot.vmPlusWindow.append(vmPlus);\n slot.vmMinusWindow.append(vmMinus);\n slot.trWindow.append(tr);\n slot.runningPlus += vmPlus;\n slot.runningMinus += vmMinus;\n slot.runningTr += tr;\n\n // Warmup: first defined output at `barCount === length + 1` (i.e.\n // bar index `length` zero-based). The seed window completes when\n // the `length`-th VM/TR triple has been folded in.\n if (slot.barCount <= slot.length) {\n return { plus: Number.NaN, minus: Number.NaN };\n }\n return {\n plus: divide(slot.runningPlus, slot.runningTr),\n minus: divide(slot.runningMinus, slot.runningTr),\n };\n}\n\nfunction tickStep(\n slot: VortexSlot,\n high: number,\n low: number,\n close: number,\n): { plus: number; minus: number } {\n if (slot.barCount <= slot.length) return { plus: Number.NaN, minus: Number.NaN };\n if (!Number.isFinite(high) || !Number.isFinite(low) || !Number.isFinite(close)) {\n return { plus: Number.NaN, minus: Number.NaN };\n }\n // Tick replay against the BAR BEFORE the current bar.\n const tr = trueRange(high, low, slot.prevPrevClose);\n // Defensive: `prevPrev*` is seeded by the prior close-side advance,\n // so by the time `barCount > length` (the guard above) these are\n // finite. The `: 0` fallback is defence-in-depth.\n /* c8 ignore next 2 */\n const vmPlus = Number.isFinite(slot.prevPrevLow) ? Math.abs(high - slot.prevPrevLow) : 0;\n const vmMinus = Number.isFinite(slot.prevPrevHigh) ? Math.abs(low - slot.prevPrevHigh) : 0;\n // Re-derive the running sums by starting from the prior closed\n // sums, subtracting the head bar's evicted tail (captured at the\n // close-side advance), and adding the tick's contribution.\n const runningPlus = slot.prevClosedRunningPlus - slot.evictedPlus + vmPlus;\n const runningMinus = slot.prevClosedRunningMinus - slot.evictedMinus + vmMinus;\n const runningTr = slot.prevClosedRunningTr - slot.evictedTr + tr;\n return {\n plus: divide(runningPlus, runningTr),\n minus: divide(runningMinus, runningTr),\n };\n}\n\n/**\n * Vortex Indicator (Botes & Siepman, 2010) — paired `+VI` / `−VI`\n * trend-direction lines. Reads `bar.high` / `bar.low` / `bar.close`\n * directly (mirrors Pine's `ta.vortex(length)` — no source param).\n * Maintains rolling running-sum windows over the per-bar `vmPlus`,\n * `vmMinus`, and TR series for O(1) per-bar updates. Returns a cached\n * `{ plus, minus }` record (same identity every bar).\n *\n * @formula TR[t] = max(high − low, |high − prevClose|, |low − prevClose|) ;\n * vmPlus[t] = |high[t] − low[t-1]| ;\n * vmMinus[t] = |low[t] − high[t-1]| ;\n * plus[t] = Σ(vmPlus, length) / Σ(TR, length) ;\n * minus[t] = Σ(vmMinus, length) / Σ(TR, length) ;\n * NaN when Σ(TR, length) === 0 (degenerate flat window).\n * @warmup length\n * @since 0.2\n * @stable\n *\n * `opts.offset` is a presentation display shift carried to the plot\n * emission as `xShift` for both series in lockstep (`+n` right / future,\n * `−n` left / past); the series values are unshifted.\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const v = ta.vortex(\"slot\", 14);\n * // plot(v.plus);\n * // plot(v.minus);\n */\nexport function vortex(slotId: string, length: number, opts?: VortexOpts): VortexResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as VortexSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const bar = ctx.stream.bar;\n if (ctx.isTick) {\n const { plus, minus } = tickStep(slot, bar.high, bar.low, bar.close);\n slot.plusBuffer.replaceHead(plus);\n slot.minusBuffer.replaceHead(minus);\n } else {\n const { plus, minus } = closeStep(slot, bar.high, bar.low, bar.close);\n slot.plusBuffer.append(plus);\n slot.minusBuffer.append(minus);\n }\n return resultForOffset(slot, opts?.offset ?? 0);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@invinite-org/chartlang-runtime",
3
- "version": "1.1.1",
3
+ "version": "1.2.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "Execution engine, Series ring buffers, ta.* math primitives",
@@ -23,8 +23,8 @@
23
23
  "LICENSE"
24
24
  ],
25
25
  "dependencies": {
26
- "@invinite-org/chartlang-adapter-kit": "^1.2.1",
27
- "@invinite-org/chartlang-core": "^1.1.1"
26
+ "@invinite-org/chartlang-adapter-kit": "^1.3.0",
27
+ "@invinite-org/chartlang-core": "^1.2.0"
28
28
  },
29
29
  "devDependencies": {
30
30
  "fast-check": "^3.20.0"
@@ -1,19 +0,0 @@
1
- /**
2
- * TradingView-parity bar-shift helper. `offset === 0` returns the
3
- * same array reference so callers can keep a no-shift call in the
4
- * fast path without an allocation. Positive `offset` shifts forward
5
- * in time (output[i] = values[i − offset], NaN where out of range);
6
- * negative shifts backward.
7
- *
8
- * Phase 1 always passes `offset = 0` — the helper exists so Phase 4's
9
- * universal `opts.offset` (§9.1) is a zero-line wire-up.
10
- *
11
- * @formula out[i] = values[i − offset] (NaN when i − offset ∉ [0, n))
12
- * @since 0.1
13
- * @stable
14
- * @example
15
- * // import { applyOffsetToSeries } from "./applyOffset";
16
- * // const shifted = applyOffsetToSeries(values, 2);
17
- */
18
- export declare function applyOffsetToSeries(values: Float64Array, offset: number): Float64Array;
19
- //# sourceMappingURL=applyOffset.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"applyOffset.d.ts","sourceRoot":"","sources":["../../../src/ta/lib/applyOffset.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAUtF"}
@@ -1,38 +0,0 @@
1
- // Copyright (c) 2026 Invinite. Licensed under the MIT License.
2
- // See the LICENSE file in the repo root for full license text.
3
- //
4
- // Ported from invinite/src/components/trading-chart/indicators/lib/apply-offset.ts
5
- // (commit d2d1043c1b039f66d2f3674526d303d31cf2f1e0, © Invinite).
6
- // Re-licensed MIT for chartlang. The math is the reference, the code
7
- // style is not.
8
- /**
9
- * TradingView-parity bar-shift helper. `offset === 0` returns the
10
- * same array reference so callers can keep a no-shift call in the
11
- * fast path without an allocation. Positive `offset` shifts forward
12
- * in time (output[i] = values[i − offset], NaN where out of range);
13
- * negative shifts backward.
14
- *
15
- * Phase 1 always passes `offset = 0` — the helper exists so Phase 4's
16
- * universal `opts.offset` (§9.1) is a zero-line wire-up.
17
- *
18
- * @formula out[i] = values[i − offset] (NaN when i − offset ∉ [0, n))
19
- * @since 0.1
20
- * @stable
21
- * @example
22
- * // import { applyOffsetToSeries } from "./applyOffset";
23
- * // const shifted = applyOffsetToSeries(values, 2);
24
- */
25
- export function applyOffsetToSeries(values, offset) {
26
- if (offset === 0 || values.length === 0)
27
- return values;
28
- const n = values.length;
29
- const out = new Float64Array(n);
30
- out.fill(Number.NaN);
31
- for (let i = 0; i < n; i += 1) {
32
- const src = i - offset;
33
- if (src >= 0 && src < n)
34
- out[i] = values[src];
35
- }
36
- return out;
37
- }
38
- //# sourceMappingURL=applyOffset.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"applyOffset.js","sourceRoot":"","sources":["../../../src/ta/lib/applyOffset.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,mFAAmF;AACnF,mEAAmE;AACnE,qEAAqE;AACrE,gBAAgB;AAEhB;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAoB,EAAE,MAAc;IACpE,IAAI,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IACvD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;IAChC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC;QACvB,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/lib/apply-offset.ts\n// (commit d2d1043c1b039f66d2f3674526d303d31cf2f1e0, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n\n/**\n * TradingView-parity bar-shift helper. `offset === 0` returns the\n * same array reference so callers can keep a no-shift call in the\n * fast path without an allocation. Positive `offset` shifts forward\n * in time (output[i] = values[i − offset], NaN where out of range);\n * negative shifts backward.\n *\n * Phase 1 always passes `offset = 0` — the helper exists so Phase 4's\n * universal `opts.offset` (§9.1) is a zero-line wire-up.\n *\n * @formula out[i] = values[i − offset] (NaN when i − offset ∉ [0, n))\n * @since 0.1\n * @stable\n * @example\n * // import { applyOffsetToSeries } from \"./applyOffset\";\n * // const shifted = applyOffsetToSeries(values, 2);\n */\nexport function applyOffsetToSeries(values: Float64Array, offset: number): Float64Array {\n if (offset === 0 || values.length === 0) return values;\n const n = values.length;\n const out = new Float64Array(n);\n out.fill(Number.NaN);\n for (let i = 0; i < n; i += 1) {\n const src = i - offset;\n if (src >= 0 && src < n) out[i] = values[src];\n }\n return out;\n}\n"]}