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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-rotation.mjs","names":[],"sources":["../../../src/node/log/log-rotation.ts"],"sourcesContent":["// MIT https://github.com/iccicci/rotating-file-stream\n\nimport type { Buffer } from 'node:buffer'\nimport type { Stats } from 'node:fs'\nimport type { FileHandle } from 'node:fs/promises'\nimport type { Gzip } from 'node:zlib'\nimport { exec } from 'node:child_process'\nimport { access, constants, createReadStream, createWriteStream } from 'node:fs'\nimport { mkdir, open, readFile, rename, stat, unlink, writeFile } from 'node:fs/promises'\nimport { sep } from 'node:path'\nimport process from 'node:process'\nimport { Writable } from 'node:stream'\nimport { setTimeout } from 'node:timers'\nimport { TextDecoder } from 'node:util'\nimport { createGzip } from 'node:zlib'\n\nasync function exists(filename: string): Promise<boolean> {\n return new Promise(resolve => access(filename, constants.F_OK, error => resolve(!error)))\n}\n\nexport class RotatingFileStreamError extends Error {\n public code = 'RFS-TOO-MANY'\n\n constructor() {\n super('Too many destination file attempts')\n }\n}\n\nexport type RotationCompressor = (source: string, dest: string) => string\nexport type RotationGenerator = (time: number | Date | null, index?: number) => string\n\n// Flattened event signatures are available via 'RotatingFileStreamEvents' above.\n\nexport type RotationIntervalUnit = 'M' | 'd' | 'h' | 'm' | 's'\nexport type RotationInterval = `${number}${RotationIntervalUnit}`\n\nexport type RotationFileSizeUnit = 'B' | 'K' | 'M' | 'G'\nexport type RotationFileSize = `${number}${RotationFileSizeUnit}`\n\nexport interface RotationOptions {\n compress?: boolean | 'gzip' | RotationCompressor\n encoding?: BufferEncoding\n history?: string\n immutable?: boolean\n initialRotation?: boolean\n interval?: RotationInterval\n intervalBoundary?: boolean\n intervalUTC?: boolean\n maxFiles?: number\n maxSize?: RotationFileSize\n mode?: number\n omitExtension?: boolean\n path?: string\n rotate?: number\n size?: RotationFileSize\n teeToStdout?: boolean\n}\n\ninterface Opts {\n compress?: boolean | 'gzip' | RotationCompressor\n encoding?: BufferEncoding\n history?: string\n immutable?: boolean\n initialRotation?: boolean\n interval?: { num: number, unit: RotationIntervalUnit }\n intervalBoundary?: boolean\n intervalUTC?: boolean\n maxFiles?: number\n maxSize?: number\n mode?: number\n omitExtension?: boolean\n path?: string\n rotate?: number\n size?: number\n teeToStdout?: boolean\n}\n\ntype RotationCallback = (error?: Error) => void\n\ninterface RotationChunk {\n chunk: Buffer\n encoding: BufferEncoding\n}\n\ninterface RotationHistory {\n name: string\n size: number\n time: number\n}\n\nexport class RotatingFileStream extends Writable {\n private createGzip: () => Gzip\n private exec: typeof exec\n private file: FileHandle | null\n private filename: string\n private finished: boolean\n private fsCreateReadStream: typeof createReadStream\n private fsCreateWriteStream: typeof createWriteStream\n private fsOpen: typeof open\n private fsReadFile: typeof readFile\n private fsStat: typeof stat\n private fsUnlink: typeof unlink\n private generator: RotationGenerator\n private last: string\n private maxTimeout: number\n private next: number | null\n private options: Opts\n private size: number\n private stdout: typeof process.stdout\n private prev: number | null\n private rotation: Date | null\n private initPromise: Promise<void> | null\n private timeout: NodeJS.Timeout | null\n private timeoutPromise: Promise<void> | null\n\n constructor(generator: RotationGenerator, options: Opts) {\n const { encoding, history, maxFiles, maxSize, path } = options\n\n super({ decodeStrings: true, defaultEncoding: encoding })\n\n this.createGzip = createGzip\n this.exec = exec\n this.filename = (path || '') + generator(null)\n this.fsCreateReadStream = createReadStream\n this.fsCreateWriteStream = createWriteStream\n this.fsOpen = open\n this.fsReadFile = readFile\n this.fsStat = stat\n this.fsUnlink = unlink\n this.generator = generator\n this.maxTimeout = 2147483640\n this.options = options\n this.stdout = process.stdout\n this.file = null\n this.initPromise = null\n this.timeout = null\n this.timeoutPromise = null\n this.prev = null\n this.next = null\n this.rotation = null\n this.last = ''\n this.finished = false\n this.size = 0\n\n if (maxFiles || maxSize)\n options.history = (path || '') + (history || `${this.generator(null)}.txt`)\n\n this.on('close', () => (this.finished ? null : this.emit('finish')))\n this.on('finish', () => (this.finished = this.clear()));\n\n // In v15 was introduced the _constructor method to delay any _write(), _final() and _destroy() calls\n // Until v16 will be not deprecated we still need this.initPromise\n // https://nodejs.org/api/stream.html#stream_writable_construct_callback\n\n (async () => {\n try {\n this.initPromise = this.init()\n\n await this.initPromise\n this.initPromise = null\n }\n catch (e: any) {}\n })()\n }\n\n _destroy(error: Error, callback: RotationCallback): void {\n this.refinal(error, callback)\n }\n\n _final(callback: RotationCallback): void {\n this.refinal(undefined, callback)\n }\n\n _write(chunk: Buffer, encoding: BufferEncoding, callback: RotationCallback): void {\n this.rewrite([{ chunk, encoding }], 0, callback)\n }\n\n _writev(chunks: RotationChunk[], callback: RotationCallback): void {\n this.rewrite(chunks, 0, callback)\n }\n\n private async refinal(error: Error | undefined, callback: RotationCallback): Promise<void> {\n try {\n this.clear()\n\n if (this.initPromise)\n await this.initPromise\n if (this.timeoutPromise)\n await this.timeoutPromise\n\n await this.reclose()\n }\n catch (e: any) {\n return callback(error || e)\n }\n\n callback(error)\n }\n\n private async rewrite(chunks: RotationChunk[], index: number, callback: RotationCallback): Promise<void> {\n const { size, teeToStdout } = this.options\n\n try {\n if (this.initPromise)\n await this.initPromise\n\n for (let i = 0; i < chunks.length; ++i) {\n const { chunk } = chunks[i]\n\n this.size += chunk.length\n if (this.timeoutPromise)\n await this.timeoutPromise\n await this.file!.write(chunk)\n\n if (teeToStdout && !this.stdout.destroyed)\n this.stdout.write(chunk)\n if (size && this.size >= size)\n await this.rotate()\n }\n }\n catch (e: any) {\n return callback(e)\n }\n\n callback()\n }\n\n private async init(): Promise<void> {\n const { immutable, initialRotation, interval, size } = this.options\n\n // In v15 was introduced the _constructor method to delay any _write(), _final() and _destroy() calls\n // Once v16 will be deprecated we can restore only following line\n // if(immutable) return this.immutate(true);\n if (immutable)\n return new Promise<void>((resolve, reject) => process.nextTick(() => this.immutate(true).then(resolve).catch((err: any) => reject(err))))\n\n let stats: Stats\n\n try {\n stats = await stat(this.filename)\n }\n catch (e: any) {\n if (e.code !== 'ENOENT')\n throw e\n\n return this.reopen(0)\n }\n\n if (!stats.isFile())\n throw new Error(`Can't write on: ${this.filename} (it is not a file)`)\n\n if (initialRotation) {\n this.intervalBounds(this.now())\n const prev = this.prev\n this.intervalBounds(new Date(stats.mtime.getTime()))\n\n if (prev !== this.prev)\n return this.rotate()\n }\n\n this.size = stats.size\n if (!size || stats.size < size)\n return this.reopen(stats.size)\n if (interval)\n this.intervalBounds(this.now())\n\n return this.rotate()\n }\n\n private async makePath(name: string): Promise<string> {\n await mkdir(name.split(sep).slice(0, -1).join(sep), { recursive: true })\n return name\n }\n\n private async reopen(size: number): Promise<void> {\n let file: FileHandle\n\n try {\n file = await open(this.filename, 'a', this.options.mode)\n }\n catch (e: any) {\n if (e.code !== 'ENOENT')\n throw e\n\n await this.makePath(this.filename)\n file = await open(this.filename, 'a', this.options.mode)\n }\n\n this.file = file\n this.size = size\n this.interval()\n this.emit('open', this.filename)\n }\n\n private async reclose(): Promise<void> {\n const { file } = this\n\n if (!file)\n return\n\n this.file = null\n return file.close()\n }\n\n private now(): Date {\n return new Date()\n }\n\n private async rotate(): Promise<void> {\n const { immutable, rotate } = this.options\n\n this.size = 0\n this.rotation = this.now()\n\n this.clear()\n this.emit('rotation')\n await this.reclose()\n\n if (rotate)\n return this.classical()\n if (immutable)\n return this.immutate(false)\n\n return this.move()\n }\n\n private async findName(): Promise<string> {\n const { interval, path, intervalBoundary } = this.options\n\n for (let index = 1; index < 1000; ++index) {\n const filename = (path || '') + this.generator(interval && intervalBoundary ? new Date(this.prev as number) : this.rotation, index)\n\n if (!(await exists(filename)))\n return filename\n }\n\n throw new RotatingFileStreamError()\n }\n\n private async move(): Promise<void> {\n const { compress } = this.options\n\n const filename = await this.findName()\n await this.touch(filename)\n\n if (compress)\n await this.compress(filename)\n else await rename(this.filename, filename)\n\n return this.rotated(filename)\n }\n\n private async touch(filename: string): Promise<void> {\n let file: FileHandle\n\n try {\n file = await this.fsOpen(filename, 'a')\n }\n catch (e: any) {\n if (e.code !== 'ENOENT')\n throw e\n\n await this.makePath(filename)\n file = await open(filename, 'a')\n }\n\n await file.close()\n return this.unlink(filename)\n }\n\n private async classical(): Promise<void> {\n const { compress, path, rotate = 0 } = this.options\n let rotatedName = ''\n\n for (let count = rotate; count > 0; --count) {\n const currName = path + this.generator(count)\n const prevName = count === 1 ? this.filename : path + this.generator(count - 1)\n\n if (!(await exists(prevName)))\n continue\n if (!rotatedName)\n rotatedName = currName\n\n if (count === 1 && compress) {\n await this.compress(currName)\n }\n else {\n try {\n await rename(prevName, currName)\n }\n catch (e: any) {\n if (e.code !== 'ENOENT')\n throw e\n\n await this.makePath(currName)\n await rename(prevName, currName)\n }\n }\n }\n\n return this.rotated(rotatedName)\n }\n\n private clear(): boolean {\n if (this.timeout) {\n clearTimeout(this.timeout as NodeJS.Timeout)\n this.timeout = null\n }\n\n return true\n }\n\n private intervalBoundsBig(now: Date): void {\n const year = this.options.intervalUTC ? now.getUTCFullYear() : now.getFullYear()\n let month = this.options.intervalUTC ? now.getUTCMonth() : now.getMonth()\n let day = this.options.intervalUTC ? now.getUTCDate() : now.getDate()\n let hours = this.options.intervalUTC ? now.getUTCHours() : now.getHours()\n const { num, unit } = this.options.interval!\n\n if (unit === 'M') {\n day = 1\n hours = 0\n }\n else if (unit === 'd') {\n hours = 0\n }\n else {\n hours = Number.parseInt((hours / num) as unknown as string, 10) * num\n }\n\n this.prev = new Date(year, month, day, hours, 0, 0, 0).getTime()\n\n if (unit === 'M')\n month += num\n else if (unit === 'd')\n day += num\n else hours += num\n\n this.next = new Date(year, month, day, hours, 0, 0, 0).getTime()\n }\n\n private intervalBounds(now: Date): Date {\n const unit = this.options.interval!.unit\n\n if (unit === 'M' || unit === 'd' || unit === 'h') {\n this.intervalBoundsBig(now)\n }\n else {\n let period = 1000 * this.options.interval!.num\n\n if (unit === 'm')\n period *= 60\n\n this.prev = Number.parseInt(String(now.getTime() / period), 10) * period\n this.next = this.prev + period\n }\n\n // this.prev is guaranteed to be a number here\n return new Date(this.prev as number)\n }\n\n private interval(): void {\n if (!this.options.interval)\n return\n\n this.intervalBounds(this.now())\n\n const set = async (): Promise<void> => {\n const next = this.next as number\n const time = next - this.now().getTime()\n\n if (time <= 0) {\n try {\n this.timeoutPromise = this.rotate()\n\n await this.timeoutPromise\n this.timeoutPromise = null\n }\n catch (e: any) {}\n }\n else {\n this.timeout = setTimeout(set, time > this.maxTimeout ? this.maxTimeout : time)\n if (this.timeout && typeof (this.timeout as any).unref === 'function')\n (this.timeout as any).unref()\n }\n }\n\n set()\n }\n\n private async compress(filename: string): Promise<void> {\n const { compress } = this.options\n\n if (typeof compress === 'function') {\n await new Promise<void>((resolve, reject) => {\n this.exec(compress(this.filename, filename), (error, stdout, stderr) => {\n this.emit('external', stdout, stderr)\n error ? reject(error) : resolve()\n })\n })\n }\n else {\n await this.gzip(filename)\n }\n\n return this.unlink(this.filename)\n }\n\n private async gzip(filename: string): Promise<void> {\n const { mode } = this.options\n const options = mode ? { mode } : {}\n const inp = this.fsCreateReadStream(this.filename, {})\n const out = this.fsCreateWriteStream(filename, options)\n const zip = this.createGzip()\n\n return new Promise((resolve, reject) => {\n inp.once('error', reject)\n out.once('error', reject)\n zip.once('error', reject)\n out.once('finish', resolve)\n inp.pipe(zip).pipe(out)\n })\n }\n\n private async rotated(filename: string): Promise<void> {\n const { maxFiles, maxSize } = this.options\n\n if (maxFiles || maxSize)\n await this.history(filename)\n\n this.emit('rotated', filename)\n\n return this.reopen(0)\n }\n\n private async history(filename: string): Promise<void> {\n const { history, maxFiles, maxSize } = this.options\n const res: RotationHistory[] = []\n let files = [filename]\n\n try {\n if (history) {\n const content = await this.fsReadFile(history, 'utf8')\n\n files = [...content.toString().split('\\n'), filename]\n }\n }\n catch (e: any) {\n if (e.code !== 'ENOENT')\n throw e\n }\n\n for (const file of files) {\n if (file) {\n try {\n const stats = await this.fsStat(file)\n\n if (stats.isFile()) {\n res.push({\n name: file,\n size: stats.size,\n time: stats.mtime.getTime(),\n })\n }\n else {\n this.emit('warning', new Error(`File '${file}' contained in history is not a regular file`))\n }\n }\n catch (e: any) {\n if (e.code !== 'ENOENT')\n throw e\n }\n }\n }\n\n res.sort((a, b) => a.time - b.time)\n\n if (maxFiles) {\n while (res.length > maxFiles) {\n const file = res.shift()\n\n if (file)\n await this.unlink(file.name)\n if (file)\n this.emit('removed', file.name, true)\n }\n }\n\n if (maxSize) {\n while (res.reduce((size, file) => size + file.size, 0) > maxSize) {\n const file = res.shift()\n\n if (file)\n await this.unlink(file.name)\n if (file)\n this.emit('removed', file.name, false)\n }\n }\n\n if (history)\n await writeFile(history, `${res.map(e => e.name).join('\\n')}\\n`, 'utf-8')\n this.emit('history')\n }\n\n private async immutate(first: boolean): Promise<void> {\n const { size } = this.options\n const now = this.now()\n\n for (let index = 1; index < 1000; ++index) {\n let fileSize = 0\n let stats: Stats | undefined\n\n this.filename = this.options.path + this.generator(now, index)\n\n try {\n const s = await this.fsStat(this.filename)\n stats = s\n }\n catch (e: any) {\n if (e.code !== 'ENOENT')\n throw e\n }\n\n if (stats) {\n fileSize = stats.size\n\n if (!stats.isFile())\n throw new Error(`Can't write on: '${this.filename}' (it is not a file)`)\n if (size && fileSize >= size)\n continue\n }\n\n if (first) {\n this.last = this.filename\n\n return this.reopen(fileSize)\n }\n\n await this.rotated(this.last)\n this.last = this.filename\n\n return\n }\n\n throw new RotatingFileStreamError()\n }\n\n private async unlink(filename: string): Promise<void> {\n try {\n await this.fsUnlink(filename)\n }\n catch (e: any) {\n if (e.code !== 'ENOENT')\n throw e\n\n this.emit('warning', e)\n }\n }\n}\n\nfunction buildNumberCheck(field: string): (type: string, options: Opts, value: number) => void {\n return (type: string, options: Opts, value: number): void => {\n const converted: number = Number.parseInt(String(value), 10)\n\n if (type !== 'number' || Number.isNaN(converted) || converted <= 0)\n throw new Error(`'${field}' option must be a positive integer number`)\n }\n}\n\nfunction buildStringCheck(field: keyof Opts, check: (value: string) => any) {\n return (type: string, options: Opts, value: string): void => {\n if (type !== 'string')\n throw new Error(`Don't know how to handle 'options.${String(field)}' type: ${type}`)\n\n options[field] = check(value) as never\n }\n}\n\nfunction checkMeasure(value: string, what: string, units: any): any {\n const ret: any = {}\n\n ret.num = Number.parseInt(value, 10)\n\n if (Number.isNaN(ret.num))\n throw new Error(`Unknown 'options.${what}' format: ${value}`)\n if (ret.num <= 0)\n throw new Error(`A positive integer number is expected for 'options.${what}'`)\n\n ret.unit = value.replace(/^[ 0]*/g, '').substr((`${ret.num}`).length, 1)\n\n if (ret.unit.length === 0)\n throw new Error(`Missing unit for 'options.${what}'`)\n if (!units[ret.unit])\n throw new Error(`Unknown 'options.${what}' unit: ${ret.unit}`)\n\n return ret\n}\n\nconst intervalUnits: any = { M: true, d: true, h: true, m: true, s: true }\n\nfunction checkIntervalUnit(ret: any, unit: string, amount: number): void {\n if (Number.parseInt((amount / ret.num) as unknown as string, 10) * ret.num !== amount)\n throw new Error(`An integer divider of ${amount} is expected as ${unit} for 'options.interval'`)\n}\n\nfunction checkInterval(value: string): any {\n const ret = checkMeasure(value, 'interval', intervalUnits)\n\n switch (ret.unit) {\n case 'h':\n checkIntervalUnit(ret, 'hours', 24)\n break\n\n case 'm':\n checkIntervalUnit(ret, 'minutes', 60)\n break\n\n case 's':\n checkIntervalUnit(ret, 'seconds', 60)\n break\n }\n\n return ret\n}\n\nconst sizeUnits: any = { B: true, G: true, K: true, M: true }\n\nfunction checkSize(value: string): any {\n const ret = checkMeasure(value, 'size', sizeUnits)\n\n if (ret.unit === 'K')\n return ret.num * 1024\n if (ret.unit === 'M')\n return ret.num * 1048576\n if (ret.unit === 'G')\n return ret.num * 1073741824\n\n return ret.num\n}\n\nconst checks: any = {\n encoding: (type: string, options: Opts, value: string): any => new TextDecoder(value),\n immutable: (): void => {},\n initialRotation: (): void => {},\n interval: buildStringCheck('interval', checkInterval),\n intervalBoundary: (): void => {},\n intervalUTC: (): void => {},\n maxFiles: buildNumberCheck('maxFiles'),\n maxSize: buildStringCheck('maxSize', checkSize),\n mode: (): void => {},\n omitExtension: (): void => {},\n rotate: buildNumberCheck('rotate'),\n size: buildStringCheck('size', checkSize),\n teeToStdout: (): void => {},\n ...{\n compress: (type: string, options: Opts, value: boolean | string | RotationCompressor): any => {\n if (value === false)\n return\n if (!value)\n throw new Error('A value for \\'options.compress\\' must be specified')\n if (type === 'boolean')\n return (options.compress = (source: string, dest: string): string => `cat ${source} | gzip -c9 > ${dest}`)\n if (type === 'function')\n return\n if (type !== 'string')\n throw new Error(`Don't know how to handle 'options.compress' type: ${type}`)\n if ((value as unknown as string) !== 'gzip')\n throw new Error(`Don't know how to handle compression method: ${value}`)\n },\n history: (type: string): void => {\n if (type !== 'string')\n throw new Error(`Don't know how to handle 'options.history' type: ${type}`)\n },\n path: (type: string, options: Opts, value: string): void => {\n if (type !== 'string')\n throw new Error(`Don't know how to handle 'options.path' type: ${type}`)\n if (value.at(-1) !== sep)\n options.path = value + sep\n },\n },\n}\n\nfunction checkOpts(options: RotationOptions): Opts {\n const ret: Opts = {}\n for (const k of Object.keys(options)) {\n const opt = k as keyof RotationOptions\n const value = options[opt]\n const type = typeof value\n\n // assign raw value first\n ;(ret as any)[opt as string] = value as any\n\n if (!(opt in checks))\n throw new Error(`Unknown option: ${opt}`)\n\n checks[opt](type, ret, value as any)\n }\n\n if (!ret.path)\n ret.path = ''\n\n if (!ret.interval) {\n delete ret.immutable\n delete ret.initialRotation\n delete ret.intervalBoundary\n delete ret.intervalUTC\n }\n\n if (ret.rotate) {\n delete ret.history\n delete ret.immutable\n delete ret.maxFiles\n delete ret.maxSize\n delete ret.intervalBoundary\n delete ret.intervalUTC\n }\n\n if (ret.immutable)\n delete ret.compress\n if (!ret.intervalBoundary)\n delete ret.initialRotation\n\n return ret\n}\n\nfunction createClassical(filename: string, compress: boolean, omitExtension: boolean): RotationGenerator {\n return (time: number | Date | null, index?: number): string => {\n const idx = index || 0\n return (idx ? `${filename}.${idx}${compress && !omitExtension ? '.gz' : ''}` : filename)\n }\n}\n\nfunction createGenerator(filename: string, compress: boolean, omitExtension: boolean): RotationGenerator {\n const pad = (num: number): string => (num > 9 ? '' : '0') + num\n\n return (time: number | Date | null, index?: number): string => {\n if (!time)\n return filename\n\n const t = typeof time === 'number' ? new Date(time) : time\n\n const month = `${t.getFullYear()}${pad(t.getMonth() + 1)}`\n const day = pad(t.getDate())\n const hour = pad(t.getHours())\n const minute = pad(t.getMinutes())\n\n return `${month + day}-${hour}${minute}-${pad(index || 0)}-${filename}${compress && !omitExtension ? '.gz' : ''}`\n }\n}\n\nexport function createRotationStream(filename: string | RotationGenerator, options?: RotationOptions): RotatingFileStream {\n if (typeof options === 'undefined')\n options = {}\n else if (typeof options !== 'object')\n throw new Error(`The \"options\" argument must be of type object. Received type ${typeof options}`)\n\n const opts = checkOpts(options)\n const { compress, omitExtension } = opts\n let generator: RotationGenerator\n\n if (typeof filename === 'string')\n generator = (opts.rotate ? createClassical(filename, !!compress, !!omitExtension) : createGenerator(filename, !!compress, !!omitExtension))\n else if (typeof filename === 'function')\n generator = filename\n else throw new Error(`The \"filename\" argument must be one of type string or function. Received type ${typeof filename}`)\n\n return new RotatingFileStream(generator, opts)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"log-rotation.mjs","names":[],"sources":["../../../src/node/log/log-rotation.ts"],"sourcesContent":["// MIT https://github.com/iccicci/rotating-file-stream\n\nimport type { Buffer } from 'node:buffer'\nimport type { Stats } from 'node:fs'\nimport type { FileHandle } from 'node:fs/promises'\nimport type { Gzip } from 'node:zlib'\nimport { exec } from 'node:child_process'\nimport { access, constants, createReadStream, createWriteStream } from 'node:fs'\nimport { mkdir, open, readFile, rename, stat, unlink, writeFile } from 'node:fs/promises'\nimport { sep } from 'node:path'\nimport process from 'node:process'\nimport { Writable } from 'node:stream'\nimport { setTimeout } from 'node:timers'\nimport { TextDecoder } from 'node:util'\nimport { createGzip } from 'node:zlib'\n\nasync function exists(filename: string): Promise<boolean> {\n return new Promise(resolve => access(filename, constants.F_OK, error => resolve(!error)))\n}\n\nexport class RotatingFileStreamError extends Error {\n public code = 'RFS-TOO-MANY'\n\n constructor() {\n super('Too many destination file attempts')\n }\n}\n\nexport type RotationCompressor = (source: string, dest: string) => string\nexport type RotationGenerator = (time: number | Date | null, index?: number) => string\n\n// Flattened event signatures are available via 'RotatingFileStreamEvents' above.\n\nexport type RotationIntervalUnit = 'M' | 'd' | 'h' | 'm' | 's'\nexport type RotationInterval = `${number}${RotationIntervalUnit}`\n\nexport type RotationFileSizeUnit = 'B' | 'K' | 'M' | 'G'\nexport type RotationFileSize = `${number}${RotationFileSizeUnit}`\n\nexport interface RotationOptions {\n compress?: boolean | 'gzip' | RotationCompressor\n encoding?: BufferEncoding\n history?: string\n immutable?: boolean\n initialRotation?: boolean\n interval?: RotationInterval\n intervalBoundary?: boolean\n intervalUTC?: boolean\n maxFiles?: number\n maxSize?: RotationFileSize\n mode?: number\n omitExtension?: boolean\n path?: string\n rotate?: number\n size?: RotationFileSize\n teeToStdout?: boolean\n}\n\ninterface Opts {\n compress?: boolean | 'gzip' | RotationCompressor\n encoding?: BufferEncoding\n history?: string\n immutable?: boolean\n initialRotation?: boolean\n interval?: { num: number, unit: RotationIntervalUnit }\n intervalBoundary?: boolean\n intervalUTC?: boolean\n maxFiles?: number\n maxSize?: number\n mode?: number\n omitExtension?: boolean\n path?: string\n rotate?: number\n size?: number\n teeToStdout?: boolean\n}\n\ntype RotationCallback = (error?: Error) => void\n\ninterface RotationChunk {\n chunk: Buffer\n encoding: BufferEncoding\n}\n\ninterface RotationHistory {\n name: string\n size: number\n time: number\n}\n\nexport class RotatingFileStream extends Writable {\n private createGzip: () => Gzip\n private exec: typeof exec\n private file: FileHandle | null\n private filename: string\n private finished: boolean\n private fsCreateReadStream: typeof createReadStream\n private fsCreateWriteStream: typeof createWriteStream\n private fsOpen: typeof open\n private fsReadFile: typeof readFile\n private fsStat: typeof stat\n private fsUnlink: typeof unlink\n private generator: RotationGenerator\n private last: string\n private maxTimeout: number\n private next: number | null\n private options: Opts\n private size: number\n private stdout: typeof process.stdout\n private prev: number | null\n private rotation: Date | null\n private initPromise: Promise<void> | null\n private timeout: NodeJS.Timeout | null\n private timeoutPromise: Promise<void> | null\n\n constructor(generator: RotationGenerator, options: Opts) {\n const { encoding, history, maxFiles, maxSize, path } = options\n\n super({ decodeStrings: true, defaultEncoding: encoding })\n\n this.createGzip = createGzip\n this.exec = exec\n this.filename = (path || '') + generator(null)\n this.fsCreateReadStream = createReadStream\n this.fsCreateWriteStream = createWriteStream\n this.fsOpen = open\n this.fsReadFile = readFile\n this.fsStat = stat\n this.fsUnlink = unlink\n this.generator = generator\n this.maxTimeout = 2147483640\n this.options = options\n this.stdout = process.stdout\n this.file = null\n this.initPromise = null\n this.timeout = null\n this.timeoutPromise = null\n this.prev = null\n this.next = null\n this.rotation = null\n this.last = ''\n this.finished = false\n this.size = 0\n\n if (maxFiles || maxSize)\n options.history = (path || '') + (history || `${this.generator(null)}.txt`)\n\n this.on('close', () => (this.finished ? null : this.emit('finish')))\n this.on('finish', () => (this.finished = this.clear()));\n\n // In v15 was introduced the _constructor method to delay any _write(), _final() and _destroy() calls\n // Until v16 will be not deprecated we still need this.initPromise\n // https://nodejs.org/api/stream.html#stream_writable_construct_callback\n\n (async () => {\n try {\n this.initPromise = this.init()\n\n await this.initPromise\n this.initPromise = null\n }\n catch (e: any) {}\n })()\n }\n\n _destroy(error: Error, callback: RotationCallback): void {\n this.refinal(error, callback)\n }\n\n _final(callback: RotationCallback): void {\n this.refinal(undefined, callback)\n }\n\n _write(chunk: Buffer, encoding: BufferEncoding, callback: RotationCallback): void {\n this.rewrite([{ chunk, encoding }], 0, callback)\n }\n\n _writev(chunks: RotationChunk[], callback: RotationCallback): void {\n this.rewrite(chunks, 0, callback)\n }\n\n private async refinal(error: Error | undefined, callback: RotationCallback): Promise<void> {\n try {\n this.clear()\n\n if (this.initPromise)\n await this.initPromise\n if (this.timeoutPromise)\n await this.timeoutPromise\n\n await this.reclose()\n }\n catch (e: any) {\n return callback(error || e)\n }\n\n callback(error)\n }\n\n private async rewrite(chunks: RotationChunk[], index: number, callback: RotationCallback): Promise<void> {\n const { size, teeToStdout } = this.options\n\n try {\n if (this.initPromise)\n await this.initPromise\n\n for (let i = 0; i < chunks.length; ++i) {\n const { chunk } = chunks[i]\n\n this.size += chunk.length\n if (this.timeoutPromise)\n await this.timeoutPromise\n await this.file!.write(chunk)\n\n if (teeToStdout && !this.stdout.destroyed)\n this.stdout.write(chunk)\n if (size && this.size >= size)\n await this.rotate()\n }\n }\n catch (e: any) {\n return callback(e)\n }\n\n callback()\n }\n\n private async init(): Promise<void> {\n const { immutable, initialRotation, interval, size } = this.options\n\n // In v15 was introduced the _constructor method to delay any _write(), _final() and _destroy() calls\n // Once v16 will be deprecated we can restore only following line\n // if(immutable) return this.immutate(true);\n if (immutable)\n return new Promise<void>((resolve, reject) => process.nextTick(() => this.immutate(true).then(resolve).catch((err: any) => reject(err))))\n\n let stats: Stats\n\n try {\n stats = await stat(this.filename)\n }\n catch (e: any) {\n if (e.code !== 'ENOENT')\n throw e\n\n return this.reopen(0)\n }\n\n if (!stats.isFile())\n throw new Error(`Can't write on: ${this.filename} (it is not a file)`)\n\n if (initialRotation) {\n this.intervalBounds(this.now())\n const prev = this.prev\n this.intervalBounds(new Date(stats.mtime.getTime()))\n\n if (prev !== this.prev)\n return this.rotate()\n }\n\n this.size = stats.size\n if (!size || stats.size < size)\n return this.reopen(stats.size)\n if (interval)\n this.intervalBounds(this.now())\n\n return this.rotate()\n }\n\n private async makePath(name: string): Promise<string> {\n await mkdir(name.split(sep).slice(0, -1).join(sep), { recursive: true })\n return name\n }\n\n private async reopen(size: number): Promise<void> {\n let file: FileHandle\n\n try {\n file = await open(this.filename, 'a', this.options.mode)\n }\n catch (e: any) {\n if (e.code !== 'ENOENT')\n throw e\n\n await this.makePath(this.filename)\n file = await open(this.filename, 'a', this.options.mode)\n }\n\n this.file = file\n this.size = size\n this.interval()\n this.emit('open', this.filename)\n }\n\n private async reclose(): Promise<void> {\n const { file } = this\n\n if (!file)\n return\n\n this.file = null\n return file.close()\n }\n\n private now(): Date {\n return new Date()\n }\n\n private async rotate(): Promise<void> {\n const { immutable, rotate } = this.options\n\n this.size = 0\n this.rotation = this.now()\n\n this.clear()\n this.emit('rotation')\n await this.reclose()\n\n if (rotate)\n return this.classical()\n if (immutable)\n return this.immutate(false)\n\n return this.move()\n }\n\n private async findName(): Promise<string> {\n const { interval, path, intervalBoundary } = this.options\n\n for (let index = 1; index < 1000; ++index) {\n const filename = (path || '') + this.generator(interval && intervalBoundary ? new Date(this.prev as number) : this.rotation, index)\n\n if (!(await exists(filename)))\n return filename\n }\n\n throw new RotatingFileStreamError()\n }\n\n private async move(): Promise<void> {\n const { compress } = this.options\n\n const filename = await this.findName()\n await this.touch(filename)\n\n if (compress)\n await this.compress(filename)\n else await rename(this.filename, filename)\n\n return this.rotated(filename)\n }\n\n private async touch(filename: string): Promise<void> {\n let file: FileHandle\n\n try {\n file = await this.fsOpen(filename, 'a')\n }\n catch (e: any) {\n if (e.code !== 'ENOENT')\n throw e\n\n await this.makePath(filename)\n file = await open(filename, 'a')\n }\n\n await file.close()\n return this.unlink(filename)\n }\n\n private async classical(): Promise<void> {\n const { compress, path, rotate = 0 } = this.options\n let rotatedName = ''\n\n for (let count = rotate; count > 0; --count) {\n const currName = path + this.generator(count)\n const prevName = count === 1 ? this.filename : path + this.generator(count - 1)\n\n if (!(await exists(prevName)))\n continue\n if (!rotatedName)\n rotatedName = currName\n\n if (count === 1 && compress) {\n await this.compress(currName)\n }\n else {\n try {\n await rename(prevName, currName)\n }\n catch (e: any) {\n if (e.code !== 'ENOENT')\n throw e\n\n await this.makePath(currName)\n await rename(prevName, currName)\n }\n }\n }\n\n return this.rotated(rotatedName)\n }\n\n private clear(): boolean {\n if (this.timeout) {\n clearTimeout(this.timeout as NodeJS.Timeout)\n this.timeout = null\n }\n\n return true\n }\n\n private intervalBoundsBig(now: Date): void {\n const year = this.options.intervalUTC ? now.getUTCFullYear() : now.getFullYear()\n let month = this.options.intervalUTC ? now.getUTCMonth() : now.getMonth()\n let day = this.options.intervalUTC ? now.getUTCDate() : now.getDate()\n let hours = this.options.intervalUTC ? now.getUTCHours() : now.getHours()\n const { num, unit } = this.options.interval!\n\n if (unit === 'M') {\n day = 1\n hours = 0\n }\n else if (unit === 'd') {\n hours = 0\n }\n else {\n hours = Number.parseInt((hours / num) as unknown as string, 10) * num\n }\n\n this.prev = new Date(year, month, day, hours, 0, 0, 0).getTime()\n\n if (unit === 'M')\n month += num\n else if (unit === 'd')\n day += num\n else hours += num\n\n this.next = new Date(year, month, day, hours, 0, 0, 0).getTime()\n }\n\n private intervalBounds(now: Date): Date {\n const unit = this.options.interval!.unit\n\n if (unit === 'M' || unit === 'd' || unit === 'h') {\n this.intervalBoundsBig(now)\n }\n else {\n let period = 1000 * this.options.interval!.num\n\n if (unit === 'm')\n period *= 60\n\n this.prev = Number.parseInt(String(now.getTime() / period), 10) * period\n this.next = this.prev + period\n }\n\n // this.prev is guaranteed to be a number here\n return new Date(this.prev as number)\n }\n\n private interval(): void {\n if (!this.options.interval)\n return\n\n this.intervalBounds(this.now())\n\n const set = async (): Promise<void> => {\n const next = this.next as number\n const time = next - this.now().getTime()\n\n if (time <= 0) {\n try {\n this.timeoutPromise = this.rotate()\n\n await this.timeoutPromise\n this.timeoutPromise = null\n }\n catch (e: any) {}\n }\n else {\n this.timeout = setTimeout(set, time > this.maxTimeout ? this.maxTimeout : time)\n if (this.timeout && typeof (this.timeout as any).unref === 'function')\n (this.timeout as any).unref()\n }\n }\n\n set()\n }\n\n private async compress(filename: string): Promise<void> {\n const { compress } = this.options\n\n if (typeof compress === 'function') {\n await new Promise<void>((resolve, reject) => {\n this.exec(compress(this.filename, filename), (error, stdout, stderr) => {\n this.emit('external', stdout, stderr)\n error ? reject(error) : resolve()\n })\n })\n }\n else {\n await this.gzip(filename)\n }\n\n return this.unlink(this.filename)\n }\n\n private async gzip(filename: string): Promise<void> {\n const { mode } = this.options\n const options = mode ? { mode } : {}\n const inp = this.fsCreateReadStream(this.filename, {})\n const out = this.fsCreateWriteStream(filename, options)\n const zip = this.createGzip()\n\n return new Promise((resolve, reject) => {\n inp.once('error', reject)\n out.once('error', reject)\n zip.once('error', reject)\n out.once('finish', resolve)\n inp.pipe(zip).pipe(out)\n })\n }\n\n private async rotated(filename: string): Promise<void> {\n const { maxFiles, maxSize } = this.options\n\n if (maxFiles || maxSize)\n await this.history(filename)\n\n this.emit('rotated', filename)\n\n return this.reopen(0)\n }\n\n private async history(filename: string): Promise<void> {\n const { history, maxFiles, maxSize } = this.options\n const res: RotationHistory[] = []\n let files = [filename]\n\n try {\n if (history) {\n const content = await this.fsReadFile(history, 'utf8')\n\n files = [...content.toString().split('\\n'), filename]\n }\n }\n catch (e: any) {\n if (e.code !== 'ENOENT')\n throw e\n }\n\n for (const file of files) {\n if (file) {\n try {\n const stats = await this.fsStat(file)\n\n if (stats.isFile()) {\n res.push({\n name: file,\n size: stats.size,\n time: stats.mtime.getTime(),\n })\n }\n else {\n this.emit('warning', new Error(`File '${file}' contained in history is not a regular file`))\n }\n }\n catch (e: any) {\n if (e.code !== 'ENOENT')\n throw e\n }\n }\n }\n\n res.sort((a, b) => a.time - b.time)\n\n if (maxFiles) {\n while (res.length > maxFiles) {\n const file = res.shift()\n\n if (file)\n await this.unlink(file.name)\n if (file)\n this.emit('removed', file.name, true)\n }\n }\n\n if (maxSize) {\n while (res.reduce((size, file) => size + file.size, 0) > maxSize) {\n const file = res.shift()\n\n if (file)\n await this.unlink(file.name)\n if (file)\n this.emit('removed', file.name, false)\n }\n }\n\n if (history)\n await writeFile(history, `${res.map(e => e.name).join('\\n')}\\n`, 'utf-8')\n this.emit('history')\n }\n\n private async immutate(first: boolean): Promise<void> {\n const { size } = this.options\n const now = this.now()\n\n for (let index = 1; index < 1000; ++index) {\n let fileSize = 0\n let stats: Stats | undefined\n\n this.filename = this.options.path + this.generator(now, index)\n\n try {\n const s = await this.fsStat(this.filename)\n stats = s\n }\n catch (e: any) {\n if (e.code !== 'ENOENT')\n throw e\n }\n\n if (stats) {\n fileSize = stats.size\n\n if (!stats.isFile())\n throw new Error(`Can't write on: '${this.filename}' (it is not a file)`)\n if (size && fileSize >= size)\n continue\n }\n\n if (first) {\n this.last = this.filename\n\n return this.reopen(fileSize)\n }\n\n await this.rotated(this.last)\n this.last = this.filename\n\n return\n }\n\n throw new RotatingFileStreamError()\n }\n\n private async unlink(filename: string): Promise<void> {\n try {\n await this.fsUnlink(filename)\n }\n catch (e: any) {\n if (e.code !== 'ENOENT')\n throw e\n\n this.emit('warning', e)\n }\n }\n}\n\nfunction buildNumberCheck(field: string): (type: string, options: Opts, value: number) => void {\n return (type: string, options: Opts, value: number): void => {\n const converted: number = Number.parseInt(String(value), 10)\n\n if (type !== 'number' || Number.isNaN(converted) || converted <= 0)\n throw new Error(`'${field}' option must be a positive integer number`)\n }\n}\n\nfunction buildStringCheck(field: keyof Opts, check: (value: string) => any) {\n return (type: string, options: Opts, value: string): void => {\n if (type !== 'string')\n throw new Error(`Don't know how to handle 'options.${String(field)}' type: ${type}`)\n\n options[field] = check(value) as never\n }\n}\n\nfunction checkMeasure(value: string, what: string, units: any): any {\n const ret: any = {}\n\n ret.num = Number.parseInt(value, 10)\n\n if (Number.isNaN(ret.num))\n throw new Error(`Unknown 'options.${what}' format: ${value}`)\n if (ret.num <= 0)\n throw new Error(`A positive integer number is expected for 'options.${what}'`)\n\n ret.unit = value.replace(/^[ 0]*/g, '').substr((`${ret.num}`).length, 1)\n\n if (ret.unit.length === 0)\n throw new Error(`Missing unit for 'options.${what}'`)\n if (!units[ret.unit])\n throw new Error(`Unknown 'options.${what}' unit: ${ret.unit}`)\n\n return ret\n}\n\nconst intervalUnits: any = { M: true, d: true, h: true, m: true, s: true }\n\nfunction checkIntervalUnit(ret: any, unit: string, amount: number): void {\n if (Number.parseInt((amount / ret.num) as unknown as string, 10) * ret.num !== amount)\n throw new Error(`An integer divider of ${amount} is expected as ${unit} for 'options.interval'`)\n}\n\nfunction checkInterval(value: string): any {\n const ret = checkMeasure(value, 'interval', intervalUnits)\n\n switch (ret.unit) {\n case 'h':\n checkIntervalUnit(ret, 'hours', 24)\n break\n\n case 'm':\n checkIntervalUnit(ret, 'minutes', 60)\n break\n\n case 's':\n checkIntervalUnit(ret, 'seconds', 60)\n break\n }\n\n return ret\n}\n\nconst sizeUnits: any = { B: true, G: true, K: true, M: true }\n\nfunction checkSize(value: string): any {\n const ret = checkMeasure(value, 'size', sizeUnits)\n\n if (ret.unit === 'K')\n return ret.num * 1024\n if (ret.unit === 'M')\n return ret.num * 1048576\n if (ret.unit === 'G')\n return ret.num * 1073741824\n\n return ret.num\n}\n\nconst checks: any = {\n encoding: (type: string, options: Opts, value: string): any => new TextDecoder(value),\n immutable: (): void => {},\n initialRotation: (): void => {},\n interval: buildStringCheck('interval', checkInterval),\n intervalBoundary: (): void => {},\n intervalUTC: (): void => {},\n maxFiles: buildNumberCheck('maxFiles'),\n maxSize: buildStringCheck('maxSize', checkSize),\n mode: (): void => {},\n omitExtension: (): void => {},\n rotate: buildNumberCheck('rotate'),\n size: buildStringCheck('size', checkSize),\n teeToStdout: (): void => {},\n ...{\n compress: (type: string, options: Opts, value: boolean | string | RotationCompressor): any => {\n if (value === false)\n return\n if (!value)\n throw new Error('A value for \\'options.compress\\' must be specified')\n if (type === 'boolean')\n return (options.compress = (source: string, dest: string): string => `cat ${source} | gzip -c9 > ${dest}`)\n if (type === 'function')\n return\n if (type !== 'string')\n throw new Error(`Don't know how to handle 'options.compress' type: ${type}`)\n if ((value as unknown as string) !== 'gzip')\n throw new Error(`Don't know how to handle compression method: ${value}`)\n },\n history: (type: string): void => {\n if (type !== 'string')\n throw new Error(`Don't know how to handle 'options.history' type: ${type}`)\n },\n path: (type: string, options: Opts, value: string): void => {\n if (type !== 'string')\n throw new Error(`Don't know how to handle 'options.path' type: ${type}`)\n if (value.at(-1) !== sep)\n options.path = value + sep\n },\n },\n}\n\nfunction checkOpts(options: RotationOptions): Opts {\n const ret: Opts = {}\n for (const k of Object.keys(options)) {\n const opt = k as keyof RotationOptions\n const value = options[opt]\n const type = typeof value\n\n // assign raw value first\n ;(ret as any)[opt as string] = value as any\n\n if (!(opt in checks))\n throw new Error(`Unknown option: ${opt}`)\n\n checks[opt](type, ret, value as any)\n }\n\n if (!ret.path)\n ret.path = ''\n\n if (!ret.interval) {\n delete ret.immutable\n delete ret.initialRotation\n delete ret.intervalBoundary\n delete ret.intervalUTC\n }\n\n if (ret.rotate) {\n delete ret.history\n delete ret.immutable\n delete ret.maxFiles\n delete ret.maxSize\n delete ret.intervalBoundary\n delete ret.intervalUTC\n }\n\n if (ret.immutable)\n delete ret.compress\n if (!ret.intervalBoundary)\n delete ret.initialRotation\n\n return ret\n}\n\nfunction createClassical(filename: string, compress: boolean, omitExtension: boolean): RotationGenerator {\n return (time: number | Date | null, index?: number): string => {\n const idx = index || 0\n return (idx ? `${filename}.${idx}${compress && !omitExtension ? '.gz' : ''}` : filename)\n }\n}\n\nfunction createGenerator(filename: string, compress: boolean, omitExtension: boolean): RotationGenerator {\n const pad = (num: number): string => (num > 9 ? '' : '0') + num\n\n return (time: number | Date | null, index?: number): string => {\n if (!time)\n return filename\n\n const t = typeof time === 'number' ? new Date(time) : time\n\n const month = `${t.getFullYear()}${pad(t.getMonth() + 1)}`\n const day = pad(t.getDate())\n const hour = pad(t.getHours())\n const minute = pad(t.getMinutes())\n\n return `${month + day}-${hour}${minute}-${pad(index || 0)}-${filename}${compress && !omitExtension ? '.gz' : ''}`\n }\n}\n\nexport function createRotationStream(filename: string | RotationGenerator, options?: RotationOptions): RotatingFileStream {\n if (typeof options === 'undefined')\n options = {}\n else if (typeof options !== 'object')\n throw new Error(`The \"options\" argument must be of type object. Received type ${typeof options}`)\n\n const opts = checkOpts(options)\n const { compress, omitExtension } = opts\n let generator: RotationGenerator\n\n if (typeof filename === 'string')\n generator = (opts.rotate ? createClassical(filename, !!compress, !!omitExtension) : createGenerator(filename, !!compress, !!omitExtension))\n else if (typeof filename === 'function')\n generator = filename\n else throw new Error(`The \"filename\" argument must be one of type string or function. Received type ${typeof filename}`)\n\n return new RotatingFileStream(generator, opts)\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,70 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_chunk = require('../../chunk-uaV2rQ02.cjs');
|
|
3
|
+
const require_common_data_is = require('../../common/data/is.cjs');
|
|
4
|
+
let node_process = require("node:process");
|
|
5
|
+
node_process = require_chunk.__toESM(node_process, 1);
|
|
6
|
+
let node_path = require("node:path");
|
|
7
|
+
|
|
8
|
+
//#region src/node/log/log-util.ts
|
|
9
|
+
function getStackLlocationList(stack) {
|
|
10
|
+
if (typeof stack !== "string") return [];
|
|
11
|
+
return stack?.split("\n").map((rawLine) => {
|
|
12
|
+
const m = rawLine.match(/^\s+at.*(\((.*)\)|file:\/\/(.*)$)|\s*at\s(\/.*)$/);
|
|
13
|
+
if (m) {
|
|
14
|
+
let line = m[3] || m[2] || m[4];
|
|
15
|
+
if (line.endsWith(")")) line = line.slice(0, -1);
|
|
16
|
+
return line;
|
|
17
|
+
}
|
|
18
|
+
})?.filter(require_common_data_is.isNotNull) ?? [];
|
|
19
|
+
}
|
|
20
|
+
function pathStripCwd(path) {
|
|
21
|
+
if (path.includes("/node_modules/")) return "";
|
|
22
|
+
if (path.startsWith("file://")) return path.substr(7);
|
|
23
|
+
const cwd = (0, node_path.resolve)(node_process.default.cwd());
|
|
24
|
+
if (cwd && path.startsWith(cwd)) return path.substr(cwd.length + 1);
|
|
25
|
+
const home = node_process.default.env?.HOME ? (0, node_path.resolve)(node_process.default.env?.HOME) : "";
|
|
26
|
+
if (home && path.startsWith(home)) path = `~/${path.substr(home.length + 1)}`;
|
|
27
|
+
return path;
|
|
28
|
+
}
|
|
29
|
+
function extractFileInfo(stackLine) {
|
|
30
|
+
const m = stackLine.match(/^\s*at.*(\((.*)\)|file:\/\/(.*)$)|\s*at\s(\/.*)$/);
|
|
31
|
+
if (m) {
|
|
32
|
+
let line = m[3] || m[2] || m[4];
|
|
33
|
+
if (line.endsWith(")")) line = line.slice(0, -1);
|
|
34
|
+
return line;
|
|
35
|
+
}
|
|
36
|
+
return "";
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get the source code location of the caller
|
|
40
|
+
* https://stackoverflow.com/a/47296370/140927
|
|
41
|
+
*
|
|
42
|
+
* @param level Number of levels to go down the stack trace
|
|
43
|
+
* @param stripCwd Strip the current working directory, only reasonable for Node.js environment
|
|
44
|
+
*/
|
|
45
|
+
function getSourceLocation(level = 2, stripCwd = true) {
|
|
46
|
+
let line = getStackLlocationList((/* @__PURE__ */ new Error("stack")).stack || "")?.[level];
|
|
47
|
+
if (line && stripCwd) line = pathStripCwd(line);
|
|
48
|
+
return line || "";
|
|
49
|
+
}
|
|
50
|
+
function getStack() {
|
|
51
|
+
return (/* @__PURE__ */ new Error("stack")).stack || "";
|
|
52
|
+
}
|
|
53
|
+
function getSourceLocationByPrecedingPattern(patterns, stripCwd = true) {
|
|
54
|
+
let line = "";
|
|
55
|
+
const stack = (/* @__PURE__ */ new Error("stack")).stack || "";
|
|
56
|
+
if (typeof stack === "string") {
|
|
57
|
+
const lines = stack.split("\n").map((l) => l.trim());
|
|
58
|
+
line = lines[lines.findIndex((l) => patterns.some((p) => l.startsWith(p))) + 1];
|
|
59
|
+
if (line) line = extractFileInfo(line);
|
|
60
|
+
if (line && stripCwd) line = pathStripCwd(line);
|
|
61
|
+
}
|
|
62
|
+
return line;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
//#endregion
|
|
66
|
+
exports.getSourceLocation = getSourceLocation;
|
|
67
|
+
exports.getSourceLocationByPrecedingPattern = getSourceLocationByPrecedingPattern;
|
|
68
|
+
exports.getStack = getStack;
|
|
69
|
+
exports.getStackLlocationList = getStackLlocationList;
|
|
4
70
|
//# sourceMappingURL=log-util.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-util.cjs","names":["isNotNull","process"],"sources":["../../../src/node/log/log-util.ts"],"sourcesContent":["import { resolve } from 'node:path'\nimport process from 'node:process'\nimport { isNotNull } from '../../common/data/is'\n\nexport function getStackLlocationList(stack: string): string[] {\n if (typeof stack !== 'string')\n return []\n // console.log(\"stack\", stack)\n return (\n stack?.split('\\n').map((rawLine) => {\n const m = rawLine.match(\n // eslint-disable-next-line regexp/no-super-linear-backtracking\n /^\\s+at.*(\\((.*)\\)|file:\\/\\/(.*)$)|\\s*at\\s(\\/.*)$/,\n )\n if (m) {\n let line = m[3] || m[2] || m[4]\n if (line.endsWith(')'))\n line = line.slice(0, -1)\n return line\n }\n return undefined\n })?.filter(isNotNull) ?? []\n )\n}\n\nfunction pathStripCwd(path: string) {\n if (path.includes('/node_modules/'))\n return ''\n\n const fileURL = 'file://'\n if (path.startsWith(fileURL))\n return path.substr(fileURL.length)\n\n const cwd = resolve(process.cwd())\n if (cwd && path.startsWith(cwd))\n return path.substr(cwd.length + 1)\n\n const home = process.env?.HOME ? resolve(process.env?.HOME) : ''\n if (home && path.startsWith(home))\n path = `~/${path.substr(home.length + 1)}`\n\n return path\n}\n\nfunction extractFileInfo(stackLine: string): string {\n // eslint-disable-next-line regexp/no-super-linear-backtracking\n const m = stackLine.match(/^\\s*at.*(\\((.*)\\)|file:\\/\\/(.*)$)|\\s*at\\s(\\/.*)$/)\n if (m) {\n let line = m[3] || m[2] || m[4]\n if (line.endsWith(')'))\n line = line.slice(0, -1)\n return line\n }\n return ''\n}\n\n/**\n * Get the source code location of the caller\n * https://stackoverflow.com/a/47296370/140927\n *\n * @param level Number of levels to go down the stack trace\n * @param stripCwd Strip the current working directory, only reasonable for Node.js environment\n */\nexport function getSourceLocation(level = 2, stripCwd = true): string {\n const stack = new Error('stack').stack || ''\n let line: string | undefined = getStackLlocationList(stack)?.[level]\n if (line && stripCwd)\n line = pathStripCwd(line)\n\n return line || ''\n}\n\nexport function getStack(): string {\n return new Error('stack').stack || ''\n}\n\nexport function getSourceLocationByPrecedingPattern(\n patterns: string[],\n stripCwd = true,\n) {\n let line = ''\n const stack = new Error('stack').stack || ''\n if (typeof stack === 'string') {\n const lines = stack.split('\\n').map(l => l.trim())\n // console.log(lines)\n const index = lines.findIndex(l => patterns.some(p => l.startsWith(p)))\n line = lines[index + 1]\n if (line)\n line = extractFileInfo(line)\n\n if (line && stripCwd)\n line = pathStripCwd(line)\n }\n return line\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"log-util.cjs","names":["isNotNull","process"],"sources":["../../../src/node/log/log-util.ts"],"sourcesContent":["import { resolve } from 'node:path'\nimport process from 'node:process'\nimport { isNotNull } from '../../common/data/is'\n\nexport function getStackLlocationList(stack: string): string[] {\n if (typeof stack !== 'string')\n return []\n // console.log(\"stack\", stack)\n return (\n stack?.split('\\n').map((rawLine) => {\n const m = rawLine.match(\n // eslint-disable-next-line regexp/no-super-linear-backtracking\n /^\\s+at.*(\\((.*)\\)|file:\\/\\/(.*)$)|\\s*at\\s(\\/.*)$/,\n )\n if (m) {\n let line = m[3] || m[2] || m[4]\n if (line.endsWith(')'))\n line = line.slice(0, -1)\n return line\n }\n return undefined\n })?.filter(isNotNull) ?? []\n )\n}\n\nfunction pathStripCwd(path: string) {\n if (path.includes('/node_modules/'))\n return ''\n\n const fileURL = 'file://'\n if (path.startsWith(fileURL))\n return path.substr(fileURL.length)\n\n const cwd = resolve(process.cwd())\n if (cwd && path.startsWith(cwd))\n return path.substr(cwd.length + 1)\n\n const home = process.env?.HOME ? resolve(process.env?.HOME) : ''\n if (home && path.startsWith(home))\n path = `~/${path.substr(home.length + 1)}`\n\n return path\n}\n\nfunction extractFileInfo(stackLine: string): string {\n // eslint-disable-next-line regexp/no-super-linear-backtracking\n const m = stackLine.match(/^\\s*at.*(\\((.*)\\)|file:\\/\\/(.*)$)|\\s*at\\s(\\/.*)$/)\n if (m) {\n let line = m[3] || m[2] || m[4]\n if (line.endsWith(')'))\n line = line.slice(0, -1)\n return line\n }\n return ''\n}\n\n/**\n * Get the source code location of the caller\n * https://stackoverflow.com/a/47296370/140927\n *\n * @param level Number of levels to go down the stack trace\n * @param stripCwd Strip the current working directory, only reasonable for Node.js environment\n */\nexport function getSourceLocation(level = 2, stripCwd = true): string {\n const stack = new Error('stack').stack || ''\n let line: string | undefined = getStackLlocationList(stack)?.[level]\n if (line && stripCwd)\n line = pathStripCwd(line)\n\n return line || ''\n}\n\nexport function getStack(): string {\n return new Error('stack').stack || ''\n}\n\nexport function getSourceLocationByPrecedingPattern(\n patterns: string[],\n stripCwd = true,\n) {\n let line = ''\n const stack = new Error('stack').stack || ''\n if (typeof stack === 'string') {\n const lines = stack.split('\\n').map(l => l.trim())\n // console.log(lines)\n const index = lines.findIndex(l => patterns.some(p => l.startsWith(p)))\n line = lines[index + 1]\n if (line)\n line = extractFileInfo(line)\n\n if (line && stripCwd)\n line = pathStripCwd(line)\n }\n return line\n}\n"],"mappings":";;;;;;;;AAIA,SAAgB,sBAAsB,OAAyB;AAC7D,KAAI,OAAO,UAAU,SACnB,QAAO,EAAE;AAEX,QACE,OAAO,MAAM,KAAK,CAAC,KAAK,YAAY;EAClC,MAAM,IAAI,QAAQ,MAEhB,mDACD;AACD,MAAI,GAAG;GACL,IAAI,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE;AAC7B,OAAI,KAAK,SAAS,IAAI,CACpB,QAAO,KAAK,MAAM,GAAG,GAAG;AAC1B,UAAO;;GAGT,EAAE,OAAOA,iCAAU,IAAI,EAAE;;AAI/B,SAAS,aAAa,MAAc;AAClC,KAAI,KAAK,SAAS,iBAAiB,CACjC,QAAO;AAGT,KAAI,KAAK,WADO,UACY,CAC1B,QAAO,KAAK,OAAO,EAAe;CAEpC,MAAM,6BAAcC,qBAAQ,KAAK,CAAC;AAClC,KAAI,OAAO,KAAK,WAAW,IAAI,CAC7B,QAAO,KAAK,OAAO,IAAI,SAAS,EAAE;CAEpC,MAAM,OAAOA,qBAAQ,KAAK,8BAAeA,qBAAQ,KAAK,KAAK,GAAG;AAC9D,KAAI,QAAQ,KAAK,WAAW,KAAK,CAC/B,QAAO,KAAK,KAAK,OAAO,KAAK,SAAS,EAAE;AAE1C,QAAO;;AAGT,SAAS,gBAAgB,WAA2B;CAElD,MAAM,IAAI,UAAU,MAAM,mDAAmD;AAC7E,KAAI,GAAG;EACL,IAAI,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE;AAC7B,MAAI,KAAK,SAAS,IAAI,CACpB,QAAO,KAAK,MAAM,GAAG,GAAG;AAC1B,SAAO;;AAET,QAAO;;;;;;;;;AAUT,SAAgB,kBAAkB,QAAQ,GAAG,WAAW,MAAc;CAEpE,IAAI,OAA2B,uCADjB,IAAI,MAAM,QAAQ,EAAC,SAAS,GACiB,GAAG;AAC9D,KAAI,QAAQ,SACV,QAAO,aAAa,KAAK;AAE3B,QAAO,QAAQ;;AAGjB,SAAgB,WAAmB;AACjC,yBAAO,IAAI,MAAM,QAAQ,EAAC,SAAS;;AAGrC,SAAgB,oCACd,UACA,WAAW,MACX;CACA,IAAI,OAAO;CACX,MAAM,yBAAQ,IAAI,MAAM,QAAQ,EAAC,SAAS;AAC1C,KAAI,OAAO,UAAU,UAAU;EAC7B,MAAM,QAAQ,MAAM,MAAM,KAAK,CAAC,KAAI,MAAK,EAAE,MAAM,CAAC;AAGlD,SAAO,MADO,MAAM,WAAU,MAAK,SAAS,MAAK,MAAK,EAAE,WAAW,EAAE,CAAC,CAAC,GAClD;AACrB,MAAI,KACF,QAAO,gBAAgB,KAAK;AAE9B,MAAI,QAAQ,SACV,QAAO,aAAa,KAAK;;AAE7B,QAAO"}
|
|
@@ -1,4 +1,64 @@
|
|
|
1
|
-
import{isNotNull
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { isNotNull } from "../../common/data/is.mjs";
|
|
2
|
+
import process from "node:process";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
|
|
5
|
+
//#region src/node/log/log-util.ts
|
|
6
|
+
function getStackLlocationList(stack) {
|
|
7
|
+
if (typeof stack !== "string") return [];
|
|
8
|
+
return stack?.split("\n").map((rawLine) => {
|
|
9
|
+
const m = rawLine.match(/^\s+at.*(\((.*)\)|file:\/\/(.*)$)|\s*at\s(\/.*)$/);
|
|
10
|
+
if (m) {
|
|
11
|
+
let line = m[3] || m[2] || m[4];
|
|
12
|
+
if (line.endsWith(")")) line = line.slice(0, -1);
|
|
13
|
+
return line;
|
|
14
|
+
}
|
|
15
|
+
})?.filter(isNotNull) ?? [];
|
|
16
|
+
}
|
|
17
|
+
function pathStripCwd(path) {
|
|
18
|
+
if (path.includes("/node_modules/")) return "";
|
|
19
|
+
if (path.startsWith("file://")) return path.substr(7);
|
|
20
|
+
const cwd = resolve(process.cwd());
|
|
21
|
+
if (cwd && path.startsWith(cwd)) return path.substr(cwd.length + 1);
|
|
22
|
+
const home = process.env?.HOME ? resolve(process.env?.HOME) : "";
|
|
23
|
+
if (home && path.startsWith(home)) path = `~/${path.substr(home.length + 1)}`;
|
|
24
|
+
return path;
|
|
25
|
+
}
|
|
26
|
+
function extractFileInfo(stackLine) {
|
|
27
|
+
const m = stackLine.match(/^\s*at.*(\((.*)\)|file:\/\/(.*)$)|\s*at\s(\/.*)$/);
|
|
28
|
+
if (m) {
|
|
29
|
+
let line = m[3] || m[2] || m[4];
|
|
30
|
+
if (line.endsWith(")")) line = line.slice(0, -1);
|
|
31
|
+
return line;
|
|
32
|
+
}
|
|
33
|
+
return "";
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get the source code location of the caller
|
|
37
|
+
* https://stackoverflow.com/a/47296370/140927
|
|
38
|
+
*
|
|
39
|
+
* @param level Number of levels to go down the stack trace
|
|
40
|
+
* @param stripCwd Strip the current working directory, only reasonable for Node.js environment
|
|
41
|
+
*/
|
|
42
|
+
function getSourceLocation(level = 2, stripCwd = true) {
|
|
43
|
+
let line = getStackLlocationList((/* @__PURE__ */ new Error("stack")).stack || "")?.[level];
|
|
44
|
+
if (line && stripCwd) line = pathStripCwd(line);
|
|
45
|
+
return line || "";
|
|
46
|
+
}
|
|
47
|
+
function getStack() {
|
|
48
|
+
return (/* @__PURE__ */ new Error("stack")).stack || "";
|
|
49
|
+
}
|
|
50
|
+
function getSourceLocationByPrecedingPattern(patterns, stripCwd = true) {
|
|
51
|
+
let line = "";
|
|
52
|
+
const stack = (/* @__PURE__ */ new Error("stack")).stack || "";
|
|
53
|
+
if (typeof stack === "string") {
|
|
54
|
+
const lines = stack.split("\n").map((l) => l.trim());
|
|
55
|
+
line = lines[lines.findIndex((l) => patterns.some((p) => l.startsWith(p))) + 1];
|
|
56
|
+
if (line) line = extractFileInfo(line);
|
|
57
|
+
if (line && stripCwd) line = pathStripCwd(line);
|
|
58
|
+
}
|
|
59
|
+
return line;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
//#endregion
|
|
63
|
+
export { getSourceLocation, getSourceLocationByPrecedingPattern, getStack, getStackLlocationList };
|
|
4
64
|
//# sourceMappingURL=log-util.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-util.mjs","names":[],"sources":["../../../src/node/log/log-util.ts"],"sourcesContent":["import { resolve } from 'node:path'\nimport process from 'node:process'\nimport { isNotNull } from '../../common/data/is'\n\nexport function getStackLlocationList(stack: string): string[] {\n if (typeof stack !== 'string')\n return []\n // console.log(\"stack\", stack)\n return (\n stack?.split('\\n').map((rawLine) => {\n const m = rawLine.match(\n // eslint-disable-next-line regexp/no-super-linear-backtracking\n /^\\s+at.*(\\((.*)\\)|file:\\/\\/(.*)$)|\\s*at\\s(\\/.*)$/,\n )\n if (m) {\n let line = m[3] || m[2] || m[4]\n if (line.endsWith(')'))\n line = line.slice(0, -1)\n return line\n }\n return undefined\n })?.filter(isNotNull) ?? []\n )\n}\n\nfunction pathStripCwd(path: string) {\n if (path.includes('/node_modules/'))\n return ''\n\n const fileURL = 'file://'\n if (path.startsWith(fileURL))\n return path.substr(fileURL.length)\n\n const cwd = resolve(process.cwd())\n if (cwd && path.startsWith(cwd))\n return path.substr(cwd.length + 1)\n\n const home = process.env?.HOME ? resolve(process.env?.HOME) : ''\n if (home && path.startsWith(home))\n path = `~/${path.substr(home.length + 1)}`\n\n return path\n}\n\nfunction extractFileInfo(stackLine: string): string {\n // eslint-disable-next-line regexp/no-super-linear-backtracking\n const m = stackLine.match(/^\\s*at.*(\\((.*)\\)|file:\\/\\/(.*)$)|\\s*at\\s(\\/.*)$/)\n if (m) {\n let line = m[3] || m[2] || m[4]\n if (line.endsWith(')'))\n line = line.slice(0, -1)\n return line\n }\n return ''\n}\n\n/**\n * Get the source code location of the caller\n * https://stackoverflow.com/a/47296370/140927\n *\n * @param level Number of levels to go down the stack trace\n * @param stripCwd Strip the current working directory, only reasonable for Node.js environment\n */\nexport function getSourceLocation(level = 2, stripCwd = true): string {\n const stack = new Error('stack').stack || ''\n let line: string | undefined = getStackLlocationList(stack)?.[level]\n if (line && stripCwd)\n line = pathStripCwd(line)\n\n return line || ''\n}\n\nexport function getStack(): string {\n return new Error('stack').stack || ''\n}\n\nexport function getSourceLocationByPrecedingPattern(\n patterns: string[],\n stripCwd = true,\n) {\n let line = ''\n const stack = new Error('stack').stack || ''\n if (typeof stack === 'string') {\n const lines = stack.split('\\n').map(l => l.trim())\n // console.log(lines)\n const index = lines.findIndex(l => patterns.some(p => l.startsWith(p)))\n line = lines[index + 1]\n if (line)\n line = extractFileInfo(line)\n\n if (line && stripCwd)\n line = pathStripCwd(line)\n }\n return line\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"log-util.mjs","names":[],"sources":["../../../src/node/log/log-util.ts"],"sourcesContent":["import { resolve } from 'node:path'\nimport process from 'node:process'\nimport { isNotNull } from '../../common/data/is'\n\nexport function getStackLlocationList(stack: string): string[] {\n if (typeof stack !== 'string')\n return []\n // console.log(\"stack\", stack)\n return (\n stack?.split('\\n').map((rawLine) => {\n const m = rawLine.match(\n // eslint-disable-next-line regexp/no-super-linear-backtracking\n /^\\s+at.*(\\((.*)\\)|file:\\/\\/(.*)$)|\\s*at\\s(\\/.*)$/,\n )\n if (m) {\n let line = m[3] || m[2] || m[4]\n if (line.endsWith(')'))\n line = line.slice(0, -1)\n return line\n }\n return undefined\n })?.filter(isNotNull) ?? []\n )\n}\n\nfunction pathStripCwd(path: string) {\n if (path.includes('/node_modules/'))\n return ''\n\n const fileURL = 'file://'\n if (path.startsWith(fileURL))\n return path.substr(fileURL.length)\n\n const cwd = resolve(process.cwd())\n if (cwd && path.startsWith(cwd))\n return path.substr(cwd.length + 1)\n\n const home = process.env?.HOME ? resolve(process.env?.HOME) : ''\n if (home && path.startsWith(home))\n path = `~/${path.substr(home.length + 1)}`\n\n return path\n}\n\nfunction extractFileInfo(stackLine: string): string {\n // eslint-disable-next-line regexp/no-super-linear-backtracking\n const m = stackLine.match(/^\\s*at.*(\\((.*)\\)|file:\\/\\/(.*)$)|\\s*at\\s(\\/.*)$/)\n if (m) {\n let line = m[3] || m[2] || m[4]\n if (line.endsWith(')'))\n line = line.slice(0, -1)\n return line\n }\n return ''\n}\n\n/**\n * Get the source code location of the caller\n * https://stackoverflow.com/a/47296370/140927\n *\n * @param level Number of levels to go down the stack trace\n * @param stripCwd Strip the current working directory, only reasonable for Node.js environment\n */\nexport function getSourceLocation(level = 2, stripCwd = true): string {\n const stack = new Error('stack').stack || ''\n let line: string | undefined = getStackLlocationList(stack)?.[level]\n if (line && stripCwd)\n line = pathStripCwd(line)\n\n return line || ''\n}\n\nexport function getStack(): string {\n return new Error('stack').stack || ''\n}\n\nexport function getSourceLocationByPrecedingPattern(\n patterns: string[],\n stripCwd = true,\n) {\n let line = ''\n const stack = new Error('stack').stack || ''\n if (typeof stack === 'string') {\n const lines = stack.split('\\n').map(l => l.trim())\n // console.log(lines)\n const index = lines.findIndex(l => patterns.some(p => l.startsWith(p)))\n line = lines[index + 1]\n if (line)\n line = extractFileInfo(line)\n\n if (line && stripCwd)\n line = pathStripCwd(line)\n }\n return line\n}\n"],"mappings":";;;;;AAIA,SAAgB,sBAAsB,OAAyB;AAC7D,KAAI,OAAO,UAAU,SACnB,QAAO,EAAE;AAEX,QACE,OAAO,MAAM,KAAK,CAAC,KAAK,YAAY;EAClC,MAAM,IAAI,QAAQ,MAEhB,mDACD;AACD,MAAI,GAAG;GACL,IAAI,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE;AAC7B,OAAI,KAAK,SAAS,IAAI,CACpB,QAAO,KAAK,MAAM,GAAG,GAAG;AAC1B,UAAO;;GAGT,EAAE,OAAO,UAAU,IAAI,EAAE;;AAI/B,SAAS,aAAa,MAAc;AAClC,KAAI,KAAK,SAAS,iBAAiB,CACjC,QAAO;AAGT,KAAI,KAAK,WADO,UACY,CAC1B,QAAO,KAAK,OAAO,EAAe;CAEpC,MAAM,MAAM,QAAQ,QAAQ,KAAK,CAAC;AAClC,KAAI,OAAO,KAAK,WAAW,IAAI,CAC7B,QAAO,KAAK,OAAO,IAAI,SAAS,EAAE;CAEpC,MAAM,OAAO,QAAQ,KAAK,OAAO,QAAQ,QAAQ,KAAK,KAAK,GAAG;AAC9D,KAAI,QAAQ,KAAK,WAAW,KAAK,CAC/B,QAAO,KAAK,KAAK,OAAO,KAAK,SAAS,EAAE;AAE1C,QAAO;;AAGT,SAAS,gBAAgB,WAA2B;CAElD,MAAM,IAAI,UAAU,MAAM,mDAAmD;AAC7E,KAAI,GAAG;EACL,IAAI,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE;AAC7B,MAAI,KAAK,SAAS,IAAI,CACpB,QAAO,KAAK,MAAM,GAAG,GAAG;AAC1B,SAAO;;AAET,QAAO;;;;;;;;;AAUT,SAAgB,kBAAkB,QAAQ,GAAG,WAAW,MAAc;CAEpE,IAAI,OAA2B,uCADjB,IAAI,MAAM,QAAQ,EAAC,SAAS,GACiB,GAAG;AAC9D,KAAI,QAAQ,SACV,QAAO,aAAa,KAAK;AAE3B,QAAO,QAAQ;;AAGjB,SAAgB,WAAmB;AACjC,yBAAO,IAAI,MAAM,QAAQ,EAAC,SAAS;;AAGrC,SAAgB,oCACd,UACA,WAAW,MACX;CACA,IAAI,OAAO;CACX,MAAM,yBAAQ,IAAI,MAAM,QAAQ,EAAC,SAAS;AAC1C,KAAI,OAAO,UAAU,UAAU;EAC7B,MAAM,QAAQ,MAAM,MAAM,KAAK,CAAC,KAAI,MAAK,EAAE,MAAM,CAAC;AAGlD,SAAO,MADO,MAAM,WAAU,MAAK,SAAS,MAAK,MAAK,EAAE,WAAW,EAAE,CAAC,CAAC,GAClD;AACrB,MAAI,KACF,QAAO,gBAAgB,KAAK;AAE9B,MAAI,QAAQ,SACV,QAAO,aAAa,KAAK;;AAE7B,QAAO"}
|
|
@@ -1,2 +1,21 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_chunk = require('../chunk-uaV2rQ02.cjs');
|
|
3
|
+
let node_child_process = require("node:child_process");
|
|
4
|
+
let node_os = require("node:os");
|
|
5
|
+
|
|
6
|
+
//#region src/node/open-browser.ts
|
|
7
|
+
function openBrowser(url) {
|
|
8
|
+
switch ((0, node_os.platform)()) {
|
|
9
|
+
case "darwin":
|
|
10
|
+
(0, node_child_process.exec)(`open -u ${url}`);
|
|
11
|
+
break;
|
|
12
|
+
case "win32":
|
|
13
|
+
(0, node_child_process.exec)(`start ${url}`);
|
|
14
|
+
break;
|
|
15
|
+
default: (0, node_child_process.exec)(`xdg-open ${url}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
//#endregion
|
|
20
|
+
exports.openBrowser = openBrowser;
|
|
2
21
|
//# sourceMappingURL=open-browser.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open-browser.cjs","names":[],"sources":["../../src/node/open-browser.ts"],"sourcesContent":["// Open URL in default browser on macOS, Linux, and Windows\nimport { exec } from 'node:child_process'\nimport { platform } from 'node:os'\n\nexport function openBrowser(url: string) {\n switch (platform()) {\n case 'darwin':\n exec(`open -u ${url}`)\n break\n case 'win32':\n exec(`start ${url}`)\n break\n default:\n exec(`xdg-open ${url}`)\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"open-browser.cjs","names":[],"sources":["../../src/node/open-browser.ts"],"sourcesContent":["// Open URL in default browser on macOS, Linux, and Windows\nimport { exec } from 'node:child_process'\nimport { platform } from 'node:os'\n\nexport function openBrowser(url: string) {\n switch (platform()) {\n case 'darwin':\n exec(`open -u ${url}`)\n break\n case 'win32':\n exec(`start ${url}`)\n break\n default:\n exec(`xdg-open ${url}`)\n }\n}\n"],"mappings":";;;;;;AAIA,SAAgB,YAAY,KAAa;AACvC,gCAAkB,EAAlB;EACE,KAAK;AACH,gCAAK,WAAW,MAAM;AACtB;EACF,KAAK;AACH,gCAAK,SAAS,MAAM;AACpB;EACF,QACE,8BAAK,YAAY,MAAM"}
|
|
@@ -1,2 +1,19 @@
|
|
|
1
|
-
import{exec
|
|
1
|
+
import { exec } from "node:child_process";
|
|
2
|
+
import { platform } from "node:os";
|
|
3
|
+
|
|
4
|
+
//#region src/node/open-browser.ts
|
|
5
|
+
function openBrowser(url) {
|
|
6
|
+
switch (platform()) {
|
|
7
|
+
case "darwin":
|
|
8
|
+
exec(`open -u ${url}`);
|
|
9
|
+
break;
|
|
10
|
+
case "win32":
|
|
11
|
+
exec(`start ${url}`);
|
|
12
|
+
break;
|
|
13
|
+
default: exec(`xdg-open ${url}`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
//#endregion
|
|
18
|
+
export { openBrowser };
|
|
2
19
|
//# sourceMappingURL=open-browser.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open-browser.mjs","names":[],"sources":["../../src/node/open-browser.ts"],"sourcesContent":["// Open URL in default browser on macOS, Linux, and Windows\nimport { exec } from 'node:child_process'\nimport { platform } from 'node:os'\n\nexport function openBrowser(url: string) {\n switch (platform()) {\n case 'darwin':\n exec(`open -u ${url}`)\n break\n case 'win32':\n exec(`start ${url}`)\n break\n default:\n exec(`xdg-open ${url}`)\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"open-browser.mjs","names":[],"sources":["../../src/node/open-browser.ts"],"sourcesContent":["// Open URL in default browser on macOS, Linux, and Windows\nimport { exec } from 'node:child_process'\nimport { platform } from 'node:os'\n\nexport function openBrowser(url: string) {\n switch (platform()) {\n case 'darwin':\n exec(`open -u ${url}`)\n break\n case 'win32':\n exec(`start ${url}`)\n break\n default:\n exec(`xdg-open ${url}`)\n }\n}\n"],"mappings":";;;;AAIA,SAAgB,YAAY,KAAa;AACvC,SAAQ,UAAU,EAAlB;EACE,KAAK;AACH,QAAK,WAAW,MAAM;AACtB;EACF,KAAK;AACH,QAAK,SAAS,MAAM;AACpB;EACF,QACE,MAAK,YAAY,MAAM"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zeed",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.
|
|
5
|
-
"packageManager": "pnpm@10.
|
|
4
|
+
"version": "1.4.0",
|
|
5
|
+
"packageManager": "pnpm@10.33.0",
|
|
6
6
|
"description": "🌱 Simple foundation library",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "Dirk Holtwick",
|
|
@@ -81,19 +81,19 @@
|
|
|
81
81
|
"prep": "nr lint:fix && nr check && nr test:release && nr upload:docs"
|
|
82
82
|
},
|
|
83
83
|
"devDependencies": {
|
|
84
|
-
"@antfu/eslint-config": "^
|
|
85
|
-
"@antfu/ni": "^
|
|
86
|
-
"@types/node": "^25.
|
|
87
|
-
"@vitejs/plugin-vue": "^6.0.
|
|
88
|
-
"@vitest/browser": "^4.1.
|
|
89
|
-
"@vitest/coverage-v8": "^4.1.
|
|
90
|
-
"esbuild": "^0.
|
|
91
|
-
"eslint": "^10.0
|
|
92
|
-
"playwright": "^1.
|
|
84
|
+
"@antfu/eslint-config": "^8.2.0",
|
|
85
|
+
"@antfu/ni": "^30.0.0",
|
|
86
|
+
"@types/node": "^25.6.0",
|
|
87
|
+
"@vitejs/plugin-vue": "^6.0.6",
|
|
88
|
+
"@vitest/browser": "^4.1.4",
|
|
89
|
+
"@vitest/coverage-v8": "^4.1.4",
|
|
90
|
+
"esbuild": "^0.28.0",
|
|
91
|
+
"eslint": "^10.2.0",
|
|
92
|
+
"playwright": "^1.59.1",
|
|
93
93
|
"pnpm": "^10.32.1",
|
|
94
|
-
"tsdown": "^0.21.
|
|
95
|
-
"typescript": "^
|
|
96
|
-
"vite": "^8.0.
|
|
97
|
-
"vitest": "^4.1.
|
|
94
|
+
"tsdown": "^0.21.8",
|
|
95
|
+
"typescript": "^6.0.2",
|
|
96
|
+
"vite": "^8.0.8",
|
|
97
|
+
"vitest": "^4.1.4"
|
|
98
98
|
}
|
|
99
99
|
}
|