oakscriptjs 0.9.5 → 0.10.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 (256) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/array/index.d.ts +93 -50
  3. package/dist/cjs/array/index.d.ts.map +1 -1
  4. package/dist/cjs/array/index.js +239 -78
  5. package/dist/cjs/array/index.js.map +3 -3
  6. package/dist/cjs/callsite/index.d.ts +81 -2
  7. package/dist/cjs/callsite/index.d.ts.map +1 -1
  8. package/dist/cjs/callsite/index.js +62 -1
  9. package/dist/cjs/callsite/index.js.map +2 -2
  10. package/dist/cjs/color/index.d.ts +7 -3
  11. package/dist/cjs/color/index.d.ts.map +1 -1
  12. package/dist/cjs/color/index.js +6 -1
  13. package/dist/cjs/color/index.js.map +2 -2
  14. package/dist/cjs/drawing/bar-time.d.ts +24 -0
  15. package/dist/cjs/drawing/bar-time.d.ts.map +1 -0
  16. package/dist/cjs/drawing/bar-time.js +47 -0
  17. package/dist/cjs/drawing/bar-time.js.map +7 -0
  18. package/dist/cjs/drawing/output.d.ts +32 -0
  19. package/dist/cjs/drawing/output.d.ts.map +1 -0
  20. package/dist/cjs/drawing/output.js +184 -0
  21. package/dist/cjs/drawing/output.js.map +7 -0
  22. package/dist/cjs/drawing/registry.d.ts +5 -4
  23. package/dist/cjs/drawing/registry.d.ts.map +1 -1
  24. package/dist/cjs/drawing/registry.js +11 -2
  25. package/dist/cjs/drawing/registry.js.map +2 -2
  26. package/dist/cjs/index.d.ts +6 -3
  27. package/dist/cjs/index.d.ts.map +1 -1
  28. package/dist/cjs/index.js +9 -2
  29. package/dist/cjs/index.js.map +2 -2
  30. package/dist/cjs/label/index.d.ts.map +1 -1
  31. package/dist/cjs/label/index.js +2 -1
  32. package/dist/cjs/label/index.js.map +2 -2
  33. package/dist/cjs/linefill/index.d.ts.map +1 -1
  34. package/dist/cjs/linefill/index.js +1 -0
  35. package/dist/cjs/linefill/index.js.map +2 -2
  36. package/dist/cjs/math/index.d.ts +76 -21
  37. package/dist/cjs/math/index.d.ts.map +1 -1
  38. package/dist/cjs/math/index.js +155 -41
  39. package/dist/cjs/math/index.js.map +3 -3
  40. package/dist/cjs/matrix/index.d.ts.map +1 -1
  41. package/dist/cjs/matrix/index.js +42 -36
  42. package/dist/cjs/matrix/index.js.map +2 -2
  43. package/dist/cjs/polyline/index.d.ts +3 -5
  44. package/dist/cjs/polyline/index.d.ts.map +1 -1
  45. package/dist/cjs/polyline/index.js +0 -5
  46. package/dist/cjs/polyline/index.js.map +2 -2
  47. package/dist/cjs/runtime/series.d.ts +9 -0
  48. package/dist/cjs/runtime/series.d.ts.map +1 -1
  49. package/dist/cjs/runtime/series.js +16 -2
  50. package/dist/cjs/runtime/series.js.map +2 -2
  51. package/dist/cjs/runtime/types.d.ts +22 -0
  52. package/dist/cjs/runtime/types.d.ts.map +1 -1
  53. package/dist/cjs/runtime/types.js.map +1 -1
  54. package/dist/cjs/script/index.d.ts +97 -36
  55. package/dist/cjs/script/index.d.ts.map +1 -1
  56. package/dist/cjs/script/index.js +173 -26
  57. package/dist/cjs/script/index.js.map +3 -3
  58. package/dist/cjs/session/calendar.d.ts.map +1 -1
  59. package/dist/cjs/session/calendar.js +15 -2
  60. package/dist/cjs/session/calendar.js.map +2 -2
  61. package/dist/cjs/str/index.d.ts +50 -38
  62. package/dist/cjs/str/index.d.ts.map +1 -1
  63. package/dist/cjs/str/index.js +43 -15
  64. package/dist/cjs/str/index.js.map +2 -2
  65. package/dist/cjs/str/messageformat.d.ts +2 -1
  66. package/dist/cjs/str/messageformat.d.ts.map +1 -1
  67. package/dist/cjs/str/messageformat.js +4 -1
  68. package/dist/cjs/str/messageformat.js.map +2 -2
  69. package/dist/cjs/str/numberformat.d.ts +4 -0
  70. package/dist/cjs/str/numberformat.d.ts.map +1 -1
  71. package/dist/cjs/str/numberformat.js +26 -4
  72. package/dist/cjs/str/numberformat.js.map +3 -3
  73. package/dist/cjs/ta/index.d.ts +86 -43
  74. package/dist/cjs/ta/index.d.ts.map +1 -1
  75. package/dist/cjs/ta/index.js +173 -267
  76. package/dist/cjs/ta/index.js.map +3 -3
  77. package/dist/cjs/ta/running-sum.d.ts +54 -2
  78. package/dist/cjs/ta/running-sum.d.ts.map +1 -1
  79. package/dist/cjs/ta/running-sum.js +132 -52
  80. package/dist/cjs/ta/running-sum.js.map +2 -2
  81. package/dist/cjs/ta-series.d.ts +4 -4
  82. package/dist/cjs/ta-series.d.ts.map +1 -1
  83. package/dist/cjs/ta-series.js +4 -3
  84. package/dist/cjs/ta-series.js.map +2 -2
  85. package/dist/cjs/table/index.d.ts +87 -0
  86. package/dist/cjs/table/index.d.ts.map +1 -0
  87. package/dist/cjs/table/index.js +150 -0
  88. package/dist/cjs/table/index.js.map +7 -0
  89. package/dist/cjs/text/index.d.ts +17 -2
  90. package/dist/cjs/text/index.d.ts.map +1 -1
  91. package/dist/cjs/text/index.js +15 -1
  92. package/dist/cjs/text/index.js.map +2 -2
  93. package/dist/cjs/time/datestring.d.ts +1 -0
  94. package/dist/cjs/time/datestring.d.ts.map +1 -1
  95. package/dist/cjs/time/datestring.js +7 -0
  96. package/dist/cjs/time/datestring.js.map +2 -2
  97. package/dist/cjs/time/index.d.ts.map +1 -1
  98. package/dist/cjs/time/index.js +2 -1
  99. package/dist/cjs/time/index.js.map +2 -2
  100. package/dist/cjs/time/session.d.ts +28 -9
  101. package/dist/cjs/time/session.d.ts.map +1 -1
  102. package/dist/cjs/time/session.js +74 -28
  103. package/dist/cjs/time/session.js.map +2 -2
  104. package/dist/cjs/time/timezone.d.ts +5 -0
  105. package/dist/cjs/time/timezone.d.ts.map +1 -1
  106. package/dist/cjs/time/timezone.js +15 -1
  107. package/dist/cjs/time/timezone.js.map +2 -2
  108. package/dist/cjs/types/index.d.ts +30 -1
  109. package/dist/cjs/types/index.d.ts.map +1 -1
  110. package/dist/cjs/types/index.js +12 -0
  111. package/dist/cjs/types/index.js.map +2 -2
  112. package/dist/cjs/types/metadata.d.ts +258 -26
  113. package/dist/cjs/types/metadata.d.ts.map +1 -1
  114. package/dist/cjs/types/metadata.js.map +1 -1
  115. package/dist/esm/array/index.d.ts +93 -50
  116. package/dist/esm/array/index.d.ts.map +1 -1
  117. package/dist/esm/array/index.js +383 -133
  118. package/dist/esm/array/index.js.map +1 -1
  119. package/dist/esm/callsite/index.d.ts +81 -2
  120. package/dist/esm/callsite/index.d.ts.map +1 -1
  121. package/dist/esm/callsite/index.js +145 -3
  122. package/dist/esm/callsite/index.js.map +1 -1
  123. package/dist/esm/color/index.d.ts +7 -3
  124. package/dist/esm/color/index.d.ts.map +1 -1
  125. package/dist/esm/color/index.js +15 -3
  126. package/dist/esm/color/index.js.map +1 -1
  127. package/dist/esm/drawing/bar-time.d.ts +24 -0
  128. package/dist/esm/drawing/bar-time.d.ts.map +1 -0
  129. package/dist/esm/drawing/bar-time.js +44 -0
  130. package/dist/esm/drawing/bar-time.js.map +1 -0
  131. package/dist/esm/drawing/output.d.ts +32 -0
  132. package/dist/esm/drawing/output.d.ts.map +1 -0
  133. package/dist/esm/drawing/output.js +190 -0
  134. package/dist/esm/drawing/output.js.map +1 -0
  135. package/dist/esm/drawing/registry.d.ts +5 -4
  136. package/dist/esm/drawing/registry.d.ts.map +1 -1
  137. package/dist/esm/drawing/registry.js +12 -2
  138. package/dist/esm/drawing/registry.js.map +1 -1
  139. package/dist/esm/index.d.ts +6 -3
  140. package/dist/esm/index.d.ts.map +1 -1
  141. package/dist/esm/index.js +7 -3
  142. package/dist/esm/index.js.map +1 -1
  143. package/dist/esm/label/index.d.ts.map +1 -1
  144. package/dist/esm/label/index.js +2 -1
  145. package/dist/esm/label/index.js.map +1 -1
  146. package/dist/esm/linefill/index.d.ts.map +1 -1
  147. package/dist/esm/linefill/index.js +3 -0
  148. package/dist/esm/linefill/index.js.map +1 -1
  149. package/dist/esm/math/index.d.ts +76 -21
  150. package/dist/esm/math/index.d.ts.map +1 -1
  151. package/dist/esm/math/index.js +227 -61
  152. package/dist/esm/math/index.js.map +1 -1
  153. package/dist/esm/matrix/index.d.ts.map +1 -1
  154. package/dist/esm/matrix/index.js +57 -43
  155. package/dist/esm/matrix/index.js.map +1 -1
  156. package/dist/esm/polyline/index.d.ts +3 -5
  157. package/dist/esm/polyline/index.d.ts.map +1 -1
  158. package/dist/esm/polyline/index.js +3 -9
  159. package/dist/esm/polyline/index.js.map +1 -1
  160. package/dist/esm/runtime/series.d.ts +9 -0
  161. package/dist/esm/runtime/series.d.ts.map +1 -1
  162. package/dist/esm/runtime/series.js +18 -1
  163. package/dist/esm/runtime/series.js.map +1 -1
  164. package/dist/esm/runtime/types.d.ts +22 -0
  165. package/dist/esm/runtime/types.d.ts.map +1 -1
  166. package/dist/esm/script/index.d.ts +97 -36
  167. package/dist/esm/script/index.d.ts.map +1 -1
  168. package/dist/esm/script/index.js +211 -22
  169. package/dist/esm/script/index.js.map +1 -1
  170. package/dist/esm/session/calendar.d.ts.map +1 -1
  171. package/dist/esm/session/calendar.js +22 -2
  172. package/dist/esm/session/calendar.js.map +1 -1
  173. package/dist/esm/str/index.d.ts +50 -38
  174. package/dist/esm/str/index.d.ts.map +1 -1
  175. package/dist/esm/str/index.js +103 -52
  176. package/dist/esm/str/index.js.map +1 -1
  177. package/dist/esm/str/messageformat.d.ts +2 -1
  178. package/dist/esm/str/messageformat.d.ts.map +1 -1
  179. package/dist/esm/str/messageformat.js +7 -2
  180. package/dist/esm/str/messageformat.js.map +1 -1
  181. package/dist/esm/str/numberformat.d.ts +4 -0
  182. package/dist/esm/str/numberformat.d.ts.map +1 -1
  183. package/dist/esm/str/numberformat.js +38 -4
  184. package/dist/esm/str/numberformat.js.map +1 -1
  185. package/dist/esm/ta/index.d.ts +86 -43
  186. package/dist/esm/ta/index.d.ts.map +1 -1
  187. package/dist/esm/ta/index.js +296 -348
  188. package/dist/esm/ta/index.js.map +1 -1
  189. package/dist/esm/ta/running-sum.d.ts +54 -2
  190. package/dist/esm/ta/running-sum.d.ts.map +1 -1
  191. package/dist/esm/ta/running-sum.js +166 -71
  192. package/dist/esm/ta/running-sum.js.map +1 -1
  193. package/dist/esm/ta-series.d.ts +4 -4
  194. package/dist/esm/ta-series.d.ts.map +1 -1
  195. package/dist/esm/ta-series.js +5 -4
  196. package/dist/esm/ta-series.js.map +1 -1
  197. package/dist/esm/table/index.d.ts +87 -0
  198. package/dist/esm/table/index.d.ts.map +1 -0
  199. package/dist/esm/table/index.js +169 -0
  200. package/dist/esm/table/index.js.map +1 -0
  201. package/dist/esm/text/index.d.ts +17 -2
  202. package/dist/esm/text/index.d.ts.map +1 -1
  203. package/dist/esm/text/index.js +17 -2
  204. package/dist/esm/text/index.js.map +1 -1
  205. package/dist/esm/time/datestring.d.ts +1 -0
  206. package/dist/esm/time/datestring.d.ts.map +1 -1
  207. package/dist/esm/time/datestring.js +12 -0
  208. package/dist/esm/time/datestring.js.map +1 -1
  209. package/dist/esm/time/index.d.ts.map +1 -1
  210. package/dist/esm/time/index.js +3 -1
  211. package/dist/esm/time/index.js.map +1 -1
  212. package/dist/esm/time/session.d.ts +28 -9
  213. package/dist/esm/time/session.d.ts.map +1 -1
  214. package/dist/esm/time/session.js +113 -42
  215. package/dist/esm/time/session.js.map +1 -1
  216. package/dist/esm/time/timezone.d.ts +5 -0
  217. package/dist/esm/time/timezone.d.ts.map +1 -1
  218. package/dist/esm/time/timezone.js +21 -1
  219. package/dist/esm/time/timezone.js.map +1 -1
  220. package/dist/esm/types/index.d.ts +30 -1
  221. package/dist/esm/types/index.d.ts.map +1 -1
  222. package/dist/esm/types/index.js +14 -0
  223. package/dist/esm/types/index.js.map +1 -1
  224. package/dist/esm/types/metadata.d.ts +258 -26
  225. package/dist/esm/types/metadata.d.ts.map +1 -1
  226. package/package.json +1 -1
  227. package/src/array/index.ts +364 -150
  228. package/src/callsite/index.ts +147 -3
  229. package/src/color/index.ts +15 -5
  230. package/src/drawing/bar-time.ts +42 -0
  231. package/src/drawing/output.ts +214 -0
  232. package/src/drawing/registry.ts +16 -6
  233. package/src/index.ts +9 -3
  234. package/src/label/index.ts +2 -1
  235. package/src/linefill/index.ts +2 -0
  236. package/src/math/index.ts +256 -74
  237. package/src/matrix/index.ts +52 -52
  238. package/src/polyline/index.ts +3 -12
  239. package/src/runtime/series.ts +22 -1
  240. package/src/runtime/types.ts +23 -0
  241. package/src/script/index.ts +307 -25
  242. package/src/session/calendar.ts +22 -2
  243. package/src/str/index.ts +95 -51
  244. package/src/str/messageformat.ts +7 -2
  245. package/src/str/numberformat.ts +39 -4
  246. package/src/ta/index.ts +306 -386
  247. package/src/ta/running-sum.ts +187 -74
  248. package/src/ta-series.ts +8 -7
  249. package/src/table/index.ts +221 -0
  250. package/src/text/index.ts +18 -2
  251. package/src/time/datestring.ts +10 -0
  252. package/src/time/index.ts +3 -1
  253. package/src/time/session.ts +97 -47
  254. package/src/time/timezone.ts +21 -1
  255. package/src/types/index.ts +32 -1
  256. package/src/types/metadata.ts +325 -26
