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":"object.mjs","names":[],"sources":["../../../src/common/data/object.ts"],"sourcesContent":["import { isArray, isBinaryArray, isObject, isPrimitive, isSymbol } from './is'\n\n/** Like `.map()` for object. Return new key and value or `undefined` to delete. */\nexport function objectMap<T = any>(\n obj: any,\n fn: (key: string, value: any) => [key: string, value: T] | T | undefined | null,\n): Record<string, T> {\n if (!isObject(obj))\n return {}\n return Object.fromEntries(\n Object.entries(obj)\n .map(([k, v]) => {\n const r = fn(k, v)\n if (isArray(r) && r.length === 2)\n return r\n return [k, r]\n })\n .filter(v => v != null),\n )\n}\n\n/** Like `.filter()` for object. */\nexport function objectFilter<T = any>(\n obj: any,\n fn: (key: string, value: any) => boolean,\n): Partial<T> {\n if (!isObject(obj))\n return {}\n return Object.fromEntries(Object.entries(obj).filter(([k, v]) => fn(k, v))) as any\n}\n\n/** Merge right into left object. If dispose is defined, it will be combined. Left can be a complex object i.e. a insantiated class. */\nexport function objectMergeDisposable<A extends object, B extends object>(\n a: A,\n b: B,\n): A & B {\n // @ts-expect-error xxx\n if (b.dispose && a.dispose) {\n // @ts-expect-error xxx\n b.dispose.add(a.dispose)\n }\n return Object.assign(a, b)\n}\n\n// export function objectMerge<A, B>(a: A, b: B): A & B {\n// return Object.assign({}, a, b)\n// }\n\nexport function objectIsEmpty(obj: object) {\n return Object.keys(obj).length <= 0\n}\n\n// https://stackoverflow.com/a/56592365/140927\nexport function objectPick<T extends object, K extends keyof T>(obj: T, ...keys: K[]) {\n return Object.fromEntries(keys.filter(key => key in obj).map(key => [key, obj[key]])) as Pick<T, K>\n}\n\nexport function objectInclusivePick<T extends object, K extends (string | number | symbol)>(obj: T, ...keys: K[]) {\n return Object.fromEntries(keys.map(key => [key, obj[key as unknown as keyof T]])) as { [key in K]: key extends keyof T ? T[key] : undefined }\n}\n\nexport function objectOmit<T extends object, K extends keyof T>(obj: T, ...keys: K[]) {\n return Object.fromEntries(Object.entries(obj).filter(([key]) => !keys.includes(key as K))) as Omit<T, K>\n}\n\n/// Convert object to plain object with max depth.\nexport function objectPlain(obj: any, opt?: {\n maxDepth?: number\n maxDepthValue?: any\n circleValue?: any\n errorTrace?: boolean\n filter?: (value: any) => boolean\n keepAsIs?: (value: any) => boolean\n transformer?: (value: any) => any | undefined\n}): any {\n const {\n maxDepth = 99,\n circleValue,\n maxDepthValue,\n errorTrace = true,\n filter = () => true,\n keepAsIs = () => false,\n transformer = () => undefined,\n } = opt ?? {}\n\n const cycle: any = []\n\n function handleObject(obj: any, depth: number): any {\n if (depth > maxDepth)\n return maxDepthValue // '*** MAX DEPTH ***'\n\n if (keepAsIs(obj))\n return obj\n\n if (!isPrimitive(obj)) {\n if (cycle.includes(obj))\n return circleValue // '*** CYCLE ***'\n cycle.push(obj)\n }\n\n if (transformer) {\n const result = transformer(obj)\n if (result !== undefined)\n return result\n }\n\n if (isSymbol(obj))\n return String(obj)\n\n if (isPrimitive(obj))\n return obj\n\n if (typeof Date !== 'undefined' && obj instanceof Date) {\n return {\n __class: 'Date',\n value: obj.toISOString(),\n }\n }\n\n if (typeof RegExp !== 'undefined' && obj instanceof RegExp) {\n return {\n __class: 'RegExp',\n source: obj.toString(),\n }\n }\n\n if (typeof Map !== 'undefined' && obj instanceof Map)\n obj = Object.fromEntries(obj)\n\n if (typeof Set !== 'undefined' && obj instanceof Set || isBinaryArray(obj))\n obj = Array.from(obj as any)\n\n if (typeof ErrorEvent !== 'undefined' && obj instanceof ErrorEvent) {\n return {\n __class: 'ErrorEvent',\n message: obj.message,\n filename: obj.filename,\n lineno: obj.lineno,\n colno: obj.colno,\n error: obj.error ? handleObject(obj.error, depth + 1) : undefined,\n }\n }\n\n if (typeof Event !== 'undefined' && obj instanceof Event) {\n return {\n __class: 'Event',\n type: obj.type,\n eventPhase: obj.eventPhase,\n bubbles: obj.bubbles,\n cancelable: obj.cancelable,\n defaultPrevented: obj.defaultPrevented,\n composed: obj.composed,\n timeStamp: obj.timeStamp,\n }\n }\n\n if (typeof Error !== 'undefined' && obj instanceof Error) {\n return {\n __class: 'Error',\n name: obj.name,\n message: obj.message,\n stack: errorTrace ? obj.stack : undefined,\n cause: (obj as any).cause ? String((obj as any).cause) : undefined,\n }\n }\n // return `${obj.name || 'Error'}: ${obj.message}${errorTrace ? `\\n${obj.stack}` : ''}`\n\n /* if (obj instanceof Element) {\n const attrs = obj.getAttributeNames().map(name => `${name}=\"${String(obj.getAttribute(name))}\"`).join(' ')\n return `<${[obj.tagName.toLocaleLowerCase(), ...attrs].join(' ')}}>`\n } */\n\n if (Array.isArray(obj)) {\n return obj\n .filter(filter)\n .map(o => handleObject(o, depth + 1))\n }\n\n // For class objects just dump the first level of primitives\n const objName = obj?.constructor?.name\n if (objName && objName !== 'Object') {\n const nobj: any = {\n __class: objName,\n // __code: obj.toString ? obj.toString() : undefined,\n }\n for (const k in obj) {\n if (obj && obj.hasOwnProperty(k) && isPrimitive(obj[k]))\n nobj[k] = obj[k]\n }\n return nobj\n }\n\n // Plain objects are recursively dumped\n const nobj: any = {}\n for (const key in obj) {\n const value = obj[key]\n if (filter(value))\n nobj[key] = handleObject(value, depth + 1)\n }\n return nobj\n\n // return undefined\n }\n\n return handleObject(obj, 0)\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"object.mjs","names":[],"sources":["../../../src/common/data/object.ts"],"sourcesContent":["import { isArray, isBinaryArray, isObject, isPrimitive, isSymbol } from './is'\n\n/** Like `.map()` for object. Return new key and value or `undefined` to delete. */\nexport function objectMap<T = any>(\n obj: any,\n fn: (key: string, value: any) => [key: string, value: T] | T | undefined | null,\n): Record<string, T> {\n if (!isObject(obj))\n return {}\n return Object.fromEntries(\n Object.entries(obj)\n .map(([k, v]) => {\n const r = fn(k, v)\n if (isArray(r) && r.length === 2)\n return r\n return [k, r]\n })\n .filter(v => v != null),\n )\n}\n\n/** Like `.filter()` for object. */\nexport function objectFilter<T = any>(\n obj: any,\n fn: (key: string, value: any) => boolean,\n): Partial<T> {\n if (!isObject(obj))\n return {}\n return Object.fromEntries(Object.entries(obj).filter(([k, v]) => fn(k, v))) as any\n}\n\n/** Merge right into left object. If dispose is defined, it will be combined. Left can be a complex object i.e. a insantiated class. */\nexport function objectMergeDisposable<A extends object, B extends object>(\n a: A,\n b: B,\n): A & B {\n // @ts-expect-error xxx\n if (b.dispose && a.dispose) {\n // @ts-expect-error xxx\n b.dispose.add(a.dispose)\n }\n return Object.assign(a, b)\n}\n\n// export function objectMerge<A, B>(a: A, b: B): A & B {\n// return Object.assign({}, a, b)\n// }\n\nexport function objectIsEmpty(obj: object) {\n return Object.keys(obj).length <= 0\n}\n\n// https://stackoverflow.com/a/56592365/140927\nexport function objectPick<T extends object, K extends keyof T>(obj: T, ...keys: K[]) {\n return Object.fromEntries(keys.filter(key => key in obj).map(key => [key, obj[key]])) as Pick<T, K>\n}\n\nexport function objectInclusivePick<T extends object, K extends (string | number | symbol)>(obj: T, ...keys: K[]) {\n return Object.fromEntries(keys.map(key => [key, obj[key as unknown as keyof T]])) as { [key in K]: key extends keyof T ? T[key] : undefined }\n}\n\nexport function objectOmit<T extends object, K extends keyof T>(obj: T, ...keys: K[]) {\n return Object.fromEntries(Object.entries(obj).filter(([key]) => !keys.includes(key as K))) as Omit<T, K>\n}\n\n/// Convert object to plain object with max depth.\nexport function objectPlain(obj: any, opt?: {\n maxDepth?: number\n maxDepthValue?: any\n circleValue?: any\n errorTrace?: boolean\n filter?: (value: any) => boolean\n keepAsIs?: (value: any) => boolean\n transformer?: (value: any) => any | undefined\n}): any {\n const {\n maxDepth = 99,\n circleValue,\n maxDepthValue,\n errorTrace = true,\n filter = () => true,\n keepAsIs = () => false,\n transformer = () => undefined,\n } = opt ?? {}\n\n const cycle: any = []\n\n function handleObject(obj: any, depth: number): any {\n if (depth > maxDepth)\n return maxDepthValue // '*** MAX DEPTH ***'\n\n if (keepAsIs(obj))\n return obj\n\n if (!isPrimitive(obj)) {\n if (cycle.includes(obj))\n return circleValue // '*** CYCLE ***'\n cycle.push(obj)\n }\n\n if (transformer) {\n const result = transformer(obj)\n if (result !== undefined)\n return result\n }\n\n if (isSymbol(obj))\n return String(obj)\n\n if (isPrimitive(obj))\n return obj\n\n if (typeof Date !== 'undefined' && obj instanceof Date) {\n return {\n __class: 'Date',\n value: obj.toISOString(),\n }\n }\n\n if (typeof RegExp !== 'undefined' && obj instanceof RegExp) {\n return {\n __class: 'RegExp',\n source: obj.toString(),\n }\n }\n\n if (typeof Map !== 'undefined' && obj instanceof Map)\n obj = Object.fromEntries(obj)\n\n if (typeof Set !== 'undefined' && obj instanceof Set || isBinaryArray(obj))\n obj = Array.from(obj as any)\n\n if (typeof ErrorEvent !== 'undefined' && obj instanceof ErrorEvent) {\n return {\n __class: 'ErrorEvent',\n message: obj.message,\n filename: obj.filename,\n lineno: obj.lineno,\n colno: obj.colno,\n error: obj.error ? handleObject(obj.error, depth + 1) : undefined,\n }\n }\n\n if (typeof Event !== 'undefined' && obj instanceof Event) {\n return {\n __class: 'Event',\n type: obj.type,\n eventPhase: obj.eventPhase,\n bubbles: obj.bubbles,\n cancelable: obj.cancelable,\n defaultPrevented: obj.defaultPrevented,\n composed: obj.composed,\n timeStamp: obj.timeStamp,\n }\n }\n\n if (typeof Error !== 'undefined' && obj instanceof Error) {\n return {\n __class: 'Error',\n name: obj.name,\n message: obj.message,\n stack: errorTrace ? obj.stack : undefined,\n cause: (obj as any).cause ? String((obj as any).cause) : undefined,\n }\n }\n // return `${obj.name || 'Error'}: ${obj.message}${errorTrace ? `\\n${obj.stack}` : ''}`\n\n /* if (obj instanceof Element) {\n const attrs = obj.getAttributeNames().map(name => `${name}=\"${String(obj.getAttribute(name))}\"`).join(' ')\n return `<${[obj.tagName.toLocaleLowerCase(), ...attrs].join(' ')}}>`\n } */\n\n if (Array.isArray(obj)) {\n return obj\n .filter(filter)\n .map(o => handleObject(o, depth + 1))\n }\n\n // For class objects just dump the first level of primitives\n const objName = obj?.constructor?.name\n if (objName && objName !== 'Object') {\n const nobj: any = {\n __class: objName,\n // __code: obj.toString ? obj.toString() : undefined,\n }\n for (const k in obj) {\n if (obj && obj.hasOwnProperty(k) && isPrimitive(obj[k]))\n nobj[k] = obj[k]\n }\n return nobj\n }\n\n // Plain objects are recursively dumped\n const nobj: any = {}\n for (const key in obj) {\n const value = obj[key]\n if (filter(value))\n nobj[key] = handleObject(value, depth + 1)\n }\n return nobj\n\n // return undefined\n }\n\n return handleObject(obj, 0)\n}\n"],"mappings":";;;;AAGA,SAAgB,UACd,KACA,IACmB;AACnB,KAAI,CAAC,SAAS,IAAI,CAChB,QAAO,EAAE;AACX,QAAO,OAAO,YACZ,OAAO,QAAQ,IAAI,CAChB,KAAK,CAAC,GAAG,OAAO;EACf,MAAM,IAAI,GAAG,GAAG,EAAE;AAClB,MAAI,QAAQ,EAAE,IAAI,EAAE,WAAW,EAC7B,QAAO;AACT,SAAO,CAAC,GAAG,EAAE;GACb,CACD,QAAO,MAAK,KAAK,KAAK,CAC1B;;;AAIH,SAAgB,aACd,KACA,IACY;AACZ,KAAI,CAAC,SAAS,IAAI,CAChB,QAAO,EAAE;AACX,QAAO,OAAO,YAAY,OAAO,QAAQ,IAAI,CAAC,QAAQ,CAAC,GAAG,OAAO,GAAG,GAAG,EAAE,CAAC,CAAC;;;AAI7E,SAAgB,sBACd,GACA,GACO;AAEP,KAAI,EAAE,WAAW,EAAE,QAEjB,GAAE,QAAQ,IAAI,EAAE,QAAQ;AAE1B,QAAO,OAAO,OAAO,GAAG,EAAE;;AAO5B,SAAgB,cAAc,KAAa;AACzC,QAAO,OAAO,KAAK,IAAI,CAAC,UAAU;;AAIpC,SAAgB,WAAgD,KAAQ,GAAG,MAAW;AACpF,QAAO,OAAO,YAAY,KAAK,QAAO,QAAO,OAAO,IAAI,CAAC,KAAI,QAAO,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;;AAGvF,SAAgB,oBAA4E,KAAQ,GAAG,MAAW;AAChH,QAAO,OAAO,YAAY,KAAK,KAAI,QAAO,CAAC,KAAK,IAAI,KAA2B,CAAC,CAAC;;AAGnF,SAAgB,WAAgD,KAAQ,GAAG,MAAW;AACpF,QAAO,OAAO,YAAY,OAAO,QAAQ,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,SAAS,IAAS,CAAC,CAAC;;AAI5F,SAAgB,YAAY,KAAU,KAQ9B;CACN,MAAM,EACJ,WAAW,IACX,aACA,eACA,aAAa,MACb,eAAe,MACf,iBAAiB,OACjB,oBAAoB,WAClB,OAAO,EAAE;CAEb,MAAM,QAAa,EAAE;CAErB,SAAS,aAAa,KAAU,OAAoB;AAClD,MAAI,QAAQ,SACV,QAAO;AAET,MAAI,SAAS,IAAI,CACf,QAAO;AAET,MAAI,CAAC,YAAY,IAAI,EAAE;AACrB,OAAI,MAAM,SAAS,IAAI,CACrB,QAAO;AACT,SAAM,KAAK,IAAI;;AAGjB,MAAI,aAAa;GACf,MAAM,SAAS,YAAY,IAAI;AAC/B,OAAI,WAAW,OACb,QAAO;;AAGX,MAAI,SAAS,IAAI,CACf,QAAO,OAAO,IAAI;AAEpB,MAAI,YAAY,IAAI,CAClB,QAAO;AAET,MAAI,OAAO,SAAS,eAAe,eAAe,KAChD,QAAO;GACL,SAAS;GACT,OAAO,IAAI,aAAa;GACzB;AAGH,MAAI,OAAO,WAAW,eAAe,eAAe,OAClD,QAAO;GACL,SAAS;GACT,QAAQ,IAAI,UAAU;GACvB;AAGH,MAAI,OAAO,QAAQ,eAAe,eAAe,IAC/C,OAAM,OAAO,YAAY,IAAI;AAE/B,MAAI,OAAO,QAAQ,eAAe,eAAe,OAAO,cAAc,IAAI,CACxE,OAAM,MAAM,KAAK,IAAW;AAE9B,MAAI,OAAO,eAAe,eAAe,eAAe,WACtD,QAAO;GACL,SAAS;GACT,SAAS,IAAI;GACb,UAAU,IAAI;GACd,QAAQ,IAAI;GACZ,OAAO,IAAI;GACX,OAAO,IAAI,QAAQ,aAAa,IAAI,OAAO,QAAQ,EAAE,GAAG;GACzD;AAGH,MAAI,OAAO,UAAU,eAAe,eAAe,MACjD,QAAO;GACL,SAAS;GACT,MAAM,IAAI;GACV,YAAY,IAAI;GAChB,SAAS,IAAI;GACb,YAAY,IAAI;GAChB,kBAAkB,IAAI;GACtB,UAAU,IAAI;GACd,WAAW,IAAI;GAChB;AAGH,MAAI,OAAO,UAAU,eAAe,eAAe,MACjD,QAAO;GACL,SAAS;GACT,MAAM,IAAI;GACV,SAAS,IAAI;GACb,OAAO,aAAa,IAAI,QAAQ;GAChC,OAAQ,IAAY,QAAQ,OAAQ,IAAY,MAAM,GAAG;GAC1D;AASH,MAAI,MAAM,QAAQ,IAAI,CACpB,QAAO,IACJ,OAAO,OAAO,CACd,KAAI,MAAK,aAAa,GAAG,QAAQ,EAAE,CAAC;EAIzC,MAAM,UAAU,KAAK,aAAa;AAClC,MAAI,WAAW,YAAY,UAAU;GACnC,MAAM,OAAY,EAChB,SAAS,SAEV;AACD,QAAK,MAAM,KAAK,IACd,KAAI,OAAO,IAAI,eAAe,EAAE,IAAI,YAAY,IAAI,GAAG,CACrD,MAAK,KAAK,IAAI;AAElB,UAAO;;EAIT,MAAM,OAAY,EAAE;AACpB,OAAK,MAAM,OAAO,KAAK;GACrB,MAAM,QAAQ,IAAI;AAClB,OAAI,OAAO,MAAM,CACf,MAAK,OAAO,aAAa,OAAO,QAAQ,EAAE;;AAE9C,SAAO;;AAKT,QAAO,aAAa,KAAK,EAAE"}
|
|
@@ -1,2 +1,43 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
//#region src/common/data/orderby.ts
|
|
4
|
+
function parseOrderby(value = "") {
|
|
5
|
+
let [field = "", orderby = "asc"] = value.split(" ");
|
|
6
|
+
orderby = orderby.toLowerCase();
|
|
7
|
+
return {
|
|
8
|
+
field,
|
|
9
|
+
orderby,
|
|
10
|
+
asc: orderby !== "desc",
|
|
11
|
+
desc: orderby === "desc"
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function composeOrderby(field, asc = true) {
|
|
15
|
+
return `${field} ${asc ? "asc" : "desc"}`;
|
|
16
|
+
}
|
|
17
|
+
function cmp(a, b, asc = true) {
|
|
18
|
+
const aa = a || 0;
|
|
19
|
+
const bb = b || 0;
|
|
20
|
+
return aa > bb ? asc ? 1 : -1 : aa < bb ? asc ? -1 : 1 : 0;
|
|
21
|
+
}
|
|
22
|
+
function sortedOrderby(values, ...orderby) {
|
|
23
|
+
if (orderby.length > 0) {
|
|
24
|
+
const orderByList = orderby.map(parseOrderby);
|
|
25
|
+
const sortValues = Array.from(values);
|
|
26
|
+
sortValues.sort((a, b) => {
|
|
27
|
+
for (const { field, asc } of orderByList) {
|
|
28
|
+
const result = cmp(a[field], b[field], asc);
|
|
29
|
+
if (result !== 0) return result;
|
|
30
|
+
}
|
|
31
|
+
return 0;
|
|
32
|
+
});
|
|
33
|
+
return sortValues;
|
|
34
|
+
}
|
|
35
|
+
return values;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
//#endregion
|
|
39
|
+
exports.cmp = cmp;
|
|
40
|
+
exports.composeOrderby = composeOrderby;
|
|
41
|
+
exports.parseOrderby = parseOrderby;
|
|
42
|
+
exports.sortedOrderby = sortedOrderby;
|
|
2
43
|
//# sourceMappingURL=orderby.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orderby.cjs","names":[],"sources":["../../../src/common/data/orderby.ts"],"sourcesContent":["export function parseOrderby(value = ''): {\n field: string\n orderby: string\n asc: boolean\n desc: boolean\n} {\n let [field = '', orderby = 'asc'] = value.split(' ')\n orderby = orderby.toLowerCase()\n return {\n field,\n orderby,\n asc: orderby !== 'desc',\n desc: orderby === 'desc',\n }\n}\n\nexport function composeOrderby(field: string, asc = true): string {\n return `${field} ${asc ? 'asc' : 'desc'}`\n}\n\n// Classic compare function with direction flag\nexport function cmp(a: any, b: any, asc = true): -1 | 0 | 1 {\n const aa = a || 0\n const bb = b || 0\n return aa > bb ? (asc ? 1 : -1) : aa < bb ? (asc ? -1 : 1) : 0 // use Math.sign(?) for performance?\n}\n\n// todo: support localeCompare()\nexport function sortedOrderby<T>(values: T[], ...orderby: string[]): T[] {\n if (orderby.length > 0) {\n const orderByList = orderby.map(parseOrderby)\n // let { field, asc } = parseOrderby(orderby)\n // if (field != null && typeof field === \"string\") {\n // let bigger = asc ? 1 : -1\n // let smaller = asc ? -1 : 1\n const sortValues = Array.from(values)\n sortValues.sort((a: any, b: any): number => {\n for (const { field, asc } of orderByList) {\n const result = cmp(a[field], b[field], asc)\n if (result !== 0)\n return result\n }\n return 0\n // const aa = a[field] || 0\n // const bb = b[field] || 0\n // return aa > bb ? bigger : aa < bb ? smaller : 0\n })\n return sortValues\n }\n return values\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"orderby.cjs","names":[],"sources":["../../../src/common/data/orderby.ts"],"sourcesContent":["export function parseOrderby(value = ''): {\n field: string\n orderby: string\n asc: boolean\n desc: boolean\n} {\n let [field = '', orderby = 'asc'] = value.split(' ')\n orderby = orderby.toLowerCase()\n return {\n field,\n orderby,\n asc: orderby !== 'desc',\n desc: orderby === 'desc',\n }\n}\n\nexport function composeOrderby(field: string, asc = true): string {\n return `${field} ${asc ? 'asc' : 'desc'}`\n}\n\n// Classic compare function with direction flag\nexport function cmp(a: any, b: any, asc = true): -1 | 0 | 1 {\n const aa = a || 0\n const bb = b || 0\n return aa > bb ? (asc ? 1 : -1) : aa < bb ? (asc ? -1 : 1) : 0 // use Math.sign(?) for performance?\n}\n\n// todo: support localeCompare()\nexport function sortedOrderby<T>(values: T[], ...orderby: string[]): T[] {\n if (orderby.length > 0) {\n const orderByList = orderby.map(parseOrderby)\n // let { field, asc } = parseOrderby(orderby)\n // if (field != null && typeof field === \"string\") {\n // let bigger = asc ? 1 : -1\n // let smaller = asc ? -1 : 1\n const sortValues = Array.from(values)\n sortValues.sort((a: any, b: any): number => {\n for (const { field, asc } of orderByList) {\n const result = cmp(a[field], b[field], asc)\n if (result !== 0)\n return result\n }\n return 0\n // const aa = a[field] || 0\n // const bb = b[field] || 0\n // return aa > bb ? bigger : aa < bb ? smaller : 0\n })\n return sortValues\n }\n return values\n}\n"],"mappings":";;;AAAA,SAAgB,aAAa,QAAQ,IAKnC;CACA,IAAI,CAAC,QAAQ,IAAI,UAAU,SAAS,MAAM,MAAM,IAAI;AACpD,WAAU,QAAQ,aAAa;AAC/B,QAAO;EACL;EACA;EACA,KAAK,YAAY;EACjB,MAAM,YAAY;EACnB;;AAGH,SAAgB,eAAe,OAAe,MAAM,MAAc;AAChE,QAAO,GAAG,MAAM,GAAG,MAAM,QAAQ;;AAInC,SAAgB,IAAI,GAAQ,GAAQ,MAAM,MAAkB;CAC1D,MAAM,KAAK,KAAK;CAChB,MAAM,KAAK,KAAK;AAChB,QAAO,KAAK,KAAM,MAAM,IAAI,KAAM,KAAK,KAAM,MAAM,KAAK,IAAK;;AAI/D,SAAgB,cAAiB,QAAa,GAAG,SAAwB;AACvE,KAAI,QAAQ,SAAS,GAAG;EACtB,MAAM,cAAc,QAAQ,IAAI,aAAa;EAK7C,MAAM,aAAa,MAAM,KAAK,OAAO;AACrC,aAAW,MAAM,GAAQ,MAAmB;AAC1C,QAAK,MAAM,EAAE,OAAO,SAAS,aAAa;IACxC,MAAM,SAAS,IAAI,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAC3C,QAAI,WAAW,EACb,QAAO;;AAEX,UAAO;IAIP;AACF,SAAO;;AAET,QAAO"}
|
|
@@ -1,2 +1,38 @@
|
|
|
1
|
-
|
|
1
|
+
//#region src/common/data/orderby.ts
|
|
2
|
+
function parseOrderby(value = "") {
|
|
3
|
+
let [field = "", orderby = "asc"] = value.split(" ");
|
|
4
|
+
orderby = orderby.toLowerCase();
|
|
5
|
+
return {
|
|
6
|
+
field,
|
|
7
|
+
orderby,
|
|
8
|
+
asc: orderby !== "desc",
|
|
9
|
+
desc: orderby === "desc"
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function composeOrderby(field, asc = true) {
|
|
13
|
+
return `${field} ${asc ? "asc" : "desc"}`;
|
|
14
|
+
}
|
|
15
|
+
function cmp(a, b, asc = true) {
|
|
16
|
+
const aa = a || 0;
|
|
17
|
+
const bb = b || 0;
|
|
18
|
+
return aa > bb ? asc ? 1 : -1 : aa < bb ? asc ? -1 : 1 : 0;
|
|
19
|
+
}
|
|
20
|
+
function sortedOrderby(values, ...orderby) {
|
|
21
|
+
if (orderby.length > 0) {
|
|
22
|
+
const orderByList = orderby.map(parseOrderby);
|
|
23
|
+
const sortValues = Array.from(values);
|
|
24
|
+
sortValues.sort((a, b) => {
|
|
25
|
+
for (const { field, asc } of orderByList) {
|
|
26
|
+
const result = cmp(a[field], b[field], asc);
|
|
27
|
+
if (result !== 0) return result;
|
|
28
|
+
}
|
|
29
|
+
return 0;
|
|
30
|
+
});
|
|
31
|
+
return sortValues;
|
|
32
|
+
}
|
|
33
|
+
return values;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
//#endregion
|
|
37
|
+
export { cmp, composeOrderby, parseOrderby, sortedOrderby };
|
|
2
38
|
//# sourceMappingURL=orderby.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orderby.mjs","names":[],"sources":["../../../src/common/data/orderby.ts"],"sourcesContent":["export function parseOrderby(value = ''): {\n field: string\n orderby: string\n asc: boolean\n desc: boolean\n} {\n let [field = '', orderby = 'asc'] = value.split(' ')\n orderby = orderby.toLowerCase()\n return {\n field,\n orderby,\n asc: orderby !== 'desc',\n desc: orderby === 'desc',\n }\n}\n\nexport function composeOrderby(field: string, asc = true): string {\n return `${field} ${asc ? 'asc' : 'desc'}`\n}\n\n// Classic compare function with direction flag\nexport function cmp(a: any, b: any, asc = true): -1 | 0 | 1 {\n const aa = a || 0\n const bb = b || 0\n return aa > bb ? (asc ? 1 : -1) : aa < bb ? (asc ? -1 : 1) : 0 // use Math.sign(?) for performance?\n}\n\n// todo: support localeCompare()\nexport function sortedOrderby<T>(values: T[], ...orderby: string[]): T[] {\n if (orderby.length > 0) {\n const orderByList = orderby.map(parseOrderby)\n // let { field, asc } = parseOrderby(orderby)\n // if (field != null && typeof field === \"string\") {\n // let bigger = asc ? 1 : -1\n // let smaller = asc ? -1 : 1\n const sortValues = Array.from(values)\n sortValues.sort((a: any, b: any): number => {\n for (const { field, asc } of orderByList) {\n const result = cmp(a[field], b[field], asc)\n if (result !== 0)\n return result\n }\n return 0\n // const aa = a[field] || 0\n // const bb = b[field] || 0\n // return aa > bb ? bigger : aa < bb ? smaller : 0\n })\n return sortValues\n }\n return values\n}\n"],"mappings":"AAAA,SAAgB,
|
|
1
|
+
{"version":3,"file":"orderby.mjs","names":[],"sources":["../../../src/common/data/orderby.ts"],"sourcesContent":["export function parseOrderby(value = ''): {\n field: string\n orderby: string\n asc: boolean\n desc: boolean\n} {\n let [field = '', orderby = 'asc'] = value.split(' ')\n orderby = orderby.toLowerCase()\n return {\n field,\n orderby,\n asc: orderby !== 'desc',\n desc: orderby === 'desc',\n }\n}\n\nexport function composeOrderby(field: string, asc = true): string {\n return `${field} ${asc ? 'asc' : 'desc'}`\n}\n\n// Classic compare function with direction flag\nexport function cmp(a: any, b: any, asc = true): -1 | 0 | 1 {\n const aa = a || 0\n const bb = b || 0\n return aa > bb ? (asc ? 1 : -1) : aa < bb ? (asc ? -1 : 1) : 0 // use Math.sign(?) for performance?\n}\n\n// todo: support localeCompare()\nexport function sortedOrderby<T>(values: T[], ...orderby: string[]): T[] {\n if (orderby.length > 0) {\n const orderByList = orderby.map(parseOrderby)\n // let { field, asc } = parseOrderby(orderby)\n // if (field != null && typeof field === \"string\") {\n // let bigger = asc ? 1 : -1\n // let smaller = asc ? -1 : 1\n const sortValues = Array.from(values)\n sortValues.sort((a: any, b: any): number => {\n for (const { field, asc } of orderByList) {\n const result = cmp(a[field], b[field], asc)\n if (result !== 0)\n return result\n }\n return 0\n // const aa = a[field] || 0\n // const bb = b[field] || 0\n // return aa > bb ? bigger : aa < bb ? smaller : 0\n })\n return sortValues\n }\n return values\n}\n"],"mappings":";AAAA,SAAgB,aAAa,QAAQ,IAKnC;CACA,IAAI,CAAC,QAAQ,IAAI,UAAU,SAAS,MAAM,MAAM,IAAI;AACpD,WAAU,QAAQ,aAAa;AAC/B,QAAO;EACL;EACA;EACA,KAAK,YAAY;EACjB,MAAM,YAAY;EACnB;;AAGH,SAAgB,eAAe,OAAe,MAAM,MAAc;AAChE,QAAO,GAAG,MAAM,GAAG,MAAM,QAAQ;;AAInC,SAAgB,IAAI,GAAQ,GAAQ,MAAM,MAAkB;CAC1D,MAAM,KAAK,KAAK;CAChB,MAAM,KAAK,KAAK;AAChB,QAAO,KAAK,KAAM,MAAM,IAAI,KAAM,KAAK,KAAM,MAAM,KAAK,IAAK;;AAI/D,SAAgB,cAAiB,QAAa,GAAG,SAAwB;AACvE,KAAI,QAAQ,SAAS,GAAG;EACtB,MAAM,cAAc,QAAQ,IAAI,aAAa;EAK7C,MAAM,aAAa,MAAM,KAAK,OAAO;AACrC,aAAW,MAAM,GAAQ,MAAmB;AAC1C,QAAK,MAAM,EAAE,OAAO,SAAS,aAAa;IACxC,MAAM,SAAS,IAAI,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAC3C,QAAI,WAAW,EACb,QAAO;;AAEX,UAAO;IAIP;AACF,SAAO;;AAET,QAAO"}
|
|
@@ -1,2 +1,27 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_common_data_regexp = require('./regexp.cjs');
|
|
3
|
+
|
|
4
|
+
//#region src/common/data/path.ts
|
|
5
|
+
const MAX_FILENAME_LENGTH = 100;
|
|
6
|
+
const reRelativePath = /^\.+/;
|
|
7
|
+
const reTrailingPeriods = /\.+$/;
|
|
8
|
+
const reFilenameIllegal = /[<>:"/\\|?*\u0000-\u001F\u0080-\u009F]+/g;
|
|
9
|
+
function filenameReservedRegex() {
|
|
10
|
+
return reFilenameIllegal;
|
|
11
|
+
}
|
|
12
|
+
function windowsReservedNameRegex() {
|
|
13
|
+
return /^(con|prn|aux|nul|com\d|lpt\d)$/i;
|
|
14
|
+
}
|
|
15
|
+
/** Ensure a valid file name. Unsupported characters get a `replacement`, default: `_` */
|
|
16
|
+
function toValidFilename(string, replacement = "_") {
|
|
17
|
+
if (typeof string !== "string") throw new TypeError("Expected a string");
|
|
18
|
+
if (filenameReservedRegex().test(replacement)) throw new Error("Replacement string cannot contain reserved filename characters");
|
|
19
|
+
const reReplacement = `(${require_common_data_regexp.escapeRegExp(replacement)})+`;
|
|
20
|
+
string = string.replace(filenameReservedRegex(), replacement).replace(reRelativePath, replacement).replace(reTrailingPeriods, "").replace(new RegExp(reReplacement, "gm"), replacement).trim();
|
|
21
|
+
string = windowsReservedNameRegex().test(string) ? string + replacement : string;
|
|
22
|
+
return string.slice(0, MAX_FILENAME_LENGTH);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
//#endregion
|
|
26
|
+
exports.toValidFilename = toValidFilename;
|
|
2
27
|
//# sourceMappingURL=path.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path.cjs","names":["escapeRegExp"],"sources":["../../../src/common/data/path.ts"],"sourcesContent":["// https://github.com/sindresorhus/filenamify/blob/main/filenamify.js\n/* eslint-disable no-control-regex */\n\nimport { escapeRegExp } from './regexp'\n\nconst MAX_FILENAME_LENGTH = 100\n\n// const reControlChars = /[\\u0000-\\u001F\\u0080-\\u009F]/g\nconst reRelativePath = /^\\.+/\nconst reTrailingPeriods = /\\.+$/\nconst reFilenameIllegal = /[<>:\"/\\\\|?*\\u0000-\\u001F\\u0080-\\u009F]+/g // https://superuser.com/questions/358855/what-characters-are-safe-in-cross-platform-file-names-for-linux-windows-and-os/358861#358861\n\nfunction filenameReservedRegex() {\n return reFilenameIllegal // /[<>:\"/\\\\|?*\\u0000-\\u001F]/g\n}\n\nfunction windowsReservedNameRegex() {\n return /^(con|prn|aux|nul|com\\d|lpt\\d)$/i\n}\n\n/** Ensure a valid file name. Unsupported characters get a `replacement`, default: `_` */\nexport function toValidFilename(string: string, replacement = '_'): string | never {\n if (typeof string !== 'string')\n throw new TypeError('Expected a string')\n\n if (filenameReservedRegex().test(replacement))\n throw new Error('Replacement string cannot contain reserved filename characters')\n\n const reReplacement = `(${escapeRegExp(replacement)})+`\n\n string = string\n .replace(filenameReservedRegex(), replacement)\n .replace(reRelativePath, replacement)\n .replace(reTrailingPeriods, '')\n .replace(new RegExp(reReplacement, 'gm'), replacement) // collapse\n .trim()\n\n string = windowsReservedNameRegex().test(string) ? string + replacement : string\n\n return string.slice(0, MAX_FILENAME_LENGTH)\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"path.cjs","names":["escapeRegExp"],"sources":["../../../src/common/data/path.ts"],"sourcesContent":["// https://github.com/sindresorhus/filenamify/blob/main/filenamify.js\n/* eslint-disable no-control-regex */\n\nimport { escapeRegExp } from './regexp'\n\nconst MAX_FILENAME_LENGTH = 100\n\n// const reControlChars = /[\\u0000-\\u001F\\u0080-\\u009F]/g\nconst reRelativePath = /^\\.+/\nconst reTrailingPeriods = /\\.+$/\nconst reFilenameIllegal = /[<>:\"/\\\\|?*\\u0000-\\u001F\\u0080-\\u009F]+/g // https://superuser.com/questions/358855/what-characters-are-safe-in-cross-platform-file-names-for-linux-windows-and-os/358861#358861\n\nfunction filenameReservedRegex() {\n return reFilenameIllegal // /[<>:\"/\\\\|?*\\u0000-\\u001F]/g\n}\n\nfunction windowsReservedNameRegex() {\n return /^(con|prn|aux|nul|com\\d|lpt\\d)$/i\n}\n\n/** Ensure a valid file name. Unsupported characters get a `replacement`, default: `_` */\nexport function toValidFilename(string: string, replacement = '_'): string | never {\n if (typeof string !== 'string')\n throw new TypeError('Expected a string')\n\n if (filenameReservedRegex().test(replacement))\n throw new Error('Replacement string cannot contain reserved filename characters')\n\n const reReplacement = `(${escapeRegExp(replacement)})+`\n\n string = string\n .replace(filenameReservedRegex(), replacement)\n .replace(reRelativePath, replacement)\n .replace(reTrailingPeriods, '')\n .replace(new RegExp(reReplacement, 'gm'), replacement) // collapse\n .trim()\n\n string = windowsReservedNameRegex().test(string) ? string + replacement : string\n\n return string.slice(0, MAX_FILENAME_LENGTH)\n}\n"],"mappings":";;;;AAKA,MAAM,sBAAsB;AAG5B,MAAM,iBAAiB;AACvB,MAAM,oBAAoB;AAC1B,MAAM,oBAAoB;AAE1B,SAAS,wBAAwB;AAC/B,QAAO;;AAGT,SAAS,2BAA2B;AAClC,QAAO;;;AAIT,SAAgB,gBAAgB,QAAgB,cAAc,KAAqB;AACjF,KAAI,OAAO,WAAW,SACpB,OAAM,IAAI,UAAU,oBAAoB;AAE1C,KAAI,uBAAuB,CAAC,KAAK,YAAY,CAC3C,OAAM,IAAI,MAAM,iEAAiE;CAEnF,MAAM,gBAAgB,IAAIA,wCAAa,YAAY,CAAC;AAEpD,UAAS,OACN,QAAQ,uBAAuB,EAAE,YAAY,CAC7C,QAAQ,gBAAgB,YAAY,CACpC,QAAQ,mBAAmB,GAAG,CAC9B,QAAQ,IAAI,OAAO,eAAe,KAAK,EAAE,YAAY,CACrD,MAAM;AAET,UAAS,0BAA0B,CAAC,KAAK,OAAO,GAAG,SAAS,cAAc;AAE1E,QAAO,OAAO,MAAM,GAAG,oBAAoB"}
|
|
@@ -1,2 +1,26 @@
|
|
|
1
|
-
import{escapeRegExp
|
|
1
|
+
import { escapeRegExp } from "./regexp.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/common/data/path.ts
|
|
4
|
+
const MAX_FILENAME_LENGTH = 100;
|
|
5
|
+
const reRelativePath = /^\.+/;
|
|
6
|
+
const reTrailingPeriods = /\.+$/;
|
|
7
|
+
const reFilenameIllegal = /[<>:"/\\|?*\u0000-\u001F\u0080-\u009F]+/g;
|
|
8
|
+
function filenameReservedRegex() {
|
|
9
|
+
return reFilenameIllegal;
|
|
10
|
+
}
|
|
11
|
+
function windowsReservedNameRegex() {
|
|
12
|
+
return /^(con|prn|aux|nul|com\d|lpt\d)$/i;
|
|
13
|
+
}
|
|
14
|
+
/** Ensure a valid file name. Unsupported characters get a `replacement`, default: `_` */
|
|
15
|
+
function toValidFilename(string, replacement = "_") {
|
|
16
|
+
if (typeof string !== "string") throw new TypeError("Expected a string");
|
|
17
|
+
if (filenameReservedRegex().test(replacement)) throw new Error("Replacement string cannot contain reserved filename characters");
|
|
18
|
+
const reReplacement = `(${escapeRegExp(replacement)})+`;
|
|
19
|
+
string = string.replace(filenameReservedRegex(), replacement).replace(reRelativePath, replacement).replace(reTrailingPeriods, "").replace(new RegExp(reReplacement, "gm"), replacement).trim();
|
|
20
|
+
string = windowsReservedNameRegex().test(string) ? string + replacement : string;
|
|
21
|
+
return string.slice(0, MAX_FILENAME_LENGTH);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
//#endregion
|
|
25
|
+
export { toValidFilename };
|
|
2
26
|
//# sourceMappingURL=path.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path.mjs","names":[],"sources":["../../../src/common/data/path.ts"],"sourcesContent":["// https://github.com/sindresorhus/filenamify/blob/main/filenamify.js\n/* eslint-disable no-control-regex */\n\nimport { escapeRegExp } from './regexp'\n\nconst MAX_FILENAME_LENGTH = 100\n\n// const reControlChars = /[\\u0000-\\u001F\\u0080-\\u009F]/g\nconst reRelativePath = /^\\.+/\nconst reTrailingPeriods = /\\.+$/\nconst reFilenameIllegal = /[<>:\"/\\\\|?*\\u0000-\\u001F\\u0080-\\u009F]+/g // https://superuser.com/questions/358855/what-characters-are-safe-in-cross-platform-file-names-for-linux-windows-and-os/358861#358861\n\nfunction filenameReservedRegex() {\n return reFilenameIllegal // /[<>:\"/\\\\|?*\\u0000-\\u001F]/g\n}\n\nfunction windowsReservedNameRegex() {\n return /^(con|prn|aux|nul|com\\d|lpt\\d)$/i\n}\n\n/** Ensure a valid file name. Unsupported characters get a `replacement`, default: `_` */\nexport function toValidFilename(string: string, replacement = '_'): string | never {\n if (typeof string !== 'string')\n throw new TypeError('Expected a string')\n\n if (filenameReservedRegex().test(replacement))\n throw new Error('Replacement string cannot contain reserved filename characters')\n\n const reReplacement = `(${escapeRegExp(replacement)})+`\n\n string = string\n .replace(filenameReservedRegex(), replacement)\n .replace(reRelativePath, replacement)\n .replace(reTrailingPeriods, '')\n .replace(new RegExp(reReplacement, 'gm'), replacement) // collapse\n .trim()\n\n string = windowsReservedNameRegex().test(string) ? string + replacement : string\n\n return string.slice(0, MAX_FILENAME_LENGTH)\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"path.mjs","names":[],"sources":["../../../src/common/data/path.ts"],"sourcesContent":["// https://github.com/sindresorhus/filenamify/blob/main/filenamify.js\n/* eslint-disable no-control-regex */\n\nimport { escapeRegExp } from './regexp'\n\nconst MAX_FILENAME_LENGTH = 100\n\n// const reControlChars = /[\\u0000-\\u001F\\u0080-\\u009F]/g\nconst reRelativePath = /^\\.+/\nconst reTrailingPeriods = /\\.+$/\nconst reFilenameIllegal = /[<>:\"/\\\\|?*\\u0000-\\u001F\\u0080-\\u009F]+/g // https://superuser.com/questions/358855/what-characters-are-safe-in-cross-platform-file-names-for-linux-windows-and-os/358861#358861\n\nfunction filenameReservedRegex() {\n return reFilenameIllegal // /[<>:\"/\\\\|?*\\u0000-\\u001F]/g\n}\n\nfunction windowsReservedNameRegex() {\n return /^(con|prn|aux|nul|com\\d|lpt\\d)$/i\n}\n\n/** Ensure a valid file name. Unsupported characters get a `replacement`, default: `_` */\nexport function toValidFilename(string: string, replacement = '_'): string | never {\n if (typeof string !== 'string')\n throw new TypeError('Expected a string')\n\n if (filenameReservedRegex().test(replacement))\n throw new Error('Replacement string cannot contain reserved filename characters')\n\n const reReplacement = `(${escapeRegExp(replacement)})+`\n\n string = string\n .replace(filenameReservedRegex(), replacement)\n .replace(reRelativePath, replacement)\n .replace(reTrailingPeriods, '')\n .replace(new RegExp(reReplacement, 'gm'), replacement) // collapse\n .trim()\n\n string = windowsReservedNameRegex().test(string) ? string + replacement : string\n\n return string.slice(0, MAX_FILENAME_LENGTH)\n}\n"],"mappings":";;;AAKA,MAAM,sBAAsB;AAG5B,MAAM,iBAAiB;AACvB,MAAM,oBAAoB;AAC1B,MAAM,oBAAoB;AAE1B,SAAS,wBAAwB;AAC/B,QAAO;;AAGT,SAAS,2BAA2B;AAClC,QAAO;;;AAIT,SAAgB,gBAAgB,QAAgB,cAAc,KAAqB;AACjF,KAAI,OAAO,WAAW,SACpB,OAAM,IAAI,UAAU,oBAAoB;AAE1C,KAAI,uBAAuB,CAAC,KAAK,YAAY,CAC3C,OAAM,IAAI,MAAM,iEAAiE;CAEnF,MAAM,gBAAgB,IAAI,aAAa,YAAY,CAAC;AAEpD,UAAS,OACN,QAAQ,uBAAuB,EAAE,YAAY,CAC7C,QAAQ,gBAAgB,YAAY,CACpC,QAAQ,mBAAmB,GAAG,CAC9B,QAAQ,IAAI,OAAO,eAAe,KAAK,EAAE,YAAY,CACrD,MAAM;AAET,UAAS,0BAA0B,CAAC,KAAK,OAAO,GAAG,SAAS,cAAc;AAE1E,QAAO,OAAO,MAAM,GAAG,oBAAoB"}
|
|
@@ -1,2 +1,13 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
//#region src/common/data/regexp.ts
|
|
4
|
+
const rxEscape = /[\\\-[\]/{}()*+?.^$|]/g;
|
|
5
|
+
function escapeRegExp(value) {
|
|
6
|
+
if (!value) return "";
|
|
7
|
+
if (value instanceof RegExp) return value.source;
|
|
8
|
+
return value.replace(rxEscape, "\\$&");
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
//#endregion
|
|
12
|
+
exports.escapeRegExp = escapeRegExp;
|
|
2
13
|
//# sourceMappingURL=regexp.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"regexp.cjs","names":[],"sources":["../../../src/common/data/regexp.ts"],"sourcesContent":["const rxEscape = /[\\\\\\-[\\]/{}()*+?.^$|]/g // Finds: \\ - [ ] / { } ( ) * + ? . ^ $ |\n\nexport function escapeRegExp(value: RegExp | string): string {\n if (!value)\n return ''\n if (value instanceof RegExp)\n return value.source\n return value.replace(rxEscape, '\\\\$&')\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"regexp.cjs","names":[],"sources":["../../../src/common/data/regexp.ts"],"sourcesContent":["const rxEscape = /[\\\\\\-[\\]/{}()*+?.^$|]/g // Finds: \\ - [ ] / { } ( ) * + ? . ^ $ |\n\nexport function escapeRegExp(value: RegExp | string): string {\n if (!value)\n return ''\n if (value instanceof RegExp)\n return value.source\n return value.replace(rxEscape, '\\\\$&')\n}\n"],"mappings":";;;AAAA,MAAM,WAAW;AAEjB,SAAgB,aAAa,OAAgC;AAC3D,KAAI,CAAC,MACH,QAAO;AACT,KAAI,iBAAiB,OACnB,QAAO,MAAM;AACf,QAAO,MAAM,QAAQ,UAAU,OAAO"}
|
|
@@ -1,2 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
//#region src/common/data/regexp.ts
|
|
2
|
+
const rxEscape = /[\\\-[\]/{}()*+?.^$|]/g;
|
|
3
|
+
function escapeRegExp(value) {
|
|
4
|
+
if (!value) return "";
|
|
5
|
+
if (value instanceof RegExp) return value.source;
|
|
6
|
+
return value.replace(rxEscape, "\\$&");
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
//#endregion
|
|
10
|
+
export { escapeRegExp };
|
|
2
11
|
//# sourceMappingURL=regexp.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"regexp.mjs","names":[],"sources":["../../../src/common/data/regexp.ts"],"sourcesContent":["const rxEscape = /[\\\\\\-[\\]/{}()*+?.^$|]/g // Finds: \\ - [ ] / { } ( ) * + ? . ^ $ |\n\nexport function escapeRegExp(value: RegExp | string): string {\n if (!value)\n return ''\n if (value instanceof RegExp)\n return value.source\n return value.replace(rxEscape, '\\\\$&')\n}\n"],"mappings":"AAAA,MAAM,
|
|
1
|
+
{"version":3,"file":"regexp.mjs","names":[],"sources":["../../../src/common/data/regexp.ts"],"sourcesContent":["const rxEscape = /[\\\\\\-[\\]/{}()*+?.^$|]/g // Finds: \\ - [ ] / { } ( ) * + ? . ^ $ |\n\nexport function escapeRegExp(value: RegExp | string): string {\n if (!value)\n return ''\n if (value instanceof RegExp)\n return value.source\n return value.replace(rxEscape, '\\\\$&')\n}\n"],"mappings":";AAAA,MAAM,WAAW;AAEjB,SAAgB,aAAa,OAAgC;AAC3D,KAAI,CAAC,MACH,QAAO;AACT,KAAI,iBAAiB,OACnB,QAAO,MAAM;AACf,QAAO,MAAM,QAAQ,UAAU,OAAO"}
|
|
@@ -1,2 +1,108 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_common_data_math = require('./math.cjs');
|
|
3
|
+
|
|
4
|
+
//#region src/common/data/rounding.ts
|
|
5
|
+
function isHalf(value) {
|
|
6
|
+
return Math.abs(value) % 1 === .5;
|
|
7
|
+
}
|
|
8
|
+
function isEven(value) {
|
|
9
|
+
return value % 2 === 0;
|
|
10
|
+
}
|
|
11
|
+
const roundUp = (value) => Math.ceil(value);
|
|
12
|
+
const roundDown = (value) => Math.floor(value);
|
|
13
|
+
const roundHalfUp = (value) => Math.round(value);
|
|
14
|
+
/**
|
|
15
|
+
* Round a number with half values to nearest odd integer.
|
|
16
|
+
*/
|
|
17
|
+
const roundHalfOdd = (value) => {
|
|
18
|
+
const rounded = Math.round(value);
|
|
19
|
+
if (!isHalf(value)) return rounded;
|
|
20
|
+
return isEven(rounded) ? rounded - 1 : rounded;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Round a number with half values to nearest integer farthest from zero.
|
|
24
|
+
*/
|
|
25
|
+
const roundHalfAwayFromZero = (value) => {
|
|
26
|
+
return isHalf(value) ? Math.sign(value) * Math.ceil(Math.abs(value)) : Math.round(value);
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Round a number with half values down.
|
|
30
|
+
*/
|
|
31
|
+
const roundHalfDown = (value) => isHalf(value) ? Math.floor(value) : Math.round(value);
|
|
32
|
+
/**
|
|
33
|
+
* Round a number with half values to nearest even integer.
|
|
34
|
+
* https://wiki.c2.com/?BankersRounding
|
|
35
|
+
*/
|
|
36
|
+
const roundHalfEven = (value) => {
|
|
37
|
+
const rounded = Math.round(value);
|
|
38
|
+
if (!isHalf(value)) return rounded;
|
|
39
|
+
return isEven(rounded) ? rounded : rounded - 1;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Round a number with half values to nearest integer closest to zero.
|
|
43
|
+
*/
|
|
44
|
+
const roundHalfTowardsZero = (value) => isHalf(value) ? Math.sign(value) * Math.floor(Math.abs(value)) : Math.round(value);
|
|
45
|
+
/**
|
|
46
|
+
* This is useful for percentages that should sum up to 100.
|
|
47
|
+
* But can also be fine tuned.
|
|
48
|
+
*
|
|
49
|
+
* Original from https://github.com/super-ienien/percent-round
|
|
50
|
+
*/
|
|
51
|
+
function roundArrayOfNumbersToMatchSum(ipt, max = 100, decimalPlaces = 0) {
|
|
52
|
+
const iptPercents = [...ipt];
|
|
53
|
+
const length = ipt.length;
|
|
54
|
+
const out = [];
|
|
55
|
+
out.fill(0, length);
|
|
56
|
+
const total = require_common_data_math.sum(iptPercents);
|
|
57
|
+
if (total !== 0) {
|
|
58
|
+
const powDecimalPlaces = 10 ** decimalPlaces;
|
|
59
|
+
const pow100 = max * powDecimalPlaces;
|
|
60
|
+
let check100 = 0;
|
|
61
|
+
for (let i = length - 1; i >= 0; i--) {
|
|
62
|
+
iptPercents[i] = max * iptPercents[i] / total;
|
|
63
|
+
check100 += out[i] = Math.round(iptPercents[i] * powDecimalPlaces);
|
|
64
|
+
}
|
|
65
|
+
if (check100 !== pow100) {
|
|
66
|
+
const totalDiff = check100 - pow100;
|
|
67
|
+
const roundGrain = 1;
|
|
68
|
+
let grainCount = Math.abs(totalDiff);
|
|
69
|
+
const diffs = iptPercents.map((_, i) => Math.abs(out[i] - iptPercents[i] * powDecimalPlaces));
|
|
70
|
+
while (grainCount > 0) {
|
|
71
|
+
let idx = 0;
|
|
72
|
+
let maxDiff = diffs[0];
|
|
73
|
+
for (let i = 1; i < length; i++) if (maxDiff < diffs[i]) {
|
|
74
|
+
if (check100 > pow100 && out[i] - roundGrain < 0) continue;
|
|
75
|
+
idx = i;
|
|
76
|
+
maxDiff = diffs[i];
|
|
77
|
+
}
|
|
78
|
+
if (check100 > pow100) out[idx] -= roundGrain;
|
|
79
|
+
else out[idx] += roundGrain;
|
|
80
|
+
diffs[idx] -= roundGrain;
|
|
81
|
+
grainCount--;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (powDecimalPlaces > 1) return out.map((n) => +(n / powDecimalPlaces).toFixed(decimalPlaces));
|
|
85
|
+
}
|
|
86
|
+
return out;
|
|
87
|
+
}
|
|
88
|
+
function roundArrayOfObjectsToMatchSum(arr, name, max = 100, decimalPlaces = 0) {
|
|
89
|
+
return roundArrayOfNumbersToMatchSum(arr.map((o) => o[name]), max, decimalPlaces).map((o, i) => ({
|
|
90
|
+
...arr[i],
|
|
91
|
+
[name]: o
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
//#endregion
|
|
96
|
+
exports.isEven = isEven;
|
|
97
|
+
exports.isHalf = isHalf;
|
|
98
|
+
exports.roundArrayOfNumbersToMatchSum = roundArrayOfNumbersToMatchSum;
|
|
99
|
+
exports.roundArrayOfObjectsToMatchSum = roundArrayOfObjectsToMatchSum;
|
|
100
|
+
exports.roundDown = roundDown;
|
|
101
|
+
exports.roundHalfAwayFromZero = roundHalfAwayFromZero;
|
|
102
|
+
exports.roundHalfDown = roundHalfDown;
|
|
103
|
+
exports.roundHalfEven = roundHalfEven;
|
|
104
|
+
exports.roundHalfOdd = roundHalfOdd;
|
|
105
|
+
exports.roundHalfTowardsZero = roundHalfTowardsZero;
|
|
106
|
+
exports.roundHalfUp = roundHalfUp;
|
|
107
|
+
exports.roundUp = roundUp;
|
|
2
108
|
//# sourceMappingURL=rounding.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rounding.cjs","names":["sum"],"sources":["../../../src/common/data/rounding.ts"],"sourcesContent":["// From https://v2.dinerojs.com/docs/api/formatting/to-unit MIT\n\nimport { sum } from './math'\n\nexport type RoundingMode = (value: number) => number\n\nexport function isHalf(value: number): boolean {\n return Math.abs(value) % 1 === 0.5\n}\nexport function isEven(value: number): boolean {\n return value % 2 === 0\n}\n\nexport const roundUp: RoundingMode = value => Math.ceil(value)\nexport const roundDown: RoundingMode = value => Math.floor(value)\nexport const roundHalfUp: RoundingMode = value => Math.round(value)\n\n/**\n * Round a number with half values to nearest odd integer.\n */\nexport const roundHalfOdd: RoundingMode = (value) => {\n const rounded = Math.round(value)\n if (!isHalf(value))\n return rounded\n\n return isEven(rounded) ? rounded - 1 : rounded\n}\n\n/**\n * Round a number with half values to nearest integer farthest from zero.\n */\nexport const roundHalfAwayFromZero: RoundingMode = (value) => {\n return isHalf(value)\n ? Math.sign(value) * Math.ceil(Math.abs(value))\n : Math.round(value)\n}\n\n/**\n * Round a number with half values down.\n */\nexport const roundHalfDown: RoundingMode = value =>\n isHalf(value) ? Math.floor(value) : Math.round(value)\n\n/**\n * Round a number with half values to nearest even integer.\n * https://wiki.c2.com/?BankersRounding\n */\nexport const roundHalfEven: RoundingMode = (value) => {\n const rounded = Math.round(value)\n if (!isHalf(value))\n return rounded\n\n return isEven(rounded) ? rounded : rounded - 1\n}\n\n/**\n * Round a number with half values to nearest integer closest to zero.\n */\nexport const roundHalfTowardsZero: RoundingMode = value =>\n isHalf(value)\n ? Math.sign(value) * Math.floor(Math.abs(value))\n : Math.round(value)\n\n/**\n * This is useful for percentages that should sum up to 100.\n * But can also be fine tuned.\n *\n * Original from https://github.com/super-ienien/percent-round\n */\nexport function roundArrayOfNumbersToMatchSum(ipt: number[], max = 100, decimalPlaces = 0) {\n const iptPercents: number[] = [...ipt]\n const length = ipt.length\n const out: number[] = []\n out.fill(0, length)\n\n const total = sum(iptPercents)\n\n if (total !== 0) {\n const powDecimalPlaces = 10 ** decimalPlaces\n const pow100 = max * powDecimalPlaces\n let check100 = 0\n for (let i = length - 1; i >= 0; i--) {\n iptPercents[i] = max * iptPercents[i] / total\n check100 += out[i] = Math.round(iptPercents[i] * powDecimalPlaces)\n }\n\n if (check100 !== pow100) {\n const totalDiff = (check100 - pow100)\n const roundGrain = 1\n let grainCount = Math.abs(totalDiff)\n const diffs = iptPercents.map((_, i) => Math.abs(out[i] - iptPercents[i] * powDecimalPlaces))\n\n while (grainCount > 0) {\n let idx = 0\n let maxDiff = diffs[0]\n for (let i = 1; i < length; i++) {\n if (maxDiff < diffs[i]) {\n // avoid negative result\n if (check100 > pow100 && out[i] - roundGrain < 0)\n continue\n idx = i\n maxDiff = diffs[i]\n }\n }\n if (check100 > pow100)\n out[idx] -= roundGrain\n else\n out[idx] += roundGrain\n\n diffs[idx] -= roundGrain\n grainCount--\n }\n }\n\n if (powDecimalPlaces > 1)\n return out.map(n => +((n / powDecimalPlaces).toFixed(decimalPlaces)))\n }\n\n return out\n}\n\nexport function roundArrayOfObjectsToMatchSum<T extends Record<string, any>>(arr: T[], name: string, max = 100, decimalPlaces = 0): T[] {\n return roundArrayOfNumbersToMatchSum(arr.map(o => o[name]), max, decimalPlaces)\n .map((o, i) => ({\n ...arr[i],\n [name]: o,\n }))\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"rounding.cjs","names":["sum"],"sources":["../../../src/common/data/rounding.ts"],"sourcesContent":["// From https://v2.dinerojs.com/docs/api/formatting/to-unit MIT\n\nimport { sum } from './math'\n\nexport type RoundingMode = (value: number) => number\n\nexport function isHalf(value: number): boolean {\n return Math.abs(value) % 1 === 0.5\n}\nexport function isEven(value: number): boolean {\n return value % 2 === 0\n}\n\nexport const roundUp: RoundingMode = value => Math.ceil(value)\nexport const roundDown: RoundingMode = value => Math.floor(value)\nexport const roundHalfUp: RoundingMode = value => Math.round(value)\n\n/**\n * Round a number with half values to nearest odd integer.\n */\nexport const roundHalfOdd: RoundingMode = (value) => {\n const rounded = Math.round(value)\n if (!isHalf(value))\n return rounded\n\n return isEven(rounded) ? rounded - 1 : rounded\n}\n\n/**\n * Round a number with half values to nearest integer farthest from zero.\n */\nexport const roundHalfAwayFromZero: RoundingMode = (value) => {\n return isHalf(value)\n ? Math.sign(value) * Math.ceil(Math.abs(value))\n : Math.round(value)\n}\n\n/**\n * Round a number with half values down.\n */\nexport const roundHalfDown: RoundingMode = value =>\n isHalf(value) ? Math.floor(value) : Math.round(value)\n\n/**\n * Round a number with half values to nearest even integer.\n * https://wiki.c2.com/?BankersRounding\n */\nexport const roundHalfEven: RoundingMode = (value) => {\n const rounded = Math.round(value)\n if (!isHalf(value))\n return rounded\n\n return isEven(rounded) ? rounded : rounded - 1\n}\n\n/**\n * Round a number with half values to nearest integer closest to zero.\n */\nexport const roundHalfTowardsZero: RoundingMode = value =>\n isHalf(value)\n ? Math.sign(value) * Math.floor(Math.abs(value))\n : Math.round(value)\n\n/**\n * This is useful for percentages that should sum up to 100.\n * But can also be fine tuned.\n *\n * Original from https://github.com/super-ienien/percent-round\n */\nexport function roundArrayOfNumbersToMatchSum(ipt: number[], max = 100, decimalPlaces = 0) {\n const iptPercents: number[] = [...ipt]\n const length = ipt.length\n const out: number[] = []\n out.fill(0, length)\n\n const total = sum(iptPercents)\n\n if (total !== 0) {\n const powDecimalPlaces = 10 ** decimalPlaces\n const pow100 = max * powDecimalPlaces\n let check100 = 0\n for (let i = length - 1; i >= 0; i--) {\n iptPercents[i] = max * iptPercents[i] / total\n check100 += out[i] = Math.round(iptPercents[i] * powDecimalPlaces)\n }\n\n if (check100 !== pow100) {\n const totalDiff = (check100 - pow100)\n const roundGrain = 1\n let grainCount = Math.abs(totalDiff)\n const diffs = iptPercents.map((_, i) => Math.abs(out[i] - iptPercents[i] * powDecimalPlaces))\n\n while (grainCount > 0) {\n let idx = 0\n let maxDiff = diffs[0]\n for (let i = 1; i < length; i++) {\n if (maxDiff < diffs[i]) {\n // avoid negative result\n if (check100 > pow100 && out[i] - roundGrain < 0)\n continue\n idx = i\n maxDiff = diffs[i]\n }\n }\n if (check100 > pow100)\n out[idx] -= roundGrain\n else\n out[idx] += roundGrain\n\n diffs[idx] -= roundGrain\n grainCount--\n }\n }\n\n if (powDecimalPlaces > 1)\n return out.map(n => +((n / powDecimalPlaces).toFixed(decimalPlaces)))\n }\n\n return out\n}\n\nexport function roundArrayOfObjectsToMatchSum<T extends Record<string, any>>(arr: T[], name: string, max = 100, decimalPlaces = 0): T[] {\n return roundArrayOfNumbersToMatchSum(arr.map(o => o[name]), max, decimalPlaces)\n .map((o, i) => ({\n ...arr[i],\n [name]: o,\n }))\n}\n"],"mappings":";;;;AAMA,SAAgB,OAAO,OAAwB;AAC7C,QAAO,KAAK,IAAI,MAAM,GAAG,MAAM;;AAEjC,SAAgB,OAAO,OAAwB;AAC7C,QAAO,QAAQ,MAAM;;AAGvB,MAAa,WAAwB,UAAS,KAAK,KAAK,MAAM;AAC9D,MAAa,aAA0B,UAAS,KAAK,MAAM,MAAM;AACjE,MAAa,eAA4B,UAAS,KAAK,MAAM,MAAM;;;;AAKnE,MAAa,gBAA8B,UAAU;CACnD,MAAM,UAAU,KAAK,MAAM,MAAM;AACjC,KAAI,CAAC,OAAO,MAAM,CAChB,QAAO;AAET,QAAO,OAAO,QAAQ,GAAG,UAAU,IAAI;;;;;AAMzC,MAAa,yBAAuC,UAAU;AAC5D,QAAO,OAAO,MAAM,GAChB,KAAK,KAAK,MAAM,GAAG,KAAK,KAAK,KAAK,IAAI,MAAM,CAAC,GAC7C,KAAK,MAAM,MAAM;;;;;AAMvB,MAAa,iBAA8B,UACzC,OAAO,MAAM,GAAG,KAAK,MAAM,MAAM,GAAG,KAAK,MAAM,MAAM;;;;;AAMvD,MAAa,iBAA+B,UAAU;CACpD,MAAM,UAAU,KAAK,MAAM,MAAM;AACjC,KAAI,CAAC,OAAO,MAAM,CAChB,QAAO;AAET,QAAO,OAAO,QAAQ,GAAG,UAAU,UAAU;;;;;AAM/C,MAAa,wBAAqC,UAChD,OAAO,MAAM,GACT,KAAK,KAAK,MAAM,GAAG,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,GAC9C,KAAK,MAAM,MAAM;;;;;;;AAQvB,SAAgB,8BAA8B,KAAe,MAAM,KAAK,gBAAgB,GAAG;CACzF,MAAM,cAAwB,CAAC,GAAG,IAAI;CACtC,MAAM,SAAS,IAAI;CACnB,MAAM,MAAgB,EAAE;AACxB,KAAI,KAAK,GAAG,OAAO;CAEnB,MAAM,QAAQA,6BAAI,YAAY;AAE9B,KAAI,UAAU,GAAG;EACf,MAAM,mBAAmB,MAAM;EAC/B,MAAM,SAAS,MAAM;EACrB,IAAI,WAAW;AACf,OAAK,IAAI,IAAI,SAAS,GAAG,KAAK,GAAG,KAAK;AACpC,eAAY,KAAK,MAAM,YAAY,KAAK;AACxC,eAAY,IAAI,KAAK,KAAK,MAAM,YAAY,KAAK,iBAAiB;;AAGpE,MAAI,aAAa,QAAQ;GACvB,MAAM,YAAa,WAAW;GAC9B,MAAM,aAAa;GACnB,IAAI,aAAa,KAAK,IAAI,UAAU;GACpC,MAAM,QAAQ,YAAY,KAAK,GAAG,MAAM,KAAK,IAAI,IAAI,KAAK,YAAY,KAAK,iBAAiB,CAAC;AAE7F,UAAO,aAAa,GAAG;IACrB,IAAI,MAAM;IACV,IAAI,UAAU,MAAM;AACpB,SAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,IAC1B,KAAI,UAAU,MAAM,IAAI;AAEtB,SAAI,WAAW,UAAU,IAAI,KAAK,aAAa,EAC7C;AACF,WAAM;AACN,eAAU,MAAM;;AAGpB,QAAI,WAAW,OACb,KAAI,QAAQ;QAEZ,KAAI,QAAQ;AAEd,UAAM,QAAQ;AACd;;;AAIJ,MAAI,mBAAmB,EACrB,QAAO,IAAI,KAAI,MAAK,EAAG,IAAI,kBAAkB,QAAQ,cAAc,CAAE;;AAGzE,QAAO;;AAGT,SAAgB,8BAA6D,KAAU,MAAc,MAAM,KAAK,gBAAgB,GAAQ;AACtI,QAAO,8BAA8B,IAAI,KAAI,MAAK,EAAE,MAAM,EAAE,KAAK,cAAc,CAC5E,KAAK,GAAG,OAAO;EACd,GAAG,IAAI;GACN,OAAO;EACT,EAAE"}
|
|
@@ -1,2 +1,96 @@
|
|
|
1
|
-
import{sum
|
|
1
|
+
import { sum } from "./math.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/common/data/rounding.ts
|
|
4
|
+
function isHalf(value) {
|
|
5
|
+
return Math.abs(value) % 1 === .5;
|
|
6
|
+
}
|
|
7
|
+
function isEven(value) {
|
|
8
|
+
return value % 2 === 0;
|
|
9
|
+
}
|
|
10
|
+
const roundUp = (value) => Math.ceil(value);
|
|
11
|
+
const roundDown = (value) => Math.floor(value);
|
|
12
|
+
const roundHalfUp = (value) => Math.round(value);
|
|
13
|
+
/**
|
|
14
|
+
* Round a number with half values to nearest odd integer.
|
|
15
|
+
*/
|
|
16
|
+
const roundHalfOdd = (value) => {
|
|
17
|
+
const rounded = Math.round(value);
|
|
18
|
+
if (!isHalf(value)) return rounded;
|
|
19
|
+
return isEven(rounded) ? rounded - 1 : rounded;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Round a number with half values to nearest integer farthest from zero.
|
|
23
|
+
*/
|
|
24
|
+
const roundHalfAwayFromZero = (value) => {
|
|
25
|
+
return isHalf(value) ? Math.sign(value) * Math.ceil(Math.abs(value)) : Math.round(value);
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Round a number with half values down.
|
|
29
|
+
*/
|
|
30
|
+
const roundHalfDown = (value) => isHalf(value) ? Math.floor(value) : Math.round(value);
|
|
31
|
+
/**
|
|
32
|
+
* Round a number with half values to nearest even integer.
|
|
33
|
+
* https://wiki.c2.com/?BankersRounding
|
|
34
|
+
*/
|
|
35
|
+
const roundHalfEven = (value) => {
|
|
36
|
+
const rounded = Math.round(value);
|
|
37
|
+
if (!isHalf(value)) return rounded;
|
|
38
|
+
return isEven(rounded) ? rounded : rounded - 1;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Round a number with half values to nearest integer closest to zero.
|
|
42
|
+
*/
|
|
43
|
+
const roundHalfTowardsZero = (value) => isHalf(value) ? Math.sign(value) * Math.floor(Math.abs(value)) : Math.round(value);
|
|
44
|
+
/**
|
|
45
|
+
* This is useful for percentages that should sum up to 100.
|
|
46
|
+
* But can also be fine tuned.
|
|
47
|
+
*
|
|
48
|
+
* Original from https://github.com/super-ienien/percent-round
|
|
49
|
+
*/
|
|
50
|
+
function roundArrayOfNumbersToMatchSum(ipt, max = 100, decimalPlaces = 0) {
|
|
51
|
+
const iptPercents = [...ipt];
|
|
52
|
+
const length = ipt.length;
|
|
53
|
+
const out = [];
|
|
54
|
+
out.fill(0, length);
|
|
55
|
+
const total = sum(iptPercents);
|
|
56
|
+
if (total !== 0) {
|
|
57
|
+
const powDecimalPlaces = 10 ** decimalPlaces;
|
|
58
|
+
const pow100 = max * powDecimalPlaces;
|
|
59
|
+
let check100 = 0;
|
|
60
|
+
for (let i = length - 1; i >= 0; i--) {
|
|
61
|
+
iptPercents[i] = max * iptPercents[i] / total;
|
|
62
|
+
check100 += out[i] = Math.round(iptPercents[i] * powDecimalPlaces);
|
|
63
|
+
}
|
|
64
|
+
if (check100 !== pow100) {
|
|
65
|
+
const totalDiff = check100 - pow100;
|
|
66
|
+
const roundGrain = 1;
|
|
67
|
+
let grainCount = Math.abs(totalDiff);
|
|
68
|
+
const diffs = iptPercents.map((_, i) => Math.abs(out[i] - iptPercents[i] * powDecimalPlaces));
|
|
69
|
+
while (grainCount > 0) {
|
|
70
|
+
let idx = 0;
|
|
71
|
+
let maxDiff = diffs[0];
|
|
72
|
+
for (let i = 1; i < length; i++) if (maxDiff < diffs[i]) {
|
|
73
|
+
if (check100 > pow100 && out[i] - roundGrain < 0) continue;
|
|
74
|
+
idx = i;
|
|
75
|
+
maxDiff = diffs[i];
|
|
76
|
+
}
|
|
77
|
+
if (check100 > pow100) out[idx] -= roundGrain;
|
|
78
|
+
else out[idx] += roundGrain;
|
|
79
|
+
diffs[idx] -= roundGrain;
|
|
80
|
+
grainCount--;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (powDecimalPlaces > 1) return out.map((n) => +(n / powDecimalPlaces).toFixed(decimalPlaces));
|
|
84
|
+
}
|
|
85
|
+
return out;
|
|
86
|
+
}
|
|
87
|
+
function roundArrayOfObjectsToMatchSum(arr, name, max = 100, decimalPlaces = 0) {
|
|
88
|
+
return roundArrayOfNumbersToMatchSum(arr.map((o) => o[name]), max, decimalPlaces).map((o, i) => ({
|
|
89
|
+
...arr[i],
|
|
90
|
+
[name]: o
|
|
91
|
+
}));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
//#endregion
|
|
95
|
+
export { isEven, isHalf, roundArrayOfNumbersToMatchSum, roundArrayOfObjectsToMatchSum, roundDown, roundHalfAwayFromZero, roundHalfDown, roundHalfEven, roundHalfOdd, roundHalfTowardsZero, roundHalfUp, roundUp };
|
|
2
96
|
//# sourceMappingURL=rounding.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rounding.mjs","names":[],"sources":["../../../src/common/data/rounding.ts"],"sourcesContent":["// From https://v2.dinerojs.com/docs/api/formatting/to-unit MIT\n\nimport { sum } from './math'\n\nexport type RoundingMode = (value: number) => number\n\nexport function isHalf(value: number): boolean {\n return Math.abs(value) % 1 === 0.5\n}\nexport function isEven(value: number): boolean {\n return value % 2 === 0\n}\n\nexport const roundUp: RoundingMode = value => Math.ceil(value)\nexport const roundDown: RoundingMode = value => Math.floor(value)\nexport const roundHalfUp: RoundingMode = value => Math.round(value)\n\n/**\n * Round a number with half values to nearest odd integer.\n */\nexport const roundHalfOdd: RoundingMode = (value) => {\n const rounded = Math.round(value)\n if (!isHalf(value))\n return rounded\n\n return isEven(rounded) ? rounded - 1 : rounded\n}\n\n/**\n * Round a number with half values to nearest integer farthest from zero.\n */\nexport const roundHalfAwayFromZero: RoundingMode = (value) => {\n return isHalf(value)\n ? Math.sign(value) * Math.ceil(Math.abs(value))\n : Math.round(value)\n}\n\n/**\n * Round a number with half values down.\n */\nexport const roundHalfDown: RoundingMode = value =>\n isHalf(value) ? Math.floor(value) : Math.round(value)\n\n/**\n * Round a number with half values to nearest even integer.\n * https://wiki.c2.com/?BankersRounding\n */\nexport const roundHalfEven: RoundingMode = (value) => {\n const rounded = Math.round(value)\n if (!isHalf(value))\n return rounded\n\n return isEven(rounded) ? rounded : rounded - 1\n}\n\n/**\n * Round a number with half values to nearest integer closest to zero.\n */\nexport const roundHalfTowardsZero: RoundingMode = value =>\n isHalf(value)\n ? Math.sign(value) * Math.floor(Math.abs(value))\n : Math.round(value)\n\n/**\n * This is useful for percentages that should sum up to 100.\n * But can also be fine tuned.\n *\n * Original from https://github.com/super-ienien/percent-round\n */\nexport function roundArrayOfNumbersToMatchSum(ipt: number[], max = 100, decimalPlaces = 0) {\n const iptPercents: number[] = [...ipt]\n const length = ipt.length\n const out: number[] = []\n out.fill(0, length)\n\n const total = sum(iptPercents)\n\n if (total !== 0) {\n const powDecimalPlaces = 10 ** decimalPlaces\n const pow100 = max * powDecimalPlaces\n let check100 = 0\n for (let i = length - 1; i >= 0; i--) {\n iptPercents[i] = max * iptPercents[i] / total\n check100 += out[i] = Math.round(iptPercents[i] * powDecimalPlaces)\n }\n\n if (check100 !== pow100) {\n const totalDiff = (check100 - pow100)\n const roundGrain = 1\n let grainCount = Math.abs(totalDiff)\n const diffs = iptPercents.map((_, i) => Math.abs(out[i] - iptPercents[i] * powDecimalPlaces))\n\n while (grainCount > 0) {\n let idx = 0\n let maxDiff = diffs[0]\n for (let i = 1; i < length; i++) {\n if (maxDiff < diffs[i]) {\n // avoid negative result\n if (check100 > pow100 && out[i] - roundGrain < 0)\n continue\n idx = i\n maxDiff = diffs[i]\n }\n }\n if (check100 > pow100)\n out[idx] -= roundGrain\n else\n out[idx] += roundGrain\n\n diffs[idx] -= roundGrain\n grainCount--\n }\n }\n\n if (powDecimalPlaces > 1)\n return out.map(n => +((n / powDecimalPlaces).toFixed(decimalPlaces)))\n }\n\n return out\n}\n\nexport function roundArrayOfObjectsToMatchSum<T extends Record<string, any>>(arr: T[], name: string, max = 100, decimalPlaces = 0): T[] {\n return roundArrayOfNumbersToMatchSum(arr.map(o => o[name]), max, decimalPlaces)\n .map((o, i) => ({\n ...arr[i],\n [name]: o,\n }))\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"rounding.mjs","names":[],"sources":["../../../src/common/data/rounding.ts"],"sourcesContent":["// From https://v2.dinerojs.com/docs/api/formatting/to-unit MIT\n\nimport { sum } from './math'\n\nexport type RoundingMode = (value: number) => number\n\nexport function isHalf(value: number): boolean {\n return Math.abs(value) % 1 === 0.5\n}\nexport function isEven(value: number): boolean {\n return value % 2 === 0\n}\n\nexport const roundUp: RoundingMode = value => Math.ceil(value)\nexport const roundDown: RoundingMode = value => Math.floor(value)\nexport const roundHalfUp: RoundingMode = value => Math.round(value)\n\n/**\n * Round a number with half values to nearest odd integer.\n */\nexport const roundHalfOdd: RoundingMode = (value) => {\n const rounded = Math.round(value)\n if (!isHalf(value))\n return rounded\n\n return isEven(rounded) ? rounded - 1 : rounded\n}\n\n/**\n * Round a number with half values to nearest integer farthest from zero.\n */\nexport const roundHalfAwayFromZero: RoundingMode = (value) => {\n return isHalf(value)\n ? Math.sign(value) * Math.ceil(Math.abs(value))\n : Math.round(value)\n}\n\n/**\n * Round a number with half values down.\n */\nexport const roundHalfDown: RoundingMode = value =>\n isHalf(value) ? Math.floor(value) : Math.round(value)\n\n/**\n * Round a number with half values to nearest even integer.\n * https://wiki.c2.com/?BankersRounding\n */\nexport const roundHalfEven: RoundingMode = (value) => {\n const rounded = Math.round(value)\n if (!isHalf(value))\n return rounded\n\n return isEven(rounded) ? rounded : rounded - 1\n}\n\n/**\n * Round a number with half values to nearest integer closest to zero.\n */\nexport const roundHalfTowardsZero: RoundingMode = value =>\n isHalf(value)\n ? Math.sign(value) * Math.floor(Math.abs(value))\n : Math.round(value)\n\n/**\n * This is useful for percentages that should sum up to 100.\n * But can also be fine tuned.\n *\n * Original from https://github.com/super-ienien/percent-round\n */\nexport function roundArrayOfNumbersToMatchSum(ipt: number[], max = 100, decimalPlaces = 0) {\n const iptPercents: number[] = [...ipt]\n const length = ipt.length\n const out: number[] = []\n out.fill(0, length)\n\n const total = sum(iptPercents)\n\n if (total !== 0) {\n const powDecimalPlaces = 10 ** decimalPlaces\n const pow100 = max * powDecimalPlaces\n let check100 = 0\n for (let i = length - 1; i >= 0; i--) {\n iptPercents[i] = max * iptPercents[i] / total\n check100 += out[i] = Math.round(iptPercents[i] * powDecimalPlaces)\n }\n\n if (check100 !== pow100) {\n const totalDiff = (check100 - pow100)\n const roundGrain = 1\n let grainCount = Math.abs(totalDiff)\n const diffs = iptPercents.map((_, i) => Math.abs(out[i] - iptPercents[i] * powDecimalPlaces))\n\n while (grainCount > 0) {\n let idx = 0\n let maxDiff = diffs[0]\n for (let i = 1; i < length; i++) {\n if (maxDiff < diffs[i]) {\n // avoid negative result\n if (check100 > pow100 && out[i] - roundGrain < 0)\n continue\n idx = i\n maxDiff = diffs[i]\n }\n }\n if (check100 > pow100)\n out[idx] -= roundGrain\n else\n out[idx] += roundGrain\n\n diffs[idx] -= roundGrain\n grainCount--\n }\n }\n\n if (powDecimalPlaces > 1)\n return out.map(n => +((n / powDecimalPlaces).toFixed(decimalPlaces)))\n }\n\n return out\n}\n\nexport function roundArrayOfObjectsToMatchSum<T extends Record<string, any>>(arr: T[], name: string, max = 100, decimalPlaces = 0): T[] {\n return roundArrayOfNumbersToMatchSum(arr.map(o => o[name]), max, decimalPlaces)\n .map((o, i) => ({\n ...arr[i],\n [name]: o,\n }))\n}\n"],"mappings":";;;AAMA,SAAgB,OAAO,OAAwB;AAC7C,QAAO,KAAK,IAAI,MAAM,GAAG,MAAM;;AAEjC,SAAgB,OAAO,OAAwB;AAC7C,QAAO,QAAQ,MAAM;;AAGvB,MAAa,WAAwB,UAAS,KAAK,KAAK,MAAM;AAC9D,MAAa,aAA0B,UAAS,KAAK,MAAM,MAAM;AACjE,MAAa,eAA4B,UAAS,KAAK,MAAM,MAAM;;;;AAKnE,MAAa,gBAA8B,UAAU;CACnD,MAAM,UAAU,KAAK,MAAM,MAAM;AACjC,KAAI,CAAC,OAAO,MAAM,CAChB,QAAO;AAET,QAAO,OAAO,QAAQ,GAAG,UAAU,IAAI;;;;;AAMzC,MAAa,yBAAuC,UAAU;AAC5D,QAAO,OAAO,MAAM,GAChB,KAAK,KAAK,MAAM,GAAG,KAAK,KAAK,KAAK,IAAI,MAAM,CAAC,GAC7C,KAAK,MAAM,MAAM;;;;;AAMvB,MAAa,iBAA8B,UACzC,OAAO,MAAM,GAAG,KAAK,MAAM,MAAM,GAAG,KAAK,MAAM,MAAM;;;;;AAMvD,MAAa,iBAA+B,UAAU;CACpD,MAAM,UAAU,KAAK,MAAM,MAAM;AACjC,KAAI,CAAC,OAAO,MAAM,CAChB,QAAO;AAET,QAAO,OAAO,QAAQ,GAAG,UAAU,UAAU;;;;;AAM/C,MAAa,wBAAqC,UAChD,OAAO,MAAM,GACT,KAAK,KAAK,MAAM,GAAG,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,GAC9C,KAAK,MAAM,MAAM;;;;;;;AAQvB,SAAgB,8BAA8B,KAAe,MAAM,KAAK,gBAAgB,GAAG;CACzF,MAAM,cAAwB,CAAC,GAAG,IAAI;CACtC,MAAM,SAAS,IAAI;CACnB,MAAM,MAAgB,EAAE;AACxB,KAAI,KAAK,GAAG,OAAO;CAEnB,MAAM,QAAQ,IAAI,YAAY;AAE9B,KAAI,UAAU,GAAG;EACf,MAAM,mBAAmB,MAAM;EAC/B,MAAM,SAAS,MAAM;EACrB,IAAI,WAAW;AACf,OAAK,IAAI,IAAI,SAAS,GAAG,KAAK,GAAG,KAAK;AACpC,eAAY,KAAK,MAAM,YAAY,KAAK;AACxC,eAAY,IAAI,KAAK,KAAK,MAAM,YAAY,KAAK,iBAAiB;;AAGpE,MAAI,aAAa,QAAQ;GACvB,MAAM,YAAa,WAAW;GAC9B,MAAM,aAAa;GACnB,IAAI,aAAa,KAAK,IAAI,UAAU;GACpC,MAAM,QAAQ,YAAY,KAAK,GAAG,MAAM,KAAK,IAAI,IAAI,KAAK,YAAY,KAAK,iBAAiB,CAAC;AAE7F,UAAO,aAAa,GAAG;IACrB,IAAI,MAAM;IACV,IAAI,UAAU,MAAM;AACpB,SAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,IAC1B,KAAI,UAAU,MAAM,IAAI;AAEtB,SAAI,WAAW,UAAU,IAAI,KAAK,aAAa,EAC7C;AACF,WAAM;AACN,eAAU,MAAM;;AAGpB,QAAI,WAAW,OACb,KAAI,QAAQ;QAEZ,KAAI,QAAQ;AAEd,UAAM,QAAQ;AACd;;;AAIJ,MAAI,mBAAmB,EACrB,QAAO,IAAI,KAAI,MAAK,EAAG,IAAI,kBAAkB,QAAQ,cAAc,CAAE;;AAGzE,QAAO;;AAGT,SAAgB,8BAA6D,KAAU,MAAc,MAAM,KAAK,gBAAgB,GAAQ;AACtI,QAAO,8BAA8B,IAAI,KAAI,MAAK,EAAE,MAAM,EAAE,KAAK,cAAc,CAC5E,KAAK,GAAG,OAAO;EACd,GAAG,IAAI;GACN,OAAO;EACT,EAAE"}
|