@invinite-org/chartlang-runtime 1.1.1 → 1.3.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 (294) hide show
  1. package/CHANGELOG.md +307 -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/buildComputeContext.d.ts.map +1 -1
  11. package/dist/buildComputeContext.js +6 -1
  12. package/dist/buildComputeContext.js.map +1 -1
  13. package/dist/createScriptRunner.d.ts +6 -3
  14. package/dist/createScriptRunner.d.ts.map +1 -1
  15. package/dist/createScriptRunner.js +65 -11
  16. package/dist/createScriptRunner.js.map +1 -1
  17. package/dist/dep/DepRunner.d.ts +7 -0
  18. package/dist/dep/DepRunner.d.ts.map +1 -1
  19. package/dist/dep/DepRunner.js +4 -0
  20. package/dist/dep/DepRunner.js.map +1 -1
  21. package/dist/emit/barcolor.d.ts +44 -0
  22. package/dist/emit/barcolor.d.ts.map +1 -0
  23. package/dist/emit/barcolor.js +40 -0
  24. package/dist/emit/barcolor.js.map +1 -0
  25. package/dist/emit/bgcolor.d.ts +44 -0
  26. package/dist/emit/bgcolor.d.ts.map +1 -0
  27. package/dist/emit/bgcolor.js +45 -0
  28. package/dist/emit/bgcolor.js.map +1 -0
  29. package/dist/emit/draw/boxes/fillBetween.d.ts +45 -0
  30. package/dist/emit/draw/boxes/fillBetween.d.ts.map +1 -0
  31. package/dist/emit/draw/boxes/fillBetween.js +36 -0
  32. package/dist/emit/draw/boxes/fillBetween.js.map +1 -0
  33. package/dist/emit/draw/handle.d.ts +9 -0
  34. package/dist/emit/draw/handle.d.ts.map +1 -1
  35. package/dist/emit/draw/handle.js +65 -10
  36. package/dist/emit/draw/handle.js.map +1 -1
  37. package/dist/emit/draw/namespace.d.ts +4 -3
  38. package/dist/emit/draw/namespace.d.ts.map +1 -1
  39. package/dist/emit/draw/namespace.js +6 -3
  40. package/dist/emit/draw/namespace.js.map +1 -1
  41. package/dist/emit/index.d.ts +2 -0
  42. package/dist/emit/index.d.ts.map +1 -1
  43. package/dist/emit/index.js +2 -0
  44. package/dist/emit/index.js.map +1 -1
  45. package/dist/emit/plot.d.ts +30 -1
  46. package/dist/emit/plot.d.ts.map +1 -1
  47. package/dist/emit/plot.js +45 -1
  48. package/dist/emit/plot.js.map +1 -1
  49. package/dist/execution/dispose.d.ts.map +1 -1
  50. package/dist/execution/dispose.js +18 -0
  51. package/dist/execution/dispose.js.map +1 -1
  52. package/dist/execution/runComputeStep.d.ts.map +1 -1
  53. package/dist/execution/runComputeStep.js +12 -1
  54. package/dist/execution/runComputeStep.js.map +1 -1
  55. package/dist/index.d.ts +1 -1
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +1 -1
  58. package/dist/index.js.map +1 -1
  59. package/dist/inputs/resolveInputs.js +1 -0
  60. package/dist/inputs/resolveInputs.js.map +1 -1
  61. package/dist/persistentStateStore.runtime.d.ts.map +1 -1
  62. package/dist/persistentStateStore.runtime.js +26 -7
  63. package/dist/persistentStateStore.runtime.js.map +1 -1
  64. package/dist/primitives.d.ts +1 -1
  65. package/dist/primitives.d.ts.map +1 -1
  66. package/dist/primitives.js +7 -1
  67. package/dist/primitives.js.map +1 -1
  68. package/dist/request/index.d.ts +2 -1
  69. package/dist/request/index.d.ts.map +1 -1
  70. package/dist/request/index.js +2 -1
  71. package/dist/request/index.js.map +1 -1
  72. package/dist/request/lowerTf.d.ts.map +1 -1
  73. package/dist/request/lowerTf.js +6 -0
  74. package/dist/request/lowerTf.js.map +1 -1
  75. package/dist/request/requestNamespace.d.ts.map +1 -1
  76. package/dist/request/requestNamespace.js +30 -3
  77. package/dist/request/requestNamespace.js.map +1 -1
  78. package/dist/request/security.d.ts +40 -4
  79. package/dist/request/security.d.ts.map +1 -1
  80. package/dist/request/security.js +114 -40
  81. package/dist/request/security.js.map +1 -1
  82. package/dist/request/securityExprRunner.d.ts +137 -0
  83. package/dist/request/securityExprRunner.d.ts.map +1 -0
  84. package/dist/request/securityExprRunner.js +253 -0
  85. package/dist/request/securityExprRunner.js.map +1 -0
  86. package/dist/request/streamBars.d.ts +14 -1
  87. package/dist/request/streamBars.d.ts.map +1 -1
  88. package/dist/request/streamBars.js +39 -1
  89. package/dist/request/streamBars.js.map +1 -1
  90. package/dist/ringBuffer.d.ts +19 -0
  91. package/dist/ringBuffer.d.ts.map +1 -1
  92. package/dist/ringBuffer.js +23 -0
  93. package/dist/ringBuffer.js.map +1 -1
  94. package/dist/runtimeContext.d.ts +90 -5
  95. package/dist/runtimeContext.d.ts.map +1 -1
  96. package/dist/runtimeContext.js.map +1 -1
  97. package/dist/seriesView.d.ts +42 -17
  98. package/dist/seriesView.d.ts.map +1 -1
  99. package/dist/seriesView.js +65 -42
  100. package/dist/seriesView.js.map +1 -1
  101. package/dist/state/arrayPersistence.d.ts +48 -0
  102. package/dist/state/arrayPersistence.d.ts.map +1 -0
  103. package/dist/state/arrayPersistence.js +88 -0
  104. package/dist/state/arrayPersistence.js.map +1 -0
  105. package/dist/state/arrayStateSlot.d.ts +78 -0
  106. package/dist/state/arrayStateSlot.d.ts.map +1 -0
  107. package/dist/state/arrayStateSlot.js +116 -0
  108. package/dist/state/arrayStateSlot.js.map +1 -0
  109. package/dist/state/index.d.ts +4 -1
  110. package/dist/state/index.d.ts.map +1 -1
  111. package/dist/state/index.js +4 -1
  112. package/dist/state/index.js.map +1 -1
  113. package/dist/state/lifecycle.d.ts +68 -0
  114. package/dist/state/lifecycle.d.ts.map +1 -1
  115. package/dist/state/lifecycle.js +89 -0
  116. package/dist/state/lifecycle.js.map +1 -1
  117. package/dist/state/seriesPersistence.d.ts +48 -0
  118. package/dist/state/seriesPersistence.d.ts.map +1 -0
  119. package/dist/state/seriesPersistence.js +87 -0
  120. package/dist/state/seriesPersistence.js.map +1 -0
  121. package/dist/state/seriesSlot.d.ts +105 -0
  122. package/dist/state/seriesSlot.d.ts.map +1 -0
  123. package/dist/state/seriesSlot.js +123 -0
  124. package/dist/state/seriesSlot.js.map +1 -0
  125. package/dist/state/stateNamespace.d.ts.map +1 -1
  126. package/dist/state/stateNamespace.js +55 -0
  127. package/dist/state/stateNamespace.js.map +1 -1
  128. package/dist/streamState.d.ts +25 -19
  129. package/dist/streamState.d.ts.map +1 -1
  130. package/dist/streamState.js +40 -66
  131. package/dist/streamState.js.map +1 -1
  132. package/dist/ta/adx.d.ts +3 -2
  133. package/dist/ta/adx.d.ts.map +1 -1
  134. package/dist/ta/adx.js +3 -2
  135. package/dist/ta/adx.js.map +1 -1
  136. package/dist/ta/alma.d.ts +6 -4
  137. package/dist/ta/alma.d.ts.map +1 -1
  138. package/dist/ta/alma.js +19 -6
  139. package/dist/ta/alma.js.map +1 -1
  140. package/dist/ta/atr.d.ts +3 -2
  141. package/dist/ta/atr.d.ts.map +1 -1
  142. package/dist/ta/atr.js +3 -2
  143. package/dist/ta/atr.js.map +1 -1
  144. package/dist/ta/bb.d.ts +3 -2
  145. package/dist/ta/bb.d.ts.map +1 -1
  146. package/dist/ta/bb.js +3 -2
  147. package/dist/ta/bb.js.map +1 -1
  148. package/dist/ta/chaikinOsc.d.ts +3 -2
  149. package/dist/ta/chaikinOsc.d.ts.map +1 -1
  150. package/dist/ta/chaikinOsc.js +3 -2
  151. package/dist/ta/chaikinOsc.js.map +1 -1
  152. package/dist/ta/crossover.d.ts +3 -2
  153. package/dist/ta/crossover.d.ts.map +1 -1
  154. package/dist/ta/crossover.js +3 -2
  155. package/dist/ta/crossover.js.map +1 -1
  156. package/dist/ta/crossunder.d.ts +3 -2
  157. package/dist/ta/crossunder.d.ts.map +1 -1
  158. package/dist/ta/crossunder.js +3 -2
  159. package/dist/ta/crossunder.js.map +1 -1
  160. package/dist/ta/dmi.d.ts +4 -3
  161. package/dist/ta/dmi.d.ts.map +1 -1
  162. package/dist/ta/dmi.js +4 -3
  163. package/dist/ta/dmi.js.map +1 -1
  164. package/dist/ta/ema.d.ts +3 -2
  165. package/dist/ta/ema.d.ts.map +1 -1
  166. package/dist/ta/ema.js +3 -2
  167. package/dist/ta/ema.js.map +1 -1
  168. package/dist/ta/eom.d.ts +3 -1
  169. package/dist/ta/eom.d.ts.map +1 -1
  170. package/dist/ta/eom.js +3 -1
  171. package/dist/ta/eom.js.map +1 -1
  172. package/dist/ta/highestbars.d.ts +25 -0
  173. package/dist/ta/highestbars.d.ts.map +1 -0
  174. package/dist/ta/highestbars.js +106 -0
  175. package/dist/ta/highestbars.js.map +1 -0
  176. package/dist/ta/historicalVolatility.d.ts +3 -2
  177. package/dist/ta/historicalVolatility.d.ts.map +1 -1
  178. package/dist/ta/historicalVolatility.js +3 -2
  179. package/dist/ta/historicalVolatility.js.map +1 -1
  180. package/dist/ta/ichimoku.d.ts +3 -1
  181. package/dist/ta/ichimoku.d.ts.map +1 -1
  182. package/dist/ta/ichimoku.js +3 -1
  183. package/dist/ta/ichimoku.js.map +1 -1
  184. package/dist/ta/lowestbars.d.ts +25 -0
  185. package/dist/ta/lowestbars.d.ts.map +1 -0
  186. package/dist/ta/lowestbars.js +102 -0
  187. package/dist/ta/lowestbars.js.map +1 -0
  188. package/dist/ta/macd.d.ts +3 -2
  189. package/dist/ta/macd.d.ts.map +1 -1
  190. package/dist/ta/macd.js +3 -2
  191. package/dist/ta/macd.js.map +1 -1
  192. package/dist/ta/massIndex.d.ts +3 -2
  193. package/dist/ta/massIndex.d.ts.map +1 -1
  194. package/dist/ta/massIndex.js +3 -2
  195. package/dist/ta/massIndex.js.map +1 -1
  196. package/dist/ta/mfi.d.ts +3 -1
  197. package/dist/ta/mfi.d.ts.map +1 -1
  198. package/dist/ta/mfi.js +3 -1
  199. package/dist/ta/mfi.js.map +1 -1
  200. package/dist/ta/netVolume.d.ts +3 -1
  201. package/dist/ta/netVolume.d.ts.map +1 -1
  202. package/dist/ta/netVolume.js +3 -1
  203. package/dist/ta/netVolume.js.map +1 -1
  204. package/dist/ta/nvi.d.ts +3 -1
  205. package/dist/ta/nvi.d.ts.map +1 -1
  206. package/dist/ta/nvi.js +3 -1
  207. package/dist/ta/nvi.js.map +1 -1
  208. package/dist/ta/persistence.d.ts.map +1 -1
  209. package/dist/ta/persistence.js +1 -40
  210. package/dist/ta/persistence.js.map +1 -1
  211. package/dist/ta/ppo.d.ts +3 -2
  212. package/dist/ta/ppo.d.ts.map +1 -1
  213. package/dist/ta/ppo.js +3 -2
  214. package/dist/ta/ppo.js.map +1 -1
  215. package/dist/ta/pvi.d.ts +3 -1
  216. package/dist/ta/pvi.d.ts.map +1 -1
  217. package/dist/ta/pvi.js +3 -1
  218. package/dist/ta/pvi.js.map +1 -1
  219. package/dist/ta/pvo.d.ts +3 -1
  220. package/dist/ta/pvo.d.ts.map +1 -1
  221. package/dist/ta/pvo.js +3 -1
  222. package/dist/ta/pvo.js.map +1 -1
  223. package/dist/ta/pvt.d.ts +3 -1
  224. package/dist/ta/pvt.d.ts.map +1 -1
  225. package/dist/ta/pvt.js +3 -1
  226. package/dist/ta/pvt.js.map +1 -1
  227. package/dist/ta/registry.d.ts +7 -1
  228. package/dist/ta/registry.d.ts.map +1 -1
  229. package/dist/ta/registry.js +4 -0
  230. package/dist/ta/registry.js.map +1 -1
  231. package/dist/ta/rsi.d.ts +3 -2
  232. package/dist/ta/rsi.d.ts.map +1 -1
  233. package/dist/ta/rsi.js +3 -2
  234. package/dist/ta/rsi.js.map +1 -1
  235. package/dist/ta/rvi.d.ts +3 -2
  236. package/dist/ta/rvi.d.ts.map +1 -1
  237. package/dist/ta/rvi.js +3 -2
  238. package/dist/ta/rvi.js.map +1 -1
  239. package/dist/ta/sessionVolumeProfile.d.ts.map +1 -1
  240. package/dist/ta/sessionVolumeProfile.js +1 -17
  241. package/dist/ta/sessionVolumeProfile.js.map +1 -1
  242. package/dist/ta/sma.d.ts +6 -3
  243. package/dist/ta/sma.d.ts.map +1 -1
  244. package/dist/ta/sma.js +6 -3
  245. package/dist/ta/sma.js.map +1 -1
  246. package/dist/ta/stdev.d.ts +3 -2
  247. package/dist/ta/stdev.d.ts.map +1 -1
  248. package/dist/ta/stdev.js +3 -2
  249. package/dist/ta/stdev.js.map +1 -1
  250. package/dist/ta/trendStrengthIndex.d.ts +3 -2
  251. package/dist/ta/trendStrengthIndex.d.ts.map +1 -1
  252. package/dist/ta/trendStrengthIndex.js +3 -2
  253. package/dist/ta/trendStrengthIndex.js.map +1 -1
  254. package/dist/ta/trix.d.ts +4 -3
  255. package/dist/ta/trix.d.ts.map +1 -1
  256. package/dist/ta/trix.js +4 -3
  257. package/dist/ta/trix.js.map +1 -1
  258. package/dist/ta/vortex.d.ts +3 -2
  259. package/dist/ta/vortex.d.ts.map +1 -1
  260. package/dist/ta/vortex.js +3 -2
  261. package/dist/ta/vortex.js.map +1 -1
  262. package/dist/time-accessors/civil.d.ts +73 -0
  263. package/dist/time-accessors/civil.d.ts.map +1 -0
  264. package/dist/time-accessors/civil.js +105 -0
  265. package/dist/time-accessors/civil.js.map +1 -0
  266. package/dist/time-accessors/index.d.ts +8 -0
  267. package/dist/time-accessors/index.d.ts.map +1 -0
  268. package/dist/time-accessors/index.js +9 -0
  269. package/dist/time-accessors/index.js.map +1 -0
  270. package/dist/time-accessors/sessionAccessors.d.ts +50 -0
  271. package/dist/time-accessors/sessionAccessors.d.ts.map +1 -0
  272. package/dist/time-accessors/sessionAccessors.js +79 -0
  273. package/dist/time-accessors/sessionAccessors.js.map +1 -0
  274. package/dist/time-accessors/sessionWindow.d.ts +17 -0
  275. package/dist/time-accessors/sessionWindow.d.ts.map +1 -0
  276. package/dist/time-accessors/sessionWindow.js +41 -0
  277. package/dist/time-accessors/sessionWindow.js.map +1 -0
  278. package/dist/time-accessors/timeAccessors.d.ts +54 -0
  279. package/dist/time-accessors/timeAccessors.d.ts.map +1 -0
  280. package/dist/time-accessors/timeAccessors.js +132 -0
  281. package/dist/time-accessors/timeAccessors.js.map +1 -0
  282. package/dist/time-accessors/tzDiagnostic.d.ts +17 -0
  283. package/dist/time-accessors/tzDiagnostic.d.ts.map +1 -0
  284. package/dist/time-accessors/tzDiagnostic.js +34 -0
  285. package/dist/time-accessors/tzDiagnostic.js.map +1 -0
  286. package/dist/time-accessors/tzOffset.d.ts +31 -0
  287. package/dist/time-accessors/tzOffset.d.ts.map +1 -0
  288. package/dist/time-accessors/tzOffset.js +67 -0
  289. package/dist/time-accessors/tzOffset.js.map +1 -0
  290. package/package.json +3 -3
  291. package/dist/ta/lib/applyOffset.d.ts +0 -19
  292. package/dist/ta/lib/applyOffset.d.ts.map +0 -1
  293. package/dist/ta/lib/applyOffset.js +0 -38
  294. package/dist/ta/lib/applyOffset.js.map +0 -1
