oakscriptjs 0.8.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +31 -9
- package/dist/cjs/array/index.d.ts +701 -0
- package/dist/cjs/array/index.d.ts.map +1 -0
- package/dist/cjs/array/index.js +392 -0
- package/dist/cjs/array/index.js.map +7 -0
- package/dist/cjs/box/index.d.ts +444 -0
- package/dist/cjs/box/index.d.ts.map +1 -0
- package/dist/cjs/box/index.js +246 -0
- package/dist/cjs/box/index.js.map +7 -0
- package/dist/cjs/callsite/index.d.ts +61 -0
- package/dist/cjs/callsite/index.d.ts.map +1 -0
- package/dist/cjs/callsite/index.js +65 -0
- package/dist/cjs/callsite/index.js.map +7 -0
- package/dist/cjs/chartpoint/index.d.ts +90 -0
- package/dist/cjs/chartpoint/index.d.ts.map +1 -0
- package/dist/cjs/chartpoint/index.js +56 -0
- package/dist/cjs/chartpoint/index.js.map +7 -0
- package/dist/cjs/color/index.d.ts +285 -0
- package/dist/cjs/color/index.d.ts.map +1 -0
- package/dist/cjs/color/index.js +143 -0
- package/dist/cjs/color/index.js.map +7 -0
- package/dist/cjs/compare/index.d.ts +26 -0
- package/dist/cjs/compare/index.d.ts.map +1 -0
- package/dist/cjs/compare/index.js +50 -0
- package/dist/cjs/compare/index.js.map +7 -0
- package/dist/cjs/drawing/registry.d.ts +42 -0
- package/dist/cjs/drawing/registry.d.ts.map +1 -0
- package/dist/cjs/drawing/registry.js +87 -0
- package/dist/cjs/drawing/registry.js.map +7 -0
- package/dist/cjs/index.d.ts +85 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +184 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/indicator.d.ts +117 -0
- package/dist/cjs/indicator.d.ts.map +1 -0
- package/dist/cjs/indicator.js +74 -0
- package/dist/cjs/indicator.js.map +7 -0
- package/dist/cjs/input.d.ts +196 -0
- package/dist/cjs/input.d.ts.map +1 -0
- package/dist/cjs/input.js +197 -0
- package/dist/cjs/input.js.map +7 -0
- package/dist/cjs/label/index.d.ts +303 -0
- package/dist/cjs/label/index.d.ts.map +1 -0
- package/dist/cjs/label/index.js +190 -0
- package/dist/cjs/label/index.js.map +7 -0
- package/dist/cjs/lib/index.d.ts +8 -0
- package/dist/cjs/lib/index.d.ts.map +1 -0
- package/dist/cjs/lib/index.js +19 -0
- package/dist/cjs/lib/index.js.map +7 -0
- package/dist/{lib → cjs/lib}/zigzag/index.d.ts +4 -1
- package/dist/cjs/lib/zigzag/index.d.ts.map +1 -0
- package/dist/cjs/lib/zigzag/index.js +27 -0
- package/dist/cjs/lib/zigzag/index.js.map +7 -0
- package/dist/cjs/lib/zigzag/zigzag.d.ts +100 -0
- package/dist/cjs/lib/zigzag/zigzag.d.ts.map +1 -0
- package/dist/cjs/lib/zigzag/zigzag.js +207 -0
- package/dist/cjs/lib/zigzag/zigzag.js.map +7 -0
- package/dist/cjs/line/index.d.ts +342 -0
- package/dist/cjs/line/index.d.ts.map +1 -0
- package/dist/cjs/line/index.js +193 -0
- package/dist/cjs/line/index.js.map +7 -0
- package/dist/cjs/linefill/index.d.ts +124 -0
- package/dist/cjs/linefill/index.d.ts.map +1 -0
- package/dist/cjs/linefill/index.js +56 -0
- package/dist/cjs/linefill/index.js.map +7 -0
- package/dist/cjs/map/index.d.ts +69 -0
- package/dist/cjs/map/index.d.ts.map +1 -0
- package/dist/cjs/map/index.js +80 -0
- package/dist/cjs/map/index.js.map +7 -0
- package/dist/cjs/math/index.d.ts +560 -0
- package/dist/cjs/math/index.d.ts.map +1 -0
- package/dist/cjs/math/index.js +441 -0
- package/dist/cjs/math/index.js.map +7 -0
- package/dist/cjs/matrix/index.d.ts +1231 -0
- package/dist/cjs/matrix/index.d.ts.map +1 -0
- package/dist/cjs/matrix/index.js +1200 -0
- package/dist/cjs/matrix/index.js.map +7 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/plot.d.ts +76 -0
- package/dist/cjs/plot.d.ts.map +1 -0
- package/dist/cjs/plot.js +51 -0
- package/dist/cjs/plot.js.map +7 -0
- package/dist/cjs/polyline/index.d.ts +115 -0
- package/dist/cjs/polyline/index.d.ts.map +1 -0
- package/dist/cjs/polyline/index.js +76 -0
- package/dist/cjs/polyline/index.js.map +7 -0
- package/dist/cjs/runtime/adapters/LightweightChartsAdapter.d.ts +86 -0
- package/dist/cjs/runtime/adapters/LightweightChartsAdapter.d.ts.map +1 -0
- package/dist/cjs/runtime/adapters/LightweightChartsAdapter.js +141 -0
- package/dist/cjs/runtime/adapters/LightweightChartsAdapter.js.map +7 -0
- package/dist/cjs/runtime/adapters/SimpleInputAdapter.d.ts +59 -0
- package/dist/cjs/runtime/adapters/SimpleInputAdapter.d.ts.map +1 -0
- package/dist/cjs/runtime/adapters/SimpleInputAdapter.js +117 -0
- package/dist/cjs/runtime/adapters/SimpleInputAdapter.js.map +7 -0
- package/dist/{runtime → cjs/runtime}/index.d.ts +12 -5
- package/dist/cjs/runtime/index.d.ts.map +1 -0
- package/dist/cjs/runtime/index.js +49 -0
- package/dist/cjs/runtime/index.js.map +7 -0
- package/dist/cjs/runtime/inputs.d.ts +91 -0
- package/dist/cjs/runtime/inputs.d.ts.map +1 -0
- package/dist/cjs/runtime/inputs.js +262 -0
- package/dist/cjs/runtime/inputs.js.map +7 -0
- package/dist/cjs/runtime/runtime.d.ts +70 -0
- package/dist/cjs/runtime/runtime.d.ts.map +1 -0
- package/dist/cjs/runtime/runtime.js +148 -0
- package/dist/cjs/runtime/runtime.js.map +7 -0
- package/dist/cjs/runtime/series.d.ts +362 -0
- package/dist/cjs/runtime/series.d.ts.map +1 -0
- package/dist/cjs/runtime/series.js +560 -0
- package/dist/cjs/runtime/series.js.map +7 -0
- package/dist/cjs/runtime/types.d.ts +282 -0
- package/dist/cjs/runtime/types.d.ts.map +1 -0
- package/dist/cjs/runtime/types.js +17 -0
- package/dist/cjs/runtime/types.js.map +7 -0
- package/dist/cjs/script/index.d.ts +987 -0
- package/dist/cjs/script/index.d.ts.map +1 -0
- package/dist/cjs/script/index.js +1169 -0
- package/dist/cjs/script/index.js.map +7 -0
- package/dist/cjs/security/resample.d.ts +63 -0
- package/dist/cjs/security/resample.d.ts.map +1 -0
- package/dist/cjs/security/resample.js +84 -0
- package/dist/cjs/security/resample.js.map +7 -0
- package/dist/cjs/session/bars.d.ts +80 -0
- package/dist/cjs/session/bars.d.ts.map +1 -0
- package/dist/cjs/session/bars.js +219 -0
- package/dist/cjs/session/bars.js.map +7 -0
- package/dist/cjs/session/calendar.d.ts +70 -0
- package/dist/cjs/session/calendar.d.ts.map +1 -0
- package/dist/cjs/session/calendar.js +164 -0
- package/dist/cjs/session/calendar.js.map +7 -0
- package/dist/cjs/str/dateformat.d.ts +15 -0
- package/dist/cjs/str/dateformat.d.ts.map +1 -0
- package/dist/cjs/str/dateformat.js +149 -0
- package/dist/cjs/str/dateformat.js.map +7 -0
- package/dist/cjs/str/index.d.ts +459 -0
- package/dist/cjs/str/index.d.ts.map +1 -0
- package/dist/cjs/str/index.js +143 -0
- package/dist/cjs/str/index.js.map +7 -0
- package/dist/cjs/str/messageformat.d.ts +14 -0
- package/dist/cjs/str/messageformat.d.ts.map +1 -0
- package/dist/cjs/str/messageformat.js +114 -0
- package/dist/cjs/str/messageformat.js.map +7 -0
- package/dist/cjs/str/numberformat.d.ts +19 -0
- package/dist/cjs/str/numberformat.d.ts.map +1 -0
- package/dist/cjs/str/numberformat.js +170 -0
- package/dist/cjs/str/numberformat.js.map +7 -0
- package/dist/{strategy → cjs/strategy}/index.d.ts +50 -0
- package/dist/cjs/strategy/index.d.ts.map +1 -0
- package/dist/cjs/strategy/index.js +92 -0
- package/dist/cjs/strategy/index.js.map +7 -0
- package/dist/cjs/ta/index.d.ts +1397 -0
- package/dist/cjs/ta/index.d.ts.map +1 -0
- package/dist/cjs/ta/index.js +1715 -0
- package/dist/cjs/ta/index.js.map +7 -0
- package/dist/cjs/ta/running-sum.d.ts +30 -0
- package/dist/cjs/ta/running-sum.d.ts.map +1 -0
- package/dist/cjs/ta/running-sum.js +99 -0
- package/dist/cjs/ta/running-sum.js.map +7 -0
- package/dist/cjs/ta-series.d.ts +558 -0
- package/dist/cjs/ta-series.d.ts.map +1 -0
- package/dist/cjs/ta-series.js +606 -0
- package/dist/cjs/ta-series.js.map +7 -0
- package/dist/cjs/text/index.d.ts +14 -0
- package/dist/cjs/text/index.d.ts.map +1 -0
- package/dist/cjs/text/index.js +29 -0
- package/dist/cjs/text/index.js.map +7 -0
- package/dist/cjs/time/datestring.d.ts +23 -0
- package/dist/cjs/time/datestring.d.ts.map +1 -0
- package/dist/cjs/time/datestring.js +106 -0
- package/dist/cjs/time/datestring.js.map +7 -0
- package/dist/cjs/time/index.d.ts +89 -0
- package/dist/cjs/time/index.d.ts.map +1 -0
- package/dist/cjs/time/index.js +85 -0
- package/dist/cjs/time/index.js.map +7 -0
- package/dist/cjs/time/session.d.ts +17 -0
- package/dist/cjs/time/session.d.ts.map +1 -0
- package/dist/cjs/time/session.js +65 -0
- package/dist/cjs/time/session.js.map +7 -0
- package/dist/cjs/time/timezone.d.ts +40 -0
- package/dist/cjs/time/timezone.d.ts.map +1 -0
- package/dist/cjs/time/timezone.js +125 -0
- package/dist/cjs/time/timezone.js.map +7 -0
- package/dist/cjs/timeframe/index.d.ts +73 -0
- package/dist/cjs/timeframe/index.d.ts.map +1 -0
- package/dist/cjs/timeframe/index.js +85 -0
- package/dist/cjs/timeframe/index.js.map +7 -0
- package/dist/cjs/types/index.d.ts +343 -0
- package/dist/cjs/types/index.d.ts.map +1 -0
- package/dist/cjs/types/index.js +32 -0
- package/dist/cjs/types/index.js.map +7 -0
- package/dist/cjs/types/metadata.d.ts +300 -0
- package/dist/cjs/types/metadata.d.ts.map +1 -0
- package/dist/cjs/types/metadata.js +17 -0
- package/dist/cjs/types/metadata.js.map +7 -0
- package/dist/cjs/utils/index.d.ts +167 -0
- package/dist/cjs/utils/index.d.ts.map +1 -0
- package/dist/cjs/utils/index.js +209 -0
- package/dist/cjs/utils/index.js.map +7 -0
- package/dist/esm/array/index.d.ts +701 -0
- package/dist/esm/array/index.d.ts.map +1 -0
- package/dist/esm/array/index.js +983 -0
- package/dist/esm/array/index.js.map +1 -0
- package/dist/esm/box/index.d.ts +444 -0
- package/dist/esm/box/index.d.ts.map +1 -0
- package/dist/esm/box/index.js +602 -0
- package/dist/esm/box/index.js.map +1 -0
- package/dist/esm/callsite/index.d.ts +61 -0
- package/dist/esm/callsite/index.d.ts.map +1 -0
- package/dist/esm/callsite/index.js +97 -0
- package/dist/esm/callsite/index.js.map +1 -0
- package/dist/esm/chartpoint/index.d.ts +90 -0
- package/dist/esm/chartpoint/index.d.ts.map +1 -0
- package/dist/esm/chartpoint/index.js +113 -0
- package/dist/esm/chartpoint/index.js.map +1 -0
- package/dist/esm/color/index.d.ts +285 -0
- package/dist/esm/color/index.d.ts.map +1 -0
- package/dist/esm/color/index.js +373 -0
- package/dist/esm/color/index.js.map +1 -0
- package/dist/esm/compare/index.d.ts +26 -0
- package/dist/esm/compare/index.d.ts.map +1 -0
- package/dist/esm/compare/index.js +39 -0
- package/dist/esm/compare/index.js.map +1 -0
- package/dist/esm/drawing/registry.d.ts +42 -0
- package/dist/esm/drawing/registry.d.ts.map +1 -0
- package/dist/esm/drawing/registry.js +89 -0
- package/dist/esm/drawing/registry.js.map +1 -0
- package/dist/esm/index.d.ts +85 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +96 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/indicator.d.ts +117 -0
- package/dist/esm/indicator.d.ts.map +1 -0
- package/dist/esm/indicator.js +84 -0
- package/dist/esm/indicator.js.map +1 -0
- package/dist/esm/input.d.ts +196 -0
- package/dist/esm/input.d.ts.map +1 -0
- package/dist/esm/input.js +183 -0
- package/dist/esm/input.js.map +1 -0
- package/dist/esm/label/index.d.ts +303 -0
- package/dist/esm/label/index.d.ts.map +1 -0
- package/dist/esm/label/index.js +417 -0
- package/dist/esm/label/index.js.map +1 -0
- package/dist/esm/lib/index.d.ts +8 -0
- package/dist/esm/lib/index.d.ts.map +1 -0
- package/dist/esm/lib/index.js +8 -0
- package/dist/esm/lib/index.js.map +1 -0
- package/dist/esm/lib/zigzag/index.d.ts +5 -0
- package/dist/esm/lib/zigzag/index.d.ts.map +1 -0
- package/dist/esm/lib/zigzag/index.js +5 -0
- package/dist/esm/lib/zigzag/index.js.map +1 -0
- package/dist/esm/lib/zigzag/zigzag.d.ts +100 -0
- package/dist/esm/lib/zigzag/zigzag.d.ts.map +1 -0
- package/dist/esm/lib/zigzag/zigzag.js +229 -0
- package/dist/esm/lib/zigzag/zigzag.js.map +1 -0
- package/dist/esm/line/index.d.ts +342 -0
- package/dist/esm/line/index.d.ts.map +1 -0
- package/dist/esm/line/index.js +470 -0
- package/dist/esm/line/index.js.map +1 -0
- package/dist/esm/linefill/index.d.ts +124 -0
- package/dist/esm/linefill/index.d.ts.map +1 -0
- package/dist/esm/linefill/index.js +144 -0
- package/dist/esm/linefill/index.js.map +1 -0
- package/dist/esm/map/index.d.ts +69 -0
- package/dist/esm/map/index.d.ts.map +1 -0
- package/dist/esm/map/index.js +106 -0
- package/dist/esm/map/index.js.map +1 -0
- package/dist/esm/math/index.d.ts +560 -0
- package/dist/esm/math/index.d.ts.map +1 -0
- package/dist/esm/math/index.js +495 -0
- package/dist/esm/math/index.js.map +1 -0
- package/dist/esm/matrix/index.d.ts +1231 -0
- package/dist/esm/matrix/index.d.ts.map +1 -0
- package/dist/esm/matrix/index.js +2450 -0
- package/dist/esm/matrix/index.js.map +1 -0
- package/dist/esm/plot.d.ts +76 -0
- package/dist/esm/plot.d.ts.map +1 -0
- package/dist/esm/plot.js +63 -0
- package/dist/esm/plot.js.map +1 -0
- package/dist/esm/polyline/index.d.ts +115 -0
- package/dist/esm/polyline/index.d.ts.map +1 -0
- package/dist/esm/polyline/index.js +157 -0
- package/dist/esm/polyline/index.js.map +1 -0
- package/dist/esm/runtime/adapters/LightweightChartsAdapter.d.ts +86 -0
- package/dist/esm/runtime/adapters/LightweightChartsAdapter.d.ts.map +1 -0
- package/dist/esm/runtime/adapters/LightweightChartsAdapter.js +140 -0
- package/dist/esm/runtime/adapters/LightweightChartsAdapter.js.map +1 -0
- package/dist/esm/runtime/adapters/SimpleInputAdapter.d.ts +59 -0
- package/dist/esm/runtime/adapters/SimpleInputAdapter.d.ts.map +1 -0
- package/dist/esm/runtime/adapters/SimpleInputAdapter.js +115 -0
- package/dist/esm/runtime/adapters/SimpleInputAdapter.js.map +1 -0
- package/dist/esm/runtime/index.d.ts +13 -0
- package/dist/esm/runtime/index.d.ts.map +1 -0
- package/dist/esm/runtime/index.js +14 -0
- package/dist/esm/runtime/index.js.map +1 -0
- package/dist/esm/runtime/inputs.d.ts +91 -0
- package/dist/esm/runtime/inputs.d.ts.map +1 -0
- package/dist/esm/runtime/inputs.js +334 -0
- package/dist/esm/runtime/inputs.js.map +1 -0
- package/dist/esm/runtime/runtime.d.ts +70 -0
- package/dist/esm/runtime/runtime.d.ts.map +1 -0
- package/dist/esm/runtime/runtime.js +193 -0
- package/dist/esm/runtime/runtime.js.map +1 -0
- package/dist/esm/runtime/series.d.ts +362 -0
- package/dist/esm/runtime/series.d.ts.map +1 -0
- package/dist/esm/runtime/series.js +583 -0
- package/dist/esm/runtime/series.js.map +1 -0
- package/dist/esm/runtime/types.d.ts +282 -0
- package/dist/esm/runtime/types.d.ts.map +1 -0
- package/dist/esm/runtime/types.js +7 -0
- package/dist/esm/runtime/types.js.map +1 -0
- package/dist/esm/script/index.d.ts +987 -0
- package/dist/esm/script/index.d.ts.map +1 -0
- package/dist/esm/script/index.js +1289 -0
- package/dist/esm/script/index.js.map +1 -0
- package/dist/esm/security/resample.d.ts +63 -0
- package/dist/esm/security/resample.d.ts.map +1 -0
- package/dist/esm/security/resample.js +110 -0
- package/dist/esm/security/resample.js.map +1 -0
- package/dist/esm/session/bars.d.ts +80 -0
- package/dist/esm/session/bars.d.ts.map +1 -0
- package/dist/esm/session/bars.js +232 -0
- package/dist/esm/session/bars.js.map +1 -0
- package/dist/esm/session/calendar.d.ts +70 -0
- package/dist/esm/session/calendar.d.ts.map +1 -0
- package/dist/esm/session/calendar.js +172 -0
- package/dist/esm/session/calendar.js.map +1 -0
- package/dist/esm/str/dateformat.d.ts +15 -0
- package/dist/esm/str/dateformat.d.ts.map +1 -0
- package/dist/esm/str/dateformat.js +136 -0
- package/dist/esm/str/dateformat.js.map +1 -0
- package/dist/esm/str/index.d.ts +459 -0
- package/dist/esm/str/index.d.ts.map +1 -0
- package/dist/esm/str/index.js +540 -0
- package/dist/esm/str/index.js.map +1 -0
- package/dist/esm/str/messageformat.d.ts +14 -0
- package/dist/esm/str/messageformat.d.ts.map +1 -0
- package/dist/esm/str/messageformat.js +111 -0
- package/dist/esm/str/messageformat.js.map +1 -0
- package/dist/esm/str/numberformat.d.ts +19 -0
- package/dist/esm/str/numberformat.d.ts.map +1 -0
- package/dist/esm/str/numberformat.js +189 -0
- package/dist/esm/str/numberformat.js.map +1 -0
- package/dist/esm/strategy/index.d.ts +245 -0
- package/dist/esm/strategy/index.d.ts.map +1 -0
- package/dist/esm/strategy/index.js +84 -0
- package/dist/esm/strategy/index.js.map +1 -0
- package/dist/esm/ta/index.d.ts +1397 -0
- package/dist/esm/ta/index.d.ts.map +1 -0
- package/dist/esm/ta/index.js +3227 -0
- package/dist/esm/ta/index.js.map +1 -0
- package/dist/esm/ta/running-sum.d.ts +30 -0
- package/dist/esm/ta/running-sum.d.ts.map +1 -0
- package/dist/esm/ta/running-sum.js +113 -0
- package/dist/esm/ta/running-sum.js.map +1 -0
- package/dist/esm/ta-series.d.ts +558 -0
- package/dist/esm/ta-series.d.ts.map +1 -0
- package/dist/esm/ta-series.js +910 -0
- package/dist/esm/ta-series.js.map +1 -0
- package/dist/esm/text/index.d.ts +14 -0
- package/dist/esm/text/index.d.ts.map +1 -0
- package/dist/esm/text/index.js +14 -0
- package/dist/esm/text/index.js.map +1 -0
- package/dist/esm/time/datestring.d.ts +23 -0
- package/dist/esm/time/datestring.d.ts.map +1 -0
- package/dist/esm/time/datestring.js +94 -0
- package/dist/esm/time/datestring.js.map +1 -0
- package/dist/esm/time/index.d.ts +89 -0
- package/dist/esm/time/index.d.ts.map +1 -0
- package/dist/esm/time/index.js +108 -0
- package/dist/esm/time/index.js.map +1 -0
- package/dist/esm/time/session.d.ts +17 -0
- package/dist/esm/time/session.d.ts.map +1 -0
- package/dist/esm/time/session.js +69 -0
- package/dist/esm/time/session.js.map +1 -0
- package/dist/esm/time/timezone.d.ts +40 -0
- package/dist/esm/time/timezone.d.ts.map +1 -0
- package/dist/esm/time/timezone.js +144 -0
- package/dist/esm/time/timezone.js.map +1 -0
- package/dist/esm/timeframe/index.d.ts +73 -0
- package/dist/esm/timeframe/index.d.ts.map +1 -0
- package/dist/esm/timeframe/index.js +131 -0
- package/dist/esm/timeframe/index.js.map +1 -0
- package/dist/esm/types/index.d.ts +343 -0
- package/dist/esm/types/index.d.ts.map +1 -0
- package/dist/esm/types/index.js +17 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/types/metadata.d.ts +300 -0
- package/dist/esm/types/metadata.d.ts.map +1 -0
- package/dist/esm/types/metadata.js +7 -0
- package/dist/esm/types/metadata.js.map +1 -0
- package/dist/esm/utils/index.d.ts +167 -0
- package/dist/esm/utils/index.d.ts.map +1 -0
- package/dist/esm/utils/index.js +295 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/package.json +53 -23
- package/src/array/index.ts +1056 -0
- package/src/box/index.ts +680 -0
- package/src/callsite/index.ts +104 -0
- package/src/chartpoint/index.ts +126 -0
- package/src/color/index.ts +411 -0
- package/src/compare/index.ts +46 -0
- package/src/drawing/registry.ts +106 -0
- package/src/index.ts +201 -0
- package/src/indicator.ts +185 -0
- package/src/input.ts +280 -0
- package/src/label/index.ts +490 -0
- package/src/lib/index.ts +8 -0
- package/src/lib/zigzag/index.ts +13 -0
- package/src/lib/zigzag/zigzag.ts +318 -0
- package/src/line/index.ts +530 -0
- package/src/linefill/index.ts +152 -0
- package/src/map/index.ts +115 -0
- package/src/math/index.ts +1071 -0
- package/src/matrix/index.ts +2697 -0
- package/src/plot.ts +121 -0
- package/src/polyline/index.ts +184 -0
- package/src/runtime/adapters/LightweightChartsAdapter.ts +201 -0
- package/src/runtime/adapters/SimpleInputAdapter.ts +132 -0
- package/src/runtime/index.ts +52 -0
- package/src/runtime/inputs.ts +377 -0
- package/src/runtime/runtime.ts +241 -0
- package/src/runtime/series.ts +644 -0
- package/src/runtime/types.ts +292 -0
- package/src/script/index.ts +1865 -0
- package/src/security/resample.ts +119 -0
- package/src/session/bars.ts +262 -0
- package/src/session/calendar.ts +199 -0
- package/src/str/dateformat.ts +104 -0
- package/src/str/index.ts +557 -0
- package/src/str/messageformat.ts +109 -0
- package/src/str/numberformat.ts +197 -0
- package/src/strategy/index.ts +281 -0
- package/src/ta/index.ts +3580 -0
- package/src/ta/running-sum.ts +117 -0
- package/src/ta-series.ts +1036 -0
- package/src/text/index.ts +14 -0
- package/src/time/datestring.ts +96 -0
- package/src/time/index.ts +161 -0
- package/src/time/session.ts +79 -0
- package/src/time/timezone.ts +180 -0
- package/src/timeframe/index.ts +144 -0
- package/src/types/index.ts +398 -0
- package/src/types/metadata.ts +334 -0
- package/src/utils/index.ts +334 -0
- package/dist/array/index.d.ts +0 -57
- package/dist/array/index.d.ts.map +0 -1
- package/dist/box/index.d.ts +0 -37
- package/dist/box/index.d.ts.map +0 -1
- package/dist/callsite/index.d.ts +0 -7
- package/dist/callsite/index.d.ts.map +0 -1
- package/dist/chartpoint/index.d.ts +0 -8
- package/dist/chartpoint/index.d.ts.map +0 -1
- package/dist/color/index.d.ts +0 -28
- package/dist/color/index.d.ts.map +0 -1
- package/dist/compare/index.d.ts +0 -8
- package/dist/compare/index.d.ts.map +0 -1
- package/dist/drawing/registry.d.ts +0 -19
- package/dist/drawing/registry.d.ts.map +0 -1
- package/dist/index.cjs +0 -7979
- package/dist/index.d.ts +0 -64
- package/dist/index.d.ts.map +0 -1
- package/dist/index.mjs +0 -7962
- package/dist/indicator.d.ts +0 -42
- package/dist/indicator.d.ts.map +0 -1
- package/dist/input.d.ts +0 -47
- package/dist/input.d.ts.map +0 -1
- package/dist/label/index.d.ts +0 -30
- package/dist/label/index.d.ts.map +0 -1
- package/dist/lib/index.d.ts +0 -2
- package/dist/lib/index.d.ts.map +0 -1
- package/dist/lib/zigzag/index.d.ts.map +0 -1
- package/dist/lib/zigzag/zigzag.d.ts +0 -47
- package/dist/lib/zigzag/zigzag.d.ts.map +0 -1
- package/dist/line/index.d.ts +0 -30
- package/dist/line/index.d.ts.map +0 -1
- package/dist/linefill/index.d.ts +0 -10
- package/dist/linefill/index.d.ts.map +0 -1
- package/dist/map/index.d.ts +0 -14
- package/dist/map/index.d.ts.map +0 -1
- package/dist/math/index.d.ts +0 -53
- package/dist/math/index.d.ts.map +0 -1
- package/dist/matrix/index.d.ts +0 -52
- package/dist/matrix/index.d.ts.map +0 -1
- package/dist/plot.d.ts +0 -20
- package/dist/plot.d.ts.map +0 -1
- package/dist/polyline/index.d.ts +0 -11
- package/dist/polyline/index.d.ts.map +0 -1
- package/dist/runtime/adapters/LightweightChartsAdapter.d.ts +0 -15
- package/dist/runtime/adapters/LightweightChartsAdapter.d.ts.map +0 -1
- package/dist/runtime/adapters/SimpleInputAdapter.d.ts +0 -16
- package/dist/runtime/adapters/SimpleInputAdapter.d.ts.map +0 -1
- package/dist/runtime/index.cjs +0 -600
- package/dist/runtime/index.d.ts.map +0 -1
- package/dist/runtime/index.mjs +0 -577
- package/dist/runtime/inputs.d.ts +0 -13
- package/dist/runtime/inputs.d.ts.map +0 -1
- package/dist/runtime/runtime.d.ts +0 -16
- package/dist/runtime/runtime.d.ts.map +0 -1
- package/dist/runtime/series.d.ts +0 -60
- package/dist/runtime/series.d.ts.map +0 -1
- package/dist/runtime/types.d.ts +0 -122
- package/dist/runtime/types.d.ts.map +0 -1
- package/dist/script/index.cjs +0 -6372
- package/dist/script/index.d.ts +0 -709
- package/dist/script/index.d.ts.map +0 -1
- package/dist/script/index.mjs +0 -6355
- package/dist/security/resample.d.ts +0 -13
- package/dist/security/resample.d.ts.map +0 -1
- package/dist/session/bars.d.ts +0 -34
- package/dist/session/bars.d.ts.map +0 -1
- package/dist/session/calendar.d.ts +0 -31
- package/dist/session/calendar.d.ts.map +0 -1
- package/dist/str/dateformat.d.ts +0 -2
- package/dist/str/dateformat.d.ts.map +0 -1
- package/dist/str/index.d.ts +0 -24
- package/dist/str/index.d.ts.map +0 -1
- package/dist/str/messageformat.d.ts +0 -2
- package/dist/str/messageformat.d.ts.map +0 -1
- package/dist/str/numberformat.d.ts +0 -3
- package/dist/str/numberformat.d.ts.map +0 -1
- package/dist/strategy/index.d.ts.map +0 -1
- package/dist/ta/index.d.ts +0 -72
- package/dist/ta/index.d.ts.map +0 -1
- package/dist/ta-series.d.ts +0 -143
- package/dist/ta-series.d.ts.map +0 -1
- package/dist/text/index.d.ts +0 -4
- package/dist/text/index.d.ts.map +0 -1
- package/dist/time/datestring.d.ts +0 -2
- package/dist/time/datestring.d.ts.map +0 -1
- package/dist/time/index.d.ts +0 -15
- package/dist/time/index.d.ts.map +0 -1
- package/dist/time/session.d.ts +0 -2
- package/dist/time/session.d.ts.map +0 -1
- package/dist/time/timezone.d.ts +0 -13
- package/dist/time/timezone.d.ts.map +0 -1
- package/dist/timeframe/index.d.ts +0 -17
- package/dist/timeframe/index.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -181
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/metadata.d.ts +0 -131
- package/dist/types/metadata.d.ts.map +0 -1
- package/dist/utils/index.d.ts +0 -26
- package/dist/utils/index.d.ts.map +0 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 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;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Time zone resolution for the calendar functions.
|
|
3
|
+
*
|
|
4
|
+
* PineScript accepts two time zone notations:
|
|
5
|
+
* - UTC/GMT offset notation: "UTC", "UTC-5", "UTC+05:30", "GMT+0530", "GMT+05:30:00", up to ±18:00
|
|
6
|
+
* - IANA time zone database names, case-sensitive: "America/New_York", "Etc/UTC", "US/Eastern", "CET"
|
|
7
|
+
*
|
|
8
|
+
* "utc+2", "america/new_york", "UTC+5:3", "UTC+5:30:15", "GMT+18:01", "EST", "MST" and "HST" are
|
|
9
|
+
* errors in PineScript, and so here.
|
|
10
|
+
*
|
|
11
|
+
* Offsets of IANA zones (daylight saving time and historical changes included)
|
|
12
|
+
* come from the host's `Intl.DateTimeFormat`, so no time zone data ships with the library.
|
|
13
|
+
*/
|
|
14
|
+
/** Calendar fields of a UNIX time in a time zone. */
|
|
15
|
+
export interface ZonedFields {
|
|
16
|
+
year: number;
|
|
17
|
+
/** 1-12 */
|
|
18
|
+
month: number;
|
|
19
|
+
/** 1-31 */
|
|
20
|
+
day: number;
|
|
21
|
+
hour: number;
|
|
22
|
+
minute: number;
|
|
23
|
+
second: number;
|
|
24
|
+
/** 1 = Sunday ... 7 = Saturday (PineScript dayofweek numbering) */
|
|
25
|
+
dayOfWeek: number;
|
|
26
|
+
}
|
|
27
|
+
/** Offset of `timezone` from UTC at `time`, in milliseconds (local = UTC + offset). */
|
|
28
|
+
export declare function zoneOffset(time: number, timezone: string): number;
|
|
29
|
+
/** Splits a UNIX time (ms) into calendar fields in `timezone`. */
|
|
30
|
+
export declare function zonedFields(time: number, timezone: string): ZonedFields;
|
|
31
|
+
/**
|
|
32
|
+
* Converts a wall-clock date and time in `timezone` to a UNIX time (ms).
|
|
33
|
+
* Out-of-range fields roll over like `Date.UTC` (month 13 is January of the next year).
|
|
34
|
+
*
|
|
35
|
+
* As in PineScript: wall-clock times that occur twice (end of daylight saving time)
|
|
36
|
+
* resolve to the later instant, and wall-clock times that do not exist (start of
|
|
37
|
+
* daylight saving time) are shifted forward by the length of the gap.
|
|
38
|
+
*/
|
|
39
|
+
export declare function zonedToUnix(timezone: string, year: number, month: number, day: number, hour?: number, minute?: number, second?: number): number;
|
|
40
|
+
//# sourceMappingURL=timezone.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var timezone_exports = {};
|
|
20
|
+
__export(timezone_exports, {
|
|
21
|
+
zoneOffset: () => zoneOffset,
|
|
22
|
+
zonedFields: () => zonedFields,
|
|
23
|
+
zonedToUnix: () => zonedToUnix
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(timezone_exports);
|
|
26
|
+
const MS_PER_SECOND = 1e3;
|
|
27
|
+
const MS_PER_DAY = 864e5;
|
|
28
|
+
const MAX_OFFSET_SECONDS = 18 * 3600;
|
|
29
|
+
const OFFSET_NOTATION = /^(?:UTC|GMT)(?:([+-])(\d{1,2})(?::?(\d{2})(?::?(\d{2}))?)?)?$/;
|
|
30
|
+
const REJECTED_NAMES = /* @__PURE__ */ new Set(["EST", "MST", "HST"]);
|
|
31
|
+
let canonicalNames;
|
|
32
|
+
function hasTimeZoneCase(name) {
|
|
33
|
+
if (name.split("/").some((segment) => !/^[A-Z]/.test(segment))) return false;
|
|
34
|
+
canonicalNames ??= new Map(Intl.supportedValuesOf("timeZone").map((n) => [n.toLowerCase(), n]));
|
|
35
|
+
const canonical = canonicalNames.get(name.toLowerCase());
|
|
36
|
+
return canonical === void 0 || canonical === name;
|
|
37
|
+
}
|
|
38
|
+
const MS_PER_HOUR = 36e5;
|
|
39
|
+
const MAX_CACHED_HOURS = 1e5;
|
|
40
|
+
const zones = /* @__PURE__ */ new Map();
|
|
41
|
+
function resolveZone(timezone) {
|
|
42
|
+
let zone = zones.get(timezone);
|
|
43
|
+
if (zone) return zone;
|
|
44
|
+
const invalid = () => new RangeError(
|
|
45
|
+
`Invalid time zone "${timezone}": use UTC/GMT offset notation ("UTC-5", "GMT+0530") or an IANA name ("America/New_York")`
|
|
46
|
+
);
|
|
47
|
+
const m = OFFSET_NOTATION.exec(timezone);
|
|
48
|
+
if (m) {
|
|
49
|
+
const [, sign, h = "0", mi = "0", s] = m;
|
|
50
|
+
const minutes = Number(mi);
|
|
51
|
+
const seconds = s === void 0 ? 0 : Number(s);
|
|
52
|
+
if (minutes > 59 || seconds > 59 || s !== void 0 && h.length !== 2) throw invalid();
|
|
53
|
+
const offsetSeconds = Number(h) * 3600 + minutes * 60 + seconds;
|
|
54
|
+
if (offsetSeconds > MAX_OFFSET_SECONDS) throw invalid();
|
|
55
|
+
zone = { kind: "fixed", offsetMs: (sign === "-" ? -offsetSeconds : offsetSeconds) * MS_PER_SECOND };
|
|
56
|
+
} else {
|
|
57
|
+
if (REJECTED_NAMES.has(timezone) || !hasTimeZoneCase(timezone)) throw invalid();
|
|
58
|
+
let format;
|
|
59
|
+
try {
|
|
60
|
+
format = new Intl.DateTimeFormat("en-US", {
|
|
61
|
+
timeZone: timezone,
|
|
62
|
+
hourCycle: "h23",
|
|
63
|
+
year: "numeric",
|
|
64
|
+
month: "numeric",
|
|
65
|
+
day: "numeric",
|
|
66
|
+
hour: "numeric",
|
|
67
|
+
minute: "numeric",
|
|
68
|
+
second: "numeric"
|
|
69
|
+
});
|
|
70
|
+
} catch {
|
|
71
|
+
throw invalid();
|
|
72
|
+
}
|
|
73
|
+
zone = { kind: "iana", format, hours: /* @__PURE__ */ new Map() };
|
|
74
|
+
}
|
|
75
|
+
zones.set(timezone, zone);
|
|
76
|
+
return zone;
|
|
77
|
+
}
|
|
78
|
+
function offsetAt(zone, time) {
|
|
79
|
+
if (zone.kind === "fixed") return zone.offsetMs;
|
|
80
|
+
const hour = Math.floor(time / MS_PER_HOUR);
|
|
81
|
+
let offset = zone.hours.get(hour);
|
|
82
|
+
if (offset === void 0) {
|
|
83
|
+
const first = formattedOffset(zone.format, hour * MS_PER_HOUR);
|
|
84
|
+
const last = formattedOffset(zone.format, hour * MS_PER_HOUR + MS_PER_HOUR - MS_PER_SECOND);
|
|
85
|
+
offset = first === last ? first : null;
|
|
86
|
+
if (zone.hours.size >= MAX_CACHED_HOURS) zone.hours.clear();
|
|
87
|
+
zone.hours.set(hour, offset);
|
|
88
|
+
}
|
|
89
|
+
return offset ?? formattedOffset(zone.format, time);
|
|
90
|
+
}
|
|
91
|
+
function formattedOffset(format, time) {
|
|
92
|
+
const wholeSecond = Math.floor(time / 1e3) * 1e3;
|
|
93
|
+
const f = {};
|
|
94
|
+
for (const part of format.formatToParts(wholeSecond)) {
|
|
95
|
+
if (part.type !== "literal") f[part.type] = Number(part.value);
|
|
96
|
+
}
|
|
97
|
+
const local = Date.UTC(f.year, f.month - 1, f.day, f.hour, f.minute, f.second);
|
|
98
|
+
return local - wholeSecond;
|
|
99
|
+
}
|
|
100
|
+
function zoneOffset(time, timezone) {
|
|
101
|
+
return offsetAt(resolveZone(timezone), time);
|
|
102
|
+
}
|
|
103
|
+
function zonedFields(time, timezone) {
|
|
104
|
+
const local = new Date(time + offsetAt(resolveZone(timezone), time));
|
|
105
|
+
return {
|
|
106
|
+
year: local.getUTCFullYear(),
|
|
107
|
+
month: local.getUTCMonth() + 1,
|
|
108
|
+
day: local.getUTCDate(),
|
|
109
|
+
hour: local.getUTCHours(),
|
|
110
|
+
minute: local.getUTCMinutes(),
|
|
111
|
+
second: local.getUTCSeconds(),
|
|
112
|
+
dayOfWeek: local.getUTCDay() + 1
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function zonedToUnix(timezone, year, month, day, hour = 0, minute = 0, second = 0) {
|
|
116
|
+
const zone = resolveZone(timezone);
|
|
117
|
+
const local = Date.UTC(year, month - 1, day, hour, minute, second);
|
|
118
|
+
if (zone.kind === "fixed") return local - zone.offsetMs;
|
|
119
|
+
const before = offsetAt(zone, local - MS_PER_DAY);
|
|
120
|
+
const after = offsetAt(zone, local + MS_PER_DAY);
|
|
121
|
+
const candidates = [local - before, local - after].filter((t) => local - offsetAt(zone, t) === t);
|
|
122
|
+
if (candidates.length) return Math.max(...candidates);
|
|
123
|
+
return local - before;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=timezone.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 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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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timeframe namespace
|
|
3
|
+
* Mirrors PineScript's timeframe string functions.
|
|
4
|
+
*
|
|
5
|
+
* Timeframe strings: a multiplier and a unit letter, "S" seconds, "D" days,
|
|
6
|
+
* "W" weeks, "M" months, "T" ticks, no letter for minutes ("60" is one hour, "1H" is not valid).
|
|
7
|
+
* Without a multiplier, 1 is used ("D" is "1D").
|
|
8
|
+
*/
|
|
9
|
+
import type { int, simple_string } from '../types/index.js';
|
|
10
|
+
/**
|
|
11
|
+
* Converts a timeframe string into seconds.
|
|
12
|
+
*
|
|
13
|
+
* As in PineScript: months count 2,628,003 seconds (365/12 days), any multiplier is
|
|
14
|
+
* accepted ("13M", "1441", "7S"), and tick timeframes ("1T") give NaN.
|
|
15
|
+
*
|
|
16
|
+
* @param timeframe - Timeframe string, e.g. "1", "60", "1D", "W", "3M", "30S"
|
|
17
|
+
* @returns Number of seconds in the timeframe
|
|
18
|
+
* @throws RangeError for an empty string (the chart timeframe is not known here) and for
|
|
19
|
+
* strings that are not timeframes ("1H", "1d")
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* timeframe.in_seconds('60'); // 3600
|
|
24
|
+
* timeframe.in_seconds('1D'); // 86400
|
|
25
|
+
* timeframe.in_seconds('M'); // 2628003
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function in_seconds(timeframe: simple_string): int;
|
|
29
|
+
/**
|
|
30
|
+
* Converts a number of seconds into a valid timeframe string.
|
|
31
|
+
*
|
|
32
|
+
* PineScript rules:
|
|
33
|
+
* - when no valid timeframe has exactly this duration, the next higher one is returned:
|
|
34
|
+
* 1 second or less gives "1S", 2-5 seconds give "5S", 31-60 seconds give "1",
|
|
35
|
+
* 604,799 seconds give "7D"
|
|
36
|
+
* - when several timeframes have exactly this duration, the larger unit is used:
|
|
37
|
+
* 604,800 seconds give "1W", not "7D"; months are used for exact multiples of 2,628,003 seconds
|
|
38
|
+
* - from 31,536,000 seconds (365 days) the result is "12M"
|
|
39
|
+
*
|
|
40
|
+
* @param seconds - Number of seconds
|
|
41
|
+
* @returns Timeframe string
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```typescript
|
|
45
|
+
* timeframe.from_seconds(3600); // "60"
|
|
46
|
+
* timeframe.from_seconds(86400); // "1D"
|
|
47
|
+
* timeframe.from_seconds(604800); // "1W"
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export declare function from_seconds(seconds: int): simple_string;
|
|
51
|
+
/** Properties of a chart timeframe, as PineScript's `timeframe.*` variables give them. */
|
|
52
|
+
export interface TimeframeInfo {
|
|
53
|
+
/** Timeframe string with its multiplier: "1D", "60", "1S" (PineScript `timeframe.period`) */
|
|
54
|
+
period: string;
|
|
55
|
+
multiplier: number;
|
|
56
|
+
isintraday: boolean;
|
|
57
|
+
isdaily: boolean;
|
|
58
|
+
isweekly: boolean;
|
|
59
|
+
ismonthly: boolean;
|
|
60
|
+
isminutes: boolean;
|
|
61
|
+
isseconds: boolean;
|
|
62
|
+
isticks: boolean;
|
|
63
|
+
isdwm: boolean;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Describes a chart timeframe like PineScript's `timeframe.*` variables.
|
|
67
|
+
* The period always carries its multiplier: "D" becomes "1D".
|
|
68
|
+
*
|
|
69
|
+
* @param timeframe - Chart timeframe string, e.g. "5", "60", "D", "1W", "30S"
|
|
70
|
+
* @throws RangeError for strings that are not timeframes
|
|
71
|
+
*/
|
|
72
|
+
export declare function info(timeframe: simple_string): TimeframeInfo;
|
|
73
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/timeframe/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAqB5D;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,aAAa,GAAG,GAAG,CAaxD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,GAAG,GAAG,aAAa,CAiBxD;AAED,0FAA0F;AAC1F,MAAM,WAAW,aAAa;IAC5B,6FAA6F;IAC7F,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,IAAI,CAAC,SAAS,EAAE,aAAa,GAAG,aAAa,CAkB5D"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var timeframe_exports = {};
|
|
20
|
+
__export(timeframe_exports, {
|
|
21
|
+
from_seconds: () => from_seconds,
|
|
22
|
+
in_seconds: () => in_seconds,
|
|
23
|
+
info: () => info
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(timeframe_exports);
|
|
26
|
+
const SECONDS_PER_MINUTE = 60;
|
|
27
|
+
const SECONDS_PER_DAY = 86400;
|
|
28
|
+
const SECONDS_PER_WEEK = 604800;
|
|
29
|
+
const SECONDS_PER_MONTH = 2628003;
|
|
30
|
+
const SECONDS_365_DAYS = 365 * SECONDS_PER_DAY;
|
|
31
|
+
const UNIT_SECONDS = {
|
|
32
|
+
S: 1,
|
|
33
|
+
"": SECONDS_PER_MINUTE,
|
|
34
|
+
D: SECONDS_PER_DAY,
|
|
35
|
+
W: SECONDS_PER_WEEK,
|
|
36
|
+
M: SECONDS_PER_MONTH
|
|
37
|
+
};
|
|
38
|
+
const SECOND_TIMEFRAMES = [1, 5, 10, 15, 30];
|
|
39
|
+
function in_seconds(timeframe) {
|
|
40
|
+
const text = timeframe.trim();
|
|
41
|
+
if (text === "") {
|
|
42
|
+
throw new RangeError("timeframe.in_seconds() needs a timeframe: the chart timeframe is not known here");
|
|
43
|
+
}
|
|
44
|
+
const before = /^(\d*)([SDWMT]?)$/.exec(text);
|
|
45
|
+
const after = before ? null : /^([SDWMT])(\d+)$/.exec(text);
|
|
46
|
+
if (!before && !after) throw new RangeError(`Invalid timeframe "${timeframe}"`);
|
|
47
|
+
const [digits, unit] = before ? [before[1], before[2]] : [after[2], after[1]];
|
|
48
|
+
if (unit === "T") return NaN;
|
|
49
|
+
const multiplier = digits === "" ? 1 : Number(digits);
|
|
50
|
+
return multiplier * UNIT_SECONDS[unit];
|
|
51
|
+
}
|
|
52
|
+
function from_seconds(seconds) {
|
|
53
|
+
if (Number.isNaN(seconds)) throw new RangeError("timeframe.from_seconds() needs a number of seconds");
|
|
54
|
+
if (seconds >= SECONDS_365_DAYS) return "12M";
|
|
55
|
+
if (seconds > 0) {
|
|
56
|
+
if (seconds % SECONDS_PER_MONTH === 0) return `${seconds / SECONDS_PER_MONTH}M`;
|
|
57
|
+
if (seconds % SECONDS_PER_WEEK === 0) return `${seconds / SECONDS_PER_WEEK}W`;
|
|
58
|
+
if (seconds % SECONDS_PER_DAY === 0) return `${seconds / SECONDS_PER_DAY}D`;
|
|
59
|
+
if (seconds % SECONDS_PER_MINUTE === 0 && seconds < SECONDS_PER_DAY) return `${seconds / SECONDS_PER_MINUTE}`;
|
|
60
|
+
}
|
|
61
|
+
const second = SECOND_TIMEFRAMES.find((m) => seconds <= m);
|
|
62
|
+
if (second !== void 0) return `${second}S`;
|
|
63
|
+
if (seconds < SECONDS_PER_DAY) return `${Math.ceil(seconds / SECONDS_PER_MINUTE)}`;
|
|
64
|
+
return `${Math.ceil(seconds / SECONDS_PER_DAY)}D`;
|
|
65
|
+
}
|
|
66
|
+
function info(timeframe) {
|
|
67
|
+
const text = timeframe.trim();
|
|
68
|
+
const m = /^(\d*)([SDWMT]?)$/.exec(text);
|
|
69
|
+
if (!m || text === "") throw new RangeError(`Invalid timeframe "${timeframe}"`);
|
|
70
|
+
const unit = m[2];
|
|
71
|
+
const multiplier = m[1] === "" ? 1 : Number(m[1]);
|
|
72
|
+
return {
|
|
73
|
+
period: unit === "" ? String(multiplier) : `${multiplier}${unit}`,
|
|
74
|
+
multiplier,
|
|
75
|
+
isintraday: unit === "" || unit === "S" || unit === "T",
|
|
76
|
+
isdaily: unit === "D",
|
|
77
|
+
isweekly: unit === "W",
|
|
78
|
+
ismonthly: unit === "M",
|
|
79
|
+
isminutes: unit === "",
|
|
80
|
+
isseconds: unit === "S",
|
|
81
|
+
isticks: unit === "T",
|
|
82
|
+
isdwm: unit === "D" || unit === "W" || unit === "M"
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/timeframe/index.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Timeframe namespace\n * Mirrors PineScript's timeframe string functions.\n *\n * Timeframe strings: a multiplier and a unit letter, \"S\" seconds, \"D\" days,\n * \"W\" weeks, \"M\" months, \"T\" ticks, no letter for minutes (\"60\" is one hour, \"1H\" is not valid).\n * Without a multiplier, 1 is used (\"D\" is \"1D\").\n */\n\nimport type { int, simple_string } from '../types/index.js';\n\nconst SECONDS_PER_MINUTE = 60;\nconst SECONDS_PER_DAY = 86_400;\nconst SECONDS_PER_WEEK = 604_800;\n/** PineScript uses 365/12 days (30.4167) for one month. */\nconst SECONDS_PER_MONTH = 2_628_003;\n/** From 365 days, `from_seconds` returns \"12M\". */\nconst SECONDS_365_DAYS = 365 * SECONDS_PER_DAY;\n\nconst UNIT_SECONDS: Record<string, number> = {\n S: 1,\n '': SECONDS_PER_MINUTE,\n D: SECONDS_PER_DAY,\n W: SECONDS_PER_WEEK,\n M: SECONDS_PER_MONTH,\n};\n\n/** Second-based timeframes that `from_seconds` can return. */\nconst SECOND_TIMEFRAMES = [1, 5, 10, 15, 30];\n\n/**\n * Converts a timeframe string into seconds.\n *\n * As in PineScript: months count 2,628,003 seconds (365/12 days), any multiplier is\n * accepted (\"13M\", \"1441\", \"7S\"), and tick timeframes (\"1T\") give NaN.\n *\n * @param timeframe - Timeframe string, e.g. \"1\", \"60\", \"1D\", \"W\", \"3M\", \"30S\"\n * @returns Number of seconds in the timeframe\n * @throws RangeError for an empty string (the chart timeframe is not known here) and for\n * strings that are not timeframes (\"1H\", \"1d\")\n *\n * @example\n * ```typescript\n * timeframe.in_seconds('60'); // 3600\n * timeframe.in_seconds('1D'); // 86400\n * timeframe.in_seconds('M'); // 2628003\n * ```\n */\nexport function in_seconds(timeframe: simple_string): int {\n const text = timeframe.trim();\n if (text === '') {\n throw new RangeError('timeframe.in_seconds() needs a timeframe: the chart timeframe is not known here');\n }\n // Multiplier before the unit (\"30S\"), or after it (\"S30\"), as PineScript accepts both.\n const before = /^(\\d*)([SDWMT]?)$/.exec(text);\n const after = before ? null : /^([SDWMT])(\\d+)$/.exec(text);\n if (!before && !after) throw new RangeError(`Invalid timeframe \"${timeframe}\"`);\n const [digits, unit] = before ? [before[1]!, before[2]!] : [after![2]!, after![1]!];\n if (unit === 'T') return NaN;\n const multiplier = digits === '' ? 1 : Number(digits);\n return multiplier * UNIT_SECONDS[unit]!;\n}\n\n/**\n * Converts a number of seconds into a valid timeframe string.\n *\n * PineScript rules:\n * - when no valid timeframe has exactly this duration, the next higher one is returned:\n * 1 second or less gives \"1S\", 2-5 seconds give \"5S\", 31-60 seconds give \"1\",\n * 604,799 seconds give \"7D\"\n * - when several timeframes have exactly this duration, the larger unit is used:\n * 604,800 seconds give \"1W\", not \"7D\"; months are used for exact multiples of 2,628,003 seconds\n * - from 31,536,000 seconds (365 days) the result is \"12M\"\n *\n * @param seconds - Number of seconds\n * @returns Timeframe string\n *\n * @example\n * ```typescript\n * timeframe.from_seconds(3600); // \"60\"\n * timeframe.from_seconds(86400); // \"1D\"\n * timeframe.from_seconds(604800); // \"1W\"\n * ```\n */\nexport function from_seconds(seconds: int): simple_string {\n if (Number.isNaN(seconds)) throw new RangeError('timeframe.from_seconds() needs a number of seconds');\n if (seconds >= SECONDS_365_DAYS) return '12M';\n\n // Exact durations, larger unit first.\n if (seconds > 0) {\n if (seconds % SECONDS_PER_MONTH === 0) return `${seconds / SECONDS_PER_MONTH}M`;\n if (seconds % SECONDS_PER_WEEK === 0) return `${seconds / SECONDS_PER_WEEK}W`;\n if (seconds % SECONDS_PER_DAY === 0) return `${seconds / SECONDS_PER_DAY}D`;\n if (seconds % SECONDS_PER_MINUTE === 0 && seconds < SECONDS_PER_DAY) return `${seconds / SECONDS_PER_MINUTE}`;\n }\n\n // Next higher valid timeframe.\n const second = SECOND_TIMEFRAMES.find((m) => seconds <= m);\n if (second !== undefined) return `${second}S`;\n if (seconds < SECONDS_PER_DAY) return `${Math.ceil(seconds / SECONDS_PER_MINUTE)}`;\n return `${Math.ceil(seconds / SECONDS_PER_DAY)}D`;\n}\n\n/** Properties of a chart timeframe, as PineScript's `timeframe.*` variables give them. */\nexport interface TimeframeInfo {\n /** Timeframe string with its multiplier: \"1D\", \"60\", \"1S\" (PineScript `timeframe.period`) */\n period: string;\n multiplier: number;\n isintraday: boolean;\n isdaily: boolean;\n isweekly: boolean;\n ismonthly: boolean;\n isminutes: boolean;\n isseconds: boolean;\n isticks: boolean;\n isdwm: boolean;\n}\n\n/**\n * Describes a chart timeframe like PineScript's `timeframe.*` variables.\n * The period always carries its multiplier: \"D\" becomes \"1D\".\n *\n * @param timeframe - Chart timeframe string, e.g. \"5\", \"60\", \"D\", \"1W\", \"30S\"\n * @throws RangeError for strings that are not timeframes\n */\nexport function info(timeframe: simple_string): TimeframeInfo {\n const text = timeframe.trim();\n const m = /^(\\d*)([SDWMT]?)$/.exec(text);\n if (!m || text === '') throw new RangeError(`Invalid timeframe \"${timeframe}\"`);\n const unit = m[2]!;\n const multiplier = m[1] === '' ? 1 : Number(m[1]);\n return {\n period: unit === '' ? String(multiplier) : `${multiplier}${unit}`,\n multiplier,\n isintraday: unit === '' || unit === 'S' || unit === 'T',\n isdaily: unit === 'D',\n isweekly: unit === 'W',\n ismonthly: unit === 'M',\n isminutes: unit === '',\n isseconds: unit === 'S',\n isticks: unit === 'T',\n isdwm: unit === 'D' || unit === 'W' || unit === 'M',\n };\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA,MAAM,qBAAqB;AAC3B,MAAM,kBAAkB;AACxB,MAAM,mBAAmB;AAEzB,MAAM,oBAAoB;AAE1B,MAAM,mBAAmB,MAAM;AAE/B,MAAM,eAAuC;AAAA,EAC3C,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAGA,MAAM,oBAAoB,CAAC,GAAG,GAAG,IAAI,IAAI,EAAE;AAoBpC,SAAS,WAAW,WAA+B;AACxD,QAAM,OAAO,UAAU,KAAK;AAC5B,MAAI,SAAS,IAAI;AACf,UAAM,IAAI,WAAW,iFAAiF;AAAA,EACxG;AAEA,QAAM,SAAS,oBAAoB,KAAK,IAAI;AAC5C,QAAM,QAAQ,SAAS,OAAO,mBAAmB,KAAK,IAAI;AAC1D,MAAI,CAAC,UAAU,CAAC,MAAO,OAAM,IAAI,WAAW,sBAAsB,SAAS,GAAG;AAC9E,QAAM,CAAC,QAAQ,IAAI,IAAI,SAAS,CAAC,OAAO,CAAC,GAAI,OAAO,CAAC,CAAE,IAAI,CAAC,MAAO,CAAC,GAAI,MAAO,CAAC,CAAE;AAClF,MAAI,SAAS,IAAK,QAAO;AACzB,QAAM,aAAa,WAAW,KAAK,IAAI,OAAO,MAAM;AACpD,SAAO,aAAa,aAAa,IAAI;AACvC;AAuBO,SAAS,aAAa,SAA6B;AACxD,MAAI,OAAO,MAAM,OAAO,EAAG,OAAM,IAAI,WAAW,oDAAoD;AACpG,MAAI,WAAW,iBAAkB,QAAO;AAGxC,MAAI,UAAU,GAAG;AACf,QAAI,UAAU,sBAAsB,EAAG,QAAO,GAAG,UAAU,iBAAiB;AAC5E,QAAI,UAAU,qBAAqB,EAAG,QAAO,GAAG,UAAU,gBAAgB;AAC1E,QAAI,UAAU,oBAAoB,EAAG,QAAO,GAAG,UAAU,eAAe;AACxE,QAAI,UAAU,uBAAuB,KAAK,UAAU,gBAAiB,QAAO,GAAG,UAAU,kBAAkB;AAAA,EAC7G;AAGA,QAAM,SAAS,kBAAkB,KAAK,CAAC,MAAM,WAAW,CAAC;AACzD,MAAI,WAAW,OAAW,QAAO,GAAG,MAAM;AAC1C,MAAI,UAAU,gBAAiB,QAAO,GAAG,KAAK,KAAK,UAAU,kBAAkB,CAAC;AAChF,SAAO,GAAG,KAAK,KAAK,UAAU,eAAe,CAAC;AAChD;AAwBO,SAAS,KAAK,WAAyC;AAC5D,QAAM,OAAO,UAAU,KAAK;AAC5B,QAAM,IAAI,oBAAoB,KAAK,IAAI;AACvC,MAAI,CAAC,KAAK,SAAS,GAAI,OAAM,IAAI,WAAW,sBAAsB,SAAS,GAAG;AAC9E,QAAM,OAAO,EAAE,CAAC;AAChB,QAAM,aAAa,EAAE,CAAC,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC,CAAC;AAChD,SAAO;AAAA,IACL,QAAQ,SAAS,KAAK,OAAO,UAAU,IAAI,GAAG,UAAU,GAAG,IAAI;AAAA,IAC/D;AAAA,IACA,YAAY,SAAS,MAAM,SAAS,OAAO,SAAS;AAAA,IACpD,SAAS,SAAS;AAAA,IAClB,UAAU,SAAS;AAAA,IACnB,WAAW,SAAS;AAAA,IACpB,WAAW,SAAS;AAAA,IACpB,WAAW,SAAS;AAAA,IACpB,SAAS,SAAS;AAAA,IAClB,OAAO,SAAS,OAAO,SAAS,OAAO,SAAS;AAAA,EAClD;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|