zeed 1.3.0 → 1.4.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/AGENTS.md +50 -211
- package/README.md +16 -0
- package/dist/_experiments/bitcask.cjs +243 -1
- package/dist/_experiments/bitcask.cjs.map +1 -1
- package/dist/_experiments/bitcask.mjs +230 -1
- package/dist/_experiments/bitcask.mjs.map +1 -1
- package/dist/bin-BAoS4qtm.mjs +593 -0
- package/dist/{bin-SPdenYkw.mjs.map → bin-BAoS4qtm.mjs.map} +1 -1
- package/dist/bin-Ddaz2lxM.cjs +862 -0
- package/dist/{bin-Ce3i6ABn.cjs.map → bin-Ddaz2lxM.cjs.map} +1 -1
- package/dist/browser/base64.cjs +14 -1
- package/dist/browser/base64.cjs.map +1 -1
- package/dist/browser/base64.mjs +12 -1
- package/dist/browser/base64.mjs.map +1 -1
- package/dist/browser/gravatar.cjs +186 -1
- package/dist/browser/gravatar.cjs.map +1 -1
- package/dist/browser/gravatar.mjs +184 -1
- package/dist/browser/gravatar.mjs.map +1 -1
- package/dist/browser/index.cjs +14 -1
- package/dist/browser/index.mjs +8 -1
- package/dist/browser/localstorage.cjs +46 -1
- package/dist/browser/localstorage.cjs.map +1 -1
- package/dist/browser/localstorage.mjs +45 -1
- package/dist/browser/localstorage.mjs.map +1 -1
- package/dist/browser/log/index.cjs +8 -1
- package/dist/browser/log/index.mjs +5 -1
- package/dist/browser/log/log-browser-factory.cjs +65 -1
- package/dist/browser/log/log-browser-factory.cjs.map +1 -1
- package/dist/browser/log/log-browser-factory.mjs +64 -1
- package/dist/browser/log/log-browser-factory.mjs.map +1 -1
- package/dist/browser/log/log-browser.cjs +72 -1
- package/dist/browser/log/log-browser.cjs.map +1 -1
- package/dist/browser/log/log-browser.mjs +71 -1
- package/dist/browser/log/log-browser.mjs.map +1 -1
- package/dist/browser/log/log-colors.cjs +11 -1
- package/dist/browser/log/log-colors.cjs.map +1 -1
- package/dist/browser/log/log-colors.mjs +9 -1
- package/dist/browser/log/log-colors.mjs.map +1 -1
- package/dist/browser/log/log-context-browser.cjs +25 -1
- package/dist/browser/log/log-context-browser.cjs.map +1 -1
- package/dist/browser/log/log-context-browser.mjs +23 -1
- package/dist/browser/log/log-context-browser.mjs.map +1 -1
- package/dist/chunk-DQk6qfdC.mjs +18 -0
- package/dist/chunk-uaV2rQ02.cjs +53 -0
- package/dist/common/assert.cjs +22 -1
- package/dist/common/assert.cjs.map +1 -1
- package/dist/common/assert.mjs +19 -1
- package/dist/common/assert.mjs.map +1 -1
- package/dist/common/bin/index.cjs +106 -1
- package/dist/common/bin/index.cjs.map +1 -1
- package/dist/common/bin/index.mjs +98 -1
- package/dist/common/bin/index.mjs.map +1 -1
- package/dist/common/bin/lib0/binary.cjs +146 -1
- package/dist/common/bin/lib0/binary.cjs.map +1 -1
- package/dist/common/bin/lib0/binary.mjs +80 -1
- package/dist/common/bin/lib0/binary.mjs.map +1 -1
- package/dist/common/bin/lib0/buffer.cjs +42 -1
- package/dist/common/bin/lib0/buffer.cjs.map +1 -1
- package/dist/common/bin/lib0/buffer.mjs +38 -1
- package/dist/common/bin/lib0/buffer.mjs.map +1 -1
- package/dist/common/bin/lib0/create.cjs +24 -1
- package/dist/common/bin/lib0/create.cjs.map +1 -1
- package/dist/common/bin/lib0/create.mjs +21 -1
- package/dist/common/bin/lib0/create.mjs.map +1 -1
- package/dist/common/bin/lib0/decoding.cjs +325 -1
- package/dist/common/bin/lib0/decoding.cjs.map +1 -1
- package/dist/common/bin/lib0/decoding.mjs +298 -1
- package/dist/common/bin/lib0/decoding.mjs.map +1 -1
- package/dist/common/bin/lib0/encoding.cjs +404 -1
- package/dist/common/bin/lib0/encoding.cjs.map +1 -1
- package/dist/common/bin/lib0/encoding.mjs +377 -1
- package/dist/common/bin/lib0/encoding.mjs.map +1 -1
- package/dist/common/bin/lib0/string.cjs +81 -1
- package/dist/common/bin/lib0/string.cjs.map +1 -1
- package/dist/common/bin/lib0/string.mjs +71 -1
- package/dist/common/bin/lib0/string.mjs.map +1 -1
- package/dist/common/crypto/aes-sealed.cjs +34 -1
- package/dist/common/crypto/aes-sealed.cjs.map +1 -1
- package/dist/common/crypto/aes-sealed.mjs +32 -1
- package/dist/common/crypto/aes-sealed.mjs.map +1 -1
- package/dist/common/crypto/crypto.cjs +91 -1
- package/dist/common/crypto/crypto.cjs.map +1 -1
- package/dist/common/crypto/crypto.mjs +80 -1
- package/dist/common/crypto/crypto.mjs.map +1 -1
- package/dist/common/crypto/index.cjs +23 -1
- package/dist/common/crypto/index.mjs +5 -1
- package/dist/common/crypto/xaes.cjs +128 -1
- package/dist/common/crypto/xaes.cjs.map +1 -1
- package/dist/common/crypto/xaes.mjs +123 -1
- package/dist/common/crypto/xaes.mjs.map +1 -1
- package/dist/common/csv.cjs +49 -4
- package/dist/common/csv.cjs.map +1 -1
- package/dist/common/csv.mjs +46 -4
- package/dist/common/csv.mjs.map +1 -1
- package/dist/common/data/array.cjs +299 -1
- package/dist/common/data/array.cjs.map +1 -1
- package/dist/common/data/array.mjs +274 -1
- package/dist/common/data/array.mjs.map +1 -1
- package/dist/common/data/basex-secure.cjs +30 -1
- package/dist/common/data/basex-secure.mjs +3 -1
- package/dist/common/data/basex.cjs +163 -1
- package/dist/common/data/basex.cjs.map +1 -1
- package/dist/common/data/basex.mjs +152 -1
- package/dist/common/data/basex.mjs.map +1 -1
- package/dist/common/data/bin-types.mjs +1 -1
- package/dist/common/data/bin.cjs +21 -1
- package/dist/common/data/bin.mjs +3 -1
- package/dist/common/data/camelcase.cjs +27 -1
- package/dist/common/data/camelcase.cjs.map +1 -1
- package/dist/common/data/camelcase.mjs +22 -1
- package/dist/common/data/camelcase.mjs.map +1 -1
- package/dist/common/data/convert.cjs +104 -1
- package/dist/common/data/convert.cjs.map +1 -1
- package/dist/common/data/convert.mjs +88 -1
- package/dist/common/data/convert.mjs.map +1 -1
- package/dist/common/data/datauri.cjs +32 -1
- package/dist/common/data/datauri.cjs.map +1 -1
- package/dist/common/data/datauri.mjs +27 -1
- package/dist/common/data/datauri.mjs.map +1 -1
- package/dist/common/data/day-legacy.cjs +148 -1
- package/dist/common/data/day-legacy.cjs.map +1 -1
- package/dist/common/data/day-legacy.mjs +143 -1
- package/dist/common/data/day-legacy.mjs.map +1 -1
- package/dist/common/data/day.cjs +335 -1
- package/dist/common/data/day.cjs.map +1 -1
- package/dist/common/data/day.mjs +305 -1
- package/dist/common/data/day.mjs.map +1 -1
- package/dist/common/data/decimal.cjs +28 -1
- package/dist/common/data/decimal.cjs.map +1 -1
- package/dist/common/data/decimal.mjs +23 -1
- package/dist/common/data/decimal.mjs.map +1 -1
- package/dist/common/data/deep.cjs +57 -1
- package/dist/common/data/deep.cjs.map +1 -1
- package/dist/common/data/deep.mjs +54 -1
- package/dist/common/data/deep.mjs.map +1 -1
- package/dist/common/data/diff.cjs +62 -1
- package/dist/common/data/diff.cjs.map +1 -1
- package/dist/common/data/diff.mjs +60 -1
- package/dist/common/data/diff.mjs.map +1 -1
- package/dist/common/data/distributed.cjs +24 -1
- package/dist/common/data/distributed.cjs.map +1 -1
- package/dist/common/data/distributed.mjs +22 -1
- package/dist/common/data/distributed.mjs.map +1 -1
- package/dist/common/data/format.cjs +63 -1
- package/dist/common/data/format.cjs.map +1 -1
- package/dist/common/data/format.mjs +59 -1
- package/dist/common/data/format.mjs.map +1 -1
- package/dist/common/data/html.cjs +13 -1
- package/dist/common/data/html.cjs.map +1 -1
- package/dist/common/data/html.mjs +10 -1
- package/dist/common/data/html.mjs.map +1 -1
- package/dist/common/data/index.cjs +296 -1
- package/dist/common/data/index.mjs +37 -1
- package/dist/common/data/is.cjs +106 -1
- package/dist/common/data/is.cjs.map +1 -1
- package/dist/common/data/is.mjs +85 -1
- package/dist/common/data/is.mjs.map +1 -1
- package/dist/common/data/json.cjs +70 -1
- package/dist/common/data/json.cjs.map +1 -1
- package/dist/common/data/json.mjs +65 -1
- package/dist/common/data/json.mjs.map +1 -1
- package/dist/common/data/list.cjs +32 -1
- package/dist/common/data/list.cjs.map +1 -1
- package/dist/common/data/list.mjs +27 -1
- package/dist/common/data/list.mjs.map +1 -1
- package/dist/common/data/lru.mjs +1 -1
- package/dist/common/data/math.cjs +79 -1
- package/dist/common/data/math.cjs.map +1 -1
- package/dist/common/data/math.mjs +65 -1
- package/dist/common/data/math.mjs.map +1 -1
- package/dist/common/data/message.cjs +30 -1
- package/dist/common/data/message.cjs.map +1 -1
- package/dist/common/data/message.mjs +28 -1
- package/dist/common/data/message.mjs.map +1 -1
- package/dist/common/data/object-changes.cjs +66 -1
- package/dist/common/data/object-changes.cjs.map +1 -1
- package/dist/common/data/object-changes.mjs +63 -1
- package/dist/common/data/object-changes.mjs.map +1 -1
- package/dist/common/data/object.cjs +112 -1
- package/dist/common/data/object.cjs.map +1 -1
- package/dist/common/data/object.mjs +104 -1
- package/dist/common/data/object.mjs.map +1 -1
- package/dist/common/data/orderby.cjs +42 -1
- package/dist/common/data/orderby.cjs.map +1 -1
- package/dist/common/data/orderby.mjs +37 -1
- package/dist/common/data/orderby.mjs.map +1 -1
- package/dist/common/data/path.cjs +26 -1
- package/dist/common/data/path.cjs.map +1 -1
- package/dist/common/data/path.mjs +25 -1
- package/dist/common/data/path.mjs.map +1 -1
- package/dist/common/data/regexp.cjs +12 -1
- package/dist/common/data/regexp.cjs.map +1 -1
- package/dist/common/data/regexp.mjs +10 -1
- package/dist/common/data/regexp.mjs.map +1 -1
- package/dist/common/data/rounding.cjs +107 -1
- package/dist/common/data/rounding.cjs.map +1 -1
- package/dist/common/data/rounding.mjs +95 -1
- package/dist/common/data/rounding.mjs.map +1 -1
- package/dist/common/data/signal.cjs +39 -1
- package/dist/common/data/signal.cjs.map +1 -1
- package/dist/common/data/signal.mjs +38 -1
- package/dist/common/data/signal.mjs.map +1 -1
- package/dist/common/data/sortable.cjs +35 -1
- package/dist/common/data/sortable.cjs.map +1 -1
- package/dist/common/data/sortable.mjs +31 -1
- package/dist/common/data/sortable.mjs.map +1 -1
- package/dist/common/data/sorted.cjs +54 -1
- package/dist/common/data/sorted.cjs.map +1 -1
- package/dist/common/data/sorted.mjs +53 -1
- package/dist/common/data/sorted.mjs.map +1 -1
- package/dist/common/data/string-deburr.cjs +240 -1
- package/dist/common/data/string-deburr.cjs.map +1 -1
- package/dist/common/data/string-deburr.mjs +238 -1
- package/dist/common/data/string-deburr.mjs.map +1 -1
- package/dist/common/data/string-hash-fnv.cjs +69 -1
- package/dist/common/data/string-hash-fnv.cjs.map +1 -1
- package/dist/common/data/string-hash-fnv.mjs +67 -1
- package/dist/common/data/string-hash-fnv.mjs.map +1 -1
- package/dist/common/data/string-hash-pool.cjs +28 -1
- package/dist/common/data/string-hash-pool.cjs.map +1 -1
- package/dist/common/data/string-hash-pool.mjs +27 -1
- package/dist/common/data/string-hash-pool.mjs.map +1 -1
- package/dist/common/data/url.cjs +98 -2
- package/dist/common/data/url.cjs.map +1 -1
- package/dist/common/data/url.mjs +91 -2
- package/dist/common/data/url.mjs.map +1 -1
- package/dist/common/data/utils.cjs +118 -1
- package/dist/common/data/utils.cjs.map +1 -1
- package/dist/common/data/utils.mjs +107 -1
- package/dist/common/data/utils.mjs.map +1 -1
- package/dist/common/data/wordlist.cjs +531 -1
- package/dist/common/data/wordlist.cjs.map +1 -1
- package/dist/common/data/wordlist.mjs +529 -1
- package/dist/common/data/wordlist.mjs.map +1 -1
- package/dist/common/data/xrx.cjs +96 -1
- package/dist/common/data/xrx.cjs.map +1 -1
- package/dist/common/data/xrx.mjs +92 -1
- package/dist/common/data/xrx.mjs.map +1 -1
- package/dist/common/dispose-defer.cjs +133 -1
- package/dist/common/dispose-defer.cjs.map +1 -1
- package/dist/common/dispose-defer.mjs +130 -1
- package/dist/common/dispose-defer.mjs.map +1 -1
- package/dist/common/dispose-types.mjs +1 -1
- package/dist/common/dispose-utils.cjs +113 -1
- package/dist/common/dispose-utils.cjs.map +1 -1
- package/dist/common/dispose-utils.mjs +106 -1
- package/dist/common/dispose-utils.mjs.map +1 -1
- package/dist/common/exec/index.cjs +24 -1
- package/dist/common/exec/index.d.cts +1 -1
- package/dist/common/exec/index.d.mts +1 -1
- package/dist/common/exec/index.mjs +8 -1
- package/dist/common/exec/mutex.cjs +44 -1
- package/dist/common/exec/mutex.cjs.map +1 -1
- package/dist/common/exec/mutex.mjs +42 -1
- package/dist/common/exec/mutex.mjs.map +1 -1
- package/dist/common/exec/pool.cjs +181 -1
- package/dist/common/exec/pool.cjs.map +1 -1
- package/dist/common/exec/pool.d.cts +1 -1
- package/dist/common/exec/pool.d.mts +1 -1
- package/dist/common/exec/pool.mjs +180 -1
- package/dist/common/exec/pool.mjs.map +1 -1
- package/dist/common/exec/progress.cjs +149 -1
- package/dist/common/exec/progress.cjs.map +1 -1
- package/dist/common/exec/progress.d.cts +1 -1
- package/dist/common/exec/progress.d.mts +1 -1
- package/dist/common/exec/progress.mjs +148 -1
- package/dist/common/exec/progress.mjs.map +1 -1
- package/dist/common/exec/promise.cjs +113 -1
- package/dist/common/exec/promise.cjs.map +1 -1
- package/dist/common/exec/promise.mjs +103 -1
- package/dist/common/exec/promise.mjs.map +1 -1
- package/dist/common/exec/queue.cjs +125 -1
- package/dist/common/exec/queue.cjs.map +1 -1
- package/dist/common/exec/queue.d.cts +1 -1
- package/dist/common/exec/queue.d.mts +1 -1
- package/dist/common/exec/queue.mjs +124 -1
- package/dist/common/exec/queue.mjs.map +1 -1
- package/dist/common/exec/throttle-debounce.cjs +114 -1
- package/dist/common/exec/throttle-debounce.cjs.map +1 -1
- package/dist/common/exec/throttle-debounce.mjs +112 -1
- package/dist/common/exec/throttle-debounce.mjs.map +1 -1
- package/dist/common/global.cjs +22 -1
- package/dist/common/global.cjs.map +1 -1
- package/dist/common/global.mjs +19 -1
- package/dist/common/global.mjs.map +1 -1
- package/dist/common/index.cjs +559 -1
- package/dist/common/index.d.cts +1 -1
- package/dist/common/index.d.mts +1 -1
- package/dist/common/index.mjs +89 -1
- package/dist/common/localhost.cjs +16 -1
- package/dist/common/localhost.cjs.map +1 -1
- package/dist/common/localhost.mjs +14 -1
- package/dist/common/localhost.mjs.map +1 -1
- package/dist/common/log/index.cjs +34 -1
- package/dist/common/log/index.mjs +11 -1
- package/dist/common/log/log-base.cjs +40 -1
- package/dist/common/log/log-base.cjs.map +1 -1
- package/dist/common/log/log-base.mjs +31 -1
- package/dist/common/log/log-base.mjs.map +1 -1
- package/dist/common/log/log-colors.cjs +92 -1
- package/dist/common/log/log-colors.cjs.map +1 -1
- package/dist/common/log/log-colors.mjs +90 -1
- package/dist/common/log/log-colors.mjs.map +1 -1
- package/dist/common/log/log-config.cjs +15 -1
- package/dist/common/log/log-config.cjs.map +1 -1
- package/dist/common/log/log-config.mjs +14 -1
- package/dist/common/log/log-config.mjs.map +1 -1
- package/dist/common/log/log-console-capture.cjs +33 -1
- package/dist/common/log/log-console-capture.cjs.map +1 -1
- package/dist/common/log/log-console-capture.mjs +32 -1
- package/dist/common/log/log-console-capture.mjs.map +1 -1
- package/dist/common/log/log-console-original.cjs +27 -1
- package/dist/common/log/log-console-original.cjs.map +1 -1
- package/dist/common/log/log-console-original.mjs +26 -1
- package/dist/common/log/log-console-original.mjs.map +1 -1
- package/dist/common/log/log-console.cjs +39 -1
- package/dist/common/log/log-console.cjs.map +1 -1
- package/dist/common/log/log-console.mjs +38 -1
- package/dist/common/log/log-console.mjs.map +1 -1
- package/dist/common/log/log-context.cjs +109 -1
- package/dist/common/log/log-context.cjs.map +1 -1
- package/dist/common/log/log-context.mjs +108 -1
- package/dist/common/log/log-context.mjs.map +1 -1
- package/dist/common/log/log-filter.cjs +80 -1
- package/dist/common/log/log-filter.cjs.map +1 -1
- package/dist/common/log/log-filter.mjs +75 -1
- package/dist/common/log/log-filter.mjs.map +1 -1
- package/dist/common/log/log-memory.cjs +45 -1
- package/dist/common/log/log-memory.cjs.map +1 -1
- package/dist/common/log/log-memory.mjs +43 -1
- package/dist/common/log/log-memory.mjs.map +1 -1
- package/dist/common/log/log-noop.cjs +17 -1
- package/dist/common/log/log-noop.cjs.map +1 -1
- package/dist/common/log/log-noop.mjs +15 -1
- package/dist/common/log/log-noop.mjs.map +1 -1
- package/dist/common/log/log.cjs +46 -1
- package/dist/common/log/log.cjs.map +1 -1
- package/dist/common/log/log.mjs +43 -1
- package/dist/common/log/log.mjs.map +1 -1
- package/dist/common/msg/channel-debug.cjs +17 -1
- package/dist/common/msg/channel-debug.cjs.map +1 -1
- package/dist/common/msg/channel-debug.d.cts +1 -1
- package/dist/common/msg/channel-debug.d.mts +1 -1
- package/dist/common/msg/channel-debug.mjs +16 -1
- package/dist/common/msg/channel-debug.mjs.map +1 -1
- package/dist/common/msg/channel-local.cjs +28 -1
- package/dist/common/msg/channel-local.cjs.map +1 -1
- package/dist/common/msg/channel-local.d.cts +1 -1
- package/dist/common/msg/channel-local.d.mts +1 -1
- package/dist/common/msg/channel-local.mjs +26 -1
- package/dist/common/msg/channel-local.mjs.map +1 -1
- package/dist/common/msg/channel-resilient.cjs +63 -1
- package/dist/common/msg/channel-resilient.cjs.map +1 -1
- package/dist/common/msg/channel-resilient.d.cts +1 -1
- package/dist/common/msg/channel-resilient.d.mts +1 -1
- package/dist/common/msg/channel-resilient.mjs +62 -1
- package/dist/common/msg/channel-resilient.mjs.map +1 -1
- package/dist/common/msg/channel-wkwebview.cjs +35 -1
- package/dist/common/msg/channel-wkwebview.cjs.map +1 -1
- package/dist/common/msg/channel-wkwebview.d.cts +2 -1
- package/dist/common/msg/channel-wkwebview.d.mts +2 -1
- package/dist/common/msg/channel-wkwebview.mjs +34 -1
- package/dist/common/msg/channel-wkwebview.mjs.map +1 -1
- package/dist/common/msg/channel.cjs +23 -1
- package/dist/common/msg/channel.cjs.map +1 -1
- package/dist/common/msg/channel.d.cts +1 -1
- package/dist/common/msg/channel.d.mts +1 -1
- package/dist/common/msg/channel.mjs +22 -1
- package/dist/common/msg/channel.mjs.map +1 -1
- package/dist/common/msg/emitter.cjs +141 -1
- package/dist/common/msg/emitter.cjs.map +1 -1
- package/dist/common/msg/emitter.d.cts +1 -1
- package/dist/common/msg/emitter.d.mts +1 -1
- package/dist/common/msg/emitter.mjs +139 -1
- package/dist/common/msg/emitter.mjs.map +1 -1
- package/dist/common/msg/encoder.cjs +38 -1
- package/dist/common/msg/encoder.cjs.map +1 -1
- package/dist/common/msg/encoder.mjs +35 -1
- package/dist/common/msg/encoder.mjs.map +1 -1
- package/dist/common/msg/index.cjs +28 -1
- package/dist/common/msg/index.d.cts +1 -1
- package/dist/common/msg/index.d.mts +1 -1
- package/dist/common/msg/index.mjs +11 -1
- package/dist/common/msg/messages.cjs +135 -1
- package/dist/common/msg/messages.cjs.map +1 -1
- package/dist/common/msg/messages.d.cts +1 -1
- package/dist/common/msg/messages.d.mts +1 -1
- package/dist/common/msg/messages.mjs +133 -1
- package/dist/common/msg/messages.mjs.map +1 -1
- package/dist/common/msg/pipe.mjs +1 -1
- package/dist/common/msg/pubsub.cjs +78 -1
- package/dist/common/msg/pubsub.cjs.map +1 -1
- package/dist/common/msg/pubsub.d.cts +1 -1
- package/dist/common/msg/pubsub.d.mts +1 -1
- package/dist/common/msg/pubsub.mjs +76 -1
- package/dist/common/msg/pubsub.mjs.map +1 -1
- package/dist/common/msg/rpc.cjs +142 -1
- package/dist/common/msg/rpc.cjs.map +1 -1
- package/dist/common/msg/rpc.mjs +139 -1
- package/dist/common/msg/rpc.mjs.map +1 -1
- package/dist/common/network.cjs +129 -1
- package/dist/common/network.cjs.map +1 -1
- package/dist/common/network.mjs +122 -1
- package/dist/common/network.mjs.map +1 -1
- package/dist/common/platform.cjs +92 -1
- package/dist/common/platform.cjs.map +1 -1
- package/dist/common/platform.mjs +84 -1
- package/dist/common/platform.mjs.map +1 -1
- package/dist/common/schema/_sandbox/sandbox-inherit.mjs +1 -1
- package/dist/common/schema/_sandbox/sandbox.mjs +1 -1
- package/dist/common/schema/_sandbox/sandbox.xspec.mjs +1 -1
- package/dist/common/schema/export-json-schema.cjs +54 -1
- package/dist/common/schema/export-json-schema.cjs.map +1 -1
- package/dist/common/schema/export-json-schema.mjs +52 -1
- package/dist/common/schema/export-json-schema.mjs.map +1 -1
- package/dist/common/schema/export-swift.cjs +30 -2
- package/dist/common/schema/export-swift.cjs.map +1 -1
- package/dist/common/schema/export-swift.mjs +29 -2
- package/dist/common/schema/export-swift.mjs.map +1 -1
- package/dist/common/schema/export-typescript.cjs +20 -2
- package/dist/common/schema/export-typescript.cjs.map +1 -1
- package/dist/common/schema/export-typescript.mjs +19 -2
- package/dist/common/schema/export-typescript.mjs.map +1 -1
- package/dist/common/schema/index.cjs +55 -1
- package/dist/common/schema/index.mjs +12 -1
- package/dist/common/schema/parse-args.cjs +62 -2
- package/dist/common/schema/parse-args.cjs.map +1 -1
- package/dist/common/schema/parse-args.mjs +60 -2
- package/dist/common/schema/parse-args.mjs.map +1 -1
- package/dist/common/schema/parse-env.cjs +48 -3
- package/dist/common/schema/parse-env.cjs.map +1 -1
- package/dist/common/schema/parse-env.mjs +46 -3
- package/dist/common/schema/parse-env.mjs.map +1 -1
- package/dist/common/schema/parse-object.cjs +122 -1
- package/dist/common/schema/parse-object.cjs.map +1 -1
- package/dist/common/schema/parse-object.mjs +119 -1
- package/dist/common/schema/parse-object.mjs.map +1 -1
- package/dist/common/schema/schema-standard.mjs +1 -1
- package/dist/common/schema/schema.cjs +423 -1
- package/dist/common/schema/schema.cjs.map +1 -1
- package/dist/common/schema/schema.mjs +404 -1
- package/dist/common/schema/schema.mjs.map +1 -1
- package/dist/common/schema/serialize.cjs +109 -1
- package/dist/common/schema/serialize.cjs.map +1 -1
- package/dist/common/schema/serialize.mjs +107 -1
- package/dist/common/schema/serialize.mjs.map +1 -1
- package/dist/common/schema/type-test.mjs +1 -1
- package/dist/common/schema/utils.cjs +25 -1
- package/dist/common/schema/utils.cjs.map +1 -1
- package/dist/common/schema/utils.mjs +19 -1
- package/dist/common/schema/utils.mjs.map +1 -1
- package/dist/common/schema/z-collection.cjs +51 -1
- package/dist/common/schema/z-collection.mjs +27 -1
- package/dist/common/schema/z.cjs +9 -1
- package/dist/common/schema/z.mjs +3 -1
- package/dist/common/storage/index.cjs +4 -1
- package/dist/common/storage/index.mjs +3 -1
- package/dist/common/storage/memstorage.cjs +26 -1
- package/dist/common/storage/memstorage.cjs.map +1 -1
- package/dist/common/storage/memstorage.mjs +25 -1
- package/dist/common/storage/memstorage.mjs.map +1 -1
- package/dist/common/test.cjs +14 -1
- package/dist/common/test.cjs.map +1 -1
- package/dist/common/test.mjs +13 -1
- package/dist/common/test.mjs.map +1 -1
- package/dist/common/time.cjs +220 -1
- package/dist/common/time.cjs.map +1 -1
- package/dist/common/time.mjs +194 -1
- package/dist/common/time.mjs.map +1 -1
- package/dist/common/timeout.cjs +27 -1
- package/dist/common/timeout.cjs.map +1 -1
- package/dist/common/timeout.mjs +25 -1
- package/dist/common/timeout.mjs.map +1 -1
- package/dist/common/types.mjs +1 -1
- package/dist/common/utils.cjs +7 -1
- package/dist/common/utils.cjs.map +1 -1
- package/dist/common/utils.mjs +5 -1
- package/dist/common/utils.mjs.map +1 -1
- package/dist/common/uuid.cjs +307 -1
- package/dist/common/uuid.cjs.map +1 -1
- package/dist/common/uuid.mjs +284 -1
- package/dist/common/uuid.mjs.map +1 -1
- package/dist/{index-DHXVOH8h.d.cts → index-CFkMqHvX.d.cts} +1 -2
- package/dist/{index-DMaPyx9O.d.mts → index-C_3Y_s6f.d.mts} +1 -2
- package/dist/index.all.cjs +641 -1
- package/dist/index.all.d.cts +1 -1
- package/dist/index.all.d.mts +1 -1
- package/dist/index.all.mjs +113 -1
- package/dist/index.browser.cjs +576 -1
- package/dist/index.browser.d.cts +1 -1
- package/dist/index.browser.d.mts +1 -1
- package/dist/index.browser.mjs +98 -1
- package/dist/index.jsr.cjs +57 -1
- package/dist/index.jsr.mjs +6 -1
- package/dist/index.node.cjs +628 -1
- package/dist/index.node.d.cts +1 -1
- package/dist/index.node.d.mts +1 -1
- package/dist/index.node.mjs +106 -1
- package/dist/node/args.cjs +56 -1
- package/dist/node/args.cjs.map +1 -1
- package/dist/node/args.mjs +53 -1
- package/dist/node/args.mjs.map +1 -1
- package/dist/node/clipboard.cjs +18 -1
- package/dist/node/clipboard.cjs.map +1 -1
- package/dist/node/clipboard.mjs +16 -1
- package/dist/node/clipboard.mjs.map +1 -1
- package/dist/node/crypto.cjs +28 -1
- package/dist/node/crypto.cjs.map +1 -1
- package/dist/node/crypto.mjs +24 -1
- package/dist/node/crypto.mjs.map +1 -1
- package/dist/node/env.cjs +100 -4
- package/dist/node/env.cjs.map +1 -1
- package/dist/node/env.mjs +90 -4
- package/dist/node/env.mjs.map +1 -1
- package/dist/node/files-async.cjs +66 -1
- package/dist/node/files-async.cjs.map +1 -1
- package/dist/node/files-async.mjs +60 -1
- package/dist/node/files-async.mjs.map +1 -1
- package/dist/node/files.cjs +52 -1
- package/dist/node/files.cjs.map +1 -1
- package/dist/node/files.mjs +46 -1
- package/dist/node/files.mjs.map +1 -1
- package/dist/node/filestorage.cjs +100 -1
- package/dist/node/filestorage.cjs.map +1 -1
- package/dist/node/filestorage.mjs +97 -1
- package/dist/node/filestorage.mjs.map +1 -1
- package/dist/node/fs.cjs +119 -1
- package/dist/node/fs.cjs.map +1 -1
- package/dist/node/fs.mjs +101 -1
- package/dist/node/fs.mjs.map +1 -1
- package/dist/node/glob.cjs +75 -1
- package/dist/node/glob.cjs.map +1 -1
- package/dist/node/glob.mjs +73 -1
- package/dist/node/glob.mjs.map +1 -1
- package/dist/node/index.cjs +66 -1
- package/dist/node/index.mjs +16 -1
- package/dist/node/log/index.cjs +20 -1
- package/dist/node/log/index.mjs +7 -1
- package/dist/node/log/log-context-node.cjs +39 -1
- package/dist/node/log/log-context-node.cjs.map +1 -1
- package/dist/node/log/log-context-node.mjs +35 -1
- package/dist/node/log/log-context-node.mjs.map +1 -1
- package/dist/node/log/log-file-rotation.cjs +71 -1
- package/dist/node/log/log-file-rotation.cjs.map +1 -1
- package/dist/node/log/log-file-rotation.mjs +68 -1
- package/dist/node/log/log-file-rotation.mjs.map +1 -1
- package/dist/node/log/log-file.cjs +57 -1
- package/dist/node/log/log-file.cjs.map +1 -1
- package/dist/node/log/log-file.mjs +54 -1
- package/dist/node/log/log-file.mjs.map +1 -1
- package/dist/node/log/log-node.cjs +162 -1
- package/dist/node/log/log-node.cjs.map +1 -1
- package/dist/node/log/log-node.mjs +155 -1
- package/dist/node/log/log-node.mjs.map +1 -1
- package/dist/node/log/log-rotation.cjs +543 -3
- package/dist/node/log/log-rotation.cjs.map +1 -1
- package/dist/node/log/log-rotation.mjs +538 -3
- package/dist/node/log/log-rotation.mjs.map +1 -1
- package/dist/node/log/log-util.cjs +69 -3
- package/dist/node/log/log-util.cjs.map +1 -1
- package/dist/node/log/log-util.mjs +63 -3
- package/dist/node/log/log-util.mjs.map +1 -1
- package/dist/node/open-browser.cjs +20 -1
- package/dist/node/open-browser.cjs.map +1 -1
- package/dist/node/open-browser.mjs +18 -1
- package/dist/node/open-browser.mjs.map +1 -1
- package/package.json +15 -15
- package/src/common/schema/README.md +247 -66
- package/src/eslint-defaults.js +4 -0
- package/src/index.spec.ts +6 -6
- package/dist/bin-Ce3i6ABn.cjs +0 -3
- package/dist/bin-SPdenYkw.mjs +0 -3
- package/dist/chunk-0Lt9GpW0.mjs +0 -1
- package/dist/chunk-D-qHiVGv.cjs +0 -1
- package/src/common/schema/README-SCHEMA.md +0 -0
package/dist/common/time.cjs
CHANGED
|
@@ -1,2 +1,221 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_common_data_math = require('./data/math.cjs');
|
|
3
|
+
|
|
4
|
+
//#region src/common/time.ts
|
|
5
|
+
let testModeTime;
|
|
6
|
+
/**
|
|
7
|
+
* Set a fixed timestamp (ms since epoch) used by `getTimestamp` for tests.
|
|
8
|
+
*
|
|
9
|
+
* Pass a millisecond timestamp (for example created with Date.UTC) to force
|
|
10
|
+
* time-based helpers to return deterministic values during tests.
|
|
11
|
+
*
|
|
12
|
+
* @param ts - timestamp in milliseconds (defaults to 2000-01-01T00:00:00.000Z)
|
|
13
|
+
*/
|
|
14
|
+
function setTimestampTest(ts = Date.UTC(2e3, 0, 1, 0, 0, 0, 0)) {
|
|
15
|
+
testModeTime = ts;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Return the current timestamp in milliseconds.
|
|
19
|
+
*
|
|
20
|
+
* In test mode (when `setTimestampTest` was called) the forced value is
|
|
21
|
+
* returned instead of the real current time.
|
|
22
|
+
*
|
|
23
|
+
* @returns timestamp in milliseconds
|
|
24
|
+
*/
|
|
25
|
+
function getTimestamp() {
|
|
26
|
+
return testModeTime ?? Date.now();
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Return the current timestamp in seconds.
|
|
30
|
+
*
|
|
31
|
+
* Uses `getTimestamp()` which can be overridden for tests with
|
|
32
|
+
* `setTimestampTest`.
|
|
33
|
+
*
|
|
34
|
+
* @returns timestamp in whole seconds (integer)
|
|
35
|
+
*/
|
|
36
|
+
function getTimestampInSeconds() {
|
|
37
|
+
return Math.floor(getTimestamp() / 1e3);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Convert a UNIX timestamp in seconds to a JavaScript Date.
|
|
41
|
+
*
|
|
42
|
+
* @param ts - seconds since epoch
|
|
43
|
+
* @returns Date instance corresponding to the provided seconds
|
|
44
|
+
*/
|
|
45
|
+
function dateFromSeconds(ts) {
|
|
46
|
+
return /* @__PURE__ */ new Date(ts * 1e3);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Format a millisecond duration into a human readable string.
|
|
50
|
+
*
|
|
51
|
+
* - Values >= 1000ms are shown in seconds with one decimal (e.g. "1.2 s").
|
|
52
|
+
* - Smaller values are shown in milliseconds with two decimals (e.g. "123.45 ms").
|
|
53
|
+
*
|
|
54
|
+
* @param ms - duration in milliseconds
|
|
55
|
+
* @returns formatted duration string
|
|
56
|
+
*/
|
|
57
|
+
function formatMilliseconds(ms) {
|
|
58
|
+
return ms > 999 ? `${(ms / 1e3).toFixed(1)} s` : `${ms.toFixed(2)} ms`;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Parses the given date candidates and returns the first valid Date object found.
|
|
62
|
+
*
|
|
63
|
+
* @param dateCandidates - The date candidates to parse, which can be either strings or Date objects.
|
|
64
|
+
* @returns The parsed Date object, or undefined if no valid date is found.
|
|
65
|
+
*/
|
|
66
|
+
function parseDate(...dateCandidates) {
|
|
67
|
+
for (const dateCandidate of dateCandidates) {
|
|
68
|
+
if (dateCandidate instanceof Date) return dateCandidate;
|
|
69
|
+
if (typeof dateCandidate === "string") {
|
|
70
|
+
let date = null;
|
|
71
|
+
if (dateCandidate.includes(":")) try {
|
|
72
|
+
date = new Date(dateCandidate);
|
|
73
|
+
} catch (err) {}
|
|
74
|
+
if (!(date instanceof Date)) {
|
|
75
|
+
const m = /(\d\d\d\d)-(\d\d)-(\d\d)/.exec(dateCandidate);
|
|
76
|
+
if (m) date = new Date(+m[1], +m[2] - 1, +m[3], 12, 0);
|
|
77
|
+
}
|
|
78
|
+
if (date instanceof Date) return date;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Return a high-resolution timestamp in milliseconds.
|
|
84
|
+
*
|
|
85
|
+
* Uses the `performance.now()` clock when available (monotonic, high
|
|
86
|
+
* resolution), otherwise falls back to `Date.now()`.
|
|
87
|
+
*
|
|
88
|
+
* @returns timestamp in milliseconds (relative for performance.now, epoch for Date.now)
|
|
89
|
+
*/
|
|
90
|
+
function getPerformanceTimestamp() {
|
|
91
|
+
return typeof performance !== "undefined" ? performance.now() : Date.now();
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Create a simple duration reporter.
|
|
95
|
+
*
|
|
96
|
+
* Returns a function that, when called, reports the elapsed time since
|
|
97
|
+
* `duration()` was called. The returned string is formatted via
|
|
98
|
+
* `formatMilliseconds`.
|
|
99
|
+
*
|
|
100
|
+
* Example: const t = duration(); // do work...; console.log(t());
|
|
101
|
+
*
|
|
102
|
+
* @returns a zero-argument function that returns the elapsed time string
|
|
103
|
+
*/
|
|
104
|
+
function duration() {
|
|
105
|
+
const t0 = getPerformanceTimestamp();
|
|
106
|
+
return function() {
|
|
107
|
+
return formatMilliseconds(getPerformanceTimestamp() - t0);
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* If you parsed a date string that didn't include a time zone, adjust the
|
|
112
|
+
* naive UTC components into a local Date with the same Y/M/D/H/M/S values.
|
|
113
|
+
*
|
|
114
|
+
* This effectively treats the input as if it already represented local time
|
|
115
|
+
* and builds a corresponding Date using the local timezone.
|
|
116
|
+
*/
|
|
117
|
+
function datetimeToLocal(fromDate) {
|
|
118
|
+
return new Date(fromDate.getUTCFullYear(), fromDate.getUTCMonth(), fromDate.getUTCDate(), fromDate.getUTCHours(), fromDate.getUTCMinutes(), fromDate.getUTCSeconds(), fromDate.getUTCMilliseconds());
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* If you parsed a date string that didn't include a time zone, adjust the
|
|
122
|
+
* local date components into a UTC Date with the same Y/M/D/H/M/S values.
|
|
123
|
+
*/
|
|
124
|
+
function datetimeToUTC(fromDate) {
|
|
125
|
+
return new Date(Date.UTC(fromDate.getFullYear(), fromDate.getMonth(), fromDate.getDate(), fromDate.getHours(), fromDate.getMinutes(), fromDate.getSeconds(), fromDate.getMilliseconds()));
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Convert a timestamp in milliseconds to seconds.
|
|
129
|
+
*
|
|
130
|
+
* When `smart` is true the function will try to detect already-second
|
|
131
|
+
* timestamps and return them unchanged (heuristic threshold). For example,
|
|
132
|
+
* small numbers (< 1e12) are likely seconds and are returned as-is.
|
|
133
|
+
*
|
|
134
|
+
* @param ts - timestamp in milliseconds or seconds
|
|
135
|
+
* @param smart - enable heuristic detection (default: true)
|
|
136
|
+
* @returns timestamp in seconds
|
|
137
|
+
*/
|
|
138
|
+
function timestampMillisecondsToSeconds(ts, smart = true) {
|
|
139
|
+
if (ts <= 0) return 0;
|
|
140
|
+
if (smart && ts < 0xe8d4a51000) return ts;
|
|
141
|
+
return Math.floor(ts / 1e3);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Convert a timestamp in seconds to milliseconds.
|
|
145
|
+
*
|
|
146
|
+
* When `smart` is true the function tries to detect already-millisecond
|
|
147
|
+
* values and returns them unchanged (heuristic threshold). Very large
|
|
148
|
+
* numbers (> 1e12) are assumed to already be milliseconds.
|
|
149
|
+
*
|
|
150
|
+
* @param ts - timestamp in seconds or milliseconds
|
|
151
|
+
* @param smart - enable heuristic detection (default: true)
|
|
152
|
+
* @returns timestamp in milliseconds
|
|
153
|
+
*/
|
|
154
|
+
function timestampSecondsToMilliseconds(ts, smart = true) {
|
|
155
|
+
if (ts <= 0) return 0;
|
|
156
|
+
if (smart && ts > 0xe8d4a51000) return ts;
|
|
157
|
+
return Math.floor(ts * 1e3);
|
|
158
|
+
}
|
|
159
|
+
/** Number of milliseconds in (approx.) one year (365 days). */
|
|
160
|
+
const TIME_YEAR_MS = 31536e6;
|
|
161
|
+
/** Number of seconds in (approx.) one year (365 days). */
|
|
162
|
+
const TIME_YEAR_S = 31536e3;
|
|
163
|
+
/** Number of milliseconds in (approx.) one month (30 days). */
|
|
164
|
+
const TIME_MONTH_MS = 2592e6;
|
|
165
|
+
/** Number of seconds in (approx.) one month (30 days). */
|
|
166
|
+
const TIME_MONTH_S = 2592e3;
|
|
167
|
+
/** Number of milliseconds in one week (7 days). */
|
|
168
|
+
const TIME_WEEK_MS = 6048e5;
|
|
169
|
+
/** Number of seconds in one week (7 days). */
|
|
170
|
+
const TIME_WEEK_S = 604800;
|
|
171
|
+
/** Number of milliseconds in one day (24 hours). */
|
|
172
|
+
const TIME_DAY_MS = 864e5;
|
|
173
|
+
/** Number of seconds in one day (24 hours). */
|
|
174
|
+
const TIME_DAY_S = 86400;
|
|
175
|
+
/** Number of milliseconds in one hour (60 minutes). */
|
|
176
|
+
const TIME_HOUR_MS = 36e5;
|
|
177
|
+
/** Number of seconds in one hour (60 minutes). */
|
|
178
|
+
const TIME_HOUR_S = 3600;
|
|
179
|
+
/** Number of milliseconds in one minute (60 seconds). */
|
|
180
|
+
const TIME_MINUTE_MS = 6e4;
|
|
181
|
+
/** Number of seconds in one minute (60 seconds). */
|
|
182
|
+
const TIME_MINUTE_S = 60;
|
|
183
|
+
const buildNumberSeconds = 5;
|
|
184
|
+
const buildNumberPadding = 6;
|
|
185
|
+
const buildStartSeconds = 1735686e3;
|
|
186
|
+
/** Build number is minutes since 2025-01-01 in base32 "agnoster" encoded format */
|
|
187
|
+
function getBuildNumber() {
|
|
188
|
+
return require_common_data_math.numberToBase32(Math.floor((getTimestampInSeconds() - buildStartSeconds) / buildNumberSeconds), buildNumberPadding);
|
|
189
|
+
}
|
|
190
|
+
function getSecondsFromBuildNumber(buildNumber) {
|
|
191
|
+
return buildStartSeconds + require_common_data_math.base32ToNumber(buildNumber) * buildNumberSeconds;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
//#endregion
|
|
195
|
+
exports.TIME_DAY_MS = TIME_DAY_MS;
|
|
196
|
+
exports.TIME_DAY_S = TIME_DAY_S;
|
|
197
|
+
exports.TIME_HOUR_MS = TIME_HOUR_MS;
|
|
198
|
+
exports.TIME_HOUR_S = TIME_HOUR_S;
|
|
199
|
+
exports.TIME_MINUTE_MS = TIME_MINUTE_MS;
|
|
200
|
+
exports.TIME_MINUTE_S = TIME_MINUTE_S;
|
|
201
|
+
exports.TIME_MONTH_MS = TIME_MONTH_MS;
|
|
202
|
+
exports.TIME_MONTH_S = TIME_MONTH_S;
|
|
203
|
+
exports.TIME_WEEK_MS = TIME_WEEK_MS;
|
|
204
|
+
exports.TIME_WEEK_S = TIME_WEEK_S;
|
|
205
|
+
exports.TIME_YEAR_MS = TIME_YEAR_MS;
|
|
206
|
+
exports.TIME_YEAR_S = TIME_YEAR_S;
|
|
207
|
+
exports.dateFromSeconds = dateFromSeconds;
|
|
208
|
+
exports.datetimeToLocal = datetimeToLocal;
|
|
209
|
+
exports.datetimeToUTC = datetimeToUTC;
|
|
210
|
+
exports.duration = duration;
|
|
211
|
+
exports.formatMilliseconds = formatMilliseconds;
|
|
212
|
+
exports.getBuildNumber = getBuildNumber;
|
|
213
|
+
exports.getPerformanceTimestamp = getPerformanceTimestamp;
|
|
214
|
+
exports.getSecondsFromBuildNumber = getSecondsFromBuildNumber;
|
|
215
|
+
exports.getTimestamp = getTimestamp;
|
|
216
|
+
exports.getTimestampInSeconds = getTimestampInSeconds;
|
|
217
|
+
exports.parseDate = parseDate;
|
|
218
|
+
exports.setTimestampTest = setTimestampTest;
|
|
219
|
+
exports.timestampMillisecondsToSeconds = timestampMillisecondsToSeconds;
|
|
220
|
+
exports.timestampSecondsToMilliseconds = timestampSecondsToMilliseconds;
|
|
2
221
|
//# sourceMappingURL=time.cjs.map
|
package/dist/common/time.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time.cjs","names":["numberToBase32","base32ToNumber"],"sources":["../../src/common/time.ts"],"sourcesContent":["import { base32ToNumber, numberToBase32 } from './data/math'\n\nlet testModeTime: number | undefined\n\n/**\n * Set a fixed timestamp (ms since epoch) used by `getTimestamp` for tests.\n *\n * Pass a millisecond timestamp (for example created with Date.UTC) to force\n * time-based helpers to return deterministic values during tests.\n *\n * @param ts - timestamp in milliseconds (defaults to 2000-01-01T00:00:00.000Z)\n */\nexport function setTimestampTest(ts = Date.UTC(2000, 0, 1, 0, 0, 0, 0)) {\n testModeTime = ts\n}\n\n/**\n * Return the current timestamp in milliseconds.\n *\n * In test mode (when `setTimestampTest` was called) the forced value is\n * returned instead of the real current time.\n *\n * @returns timestamp in milliseconds\n */\nexport function getTimestamp(): number {\n return testModeTime ?? Date.now()\n}\n\n/**\n * Return the current timestamp in seconds.\n *\n * Uses `getTimestamp()` which can be overridden for tests with\n * `setTimestampTest`.\n *\n * @returns timestamp in whole seconds (integer)\n */\nexport function getTimestampInSeconds(): number {\n return Math.floor(getTimestamp() / 1000)\n}\n\n/**\n * Convert a UNIX timestamp in seconds to a JavaScript Date.\n *\n * @param ts - seconds since epoch\n * @returns Date instance corresponding to the provided seconds\n */\nexport function dateFromSeconds(ts: number): Date {\n return new Date(ts * 1000)\n}\n\n// typeof performance !== \"undefined\" ? performance.now() : new Date().getTime()\n\n/**\n * Format a millisecond duration into a human readable string.\n *\n * - Values >= 1000ms are shown in seconds with one decimal (e.g. \"1.2 s\").\n * - Smaller values are shown in milliseconds with two decimals (e.g. \"123.45 ms\").\n *\n * @param ms - duration in milliseconds\n * @returns formatted duration string\n */\nexport function formatMilliseconds(ms: number): string {\n return ms > 999 ? `${(ms / 1000).toFixed(1)} s` : `${ms.toFixed(2)} ms`\n}\n\n/**\n * Parses the given date candidates and returns the first valid Date object found.\n *\n * @param dateCandidates - The date candidates to parse, which can be either strings or Date objects.\n * @returns The parsed Date object, or undefined if no valid date is found.\n */\nexport function parseDate(\n ...dateCandidates: (string | Date)[]\n): Date | undefined {\n for (const dateCandidate of dateCandidates) {\n if (dateCandidate instanceof Date)\n return dateCandidate\n\n if (typeof dateCandidate === 'string') {\n let date = null\n if (dateCandidate.includes(':')) {\n try {\n date = new Date(dateCandidate)\n }\n catch (err) {}\n }\n if (!(date instanceof Date)) {\n const m = /(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)/.exec(dateCandidate)\n if (m)\n date = new Date(+m[1], +m[2] - 1, +m[3], 12, 0)\n }\n if (date instanceof Date)\n return date\n }\n }\n}\n\n/**\n * Return a high-resolution timestamp in milliseconds.\n *\n * Uses the `performance.now()` clock when available (monotonic, high\n * resolution), otherwise falls back to `Date.now()`.\n *\n * @returns timestamp in milliseconds (relative for performance.now, epoch for Date.now)\n */\nexport function getPerformanceTimestamp(): number {\n return typeof performance !== 'undefined' ? performance.now() : Date.now()\n}\n\n/**\n * Create a simple duration reporter.\n *\n * Returns a function that, when called, reports the elapsed time since\n * `duration()` was called. The returned string is formatted via\n * `formatMilliseconds`.\n *\n * Example: const t = duration(); // do work...; console.log(t());\n *\n * @returns a zero-argument function that returns the elapsed time string\n */\nexport function duration(): () => string {\n const t0 = getPerformanceTimestamp()\n\n return function (): string {\n const duration = getPerformanceTimestamp() - t0\n return formatMilliseconds(duration)\n\n // if (duration > 500)\n // return `${(duration / 1000).toFixed(4)}s`\n\n // // https://elijahmanor.com/format-js-numbers\n // // https://tc39.es/proposal-unified-intl-numberformat/section6/locales-currencies-tz_proposed_out.html#sec-issanctionedsimpleunitidentifier\n // return duration.toLocaleString('en-US', {\n // style: 'unit',\n // unit: 'millisecond',\n // notation: 'compact',\n // compactDisplay: 'long',\n // })\n }\n}\n\n/**\n * If you parsed a date string that didn't include a time zone, adjust the\n * naive UTC components into a local Date with the same Y/M/D/H/M/S values.\n *\n * This effectively treats the input as if it already represented local time\n * and builds a corresponding Date using the local timezone.\n */\nexport function datetimeToLocal(fromDate: Date): Date {\n return new Date(\n fromDate.getUTCFullYear(),\n fromDate.getUTCMonth(),\n fromDate.getUTCDate(),\n fromDate.getUTCHours(),\n fromDate.getUTCMinutes(),\n fromDate.getUTCSeconds(),\n fromDate.getUTCMilliseconds(),\n )\n}\n\n/**\n * If you parsed a date string that didn't include a time zone, adjust the\n * local date components into a UTC Date with the same Y/M/D/H/M/S values.\n */\nexport function datetimeToUTC(fromDate: Date): Date {\n return new Date(Date.UTC(\n fromDate.getFullYear(),\n fromDate.getMonth(),\n fromDate.getDate(),\n fromDate.getHours(),\n fromDate.getMinutes(),\n fromDate.getSeconds(),\n fromDate.getMilliseconds(),\n ))\n}\n\n// const tsMs2000 = 946684800000 // same as Jan 11 1970 in ms\n// const tsMs2500 = 16725225600000 // same as Jul 13 1970 in ms\n// 1000000000000\n\n/**\n * Convert a timestamp in milliseconds to seconds.\n *\n * When `smart` is true the function will try to detect already-second\n * timestamps and return them unchanged (heuristic threshold). For example,\n * small numbers (< 1e12) are likely seconds and are returned as-is.\n *\n * @param ts - timestamp in milliseconds or seconds\n * @param smart - enable heuristic detection (default: true)\n * @returns timestamp in seconds\n */\nexport function timestampMillisecondsToSeconds(ts: number, smart = true): number {\n if (ts <= 0)\n return 0\n if (smart && ts < 1000000000000) { // TODO find a better threshold and add tests\n return ts\n // log.warn('Timestamp might already be in seconds?', ts)\n }\n return Math.floor(ts / 1000)\n}\n\n/**\n * Convert a timestamp in seconds to milliseconds.\n *\n * When `smart` is true the function tries to detect already-millisecond\n * values and returns them unchanged (heuristic threshold). Very large\n * numbers (> 1e12) are assumed to already be milliseconds.\n *\n * @param ts - timestamp in seconds or milliseconds\n * @param smart - enable heuristic detection (default: true)\n * @returns timestamp in milliseconds\n */\nexport function timestampSecondsToMilliseconds(ts: number, smart = true): number {\n if (ts <= 0)\n return 0\n if (smart && ts > 1000000000000) { // TODO find a better threshold and add tests\n return ts\n // log.warn('Timestamp might already be in milliseconds?', ts)\n }\n return Math.floor(ts * 1000)\n}\n\n/** Number of milliseconds in (approx.) one year (365 days). */\nexport const TIME_YEAR_MS = 31536000000 // 365 * 24 * 60 * 60 * 1000\n/** Number of seconds in (approx.) one year (365 days). */\nexport const TIME_YEAR_S = 31536000 // 365 * 24 * 60 * 60\n/** Number of milliseconds in (approx.) one month (30 days). */\nexport const TIME_MONTH_MS = 2592000000 // 30 * 24 * 60 * 60 * 1000\n/** Number of seconds in (approx.) one month (30 days). */\nexport const TIME_MONTH_S = 2592000 // 30 * 24 * 60 * 60\n/** Number of milliseconds in one week (7 days). */\nexport const TIME_WEEK_MS = 604800000 // 7 * 24 * 60 * 60 * 1000\n/** Number of seconds in one week (7 days). */\nexport const TIME_WEEK_S = 604800 // 7 * 24 * 60 * 60\n/** Number of milliseconds in one day (24 hours). */\nexport const TIME_DAY_MS = 86400000 // 24 * 60 * 60 * 1000\n/** Number of seconds in one day (24 hours). */\nexport const TIME_DAY_S = 86400 // 24 * 60 * 60\n/** Number of milliseconds in one hour (60 minutes). */\nexport const TIME_HOUR_MS = 3600000 // 60 * 60 * 1000\n/** Number of seconds in one hour (60 minutes). */\nexport const TIME_HOUR_S = 3600 // 60 * 60\n/** Number of milliseconds in one minute (60 seconds). */\nexport const TIME_MINUTE_MS = 60000 // 60 * 1000\n/** Number of seconds in one minute (60 seconds). */\nexport const TIME_MINUTE_S = 60 // 60\n\n// BUILD NUMBER\n\nconst buildNumberSeconds = 5\nconst buildNumberPadding = 6\nconst buildStartSeconds = 1735686000 // 2025-01-01\n\n/** Build number is minutes since 2025-01-01 in base32 \"agnoster\" encoded format */\nexport function getBuildNumber(): string {\n const buildNumber = Math.floor((getTimestampInSeconds() - buildStartSeconds) / buildNumberSeconds)\n return numberToBase32(buildNumber, buildNumberPadding)\n}\n\nexport function getSecondsFromBuildNumber(buildNumber: string): number {\n return buildStartSeconds + (base32ToNumber(buildNumber) * buildNumberSeconds)\n}\n"],"mappings":"sGAEA,IAAI,EAUJ,SAAgB,EAAiB,EAAK,KAAK,IAAI,IAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CAAE,CACtE,EAAe,EAWjB,SAAgB,GAAuB,CACrC,OAAO,GAAgB,KAAK,KAAK,CAWnC,SAAgB,GAAgC,CAC9C,OAAO,KAAK,MAAM,GAAc,CAAG,IAAK,CAS1C,SAAgB,EAAgB,EAAkB,CAChD,OAAO,IAAI,KAAK,EAAK,IAAK,CAc5B,SAAgB,EAAmB,EAAoB,CACrD,OAAO,EAAK,IAAM,IAAI,EAAK,KAAM,QAAQ,EAAE,CAAC,IAAM,GAAG,EAAG,QAAQ,EAAE,CAAC,KASrE,SAAgB,EACd,GAAG,EACe,CAClB,IAAK,IAAM,KAAiB,EAAgB,CAC1C,GAAI,aAAyB,KAC3B,OAAO,EAET,GAAI,OAAO,GAAkB,SAAU,CACrC,IAAI,EAAO,KACX,GAAI,EAAc,SAAS,IAAI,CAC7B,GAAI,CACF,EAAO,IAAI,KAAK,EAAc,MAEpB,EAEd,GAAI,EAAE,aAAgB,MAAO,CAC3B,IAAM,EAAI,2BAA2B,KAAK,EAAc,CACpD,IACF,EAAO,IAAI,KAAK,CAAC,EAAE,GAAK,EAAE,GAAK,EAAG,CAAC,EAAE,GAAI,GAAI,EAAE,EAEnD,GAAI,aAAgB,KAClB,OAAO,IAaf,SAAgB,GAAkC,CAChD,OAAO,OAAO,YAAgB,IAAc,YAAY,KAAK,CAAG,KAAK,KAAK,CAc5E,SAAgB,GAAyB,CACvC,IAAM,EAAK,GAAyB,CAEpC,OAAO,UAAoB,CAEzB,OAAO,EADU,GAAyB,CAAG,EACV,EAuBvC,SAAgB,EAAgB,EAAsB,CACpD,OAAO,IAAI,KACT,EAAS,gBAAgB,CACzB,EAAS,aAAa,CACtB,EAAS,YAAY,CACrB,EAAS,aAAa,CACtB,EAAS,eAAe,CACxB,EAAS,eAAe,CACxB,EAAS,oBAAoB,CAC9B,CAOH,SAAgB,EAAc,EAAsB,CAClD,OAAO,IAAI,KAAK,KAAK,IACnB,EAAS,aAAa,CACtB,EAAS,UAAU,CACnB,EAAS,SAAS,CAClB,EAAS,UAAU,CACnB,EAAS,YAAY,CACrB,EAAS,YAAY,CACrB,EAAS,iBAAiB,CAC3B,CAAC,CAkBJ,SAAgB,EAA+B,EAAY,EAAQ,GAAc,CAO/E,OANI,GAAM,EACD,EACL,GAAS,EAAK,aACT,EAGF,KAAK,MAAM,EAAK,IAAK,CAc9B,SAAgB,EAA+B,EAAY,EAAQ,GAAc,CAO/E,OANI,GAAM,EACD,EACL,GAAS,EAAK,aACT,EAGF,KAAK,MAAM,EAAK,IAAK,CAI9B,MA4BM,EAAoB,UAG1B,SAAgB,GAAyB,CAEvC,OAAOA,EAAAA,eADa,KAAK,OAAO,GAAuB,CAAG,GAAqB,EAAmB,CAC/D,EAAmB,CAGxD,SAAgB,EAA0B,EAA6B,CACrE,OAAO,EAAqBC,EAAAA,eAAe,EAAY,CAAG"}
|
|
1
|
+
{"version":3,"file":"time.cjs","names":["numberToBase32","base32ToNumber"],"sources":["../../src/common/time.ts"],"sourcesContent":["import { base32ToNumber, numberToBase32 } from './data/math'\n\nlet testModeTime: number | undefined\n\n/**\n * Set a fixed timestamp (ms since epoch) used by `getTimestamp` for tests.\n *\n * Pass a millisecond timestamp (for example created with Date.UTC) to force\n * time-based helpers to return deterministic values during tests.\n *\n * @param ts - timestamp in milliseconds (defaults to 2000-01-01T00:00:00.000Z)\n */\nexport function setTimestampTest(ts = Date.UTC(2000, 0, 1, 0, 0, 0, 0)) {\n testModeTime = ts\n}\n\n/**\n * Return the current timestamp in milliseconds.\n *\n * In test mode (when `setTimestampTest` was called) the forced value is\n * returned instead of the real current time.\n *\n * @returns timestamp in milliseconds\n */\nexport function getTimestamp(): number {\n return testModeTime ?? Date.now()\n}\n\n/**\n * Return the current timestamp in seconds.\n *\n * Uses `getTimestamp()` which can be overridden for tests with\n * `setTimestampTest`.\n *\n * @returns timestamp in whole seconds (integer)\n */\nexport function getTimestampInSeconds(): number {\n return Math.floor(getTimestamp() / 1000)\n}\n\n/**\n * Convert a UNIX timestamp in seconds to a JavaScript Date.\n *\n * @param ts - seconds since epoch\n * @returns Date instance corresponding to the provided seconds\n */\nexport function dateFromSeconds(ts: number): Date {\n return new Date(ts * 1000)\n}\n\n// typeof performance !== \"undefined\" ? performance.now() : new Date().getTime()\n\n/**\n * Format a millisecond duration into a human readable string.\n *\n * - Values >= 1000ms are shown in seconds with one decimal (e.g. \"1.2 s\").\n * - Smaller values are shown in milliseconds with two decimals (e.g. \"123.45 ms\").\n *\n * @param ms - duration in milliseconds\n * @returns formatted duration string\n */\nexport function formatMilliseconds(ms: number): string {\n return ms > 999 ? `${(ms / 1000).toFixed(1)} s` : `${ms.toFixed(2)} ms`\n}\n\n/**\n * Parses the given date candidates and returns the first valid Date object found.\n *\n * @param dateCandidates - The date candidates to parse, which can be either strings or Date objects.\n * @returns The parsed Date object, or undefined if no valid date is found.\n */\nexport function parseDate(\n ...dateCandidates: (string | Date)[]\n): Date | undefined {\n for (const dateCandidate of dateCandidates) {\n if (dateCandidate instanceof Date)\n return dateCandidate\n\n if (typeof dateCandidate === 'string') {\n let date = null\n if (dateCandidate.includes(':')) {\n try {\n date = new Date(dateCandidate)\n }\n catch (err) {}\n }\n if (!(date instanceof Date)) {\n const m = /(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)/.exec(dateCandidate)\n if (m)\n date = new Date(+m[1], +m[2] - 1, +m[3], 12, 0)\n }\n if (date instanceof Date)\n return date\n }\n }\n}\n\n/**\n * Return a high-resolution timestamp in milliseconds.\n *\n * Uses the `performance.now()` clock when available (monotonic, high\n * resolution), otherwise falls back to `Date.now()`.\n *\n * @returns timestamp in milliseconds (relative for performance.now, epoch for Date.now)\n */\nexport function getPerformanceTimestamp(): number {\n return typeof performance !== 'undefined' ? performance.now() : Date.now()\n}\n\n/**\n * Create a simple duration reporter.\n *\n * Returns a function that, when called, reports the elapsed time since\n * `duration()` was called. The returned string is formatted via\n * `formatMilliseconds`.\n *\n * Example: const t = duration(); // do work...; console.log(t());\n *\n * @returns a zero-argument function that returns the elapsed time string\n */\nexport function duration(): () => string {\n const t0 = getPerformanceTimestamp()\n\n return function (): string {\n const duration = getPerformanceTimestamp() - t0\n return formatMilliseconds(duration)\n\n // if (duration > 500)\n // return `${(duration / 1000).toFixed(4)}s`\n\n // // https://elijahmanor.com/format-js-numbers\n // // https://tc39.es/proposal-unified-intl-numberformat/section6/locales-currencies-tz_proposed_out.html#sec-issanctionedsimpleunitidentifier\n // return duration.toLocaleString('en-US', {\n // style: 'unit',\n // unit: 'millisecond',\n // notation: 'compact',\n // compactDisplay: 'long',\n // })\n }\n}\n\n/**\n * If you parsed a date string that didn't include a time zone, adjust the\n * naive UTC components into a local Date with the same Y/M/D/H/M/S values.\n *\n * This effectively treats the input as if it already represented local time\n * and builds a corresponding Date using the local timezone.\n */\nexport function datetimeToLocal(fromDate: Date): Date {\n return new Date(\n fromDate.getUTCFullYear(),\n fromDate.getUTCMonth(),\n fromDate.getUTCDate(),\n fromDate.getUTCHours(),\n fromDate.getUTCMinutes(),\n fromDate.getUTCSeconds(),\n fromDate.getUTCMilliseconds(),\n )\n}\n\n/**\n * If you parsed a date string that didn't include a time zone, adjust the\n * local date components into a UTC Date with the same Y/M/D/H/M/S values.\n */\nexport function datetimeToUTC(fromDate: Date): Date {\n return new Date(Date.UTC(\n fromDate.getFullYear(),\n fromDate.getMonth(),\n fromDate.getDate(),\n fromDate.getHours(),\n fromDate.getMinutes(),\n fromDate.getSeconds(),\n fromDate.getMilliseconds(),\n ))\n}\n\n// const tsMs2000 = 946684800000 // same as Jan 11 1970 in ms\n// const tsMs2500 = 16725225600000 // same as Jul 13 1970 in ms\n// 1000000000000\n\n/**\n * Convert a timestamp in milliseconds to seconds.\n *\n * When `smart` is true the function will try to detect already-second\n * timestamps and return them unchanged (heuristic threshold). For example,\n * small numbers (< 1e12) are likely seconds and are returned as-is.\n *\n * @param ts - timestamp in milliseconds or seconds\n * @param smart - enable heuristic detection (default: true)\n * @returns timestamp in seconds\n */\nexport function timestampMillisecondsToSeconds(ts: number, smart = true): number {\n if (ts <= 0)\n return 0\n if (smart && ts < 1000000000000) { // TODO find a better threshold and add tests\n return ts\n // log.warn('Timestamp might already be in seconds?', ts)\n }\n return Math.floor(ts / 1000)\n}\n\n/**\n * Convert a timestamp in seconds to milliseconds.\n *\n * When `smart` is true the function tries to detect already-millisecond\n * values and returns them unchanged (heuristic threshold). Very large\n * numbers (> 1e12) are assumed to already be milliseconds.\n *\n * @param ts - timestamp in seconds or milliseconds\n * @param smart - enable heuristic detection (default: true)\n * @returns timestamp in milliseconds\n */\nexport function timestampSecondsToMilliseconds(ts: number, smart = true): number {\n if (ts <= 0)\n return 0\n if (smart && ts > 1000000000000) { // TODO find a better threshold and add tests\n return ts\n // log.warn('Timestamp might already be in milliseconds?', ts)\n }\n return Math.floor(ts * 1000)\n}\n\n/** Number of milliseconds in (approx.) one year (365 days). */\nexport const TIME_YEAR_MS = 31536000000 // 365 * 24 * 60 * 60 * 1000\n/** Number of seconds in (approx.) one year (365 days). */\nexport const TIME_YEAR_S = 31536000 // 365 * 24 * 60 * 60\n/** Number of milliseconds in (approx.) one month (30 days). */\nexport const TIME_MONTH_MS = 2592000000 // 30 * 24 * 60 * 60 * 1000\n/** Number of seconds in (approx.) one month (30 days). */\nexport const TIME_MONTH_S = 2592000 // 30 * 24 * 60 * 60\n/** Number of milliseconds in one week (7 days). */\nexport const TIME_WEEK_MS = 604800000 // 7 * 24 * 60 * 60 * 1000\n/** Number of seconds in one week (7 days). */\nexport const TIME_WEEK_S = 604800 // 7 * 24 * 60 * 60\n/** Number of milliseconds in one day (24 hours). */\nexport const TIME_DAY_MS = 86400000 // 24 * 60 * 60 * 1000\n/** Number of seconds in one day (24 hours). */\nexport const TIME_DAY_S = 86400 // 24 * 60 * 60\n/** Number of milliseconds in one hour (60 minutes). */\nexport const TIME_HOUR_MS = 3600000 // 60 * 60 * 1000\n/** Number of seconds in one hour (60 minutes). */\nexport const TIME_HOUR_S = 3600 // 60 * 60\n/** Number of milliseconds in one minute (60 seconds). */\nexport const TIME_MINUTE_MS = 60000 // 60 * 1000\n/** Number of seconds in one minute (60 seconds). */\nexport const TIME_MINUTE_S = 60 // 60\n\n// BUILD NUMBER\n\nconst buildNumberSeconds = 5\nconst buildNumberPadding = 6\nconst buildStartSeconds = 1735686000 // 2025-01-01\n\n/** Build number is minutes since 2025-01-01 in base32 \"agnoster\" encoded format */\nexport function getBuildNumber(): string {\n const buildNumber = Math.floor((getTimestampInSeconds() - buildStartSeconds) / buildNumberSeconds)\n return numberToBase32(buildNumber, buildNumberPadding)\n}\n\nexport function getSecondsFromBuildNumber(buildNumber: string): number {\n return buildStartSeconds + (base32ToNumber(buildNumber) * buildNumberSeconds)\n}\n"],"mappings":"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"}
|
package/dist/common/time.mjs
CHANGED
|
@@ -1,2 +1,195 @@
|
|
|
1
|
-
import{base32ToNumber
|
|
1
|
+
import { base32ToNumber, numberToBase32 } from "./data/math.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/common/time.ts
|
|
4
|
+
let testModeTime;
|
|
5
|
+
/**
|
|
6
|
+
* Set a fixed timestamp (ms since epoch) used by `getTimestamp` for tests.
|
|
7
|
+
*
|
|
8
|
+
* Pass a millisecond timestamp (for example created with Date.UTC) to force
|
|
9
|
+
* time-based helpers to return deterministic values during tests.
|
|
10
|
+
*
|
|
11
|
+
* @param ts - timestamp in milliseconds (defaults to 2000-01-01T00:00:00.000Z)
|
|
12
|
+
*/
|
|
13
|
+
function setTimestampTest(ts = Date.UTC(2e3, 0, 1, 0, 0, 0, 0)) {
|
|
14
|
+
testModeTime = ts;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Return the current timestamp in milliseconds.
|
|
18
|
+
*
|
|
19
|
+
* In test mode (when `setTimestampTest` was called) the forced value is
|
|
20
|
+
* returned instead of the real current time.
|
|
21
|
+
*
|
|
22
|
+
* @returns timestamp in milliseconds
|
|
23
|
+
*/
|
|
24
|
+
function getTimestamp() {
|
|
25
|
+
return testModeTime ?? Date.now();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Return the current timestamp in seconds.
|
|
29
|
+
*
|
|
30
|
+
* Uses `getTimestamp()` which can be overridden for tests with
|
|
31
|
+
* `setTimestampTest`.
|
|
32
|
+
*
|
|
33
|
+
* @returns timestamp in whole seconds (integer)
|
|
34
|
+
*/
|
|
35
|
+
function getTimestampInSeconds() {
|
|
36
|
+
return Math.floor(getTimestamp() / 1e3);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Convert a UNIX timestamp in seconds to a JavaScript Date.
|
|
40
|
+
*
|
|
41
|
+
* @param ts - seconds since epoch
|
|
42
|
+
* @returns Date instance corresponding to the provided seconds
|
|
43
|
+
*/
|
|
44
|
+
function dateFromSeconds(ts) {
|
|
45
|
+
return /* @__PURE__ */ new Date(ts * 1e3);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Format a millisecond duration into a human readable string.
|
|
49
|
+
*
|
|
50
|
+
* - Values >= 1000ms are shown in seconds with one decimal (e.g. "1.2 s").
|
|
51
|
+
* - Smaller values are shown in milliseconds with two decimals (e.g. "123.45 ms").
|
|
52
|
+
*
|
|
53
|
+
* @param ms - duration in milliseconds
|
|
54
|
+
* @returns formatted duration string
|
|
55
|
+
*/
|
|
56
|
+
function formatMilliseconds(ms) {
|
|
57
|
+
return ms > 999 ? `${(ms / 1e3).toFixed(1)} s` : `${ms.toFixed(2)} ms`;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Parses the given date candidates and returns the first valid Date object found.
|
|
61
|
+
*
|
|
62
|
+
* @param dateCandidates - The date candidates to parse, which can be either strings or Date objects.
|
|
63
|
+
* @returns The parsed Date object, or undefined if no valid date is found.
|
|
64
|
+
*/
|
|
65
|
+
function parseDate(...dateCandidates) {
|
|
66
|
+
for (const dateCandidate of dateCandidates) {
|
|
67
|
+
if (dateCandidate instanceof Date) return dateCandidate;
|
|
68
|
+
if (typeof dateCandidate === "string") {
|
|
69
|
+
let date = null;
|
|
70
|
+
if (dateCandidate.includes(":")) try {
|
|
71
|
+
date = new Date(dateCandidate);
|
|
72
|
+
} catch (err) {}
|
|
73
|
+
if (!(date instanceof Date)) {
|
|
74
|
+
const m = /(\d\d\d\d)-(\d\d)-(\d\d)/.exec(dateCandidate);
|
|
75
|
+
if (m) date = new Date(+m[1], +m[2] - 1, +m[3], 12, 0);
|
|
76
|
+
}
|
|
77
|
+
if (date instanceof Date) return date;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Return a high-resolution timestamp in milliseconds.
|
|
83
|
+
*
|
|
84
|
+
* Uses the `performance.now()` clock when available (monotonic, high
|
|
85
|
+
* resolution), otherwise falls back to `Date.now()`.
|
|
86
|
+
*
|
|
87
|
+
* @returns timestamp in milliseconds (relative for performance.now, epoch for Date.now)
|
|
88
|
+
*/
|
|
89
|
+
function getPerformanceTimestamp() {
|
|
90
|
+
return typeof performance !== "undefined" ? performance.now() : Date.now();
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Create a simple duration reporter.
|
|
94
|
+
*
|
|
95
|
+
* Returns a function that, when called, reports the elapsed time since
|
|
96
|
+
* `duration()` was called. The returned string is formatted via
|
|
97
|
+
* `formatMilliseconds`.
|
|
98
|
+
*
|
|
99
|
+
* Example: const t = duration(); // do work...; console.log(t());
|
|
100
|
+
*
|
|
101
|
+
* @returns a zero-argument function that returns the elapsed time string
|
|
102
|
+
*/
|
|
103
|
+
function duration() {
|
|
104
|
+
const t0 = getPerformanceTimestamp();
|
|
105
|
+
return function() {
|
|
106
|
+
return formatMilliseconds(getPerformanceTimestamp() - t0);
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* If you parsed a date string that didn't include a time zone, adjust the
|
|
111
|
+
* naive UTC components into a local Date with the same Y/M/D/H/M/S values.
|
|
112
|
+
*
|
|
113
|
+
* This effectively treats the input as if it already represented local time
|
|
114
|
+
* and builds a corresponding Date using the local timezone.
|
|
115
|
+
*/
|
|
116
|
+
function datetimeToLocal(fromDate) {
|
|
117
|
+
return new Date(fromDate.getUTCFullYear(), fromDate.getUTCMonth(), fromDate.getUTCDate(), fromDate.getUTCHours(), fromDate.getUTCMinutes(), fromDate.getUTCSeconds(), fromDate.getUTCMilliseconds());
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* If you parsed a date string that didn't include a time zone, adjust the
|
|
121
|
+
* local date components into a UTC Date with the same Y/M/D/H/M/S values.
|
|
122
|
+
*/
|
|
123
|
+
function datetimeToUTC(fromDate) {
|
|
124
|
+
return new Date(Date.UTC(fromDate.getFullYear(), fromDate.getMonth(), fromDate.getDate(), fromDate.getHours(), fromDate.getMinutes(), fromDate.getSeconds(), fromDate.getMilliseconds()));
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Convert a timestamp in milliseconds to seconds.
|
|
128
|
+
*
|
|
129
|
+
* When `smart` is true the function will try to detect already-second
|
|
130
|
+
* timestamps and return them unchanged (heuristic threshold). For example,
|
|
131
|
+
* small numbers (< 1e12) are likely seconds and are returned as-is.
|
|
132
|
+
*
|
|
133
|
+
* @param ts - timestamp in milliseconds or seconds
|
|
134
|
+
* @param smart - enable heuristic detection (default: true)
|
|
135
|
+
* @returns timestamp in seconds
|
|
136
|
+
*/
|
|
137
|
+
function timestampMillisecondsToSeconds(ts, smart = true) {
|
|
138
|
+
if (ts <= 0) return 0;
|
|
139
|
+
if (smart && ts < 0xe8d4a51000) return ts;
|
|
140
|
+
return Math.floor(ts / 1e3);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Convert a timestamp in seconds to milliseconds.
|
|
144
|
+
*
|
|
145
|
+
* When `smart` is true the function tries to detect already-millisecond
|
|
146
|
+
* values and returns them unchanged (heuristic threshold). Very large
|
|
147
|
+
* numbers (> 1e12) are assumed to already be milliseconds.
|
|
148
|
+
*
|
|
149
|
+
* @param ts - timestamp in seconds or milliseconds
|
|
150
|
+
* @param smart - enable heuristic detection (default: true)
|
|
151
|
+
* @returns timestamp in milliseconds
|
|
152
|
+
*/
|
|
153
|
+
function timestampSecondsToMilliseconds(ts, smart = true) {
|
|
154
|
+
if (ts <= 0) return 0;
|
|
155
|
+
if (smart && ts > 0xe8d4a51000) return ts;
|
|
156
|
+
return Math.floor(ts * 1e3);
|
|
157
|
+
}
|
|
158
|
+
/** Number of milliseconds in (approx.) one year (365 days). */
|
|
159
|
+
const TIME_YEAR_MS = 31536e6;
|
|
160
|
+
/** Number of seconds in (approx.) one year (365 days). */
|
|
161
|
+
const TIME_YEAR_S = 31536e3;
|
|
162
|
+
/** Number of milliseconds in (approx.) one month (30 days). */
|
|
163
|
+
const TIME_MONTH_MS = 2592e6;
|
|
164
|
+
/** Number of seconds in (approx.) one month (30 days). */
|
|
165
|
+
const TIME_MONTH_S = 2592e3;
|
|
166
|
+
/** Number of milliseconds in one week (7 days). */
|
|
167
|
+
const TIME_WEEK_MS = 6048e5;
|
|
168
|
+
/** Number of seconds in one week (7 days). */
|
|
169
|
+
const TIME_WEEK_S = 604800;
|
|
170
|
+
/** Number of milliseconds in one day (24 hours). */
|
|
171
|
+
const TIME_DAY_MS = 864e5;
|
|
172
|
+
/** Number of seconds in one day (24 hours). */
|
|
173
|
+
const TIME_DAY_S = 86400;
|
|
174
|
+
/** Number of milliseconds in one hour (60 minutes). */
|
|
175
|
+
const TIME_HOUR_MS = 36e5;
|
|
176
|
+
/** Number of seconds in one hour (60 minutes). */
|
|
177
|
+
const TIME_HOUR_S = 3600;
|
|
178
|
+
/** Number of milliseconds in one minute (60 seconds). */
|
|
179
|
+
const TIME_MINUTE_MS = 6e4;
|
|
180
|
+
/** Number of seconds in one minute (60 seconds). */
|
|
181
|
+
const TIME_MINUTE_S = 60;
|
|
182
|
+
const buildNumberSeconds = 5;
|
|
183
|
+
const buildNumberPadding = 6;
|
|
184
|
+
const buildStartSeconds = 1735686e3;
|
|
185
|
+
/** Build number is minutes since 2025-01-01 in base32 "agnoster" encoded format */
|
|
186
|
+
function getBuildNumber() {
|
|
187
|
+
return numberToBase32(Math.floor((getTimestampInSeconds() - buildStartSeconds) / buildNumberSeconds), buildNumberPadding);
|
|
188
|
+
}
|
|
189
|
+
function getSecondsFromBuildNumber(buildNumber) {
|
|
190
|
+
return buildStartSeconds + base32ToNumber(buildNumber) * buildNumberSeconds;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
//#endregion
|
|
194
|
+
export { TIME_DAY_MS, TIME_DAY_S, TIME_HOUR_MS, TIME_HOUR_S, TIME_MINUTE_MS, TIME_MINUTE_S, TIME_MONTH_MS, TIME_MONTH_S, TIME_WEEK_MS, TIME_WEEK_S, TIME_YEAR_MS, TIME_YEAR_S, dateFromSeconds, datetimeToLocal, datetimeToUTC, duration, formatMilliseconds, getBuildNumber, getPerformanceTimestamp, getSecondsFromBuildNumber, getTimestamp, getTimestampInSeconds, parseDate, setTimestampTest, timestampMillisecondsToSeconds, timestampSecondsToMilliseconds };
|
|
2
195
|
//# sourceMappingURL=time.mjs.map
|
package/dist/common/time.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time.mjs","names":[],"sources":["../../src/common/time.ts"],"sourcesContent":["import { base32ToNumber, numberToBase32 } from './data/math'\n\nlet testModeTime: number | undefined\n\n/**\n * Set a fixed timestamp (ms since epoch) used by `getTimestamp` for tests.\n *\n * Pass a millisecond timestamp (for example created with Date.UTC) to force\n * time-based helpers to return deterministic values during tests.\n *\n * @param ts - timestamp in milliseconds (defaults to 2000-01-01T00:00:00.000Z)\n */\nexport function setTimestampTest(ts = Date.UTC(2000, 0, 1, 0, 0, 0, 0)) {\n testModeTime = ts\n}\n\n/**\n * Return the current timestamp in milliseconds.\n *\n * In test mode (when `setTimestampTest` was called) the forced value is\n * returned instead of the real current time.\n *\n * @returns timestamp in milliseconds\n */\nexport function getTimestamp(): number {\n return testModeTime ?? Date.now()\n}\n\n/**\n * Return the current timestamp in seconds.\n *\n * Uses `getTimestamp()` which can be overridden for tests with\n * `setTimestampTest`.\n *\n * @returns timestamp in whole seconds (integer)\n */\nexport function getTimestampInSeconds(): number {\n return Math.floor(getTimestamp() / 1000)\n}\n\n/**\n * Convert a UNIX timestamp in seconds to a JavaScript Date.\n *\n * @param ts - seconds since epoch\n * @returns Date instance corresponding to the provided seconds\n */\nexport function dateFromSeconds(ts: number): Date {\n return new Date(ts * 1000)\n}\n\n// typeof performance !== \"undefined\" ? performance.now() : new Date().getTime()\n\n/**\n * Format a millisecond duration into a human readable string.\n *\n * - Values >= 1000ms are shown in seconds with one decimal (e.g. \"1.2 s\").\n * - Smaller values are shown in milliseconds with two decimals (e.g. \"123.45 ms\").\n *\n * @param ms - duration in milliseconds\n * @returns formatted duration string\n */\nexport function formatMilliseconds(ms: number): string {\n return ms > 999 ? `${(ms / 1000).toFixed(1)} s` : `${ms.toFixed(2)} ms`\n}\n\n/**\n * Parses the given date candidates and returns the first valid Date object found.\n *\n * @param dateCandidates - The date candidates to parse, which can be either strings or Date objects.\n * @returns The parsed Date object, or undefined if no valid date is found.\n */\nexport function parseDate(\n ...dateCandidates: (string | Date)[]\n): Date | undefined {\n for (const dateCandidate of dateCandidates) {\n if (dateCandidate instanceof Date)\n return dateCandidate\n\n if (typeof dateCandidate === 'string') {\n let date = null\n if (dateCandidate.includes(':')) {\n try {\n date = new Date(dateCandidate)\n }\n catch (err) {}\n }\n if (!(date instanceof Date)) {\n const m = /(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)/.exec(dateCandidate)\n if (m)\n date = new Date(+m[1], +m[2] - 1, +m[3], 12, 0)\n }\n if (date instanceof Date)\n return date\n }\n }\n}\n\n/**\n * Return a high-resolution timestamp in milliseconds.\n *\n * Uses the `performance.now()` clock when available (monotonic, high\n * resolution), otherwise falls back to `Date.now()`.\n *\n * @returns timestamp in milliseconds (relative for performance.now, epoch for Date.now)\n */\nexport function getPerformanceTimestamp(): number {\n return typeof performance !== 'undefined' ? performance.now() : Date.now()\n}\n\n/**\n * Create a simple duration reporter.\n *\n * Returns a function that, when called, reports the elapsed time since\n * `duration()` was called. The returned string is formatted via\n * `formatMilliseconds`.\n *\n * Example: const t = duration(); // do work...; console.log(t());\n *\n * @returns a zero-argument function that returns the elapsed time string\n */\nexport function duration(): () => string {\n const t0 = getPerformanceTimestamp()\n\n return function (): string {\n const duration = getPerformanceTimestamp() - t0\n return formatMilliseconds(duration)\n\n // if (duration > 500)\n // return `${(duration / 1000).toFixed(4)}s`\n\n // // https://elijahmanor.com/format-js-numbers\n // // https://tc39.es/proposal-unified-intl-numberformat/section6/locales-currencies-tz_proposed_out.html#sec-issanctionedsimpleunitidentifier\n // return duration.toLocaleString('en-US', {\n // style: 'unit',\n // unit: 'millisecond',\n // notation: 'compact',\n // compactDisplay: 'long',\n // })\n }\n}\n\n/**\n * If you parsed a date string that didn't include a time zone, adjust the\n * naive UTC components into a local Date with the same Y/M/D/H/M/S values.\n *\n * This effectively treats the input as if it already represented local time\n * and builds a corresponding Date using the local timezone.\n */\nexport function datetimeToLocal(fromDate: Date): Date {\n return new Date(\n fromDate.getUTCFullYear(),\n fromDate.getUTCMonth(),\n fromDate.getUTCDate(),\n fromDate.getUTCHours(),\n fromDate.getUTCMinutes(),\n fromDate.getUTCSeconds(),\n fromDate.getUTCMilliseconds(),\n )\n}\n\n/**\n * If you parsed a date string that didn't include a time zone, adjust the\n * local date components into a UTC Date with the same Y/M/D/H/M/S values.\n */\nexport function datetimeToUTC(fromDate: Date): Date {\n return new Date(Date.UTC(\n fromDate.getFullYear(),\n fromDate.getMonth(),\n fromDate.getDate(),\n fromDate.getHours(),\n fromDate.getMinutes(),\n fromDate.getSeconds(),\n fromDate.getMilliseconds(),\n ))\n}\n\n// const tsMs2000 = 946684800000 // same as Jan 11 1970 in ms\n// const tsMs2500 = 16725225600000 // same as Jul 13 1970 in ms\n// 1000000000000\n\n/**\n * Convert a timestamp in milliseconds to seconds.\n *\n * When `smart` is true the function will try to detect already-second\n * timestamps and return them unchanged (heuristic threshold). For example,\n * small numbers (< 1e12) are likely seconds and are returned as-is.\n *\n * @param ts - timestamp in milliseconds or seconds\n * @param smart - enable heuristic detection (default: true)\n * @returns timestamp in seconds\n */\nexport function timestampMillisecondsToSeconds(ts: number, smart = true): number {\n if (ts <= 0)\n return 0\n if (smart && ts < 1000000000000) { // TODO find a better threshold and add tests\n return ts\n // log.warn('Timestamp might already be in seconds?', ts)\n }\n return Math.floor(ts / 1000)\n}\n\n/**\n * Convert a timestamp in seconds to milliseconds.\n *\n * When `smart` is true the function tries to detect already-millisecond\n * values and returns them unchanged (heuristic threshold). Very large\n * numbers (> 1e12) are assumed to already be milliseconds.\n *\n * @param ts - timestamp in seconds or milliseconds\n * @param smart - enable heuristic detection (default: true)\n * @returns timestamp in milliseconds\n */\nexport function timestampSecondsToMilliseconds(ts: number, smart = true): number {\n if (ts <= 0)\n return 0\n if (smart && ts > 1000000000000) { // TODO find a better threshold and add tests\n return ts\n // log.warn('Timestamp might already be in milliseconds?', ts)\n }\n return Math.floor(ts * 1000)\n}\n\n/** Number of milliseconds in (approx.) one year (365 days). */\nexport const TIME_YEAR_MS = 31536000000 // 365 * 24 * 60 * 60 * 1000\n/** Number of seconds in (approx.) one year (365 days). */\nexport const TIME_YEAR_S = 31536000 // 365 * 24 * 60 * 60\n/** Number of milliseconds in (approx.) one month (30 days). */\nexport const TIME_MONTH_MS = 2592000000 // 30 * 24 * 60 * 60 * 1000\n/** Number of seconds in (approx.) one month (30 days). */\nexport const TIME_MONTH_S = 2592000 // 30 * 24 * 60 * 60\n/** Number of milliseconds in one week (7 days). */\nexport const TIME_WEEK_MS = 604800000 // 7 * 24 * 60 * 60 * 1000\n/** Number of seconds in one week (7 days). */\nexport const TIME_WEEK_S = 604800 // 7 * 24 * 60 * 60\n/** Number of milliseconds in one day (24 hours). */\nexport const TIME_DAY_MS = 86400000 // 24 * 60 * 60 * 1000\n/** Number of seconds in one day (24 hours). */\nexport const TIME_DAY_S = 86400 // 24 * 60 * 60\n/** Number of milliseconds in one hour (60 minutes). */\nexport const TIME_HOUR_MS = 3600000 // 60 * 60 * 1000\n/** Number of seconds in one hour (60 minutes). */\nexport const TIME_HOUR_S = 3600 // 60 * 60\n/** Number of milliseconds in one minute (60 seconds). */\nexport const TIME_MINUTE_MS = 60000 // 60 * 1000\n/** Number of seconds in one minute (60 seconds). */\nexport const TIME_MINUTE_S = 60 // 60\n\n// BUILD NUMBER\n\nconst buildNumberSeconds = 5\nconst buildNumberPadding = 6\nconst buildStartSeconds = 1735686000 // 2025-01-01\n\n/** Build number is minutes since 2025-01-01 in base32 \"agnoster\" encoded format */\nexport function getBuildNumber(): string {\n const buildNumber = Math.floor((getTimestampInSeconds() - buildStartSeconds) / buildNumberSeconds)\n return numberToBase32(buildNumber, buildNumberPadding)\n}\n\nexport function getSecondsFromBuildNumber(buildNumber: string): number {\n return buildStartSeconds + (base32ToNumber(buildNumber) * buildNumberSeconds)\n}\n"],"mappings":"qEAEA,IAAI,EAUJ,SAAgB,EAAiB,EAAK,KAAK,IAAI,IAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CAAE,CACtE,EAAe,EAWjB,SAAgB,GAAuB,CACrC,OAAO,GAAgB,KAAK,KAAK,CAWnC,SAAgB,GAAgC,CAC9C,OAAO,KAAK,MAAM,GAAc,CAAG,IAAK,CAS1C,SAAgB,EAAgB,EAAkB,CAChD,OAAO,IAAI,KAAK,EAAK,IAAK,CAc5B,SAAgB,EAAmB,EAAoB,CACrD,OAAO,EAAK,IAAM,IAAI,EAAK,KAAM,QAAQ,EAAE,CAAC,IAAM,GAAG,EAAG,QAAQ,EAAE,CAAC,KASrE,SAAgB,EACd,GAAG,EACe,CAClB,IAAK,IAAM,KAAiB,EAAgB,CAC1C,GAAI,aAAyB,KAC3B,OAAO,EAET,GAAI,OAAO,GAAkB,SAAU,CACrC,IAAI,EAAO,KACX,GAAI,EAAc,SAAS,IAAI,CAC7B,GAAI,CACF,EAAO,IAAI,KAAK,EAAc,MAEpB,EAEd,GAAI,EAAE,aAAgB,MAAO,CAC3B,IAAM,EAAI,2BAA2B,KAAK,EAAc,CACpD,IACF,EAAO,IAAI,KAAK,CAAC,EAAE,GAAK,EAAE,GAAK,EAAG,CAAC,EAAE,GAAI,GAAI,EAAE,EAEnD,GAAI,aAAgB,KAClB,OAAO,IAaf,SAAgB,GAAkC,CAChD,OAAO,OAAO,YAAgB,IAAc,YAAY,KAAK,CAAG,KAAK,KAAK,CAc5E,SAAgB,GAAyB,CACvC,IAAM,EAAK,GAAyB,CAEpC,OAAO,UAAoB,CAEzB,OAAO,EADU,GAAyB,CAAG,EACV,EAuBvC,SAAgB,EAAgB,EAAsB,CACpD,OAAO,IAAI,KACT,EAAS,gBAAgB,CACzB,EAAS,aAAa,CACtB,EAAS,YAAY,CACrB,EAAS,aAAa,CACtB,EAAS,eAAe,CACxB,EAAS,eAAe,CACxB,EAAS,oBAAoB,CAC9B,CAOH,SAAgB,EAAc,EAAsB,CAClD,OAAO,IAAI,KAAK,KAAK,IACnB,EAAS,aAAa,CACtB,EAAS,UAAU,CACnB,EAAS,SAAS,CAClB,EAAS,UAAU,CACnB,EAAS,YAAY,CACrB,EAAS,YAAY,CACrB,EAAS,iBAAiB,CAC3B,CAAC,CAkBJ,SAAgB,EAA+B,EAAY,EAAQ,GAAc,CAO/E,OANI,GAAM,EACD,EACL,GAAS,EAAK,aACT,EAGF,KAAK,MAAM,EAAK,IAAK,CAc9B,SAAgB,EAA+B,EAAY,EAAQ,GAAc,CAO/E,OANI,GAAM,EACD,EACL,GAAS,EAAK,aACT,EAGF,KAAK,MAAM,EAAK,IAAK,CAI9B,MAAa,EAAe,QAEf,EAAc,QAEd,EAAgB,OAEhB,EAAe,OAEf,EAAe,OAEf,EAAc,OAEd,EAAc,MAEd,EAAa,MAEb,EAAe,KAEf,EAAc,KAEd,EAAiB,IAEjB,EAAgB,GAMvB,EAAoB,UAG1B,SAAgB,GAAyB,CAEvC,OAAO,EADa,KAAK,OAAO,GAAuB,CAAG,GAAqB,EAAmB,CAC/D,EAAmB,CAGxD,SAAgB,EAA0B,EAA6B,CACrE,OAAO,EAAqB,EAAe,EAAY,CAAG"}
|
|
1
|
+
{"version":3,"file":"time.mjs","names":[],"sources":["../../src/common/time.ts"],"sourcesContent":["import { base32ToNumber, numberToBase32 } from './data/math'\n\nlet testModeTime: number | undefined\n\n/**\n * Set a fixed timestamp (ms since epoch) used by `getTimestamp` for tests.\n *\n * Pass a millisecond timestamp (for example created with Date.UTC) to force\n * time-based helpers to return deterministic values during tests.\n *\n * @param ts - timestamp in milliseconds (defaults to 2000-01-01T00:00:00.000Z)\n */\nexport function setTimestampTest(ts = Date.UTC(2000, 0, 1, 0, 0, 0, 0)) {\n testModeTime = ts\n}\n\n/**\n * Return the current timestamp in milliseconds.\n *\n * In test mode (when `setTimestampTest` was called) the forced value is\n * returned instead of the real current time.\n *\n * @returns timestamp in milliseconds\n */\nexport function getTimestamp(): number {\n return testModeTime ?? Date.now()\n}\n\n/**\n * Return the current timestamp in seconds.\n *\n * Uses `getTimestamp()` which can be overridden for tests with\n * `setTimestampTest`.\n *\n * @returns timestamp in whole seconds (integer)\n */\nexport function getTimestampInSeconds(): number {\n return Math.floor(getTimestamp() / 1000)\n}\n\n/**\n * Convert a UNIX timestamp in seconds to a JavaScript Date.\n *\n * @param ts - seconds since epoch\n * @returns Date instance corresponding to the provided seconds\n */\nexport function dateFromSeconds(ts: number): Date {\n return new Date(ts * 1000)\n}\n\n// typeof performance !== \"undefined\" ? performance.now() : new Date().getTime()\n\n/**\n * Format a millisecond duration into a human readable string.\n *\n * - Values >= 1000ms are shown in seconds with one decimal (e.g. \"1.2 s\").\n * - Smaller values are shown in milliseconds with two decimals (e.g. \"123.45 ms\").\n *\n * @param ms - duration in milliseconds\n * @returns formatted duration string\n */\nexport function formatMilliseconds(ms: number): string {\n return ms > 999 ? `${(ms / 1000).toFixed(1)} s` : `${ms.toFixed(2)} ms`\n}\n\n/**\n * Parses the given date candidates and returns the first valid Date object found.\n *\n * @param dateCandidates - The date candidates to parse, which can be either strings or Date objects.\n * @returns The parsed Date object, or undefined if no valid date is found.\n */\nexport function parseDate(\n ...dateCandidates: (string | Date)[]\n): Date | undefined {\n for (const dateCandidate of dateCandidates) {\n if (dateCandidate instanceof Date)\n return dateCandidate\n\n if (typeof dateCandidate === 'string') {\n let date = null\n if (dateCandidate.includes(':')) {\n try {\n date = new Date(dateCandidate)\n }\n catch (err) {}\n }\n if (!(date instanceof Date)) {\n const m = /(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)/.exec(dateCandidate)\n if (m)\n date = new Date(+m[1], +m[2] - 1, +m[3], 12, 0)\n }\n if (date instanceof Date)\n return date\n }\n }\n}\n\n/**\n * Return a high-resolution timestamp in milliseconds.\n *\n * Uses the `performance.now()` clock when available (monotonic, high\n * resolution), otherwise falls back to `Date.now()`.\n *\n * @returns timestamp in milliseconds (relative for performance.now, epoch for Date.now)\n */\nexport function getPerformanceTimestamp(): number {\n return typeof performance !== 'undefined' ? performance.now() : Date.now()\n}\n\n/**\n * Create a simple duration reporter.\n *\n * Returns a function that, when called, reports the elapsed time since\n * `duration()` was called. The returned string is formatted via\n * `formatMilliseconds`.\n *\n * Example: const t = duration(); // do work...; console.log(t());\n *\n * @returns a zero-argument function that returns the elapsed time string\n */\nexport function duration(): () => string {\n const t0 = getPerformanceTimestamp()\n\n return function (): string {\n const duration = getPerformanceTimestamp() - t0\n return formatMilliseconds(duration)\n\n // if (duration > 500)\n // return `${(duration / 1000).toFixed(4)}s`\n\n // // https://elijahmanor.com/format-js-numbers\n // // https://tc39.es/proposal-unified-intl-numberformat/section6/locales-currencies-tz_proposed_out.html#sec-issanctionedsimpleunitidentifier\n // return duration.toLocaleString('en-US', {\n // style: 'unit',\n // unit: 'millisecond',\n // notation: 'compact',\n // compactDisplay: 'long',\n // })\n }\n}\n\n/**\n * If you parsed a date string that didn't include a time zone, adjust the\n * naive UTC components into a local Date with the same Y/M/D/H/M/S values.\n *\n * This effectively treats the input as if it already represented local time\n * and builds a corresponding Date using the local timezone.\n */\nexport function datetimeToLocal(fromDate: Date): Date {\n return new Date(\n fromDate.getUTCFullYear(),\n fromDate.getUTCMonth(),\n fromDate.getUTCDate(),\n fromDate.getUTCHours(),\n fromDate.getUTCMinutes(),\n fromDate.getUTCSeconds(),\n fromDate.getUTCMilliseconds(),\n )\n}\n\n/**\n * If you parsed a date string that didn't include a time zone, adjust the\n * local date components into a UTC Date with the same Y/M/D/H/M/S values.\n */\nexport function datetimeToUTC(fromDate: Date): Date {\n return new Date(Date.UTC(\n fromDate.getFullYear(),\n fromDate.getMonth(),\n fromDate.getDate(),\n fromDate.getHours(),\n fromDate.getMinutes(),\n fromDate.getSeconds(),\n fromDate.getMilliseconds(),\n ))\n}\n\n// const tsMs2000 = 946684800000 // same as Jan 11 1970 in ms\n// const tsMs2500 = 16725225600000 // same as Jul 13 1970 in ms\n// 1000000000000\n\n/**\n * Convert a timestamp in milliseconds to seconds.\n *\n * When `smart` is true the function will try to detect already-second\n * timestamps and return them unchanged (heuristic threshold). For example,\n * small numbers (< 1e12) are likely seconds and are returned as-is.\n *\n * @param ts - timestamp in milliseconds or seconds\n * @param smart - enable heuristic detection (default: true)\n * @returns timestamp in seconds\n */\nexport function timestampMillisecondsToSeconds(ts: number, smart = true): number {\n if (ts <= 0)\n return 0\n if (smart && ts < 1000000000000) { // TODO find a better threshold and add tests\n return ts\n // log.warn('Timestamp might already be in seconds?', ts)\n }\n return Math.floor(ts / 1000)\n}\n\n/**\n * Convert a timestamp in seconds to milliseconds.\n *\n * When `smart` is true the function tries to detect already-millisecond\n * values and returns them unchanged (heuristic threshold). Very large\n * numbers (> 1e12) are assumed to already be milliseconds.\n *\n * @param ts - timestamp in seconds or milliseconds\n * @param smart - enable heuristic detection (default: true)\n * @returns timestamp in milliseconds\n */\nexport function timestampSecondsToMilliseconds(ts: number, smart = true): number {\n if (ts <= 0)\n return 0\n if (smart && ts > 1000000000000) { // TODO find a better threshold and add tests\n return ts\n // log.warn('Timestamp might already be in milliseconds?', ts)\n }\n return Math.floor(ts * 1000)\n}\n\n/** Number of milliseconds in (approx.) one year (365 days). */\nexport const TIME_YEAR_MS = 31536000000 // 365 * 24 * 60 * 60 * 1000\n/** Number of seconds in (approx.) one year (365 days). */\nexport const TIME_YEAR_S = 31536000 // 365 * 24 * 60 * 60\n/** Number of milliseconds in (approx.) one month (30 days). */\nexport const TIME_MONTH_MS = 2592000000 // 30 * 24 * 60 * 60 * 1000\n/** Number of seconds in (approx.) one month (30 days). */\nexport const TIME_MONTH_S = 2592000 // 30 * 24 * 60 * 60\n/** Number of milliseconds in one week (7 days). */\nexport const TIME_WEEK_MS = 604800000 // 7 * 24 * 60 * 60 * 1000\n/** Number of seconds in one week (7 days). */\nexport const TIME_WEEK_S = 604800 // 7 * 24 * 60 * 60\n/** Number of milliseconds in one day (24 hours). */\nexport const TIME_DAY_MS = 86400000 // 24 * 60 * 60 * 1000\n/** Number of seconds in one day (24 hours). */\nexport const TIME_DAY_S = 86400 // 24 * 60 * 60\n/** Number of milliseconds in one hour (60 minutes). */\nexport const TIME_HOUR_MS = 3600000 // 60 * 60 * 1000\n/** Number of seconds in one hour (60 minutes). */\nexport const TIME_HOUR_S = 3600 // 60 * 60\n/** Number of milliseconds in one minute (60 seconds). */\nexport const TIME_MINUTE_MS = 60000 // 60 * 1000\n/** Number of seconds in one minute (60 seconds). */\nexport const TIME_MINUTE_S = 60 // 60\n\n// BUILD NUMBER\n\nconst buildNumberSeconds = 5\nconst buildNumberPadding = 6\nconst buildStartSeconds = 1735686000 // 2025-01-01\n\n/** Build number is minutes since 2025-01-01 in base32 \"agnoster\" encoded format */\nexport function getBuildNumber(): string {\n const buildNumber = Math.floor((getTimestampInSeconds() - buildStartSeconds) / buildNumberSeconds)\n return numberToBase32(buildNumber, buildNumberPadding)\n}\n\nexport function getSecondsFromBuildNumber(buildNumber: string): number {\n return buildStartSeconds + (base32ToNumber(buildNumber) * buildNumberSeconds)\n}\n"],"mappings":"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"}
|
package/dist/common/timeout.cjs
CHANGED
|
@@ -1,2 +1,28 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
//#region src/common/timeout.ts
|
|
4
|
+
/**
|
|
5
|
+
* Slightliy enhanced setTimeout to avoid garbage collection issues.
|
|
6
|
+
* Returns a dispose function.
|
|
7
|
+
*
|
|
8
|
+
* Discussion see
|
|
9
|
+
* https://jakearchibald.com/2024/garbage-collection-and-closures/
|
|
10
|
+
* https://news.ycombinator.com/item?id=41111062
|
|
11
|
+
*/
|
|
12
|
+
function safeTimeout(fn, delay = 0, unref = false) {
|
|
13
|
+
let timerId;
|
|
14
|
+
const disposeTimer = () => {
|
|
15
|
+
clearTimeout(timerId);
|
|
16
|
+
timerId = void 0;
|
|
17
|
+
};
|
|
18
|
+
timerId = setTimeout(() => {
|
|
19
|
+
fn();
|
|
20
|
+
disposeTimer();
|
|
21
|
+
}, delay);
|
|
22
|
+
if (unref) timerId.unref?.();
|
|
23
|
+
return disposeTimer;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
//#endregion
|
|
27
|
+
exports.safeTimeout = safeTimeout;
|
|
2
28
|
//# sourceMappingURL=timeout.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeout.cjs","names":[],"sources":["../../src/common/timeout.ts"],"sourcesContent":["/**\n * Slightliy enhanced setTimeout to avoid garbage collection issues.\n * Returns a dispose function.\n *\n * Discussion see\n * https://jakearchibald.com/2024/garbage-collection-and-closures/\n * https://news.ycombinator.com/item?id=41111062\n */\nexport function safeTimeout(fn: () => void, delay = 0, unref = false): () => void {\n let timerId: any\n\n const disposeTimer = () => {\n clearTimeout(timerId)\n timerId = undefined\n }\n\n timerId = setTimeout(() => {\n fn()\n disposeTimer()\n }, delay)\n\n if (unref)\n timerId.unref?.()\n\n return disposeTimer\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"timeout.cjs","names":[],"sources":["../../src/common/timeout.ts"],"sourcesContent":["/**\n * Slightliy enhanced setTimeout to avoid garbage collection issues.\n * Returns a dispose function.\n *\n * Discussion see\n * https://jakearchibald.com/2024/garbage-collection-and-closures/\n * https://news.ycombinator.com/item?id=41111062\n */\nexport function safeTimeout(fn: () => void, delay = 0, unref = false): () => void {\n let timerId: any\n\n const disposeTimer = () => {\n clearTimeout(timerId)\n timerId = undefined\n }\n\n timerId = setTimeout(() => {\n fn()\n disposeTimer()\n }, delay)\n\n if (unref)\n timerId.unref?.()\n\n return disposeTimer\n}\n"],"mappings":";;;;;;;;;;;AAQA,SAAgB,YAAY,IAAgB,QAAQ,GAAG,QAAQ,OAAmB;CAChF,IAAI;CAEJ,MAAM,qBAAqB;AACzB,eAAa,QAAQ;AACrB,YAAU;;AAGZ,WAAU,iBAAiB;AACzB,MAAI;AACJ,gBAAc;IACb,MAAM;AAET,KAAI,MACF,SAAQ,SAAS;AAEnB,QAAO"}
|
package/dist/common/timeout.mjs
CHANGED
|
@@ -1,2 +1,26 @@
|
|
|
1
|
-
|
|
1
|
+
//#region src/common/timeout.ts
|
|
2
|
+
/**
|
|
3
|
+
* Slightliy enhanced setTimeout to avoid garbage collection issues.
|
|
4
|
+
* Returns a dispose function.
|
|
5
|
+
*
|
|
6
|
+
* Discussion see
|
|
7
|
+
* https://jakearchibald.com/2024/garbage-collection-and-closures/
|
|
8
|
+
* https://news.ycombinator.com/item?id=41111062
|
|
9
|
+
*/
|
|
10
|
+
function safeTimeout(fn, delay = 0, unref = false) {
|
|
11
|
+
let timerId;
|
|
12
|
+
const disposeTimer = () => {
|
|
13
|
+
clearTimeout(timerId);
|
|
14
|
+
timerId = void 0;
|
|
15
|
+
};
|
|
16
|
+
timerId = setTimeout(() => {
|
|
17
|
+
fn();
|
|
18
|
+
disposeTimer();
|
|
19
|
+
}, delay);
|
|
20
|
+
if (unref) timerId.unref?.();
|
|
21
|
+
return disposeTimer;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
//#endregion
|
|
25
|
+
export { safeTimeout };
|
|
2
26
|
//# sourceMappingURL=timeout.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeout.mjs","names":[],"sources":["../../src/common/timeout.ts"],"sourcesContent":["/**\n * Slightliy enhanced setTimeout to avoid garbage collection issues.\n * Returns a dispose function.\n *\n * Discussion see\n * https://jakearchibald.com/2024/garbage-collection-and-closures/\n * https://news.ycombinator.com/item?id=41111062\n */\nexport function safeTimeout(fn: () => void, delay = 0, unref = false): () => void {\n let timerId: any\n\n const disposeTimer = () => {\n clearTimeout(timerId)\n timerId = undefined\n }\n\n timerId = setTimeout(() => {\n fn()\n disposeTimer()\n }, delay)\n\n if (unref)\n timerId.unref?.()\n\n return disposeTimer\n}\n"],"mappings":"AAQA,SAAgB,
|
|
1
|
+
{"version":3,"file":"timeout.mjs","names":[],"sources":["../../src/common/timeout.ts"],"sourcesContent":["/**\n * Slightliy enhanced setTimeout to avoid garbage collection issues.\n * Returns a dispose function.\n *\n * Discussion see\n * https://jakearchibald.com/2024/garbage-collection-and-closures/\n * https://news.ycombinator.com/item?id=41111062\n */\nexport function safeTimeout(fn: () => void, delay = 0, unref = false): () => void {\n let timerId: any\n\n const disposeTimer = () => {\n clearTimeout(timerId)\n timerId = undefined\n }\n\n timerId = setTimeout(() => {\n fn()\n disposeTimer()\n }, delay)\n\n if (unref)\n timerId.unref?.()\n\n return disposeTimer\n}\n"],"mappings":";;;;;;;;;AAQA,SAAgB,YAAY,IAAgB,QAAQ,GAAG,QAAQ,OAAmB;CAChF,IAAI;CAEJ,MAAM,qBAAqB;AACzB,eAAa,QAAQ;AACrB,YAAU;;AAGZ,WAAU,iBAAiB;AACzB,MAAI;AACJ,gBAAc;IACb,MAAM;AAET,KAAI,MACF,SAAQ,SAAS;AAEnB,QAAO"}
|
package/dist/common/types.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{};
|
|
1
|
+
export { };
|
package/dist/common/utils.cjs
CHANGED
|
@@ -1,2 +1,8 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
//#region src/common/utils.ts
|
|
4
|
+
function noop() {}
|
|
5
|
+
|
|
6
|
+
//#endregion
|
|
7
|
+
exports.noop = noop;
|
|
2
8
|
//# sourceMappingURL=utils.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.cjs","names":[],"sources":["../../src/common/utils.ts"],"sourcesContent":["export function noop() { }\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.cjs","names":[],"sources":["../../src/common/utils.ts"],"sourcesContent":["export function noop() { }\n"],"mappings":";;;AAAA,SAAgB,OAAO"}
|
package/dist/common/utils.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.mjs","names":[],"sources":["../../src/common/utils.ts"],"sourcesContent":["export function noop() { }\n"],"mappings":"AAAA,SAAgB,
|
|
1
|
+
{"version":3,"file":"utils.mjs","names":[],"sources":["../../src/common/utils.ts"],"sourcesContent":["export function noop() { }\n"],"mappings":";AAAA,SAAgB,OAAO"}
|