zeed 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +50 -211
- package/README.md +16 -0
- package/dist/_experiments/bitcask.cjs +243 -1
- package/dist/_experiments/bitcask.cjs.map +1 -1
- package/dist/_experiments/bitcask.mjs +230 -1
- package/dist/_experiments/bitcask.mjs.map +1 -1
- package/dist/bin-BAoS4qtm.mjs +593 -0
- package/dist/{bin-SPdenYkw.mjs.map → bin-BAoS4qtm.mjs.map} +1 -1
- package/dist/bin-Ddaz2lxM.cjs +862 -0
- package/dist/{bin-Ce3i6ABn.cjs.map → bin-Ddaz2lxM.cjs.map} +1 -1
- package/dist/browser/base64.cjs +14 -1
- package/dist/browser/base64.cjs.map +1 -1
- package/dist/browser/base64.mjs +12 -1
- package/dist/browser/base64.mjs.map +1 -1
- package/dist/browser/gravatar.cjs +186 -1
- package/dist/browser/gravatar.cjs.map +1 -1
- package/dist/browser/gravatar.mjs +184 -1
- package/dist/browser/gravatar.mjs.map +1 -1
- package/dist/browser/index.cjs +14 -1
- package/dist/browser/index.mjs +8 -1
- package/dist/browser/localstorage.cjs +46 -1
- package/dist/browser/localstorage.cjs.map +1 -1
- package/dist/browser/localstorage.mjs +45 -1
- package/dist/browser/localstorage.mjs.map +1 -1
- package/dist/browser/log/index.cjs +8 -1
- package/dist/browser/log/index.mjs +5 -1
- package/dist/browser/log/log-browser-factory.cjs +65 -1
- package/dist/browser/log/log-browser-factory.cjs.map +1 -1
- package/dist/browser/log/log-browser-factory.mjs +64 -1
- package/dist/browser/log/log-browser-factory.mjs.map +1 -1
- package/dist/browser/log/log-browser.cjs +72 -1
- package/dist/browser/log/log-browser.cjs.map +1 -1
- package/dist/browser/log/log-browser.mjs +71 -1
- package/dist/browser/log/log-browser.mjs.map +1 -1
- package/dist/browser/log/log-colors.cjs +11 -1
- package/dist/browser/log/log-colors.cjs.map +1 -1
- package/dist/browser/log/log-colors.mjs +9 -1
- package/dist/browser/log/log-colors.mjs.map +1 -1
- package/dist/browser/log/log-context-browser.cjs +25 -1
- package/dist/browser/log/log-context-browser.cjs.map +1 -1
- package/dist/browser/log/log-context-browser.mjs +23 -1
- package/dist/browser/log/log-context-browser.mjs.map +1 -1
- package/dist/chunk-DQk6qfdC.mjs +18 -0
- package/dist/chunk-uaV2rQ02.cjs +53 -0
- package/dist/common/assert.cjs +22 -1
- package/dist/common/assert.cjs.map +1 -1
- package/dist/common/assert.mjs +19 -1
- package/dist/common/assert.mjs.map +1 -1
- package/dist/common/bin/index.cjs +106 -1
- package/dist/common/bin/index.cjs.map +1 -1
- package/dist/common/bin/index.mjs +98 -1
- package/dist/common/bin/index.mjs.map +1 -1
- package/dist/common/bin/lib0/binary.cjs +146 -1
- package/dist/common/bin/lib0/binary.cjs.map +1 -1
- package/dist/common/bin/lib0/binary.mjs +80 -1
- package/dist/common/bin/lib0/binary.mjs.map +1 -1
- package/dist/common/bin/lib0/buffer.cjs +42 -1
- package/dist/common/bin/lib0/buffer.cjs.map +1 -1
- package/dist/common/bin/lib0/buffer.mjs +38 -1
- package/dist/common/bin/lib0/buffer.mjs.map +1 -1
- package/dist/common/bin/lib0/create.cjs +24 -1
- package/dist/common/bin/lib0/create.cjs.map +1 -1
- package/dist/common/bin/lib0/create.mjs +21 -1
- package/dist/common/bin/lib0/create.mjs.map +1 -1
- package/dist/common/bin/lib0/decoding.cjs +325 -1
- package/dist/common/bin/lib0/decoding.cjs.map +1 -1
- package/dist/common/bin/lib0/decoding.mjs +298 -1
- package/dist/common/bin/lib0/decoding.mjs.map +1 -1
- package/dist/common/bin/lib0/encoding.cjs +404 -1
- package/dist/common/bin/lib0/encoding.cjs.map +1 -1
- package/dist/common/bin/lib0/encoding.mjs +377 -1
- package/dist/common/bin/lib0/encoding.mjs.map +1 -1
- package/dist/common/bin/lib0/string.cjs +81 -1
- package/dist/common/bin/lib0/string.cjs.map +1 -1
- package/dist/common/bin/lib0/string.mjs +71 -1
- package/dist/common/bin/lib0/string.mjs.map +1 -1
- package/dist/common/crypto/aes-sealed.cjs +34 -1
- package/dist/common/crypto/aes-sealed.cjs.map +1 -1
- package/dist/common/crypto/aes-sealed.mjs +32 -1
- package/dist/common/crypto/aes-sealed.mjs.map +1 -1
- package/dist/common/crypto/crypto.cjs +91 -1
- package/dist/common/crypto/crypto.cjs.map +1 -1
- package/dist/common/crypto/crypto.mjs +80 -1
- package/dist/common/crypto/crypto.mjs.map +1 -1
- package/dist/common/crypto/index.cjs +23 -1
- package/dist/common/crypto/index.mjs +5 -1
- package/dist/common/crypto/xaes.cjs +128 -1
- package/dist/common/crypto/xaes.cjs.map +1 -1
- package/dist/common/crypto/xaes.mjs +123 -1
- package/dist/common/crypto/xaes.mjs.map +1 -1
- package/dist/common/csv.cjs +49 -4
- package/dist/common/csv.cjs.map +1 -1
- package/dist/common/csv.mjs +46 -4
- package/dist/common/csv.mjs.map +1 -1
- package/dist/common/data/array.cjs +299 -1
- package/dist/common/data/array.cjs.map +1 -1
- package/dist/common/data/array.mjs +274 -1
- package/dist/common/data/array.mjs.map +1 -1
- package/dist/common/data/basex-secure.cjs +30 -1
- package/dist/common/data/basex-secure.mjs +3 -1
- package/dist/common/data/basex.cjs +163 -1
- package/dist/common/data/basex.cjs.map +1 -1
- package/dist/common/data/basex.mjs +152 -1
- package/dist/common/data/basex.mjs.map +1 -1
- package/dist/common/data/bin-types.mjs +1 -1
- package/dist/common/data/bin.cjs +21 -1
- package/dist/common/data/bin.mjs +3 -1
- package/dist/common/data/camelcase.cjs +27 -1
- package/dist/common/data/camelcase.cjs.map +1 -1
- package/dist/common/data/camelcase.mjs +22 -1
- package/dist/common/data/camelcase.mjs.map +1 -1
- package/dist/common/data/convert.cjs +104 -1
- package/dist/common/data/convert.cjs.map +1 -1
- package/dist/common/data/convert.mjs +88 -1
- package/dist/common/data/convert.mjs.map +1 -1
- package/dist/common/data/datauri.cjs +32 -1
- package/dist/common/data/datauri.cjs.map +1 -1
- package/dist/common/data/datauri.mjs +27 -1
- package/dist/common/data/datauri.mjs.map +1 -1
- package/dist/common/data/day-legacy.cjs +148 -1
- package/dist/common/data/day-legacy.cjs.map +1 -1
- package/dist/common/data/day-legacy.mjs +143 -1
- package/dist/common/data/day-legacy.mjs.map +1 -1
- package/dist/common/data/day.cjs +335 -1
- package/dist/common/data/day.cjs.map +1 -1
- package/dist/common/data/day.mjs +305 -1
- package/dist/common/data/day.mjs.map +1 -1
- package/dist/common/data/decimal.cjs +28 -1
- package/dist/common/data/decimal.cjs.map +1 -1
- package/dist/common/data/decimal.mjs +23 -1
- package/dist/common/data/decimal.mjs.map +1 -1
- package/dist/common/data/deep.cjs +57 -1
- package/dist/common/data/deep.cjs.map +1 -1
- package/dist/common/data/deep.mjs +54 -1
- package/dist/common/data/deep.mjs.map +1 -1
- package/dist/common/data/diff.cjs +62 -1
- package/dist/common/data/diff.cjs.map +1 -1
- package/dist/common/data/diff.mjs +60 -1
- package/dist/common/data/diff.mjs.map +1 -1
- package/dist/common/data/distributed.cjs +24 -1
- package/dist/common/data/distributed.cjs.map +1 -1
- package/dist/common/data/distributed.mjs +22 -1
- package/dist/common/data/distributed.mjs.map +1 -1
- package/dist/common/data/format.cjs +63 -1
- package/dist/common/data/format.cjs.map +1 -1
- package/dist/common/data/format.mjs +59 -1
- package/dist/common/data/format.mjs.map +1 -1
- package/dist/common/data/html.cjs +13 -1
- package/dist/common/data/html.cjs.map +1 -1
- package/dist/common/data/html.mjs +10 -1
- package/dist/common/data/html.mjs.map +1 -1
- package/dist/common/data/index.cjs +296 -1
- package/dist/common/data/index.mjs +37 -1
- package/dist/common/data/is.cjs +106 -1
- package/dist/common/data/is.cjs.map +1 -1
- package/dist/common/data/is.mjs +85 -1
- package/dist/common/data/is.mjs.map +1 -1
- package/dist/common/data/json.cjs +70 -1
- package/dist/common/data/json.cjs.map +1 -1
- package/dist/common/data/json.mjs +65 -1
- package/dist/common/data/json.mjs.map +1 -1
- package/dist/common/data/list.cjs +32 -1
- package/dist/common/data/list.cjs.map +1 -1
- package/dist/common/data/list.mjs +27 -1
- package/dist/common/data/list.mjs.map +1 -1
- package/dist/common/data/lru.mjs +1 -1
- package/dist/common/data/math.cjs +79 -1
- package/dist/common/data/math.cjs.map +1 -1
- package/dist/common/data/math.mjs +65 -1
- package/dist/common/data/math.mjs.map +1 -1
- package/dist/common/data/message.cjs +30 -1
- package/dist/common/data/message.cjs.map +1 -1
- package/dist/common/data/message.mjs +28 -1
- package/dist/common/data/message.mjs.map +1 -1
- package/dist/common/data/object-changes.cjs +66 -1
- package/dist/common/data/object-changes.cjs.map +1 -1
- package/dist/common/data/object-changes.mjs +63 -1
- package/dist/common/data/object-changes.mjs.map +1 -1
- package/dist/common/data/object.cjs +112 -1
- package/dist/common/data/object.cjs.map +1 -1
- package/dist/common/data/object.mjs +104 -1
- package/dist/common/data/object.mjs.map +1 -1
- package/dist/common/data/orderby.cjs +42 -1
- package/dist/common/data/orderby.cjs.map +1 -1
- package/dist/common/data/orderby.mjs +37 -1
- package/dist/common/data/orderby.mjs.map +1 -1
- package/dist/common/data/path.cjs +26 -1
- package/dist/common/data/path.cjs.map +1 -1
- package/dist/common/data/path.mjs +25 -1
- package/dist/common/data/path.mjs.map +1 -1
- package/dist/common/data/regexp.cjs +12 -1
- package/dist/common/data/regexp.cjs.map +1 -1
- package/dist/common/data/regexp.mjs +10 -1
- package/dist/common/data/regexp.mjs.map +1 -1
- package/dist/common/data/rounding.cjs +107 -1
- package/dist/common/data/rounding.cjs.map +1 -1
- package/dist/common/data/rounding.mjs +95 -1
- package/dist/common/data/rounding.mjs.map +1 -1
- package/dist/common/data/signal.cjs +39 -1
- package/dist/common/data/signal.cjs.map +1 -1
- package/dist/common/data/signal.mjs +38 -1
- package/dist/common/data/signal.mjs.map +1 -1
- package/dist/common/data/sortable.cjs +35 -1
- package/dist/common/data/sortable.cjs.map +1 -1
- package/dist/common/data/sortable.mjs +31 -1
- package/dist/common/data/sortable.mjs.map +1 -1
- package/dist/common/data/sorted.cjs +54 -1
- package/dist/common/data/sorted.cjs.map +1 -1
- package/dist/common/data/sorted.mjs +53 -1
- package/dist/common/data/sorted.mjs.map +1 -1
- package/dist/common/data/string-deburr.cjs +240 -1
- package/dist/common/data/string-deburr.cjs.map +1 -1
- package/dist/common/data/string-deburr.mjs +238 -1
- package/dist/common/data/string-deburr.mjs.map +1 -1
- package/dist/common/data/string-hash-fnv.cjs +69 -1
- package/dist/common/data/string-hash-fnv.cjs.map +1 -1
- package/dist/common/data/string-hash-fnv.mjs +67 -1
- package/dist/common/data/string-hash-fnv.mjs.map +1 -1
- package/dist/common/data/string-hash-pool.cjs +28 -1
- package/dist/common/data/string-hash-pool.cjs.map +1 -1
- package/dist/common/data/string-hash-pool.mjs +27 -1
- package/dist/common/data/string-hash-pool.mjs.map +1 -1
- package/dist/common/data/url.cjs +98 -2
- package/dist/common/data/url.cjs.map +1 -1
- package/dist/common/data/url.mjs +91 -2
- package/dist/common/data/url.mjs.map +1 -1
- package/dist/common/data/utils.cjs +118 -1
- package/dist/common/data/utils.cjs.map +1 -1
- package/dist/common/data/utils.mjs +107 -1
- package/dist/common/data/utils.mjs.map +1 -1
- package/dist/common/data/wordlist.cjs +531 -1
- package/dist/common/data/wordlist.cjs.map +1 -1
- package/dist/common/data/wordlist.mjs +529 -1
- package/dist/common/data/wordlist.mjs.map +1 -1
- package/dist/common/data/xrx.cjs +96 -1
- package/dist/common/data/xrx.cjs.map +1 -1
- package/dist/common/data/xrx.mjs +92 -1
- package/dist/common/data/xrx.mjs.map +1 -1
- package/dist/common/dispose-defer.cjs +133 -1
- package/dist/common/dispose-defer.cjs.map +1 -1
- package/dist/common/dispose-defer.mjs +130 -1
- package/dist/common/dispose-defer.mjs.map +1 -1
- package/dist/common/dispose-types.mjs +1 -1
- package/dist/common/dispose-utils.cjs +113 -1
- package/dist/common/dispose-utils.cjs.map +1 -1
- package/dist/common/dispose-utils.mjs +106 -1
- package/dist/common/dispose-utils.mjs.map +1 -1
- package/dist/common/exec/index.cjs +24 -1
- package/dist/common/exec/index.d.cts +1 -1
- package/dist/common/exec/index.d.mts +1 -1
- package/dist/common/exec/index.mjs +8 -1
- package/dist/common/exec/mutex.cjs +44 -1
- package/dist/common/exec/mutex.cjs.map +1 -1
- package/dist/common/exec/mutex.mjs +42 -1
- package/dist/common/exec/mutex.mjs.map +1 -1
- package/dist/common/exec/pool.cjs +181 -1
- package/dist/common/exec/pool.cjs.map +1 -1
- package/dist/common/exec/pool.d.cts +1 -1
- package/dist/common/exec/pool.d.mts +1 -1
- package/dist/common/exec/pool.mjs +180 -1
- package/dist/common/exec/pool.mjs.map +1 -1
- package/dist/common/exec/progress.cjs +149 -1
- package/dist/common/exec/progress.cjs.map +1 -1
- package/dist/common/exec/progress.d.cts +1 -1
- package/dist/common/exec/progress.d.mts +1 -1
- package/dist/common/exec/progress.mjs +148 -1
- package/dist/common/exec/progress.mjs.map +1 -1
- package/dist/common/exec/promise.cjs +113 -1
- package/dist/common/exec/promise.cjs.map +1 -1
- package/dist/common/exec/promise.mjs +103 -1
- package/dist/common/exec/promise.mjs.map +1 -1
- package/dist/common/exec/queue.cjs +125 -1
- package/dist/common/exec/queue.cjs.map +1 -1
- package/dist/common/exec/queue.d.cts +1 -1
- package/dist/common/exec/queue.d.mts +1 -1
- package/dist/common/exec/queue.mjs +124 -1
- package/dist/common/exec/queue.mjs.map +1 -1
- package/dist/common/exec/throttle-debounce.cjs +114 -1
- package/dist/common/exec/throttle-debounce.cjs.map +1 -1
- package/dist/common/exec/throttle-debounce.mjs +112 -1
- package/dist/common/exec/throttle-debounce.mjs.map +1 -1
- package/dist/common/global.cjs +22 -1
- package/dist/common/global.cjs.map +1 -1
- package/dist/common/global.mjs +19 -1
- package/dist/common/global.mjs.map +1 -1
- package/dist/common/index.cjs +559 -1
- package/dist/common/index.d.cts +1 -1
- package/dist/common/index.d.mts +1 -1
- package/dist/common/index.mjs +89 -1
- package/dist/common/localhost.cjs +16 -1
- package/dist/common/localhost.cjs.map +1 -1
- package/dist/common/localhost.mjs +14 -1
- package/dist/common/localhost.mjs.map +1 -1
- package/dist/common/log/index.cjs +34 -1
- package/dist/common/log/index.mjs +11 -1
- package/dist/common/log/log-base.cjs +40 -1
- package/dist/common/log/log-base.cjs.map +1 -1
- package/dist/common/log/log-base.mjs +31 -1
- package/dist/common/log/log-base.mjs.map +1 -1
- package/dist/common/log/log-colors.cjs +92 -1
- package/dist/common/log/log-colors.cjs.map +1 -1
- package/dist/common/log/log-colors.mjs +90 -1
- package/dist/common/log/log-colors.mjs.map +1 -1
- package/dist/common/log/log-config.cjs +15 -1
- package/dist/common/log/log-config.cjs.map +1 -1
- package/dist/common/log/log-config.mjs +14 -1
- package/dist/common/log/log-config.mjs.map +1 -1
- package/dist/common/log/log-console-capture.cjs +33 -1
- package/dist/common/log/log-console-capture.cjs.map +1 -1
- package/dist/common/log/log-console-capture.mjs +32 -1
- package/dist/common/log/log-console-capture.mjs.map +1 -1
- package/dist/common/log/log-console-original.cjs +27 -1
- package/dist/common/log/log-console-original.cjs.map +1 -1
- package/dist/common/log/log-console-original.mjs +26 -1
- package/dist/common/log/log-console-original.mjs.map +1 -1
- package/dist/common/log/log-console.cjs +39 -1
- package/dist/common/log/log-console.cjs.map +1 -1
- package/dist/common/log/log-console.mjs +38 -1
- package/dist/common/log/log-console.mjs.map +1 -1
- package/dist/common/log/log-context.cjs +109 -1
- package/dist/common/log/log-context.cjs.map +1 -1
- package/dist/common/log/log-context.mjs +108 -1
- package/dist/common/log/log-context.mjs.map +1 -1
- package/dist/common/log/log-filter.cjs +80 -1
- package/dist/common/log/log-filter.cjs.map +1 -1
- package/dist/common/log/log-filter.mjs +75 -1
- package/dist/common/log/log-filter.mjs.map +1 -1
- package/dist/common/log/log-memory.cjs +45 -1
- package/dist/common/log/log-memory.cjs.map +1 -1
- package/dist/common/log/log-memory.mjs +43 -1
- package/dist/common/log/log-memory.mjs.map +1 -1
- package/dist/common/log/log-noop.cjs +17 -1
- package/dist/common/log/log-noop.cjs.map +1 -1
- package/dist/common/log/log-noop.mjs +15 -1
- package/dist/common/log/log-noop.mjs.map +1 -1
- package/dist/common/log/log.cjs +46 -1
- package/dist/common/log/log.cjs.map +1 -1
- package/dist/common/log/log.mjs +43 -1
- package/dist/common/log/log.mjs.map +1 -1
- package/dist/common/msg/channel-debug.cjs +17 -1
- package/dist/common/msg/channel-debug.cjs.map +1 -1
- package/dist/common/msg/channel-debug.d.cts +1 -1
- package/dist/common/msg/channel-debug.d.mts +1 -1
- package/dist/common/msg/channel-debug.mjs +16 -1
- package/dist/common/msg/channel-debug.mjs.map +1 -1
- package/dist/common/msg/channel-local.cjs +28 -1
- package/dist/common/msg/channel-local.cjs.map +1 -1
- package/dist/common/msg/channel-local.d.cts +1 -1
- package/dist/common/msg/channel-local.d.mts +1 -1
- package/dist/common/msg/channel-local.mjs +26 -1
- package/dist/common/msg/channel-local.mjs.map +1 -1
- package/dist/common/msg/channel-resilient.cjs +63 -1
- package/dist/common/msg/channel-resilient.cjs.map +1 -1
- package/dist/common/msg/channel-resilient.d.cts +1 -1
- package/dist/common/msg/channel-resilient.d.mts +1 -1
- package/dist/common/msg/channel-resilient.mjs +62 -1
- package/dist/common/msg/channel-resilient.mjs.map +1 -1
- package/dist/common/msg/channel-wkwebview.cjs +35 -1
- package/dist/common/msg/channel-wkwebview.cjs.map +1 -1
- package/dist/common/msg/channel-wkwebview.d.cts +2 -1
- package/dist/common/msg/channel-wkwebview.d.mts +2 -1
- package/dist/common/msg/channel-wkwebview.mjs +34 -1
- package/dist/common/msg/channel-wkwebview.mjs.map +1 -1
- package/dist/common/msg/channel.cjs +23 -1
- package/dist/common/msg/channel.cjs.map +1 -1
- package/dist/common/msg/channel.d.cts +1 -1
- package/dist/common/msg/channel.d.mts +1 -1
- package/dist/common/msg/channel.mjs +22 -1
- package/dist/common/msg/channel.mjs.map +1 -1
- package/dist/common/msg/emitter.cjs +141 -1
- package/dist/common/msg/emitter.cjs.map +1 -1
- package/dist/common/msg/emitter.d.cts +1 -1
- package/dist/common/msg/emitter.d.mts +1 -1
- package/dist/common/msg/emitter.mjs +139 -1
- package/dist/common/msg/emitter.mjs.map +1 -1
- package/dist/common/msg/encoder.cjs +38 -1
- package/dist/common/msg/encoder.cjs.map +1 -1
- package/dist/common/msg/encoder.mjs +35 -1
- package/dist/common/msg/encoder.mjs.map +1 -1
- package/dist/common/msg/index.cjs +28 -1
- package/dist/common/msg/index.d.cts +1 -1
- package/dist/common/msg/index.d.mts +1 -1
- package/dist/common/msg/index.mjs +11 -1
- package/dist/common/msg/messages.cjs +135 -1
- package/dist/common/msg/messages.cjs.map +1 -1
- package/dist/common/msg/messages.d.cts +1 -1
- package/dist/common/msg/messages.d.mts +1 -1
- package/dist/common/msg/messages.mjs +133 -1
- package/dist/common/msg/messages.mjs.map +1 -1
- package/dist/common/msg/pipe.mjs +1 -1
- package/dist/common/msg/pubsub.cjs +78 -1
- package/dist/common/msg/pubsub.cjs.map +1 -1
- package/dist/common/msg/pubsub.d.cts +1 -1
- package/dist/common/msg/pubsub.d.mts +1 -1
- package/dist/common/msg/pubsub.mjs +76 -1
- package/dist/common/msg/pubsub.mjs.map +1 -1
- package/dist/common/msg/rpc.cjs +142 -1
- package/dist/common/msg/rpc.cjs.map +1 -1
- package/dist/common/msg/rpc.mjs +139 -1
- package/dist/common/msg/rpc.mjs.map +1 -1
- package/dist/common/network.cjs +129 -1
- package/dist/common/network.cjs.map +1 -1
- package/dist/common/network.mjs +122 -1
- package/dist/common/network.mjs.map +1 -1
- package/dist/common/platform.cjs +92 -1
- package/dist/common/platform.cjs.map +1 -1
- package/dist/common/platform.mjs +84 -1
- package/dist/common/platform.mjs.map +1 -1
- package/dist/common/schema/_sandbox/sandbox-inherit.mjs +1 -1
- package/dist/common/schema/_sandbox/sandbox.mjs +1 -1
- package/dist/common/schema/_sandbox/sandbox.xspec.mjs +1 -1
- package/dist/common/schema/export-json-schema.cjs +54 -1
- package/dist/common/schema/export-json-schema.cjs.map +1 -1
- package/dist/common/schema/export-json-schema.mjs +52 -1
- package/dist/common/schema/export-json-schema.mjs.map +1 -1
- package/dist/common/schema/export-swift.cjs +30 -2
- package/dist/common/schema/export-swift.cjs.map +1 -1
- package/dist/common/schema/export-swift.mjs +29 -2
- package/dist/common/schema/export-swift.mjs.map +1 -1
- package/dist/common/schema/export-typescript.cjs +20 -2
- package/dist/common/schema/export-typescript.cjs.map +1 -1
- package/dist/common/schema/export-typescript.mjs +19 -2
- package/dist/common/schema/export-typescript.mjs.map +1 -1
- package/dist/common/schema/index.cjs +55 -1
- package/dist/common/schema/index.mjs +12 -1
- package/dist/common/schema/parse-args.cjs +62 -2
- package/dist/common/schema/parse-args.cjs.map +1 -1
- package/dist/common/schema/parse-args.mjs +60 -2
- package/dist/common/schema/parse-args.mjs.map +1 -1
- package/dist/common/schema/parse-env.cjs +48 -3
- package/dist/common/schema/parse-env.cjs.map +1 -1
- package/dist/common/schema/parse-env.mjs +46 -3
- package/dist/common/schema/parse-env.mjs.map +1 -1
- package/dist/common/schema/parse-object.cjs +122 -1
- package/dist/common/schema/parse-object.cjs.map +1 -1
- package/dist/common/schema/parse-object.mjs +119 -1
- package/dist/common/schema/parse-object.mjs.map +1 -1
- package/dist/common/schema/schema-standard.mjs +1 -1
- package/dist/common/schema/schema.cjs +423 -1
- package/dist/common/schema/schema.cjs.map +1 -1
- package/dist/common/schema/schema.mjs +404 -1
- package/dist/common/schema/schema.mjs.map +1 -1
- package/dist/common/schema/serialize.cjs +109 -1
- package/dist/common/schema/serialize.cjs.map +1 -1
- package/dist/common/schema/serialize.mjs +107 -1
- package/dist/common/schema/serialize.mjs.map +1 -1
- package/dist/common/schema/type-test.mjs +1 -1
- package/dist/common/schema/utils.cjs +25 -1
- package/dist/common/schema/utils.cjs.map +1 -1
- package/dist/common/schema/utils.mjs +19 -1
- package/dist/common/schema/utils.mjs.map +1 -1
- package/dist/common/schema/z-collection.cjs +51 -1
- package/dist/common/schema/z-collection.mjs +27 -1
- package/dist/common/schema/z.cjs +9 -1
- package/dist/common/schema/z.mjs +3 -1
- package/dist/common/storage/index.cjs +4 -1
- package/dist/common/storage/index.mjs +3 -1
- package/dist/common/storage/memstorage.cjs +26 -1
- package/dist/common/storage/memstorage.cjs.map +1 -1
- package/dist/common/storage/memstorage.mjs +25 -1
- package/dist/common/storage/memstorage.mjs.map +1 -1
- package/dist/common/test.cjs +14 -1
- package/dist/common/test.cjs.map +1 -1
- package/dist/common/test.mjs +13 -1
- package/dist/common/test.mjs.map +1 -1
- package/dist/common/time.cjs +220 -1
- package/dist/common/time.cjs.map +1 -1
- package/dist/common/time.mjs +194 -1
- package/dist/common/time.mjs.map +1 -1
- package/dist/common/timeout.cjs +27 -1
- package/dist/common/timeout.cjs.map +1 -1
- package/dist/common/timeout.mjs +25 -1
- package/dist/common/timeout.mjs.map +1 -1
- package/dist/common/types.mjs +1 -1
- package/dist/common/utils.cjs +7 -1
- package/dist/common/utils.cjs.map +1 -1
- package/dist/common/utils.mjs +5 -1
- package/dist/common/utils.mjs.map +1 -1
- package/dist/common/uuid.cjs +307 -1
- package/dist/common/uuid.cjs.map +1 -1
- package/dist/common/uuid.mjs +284 -1
- package/dist/common/uuid.mjs.map +1 -1
- package/dist/{index-DHXVOH8h.d.cts → index-CFkMqHvX.d.cts} +1 -2
- package/dist/{index-DMaPyx9O.d.mts → index-C_3Y_s6f.d.mts} +1 -2
- package/dist/index.all.cjs +641 -1
- package/dist/index.all.d.cts +1 -1
- package/dist/index.all.d.mts +1 -1
- package/dist/index.all.mjs +113 -1
- package/dist/index.browser.cjs +576 -1
- package/dist/index.browser.d.cts +1 -1
- package/dist/index.browser.d.mts +1 -1
- package/dist/index.browser.mjs +98 -1
- package/dist/index.jsr.cjs +57 -1
- package/dist/index.jsr.mjs +6 -1
- package/dist/index.node.cjs +628 -1
- package/dist/index.node.d.cts +1 -1
- package/dist/index.node.d.mts +1 -1
- package/dist/index.node.mjs +106 -1
- package/dist/node/args.cjs +56 -1
- package/dist/node/args.cjs.map +1 -1
- package/dist/node/args.mjs +53 -1
- package/dist/node/args.mjs.map +1 -1
- package/dist/node/clipboard.cjs +18 -1
- package/dist/node/clipboard.cjs.map +1 -1
- package/dist/node/clipboard.mjs +16 -1
- package/dist/node/clipboard.mjs.map +1 -1
- package/dist/node/crypto.cjs +28 -1
- package/dist/node/crypto.cjs.map +1 -1
- package/dist/node/crypto.mjs +24 -1
- package/dist/node/crypto.mjs.map +1 -1
- package/dist/node/env.cjs +100 -4
- package/dist/node/env.cjs.map +1 -1
- package/dist/node/env.mjs +90 -4
- package/dist/node/env.mjs.map +1 -1
- package/dist/node/files-async.cjs +66 -1
- package/dist/node/files-async.cjs.map +1 -1
- package/dist/node/files-async.mjs +60 -1
- package/dist/node/files-async.mjs.map +1 -1
- package/dist/node/files.cjs +52 -1
- package/dist/node/files.cjs.map +1 -1
- package/dist/node/files.mjs +46 -1
- package/dist/node/files.mjs.map +1 -1
- package/dist/node/filestorage.cjs +100 -1
- package/dist/node/filestorage.cjs.map +1 -1
- package/dist/node/filestorage.mjs +97 -1
- package/dist/node/filestorage.mjs.map +1 -1
- package/dist/node/fs.cjs +119 -1
- package/dist/node/fs.cjs.map +1 -1
- package/dist/node/fs.mjs +101 -1
- package/dist/node/fs.mjs.map +1 -1
- package/dist/node/glob.cjs +75 -1
- package/dist/node/glob.cjs.map +1 -1
- package/dist/node/glob.mjs +73 -1
- package/dist/node/glob.mjs.map +1 -1
- package/dist/node/index.cjs +66 -1
- package/dist/node/index.mjs +16 -1
- package/dist/node/log/index.cjs +20 -1
- package/dist/node/log/index.mjs +7 -1
- package/dist/node/log/log-context-node.cjs +39 -1
- package/dist/node/log/log-context-node.cjs.map +1 -1
- package/dist/node/log/log-context-node.mjs +35 -1
- package/dist/node/log/log-context-node.mjs.map +1 -1
- package/dist/node/log/log-file-rotation.cjs +71 -1
- package/dist/node/log/log-file-rotation.cjs.map +1 -1
- package/dist/node/log/log-file-rotation.mjs +68 -1
- package/dist/node/log/log-file-rotation.mjs.map +1 -1
- package/dist/node/log/log-file.cjs +57 -1
- package/dist/node/log/log-file.cjs.map +1 -1
- package/dist/node/log/log-file.mjs +54 -1
- package/dist/node/log/log-file.mjs.map +1 -1
- package/dist/node/log/log-node.cjs +162 -1
- package/dist/node/log/log-node.cjs.map +1 -1
- package/dist/node/log/log-node.mjs +155 -1
- package/dist/node/log/log-node.mjs.map +1 -1
- package/dist/node/log/log-rotation.cjs +543 -3
- package/dist/node/log/log-rotation.cjs.map +1 -1
- package/dist/node/log/log-rotation.mjs +538 -3
- package/dist/node/log/log-rotation.mjs.map +1 -1
- package/dist/node/log/log-util.cjs +69 -3
- package/dist/node/log/log-util.cjs.map +1 -1
- package/dist/node/log/log-util.mjs +63 -3
- package/dist/node/log/log-util.mjs.map +1 -1
- package/dist/node/open-browser.cjs +20 -1
- package/dist/node/open-browser.cjs.map +1 -1
- package/dist/node/open-browser.mjs +18 -1
- package/dist/node/open-browser.mjs.map +1 -1
- package/package.json +15 -15
- package/src/common/schema/README.md +247 -66
- package/src/eslint-defaults.js +4 -0
- package/src/index.spec.ts +6 -6
- package/dist/bin-Ce3i6ABn.cjs +0 -3
- package/dist/bin-SPdenYkw.mjs +0 -3
- package/dist/chunk-0Lt9GpW0.mjs +0 -1
- package/dist/chunk-D-qHiVGv.cjs +0 -1
- package/src/common/schema/README-SCHEMA.md +0 -0
package/dist/common/data/url.cjs
CHANGED
|
@@ -1,3 +1,99 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,
|
|
2
|
-
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_common_data_html = require('./html.cjs');
|
|
3
|
+
|
|
4
|
+
//#region src/common/data/url.ts
|
|
5
|
+
function toHumanReadableUrl(url) {
|
|
6
|
+
return url.replace(/^(https?:\/\/(www\.)?|mailto:)/gi, "").replace(/\/$/, "");
|
|
7
|
+
}
|
|
8
|
+
const RX_URL = /((?:(?:https?|ftp):)?\/\/(?:\S+@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[01])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4])|(?:(?:[a-z0-9\u00A1-\uFFFF][\w\u00A1-\uFFFF-]{0,62})?[a-z0-9\u00A1-\uFFFF]\.)+[a-z\u00A1-\uFFFF]{2,}\.?)(?::\d{2,5})?(?:[/?#]\S*)?)/gi;
|
|
9
|
+
/** @deprecated use linkifyPlainText */
|
|
10
|
+
function linkifyPlainTextSimple(text) {
|
|
11
|
+
return text.split(RX_URL).map((part, i) => {
|
|
12
|
+
const escapedPart = require_common_data_html.escapeHTML(part);
|
|
13
|
+
return i % 2 ? `<a target="_blank" rel="noopener noreferrer" href="${escapedPart}">${toHumanReadableUrl(escapedPart)}</a>` : escapedPart;
|
|
14
|
+
}).join("");
|
|
15
|
+
}
|
|
16
|
+
const RX_EMAIL = /((mailto:)?[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})/gi;
|
|
17
|
+
const RX_SIMPLE_URL = /([a-zA-Z0-9]+\.[a-zA-Z]{2,})/gi;
|
|
18
|
+
function handleUrlString(part) {
|
|
19
|
+
var url = part;
|
|
20
|
+
var rests = [];
|
|
21
|
+
const urlWithoutPunctuation = url.replace(/[.,!?;:]*$/, "");
|
|
22
|
+
rests.unshift(url.slice(urlWithoutPunctuation.length));
|
|
23
|
+
if (url.includes("://")) {
|
|
24
|
+
url = urlWithoutPunctuation;
|
|
25
|
+
const openingBrackets = (url.match(/[\(\[\{]/g) || []).length;
|
|
26
|
+
const closingBrackets = (url.match(/[\)\]\}]/g) || []).length;
|
|
27
|
+
if (closingBrackets > openingBrackets) {
|
|
28
|
+
const diff = closingBrackets - openingBrackets;
|
|
29
|
+
const rx = new RegExp(`[\\)\\]\\}]{0,${diff}}$`, "g");
|
|
30
|
+
const urlWithoutTrailing = url.replace(rx, "");
|
|
31
|
+
rests.unshift(url.slice(urlWithoutTrailing.length));
|
|
32
|
+
url = urlWithoutTrailing;
|
|
33
|
+
}
|
|
34
|
+
} else if (url.includes("@")) {
|
|
35
|
+
if (!url.startsWith("mailto:")) url = `mailto:${urlWithoutPunctuation}`;
|
|
36
|
+
} else url = `https://${urlWithoutPunctuation}`;
|
|
37
|
+
const escapedRest = require_common_data_html.escapeHTML(rests.join(""));
|
|
38
|
+
const escapedHumanReadableUrl = require_common_data_html.escapeHTML(toHumanReadableUrl(url));
|
|
39
|
+
const escapedUrl = require_common_data_html.escapeHTML(url);
|
|
40
|
+
return `<a target="_blank" rel="noopener noreferrer"${url.startsWith("http://") ? " class=\"_warn\"" : ""} href="${escapedUrl}">${escapedHumanReadableUrl}</a>${escapedRest}`;
|
|
41
|
+
}
|
|
42
|
+
var rxJoined = void 0;
|
|
43
|
+
function linkifyPlainText(text, options = {}) {
|
|
44
|
+
if (rxJoined == null) rxJoined = new RegExp(`((${RX_URL.source})|(${RX_EMAIL.source})|(${RX_SIMPLE_URL.source}))`, "gi");
|
|
45
|
+
else rxJoined.lastIndex = 0;
|
|
46
|
+
var index = 0;
|
|
47
|
+
const parts = [];
|
|
48
|
+
text.replace(rxJoined, (match, ...args) => {
|
|
49
|
+
const offset = args[args.length - 2];
|
|
50
|
+
const leading = text.slice(index, offset) ?? "";
|
|
51
|
+
parts.push(require_common_data_html.escapeHTML(leading));
|
|
52
|
+
index = offset + match.length;
|
|
53
|
+
parts.push(handleUrlString(match));
|
|
54
|
+
return match;
|
|
55
|
+
});
|
|
56
|
+
return parts.join("") + require_common_data_html.escapeHTML(text.slice(index));
|
|
57
|
+
}
|
|
58
|
+
function linkifyPlainTextWithLineBreaks(text, options = {}) {
|
|
59
|
+
return text.split("\n").map((l) => linkifyPlainText(l, options)).join("<br>");
|
|
60
|
+
}
|
|
61
|
+
function encodeQuery(data, filterValue) {
|
|
62
|
+
const pairs = [];
|
|
63
|
+
for (let [key, value] of Object.entries(data)) if (value != null) {
|
|
64
|
+
if (!Array.isArray(value)) value = [value];
|
|
65
|
+
for (const v of value) {
|
|
66
|
+
if (filterValue && !filterValue(v)) continue;
|
|
67
|
+
else if (v == null) continue;
|
|
68
|
+
pairs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(v))}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return pairs.join("&");
|
|
72
|
+
}
|
|
73
|
+
function parseQuery(queryString) {
|
|
74
|
+
const query = {};
|
|
75
|
+
while (queryString.startsWith("?")) queryString = queryString.substring(1);
|
|
76
|
+
const pairs = queryString.split("&");
|
|
77
|
+
for (let i = 0; i < pairs.length; i++) {
|
|
78
|
+
const part = pairs[i];
|
|
79
|
+
const idx = part.indexOf("=");
|
|
80
|
+
if (part.length === 0) continue;
|
|
81
|
+
const key = idx < 0 ? part : decodeURIComponent(part.substring(0, idx));
|
|
82
|
+
const value = idx < 0 ? "" : decodeURIComponent(part.substring(idx + 1));
|
|
83
|
+
if (query[key] != null) {
|
|
84
|
+
if (!Array.isArray(query[key])) query[key] = [query[key]];
|
|
85
|
+
query[key].push(value);
|
|
86
|
+
} else query[key] = value;
|
|
87
|
+
}
|
|
88
|
+
return query;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
//#endregion
|
|
92
|
+
exports.RX_URL = RX_URL;
|
|
93
|
+
exports.encodeQuery = encodeQuery;
|
|
94
|
+
exports.linkifyPlainText = linkifyPlainText;
|
|
95
|
+
exports.linkifyPlainTextSimple = linkifyPlainTextSimple;
|
|
96
|
+
exports.linkifyPlainTextWithLineBreaks = linkifyPlainTextWithLineBreaks;
|
|
97
|
+
exports.parseQuery = parseQuery;
|
|
98
|
+
exports.toHumanReadableUrl = toHumanReadableUrl;
|
|
3
99
|
//# sourceMappingURL=url.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url.cjs","names":["escapeHTML"],"sources":["../../../src/common/data/url.ts"],"sourcesContent":["// https://mathiasbynens.be/demo/url-regex\n// https://gist.github.com/dperini/729294\n\nimport { escapeHTML } from './html'\n\n/// Remove scheme, www. and trailing slash for display purposes\nexport function toHumanReadableUrl(url: string): string {\n return url.replace(/^(https?:\\/\\/(www\\.)?|mailto:)/gi, '').replace(/\\/$/, '')\n}\n\n//\n\nexport const RX_URL = /((?:(?:https?|ftp):)?\\/\\/(?:\\S+@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[01])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4])|(?:(?:[a-z0-9\\u00A1-\\uFFFF][\\w\\u00A1-\\uFFFF-]{0,62})?[a-z0-9\\u00A1-\\uFFFF]\\.)+[a-z\\u00A1-\\uFFFF]{2,}\\.?)(?::\\d{2,5})?(?:[/?#]\\S*)?)/gi\n\n/** @deprecated use linkifyPlainText */\nexport function linkifyPlainTextSimple(text: string): string {\n return text\n .split(RX_URL)\n .map((part, i) => {\n const escapedPart = escapeHTML(part)\n return i % 2\n ? `<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"${escapedPart}\">${toHumanReadableUrl(\n escapedPart,\n )}</a>`\n : escapedPart\n })\n .join('')\n}\n\n// Advanced implementation that also handles email addresses and simple URLs without protocol\n\nconst RX_EMAIL = /((mailto:)?[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})/gi\nconst RX_SIMPLE_URL = /([a-zA-Z0-9]+\\.[a-zA-Z]{2,})/gi\n\nfunction handleUrlString(part: string): string {\n var url = part\n var rests = []\n\n // Remove trailing punctuation from URLs\n const urlWithoutPunctuation = url.replace(/[.,!?;:]*$/, '')\n rests.unshift(url.slice(urlWithoutPunctuation.length))\n\n // Full URL with protocol\n if (url.includes('://')) {\n\n // Remove trailing closing brackets if unbalanced\n url = urlWithoutPunctuation\n const openingBrackets = (url.match(/[\\(\\[\\{]/g) || []).length\n const closingBrackets = (url.match(/[\\)\\]\\}]/g) || []).length\n if (closingBrackets > openingBrackets) {\n const diff = closingBrackets - openingBrackets\n const rx = new RegExp(`[\\\\)\\\\]\\\\}]{0,${diff}}$`, 'g')\n const urlWithoutTrailing = url.replace(rx, '')\n rests.unshift(url.slice(urlWithoutTrailing.length))\n url = urlWithoutTrailing\n }\n\n }\n\n // Email address\n else if (url.includes('@')) {\n if (!url.startsWith('mailto:'))\n url = `mailto:${urlWithoutPunctuation}`\n }\n\n // Simple URL without protocol\n else {\n url = `https://${urlWithoutPunctuation}`\n }\n\n const escapedRest = escapeHTML(rests.join(''))\n const escapedHumanReadableUrl = escapeHTML(toHumanReadableUrl(url))\n const escapedUrl = escapeHTML(url)\n const classInsecureHttp = url.startsWith('http://') ? ' class=\"_warn\"' : ''\n return `<a target=\"_blank\" rel=\"noopener noreferrer\"${classInsecureHttp} href=\"${escapedUrl}\">${escapedHumanReadableUrl}</a>${escapedRest}`\n}\n\nvar rxJoined: RegExp | undefined = undefined\n\nexport interface LinkifyOptions {\n}\n\nexport function linkifyPlainText(text: string, options: LinkifyOptions = {}): string {\n if (rxJoined == null) {\n rxJoined = new RegExp(`((${RX_URL.source})|(${RX_EMAIL.source})|(${RX_SIMPLE_URL.source}))`, 'gi')\n } else {\n rxJoined.lastIndex = 0\n }\n\n var index = 0\n const parts: string[] = []\n\n text.replace(rxJoined, (match, ...args) => {\n const offset = args[args.length - 2]\n const leading = text.slice(index, offset) ?? ''\n parts.push(escapeHTML(leading))\n index = offset + match.length\n parts.push(handleUrlString(match))\n return match\n })\n\n return parts.join('') + escapeHTML(text.slice(index))\n}\n\n\nexport function linkifyPlainTextWithLineBreaks(text: string, options: LinkifyOptions = {}): string {\n return text.split('\\n').map(l => linkifyPlainText(l, options)).join('<br>')\n}\n\n//\n\nexport function encodeQuery(data: Record<string, any>, filterValue?: (value: any) => boolean) {\n const pairs = []\n for (let [key, value] of Object.entries(data)) {\n if (value != null) {\n if (!Array.isArray(value))\n value = [value]\n for (const v of value) {\n if (filterValue && !filterValue(v))\n continue\n else if (v == null)\n continue\n pairs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(v))}`)\n }\n }\n }\n return pairs.join('&')\n}\n\nexport function parseQuery(queryString: string) {\n const query: any = {}\n while (queryString.startsWith('?')) {\n queryString = queryString.substring(1)\n }\n const pairs = queryString.split('&')\n for (let i = 0; i < pairs.length; i++) {\n const part = pairs[i]\n const idx = part.indexOf('=')\n if (part.length === 0) continue\n const key = idx < 0 ? part : decodeURIComponent(part.substring(0, idx))\n const value = idx < 0 ? '' : decodeURIComponent(part.substring(idx + 1))\n if (query[key] != null) {\n if (!Array.isArray(query[key]))\n query[key] = [query[key]]\n query[key].push(value)\n }\n else {\n query[key] = value\n }\n }\n return query\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"url.cjs","names":["escapeHTML"],"sources":["../../../src/common/data/url.ts"],"sourcesContent":["// https://mathiasbynens.be/demo/url-regex\n// https://gist.github.com/dperini/729294\n\nimport { escapeHTML } from './html'\n\n/// Remove scheme, www. and trailing slash for display purposes\nexport function toHumanReadableUrl(url: string): string {\n return url.replace(/^(https?:\\/\\/(www\\.)?|mailto:)/gi, '').replace(/\\/$/, '')\n}\n\n//\n\nexport const RX_URL = /((?:(?:https?|ftp):)?\\/\\/(?:\\S+@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[01])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4])|(?:(?:[a-z0-9\\u00A1-\\uFFFF][\\w\\u00A1-\\uFFFF-]{0,62})?[a-z0-9\\u00A1-\\uFFFF]\\.)+[a-z\\u00A1-\\uFFFF]{2,}\\.?)(?::\\d{2,5})?(?:[/?#]\\S*)?)/gi\n\n/** @deprecated use linkifyPlainText */\nexport function linkifyPlainTextSimple(text: string): string {\n return text\n .split(RX_URL)\n .map((part, i) => {\n const escapedPart = escapeHTML(part)\n return i % 2\n ? `<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"${escapedPart}\">${toHumanReadableUrl(\n escapedPart,\n )}</a>`\n : escapedPart\n })\n .join('')\n}\n\n// Advanced implementation that also handles email addresses and simple URLs without protocol\n\nconst RX_EMAIL = /((mailto:)?[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})/gi\nconst RX_SIMPLE_URL = /([a-zA-Z0-9]+\\.[a-zA-Z]{2,})/gi\n\nfunction handleUrlString(part: string): string {\n var url = part\n var rests = []\n\n // Remove trailing punctuation from URLs\n const urlWithoutPunctuation = url.replace(/[.,!?;:]*$/, '')\n rests.unshift(url.slice(urlWithoutPunctuation.length))\n\n // Full URL with protocol\n if (url.includes('://')) {\n\n // Remove trailing closing brackets if unbalanced\n url = urlWithoutPunctuation\n const openingBrackets = (url.match(/[\\(\\[\\{]/g) || []).length\n const closingBrackets = (url.match(/[\\)\\]\\}]/g) || []).length\n if (closingBrackets > openingBrackets) {\n const diff = closingBrackets - openingBrackets\n const rx = new RegExp(`[\\\\)\\\\]\\\\}]{0,${diff}}$`, 'g')\n const urlWithoutTrailing = url.replace(rx, '')\n rests.unshift(url.slice(urlWithoutTrailing.length))\n url = urlWithoutTrailing\n }\n\n }\n\n // Email address\n else if (url.includes('@')) {\n if (!url.startsWith('mailto:'))\n url = `mailto:${urlWithoutPunctuation}`\n }\n\n // Simple URL without protocol\n else {\n url = `https://${urlWithoutPunctuation}`\n }\n\n const escapedRest = escapeHTML(rests.join(''))\n const escapedHumanReadableUrl = escapeHTML(toHumanReadableUrl(url))\n const escapedUrl = escapeHTML(url)\n const classInsecureHttp = url.startsWith('http://') ? ' class=\"_warn\"' : ''\n return `<a target=\"_blank\" rel=\"noopener noreferrer\"${classInsecureHttp} href=\"${escapedUrl}\">${escapedHumanReadableUrl}</a>${escapedRest}`\n}\n\nvar rxJoined: RegExp | undefined = undefined\n\nexport interface LinkifyOptions {\n}\n\nexport function linkifyPlainText(text: string, options: LinkifyOptions = {}): string {\n if (rxJoined == null) {\n rxJoined = new RegExp(`((${RX_URL.source})|(${RX_EMAIL.source})|(${RX_SIMPLE_URL.source}))`, 'gi')\n } else {\n rxJoined.lastIndex = 0\n }\n\n var index = 0\n const parts: string[] = []\n\n text.replace(rxJoined, (match, ...args) => {\n const offset = args[args.length - 2]\n const leading = text.slice(index, offset) ?? ''\n parts.push(escapeHTML(leading))\n index = offset + match.length\n parts.push(handleUrlString(match))\n return match\n })\n\n return parts.join('') + escapeHTML(text.slice(index))\n}\n\n\nexport function linkifyPlainTextWithLineBreaks(text: string, options: LinkifyOptions = {}): string {\n return text.split('\\n').map(l => linkifyPlainText(l, options)).join('<br>')\n}\n\n//\n\nexport function encodeQuery(data: Record<string, any>, filterValue?: (value: any) => boolean) {\n const pairs = []\n for (let [key, value] of Object.entries(data)) {\n if (value != null) {\n if (!Array.isArray(value))\n value = [value]\n for (const v of value) {\n if (filterValue && !filterValue(v))\n continue\n else if (v == null)\n continue\n pairs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(v))}`)\n }\n }\n }\n return pairs.join('&')\n}\n\nexport function parseQuery(queryString: string) {\n const query: any = {}\n while (queryString.startsWith('?')) {\n queryString = queryString.substring(1)\n }\n const pairs = queryString.split('&')\n for (let i = 0; i < pairs.length; i++) {\n const part = pairs[i]\n const idx = part.indexOf('=')\n if (part.length === 0) continue\n const key = idx < 0 ? part : decodeURIComponent(part.substring(0, idx))\n const value = idx < 0 ? '' : decodeURIComponent(part.substring(idx + 1))\n if (query[key] != null) {\n if (!Array.isArray(query[key]))\n query[key] = [query[key]]\n query[key].push(value)\n }\n else {\n query[key] = value\n }\n }\n return query\n}\n"],"mappings":"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"}
|
package/dist/common/data/url.mjs
CHANGED
|
@@ -1,3 +1,92 @@
|
|
|
1
|
-
import{escapeHTML
|
|
2
|
-
|
|
1
|
+
import { escapeHTML } from "./html.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/common/data/url.ts
|
|
4
|
+
function toHumanReadableUrl(url) {
|
|
5
|
+
return url.replace(/^(https?:\/\/(www\.)?|mailto:)/gi, "").replace(/\/$/, "");
|
|
6
|
+
}
|
|
7
|
+
const RX_URL = /((?:(?:https?|ftp):)?\/\/(?:\S+@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[01])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4])|(?:(?:[a-z0-9\u00A1-\uFFFF][\w\u00A1-\uFFFF-]{0,62})?[a-z0-9\u00A1-\uFFFF]\.)+[a-z\u00A1-\uFFFF]{2,}\.?)(?::\d{2,5})?(?:[/?#]\S*)?)/gi;
|
|
8
|
+
/** @deprecated use linkifyPlainText */
|
|
9
|
+
function linkifyPlainTextSimple(text) {
|
|
10
|
+
return text.split(RX_URL).map((part, i) => {
|
|
11
|
+
const escapedPart = escapeHTML(part);
|
|
12
|
+
return i % 2 ? `<a target="_blank" rel="noopener noreferrer" href="${escapedPart}">${toHumanReadableUrl(escapedPart)}</a>` : escapedPart;
|
|
13
|
+
}).join("");
|
|
14
|
+
}
|
|
15
|
+
const RX_EMAIL = /((mailto:)?[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})/gi;
|
|
16
|
+
const RX_SIMPLE_URL = /([a-zA-Z0-9]+\.[a-zA-Z]{2,})/gi;
|
|
17
|
+
function handleUrlString(part) {
|
|
18
|
+
var url = part;
|
|
19
|
+
var rests = [];
|
|
20
|
+
const urlWithoutPunctuation = url.replace(/[.,!?;:]*$/, "");
|
|
21
|
+
rests.unshift(url.slice(urlWithoutPunctuation.length));
|
|
22
|
+
if (url.includes("://")) {
|
|
23
|
+
url = urlWithoutPunctuation;
|
|
24
|
+
const openingBrackets = (url.match(/[\(\[\{]/g) || []).length;
|
|
25
|
+
const closingBrackets = (url.match(/[\)\]\}]/g) || []).length;
|
|
26
|
+
if (closingBrackets > openingBrackets) {
|
|
27
|
+
const diff = closingBrackets - openingBrackets;
|
|
28
|
+
const rx = new RegExp(`[\\)\\]\\}]{0,${diff}}$`, "g");
|
|
29
|
+
const urlWithoutTrailing = url.replace(rx, "");
|
|
30
|
+
rests.unshift(url.slice(urlWithoutTrailing.length));
|
|
31
|
+
url = urlWithoutTrailing;
|
|
32
|
+
}
|
|
33
|
+
} else if (url.includes("@")) {
|
|
34
|
+
if (!url.startsWith("mailto:")) url = `mailto:${urlWithoutPunctuation}`;
|
|
35
|
+
} else url = `https://${urlWithoutPunctuation}`;
|
|
36
|
+
const escapedRest = escapeHTML(rests.join(""));
|
|
37
|
+
const escapedHumanReadableUrl = escapeHTML(toHumanReadableUrl(url));
|
|
38
|
+
const escapedUrl = escapeHTML(url);
|
|
39
|
+
return `<a target="_blank" rel="noopener noreferrer"${url.startsWith("http://") ? " class=\"_warn\"" : ""} href="${escapedUrl}">${escapedHumanReadableUrl}</a>${escapedRest}`;
|
|
40
|
+
}
|
|
41
|
+
var rxJoined = void 0;
|
|
42
|
+
function linkifyPlainText(text, options = {}) {
|
|
43
|
+
if (rxJoined == null) rxJoined = new RegExp(`((${RX_URL.source})|(${RX_EMAIL.source})|(${RX_SIMPLE_URL.source}))`, "gi");
|
|
44
|
+
else rxJoined.lastIndex = 0;
|
|
45
|
+
var index = 0;
|
|
46
|
+
const parts = [];
|
|
47
|
+
text.replace(rxJoined, (match, ...args) => {
|
|
48
|
+
const offset = args[args.length - 2];
|
|
49
|
+
const leading = text.slice(index, offset) ?? "";
|
|
50
|
+
parts.push(escapeHTML(leading));
|
|
51
|
+
index = offset + match.length;
|
|
52
|
+
parts.push(handleUrlString(match));
|
|
53
|
+
return match;
|
|
54
|
+
});
|
|
55
|
+
return parts.join("") + escapeHTML(text.slice(index));
|
|
56
|
+
}
|
|
57
|
+
function linkifyPlainTextWithLineBreaks(text, options = {}) {
|
|
58
|
+
return text.split("\n").map((l) => linkifyPlainText(l, options)).join("<br>");
|
|
59
|
+
}
|
|
60
|
+
function encodeQuery(data, filterValue) {
|
|
61
|
+
const pairs = [];
|
|
62
|
+
for (let [key, value] of Object.entries(data)) if (value != null) {
|
|
63
|
+
if (!Array.isArray(value)) value = [value];
|
|
64
|
+
for (const v of value) {
|
|
65
|
+
if (filterValue && !filterValue(v)) continue;
|
|
66
|
+
else if (v == null) continue;
|
|
67
|
+
pairs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(v))}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return pairs.join("&");
|
|
71
|
+
}
|
|
72
|
+
function parseQuery(queryString) {
|
|
73
|
+
const query = {};
|
|
74
|
+
while (queryString.startsWith("?")) queryString = queryString.substring(1);
|
|
75
|
+
const pairs = queryString.split("&");
|
|
76
|
+
for (let i = 0; i < pairs.length; i++) {
|
|
77
|
+
const part = pairs[i];
|
|
78
|
+
const idx = part.indexOf("=");
|
|
79
|
+
if (part.length === 0) continue;
|
|
80
|
+
const key = idx < 0 ? part : decodeURIComponent(part.substring(0, idx));
|
|
81
|
+
const value = idx < 0 ? "" : decodeURIComponent(part.substring(idx + 1));
|
|
82
|
+
if (query[key] != null) {
|
|
83
|
+
if (!Array.isArray(query[key])) query[key] = [query[key]];
|
|
84
|
+
query[key].push(value);
|
|
85
|
+
} else query[key] = value;
|
|
86
|
+
}
|
|
87
|
+
return query;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
//#endregion
|
|
91
|
+
export { RX_URL, encodeQuery, linkifyPlainText, linkifyPlainTextSimple, linkifyPlainTextWithLineBreaks, parseQuery, toHumanReadableUrl };
|
|
3
92
|
//# sourceMappingURL=url.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url.mjs","names":[],"sources":["../../../src/common/data/url.ts"],"sourcesContent":["// https://mathiasbynens.be/demo/url-regex\n// https://gist.github.com/dperini/729294\n\nimport { escapeHTML } from './html'\n\n/// Remove scheme, www. and trailing slash for display purposes\nexport function toHumanReadableUrl(url: string): string {\n return url.replace(/^(https?:\\/\\/(www\\.)?|mailto:)/gi, '').replace(/\\/$/, '')\n}\n\n//\n\nexport const RX_URL = /((?:(?:https?|ftp):)?\\/\\/(?:\\S+@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[01])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4])|(?:(?:[a-z0-9\\u00A1-\\uFFFF][\\w\\u00A1-\\uFFFF-]{0,62})?[a-z0-9\\u00A1-\\uFFFF]\\.)+[a-z\\u00A1-\\uFFFF]{2,}\\.?)(?::\\d{2,5})?(?:[/?#]\\S*)?)/gi\n\n/** @deprecated use linkifyPlainText */\nexport function linkifyPlainTextSimple(text: string): string {\n return text\n .split(RX_URL)\n .map((part, i) => {\n const escapedPart = escapeHTML(part)\n return i % 2\n ? `<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"${escapedPart}\">${toHumanReadableUrl(\n escapedPart,\n )}</a>`\n : escapedPart\n })\n .join('')\n}\n\n// Advanced implementation that also handles email addresses and simple URLs without protocol\n\nconst RX_EMAIL = /((mailto:)?[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})/gi\nconst RX_SIMPLE_URL = /([a-zA-Z0-9]+\\.[a-zA-Z]{2,})/gi\n\nfunction handleUrlString(part: string): string {\n var url = part\n var rests = []\n\n // Remove trailing punctuation from URLs\n const urlWithoutPunctuation = url.replace(/[.,!?;:]*$/, '')\n rests.unshift(url.slice(urlWithoutPunctuation.length))\n\n // Full URL with protocol\n if (url.includes('://')) {\n\n // Remove trailing closing brackets if unbalanced\n url = urlWithoutPunctuation\n const openingBrackets = (url.match(/[\\(\\[\\{]/g) || []).length\n const closingBrackets = (url.match(/[\\)\\]\\}]/g) || []).length\n if (closingBrackets > openingBrackets) {\n const diff = closingBrackets - openingBrackets\n const rx = new RegExp(`[\\\\)\\\\]\\\\}]{0,${diff}}$`, 'g')\n const urlWithoutTrailing = url.replace(rx, '')\n rests.unshift(url.slice(urlWithoutTrailing.length))\n url = urlWithoutTrailing\n }\n\n }\n\n // Email address\n else if (url.includes('@')) {\n if (!url.startsWith('mailto:'))\n url = `mailto:${urlWithoutPunctuation}`\n }\n\n // Simple URL without protocol\n else {\n url = `https://${urlWithoutPunctuation}`\n }\n\n const escapedRest = escapeHTML(rests.join(''))\n const escapedHumanReadableUrl = escapeHTML(toHumanReadableUrl(url))\n const escapedUrl = escapeHTML(url)\n const classInsecureHttp = url.startsWith('http://') ? ' class=\"_warn\"' : ''\n return `<a target=\"_blank\" rel=\"noopener noreferrer\"${classInsecureHttp} href=\"${escapedUrl}\">${escapedHumanReadableUrl}</a>${escapedRest}`\n}\n\nvar rxJoined: RegExp | undefined = undefined\n\nexport interface LinkifyOptions {\n}\n\nexport function linkifyPlainText(text: string, options: LinkifyOptions = {}): string {\n if (rxJoined == null) {\n rxJoined = new RegExp(`((${RX_URL.source})|(${RX_EMAIL.source})|(${RX_SIMPLE_URL.source}))`, 'gi')\n } else {\n rxJoined.lastIndex = 0\n }\n\n var index = 0\n const parts: string[] = []\n\n text.replace(rxJoined, (match, ...args) => {\n const offset = args[args.length - 2]\n const leading = text.slice(index, offset) ?? ''\n parts.push(escapeHTML(leading))\n index = offset + match.length\n parts.push(handleUrlString(match))\n return match\n })\n\n return parts.join('') + escapeHTML(text.slice(index))\n}\n\n\nexport function linkifyPlainTextWithLineBreaks(text: string, options: LinkifyOptions = {}): string {\n return text.split('\\n').map(l => linkifyPlainText(l, options)).join('<br>')\n}\n\n//\n\nexport function encodeQuery(data: Record<string, any>, filterValue?: (value: any) => boolean) {\n const pairs = []\n for (let [key, value] of Object.entries(data)) {\n if (value != null) {\n if (!Array.isArray(value))\n value = [value]\n for (const v of value) {\n if (filterValue && !filterValue(v))\n continue\n else if (v == null)\n continue\n pairs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(v))}`)\n }\n }\n }\n return pairs.join('&')\n}\n\nexport function parseQuery(queryString: string) {\n const query: any = {}\n while (queryString.startsWith('?')) {\n queryString = queryString.substring(1)\n }\n const pairs = queryString.split('&')\n for (let i = 0; i < pairs.length; i++) {\n const part = pairs[i]\n const idx = part.indexOf('=')\n if (part.length === 0) continue\n const key = idx < 0 ? part : decodeURIComponent(part.substring(0, idx))\n const value = idx < 0 ? '' : decodeURIComponent(part.substring(idx + 1))\n if (query[key] != null) {\n if (!Array.isArray(query[key]))\n query[key] = [query[key]]\n query[key].push(value)\n }\n else {\n query[key] = value\n }\n }\n return query\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"url.mjs","names":[],"sources":["../../../src/common/data/url.ts"],"sourcesContent":["// https://mathiasbynens.be/demo/url-regex\n// https://gist.github.com/dperini/729294\n\nimport { escapeHTML } from './html'\n\n/// Remove scheme, www. and trailing slash for display purposes\nexport function toHumanReadableUrl(url: string): string {\n return url.replace(/^(https?:\\/\\/(www\\.)?|mailto:)/gi, '').replace(/\\/$/, '')\n}\n\n//\n\nexport const RX_URL = /((?:(?:https?|ftp):)?\\/\\/(?:\\S+@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[01])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4])|(?:(?:[a-z0-9\\u00A1-\\uFFFF][\\w\\u00A1-\\uFFFF-]{0,62})?[a-z0-9\\u00A1-\\uFFFF]\\.)+[a-z\\u00A1-\\uFFFF]{2,}\\.?)(?::\\d{2,5})?(?:[/?#]\\S*)?)/gi\n\n/** @deprecated use linkifyPlainText */\nexport function linkifyPlainTextSimple(text: string): string {\n return text\n .split(RX_URL)\n .map((part, i) => {\n const escapedPart = escapeHTML(part)\n return i % 2\n ? `<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"${escapedPart}\">${toHumanReadableUrl(\n escapedPart,\n )}</a>`\n : escapedPart\n })\n .join('')\n}\n\n// Advanced implementation that also handles email addresses and simple URLs without protocol\n\nconst RX_EMAIL = /((mailto:)?[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})/gi\nconst RX_SIMPLE_URL = /([a-zA-Z0-9]+\\.[a-zA-Z]{2,})/gi\n\nfunction handleUrlString(part: string): string {\n var url = part\n var rests = []\n\n // Remove trailing punctuation from URLs\n const urlWithoutPunctuation = url.replace(/[.,!?;:]*$/, '')\n rests.unshift(url.slice(urlWithoutPunctuation.length))\n\n // Full URL with protocol\n if (url.includes('://')) {\n\n // Remove trailing closing brackets if unbalanced\n url = urlWithoutPunctuation\n const openingBrackets = (url.match(/[\\(\\[\\{]/g) || []).length\n const closingBrackets = (url.match(/[\\)\\]\\}]/g) || []).length\n if (closingBrackets > openingBrackets) {\n const diff = closingBrackets - openingBrackets\n const rx = new RegExp(`[\\\\)\\\\]\\\\}]{0,${diff}}$`, 'g')\n const urlWithoutTrailing = url.replace(rx, '')\n rests.unshift(url.slice(urlWithoutTrailing.length))\n url = urlWithoutTrailing\n }\n\n }\n\n // Email address\n else if (url.includes('@')) {\n if (!url.startsWith('mailto:'))\n url = `mailto:${urlWithoutPunctuation}`\n }\n\n // Simple URL without protocol\n else {\n url = `https://${urlWithoutPunctuation}`\n }\n\n const escapedRest = escapeHTML(rests.join(''))\n const escapedHumanReadableUrl = escapeHTML(toHumanReadableUrl(url))\n const escapedUrl = escapeHTML(url)\n const classInsecureHttp = url.startsWith('http://') ? ' class=\"_warn\"' : ''\n return `<a target=\"_blank\" rel=\"noopener noreferrer\"${classInsecureHttp} href=\"${escapedUrl}\">${escapedHumanReadableUrl}</a>${escapedRest}`\n}\n\nvar rxJoined: RegExp | undefined = undefined\n\nexport interface LinkifyOptions {\n}\n\nexport function linkifyPlainText(text: string, options: LinkifyOptions = {}): string {\n if (rxJoined == null) {\n rxJoined = new RegExp(`((${RX_URL.source})|(${RX_EMAIL.source})|(${RX_SIMPLE_URL.source}))`, 'gi')\n } else {\n rxJoined.lastIndex = 0\n }\n\n var index = 0\n const parts: string[] = []\n\n text.replace(rxJoined, (match, ...args) => {\n const offset = args[args.length - 2]\n const leading = text.slice(index, offset) ?? ''\n parts.push(escapeHTML(leading))\n index = offset + match.length\n parts.push(handleUrlString(match))\n return match\n })\n\n return parts.join('') + escapeHTML(text.slice(index))\n}\n\n\nexport function linkifyPlainTextWithLineBreaks(text: string, options: LinkifyOptions = {}): string {\n return text.split('\\n').map(l => linkifyPlainText(l, options)).join('<br>')\n}\n\n//\n\nexport function encodeQuery(data: Record<string, any>, filterValue?: (value: any) => boolean) {\n const pairs = []\n for (let [key, value] of Object.entries(data)) {\n if (value != null) {\n if (!Array.isArray(value))\n value = [value]\n for (const v of value) {\n if (filterValue && !filterValue(v))\n continue\n else if (v == null)\n continue\n pairs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(v))}`)\n }\n }\n }\n return pairs.join('&')\n}\n\nexport function parseQuery(queryString: string) {\n const query: any = {}\n while (queryString.startsWith('?')) {\n queryString = queryString.substring(1)\n }\n const pairs = queryString.split('&')\n for (let i = 0; i < pairs.length; i++) {\n const part = pairs[i]\n const idx = part.indexOf('=')\n if (part.length === 0) continue\n const key = idx < 0 ? part : decodeURIComponent(part.substring(0, idx))\n const value = idx < 0 ? '' : decodeURIComponent(part.substring(idx + 1))\n if (query[key] != null) {\n if (!Array.isArray(query[key]))\n query[key] = [query[key]]\n query[key].push(value)\n }\n else {\n query[key] = value\n }\n }\n return query\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,119 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_common_data_json = require('./json.cjs');
|
|
3
|
+
|
|
4
|
+
//#region src/common/data/utils.ts
|
|
5
|
+
/**
|
|
6
|
+
* Call a create function if key does not yet exist on an object. Returns the found or created object. Example:
|
|
7
|
+
*
|
|
8
|
+
* ```js
|
|
9
|
+
* function createRoom(room, rooms) { return new Room() }
|
|
10
|
+
* ensureKey(rooms, room, createRoom).enter()
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
function ensureKey(obj, key, createFn) {
|
|
14
|
+
let value = obj[key];
|
|
15
|
+
if (value === void 0) {
|
|
16
|
+
value = createFn(key, obj);
|
|
17
|
+
obj[key] = value;
|
|
18
|
+
}
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Call a create function if key does not yet exist on an object. Returns the found or created object. Example:
|
|
23
|
+
*
|
|
24
|
+
* ```js
|
|
25
|
+
* async function fetchItem(id, cache) { ... }
|
|
26
|
+
* let data = await ensureKey(cache, id, fetchItem)
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
async function ensureKeyAsync(obj, key, createFn) {
|
|
30
|
+
let value = obj[key];
|
|
31
|
+
if (value === void 0) {
|
|
32
|
+
value = await createFn(key, obj);
|
|
33
|
+
obj[key] = value;
|
|
34
|
+
}
|
|
35
|
+
return value;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Returns the size of an object, array, string or similar. For example:
|
|
39
|
+
*/
|
|
40
|
+
function size(obj) {
|
|
41
|
+
if (obj != null) {
|
|
42
|
+
if (obj.size != null) return obj.size;
|
|
43
|
+
if (obj.length != null) return obj.length;
|
|
44
|
+
return Object.keys(obj).length;
|
|
45
|
+
}
|
|
46
|
+
return 0;
|
|
47
|
+
}
|
|
48
|
+
function first(array) {
|
|
49
|
+
return array != null && array.length > 0 ? array[0] : void 0;
|
|
50
|
+
}
|
|
51
|
+
function last(array) {
|
|
52
|
+
return array != null && array.length > 0 ? array[array.length - 1] : void 0;
|
|
53
|
+
}
|
|
54
|
+
function empty(value) {
|
|
55
|
+
try {
|
|
56
|
+
if (value != null) if (Array.isArray(value)) return value.length <= 0;
|
|
57
|
+
else if (typeof value === "string") return value.length <= 0;
|
|
58
|
+
else if (value?.size != null) return value.size <= 0;
|
|
59
|
+
else return Object.keys(value).length <= 0;
|
|
60
|
+
} catch (err) {
|
|
61
|
+
console.warn("Failed to check if empty for", value, err);
|
|
62
|
+
}
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
function cloneObject(obj) {
|
|
66
|
+
if (Object(obj) !== obj) return obj;
|
|
67
|
+
return JSON.parse(require_common_data_json.jsonStringifySafe(obj));
|
|
68
|
+
}
|
|
69
|
+
function cloneJsonObject(obj) {
|
|
70
|
+
if (Object(obj) !== obj) return obj;
|
|
71
|
+
return JSON.parse(require_common_data_json.jsonStringifySafe(obj));
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Cache result of a function. Same arguments have to always return the same result in order to get expected optimization!
|
|
75
|
+
*
|
|
76
|
+
* ```
|
|
77
|
+
* const square = memoize((value) => value * value)`
|
|
78
|
+
* square(2) // == 2
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
function memoize(fn) {
|
|
82
|
+
const cache = /* @__PURE__ */ new Map();
|
|
83
|
+
return (n) => {
|
|
84
|
+
if (cache.has(n)) return cache.get(n);
|
|
85
|
+
const result = fn(n);
|
|
86
|
+
cache.set(n, result);
|
|
87
|
+
return result;
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function memoizeAsync(fn) {
|
|
91
|
+
const cache = /* @__PURE__ */ new Map();
|
|
92
|
+
return async (...n) => {
|
|
93
|
+
const key = require_common_data_json.jsonStringifySafe(n);
|
|
94
|
+
if (cache.has(key)) return cache.get(key);
|
|
95
|
+
const result = await fn(...n);
|
|
96
|
+
cache.set(key, result);
|
|
97
|
+
return result;
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/** Repeat `count` times. Starts with `0` */
|
|
101
|
+
function forTimes(count, fn) {
|
|
102
|
+
const result = [];
|
|
103
|
+
for (let i = 0; i < count; i++) result.push(fn(i, count));
|
|
104
|
+
return result;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
//#endregion
|
|
108
|
+
exports.cloneJsonObject = cloneJsonObject;
|
|
109
|
+
exports.cloneObject = cloneObject;
|
|
110
|
+
exports.empty = empty;
|
|
111
|
+
exports.ensureKey = ensureKey;
|
|
112
|
+
exports.ensureKeyAsync = ensureKeyAsync;
|
|
113
|
+
exports.first = first;
|
|
114
|
+
exports.forTimes = forTimes;
|
|
115
|
+
exports.last = last;
|
|
116
|
+
exports.memoize = memoize;
|
|
117
|
+
exports.memoizeAsync = memoizeAsync;
|
|
118
|
+
exports.size = size;
|
|
2
119
|
//# sourceMappingURL=utils.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.cjs","names":["jsonStringifySafe"],"sources":["../../../src/common/data/utils.ts"],"sourcesContent":["import type { Json } from '../types'\nimport { jsonStringifySafe } from './json'\n\n/**\n * Call a create function if key does not yet exist on an object. Returns the found or created object. Example:\n *\n * ```js\n * function createRoom(room, rooms) { return new Room() }\n * ensureKey(rooms, room, createRoom).enter()\n * ```\n */\nexport function ensureKey<T>(\n obj: Record<string, T>,\n key: string,\n createFn: (key?: string, obj?: Record<string, T>) => T,\n): T {\n let value = obj[key]\n if (value === undefined) {\n value = createFn(key, obj)\n obj[key] = value\n }\n return value\n}\n\n/**\n * Call a create function if key does not yet exist on an object. Returns the found or created object. Example:\n *\n * ```js\n * async function fetchItem(id, cache) { ... }\n * let data = await ensureKey(cache, id, fetchItem)\n * ```\n */\nexport async function ensureKeyAsync<T>(\n obj: Record<string, T>,\n key: string,\n createFn: (key?: string, obj?: Record<string, T>) => Promise<T>,\n): Promise<T> {\n let value = obj[key]\n if (value === undefined) {\n value = await createFn(key, obj)\n obj[key] = value\n }\n return value\n}\n\n/**\n * Returns the size of an object, array, string or similar. For example:\n */\nexport function size(obj: any) {\n if (obj != null) {\n if (obj.size != null)\n return obj.size\n\n if (obj.length != null)\n return obj.length\n\n return Object.keys(obj).length\n }\n return 0\n}\n\nexport function first<T>(array?: T[]): T | undefined {\n return (array != null && array.length > 0) ? array[0] : undefined\n}\n\nexport function last<T>(array?: T[]): T | undefined {\n return (array != null && array.length > 0) ? array[array.length - 1] : undefined\n}\n\n// True for [], {}, \"\", Map(), Set() and all primitives\nexport function empty(value: any): boolean {\n try {\n if (value != null) {\n if (Array.isArray(value))\n return value.length <= 0\n else if (typeof value === 'string')\n return value.length <= 0\n else if (value?.size != null)\n return value.size <= 0\n else\n return Object.keys(value).length <= 0\n }\n }\n catch (err) {\n console.warn('Failed to check if empty for', value, err)\n }\n return true\n}\n\n// Also see common/data/deep.ts\nexport function cloneObject<T>(obj: T): T {\n // Primitives are immutable anyway\n if (Object(obj) !== obj)\n return obj\n\n // Rude but very efficient way to clone\n return JSON.parse(jsonStringifySafe(obj))\n}\n\n// export const cloneObject = typeof structuredClone !== 'undefined' ? structuredClone : _cloneObject\n\n// Also see common/data/deep.ts\nexport function cloneJsonObject<T = Json>(obj: T): T {\n // Primitives are immutable anyway\n if (Object(obj) !== obj)\n return obj\n\n // Rude but very efficient way to clone\n return JSON.parse(jsonStringifySafe(obj))\n}\n\n// export function cloneStructuredObject<T>(obj: T): T {\n// // Primitives are immutable anyway\n// if (Object(obj) !== obj) return obj\n\n// // https://developer.mozilla.org/en-US/docs/Web/API/structuredClone\n// // @ts-ignore\n// return typeof structuredClone !== \"undefined\"\n// ? // @ts-ignore\n// structuredClone(obj)\n// : // Rude but very efficient way to clone\n// JSON.parse(JSON.stringify(obj))\n// }\n\n/**\n * Cache result of a function. Same arguments have to always return the same result in order to get expected optimization!\n *\n * ```\n * const square = memoize((value) => value * value)`\n * square(2) // == 2\n * ```\n */\nexport function memoize<In, Out>(fn: (arg: In) => Out): (arg: In) => Out {\n const cache = new Map<In, Out>()\n return (n: In): Out => {\n if (cache.has(n))\n return cache.get(n)!\n const result = fn(n)\n cache.set(n, result)\n return result\n }\n}\n\nexport function memoizeAsync<In extends any[], Out extends Promise<any>>(fn: (...arg: In) => Out): (...arg: In) => Promise<Out> {\n const cache = new Map<string, Out>()\n return async (...n: In): Promise<Out> => {\n const key = jsonStringifySafe(n)\n if (cache.has(key))\n return cache.get(key)!\n\n const result = await fn(...n)\n cache.set(key, result)\n return result\n }\n}\n\n// let cacheMemoizeDomain: any\n\n// /**\n// * Same as `memoize` but does not require global const.\n// */\n// export function memoizeDomain<In, Out>(domain: string, fn: (arg: In) => Out): (arg: In) => Out {\n// if (cacheMemoizeDomain == null)\n// cacheMemoizeDomain = new Map<string, Map<In, Out>>()\n// if (!cacheMemoizeDomain.has(domain))\n// cacheMemoizeDomain.set(domain, new Map())\n// const cache = cacheMemoizeDomain.get(domain)\n// return (n: In): Out => {\n// if (cache.has(n))\n// return cache.get(n)!\n// const result = fn(n)\n// cache.set(n, result)\n// return result\n// }\n// }\n\n// export default function memoizeMultiArguments<T extends Function>(func: T) {\n// const cache = new Map()\n\n// const memoized = function (...args: any[]) {\n// let innerCache = cache\n\n// // first layer of the map is the arguments length\n// // if two calls have different number of arguments\n// // then they cannot be the same call\n// if (!innerCache.has(args.length))\n// innerCache.set(args.length, new Map())\n\n// innerCache = innerCache.get(args.length)\n\n// // using args.length because func.length is 0 for variadic functions\n// for (let i = 0; i < args.length - 1; i++) {\n// const key = args[i]\n// if (!innerCache.has(key))\n// innerCache.set(key, new Map())\n\n// innerCache = innerCache.get(key)\n// }\n\n// const key = args[args.length - 1]\n// if (innerCache.has(key))\n// return innerCache.get(key)\n\n// const result = func(...args)\n// innerCache.set(key, result)\n// return result\n// }\n\n// return memoized\n// }\n\n/** Repeat `count` times. Starts with `0` */\nexport function forTimes<T = undefined>(\n count: number,\n fn: (i: number, count: number) => T,\n): T[] {\n const result = []\n for (let i = 0; i < count; i++)\n result.push(fn(i, count))\n\n return result\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.cjs","names":["jsonStringifySafe"],"sources":["../../../src/common/data/utils.ts"],"sourcesContent":["import type { Json } from '../types'\nimport { jsonStringifySafe } from './json'\n\n/**\n * Call a create function if key does not yet exist on an object. Returns the found or created object. Example:\n *\n * ```js\n * function createRoom(room, rooms) { return new Room() }\n * ensureKey(rooms, room, createRoom).enter()\n * ```\n */\nexport function ensureKey<T>(\n obj: Record<string, T>,\n key: string,\n createFn: (key?: string, obj?: Record<string, T>) => T,\n): T {\n let value = obj[key]\n if (value === undefined) {\n value = createFn(key, obj)\n obj[key] = value\n }\n return value\n}\n\n/**\n * Call a create function if key does not yet exist on an object. Returns the found or created object. Example:\n *\n * ```js\n * async function fetchItem(id, cache) { ... }\n * let data = await ensureKey(cache, id, fetchItem)\n * ```\n */\nexport async function ensureKeyAsync<T>(\n obj: Record<string, T>,\n key: string,\n createFn: (key?: string, obj?: Record<string, T>) => Promise<T>,\n): Promise<T> {\n let value = obj[key]\n if (value === undefined) {\n value = await createFn(key, obj)\n obj[key] = value\n }\n return value\n}\n\n/**\n * Returns the size of an object, array, string or similar. For example:\n */\nexport function size(obj: any) {\n if (obj != null) {\n if (obj.size != null)\n return obj.size\n\n if (obj.length != null)\n return obj.length\n\n return Object.keys(obj).length\n }\n return 0\n}\n\nexport function first<T>(array?: T[]): T | undefined {\n return (array != null && array.length > 0) ? array[0] : undefined\n}\n\nexport function last<T>(array?: T[]): T | undefined {\n return (array != null && array.length > 0) ? array[array.length - 1] : undefined\n}\n\n// True for [], {}, \"\", Map(), Set() and all primitives\nexport function empty(value: any): boolean {\n try {\n if (value != null) {\n if (Array.isArray(value))\n return value.length <= 0\n else if (typeof value === 'string')\n return value.length <= 0\n else if (value?.size != null)\n return value.size <= 0\n else\n return Object.keys(value).length <= 0\n }\n }\n catch (err) {\n console.warn('Failed to check if empty for', value, err)\n }\n return true\n}\n\n// Also see common/data/deep.ts\nexport function cloneObject<T>(obj: T): T {\n // Primitives are immutable anyway\n if (Object(obj) !== obj)\n return obj\n\n // Rude but very efficient way to clone\n return JSON.parse(jsonStringifySafe(obj))\n}\n\n// export const cloneObject = typeof structuredClone !== 'undefined' ? structuredClone : _cloneObject\n\n// Also see common/data/deep.ts\nexport function cloneJsonObject<T = Json>(obj: T): T {\n // Primitives are immutable anyway\n if (Object(obj) !== obj)\n return obj\n\n // Rude but very efficient way to clone\n return JSON.parse(jsonStringifySafe(obj))\n}\n\n// export function cloneStructuredObject<T>(obj: T): T {\n// // Primitives are immutable anyway\n// if (Object(obj) !== obj) return obj\n\n// // https://developer.mozilla.org/en-US/docs/Web/API/structuredClone\n// // @ts-ignore\n// return typeof structuredClone !== \"undefined\"\n// ? // @ts-ignore\n// structuredClone(obj)\n// : // Rude but very efficient way to clone\n// JSON.parse(JSON.stringify(obj))\n// }\n\n/**\n * Cache result of a function. Same arguments have to always return the same result in order to get expected optimization!\n *\n * ```\n * const square = memoize((value) => value * value)`\n * square(2) // == 2\n * ```\n */\nexport function memoize<In, Out>(fn: (arg: In) => Out): (arg: In) => Out {\n const cache = new Map<In, Out>()\n return (n: In): Out => {\n if (cache.has(n))\n return cache.get(n)!\n const result = fn(n)\n cache.set(n, result)\n return result\n }\n}\n\nexport function memoizeAsync<In extends any[], Out extends Promise<any>>(fn: (...arg: In) => Out): (...arg: In) => Promise<Out> {\n const cache = new Map<string, Out>()\n return async (...n: In): Promise<Out> => {\n const key = jsonStringifySafe(n)\n if (cache.has(key))\n return cache.get(key)!\n\n const result = await fn(...n)\n cache.set(key, result)\n return result\n }\n}\n\n// let cacheMemoizeDomain: any\n\n// /**\n// * Same as `memoize` but does not require global const.\n// */\n// export function memoizeDomain<In, Out>(domain: string, fn: (arg: In) => Out): (arg: In) => Out {\n// if (cacheMemoizeDomain == null)\n// cacheMemoizeDomain = new Map<string, Map<In, Out>>()\n// if (!cacheMemoizeDomain.has(domain))\n// cacheMemoizeDomain.set(domain, new Map())\n// const cache = cacheMemoizeDomain.get(domain)\n// return (n: In): Out => {\n// if (cache.has(n))\n// return cache.get(n)!\n// const result = fn(n)\n// cache.set(n, result)\n// return result\n// }\n// }\n\n// export default function memoizeMultiArguments<T extends Function>(func: T) {\n// const cache = new Map()\n\n// const memoized = function (...args: any[]) {\n// let innerCache = cache\n\n// // first layer of the map is the arguments length\n// // if two calls have different number of arguments\n// // then they cannot be the same call\n// if (!innerCache.has(args.length))\n// innerCache.set(args.length, new Map())\n\n// innerCache = innerCache.get(args.length)\n\n// // using args.length because func.length is 0 for variadic functions\n// for (let i = 0; i < args.length - 1; i++) {\n// const key = args[i]\n// if (!innerCache.has(key))\n// innerCache.set(key, new Map())\n\n// innerCache = innerCache.get(key)\n// }\n\n// const key = args[args.length - 1]\n// if (innerCache.has(key))\n// return innerCache.get(key)\n\n// const result = func(...args)\n// innerCache.set(key, result)\n// return result\n// }\n\n// return memoized\n// }\n\n/** Repeat `count` times. Starts with `0` */\nexport function forTimes<T = undefined>(\n count: number,\n fn: (i: number, count: number) => T,\n): T[] {\n const result = []\n for (let i = 0; i < count; i++)\n result.push(fn(i, count))\n\n return result\n}\n"],"mappings":";;;;;;;;;;;;AAWA,SAAgB,UACd,KACA,KACA,UACG;CACH,IAAI,QAAQ,IAAI;AAChB,KAAI,UAAU,QAAW;AACvB,UAAQ,SAAS,KAAK,IAAI;AAC1B,MAAI,OAAO;;AAEb,QAAO;;;;;;;;;;AAWT,eAAsB,eACpB,KACA,KACA,UACY;CACZ,IAAI,QAAQ,IAAI;AAChB,KAAI,UAAU,QAAW;AACvB,UAAQ,MAAM,SAAS,KAAK,IAAI;AAChC,MAAI,OAAO;;AAEb,QAAO;;;;;AAMT,SAAgB,KAAK,KAAU;AAC7B,KAAI,OAAO,MAAM;AACf,MAAI,IAAI,QAAQ,KACd,QAAO,IAAI;AAEb,MAAI,IAAI,UAAU,KAChB,QAAO,IAAI;AAEb,SAAO,OAAO,KAAK,IAAI,CAAC;;AAE1B,QAAO;;AAGT,SAAgB,MAAS,OAA4B;AACnD,QAAQ,SAAS,QAAQ,MAAM,SAAS,IAAK,MAAM,KAAK;;AAG1D,SAAgB,KAAQ,OAA4B;AAClD,QAAQ,SAAS,QAAQ,MAAM,SAAS,IAAK,MAAM,MAAM,SAAS,KAAK;;AAIzE,SAAgB,MAAM,OAAqB;AACzC,KAAI;AACF,MAAI,SAAS,KACX,KAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,MAAM,UAAU;WAChB,OAAO,UAAU,SACxB,QAAO,MAAM,UAAU;WAChB,OAAO,QAAQ,KACtB,QAAO,MAAM,QAAQ;MAErB,QAAO,OAAO,KAAK,MAAM,CAAC,UAAU;UAGnC,KAAK;AACV,UAAQ,KAAK,gCAAgC,OAAO,IAAI;;AAE1D,QAAO;;AAIT,SAAgB,YAAe,KAAW;AAExC,KAAI,OAAO,IAAI,KAAK,IAClB,QAAO;AAGT,QAAO,KAAK,MAAMA,2CAAkB,IAAI,CAAC;;AAM3C,SAAgB,gBAA0B,KAAW;AAEnD,KAAI,OAAO,IAAI,KAAK,IAClB,QAAO;AAGT,QAAO,KAAK,MAAMA,2CAAkB,IAAI,CAAC;;;;;;;;;;AAwB3C,SAAgB,QAAiB,IAAwC;CACvE,MAAM,wBAAQ,IAAI,KAAc;AAChC,SAAQ,MAAe;AACrB,MAAI,MAAM,IAAI,EAAE,CACd,QAAO,MAAM,IAAI,EAAE;EACrB,MAAM,SAAS,GAAG,EAAE;AACpB,QAAM,IAAI,GAAG,OAAO;AACpB,SAAO;;;AAIX,SAAgB,aAAyD,IAAuD;CAC9H,MAAM,wBAAQ,IAAI,KAAkB;AACpC,QAAO,OAAO,GAAG,MAAwB;EACvC,MAAM,MAAMA,2CAAkB,EAAE;AAChC,MAAI,MAAM,IAAI,IAAI,CAChB,QAAO,MAAM,IAAI,IAAI;EAEvB,MAAM,SAAS,MAAM,GAAG,GAAG,EAAE;AAC7B,QAAM,IAAI,KAAK,OAAO;AACtB,SAAO;;;;AA4DX,SAAgB,SACd,OACA,IACK;CACL,MAAM,SAAS,EAAE;AACjB,MAAK,IAAI,IAAI,GAAG,IAAI,OAAO,IACzB,QAAO,KAAK,GAAG,GAAG,MAAM,CAAC;AAE3B,QAAO"}
|
|
@@ -1,2 +1,108 @@
|
|
|
1
|
-
import{jsonStringifySafe
|
|
1
|
+
import { jsonStringifySafe } from "./json.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/common/data/utils.ts
|
|
4
|
+
/**
|
|
5
|
+
* Call a create function if key does not yet exist on an object. Returns the found or created object. Example:
|
|
6
|
+
*
|
|
7
|
+
* ```js
|
|
8
|
+
* function createRoom(room, rooms) { return new Room() }
|
|
9
|
+
* ensureKey(rooms, room, createRoom).enter()
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
function ensureKey(obj, key, createFn) {
|
|
13
|
+
let value = obj[key];
|
|
14
|
+
if (value === void 0) {
|
|
15
|
+
value = createFn(key, obj);
|
|
16
|
+
obj[key] = value;
|
|
17
|
+
}
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Call a create function if key does not yet exist on an object. Returns the found or created object. Example:
|
|
22
|
+
*
|
|
23
|
+
* ```js
|
|
24
|
+
* async function fetchItem(id, cache) { ... }
|
|
25
|
+
* let data = await ensureKey(cache, id, fetchItem)
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
async function ensureKeyAsync(obj, key, createFn) {
|
|
29
|
+
let value = obj[key];
|
|
30
|
+
if (value === void 0) {
|
|
31
|
+
value = await createFn(key, obj);
|
|
32
|
+
obj[key] = value;
|
|
33
|
+
}
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Returns the size of an object, array, string or similar. For example:
|
|
38
|
+
*/
|
|
39
|
+
function size(obj) {
|
|
40
|
+
if (obj != null) {
|
|
41
|
+
if (obj.size != null) return obj.size;
|
|
42
|
+
if (obj.length != null) return obj.length;
|
|
43
|
+
return Object.keys(obj).length;
|
|
44
|
+
}
|
|
45
|
+
return 0;
|
|
46
|
+
}
|
|
47
|
+
function first(array) {
|
|
48
|
+
return array != null && array.length > 0 ? array[0] : void 0;
|
|
49
|
+
}
|
|
50
|
+
function last(array) {
|
|
51
|
+
return array != null && array.length > 0 ? array[array.length - 1] : void 0;
|
|
52
|
+
}
|
|
53
|
+
function empty(value) {
|
|
54
|
+
try {
|
|
55
|
+
if (value != null) if (Array.isArray(value)) return value.length <= 0;
|
|
56
|
+
else if (typeof value === "string") return value.length <= 0;
|
|
57
|
+
else if (value?.size != null) return value.size <= 0;
|
|
58
|
+
else return Object.keys(value).length <= 0;
|
|
59
|
+
} catch (err) {
|
|
60
|
+
console.warn("Failed to check if empty for", value, err);
|
|
61
|
+
}
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
function cloneObject(obj) {
|
|
65
|
+
if (Object(obj) !== obj) return obj;
|
|
66
|
+
return JSON.parse(jsonStringifySafe(obj));
|
|
67
|
+
}
|
|
68
|
+
function cloneJsonObject(obj) {
|
|
69
|
+
if (Object(obj) !== obj) return obj;
|
|
70
|
+
return JSON.parse(jsonStringifySafe(obj));
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Cache result of a function. Same arguments have to always return the same result in order to get expected optimization!
|
|
74
|
+
*
|
|
75
|
+
* ```
|
|
76
|
+
* const square = memoize((value) => value * value)`
|
|
77
|
+
* square(2) // == 2
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
function memoize(fn) {
|
|
81
|
+
const cache = /* @__PURE__ */ new Map();
|
|
82
|
+
return (n) => {
|
|
83
|
+
if (cache.has(n)) return cache.get(n);
|
|
84
|
+
const result = fn(n);
|
|
85
|
+
cache.set(n, result);
|
|
86
|
+
return result;
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function memoizeAsync(fn) {
|
|
90
|
+
const cache = /* @__PURE__ */ new Map();
|
|
91
|
+
return async (...n) => {
|
|
92
|
+
const key = jsonStringifySafe(n);
|
|
93
|
+
if (cache.has(key)) return cache.get(key);
|
|
94
|
+
const result = await fn(...n);
|
|
95
|
+
cache.set(key, result);
|
|
96
|
+
return result;
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/** Repeat `count` times. Starts with `0` */
|
|
100
|
+
function forTimes(count, fn) {
|
|
101
|
+
const result = [];
|
|
102
|
+
for (let i = 0; i < count; i++) result.push(fn(i, count));
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
//#endregion
|
|
107
|
+
export { cloneJsonObject, cloneObject, empty, ensureKey, ensureKeyAsync, first, forTimes, last, memoize, memoizeAsync, size };
|
|
2
108
|
//# sourceMappingURL=utils.mjs.map
|