@@ -54,6 +54,7 @@ const ZONE = String.raw`(ut|utc|gmt|[ecmp][sd]t|(?:utc|gmt)?\s*[+-]\d{1,2}(?::?\
54
54
  const NUMERIC_ZONE = String.raw`([+-]\d{2}(?::?\d{2})?)`;
55
55
  const DATE = String.raw`(\d{4})([-/])(\d{1,2})\2(\d{1,2})`;
56
56
  const WEEKDAY = String.raw`(?:[a-z]{3,9},?\s+)?`;
57
+ const YEAR_MONTH = /^(\d{4})(?:-(\d{1,2}))?$/;
57
58
  const ISO_T = new RegExp(String.raw`^${DATE}t${TIME}\s*${NUMERIC_ZONE}?$`, "i");
58
59
  const ISO = new RegExp(String.raw`^${DATE}(?:\s+${TIME})?\s*${ZONE}?$`, "i");
59
60
  const DAY_FIRST = new RegExp(String.raw`^${WEEKDAY}(\d{1,2})(?:\s+|-)([a-z]+)\.?,?(?:\s+|-)(\d{4})(?:,?\s+${TIME})?\s*${ZONE}?$`, "i");
@@ -78,12 +79,18 @@ function parseDateString(dateString) {
78
79
  let year, month, day;
79
80
  let rest;
80
81
  let m;
82
+ if (m = YEAR_MONTH.exec(text)) {
83
+ const mo = m[2] ? Number(m[2]) : 1;
84
+ if (mo < 1 || mo > 12) throw new SyntaxError(`Invalid date string "${dateString}": a field is out of range`);
85
+ return Date.UTC(Number(m[1]), mo - 1, 1);
86
+ }
81
87
  if (m = ISO_T.exec(text) ?? ISO.exec(text)) {
82
88
  [year, month, day] = [m[1], Number(m[3]), m[4]];
83
89
  rest = m.slice(5);
84
90
  } else if (m = DAY_FIRST.exec(text)) {
85
91
  [day, month, year] = [m[1], monthNumber(m[2]), m[3]];
86
92
  rest = m.slice(4);
93
+ if (rest[0] === void 0 && rest[4] !== void 0) return NaN;
87
94
  } else if (m = MONTH_FIRST.exec(text)) {
88
95
  [month, day, year] = [monthNumber(m[1]), m[2], m[3]];
89
96
  rest = m.slice(4);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/time/datestring.ts"],
4
- "sourcesContent": ["/**\n * Date strings of `timestamp(dateString)`: IETF RFC 2822 and ISO 8601.\n *\n * Accepted forms (case-insensitive), all with an optional time zone at the end:\n * - \"2020-02-20\", \"2020-2-5\", \"2020/02/20\", \"2020-02-20 14:48\", \"2020-02-20 9:30:15\"\n * - \"2020-02-20T14:48:00\", \"2020-02-20T14:48:00.250\", \"2020-02-20T14:48:00+05:30\"\n * - \"20 Feb 2020\", \"5-Jan-2024\", \"Thu, 20 Feb 2020 14:48:00\", \"20 February 2020 14:48\"\n * - \"Feb 20 2020 14:48:05\", \"Jan 5, 2024 09:30\"\n *\n * Time zones: \"UT\", \"UTC\", \"GMT\", \"+0530\", \"-05:00\", \"GMT+5\", \"UTC-0300\", and the RFC 2822\n * names EST, EDT, CST, CDT, MST, MDT, PST, PDT. After a \"T\" time, only numeric offsets.\n * Without a time the time is 00:00. Without a time zone the time zone is GMT+0.\n * \"24:00\" is midnight at the end of the day.\n *\n * \"Z\", \"2024-01-01T09:30:00 GMT\", \"24:30\" and \"09:30:60\" are compile errors in PineScript, and\n * errors here.\n */\n\nconst MONTHS = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];\nconst FULL_MONTHS = [\n 'january', 'february', 'march', 'april', 'may', 'june',\n 'july', 'august', 'september', 'october', 'november', 'december',\n];\n\n/** RFC 2822 obsolete zone names, in hours from UTC. */\nconst ZONE_NAMES: Record<string, number> = {\n ut: 0, utc: 0, gmt: 0,\n est: -5, edt: -4, cst: -6, cdt: -5, mst: -7, mdt: -6, pst: -8, pdt: -7,\n};\n\nconst TIME = String.raw`(\\d{1,2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{1,3})\\d*)?)?`;\nconst ZONE = String.raw`(ut|utc|gmt|[ecmp][sd]t|(?:utc|gmt)?\\s*[+-]\\d{1,2}(?::?\\d{2})?)`;\nconst NUMERIC_ZONE = String.raw`([+-]\\d{2}(?::?\\d{2})?)`;\nconst DATE = String.raw`(\\d{4})([-/])(\\d{1,2})\\2(\\d{1,2})`;\nconst WEEKDAY = String.raw`(?:[a-z]{3,9},?\\s+)?`;\n\nconst ISO_T = new RegExp(String.raw`^${DATE}t${TIME}\\s*${NUMERIC_ZONE}?$`, 'i');\nconst ISO = new RegExp(String.raw`^${DATE}(?:\\s+${TIME})?\\s*${ZONE}?$`, 'i');\nconst DAY_FIRST = new RegExp(String.raw`^${WEEKDAY}(\\d{1,2})(?:\\s+|-)([a-z]+)\\.?,?(?:\\s+|-)(\\d{4})(?:,?\\s+${TIME})?\\s*${ZONE}?$`, 'i');\nconst MONTH_FIRST = new RegExp(String.raw`^${WEEKDAY}([a-z]+)\\.?\\s+(\\d{1,2}),?\\s+(\\d{4})(?:,?\\s+${TIME})?\\s*${ZONE}?$`, 'i');\n\n/** Month number (1-12) of an English month name or its prefix of 3+ letters (\"Sep\", \"Sept\", \"September\"). */\nfunction monthNumber(name: string): number {\n const lower = name.toLowerCase();\n const i = FULL_MONTHS.findIndex((full, k) => lower.startsWith(MONTHS[k]!) && full.startsWith(lower));\n return i + 1;\n}\n\n/** Zone offset in minutes from UTC. */\nfunction zoneMinutes(zone: string | undefined): number {\n if (!zone) return 0;\n const lower = zone.toLowerCase().replace(/\\s+/g, '');\n const named = ZONE_NAMES[lower];\n if (named !== undefined) return named * 60;\n const m = /^(?:utc|gmt)?([+-])(\\d{1,2})(?::?(\\d{2}))?$/.exec(lower);\n if (!m) return NaN;\n const minutes = Number(m[2]) * 60 + (m[3] ? Number(m[3]) : 0);\n return m[1] === '-' ? -minutes : minutes;\n}\n\n/**\n * Parses a PineScript date string into a UNIX time in milliseconds.\n * @throws SyntaxError when the string is not in a supported form\n */\nexport function parseDateString(dateString: string): number {\n const text = dateString.trim();\n let year: string, month: number, day: string;\n let rest: Array<string | undefined>;\n\n let m: RegExpExecArray | null;\n if ((m = ISO_T.exec(text) ?? ISO.exec(text))) {\n [year, month, day] = [m[1]!, Number(m[3]), m[4]!];\n rest = m.slice(5);\n } else if ((m = DAY_FIRST.exec(text))) {\n [day, month, year] = [m[1]!, monthNumber(m[2]!), m[3]!];\n rest = m.slice(4);\n } else if ((m = MONTH_FIRST.exec(text))) {\n [month, day, year] = [monthNumber(m[1]!), m[2]!, m[3]!];\n rest = m.slice(4);\n } else {\n throw new SyntaxError(`Invalid date string \"${dateString}\": use RFC 2822 or ISO 8601 (\"20 Feb 2020\", \"2020-02-20T14:48:00\")`);\n }\n\n const [hour = '0', minute = '0', second = '0', millis = '0', zone] = rest;\n const d = Number(day);\n const h = Number(hour);\n const mi = Number(minute);\n const s = Number(second);\n const offset = zoneMinutes(zone);\n const endOfDay = h === 24 && mi === 0 && s === 0 && Number(millis) === 0;\n if (month < 1 || month > 12 || d < 1 || d > 31 || (h > 23 && !endOfDay) || mi > 59 || s > 59 || Number.isNaN(offset)) {\n throw new SyntaxError(`Invalid date string \"${dateString}\": a field is out of range`);\n }\n const ms = Number(millis.padEnd(3, '0'));\n return Date.UTC(Number(year), month - 1, d, h, mi, s, ms) - offset * 60_000;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Date strings of `timestamp(dateString)`: IETF RFC 2822 and ISO 8601.\n *\n * Accepted forms (case-insensitive), all with an optional time zone at the end:\n * - \"2020-02-20\", \"2020-2-5\", \"2020/02/20\", \"2020-02-20 14:48\", \"2020-02-20 9:30:15\"\n * - \"2020-02-20T14:48:00\", \"2020-02-20T14:48:00.250\", \"2020-02-20T14:48:00+05:30\"\n * - \"20 Feb 2020\", \"5-Jan-2024\", \"Thu, 20 Feb 2020 14:48:00\", \"20 February 2020 14:48\"\n * - \"Feb 20 2020 14:48:05\", \"Jan 5, 2024 09:30\"\n *\n * Time zones: \"UT\", \"UTC\", \"GMT\", \"+0530\", \"-05:00\", \"GMT+5\", \"UTC-0300\", and the RFC 2822\n * names EST, EDT, CST, CDT, MST, MDT, PST, PDT. After a \"T\" time, only numeric offsets.\n * Without a time the time is 00:00. Without a time zone the time zone is GMT+0.\n * \"2025\" and \"2025-06\" are the first day of the year / month. \"01 Jan 2022 GMT+3\" (a zone without a time) gives na.\n * \"24:00\" is midnight at the end of the day.\n *\n * \"Z\", \"2024-01-01T09:30:00 GMT\", \"24:30\" and \"09:30:60\" are compile errors in PineScript, and\n * errors here.\n */\n\nconst MONTHS = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];\nconst FULL_MONTHS = [\n 'january', 'february', 'march', 'april', 'may', 'june',\n 'july', 'august', 'september', 'october', 'november', 'december',\n];\n\n/** RFC 2822 obsolete zone names, in hours from UTC. */\nconst ZONE_NAMES: Record<string, number> = {\n ut: 0, utc: 0, gmt: 0,\n est: -5, edt: -4, cst: -6, cdt: -5, mst: -7, mdt: -6, pst: -8, pdt: -7,\n};\n\nconst TIME = String.raw`(\\d{1,2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{1,3})\\d*)?)?`;\nconst ZONE = String.raw`(ut|utc|gmt|[ecmp][sd]t|(?:utc|gmt)?\\s*[+-]\\d{1,2}(?::?\\d{2})?)`;\nconst NUMERIC_ZONE = String.raw`([+-]\\d{2}(?::?\\d{2})?)`;\nconst DATE = String.raw`(\\d{4})([-/])(\\d{1,2})\\2(\\d{1,2})`;\nconst WEEKDAY = String.raw`(?:[a-z]{3,9},?\\s+)?`;\n\nconst YEAR_MONTH = /^(\\d{4})(?:-(\\d{1,2}))?$/;\nconst ISO_T = new RegExp(String.raw`^${DATE}t${TIME}\\s*${NUMERIC_ZONE}?$`, 'i');\nconst ISO = new RegExp(String.raw`^${DATE}(?:\\s+${TIME})?\\s*${ZONE}?$`, 'i');\nconst DAY_FIRST = new RegExp(String.raw`^${WEEKDAY}(\\d{1,2})(?:\\s+|-)([a-z]+)\\.?,?(?:\\s+|-)(\\d{4})(?:,?\\s+${TIME})?\\s*${ZONE}?$`, 'i');\nconst MONTH_FIRST = new RegExp(String.raw`^${WEEKDAY}([a-z]+)\\.?\\s+(\\d{1,2}),?\\s+(\\d{4})(?:,?\\s+${TIME})?\\s*${ZONE}?$`, 'i');\n\n/** Month number (1-12) of an English month name or its prefix of 3+ letters (\"Sep\", \"Sept\", \"September\"). */\nfunction monthNumber(name: string): number {\n const lower = name.toLowerCase();\n const i = FULL_MONTHS.findIndex((full, k) => lower.startsWith(MONTHS[k]!) && full.startsWith(lower));\n return i + 1;\n}\n\n/** Zone offset in minutes from UTC. */\nfunction zoneMinutes(zone: string | undefined): number {\n if (!zone) return 0;\n const lower = zone.toLowerCase().replace(/\\s+/g, '');\n const named = ZONE_NAMES[lower];\n if (named !== undefined) return named * 60;\n const m = /^(?:utc|gmt)?([+-])(\\d{1,2})(?::?(\\d{2}))?$/.exec(lower);\n if (!m) return NaN;\n const minutes = Number(m[2]) * 60 + (m[3] ? Number(m[3]) : 0);\n return m[1] === '-' ? -minutes : minutes;\n}\n\n/**\n * Parses a PineScript date string into a UNIX time in milliseconds.\n * @throws SyntaxError when the string is not in a supported form\n */\nexport function parseDateString(dateString: string): number {\n const text = dateString.trim();\n let year: string, month: number, day: string;\n let rest: Array<string | undefined>;\n\n let m: RegExpExecArray | null;\n // \"2025\" and \"2025-06\": the first day of the year / month, 00:00 UTC (PineScript)\n if ((m = YEAR_MONTH.exec(text))) {\n const mo = m[2] ? Number(m[2]) : 1;\n if (mo < 1 || mo > 12) throw new SyntaxError(`Invalid date string \"${dateString}\": a field is out of range`);\n return Date.UTC(Number(m[1]), mo - 1, 1);\n }\n if ((m = ISO_T.exec(text) ?? ISO.exec(text))) {\n [year, month, day] = [m[1]!, Number(m[3]), m[4]!];\n rest = m.slice(5);\n } else if ((m = DAY_FIRST.exec(text))) {\n [day, month, year] = [m[1]!, monthNumber(m[2]!), m[3]!];\n rest = m.slice(4);\n // a time zone without a time (\"01 Jan 2022 GMT+3\") gives na in PineScript\n if (rest[0] === undefined && rest[4] !== undefined) return NaN;\n } else if ((m = MONTH_FIRST.exec(text))) {\n [month, day, year] = [monthNumber(m[1]!), m[2]!, m[3]!];\n rest = m.slice(4);\n } else {\n throw new SyntaxError(`Invalid date string \"${dateString}\": use RFC 2822 or ISO 8601 (\"20 Feb 2020\", \"2020-02-20T14:48:00\")`);\n }\n\n const [hour = '0', minute = '0', second = '0', millis = '0', zone] = rest;\n const d = Number(day);\n const h = Number(hour);\n const mi = Number(minute);\n const s = Number(second);\n const offset = zoneMinutes(zone);\n const endOfDay = h === 24 && mi === 0 && s === 0 && Number(millis) === 0;\n if (month < 1 || month > 12 || d < 1 || d > 31 || (h > 23 && !endOfDay) || mi > 59 || s > 59 || Number.isNaN(offset)) {\n throw new SyntaxError(`Invalid date string \"${dateString}\": a field is out of range`);\n }\n const ms = Number(millis.padEnd(3, '0'));\n return Date.UTC(Number(year), month - 1, d, h, mi, s, ms) - offset * 60_000;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/time/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAKzD;;GAEG;AACH,wBAAgB,GAAG,IAAI,GAAG,CAEzB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG,CAAC;AACnD,wBAAgB,SAAS,CACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,UAAU,EACjB,GAAG,EAAE,UAAU,EACf,IAAI,CAAC,EAAE,UAAU,EACjB,MAAM,CAAC,EAAE,UAAU,EACnB,MAAM,CAAC,EAAE,UAAU,GAClB,GAAG,CAAC;AACP,wBAAgB,SAAS,CACvB,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,UAAU,EACjB,GAAG,EAAE,UAAU,EACf,IAAI,CAAC,EAAE,UAAU,EACjB,MAAM,CAAC,EAAE,UAAU,EACnB,MAAM,CAAC,EAAE,UAAU,GAClB,GAAG,CAAC;AAiBP;;GAEG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAErD;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAEtD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAE3D;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAE1D;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAQ3D;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAErD;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAEvD;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAEvD;AAID;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE/E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/time/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAKzD;;GAEG;AACH,wBAAgB,GAAG,IAAI,GAAG,CAEzB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG,CAAC;AACnD,wBAAgB,SAAS,CACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,UAAU,EACjB,GAAG,EAAE,UAAU,EACf,IAAI,CAAC,EAAE,UAAU,EACjB,MAAM,CAAC,EAAE,UAAU,EACnB,MAAM,CAAC,EAAE,UAAU,GAClB,GAAG,CAAC;AACP,wBAAgB,SAAS,CACvB,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,UAAU,EACjB,GAAG,EAAE,UAAU,EACf,IAAI,CAAC,EAAE,UAAU,EACjB,MAAM,CAAC,EAAE,UAAU,EACnB,MAAM,CAAC,EAAE,UAAU,GAClB,GAAG,CAAC;AAmBP;;GAEG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAErD;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAEtD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAE3D;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAE1D;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAQ3D;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAErD;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAEvD;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAEvD;AAID;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE/E"}
@@ -40,8 +40,9 @@ function now() {
40
40
  function timestamp(first, ...rest) {
41
41
  if (typeof first === "string") {
42
42
  if (rest.length === 0) return (0, import_datestring.parseDateString)(first);
43
+ const f = (v) => v === void 0 || v === null || Number.isNaN(v) ? 0 : v;
43
44
  const [year2, month3, day2, hour3, minute3, second3] = rest;
44
- return (0, import_timezone.zonedToUnix)(first, year2, month3, day2, hour3 ?? 0, minute3 ?? 0, second3 ?? 0);
45
+ return (0, import_timezone.zonedToUnix)(first, f(year2), f(month3), f(day2), f(hour3), f(minute3), f(second3));
45
46
  }
46
47
  const [month2, day, hour2, minute2, second2] = rest;
47
48
  return new Date(first, month2 - 1, day, hour2 || 0, minute2 || 0, second2 || 0).getTime();
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/time/index.ts"],
4
- "sourcesContent": ["/**\n * Time namespace\n * Mirrors PineScript's time and calendar functions.\n *\n * Every function takes an explicit time zone: UTC/GMT offset notation (\"UTC-5\",\n * \"GMT+0530\", \"UTC+05:30\") or an IANA name (\"America/New_York\"). The PineScript\n * default time zone (the exchange time zone, `syminfo.timezone`) is not known here.\n */\n\nimport type { int, simple_int } from '../types/index.js';\nimport { zonedFields, zonedToUnix } from './timezone.js';\nimport { parseDateString } from './datestring.js';\nimport { inSession as sessionContains } from './session.js';\n\n/**\n * Returns the current time in milliseconds\n */\nexport function now(): int {\n return Date.now();\n}\n\n/**\n * Returns the UNIX time (ms) of a date and time.\n *\n * - `timestamp(dateString)`: RFC 2822 or ISO 8601 date string (\"20 Feb 2020\",\n * \"2020-02-20T14:48:00\", \"2024-01-01 09:30 +0000\", \"04 Dec 1995 00:12:00 GMT+5\").\n * Without a time the time is 00:00; without a time zone the time zone is GMT+0.\n * - `timestamp(timezone, year, month, day, hour?, minute?, second?)`: calendar fields in `timezone`.\n * A wall-clock time that occurs twice resolves to the later instant; a missing one is\n * shifted forward by the gap (as in PineScript).\n * - `timestamp(year, month, day, hour?, minute?, second?)`: calendar fields in the time zone\n * of the host. PineScript reads them in the exchange time zone, which is not known here:\n * use the `timezone` form for PineScript values.\n *\n * Out-of-range fields roll over (month 13 is January of the next year).\n *\n * @example\n * ```typescript\n * time.timestamp('2024-01-02'); // 1704153600000\n * time.timestamp('America/New_York', 2024, 1, 2, 9, 30); // 1704205800000\n * ```\n */\nexport function timestamp(dateString: string): int;\nexport function timestamp(\n timezone: string,\n year: simple_int,\n month: simple_int,\n day: simple_int,\n hour?: simple_int,\n minute?: simple_int,\n second?: simple_int\n): int;\nexport function timestamp(\n year: simple_int,\n month: simple_int,\n day: simple_int,\n hour?: simple_int,\n minute?: simple_int,\n second?: simple_int\n): int;\nexport function timestamp(first: string | simple_int, ...rest: Array<simple_int | undefined>): int {\n if (typeof first === 'string') {\n if (rest.length === 0) return parseDateString(first);\n const [year, month, day, hour, minute, second] = rest as [number, number, number, number?, number?, number?];\n return zonedToUnix(first, year, month, day, hour ?? 0, minute ?? 0, second ?? 0);\n }\n const [month, day, hour, minute, second] = rest as [number, number, number?, number?, number?];\n return new Date(first, month - 1, day, hour || 0, minute || 0, second || 0).getTime();\n}\n\n// \u2500\u2500 Calendar fields \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction field(time: number, timezone: string, pick: (f: ReturnType<typeof zonedFields>) => number): int {\n return Number.isNaN(time) ? NaN : pick(zonedFields(time, timezone));\n}\n\n/**\n * Year of a UNIX time (ms) in `timezone`.\n */\nexport function year(time: int, timezone: string): int {\n return field(time, timezone, (f) => f.year);\n}\n\n/**\n * Month (1-12) of a UNIX time (ms) in `timezone`.\n */\nexport function month(time: int, timezone: string): int {\n return field(time, timezone, (f) => f.month);\n}\n\n/**\n * Day of the month (1-31) of a UNIX time (ms) in `timezone`.\n */\nexport function dayofmonth(time: int, timezone: string): int {\n return field(time, timezone, (f) => f.day);\n}\n\n/**\n * Day of the week of a UNIX time (ms) in `timezone`: 1 = Sunday, 2 = Monday ... 7 = Saturday\n * (PineScript `dayofweek.sunday` ... `dayofweek.saturday`).\n */\nexport function dayofweek(time: int, timezone: string): int {\n return field(time, timezone, (f) => f.dayOfWeek);\n}\n\n/**\n * Week number of the year of a UNIX time (ms) in `timezone`.\n *\n * Weeks start on Monday and follow ISO 8601: week 1 is the week that contains the\n * first Thursday of the year, so the first days of January can be in week 52 or 53\n * of the previous year. The PineScript reference does not define the rule.\n */\nexport function weekofyear(time: int, timezone: string): int {\n return field(time, timezone, (f) => {\n const date = Date.UTC(f.year, f.month - 1, f.day);\n const mondayBased = (f.dayOfWeek + 5) % 7; // Monday = 0 ... Sunday = 6\n const thursday = new Date(date + (3 - mondayBased) * 86_400_000);\n const yearStart = Date.UTC(thursday.getUTCFullYear(), 0, 1);\n return 1 + Math.floor((thursday.getTime() - yearStart) / (7 * 86_400_000));\n });\n}\n\n/**\n * Hour (0-23) of a UNIX time (ms) in `timezone`.\n */\nexport function hour(time: int, timezone: string): int {\n return field(time, timezone, (f) => f.hour);\n}\n\n/**\n * Minute (0-59) of a UNIX time (ms) in `timezone`.\n */\nexport function minute(time: int, timezone: string): int {\n return field(time, timezone, (f) => f.minute);\n}\n\n/**\n * Second (0-59) of a UNIX time (ms) in `timezone`.\n */\nexport function second(time: int, timezone: string): int {\n return field(time, timezone, (f) => f.second);\n}\n\n// \u2500\u2500 Sessions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * True when a bar opening at `time` is inside `session`, with the session hours read in `timezone`.\n *\n * This is the session test of PineScript `time(timeframe, session, timezone)`, which returns\n * `na` for bars outside the session: `na(time(\"1\", \"0930-1600\", \"America/New_York\"))` is\n * `!time.inSession(barTime, \"0930-1600\", \"America/New_York\")`.\n *\n * Session format: \"HHmm-HHmm\", several periods separated by commas, optional days after\n * \":\" (1 = Sunday ... 7 = Saturday), e.g. \"0930-1600:23456\" or \"1000-1100,1400-1500\".\n * Without days, one period covers every day and several periods cover Monday to Friday.\n * A period includes its start and excludes its end. An overnight period (\"1800-0930\")\n * belongs to the day it ends. \"0000-0000\" and \"24x7\" cover the whole day.\n */\nexport function inSession(time: int, session: string, timezone: string): boolean {\n return sessionContains(time, session, timezone);\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA,sBAAyC;AACzC,wBAAgC;AAChC,qBAA6C;AAKtC,SAAS,MAAW;AACzB,SAAO,KAAK,IAAI;AAClB;AAyCO,SAAS,UAAU,UAA+B,MAA0C;AACjG,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,KAAK,WAAW,EAAG,YAAO,mCAAgB,KAAK;AACnD,UAAM,CAACA,OAAMC,QAAOC,MAAKC,OAAMC,SAAQC,OAAM,IAAI;AACjD,eAAO,6BAAY,OAAOL,OAAMC,QAAOC,MAAKC,SAAQ,GAAGC,WAAU,GAAGC,WAAU,CAAC;AAAA,EACjF;AACA,QAAM,CAACJ,QAAO,KAAKE,OAAMC,SAAQC,OAAM,IAAI;AAC3C,SAAO,IAAI,KAAK,OAAOJ,SAAQ,GAAG,KAAKE,SAAQ,GAAGC,WAAU,GAAGC,WAAU,CAAC,EAAE,QAAQ;AACtF;AAIA,SAAS,MAAM,MAAc,UAAkB,MAA0D;AACvG,SAAO,OAAO,MAAM,IAAI,IAAI,MAAM,SAAK,6BAAY,MAAM,QAAQ,CAAC;AACpE;AAKO,SAAS,KAAK,MAAW,UAAuB;AACrD,SAAO,MAAM,MAAM,UAAU,CAAC,MAAM,EAAE,IAAI;AAC5C;AAKO,SAAS,MAAM,MAAW,UAAuB;AACtD,SAAO,MAAM,MAAM,UAAU,CAAC,MAAM,EAAE,KAAK;AAC7C;AAKO,SAAS,WAAW,MAAW,UAAuB;AAC3D,SAAO,MAAM,MAAM,UAAU,CAAC,MAAM,EAAE,GAAG;AAC3C;AAMO,SAAS,UAAU,MAAW,UAAuB;AAC1D,SAAO,MAAM,MAAM,UAAU,CAAC,MAAM,EAAE,SAAS;AACjD;AASO,SAAS,WAAW,MAAW,UAAuB;AAC3D,SAAO,MAAM,MAAM,UAAU,CAAC,MAAM;AAClC,UAAM,OAAO,KAAK,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAG,EAAE,GAAG;AAChD,UAAM,eAAe,EAAE,YAAY,KAAK;AACxC,UAAM,WAAW,IAAI,KAAK,QAAQ,IAAI,eAAe,KAAU;AAC/D,UAAM,YAAY,KAAK,IAAI,SAAS,eAAe,GAAG,GAAG,CAAC;AAC1D,WAAO,IAAI,KAAK,OAAO,SAAS,QAAQ,IAAI,cAAc,IAAI,MAAW;AAAA,EAC3E,CAAC;AACH;AAKO,SAAS,KAAK,MAAW,UAAuB;AACrD,SAAO,MAAM,MAAM,UAAU,CAAC,MAAM,EAAE,IAAI;AAC5C;AAKO,SAAS,OAAO,MAAW,UAAuB;AACvD,SAAO,MAAM,MAAM,UAAU,CAAC,MAAM,EAAE,MAAM;AAC9C;AAKO,SAAS,OAAO,MAAW,UAAuB;AACvD,SAAO,MAAM,MAAM,UAAU,CAAC,MAAM,EAAE,MAAM;AAC9C;AAiBO,SAAS,UAAU,MAAW,SAAiB,UAA2B;AAC/E,aAAO,eAAAC,WAAgB,MAAM,SAAS,QAAQ;AAChD;",
4
+ "sourcesContent": ["/**\n * Time namespace\n * Mirrors PineScript's time and calendar functions.\n *\n * Every function takes an explicit time zone: UTC/GMT offset notation (\"UTC-5\",\n * \"GMT+0530\", \"UTC+05:30\") or an IANA name (\"America/New_York\"). The PineScript\n * default time zone (the exchange time zone, `syminfo.timezone`) is not known here.\n */\n\nimport type { int, simple_int } from '../types/index.js';\nimport { zonedFields, zonedToUnix } from './timezone.js';\nimport { parseDateString } from './datestring.js';\nimport { inSession as sessionContains } from './session.js';\n\n/**\n * Returns the current time in milliseconds\n */\nexport function now(): int {\n return Date.now();\n}\n\n/**\n * Returns the UNIX time (ms) of a date and time.\n *\n * - `timestamp(dateString)`: RFC 2822 or ISO 8601 date string (\"20 Feb 2020\",\n * \"2020-02-20T14:48:00\", \"2024-01-01 09:30 +0000\", \"04 Dec 1995 00:12:00 GMT+5\").\n * Without a time the time is 00:00; without a time zone the time zone is GMT+0.\n * - `timestamp(timezone, year, month, day, hour?, minute?, second?)`: calendar fields in `timezone`.\n * A wall-clock time that occurs twice resolves to the later instant; a missing one is\n * shifted forward by the gap (as in PineScript).\n * - `timestamp(year, month, day, hour?, minute?, second?)`: calendar fields in the time zone\n * of the host. PineScript reads them in the exchange time zone, which is not known here:\n * use the `timezone` form for PineScript values.\n *\n * Out-of-range fields roll over (month 13 is January of the next year).\n *\n * @example\n * ```typescript\n * time.timestamp('2024-01-02'); // 1704153600000\n * time.timestamp('America/New_York', 2024, 1, 2, 9, 30); // 1704205800000\n * ```\n */\nexport function timestamp(dateString: string): int;\nexport function timestamp(\n timezone: string,\n year: simple_int,\n month: simple_int,\n day: simple_int,\n hour?: simple_int,\n minute?: simple_int,\n second?: simple_int\n): int;\nexport function timestamp(\n year: simple_int,\n month: simple_int,\n day: simple_int,\n hour?: simple_int,\n minute?: simple_int,\n second?: simple_int\n): int;\nexport function timestamp(first: string | simple_int, ...rest: Array<simple_int | undefined>): int {\n if (typeof first === 'string') {\n if (rest.length === 0) return parseDateString(first);\n // PineScript: an na field counts as 0 (day na of January 2020 is 2019-12-31)\n const f = (v: number | undefined) => (v === undefined || v === null || Number.isNaN(v) ? 0 : v);\n const [year, month, day, hour, minute, second] = rest as [number, number, number, number?, number?, number?];\n return zonedToUnix(first, f(year), f(month), f(day), f(hour), f(minute), f(second));\n }\n const [month, day, hour, minute, second] = rest as [number, number, number?, number?, number?];\n return new Date(first, month - 1, day, hour || 0, minute || 0, second || 0).getTime();\n}\n\n// \u2500\u2500 Calendar fields \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction field(time: number, timezone: string, pick: (f: ReturnType<typeof zonedFields>) => number): int {\n return Number.isNaN(time) ? NaN : pick(zonedFields(time, timezone));\n}\n\n/**\n * Year of a UNIX time (ms) in `timezone`.\n */\nexport function year(time: int, timezone: string): int {\n return field(time, timezone, (f) => f.year);\n}\n\n/**\n * Month (1-12) of a UNIX time (ms) in `timezone`.\n */\nexport function month(time: int, timezone: string): int {\n return field(time, timezone, (f) => f.month);\n}\n\n/**\n * Day of the month (1-31) of a UNIX time (ms) in `timezone`.\n */\nexport function dayofmonth(time: int, timezone: string): int {\n return field(time, timezone, (f) => f.day);\n}\n\n/**\n * Day of the week of a UNIX time (ms) in `timezone`: 1 = Sunday, 2 = Monday ... 7 = Saturday\n * (PineScript `dayofweek.sunday` ... `dayofweek.saturday`).\n */\nexport function dayofweek(time: int, timezone: string): int {\n return field(time, timezone, (f) => f.dayOfWeek);\n}\n\n/**\n * Week number of the year of a UNIX time (ms) in `timezone`.\n *\n * Weeks start on Monday and follow ISO 8601: week 1 is the week that contains the\n * first Thursday of the year, so the first days of January can be in week 52 or 53\n * of the previous year. The PineScript reference does not define the rule.\n */\nexport function weekofyear(time: int, timezone: string): int {\n return field(time, timezone, (f) => {\n const date = Date.UTC(f.year, f.month - 1, f.day);\n const mondayBased = (f.dayOfWeek + 5) % 7; // Monday = 0 ... Sunday = 6\n const thursday = new Date(date + (3 - mondayBased) * 86_400_000);\n const yearStart = Date.UTC(thursday.getUTCFullYear(), 0, 1);\n return 1 + Math.floor((thursday.getTime() - yearStart) / (7 * 86_400_000));\n });\n}\n\n/**\n * Hour (0-23) of a UNIX time (ms) in `timezone`.\n */\nexport function hour(time: int, timezone: string): int {\n return field(time, timezone, (f) => f.hour);\n}\n\n/**\n * Minute (0-59) of a UNIX time (ms) in `timezone`.\n */\nexport function minute(time: int, timezone: string): int {\n return field(time, timezone, (f) => f.minute);\n}\n\n/**\n * Second (0-59) of a UNIX time (ms) in `timezone`.\n */\nexport function second(time: int, timezone: string): int {\n return field(time, timezone, (f) => f.second);\n}\n\n// \u2500\u2500 Sessions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * True when a bar opening at `time` is inside `session`, with the session hours read in `timezone`.\n *\n * This is the session test of PineScript `time(timeframe, session, timezone)`, which returns\n * `na` for bars outside the session: `na(time(\"1\", \"0930-1600\", \"America/New_York\"))` is\n * `!time.inSession(barTime, \"0930-1600\", \"America/New_York\")`.\n *\n * Session format: \"HHmm-HHmm\", several periods separated by commas, optional days after\n * \":\" (1 = Sunday ... 7 = Saturday), e.g. \"0930-1600:23456\" or \"1000-1100,1400-1500\".\n * Without days, one period covers every day and several periods cover Monday to Friday.\n * A period includes its start and excludes its end. An overnight period (\"1800-0930\")\n * belongs to the day it ends. \"0000-0000\" and \"24x7\" cover the whole day.\n */\nexport function inSession(time: int, session: string, timezone: string): boolean {\n return sessionContains(time, session, timezone);\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA,sBAAyC;AACzC,wBAAgC;AAChC,qBAA6C;AAKtC,SAAS,MAAW;AACzB,SAAO,KAAK,IAAI;AAClB;AAyCO,SAAS,UAAU,UAA+B,MAA0C;AACjG,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,KAAK,WAAW,EAAG,YAAO,mCAAgB,KAAK;AAEnD,UAAM,IAAI,CAAC,MAA2B,MAAM,UAAa,MAAM,QAAQ,OAAO,MAAM,CAAC,IAAI,IAAI;AAC7F,UAAM,CAACA,OAAMC,QAAOC,MAAKC,OAAMC,SAAQC,OAAM,IAAI;AACjD,eAAO,6BAAY,OAAO,EAAEL,KAAI,GAAG,EAAEC,MAAK,GAAG,EAAEC,IAAG,GAAG,EAAEC,KAAI,GAAG,EAAEC,OAAM,GAAG,EAAEC,OAAM,CAAC;AAAA,EACpF;AACA,QAAM,CAACJ,QAAO,KAAKE,OAAMC,SAAQC,OAAM,IAAI;AAC3C,SAAO,IAAI,KAAK,OAAOJ,SAAQ,GAAG,KAAKE,SAAQ,GAAGC,WAAU,GAAGC,WAAU,CAAC,EAAE,QAAQ;AACtF;AAIA,SAAS,MAAM,MAAc,UAAkB,MAA0D;AACvG,SAAO,OAAO,MAAM,IAAI,IAAI,MAAM,SAAK,6BAAY,MAAM,QAAQ,CAAC;AACpE;AAKO,SAAS,KAAK,MAAW,UAAuB;AACrD,SAAO,MAAM,MAAM,UAAU,CAAC,MAAM,EAAE,IAAI;AAC5C;AAKO,SAAS,MAAM,MAAW,UAAuB;AACtD,SAAO,MAAM,MAAM,UAAU,CAAC,MAAM,EAAE,KAAK;AAC7C;AAKO,SAAS,WAAW,MAAW,UAAuB;AAC3D,SAAO,MAAM,MAAM,UAAU,CAAC,MAAM,EAAE,GAAG;AAC3C;AAMO,SAAS,UAAU,MAAW,UAAuB;AAC1D,SAAO,MAAM,MAAM,UAAU,CAAC,MAAM,EAAE,SAAS;AACjD;AASO,SAAS,WAAW,MAAW,UAAuB;AAC3D,SAAO,MAAM,MAAM,UAAU,CAAC,MAAM;AAClC,UAAM,OAAO,KAAK,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAG,EAAE,GAAG;AAChD,UAAM,eAAe,EAAE,YAAY,KAAK;AACxC,UAAM,WAAW,IAAI,KAAK,QAAQ,IAAI,eAAe,KAAU;AAC/D,UAAM,YAAY,KAAK,IAAI,SAAS,eAAe,GAAG,GAAG,CAAC;AAC1D,WAAO,IAAI,KAAK,OAAO,SAAS,QAAQ,IAAI,cAAc,IAAI,MAAW;AAAA,EAC3E,CAAC;AACH;AAKO,SAAS,KAAK,MAAW,UAAuB;AACrD,SAAO,MAAM,MAAM,UAAU,CAAC,MAAM,EAAE,IAAI;AAC5C;AAKO,SAAS,OAAO,MAAW,UAAuB;AACvD,SAAO,MAAM,MAAM,UAAU,CAAC,MAAM,EAAE,MAAM;AAC9C;AAKO,SAAS,OAAO,MAAW,UAAuB;AACvD,SAAO,MAAM,MAAM,UAAU,CAAC,MAAM,EAAE,MAAM;AAC9C;AAiBO,SAAS,UAAU,MAAW,SAAiB,UAA2B;AAC/E,aAAO,eAAAC,WAAgB,MAAM,SAAS,QAAQ;AAChD;",
6
6
  "names": ["year", "month", "day", "hour", "minute", "second", "sessionContains"]
7
7
  }
@@ -1,17 +1,36 @@
1
1
  /**
2
- * Session strings ("0930-1600", "0930-1600:23456", "1000-1100,1400-1500:23456", "24x7").
2
+ * PineScript session strings ("0930-1600", "0930-1600:23456", "1000-1100,1400-1500:23456", "0930-1600|1000-1300:7",
3
+ * "24x7").
3
4
  *
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
5
+ * Grammar (measured on PineScript): `range[,range...][:days]`, several sections joined by "|".
6
+ * - a range is exactly "HHMM-HHMM"; hours and minutes are minute counts taken modulo one day ("0930-2500" runs
7
+ * 09:30 to 01:00, "0960-1600" 10:00 to 16:00); a start of 24:00 or later must open a run of at most a day
8
+ * - days are digits 1 (Sunday) to 7 (Saturday), the day each run ends on
9
+ * - a lone range without days runs every day; otherwise a section without days is the default section, which runs
10
+ * on the weekdays (2-6) no other section names, and a later section naming a day replaces the earlier ones on that
11
+ * day ("1100-1400|1200-1300:7": 11:00-14:00 Monday to Friday, 12:00-13:00 Saturday)
12
+ * - a trailing ",", ":" or "|" ends its list ("1100-1400," is "1100-1400" Monday to Friday)
13
+ * - an end before the start is an overnight run that belongs to the day it ends; equal ends are 24 hours;
14
+ * "0000-0000" and "24x7" are the whole day, every day
15
+ * - a string that is empty or does not start with a digit ("regular", "extended") is the symbol's own session
16
+ * - a malformed string ("1100 -1400", "0930-16", ":8") is an error, as the PineScript runtime error
11
17
  */
18
+ /** A run of a session: minutes after midnight (0-1439) and the days it ends on (1 = Sunday ... 7 = Saturday). */
19
+ export interface SessionRange {
20
+ start: number;
21
+ end: number;
22
+ days: Set<number>;
23
+ }
24
+ /**
25
+ * Runs of a PineScript session string, or null for the symbol's own session (empty or not starting with a digit).
26
+ * @throws SyntaxError when the string is malformed (a PineScript runtime error)
27
+ */
28
+ export declare function parsePineSession(session: string): SessionRange[] | null;
12
29
  /**
13
30
  * True when `time` falls inside `session`, with the session hours read in `timezone`.
14
- * A period includes its start minute and excludes its end minute.
31
+ * A run includes its start minute and excludes its end minute.
32
+ * @throws Error for the symbol's own session ("regular", "extended", ""), which this function does not know: use
33
+ * `time(timeframe, session)` in a script with the chart session
15
34
  */
16
35
  export declare function inSession(time: number, session: string, timezone: string): boolean;
17
36
  //# sourceMappingURL=session.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/time/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA+CH;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAiBlF"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/time/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAQH,iHAAiH;AACjH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACnB;AA+BD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,GAAG,IAAI,CAuCvE;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAiBlF"}
@@ -18,46 +18,92 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var session_exports = {};
20
20
  __export(session_exports, {
21
- inSession: () => inSession
21
+ inSession: () => inSession,
22
+ parsePineSession: () => parsePineSession
22
23
  });
23
24
  module.exports = __toCommonJS(session_exports);
24
25
  var import_timezone = require("./timezone.js");
25
- const PERIOD = /^(\d{2})(\d{2})-(\d{2})(\d{2})$/;
26
- const sessions = /* @__PURE__ */ new Map();
27
- function parseSession(session) {
28
- let parsed = sessions.get(session);
29
- if (parsed) return parsed;
30
- const invalid = () => new SyntaxError(`Invalid session "${session}": expected "HHmm-HHmm[,HHmm-HHmm...][:days]"`);
31
- const text = session.trim() === "24x7" ? "0000-0000" : session.replace(/\s+/g, "");
32
- const [periodText = "", dayText, extra] = text.split(":");
33
- if (extra !== void 0 || periodText === "") throw invalid();
34
- const periods = periodText.split(",").map((p) => {
35
- const m = PERIOD.exec(p);
36
- if (!m) throw invalid();
37
- const [h1, m1, h2, m2] = [m[1], m[2], m[3], m[4]].map(Number);
38
- if (h1 > 23 || h2 > 23 || m1 > 59 || m2 > 59) throw invalid();
39
- return { start: h1 * 60 + m1, end: h2 * 60 + m2 };
26
+ const MINUTES_PER_DAY = 1440;
27
+ const WEEKDAYS = [2, 3, 4, 5, 6];
28
+ const ALL_DAYS = [1, 2, 3, 4, 5, 6, 7];
29
+ function invalid(session) {
30
+ return new SyntaxError(`Invalid session "${session}": expected "HHMM-HHMM[,HHMM-HHMM...][:days][|...]"`);
31
+ }
32
+ function parseRanges(text, session) {
33
+ if (!text) return [];
34
+ const entries = text.split(",");
35
+ if (entries.length > 1 && entries[entries.length - 1] === "") entries.pop();
36
+ return entries.map((entry) => {
37
+ if (!/^\d{4}-\d{4}$/.test(entry)) throw invalid(session);
38
+ let start = Number(entry.slice(0, 2)) * 60 + Number(entry.slice(2, 4));
39
+ let end = Number(entry.slice(5, 7)) * 60 + Number(entry.slice(7, 9));
40
+ if (start >= MINUTES_PER_DAY) {
41
+ const endOfRun = end || MINUTES_PER_DAY;
42
+ if (!(start - MINUTES_PER_DAY < endOfRun && endOfRun <= start && start < 2 * MINUTES_PER_DAY)) throw invalid(session);
43
+ }
44
+ start %= MINUTES_PER_DAY;
45
+ end %= MINUTES_PER_DAY;
46
+ return [start, end];
40
47
  });
41
- const dayDigits = dayText ?? (periods.length > 1 ? "23456" : "1234567");
42
- if (!/^[1-7]+$/.test(dayDigits)) throw invalid();
43
- const days = new Array(8).fill(false);
44
- for (const d of dayDigits) days[Number(d)] = true;
45
- parsed = { periods, days };
46
- sessions.set(session, parsed);
47
- return parsed;
48
+ }
49
+ function parseDays(text, session) {
50
+ if (!/^[1-7]+$/.test(text)) throw invalid(session);
51
+ return new Set([...text].map(Number));
52
+ }
53
+ const parsed = /* @__PURE__ */ new Map();
54
+ function parsePineSession(session) {
55
+ const cached = parsed.get(session);
56
+ if (cached !== void 0) return cached;
57
+ const spec = session.trim();
58
+ let out;
59
+ if (!spec || !/^\d/.test(spec)) {
60
+ out = null;
61
+ } else if (spec === "24x7") {
62
+ out = [{ start: 0, end: 0, days: new Set(ALL_DAYS) }];
63
+ } else if (!/[:,|]/.test(spec)) {
64
+ out = parseRanges(spec, session).map(([start, end]) => ({ start, end, days: new Set(ALL_DAYS) }));
65
+ } else {
66
+ const sections = spec.split("|");
67
+ if (sections.length > 1 && sections[sections.length - 1] === "") sections.pop();
68
+ const items = sections.map((section) => {
69
+ const parts = section.split(":");
70
+ if (parts.length > 2) throw invalid(session);
71
+ const ranges = parseRanges(parts[0], session);
72
+ const days = parts.length === 1 || parts[1] === "" ? null : parseDays(parts[1], session);
73
+ return { ranges, days };
74
+ });
75
+ if (items.filter((it) => it.days === null).length > 1) throw invalid(session);
76
+ const own = items.map(() => /* @__PURE__ */ new Set());
77
+ const claimed = /* @__PURE__ */ new Set();
78
+ for (let i = items.length - 1; i >= 0; i--) {
79
+ const days = items[i].days;
80
+ if (days === null) continue;
81
+ for (const d of days) if (!claimed.has(d)) own[i].add(d);
82
+ for (const d of days) claimed.add(d);
83
+ }
84
+ items.forEach((it, i) => {
85
+ if (it.days === null) {
86
+ for (const d of WEEKDAYS) if (!claimed.has(d)) own[i].add(d);
87
+ }
88
+ });
89
+ out = items.flatMap((it, i) => own[i].size ? it.ranges.map(([start, end]) => ({ start, end, days: own[i] })) : []);
90
+ }
91
+ parsed.set(session, out);
92
+ return out;
48
93
  }
49
94
  function inSession(time, session, timezone) {
50
95
  if (Number.isNaN(time)) return false;
51
- const { periods, days } = parseSession(session);
96
+ const ranges = parsePineSession(session);
97
+ if (ranges === null) throw new Error(`Session "${session}" is the symbol session: it needs the chart session (time(timeframe, session) in a script)`);
52
98
  const f = (0, import_timezone.zonedFields)(time, timezone);
53
99
  const minute = f.hour * 60 + f.minute;
54
100
  const nextDay = f.dayOfWeek % 7 + 1;
55
- for (const { start, end } of periods) {
101
+ for (const { start, end, days } of ranges) {
56
102
  if (start < end || start === 0 && end === 0) {
57
- if (minute >= start && (minute < end || end === 0) && days[f.dayOfWeek]) return true;
103
+ if (minute >= start && (minute < end || end === 0) && days.has(f.dayOfWeek)) return true;
58
104
  } else {
59
- if (minute >= start && days[nextDay]) return true;
60
- if (minute < end && days[f.dayOfWeek]) return true;
105
+ if (minute >= start && days.has(nextDay)) return true;
106
+ if (minute < end && days.has(f.dayOfWeek)) return true;
61
107
  }
62
108
  }
63
109
  return false;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/time/session.ts"],
4
- "sourcesContent": ["/**\n * Session strings (\"0930-1600\", \"0930-1600:23456\", \"1000-1100,1400-1500:23456\", \"24x7\").\n *\n * Format `<periods>[:<days>]`:\n * - a period is \"HHmm-HHmm\"; several periods are separated by commas\n * - days are digits 1 (Sunday) to 7 (Saturday). Without days, a single period covers every\n * day, and several periods cover Monday to Friday (\"23456\"), as in PineScript\n * - an end before the start is an overnight period that ends on the next day, and it\n * belongs to the day it ends: \"1700-1700:23456\" starts Sunday 17:00 and covers Monday\n * - \"0000-0000\" and \"24x7\" are the 24-hour session of every day\n */\n\nimport { zonedFields } from './timezone.js';\n\ninterface Period {\n /** Minutes after midnight, 0-1439 */\n start: number;\n end: number;\n}\n\ninterface ParsedSession {\n periods: Period[];\n /** Included days, indexed 1 (Sunday) to 7 (Saturday) */\n days: boolean[];\n}\n\nconst PERIOD = /^(\\d{2})(\\d{2})-(\\d{2})(\\d{2})$/;\n\nconst sessions = new Map<string, ParsedSession>();\n\nfunction parseSession(session: string): ParsedSession {\n let parsed = sessions.get(session);\n if (parsed) return parsed;\n\n const invalid = () => new SyntaxError(`Invalid session \"${session}\": expected \"HHmm-HHmm[,HHmm-HHmm...][:days]\"`);\n const text = session.trim() === '24x7' ? '0000-0000' : session.replace(/\\s+/g, '');\n const [periodText = '', dayText, extra] = text.split(':');\n if (extra !== undefined || periodText === '') throw invalid();\n\n const periods = periodText.split(',').map((p) => {\n const m = PERIOD.exec(p);\n if (!m) throw invalid();\n const [h1, m1, h2, m2] = [m[1], m[2], m[3], m[4]].map(Number) as [number, number, number, number];\n if (h1 > 23 || h2 > 23 || m1 > 59 || m2 > 59) throw invalid();\n return { start: h1 * 60 + m1, end: h2 * 60 + m2 };\n });\n\n const dayDigits = dayText ?? (periods.length > 1 ? '23456' : '1234567');\n if (!/^[1-7]+$/.test(dayDigits)) throw invalid();\n const days = new Array<boolean>(8).fill(false);\n for (const d of dayDigits) days[Number(d)] = true;\n\n parsed = { periods, days };\n sessions.set(session, parsed);\n return parsed;\n}\n\n/**\n * True when `time` falls inside `session`, with the session hours read in `timezone`.\n * A period includes its start minute and excludes its end minute.\n */\nexport function inSession(time: number, session: string, timezone: string): boolean {\n if (Number.isNaN(time)) return false;\n const { periods, days } = parseSession(session);\n const f = zonedFields(time, timezone);\n const minute = f.hour * 60 + f.minute;\n const nextDay = (f.dayOfWeek % 7) + 1;\n\n for (const { start, end } of periods) {\n if (start < end || (start === 0 && end === 0)) {\n if (minute >= start && (minute < end || end === 0) && days[f.dayOfWeek]) return true;\n } else {\n // Overnight (24 hours when start === end): the part from `start` belongs to the next day.\n if (minute >= start && days[nextDay]) return true;\n if (minute < end && days[f.dayOfWeek]) return true;\n }\n }\n return false;\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAYA,sBAA4B;AAc5B,MAAM,SAAS;AAEf,MAAM,WAAW,oBAAI,IAA2B;AAEhD,SAAS,aAAa,SAAgC;AACpD,MAAI,SAAS,SAAS,IAAI,OAAO;AACjC,MAAI,OAAQ,QAAO;AAEnB,QAAM,UAAU,MAAM,IAAI,YAAY,oBAAoB,OAAO,+CAA+C;AAChH,QAAM,OAAO,QAAQ,KAAK,MAAM,SAAS,cAAc,QAAQ,QAAQ,QAAQ,EAAE;AACjF,QAAM,CAAC,aAAa,IAAI,SAAS,KAAK,IAAI,KAAK,MAAM,GAAG;AACxD,MAAI,UAAU,UAAa,eAAe,GAAI,OAAM,QAAQ;AAE5D,QAAM,UAAU,WAAW,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM;AAC/C,UAAM,IAAI,OAAO,KAAK,CAAC;AACvB,QAAI,CAAC,EAAG,OAAM,QAAQ;AACtB,UAAM,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,MAAM;AAC5D,QAAI,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,GAAI,OAAM,QAAQ;AAC5D,WAAO,EAAE,OAAO,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,GAAG;AAAA,EAClD,CAAC;AAED,QAAM,YAAY,YAAY,QAAQ,SAAS,IAAI,UAAU;AAC7D,MAAI,CAAC,WAAW,KAAK,SAAS,EAAG,OAAM,QAAQ;AAC/C,QAAM,OAAO,IAAI,MAAe,CAAC,EAAE,KAAK,KAAK;AAC7C,aAAW,KAAK,UAAW,MAAK,OAAO,CAAC,CAAC,IAAI;AAE7C,WAAS,EAAE,SAAS,KAAK;AACzB,WAAS,IAAI,SAAS,MAAM;AAC5B,SAAO;AACT;AAMO,SAAS,UAAU,MAAc,SAAiB,UAA2B;AAClF,MAAI,OAAO,MAAM,IAAI,EAAG,QAAO;AAC/B,QAAM,EAAE,SAAS,KAAK,IAAI,aAAa,OAAO;AAC9C,QAAM,QAAI,6BAAY,MAAM,QAAQ;AACpC,QAAM,SAAS,EAAE,OAAO,KAAK,EAAE;AAC/B,QAAM,UAAW,EAAE,YAAY,IAAK;AAEpC,aAAW,EAAE,OAAO,IAAI,KAAK,SAAS;AACpC,QAAI,QAAQ,OAAQ,UAAU,KAAK,QAAQ,GAAI;AAC7C,UAAI,UAAU,UAAU,SAAS,OAAO,QAAQ,MAAM,KAAK,EAAE,SAAS,EAAG,QAAO;AAAA,IAClF,OAAO;AAEL,UAAI,UAAU,SAAS,KAAK,OAAO,EAAG,QAAO;AAC7C,UAAI,SAAS,OAAO,KAAK,EAAE,SAAS,EAAG,QAAO;AAAA,IAChD;AAAA,EACF;AACA,SAAO;AACT;",
4
+ "sourcesContent": ["/**\n * PineScript session strings (\"0930-1600\", \"0930-1600:23456\", \"1000-1100,1400-1500:23456\", \"0930-1600|1000-1300:7\",\n * \"24x7\").\n *\n * Grammar (measured on PineScript): `range[,range...][:days]`, several sections joined by \"|\".\n * - a range is exactly \"HHMM-HHMM\"; hours and minutes are minute counts taken modulo one day (\"0930-2500\" runs\n * 09:30 to 01:00, \"0960-1600\" 10:00 to 16:00); a start of 24:00 or later must open a run of at most a day\n * - days are digits 1 (Sunday) to 7 (Saturday), the day each run ends on\n * - a lone range without days runs every day; otherwise a section without days is the default section, which runs\n * on the weekdays (2-6) no other section names, and a later section naming a day replaces the earlier ones on that\n * day (\"1100-1400|1200-1300:7\": 11:00-14:00 Monday to Friday, 12:00-13:00 Saturday)\n * - a trailing \",\", \":\" or \"|\" ends its list (\"1100-1400,\" is \"1100-1400\" Monday to Friday)\n * - an end before the start is an overnight run that belongs to the day it ends; equal ends are 24 hours;\n * \"0000-0000\" and \"24x7\" are the whole day, every day\n * - a string that is empty or does not start with a digit (\"regular\", \"extended\") is the symbol's own session\n * - a malformed string (\"1100 -1400\", \"0930-16\", \":8\") is an error, as the PineScript runtime error\n */\n\nimport { zonedFields } from './timezone.js';\n\nconst MINUTES_PER_DAY = 1440;\nconst WEEKDAYS = [2, 3, 4, 5, 6];\nconst ALL_DAYS = [1, 2, 3, 4, 5, 6, 7];\n\n/** A run of a session: minutes after midnight (0-1439) and the days it ends on (1 = Sunday ... 7 = Saturday). */\nexport interface SessionRange {\n start: number;\n end: number;\n days: Set<number>;\n}\n\nfunction invalid(session: string): SyntaxError {\n return new SyntaxError(`Invalid session \"${session}\": expected \"HHMM-HHMM[,HHMM-HHMM...][:days][|...]\"`);\n}\n\nfunction parseRanges(text: string, session: string): Array<[number, number]> {\n if (!text) return [];\n const entries = text.split(',');\n if (entries.length > 1 && entries[entries.length - 1] === '') entries.pop();\n return entries.map((entry) => {\n if (!/^\\d{4}-\\d{4}$/.test(entry)) throw invalid(session);\n let start = Number(entry.slice(0, 2)) * 60 + Number(entry.slice(2, 4));\n let end = Number(entry.slice(5, 7)) * 60 + Number(entry.slice(7, 9));\n if (start >= MINUTES_PER_DAY) {\n const endOfRun = end || MINUTES_PER_DAY;\n if (!(start - MINUTES_PER_DAY < endOfRun && endOfRun <= start && start < 2 * MINUTES_PER_DAY)) throw invalid(session);\n }\n start %= MINUTES_PER_DAY;\n end %= MINUTES_PER_DAY;\n return [start, end];\n });\n}\n\nfunction parseDays(text: string, session: string): Set<number> {\n if (!/^[1-7]+$/.test(text)) throw invalid(session);\n return new Set([...text].map(Number));\n}\n\nconst parsed = new Map<string, SessionRange[] | null>();\n\n/**\n * Runs of a PineScript session string, or null for the symbol's own session (empty or not starting with a digit).\n * @throws SyntaxError when the string is malformed (a PineScript runtime error)\n */\nexport function parsePineSession(session: string): SessionRange[] | null {\n const cached = parsed.get(session);\n if (cached !== undefined) return cached;\n const spec = session.trim();\n let out: SessionRange[] | null;\n if (!spec || !/^\\d/.test(spec)) {\n out = null;\n } else if (spec === '24x7') {\n out = [{ start: 0, end: 0, days: new Set(ALL_DAYS) }];\n } else if (!/[:,|]/.test(spec)) {\n out = parseRanges(spec, session).map(([start, end]) => ({ start, end, days: new Set(ALL_DAYS) }));\n } else {\n const sections = spec.split('|');\n if (sections.length > 1 && sections[sections.length - 1] === '') sections.pop();\n const items = sections.map((section) => {\n const parts = section.split(':');\n if (parts.length > 2) throw invalid(session);\n const ranges = parseRanges(parts[0]!, session);\n const days = parts.length === 1 || parts[1] === '' ? null : parseDays(parts[1]!, session);\n return { ranges, days };\n });\n if (items.filter((it) => it.days === null).length > 1) throw invalid(session);\n // a later section naming a day replaces the earlier ones on that day; the default section takes the weekdays\n // no other section names\n const own: Set<number>[] = items.map(() => new Set<number>());\n const claimed = new Set<number>();\n for (let i = items.length - 1; i >= 0; i--) {\n const days = items[i]!.days;\n if (days === null) continue;\n for (const d of days) if (!claimed.has(d)) own[i]!.add(d);\n for (const d of days) claimed.add(d);\n }\n items.forEach((it, i) => {\n if (it.days === null) for (const d of WEEKDAYS) if (!claimed.has(d)) own[i]!.add(d);\n });\n out = items.flatMap((it, i) => (own[i]!.size ? it.ranges.map(([start, end]) => ({ start, end, days: own[i]! })) : []));\n }\n parsed.set(session, out);\n return out;\n}\n\n/**\n * True when `time` falls inside `session`, with the session hours read in `timezone`.\n * A run includes its start minute and excludes its end minute.\n * @throws Error for the symbol's own session (\"regular\", \"extended\", \"\"), which this function does not know: use\n * `time(timeframe, session)` in a script with the chart session\n */\nexport function inSession(time: number, session: string, timezone: string): boolean {\n if (Number.isNaN(time)) return false;\n const ranges = parsePineSession(session);\n if (ranges === null) throw new Error(`Session \"${session}\" is the symbol session: it needs the chart session (time(timeframe, session) in a script)`);\n const f = zonedFields(time, timezone);\n const minute = f.hour * 60 + f.minute;\n const nextDay = (f.dayOfWeek % 7) + 1;\n for (const { start, end, days } of ranges) {\n if (start < end || (start === 0 && end === 0)) {\n if (minute >= start && (minute < end || end === 0) && days.has(f.dayOfWeek)) return true;\n } else {\n // Overnight (24 hours when start === end): the part from `start` belongs to the next day.\n if (minute >= start && days.has(nextDay)) return true;\n if (minute < end && days.has(f.dayOfWeek)) return true;\n }\n }\n return false;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -36,5 +36,10 @@ export declare function zonedFields(time: number, timezone: string): ZonedFields
36
36
  * resolve to the later instant, and wall-clock times that do not exist (start of
37
37
  * daylight saving time) are shifted forward by the length of the gap.
38
38
  */
39
+ /**
40
+ * UNIX time (ms) of a UTC wall-clock date: Gregorian calendar from 1582-10-15, Julian calendar before it (as
41
+ * PineScript: 1582-10-05 is 1582-10-15). Out-of-range fields roll over like `Date.UTC`.
42
+ */
43
+ export declare function civilToUnix(year: number, month: number, day: number, hour?: number, minute?: number, second?: number): number;
39
44
  export declare function zonedToUnix(timezone: string, year: number, month: number, day: number, hour?: number, minute?: number, second?: number): number;
40
45
  //# sourceMappingURL=timezone.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"timezone.d.ts","sourceRoot":"","sources":["../../../src/time/timezone.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA0GH,qDAAqD;AACrD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,uFAAuF;AACvF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAWvE;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,MAAU,EAChB,MAAM,GAAE,MAAU,EAClB,MAAM,GAAE,MAAU,GACjB,MAAM,CAYR"}
1
+ {"version":3,"file":"timezone.d.ts","sourceRoot":"","sources":["../../../src/time/timezone.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA0GH,qDAAqD;AACrD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,uFAAuF;AACvF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAWvE;AAED;;;;;;;GAOG;AACH;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,SAAI,EAAE,MAAM,SAAI,EAAE,MAAM,SAAI,GAAG,MAAM,CAc9G;AAED,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,MAAU,EAChB,MAAM,GAAE,MAAU,EAClB,MAAM,GAAE,MAAU,GACjB,MAAM,CAYR"}
@@ -18,6 +18,7 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var timezone_exports = {};
20
20
  __export(timezone_exports, {
21
+ civilToUnix: () => civilToUnix,
21
22
  zoneOffset: () => zoneOffset,
22
23
  zonedFields: () => zonedFields,
23
24
  zonedToUnix: () => zonedToUnix
@@ -112,9 +113,22 @@ function zonedFields(time, timezone) {
112
113
  dayOfWeek: local.getUTCDay() + 1
113
114
  };
114
115
  }
116
+ function civilToUnix(year, month, day, hour = 0, minute = 0, second = 0) {
117
+ const gregorian = Date.UTC(year, month - 1, day, hour, minute, second);
118
+ const d = new Date(Date.UTC(year, month - 1, 1));
119
+ const y = d.getUTCFullYear();
120
+ const m = d.getUTCMonth() + 1;
121
+ if (y > 1582 || y === 1582 && (m > 10 || m === 10 && day >= 15)) return gregorian;
122
+ const a = Math.floor((14 - m) / 12);
123
+ const yy = y + 4800 - a;
124
+ const mm = m + 12 * a - 3;
125
+ const jdn = 1 + Math.floor((153 * mm + 2) / 5) + 365 * yy + Math.floor(yy / 4) - 32083;
126
+ const days = jdn - 2440588 + (day - 1);
127
+ return days * MS_PER_DAY + Date.UTC(1970, 0, 1, hour, minute, second);
128
+ }
115
129
  function zonedToUnix(timezone, year, month, day, hour = 0, minute = 0, second = 0) {
116
130
  const zone = resolveZone(timezone);
117
- const local = Date.UTC(year, month - 1, day, hour, minute, second);
131
+ const local = civilToUnix(year, month, day, hour, minute, second);
118
132
  if (zone.kind === "fixed") return local - zone.offsetMs;
119
133
  const before = offsetAt(zone, local - MS_PER_DAY);
120
134
  const after = offsetAt(zone, local + MS_PER_DAY);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/time/timezone.ts"],
4
- "sourcesContent": ["/**\n * Time zone resolution for the calendar functions.\n *\n * PineScript accepts two time zone notations:\n * - UTC/GMT offset notation: \"UTC\", \"UTC-5\", \"UTC+05:30\", \"GMT+0530\", \"GMT+05:30:00\", up to \u00B118:00\n * - IANA time zone database names, case-sensitive: \"America/New_York\", \"Etc/UTC\", \"US/Eastern\", \"CET\"\n *\n * \"utc+2\", \"america/new_york\", \"UTC+5:3\", \"UTC+5:30:15\", \"GMT+18:01\", \"EST\", \"MST\" and \"HST\" are\n * errors in PineScript, and so here.\n *\n * Offsets of IANA zones (daylight saving time and historical changes included)\n * come from the host's `Intl.DateTimeFormat`, so no time zone data ships with the library.\n */\n\nconst MS_PER_SECOND = 1000;\nconst MS_PER_DAY = 86_400_000;\nconst MAX_OFFSET_SECONDS = 18 * 3600;\n\nconst OFFSET_NOTATION = /^(?:UTC|GMT)(?:([+-])(\\d{1,2})(?::?(\\d{2})(?::?(\\d{2}))?)?)?$/;\n\n/** Time zone database names that PineScript rejects although `Intl` accepts them. */\nconst REJECTED_NAMES = new Set(['EST', 'MST', 'HST']);\n\nlet canonicalNames: Map<string, string> | undefined;\n\n/** False when `name` is a wrong-case spelling of a time zone name (`Intl` matches names case-insensitively). */\nfunction hasTimeZoneCase(name: string): boolean {\n if (name.split('/').some((segment) => !/^[A-Z]/.test(segment))) return false;\n canonicalNames ??= new Map(Intl.supportedValuesOf('timeZone').map((n) => [n.toLowerCase(), n]));\n const canonical = canonicalNames.get(name.toLowerCase());\n return canonical === undefined || canonical === name;\n}\n\ntype Zone =\n | { readonly kind: 'fixed'; readonly offsetMs: number }\n | {\n readonly kind: 'iana';\n readonly format: Intl.DateTimeFormat;\n /** Offset of each UTC hour (`floor(time / 1 h)`); null for an hour with an offset change inside */\n readonly hours: Map<number, number | null>;\n };\n\nconst MS_PER_HOUR = 3_600_000;\n/** Cached hours per zone before the cache restarts (about 11 years of hours) */\nconst MAX_CACHED_HOURS = 100_000;\n\nconst zones = new Map<string, Zone>();\n\nfunction resolveZone(timezone: string): Zone {\n let zone = zones.get(timezone);\n if (zone) return zone;\n\n const invalid = () =>\n new RangeError(\n `Invalid time zone \"${timezone}\": use UTC/GMT offset notation (\"UTC-5\", \"GMT+0530\") or an IANA name (\"America/New_York\")`\n );\n const m = OFFSET_NOTATION.exec(timezone);\n if (m) {\n const [, sign, h = '0', mi = '0', s] = m;\n const minutes = Number(mi);\n const seconds = s === undefined ? 0 : Number(s);\n if (minutes > 59 || seconds > 59 || (s !== undefined && h.length !== 2)) throw invalid();\n const offsetSeconds = Number(h) * 3600 + minutes * 60 + seconds;\n if (offsetSeconds > MAX_OFFSET_SECONDS) throw invalid();\n zone = { kind: 'fixed', offsetMs: (sign === '-' ? -offsetSeconds : offsetSeconds) * MS_PER_SECOND };\n } else {\n if (REJECTED_NAMES.has(timezone) || !hasTimeZoneCase(timezone)) throw invalid();\n let format: Intl.DateTimeFormat;\n try {\n format = new Intl.DateTimeFormat('en-US', {\n timeZone: timezone,\n hourCycle: 'h23',\n year: 'numeric',\n month: 'numeric',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n });\n } catch {\n throw invalid();\n }\n zone = { kind: 'iana', format, hours: new Map() };\n }\n zones.set(timezone, zone);\n return zone;\n}\n\n/**\n * Offset of the zone from UTC at instant `time`, in milliseconds (local = UTC + offset).\n * An offset change happens at most once in a UTC hour, so when the first and the last second of the hour have the\n * same offset, the whole hour has it: it is computed once and cached.\n */\nfunction offsetAt(zone: Zone, time: number): number {\n if (zone.kind === 'fixed') return zone.offsetMs;\n const hour = Math.floor(time / MS_PER_HOUR);\n let offset = zone.hours.get(hour);\n if (offset === undefined) {\n const first = formattedOffset(zone.format, hour * MS_PER_HOUR);\n const last = formattedOffset(zone.format, hour * MS_PER_HOUR + MS_PER_HOUR - MS_PER_SECOND);\n offset = first === last ? first : null;\n if (zone.hours.size >= MAX_CACHED_HOURS) zone.hours.clear();\n zone.hours.set(hour, offset);\n }\n return offset ?? formattedOffset(zone.format, time);\n}\n\n/** Offset of the zone at instant `time` (whole second), from the host's `Intl` time zone data. */\nfunction formattedOffset(format: Intl.DateTimeFormat, time: number): number {\n const wholeSecond = Math.floor(time / 1000) * 1000;\n const f: Record<string, number> = {};\n for (const part of format.formatToParts(wholeSecond)) {\n if (part.type !== 'literal') f[part.type] = Number(part.value);\n }\n const local = Date.UTC(f.year!, f.month! - 1, f.day!, f.hour!, f.minute!, f.second!);\n return local - wholeSecond;\n}\n\n/** Calendar fields of a UNIX time in a time zone. */\nexport interface ZonedFields {\n year: number;\n /** 1-12 */\n month: number;\n /** 1-31 */\n day: number;\n hour: number;\n minute: number;\n second: number;\n /** 1 = Sunday ... 7 = Saturday (PineScript dayofweek numbering) */\n dayOfWeek: number;\n}\n\n/** Offset of `timezone` from UTC at `time`, in milliseconds (local = UTC + offset). */\nexport function zoneOffset(time: number, timezone: string): number {\n return offsetAt(resolveZone(timezone), time);\n}\n\n/** Splits a UNIX time (ms) into calendar fields in `timezone`. */\nexport function zonedFields(time: number, timezone: string): ZonedFields {\n const local = new Date(time + offsetAt(resolveZone(timezone), time));\n return {\n year: local.getUTCFullYear(),\n month: local.getUTCMonth() + 1,\n day: local.getUTCDate(),\n hour: local.getUTCHours(),\n minute: local.getUTCMinutes(),\n second: local.getUTCSeconds(),\n dayOfWeek: local.getUTCDay() + 1,\n };\n}\n\n/**\n * Converts a wall-clock date and time in `timezone` to a UNIX time (ms).\n * Out-of-range fields roll over like `Date.UTC` (month 13 is January of the next year).\n *\n * As in PineScript: wall-clock times that occur twice (end of daylight saving time)\n * resolve to the later instant, and wall-clock times that do not exist (start of\n * daylight saving time) are shifted forward by the length of the gap.\n */\nexport function zonedToUnix(\n timezone: string,\n year: number,\n month: number,\n day: number,\n hour: number = 0,\n minute: number = 0,\n second: number = 0\n): number {\n const zone = resolveZone(timezone);\n const local = Date.UTC(year, month - 1, day, hour, minute, second);\n if (zone.kind === 'fixed') return local - zone.offsetMs;\n\n // At most one offset transition happens within a day of `local`: the offsets\n // one day before and one day after are the two candidates.\n const before = offsetAt(zone, local - MS_PER_DAY);\n const after = offsetAt(zone, local + MS_PER_DAY);\n const candidates = [local - before, local - after].filter((t) => local - offsetAt(zone, t) === t);\n if (candidates.length) return Math.max(...candidates);\n return local - before;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Time zone resolution for the calendar functions.\n *\n * PineScript accepts two time zone notations:\n * - UTC/GMT offset notation: \"UTC\", \"UTC-5\", \"UTC+05:30\", \"GMT+0530\", \"GMT+05:30:00\", up to \u00B118:00\n * - IANA time zone database names, case-sensitive: \"America/New_York\", \"Etc/UTC\", \"US/Eastern\", \"CET\"\n *\n * \"utc+2\", \"america/new_york\", \"UTC+5:3\", \"UTC+5:30:15\", \"GMT+18:01\", \"EST\", \"MST\" and \"HST\" are\n * errors in PineScript, and so here.\n *\n * Offsets of IANA zones (daylight saving time and historical changes included)\n * come from the host's `Intl.DateTimeFormat`, so no time zone data ships with the library.\n */\n\nconst MS_PER_SECOND = 1000;\nconst MS_PER_DAY = 86_400_000;\nconst MAX_OFFSET_SECONDS = 18 * 3600;\n\nconst OFFSET_NOTATION = /^(?:UTC|GMT)(?:([+-])(\\d{1,2})(?::?(\\d{2})(?::?(\\d{2}))?)?)?$/;\n\n/** Time zone database names that PineScript rejects although `Intl` accepts them. */\nconst REJECTED_NAMES = new Set(['EST', 'MST', 'HST']);\n\nlet canonicalNames: Map<string, string> | undefined;\n\n/** False when `name` is a wrong-case spelling of a time zone name (`Intl` matches names case-insensitively). */\nfunction hasTimeZoneCase(name: string): boolean {\n if (name.split('/').some((segment) => !/^[A-Z]/.test(segment))) return false;\n canonicalNames ??= new Map(Intl.supportedValuesOf('timeZone').map((n) => [n.toLowerCase(), n]));\n const canonical = canonicalNames.get(name.toLowerCase());\n return canonical === undefined || canonical === name;\n}\n\ntype Zone =\n | { readonly kind: 'fixed'; readonly offsetMs: number }\n | {\n readonly kind: 'iana';\n readonly format: Intl.DateTimeFormat;\n /** Offset of each UTC hour (`floor(time / 1 h)`); null for an hour with an offset change inside */\n readonly hours: Map<number, number | null>;\n };\n\nconst MS_PER_HOUR = 3_600_000;\n/** Cached hours per zone before the cache restarts (about 11 years of hours) */\nconst MAX_CACHED_HOURS = 100_000;\n\nconst zones = new Map<string, Zone>();\n\nfunction resolveZone(timezone: string): Zone {\n let zone = zones.get(timezone);\n if (zone) return zone;\n\n const invalid = () =>\n new RangeError(\n `Invalid time zone \"${timezone}\": use UTC/GMT offset notation (\"UTC-5\", \"GMT+0530\") or an IANA name (\"America/New_York\")`\n );\n const m = OFFSET_NOTATION.exec(timezone);\n if (m) {\n const [, sign, h = '0', mi = '0', s] = m;\n const minutes = Number(mi);\n const seconds = s === undefined ? 0 : Number(s);\n if (minutes > 59 || seconds > 59 || (s !== undefined && h.length !== 2)) throw invalid();\n const offsetSeconds = Number(h) * 3600 + minutes * 60 + seconds;\n if (offsetSeconds > MAX_OFFSET_SECONDS) throw invalid();\n zone = { kind: 'fixed', offsetMs: (sign === '-' ? -offsetSeconds : offsetSeconds) * MS_PER_SECOND };\n } else {\n if (REJECTED_NAMES.has(timezone) || !hasTimeZoneCase(timezone)) throw invalid();\n let format: Intl.DateTimeFormat;\n try {\n format = new Intl.DateTimeFormat('en-US', {\n timeZone: timezone,\n hourCycle: 'h23',\n year: 'numeric',\n month: 'numeric',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n });\n } catch {\n throw invalid();\n }\n zone = { kind: 'iana', format, hours: new Map() };\n }\n zones.set(timezone, zone);\n return zone;\n}\n\n/**\n * Offset of the zone from UTC at instant `time`, in milliseconds (local = UTC + offset).\n * An offset change happens at most once in a UTC hour, so when the first and the last second of the hour have the\n * same offset, the whole hour has it: it is computed once and cached.\n */\nfunction offsetAt(zone: Zone, time: number): number {\n if (zone.kind === 'fixed') return zone.offsetMs;\n const hour = Math.floor(time / MS_PER_HOUR);\n let offset = zone.hours.get(hour);\n if (offset === undefined) {\n const first = formattedOffset(zone.format, hour * MS_PER_HOUR);\n const last = formattedOffset(zone.format, hour * MS_PER_HOUR + MS_PER_HOUR - MS_PER_SECOND);\n offset = first === last ? first : null;\n if (zone.hours.size >= MAX_CACHED_HOURS) zone.hours.clear();\n zone.hours.set(hour, offset);\n }\n return offset ?? formattedOffset(zone.format, time);\n}\n\n/** Offset of the zone at instant `time` (whole second), from the host's `Intl` time zone data. */\nfunction formattedOffset(format: Intl.DateTimeFormat, time: number): number {\n const wholeSecond = Math.floor(time / 1000) * 1000;\n const f: Record<string, number> = {};\n for (const part of format.formatToParts(wholeSecond)) {\n if (part.type !== 'literal') f[part.type] = Number(part.value);\n }\n const local = Date.UTC(f.year!, f.month! - 1, f.day!, f.hour!, f.minute!, f.second!);\n return local - wholeSecond;\n}\n\n/** Calendar fields of a UNIX time in a time zone. */\nexport interface ZonedFields {\n year: number;\n /** 1-12 */\n month: number;\n /** 1-31 */\n day: number;\n hour: number;\n minute: number;\n second: number;\n /** 1 = Sunday ... 7 = Saturday (PineScript dayofweek numbering) */\n dayOfWeek: number;\n}\n\n/** Offset of `timezone` from UTC at `time`, in milliseconds (local = UTC + offset). */\nexport function zoneOffset(time: number, timezone: string): number {\n return offsetAt(resolveZone(timezone), time);\n}\n\n/** Splits a UNIX time (ms) into calendar fields in `timezone`. */\nexport function zonedFields(time: number, timezone: string): ZonedFields {\n const local = new Date(time + offsetAt(resolveZone(timezone), time));\n return {\n year: local.getUTCFullYear(),\n month: local.getUTCMonth() + 1,\n day: local.getUTCDate(),\n hour: local.getUTCHours(),\n minute: local.getUTCMinutes(),\n second: local.getUTCSeconds(),\n dayOfWeek: local.getUTCDay() + 1,\n };\n}\n\n/**\n * Converts a wall-clock date and time in `timezone` to a UNIX time (ms).\n * Out-of-range fields roll over like `Date.UTC` (month 13 is January of the next year).\n *\n * As in PineScript: wall-clock times that occur twice (end of daylight saving time)\n * resolve to the later instant, and wall-clock times that do not exist (start of\n * daylight saving time) are shifted forward by the length of the gap.\n */\n/**\n * UNIX time (ms) of a UTC wall-clock date: Gregorian calendar from 1582-10-15, Julian calendar before it (as\n * PineScript: 1582-10-05 is 1582-10-15). Out-of-range fields roll over like `Date.UTC`.\n */\nexport function civilToUnix(year: number, month: number, day: number, hour = 0, minute = 0, second = 0): number {\n const gregorian = Date.UTC(year, month - 1, day, hour, minute, second);\n // normalized year / month / day of the Gregorian reading decides the calendar\n const d = new Date(Date.UTC(year, month - 1, 1));\n const y = d.getUTCFullYear();\n const m = d.getUTCMonth() + 1;\n if (y > 1582 || (y === 1582 && (m > 10 || (m === 10 && day >= 15)))) return gregorian;\n // Julian day number of y-m-1, then the day offset and the time of day\n const a = Math.floor((14 - m) / 12);\n const yy = y + 4800 - a;\n const mm = m + 12 * a - 3;\n const jdn = 1 + Math.floor((153 * mm + 2) / 5) + 365 * yy + Math.floor(yy / 4) - 32083;\n const days = jdn - 2440588 + (day - 1);\n return days * MS_PER_DAY + Date.UTC(1970, 0, 1, hour, minute, second);\n}\n\nexport function zonedToUnix(\n timezone: string,\n year: number,\n month: number,\n day: number,\n hour: number = 0,\n minute: number = 0,\n second: number = 0\n): number {\n const zone = resolveZone(timezone);\n const local = civilToUnix(year, month, day, hour, minute, second);\n if (zone.kind === 'fixed') return local - zone.offsetMs;\n\n // At most one offset transition happens within a day of `local`: the offsets\n // one day before and one day after are the two candidates.\n const before = offsetAt(zone, local - MS_PER_DAY);\n const after = offsetAt(zone, local + MS_PER_DAY);\n const candidates = [local - before, local - after].filter((t) => local - offsetAt(zone, t) === t);\n if (candidates.length) return Math.max(...candidates);\n return local - before;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -181,8 +181,21 @@ export interface Table {
181
181
  border_width?: number;
182
182
  /** Table background color */
183
183
  bgcolor?: color;
184
- /** Cell data (internal storage) */
184
+ /** Display on the main chart pane (PineScript force_overlay) */
185
+ force_overlay?: boolean;
186
+ /** Cells by "column,row" */
185
187
  cells?: Map<string, TableCell>;
188
+ /** Merged cell ranges (PineScript table.merge_cells) */
189
+ merges?: TableMerge[];
190
+ }
191
+ /**
192
+ * Merged cell range of a table
193
+ */
194
+ export interface TableMerge {
195
+ start_column: number;
196
+ start_row: number;
197
+ end_column: number;
198
+ end_row: number;
186
199
  }
187
200
  /**
188
201
  * Table cell data
@@ -208,6 +221,8 @@ export interface TableCell {
208
221
  tooltip?: string;
209
222
  /** Text font family */
210
223
  text_font_family?: 'default' | 'monospace';
224
+ /** Text formatting flags: 0 none, 1 bold, 2 italic, 3 bold + italic (PineScript text.format_*) */
225
+ text_formatting?: number;
211
226
  }
212
227
  export type series_line = series<Line>;
213
228
  export type series_box = series<Box>;
@@ -296,6 +311,20 @@ export declare const xloc: {
296
311
  /** X-coordinates are UNIX timestamps in milliseconds */
297
312
  bar_time: "bar_time";
298
313
  };
314
+ /**
315
+ * Table position constants (PineScript `position.*`), for `table.new` and `table.set_position`
316
+ */
317
+ export declare const position: {
318
+ top_left: "top_left";
319
+ top_center: "top_center";
320
+ top_right: "top_right";
321
+ middle_left: "middle_left";
322
+ middle_center: "middle_center";
323
+ middle_right: "middle_right";
324
+ bottom_left: "bottom_left";
325
+ bottom_center: "bottom_center";
326
+ bottom_right: "bottom_right";
327
+ };
299
328
  /**
300
329
  * ChartPoint interface - Represents a point on the chart
301
330
  * @remarks
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"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"}