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":"xrx.cjs","names":[],"sources":["../../../src/common/data/xrx.ts"],"sourcesContent":["/* eslint-disable no-cond-assign */\n\nconst RX_WHITESPACE = /\\\\\\s|\\s+|#[^\\n]*\\n?/g\nconst RX_REAL_GROUPS = /\\(\\?P?<(\\w{2,})>|\\((?!\\?([:!=]|<=|<!))/g\n// eslint-disable-next-line regexp/no-unused-capturing-group\nconst RX_LOOK_BEHIND = /^((?:\\(\\?[\\w$]+\\))?)\\(\\?<([=!])([\\s\\S]*?)\\)/gm\n\nexport function regExpString(rx: string | RegExp): string {\n return typeof rx === 'string' ? rx : (rx.source || '')\n}\n\nexport function regExpEscape(str: string): string {\n return str.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n}\n\nexport class XRX {\n lookBehind:any\n namedGroups: Record<string, number> = {}\n names: string[] = []\n rx: RegExp\n\n constructor(pattern: string | RegExp, flags?: string) {\n let _flags: string = flags ?? ''\n let _rx: string\n\n if (pattern instanceof RegExp) {\n if (flags == null)\n _flags = pattern.flags\n\n _rx = pattern.source\n }\n else {\n _rx = pattern\n }\n\n // eXtended / Ignore Whitespace\n const extended = _flags && _flags.includes('x')\n if (extended) {\n _flags = _flags.replace('x', '')\n _rx = _rx.replace(RX_WHITESPACE, (r) => {\n // log('rp', r)\n return r[0] === '\\\\' ? r : ''\n })\n }\n\n // Named Groups\n if (!(pattern instanceof RegExp)) {\n let index = 0\n _rx = _rx.replace(RX_REAL_GROUPS, (str, name) => {\n // log('>>>', name)\n index += 1\n if (name) {\n if (\n name !== 'index'\n && name !== 'length'\n && !this.namedGroups[name]\n ) {\n this.namedGroups[name] = index\n }\n // else\n // log.error(`Unallowed or duplicate group name: ${name}`)\n\n return '('\n }\n return str\n })\n this.names = Object.keys(this.namedGroups)\n }\n\n // http://www.rexegg.com/regex-best-trick.html\n\n _rx = regExpString(_rx)\n RX_LOOK_BEHIND.lastIndex = 0\n const parts = RX_LOOK_BEHIND.exec(_rx)\n if (parts) {\n this.lookBehind = {\n rx: new RegExp(`${parts[3]}$(?!\\\\s)`),\n expect: parts ? parts[2] === '=' : !parts,\n }\n _rx = _rx.substr(parts[0].length)\n }\n\n this.rx = new RegExp(_rx, _flags)\n }\n\n // flagsString() {\n // let hash = this.rx.toString() + '/'\n // if (this.rx.global) {\n // hash += 'g'\n // }\n // if (this.rx.multiline) {\n // hash += 'm'\n // }\n // if (this.rx.ignoreCase) {\n // hash += 'i'\n // }\n // if (this.rx.unicode) {\n // hash += 'u'\n // }\n // if (this.rx.sticky) {\n // hash += 'y'\n // }\n // }\n\n get lastIndex(): number {\n return this.rx.lastIndex\n }\n\n set lastIndex(index: number) {\n this.rx.lastIndex = index\n }\n\n _handleMatch(m: any) {\n if (this.lookBehind) {\n const leftContext = m.input.slice(0, m.index)\n if (this.lookBehind.expect !== this.lookBehind.rx.test(leftContext))\n return null\n }\n for (const name of this.names)\n m[name] = m[this.namedGroups[name]]\n\n return m\n }\n\n exec(str: string) {\n let m\n while ((m = this.rx.exec(str))) {\n if (this.rx.lastIndex === m.index)\n this.rx.lastIndex++\n m = this._handleMatch(m)\n if (m != null)\n return m\n }\n }\n\n execAll(str: string) {\n const matches = []\n let m\n this.rx.lastIndex = 0\n while ((m = this.exec(str)))\n matches.push(m)\n\n this.rx.lastIndex = 0\n // log('execAll:', matches)\n return matches\n }\n\n replace(str: string, replacement: string | ((m: string) => string)) {\n const fn = typeof replacement === 'function' ? replacement : () => replacement\n return str.replace(this.rx, (m) => {\n // m = this._handleMatch(m)\n return fn(m)\n })\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"xrx.cjs","names":[],"sources":["../../../src/common/data/xrx.ts"],"sourcesContent":["/* eslint-disable no-cond-assign */\n\nconst RX_WHITESPACE = /\\\\\\s|\\s+|#[^\\n]*\\n?/g\nconst RX_REAL_GROUPS = /\\(\\?P?<(\\w{2,})>|\\((?!\\?([:!=]|<=|<!))/g\n// eslint-disable-next-line regexp/no-unused-capturing-group\nconst RX_LOOK_BEHIND = /^((?:\\(\\?[\\w$]+\\))?)\\(\\?<([=!])([\\s\\S]*?)\\)/gm\n\nexport function regExpString(rx: string | RegExp): string {\n return typeof rx === 'string' ? rx : (rx.source || '')\n}\n\nexport function regExpEscape(str: string): string {\n return str.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n}\n\nexport class XRX {\n lookBehind:any\n namedGroups: Record<string, number> = {}\n names: string[] = []\n rx: RegExp\n\n constructor(pattern: string | RegExp, flags?: string) {\n let _flags: string = flags ?? ''\n let _rx: string\n\n if (pattern instanceof RegExp) {\n if (flags == null)\n _flags = pattern.flags\n\n _rx = pattern.source\n }\n else {\n _rx = pattern\n }\n\n // eXtended / Ignore Whitespace\n const extended = _flags && _flags.includes('x')\n if (extended) {\n _flags = _flags.replace('x', '')\n _rx = _rx.replace(RX_WHITESPACE, (r) => {\n // log('rp', r)\n return r[0] === '\\\\' ? r : ''\n })\n }\n\n // Named Groups\n if (!(pattern instanceof RegExp)) {\n let index = 0\n _rx = _rx.replace(RX_REAL_GROUPS, (str, name) => {\n // log('>>>', name)\n index += 1\n if (name) {\n if (\n name !== 'index'\n && name !== 'length'\n && !this.namedGroups[name]\n ) {\n this.namedGroups[name] = index\n }\n // else\n // log.error(`Unallowed or duplicate group name: ${name}`)\n\n return '('\n }\n return str\n })\n this.names = Object.keys(this.namedGroups)\n }\n\n // http://www.rexegg.com/regex-best-trick.html\n\n _rx = regExpString(_rx)\n RX_LOOK_BEHIND.lastIndex = 0\n const parts = RX_LOOK_BEHIND.exec(_rx)\n if (parts) {\n this.lookBehind = {\n rx: new RegExp(`${parts[3]}$(?!\\\\s)`),\n expect: parts ? parts[2] === '=' : !parts,\n }\n _rx = _rx.substr(parts[0].length)\n }\n\n this.rx = new RegExp(_rx, _flags)\n }\n\n // flagsString() {\n // let hash = this.rx.toString() + '/'\n // if (this.rx.global) {\n // hash += 'g'\n // }\n // if (this.rx.multiline) {\n // hash += 'm'\n // }\n // if (this.rx.ignoreCase) {\n // hash += 'i'\n // }\n // if (this.rx.unicode) {\n // hash += 'u'\n // }\n // if (this.rx.sticky) {\n // hash += 'y'\n // }\n // }\n\n get lastIndex(): number {\n return this.rx.lastIndex\n }\n\n set lastIndex(index: number) {\n this.rx.lastIndex = index\n }\n\n _handleMatch(m: any) {\n if (this.lookBehind) {\n const leftContext = m.input.slice(0, m.index)\n if (this.lookBehind.expect !== this.lookBehind.rx.test(leftContext))\n return null\n }\n for (const name of this.names)\n m[name] = m[this.namedGroups[name]]\n\n return m\n }\n\n exec(str: string) {\n let m\n while ((m = this.rx.exec(str))) {\n if (this.rx.lastIndex === m.index)\n this.rx.lastIndex++\n m = this._handleMatch(m)\n if (m != null)\n return m\n }\n }\n\n execAll(str: string) {\n const matches = []\n let m\n this.rx.lastIndex = 0\n while ((m = this.exec(str)))\n matches.push(m)\n\n this.rx.lastIndex = 0\n // log('execAll:', matches)\n return matches\n }\n\n replace(str: string, replacement: string | ((m: string) => string)) {\n const fn = typeof replacement === 'function' ? replacement : () => replacement\n return str.replace(this.rx, (m) => {\n // m = this._handleMatch(m)\n return fn(m)\n })\n }\n}\n"],"mappings":";;;AAEA,MAAM,gBAAgB;AACtB,MAAM,iBAAiB;AAEvB,MAAM,iBAAiB;AAEvB,SAAgB,aAAa,IAA6B;AACxD,QAAO,OAAO,OAAO,WAAW,KAAM,GAAG,UAAU;;AAGrD,SAAgB,aAAa,KAAqB;AAChD,QAAO,IAAI,QAAQ,4BAA4B,OAAO;;AAGxD,IAAa,MAAb,MAAiB;CACf;CACA,cAAsC,EAAE;CACxC,QAAkB,EAAE;CACpB;CAEA,YAAY,SAA0B,OAAgB;EACpD,IAAI,SAAiB,SAAS;EAC9B,IAAI;AAEJ,MAAI,mBAAmB,QAAQ;AAC7B,OAAI,SAAS,KACX,UAAS,QAAQ;AAEnB,SAAM,QAAQ;QAGd,OAAM;AAKR,MADiB,UAAU,OAAO,SAAS,IAAI,EACjC;AACZ,YAAS,OAAO,QAAQ,KAAK,GAAG;AAChC,SAAM,IAAI,QAAQ,gBAAgB,MAAM;AAEtC,WAAO,EAAE,OAAO,OAAO,IAAI;KAC3B;;AAIJ,MAAI,EAAE,mBAAmB,SAAS;GAChC,IAAI,QAAQ;AACZ,SAAM,IAAI,QAAQ,iBAAiB,KAAK,SAAS;AAE/C,aAAS;AACT,QAAI,MAAM;AACR,SACE,SAAS,WACN,SAAS,YACT,CAAC,KAAK,YAAY,MAErB,MAAK,YAAY,QAAQ;AAK3B,YAAO;;AAET,WAAO;KACP;AACF,QAAK,QAAQ,OAAO,KAAK,KAAK,YAAY;;AAK5C,QAAM,aAAa,IAAI;AACvB,iBAAe,YAAY;EAC3B,MAAM,QAAQ,eAAe,KAAK,IAAI;AACtC,MAAI,OAAO;AACT,QAAK,aAAa;IAChB,IAAI,IAAI,OAAO,GAAG,MAAM,GAAG,UAAU;IACrC,QAAQ,QAAQ,MAAM,OAAO,MAAM,CAAC;IACrC;AACD,SAAM,IAAI,OAAO,MAAM,GAAG,OAAO;;AAGnC,OAAK,KAAK,IAAI,OAAO,KAAK,OAAO;;CAsBnC,IAAI,YAAoB;AACtB,SAAO,KAAK,GAAG;;CAGjB,IAAI,UAAU,OAAe;AAC3B,OAAK,GAAG,YAAY;;CAGtB,aAAa,GAAQ;AACnB,MAAI,KAAK,YAAY;GACnB,MAAM,cAAc,EAAE,MAAM,MAAM,GAAG,EAAE,MAAM;AAC7C,OAAI,KAAK,WAAW,WAAW,KAAK,WAAW,GAAG,KAAK,YAAY,CACjE,QAAO;;AAEX,OAAK,MAAM,QAAQ,KAAK,MACtB,GAAE,QAAQ,EAAE,KAAK,YAAY;AAE/B,SAAO;;CAGT,KAAK,KAAa;EAChB,IAAI;AACJ,SAAQ,IAAI,KAAK,GAAG,KAAK,IAAI,EAAG;AAC9B,OAAI,KAAK,GAAG,cAAc,EAAE,MAC1B,MAAK,GAAG;AACV,OAAI,KAAK,aAAa,EAAE;AACxB,OAAI,KAAK,KACP,QAAO;;;CAIb,QAAQ,KAAa;EACnB,MAAM,UAAU,EAAE;EAClB,IAAI;AACJ,OAAK,GAAG,YAAY;AACpB,SAAQ,IAAI,KAAK,KAAK,IAAI,CACxB,SAAQ,KAAK,EAAE;AAEjB,OAAK,GAAG,YAAY;AAEpB,SAAO;;CAGT,QAAQ,KAAa,aAA+C;EAClE,MAAM,KAAK,OAAO,gBAAgB,aAAa,oBAAoB;AACnE,SAAO,IAAI,QAAQ,KAAK,KAAK,MAAM;AAEjC,UAAO,GAAG,EAAE;IACZ"}
|
package/dist/common/data/xrx.mjs
CHANGED
|
@@ -1,2 +1,93 @@
|
|
|
1
|
-
|
|
1
|
+
//#region src/common/data/xrx.ts
|
|
2
|
+
const RX_WHITESPACE = /\\\s|\s+|#[^\n]*\n?/g;
|
|
3
|
+
const RX_REAL_GROUPS = /\(\?P?<(\w{2,})>|\((?!\?([:!=]|<=|<!))/g;
|
|
4
|
+
const RX_LOOK_BEHIND = /^((?:\(\?[\w$]+\))?)\(\?<([=!])([\s\S]*?)\)/gm;
|
|
5
|
+
function regExpString(rx) {
|
|
6
|
+
return typeof rx === "string" ? rx : rx.source || "";
|
|
7
|
+
}
|
|
8
|
+
function regExpEscape(str) {
|
|
9
|
+
return str.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
|
|
10
|
+
}
|
|
11
|
+
var XRX = class {
|
|
12
|
+
lookBehind;
|
|
13
|
+
namedGroups = {};
|
|
14
|
+
names = [];
|
|
15
|
+
rx;
|
|
16
|
+
constructor(pattern, flags) {
|
|
17
|
+
let _flags = flags ?? "";
|
|
18
|
+
let _rx;
|
|
19
|
+
if (pattern instanceof RegExp) {
|
|
20
|
+
if (flags == null) _flags = pattern.flags;
|
|
21
|
+
_rx = pattern.source;
|
|
22
|
+
} else _rx = pattern;
|
|
23
|
+
if (_flags && _flags.includes("x")) {
|
|
24
|
+
_flags = _flags.replace("x", "");
|
|
25
|
+
_rx = _rx.replace(RX_WHITESPACE, (r) => {
|
|
26
|
+
return r[0] === "\\" ? r : "";
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
if (!(pattern instanceof RegExp)) {
|
|
30
|
+
let index = 0;
|
|
31
|
+
_rx = _rx.replace(RX_REAL_GROUPS, (str, name) => {
|
|
32
|
+
index += 1;
|
|
33
|
+
if (name) {
|
|
34
|
+
if (name !== "index" && name !== "length" && !this.namedGroups[name]) this.namedGroups[name] = index;
|
|
35
|
+
return "(";
|
|
36
|
+
}
|
|
37
|
+
return str;
|
|
38
|
+
});
|
|
39
|
+
this.names = Object.keys(this.namedGroups);
|
|
40
|
+
}
|
|
41
|
+
_rx = regExpString(_rx);
|
|
42
|
+
RX_LOOK_BEHIND.lastIndex = 0;
|
|
43
|
+
const parts = RX_LOOK_BEHIND.exec(_rx);
|
|
44
|
+
if (parts) {
|
|
45
|
+
this.lookBehind = {
|
|
46
|
+
rx: new RegExp(`${parts[3]}$(?!\\s)`),
|
|
47
|
+
expect: parts ? parts[2] === "=" : !parts
|
|
48
|
+
};
|
|
49
|
+
_rx = _rx.substr(parts[0].length);
|
|
50
|
+
}
|
|
51
|
+
this.rx = new RegExp(_rx, _flags);
|
|
52
|
+
}
|
|
53
|
+
get lastIndex() {
|
|
54
|
+
return this.rx.lastIndex;
|
|
55
|
+
}
|
|
56
|
+
set lastIndex(index) {
|
|
57
|
+
this.rx.lastIndex = index;
|
|
58
|
+
}
|
|
59
|
+
_handleMatch(m) {
|
|
60
|
+
if (this.lookBehind) {
|
|
61
|
+
const leftContext = m.input.slice(0, m.index);
|
|
62
|
+
if (this.lookBehind.expect !== this.lookBehind.rx.test(leftContext)) return null;
|
|
63
|
+
}
|
|
64
|
+
for (const name of this.names) m[name] = m[this.namedGroups[name]];
|
|
65
|
+
return m;
|
|
66
|
+
}
|
|
67
|
+
exec(str) {
|
|
68
|
+
let m;
|
|
69
|
+
while (m = this.rx.exec(str)) {
|
|
70
|
+
if (this.rx.lastIndex === m.index) this.rx.lastIndex++;
|
|
71
|
+
m = this._handleMatch(m);
|
|
72
|
+
if (m != null) return m;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
execAll(str) {
|
|
76
|
+
const matches = [];
|
|
77
|
+
let m;
|
|
78
|
+
this.rx.lastIndex = 0;
|
|
79
|
+
while (m = this.exec(str)) matches.push(m);
|
|
80
|
+
this.rx.lastIndex = 0;
|
|
81
|
+
return matches;
|
|
82
|
+
}
|
|
83
|
+
replace(str, replacement) {
|
|
84
|
+
const fn = typeof replacement === "function" ? replacement : () => replacement;
|
|
85
|
+
return str.replace(this.rx, (m) => {
|
|
86
|
+
return fn(m);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
//#endregion
|
|
92
|
+
export { XRX, regExpEscape, regExpString };
|
|
2
93
|
//# sourceMappingURL=xrx.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xrx.mjs","names":[],"sources":["../../../src/common/data/xrx.ts"],"sourcesContent":["/* eslint-disable no-cond-assign */\n\nconst RX_WHITESPACE = /\\\\\\s|\\s+|#[^\\n]*\\n?/g\nconst RX_REAL_GROUPS = /\\(\\?P?<(\\w{2,})>|\\((?!\\?([:!=]|<=|<!))/g\n// eslint-disable-next-line regexp/no-unused-capturing-group\nconst RX_LOOK_BEHIND = /^((?:\\(\\?[\\w$]+\\))?)\\(\\?<([=!])([\\s\\S]*?)\\)/gm\n\nexport function regExpString(rx: string | RegExp): string {\n return typeof rx === 'string' ? rx : (rx.source || '')\n}\n\nexport function regExpEscape(str: string): string {\n return str.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n}\n\nexport class XRX {\n lookBehind:any\n namedGroups: Record<string, number> = {}\n names: string[] = []\n rx: RegExp\n\n constructor(pattern: string | RegExp, flags?: string) {\n let _flags: string = flags ?? ''\n let _rx: string\n\n if (pattern instanceof RegExp) {\n if (flags == null)\n _flags = pattern.flags\n\n _rx = pattern.source\n }\n else {\n _rx = pattern\n }\n\n // eXtended / Ignore Whitespace\n const extended = _flags && _flags.includes('x')\n if (extended) {\n _flags = _flags.replace('x', '')\n _rx = _rx.replace(RX_WHITESPACE, (r) => {\n // log('rp', r)\n return r[0] === '\\\\' ? r : ''\n })\n }\n\n // Named Groups\n if (!(pattern instanceof RegExp)) {\n let index = 0\n _rx = _rx.replace(RX_REAL_GROUPS, (str, name) => {\n // log('>>>', name)\n index += 1\n if (name) {\n if (\n name !== 'index'\n && name !== 'length'\n && !this.namedGroups[name]\n ) {\n this.namedGroups[name] = index\n }\n // else\n // log.error(`Unallowed or duplicate group name: ${name}`)\n\n return '('\n }\n return str\n })\n this.names = Object.keys(this.namedGroups)\n }\n\n // http://www.rexegg.com/regex-best-trick.html\n\n _rx = regExpString(_rx)\n RX_LOOK_BEHIND.lastIndex = 0\n const parts = RX_LOOK_BEHIND.exec(_rx)\n if (parts) {\n this.lookBehind = {\n rx: new RegExp(`${parts[3]}$(?!\\\\s)`),\n expect: parts ? parts[2] === '=' : !parts,\n }\n _rx = _rx.substr(parts[0].length)\n }\n\n this.rx = new RegExp(_rx, _flags)\n }\n\n // flagsString() {\n // let hash = this.rx.toString() + '/'\n // if (this.rx.global) {\n // hash += 'g'\n // }\n // if (this.rx.multiline) {\n // hash += 'm'\n // }\n // if (this.rx.ignoreCase) {\n // hash += 'i'\n // }\n // if (this.rx.unicode) {\n // hash += 'u'\n // }\n // if (this.rx.sticky) {\n // hash += 'y'\n // }\n // }\n\n get lastIndex(): number {\n return this.rx.lastIndex\n }\n\n set lastIndex(index: number) {\n this.rx.lastIndex = index\n }\n\n _handleMatch(m: any) {\n if (this.lookBehind) {\n const leftContext = m.input.slice(0, m.index)\n if (this.lookBehind.expect !== this.lookBehind.rx.test(leftContext))\n return null\n }\n for (const name of this.names)\n m[name] = m[this.namedGroups[name]]\n\n return m\n }\n\n exec(str: string) {\n let m\n while ((m = this.rx.exec(str))) {\n if (this.rx.lastIndex === m.index)\n this.rx.lastIndex++\n m = this._handleMatch(m)\n if (m != null)\n return m\n }\n }\n\n execAll(str: string) {\n const matches = []\n let m\n this.rx.lastIndex = 0\n while ((m = this.exec(str)))\n matches.push(m)\n\n this.rx.lastIndex = 0\n // log('execAll:', matches)\n return matches\n }\n\n replace(str: string, replacement: string | ((m: string) => string)) {\n const fn = typeof replacement === 'function' ? replacement : () => replacement\n return str.replace(this.rx, (m) => {\n // m = this._handleMatch(m)\n return fn(m)\n })\n }\n}\n"],"mappings":"AAEA,MAAM,
|
|
1
|
+
{"version":3,"file":"xrx.mjs","names":[],"sources":["../../../src/common/data/xrx.ts"],"sourcesContent":["/* eslint-disable no-cond-assign */\n\nconst RX_WHITESPACE = /\\\\\\s|\\s+|#[^\\n]*\\n?/g\nconst RX_REAL_GROUPS = /\\(\\?P?<(\\w{2,})>|\\((?!\\?([:!=]|<=|<!))/g\n// eslint-disable-next-line regexp/no-unused-capturing-group\nconst RX_LOOK_BEHIND = /^((?:\\(\\?[\\w$]+\\))?)\\(\\?<([=!])([\\s\\S]*?)\\)/gm\n\nexport function regExpString(rx: string | RegExp): string {\n return typeof rx === 'string' ? rx : (rx.source || '')\n}\n\nexport function regExpEscape(str: string): string {\n return str.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n}\n\nexport class XRX {\n lookBehind:any\n namedGroups: Record<string, number> = {}\n names: string[] = []\n rx: RegExp\n\n constructor(pattern: string | RegExp, flags?: string) {\n let _flags: string = flags ?? ''\n let _rx: string\n\n if (pattern instanceof RegExp) {\n if (flags == null)\n _flags = pattern.flags\n\n _rx = pattern.source\n }\n else {\n _rx = pattern\n }\n\n // eXtended / Ignore Whitespace\n const extended = _flags && _flags.includes('x')\n if (extended) {\n _flags = _flags.replace('x', '')\n _rx = _rx.replace(RX_WHITESPACE, (r) => {\n // log('rp', r)\n return r[0] === '\\\\' ? r : ''\n })\n }\n\n // Named Groups\n if (!(pattern instanceof RegExp)) {\n let index = 0\n _rx = _rx.replace(RX_REAL_GROUPS, (str, name) => {\n // log('>>>', name)\n index += 1\n if (name) {\n if (\n name !== 'index'\n && name !== 'length'\n && !this.namedGroups[name]\n ) {\n this.namedGroups[name] = index\n }\n // else\n // log.error(`Unallowed or duplicate group name: ${name}`)\n\n return '('\n }\n return str\n })\n this.names = Object.keys(this.namedGroups)\n }\n\n // http://www.rexegg.com/regex-best-trick.html\n\n _rx = regExpString(_rx)\n RX_LOOK_BEHIND.lastIndex = 0\n const parts = RX_LOOK_BEHIND.exec(_rx)\n if (parts) {\n this.lookBehind = {\n rx: new RegExp(`${parts[3]}$(?!\\\\s)`),\n expect: parts ? parts[2] === '=' : !parts,\n }\n _rx = _rx.substr(parts[0].length)\n }\n\n this.rx = new RegExp(_rx, _flags)\n }\n\n // flagsString() {\n // let hash = this.rx.toString() + '/'\n // if (this.rx.global) {\n // hash += 'g'\n // }\n // if (this.rx.multiline) {\n // hash += 'm'\n // }\n // if (this.rx.ignoreCase) {\n // hash += 'i'\n // }\n // if (this.rx.unicode) {\n // hash += 'u'\n // }\n // if (this.rx.sticky) {\n // hash += 'y'\n // }\n // }\n\n get lastIndex(): number {\n return this.rx.lastIndex\n }\n\n set lastIndex(index: number) {\n this.rx.lastIndex = index\n }\n\n _handleMatch(m: any) {\n if (this.lookBehind) {\n const leftContext = m.input.slice(0, m.index)\n if (this.lookBehind.expect !== this.lookBehind.rx.test(leftContext))\n return null\n }\n for (const name of this.names)\n m[name] = m[this.namedGroups[name]]\n\n return m\n }\n\n exec(str: string) {\n let m\n while ((m = this.rx.exec(str))) {\n if (this.rx.lastIndex === m.index)\n this.rx.lastIndex++\n m = this._handleMatch(m)\n if (m != null)\n return m\n }\n }\n\n execAll(str: string) {\n const matches = []\n let m\n this.rx.lastIndex = 0\n while ((m = this.exec(str)))\n matches.push(m)\n\n this.rx.lastIndex = 0\n // log('execAll:', matches)\n return matches\n }\n\n replace(str: string, replacement: string | ((m: string) => string)) {\n const fn = typeof replacement === 'function' ? replacement : () => replacement\n return str.replace(this.rx, (m) => {\n // m = this._handleMatch(m)\n return fn(m)\n })\n }\n}\n"],"mappings":";AAEA,MAAM,gBAAgB;AACtB,MAAM,iBAAiB;AAEvB,MAAM,iBAAiB;AAEvB,SAAgB,aAAa,IAA6B;AACxD,QAAO,OAAO,OAAO,WAAW,KAAM,GAAG,UAAU;;AAGrD,SAAgB,aAAa,KAAqB;AAChD,QAAO,IAAI,QAAQ,4BAA4B,OAAO;;AAGxD,IAAa,MAAb,MAAiB;CACf;CACA,cAAsC,EAAE;CACxC,QAAkB,EAAE;CACpB;CAEA,YAAY,SAA0B,OAAgB;EACpD,IAAI,SAAiB,SAAS;EAC9B,IAAI;AAEJ,MAAI,mBAAmB,QAAQ;AAC7B,OAAI,SAAS,KACX,UAAS,QAAQ;AAEnB,SAAM,QAAQ;QAGd,OAAM;AAKR,MADiB,UAAU,OAAO,SAAS,IAAI,EACjC;AACZ,YAAS,OAAO,QAAQ,KAAK,GAAG;AAChC,SAAM,IAAI,QAAQ,gBAAgB,MAAM;AAEtC,WAAO,EAAE,OAAO,OAAO,IAAI;KAC3B;;AAIJ,MAAI,EAAE,mBAAmB,SAAS;GAChC,IAAI,QAAQ;AACZ,SAAM,IAAI,QAAQ,iBAAiB,KAAK,SAAS;AAE/C,aAAS;AACT,QAAI,MAAM;AACR,SACE,SAAS,WACN,SAAS,YACT,CAAC,KAAK,YAAY,MAErB,MAAK,YAAY,QAAQ;AAK3B,YAAO;;AAET,WAAO;KACP;AACF,QAAK,QAAQ,OAAO,KAAK,KAAK,YAAY;;AAK5C,QAAM,aAAa,IAAI;AACvB,iBAAe,YAAY;EAC3B,MAAM,QAAQ,eAAe,KAAK,IAAI;AACtC,MAAI,OAAO;AACT,QAAK,aAAa;IAChB,IAAI,IAAI,OAAO,GAAG,MAAM,GAAG,UAAU;IACrC,QAAQ,QAAQ,MAAM,OAAO,MAAM,CAAC;IACrC;AACD,SAAM,IAAI,OAAO,MAAM,GAAG,OAAO;;AAGnC,OAAK,KAAK,IAAI,OAAO,KAAK,OAAO;;CAsBnC,IAAI,YAAoB;AACtB,SAAO,KAAK,GAAG;;CAGjB,IAAI,UAAU,OAAe;AAC3B,OAAK,GAAG,YAAY;;CAGtB,aAAa,GAAQ;AACnB,MAAI,KAAK,YAAY;GACnB,MAAM,cAAc,EAAE,MAAM,MAAM,GAAG,EAAE,MAAM;AAC7C,OAAI,KAAK,WAAW,WAAW,KAAK,WAAW,GAAG,KAAK,YAAY,CACjE,QAAO;;AAEX,OAAK,MAAM,QAAQ,KAAK,MACtB,GAAE,QAAQ,EAAE,KAAK,YAAY;AAE/B,SAAO;;CAGT,KAAK,KAAa;EAChB,IAAI;AACJ,SAAQ,IAAI,KAAK,GAAG,KAAK,IAAI,EAAG;AAC9B,OAAI,KAAK,GAAG,cAAc,EAAE,MAC1B,MAAK,GAAG;AACV,OAAI,KAAK,aAAa,EAAE;AACxB,OAAI,KAAK,KACP,QAAO;;;CAIb,QAAQ,KAAa;EACnB,MAAM,UAAU,EAAE;EAClB,IAAI;AACJ,OAAK,GAAG,YAAY;AACpB,SAAQ,IAAI,KAAK,KAAK,IAAI,CACxB,SAAQ,KAAK,EAAE;AAEjB,OAAK,GAAG,YAAY;AAEpB,SAAO;;CAGT,QAAQ,KAAa,aAA+C;EAClE,MAAM,KAAK,OAAO,gBAAgB,aAAa,oBAAoB;AACnE,SAAO,IAAI,QAAQ,KAAK,KAAK,MAAM;AAEjC,UAAO,GAAG,EAAE;IACZ"}
|
|
@@ -1,2 +1,134 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_common_data_is = require('./data/is.cjs');
|
|
3
|
+
const require_common_log_log = require('./log/log.cjs');
|
|
4
|
+
const require_common_data_array = require('./data/array.cjs');
|
|
5
|
+
const require_common_exec_promise = require('./exec/promise.cjs');
|
|
6
|
+
|
|
7
|
+
//#region src/common/dispose-defer.ts
|
|
8
|
+
function polyfillUsing() {
|
|
9
|
+
try {
|
|
10
|
+
Symbol.dispose ??= Symbol("Symbol.dispose");
|
|
11
|
+
Symbol.asyncDispose ??= Symbol("Symbol.asyncDispose");
|
|
12
|
+
} catch (_) {}
|
|
13
|
+
}
|
|
14
|
+
/** Different kinds of implementations have grown, this should unify them */
|
|
15
|
+
function callDisposable(disposable) {
|
|
16
|
+
let result;
|
|
17
|
+
if (typeof disposable === "function") result = disposable();
|
|
18
|
+
else if (typeof disposable.dispose === "function") result = disposable.dispose();
|
|
19
|
+
if (require_common_exec_promise.isPromise(result)) return result;
|
|
20
|
+
}
|
|
21
|
+
function useDispose(opt) {
|
|
22
|
+
if (opt != null) {
|
|
23
|
+
if (require_common_data_is.isString(opt)) opt = { name: opt };
|
|
24
|
+
else if ("debug" in opt && "label" in opt) opt = {
|
|
25
|
+
name: opt.label,
|
|
26
|
+
log: opt
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
polyfillUsing();
|
|
30
|
+
const name = opt?.name;
|
|
31
|
+
const log = opt?.log ?? require_common_log_log.DefaultLogger("zeed:dispose");
|
|
32
|
+
let _disposed = 0;
|
|
33
|
+
const tracked = [];
|
|
34
|
+
function untrack(disposable) {
|
|
35
|
+
if (disposable != null && tracked.includes(disposable)) {
|
|
36
|
+
require_common_data_array.arrayFilterInPlace(tracked, (el) => el !== disposable);
|
|
37
|
+
const result = callDisposable(disposable);
|
|
38
|
+
if (require_common_exec_promise.isPromise(result)) return result;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function track(obj) {
|
|
42
|
+
if (obj == null) return;
|
|
43
|
+
tracked.unshift(obj);
|
|
44
|
+
return () => untrack(obj);
|
|
45
|
+
}
|
|
46
|
+
/** Dispose all tracked entries */
|
|
47
|
+
function dispose(strictSync = false) {
|
|
48
|
+
if (name) log.debug(`dispose "${name}": ${tracked.length} entries`);
|
|
49
|
+
_disposed += 1;
|
|
50
|
+
const promises = [];
|
|
51
|
+
while (tracked.length > 0) {
|
|
52
|
+
const fn = tracked[0];
|
|
53
|
+
const result = untrack(fn);
|
|
54
|
+
if (require_common_exec_promise.isPromise(result)) if (strictSync) throw new Error(`Async disposable found: ${fn} -> ${result}`);
|
|
55
|
+
else promises.push(result);
|
|
56
|
+
}
|
|
57
|
+
if (promises.length > 0) return Promise.all(promises);
|
|
58
|
+
}
|
|
59
|
+
/** Dispose all tracked entries in synchronous way. */
|
|
60
|
+
function disposeSync() {
|
|
61
|
+
dispose(true);
|
|
62
|
+
}
|
|
63
|
+
return Object.assign(dispose, {
|
|
64
|
+
get disposed() {
|
|
65
|
+
return _disposed;
|
|
66
|
+
},
|
|
67
|
+
add: track,
|
|
68
|
+
remove: untrack,
|
|
69
|
+
track,
|
|
70
|
+
untrack,
|
|
71
|
+
dispose,
|
|
72
|
+
disposeSync,
|
|
73
|
+
sync: disposeSync,
|
|
74
|
+
exec: dispose,
|
|
75
|
+
getSize() {
|
|
76
|
+
return tracked.length;
|
|
77
|
+
},
|
|
78
|
+
isDisposed() {
|
|
79
|
+
return _disposed > 0 && tracked.length === 0;
|
|
80
|
+
},
|
|
81
|
+
[Symbol.dispose]() {
|
|
82
|
+
return dispose();
|
|
83
|
+
},
|
|
84
|
+
async [Symbol.asyncDispose]() {
|
|
85
|
+
return await dispose();
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
function useDefer(config = {}) {
|
|
90
|
+
const { mode = "fifo" } = config;
|
|
91
|
+
const steps = [];
|
|
92
|
+
polyfillUsing();
|
|
93
|
+
/**
|
|
94
|
+
* Executes all steps. If all steps are not Promises, they are executed immediately,
|
|
95
|
+
* otherwise a Promise is returned.
|
|
96
|
+
* Note: useDefer defaults to FIFO order; use mode: 'lifo' for LIFO (stack) order.
|
|
97
|
+
*/
|
|
98
|
+
const exec = async (expectSync = false) => {
|
|
99
|
+
while (steps.length > 0) {
|
|
100
|
+
const step = steps[0];
|
|
101
|
+
require_common_data_array.arrayFilterInPlace(steps, (el) => el !== step);
|
|
102
|
+
if (typeof step === "function") {
|
|
103
|
+
const result = step();
|
|
104
|
+
if (require_common_exec_promise.isPromise(result)) {
|
|
105
|
+
if (expectSync) throw new Error(`Expected sync only function, but found async: ${step}`);
|
|
106
|
+
await result;
|
|
107
|
+
}
|
|
108
|
+
} else if (typeof step.dispose === "function") {
|
|
109
|
+
const result = step.dispose();
|
|
110
|
+
if (require_common_exec_promise.isPromise(result)) {
|
|
111
|
+
if (expectSync) throw new Error(`Expected sync only function, but found async: ${step}`);
|
|
112
|
+
await result;
|
|
113
|
+
}
|
|
114
|
+
} else throw new TypeError(`Unhandled disposable: ${step}`);
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
const add = (obj) => {
|
|
118
|
+
if (mode === "lifo") steps.unshift(obj);
|
|
119
|
+
else steps.push(obj);
|
|
120
|
+
};
|
|
121
|
+
return Object.assign(exec, {
|
|
122
|
+
add,
|
|
123
|
+
exec,
|
|
124
|
+
getSize() {
|
|
125
|
+
return steps.length;
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
//#endregion
|
|
131
|
+
exports.polyfillUsing = polyfillUsing;
|
|
132
|
+
exports.useDefer = useDefer;
|
|
133
|
+
exports.useDispose = useDispose;
|
|
2
134
|
//# sourceMappingURL=dispose-defer.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispose-defer.cjs","names":["isPromise","isString","DefaultLogger"],"sources":["../../src/common/dispose-defer.ts"],"sourcesContent":["import type { DisposerFunction } from './dispose-types'\nimport type { LoggerInterface } from './log/log-base'\nimport { arrayFilterInPlace } from './data/array'\nimport { isString } from './data/is'\nimport { isPromise } from './exec/promise'\nimport { DefaultLogger } from './log/log'\n\nexport function polyfillUsing() {\n try {\n // @ts-expect-error just a polyfill\n Symbol.dispose ??= Symbol('Symbol.dispose')\n // @ts-expect-error just a polyfill\n Symbol.asyncDispose ??= Symbol('Symbol.asyncDispose')\n }\n catch (_) { }\n}\n\n// Symbol.dispose ??= Symbol('Symbol.dispose')\n// Symbol.asyncDispose ??= Symbol('Symbol.asyncDispose')\n\n/** A disposable entry: either a function or an object with a dispose() method. */\ntype DisposableEntry = DisposerFunction | { dispose: DisposerFunction }\n\n/** Different kinds of implementations have grown, this should unify them */\nfunction callDisposable(disposable: DisposableEntry): Promise<void> | void {\n let result\n\n if (typeof disposable === 'function')\n result = disposable()\n else if (typeof disposable.dispose === 'function')\n result = disposable.dispose()\n\n if (isPromise(result))\n return result\n}\n\nexport interface UseDisposeConfig {\n name?: string\n log?: LoggerInterface\n}\n\nexport function useDispose(opt?: string | UseDisposeConfig | LoggerInterface) {\n if (opt != null) {\n if (isString(opt))\n opt = { name: opt }\n else if ('debug' in opt && 'label' in opt)\n opt = { name: opt.label, log: opt }\n }\n\n polyfillUsing()\n\n const name = opt?.name\n const log = opt?.log ?? DefaultLogger('zeed:dispose')\n\n let _disposed = 0\n\n const tracked: DisposableEntry[] = []\n\n function untrack(disposable: DisposableEntry): Promise<void> | void {\n if (disposable != null && tracked.includes(disposable)) {\n arrayFilterInPlace(tracked, el => el !== disposable)\n const result = callDisposable(disposable)\n if (isPromise(result))\n return result\n }\n }\n\n function track(obj?: DisposableEntry): DisposerFunction | undefined {\n if (obj == null)\n return\n tracked.unshift(obj) // LIFO\n return () => untrack(obj)\n }\n\n /** Dispose all tracked entries */\n function dispose(strictSync = false): Promise<any> | void {\n if (name)\n log.debug(`dispose \"${name}\": ${tracked.length} entries`)\n\n _disposed += 1\n\n const promises: any[] = []\n while (tracked.length > 0) {\n const fn = tracked[0]\n const result = untrack(fn) // LIFO\n if (isPromise(result)) {\n if (strictSync)\n throw new Error(`Async disposable found: ${fn} -> ${result}`)\n else\n promises.push(result)\n }\n }\n\n if (promises.length > 0)\n return Promise.all(promises)\n }\n\n /** Dispose all tracked entries in synchronous way. */\n function disposeSync(): void {\n dispose(true)\n }\n\n return Object.assign(dispose, {\n /** Counter that increments each time dispose has been called */\n get disposed() {\n return _disposed\n },\n\n add: track,\n remove: untrack,\n\n /** @deprecated use add */\n track,\n\n /** @deprecated use remove */\n untrack,\n\n dispose,\n disposeSync,\n sync: disposeSync,\n\n /** @deprecated use dispose */\n exec: dispose,\n getSize() {\n return tracked.length\n },\n isDisposed() {\n return _disposed > 0 && tracked.length === 0\n },\n\n [Symbol.dispose]() {\n return dispose()\n },\n\n async [Symbol.asyncDispose]() {\n return await dispose()\n },\n\n })\n}\n\nexport type UseDispose = ReturnType<typeof useDispose>\n\nexport function useDefer(\n config: {\n mode?: 'lifo' | 'fifo'\n } = {},\n) {\n const { mode = 'fifo' } = config\n const steps: DisposableEntry[] = []\n\n polyfillUsing()\n\n /**\n * Executes all steps. If all steps are not Promises, they are executed immediately,\n * otherwise a Promise is returned.\n * Note: useDefer defaults to FIFO order; use mode: 'lifo' for LIFO (stack) order.\n */\n const exec = async (expectSync = false) => {\n while (steps.length > 0) {\n const step = steps[0]\n arrayFilterInPlace(steps, el => el !== step)\n if (typeof step === 'function') {\n const result = step()\n if (isPromise(result)) {\n if (expectSync) {\n throw new Error(\n `Expected sync only function, but found async: ${step}`,\n )\n }\n await result\n }\n }\n else if (typeof step.dispose === 'function') {\n // Handle objects with a dispose() method (consistent with useDispose)\n const result = step.dispose()\n if (isPromise(result)) {\n if (expectSync) {\n throw new Error(\n `Expected sync only function, but found async: ${step}`,\n )\n }\n await result\n }\n }\n else {\n throw new TypeError(`Unhandled disposable: ${step}`)\n }\n }\n }\n\n const add = (obj: DisposableEntry) => {\n if (mode === 'lifo')\n steps.unshift(obj)\n else\n steps.push(obj)\n }\n\n return Object.assign(exec, {\n add,\n exec,\n getSize() {\n return steps.length\n },\n })\n}\n\nexport type UseDefer = ReturnType<typeof useDefer>\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"dispose-defer.cjs","names":["isPromise","isString","DefaultLogger"],"sources":["../../src/common/dispose-defer.ts"],"sourcesContent":["import type { DisposerFunction } from './dispose-types'\nimport type { LoggerInterface } from './log/log-base'\nimport { arrayFilterInPlace } from './data/array'\nimport { isString } from './data/is'\nimport { isPromise } from './exec/promise'\nimport { DefaultLogger } from './log/log'\n\nexport function polyfillUsing() {\n try {\n // @ts-expect-error just a polyfill\n Symbol.dispose ??= Symbol('Symbol.dispose')\n // @ts-expect-error just a polyfill\n Symbol.asyncDispose ??= Symbol('Symbol.asyncDispose')\n }\n catch (_) { }\n}\n\n// Symbol.dispose ??= Symbol('Symbol.dispose')\n// Symbol.asyncDispose ??= Symbol('Symbol.asyncDispose')\n\n/** A disposable entry: either a function or an object with a dispose() method. */\ntype DisposableEntry = DisposerFunction | { dispose: DisposerFunction }\n\n/** Different kinds of implementations have grown, this should unify them */\nfunction callDisposable(disposable: DisposableEntry): Promise<void> | void {\n let result\n\n if (typeof disposable === 'function')\n result = disposable()\n else if (typeof disposable.dispose === 'function')\n result = disposable.dispose()\n\n if (isPromise(result))\n return result\n}\n\nexport interface UseDisposeConfig {\n name?: string\n log?: LoggerInterface\n}\n\nexport function useDispose(opt?: string | UseDisposeConfig | LoggerInterface) {\n if (opt != null) {\n if (isString(opt))\n opt = { name: opt }\n else if ('debug' in opt && 'label' in opt)\n opt = { name: opt.label, log: opt }\n }\n\n polyfillUsing()\n\n const name = opt?.name\n const log = opt?.log ?? DefaultLogger('zeed:dispose')\n\n let _disposed = 0\n\n const tracked: DisposableEntry[] = []\n\n function untrack(disposable: DisposableEntry): Promise<void> | void {\n if (disposable != null && tracked.includes(disposable)) {\n arrayFilterInPlace(tracked, el => el !== disposable)\n const result = callDisposable(disposable)\n if (isPromise(result))\n return result\n }\n }\n\n function track(obj?: DisposableEntry): DisposerFunction | undefined {\n if (obj == null)\n return\n tracked.unshift(obj) // LIFO\n return () => untrack(obj)\n }\n\n /** Dispose all tracked entries */\n function dispose(strictSync = false): Promise<any> | void {\n if (name)\n log.debug(`dispose \"${name}\": ${tracked.length} entries`)\n\n _disposed += 1\n\n const promises: any[] = []\n while (tracked.length > 0) {\n const fn = tracked[0]\n const result = untrack(fn) // LIFO\n if (isPromise(result)) {\n if (strictSync)\n throw new Error(`Async disposable found: ${fn} -> ${result}`)\n else\n promises.push(result)\n }\n }\n\n if (promises.length > 0)\n return Promise.all(promises)\n }\n\n /** Dispose all tracked entries in synchronous way. */\n function disposeSync(): void {\n dispose(true)\n }\n\n return Object.assign(dispose, {\n /** Counter that increments each time dispose has been called */\n get disposed() {\n return _disposed\n },\n\n add: track,\n remove: untrack,\n\n /** @deprecated use add */\n track,\n\n /** @deprecated use remove */\n untrack,\n\n dispose,\n disposeSync,\n sync: disposeSync,\n\n /** @deprecated use dispose */\n exec: dispose,\n getSize() {\n return tracked.length\n },\n isDisposed() {\n return _disposed > 0 && tracked.length === 0\n },\n\n [Symbol.dispose]() {\n return dispose()\n },\n\n async [Symbol.asyncDispose]() {\n return await dispose()\n },\n\n })\n}\n\nexport type UseDispose = ReturnType<typeof useDispose>\n\nexport function useDefer(\n config: {\n mode?: 'lifo' | 'fifo'\n } = {},\n) {\n const { mode = 'fifo' } = config\n const steps: DisposableEntry[] = []\n\n polyfillUsing()\n\n /**\n * Executes all steps. If all steps are not Promises, they are executed immediately,\n * otherwise a Promise is returned.\n * Note: useDefer defaults to FIFO order; use mode: 'lifo' for LIFO (stack) order.\n */\n const exec = async (expectSync = false) => {\n while (steps.length > 0) {\n const step = steps[0]\n arrayFilterInPlace(steps, el => el !== step)\n if (typeof step === 'function') {\n const result = step()\n if (isPromise(result)) {\n if (expectSync) {\n throw new Error(\n `Expected sync only function, but found async: ${step}`,\n )\n }\n await result\n }\n }\n else if (typeof step.dispose === 'function') {\n // Handle objects with a dispose() method (consistent with useDispose)\n const result = step.dispose()\n if (isPromise(result)) {\n if (expectSync) {\n throw new Error(\n `Expected sync only function, but found async: ${step}`,\n )\n }\n await result\n }\n }\n else {\n throw new TypeError(`Unhandled disposable: ${step}`)\n }\n }\n }\n\n const add = (obj: DisposableEntry) => {\n if (mode === 'lifo')\n steps.unshift(obj)\n else\n steps.push(obj)\n }\n\n return Object.assign(exec, {\n add,\n exec,\n getSize() {\n return steps.length\n },\n })\n}\n\nexport type UseDefer = ReturnType<typeof useDefer>\n"],"mappings":"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"}
|
|
@@ -1,2 +1,131 @@
|
|
|
1
|
-
import{isString
|
|
1
|
+
import { isString } from "./data/is.mjs";
|
|
2
|
+
import { DefaultLogger } from "./log/log.mjs";
|
|
3
|
+
import { arrayFilterInPlace } from "./data/array.mjs";
|
|
4
|
+
import { isPromise } from "./exec/promise.mjs";
|
|
5
|
+
|
|
6
|
+
//#region src/common/dispose-defer.ts
|
|
7
|
+
function polyfillUsing() {
|
|
8
|
+
try {
|
|
9
|
+
Symbol.dispose ??= Symbol("Symbol.dispose");
|
|
10
|
+
Symbol.asyncDispose ??= Symbol("Symbol.asyncDispose");
|
|
11
|
+
} catch (_) {}
|
|
12
|
+
}
|
|
13
|
+
/** Different kinds of implementations have grown, this should unify them */
|
|
14
|
+
function callDisposable(disposable) {
|
|
15
|
+
let result;
|
|
16
|
+
if (typeof disposable === "function") result = disposable();
|
|
17
|
+
else if (typeof disposable.dispose === "function") result = disposable.dispose();
|
|
18
|
+
if (isPromise(result)) return result;
|
|
19
|
+
}
|
|
20
|
+
function useDispose(opt) {
|
|
21
|
+
if (opt != null) {
|
|
22
|
+
if (isString(opt)) opt = { name: opt };
|
|
23
|
+
else if ("debug" in opt && "label" in opt) opt = {
|
|
24
|
+
name: opt.label,
|
|
25
|
+
log: opt
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
polyfillUsing();
|
|
29
|
+
const name = opt?.name;
|
|
30
|
+
const log = opt?.log ?? DefaultLogger("zeed:dispose");
|
|
31
|
+
let _disposed = 0;
|
|
32
|
+
const tracked = [];
|
|
33
|
+
function untrack(disposable) {
|
|
34
|
+
if (disposable != null && tracked.includes(disposable)) {
|
|
35
|
+
arrayFilterInPlace(tracked, (el) => el !== disposable);
|
|
36
|
+
const result = callDisposable(disposable);
|
|
37
|
+
if (isPromise(result)) return result;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function track(obj) {
|
|
41
|
+
if (obj == null) return;
|
|
42
|
+
tracked.unshift(obj);
|
|
43
|
+
return () => untrack(obj);
|
|
44
|
+
}
|
|
45
|
+
/** Dispose all tracked entries */
|
|
46
|
+
function dispose(strictSync = false) {
|
|
47
|
+
if (name) log.debug(`dispose "${name}": ${tracked.length} entries`);
|
|
48
|
+
_disposed += 1;
|
|
49
|
+
const promises = [];
|
|
50
|
+
while (tracked.length > 0) {
|
|
51
|
+
const fn = tracked[0];
|
|
52
|
+
const result = untrack(fn);
|
|
53
|
+
if (isPromise(result)) if (strictSync) throw new Error(`Async disposable found: ${fn} -> ${result}`);
|
|
54
|
+
else promises.push(result);
|
|
55
|
+
}
|
|
56
|
+
if (promises.length > 0) return Promise.all(promises);
|
|
57
|
+
}
|
|
58
|
+
/** Dispose all tracked entries in synchronous way. */
|
|
59
|
+
function disposeSync() {
|
|
60
|
+
dispose(true);
|
|
61
|
+
}
|
|
62
|
+
return Object.assign(dispose, {
|
|
63
|
+
get disposed() {
|
|
64
|
+
return _disposed;
|
|
65
|
+
},
|
|
66
|
+
add: track,
|
|
67
|
+
remove: untrack,
|
|
68
|
+
track,
|
|
69
|
+
untrack,
|
|
70
|
+
dispose,
|
|
71
|
+
disposeSync,
|
|
72
|
+
sync: disposeSync,
|
|
73
|
+
exec: dispose,
|
|
74
|
+
getSize() {
|
|
75
|
+
return tracked.length;
|
|
76
|
+
},
|
|
77
|
+
isDisposed() {
|
|
78
|
+
return _disposed > 0 && tracked.length === 0;
|
|
79
|
+
},
|
|
80
|
+
[Symbol.dispose]() {
|
|
81
|
+
return dispose();
|
|
82
|
+
},
|
|
83
|
+
async [Symbol.asyncDispose]() {
|
|
84
|
+
return await dispose();
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
function useDefer(config = {}) {
|
|
89
|
+
const { mode = "fifo" } = config;
|
|
90
|
+
const steps = [];
|
|
91
|
+
polyfillUsing();
|
|
92
|
+
/**
|
|
93
|
+
* Executes all steps. If all steps are not Promises, they are executed immediately,
|
|
94
|
+
* otherwise a Promise is returned.
|
|
95
|
+
* Note: useDefer defaults to FIFO order; use mode: 'lifo' for LIFO (stack) order.
|
|
96
|
+
*/
|
|
97
|
+
const exec = async (expectSync = false) => {
|
|
98
|
+
while (steps.length > 0) {
|
|
99
|
+
const step = steps[0];
|
|
100
|
+
arrayFilterInPlace(steps, (el) => el !== step);
|
|
101
|
+
if (typeof step === "function") {
|
|
102
|
+
const result = step();
|
|
103
|
+
if (isPromise(result)) {
|
|
104
|
+
if (expectSync) throw new Error(`Expected sync only function, but found async: ${step}`);
|
|
105
|
+
await result;
|
|
106
|
+
}
|
|
107
|
+
} else if (typeof step.dispose === "function") {
|
|
108
|
+
const result = step.dispose();
|
|
109
|
+
if (isPromise(result)) {
|
|
110
|
+
if (expectSync) throw new Error(`Expected sync only function, but found async: ${step}`);
|
|
111
|
+
await result;
|
|
112
|
+
}
|
|
113
|
+
} else throw new TypeError(`Unhandled disposable: ${step}`);
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
const add = (obj) => {
|
|
117
|
+
if (mode === "lifo") steps.unshift(obj);
|
|
118
|
+
else steps.push(obj);
|
|
119
|
+
};
|
|
120
|
+
return Object.assign(exec, {
|
|
121
|
+
add,
|
|
122
|
+
exec,
|
|
123
|
+
getSize() {
|
|
124
|
+
return steps.length;
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
//#endregion
|
|
130
|
+
export { polyfillUsing, useDefer, useDispose };
|
|
2
131
|
//# sourceMappingURL=dispose-defer.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispose-defer.mjs","names":[],"sources":["../../src/common/dispose-defer.ts"],"sourcesContent":["import type { DisposerFunction } from './dispose-types'\nimport type { LoggerInterface } from './log/log-base'\nimport { arrayFilterInPlace } from './data/array'\nimport { isString } from './data/is'\nimport { isPromise } from './exec/promise'\nimport { DefaultLogger } from './log/log'\n\nexport function polyfillUsing() {\n try {\n // @ts-expect-error just a polyfill\n Symbol.dispose ??= Symbol('Symbol.dispose')\n // @ts-expect-error just a polyfill\n Symbol.asyncDispose ??= Symbol('Symbol.asyncDispose')\n }\n catch (_) { }\n}\n\n// Symbol.dispose ??= Symbol('Symbol.dispose')\n// Symbol.asyncDispose ??= Symbol('Symbol.asyncDispose')\n\n/** A disposable entry: either a function or an object with a dispose() method. */\ntype DisposableEntry = DisposerFunction | { dispose: DisposerFunction }\n\n/** Different kinds of implementations have grown, this should unify them */\nfunction callDisposable(disposable: DisposableEntry): Promise<void> | void {\n let result\n\n if (typeof disposable === 'function')\n result = disposable()\n else if (typeof disposable.dispose === 'function')\n result = disposable.dispose()\n\n if (isPromise(result))\n return result\n}\n\nexport interface UseDisposeConfig {\n name?: string\n log?: LoggerInterface\n}\n\nexport function useDispose(opt?: string | UseDisposeConfig | LoggerInterface) {\n if (opt != null) {\n if (isString(opt))\n opt = { name: opt }\n else if ('debug' in opt && 'label' in opt)\n opt = { name: opt.label, log: opt }\n }\n\n polyfillUsing()\n\n const name = opt?.name\n const log = opt?.log ?? DefaultLogger('zeed:dispose')\n\n let _disposed = 0\n\n const tracked: DisposableEntry[] = []\n\n function untrack(disposable: DisposableEntry): Promise<void> | void {\n if (disposable != null && tracked.includes(disposable)) {\n arrayFilterInPlace(tracked, el => el !== disposable)\n const result = callDisposable(disposable)\n if (isPromise(result))\n return result\n }\n }\n\n function track(obj?: DisposableEntry): DisposerFunction | undefined {\n if (obj == null)\n return\n tracked.unshift(obj) // LIFO\n return () => untrack(obj)\n }\n\n /** Dispose all tracked entries */\n function dispose(strictSync = false): Promise<any> | void {\n if (name)\n log.debug(`dispose \"${name}\": ${tracked.length} entries`)\n\n _disposed += 1\n\n const promises: any[] = []\n while (tracked.length > 0) {\n const fn = tracked[0]\n const result = untrack(fn) // LIFO\n if (isPromise(result)) {\n if (strictSync)\n throw new Error(`Async disposable found: ${fn} -> ${result}`)\n else\n promises.push(result)\n }\n }\n\n if (promises.length > 0)\n return Promise.all(promises)\n }\n\n /** Dispose all tracked entries in synchronous way. */\n function disposeSync(): void {\n dispose(true)\n }\n\n return Object.assign(dispose, {\n /** Counter that increments each time dispose has been called */\n get disposed() {\n return _disposed\n },\n\n add: track,\n remove: untrack,\n\n /** @deprecated use add */\n track,\n\n /** @deprecated use remove */\n untrack,\n\n dispose,\n disposeSync,\n sync: disposeSync,\n\n /** @deprecated use dispose */\n exec: dispose,\n getSize() {\n return tracked.length\n },\n isDisposed() {\n return _disposed > 0 && tracked.length === 0\n },\n\n [Symbol.dispose]() {\n return dispose()\n },\n\n async [Symbol.asyncDispose]() {\n return await dispose()\n },\n\n })\n}\n\nexport type UseDispose = ReturnType<typeof useDispose>\n\nexport function useDefer(\n config: {\n mode?: 'lifo' | 'fifo'\n } = {},\n) {\n const { mode = 'fifo' } = config\n const steps: DisposableEntry[] = []\n\n polyfillUsing()\n\n /**\n * Executes all steps. If all steps are not Promises, they are executed immediately,\n * otherwise a Promise is returned.\n * Note: useDefer defaults to FIFO order; use mode: 'lifo' for LIFO (stack) order.\n */\n const exec = async (expectSync = false) => {\n while (steps.length > 0) {\n const step = steps[0]\n arrayFilterInPlace(steps, el => el !== step)\n if (typeof step === 'function') {\n const result = step()\n if (isPromise(result)) {\n if (expectSync) {\n throw new Error(\n `Expected sync only function, but found async: ${step}`,\n )\n }\n await result\n }\n }\n else if (typeof step.dispose === 'function') {\n // Handle objects with a dispose() method (consistent with useDispose)\n const result = step.dispose()\n if (isPromise(result)) {\n if (expectSync) {\n throw new Error(\n `Expected sync only function, but found async: ${step}`,\n )\n }\n await result\n }\n }\n else {\n throw new TypeError(`Unhandled disposable: ${step}`)\n }\n }\n }\n\n const add = (obj: DisposableEntry) => {\n if (mode === 'lifo')\n steps.unshift(obj)\n else\n steps.push(obj)\n }\n\n return Object.assign(exec, {\n add,\n exec,\n getSize() {\n return steps.length\n },\n })\n}\n\nexport type UseDefer = ReturnType<typeof useDefer>\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"dispose-defer.mjs","names":[],"sources":["../../src/common/dispose-defer.ts"],"sourcesContent":["import type { DisposerFunction } from './dispose-types'\nimport type { LoggerInterface } from './log/log-base'\nimport { arrayFilterInPlace } from './data/array'\nimport { isString } from './data/is'\nimport { isPromise } from './exec/promise'\nimport { DefaultLogger } from './log/log'\n\nexport function polyfillUsing() {\n try {\n // @ts-expect-error just a polyfill\n Symbol.dispose ??= Symbol('Symbol.dispose')\n // @ts-expect-error just a polyfill\n Symbol.asyncDispose ??= Symbol('Symbol.asyncDispose')\n }\n catch (_) { }\n}\n\n// Symbol.dispose ??= Symbol('Symbol.dispose')\n// Symbol.asyncDispose ??= Symbol('Symbol.asyncDispose')\n\n/** A disposable entry: either a function or an object with a dispose() method. */\ntype DisposableEntry = DisposerFunction | { dispose: DisposerFunction }\n\n/** Different kinds of implementations have grown, this should unify them */\nfunction callDisposable(disposable: DisposableEntry): Promise<void> | void {\n let result\n\n if (typeof disposable === 'function')\n result = disposable()\n else if (typeof disposable.dispose === 'function')\n result = disposable.dispose()\n\n if (isPromise(result))\n return result\n}\n\nexport interface UseDisposeConfig {\n name?: string\n log?: LoggerInterface\n}\n\nexport function useDispose(opt?: string | UseDisposeConfig | LoggerInterface) {\n if (opt != null) {\n if (isString(opt))\n opt = { name: opt }\n else if ('debug' in opt && 'label' in opt)\n opt = { name: opt.label, log: opt }\n }\n\n polyfillUsing()\n\n const name = opt?.name\n const log = opt?.log ?? DefaultLogger('zeed:dispose')\n\n let _disposed = 0\n\n const tracked: DisposableEntry[] = []\n\n function untrack(disposable: DisposableEntry): Promise<void> | void {\n if (disposable != null && tracked.includes(disposable)) {\n arrayFilterInPlace(tracked, el => el !== disposable)\n const result = callDisposable(disposable)\n if (isPromise(result))\n return result\n }\n }\n\n function track(obj?: DisposableEntry): DisposerFunction | undefined {\n if (obj == null)\n return\n tracked.unshift(obj) // LIFO\n return () => untrack(obj)\n }\n\n /** Dispose all tracked entries */\n function dispose(strictSync = false): Promise<any> | void {\n if (name)\n log.debug(`dispose \"${name}\": ${tracked.length} entries`)\n\n _disposed += 1\n\n const promises: any[] = []\n while (tracked.length > 0) {\n const fn = tracked[0]\n const result = untrack(fn) // LIFO\n if (isPromise(result)) {\n if (strictSync)\n throw new Error(`Async disposable found: ${fn} -> ${result}`)\n else\n promises.push(result)\n }\n }\n\n if (promises.length > 0)\n return Promise.all(promises)\n }\n\n /** Dispose all tracked entries in synchronous way. */\n function disposeSync(): void {\n dispose(true)\n }\n\n return Object.assign(dispose, {\n /** Counter that increments each time dispose has been called */\n get disposed() {\n return _disposed\n },\n\n add: track,\n remove: untrack,\n\n /** @deprecated use add */\n track,\n\n /** @deprecated use remove */\n untrack,\n\n dispose,\n disposeSync,\n sync: disposeSync,\n\n /** @deprecated use dispose */\n exec: dispose,\n getSize() {\n return tracked.length\n },\n isDisposed() {\n return _disposed > 0 && tracked.length === 0\n },\n\n [Symbol.dispose]() {\n return dispose()\n },\n\n async [Symbol.asyncDispose]() {\n return await dispose()\n },\n\n })\n}\n\nexport type UseDispose = ReturnType<typeof useDispose>\n\nexport function useDefer(\n config: {\n mode?: 'lifo' | 'fifo'\n } = {},\n) {\n const { mode = 'fifo' } = config\n const steps: DisposableEntry[] = []\n\n polyfillUsing()\n\n /**\n * Executes all steps. If all steps are not Promises, they are executed immediately,\n * otherwise a Promise is returned.\n * Note: useDefer defaults to FIFO order; use mode: 'lifo' for LIFO (stack) order.\n */\n const exec = async (expectSync = false) => {\n while (steps.length > 0) {\n const step = steps[0]\n arrayFilterInPlace(steps, el => el !== step)\n if (typeof step === 'function') {\n const result = step()\n if (isPromise(result)) {\n if (expectSync) {\n throw new Error(\n `Expected sync only function, but found async: ${step}`,\n )\n }\n await result\n }\n }\n else if (typeof step.dispose === 'function') {\n // Handle objects with a dispose() method (consistent with useDispose)\n const result = step.dispose()\n if (isPromise(result)) {\n if (expectSync) {\n throw new Error(\n `Expected sync only function, but found async: ${step}`,\n )\n }\n await result\n }\n }\n else {\n throw new TypeError(`Unhandled disposable: ${step}`)\n }\n }\n }\n\n const add = (obj: DisposableEntry) => {\n if (mode === 'lifo')\n steps.unshift(obj)\n else\n steps.push(obj)\n }\n\n return Object.assign(exec, {\n add,\n exec,\n getSize() {\n return steps.length\n },\n })\n}\n\nexport type UseDefer = ReturnType<typeof useDefer>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export{};
|
|
1
|
+
export { };
|