@@ -0,0 +1,34 @@
1
+ // Copyright (c) 2026 Invinite. Licensed under the MIT License.
2
+ // See the LICENSE file in the repo root for full license text.
3
+ import { pushDiagnostic } from "../emit/index.js";
4
+ /**
5
+ * Build the `onDstUnsupported(tz)` reporter the `time.*` and `session.*`
6
+ * accessor factories share. A DST-bearing IANA zone the UTC-first runtime
7
+ * cannot honour warns at most once per distinct tz per mount, deduped on
8
+ * `ctx.diagnosedTzKeys` — so a script using BOTH `time.*` and `session.isOpen`
9
+ * on one DST zone fires `tz-dst-unsupported` once total.
10
+ *
11
+ * @since 1.5
12
+ * @stable
13
+ * @example
14
+ * // import { buildTzDstReporter } from "@invinite-org/chartlang-runtime";
15
+ * // const report = buildTzDstReporter(ctx);
16
+ * // report("America/New_York");
17
+ */
18
+ export function buildTzDstReporter(ctx) {
19
+ return (tz) => {
20
+ const key = `tz-dst-unsupported|${tz}`;
21
+ if (ctx.diagnosedTzKeys.has(key))
22
+ return;
23
+ ctx.diagnosedTzKeys.add(key);
24
+ pushDiagnostic(ctx.emissions, {
25
+ kind: "diagnostic",
26
+ severity: "warning",
27
+ code: "tz-dst-unsupported",
28
+ message: `Timezone \`${tz}\` needs DST data unavailable in this build; calendar fields used UTC.`,
29
+ slotId: null,
30
+ bar: ctx.barIndex(),
31
+ });
32
+ };
33
+ }
34
+ //# sourceMappingURL=tzDiagnostic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tzDiagnostic.js","sourceRoot":"","sources":["../../src/time-accessors/tzDiagnostic.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAE/D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAmB;IAClD,OAAO,CAAC,EAAE,EAAE,EAAE;QACV,MAAM,GAAG,GAAG,sBAAsB,EAAE,EAAE,CAAC;QACvC,IAAI,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO;QACzC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7B,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE;YAC1B,IAAI,EAAE,YAAY;YAClB,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,cAAc,EAAE,wEAAwE;YACjG,MAAM,EAAE,IAAI;YACZ,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;SACtB,CAAC,CAAC;IACP,CAAC,CAAC;AACN,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\nimport { pushDiagnostic } from \"../emit/index.js\";\nimport type { RuntimeContext } from \"../runtimeContext.js\";\n\n/**\n * Build the `onDstUnsupported(tz)` reporter the `time.*` and `session.*`\n * accessor factories share. A DST-bearing IANA zone the UTC-first runtime\n * cannot honour warns at most once per distinct tz per mount, deduped on\n * `ctx.diagnosedTzKeys` — so a script using BOTH `time.*` and `session.isOpen`\n * on one DST zone fires `tz-dst-unsupported` once total.\n *\n * @since 1.5\n * @stable\n * @example\n * // import { buildTzDstReporter } from \"@invinite-org/chartlang-runtime\";\n * // const report = buildTzDstReporter(ctx);\n * // report(\"America/New_York\");\n */\nexport function buildTzDstReporter(ctx: RuntimeContext): (tz: string) => void {\n return (tz) => {\n const key = `tz-dst-unsupported|${tz}`;\n if (ctx.diagnosedTzKeys.has(key)) return;\n ctx.diagnosedTzKeys.add(key);\n pushDiagnostic(ctx.emissions, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"tz-dst-unsupported\",\n message: `Timezone \\`${tz}\\` needs DST data unavailable in this build; calendar fields used UTC.`,\n slotId: null,\n bar: ctx.barIndex(),\n });\n };\n}\n"]}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The resolution of a timezone string to a fixed UTC offset in minutes.
3
+ * `dstUnsupported` is `true` when `tz` named a DST-bearing IANA region the
4
+ * UTC-first runtime cannot honour — callers then use the `0` offset AND raise
5
+ * a one-time `tz-dst-unsupported` diagnostic.
6
+ *
7
+ * @since 1.5
8
+ * @stable
9
+ * @example
10
+ * // import type { ResolvedOffset } from "@invinite-org/chartlang-runtime";
11
+ * // const o: ResolvedOffset = { offsetMin: 0, dstUnsupported: false };
12
+ */
13
+ export type ResolvedOffset = {
14
+ readonly offsetMin: number;
15
+ readonly dstUnsupported: boolean;
16
+ };
17
+ /**
18
+ * Resolve a timezone string to a fixed UTC offset. UTC aliases and explicit
19
+ * fixed offsets (`±HH:MM`, `UTC±H`, `Etc/GMT±H`) parse to integer minutes; any
20
+ * other (region) name returns the zero offset flagged `dstUnsupported`. Pure —
21
+ * never calls `Intl`, so the result is byte-reproducible across hosts.
22
+ *
23
+ * @since 1.5
24
+ * @stable
25
+ * @example
26
+ * // import { resolveOffsetMinutes } from "@invinite-org/chartlang-runtime";
27
+ * // resolveOffsetMinutes("+05:30"); // { offsetMin: 330, dstUnsupported: false }
28
+ * // resolveOffsetMinutes("America/New_York"); // { offsetMin: 0, dstUnsupported: true }
29
+ */
30
+ export declare function resolveOffsetMinutes(tz: string): ResolvedOffset;
31
+ //# sourceMappingURL=tzOffset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tzOffset.d.ts","sourceRoot":"","sources":["../../src/time-accessors/tzOffset.ts"],"names":[],"mappings":"AAWA;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;CAAE,CAAC;AAuB9F;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,CAwB/D"}
@@ -0,0 +1,67 @@
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
+ // The single source of the chartlang UTC-first determinism policy: only UTC
5
+ // and explicit fixed offsets resolve to a numeric minute shift. A DST-bearing
6
+ // IANA region resolves to UTC + a `dstUnsupported` flag — NEVER an `Intl`
7
+ // lookup (whose output varies by host ICU/tz-data version).
8
+ /** UTC-equivalent zone names that resolve to a zero offset. */
9
+ const UTC_ALIASES = new Set(["", "UTC", "ETC/UTC", "GMT", "Z"]);
10
+ const UTC = { offsetMin: 0, dstUnsupported: false };
11
+ const DST_UNSUPPORTED = { offsetMin: 0, dstUnsupported: true };
12
+ // `+HH:MM` / `-HH:MM` / `+HHMM` / `+HH` — a leading sign then 1-2 hour digits
13
+ // and optional 2 minute digits.
14
+ const SIGNED_OFFSET = /^([+-])(\d{1,2})(?::?(\d{2}))?$/;
15
+ // `UTC±H[:MM]` / `GMT±H[:MM]` — the offset has the same sign as the number.
16
+ const UTC_PREFIXED = /^(?:UTC|GMT)([+-]\d{1,2}(?::?\d{2})?)$/;
17
+ // `Etc/GMT±H` — POSIX-style, the sign is INVERTED (`Etc/GMT-5` is UTC+5).
18
+ const ETC_GMT = /^ETC\/GMT([+-])(\d{1,2})$/;
19
+ function parseSignedOffset(value) {
20
+ const match = SIGNED_OFFSET.exec(value);
21
+ if (match === null)
22
+ return null;
23
+ const hours = Number(match[2]);
24
+ const minutes = match[3] === undefined ? 0 : Number(match[3]);
25
+ if (hours > 23 || minutes > 59)
26
+ return null;
27
+ const magnitude = hours * 60 + minutes;
28
+ return match[1] === "-" ? -magnitude : magnitude;
29
+ }
30
+ /**
31
+ * Resolve a timezone string to a fixed UTC offset. UTC aliases and explicit
32
+ * fixed offsets (`±HH:MM`, `UTC±H`, `Etc/GMT±H`) parse to integer minutes; any
33
+ * other (region) name returns the zero offset flagged `dstUnsupported`. Pure —
34
+ * never calls `Intl`, so the result is byte-reproducible across hosts.
35
+ *
36
+ * @since 1.5
37
+ * @stable
38
+ * @example
39
+ * // import { resolveOffsetMinutes } from "@invinite-org/chartlang-runtime";
40
+ * // resolveOffsetMinutes("+05:30"); // { offsetMin: 330, dstUnsupported: false }
41
+ * // resolveOffsetMinutes("America/New_York"); // { offsetMin: 0, dstUnsupported: true }
42
+ */
43
+ export function resolveOffsetMinutes(tz) {
44
+ const normalized = tz.trim().toUpperCase();
45
+ if (UTC_ALIASES.has(normalized))
46
+ return UTC;
47
+ const signed = parseSignedOffset(normalized);
48
+ if (signed !== null)
49
+ return { offsetMin: signed, dstUnsupported: false };
50
+ const utcPrefixed = UTC_PREFIXED.exec(normalized);
51
+ if (utcPrefixed !== null) {
52
+ const minutes = parseSignedOffset(utcPrefixed[1]);
53
+ if (minutes !== null)
54
+ return { offsetMin: minutes, dstUnsupported: false };
55
+ }
56
+ const etcGmt = ETC_GMT.exec(normalized);
57
+ if (etcGmt !== null) {
58
+ const hours = Number(etcGmt[2]);
59
+ if (hours <= 23) {
60
+ // POSIX inverts the sign: `Etc/GMT-5` is UTC+5.
61
+ const magnitude = hours * 60;
62
+ return { offsetMin: etcGmt[1] === "-" ? magnitude : -magnitude, dstUnsupported: false };
63
+ }
64
+ }
65
+ return DST_UNSUPPORTED;
66
+ }
67
+ //# sourceMappingURL=tzOffset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tzOffset.js","sourceRoot":"","sources":["../../src/time-accessors/tzOffset.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// The single source of the chartlang UTC-first determinism policy: only UTC\n// and explicit fixed offsets resolve to a numeric minute shift. A DST-bearing\n// IANA region resolves to UTC + a `dstUnsupported` flag — NEVER an `Intl`\n// lookup (whose output varies by host ICU/tz-data version).\n\n/** UTC-equivalent zone names that resolve to a zero offset. */\nconst UTC_ALIASES = new Set([\"\", \"UTC\", \"ETC/UTC\", \"GMT\", \"Z\"]);\n\n/**\n * The resolution of a timezone string to a fixed UTC offset in minutes.\n * `dstUnsupported` is `true` when `tz` named a DST-bearing IANA region the\n * UTC-first runtime cannot honour — callers then use the `0` offset AND raise\n * a one-time `tz-dst-unsupported` diagnostic.\n *\n * @since 1.5\n * @stable\n * @example\n * // import type { ResolvedOffset } from \"@invinite-org/chartlang-runtime\";\n * // const o: ResolvedOffset = { offsetMin: 0, dstUnsupported: false };\n */\nexport type ResolvedOffset = { readonly offsetMin: number; readonly dstUnsupported: boolean };\n\nconst UTC: ResolvedOffset = { offsetMin: 0, dstUnsupported: false };\nconst DST_UNSUPPORTED: ResolvedOffset = { offsetMin: 0, dstUnsupported: true };\n\n// `+HH:MM` / `-HH:MM` / `+HHMM` / `+HH` — a leading sign then 1-2 hour digits\n// and optional 2 minute digits.\nconst SIGNED_OFFSET = /^([+-])(\\d{1,2})(?::?(\\d{2}))?$/;\n// `UTC±H[:MM]` / `GMT±H[:MM]` — the offset has the same sign as the number.\nconst UTC_PREFIXED = /^(?:UTC|GMT)([+-]\\d{1,2}(?::?\\d{2})?)$/;\n// `Etc/GMT±H` — POSIX-style, the sign is INVERTED (`Etc/GMT-5` is UTC+5).\nconst ETC_GMT = /^ETC\\/GMT([+-])(\\d{1,2})$/;\n\nfunction parseSignedOffset(value: string): number | null {\n const match = SIGNED_OFFSET.exec(value);\n if (match === null) return null;\n const hours = Number(match[2]);\n const minutes = match[3] === undefined ? 0 : Number(match[3]);\n if (hours > 23 || minutes > 59) return null;\n const magnitude = hours * 60 + minutes;\n return match[1] === \"-\" ? -magnitude : magnitude;\n}\n\n/**\n * Resolve a timezone string to a fixed UTC offset. UTC aliases and explicit\n * fixed offsets (`±HH:MM`, `UTC±H`, `Etc/GMT±H`) parse to integer minutes; any\n * other (region) name returns the zero offset flagged `dstUnsupported`. Pure —\n * never calls `Intl`, so the result is byte-reproducible across hosts.\n *\n * @since 1.5\n * @stable\n * @example\n * // import { resolveOffsetMinutes } from \"@invinite-org/chartlang-runtime\";\n * // resolveOffsetMinutes(\"+05:30\"); // { offsetMin: 330, dstUnsupported: false }\n * // resolveOffsetMinutes(\"America/New_York\"); // { offsetMin: 0, dstUnsupported: true }\n */\nexport function resolveOffsetMinutes(tz: string): ResolvedOffset {\n const normalized = tz.trim().toUpperCase();\n if (UTC_ALIASES.has(normalized)) return UTC;\n\n const signed = parseSignedOffset(normalized);\n if (signed !== null) return { offsetMin: signed, dstUnsupported: false };\n\n const utcPrefixed = UTC_PREFIXED.exec(normalized);\n if (utcPrefixed !== null) {\n const minutes = parseSignedOffset(utcPrefixed[1]);\n if (minutes !== null) return { offsetMin: minutes, dstUnsupported: false };\n }\n\n const etcGmt = ETC_GMT.exec(normalized);\n if (etcGmt !== null) {\n const hours = Number(etcGmt[2]);\n if (hours <= 23) {\n // POSIX inverts the sign: `Etc/GMT-5` is UTC+5.\n const magnitude = hours * 60;\n return { offsetMin: etcGmt[1] === \"-\" ? magnitude : -magnitude, dstUnsupported: false };\n }\n }\n\n return DST_UNSUPPORTED;\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.3.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.6.0",
27
+ "@invinite-org/chartlang-core": "^1.3.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"]}