@clayroach/effect 3.19.14-source-capture.8 → 3.19.14-source-trace.1
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/SourceLocation/package.json +6 -0
- package/dist/cjs/Effect.js +2 -28
- package/dist/cjs/Effect.js.map +1 -1
- package/dist/cjs/FiberRef.js +12 -1
- package/dist/cjs/FiberRef.js.map +1 -1
- package/dist/cjs/Layer.js +2 -24
- package/dist/cjs/Layer.js.map +1 -1
- package/dist/cjs/RuntimeFlags.js +1 -29
- package/dist/cjs/RuntimeFlags.js.map +1 -1
- package/dist/cjs/SourceLocation.js +60 -0
- package/dist/cjs/SourceLocation.js.map +1 -0
- package/dist/cjs/Tracer.js +1 -15
- package/dist/cjs/Tracer.js.map +1 -1
- package/dist/cjs/Utils.js +1 -1
- package/dist/cjs/Utils.js.map +1 -1
- package/dist/cjs/index.js +3 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/internal/clock.js +1 -1
- package/dist/cjs/internal/clock.js.map +1 -1
- package/dist/cjs/internal/core.js +17 -50
- package/dist/cjs/internal/core.js.map +1 -1
- package/dist/cjs/internal/effect/circular.js +18 -30
- package/dist/cjs/internal/effect/circular.js.map +1 -1
- package/dist/cjs/internal/fiberRuntime.js +16 -65
- package/dist/cjs/internal/fiberRuntime.js.map +1 -1
- package/dist/cjs/internal/layer/circular.js +1 -5
- package/dist/cjs/internal/layer/circular.js.map +1 -1
- package/dist/cjs/internal/layer.js +1 -3
- package/dist/cjs/internal/layer.js.map +1 -1
- package/dist/cjs/internal/logger.js +25 -2
- package/dist/cjs/internal/logger.js.map +1 -1
- package/dist/cjs/internal/runtimeFlags.js +2 -11
- package/dist/cjs/internal/runtimeFlags.js.map +1 -1
- package/dist/cjs/internal/tracer.js +1 -114
- package/dist/cjs/internal/tracer.js.map +1 -1
- package/dist/dts/Config.d.ts +2 -2
- package/dist/dts/Config.d.ts.map +1 -1
- package/dist/dts/Effect.d.ts +8 -29
- package/dist/dts/Effect.d.ts.map +1 -1
- package/dist/dts/FiberRef.d.ts +12 -0
- package/dist/dts/FiberRef.d.ts.map +1 -1
- package/dist/dts/Layer.d.ts +0 -22
- package/dist/dts/Layer.d.ts.map +1 -1
- package/dist/dts/RuntimeFlags.d.ts +0 -28
- package/dist/dts/RuntimeFlags.d.ts.map +1 -1
- package/dist/dts/SourceLocation.d.ts +88 -0
- package/dist/dts/SourceLocation.d.ts.map +1 -0
- package/dist/dts/Tracer.d.ts +0 -15
- package/dist/dts/Tracer.d.ts.map +1 -1
- package/dist/dts/index.d.ts +6 -0
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/dts/internal/core.d.ts.map +1 -1
- package/dist/dts/internal/layer.d.ts.map +1 -1
- package/dist/dts/internal/runtimeFlags.d.ts.map +1 -1
- package/dist/esm/Effect.js +0 -26
- package/dist/esm/Effect.js.map +1 -1
- package/dist/esm/FiberRef.js +11 -0
- package/dist/esm/FiberRef.js.map +1 -1
- package/dist/esm/Layer.js +0 -22
- package/dist/esm/Layer.js.map +1 -1
- package/dist/esm/RuntimeFlags.js +0 -28
- package/dist/esm/RuntimeFlags.js.map +1 -1
- package/dist/esm/SourceLocation.js +51 -0
- package/dist/esm/SourceLocation.js.map +1 -0
- package/dist/esm/Tracer.js +0 -14
- package/dist/esm/Tracer.js.map +1 -1
- package/dist/esm/Utils.js +1 -1
- package/dist/esm/Utils.js.map +1 -1
- package/dist/esm/index.js +6 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internal/clock.js +1 -1
- package/dist/esm/internal/clock.js.map +1 -1
- package/dist/esm/internal/core.js +12 -45
- package/dist/esm/internal/core.js.map +1 -1
- package/dist/esm/internal/effect/circular.js +18 -30
- package/dist/esm/internal/effect/circular.js.map +1 -1
- package/dist/esm/internal/fiberRuntime.js +13 -60
- package/dist/esm/internal/fiberRuntime.js.map +1 -1
- package/dist/esm/internal/layer/circular.js +0 -4
- package/dist/esm/internal/layer/circular.js.map +1 -1
- package/dist/esm/internal/layer.js +0 -2
- package/dist/esm/internal/layer.js.map +1 -1
- package/dist/esm/internal/logger.js +25 -2
- package/dist/esm/internal/logger.js.map +1 -1
- package/dist/esm/internal/runtimeFlags.js +1 -9
- package/dist/esm/internal/runtimeFlags.js.map +1 -1
- package/dist/esm/internal/tracer.js +0 -111
- package/dist/esm/internal/tracer.js.map +1 -1
- package/package.json +12 -1
- package/src/Arbitrary.ts +1101 -0
- package/src/Array.ts +3589 -0
- package/src/BigDecimal.ts +1349 -0
- package/src/BigInt.ts +643 -0
- package/src/Boolean.ts +287 -0
- package/src/Brand.ts +360 -0
- package/src/Cache.ts +281 -0
- package/src/Cause.ts +1555 -0
- package/src/Channel.ts +2355 -0
- package/src/ChildExecutorDecision.ts +146 -0
- package/src/Chunk.ts +1495 -0
- package/src/Clock.ts +111 -0
- package/src/Config.ts +542 -0
- package/src/ConfigError.ts +270 -0
- package/src/ConfigProvider.ts +333 -0
- package/src/ConfigProviderPathPatch.ts +100 -0
- package/src/Console.ts +226 -0
- package/src/Context.ts +585 -0
- package/src/Cron.ts +706 -0
- package/src/Data.ts +596 -0
- package/src/DateTime.ts +1686 -0
- package/src/DefaultServices.ts +34 -0
- package/src/Deferred.ts +301 -0
- package/src/Differ.ts +450 -0
- package/src/Duration.ts +1000 -0
- package/src/Effect.ts +14817 -0
- package/src/Effectable.ts +107 -0
- package/src/Either.ts +1040 -0
- package/src/Encoding.ts +195 -0
- package/src/Equal.ts +98 -0
- package/src/Equivalence.ts +235 -0
- package/src/ExecutionPlan.ts +308 -0
- package/src/ExecutionStrategy.ts +119 -0
- package/src/Exit.ts +467 -0
- package/src/FastCheck.ts +9 -0
- package/src/Fiber.ts +744 -0
- package/src/FiberHandle.ts +540 -0
- package/src/FiberId.ts +195 -0
- package/src/FiberMap.ts +656 -0
- package/src/FiberRef.ts +444 -0
- package/src/FiberRefs.ts +204 -0
- package/src/FiberRefsPatch.ts +105 -0
- package/src/FiberSet.ts +491 -0
- package/src/FiberStatus.ts +108 -0
- package/src/Function.ts +1222 -0
- package/src/GlobalValue.ts +53 -0
- package/src/Graph.ts +3732 -0
- package/src/GroupBy.ts +103 -0
- package/src/HKT.ts +45 -0
- package/src/Hash.ts +195 -0
- package/src/HashMap.ts +519 -0
- package/src/HashRing.ts +317 -0
- package/src/HashSet.ts +2346 -0
- package/src/Inspectable.ts +287 -0
- package/src/Iterable.ts +1119 -0
- package/src/JSONSchema.ts +1044 -0
- package/src/KeyedPool.ts +167 -0
- package/src/Layer.ts +1228 -0
- package/src/LayerMap.ts +436 -0
- package/src/List.ts +977 -0
- package/src/LogLevel.ts +285 -0
- package/src/LogSpan.ts +25 -0
- package/src/Logger.ts +702 -0
- package/src/Mailbox.ts +268 -0
- package/src/ManagedRuntime.ts +180 -0
- package/src/Match.ts +1477 -0
- package/src/MergeDecision.ts +95 -0
- package/src/MergeState.ts +172 -0
- package/src/MergeStrategy.ts +107 -0
- package/src/Metric.ts +780 -0
- package/src/MetricBoundaries.ts +69 -0
- package/src/MetricHook.ts +151 -0
- package/src/MetricKey.ts +224 -0
- package/src/MetricKeyType.ts +262 -0
- package/src/MetricLabel.ts +47 -0
- package/src/MetricPair.ts +71 -0
- package/src/MetricPolling.ts +148 -0
- package/src/MetricRegistry.ts +48 -0
- package/src/MetricState.ts +257 -0
- package/src/Micro.ts +4405 -0
- package/src/ModuleVersion.ts +18 -0
- package/src/MutableHashMap.ts +411 -0
- package/src/MutableHashSet.ts +706 -0
- package/src/MutableList.ts +297 -0
- package/src/MutableQueue.ts +227 -0
- package/src/MutableRef.ts +202 -0
- package/src/NonEmptyIterable.ts +32 -0
- package/src/Number.ts +1071 -0
- package/src/Option.ts +2170 -0
- package/src/Order.ts +373 -0
- package/src/Ordering.ts +111 -0
- package/src/ParseResult.ts +2031 -0
- package/src/PartitionedSemaphore.ts +200 -0
- package/src/Pipeable.ts +566 -0
- package/src/Pool.ts +204 -0
- package/src/Predicate.ts +1405 -0
- package/src/Pretty.ts +205 -0
- package/src/PrimaryKey.ts +23 -0
- package/src/PubSub.ts +182 -0
- package/src/Queue.ts +644 -0
- package/src/Random.ts +204 -0
- package/src/RateLimiter.ts +138 -0
- package/src/RcMap.ts +141 -0
- package/src/RcRef.ts +122 -0
- package/src/Readable.ts +93 -0
- package/src/Record.ts +1274 -0
- package/src/RedBlackTree.ts +421 -0
- package/src/Redacted.ts +144 -0
- package/src/Ref.ts +180 -0
- package/src/RegExp.ts +38 -0
- package/src/Reloadable.ts +127 -0
- package/src/Request.ts +347 -0
- package/src/RequestBlock.ts +118 -0
- package/src/RequestResolver.ts +366 -0
- package/src/Resource.ts +119 -0
- package/src/Runtime.ts +383 -0
- package/src/RuntimeFlags.ts +336 -0
- package/src/RuntimeFlagsPatch.ts +183 -0
- package/src/STM.ts +2045 -0
- package/src/Schedule.ts +2219 -0
- package/src/ScheduleDecision.ts +62 -0
- package/src/ScheduleInterval.ts +151 -0
- package/src/ScheduleIntervals.ts +122 -0
- package/src/Scheduler.ts +353 -0
- package/src/Schema.ts +10914 -0
- package/src/SchemaAST.ts +3043 -0
- package/src/Scope.ts +204 -0
- package/src/ScopedCache.ts +151 -0
- package/src/ScopedRef.ts +117 -0
- package/src/Secret.ts +88 -0
- package/src/SingleProducerAsyncInput.ts +67 -0
- package/src/Sink.ts +1461 -0
- package/src/SortedMap.ts +287 -0
- package/src/SortedSet.ts +390 -0
- package/src/SourceLocation.ts +108 -0
- package/src/Stream.ts +6468 -0
- package/src/StreamEmit.ts +136 -0
- package/src/StreamHaltStrategy.ts +123 -0
- package/src/Streamable.ts +45 -0
- package/src/String.ts +778 -0
- package/src/Struct.ts +243 -0
- package/src/Subscribable.ts +100 -0
- package/src/SubscriptionRef.ts +298 -0
- package/src/Supervisor.ts +240 -0
- package/src/Symbol.ts +29 -0
- package/src/SynchronizedRef.ts +270 -0
- package/src/TArray.ts +495 -0
- package/src/TDeferred.ts +100 -0
- package/src/TMap.ts +515 -0
- package/src/TPriorityQueue.ts +223 -0
- package/src/TPubSub.ts +200 -0
- package/src/TQueue.ts +432 -0
- package/src/TRandom.ts +129 -0
- package/src/TReentrantLock.ts +224 -0
- package/src/TRef.ts +178 -0
- package/src/TSemaphore.ts +129 -0
- package/src/TSet.ts +365 -0
- package/src/TSubscriptionRef.ts +192 -0
- package/src/Take.ts +258 -0
- package/src/TestAnnotation.ts +158 -0
- package/src/TestAnnotationMap.ts +119 -0
- package/src/TestAnnotations.ts +117 -0
- package/src/TestClock.ts +556 -0
- package/src/TestConfig.ts +47 -0
- package/src/TestContext.ts +36 -0
- package/src/TestLive.ts +53 -0
- package/src/TestServices.ts +390 -0
- package/src/TestSized.ts +55 -0
- package/src/Tracer.ts +182 -0
- package/src/Trie.ts +840 -0
- package/src/Tuple.ts +305 -0
- package/src/Types.ts +353 -0
- package/src/Unify.ts +113 -0
- package/src/UpstreamPullRequest.ts +117 -0
- package/src/UpstreamPullStrategy.ts +121 -0
- package/src/Utils.ts +809 -0
- package/src/index.ts +1568 -0
- package/src/internal/array.ts +8 -0
- package/src/internal/blockedRequests.ts +520 -0
- package/src/internal/cache.ts +733 -0
- package/src/internal/cause.ts +1050 -0
- package/src/internal/channel/channelExecutor.ts +1200 -0
- package/src/internal/channel/channelState.ts +134 -0
- package/src/internal/channel/childExecutorDecision.ts +96 -0
- package/src/internal/channel/continuation.ts +200 -0
- package/src/internal/channel/mergeDecision.ts +113 -0
- package/src/internal/channel/mergeState.ts +120 -0
- package/src/internal/channel/mergeStrategy.ts +72 -0
- package/src/internal/channel/singleProducerAsyncInput.ts +259 -0
- package/src/internal/channel/subexecutor.ts +229 -0
- package/src/internal/channel/upstreamPullRequest.ts +84 -0
- package/src/internal/channel/upstreamPullStrategy.ts +87 -0
- package/src/internal/channel.ts +2603 -0
- package/src/internal/clock.ts +95 -0
- package/src/internal/completedRequestMap.ts +9 -0
- package/src/internal/concurrency.ts +54 -0
- package/src/internal/config.ts +716 -0
- package/src/internal/configError.ts +304 -0
- package/src/internal/configProvider/pathPatch.ts +97 -0
- package/src/internal/configProvider.ts +799 -0
- package/src/internal/console.ts +153 -0
- package/src/internal/context.ts +337 -0
- package/src/internal/core-effect.ts +2293 -0
- package/src/internal/core-stream.ts +998 -0
- package/src/internal/core.ts +3189 -0
- package/src/internal/data.ts +36 -0
- package/src/internal/dataSource.ts +327 -0
- package/src/internal/dateTime.ts +1277 -0
- package/src/internal/defaultServices/console.ts +100 -0
- package/src/internal/defaultServices.ts +163 -0
- package/src/internal/deferred.ts +46 -0
- package/src/internal/differ/chunkPatch.ts +211 -0
- package/src/internal/differ/contextPatch.ts +232 -0
- package/src/internal/differ/hashMapPatch.ts +220 -0
- package/src/internal/differ/hashSetPatch.ts +176 -0
- package/src/internal/differ/orPatch.ts +311 -0
- package/src/internal/differ/readonlyArrayPatch.ts +210 -0
- package/src/internal/differ.ts +200 -0
- package/src/internal/doNotation.ts +80 -0
- package/src/internal/effect/circular.ts +895 -0
- package/src/internal/effectable.ts +131 -0
- package/src/internal/either.ts +110 -0
- package/src/internal/encoding/base64.ts +286 -0
- package/src/internal/encoding/base64Url.ts +29 -0
- package/src/internal/encoding/common.ts +51 -0
- package/src/internal/encoding/hex.ts +315 -0
- package/src/internal/errors.ts +7 -0
- package/src/internal/executionPlan.ts +114 -0
- package/src/internal/executionStrategy.ts +74 -0
- package/src/internal/fiber.ts +388 -0
- package/src/internal/fiberId.ts +267 -0
- package/src/internal/fiberMessage.ts +82 -0
- package/src/internal/fiberRefs/patch.ts +144 -0
- package/src/internal/fiberRefs.ts +297 -0
- package/src/internal/fiberRuntime.ts +3842 -0
- package/src/internal/fiberScope.ts +71 -0
- package/src/internal/fiberStatus.ts +119 -0
- package/src/internal/groupBy.ts +530 -0
- package/src/internal/hashMap/array.ts +49 -0
- package/src/internal/hashMap/bitwise.ts +32 -0
- package/src/internal/hashMap/config.ts +14 -0
- package/src/internal/hashMap/keySet.ts +8 -0
- package/src/internal/hashMap/node.ts +391 -0
- package/src/internal/hashMap.ts +586 -0
- package/src/internal/hashSet.ts +323 -0
- package/src/internal/keyedPool.ts +244 -0
- package/src/internal/layer/circular.ts +214 -0
- package/src/internal/layer.ts +1483 -0
- package/src/internal/logSpan.ts +20 -0
- package/src/internal/logger-circular.ts +24 -0
- package/src/internal/logger.ts +522 -0
- package/src/internal/mailbox.ts +561 -0
- package/src/internal/managedRuntime/circular.ts +6 -0
- package/src/internal/managedRuntime.ts +134 -0
- package/src/internal/matcher.ts +652 -0
- package/src/internal/metric/boundaries.ts +75 -0
- package/src/internal/metric/hook.ts +483 -0
- package/src/internal/metric/key.ts +167 -0
- package/src/internal/metric/keyType.ts +238 -0
- package/src/internal/metric/label.ts +41 -0
- package/src/internal/metric/pair.ts +48 -0
- package/src/internal/metric/polling.ts +149 -0
- package/src/internal/metric/registry.ts +187 -0
- package/src/internal/metric/state.ts +290 -0
- package/src/internal/metric.ts +577 -0
- package/src/internal/opCodes/cause.ts +35 -0
- package/src/internal/opCodes/channel.ts +83 -0
- package/src/internal/opCodes/channelChildExecutorDecision.ts +17 -0
- package/src/internal/opCodes/channelMergeDecision.ts +11 -0
- package/src/internal/opCodes/channelMergeState.ts +17 -0
- package/src/internal/opCodes/channelMergeStrategy.ts +11 -0
- package/src/internal/opCodes/channelState.ts +23 -0
- package/src/internal/opCodes/channelUpstreamPullRequest.ts +11 -0
- package/src/internal/opCodes/channelUpstreamPullStrategy.ts +11 -0
- package/src/internal/opCodes/config.ts +65 -0
- package/src/internal/opCodes/configError.ts +35 -0
- package/src/internal/opCodes/continuation.ts +11 -0
- package/src/internal/opCodes/deferred.ts +11 -0
- package/src/internal/opCodes/effect.ts +89 -0
- package/src/internal/opCodes/layer.ts +59 -0
- package/src/internal/opCodes/streamHaltStrategy.ts +23 -0
- package/src/internal/option.ts +80 -0
- package/src/internal/pool.ts +432 -0
- package/src/internal/pubsub.ts +1762 -0
- package/src/internal/query.ts +204 -0
- package/src/internal/queue.ts +766 -0
- package/src/internal/random.ts +161 -0
- package/src/internal/rateLimiter.ts +93 -0
- package/src/internal/rcMap.ts +285 -0
- package/src/internal/rcRef.ts +192 -0
- package/src/internal/redBlackTree/iterator.ts +200 -0
- package/src/internal/redBlackTree/node.ts +68 -0
- package/src/internal/redBlackTree.ts +1245 -0
- package/src/internal/redacted.ts +73 -0
- package/src/internal/ref.ts +171 -0
- package/src/internal/reloadable.ts +140 -0
- package/src/internal/request.ts +177 -0
- package/src/internal/resource.ts +76 -0
- package/src/internal/ringBuffer.ts +68 -0
- package/src/internal/runtime.ts +558 -0
- package/src/internal/runtimeFlags.ts +178 -0
- package/src/internal/runtimeFlagsPatch.ts +103 -0
- package/src/internal/schedule/decision.ts +47 -0
- package/src/internal/schedule/interval.ts +101 -0
- package/src/internal/schedule/intervals.ts +180 -0
- package/src/internal/schedule.ts +2199 -0
- package/src/internal/schema/errors.ts +191 -0
- package/src/internal/schema/schemaId.ts +106 -0
- package/src/internal/schema/util.ts +50 -0
- package/src/internal/scopedCache.ts +644 -0
- package/src/internal/scopedRef.ts +118 -0
- package/src/internal/secret.ts +89 -0
- package/src/internal/singleShotGen.ts +35 -0
- package/src/internal/sink.ts +2120 -0
- package/src/internal/stack.ts +10 -0
- package/src/internal/stm/core.ts +817 -0
- package/src/internal/stm/entry.ts +59 -0
- package/src/internal/stm/journal.ts +123 -0
- package/src/internal/stm/opCodes/stm.ts +71 -0
- package/src/internal/stm/opCodes/stmState.ts +17 -0
- package/src/internal/stm/opCodes/strategy.ts +17 -0
- package/src/internal/stm/opCodes/tExit.ts +29 -0
- package/src/internal/stm/opCodes/tryCommit.ts +11 -0
- package/src/internal/stm/stm.ts +1453 -0
- package/src/internal/stm/stmState.ts +136 -0
- package/src/internal/stm/tArray.ts +550 -0
- package/src/internal/stm/tDeferred.ts +81 -0
- package/src/internal/stm/tExit.ts +190 -0
- package/src/internal/stm/tMap.ts +824 -0
- package/src/internal/stm/tPriorityQueue.ts +267 -0
- package/src/internal/stm/tPubSub.ts +551 -0
- package/src/internal/stm/tQueue.ts +393 -0
- package/src/internal/stm/tRandom.ts +140 -0
- package/src/internal/stm/tReentrantLock.ts +352 -0
- package/src/internal/stm/tRef.ts +195 -0
- package/src/internal/stm/tSemaphore.ts +113 -0
- package/src/internal/stm/tSet.ts +259 -0
- package/src/internal/stm/tSubscriptionRef.ts +286 -0
- package/src/internal/stm/tryCommit.ts +34 -0
- package/src/internal/stm/txnId.ts +14 -0
- package/src/internal/stm/versioned.ts +4 -0
- package/src/internal/stream/debounceState.ts +57 -0
- package/src/internal/stream/emit.ts +123 -0
- package/src/internal/stream/haltStrategy.ts +94 -0
- package/src/internal/stream/handoff.ts +187 -0
- package/src/internal/stream/handoffSignal.ts +59 -0
- package/src/internal/stream/pull.ts +34 -0
- package/src/internal/stream/sinkEndReason.ts +30 -0
- package/src/internal/stream/zipAllState.ts +88 -0
- package/src/internal/stream/zipChunksState.ts +56 -0
- package/src/internal/stream.ts +8801 -0
- package/src/internal/string-utils.ts +107 -0
- package/src/internal/subscriptionRef.ts +138 -0
- package/src/internal/supervisor/patch.ts +190 -0
- package/src/internal/supervisor.ts +303 -0
- package/src/internal/synchronizedRef.ts +114 -0
- package/src/internal/take.ts +199 -0
- package/src/internal/testing/sleep.ts +27 -0
- package/src/internal/testing/suspendedWarningData.ts +85 -0
- package/src/internal/testing/warningData.ts +94 -0
- package/src/internal/tracer.ts +150 -0
- package/src/internal/trie.ts +722 -0
- package/src/internal/version.ts +7 -0
|
@@ -0,0 +1,716 @@
|
|
|
1
|
+
import type * as Brand from "../Brand.js"
|
|
2
|
+
import * as Chunk from "../Chunk.js"
|
|
3
|
+
import type * as Config from "../Config.js"
|
|
4
|
+
import * as ConfigError from "../ConfigError.js"
|
|
5
|
+
import * as Duration from "../Duration.js"
|
|
6
|
+
import * as Either from "../Either.js"
|
|
7
|
+
import type { LazyArg } from "../Function.js"
|
|
8
|
+
import { constTrue, dual, pipe } from "../Function.js"
|
|
9
|
+
import type * as HashMap from "../HashMap.js"
|
|
10
|
+
import * as HashSet from "../HashSet.js"
|
|
11
|
+
import { formatUnknown } from "../Inspectable.js"
|
|
12
|
+
import type * as LogLevel from "../LogLevel.js"
|
|
13
|
+
import * as Option from "../Option.js"
|
|
14
|
+
import { hasProperty, type Predicate, type Refinement } from "../Predicate.js"
|
|
15
|
+
import type * as Redacted from "../Redacted.js"
|
|
16
|
+
import type * as Secret from "../Secret.js"
|
|
17
|
+
import * as configError from "./configError.js"
|
|
18
|
+
import * as core from "./core.js"
|
|
19
|
+
import * as defaultServices from "./defaultServices.js"
|
|
20
|
+
import * as effectable from "./effectable.js"
|
|
21
|
+
import * as OpCodes from "./opCodes/config.js"
|
|
22
|
+
import * as redacted_ from "./redacted.js"
|
|
23
|
+
import * as InternalSecret from "./secret.js"
|
|
24
|
+
|
|
25
|
+
const ConfigSymbolKey = "effect/Config"
|
|
26
|
+
|
|
27
|
+
/** @internal */
|
|
28
|
+
export const ConfigTypeId: Config.ConfigTypeId = Symbol.for(
|
|
29
|
+
ConfigSymbolKey
|
|
30
|
+
) as Config.ConfigTypeId
|
|
31
|
+
|
|
32
|
+
/** @internal */
|
|
33
|
+
export type ConfigPrimitive =
|
|
34
|
+
| Constant
|
|
35
|
+
| Described
|
|
36
|
+
| Fallback
|
|
37
|
+
| Fail
|
|
38
|
+
| Lazy
|
|
39
|
+
| MapOrFail
|
|
40
|
+
| Nested
|
|
41
|
+
| Primitive
|
|
42
|
+
| Sequence
|
|
43
|
+
| Table
|
|
44
|
+
| Zipped
|
|
45
|
+
|
|
46
|
+
const configVariance = {
|
|
47
|
+
/* c8 ignore next */
|
|
48
|
+
_A: (_: never) => _
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const proto = {
|
|
52
|
+
...effectable.CommitPrototype,
|
|
53
|
+
[ConfigTypeId]: configVariance,
|
|
54
|
+
commit(this: Config.Config<unknown>) {
|
|
55
|
+
return defaultServices.config(this)
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** @internal */
|
|
60
|
+
export type Op<Tag extends string, Body = {}> = Config.Config<never> & Body & {
|
|
61
|
+
readonly _tag: Tag
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** @internal */
|
|
65
|
+
export interface Constant extends
|
|
66
|
+
Op<OpCodes.OP_CONSTANT, {
|
|
67
|
+
readonly value: unknown
|
|
68
|
+
parse(text: string): Either.Either<unknown, ConfigError.ConfigError>
|
|
69
|
+
}>
|
|
70
|
+
{}
|
|
71
|
+
|
|
72
|
+
/** @internal */
|
|
73
|
+
export interface Described extends
|
|
74
|
+
Op<OpCodes.OP_DESCRIBED, {
|
|
75
|
+
readonly config: Config.Config<unknown>
|
|
76
|
+
readonly description: string
|
|
77
|
+
}>
|
|
78
|
+
{}
|
|
79
|
+
|
|
80
|
+
/** @internal */
|
|
81
|
+
export interface Fallback extends
|
|
82
|
+
Op<OpCodes.OP_FALLBACK, {
|
|
83
|
+
readonly first: Config.Config<unknown>
|
|
84
|
+
readonly second: Config.Config<unknown>
|
|
85
|
+
readonly condition: Predicate<ConfigError.ConfigError>
|
|
86
|
+
}>
|
|
87
|
+
{}
|
|
88
|
+
|
|
89
|
+
/** @internal */
|
|
90
|
+
export interface Fail extends
|
|
91
|
+
Op<OpCodes.OP_FAIL, {
|
|
92
|
+
readonly message: string
|
|
93
|
+
parse(text: string): Either.Either<unknown, ConfigError.ConfigError>
|
|
94
|
+
}>
|
|
95
|
+
{}
|
|
96
|
+
|
|
97
|
+
/** @internal */
|
|
98
|
+
export interface Lazy extends
|
|
99
|
+
Op<OpCodes.OP_LAZY, {
|
|
100
|
+
config(): Config.Config<unknown>
|
|
101
|
+
}>
|
|
102
|
+
{}
|
|
103
|
+
|
|
104
|
+
/** @internal */
|
|
105
|
+
export interface MapOrFail extends
|
|
106
|
+
Op<OpCodes.OP_MAP_OR_FAIL, {
|
|
107
|
+
readonly original: Config.Config<unknown>
|
|
108
|
+
mapOrFail(value: unknown): Either.Either<unknown, ConfigError.ConfigError>
|
|
109
|
+
}>
|
|
110
|
+
{}
|
|
111
|
+
|
|
112
|
+
/** @internal */
|
|
113
|
+
export interface Nested extends
|
|
114
|
+
Op<OpCodes.OP_NESTED, {
|
|
115
|
+
readonly name: string
|
|
116
|
+
readonly config: Config.Config<unknown>
|
|
117
|
+
}>
|
|
118
|
+
{}
|
|
119
|
+
|
|
120
|
+
/** @internal */
|
|
121
|
+
export interface Primitive extends
|
|
122
|
+
Op<OpCodes.OP_PRIMITIVE, {
|
|
123
|
+
readonly description: string
|
|
124
|
+
parse(text: string): Either.Either<unknown, ConfigError.ConfigError>
|
|
125
|
+
}>
|
|
126
|
+
{}
|
|
127
|
+
|
|
128
|
+
/** @internal */
|
|
129
|
+
export interface Sequence extends
|
|
130
|
+
Op<OpCodes.OP_SEQUENCE, {
|
|
131
|
+
readonly config: Config.Config<unknown>
|
|
132
|
+
}>
|
|
133
|
+
{}
|
|
134
|
+
|
|
135
|
+
/** @internal */
|
|
136
|
+
export interface Table extends
|
|
137
|
+
Op<OpCodes.OP_HASHMAP, {
|
|
138
|
+
readonly op: OpCodes.OP_HASHMAP
|
|
139
|
+
readonly valueConfig: Config.Config<unknown>
|
|
140
|
+
}>
|
|
141
|
+
{}
|
|
142
|
+
|
|
143
|
+
/** @internal */
|
|
144
|
+
export interface Zipped extends
|
|
145
|
+
Op<OpCodes.OP_ZIP_WITH, {
|
|
146
|
+
readonly op: OpCodes.OP_ZIP_WITH
|
|
147
|
+
readonly left: Config.Config<unknown>
|
|
148
|
+
readonly right: Config.Config<unknown>
|
|
149
|
+
zip(a: unknown, b: unknown): unknown
|
|
150
|
+
}>
|
|
151
|
+
{}
|
|
152
|
+
|
|
153
|
+
/** @internal */
|
|
154
|
+
export const boolean = (name?: string): Config.Config<boolean> => {
|
|
155
|
+
const config = primitive(
|
|
156
|
+
"a boolean property",
|
|
157
|
+
(text) => {
|
|
158
|
+
switch (text) {
|
|
159
|
+
case "true":
|
|
160
|
+
case "yes":
|
|
161
|
+
case "on":
|
|
162
|
+
case "1": {
|
|
163
|
+
return Either.right(true)
|
|
164
|
+
}
|
|
165
|
+
case "false":
|
|
166
|
+
case "no":
|
|
167
|
+
case "off":
|
|
168
|
+
case "0": {
|
|
169
|
+
return Either.right(false)
|
|
170
|
+
}
|
|
171
|
+
default: {
|
|
172
|
+
const error = configError.InvalidData(
|
|
173
|
+
[],
|
|
174
|
+
`Expected a boolean value but received ${formatUnknown(text)}`
|
|
175
|
+
)
|
|
176
|
+
return Either.left(error)
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
)
|
|
181
|
+
return name === undefined ? config : nested(config, name)
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/** @internal */
|
|
185
|
+
export const url = (name?: string): Config.Config<URL> => {
|
|
186
|
+
const config = primitive(
|
|
187
|
+
"an URL property",
|
|
188
|
+
(text) =>
|
|
189
|
+
Either.try({
|
|
190
|
+
try: () => new URL(text),
|
|
191
|
+
catch: (_) => configError.InvalidData([], `Expected an URL value but received ${formatUnknown(text)}`)
|
|
192
|
+
})
|
|
193
|
+
)
|
|
194
|
+
return name === undefined ? config : nested(config, name)
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/** @internal */
|
|
198
|
+
export const port = (name?: string): Config.Config<number> => {
|
|
199
|
+
const config = primitive(
|
|
200
|
+
"a network port property",
|
|
201
|
+
(text) => {
|
|
202
|
+
const result = Number(text)
|
|
203
|
+
|
|
204
|
+
if (
|
|
205
|
+
Number.isNaN(result) ||
|
|
206
|
+
result.toString() !== text.toString() ||
|
|
207
|
+
!Number.isInteger(result) ||
|
|
208
|
+
result < 1 ||
|
|
209
|
+
result > 65535
|
|
210
|
+
) {
|
|
211
|
+
return Either.left(
|
|
212
|
+
configError.InvalidData(
|
|
213
|
+
[],
|
|
214
|
+
`Expected a network port value but received ${formatUnknown(text)}`
|
|
215
|
+
)
|
|
216
|
+
)
|
|
217
|
+
}
|
|
218
|
+
return Either.right(result)
|
|
219
|
+
}
|
|
220
|
+
)
|
|
221
|
+
return name === undefined ? config : nested(config, name)
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/** @internal */
|
|
225
|
+
export const array = <A>(config: Config.Config<A>, name?: string): Config.Config<Array<A>> => {
|
|
226
|
+
return pipe(chunk(config, name), map(Chunk.toArray))
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/** @internal */
|
|
230
|
+
export const chunk = <A>(config: Config.Config<A>, name?: string): Config.Config<Chunk.Chunk<A>> => {
|
|
231
|
+
return map(name === undefined ? repeat(config) : nested(repeat(config), name), Chunk.unsafeFromArray)
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/** @internal */
|
|
235
|
+
export const date = (name?: string): Config.Config<Date> => {
|
|
236
|
+
const config = primitive(
|
|
237
|
+
"a date property",
|
|
238
|
+
(text) => {
|
|
239
|
+
const result = Date.parse(text)
|
|
240
|
+
if (Number.isNaN(result)) {
|
|
241
|
+
return Either.left(
|
|
242
|
+
configError.InvalidData(
|
|
243
|
+
[],
|
|
244
|
+
`Expected a Date value but received ${formatUnknown(text)}`
|
|
245
|
+
)
|
|
246
|
+
)
|
|
247
|
+
}
|
|
248
|
+
return Either.right(new Date(result))
|
|
249
|
+
}
|
|
250
|
+
)
|
|
251
|
+
return name === undefined ? config : nested(config, name)
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/** @internal */
|
|
255
|
+
export const fail = (message: string): Config.Config<never> => {
|
|
256
|
+
const fail = Object.create(proto)
|
|
257
|
+
fail._tag = OpCodes.OP_FAIL
|
|
258
|
+
fail.message = message
|
|
259
|
+
fail.parse = () => Either.left(configError.Unsupported([], message))
|
|
260
|
+
return fail
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/** @internal */
|
|
264
|
+
export const number = (name?: string): Config.Config<number> => {
|
|
265
|
+
const config = primitive(
|
|
266
|
+
"a number property",
|
|
267
|
+
(text) => {
|
|
268
|
+
const result = Number(text)
|
|
269
|
+
if (Number.isNaN(result)) {
|
|
270
|
+
return Either.left(
|
|
271
|
+
configError.InvalidData(
|
|
272
|
+
[],
|
|
273
|
+
`Expected a number value but received ${formatUnknown(text)}`
|
|
274
|
+
)
|
|
275
|
+
)
|
|
276
|
+
}
|
|
277
|
+
return Either.right(result)
|
|
278
|
+
}
|
|
279
|
+
)
|
|
280
|
+
return name === undefined ? config : nested(config, name)
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/** @internal */
|
|
284
|
+
export const integer = (name?: string): Config.Config<number> => {
|
|
285
|
+
const config = primitive(
|
|
286
|
+
"an integer property",
|
|
287
|
+
(text) => {
|
|
288
|
+
const result = Number(text)
|
|
289
|
+
if (!Number.isInteger(result)) {
|
|
290
|
+
return Either.left(
|
|
291
|
+
configError.InvalidData(
|
|
292
|
+
[],
|
|
293
|
+
`Expected an integer value but received ${formatUnknown(text)}`
|
|
294
|
+
)
|
|
295
|
+
)
|
|
296
|
+
}
|
|
297
|
+
return Either.right(result)
|
|
298
|
+
}
|
|
299
|
+
)
|
|
300
|
+
return name === undefined ? config : nested(config, name)
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/** @internal */
|
|
304
|
+
export const literal = <Literals extends ReadonlyArray<Config.LiteralValue>>(...literals: Literals) =>
|
|
305
|
+
(
|
|
306
|
+
name?: string
|
|
307
|
+
): Config.Config<Literals[number]> => {
|
|
308
|
+
const valuesString = literals.map(String).join(", ")
|
|
309
|
+
const config = primitive(`one of (${valuesString})`, (text) => {
|
|
310
|
+
const found = literals.find((value) => String(value) === text)
|
|
311
|
+
if (found === undefined) {
|
|
312
|
+
return Either.left(
|
|
313
|
+
configError.InvalidData(
|
|
314
|
+
[],
|
|
315
|
+
`Expected one of (${valuesString}) but received ${formatUnknown(text)}`
|
|
316
|
+
)
|
|
317
|
+
)
|
|
318
|
+
}
|
|
319
|
+
return Either.right(found)
|
|
320
|
+
})
|
|
321
|
+
return name === undefined ? config : nested(config, name)
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/** @internal */
|
|
325
|
+
export const logLevel = (name?: string): Config.Config<LogLevel.LogLevel> => {
|
|
326
|
+
const config = mapOrFail(string(), (value) => {
|
|
327
|
+
const label = value.toUpperCase()
|
|
328
|
+
const level = core.allLogLevels.find((level) => level.label === label)
|
|
329
|
+
return level === undefined
|
|
330
|
+
? Either.left(
|
|
331
|
+
configError.InvalidData([], `Expected a log level but received ${formatUnknown(value)}`)
|
|
332
|
+
)
|
|
333
|
+
: Either.right(level)
|
|
334
|
+
})
|
|
335
|
+
return name === undefined ? config : nested(config, name)
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/** @internal */
|
|
339
|
+
export const duration = (name?: string): Config.Config<Duration.Duration> => {
|
|
340
|
+
const config = mapOrFail(string(), (value) => {
|
|
341
|
+
const duration = Duration.decodeUnknown(value)
|
|
342
|
+
return Either.fromOption(
|
|
343
|
+
duration,
|
|
344
|
+
() => configError.InvalidData([], `Expected a duration but received ${formatUnknown(value)}`)
|
|
345
|
+
)
|
|
346
|
+
})
|
|
347
|
+
return name === undefined ? config : nested(config, name)
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/** @internal */
|
|
351
|
+
export const map = dual<
|
|
352
|
+
<A, B>(f: (a: A) => B) => (self: Config.Config<A>) => Config.Config<B>,
|
|
353
|
+
<A, B>(self: Config.Config<A>, f: (a: A) => B) => Config.Config<B>
|
|
354
|
+
>(2, (self, f) => mapOrFail(self, (a) => Either.right(f(a))))
|
|
355
|
+
|
|
356
|
+
/** @internal */
|
|
357
|
+
export const mapAttempt = dual<
|
|
358
|
+
<A, B>(f: (a: A) => B) => (self: Config.Config<A>) => Config.Config<B>,
|
|
359
|
+
<A, B>(self: Config.Config<A>, f: (a: A) => B) => Config.Config<B>
|
|
360
|
+
>(2, (self, f) =>
|
|
361
|
+
mapOrFail(self, (a) => {
|
|
362
|
+
try {
|
|
363
|
+
return Either.right(f(a))
|
|
364
|
+
} catch (error) {
|
|
365
|
+
return Either.left(
|
|
366
|
+
configError.InvalidData(
|
|
367
|
+
[],
|
|
368
|
+
error instanceof Error ? error.message : `${error}`
|
|
369
|
+
)
|
|
370
|
+
)
|
|
371
|
+
}
|
|
372
|
+
}))
|
|
373
|
+
|
|
374
|
+
/** @internal */
|
|
375
|
+
export const mapOrFail = dual<
|
|
376
|
+
<A, B>(f: (a: A) => Either.Either<B, ConfigError.ConfigError>) => (self: Config.Config<A>) => Config.Config<B>,
|
|
377
|
+
<A, B>(self: Config.Config<A>, f: (a: A) => Either.Either<B, ConfigError.ConfigError>) => Config.Config<B>
|
|
378
|
+
>(2, (self, f) => {
|
|
379
|
+
const mapOrFail = Object.create(proto)
|
|
380
|
+
mapOrFail._tag = OpCodes.OP_MAP_OR_FAIL
|
|
381
|
+
mapOrFail.original = self
|
|
382
|
+
mapOrFail.mapOrFail = f
|
|
383
|
+
return mapOrFail
|
|
384
|
+
})
|
|
385
|
+
|
|
386
|
+
/** @internal */
|
|
387
|
+
export const nested = dual<
|
|
388
|
+
(name: string) => <A>(self: Config.Config<A>) => Config.Config<A>,
|
|
389
|
+
<A>(self: Config.Config<A>, name: string) => Config.Config<A>
|
|
390
|
+
>(2, (self, name) => {
|
|
391
|
+
const nested = Object.create(proto)
|
|
392
|
+
nested._tag = OpCodes.OP_NESTED
|
|
393
|
+
nested.name = name
|
|
394
|
+
nested.config = self
|
|
395
|
+
return nested
|
|
396
|
+
})
|
|
397
|
+
|
|
398
|
+
/** @internal */
|
|
399
|
+
export const orElse = dual<
|
|
400
|
+
<A2>(that: LazyArg<Config.Config<A2>>) => <A>(self: Config.Config<A>) => Config.Config<A | A2>,
|
|
401
|
+
<A, A2>(self: Config.Config<A>, that: LazyArg<Config.Config<A2>>) => Config.Config<A | A2>
|
|
402
|
+
>(2, (self, that) => {
|
|
403
|
+
const fallback = Object.create(proto)
|
|
404
|
+
fallback._tag = OpCodes.OP_FALLBACK
|
|
405
|
+
fallback.first = self
|
|
406
|
+
fallback.second = suspend(that)
|
|
407
|
+
fallback.condition = constTrue
|
|
408
|
+
return fallback
|
|
409
|
+
})
|
|
410
|
+
|
|
411
|
+
/** @internal */
|
|
412
|
+
export const orElseIf = dual<
|
|
413
|
+
<A2>(
|
|
414
|
+
options: {
|
|
415
|
+
readonly if: Predicate<ConfigError.ConfigError>
|
|
416
|
+
readonly orElse: LazyArg<Config.Config<A2>>
|
|
417
|
+
}
|
|
418
|
+
) => <A>(self: Config.Config<A>) => Config.Config<A | A2>,
|
|
419
|
+
<A, A2>(
|
|
420
|
+
self: Config.Config<A>,
|
|
421
|
+
options: {
|
|
422
|
+
readonly if: Predicate<ConfigError.ConfigError>
|
|
423
|
+
readonly orElse: LazyArg<Config.Config<A2>>
|
|
424
|
+
}
|
|
425
|
+
) => Config.Config<A | A2>
|
|
426
|
+
>(2, (self, options) => {
|
|
427
|
+
const fallback = Object.create(proto)
|
|
428
|
+
fallback._tag = OpCodes.OP_FALLBACK
|
|
429
|
+
fallback.first = self
|
|
430
|
+
fallback.second = suspend(options.orElse)
|
|
431
|
+
fallback.condition = options.if
|
|
432
|
+
return fallback
|
|
433
|
+
})
|
|
434
|
+
|
|
435
|
+
/** @internal */
|
|
436
|
+
export const option = <A>(self: Config.Config<A>): Config.Config<Option.Option<A>> => {
|
|
437
|
+
return pipe(
|
|
438
|
+
self,
|
|
439
|
+
map(Option.some),
|
|
440
|
+
orElseIf({ orElse: () => succeed(Option.none()), if: ConfigError.isMissingDataOnly })
|
|
441
|
+
)
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
/** @internal */
|
|
445
|
+
export const primitive = <A>(
|
|
446
|
+
description: string,
|
|
447
|
+
parse: (text: string) => Either.Either<A, ConfigError.ConfigError>
|
|
448
|
+
): Config.Config<A> => {
|
|
449
|
+
const primitive = Object.create(proto)
|
|
450
|
+
primitive._tag = OpCodes.OP_PRIMITIVE
|
|
451
|
+
primitive.description = description
|
|
452
|
+
primitive.parse = parse
|
|
453
|
+
return primitive
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
/** @internal */
|
|
457
|
+
export const repeat = <A>(self: Config.Config<A>): Config.Config<Array<A>> => {
|
|
458
|
+
const repeat = Object.create(proto)
|
|
459
|
+
repeat._tag = OpCodes.OP_SEQUENCE
|
|
460
|
+
repeat.config = self
|
|
461
|
+
return repeat
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
/** @internal */
|
|
465
|
+
export const secret = (name?: string): Config.Config<Secret.Secret> => {
|
|
466
|
+
const config = primitive(
|
|
467
|
+
"a secret property",
|
|
468
|
+
(text) => Either.right(InternalSecret.fromString(text))
|
|
469
|
+
)
|
|
470
|
+
return name === undefined ? config : nested(config, name)
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
/** @internal */
|
|
474
|
+
export const redacted = <A>(
|
|
475
|
+
nameOrConfig?: string | Config.Config<A>
|
|
476
|
+
): Config.Config<Redacted.Redacted<A | string>> => {
|
|
477
|
+
const config: Config.Config<A | string> = isConfig(nameOrConfig) ? nameOrConfig : string(nameOrConfig)
|
|
478
|
+
return map(config, redacted_.make)
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
/** @internal */
|
|
482
|
+
export const branded: {
|
|
483
|
+
<A, B extends Brand.Branded<A, any>>(
|
|
484
|
+
constructor: Brand.Brand.Constructor<B>
|
|
485
|
+
): (config: Config.Config<A>) => Config.Config<B>
|
|
486
|
+
<B extends Brand.Branded<string, any>>(
|
|
487
|
+
name: string | undefined,
|
|
488
|
+
constructor: Brand.Brand.Constructor<B>
|
|
489
|
+
): Config.Config<B>
|
|
490
|
+
<A, B extends Brand.Branded<A, any>>(
|
|
491
|
+
config: Config.Config<A>,
|
|
492
|
+
constructor: Brand.Brand.Constructor<B>
|
|
493
|
+
): Config.Config<B>
|
|
494
|
+
} = dual(2, <A, B extends Brand.Brand.Constructor<any>>(
|
|
495
|
+
nameOrConfig: Config.Config<NoInfer<A>> | string | undefined,
|
|
496
|
+
constructor: B
|
|
497
|
+
) => {
|
|
498
|
+
const config: Config.Config<string | A> = isConfig(nameOrConfig) ? nameOrConfig : string(nameOrConfig)
|
|
499
|
+
|
|
500
|
+
return mapOrFail(config, (a) =>
|
|
501
|
+
constructor.either(a).pipe(
|
|
502
|
+
Either.mapLeft((brandErrors) =>
|
|
503
|
+
configError.InvalidData([], brandErrors.map((brandError) => brandError.message).join("\n"))
|
|
504
|
+
)
|
|
505
|
+
))
|
|
506
|
+
})
|
|
507
|
+
|
|
508
|
+
/** @internal */
|
|
509
|
+
export const hashSet = <A>(config: Config.Config<A>, name?: string): Config.Config<HashSet.HashSet<A>> => {
|
|
510
|
+
const newConfig = map(chunk(config), HashSet.fromIterable)
|
|
511
|
+
return name === undefined ? newConfig : nested(newConfig, name)
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
/** @internal */
|
|
515
|
+
export const string = (name?: string): Config.Config<string> => {
|
|
516
|
+
const config = primitive(
|
|
517
|
+
"a text property",
|
|
518
|
+
Either.right
|
|
519
|
+
)
|
|
520
|
+
return name === undefined ? config : nested(config, name)
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
/** @internal */
|
|
524
|
+
export const nonEmptyString = (name?: string): Config.Config<string> => {
|
|
525
|
+
const config = primitive(
|
|
526
|
+
"a non-empty text property",
|
|
527
|
+
Either.liftPredicate((text) => text.length > 0, () => configError.MissingData([], "Expected a non-empty string"))
|
|
528
|
+
)
|
|
529
|
+
|
|
530
|
+
return name === undefined ? config : nested(config, name)
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
/** @internal */
|
|
534
|
+
export const all = <const Arg extends Iterable<Config.Config<any>> | Record<string, Config.Config<any>>>(
|
|
535
|
+
arg: Arg
|
|
536
|
+
): Config.Config<
|
|
537
|
+
[Arg] extends [ReadonlyArray<Config.Config<any>>] ? {
|
|
538
|
+
-readonly [K in keyof Arg]: [Arg[K]] extends [Config.Config<infer A>] ? A : never
|
|
539
|
+
}
|
|
540
|
+
: [Arg] extends [Iterable<Config.Config<infer A>>] ? Array<A>
|
|
541
|
+
: [Arg] extends [Record<string, Config.Config<any>>] ? {
|
|
542
|
+
-readonly [K in keyof Arg]: [Arg[K]] extends [Config.Config<infer A>] ? A : never
|
|
543
|
+
}
|
|
544
|
+
: never
|
|
545
|
+
> => {
|
|
546
|
+
if (Array.isArray(arg)) {
|
|
547
|
+
return tuple(arg) as any
|
|
548
|
+
} else if (Symbol.iterator in arg) {
|
|
549
|
+
return tuple([...(arg as Iterable<Config.Config<any>>)]) as any
|
|
550
|
+
}
|
|
551
|
+
return struct(arg) as any
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
const struct = <NER extends Record<string, Config.Config<any>>>(r: NER): Config.Config<
|
|
555
|
+
{
|
|
556
|
+
[K in keyof NER]: [NER[K]] extends [{ [ConfigTypeId]: { _A: (_: never) => infer A } }] ? A : never
|
|
557
|
+
}
|
|
558
|
+
> => {
|
|
559
|
+
const entries = Object.entries(r)
|
|
560
|
+
let result = pipe(entries[0][1], map((value) => ({ [entries[0][0]]: value })))
|
|
561
|
+
if (entries.length === 1) {
|
|
562
|
+
return result as any
|
|
563
|
+
}
|
|
564
|
+
const rest = entries.slice(1)
|
|
565
|
+
for (const [key, config] of rest) {
|
|
566
|
+
result = pipe(
|
|
567
|
+
result,
|
|
568
|
+
zipWith(config, (record, value) => ({ ...record, [key]: value }))
|
|
569
|
+
)
|
|
570
|
+
}
|
|
571
|
+
return result as any
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
/** @internal */
|
|
575
|
+
export const succeed = <A>(value: A): Config.Config<A> => {
|
|
576
|
+
const constant = Object.create(proto)
|
|
577
|
+
constant._tag = OpCodes.OP_CONSTANT
|
|
578
|
+
constant.value = value
|
|
579
|
+
constant.parse = () => Either.right(value)
|
|
580
|
+
return constant
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
/** @internal */
|
|
584
|
+
export const suspend = <A>(config: LazyArg<Config.Config<A>>): Config.Config<A> => {
|
|
585
|
+
const lazy = Object.create(proto)
|
|
586
|
+
lazy._tag = OpCodes.OP_LAZY
|
|
587
|
+
lazy.config = config
|
|
588
|
+
return lazy
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
/** @internal */
|
|
592
|
+
export const sync = <A>(value: LazyArg<A>): Config.Config<A> => {
|
|
593
|
+
return suspend(() => succeed(value()))
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
/** @internal */
|
|
597
|
+
export const hashMap = <A>(config: Config.Config<A>, name?: string): Config.Config<HashMap.HashMap<string, A>> => {
|
|
598
|
+
const table = Object.create(proto)
|
|
599
|
+
table._tag = OpCodes.OP_HASHMAP
|
|
600
|
+
table.valueConfig = config
|
|
601
|
+
return name === undefined ? table : nested(table, name)
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
/** @internal */
|
|
605
|
+
export const isConfig = (u: unknown): u is Config.Config<unknown> => hasProperty(u, ConfigTypeId)
|
|
606
|
+
|
|
607
|
+
/** @internal */
|
|
608
|
+
const tuple = <T extends ArrayLike<Config.Config<any>>>(tuple: T): Config.Config<
|
|
609
|
+
{
|
|
610
|
+
[K in keyof T]: [T[K]] extends [Config.Config<infer A>] ? A : never
|
|
611
|
+
}
|
|
612
|
+
> => {
|
|
613
|
+
if (tuple.length === 0) {
|
|
614
|
+
return succeed([]) as any
|
|
615
|
+
}
|
|
616
|
+
if (tuple.length === 1) {
|
|
617
|
+
return map(tuple[0], (x) => [x]) as any
|
|
618
|
+
}
|
|
619
|
+
let result = map(tuple[0], (x) => [x])
|
|
620
|
+
for (let i = 1; i < tuple.length; i++) {
|
|
621
|
+
const config = tuple[i]
|
|
622
|
+
result = pipe(
|
|
623
|
+
result,
|
|
624
|
+
zipWith(config, (tuple, value) => [...tuple, value])
|
|
625
|
+
) as any
|
|
626
|
+
}
|
|
627
|
+
return result as any
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
/**
|
|
631
|
+
* @internal
|
|
632
|
+
*/
|
|
633
|
+
export const unwrap = <A>(wrapped: Config.Config.Wrap<A>): Config.Config<A> => {
|
|
634
|
+
if (isConfig(wrapped)) {
|
|
635
|
+
return wrapped
|
|
636
|
+
}
|
|
637
|
+
return struct(
|
|
638
|
+
Object.fromEntries(
|
|
639
|
+
Object.entries(wrapped).map(([k, a]) => [k, unwrap(a as any)])
|
|
640
|
+
)
|
|
641
|
+
) as any
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
/** @internal */
|
|
645
|
+
export const validate = dual<
|
|
646
|
+
{
|
|
647
|
+
<A, B extends A>(options: {
|
|
648
|
+
readonly message: string
|
|
649
|
+
readonly validation: Refinement<A, B>
|
|
650
|
+
}): (self: Config.Config<A>) => Config.Config<B>
|
|
651
|
+
<A>(options: {
|
|
652
|
+
readonly message: string
|
|
653
|
+
readonly validation: Predicate<A>
|
|
654
|
+
}): (self: Config.Config<A>) => Config.Config<A>
|
|
655
|
+
},
|
|
656
|
+
{
|
|
657
|
+
<A, B extends A>(self: Config.Config<A>, options: {
|
|
658
|
+
readonly message: string
|
|
659
|
+
readonly validation: Refinement<A, B>
|
|
660
|
+
}): Config.Config<B>
|
|
661
|
+
<A>(self: Config.Config<A>, options: {
|
|
662
|
+
readonly message: string
|
|
663
|
+
readonly validation: Predicate<A>
|
|
664
|
+
}): Config.Config<A>
|
|
665
|
+
}
|
|
666
|
+
>(2, <A>(self: Config.Config<A>, { message, validation }: {
|
|
667
|
+
readonly message: string
|
|
668
|
+
readonly validation: Predicate<A>
|
|
669
|
+
}) =>
|
|
670
|
+
mapOrFail(self, (a) => {
|
|
671
|
+
if (validation(a)) {
|
|
672
|
+
return Either.right(a)
|
|
673
|
+
}
|
|
674
|
+
return Either.left(configError.InvalidData([], message))
|
|
675
|
+
}))
|
|
676
|
+
|
|
677
|
+
/** @internal */
|
|
678
|
+
export const withDefault = dual<
|
|
679
|
+
<const A2>(def: A2) => <A>(self: Config.Config<A>) => Config.Config<A | A2>,
|
|
680
|
+
<A, const A2>(self: Config.Config<A>, def: A2) => Config.Config<A | A2>
|
|
681
|
+
>(2, (self, def) =>
|
|
682
|
+
orElseIf(self, {
|
|
683
|
+
orElse: () => succeed(def),
|
|
684
|
+
if: ConfigError.isMissingDataOnly
|
|
685
|
+
}))
|
|
686
|
+
|
|
687
|
+
/** @internal */
|
|
688
|
+
export const withDescription = dual<
|
|
689
|
+
(description: string) => <A>(self: Config.Config<A>) => Config.Config<A>,
|
|
690
|
+
<A>(self: Config.Config<A>, description: string) => Config.Config<A>
|
|
691
|
+
>(2, (self, description) => {
|
|
692
|
+
const described = Object.create(proto)
|
|
693
|
+
described._tag = OpCodes.OP_DESCRIBED
|
|
694
|
+
described.config = self
|
|
695
|
+
described.description = description
|
|
696
|
+
return described
|
|
697
|
+
})
|
|
698
|
+
|
|
699
|
+
/** @internal */
|
|
700
|
+
export const zip = dual<
|
|
701
|
+
<B>(that: Config.Config<B>) => <A>(self: Config.Config<A>) => Config.Config<[A, B]>,
|
|
702
|
+
<A, B>(self: Config.Config<A>, that: Config.Config<B>) => Config.Config<[A, B]>
|
|
703
|
+
>(2, (self, that) => zipWith(self, that, (a, b) => [a, b]))
|
|
704
|
+
|
|
705
|
+
/** @internal */
|
|
706
|
+
export const zipWith = dual<
|
|
707
|
+
<B, A, C>(that: Config.Config<B>, f: (a: A, b: B) => C) => (self: Config.Config<A>) => Config.Config<C>,
|
|
708
|
+
<A, B, C>(self: Config.Config<A>, that: Config.Config<B>, f: (a: A, b: B) => C) => Config.Config<C>
|
|
709
|
+
>(3, (self, that, f) => {
|
|
710
|
+
const zipWith = Object.create(proto)
|
|
711
|
+
zipWith._tag = OpCodes.OP_ZIP_WITH
|
|
712
|
+
zipWith.left = self
|
|
713
|
+
zipWith.right = that
|
|
714
|
+
zipWith.zip = f
|
|
715
|
+
return zipWith
|
|
716
|
+
})
|