@kdtlabs/utils 0.0.4 → 0.0.6
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/SKILL.md +12 -9
- package/dist/arrays/comparators.d.ts +8 -0
- package/dist/arrays/comparators.d.ts.map +1 -0
- package/{arrays → dist/arrays}/index.d.ts +1 -0
- package/dist/arrays/index.d.ts.map +1 -0
- package/{common → dist/common}/assertions.d.ts +1 -1
- package/{common → dist/common}/assertions.d.ts.map +1 -1
- package/{common → dist/common}/types.d.ts +1 -1
- package/{common → dist/common}/types.d.ts.map +1 -1
- package/{functions → dist/functions}/executions.d.ts +1 -1
- package/{functions → dist/functions}/executions.d.ts.map +1 -1
- package/dist/index.js +14 -0
- package/dist/index.js.map +101 -0
- package/{objects → dist/objects}/transformations.d.ts +1 -1
- package/{objects → dist/objects}/transformations.d.ts.map +1 -1
- package/{objects → dist/objects}/types.d.ts +1 -1
- package/{objects → dist/objects}/types.d.ts.map +1 -1
- package/{promises → dist/promises}/deferred.d.ts +1 -1
- package/{promises → dist/promises}/deferred.d.ts.map +1 -1
- package/{promises → dist/promises}/timers.d.ts +1 -1
- package/{promises → dist/promises}/timers.d.ts.map +1 -1
- package/{serializer → dist/serializer}/context.d.ts +1 -1
- package/{serializer → dist/serializer}/context.d.ts.map +1 -1
- package/{serializer → dist/serializer}/serialize.d.ts +1 -1
- package/{serializer → dist/serializer}/serialize.d.ts.map +1 -1
- package/{serializer → dist/serializer}/serializers/array.d.ts +1 -1
- package/{serializer → dist/serializer}/serializers/array.d.ts.map +1 -1
- package/{serializer → dist/serializer}/serializers/binary.d.ts +1 -1
- package/dist/serializer/serializers/binary.d.ts.map +1 -0
- package/{serializer → dist/serializer}/serializers/blob.d.ts +1 -1
- package/dist/serializer/serializers/blob.d.ts.map +1 -0
- package/{serializer → dist/serializer}/serializers/collection.d.ts +1 -1
- package/{serializer → dist/serializer}/serializers/collection.d.ts.map +1 -1
- package/{serializer → dist/serializer}/serializers/compound.d.ts +1 -1
- package/{serializer → dist/serializer}/serializers/compound.d.ts.map +1 -1
- package/{serializer → dist/serializer}/serializers/error.d.ts +1 -1
- package/{serializer → dist/serializer}/serializers/error.d.ts.map +1 -1
- package/{serializer → dist/serializer}/serializers/function.d.ts +1 -1
- package/{serializer → dist/serializer}/serializers/function.d.ts.map +1 -1
- package/{serializer → dist/serializer}/serializers/leaf-object.d.ts +1 -1
- package/{serializer → dist/serializer}/serializers/leaf-object.d.ts.map +1 -1
- package/{serializer → dist/serializer}/serializers/number.d.ts +1 -1
- package/dist/serializer/serializers/number.d.ts.map +1 -0
- package/{serializer → dist/serializer}/serializers/object.d.ts +1 -1
- package/{serializer → dist/serializer}/serializers/object.d.ts.map +1 -1
- package/{serializer → dist/serializer}/serializers/opaque.d.ts +1 -1
- package/dist/serializer/serializers/opaque.d.ts.map +1 -0
- package/{serializer → dist/serializer}/serializers/primitive.d.ts +1 -1
- package/{serializer → dist/serializer}/serializers/primitive.d.ts.map +1 -1
- package/{serializer → dist/serializer}/types.d.ts +1 -1
- package/{serializer → dist/serializer}/types.d.ts.map +1 -1
- package/{serializer → dist/serializer}/utils.d.ts +1 -1
- package/{serializer → dist/serializer}/utils.d.ts.map +1 -1
- package/{strings → dist/strings}/index.d.ts +1 -0
- package/{strings → dist/strings}/index.d.ts.map +1 -1
- package/{strings → dist/strings}/manipulations.d.ts +2 -0
- package/{strings → dist/strings}/manipulations.d.ts.map +1 -1
- package/dist/strings/strip-ansi.d.ts +2 -0
- package/dist/strings/strip-ansi.d.ts.map +1 -0
- package/{system → dist/system}/fetch.d.ts +2 -2
- package/{system → dist/system}/fetch.d.ts.map +1 -1
- package/dist/system/types.d.ts +3 -0
- package/{system → dist/system}/types.d.ts.map +1 -1
- package/{times → dist/times}/conversions.d.ts +1 -1
- package/{times → dist/times}/conversions.d.ts.map +1 -1
- package/package.json +11 -73
- package/src/arrays/accessors.ts +25 -0
- package/src/arrays/comparators.ts +53 -0
- package/src/arrays/conversions.ts +16 -0
- package/src/arrays/factories.ts +13 -0
- package/src/arrays/guards.ts +7 -0
- package/src/arrays/index.ts +9 -0
- package/src/arrays/operations.ts +103 -0
- package/src/arrays/set-operations.ts +11 -0
- package/src/arrays/types.ts +21 -0
- package/src/buffers/conversions.ts +26 -0
- package/src/buffers/guards.ts +13 -0
- package/src/buffers/index.ts +5 -0
- package/src/buffers/operations.ts +44 -0
- package/src/buffers/types.ts +1 -0
- package/src/collections/fifo-map.ts +33 -0
- package/src/collections/fifo-set.ts +29 -0
- package/src/collections/guards.ts +11 -0
- package/src/collections/index.ts +10 -0
- package/src/collections/linked-base.ts +117 -0
- package/src/collections/linked-map.ts +82 -0
- package/src/collections/linked-set.ts +69 -0
- package/src/collections/lru-map.ts +36 -0
- package/src/collections/lru-set.ts +25 -0
- package/src/collections/types.ts +12 -0
- package/src/common/assertions.ts +11 -0
- package/src/common/guards.ts +58 -0
- package/src/common/index.ts +5 -0
- package/src/common/transformations.ts +20 -0
- package/src/common/types.ts +3 -0
- package/src/core/constants.ts +1 -0
- package/src/core/conversions.ts +9 -0
- package/src/core/guards.ts +57 -0
- package/src/core/index.ts +5 -0
- package/src/core/types.ts +15 -0
- package/src/errors/base-error.ts +48 -0
- package/src/errors/factories.ts +74 -0
- package/src/errors/guards.ts +12 -0
- package/src/errors/index.ts +7 -0
- package/src/errors/operations.ts +15 -0
- package/src/errors/stringify.ts +131 -0
- package/src/errors/types.ts +11 -0
- package/src/events/emitter.ts +117 -0
- package/src/events/index.ts +2 -0
- package/src/events/types.ts +11 -0
- package/src/functions/compositions.ts +17 -0
- package/src/functions/debounce.ts +34 -0
- package/src/functions/executions.ts +12 -0
- package/src/functions/guards.ts +5 -0
- package/src/functions/index.ts +11 -0
- package/src/functions/memoize.ts +33 -0
- package/src/functions/once.ts +33 -0
- package/src/functions/pipe.ts +39 -0
- package/src/functions/throttle.ts +59 -0
- package/src/functions/timer-state.ts +33 -0
- package/src/functions/types.ts +8 -0
- package/src/index.ts +16 -0
- package/src/json-rpc/constants.ts +15 -0
- package/src/json-rpc/factories.ts +22 -0
- package/src/json-rpc/guards.ts +58 -0
- package/src/json-rpc/index.ts +5 -0
- package/src/json-rpc/types.ts +48 -0
- package/src/numbers/bigint-math.ts +163 -0
- package/src/numbers/constants.ts +14 -0
- package/src/numbers/conversions.ts +83 -0
- package/src/numbers/factories.ts +6 -0
- package/src/numbers/formats.ts +52 -0
- package/src/numbers/guards.ts +22 -0
- package/src/numbers/index.ts +10 -0
- package/src/numbers/maths.ts +28 -0
- package/src/numbers/ranges.ts +17 -0
- package/src/numbers/types.ts +7 -0
- package/src/objects/deep-merge.ts +76 -0
- package/src/objects/guards.ts +21 -0
- package/src/objects/index.ts +5 -0
- package/src/objects/transformations.ts +34 -0
- package/src/objects/types.ts +33 -0
- package/src/promises/abortable.ts +37 -0
- package/src/promises/compositions.ts +18 -0
- package/src/promises/deferred.ts +131 -0
- package/src/promises/guards.ts +8 -0
- package/src/promises/index.ts +10 -0
- package/src/promises/pipe.ts +39 -0
- package/src/promises/poll.ts +92 -0
- package/src/promises/retry.ts +138 -0
- package/src/promises/timers.ts +16 -0
- package/src/promises/types.ts +1 -0
- package/src/serializer/constants.ts +5 -0
- package/src/serializer/context.ts +24 -0
- package/src/serializer/index.ts +8 -0
- package/src/serializer/serialize.ts +51 -0
- package/src/serializer/serializers/array.ts +17 -0
- package/src/serializer/serializers/binary.ts +24 -0
- package/src/serializer/serializers/blob.ts +18 -0
- package/src/serializer/serializers/collection.ts +25 -0
- package/src/serializer/serializers/compound.ts +79 -0
- package/src/serializer/serializers/error.ts +75 -0
- package/src/serializer/serializers/function.ts +13 -0
- package/src/serializer/serializers/index.ts +12 -0
- package/src/serializer/serializers/leaf-object.ts +18 -0
- package/src/serializer/serializers/number.ts +14 -0
- package/src/serializer/serializers/object.ts +62 -0
- package/src/serializer/serializers/opaque.ts +36 -0
- package/src/serializer/serializers/primitive.ts +32 -0
- package/src/serializer/symbol-registry.ts +28 -0
- package/src/serializer/types.ts +42 -0
- package/src/serializer/utils.ts +15 -0
- package/src/strings/constants.ts +1 -0
- package/src/strings/factories.ts +9 -0
- package/src/strings/guards.ts +51 -0
- package/src/strings/index.ts +7 -0
- package/src/strings/manipulations.ts +145 -0
- package/src/strings/strip-ansi.ts +14 -0
- package/src/strings/types.ts +3 -0
- package/src/system/env.ts +32 -0
- package/src/system/fetch.ts +23 -0
- package/src/system/graceful-exit.ts +46 -0
- package/src/system/index.ts +6 -0
- package/src/system/path.ts +12 -0
- package/src/system/types.ts +3 -0
- package/src/times/constants.ts +6 -0
- package/src/times/conversions.ts +85 -0
- package/src/times/factories.ts +3 -0
- package/src/times/guards.ts +3 -0
- package/src/times/index.ts +5 -0
- package/src/times/operations.ts +9 -0
- package/CHANGELOG.md +0 -57
- package/arrays/index.d.ts.map +0 -1
- package/arrays/index.js +0 -4
- package/arrays/index.js.map +0 -9
- package/buffers/index.js +0 -4
- package/buffers/index.js.map +0 -9
- package/chunk-25ja9350.js +0 -4
- package/chunk-25ja9350.js.map +0 -13
- package/chunk-3w6nt7kb.js +0 -4
- package/chunk-3w6nt7kb.js.map +0 -12
- package/chunk-5txwcr6j.js +0 -4
- package/chunk-5txwcr6j.js.map +0 -17
- package/chunk-6dxad51h.js +0 -4
- package/chunk-6dxad51h.js.map +0 -12
- package/chunk-6kdnnxe0.js +0 -4
- package/chunk-6kdnnxe0.js.map +0 -17
- package/chunk-7cndek91.js +0 -4
- package/chunk-7cndek91.js.map +0 -15
- package/chunk-bee0nxse.js +0 -6
- package/chunk-bee0nxse.js.map +0 -14
- package/chunk-bjmntg2y.js +0 -4
- package/chunk-bjmntg2y.js.map +0 -18
- package/chunk-d0d0d285.js +0 -4
- package/chunk-d0d0d285.js.map +0 -26
- package/chunk-jny2gdyy.js +0 -4
- package/chunk-jny2gdyy.js.map +0 -12
- package/chunk-kbzgn0z4.js +0 -4
- package/chunk-kbzgn0z4.js.map +0 -10
- package/chunk-qmbgp0vr.js +0 -4
- package/chunk-qmbgp0vr.js.map +0 -12
- package/chunk-qn6n0ff5.js +0 -4
- package/chunk-qn6n0ff5.js.map +0 -17
- package/chunk-r3maskdb.js +0 -5
- package/chunk-r3maskdb.js.map +0 -13
- package/chunk-st3dxvqt.js +0 -4
- package/chunk-st3dxvqt.js.map +0 -14
- package/chunk-xp18wdk6.js +0 -4
- package/chunk-xp18wdk6.js.map +0 -12
- package/collections/index.js +0 -4
- package/collections/index.js.map +0 -9
- package/common/index.js +0 -4
- package/common/index.js.map +0 -9
- package/core/index.js +0 -4
- package/core/index.js.map +0 -9
- package/errors/index.js +0 -4
- package/errors/index.js.map +0 -9
- package/events/index.js +0 -4
- package/events/index.js.map +0 -9
- package/functions/index.js +0 -4
- package/functions/index.js.map +0 -9
- package/index.js +0 -4
- package/index.js.map +0 -9
- package/json-rpc/index.js +0 -4
- package/json-rpc/index.js.map +0 -9
- package/meta.json +0 -2998
- package/meta.md +0 -1816
- package/numbers/index.js +0 -4
- package/numbers/index.js.map +0 -9
- package/objects/index.js +0 -4
- package/objects/index.js.map +0 -9
- package/promises/index.js +0 -4
- package/promises/index.js.map +0 -9
- package/serializer/index.js +0 -4
- package/serializer/index.js.map +0 -9
- package/serializer/serializers/binary.d.ts.map +0 -1
- package/serializer/serializers/blob.d.ts.map +0 -1
- package/serializer/serializers/number.d.ts.map +0 -1
- package/serializer/serializers/opaque.d.ts.map +0 -1
- package/strings/index.js +0 -4
- package/strings/index.js.map +0 -9
- package/system/index.js +0 -4
- package/system/index.js.map +0 -9
- package/system/types.d.ts +0 -3
- package/times/index.js +0 -4
- package/times/index.js.map +0 -9
- /package/{arrays → dist/arrays}/accessors.d.ts +0 -0
- /package/{arrays → dist/arrays}/accessors.d.ts.map +0 -0
- /package/{arrays → dist/arrays}/conversions.d.ts +0 -0
- /package/{arrays → dist/arrays}/conversions.d.ts.map +0 -0
- /package/{arrays → dist/arrays}/factories.d.ts +0 -0
- /package/{arrays → dist/arrays}/factories.d.ts.map +0 -0
- /package/{arrays → dist/arrays}/guards.d.ts +0 -0
- /package/{arrays → dist/arrays}/guards.d.ts.map +0 -0
- /package/{arrays → dist/arrays}/operations.d.ts +0 -0
- /package/{arrays → dist/arrays}/operations.d.ts.map +0 -0
- /package/{arrays → dist/arrays}/set-operations.d.ts +0 -0
- /package/{arrays → dist/arrays}/set-operations.d.ts.map +0 -0
- /package/{arrays → dist/arrays}/types.d.ts +0 -0
- /package/{arrays → dist/arrays}/types.d.ts.map +0 -0
- /package/{buffers → dist/buffers}/conversions.d.ts +0 -0
- /package/{buffers → dist/buffers}/conversions.d.ts.map +0 -0
- /package/{buffers → dist/buffers}/guards.d.ts +0 -0
- /package/{buffers → dist/buffers}/guards.d.ts.map +0 -0
- /package/{buffers → dist/buffers}/index.d.ts +0 -0
- /package/{buffers → dist/buffers}/index.d.ts.map +0 -0
- /package/{buffers → dist/buffers}/operations.d.ts +0 -0
- /package/{buffers → dist/buffers}/operations.d.ts.map +0 -0
- /package/{buffers → dist/buffers}/types.d.ts +0 -0
- /package/{buffers → dist/buffers}/types.d.ts.map +0 -0
- /package/{collections → dist/collections}/fifo-map.d.ts +0 -0
- /package/{collections → dist/collections}/fifo-map.d.ts.map +0 -0
- /package/{collections → dist/collections}/fifo-set.d.ts +0 -0
- /package/{collections → dist/collections}/fifo-set.d.ts.map +0 -0
- /package/{collections → dist/collections}/guards.d.ts +0 -0
- /package/{collections → dist/collections}/guards.d.ts.map +0 -0
- /package/{collections → dist/collections}/index.d.ts +0 -0
- /package/{collections → dist/collections}/index.d.ts.map +0 -0
- /package/{collections → dist/collections}/linked-base.d.ts +0 -0
- /package/{collections → dist/collections}/linked-base.d.ts.map +0 -0
- /package/{collections → dist/collections}/linked-map.d.ts +0 -0
- /package/{collections → dist/collections}/linked-map.d.ts.map +0 -0
- /package/{collections → dist/collections}/linked-set.d.ts +0 -0
- /package/{collections → dist/collections}/linked-set.d.ts.map +0 -0
- /package/{collections → dist/collections}/lru-map.d.ts +0 -0
- /package/{collections → dist/collections}/lru-map.d.ts.map +0 -0
- /package/{collections → dist/collections}/lru-set.d.ts +0 -0
- /package/{collections → dist/collections}/lru-set.d.ts.map +0 -0
- /package/{collections → dist/collections}/types.d.ts +0 -0
- /package/{collections → dist/collections}/types.d.ts.map +0 -0
- /package/{common → dist/common}/guards.d.ts +0 -0
- /package/{common → dist/common}/guards.d.ts.map +0 -0
- /package/{common → dist/common}/index.d.ts +0 -0
- /package/{common → dist/common}/index.d.ts.map +0 -0
- /package/{common → dist/common}/transformations.d.ts +0 -0
- /package/{common → dist/common}/transformations.d.ts.map +0 -0
- /package/{core → dist/core}/constants.d.ts +0 -0
- /package/{core → dist/core}/constants.d.ts.map +0 -0
- /package/{core → dist/core}/conversions.d.ts +0 -0
- /package/{core → dist/core}/conversions.d.ts.map +0 -0
- /package/{core → dist/core}/guards.d.ts +0 -0
- /package/{core → dist/core}/guards.d.ts.map +0 -0
- /package/{core → dist/core}/index.d.ts +0 -0
- /package/{core → dist/core}/index.d.ts.map +0 -0
- /package/{core → dist/core}/types.d.ts +0 -0
- /package/{core → dist/core}/types.d.ts.map +0 -0
- /package/{errors → dist/errors}/base-error.d.ts +0 -0
- /package/{errors → dist/errors}/base-error.d.ts.map +0 -0
- /package/{errors → dist/errors}/factories.d.ts +0 -0
- /package/{errors → dist/errors}/factories.d.ts.map +0 -0
- /package/{errors → dist/errors}/guards.d.ts +0 -0
- /package/{errors → dist/errors}/guards.d.ts.map +0 -0
- /package/{errors → dist/errors}/index.d.ts +0 -0
- /package/{errors → dist/errors}/index.d.ts.map +0 -0
- /package/{errors → dist/errors}/operations.d.ts +0 -0
- /package/{errors → dist/errors}/operations.d.ts.map +0 -0
- /package/{errors → dist/errors}/stringify.d.ts +0 -0
- /package/{errors → dist/errors}/stringify.d.ts.map +0 -0
- /package/{errors → dist/errors}/types.d.ts +0 -0
- /package/{errors → dist/errors}/types.d.ts.map +0 -0
- /package/{events → dist/events}/emitter.d.ts +0 -0
- /package/{events → dist/events}/emitter.d.ts.map +0 -0
- /package/{events → dist/events}/index.d.ts +0 -0
- /package/{events → dist/events}/index.d.ts.map +0 -0
- /package/{events → dist/events}/types.d.ts +0 -0
- /package/{events → dist/events}/types.d.ts.map +0 -0
- /package/{functions → dist/functions}/compositions.d.ts +0 -0
- /package/{functions → dist/functions}/compositions.d.ts.map +0 -0
- /package/{functions → dist/functions}/debounce.d.ts +0 -0
- /package/{functions → dist/functions}/debounce.d.ts.map +0 -0
- /package/{functions → dist/functions}/guards.d.ts +0 -0
- /package/{functions → dist/functions}/guards.d.ts.map +0 -0
- /package/{functions → dist/functions}/index.d.ts +0 -0
- /package/{functions → dist/functions}/index.d.ts.map +0 -0
- /package/{functions → dist/functions}/memoize.d.ts +0 -0
- /package/{functions → dist/functions}/memoize.d.ts.map +0 -0
- /package/{functions → dist/functions}/once.d.ts +0 -0
- /package/{functions → dist/functions}/once.d.ts.map +0 -0
- /package/{functions → dist/functions}/pipe.d.ts +0 -0
- /package/{functions → dist/functions}/pipe.d.ts.map +0 -0
- /package/{functions → dist/functions}/throttle.d.ts +0 -0
- /package/{functions → dist/functions}/throttle.d.ts.map +0 -0
- /package/{functions → dist/functions}/timer-state.d.ts +0 -0
- /package/{functions → dist/functions}/timer-state.d.ts.map +0 -0
- /package/{functions → dist/functions}/types.d.ts +0 -0
- /package/{functions → dist/functions}/types.d.ts.map +0 -0
- /package/{index.d.ts → dist/index.d.ts} +0 -0
- /package/{index.d.ts.map → dist/index.d.ts.map} +0 -0
- /package/{json-rpc → dist/json-rpc}/constants.d.ts +0 -0
- /package/{json-rpc → dist/json-rpc}/constants.d.ts.map +0 -0
- /package/{json-rpc → dist/json-rpc}/factories.d.ts +0 -0
- /package/{json-rpc → dist/json-rpc}/factories.d.ts.map +0 -0
- /package/{json-rpc → dist/json-rpc}/guards.d.ts +0 -0
- /package/{json-rpc → dist/json-rpc}/guards.d.ts.map +0 -0
- /package/{json-rpc → dist/json-rpc}/index.d.ts +0 -0
- /package/{json-rpc → dist/json-rpc}/index.d.ts.map +0 -0
- /package/{json-rpc → dist/json-rpc}/types.d.ts +0 -0
- /package/{json-rpc → dist/json-rpc}/types.d.ts.map +0 -0
- /package/{numbers → dist/numbers}/bigint-math.d.ts +0 -0
- /package/{numbers → dist/numbers}/bigint-math.d.ts.map +0 -0
- /package/{numbers → dist/numbers}/constants.d.ts +0 -0
- /package/{numbers → dist/numbers}/constants.d.ts.map +0 -0
- /package/{numbers → dist/numbers}/conversions.d.ts +0 -0
- /package/{numbers → dist/numbers}/conversions.d.ts.map +0 -0
- /package/{numbers → dist/numbers}/factories.d.ts +0 -0
- /package/{numbers → dist/numbers}/factories.d.ts.map +0 -0
- /package/{numbers → dist/numbers}/formats.d.ts +0 -0
- /package/{numbers → dist/numbers}/formats.d.ts.map +0 -0
- /package/{numbers → dist/numbers}/guards.d.ts +0 -0
- /package/{numbers → dist/numbers}/guards.d.ts.map +0 -0
- /package/{numbers → dist/numbers}/index.d.ts +0 -0
- /package/{numbers → dist/numbers}/index.d.ts.map +0 -0
- /package/{numbers → dist/numbers}/maths.d.ts +0 -0
- /package/{numbers → dist/numbers}/maths.d.ts.map +0 -0
- /package/{numbers → dist/numbers}/ranges.d.ts +0 -0
- /package/{numbers → dist/numbers}/ranges.d.ts.map +0 -0
- /package/{numbers → dist/numbers}/types.d.ts +0 -0
- /package/{numbers → dist/numbers}/types.d.ts.map +0 -0
- /package/{objects → dist/objects}/deep-merge.d.ts +0 -0
- /package/{objects → dist/objects}/deep-merge.d.ts.map +0 -0
- /package/{objects → dist/objects}/guards.d.ts +0 -0
- /package/{objects → dist/objects}/guards.d.ts.map +0 -0
- /package/{objects → dist/objects}/index.d.ts +0 -0
- /package/{objects → dist/objects}/index.d.ts.map +0 -0
- /package/{promises → dist/promises}/abortable.d.ts +0 -0
- /package/{promises → dist/promises}/abortable.d.ts.map +0 -0
- /package/{promises → dist/promises}/compositions.d.ts +0 -0
- /package/{promises → dist/promises}/compositions.d.ts.map +0 -0
- /package/{promises → dist/promises}/guards.d.ts +0 -0
- /package/{promises → dist/promises}/guards.d.ts.map +0 -0
- /package/{promises → dist/promises}/index.d.ts +0 -0
- /package/{promises → dist/promises}/index.d.ts.map +0 -0
- /package/{promises → dist/promises}/pipe.d.ts +0 -0
- /package/{promises → dist/promises}/pipe.d.ts.map +0 -0
- /package/{promises → dist/promises}/poll.d.ts +0 -0
- /package/{promises → dist/promises}/poll.d.ts.map +0 -0
- /package/{promises → dist/promises}/retry.d.ts +0 -0
- /package/{promises → dist/promises}/retry.d.ts.map +0 -0
- /package/{promises → dist/promises}/types.d.ts +0 -0
- /package/{promises → dist/promises}/types.d.ts.map +0 -0
- /package/{serializer → dist/serializer}/constants.d.ts +0 -0
- /package/{serializer → dist/serializer}/constants.d.ts.map +0 -0
- /package/{serializer → dist/serializer}/index.d.ts +0 -0
- /package/{serializer → dist/serializer}/index.d.ts.map +0 -0
- /package/{serializer → dist/serializer}/serializers/index.d.ts +0 -0
- /package/{serializer → dist/serializer}/serializers/index.d.ts.map +0 -0
- /package/{serializer → dist/serializer}/symbol-registry.d.ts +0 -0
- /package/{serializer → dist/serializer}/symbol-registry.d.ts.map +0 -0
- /package/{strings → dist/strings}/constants.d.ts +0 -0
- /package/{strings → dist/strings}/constants.d.ts.map +0 -0
- /package/{strings → dist/strings}/factories.d.ts +0 -0
- /package/{strings → dist/strings}/factories.d.ts.map +0 -0
- /package/{strings → dist/strings}/guards.d.ts +0 -0
- /package/{strings → dist/strings}/guards.d.ts.map +0 -0
- /package/{strings → dist/strings}/types.d.ts +0 -0
- /package/{strings → dist/strings}/types.d.ts.map +0 -0
- /package/{system → dist/system}/env.d.ts +0 -0
- /package/{system → dist/system}/env.d.ts.map +0 -0
- /package/{system → dist/system}/graceful-exit.d.ts +0 -0
- /package/{system → dist/system}/graceful-exit.d.ts.map +0 -0
- /package/{system → dist/system}/index.d.ts +0 -0
- /package/{system → dist/system}/index.d.ts.map +0 -0
- /package/{system → dist/system}/path.d.ts +0 -0
- /package/{system → dist/system}/path.d.ts.map +0 -0
- /package/{times → dist/times}/constants.d.ts +0 -0
- /package/{times → dist/times}/constants.d.ts.map +0 -0
- /package/{times → dist/times}/factories.d.ts +0 -0
- /package/{times → dist/times}/factories.d.ts.map +0 -0
- /package/{times → dist/times}/guards.d.ts +0 -0
- /package/{times → dist/times}/guards.d.ts.map +0 -0
- /package/{times → dist/times}/index.d.ts +0 -0
- /package/{times → dist/times}/index.d.ts.map +0 -0
- /package/{times → dist/times}/operations.d.ts +0 -0
- /package/{times → dist/times}/operations.d.ts.map +0 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { Awaitable } from './types'
|
|
2
|
+
import { isNonEmptyArray } from '../arrays'
|
|
3
|
+
|
|
4
|
+
export async function pPipe(): Promise<void>
|
|
5
|
+
export async function pPipe<T>(fn: () => Awaitable<T>): Promise<T>
|
|
6
|
+
export async function pPipe<T1, T2>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>): Promise<T2>
|
|
7
|
+
export async function pPipe<T1, T2, T3>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>): Promise<T3>
|
|
8
|
+
export async function pPipe<T1, T2, T3, T4>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>): Promise<T4>
|
|
9
|
+
export async function pPipe<T1, T2, T3, T4, T5>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>): Promise<T5>
|
|
10
|
+
export async function pPipe<T1, T2, T3, T4, T5, T6>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>): Promise<T6>
|
|
11
|
+
export async function pPipe<T1, T2, T3, T4, T5, T6, T7>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>): Promise<T7>
|
|
12
|
+
export async function pPipe<T1, T2, T3, T4, T5, T6, T7, T8>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>, fn8: (arg: T7) => Awaitable<T8>): Promise<T8>
|
|
13
|
+
export async function pPipe<T1, T2, T3, T4, T5, T6, T7, T8, T9>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>, fn8: (arg: T7) => Awaitable<T8>, fn9: (arg: T8) => Awaitable<T9>): Promise<T9>
|
|
14
|
+
export async function pPipe<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>, fn8: (arg: T7) => Awaitable<T8>, fn9: (arg: T8) => Awaitable<T9>, fn10: (arg: T9) => Awaitable<T10>): Promise<T10>
|
|
15
|
+
export async function pPipe<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>, fn8: (arg: T7) => Awaitable<T8>, fn9: (arg: T8) => Awaitable<T9>, fn10: (arg: T9) => Awaitable<T10>, fn11: (arg: T10) => Awaitable<T11>): Promise<T11>
|
|
16
|
+
export async function pPipe<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>, fn8: (arg: T7) => Awaitable<T8>, fn9: (arg: T8) => Awaitable<T9>, fn10: (arg: T9) => Awaitable<T10>, fn11: (arg: T10) => Awaitable<T11>, fn12: (arg: T11) => Awaitable<T12>): Promise<T12>
|
|
17
|
+
export async function pPipe<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>, fn8: (arg: T7) => Awaitable<T8>, fn9: (arg: T8) => Awaitable<T9>, fn10: (arg: T9) => Awaitable<T10>, fn11: (arg: T10) => Awaitable<T11>, fn12: (arg: T11) => Awaitable<T12>, fn13: (arg: T12) => Awaitable<T13>): Promise<T13>
|
|
18
|
+
export async function pPipe<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>, fn8: (arg: T7) => Awaitable<T8>, fn9: (arg: T8) => Awaitable<T9>, fn10: (arg: T9) => Awaitable<T10>, fn11: (arg: T10) => Awaitable<T11>, fn12: (arg: T11) => Awaitable<T12>, fn13: (arg: T12) => Awaitable<T13>, fn14: (arg: T13) => Awaitable<T14>): Promise<T14>
|
|
19
|
+
export async function pPipe<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>, fn8: (arg: T7) => Awaitable<T8>, fn9: (arg: T8) => Awaitable<T9>, fn10: (arg: T9) => Awaitable<T10>, fn11: (arg: T10) => Awaitable<T11>, fn12: (arg: T11) => Awaitable<T12>, fn13: (arg: T12) => Awaitable<T13>, fn14: (arg: T13) => Awaitable<T14>, fn15: (arg: T14) => Awaitable<T15>): Promise<T15>
|
|
20
|
+
export async function pPipe<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>, fn8: (arg: T7) => Awaitable<T8>, fn9: (arg: T8) => Awaitable<T9>, fn10: (arg: T9) => Awaitable<T10>, fn11: (arg: T10) => Awaitable<T11>, fn12: (arg: T11) => Awaitable<T12>, fn13: (arg: T12) => Awaitable<T13>, fn14: (arg: T13) => Awaitable<T14>, fn15: (arg: T14) => Awaitable<T15>, fn16: (arg: T15) => Awaitable<T16>): Promise<T16>
|
|
21
|
+
export async function pPipe<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>, fn8: (arg: T7) => Awaitable<T8>, fn9: (arg: T8) => Awaitable<T9>, fn10: (arg: T9) => Awaitable<T10>, fn11: (arg: T10) => Awaitable<T11>, fn12: (arg: T11) => Awaitable<T12>, fn13: (arg: T12) => Awaitable<T13>, fn14: (arg: T13) => Awaitable<T14>, fn15: (arg: T14) => Awaitable<T15>, fn16: (arg: T15) => Awaitable<T16>, fn17: (arg: T16) => Awaitable<T17>): Promise<T17>
|
|
22
|
+
export async function pPipe<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>, fn8: (arg: T7) => Awaitable<T8>, fn9: (arg: T8) => Awaitable<T9>, fn10: (arg: T9) => Awaitable<T10>, fn11: (arg: T10) => Awaitable<T11>, fn12: (arg: T11) => Awaitable<T12>, fn13: (arg: T12) => Awaitable<T13>, fn14: (arg: T13) => Awaitable<T14>, fn15: (arg: T14) => Awaitable<T15>, fn16: (arg: T15) => Awaitable<T16>, fn17: (arg: T16) => Awaitable<T17>, fn18: (arg: T17) => Awaitable<T18>): Promise<T18>
|
|
23
|
+
export async function pPipe<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>, fn8: (arg: T7) => Awaitable<T8>, fn9: (arg: T8) => Awaitable<T9>, fn10: (arg: T9) => Awaitable<T10>, fn11: (arg: T10) => Awaitable<T11>, fn12: (arg: T11) => Awaitable<T12>, fn13: (arg: T12) => Awaitable<T13>, fn14: (arg: T13) => Awaitable<T14>, fn15: (arg: T14) => Awaitable<T15>, fn16: (arg: T15) => Awaitable<T16>, fn17: (arg: T16) => Awaitable<T17>, fn18: (arg: T17) => Awaitable<T18>, fn19: (arg: T18) => Awaitable<T19>): Promise<T19>
|
|
24
|
+
export async function pPipe<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>, fn8: (arg: T7) => Awaitable<T8>, fn9: (arg: T8) => Awaitable<T9>, fn10: (arg: T9) => Awaitable<T10>, fn11: (arg: T10) => Awaitable<T11>, fn12: (arg: T11) => Awaitable<T12>, fn13: (arg: T12) => Awaitable<T13>, fn14: (arg: T13) => Awaitable<T14>, fn15: (arg: T14) => Awaitable<T15>, fn16: (arg: T15) => Awaitable<T16>, fn17: (arg: T16) => Awaitable<T17>, fn18: (arg: T17) => Awaitable<T18>, fn19: (arg: T18) => Awaitable<T19>, fn20: (arg: T19) => Awaitable<T20>): Promise<T20>
|
|
25
|
+
export async function pPipe(...fns: CallableFunction[]): Promise<unknown>
|
|
26
|
+
|
|
27
|
+
export async function pPipe(...fns: CallableFunction[]) {
|
|
28
|
+
if (!isNonEmptyArray(fns)) {
|
|
29
|
+
return
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
let result = await fns[0]()
|
|
33
|
+
|
|
34
|
+
for (let i = 1; i < fns.length; i++) {
|
|
35
|
+
result = await fns[i]!(result)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return result
|
|
39
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type { Awaitable } from './types'
|
|
2
|
+
import { assertParam } from '../common'
|
|
3
|
+
import { createAbortController, isAbortError } from '../errors'
|
|
4
|
+
import { isFunction } from '../functions'
|
|
5
|
+
import { isPlainObject } from '../objects'
|
|
6
|
+
import { abortable } from './abortable'
|
|
7
|
+
import { sleep } from './timers'
|
|
8
|
+
|
|
9
|
+
export interface PollOptions {
|
|
10
|
+
delay?: number
|
|
11
|
+
immediately?: boolean
|
|
12
|
+
onError?: (error: unknown) => void
|
|
13
|
+
stopOnError?: boolean
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export type PollFn = (signal: AbortSignal) => Awaitable<void>
|
|
17
|
+
|
|
18
|
+
export function poll(fn: PollFn, options?: PollOptions): () => Promise<void>
|
|
19
|
+
export function poll(options: PollOptions, fn: PollFn): () => Promise<void>
|
|
20
|
+
|
|
21
|
+
export function poll(fnOrOptions: PollFn | PollOptions, optionsOrFn: PollFn | PollOptions = {}) {
|
|
22
|
+
let fn: PollFn
|
|
23
|
+
let options: PollOptions
|
|
24
|
+
|
|
25
|
+
if (isFunction(fnOrOptions) && isPlainObject(optionsOrFn)) {
|
|
26
|
+
fn = fnOrOptions
|
|
27
|
+
options = optionsOrFn
|
|
28
|
+
} else {
|
|
29
|
+
assertParam(isPlainObject(fnOrOptions), 'options must be an object')
|
|
30
|
+
assertParam(isFunction(optionsOrFn), 'fn must be a function')
|
|
31
|
+
|
|
32
|
+
fn = optionsOrFn
|
|
33
|
+
options = fnOrOptions
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const { delay = 0, immediately = true, onError, stopOnError = true } = options
|
|
37
|
+
const abortController = createAbortController()
|
|
38
|
+
|
|
39
|
+
let isActive = true
|
|
40
|
+
let currentTask: Promise<void> | undefined
|
|
41
|
+
|
|
42
|
+
const stop = () => {
|
|
43
|
+
isActive = false
|
|
44
|
+
abortController.abort()
|
|
45
|
+
|
|
46
|
+
return currentTask ?? Promise.resolve()
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
let startRun: () => void
|
|
50
|
+
|
|
51
|
+
const run = async () => {
|
|
52
|
+
if (!isActive) {
|
|
53
|
+
return
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
try {
|
|
57
|
+
await abortable(Promise.resolve(fn(abortController.signal)), abortController.signal)
|
|
58
|
+
|
|
59
|
+
if (isActive) {
|
|
60
|
+
await sleep(delay, { signal: abortController.signal })
|
|
61
|
+
}
|
|
62
|
+
} catch (error) {
|
|
63
|
+
if (isAbortError(error) && !isActive) {
|
|
64
|
+
return
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
onError?.(error)
|
|
68
|
+
|
|
69
|
+
if (stopOnError) {
|
|
70
|
+
stop()
|
|
71
|
+
|
|
72
|
+
return
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
setTimeout(startRun, 0)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
startRun = () => {
|
|
80
|
+
currentTask = run().finally(() => {
|
|
81
|
+
currentTask = undefined
|
|
82
|
+
})
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (immediately) {
|
|
86
|
+
Promise.resolve().then(startRun)
|
|
87
|
+
} else {
|
|
88
|
+
setTimeout(startRun, delay)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return stop
|
|
92
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import type { Awaitable } from './types'
|
|
2
|
+
import { isAbortError } from '../errors'
|
|
3
|
+
import { clamp } from '../numbers'
|
|
4
|
+
import { abortable } from './abortable'
|
|
5
|
+
import { sleep } from './timers'
|
|
6
|
+
|
|
7
|
+
export interface GetRetryDelayOptions {
|
|
8
|
+
backoff?: number
|
|
9
|
+
delay?: number
|
|
10
|
+
jitter?: number
|
|
11
|
+
maxDelay?: number
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function getRetryDelay(attempts: number, { backoff = 2, delay = 1000, jitter = 0.01, maxDelay = 10_000 }: GetRetryDelayOptions = {}) {
|
|
15
|
+
const exponentialDelay = delay * backoff ** (attempts - 1)
|
|
16
|
+
const clampedDelay = clamp(exponentialDelay, 0, maxDelay)
|
|
17
|
+
|
|
18
|
+
if (jitter <= 0) {
|
|
19
|
+
return clampedDelay
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const jitterRange = clampedDelay * jitter
|
|
23
|
+
const jitterOffset = (Math.random() - 0.5) * 2 * jitterRange
|
|
24
|
+
|
|
25
|
+
return clamp(clampedDelay + jitterOffset, 0, maxDelay)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface WithRetryContext {
|
|
29
|
+
attempts: number
|
|
30
|
+
retriesLeft: number
|
|
31
|
+
signal?: AbortSignal
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface WithRetryOptions<T> extends GetRetryDelayOptions {
|
|
35
|
+
maxAttempts?: number
|
|
36
|
+
onBeforeWaitForNextAttempt?: (delay: number, context: WithRetryContext) => Awaitable<void>
|
|
37
|
+
onFailedAttempt?: (error: unknown, context: WithRetryContext) => Awaitable<void>
|
|
38
|
+
onSuccessAttempt?: (response: T, context: WithRetryContext) => Awaitable<void>
|
|
39
|
+
shouldRetry?: (error: unknown, context: WithRetryContext) => Awaitable<boolean>
|
|
40
|
+
shouldRetryOnSuccess?: (result: T, context: WithRetryContext) => Awaitable<boolean>
|
|
41
|
+
signal?: AbortSignal
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function createRetryError(errors: unknown[]) {
|
|
45
|
+
if (errors.length === 1) {
|
|
46
|
+
return errors[0]
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return new AggregateError(errors, 'All retry attempts failed')
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function rethrowNonAbortError(error: unknown) {
|
|
53
|
+
if (!isAbortError(error)) {
|
|
54
|
+
throw error
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export async function waitForNextRetryAttempt(attempts: number, delayOptions: GetRetryDelayOptions, onBeforeWaitForNextAttempt: WithRetryOptions<unknown>['onBeforeWaitForNextAttempt'], signal: AbortSignal | undefined, context: WithRetryContext) {
|
|
59
|
+
const delay = getRetryDelay(attempts, delayOptions)
|
|
60
|
+
|
|
61
|
+
await onBeforeWaitForNextAttempt?.(delay, context)
|
|
62
|
+
await sleep(delay, { signal }).catch(rethrowNonAbortError)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export async function handleRetryFailure<T>(error: unknown, errors: unknown[], retriesLeft: number, shouldRetry: WithRetryOptions<T>['shouldRetry'], onFailedAttempt: WithRetryOptions<T>['onFailedAttempt'], context: WithRetryContext) {
|
|
66
|
+
if (isAbortError(error)) {
|
|
67
|
+
throw error
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
errors.push(error)
|
|
71
|
+
|
|
72
|
+
if (retriesLeft <= 0) {
|
|
73
|
+
throw createRetryError(errors)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (shouldRetry && !(await shouldRetry(error, context))) {
|
|
77
|
+
throw createRetryError(errors)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
await onFailedAttempt?.(error, context)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export async function handleRetrySuccess<T>(result: T, errors: unknown[], retriesLeft: number, shouldRetryOnSuccess: WithRetryOptions<T>['shouldRetryOnSuccess'], onSuccessAttempt: WithRetryOptions<T>['onSuccessAttempt'], context: WithRetryContext): Promise<boolean> {
|
|
84
|
+
if (!shouldRetryOnSuccess || !(await shouldRetryOnSuccess(result, context))) {
|
|
85
|
+
return true
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (retriesLeft <= 0) {
|
|
89
|
+
throw createRetryError(errors)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
await onSuccessAttempt?.(result, context)
|
|
93
|
+
|
|
94
|
+
return false
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export async function withRetry<T>(fn: (signal?: AbortSignal) => Awaitable<T>, { maxAttempts = 3, onBeforeWaitForNextAttempt, onFailedAttempt, onSuccessAttempt, shouldRetry, shouldRetryOnSuccess, signal, ...delayOptions }: WithRetryOptions<T> = {}): Promise<T> {
|
|
98
|
+
if (maxAttempts < 1) {
|
|
99
|
+
throw new RangeError('maxAttempts must be at least 1')
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (signal) {
|
|
103
|
+
signal.throwIfAborted()
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
let attempts = 0
|
|
107
|
+
let result: T
|
|
108
|
+
|
|
109
|
+
const errors: unknown[] = []
|
|
110
|
+
|
|
111
|
+
while (attempts < maxAttempts) {
|
|
112
|
+
const retriesLeft = maxAttempts - ((attempts++) + 1)
|
|
113
|
+
const context = { attempts, retriesLeft, signal }
|
|
114
|
+
|
|
115
|
+
try {
|
|
116
|
+
if (signal) {
|
|
117
|
+
signal.throwIfAborted()
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
result = await abortable(Promise.resolve(fn(signal)), signal)
|
|
121
|
+
} catch (error) {
|
|
122
|
+
await handleRetryFailure(error, errors, retriesLeft, shouldRetry, onFailedAttempt, context)
|
|
123
|
+
await waitForNextRetryAttempt(attempts, delayOptions, onBeforeWaitForNextAttempt, signal, context)
|
|
124
|
+
|
|
125
|
+
continue
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const shouldReturn = await handleRetrySuccess(result, errors, retriesLeft, shouldRetryOnSuccess, onSuccessAttempt, context)
|
|
129
|
+
|
|
130
|
+
if (shouldReturn) {
|
|
131
|
+
return result
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
await waitForNextRetryAttempt(attempts, delayOptions, onBeforeWaitForNextAttempt, signal, context)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
throw createRetryError(errors)
|
|
138
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { combineSignals, createAbortController, type Errorable } from '../errors'
|
|
2
|
+
import { transform } from '../functions'
|
|
3
|
+
import { abortable } from './abortable'
|
|
4
|
+
|
|
5
|
+
export interface TimerOptions {
|
|
6
|
+
error?: Errorable
|
|
7
|
+
signal?: AbortSignal
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const sleep = async (ms: number, { error, signal }: TimerOptions = {}) => (
|
|
11
|
+
abortable(new Promise<void>((resolve) => setTimeout(resolve, ms)), signal, error)
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
export const withTimeout = <T>(promise: Promise<T>, ms: number, { error, signal }: TimerOptions = {}) => (
|
|
15
|
+
transform(createAbortController(ms, error), (controller) => abortable(promise, combineSignals(signal, controller.signal)).finally(() => controller.abort()))
|
|
16
|
+
)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type Awaitable<T> = PromiseLike<T> | T
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Jsonable } from '../core'
|
|
2
|
+
import type { SerializeContext, SerializedValue, SerializeErrorStrategy, SerializeOptions } from './types'
|
|
3
|
+
import { createSymbolKeySerializer } from './symbol-registry'
|
|
4
|
+
|
|
5
|
+
export const DEFAULT_REPLACER = (value: Omit<SerializedValue, '__serialized__'>): Jsonable => ({ ...value, __serialized__: true }) as Jsonable
|
|
6
|
+
|
|
7
|
+
export function createContext(options: SerializeOptions = {}): SerializeContext {
|
|
8
|
+
const { maxDepth = Number.POSITIVE_INFINITY, onUnserializable = false, replacer = DEFAULT_REPLACER } = options
|
|
9
|
+
let onCircularRef: SerializeErrorStrategy = 'placeholder'
|
|
10
|
+
let onMaxDepth: SerializeErrorStrategy = 'placeholder'
|
|
11
|
+
let onPropertyAccess: SerializeErrorStrategy = 'placeholder'
|
|
12
|
+
|
|
13
|
+
if (typeof options.onError === 'string') {
|
|
14
|
+
onCircularRef = options.onError
|
|
15
|
+
onMaxDepth = options.onError
|
|
16
|
+
onPropertyAccess = options.onError
|
|
17
|
+
} else if (typeof options.onError === 'object' && options.onError != null) {
|
|
18
|
+
onCircularRef = options.onError.circularRef ?? 'placeholder'
|
|
19
|
+
onMaxDepth = options.onError.maxDepth ?? 'placeholder'
|
|
20
|
+
onPropertyAccess = options.onError.propertyAccess ?? 'placeholder'
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return { depth: 0, maxDepth, onCircularRef, onMaxDepth, onPropertyAccess, onUnserializable, replacer, symbolRegistry: createSymbolKeySerializer(), visited: new Set() }
|
|
24
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { Jsonable } from '../core'
|
|
2
|
+
import type { SerializeContext, SerializeOptions } from './types'
|
|
3
|
+
import { OMIT_SENTINEL } from './constants'
|
|
4
|
+
import { createContext } from './context'
|
|
5
|
+
import { serializeCompound } from './serializers/compound'
|
|
6
|
+
import { serializeLeafObject } from './serializers/leaf-object'
|
|
7
|
+
import { serializePrimitive } from './serializers/primitive'
|
|
8
|
+
import { handleError } from './utils'
|
|
9
|
+
|
|
10
|
+
export function serialize(value: unknown, options?: SerializeOptions): Jsonable {
|
|
11
|
+
const ctx = createContext(options)
|
|
12
|
+
const serializedValue = serializeValue(value, ctx)
|
|
13
|
+
|
|
14
|
+
if (serializedValue === OMIT_SENTINEL) {
|
|
15
|
+
return null
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return serializedValue
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function serializeValue(value: unknown, ctx: SerializeContext): Jsonable | typeof OMIT_SENTINEL {
|
|
22
|
+
const primitive = serializePrimitive(value, ctx)
|
|
23
|
+
|
|
24
|
+
if (primitive !== undefined) {
|
|
25
|
+
return primitive
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const leaf = serializeLeafObject(value, ctx)
|
|
29
|
+
|
|
30
|
+
if (leaf !== undefined) {
|
|
31
|
+
return leaf
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (ctx.visited.has(value as object)) {
|
|
35
|
+
return handleError(ctx.onCircularRef, 'circular-ref', '[Circular]', ctx)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (ctx.depth >= ctx.maxDepth) {
|
|
39
|
+
return handleError(ctx.onMaxDepth, 'max-depth', '[Max Depth]', ctx)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
ctx.visited.add(value as object)
|
|
43
|
+
ctx.depth++
|
|
44
|
+
|
|
45
|
+
try {
|
|
46
|
+
return serializeCompound(value as object, ctx, serializeValue)
|
|
47
|
+
} finally {
|
|
48
|
+
ctx.depth--
|
|
49
|
+
ctx.visited.delete(value as object)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Jsonable } from '../../core'
|
|
2
|
+
import type { SerializeContext, SerializeValueFn } from '../types'
|
|
3
|
+
import { OMIT_SENTINEL } from '../constants'
|
|
4
|
+
|
|
5
|
+
export function serializeArrayEntry(entry: unknown, ctx: SerializeContext, serializeValue: SerializeValueFn): Jsonable {
|
|
6
|
+
const serializedValue = serializeValue(entry, ctx)
|
|
7
|
+
|
|
8
|
+
return serializedValue === OMIT_SENTINEL ? null : serializedValue
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const serializeArray = (value: unknown[], ctx: SerializeContext, serializeValue: SerializeValueFn): Jsonable[] => (
|
|
12
|
+
value.map((entry) => serializeArrayEntry(entry, ctx, serializeValue))
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
export const serializeIterableEntries = (value: Iterable<unknown>, ctx: SerializeContext, serializeValue: SerializeValueFn): Jsonable[] => (
|
|
16
|
+
Array.from(value, (entry) => serializeArrayEntry(entry, ctx, serializeValue))
|
|
17
|
+
)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Jsonable } from '../../core'
|
|
2
|
+
import type { SerializeContext } from '../types'
|
|
3
|
+
|
|
4
|
+
export function serializeBinary(value: object, ctx: SerializeContext): Jsonable | undefined {
|
|
5
|
+
if (ArrayBuffer.isView(value) && !(value instanceof DataView)) {
|
|
6
|
+
const typed = value as unknown as { [Symbol.toStringTag]: string, byteLength: number, byteOffset: number, length: number }
|
|
7
|
+
|
|
8
|
+
return ctx.replacer({
|
|
9
|
+
metadata: { byteLength: typed.byteLength, byteOffset: typed.byteOffset },
|
|
10
|
+
type: typed[Symbol.toStringTag]?.toLowerCase() ?? 'typedarray',
|
|
11
|
+
value: Array.from({ length: typed.length }, (_, index) => (value as unknown as ArrayLike<number>)[index]!),
|
|
12
|
+
})
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if (value instanceof ArrayBuffer || (typeof SharedArrayBuffer !== 'undefined' && value instanceof SharedArrayBuffer)) {
|
|
16
|
+
return ctx.replacer({ metadata: { byteLength: value.byteLength }, type: 'arraybuffer', value: [...new Uint8Array(value)] })
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (value instanceof DataView) {
|
|
20
|
+
return ctx.replacer({ metadata: { byteLength: value.byteLength, byteOffset: value.byteOffset }, type: 'dataview', value: null })
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return undefined
|
|
24
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Jsonable } from '../../core'
|
|
2
|
+
import type { SerializeContext } from '../types'
|
|
3
|
+
|
|
4
|
+
export function serializeBlob(value: object, ctx: SerializeContext): Jsonable | undefined {
|
|
5
|
+
if (typeof Blob === 'undefined' || !(value instanceof Blob)) {
|
|
6
|
+
return undefined
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const metadata: Record<string, Jsonable> = { size: value.size, type: value.type }
|
|
10
|
+
|
|
11
|
+
if (typeof File !== 'undefined' && value instanceof File) {
|
|
12
|
+
metadata.name = value.name
|
|
13
|
+
|
|
14
|
+
return ctx.replacer({ metadata, type: 'file', value: null })
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
return ctx.replacer({ metadata, type: 'blob', value: null })
|
|
18
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Jsonable } from '../../core'
|
|
2
|
+
import type { SerializeContext, SerializeValueFn } from '../types'
|
|
3
|
+
import { isCollectionLike, isMapLike, isSetLike } from '../../collections'
|
|
4
|
+
import { serializeIterableEntries } from './array'
|
|
5
|
+
|
|
6
|
+
export function serializeCollection(value: object, ctx: SerializeContext, serializeValue: SerializeValueFn): Jsonable | undefined {
|
|
7
|
+
if (isCollectionLike(value)) {
|
|
8
|
+
const name = value.constructor?.name
|
|
9
|
+
const metadata: Record<string, Jsonable> = { size: value.size }
|
|
10
|
+
|
|
11
|
+
if (name) {
|
|
12
|
+
metadata.name = name
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if (isMapLike(value)) {
|
|
16
|
+
return ctx.replacer({ metadata, type: 'map', value: serializeIterableEntries(value.entries(), ctx, serializeValue) })
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (isSetLike(value)) {
|
|
20
|
+
return ctx.replacer({ metadata, type: 'set', value: serializeIterableEntries(value, ctx, serializeValue) })
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return undefined
|
|
25
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { Jsonable } from '../../core'
|
|
2
|
+
import type { SerializeContext, SerializeValueFn } from '../types'
|
|
3
|
+
import { isArray } from '../../arrays'
|
|
4
|
+
import { isIterable } from '../../collections'
|
|
5
|
+
import { typeOf } from '../../core'
|
|
6
|
+
import { isPlainObject } from '../../objects'
|
|
7
|
+
import { type OMIT_SENTINEL, SERIALIZE } from '../constants'
|
|
8
|
+
import { serializeArray, serializeIterableEntries } from './array'
|
|
9
|
+
import { serializeBinary } from './binary'
|
|
10
|
+
import { serializeBlob } from './blob'
|
|
11
|
+
import { serializeCollection } from './collection'
|
|
12
|
+
import { serializeError } from './error'
|
|
13
|
+
import { serializeObject } from './object'
|
|
14
|
+
import { serializeOpaque } from './opaque'
|
|
15
|
+
|
|
16
|
+
export function serializeCompound(value: object, ctx: SerializeContext, serializeValue: SerializeValueFn): Jsonable | typeof OMIT_SENTINEL {
|
|
17
|
+
const customSerialize = (value as Record<PropertyKey, unknown>)[SERIALIZE]
|
|
18
|
+
|
|
19
|
+
if (typeof customSerialize === 'function') {
|
|
20
|
+
return serializeValue((customSerialize as () => unknown)(), ctx)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (isArray(value)) {
|
|
24
|
+
return serializeArray(value, ctx, serializeValue)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const collection = serializeCollection(value, ctx, serializeValue)
|
|
28
|
+
|
|
29
|
+
if (collection !== undefined) {
|
|
30
|
+
return collection
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const binary = serializeBinary(value, ctx)
|
|
34
|
+
|
|
35
|
+
if (binary !== undefined) {
|
|
36
|
+
return binary
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const blob = serializeBlob(value, ctx)
|
|
40
|
+
|
|
41
|
+
if (blob !== undefined) {
|
|
42
|
+
return blob
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (value instanceof Error) {
|
|
46
|
+
return ctx.replacer({ type: 'error', value: serializeError(value, ctx, serializeValue) })
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (isPlainObject(value)) {
|
|
50
|
+
return serializeObject(value, ctx, serializeValue)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const opaque = serializeOpaque(value, ctx)
|
|
54
|
+
|
|
55
|
+
if (opaque !== undefined) {
|
|
56
|
+
return opaque
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (typeof (value as Record<string, unknown>).toJSON === 'function') {
|
|
60
|
+
return serializeValue((value as { toJSON: () => unknown }).toJSON(), ctx)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (isIterable(value)) {
|
|
64
|
+
const name = value.constructor?.name
|
|
65
|
+
const metadata: Record<string, Jsonable> = {}
|
|
66
|
+
|
|
67
|
+
if (name) {
|
|
68
|
+
metadata.name = name
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return ctx.replacer({ metadata, type: 'iterable', value: serializeIterableEntries(value, ctx, serializeValue) })
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (ctx.onUnserializable) {
|
|
75
|
+
return ctx.onUnserializable(value)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return ctx.replacer({ type: typeOf(value), value: `[${value.constructor?.name ?? typeOf(value)}]` })
|
|
79
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { Jsonable } from '../../core'
|
|
2
|
+
import type { ErrorPropertyValue, SerializeContext, SerializeValueFn } from '../types'
|
|
3
|
+
import { OMIT_SENTINEL } from '../constants'
|
|
4
|
+
import { handlePropertyAccessError } from './object'
|
|
5
|
+
|
|
6
|
+
export const isUsableValue = (value: ErrorPropertyValue): value is Jsonable => (
|
|
7
|
+
value !== undefined && value !== OMIT_SENTINEL
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
export function readProperty(error: Error, key: string | symbol, ctx: SerializeContext, serializeValue: SerializeValueFn): ErrorPropertyValue {
|
|
11
|
+
try {
|
|
12
|
+
const value = (error as unknown as Record<string | symbol, unknown>)[key]
|
|
13
|
+
|
|
14
|
+
if (value === undefined) {
|
|
15
|
+
return undefined
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return serializeValue(value, ctx)
|
|
19
|
+
} catch (error_) {
|
|
20
|
+
return handlePropertyAccessError(error_, ctx.onPropertyAccess, key, ctx)
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function serializeErrorCoreFields(error: Error, ctx: SerializeContext, serializeValue: SerializeValueFn): Record<string, Jsonable> {
|
|
25
|
+
const result: Record<string, Jsonable> = { name: error.name }
|
|
26
|
+
const serializedMessage = readProperty(error, 'message', ctx, serializeValue)
|
|
27
|
+
const serializedStack = readProperty(error, 'stack', ctx, serializeValue)
|
|
28
|
+
const serializedCause = readProperty(error, 'cause', ctx, serializeValue)
|
|
29
|
+
|
|
30
|
+
if (typeof serializedMessage === 'string' && serializedMessage.length > 0) {
|
|
31
|
+
result.message = serializedMessage
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (typeof serializedStack === 'string' && serializedStack.length > 0) {
|
|
35
|
+
result.stack = serializedStack
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (isUsableValue(serializedCause)) {
|
|
39
|
+
result.cause = serializedCause
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (error instanceof AggregateError) {
|
|
43
|
+
const serializedErrors = readProperty(error, 'errors', ctx, serializeValue)
|
|
44
|
+
|
|
45
|
+
if (isUsableValue(serializedErrors)) {
|
|
46
|
+
result.errors = serializedErrors
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return result
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function serializeError(error: Error, ctx: SerializeContext, serializeValue: SerializeValueFn): Record<string, Jsonable> {
|
|
54
|
+
const result = serializeErrorCoreFields(error, ctx, serializeValue)
|
|
55
|
+
|
|
56
|
+
for (const key of Object.keys(error)) {
|
|
57
|
+
if (!(key in result)) {
|
|
58
|
+
const serializedValue = readProperty(error, key, ctx, serializeValue)
|
|
59
|
+
|
|
60
|
+
if (isUsableValue(serializedValue)) {
|
|
61
|
+
result[key] = serializedValue
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
for (const sym of Object.getOwnPropertySymbols(error)) {
|
|
67
|
+
const serializedValue = readProperty(error, sym, ctx, serializeValue)
|
|
68
|
+
|
|
69
|
+
if (isUsableValue(serializedValue)) {
|
|
70
|
+
result[ctx.symbolRegistry(sym)] = serializedValue
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return result
|
|
75
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Jsonable } from '../../core'
|
|
2
|
+
import type { SerializeContext } from '../types'
|
|
3
|
+
import { GENERATOR_PATTERNS } from '../constants'
|
|
4
|
+
|
|
5
|
+
export function serializeFunction(fn: (...args: unknown[]) => unknown, ctx: SerializeContext): Jsonable {
|
|
6
|
+
const metadata: Record<string, Jsonable> = {}
|
|
7
|
+
const str = fn.toString()
|
|
8
|
+
|
|
9
|
+
metadata.async = str.startsWith('async')
|
|
10
|
+
metadata.generator = GENERATOR_PATTERNS.test(str)
|
|
11
|
+
|
|
12
|
+
return ctx.replacer({ metadata, type: 'function', value: { length: fn.length, name: fn.name || 'anonymous' } })
|
|
13
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from './array'
|
|
2
|
+
export * from './binary'
|
|
3
|
+
export * from './blob'
|
|
4
|
+
export * from './collection'
|
|
5
|
+
export * from './compound'
|
|
6
|
+
export * from './error'
|
|
7
|
+
export * from './function'
|
|
8
|
+
export * from './leaf-object'
|
|
9
|
+
export * from './number'
|
|
10
|
+
export * from './object'
|
|
11
|
+
export * from './opaque'
|
|
12
|
+
export * from './primitive'
|