@sayoriqwq/effect-harness 0.0.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/HARNESS.md +34 -0
- package/README.md +113 -0
- package/dist/bin/effect-harness.d.ts +2 -0
- package/dist/bin/effect-harness.js +39 -0
- package/dist/bin/effect-harness.js.map +1 -0
- package/dist/src/cli/Main.d.ts +6 -0
- package/dist/src/cli/Main.js +141 -0
- package/dist/src/cli/Main.js.map +1 -0
- package/dist/src/harness/CraftSkills.d.ts +14 -0
- package/dist/src/harness/CraftSkills.js +164 -0
- package/dist/src/harness/CraftSkills.js.map +1 -0
- package/dist/src/harness/Errors.d.ts +24 -0
- package/dist/src/harness/Errors.js +26 -0
- package/dist/src/harness/Errors.js.map +1 -0
- package/dist/src/harness/GuardrailRules.d.ts +6 -0
- package/dist/src/harness/GuardrailRules.js +303 -0
- package/dist/src/harness/GuardrailRules.js.map +1 -0
- package/dist/src/harness/Guardrails.d.ts +10 -0
- package/dist/src/harness/Guardrails.js +69 -0
- package/dist/src/harness/Guardrails.js.map +1 -0
- package/dist/src/harness/Init.d.ts +9 -0
- package/dist/src/harness/Init.js +234 -0
- package/dist/src/harness/Init.js.map +1 -0
- package/dist/src/harness/Model.d.ts +44 -0
- package/dist/src/harness/Model.js +169 -0
- package/dist/src/harness/Model.js.map +1 -0
- package/dist/src/harness/ModuleSources.d.ts +5 -0
- package/dist/src/harness/ModuleSources.js +47 -0
- package/dist/src/harness/ModuleSources.js.map +1 -0
- package/dist/src/harness/PnpmWorkspace.d.ts +2 -0
- package/dist/src/harness/PnpmWorkspace.js +23 -0
- package/dist/src/harness/PnpmWorkspace.js.map +1 -0
- package/dist/src/harness/Publish.d.ts +53 -0
- package/dist/src/harness/Publish.js +282 -0
- package/dist/src/harness/Publish.js.map +1 -0
- package/dist/src/harness/SelfVerify.d.ts +4 -0
- package/dist/src/harness/SelfVerify.js +56 -0
- package/dist/src/harness/SelfVerify.js.map +1 -0
- package/dist/src/harness/SourcePin.d.ts +12 -0
- package/dist/src/harness/SourcePin.js +320 -0
- package/dist/src/harness/SourcePin.js.map +1 -0
- package/dist/src/harness/Status.d.ts +12 -0
- package/dist/src/harness/Status.js +88 -0
- package/dist/src/harness/Status.js.map +1 -0
- package/dist/src/harness/TargetVerify.d.ts +8 -0
- package/dist/src/harness/TargetVerify.js +432 -0
- package/dist/src/harness/TargetVerify.js.map +1 -0
- package/dist/src/harness/TestContract.d.ts +6 -0
- package/dist/src/harness/TestContract.js +45 -0
- package/dist/src/harness/TestContract.js.map +1 -0
- package/dist/src/platform/Json.d.ts +8 -0
- package/dist/src/platform/Json.js +35 -0
- package/dist/src/platform/Json.js.map +1 -0
- package/dist/src/platform/ManagedFiles.d.ts +8 -0
- package/dist/src/platform/ManagedFiles.js +59 -0
- package/dist/src/platform/ManagedFiles.js.map +1 -0
- package/dist/src/platform/Process.d.ts +8 -0
- package/dist/src/platform/Process.js +80 -0
- package/dist/src/platform/Process.js.map +1 -0
- package/guide/default-capabilities.md +38 -0
- package/guide/index.md +49 -0
- package/guide/setup.md +64 -0
- package/harness/default-capabilities.md +32 -0
- package/harness/exposure.md +46 -0
- package/harness/feedback/index.md +60 -0
- package/harness/index.md +22 -0
- package/harness/official-inventory.md +85 -0
- package/harness/runtime/codex/AGENTS.fragment.md +28 -0
- package/harness/runtime/codex/agents/effect-worker.md +26 -0
- package/harness/runtime/codex/skills/effect-code/SKILL.md +72 -0
- package/harness/runtime/codex/skills/effect-code/agents/openai.yaml +4 -0
- package/harness/runtime/codex/skills/effect-feedback/SKILL.md +66 -0
- package/harness/runtime/codex/skills/effect-feedback/agents/openai.yaml +4 -0
- package/harness/source.md +52 -0
- package/harness/target-agent-contract.md +205 -0
- package/package.json +68 -0
- package/repos/craft-skills.manifest.json +34 -0
- package/repos/effect/.agents/skills/grill-me/SKILL.md +43 -0
- package/repos/effect/.agents/skills/jsdocs/SKILL.md +203 -0
- package/repos/effect/.agents/skills/scratchpad/SKILL.md +44 -0
- package/repos/effect/.agents/skills/scratchpad/agents/openai.yaml +7 -0
- package/repos/effect/.agents/skills/scratchpad/scripts/extract-example.mjs +260 -0
- package/repos/effect/.changeset/add-bigdecimal-sumall-multiplyall.md +5 -0
- package/repos/effect/.changeset/add-chunk-schema.md +5 -0
- package/repos/effect/.changeset/add-command-hidden.md +19 -0
- package/repos/effect/.changeset/add-config-nested.md +5 -0
- package/repos/effect/.changeset/add-flag-hidden.md +15 -0
- package/repos/effect/.changeset/add-from-string-schemas.md +5 -0
- package/repos/effect/.changeset/add-headers-remove-many.md +5 -0
- package/repos/effect/.changeset/add-indexeddb-kvs-layer.md +5 -0
- package/repos/effect/.changeset/add-make-msgpack.md +5 -0
- package/repos/effect/.changeset/add-make-option.md +5 -0
- package/repos/effect/.changeset/add-missing-tx-modules.md +11 -0
- package/repos/effect/.changeset/add-newtype-module.md +5 -0
- package/repos/effect/.changeset/add-scalar-show-operation-id.md +5 -0
- package/repos/effect/.changeset/add-schedule-tap.md +5 -0
- package/repos/effect/.changeset/add-schema-annotate-encoded.md +5 -0
- package/repos/effect/.changeset/add-schema-array-ensure.md +5 -0
- package/repos/effect/.changeset/add-schema-bigdecimal.md +5 -0
- package/repos/effect/.changeset/add-schema-datetime.md +5 -0
- package/repos/effect/.changeset/add-schema-option-from-optional-nullor.md +5 -0
- package/repos/effect/.changeset/add-schema-option-from-undefined-nullish.md +5 -0
- package/repos/effect/.changeset/add-schema-string-encoding.md +5 -0
- package/repos/effect/.changeset/add-sql-pglite.md +5 -0
- package/repos/effect/.changeset/add-standard-jsdoc-rule.md +5 -0
- package/repos/effect/.changeset/add-stream-broadcastn.md +5 -0
- package/repos/effect/.changeset/add-unstable-encoding-export.md +5 -0
- package/repos/effect/.changeset/afraid-cobras-like.md +5 -0
- package/repos/effect/.changeset/ai-openai-config-field-leak.md +6 -0
- package/repos/effect/.changeset/ai-openai-file-nullable-fields.md +5 -0
- package/repos/effect/.changeset/anthropic-4-6-structured-output.md +5 -0
- package/repos/effect/.changeset/asyncresult-exhaustive.md +5 -0
- package/repos/effect/.changeset/atom-stream-error-type.md +5 -0
- package/repos/effect/.changeset/beige-paths-sort.md +5 -0
- package/repos/effect/.changeset/better-apples-nail.md +5 -0
- package/repos/effect/.changeset/better-rocks-arrive.md +5 -0
- package/repos/effect/.changeset/big-pans-look.md +5 -0
- package/repos/effect/.changeset/blue-dingos-greet.md +5 -0
- package/repos/effect/.changeset/blue-ligers-cheat.md +5 -0
- package/repos/effect/.changeset/blue-onions-smile.md +5 -0
- package/repos/effect/.changeset/blue-ravens-type.md +5 -0
- package/repos/effect/.changeset/blue-trams-kiss.md +7 -0
- package/repos/effect/.changeset/bold-chairs-yawn.md +5 -0
- package/repos/effect/.changeset/bold-planets-shout.md +30 -0
- package/repos/effect/.changeset/breezy-meals-see.md +5 -0
- package/repos/effect/.changeset/bright-bugs-bow.md +5 -0
- package/repos/effect/.changeset/bright-canyons-clean.md +5 -0
- package/repos/effect/.changeset/bright-dogs-fail.md +5 -0
- package/repos/effect/.changeset/bright-flags-stand.md +5 -0
- package/repos/effect/.changeset/bright-laws-teach.md +5 -0
- package/repos/effect/.changeset/bright-lemons-dance.md +5 -0
- package/repos/effect/.changeset/bright-planes-smash.md +5 -0
- package/repos/effect/.changeset/bright-rats-attend.md +5 -0
- package/repos/effect/.changeset/bright-toes-rush.md +5 -0
- package/repos/effect/.changeset/bumpy-boxes-teach.md +5 -0
- package/repos/effect/.changeset/busy-lions-sneeze.md +5 -0
- package/repos/effect/.changeset/busy-maps-attend.md +7 -0
- package/repos/effect/.changeset/calm-buckets-own.md +5 -0
- package/repos/effect/.changeset/calm-carrots-march.md +7 -0
- package/repos/effect/.changeset/calm-cars-rest.md +5 -0
- package/repos/effect/.changeset/calm-panthers-nail.md +5 -0
- package/repos/effect/.changeset/calm-seas-smile.md +5 -0
- package/repos/effect/.changeset/calm-squids-hug.md +5 -0
- package/repos/effect/.changeset/chatty-poets-type.md +5 -0
- package/repos/effect/.changeset/chilled-mice-wash.md +5 -0
- package/repos/effect/.changeset/chilly-pumas-rule.md +5 -0
- package/repos/effect/.changeset/chubby-buckets-feel.md +5 -0
- package/repos/effect/.changeset/chubby-parents-flow.md +5 -0
- package/repos/effect/.changeset/chubby-planets-fall.md +5 -0
- package/repos/effect/.changeset/clean-balloons-tan.md +5 -0
- package/repos/effect/.changeset/clean-bulldogs-care.md +5 -0
- package/repos/effect/.changeset/clean-dryers-sneeze.md +5 -0
- package/repos/effect/.changeset/clean-geese-work.md +5 -0
- package/repos/effect/.changeset/clean-goats-wave.md +5 -0
- package/repos/effect/.changeset/clean-needles-shake.md +23 -0
- package/repos/effect/.changeset/clean-tires-guess.md +5 -0
- package/repos/effect/.changeset/clear-spies-boil.md +5 -0
- package/repos/effect/.changeset/cli-help-choices.md +5 -0
- package/repos/effect/.changeset/cold-knives-lie.md +35 -0
- package/repos/effect/.changeset/cold-rooms-show.md +5 -0
- package/repos/effect/.changeset/cold-sloths-wave.md +5 -0
- package/repos/effect/.changeset/compact-json-schema-enum.md +25 -0
- package/repos/effect/.changeset/config-withdefault-eager.md +7 -0
- package/repos/effect/.changeset/config.json +24 -0
- package/repos/effect/.changeset/consolidate-encoding.md +5 -0
- package/repos/effect/.changeset/consolidate-sql-error.md +16 -0
- package/repos/effect/.changeset/crisp-seas-warn.md +5 -0
- package/repos/effect/.changeset/cuddly-rooms-bet.md +5 -0
- package/repos/effect/.changeset/curly-poems-talk.md +5 -0
- package/repos/effect/.changeset/curly-spies-relax.md +5 -0
- package/repos/effect/.changeset/curvy-apples-float.md +5 -0
- package/repos/effect/.changeset/custom-http-security-openapi-generator.md +5 -0
- package/repos/effect/.changeset/cute-heads-thank.md +5 -0
- package/repos/effect/.changeset/cyan-loops-grow.md +5 -0
- package/repos/effect/.changeset/cyan-radios-switch.md +5 -0
- package/repos/effect/.changeset/deep-rivers-spend.md +5 -0
- package/repos/effect/.changeset/dirty-lamps-trade.md +5 -0
- package/repos/effect/.changeset/dirty-laws-wear.md +5 -0
- package/repos/effect/.changeset/duration-temporal-object-input.md +7 -0
- package/repos/effect/.changeset/eager-coats-cheat.md +5 -0
- package/repos/effect/.changeset/early-birds-dream.md +5 -0
- package/repos/effect/.changeset/early-donuts-argue.md +5 -0
- package/repos/effect/.changeset/early-peaches-check.md +6 -0
- package/repos/effect/.changeset/eff-691-default-logger-ordering.md +5 -0
- package/repos/effect/.changeset/eff-693-rpcgroup-handler-deps.md +5 -0
- package/repos/effect/.changeset/eff-694-cli-completions-module.md +5 -0
- package/repos/effect/.changeset/eff-695-layer-mock-dual-api.md +5 -0
- package/repos/effect/.changeset/eff-697-rpcserialization-json-array-decode.md +5 -0
- package/repos/effect/.changeset/eff-698-rpcserialization-unreachable-branch.md +5 -0
- package/repos/effect/.changeset/eff-700-httpapi-middleware-errors.md +12 -0
- package/repos/effect/.changeset/eff-701-httpapierror-respondable.md +5 -0
- package/repos/effect/.changeset/eff-704-stream-merge-predicate.md +5 -0
- package/repos/effect/.changeset/eff-705-layer-tap-apis.md +5 -0
- package/repos/effect/.changeset/eff-706-servicemap-mutate.md +6 -0
- package/repos/effect/.changeset/eff-716-response-id-tracker-map.md +5 -0
- package/repos/effect/.changeset/eff-717-openai-socket-cancel.md +5 -0
- package/repos/effect/.changeset/eff-718-embedding-model-surface.md +13 -0
- package/repos/effect/.changeset/eff-725-fix-catch-jsdoc.md +5 -0
- package/repos/effect/.changeset/eff-726-model-dimensions.md +7 -0
- package/repos/effect/.changeset/eff-727-cli-help-alignment.md +5 -0
- package/repos/effect/.changeset/eff-730-language-model-incremental-fallback.md +5 -0
- package/repos/effect/.changeset/eff-736-cached-with-ttl.md +5 -0
- package/repos/effect/.changeset/eff-738-cron-prev.md +5 -0
- package/repos/effect/.changeset/eff-739-openai-function-call-done.md +5 -0
- package/repos/effect/.changeset/eff-740-missing-summary-parts.md +5 -0
- package/repos/effect/.changeset/eff-742-http-client-request-web.md +5 -0
- package/repos/effect/.changeset/eff-744-sqlite-migrator-lock.md +5 -0
- package/repos/effect/.changeset/eff-746-fixed-iteration-catchup.md +5 -0
- package/repos/effect/.changeset/eff-747-unify-effect.md +5 -0
- package/repos/effect/.changeset/eff-754-url-builder-any.md +6 -0
- package/repos/effect/.changeset/eff-755-references-core.md +5 -0
- package/repos/effect/.changeset/eff-769-select-text-highlight.md +5 -0
- package/repos/effect/.changeset/eff-774-mutable-list-append-all-empty-array.md +5 -0
- package/repos/effect/.changeset/eff-777-schema-make-effect.md +5 -0
- package/repos/effect/.changeset/eff-778-http-middleware-path-logger.md +5 -0
- package/repos/effect/.changeset/eff-779-keyvaluestore-layer-sql.md +5 -0
- package/repos/effect/.changeset/eff-780-layer-unify.md +5 -0
- package/repos/effect/.changeset/eff-781-fix-stream-toqueue-types.md +5 -0
- package/repos/effect/.changeset/eff-782-httpapi-status-literals.md +5 -0
- package/repos/effect/.changeset/eff-783-atom-http-api-errors.md +5 -0
- package/repos/effect/.changeset/eff-819-cluster-workflow-shard-groups.md +5 -0
- package/repos/effect/.changeset/eight-turkeys-own.md +7 -0
- package/repos/effect/.changeset/eighty-lies-deny.md +5 -0
- package/repos/effect/.changeset/eighty-poets-draw.md +9 -0
- package/repos/effect/.changeset/eighty-swans-scream.md +5 -0
- package/repos/effect/.changeset/eighty-teeth-sniff.md +5 -0
- package/repos/effect/.changeset/eleven-apes-share.md +5 -0
- package/repos/effect/.changeset/eleven-numbers-bake.md +5 -0
- package/repos/effect/.changeset/empty-gifts-beg.md +5 -0
- package/repos/effect/.changeset/empty-http-rpc-client.md +5 -0
- package/repos/effect/.changeset/eventlog-unencrypted.md +5 -0
- package/repos/effect/.changeset/expand-schema-filter-output.md +24 -0
- package/repos/effect/.changeset/export-schema-encode-keys-interface.md +7 -0
- package/repos/effect/.changeset/extract-semaphore-latch.md +10 -0
- package/repos/effect/.changeset/fair-bees-relax.md +5 -0
- package/repos/effect/.changeset/fair-buttons-share.md +7 -0
- package/repos/effect/.changeset/fair-cooks-stop.md +5 -0
- package/repos/effect/.changeset/fair-cups-train.md +5 -0
- package/repos/effect/.changeset/fair-dryers-speak.md +5 -0
- package/repos/effect/.changeset/fair-forks-shake.md +5 -0
- package/repos/effect/.changeset/fair-pandas-prove.md +5 -0
- package/repos/effect/.changeset/fair-pants-float.md +5 -0
- package/repos/effect/.changeset/fair-poems-visit.md +5 -0
- package/repos/effect/.changeset/famous-wolves-lead.md +5 -0
- package/repos/effect/.changeset/fancy-glasses-grow.md +5 -0
- package/repos/effect/.changeset/fast-times-camp.md +5 -0
- package/repos/effect/.changeset/few-birds-matter.md +5 -0
- package/repos/effect/.changeset/few-cougars-dig.md +5 -0
- package/repos/effect/.changeset/few-foxes-grin.md +5 -0
- package/repos/effect/.changeset/few-mirrors-pull.md +14 -0
- package/repos/effect/.changeset/few-socks-poke.md +5 -0
- package/repos/effect/.changeset/fiber-runtime-start-metrics.md +5 -0
- package/repos/effect/.changeset/fiery-jokes-care.md +5 -0
- package/repos/effect/.changeset/fiery-mammals-call.md +5 -0
- package/repos/effect/.changeset/fine-walls-decide.md +5 -0
- package/repos/effect/.changeset/first-success-of.md +5 -0
- package/repos/effect/.changeset/five-parents-relax.md +5 -0
- package/repos/effect/.changeset/five-worms-rhyme.md +5 -0
- package/repos/effect/.changeset/fix-1332.md +5 -0
- package/repos/effect/.changeset/fix-1917.md +11 -0
- package/repos/effect/.changeset/fix-1927.md +5 -0
- package/repos/effect/.changeset/fix-1940.md +7 -0
- package/repos/effect/.changeset/fix-1947.md +7 -0
- package/repos/effect/.changeset/fix-2002.md +5 -0
- package/repos/effect/.changeset/fix-2012.md +5 -0
- package/repos/effect/.changeset/fix-2015.md +5 -0
- package/repos/effect/.changeset/fix-2260.md +5 -0
- package/repos/effect/.changeset/fix-2268.md +5 -0
- package/repos/effect/.changeset/fix-2271.md +5 -0
- package/repos/effect/.changeset/fix-2384.md +7 -0
- package/repos/effect/.changeset/fix-ai-empty-params-structured-output.md +5 -0
- package/repos/effect/.changeset/fix-ai-text-toolkit-typing.md +5 -0
- package/repos/effect/.changeset/fix-catch-orelse-error-erasure.md +5 -0
- package/repos/effect/.changeset/fix-class-constructor-defaults.md +5 -0
- package/repos/effect/.changeset/fix-cli-mixed-global-flag-context.md +7 -0
- package/repos/effect/.changeset/fix-config-withDefault.md +5 -0
- package/repos/effect/.changeset/fix-config-withdefault-filter.md +7 -0
- package/repos/effect/.changeset/fix-datetime-gmt.md +5 -0
- package/repos/effect/.changeset/fix-devtools-flush-on-teardown.md +10 -0
- package/repos/effect/.changeset/fix-duration-symmetric-rounding.md +5 -0
- package/repos/effect/.changeset/fix-entity-manager-defect-replay.md +5 -0
- package/repos/effect/.changeset/fix-entity-proxy-rpc-handler-context.md +5 -0
- package/repos/effect/.changeset/fix-entity-proxy-server-path-params.md +5 -0
- package/repos/effect/.changeset/fix-from-readable-stream-cancel-defect.md +5 -0
- package/repos/effect/.changeset/fix-graph-undirected-traversal.md +5 -0
- package/repos/effect/.changeset/fix-has-interrupts-only-empty.md +5 -0
- package/repos/effect/.changeset/fix-hashmap-bit31-ordering.md +5 -0
- package/repos/effect/.changeset/fix-headers-proto-enumerability.md +5 -0
- package/repos/effect/.changeset/fix-http-incoming-message-parse-options.md +5 -0
- package/repos/effect/.changeset/fix-httpapi-endpoint-error-inference.md +5 -0
- package/repos/effect/.changeset/fix-httpapi-schema-types.md +5 -0
- package/repos/effect/.changeset/fix-httpapi-security-middleware-cache.md +5 -0
- package/repos/effect/.changeset/fix-is-json-dag.md +7 -0
- package/repos/effect/.changeset/fix-json-schema-anyof-oneof-siblings.md +5 -0
- package/repos/effect/.changeset/fix-json-schema-import-json.md +5 -0
- package/repos/effect/.changeset/fix-keepalive-blocked-timers.md +5 -0
- package/repos/effect/.changeset/fix-mcp-param-name-resolution.md +5 -0
- package/repos/effect/.changeset/fix-mermaid-escape-special-chars.md +5 -0
- package/repos/effect/.changeset/fix-mutable-list-filter-length.md +5 -0
- package/repos/effect/.changeset/fix-object-keyword-json-schema.md +5 -0
- package/repos/effect/.changeset/fix-openai-mcp-tool-names.md +5 -0
- package/repos/effect/.changeset/fix-openapi-generator-form-urlencoded.md +5 -0
- package/repos/effect/.changeset/fix-openapi-generator-swagger2openapi.md +5 -0
- package/repos/effect/.changeset/fix-openapi-preserve-multiple-response-content-types.md +5 -0
- package/repos/effect/.changeset/fix-openrouter-sparse-array.md +5 -0
- package/repos/effect/.changeset/fix-otel-logger-clock-skew.md +7 -0
- package/repos/effect/.changeset/fix-otel-logger-severity-number.md +20 -0
- package/repos/effect/.changeset/fix-queue-collect-duplication.md +5 -0
- package/repos/effect/.changeset/fix-random-string-seeds.md +5 -0
- package/repos/effect/.changeset/fix-ratelimiter-tokenbucket-redis-ttl.md +5 -0
- package/repos/effect/.changeset/fix-remainder-scientific-notation.md +5 -0
- package/repos/effect/.changeset/fix-request-resolver-pending-batches-leak.md +5 -0
- package/repos/effect/.changeset/fix-retry-transient-autocomplete.md +5 -0
- package/repos/effect/.changeset/fix-rpc-http-requestids-finalizer.md +5 -0
- package/repos/effect/.changeset/fix-rpc-json-id-edges.md +5 -0
- package/repos/effect/.changeset/fix-schedule-fixed-double-exec.md +9 -0
- package/repos/effect/.changeset/fix-schedule-reduce-sync-state.md +5 -0
- package/repos/effect/.changeset/fix-schema-arbitrary-exclusive-bounds.md +5 -0
- package/repos/effect/.changeset/fix-schema-defect-message.md +5 -0
- package/repos/effect/.changeset/fix-schema-encode-keys-property-keys.md +5 -0
- package/repos/effect/.changeset/fix-schema-encodekeys-class.md +5 -0
- package/repos/effect/.changeset/fix-schema-encodekeys-struct.md +5 -0
- package/repos/effect/.changeset/fix-schema-identifier-expected-message.md +5 -0
- package/repos/effect/.changeset/fix-schema-is-uuid.md +5 -0
- package/repos/effect/.changeset/fix-schema-option-non-schema-failures.md +17 -0
- package/repos/effect/.changeset/fix-schema-parser-checks.md +9 -0
- package/repos/effect/.changeset/fix-searchparam-initial-decode.md +5 -0
- package/repos/effect/.changeset/fix-serializable-wire-transfer.md +7 -0
- package/repos/effect/.changeset/fix-stream-grouped-within-flush.md +5 -0
- package/repos/effect/.changeset/fix-stream-run-for-each-while.md +5 -0
- package/repos/effect/.changeset/fix-stream-scan-effect.md +5 -0
- package/repos/effect/.changeset/fix-stream-scoped-scope.md +5 -0
- package/repos/effect/.changeset/fix-strip-approval-artifacts-multi-round.md +13 -0
- package/repos/effect/.changeset/fix-struct-utility-types-simplify.md +5 -0
- package/repos/effect/.changeset/fix-structwithrest-index-signatures.md +6 -0
- package/repos/effect/.changeset/fix-tagged-union-class-sentinels.md +5 -0
- package/repos/effect/.changeset/fix-tagged-union-match-unify.md +6 -0
- package/repos/effect/.changeset/fix-to-tagged-union-isanyof-custom-tags.md +10 -0
- package/repos/effect/.changeset/fix-tuple-with-rest-post-rest-index-drift.md +5 -0
- package/repos/effect/.changeset/fix-tuple-with-rest-post-rest-validation.md +5 -0
- package/repos/effect/.changeset/fix-types-voidifempty.md +5 -0
- package/repos/effect/.changeset/fix-void-response-encoding.md +5 -0
- package/repos/effect/.changeset/fix-workflow-proxy-rpc-handler-context.md +5 -0
- package/repos/effect/.changeset/flat-chicken-remain.md +5 -0
- package/repos/effect/.changeset/floppy-cows-spend.md +5 -0
- package/repos/effect/.changeset/floppy-items-admire.md +5 -0
- package/repos/effect/.changeset/floppy-pigs-kiss.md +5 -0
- package/repos/effect/.changeset/fluffy-meals-matter.md +5 -0
- package/repos/effect/.changeset/fluffy-pumas-push.md +5 -0
- package/repos/effect/.changeset/forked-memo-maps.md +6 -0
- package/repos/effect/.changeset/forty-hounds-cheer.md +5 -0
- package/repos/effect/.changeset/forty-otters-cry.md +5 -0
- package/repos/effect/.changeset/forty-rings-film.md +7 -0
- package/repos/effect/.changeset/forty-signs-stay.md +5 -0
- package/repos/effect/.changeset/forty-swans-divide.md +5 -0
- package/repos/effect/.changeset/forty-trees-pay.md +5 -0
- package/repos/effect/.changeset/four-papayas-bow.md +5 -0
- package/repos/effect/.changeset/four-points-repeat.md +5 -0
- package/repos/effect/.changeset/fresh-cats-smash.md +5 -0
- package/repos/effect/.changeset/fresh-emus-cheat.md +5 -0
- package/repos/effect/.changeset/fresh-monkeys-smoke.md +9 -0
- package/repos/effect/.changeset/fruity-houses-learn.md +6 -0
- package/repos/effect/.changeset/full-adults-double.md +5 -0
- package/repos/effect/.changeset/funny-crabs-hang.md +6 -0
- package/repos/effect/.changeset/funny-forks-move.md +5 -0
- package/repos/effect/.changeset/fuzzy-camels-hunt.md +5 -0
- package/repos/effect/.changeset/fuzzy-dodos-help.md +5 -0
- package/repos/effect/.changeset/fuzzy-lions-perform.md +5 -0
- package/repos/effect/.changeset/fuzzy-planets-sneeze.md +5 -0
- package/repos/effect/.changeset/gold-meteors-move.md +5 -0
- package/repos/effect/.changeset/gold-readers-hug.md +5 -0
- package/repos/effect/.changeset/gold-rings-start.md +5 -0
- package/repos/effect/.changeset/good-tools-work.md +7 -0
- package/repos/effect/.changeset/graph-algorithm-fixes.md +5 -0
- package/repos/effect/.changeset/great-trains-mate.md +5 -0
- package/repos/effect/.changeset/great-trams-report.md +5 -0
- package/repos/effect/.changeset/green-beds-unref.md +7 -0
- package/repos/effect/.changeset/green-chips-wash.md +5 -0
- package/repos/effect/.changeset/green-moons-smile.md +5 -0
- package/repos/effect/.changeset/green-pugs-play.md +5 -0
- package/repos/effect/.changeset/green-rings-prove.md +5 -0
- package/repos/effect/.changeset/happy-mirrors-dream.md +5 -0
- package/repos/effect/.changeset/heavy-loops-cut.md +5 -0
- package/repos/effect/.changeset/heavy-trams-fix.md +5 -0
- package/repos/effect/.changeset/hip-socks-travel.md +5 -0
- package/repos/effect/.changeset/honest-pens-thank.md +5 -0
- package/repos/effect/.changeset/honest-rivers-notice.md +5 -0
- package/repos/effect/.changeset/hot-taxis-fry.md +5 -0
- package/repos/effect/.changeset/httpapi-endpoint-relax-constraints.md +5 -0
- package/repos/effect/.changeset/httpapi-schema-service-types.md +6 -0
- package/repos/effect/.changeset/huge-moons-rhyme.md +5 -0
- package/repos/effect/.changeset/humble-pigs-dig.md +5 -0
- package/repos/effect/.changeset/icy-flies-cross.md +5 -0
- package/repos/effect/.changeset/itchy-radios-poke.md +5 -0
- package/repos/effect/.changeset/itchy-results-bet.md +5 -0
- package/repos/effect/.changeset/itchy-shrimps-deny.md +5 -0
- package/repos/effect/.changeset/itchy-toes-promise.md +5 -0
- package/repos/effect/.changeset/k8s-last-transition-null.md +5 -0
- package/repos/effect/.changeset/khaki-cats-learn.md +5 -0
- package/repos/effect/.changeset/khaki-melons-appear.md +5 -0
- package/repos/effect/.changeset/kind-hounds-float.md +5 -0
- package/repos/effect/.changeset/kind-windows-fall.md +5 -0
- package/repos/effect/.changeset/late-hotels-rule.md +5 -0
- package/repos/effect/.changeset/late-lamps-care.md +5 -0
- package/repos/effect/.changeset/late-rivers-applaud.md +5 -0
- package/repos/effect/.changeset/layer-map-dynamic-idle-ttl.md +5 -0
- package/repos/effect/.changeset/lazy-queens-rush.md +5 -0
- package/repos/effect/.changeset/lazy-recursive-forward-refs.md +5 -0
- package/repos/effect/.changeset/lazy-timers-exist.md +5 -0
- package/repos/effect/.changeset/legal-pants-drop.md +5 -0
- package/repos/effect/.changeset/lemon-taxis-sin.md +5 -0
- package/repos/effect/.changeset/light-kids-sneeze.md +5 -0
- package/repos/effect/.changeset/little-dryers-allow.md +7 -0
- package/repos/effect/.changeset/long-cameras-think.md +5 -0
- package/repos/effect/.changeset/lovely-cobras-change.md +5 -0
- package/repos/effect/.changeset/lovely-frogs-rescue.md +5 -0
- package/repos/effect/.changeset/lucky-buttons-jump.md +5 -0
- package/repos/effect/.changeset/lucky-phones-listen.md +5 -0
- package/repos/effect/.changeset/lucky-worms-type.md +5 -0
- package/repos/effect/.changeset/mean-dingos-share.md +5 -0
- package/repos/effect/.changeset/mean-trains-smash.md +5 -0
- package/repos/effect/.changeset/metal-parts-yell.md +5 -0
- package/repos/effect/.changeset/mighty-games-matter.md +5 -0
- package/repos/effect/.changeset/modern-uuid-guid-filter.md +5 -0
- package/repos/effect/.changeset/nasty-geese-grow.md +5 -0
- package/repos/effect/.changeset/neat-goats-wave.md +5 -0
- package/repos/effect/.changeset/neat-kings-chew.md +5 -0
- package/repos/effect/.changeset/neat-lions-rest.md +5 -0
- package/repos/effect/.changeset/neat-snails-wash.md +5 -0
- package/repos/effect/.changeset/neat-taxis-notice.md +5 -0
- package/repos/effect/.changeset/new-dogs-swim.md +5 -0
- package/repos/effect/.changeset/new-toes-stop.md +5 -0
- package/repos/effect/.changeset/ninety-geese-exist.md +5 -0
- package/repos/effect/.changeset/odd-boats-think.md +5 -0
- package/repos/effect/.changeset/odd-bulldogs-sleep.md +5 -0
- package/repos/effect/.changeset/odd-fans-glow.md +5 -0
- package/repos/effect/.changeset/odd-forks-talk.md +5 -0
- package/repos/effect/.changeset/odd-laws-draw.md +5 -0
- package/repos/effect/.changeset/odd-owls-smoke.md +5 -0
- package/repos/effect/.changeset/odd-socks-boil.md +5 -0
- package/repos/effect/.changeset/odd-suns-dance.md +5 -0
- package/repos/effect/.changeset/old-brooms-cry.md +5 -0
- package/repos/effect/.changeset/old-facts-stand.md +5 -0
- package/repos/effect/.changeset/old-mirrors-float.md +5 -0
- package/repos/effect/.changeset/olive-poems-visit.md +5 -0
- package/repos/effect/.changeset/open-hotels-remain.md +5 -0
- package/repos/effect/.changeset/openai-compat-nullable-tool-name.md +7 -0
- package/repos/effect/.changeset/openai-compat-reasoning.md +5 -0
- package/repos/effect/.changeset/otel-resource-env-precedence.md +5 -0
- package/repos/effect/.changeset/perfect-buckets-tickle.md +5 -0
- package/repos/effect/.changeset/petite-months-allow.md +6 -0
- package/repos/effect/.changeset/platform-crypto-service.md +9 -0
- package/repos/effect/.changeset/platform-node-shared-barrel.md +5 -0
- package/repos/effect/.changeset/plenty-moons-pull.md +5 -0
- package/repos/effect/.changeset/polite-brooms-tickle.md +5 -0
- package/repos/effect/.changeset/polite-pigs-speak.md +5 -0
- package/repos/effect/.changeset/polite-tables-kneel.md +5 -0
- package/repos/effect/.changeset/port-react-hydration.md +8 -0
- package/repos/effect/.changeset/pre.json +588 -0
- package/repos/effect/.changeset/public-deer-ring.md +5 -0
- package/repos/effect/.changeset/public-jeans-stop.md +5 -0
- package/repos/effect/.changeset/pubsub-publish-false.md +5 -0
- package/repos/effect/.changeset/puny-pens-clap.md +6 -0
- package/repos/effect/.changeset/purple-bars-prove.md +5 -0
- package/repos/effect/.changeset/purple-schools-float.md +5 -0
- package/repos/effect/.changeset/purple-turtles-draw.md +5 -0
- package/repos/effect/.changeset/quick-dragons-fix.md +5 -0
- package/repos/effect/.changeset/quick-falcons-travel.md +5 -0
- package/repos/effect/.changeset/quick-geese-relax.md +5 -0
- package/repos/effect/.changeset/quick-lamps-dig.md +5 -0
- package/repos/effect/.changeset/quick-lizards-fall.md +5 -0
- package/repos/effect/.changeset/quick-trees-join.md +5 -0
- package/repos/effect/.changeset/quiet-carpets-grin.md +5 -0
- package/repos/effect/.changeset/quiet-files-hunt.md +5 -0
- package/repos/effect/.changeset/quiet-lamps-jam.md +5 -0
- package/repos/effect/.changeset/quiet-radios-wave.md +5 -0
- package/repos/effect/.changeset/quiet-redis-scripts.md +5 -0
- package/repos/effect/.changeset/ready-olives-divide.md +5 -0
- package/repos/effect/.changeset/real-trains-ring.md +5 -0
- package/repos/effect/.changeset/red-pigs-repair.md +5 -0
- package/repos/effect/.changeset/redacted-representation-options.md +7 -0
- package/repos/effect/.changeset/refactor-cli-global-flags.md +27 -0
- package/repos/effect/.changeset/refactor-config-provider.md +23 -0
- package/repos/effect/.changeset/refactor-representation-references.md +5 -0
- package/repos/effect/.changeset/remove-effect-transactionwith.md +5 -0
- package/repos/effect/.changeset/remove-http-span-counter.md +5 -0
- package/repos/effect/.changeset/remove-nullor.md +5 -0
- package/repos/effect/.changeset/remove-openapi-fromapi-options.md +7 -0
- package/repos/effect/.changeset/remove-types-mergerecord.md +5 -0
- package/repos/effect/.changeset/remove-unused-utils-apis.md +5 -0
- package/repos/effect/.changeset/rename-rebuild-out.md +5 -0
- package/repos/effect/.changeset/restore-schema-parse-options.md +5 -0
- package/repos/effect/.changeset/rich-dots-push.md +5 -0
- package/repos/effect/.changeset/rich-hoops-nail.md +5 -0
- package/repos/effect/.changeset/rich-sloths-draw.md +5 -0
- package/repos/effect/.changeset/ripe-lies-battle.md +5 -0
- package/repos/effect/.changeset/rpc-middleware-provides-fix.md +5 -0
- package/repos/effect/.changeset/scalar-custom-fetch.md +5 -0
- package/repos/effect/.changeset/schema-as-class.md +17 -0
- package/repos/effect/.changeset/schema-asserts-signature.md +5 -0
- package/repos/effect/.changeset/schema-clean-up-additionalProperties.md +7 -0
- package/repos/effect/.changeset/schema-datetime-utc-from-string.md +5 -0
- package/repos/effect/.changeset/schema-decoding-defaults-services.md +7 -0
- package/repos/effect/.changeset/schema-defaults-issue-channel.md +7 -0
- package/repos/effect/.changeset/schema-dollar-prefix.md +5 -0
- package/repos/effect/.changeset/schema-missing-self-generic.md +5 -0
- package/repos/effect/.changeset/schema-ordered-arbitrary-constraints.md +12 -0
- package/repos/effect/.changeset/schema-parser-adapter-errors.md +5 -0
- package/repos/effect/.changeset/schema-refactor-toCodecJson.md +5 -0
- package/repos/effect/.changeset/schema-remove-annotate-in.md +5 -0
- package/repos/effect/.changeset/schema-rename-makeUnsafe-to-make.md +7 -0
- package/repos/effect/.changeset/schema-rename-parser-makeUnsafe.md +5 -0
- package/repos/effect/.changeset/schema-result-combinators.md +5 -0
- package/repos/effect/.changeset/schema-struct-simplify.md +5 -0
- package/repos/effect/.changeset/seven-mugs-marry.md +5 -0
- package/repos/effect/.changeset/shaggy-birds-stay.md +5 -0
- package/repos/effect/.changeset/shaggy-cities-push.md +5 -0
- package/repos/effect/.changeset/shaggy-numbers-accept.md +5 -0
- package/repos/effect/.changeset/sharp-emus-applaud.md +5 -0
- package/repos/effect/.changeset/sharp-goats-wink.md +5 -0
- package/repos/effect/.changeset/sharp-pandas-care.md +5 -0
- package/repos/effect/.changeset/sharp-peas-march.md +5 -0
- package/repos/effect/.changeset/sharp-rules-draw.md +5 -0
- package/repos/effect/.changeset/sharp-singers-sort.md +5 -0
- package/repos/effect/.changeset/shiny-trains-hug.md +5 -0
- package/repos/effect/.changeset/short-cows-relate.md +5 -0
- package/repos/effect/.changeset/short-foxes-admire.md +5 -0
- package/repos/effect/.changeset/shy-cycles-flow.md +5 -0
- package/repos/effect/.changeset/shy-geckos-sniff.md +30 -0
- package/repos/effect/.changeset/silent-geckos-matter.md +5 -0
- package/repos/effect/.changeset/silent-needles-design.md +6 -0
- package/repos/effect/.changeset/silent-plants-matter.md +8 -0
- package/repos/effect/.changeset/silent-spoons-stare.md +5 -0
- package/repos/effect/.changeset/silly-loops-tickle.md +5 -0
- package/repos/effect/.changeset/silver-bulk-indexeddb.md +5 -0
- package/repos/effect/.changeset/silver-emus-smoke.md +5 -0
- package/repos/effect/.changeset/silver-kings-poke.md +5 -0
- package/repos/effect/.changeset/silver-snails-sqlite.md +17 -0
- package/repos/effect/.changeset/silver-wings-watch.md +5 -0
- package/repos/effect/.changeset/six-cups-taste.md +5 -0
- package/repos/effect/.changeset/sixty-mails-shout.md +5 -0
- package/repos/effect/.changeset/sixty-socks-yell.md +5 -0
- package/repos/effect/.changeset/slimy-planets-divide.md +5 -0
- package/repos/effect/.changeset/slimy-turtles-juggle.md +5 -0
- package/repos/effect/.changeset/slow-beans-battle.md +28 -0
- package/repos/effect/.changeset/slow-berries-enjoy.md +5 -0
- package/repos/effect/.changeset/small-bugs-hunt.md +5 -0
- package/repos/effect/.changeset/small-crabs-care.md +9 -0
- package/repos/effect/.changeset/small-pets-sit.md +6 -0
- package/repos/effect/.changeset/smart-ducks-jump.md +6 -0
- package/repos/effect/.changeset/smart-pillows-buy.md +6 -0
- package/repos/effect/.changeset/smart-timers-fly.md +5 -0
- package/repos/effect/.changeset/smart-tips-sort.md +5 -0
- package/repos/effect/.changeset/social-pumas-prove.md +5 -0
- package/repos/effect/.changeset/soft-comics-wink.md +5 -0
- package/repos/effect/.changeset/soft-delete-sqlmodel.md +5 -0
- package/repos/effect/.changeset/soft-seals-allow.md +5 -0
- package/repos/effect/.changeset/solid-cougars-attack.md +5 -0
- package/repos/effect/.changeset/solid-doors-ring.md +5 -0
- package/repos/effect/.changeset/solid-items-tease.md +5 -0
- package/repos/effect/.changeset/solid-towns-smoke.md +5 -0
- package/repos/effect/.changeset/sour-canyons-rescue.md +5 -0
- package/repos/effect/.changeset/sparkly-bears-act.md +5 -0
- package/repos/effect/.changeset/sparkly-coins-sit.md +5 -0
- package/repos/effect/.changeset/spotty-comics-fry.md +5 -0
- package/repos/effect/.changeset/sql-migrator-mjs-mts.md +5 -0
- package/repos/effect/.changeset/stale-dots-tell.md +5 -0
- package/repos/effect/.changeset/stale-snakes-know.md +5 -0
- package/repos/effect/.changeset/strict-areas-end.md +5 -0
- package/repos/effect/.changeset/strict-buckets-hug.md +8 -0
- package/repos/effect/.changeset/strip-resolved-approvals.md +5 -0
- package/repos/effect/.changeset/strong-balloons-tickle.md +5 -0
- package/repos/effect/.changeset/strong-bees-queue.md +5 -0
- package/repos/effect/.changeset/struct-record.md +5 -0
- package/repos/effect/.changeset/sunny-ads-hang.md +5 -0
- package/repos/effect/.changeset/sunny-bikes-sleep.md +5 -0
- package/repos/effect/.changeset/sunny-rooms-invent.md +5 -0
- package/repos/effect/.changeset/sweet-donuts-bet.md +5 -0
- package/repos/effect/.changeset/sweet-hotels-give.md +5 -0
- package/repos/effect/.changeset/sweet-views-learn.md +5 -0
- package/repos/effect/.changeset/swift-spiders-unpack.md +5 -0
- package/repos/effect/.changeset/swift-symbols-stand.md +5 -0
- package/repos/effect/.changeset/tagged-error-class-optional-empty-props.md +5 -0
- package/repos/effect/.changeset/tall-hairs-return.md +5 -0
- package/repos/effect/.changeset/tall-mails-listen.md +5 -0
- package/repos/effect/.changeset/tall-queens-cheer.md +5 -0
- package/repos/effect/.changeset/tall-wombats-wave.md +5 -0
- package/repos/effect/.changeset/tangy-colts-lose.md +5 -0
- package/repos/effect/.changeset/tasty-comics-send.md +5 -0
- package/repos/effect/.changeset/ten-kings-fry.md +5 -0
- package/repos/effect/.changeset/thick-pandas-wait.md +5 -0
- package/repos/effect/.changeset/thin-ducks-wonder.md +5 -0
- package/repos/effect/.changeset/thirty-ducks-go.md +5 -0
- package/repos/effect/.changeset/thirty-pans-love.md +5 -0
- package/repos/effect/.changeset/three-corners-sort.md +5 -0
- package/repos/effect/.changeset/three-ravens-jam.md +5 -0
- package/repos/effect/.changeset/three-tomatoes-wave.md +5 -0
- package/repos/effect/.changeset/tidy-foxes-own.md +5 -0
- package/repos/effect/.changeset/tidy-icons-glow.md +5 -0
- package/repos/effect/.changeset/tidy-stacks-encode.md +5 -0
- package/repos/effect/.changeset/tidy-stars-drive.md +5 -0
- package/repos/effect/.changeset/tiny-buckets-wave.md +5 -0
- package/repos/effect/.changeset/tiny-lilies-flash.md +5 -0
- package/repos/effect/.changeset/tiny-rabbits-smile.md +5 -0
- package/repos/effect/.changeset/tocodecjson-return-json-type.md +10 -0
- package/repos/effect/.changeset/tool-get-json-schema-tests.md +5 -0
- package/repos/effect/.changeset/true-actors-battle.md +5 -0
- package/repos/effect/.changeset/twenty-buttons-cheer.md +5 -0
- package/repos/effect/.changeset/two-roses-double.md +5 -0
- package/repos/effect/.changeset/unify-error-defect-stack-options.md +23 -0
- package/repos/effect/.changeset/update-schema-arbitrary-report.md +22 -0
- package/repos/effect/.changeset/upset-colts-stick.md +5 -0
- package/repos/effect/.changeset/vast-bananas-send.md +5 -0
- package/repos/effect/.changeset/vast-deserts-travel.md +5 -0
- package/repos/effect/.changeset/violet-peaches-feel.md +5 -0
- package/repos/effect/.changeset/vitest-layer-top-level-options.md +5 -0
- package/repos/effect/.changeset/wacky-grapes-poke.md +5 -0
- package/repos/effect/.changeset/wacky-rice-add.md +5 -0
- package/repos/effect/.changeset/warm-dolls-brake.md +5 -0
- package/repos/effect/.changeset/warm-friends-tie.md +5 -0
- package/repos/effect/.changeset/warm-snails-shop.md +7 -0
- package/repos/effect/.changeset/wet-news-invent.md +5 -0
- package/repos/effect/.changeset/wild-readers-clean.md +5 -0
- package/repos/effect/.changeset/wild-suns-bearer-space.md +5 -0
- package/repos/effect/.changeset/wise-ants-wave.md +6 -0
- package/repos/effect/.changeset/wise-flags-shift.md +22 -0
- package/repos/effect/.changeset/wise-oranges-stay.md +5 -0
- package/repos/effect/.changeset/witty-lobsters-share.md +5 -0
- package/repos/effect/.changeset/yellow-adults-study.md +5 -0
- package/repos/effect/.changeset/yellow-clocks-dance.md +5 -0
- package/repos/effect/.changeset/yellow-dingos-jump.md +5 -0
- package/repos/effect/.changeset/young-doors-change.md +5 -0
- package/repos/effect/.envrc +1 -0
- package/repos/effect/.github/actions/setup/action.yaml +33 -0
- package/repos/effect/.github/workflows/ai-codegen.yml +66 -0
- package/repos/effect/.github/workflows/bundle-comment.yml +72 -0
- package/repos/effect/.github/workflows/check.yml +195 -0
- package/repos/effect/.github/workflows/release.yml +47 -0
- package/repos/effect/.github/workflows/snapshot.yml +34 -0
- package/repos/effect/.oxlintrc.json +25 -0
- package/repos/effect/.patterns/effect.md +102 -0
- package/repos/effect/.patterns/jsdoc.md +53 -0
- package/repos/effect/.patterns/testing.md +44 -0
- package/repos/effect/.specs/README.md +2 -0
- package/repos/effect/.vscode/extensions.json +6 -0
- package/repos/effect/.vscode/settings.json +44 -0
- package/repos/effect/AGENTS.md +139 -0
- package/repos/effect/LICENSE +21 -0
- package/repos/effect/LLMS.md +343 -0
- package/repos/effect/MIGRATION.md +83 -0
- package/repos/effect/README.md +3 -0
- package/repos/effect/TODOS.md +28 -0
- package/repos/effect/ai-docs/README.md +44 -0
- package/repos/effect/ai-docs/package.json +36 -0
- package/repos/effect/ai-docs/src/01_effect/01_basics/01_effect-gen.ts +30 -0
- package/repos/effect/ai-docs/src/01_effect/01_basics/02_effect-fn.ts +39 -0
- package/repos/effect/ai-docs/src/01_effect/01_basics/10_creating-effects.ts +74 -0
- package/repos/effect/ai-docs/src/01_effect/01_basics/index.md +5 -0
- package/repos/effect/ai-docs/src/01_effect/02_services/01_service.ts +45 -0
- package/repos/effect/ai-docs/src/01_effect/02_services/10_reference.ts +10 -0
- package/repos/effect/ai-docs/src/01_effect/02_services/20_layer-composition.ts +70 -0
- package/repos/effect/ai-docs/src/01_effect/02_services/20_layer-unwrap.ts +66 -0
- package/repos/effect/ai-docs/src/01_effect/02_services/index.md +5 -0
- package/repos/effect/ai-docs/src/01_effect/03_errors/01_error-handling.ts +30 -0
- package/repos/effect/ai-docs/src/01_effect/03_errors/10_catch-tags.ts +24 -0
- package/repos/effect/ai-docs/src/01_effect/03_errors/20_reason-errors.ts +64 -0
- package/repos/effect/ai-docs/src/01_effect/03_errors/index.md +1 -0
- package/repos/effect/ai-docs/src/01_effect/04_resources/10_acquire-release.ts +105 -0
- package/repos/effect/ai-docs/src/01_effect/04_resources/20_layer-side-effects.ts +31 -0
- package/repos/effect/ai-docs/src/01_effect/04_resources/30_layer-map.ts +86 -0
- package/repos/effect/ai-docs/src/01_effect/04_resources/index.md +3 -0
- package/repos/effect/ai-docs/src/01_effect/05_running/10_run-main.ts +30 -0
- package/repos/effect/ai-docs/src/01_effect/05_running/20_layer-launch.ts +27 -0
- package/repos/effect/ai-docs/src/01_effect/05_running/index.md +1 -0
- package/repos/effect/ai-docs/src/01_effect/06_pubsub/10_pubsub.ts +56 -0
- package/repos/effect/ai-docs/src/01_effect/06_pubsub/index.md +3 -0
- package/repos/effect/ai-docs/src/02_stream/10_creating-streams.ts +103 -0
- package/repos/effect/ai-docs/src/02_stream/20_consuming-streams.ts +137 -0
- package/repos/effect/ai-docs/src/02_stream/30_encoding.ts +165 -0
- package/repos/effect/ai-docs/src/02_stream/index.md +4 -0
- package/repos/effect/ai-docs/src/03_integration/10_managed-runtime.ts +129 -0
- package/repos/effect/ai-docs/src/03_integration/index.md +5 -0
- package/repos/effect/ai-docs/src/05_batching/10_request-resolver.ts +89 -0
- package/repos/effect/ai-docs/src/05_batching/index.md +3 -0
- package/repos/effect/ai-docs/src/06_schedule/10_schedules.ts +102 -0
- package/repos/effect/ai-docs/src/06_schedule/index.md +3 -0
- package/repos/effect/ai-docs/src/07_datetime/10_creating-and-formatting.ts +30 -0
- package/repos/effect/ai-docs/src/07_datetime/20_time-zones.ts +44 -0
- package/repos/effect/ai-docs/src/07_datetime/index.md +5 -0
- package/repos/effect/ai-docs/src/08_observability/10_logging.ts +66 -0
- package/repos/effect/ai-docs/src/08_observability/20_otlp-tracing.ts +95 -0
- package/repos/effect/ai-docs/src/08_observability/index.md +7 -0
- package/repos/effect/ai-docs/src/09_testing/10_effect-tests.ts +55 -0
- package/repos/effect/ai-docs/src/09_testing/20_layer-tests.ts +138 -0
- package/repos/effect/ai-docs/src/09_testing/index.md +1 -0
- package/repos/effect/ai-docs/src/50_http-client/10_basics.ts +102 -0
- package/repos/effect/ai-docs/src/50_http-client/index.md +3 -0
- package/repos/effect/ai-docs/src/51_http-server/10_basics.ts +116 -0
- package/repos/effect/ai-docs/src/51_http-server/fixtures/api/Api.ts +14 -0
- package/repos/effect/ai-docs/src/51_http-server/fixtures/api/Authorization.ts +36 -0
- package/repos/effect/ai-docs/src/51_http-server/fixtures/api/System.ts +10 -0
- package/repos/effect/ai-docs/src/51_http-server/fixtures/api/Users.ts +91 -0
- package/repos/effect/ai-docs/src/51_http-server/fixtures/domain/User.ts +12 -0
- package/repos/effect/ai-docs/src/51_http-server/fixtures/domain/UserErrors.ts +22 -0
- package/repos/effect/ai-docs/src/51_http-server/fixtures/server/Authorization.ts +36 -0
- package/repos/effect/ai-docs/src/51_http-server/fixtures/server/Users/http.ts +71 -0
- package/repos/effect/ai-docs/src/51_http-server/fixtures/server/Users.ts +62 -0
- package/repos/effect/ai-docs/src/51_http-server/index.md +3 -0
- package/repos/effect/ai-docs/src/60_child-process/10_working-with-child-processes.ts +117 -0
- package/repos/effect/ai-docs/src/60_child-process/index.md +3 -0
- package/repos/effect/ai-docs/src/70_cli/10_basics.ts +136 -0
- package/repos/effect/ai-docs/src/70_cli/index.md +5 -0
- package/repos/effect/ai-docs/src/71_ai/10_language-model.ts +156 -0
- package/repos/effect/ai-docs/src/71_ai/20_tools.ts +226 -0
- package/repos/effect/ai-docs/src/71_ai/30_chat.ts +158 -0
- package/repos/effect/ai-docs/src/71_ai/fixtures/domain/LaunchPlan.ts +9 -0
- package/repos/effect/ai-docs/src/71_ai/index.md +5 -0
- package/repos/effect/ai-docs/src/80_cluster/10_entities.ts +97 -0
- package/repos/effect/ai-docs/src/80_cluster/index.md +4 -0
- package/repos/effect/ai-docs/src/index.md +12 -0
- package/repos/effect/ai-docs/tsconfig.json +24 -0
- package/repos/effect/cookbooks/schedule.md +3507 -0
- package/repos/effect/deno.json +33 -0
- package/repos/effect/docker-compose.yaml +18 -0
- package/repos/effect/dprint.json +32 -0
- package/repos/effect/flake.lock +27 -0
- package/repos/effect/flake.nix +24 -0
- package/repos/effect/jsdocs.config.json +16 -0
- package/repos/effect/migration/cause.md +163 -0
- package/repos/effect/migration/equality.md +72 -0
- package/repos/effect/migration/error-handling.md +106 -0
- package/repos/effect/migration/fiber-keep-alive.md +74 -0
- package/repos/effect/migration/fiberref.md +109 -0
- package/repos/effect/migration/forking.md +94 -0
- package/repos/effect/migration/generators.md +32 -0
- package/repos/effect/migration/layer-memoization.md +98 -0
- package/repos/effect/migration/runtime.md +88 -0
- package/repos/effect/migration/schema.md +1032 -0
- package/repos/effect/migration/scope.md +50 -0
- package/repos/effect/migration/services.md +235 -0
- package/repos/effect/migration/v3-to-v4.md +421 -0
- package/repos/effect/migration/yieldable.md +173 -0
- package/repos/effect/package.json +104 -0
- package/repos/effect/packages/ai/anthropic/CHANGELOG.md +611 -0
- package/repos/effect/packages/ai/anthropic/codegen.yml +63 -0
- package/repos/effect/packages/ai/anthropic/docgen.json +26 -0
- package/repos/effect/packages/ai/anthropic/package.json +67 -0
- package/repos/effect/packages/ai/anthropic/src/AnthropicClient.ts +432 -0
- package/repos/effect/packages/ai/anthropic/src/AnthropicConfig.ts +84 -0
- package/repos/effect/packages/ai/anthropic/src/AnthropicError.ts +212 -0
- package/repos/effect/packages/ai/anthropic/src/AnthropicLanguageModel.ts +3098 -0
- package/repos/effect/packages/ai/anthropic/src/AnthropicTelemetry.ts +132 -0
- package/repos/effect/packages/ai/anthropic/src/AnthropicTool.ts +2512 -0
- package/repos/effect/packages/ai/anthropic/src/Generated.ts +12600 -0
- package/repos/effect/packages/ai/anthropic/src/index.ts +40 -0
- package/repos/effect/packages/ai/anthropic/src/internal/errors.ts +370 -0
- package/repos/effect/packages/ai/anthropic/src/internal/utilities.ts +26 -0
- package/repos/effect/packages/ai/anthropic/test/AnthropicLanguageModel.test.ts +300 -0
- package/repos/effect/packages/ai/anthropic/tsconfig.json +8 -0
- package/repos/effect/packages/ai/anthropic/vitest.config.ts +6 -0
- package/repos/effect/packages/ai/openai/CHANGELOG.md +668 -0
- package/repos/effect/packages/ai/openai/codegen.yaml +41 -0
- package/repos/effect/packages/ai/openai/docgen.json +24 -0
- package/repos/effect/packages/ai/openai/package.json +67 -0
- package/repos/effect/packages/ai/openai/src/Generated.ts +35774 -0
- package/repos/effect/packages/ai/openai/src/OpenAiClient.ts +730 -0
- package/repos/effect/packages/ai/openai/src/OpenAiClientGenerated.ts +202 -0
- package/repos/effect/packages/ai/openai/src/OpenAiConfig.ts +93 -0
- package/repos/effect/packages/ai/openai/src/OpenAiEmbeddingModel.ts +258 -0
- package/repos/effect/packages/ai/openai/src/OpenAiError.ts +242 -0
- package/repos/effect/packages/ai/openai/src/OpenAiLanguageModel.ts +3133 -0
- package/repos/effect/packages/ai/openai/src/OpenAiSchema.ts +1286 -0
- package/repos/effect/packages/ai/openai/src/OpenAiTelemetry.ts +162 -0
- package/repos/effect/packages/ai/openai/src/OpenAiTool.ts +342 -0
- package/repos/effect/packages/ai/openai/src/index.ts +55 -0
- package/repos/effect/packages/ai/openai/src/internal/errors.ts +349 -0
- package/repos/effect/packages/ai/openai/src/internal/utilities.ts +33 -0
- package/repos/effect/packages/ai/openai/test/OpenAiClient.test.ts +798 -0
- package/repos/effect/packages/ai/openai/test/OpenAiEmbeddingModel.test.ts +289 -0
- package/repos/effect/packages/ai/openai/test/OpenAiLanguageModel.test.ts +1528 -0
- package/repos/effect/packages/ai/openai/test/OpenAiSchema.test.ts +273 -0
- package/repos/effect/packages/ai/openai/tsconfig.json +8 -0
- package/repos/effect/packages/ai/openai/vitest.config.ts +6 -0
- package/repos/effect/packages/ai/openai-compat/CHANGELOG.md +626 -0
- package/repos/effect/packages/ai/openai-compat/docgen.json +24 -0
- package/repos/effect/packages/ai/openai-compat/package.json +69 -0
- package/repos/effect/packages/ai/openai-compat/src/OpenAiClient.ts +1221 -0
- package/repos/effect/packages/ai/openai-compat/src/OpenAiConfig.ts +87 -0
- package/repos/effect/packages/ai/openai-compat/src/OpenAiEmbeddingModel.ts +254 -0
- package/repos/effect/packages/ai/openai-compat/src/OpenAiError.ts +178 -0
- package/repos/effect/packages/ai/openai-compat/src/OpenAiLanguageModel.ts +1951 -0
- package/repos/effect/packages/ai/openai-compat/src/OpenAiTelemetry.ts +164 -0
- package/repos/effect/packages/ai/openai-compat/src/index.ts +35 -0
- package/repos/effect/packages/ai/openai-compat/src/internal/errors.ts +327 -0
- package/repos/effect/packages/ai/openai-compat/src/internal/utilities.ts +33 -0
- package/repos/effect/packages/ai/openai-compat/test/OpenAiClient.test.ts +474 -0
- package/repos/effect/packages/ai/openai-compat/test/OpenAiEmbeddingModel.test.ts +216 -0
- package/repos/effect/packages/ai/openai-compat/test/OpenAiLanguageModel.test.ts +1505 -0
- package/repos/effect/packages/ai/openai-compat/tsconfig.json +8 -0
- package/repos/effect/packages/ai/openai-compat/vitest.config.ts +6 -0
- package/repos/effect/packages/ai/openrouter/CHANGELOG.md +607 -0
- package/repos/effect/packages/ai/openrouter/codegen.yml +35 -0
- package/repos/effect/packages/ai/openrouter/docgen.json +24 -0
- package/repos/effect/packages/ai/openrouter/package.json +67 -0
- package/repos/effect/packages/ai/openrouter/src/Generated.ts +10028 -0
- package/repos/effect/packages/ai/openrouter/src/OpenRouterClient.ts +357 -0
- package/repos/effect/packages/ai/openrouter/src/OpenRouterConfig.ts +99 -0
- package/repos/effect/packages/ai/openrouter/src/OpenRouterError.ts +225 -0
- package/repos/effect/packages/ai/openrouter/src/OpenRouterLanguageModel.ts +1796 -0
- package/repos/effect/packages/ai/openrouter/src/index.ts +30 -0
- package/repos/effect/packages/ai/openrouter/src/internal/errors.ts +375 -0
- package/repos/effect/packages/ai/openrouter/src/internal/utilities.ts +92 -0
- package/repos/effect/packages/ai/openrouter/tsconfig.json +10 -0
- package/repos/effect/packages/ai/openrouter/vitest.config.ts +6 -0
- package/repos/effect/packages/atom/react/CHANGELOG.md +599 -0
- package/repos/effect/packages/atom/react/LICENSE +21 -0
- package/repos/effect/packages/atom/react/README.md +7 -0
- package/repos/effect/packages/atom/react/docgen.json +25 -0
- package/repos/effect/packages/atom/react/package.json +79 -0
- package/repos/effect/packages/atom/react/src/Hooks.ts +476 -0
- package/repos/effect/packages/atom/react/src/ReactHydration.ts +109 -0
- package/repos/effect/packages/atom/react/src/RegistryContext.ts +108 -0
- package/repos/effect/packages/atom/react/src/ScopedAtom.ts +151 -0
- package/repos/effect/packages/atom/react/src/index.ts +23 -0
- package/repos/effect/packages/atom/react/test/index.test.tsx +650 -0
- package/repos/effect/packages/atom/react/tsconfig.json +8 -0
- package/repos/effect/packages/atom/react/vitest.config.ts +9 -0
- package/repos/effect/packages/atom/react/vitest.setup.ts +8 -0
- package/repos/effect/packages/atom/solid/CHANGELOG.md +595 -0
- package/repos/effect/packages/atom/solid/LICENSE +21 -0
- package/repos/effect/packages/atom/solid/README.md +7 -0
- package/repos/effect/packages/atom/solid/docgen.json +26 -0
- package/repos/effect/packages/atom/solid/package.json +72 -0
- package/repos/effect/packages/atom/solid/src/Hooks.ts +359 -0
- package/repos/effect/packages/atom/solid/src/RegistryContext.ts +80 -0
- package/repos/effect/packages/atom/solid/src/index.ts +13 -0
- package/repos/effect/packages/atom/solid/test/index.test.tsx +296 -0
- package/repos/effect/packages/atom/solid/tsconfig.json +8 -0
- package/repos/effect/packages/atom/solid/vitest.config.ts +15 -0
- package/repos/effect/packages/atom/solid/vitest.setup.ts +8 -0
- package/repos/effect/packages/atom/vue/CHANGELOG.md +593 -0
- package/repos/effect/packages/atom/vue/LICENSE +21 -0
- package/repos/effect/packages/atom/vue/README.md +7 -0
- package/repos/effect/packages/atom/vue/docgen.json +24 -0
- package/repos/effect/packages/atom/vue/package.json +68 -0
- package/repos/effect/packages/atom/vue/src/index.ts +211 -0
- package/repos/effect/packages/atom/vue/test/index.test.ts +5 -0
- package/repos/effect/packages/atom/vue/tsconfig.json +14 -0
- package/repos/effect/packages/atom/vue/vitest.config.ts +8 -0
- package/repos/effect/packages/effect/CHANGELOG.md +1607 -0
- package/repos/effect/packages/effect/CONFIG.md +690 -0
- package/repos/effect/packages/effect/HTTPAPI.md +3213 -0
- package/repos/effect/packages/effect/LICENSE +21 -0
- package/repos/effect/packages/effect/MCP.md +369 -0
- package/repos/effect/packages/effect/OPTIC.md +620 -0
- package/repos/effect/packages/effect/README.md +53 -0
- package/repos/effect/packages/effect/SCHEMA.md +7284 -0
- package/repos/effect/packages/effect/benchmark/schema/Enums.ts +40 -0
- package/repos/effect/packages/effect/benchmark/schema/Optic.ts +79 -0
- package/repos/effect/packages/effect/benchmark/schema/array.ts +74 -0
- package/repos/effect/packages/effect/benchmark/schema/filter.ts +74 -0
- package/repos/effect/packages/effect/benchmark/schema/object.ts +82 -0
- package/repos/effect/packages/effect/benchmark/schema/tagged-union.ts +69 -0
- package/repos/effect/packages/effect/benchmark/schema/transformation.ts +91 -0
- package/repos/effect/packages/effect/benchmark/stream/splitLines.ts +46 -0
- package/repos/effect/packages/effect/docgen.json +38 -0
- package/repos/effect/packages/effect/package.json +127 -0
- package/repos/effect/packages/effect/src/Array.ts +4908 -0
- package/repos/effect/packages/effect/src/BigDecimal.ts +1943 -0
- package/repos/effect/packages/effect/src/BigInt.ts +1029 -0
- package/repos/effect/packages/effect/src/Boolean.ts +481 -0
- package/repos/effect/packages/effect/src/Brand.ts +318 -0
- package/repos/effect/packages/effect/src/Cache.ts +1295 -0
- package/repos/effect/packages/effect/src/Cause.ts +1939 -0
- package/repos/effect/packages/effect/src/Channel.ts +8615 -0
- package/repos/effect/packages/effect/src/ChannelSchema.ts +308 -0
- package/repos/effect/packages/effect/src/Chunk.ts +2976 -0
- package/repos/effect/packages/effect/src/Clock.ts +194 -0
- package/repos/effect/packages/effect/src/Combiner.ts +316 -0
- package/repos/effect/packages/effect/src/Config.ts +1416 -0
- package/repos/effect/packages/effect/src/ConfigProvider.ts +1159 -0
- package/repos/effect/packages/effect/src/Console.ts +653 -0
- package/repos/effect/packages/effect/src/Context.ts +1339 -0
- package/repos/effect/packages/effect/src/Cron.ts +1212 -0
- package/repos/effect/packages/effect/src/Crypto.ts +318 -0
- package/repos/effect/packages/effect/src/Data.ts +774 -0
- package/repos/effect/packages/effect/src/DateTime.ts +2922 -0
- package/repos/effect/packages/effect/src/Deferred.ts +917 -0
- package/repos/effect/packages/effect/src/Differ.ts +32 -0
- package/repos/effect/packages/effect/src/Duration.ts +1827 -0
- package/repos/effect/packages/effect/src/Effect.ts +15347 -0
- package/repos/effect/packages/effect/src/Effectable.ts +68 -0
- package/repos/effect/packages/effect/src/Encoding.ts +1046 -0
- package/repos/effect/packages/effect/src/Equal.ts +550 -0
- package/repos/effect/packages/effect/src/Equivalence.ts +870 -0
- package/repos/effect/packages/effect/src/ErrorReporter.ts +543 -0
- package/repos/effect/packages/effect/src/ExecutionPlan.ts +416 -0
- package/repos/effect/packages/effect/src/Exit.ts +1085 -0
- package/repos/effect/packages/effect/src/Fiber.ts +632 -0
- package/repos/effect/packages/effect/src/FiberHandle.ts +815 -0
- package/repos/effect/packages/effect/src/FiberMap.ts +1030 -0
- package/repos/effect/packages/effect/src/FiberSet.ts +713 -0
- package/repos/effect/packages/effect/src/FileSystem.ts +1394 -0
- package/repos/effect/packages/effect/src/Filter.ts +827 -0
- package/repos/effect/packages/effect/src/Formatter.ts +319 -0
- package/repos/effect/packages/effect/src/Function.ts +1415 -0
- package/repos/effect/packages/effect/src/Graph.ts +4892 -0
- package/repos/effect/packages/effect/src/HKT.ts +213 -0
- package/repos/effect/packages/effect/src/Hash.ts +539 -0
- package/repos/effect/packages/effect/src/HashMap.ts +1236 -0
- package/repos/effect/packages/effect/src/HashRing.ts +426 -0
- package/repos/effect/packages/effect/src/HashSet.ts +605 -0
- package/repos/effect/packages/effect/src/Inspectable.ts +329 -0
- package/repos/effect/packages/effect/src/Iterable.ts +2483 -0
- package/repos/effect/packages/effect/src/JsonPatch.ts +469 -0
- package/repos/effect/packages/effect/src/JsonPointer.ts +80 -0
- package/repos/effect/packages/effect/src/JsonSchema.ts +948 -0
- package/repos/effect/packages/effect/src/Latch.ts +373 -0
- package/repos/effect/packages/effect/src/Layer.ts +2773 -0
- package/repos/effect/packages/effect/src/LayerMap.ts +468 -0
- package/repos/effect/packages/effect/src/LogLevel.ts +412 -0
- package/repos/effect/packages/effect/src/Logger.ts +1284 -0
- package/repos/effect/packages/effect/src/ManagedRuntime.ts +381 -0
- package/repos/effect/packages/effect/src/Match.ts +2606 -0
- package/repos/effect/packages/effect/src/Metric.ts +4058 -0
- package/repos/effect/packages/effect/src/MutableHashMap.ts +845 -0
- package/repos/effect/packages/effect/src/MutableHashSet.ts +422 -0
- package/repos/effect/packages/effect/src/MutableList.ts +967 -0
- package/repos/effect/packages/effect/src/MutableRef.ts +822 -0
- package/repos/effect/packages/effect/src/Newtype.ts +319 -0
- package/repos/effect/packages/effect/src/NonEmptyIterable.ts +221 -0
- package/repos/effect/packages/effect/src/Number.ts +860 -0
- package/repos/effect/packages/effect/src/Optic.ts +1701 -0
- package/repos/effect/packages/effect/src/Option.ts +2664 -0
- package/repos/effect/packages/effect/src/Order.ts +982 -0
- package/repos/effect/packages/effect/src/Ordering.ts +182 -0
- package/repos/effect/packages/effect/src/PartitionedSemaphore.ts +561 -0
- package/repos/effect/packages/effect/src/Path.ts +870 -0
- package/repos/effect/packages/effect/src/Pipeable.ts +674 -0
- package/repos/effect/packages/effect/src/PlatformError.ts +221 -0
- package/repos/effect/packages/effect/src/Pool.ts +699 -0
- package/repos/effect/packages/effect/src/Predicate.ts +1872 -0
- package/repos/effect/packages/effect/src/PrimaryKey.ts +123 -0
- package/repos/effect/packages/effect/src/PubSub.ts +2797 -0
- package/repos/effect/packages/effect/src/Pull.ts +376 -0
- package/repos/effect/packages/effect/src/Queue.ts +1962 -0
- package/repos/effect/packages/effect/src/Random.ts +549 -0
- package/repos/effect/packages/effect/src/RcMap.ts +612 -0
- package/repos/effect/packages/effect/src/RcRef.ts +225 -0
- package/repos/effect/packages/effect/src/Record.ts +1563 -0
- package/repos/effect/packages/effect/src/Redactable.ts +168 -0
- package/repos/effect/packages/effect/src/Redacted.ts +314 -0
- package/repos/effect/packages/effect/src/Reducer.ts +178 -0
- package/repos/effect/packages/effect/src/Ref.ts +801 -0
- package/repos/effect/packages/effect/src/References.ts +786 -0
- package/repos/effect/packages/effect/src/RegExp.ts +82 -0
- package/repos/effect/packages/effect/src/Request.ts +598 -0
- package/repos/effect/packages/effect/src/RequestResolver.ts +1249 -0
- package/repos/effect/packages/effect/src/Resource.ts +184 -0
- package/repos/effect/packages/effect/src/Result.ts +1939 -0
- package/repos/effect/packages/effect/src/Runtime.ts +432 -0
- package/repos/effect/packages/effect/src/Schedule.ts +3564 -0
- package/repos/effect/packages/effect/src/Scheduler.ts +285 -0
- package/repos/effect/packages/effect/src/Schema.ts +14653 -0
- package/repos/effect/packages/effect/src/SchemaAST.ts +3903 -0
- package/repos/effect/packages/effect/src/SchemaGetter.ts +1870 -0
- package/repos/effect/packages/effect/src/SchemaIssue.ts +1176 -0
- package/repos/effect/packages/effect/src/SchemaParser.ts +1105 -0
- package/repos/effect/packages/effect/src/SchemaRepresentation.ts +3944 -0
- package/repos/effect/packages/effect/src/SchemaTransformation.ts +1818 -0
- package/repos/effect/packages/effect/src/SchemaUtils.ts +51 -0
- package/repos/effect/packages/effect/src/Scope.ts +572 -0
- package/repos/effect/packages/effect/src/ScopedCache.ts +820 -0
- package/repos/effect/packages/effect/src/ScopedRef.ts +192 -0
- package/repos/effect/packages/effect/src/Semaphore.ts +517 -0
- package/repos/effect/packages/effect/src/Sink.ts +2174 -0
- package/repos/effect/packages/effect/src/Stdio.ts +143 -0
- package/repos/effect/packages/effect/src/Stream.ts +11722 -0
- package/repos/effect/packages/effect/src/String.ts +1427 -0
- package/repos/effect/packages/effect/src/Struct.ts +979 -0
- package/repos/effect/packages/effect/src/SubscriptionRef.ts +1021 -0
- package/repos/effect/packages/effect/src/Symbol.ts +31 -0
- package/repos/effect/packages/effect/src/SynchronizedRef.ts +668 -0
- package/repos/effect/packages/effect/src/Take.ts +46 -0
- package/repos/effect/packages/effect/src/Terminal.ts +188 -0
- package/repos/effect/packages/effect/src/Tracer.ts +683 -0
- package/repos/effect/packages/effect/src/Trie.ts +953 -0
- package/repos/effect/packages/effect/src/Tuple.ts +737 -0
- package/repos/effect/packages/effect/src/TxChunk.ts +822 -0
- package/repos/effect/packages/effect/src/TxDeferred.ts +319 -0
- package/repos/effect/packages/effect/src/TxHashMap.ts +2165 -0
- package/repos/effect/packages/effect/src/TxHashSet.ts +908 -0
- package/repos/effect/packages/effect/src/TxPriorityQueue.ts +567 -0
- package/repos/effect/packages/effect/src/TxPubSub.ts +684 -0
- package/repos/effect/packages/effect/src/TxQueue.ts +1488 -0
- package/repos/effect/packages/effect/src/TxReentrantLock.ts +655 -0
- package/repos/effect/packages/effect/src/TxRef.ts +282 -0
- package/repos/effect/packages/effect/src/TxSemaphore.ts +707 -0
- package/repos/effect/packages/effect/src/TxSubscriptionRef.ts +518 -0
- package/repos/effect/packages/effect/src/Types.ts +1121 -0
- package/repos/effect/packages/effect/src/UndefinedOr.ts +239 -0
- package/repos/effect/packages/effect/src/Unify.ts +314 -0
- package/repos/effect/packages/effect/src/Utils.ts +221 -0
- package/repos/effect/packages/effect/src/index.ts +712 -0
- package/repos/effect/packages/effect/src/internal/array.ts +8 -0
- package/repos/effect/packages/effect/src/internal/concurrency.ts +52 -0
- package/repos/effect/packages/effect/src/internal/core.ts +666 -0
- package/repos/effect/packages/effect/src/internal/dateTime.ts +1264 -0
- package/repos/effect/packages/effect/src/internal/doNotation.ts +117 -0
- package/repos/effect/packages/effect/src/internal/effect.ts +6427 -0
- package/repos/effect/packages/effect/src/internal/equal.ts +28 -0
- package/repos/effect/packages/effect/src/internal/errors.ts +9 -0
- package/repos/effect/packages/effect/src/internal/executionPlan.ts +120 -0
- package/repos/effect/packages/effect/src/internal/hashMap.ts +1309 -0
- package/repos/effect/packages/effect/src/internal/hashSet.ts +190 -0
- package/repos/effect/packages/effect/src/internal/layer.ts +88 -0
- package/repos/effect/packages/effect/src/internal/matcher.ts +637 -0
- package/repos/effect/packages/effect/src/internal/metric.ts +2 -0
- package/repos/effect/packages/effect/src/internal/option.ts +98 -0
- package/repos/effect/packages/effect/src/internal/random.ts +20 -0
- package/repos/effect/packages/effect/src/internal/rcRef.ts +189 -0
- package/repos/effect/packages/effect/src/internal/record.ts +18 -0
- package/repos/effect/packages/effect/src/internal/redacted.ts +19 -0
- package/repos/effect/packages/effect/src/internal/references.ts +72 -0
- package/repos/effect/packages/effect/src/internal/request.ts +205 -0
- package/repos/effect/packages/effect/src/internal/result.ts +112 -0
- package/repos/effect/packages/effect/src/internal/schedule.ts +248 -0
- package/repos/effect/packages/effect/src/internal/schema/annotations.ts +37 -0
- package/repos/effect/packages/effect/src/internal/schema/arbitrary.ts +894 -0
- package/repos/effect/packages/effect/src/internal/schema/cause.ts +26 -0
- package/repos/effect/packages/effect/src/internal/schema/equivalence.ts +154 -0
- package/repos/effect/packages/effect/src/internal/schema/representation.ts +799 -0
- package/repos/effect/packages/effect/src/internal/schema/schema.ts +128 -0
- package/repos/effect/packages/effect/src/internal/stream.ts +28 -0
- package/repos/effect/packages/effect/src/internal/tracer.ts +41 -0
- package/repos/effect/packages/effect/src/internal/trie.ts +733 -0
- package/repos/effect/packages/effect/src/internal/version.ts +2 -0
- package/repos/effect/packages/effect/src/testing/FastCheck.ts +89 -0
- package/repos/effect/packages/effect/src/testing/TestClock.ts +547 -0
- package/repos/effect/packages/effect/src/testing/TestConsole.ts +369 -0
- package/repos/effect/packages/effect/src/testing/TestSchema.ts +567 -0
- package/repos/effect/packages/effect/src/testing/index.ts +25 -0
- package/repos/effect/packages/effect/src/unstable/ai/AiError.ts +1629 -0
- package/repos/effect/packages/effect/src/unstable/ai/AnthropicStructuredOutput.ts +407 -0
- package/repos/effect/packages/effect/src/unstable/ai/Chat.ts +931 -0
- package/repos/effect/packages/effect/src/unstable/ai/EmbeddingModel.ts +269 -0
- package/repos/effect/packages/effect/src/unstable/ai/IdGenerator.ts +300 -0
- package/repos/effect/packages/effect/src/unstable/ai/LanguageModel.ts +2221 -0
- package/repos/effect/packages/effect/src/unstable/ai/McpSchema.ts +2527 -0
- package/repos/effect/packages/effect/src/unstable/ai/McpServer.ts +1468 -0
- package/repos/effect/packages/effect/src/unstable/ai/Model.ts +166 -0
- package/repos/effect/packages/effect/src/unstable/ai/OpenAiStructuredOutput.ts +476 -0
- package/repos/effect/packages/effect/src/unstable/ai/Prompt.ts +2234 -0
- package/repos/effect/packages/effect/src/unstable/ai/Response.ts +2582 -0
- package/repos/effect/packages/effect/src/unstable/ai/ResponseIdTracker.ts +139 -0
- package/repos/effect/packages/effect/src/unstable/ai/Telemetry.ts +515 -0
- package/repos/effect/packages/effect/src/unstable/ai/Tokenizer.ts +176 -0
- package/repos/effect/packages/effect/src/unstable/ai/Tool.ts +2003 -0
- package/repos/effect/packages/effect/src/unstable/ai/Toolkit.ts +554 -0
- package/repos/effect/packages/effect/src/unstable/ai/index.ts +90 -0
- package/repos/effect/packages/effect/src/unstable/ai/internal/codec-transformer.ts +13 -0
- package/repos/effect/packages/effect/src/unstable/cli/Argument.ts +749 -0
- package/repos/effect/packages/effect/src/unstable/cli/CliError.ts +549 -0
- package/repos/effect/packages/effect/src/unstable/cli/CliOutput.ts +607 -0
- package/repos/effect/packages/effect/src/unstable/cli/Command.ts +1610 -0
- package/repos/effect/packages/effect/src/unstable/cli/Completions.ts +123 -0
- package/repos/effect/packages/effect/src/unstable/cli/Flag.ts +986 -0
- package/repos/effect/packages/effect/src/unstable/cli/GlobalFlag.ts +295 -0
- package/repos/effect/packages/effect/src/unstable/cli/HelpDoc.ts +323 -0
- package/repos/effect/packages/effect/src/unstable/cli/Param.ts +2193 -0
- package/repos/effect/packages/effect/src/unstable/cli/Primitive.ts +766 -0
- package/repos/effect/packages/effect/src/unstable/cli/Prompt.ts +3852 -0
- package/repos/effect/packages/effect/src/unstable/cli/SEMANTICS.md +157 -0
- package/repos/effect/packages/effect/src/unstable/cli/index.ts +60 -0
- package/repos/effect/packages/effect/src/unstable/cli/internal/ansi.ts +152 -0
- package/repos/effect/packages/effect/src/unstable/cli/internal/auto-suggest.ts +41 -0
- package/repos/effect/packages/effect/src/unstable/cli/internal/command.ts +340 -0
- package/repos/effect/packages/effect/src/unstable/cli/internal/completions/bash.ts +222 -0
- package/repos/effect/packages/effect/src/unstable/cli/internal/completions/descriptor.ts +133 -0
- package/repos/effect/packages/effect/src/unstable/cli/internal/completions/fish.ts +253 -0
- package/repos/effect/packages/effect/src/unstable/cli/internal/completions/zsh.ts +220 -0
- package/repos/effect/packages/effect/src/unstable/cli/internal/config.ts +272 -0
- package/repos/effect/packages/effect/src/unstable/cli/internal/help.ts +181 -0
- package/repos/effect/packages/effect/src/unstable/cli/internal/lexer.ts +70 -0
- package/repos/effect/packages/effect/src/unstable/cli/internal/parser.ts +932 -0
- package/repos/effect/packages/effect/src/unstable/cluster/ClusterCron.ts +163 -0
- package/repos/effect/packages/effect/src/unstable/cluster/ClusterError.ts +238 -0
- package/repos/effect/packages/effect/src/unstable/cluster/ClusterMetrics.ts +112 -0
- package/repos/effect/packages/effect/src/unstable/cluster/ClusterSchema.ts +170 -0
- package/repos/effect/packages/effect/src/unstable/cluster/ClusterWorkflowEngine.ts +778 -0
- package/repos/effect/packages/effect/src/unstable/cluster/DeliverAt.ts +58 -0
- package/repos/effect/packages/effect/src/unstable/cluster/Entity.ts +779 -0
- package/repos/effect/packages/effect/src/unstable/cluster/EntityAddress.ts +93 -0
- package/repos/effect/packages/effect/src/unstable/cluster/EntityId.ts +50 -0
- package/repos/effect/packages/effect/src/unstable/cluster/EntityProxy.ts +263 -0
- package/repos/effect/packages/effect/src/unstable/cluster/EntityProxyServer.ts +149 -0
- package/repos/effect/packages/effect/src/unstable/cluster/EntityResource.ts +184 -0
- package/repos/effect/packages/effect/src/unstable/cluster/EntityType.ts +52 -0
- package/repos/effect/packages/effect/src/unstable/cluster/Envelope.ts +433 -0
- package/repos/effect/packages/effect/src/unstable/cluster/HttpRunner.ts +345 -0
- package/repos/effect/packages/effect/src/unstable/cluster/K8sHttpClient.ts +297 -0
- package/repos/effect/packages/effect/src/unstable/cluster/MachineId.ts +54 -0
- package/repos/effect/packages/effect/src/unstable/cluster/Message.ts +314 -0
- package/repos/effect/packages/effect/src/unstable/cluster/MessageStorage.ts +1072 -0
- package/repos/effect/packages/effect/src/unstable/cluster/Reply.ts +455 -0
- package/repos/effect/packages/effect/src/unstable/cluster/Runner.ts +129 -0
- package/repos/effect/packages/effect/src/unstable/cluster/RunnerAddress.ts +112 -0
- package/repos/effect/packages/effect/src/unstable/cluster/RunnerHealth.ts +145 -0
- package/repos/effect/packages/effect/src/unstable/cluster/RunnerServer.ts +220 -0
- package/repos/effect/packages/effect/src/unstable/cluster/RunnerStorage.ts +243 -0
- package/repos/effect/packages/effect/src/unstable/cluster/Runners.ts +690 -0
- package/repos/effect/packages/effect/src/unstable/cluster/ShardId.ts +178 -0
- package/repos/effect/packages/effect/src/unstable/cluster/Sharding.ts +1488 -0
- package/repos/effect/packages/effect/src/unstable/cluster/ShardingConfig.ts +367 -0
- package/repos/effect/packages/effect/src/unstable/cluster/ShardingRegistrationEvent.ts +76 -0
- package/repos/effect/packages/effect/src/unstable/cluster/SingleRunner.ts +75 -0
- package/repos/effect/packages/effect/src/unstable/cluster/Singleton.ts +56 -0
- package/repos/effect/packages/effect/src/unstable/cluster/SingletonAddress.ts +49 -0
- package/repos/effect/packages/effect/src/unstable/cluster/Snowflake.ts +282 -0
- package/repos/effect/packages/effect/src/unstable/cluster/SocketRunner.ts +96 -0
- package/repos/effect/packages/effect/src/unstable/cluster/SqlMessageStorage.ts +1045 -0
- package/repos/effect/packages/effect/src/unstable/cluster/SqlRunnerStorage.ts +700 -0
- package/repos/effect/packages/effect/src/unstable/cluster/TestRunner.ts +36 -0
- package/repos/effect/packages/effect/src/unstable/cluster/index.ts +195 -0
- package/repos/effect/packages/effect/src/unstable/cluster/internal/entityManager.ts +678 -0
- package/repos/effect/packages/effect/src/unstable/cluster/internal/entityReaper.ts +58 -0
- package/repos/effect/packages/effect/src/unstable/cluster/internal/hash.ts +23 -0
- package/repos/effect/packages/effect/src/unstable/cluster/internal/interruptors.ts +2 -0
- package/repos/effect/packages/effect/src/unstable/cluster/internal/resourceMap.ts +100 -0
- package/repos/effect/packages/effect/src/unstable/cluster/internal/resourceRef.ts +99 -0
- package/repos/effect/packages/effect/src/unstable/devtools/DevTools.ts +68 -0
- package/repos/effect/packages/effect/src/unstable/devtools/DevToolsClient.ts +236 -0
- package/repos/effect/packages/effect/src/unstable/devtools/DevToolsSchema.ts +558 -0
- package/repos/effect/packages/effect/src/unstable/devtools/DevToolsServer.ts +94 -0
- package/repos/effect/packages/effect/src/unstable/devtools/index.ts +25 -0
- package/repos/effect/packages/effect/src/unstable/encoding/Msgpack.ts +383 -0
- package/repos/effect/packages/effect/src/unstable/encoding/Ndjson.ts +602 -0
- package/repos/effect/packages/effect/src/unstable/encoding/Sse.ts +593 -0
- package/repos/effect/packages/effect/src/unstable/encoding/index.ts +20 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/Event.ts +447 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/EventGroup.ts +193 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/EventJournal.ts +795 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/EventLog.ts +1030 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/EventLogEncryption.ts +169 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/EventLogMessage.ts +354 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/EventLogRemote.ts +377 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/EventLogServer.ts +242 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/EventLogServerEncrypted.ts +268 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/EventLogServerUnencrypted.ts +898 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/EventLogSessionAuth.ts +524 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/SqlEventJournal.ts +353 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/SqlEventLogServerEncrypted.ts +343 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/SqlEventLogServerUnencrypted.ts +527 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/index.ts +75 -0
- package/repos/effect/packages/effect/src/unstable/eventlog/internal/identityRootSecretDerivation.ts +153 -0
- package/repos/effect/packages/effect/src/unstable/http/Cookies.ts +952 -0
- package/repos/effect/packages/effect/src/unstable/http/Etag.ts +141 -0
- package/repos/effect/packages/effect/src/unstable/http/FetchHttpClient.ts +123 -0
- package/repos/effect/packages/effect/src/unstable/http/FindMyWay.ts +15 -0
- package/repos/effect/packages/effect/src/unstable/http/Headers.ts +438 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpBody.ts +545 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpClient.ts +1630 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpClientError.ts +328 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpClientRequest.ts +968 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpClientResponse.ts +408 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpEffect.ts +400 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpIncomingMessage.ts +153 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpMethod.ts +124 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpMiddleware.ts +394 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpPlatform.ts +165 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpRouter.ts +1341 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpServer.ts +329 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpServerError.ts +374 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpServerRequest.ts +1081 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpServerRespondable.ts +115 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpServerResponse.ts +1381 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpStaticServer.ts +464 -0
- package/repos/effect/packages/effect/src/unstable/http/HttpTraceContext.ts +160 -0
- package/repos/effect/packages/effect/src/unstable/http/Multipart.ts +830 -0
- package/repos/effect/packages/effect/src/unstable/http/Multipasta/HeadersParser.ts +14 -0
- package/repos/effect/packages/effect/src/unstable/http/Multipasta/Node.ts +14 -0
- package/repos/effect/packages/effect/src/unstable/http/Multipasta/Search.ts +14 -0
- package/repos/effect/packages/effect/src/unstable/http/Multipasta/Web.ts +14 -0
- package/repos/effect/packages/effect/src/unstable/http/Multipasta.ts +15 -0
- package/repos/effect/packages/effect/src/unstable/http/Template.ts +262 -0
- package/repos/effect/packages/effect/src/unstable/http/Url.ts +330 -0
- package/repos/effect/packages/effect/src/unstable/http/UrlParams.ts +678 -0
- package/repos/effect/packages/effect/src/unstable/http/index.ts +145 -0
- package/repos/effect/packages/effect/src/unstable/http/internal/preResponseHandler.ts +15 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/HttpApi.ts +316 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiBuilder.ts +1015 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiClient.ts +1005 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiEndpoint.ts +1545 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiError.ts +443 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiGroup.ts +381 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiMiddleware.ts +478 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiScalar.ts +267 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiSchema.ts +733 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiSecurity.ts +244 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiSwagger.ts +68 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiTest.ts +112 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/OpenApi.ts +1098 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/index.ts +70 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/internal/html.ts +18 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/internal/httpApiScalar.ts +5 -0
- package/repos/effect/packages/effect/src/unstable/httpapi/internal/httpApiSwagger.ts +9 -0
- package/repos/effect/packages/effect/src/unstable/observability/Otlp.ts +172 -0
- package/repos/effect/packages/effect/src/unstable/observability/OtlpExporter.ts +149 -0
- package/repos/effect/packages/effect/src/unstable/observability/OtlpLogger.ts +340 -0
- package/repos/effect/packages/effect/src/unstable/observability/OtlpMetrics.ts +826 -0
- package/repos/effect/packages/effect/src/unstable/observability/OtlpResource.ts +288 -0
- package/repos/effect/packages/effect/src/unstable/observability/OtlpSerialization.ts +66 -0
- package/repos/effect/packages/effect/src/unstable/observability/OtlpTracer.ts +442 -0
- package/repos/effect/packages/effect/src/unstable/observability/PrometheusMetrics.ts +468 -0
- package/repos/effect/packages/effect/src/unstable/observability/index.ts +45 -0
- package/repos/effect/packages/effect/src/unstable/observability/internal/otlpEnv.ts +39 -0
- package/repos/effect/packages/effect/src/unstable/observability/internal/otlpProtobuf.ts +779 -0
- package/repos/effect/packages/effect/src/unstable/observability/internal/protobuf.ts +262 -0
- package/repos/effect/packages/effect/src/unstable/persistence/KeyValueStore.ts +864 -0
- package/repos/effect/packages/effect/src/unstable/persistence/Persistable.ts +252 -0
- package/repos/effect/packages/effect/src/unstable/persistence/PersistedCache.ts +111 -0
- package/repos/effect/packages/effect/src/unstable/persistence/PersistedQueue.ts +1196 -0
- package/repos/effect/packages/effect/src/unstable/persistence/Persistence.ts +1071 -0
- package/repos/effect/packages/effect/src/unstable/persistence/RateLimiter.ts +748 -0
- package/repos/effect/packages/effect/src/unstable/persistence/Redis.ts +188 -0
- package/repos/effect/packages/effect/src/unstable/persistence/index.ts +40 -0
- package/repos/effect/packages/effect/src/unstable/process/ChildProcess.ts +1036 -0
- package/repos/effect/packages/effect/src/unstable/process/ChildProcessSpawner.ts +285 -0
- package/repos/effect/packages/effect/src/unstable/process/index.ts +15 -0
- package/repos/effect/packages/effect/src/unstable/reactivity/AsyncResult.ts +1081 -0
- package/repos/effect/packages/effect/src/unstable/reactivity/Atom.ts +2520 -0
- package/repos/effect/packages/effect/src/unstable/reactivity/AtomHttpApi.ts +352 -0
- package/repos/effect/packages/effect/src/unstable/reactivity/AtomRef.ts +352 -0
- package/repos/effect/packages/effect/src/unstable/reactivity/AtomRegistry.ts +1127 -0
- package/repos/effect/packages/effect/src/unstable/reactivity/AtomRpc.ts +305 -0
- package/repos/effect/packages/effect/src/unstable/reactivity/Hydration.ts +155 -0
- package/repos/effect/packages/effect/src/unstable/reactivity/Reactivity.ts +348 -0
- package/repos/effect/packages/effect/src/unstable/reactivity/index.ts +45 -0
- package/repos/effect/packages/effect/src/unstable/rpc/Rpc.ts +1255 -0
- package/repos/effect/packages/effect/src/unstable/rpc/RpcClient.ts +1370 -0
- package/repos/effect/packages/effect/src/unstable/rpc/RpcClientError.ts +57 -0
- package/repos/effect/packages/effect/src/unstable/rpc/RpcGroup.ts +409 -0
- package/repos/effect/packages/effect/src/unstable/rpc/RpcMessage.ts +402 -0
- package/repos/effect/packages/effect/src/unstable/rpc/RpcMiddleware.ts +344 -0
- package/repos/effect/packages/effect/src/unstable/rpc/RpcSchema.ts +97 -0
- package/repos/effect/packages/effect/src/unstable/rpc/RpcSerialization.ts +546 -0
- package/repos/effect/packages/effect/src/unstable/rpc/RpcServer.ts +1492 -0
- package/repos/effect/packages/effect/src/unstable/rpc/RpcTest.ts +56 -0
- package/repos/effect/packages/effect/src/unstable/rpc/RpcWorker.ts +118 -0
- package/repos/effect/packages/effect/src/unstable/rpc/Utils.ts +120 -0
- package/repos/effect/packages/effect/src/unstable/rpc/index.ts +65 -0
- package/repos/effect/packages/effect/src/unstable/schema/Model.ts +862 -0
- package/repos/effect/packages/effect/src/unstable/schema/VariantSchema.ts +604 -0
- package/repos/effect/packages/effect/src/unstable/schema/index.ts +15 -0
- package/repos/effect/packages/effect/src/unstable/socket/Socket.ts +911 -0
- package/repos/effect/packages/effect/src/unstable/socket/SocketServer.ts +147 -0
- package/repos/effect/packages/effect/src/unstable/socket/index.ts +15 -0
- package/repos/effect/packages/effect/src/unstable/sql/Migrator.ts +440 -0
- package/repos/effect/packages/effect/src/unstable/sql/SqlClient.ts +342 -0
- package/repos/effect/packages/effect/src/unstable/sql/SqlConnection.ts +83 -0
- package/repos/effect/packages/effect/src/unstable/sql/SqlError.ts +590 -0
- package/repos/effect/packages/effect/src/unstable/sql/SqlModel.ts +359 -0
- package/repos/effect/packages/effect/src/unstable/sql/SqlResolver.ts +380 -0
- package/repos/effect/packages/effect/src/unstable/sql/SqlSchema.ts +172 -0
- package/repos/effect/packages/effect/src/unstable/sql/SqlStream.ts +81 -0
- package/repos/effect/packages/effect/src/unstable/sql/Statement.ts +1500 -0
- package/repos/effect/packages/effect/src/unstable/sql/index.ts +50 -0
- package/repos/effect/packages/effect/src/unstable/workers/Transferable.ts +191 -0
- package/repos/effect/packages/effect/src/unstable/workers/Worker.ts +245 -0
- package/repos/effect/packages/effect/src/unstable/workers/WorkerError.ts +148 -0
- package/repos/effect/packages/effect/src/unstable/workers/WorkerRunner.ts +57 -0
- package/repos/effect/packages/effect/src/unstable/workers/index.ts +25 -0
- package/repos/effect/packages/effect/src/unstable/workflow/Activity.ts +322 -0
- package/repos/effect/packages/effect/src/unstable/workflow/DurableClock.ts +117 -0
- package/repos/effect/packages/effect/src/unstable/workflow/DurableDeferred.ts +653 -0
- package/repos/effect/packages/effect/src/unstable/workflow/DurableQueue.ts +360 -0
- package/repos/effect/packages/effect/src/unstable/workflow/Workflow.ts +898 -0
- package/repos/effect/packages/effect/src/unstable/workflow/WorkflowEngine.ts +759 -0
- package/repos/effect/packages/effect/src/unstable/workflow/WorkflowProxy.ts +212 -0
- package/repos/effect/packages/effect/src/unstable/workflow/WorkflowProxyServer.ts +151 -0
- package/repos/effect/packages/effect/src/unstable/workflow/index.ts +45 -0
- package/repos/effect/packages/effect/src/unstable/workflow/internal/crypto.ts +15 -0
- package/repos/effect/packages/effect/test/Array.test.ts +1579 -0
- package/repos/effect/packages/effect/test/AtomRef.test.ts +27 -0
- package/repos/effect/packages/effect/test/BigDecimal.test.ts +525 -0
- package/repos/effect/packages/effect/test/BigInt.test.ts +57 -0
- package/repos/effect/packages/effect/test/Boolean.test.ts +289 -0
- package/repos/effect/packages/effect/test/Brand.test.ts +160 -0
- package/repos/effect/packages/effect/test/Cache.test.ts +1423 -0
- package/repos/effect/packages/effect/test/Cause.test.ts +834 -0
- package/repos/effect/packages/effect/test/Channel.test.ts +556 -0
- package/repos/effect/packages/effect/test/Chunk.test.ts +874 -0
- package/repos/effect/packages/effect/test/Combiner.test.ts +42 -0
- package/repos/effect/packages/effect/test/Config.test.ts +1416 -0
- package/repos/effect/packages/effect/test/ConfigProvider.test.ts +726 -0
- package/repos/effect/packages/effect/test/Cron.test.ts +401 -0
- package/repos/effect/packages/effect/test/Crypto.test.ts +86 -0
- package/repos/effect/packages/effect/test/Data.test.ts +269 -0
- package/repos/effect/packages/effect/test/DateTime.test.ts +953 -0
- package/repos/effect/packages/effect/test/Deferred.test.ts +165 -0
- package/repos/effect/packages/effect/test/Duration.test.ts +679 -0
- package/repos/effect/packages/effect/test/Effect.test.ts +2658 -0
- package/repos/effect/packages/effect/test/EffectEager.test.ts +678 -0
- package/repos/effect/packages/effect/test/EffectKeepAlive.test.ts +71 -0
- package/repos/effect/packages/effect/test/Equal.test.ts +1278 -0
- package/repos/effect/packages/effect/test/Equivalence.test.ts +170 -0
- package/repos/effect/packages/effect/test/ExecutionPlan.test.ts +117 -0
- package/repos/effect/packages/effect/test/Exit.test.ts +12 -0
- package/repos/effect/packages/effect/test/Fiber.test.ts +9 -0
- package/repos/effect/packages/effect/test/FiberHandle.test.ts +146 -0
- package/repos/effect/packages/effect/test/FiberMap.test.ts +171 -0
- package/repos/effect/packages/effect/test/FiberSet.test.ts +119 -0
- package/repos/effect/packages/effect/test/Formatter.test.ts +247 -0
- package/repos/effect/packages/effect/test/Function.test.ts +333 -0
- package/repos/effect/packages/effect/test/Graph.test.ts +3505 -0
- package/repos/effect/packages/effect/test/HashMap.test.ts +618 -0
- package/repos/effect/packages/effect/test/HashSet.test.ts +298 -0
- package/repos/effect/packages/effect/test/HttpClient.test.ts +131 -0
- package/repos/effect/packages/effect/test/Iterable.test.ts +486 -0
- package/repos/effect/packages/effect/test/JsonPatch.test.ts +948 -0
- package/repos/effect/packages/effect/test/JsonPointer.test.ts +353 -0
- package/repos/effect/packages/effect/test/JsonSchema.test.ts +1253 -0
- package/repos/effect/packages/effect/test/Latch.test.ts +21 -0
- package/repos/effect/packages/effect/test/Layer.test.ts +648 -0
- package/repos/effect/packages/effect/test/LayerMap.test.ts +98 -0
- package/repos/effect/packages/effect/test/LogLevel.test.ts +28 -0
- package/repos/effect/packages/effect/test/Logger.test.ts +154 -0
- package/repos/effect/packages/effect/test/ManagedRuntime.test.ts +58 -0
- package/repos/effect/packages/effect/test/Match.test.ts +27 -0
- package/repos/effect/packages/effect/test/Metric.test.ts +682 -0
- package/repos/effect/packages/effect/test/Migrator.test.ts +69 -0
- package/repos/effect/packages/effect/test/MutableHashMap.test.ts +309 -0
- package/repos/effect/packages/effect/test/MutableHashSet.test.ts +10 -0
- package/repos/effect/packages/effect/test/MutableList.test.ts +58 -0
- package/repos/effect/packages/effect/test/Newtype.test.ts +90 -0
- package/repos/effect/packages/effect/test/Number.test.ts +422 -0
- package/repos/effect/packages/effect/test/Optic.test.ts +452 -0
- package/repos/effect/packages/effect/test/Option.test.ts +564 -0
- package/repos/effect/packages/effect/test/Order.test.ts +163 -0
- package/repos/effect/packages/effect/test/Ordering.test.ts +18 -0
- package/repos/effect/packages/effect/test/PartitionedSemaphore.test.ts +74 -0
- package/repos/effect/packages/effect/test/Pathfinding.test.ts +426 -0
- package/repos/effect/packages/effect/test/Pool.test.ts +422 -0
- package/repos/effect/packages/effect/test/Predicate.test.ts +555 -0
- package/repos/effect/packages/effect/test/PubSub.test.ts +538 -0
- package/repos/effect/packages/effect/test/Queue.test.ts +317 -0
- package/repos/effect/packages/effect/test/Random.test.ts +238 -0
- package/repos/effect/packages/effect/test/RcMap.test.ts +237 -0
- package/repos/effect/packages/effect/test/RcRef.test.ts +97 -0
- package/repos/effect/packages/effect/test/Record.test.ts +395 -0
- package/repos/effect/packages/effect/test/Redacted.test.ts +59 -0
- package/repos/effect/packages/effect/test/Reducer.test.ts +12 -0
- package/repos/effect/packages/effect/test/Ref.test.ts +187 -0
- package/repos/effect/packages/effect/test/Request.test.ts +305 -0
- package/repos/effect/packages/effect/test/Resource.test.ts +59 -0
- package/repos/effect/packages/effect/test/Result.test.ts +517 -0
- package/repos/effect/packages/effect/test/Schedule.test.ts +395 -0
- package/repos/effect/packages/effect/test/Scheduler.test.ts +70 -0
- package/repos/effect/packages/effect/test/Scope.test.ts +19 -0
- package/repos/effect/packages/effect/test/ScopedCache.test.ts +2316 -0
- package/repos/effect/packages/effect/test/ScopedRef.test.ts +80 -0
- package/repos/effect/packages/effect/test/Semaphore.test.ts +469 -0
- package/repos/effect/packages/effect/test/Sink.test.ts +230 -0
- package/repos/effect/packages/effect/test/Stream.test.ts +4712 -0
- package/repos/effect/packages/effect/test/String.test.ts +690 -0
- package/repos/effect/packages/effect/test/Struct.test.ts +216 -0
- package/repos/effect/packages/effect/test/SubscriptionRef.test.ts +90 -0
- package/repos/effect/packages/effect/test/Symbol.test.ts +50 -0
- package/repos/effect/packages/effect/test/SynchronizedRef.test.ts +105 -0
- package/repos/effect/packages/effect/test/TestClock.test.ts +71 -0
- package/repos/effect/packages/effect/test/Tracer.test.ts +410 -0
- package/repos/effect/packages/effect/test/Trie.test.ts +531 -0
- package/repos/effect/packages/effect/test/Tuple.test.ts +127 -0
- package/repos/effect/packages/effect/test/TxChunk.test.ts +342 -0
- package/repos/effect/packages/effect/test/TxDeferred.test.ts +197 -0
- package/repos/effect/packages/effect/test/TxHashMap.test.ts +963 -0
- package/repos/effect/packages/effect/test/TxHashSet.test.ts +442 -0
- package/repos/effect/packages/effect/test/TxPriorityQueue.test.ts +187 -0
- package/repos/effect/packages/effect/test/TxPubSub.test.ts +391 -0
- package/repos/effect/packages/effect/test/TxQueue.test.ts +1260 -0
- package/repos/effect/packages/effect/test/TxReentrantLock.test.ts +413 -0
- package/repos/effect/packages/effect/test/TxSemaphore.test.ts +283 -0
- package/repos/effect/packages/effect/test/TxSubscriptionRef.test.ts +197 -0
- package/repos/effect/packages/effect/test/UndefinedOr.test.ts +65 -0
- package/repos/effect/packages/effect/test/cluster/ClusterWorkflowEngine.test.ts +652 -0
- package/repos/effect/packages/effect/test/cluster/Entity.test.ts +81 -0
- package/repos/effect/packages/effect/test/cluster/K8sHttpClient.test.ts +34 -0
- package/repos/effect/packages/effect/test/cluster/MessageStorage.test.ts +196 -0
- package/repos/effect/packages/effect/test/cluster/Sharding.test.ts +578 -0
- package/repos/effect/packages/effect/test/cluster/TestEntity.ts +132 -0
- package/repos/effect/packages/effect/test/reactivity/AsyncResult.test.ts +41 -0
- package/repos/effect/packages/effect/test/reactivity/Atom.test.ts +2551 -0
- package/repos/effect/packages/effect/test/reactivity/AtomHttpApi.test.ts +86 -0
- package/repos/effect/packages/effect/test/reactivity/AtomRpc.test.ts +70 -0
- package/repos/effect/packages/effect/test/rpc/Rpc.test.ts +73 -0
- package/repos/effect/packages/effect/test/rpc/RpcClient.test.ts +58 -0
- package/repos/effect/packages/effect/test/rpc/RpcSerialization.test.ts +171 -0
- package/repos/effect/packages/effect/test/schema/HMR.test.ts +72 -0
- package/repos/effect/packages/effect/test/schema/Schema.test.ts +9133 -0
- package/repos/effect/packages/effect/test/schema/SchemaAST.test.ts +280 -0
- package/repos/effect/packages/effect/test/schema/SchemaGetter.test.ts +383 -0
- package/repos/effect/packages/effect/test/schema/SchemaIssue.test.ts +9 -0
- package/repos/effect/packages/effect/test/schema/SchemaParser.test.ts +323 -0
- package/repos/effect/packages/effect/test/schema/fixtures/HMR-Class.ts +5 -0
- package/repos/effect/packages/effect/test/schema/fixtures/HMR-sanity-check.ts +3 -0
- package/repos/effect/packages/effect/test/schema/representation/fromASTs.test.ts +820 -0
- package/repos/effect/packages/effect/test/schema/representation/fromJsonSchemaDocument.test.ts +2137 -0
- package/repos/effect/packages/effect/test/schema/representation/toCodeDocument.test.ts +2089 -0
- package/repos/effect/packages/effect/test/schema/representation/toJsonSchemaMultiDocument.test.ts +39 -0
- package/repos/effect/packages/effect/test/schema/representation/toSchema.test.ts +506 -0
- package/repos/effect/packages/effect/test/schema/toArbitrary.test.ts +1693 -0
- package/repos/effect/packages/effect/test/schema/toCodec.test.ts +3149 -0
- package/repos/effect/packages/effect/test/schema/toDifferJsonPatch.test.ts +239 -0
- package/repos/effect/packages/effect/test/schema/toEquivalence.test.ts +519 -0
- package/repos/effect/packages/effect/test/schema/toFormatter.test.ts +565 -0
- package/repos/effect/packages/effect/test/schema/toIso.test.ts +394 -0
- package/repos/effect/packages/effect/test/schema/toJsonSchemaDocument.test.ts +3630 -0
- package/repos/effect/packages/effect/test/schema/toStandardJSONSchemaV1.test.ts +126 -0
- package/repos/effect/packages/effect/test/schema/toStandardSchemaV1.test.ts +495 -0
- package/repos/effect/packages/effect/test/schema/v3-v4.test.ts +250 -0
- package/repos/effect/packages/effect/test/testing/TestSchema.test.ts +78 -0
- package/repos/effect/packages/effect/test/unstable/ai/AiError.test.ts +823 -0
- package/repos/effect/packages/effect/test/unstable/ai/AnthropicStructuredOutput.test.ts +593 -0
- package/repos/effect/packages/effect/test/unstable/ai/Chat.test.ts +147 -0
- package/repos/effect/packages/effect/test/unstable/ai/EmbeddingModel.test.ts +185 -0
- package/repos/effect/packages/effect/test/unstable/ai/LanguageModel.test.ts +1714 -0
- package/repos/effect/packages/effect/test/unstable/ai/LanguageModelTrackerLifecycle.test.ts +413 -0
- package/repos/effect/packages/effect/test/unstable/ai/McpServer.test.ts +82 -0
- package/repos/effect/packages/effect/test/unstable/ai/Model.test.ts +16 -0
- package/repos/effect/packages/effect/test/unstable/ai/OpenAiStructuredOutput.test.ts +723 -0
- package/repos/effect/packages/effect/test/unstable/ai/Prompt.test.ts +346 -0
- package/repos/effect/packages/effect/test/unstable/ai/ResponseIdTracker.test.ts +424 -0
- package/repos/effect/packages/effect/test/unstable/ai/Tool.test.ts +1264 -0
- package/repos/effect/packages/effect/test/unstable/ai/utils.ts +68 -0
- package/repos/effect/packages/effect/test/unstable/cli/Arguments.test.ts +390 -0
- package/repos/effect/packages/effect/test/unstable/cli/Command.test.ts +1801 -0
- package/repos/effect/packages/effect/test/unstable/cli/Errors.test.ts +150 -0
- package/repos/effect/packages/effect/test/unstable/cli/Help.test.ts +572 -0
- package/repos/effect/packages/effect/test/unstable/cli/LogLevel.test.ts +202 -0
- package/repos/effect/packages/effect/test/unstable/cli/Param.test.ts +391 -0
- package/repos/effect/packages/effect/test/unstable/cli/Primitive.test.ts +321 -0
- package/repos/effect/packages/effect/test/unstable/cli/Prompt.test.ts +597 -0
- package/repos/effect/packages/effect/test/unstable/cli/completions/completions.test.ts +656 -0
- package/repos/effect/packages/effect/test/unstable/cli/completions/descriptor.test.ts +245 -0
- package/repos/effect/packages/effect/test/unstable/cli/fixtures/ComprehensiveCli.ts +422 -0
- package/repos/effect/packages/effect/test/unstable/cli/services/MockTerminal.ts +135 -0
- package/repos/effect/packages/effect/test/unstable/cli/services/TestActions.ts +36 -0
- package/repos/effect/packages/effect/test/unstable/encoding/Ndjson.test.ts +18 -0
- package/repos/effect/packages/effect/test/unstable/encoding/Sse.test.ts +62 -0
- package/repos/effect/packages/effect/test/unstable/eventlog/EventJournal.test.ts +25 -0
- package/repos/effect/packages/effect/test/unstable/eventlog/EventLog.test.ts +104 -0
- package/repos/effect/packages/effect/test/unstable/eventlog/EventLogIdentityDerivation.test.ts +85 -0
- package/repos/effect/packages/effect/test/unstable/eventlog/EventLogRemote.test.ts +176 -0
- package/repos/effect/packages/effect/test/unstable/eventlog/EventLogSessionAuth.test.ts +130 -0
- package/repos/effect/packages/effect/test/unstable/eventlog/SqlEventLogServerUnencryptedStorageTest.ts +169 -0
- package/repos/effect/packages/effect/test/unstable/http/Cookies.test.ts +80 -0
- package/repos/effect/packages/effect/test/unstable/http/Headers.test.ts +73 -0
- package/repos/effect/packages/effect/test/unstable/http/HttpClient.test.ts +306 -0
- package/repos/effect/packages/effect/test/unstable/http/HttpClientRequest.test.ts +164 -0
- package/repos/effect/packages/effect/test/unstable/http/HttpEffect.test.ts +254 -0
- package/repos/effect/packages/effect/test/unstable/http/HttpMiddleware.test.ts +57 -0
- package/repos/effect/packages/effect/test/unstable/http/HttpServerError.test.ts +121 -0
- package/repos/effect/packages/effect/test/unstable/http/HttpServerRequest.test.ts +157 -0
- package/repos/effect/packages/effect/test/unstable/http/HttpServerResponse.test.ts +76 -0
- package/repos/effect/packages/effect/test/unstable/http/Multipart.test.ts +69 -0
- package/repos/effect/packages/effect/test/unstable/http/Url.test.ts +98 -0
- package/repos/effect/packages/effect/test/unstable/http/UrlParams.test.ts +30 -0
- package/repos/effect/packages/effect/test/unstable/httpapi/HttpApiBuilder.test.ts +186 -0
- package/repos/effect/packages/effect/test/unstable/httpapi/HttpApiClient.test.ts +446 -0
- package/repos/effect/packages/effect/test/unstable/httpapi/HttpApiEndpoint.test.ts +160 -0
- package/repos/effect/packages/effect/test/unstable/httpapi/HttpApiSchema.test.ts +108 -0
- package/repos/effect/packages/effect/test/unstable/httpapi/HttpApiSecurity.test.ts +41 -0
- package/repos/effect/packages/effect/test/unstable/httpapi/OpenApi.test.ts +39 -0
- package/repos/effect/packages/effect/test/unstable/observability/OtlpConfig.test.ts +151 -0
- package/repos/effect/packages/effect/test/unstable/observability/OtlpExporter.test.ts +108 -0
- package/repos/effect/packages/effect/test/unstable/observability/OtlpMetrics.test.ts +518 -0
- package/repos/effect/packages/effect/test/unstable/observability/OtlpResource.test.ts +84 -0
- package/repos/effect/packages/effect/test/unstable/observability/PrometheusMetrics.test.ts +417 -0
- package/repos/effect/packages/effect/test/unstable/persistence/KeyValueStore.test.ts +164 -0
- package/repos/effect/packages/effect/test/unstable/persistence/KeyValueStoreTest.ts +85 -0
- package/repos/effect/packages/effect/test/unstable/persistence/PersistedCache.test.ts +4 -0
- package/repos/effect/packages/effect/test/unstable/persistence/PersistedCacheTest.ts +111 -0
- package/repos/effect/packages/effect/test/unstable/persistence/PersistedQueue.test.ts +4 -0
- package/repos/effect/packages/effect/test/unstable/persistence/PersistedQueueTest.ts +106 -0
- package/repos/effect/packages/effect/test/unstable/persistence/RateLimiter.test.ts +145 -0
- package/repos/effect/packages/effect/test/unstable/persistence/Redis.test.ts +43 -0
- package/repos/effect/packages/effect/test/unstable/process/ChildProcess.test.ts +352 -0
- package/repos/effect/packages/effect/test/unstable/schema/VariantSchema.test.ts +72 -0
- package/repos/effect/packages/effect/test/unstable/sql/SqlError.test.ts +228 -0
- package/repos/effect/packages/effect/test/unstable/sql/SqlSchema.test.ts +168 -0
- package/repos/effect/packages/effect/test/unstable/workers/WorkerError.test.ts +90 -0
- package/repos/effect/packages/effect/test/unstable/workflow/DurableQueue.test.ts +105 -0
- package/repos/effect/packages/effect/test/unstable/workflow/WorkflowEngine.test.ts +60 -0
- package/repos/effect/packages/effect/test/utils/assert.ts +182 -0
- package/repos/effect/packages/effect/test/utils/chunkCoordination.ts +36 -0
- package/repos/effect/packages/effect/test/utils/counter.ts +54 -0
- package/repos/effect/packages/effect/tsconfig.json +8 -0
- package/repos/effect/packages/effect/typetest/AiError.tst.ts +49 -0
- package/repos/effect/packages/effect/typetest/Array.tst.ts +1289 -0
- package/repos/effect/packages/effect/typetest/Brand.tst.ts +51 -0
- package/repos/effect/packages/effect/typetest/Channel.tst.ts +112 -0
- package/repos/effect/packages/effect/typetest/Config.tst.ts +31 -0
- package/repos/effect/packages/effect/typetest/Data.tst.ts +121 -0
- package/repos/effect/packages/effect/typetest/Effect.tst.ts +976 -0
- package/repos/effect/packages/effect/typetest/Equivalence.tst.ts +19 -0
- package/repos/effect/packages/effect/typetest/Newtype.tst.ts +72 -0
- package/repos/effect/packages/effect/typetest/Optic.tst.ts +130 -0
- package/repos/effect/packages/effect/typetest/Option.tst.ts +72 -0
- package/repos/effect/packages/effect/typetest/Order.tst.ts +19 -0
- package/repos/effect/packages/effect/typetest/Predicate.tst.ts +251 -0
- package/repos/effect/packages/effect/typetest/Result.tst.ts +353 -0
- package/repos/effect/packages/effect/typetest/Schedule.tst.ts +21 -0
- package/repos/effect/packages/effect/typetest/Stream.tst.ts +197 -0
- package/repos/effect/packages/effect/typetest/Struct.tst.ts +422 -0
- package/repos/effect/packages/effect/typetest/Tuple.tst.ts +177 -0
- package/repos/effect/packages/effect/typetest/Types.tst.ts +364 -0
- package/repos/effect/packages/effect/typetest/VariantSchema.tst.ts +76 -0
- package/repos/effect/packages/effect/typetest/schema/Array.tst.ts +46 -0
- package/repos/effect/packages/effect/typetest/schema/Literals.tst.ts +58 -0
- package/repos/effect/packages/effect/typetest/schema/Record.tst.ts +145 -0
- package/repos/effect/packages/effect/typetest/schema/Schema.tst.ts +1854 -0
- package/repos/effect/packages/effect/typetest/schema/Struct.tst.ts +745 -0
- package/repos/effect/packages/effect/typetest/schema/Tuple.tst.ts +199 -0
- package/repos/effect/packages/effect/typetest/schema/Union.tst.ts +198 -0
- package/repos/effect/packages/effect/typetest/schema/api.tst.ts +276 -0
- package/repos/effect/packages/effect/typetest/schema/toArbitrary.tst.ts +65 -0
- package/repos/effect/packages/effect/typetest/schema/toIso.tst.ts +282 -0
- package/repos/effect/packages/effect/typetest/unstable/ai/LanguageModel.tst.ts +191 -0
- package/repos/effect/packages/effect/typetest/unstable/ai/Tool.tst.ts +33 -0
- package/repos/effect/packages/effect/typetest/unstable/cli/Command.tst.ts +124 -0
- package/repos/effect/packages/effect/typetest/unstable/cli/Param.tst.ts +20 -0
- package/repos/effect/packages/effect/typetest/unstable/cli/Prompt.tst.ts +97 -0
- package/repos/effect/packages/effect/typetest/unstable/encoding/Ndjson.tst.ts +24 -0
- package/repos/effect/packages/effect/typetest/unstable/http/HttpClient.tst.ts +143 -0
- package/repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiBuilder.tst.ts +98 -0
- package/repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiClient.tst.ts +677 -0
- package/repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiEndpoint.tst.ts +466 -0
- package/repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiMiddleware.tst.ts +90 -0
- package/repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiSchema.tst.ts +135 -0
- package/repos/effect/packages/effect/typetest/unstable/reactivity/AsyncResult.tst.ts +65 -0
- package/repos/effect/packages/effect/typetest/unstable/reactivity/AtomHttpApi.tst.ts +63 -0
- package/repos/effect/packages/effect/typetest/unstable/rpc/Rpc.tst.ts +74 -0
- package/repos/effect/packages/effect/typetest/unstable/rpc/RpcGroup.tst.ts +61 -0
- package/repos/effect/packages/effect/typetest/unstable/rpc/RpcMiddleware.tst.ts +41 -0
- package/repos/effect/packages/effect/typetest/unstable/rpc/RpcServer.tst.ts +26 -0
- package/repos/effect/packages/effect/typetest/unstable/sql/SqlSchema.tst.ts +75 -0
- package/repos/effect/packages/effect/typetest/unstable/workflow/Workflow.tst.ts +16 -0
- package/repos/effect/packages/effect/vitest.config.ts +11 -0
- package/repos/effect/packages/opentelemetry/CHANGELOG.md +620 -0
- package/repos/effect/packages/opentelemetry/LICENSE +21 -0
- package/repos/effect/packages/opentelemetry/README.md +5 -0
- package/repos/effect/packages/opentelemetry/docgen.json +30 -0
- package/repos/effect/packages/opentelemetry/package.json +126 -0
- package/repos/effect/packages/opentelemetry/src/Logger.ts +193 -0
- package/repos/effect/packages/opentelemetry/src/Metrics.ts +138 -0
- package/repos/effect/packages/opentelemetry/src/NodeSdk.ts +162 -0
- package/repos/effect/packages/opentelemetry/src/Resource.ts +147 -0
- package/repos/effect/packages/opentelemetry/src/Tracer.ts +594 -0
- package/repos/effect/packages/opentelemetry/src/WebSdk.ts +140 -0
- package/repos/effect/packages/opentelemetry/src/index.ts +35 -0
- package/repos/effect/packages/opentelemetry/src/internal/attributes.ts +28 -0
- package/repos/effect/packages/opentelemetry/src/internal/metrics.ts +463 -0
- package/repos/effect/packages/opentelemetry/src/internal/utilities.ts +5 -0
- package/repos/effect/packages/opentelemetry/test/Logger.test.ts +122 -0
- package/repos/effect/packages/opentelemetry/test/Metrics.test.ts +339 -0
- package/repos/effect/packages/opentelemetry/test/Tracer.test.ts +167 -0
- package/repos/effect/packages/opentelemetry/tsconfig.json +8 -0
- package/repos/effect/packages/opentelemetry/vitest.config.ts +6 -0
- package/repos/effect/packages/platform-browser/CHANGELOG.md +637 -0
- package/repos/effect/packages/platform-browser/LICENSE +21 -0
- package/repos/effect/packages/platform-browser/README.md +1 -0
- package/repos/effect/packages/platform-browser/docgen.json +21 -0
- package/repos/effect/packages/platform-browser/package.json +74 -0
- package/repos/effect/packages/platform-browser/src/BrowserCrypto.ts +97 -0
- package/repos/effect/packages/platform-browser/src/BrowserHttpClient.ts +430 -0
- package/repos/effect/packages/platform-browser/src/BrowserKeyValueStore.ts +177 -0
- package/repos/effect/packages/platform-browser/src/BrowserPersistence.ts +334 -0
- package/repos/effect/packages/platform-browser/src/BrowserRuntime.ts +53 -0
- package/repos/effect/packages/platform-browser/src/BrowserSocket.ts +52 -0
- package/repos/effect/packages/platform-browser/src/BrowserStream.ts +56 -0
- package/repos/effect/packages/platform-browser/src/BrowserWorker.ts +98 -0
- package/repos/effect/packages/platform-browser/src/BrowserWorkerRunner.ts +199 -0
- package/repos/effect/packages/platform-browser/src/Clipboard.ts +143 -0
- package/repos/effect/packages/platform-browser/src/Geolocation.ts +233 -0
- package/repos/effect/packages/platform-browser/src/IndexedDb.ts +113 -0
- package/repos/effect/packages/platform-browser/src/IndexedDbDatabase.ts +648 -0
- package/repos/effect/packages/platform-browser/src/IndexedDbQueryBuilder.ts +2032 -0
- package/repos/effect/packages/platform-browser/src/IndexedDbTable.ts +260 -0
- package/repos/effect/packages/platform-browser/src/IndexedDbVersion.ts +138 -0
- package/repos/effect/packages/platform-browser/src/Permissions.ts +146 -0
- package/repos/effect/packages/platform-browser/src/index.ts +90 -0
- package/repos/effect/packages/platform-browser/test/BrowserCrypto.test.ts +74 -0
- package/repos/effect/packages/platform-browser/test/BrowserHttpClient.test.ts +91 -0
- package/repos/effect/packages/platform-browser/test/BrowserKeyValueStore.test.ts +23 -0
- package/repos/effect/packages/platform-browser/test/BrowserPersistence.test.ts +209 -0
- package/repos/effect/packages/platform-browser/test/BrowserPersistencePersistedCache.test.ts +29 -0
- package/repos/effect/packages/platform-browser/test/IndexedDbDatabase.test.ts +253 -0
- package/repos/effect/packages/platform-browser/test/IndexedDbQueryBuilder.test.ts +1459 -0
- package/repos/effect/packages/platform-browser/test/IndexedDbTable.test.ts +101 -0
- package/repos/effect/packages/platform-browser/test/IndexedDbVersion.test.ts +50 -0
- package/repos/effect/packages/platform-browser/test/Permissions.test.ts +12 -0
- package/repos/effect/packages/platform-browser/test/RpcWorker.test.ts +19 -0
- package/repos/effect/packages/platform-browser/test/fixtures/rpc-e2e.ts +141 -0
- package/repos/effect/packages/platform-browser/test/fixtures/rpc-schemas.ts +157 -0
- package/repos/effect/packages/platform-browser/test/fixtures/rpc-worker.ts +12 -0
- package/repos/effect/packages/platform-browser/tsconfig.json +8 -0
- package/repos/effect/packages/platform-browser/vitest.config.ts +17 -0
- package/repos/effect/packages/platform-browser/vitest.setup.ts +5 -0
- package/repos/effect/packages/platform-bun/CHANGELOG.md +691 -0
- package/repos/effect/packages/platform-bun/LICENSE +21 -0
- package/repos/effect/packages/platform-bun/README.md +7 -0
- package/repos/effect/packages/platform-bun/docgen.json +20 -0
- package/repos/effect/packages/platform-bun/package.json +73 -0
- package/repos/effect/packages/platform-bun/src/BunChildProcessSpawner.ts +6 -0
- package/repos/effect/packages/platform-bun/src/BunClusterHttp.ts +174 -0
- package/repos/effect/packages/platform-bun/src/BunClusterSocket.ts +153 -0
- package/repos/effect/packages/platform-bun/src/BunCrypto.ts +24 -0
- package/repos/effect/packages/platform-bun/src/BunFileSystem.ts +20 -0
- package/repos/effect/packages/platform-bun/src/BunHttpClient.ts +9 -0
- package/repos/effect/packages/platform-bun/src/BunHttpPlatform.ts +50 -0
- package/repos/effect/packages/platform-bun/src/BunHttpServer.ts +600 -0
- package/repos/effect/packages/platform-bun/src/BunHttpServerRequest.ts +19 -0
- package/repos/effect/packages/platform-bun/src/BunMultipart.ts +54 -0
- package/repos/effect/packages/platform-bun/src/BunPath.ts +37 -0
- package/repos/effect/packages/platform-bun/src/BunRedis.ts +88 -0
- package/repos/effect/packages/platform-bun/src/BunRuntime.ts +52 -0
- package/repos/effect/packages/platform-bun/src/BunServices.ts +49 -0
- package/repos/effect/packages/platform-bun/src/BunSink.ts +8 -0
- package/repos/effect/packages/platform-bun/src/BunSocket.ts +54 -0
- package/repos/effect/packages/platform-bun/src/BunSocketServer.ts +8 -0
- package/repos/effect/packages/platform-bun/src/BunStdio.ts +22 -0
- package/repos/effect/packages/platform-bun/src/BunStream.ts +68 -0
- package/repos/effect/packages/platform-bun/src/BunTerminal.ts +32 -0
- package/repos/effect/packages/platform-bun/src/BunWorker.ts +92 -0
- package/repos/effect/packages/platform-bun/src/BunWorkerRunner.ts +113 -0
- package/repos/effect/packages/platform-bun/src/index.ts +115 -0
- package/repos/effect/packages/platform-bun/tsconfig.json +12 -0
- package/repos/effect/packages/platform-node/CHANGELOG.md +695 -0
- package/repos/effect/packages/platform-node/LICENSE +21 -0
- package/repos/effect/packages/platform-node/README.md +7 -0
- package/repos/effect/packages/platform-node/docgen.json +24 -0
- package/repos/effect/packages/platform-node/package.json +82 -0
- package/repos/effect/packages/platform-node/src/Mime.ts +25 -0
- package/repos/effect/packages/platform-node/src/NodeChildProcessSpawner.ts +6 -0
- package/repos/effect/packages/platform-node/src/NodeClusterHttp.ts +155 -0
- package/repos/effect/packages/platform-node/src/NodeClusterSocket.ts +176 -0
- package/repos/effect/packages/platform-node/src/NodeCrypto.ts +24 -0
- package/repos/effect/packages/platform-node/src/NodeFileSystem.ts +21 -0
- package/repos/effect/packages/platform-node/src/NodeHttpClient.ts +664 -0
- package/repos/effect/packages/platform-node/src/NodeHttpIncomingMessage.ts +141 -0
- package/repos/effect/packages/platform-node/src/NodeHttpPlatform.ts +70 -0
- package/repos/effect/packages/platform-node/src/NodeHttpServer.ts +646 -0
- package/repos/effect/packages/platform-node/src/NodeHttpServerRequest.ts +33 -0
- package/repos/effect/packages/platform-node/src/NodeMultipart.ts +183 -0
- package/repos/effect/packages/platform-node/src/NodePath.ts +40 -0
- package/repos/effect/packages/platform-node/src/NodeRedis.ts +92 -0
- package/repos/effect/packages/platform-node/src/NodeRuntime.ts +53 -0
- package/repos/effect/packages/platform-node/src/NodeServices.ts +50 -0
- package/repos/effect/packages/platform-node/src/NodeSink.ts +8 -0
- package/repos/effect/packages/platform-node/src/NodeSocket.ts +72 -0
- package/repos/effect/packages/platform-node/src/NodeSocketServer.ts +8 -0
- package/repos/effect/packages/platform-node/src/NodeStdio.ts +22 -0
- package/repos/effect/packages/platform-node/src/NodeStream.ts +8 -0
- package/repos/effect/packages/platform-node/src/NodeTerminal.ts +32 -0
- package/repos/effect/packages/platform-node/src/NodeWorker.ts +121 -0
- package/repos/effect/packages/platform-node/src/NodeWorkerRunner.ts +110 -0
- package/repos/effect/packages/platform-node/src/Undici.ts +29 -0
- package/repos/effect/packages/platform-node/src/index.ts +130 -0
- package/repos/effect/packages/platform-node/test/HttpApi.test.ts +1831 -0
- package/repos/effect/packages/platform-node/test/HttpStaticServer.test.ts +253 -0
- package/repos/effect/packages/platform-node/test/HttpStaticServerConditional.test.ts +296 -0
- package/repos/effect/packages/platform-node/test/NodeCrypto.test.ts +59 -0
- package/repos/effect/packages/platform-node/test/NodeHttpClient.test.ts +157 -0
- package/repos/effect/packages/platform-node/test/NodeHttpPlatform.test.ts +51 -0
- package/repos/effect/packages/platform-node/test/NodeHttpServer.test.ts +598 -0
- package/repos/effect/packages/platform-node/test/NodeRedis.test.ts +31 -0
- package/repos/effect/packages/platform-node/test/NodeSocket.test.ts +153 -0
- package/repos/effect/packages/platform-node/test/OpenApi.test.ts +1573 -0
- package/repos/effect/packages/platform-node/test/RpcServer.test.ts +213 -0
- package/repos/effect/packages/platform-node/test/__snapshots__/HttpApi.test.ts.snap +715 -0
- package/repos/effect/packages/platform-node/test/cluster/MessageStorageTest.ts +196 -0
- package/repos/effect/packages/platform-node/test/cluster/SocketRunner.test.ts +120 -0
- package/repos/effect/packages/platform-node/test/cluster/SqlMessageStorage.test.ts +222 -0
- package/repos/effect/packages/platform-node/test/cluster/SqlRunnerStorage.test.ts +101 -0
- package/repos/effect/packages/platform-node/test/fixtures/http-static-server/conditional.txt +1 -0
- package/repos/effect/packages/platform-node/test/fixtures/http-static-server/custom/home.html +1 -0
- package/repos/effect/packages/platform-node/test/fixtures/http-static-server/file.binx +1 -0
- package/repos/effect/packages/platform-node/test/fixtures/http-static-server/guide/index.html +1 -0
- package/repos/effect/packages/platform-node/test/fixtures/http-static-server/hello.txt +1 -0
- package/repos/effect/packages/platform-node/test/fixtures/http-static-server/index.html +1 -0
- package/repos/effect/packages/platform-node/test/fixtures/http-static-server/range.txt +1 -0
- package/repos/effect/packages/platform-node/test/fixtures/http-static-server-outside.txt +1 -0
- package/repos/effect/packages/platform-node/test/fixtures/mysql2-utils.ts +64 -0
- package/repos/effect/packages/platform-node/test/fixtures/pg-utils.ts +39 -0
- package/repos/effect/packages/platform-node/test/fixtures/rpc-e2e.ts +149 -0
- package/repos/effect/packages/platform-node/test/fixtures/rpc-schemas.ts +175 -0
- package/repos/effect/packages/platform-node/test/fixtures/text.txt +1 -0
- package/repos/effect/packages/platform-node/tsconfig.json +12 -0
- package/repos/effect/packages/platform-node/vitest.config.ts +6 -0
- package/repos/effect/packages/platform-node-shared/CHANGELOG.md +617 -0
- package/repos/effect/packages/platform-node-shared/LICENSE +21 -0
- package/repos/effect/packages/platform-node-shared/README.md +7 -0
- package/repos/effect/packages/platform-node-shared/docgen.json +38 -0
- package/repos/effect/packages/platform-node-shared/package.json +76 -0
- package/repos/effect/packages/platform-node-shared/src/NodeChildProcessSpawner.ts +713 -0
- package/repos/effect/packages/platform-node-shared/src/NodeClusterSocket.ts +70 -0
- package/repos/effect/packages/platform-node-shared/src/NodeCrypto.ts +60 -0
- package/repos/effect/packages/platform-node-shared/src/NodeFileSystem.ts +652 -0
- package/repos/effect/packages/platform-node-shared/src/NodePath.ts +80 -0
- package/repos/effect/packages/platform-node-shared/src/NodeRuntime.ts +59 -0
- package/repos/effect/packages/platform-node-shared/src/NodeSink.ts +116 -0
- package/repos/effect/packages/platform-node-shared/src/NodeSocket.ts +269 -0
- package/repos/effect/packages/platform-node-shared/src/NodeSocketServer.ts +301 -0
- package/repos/effect/packages/platform-node-shared/src/NodeStdio.ts +67 -0
- package/repos/effect/packages/platform-node-shared/src/NodeStream.ts +445 -0
- package/repos/effect/packages/platform-node-shared/src/NodeTerminal.ts +129 -0
- package/repos/effect/packages/platform-node-shared/src/index.ts +65 -0
- package/repos/effect/packages/platform-node-shared/src/internal/utils.ts +51 -0
- package/repos/effect/packages/platform-node-shared/test/NodeChildProcessSpawner.test.ts +1069 -0
- package/repos/effect/packages/platform-node-shared/test/NodeFileSystem.test.ts +214 -0
- package/repos/effect/packages/platform-node-shared/test/NodeSink.test.ts +153 -0
- package/repos/effect/packages/platform-node-shared/test/NodeStream.test.ts +173 -0
- package/repos/effect/packages/platform-node-shared/test/fixtures/bash/no-permissions.sh +3 -0
- package/repos/effect/packages/platform-node-shared/test/fixtures/bash/parent-exits-early.sh +31 -0
- package/repos/effect/packages/platform-node-shared/test/fixtures/bash/spawn-children.sh +32 -0
- package/repos/effect/packages/platform-node-shared/test/fixtures/config/SHOUTING +1 -0
- package/repos/effect/packages/platform-node-shared/test/fixtures/config/integer +1 -0
- package/repos/effect/packages/platform-node-shared/test/fixtures/config/nested/config +1 -0
- package/repos/effect/packages/platform-node-shared/test/fixtures/config/secret +1 -0
- package/repos/effect/packages/platform-node-shared/test/fixtures/helloworld.tar.gz +0 -0
- package/repos/effect/packages/platform-node-shared/test/fixtures/text.txt +1 -0
- package/repos/effect/packages/platform-node-shared/tsconfig.json +11 -0
- package/repos/effect/packages/platform-node-shared/vitest.config.ts +6 -0
- package/repos/effect/packages/sql/clickhouse/CHANGELOG.md +681 -0
- package/repos/effect/packages/sql/clickhouse/LICENSE +21 -0
- package/repos/effect/packages/sql/clickhouse/README.md +7 -0
- package/repos/effect/packages/sql/clickhouse/docgen.json +24 -0
- package/repos/effect/packages/sql/clickhouse/package.json +72 -0
- package/repos/effect/packages/sql/clickhouse/src/ClickhouseClient.ts +546 -0
- package/repos/effect/packages/sql/clickhouse/src/ClickhouseMigrator.ts +51 -0
- package/repos/effect/packages/sql/clickhouse/src/index.ts +15 -0
- package/repos/effect/packages/sql/clickhouse/test/Client.test.ts +6 -0
- package/repos/effect/packages/sql/clickhouse/test/SqlErrorClassification.test.ts +75 -0
- package/repos/effect/packages/sql/clickhouse/tsconfig.json +12 -0
- package/repos/effect/packages/sql/clickhouse/vitest.config.ts +6 -0
- package/repos/effect/packages/sql/d1/CHANGELOG.md +597 -0
- package/repos/effect/packages/sql/d1/LICENSE +21 -0
- package/repos/effect/packages/sql/d1/README.md +7 -0
- package/repos/effect/packages/sql/d1/docgen.json +24 -0
- package/repos/effect/packages/sql/d1/package.json +75 -0
- package/repos/effect/packages/sql/d1/src/D1Client.ts +249 -0
- package/repos/effect/packages/sql/d1/src/index.ts +10 -0
- package/repos/effect/packages/sql/d1/test/Client.test.ts +65 -0
- package/repos/effect/packages/sql/d1/test/Resolver.test.ts +176 -0
- package/repos/effect/packages/sql/d1/test/utils.ts +38 -0
- package/repos/effect/packages/sql/d1/tsconfig.json +8 -0
- package/repos/effect/packages/sql/d1/vitest.config.ts +6 -0
- package/repos/effect/packages/sql/libsql/CHANGELOG.md +601 -0
- package/repos/effect/packages/sql/libsql/LICENSE +21 -0
- package/repos/effect/packages/sql/libsql/README.md +7 -0
- package/repos/effect/packages/sql/libsql/docgen.json +24 -0
- package/repos/effect/packages/sql/libsql/package.json +73 -0
- package/repos/effect/packages/sql/libsql/src/LibsqlClient.ts +381 -0
- package/repos/effect/packages/sql/libsql/src/LibsqlMigrator.ts +46 -0
- package/repos/effect/packages/sql/libsql/src/index.ts +15 -0
- package/repos/effect/packages/sql/libsql/test/Client.test.ts +106 -0
- package/repos/effect/packages/sql/libsql/test/Resolver.test.ts +177 -0
- package/repos/effect/packages/sql/libsql/test/util.ts +54 -0
- package/repos/effect/packages/sql/libsql/tsconfig.json +9 -0
- package/repos/effect/packages/sql/libsql/vitest.config.ts +6 -0
- package/repos/effect/packages/sql/mssql/CHANGELOG.md +601 -0
- package/repos/effect/packages/sql/mssql/LICENSE +21 -0
- package/repos/effect/packages/sql/mssql/README.md +7 -0
- package/repos/effect/packages/sql/mssql/docgen.json +24 -0
- package/repos/effect/packages/sql/mssql/package.json +70 -0
- package/repos/effect/packages/sql/mssql/src/MssqlClient.ts +732 -0
- package/repos/effect/packages/sql/mssql/src/MssqlMigrator.ts +45 -0
- package/repos/effect/packages/sql/mssql/src/Parameter.ts +64 -0
- package/repos/effect/packages/sql/mssql/src/Procedure.ts +213 -0
- package/repos/effect/packages/sql/mssql/src/index.ts +32 -0
- package/repos/effect/packages/sql/mssql/test/Client.test.ts +91 -0
- package/repos/effect/packages/sql/mssql/test/SqlErrorClassification.test.ts +206 -0
- package/repos/effect/packages/sql/mssql/tsconfig.json +8 -0
- package/repos/effect/packages/sql/mssql/vitest.config.ts +6 -0
- package/repos/effect/packages/sql/mysql2/CHANGELOG.md +603 -0
- package/repos/effect/packages/sql/mysql2/LICENSE +21 -0
- package/repos/effect/packages/sql/mysql2/README.md +7 -0
- package/repos/effect/packages/sql/mysql2/docgen.json +24 -0
- package/repos/effect/packages/sql/mysql2/package.json +71 -0
- package/repos/effect/packages/sql/mysql2/src/MysqlClient.ts +517 -0
- package/repos/effect/packages/sql/mysql2/src/MysqlMigrator.ts +102 -0
- package/repos/effect/packages/sql/mysql2/src/index.ts +15 -0
- package/repos/effect/packages/sql/mysql2/test/Client.test.ts +34 -0
- package/repos/effect/packages/sql/mysql2/test/KeyValueStore.test.ts +16 -0
- package/repos/effect/packages/sql/mysql2/test/Model.test.ts +227 -0
- package/repos/effect/packages/sql/mysql2/test/MysqlClient.test.ts +35 -0
- package/repos/effect/packages/sql/mysql2/test/Persistence.test.ts +22 -0
- package/repos/effect/packages/sql/mysql2/test/SqlErrorClassification.test.ts +133 -0
- package/repos/effect/packages/sql/mysql2/test/SqlEventLogServerUnencrypted.test.ts +7 -0
- package/repos/effect/packages/sql/mysql2/test/utils.ts +64 -0
- package/repos/effect/packages/sql/mysql2/tsconfig.json +9 -0
- package/repos/effect/packages/sql/mysql2/vitest.config.ts +6 -0
- package/repos/effect/packages/sql/pg/CHANGELOG.md +3432 -0
- package/repos/effect/packages/sql/pg/LICENSE +21 -0
- package/repos/effect/packages/sql/pg/README.md +7 -0
- package/repos/effect/packages/sql/pg/docgen.json +24 -0
- package/repos/effect/packages/sql/pg/package.json +77 -0
- package/repos/effect/packages/sql/pg/src/PgClient.ts +947 -0
- package/repos/effect/packages/sql/pg/src/PgMigrator.ts +120 -0
- package/repos/effect/packages/sql/pg/src/index.ts +15 -0
- package/repos/effect/packages/sql/pg/test/Client.test.ts +373 -0
- package/repos/effect/packages/sql/pg/test/KeyValueStore.test.ts +16 -0
- package/repos/effect/packages/sql/pg/test/Persistence.test.ts +20 -0
- package/repos/effect/packages/sql/pg/test/SqlErrorClassification.test.ts +81 -0
- package/repos/effect/packages/sql/pg/test/SqlEventLogServerUnencrypted.test.ts +7 -0
- package/repos/effect/packages/sql/pg/test/TransactionAcquire.test.ts +52 -0
- package/repos/effect/packages/sql/pg/test/utils.ts +49 -0
- package/repos/effect/packages/sql/pg/tsconfig.json +9 -0
- package/repos/effect/packages/sql/pg/vitest.config.ts +6 -0
- package/repos/effect/packages/sql/pglite/CHANGELOG.md +198 -0
- package/repos/effect/packages/sql/pglite/LICENSE +21 -0
- package/repos/effect/packages/sql/pglite/README.md +7 -0
- package/repos/effect/packages/sql/pglite/docgen.json +24 -0
- package/repos/effect/packages/sql/pglite/package.json +74 -0
- package/repos/effect/packages/sql/pglite/src/PgliteClient.ts +503 -0
- package/repos/effect/packages/sql/pglite/src/PgliteMigrator.ts +44 -0
- package/repos/effect/packages/sql/pglite/src/index.ts +15 -0
- package/repos/effect/packages/sql/pglite/test/Client.test.ts +149 -0
- package/repos/effect/packages/sql/pglite/test/Migrator.test.ts +45 -0
- package/repos/effect/packages/sql/pglite/test/SqlErrorClassification.test.ts +56 -0
- package/repos/effect/packages/sql/pglite/test/Transaction.test.ts +62 -0
- package/repos/effect/packages/sql/pglite/tsconfig.json +8 -0
- package/repos/effect/packages/sql/pglite/vitest.config.ts +6 -0
- package/repos/effect/packages/sql/sqlite-bun/CHANGELOG.md +601 -0
- package/repos/effect/packages/sql/sqlite-bun/LICENSE +21 -0
- package/repos/effect/packages/sql/sqlite-bun/README.md +7 -0
- package/repos/effect/packages/sql/sqlite-bun/docgen.json +24 -0
- package/repos/effect/packages/sql/sqlite-bun/package.json +69 -0
- package/repos/effect/packages/sql/sqlite-bun/src/SqliteClient.ts +262 -0
- package/repos/effect/packages/sql/sqlite-bun/src/SqliteMigrator.ts +90 -0
- package/repos/effect/packages/sql/sqlite-bun/src/index.ts +15 -0
- package/repos/effect/packages/sql/sqlite-bun/test/Client.test.ts +6 -0
- package/repos/effect/packages/sql/sqlite-bun/tsconfig.json +11 -0
- package/repos/effect/packages/sql/sqlite-bun/vitest.config.ts +6 -0
- package/repos/effect/packages/sql/sqlite-do/CHANGELOG.md +601 -0
- package/repos/effect/packages/sql/sqlite-do/LICENSE +21 -0
- package/repos/effect/packages/sql/sqlite-do/README.md +7 -0
- package/repos/effect/packages/sql/sqlite-do/docgen.json +24 -0
- package/repos/effect/packages/sql/sqlite-do/package.json +68 -0
- package/repos/effect/packages/sql/sqlite-do/src/SqliteClient.ts +249 -0
- package/repos/effect/packages/sql/sqlite-do/src/SqliteMigrator.ts +45 -0
- package/repos/effect/packages/sql/sqlite-do/src/index.ts +15 -0
- package/repos/effect/packages/sql/sqlite-do/test/Client.test.ts +24 -0
- package/repos/effect/packages/sql/sqlite-do/tsconfig.json +8 -0
- package/repos/effect/packages/sql/sqlite-do/vitest.config.ts +6 -0
- package/repos/effect/packages/sql/sqlite-node/CHANGELOG.md +3415 -0
- package/repos/effect/packages/sql/sqlite-node/LICENSE +21 -0
- package/repos/effect/packages/sql/sqlite-node/README.md +7 -0
- package/repos/effect/packages/sql/sqlite-node/docgen.json +24 -0
- package/repos/effect/packages/sql/sqlite-node/package.json +72 -0
- package/repos/effect/packages/sql/sqlite-node/src/SqliteClient.ts +312 -0
- package/repos/effect/packages/sql/sqlite-node/src/SqliteMigrator.ts +90 -0
- package/repos/effect/packages/sql/sqlite-node/src/index.ts +15 -0
- package/repos/effect/packages/sql/sqlite-node/test/Client.test.ts +75 -0
- package/repos/effect/packages/sql/sqlite-node/test/KeyValueStore.test.ts +29 -0
- package/repos/effect/packages/sql/sqlite-node/test/Persistence.test.ts +109 -0
- package/repos/effect/packages/sql/sqlite-node/test/Resolver.test.ts +183 -0
- package/repos/effect/packages/sql/sqlite-node/test/SqlEventJournal.test.ts +84 -0
- package/repos/effect/packages/sql/sqlite-node/test/SqlEventLogServerEncrypted.test.ts +249 -0
- package/repos/effect/packages/sql/sqlite-node/test/SqlEventLogServerUnencrypted.test.ts +110 -0
- package/repos/effect/packages/sql/sqlite-node/test/SqliteMigrator.test.ts +48 -0
- package/repos/effect/packages/sql/sqlite-node/tsconfig.json +8 -0
- package/repos/effect/packages/sql/sqlite-node/vitest.config.ts +6 -0
- package/repos/effect/packages/sql/sqlite-react-native/CHANGELOG.md +601 -0
- package/repos/effect/packages/sql/sqlite-react-native/LICENSE +21 -0
- package/repos/effect/packages/sql/sqlite-react-native/README.md +7 -0
- package/repos/effect/packages/sql/sqlite-react-native/docgen.json +24 -0
- package/repos/effect/packages/sql/sqlite-react-native/package.json +69 -0
- package/repos/effect/packages/sql/sqlite-react-native/src/SqliteClient.ts +354 -0
- package/repos/effect/packages/sql/sqlite-react-native/src/SqliteMigrator.ts +55 -0
- package/repos/effect/packages/sql/sqlite-react-native/src/index.ts +15 -0
- package/repos/effect/packages/sql/sqlite-react-native/test/Client.test.ts +6 -0
- package/repos/effect/packages/sql/sqlite-react-native/tsconfig.json +8 -0
- package/repos/effect/packages/sql/sqlite-react-native/vitest.config.ts +6 -0
- package/repos/effect/packages/sql/sqlite-wasm/CHANGELOG.md +601 -0
- package/repos/effect/packages/sql/sqlite-wasm/LICENSE +21 -0
- package/repos/effect/packages/sql/sqlite-wasm/README.md +7 -0
- package/repos/effect/packages/sql/sqlite-wasm/docgen.json +24 -0
- package/repos/effect/packages/sql/sqlite-wasm/package.json +69 -0
- package/repos/effect/packages/sql/sqlite-wasm/src/OpfsWorker.ts +118 -0
- package/repos/effect/packages/sql/sqlite-wasm/src/SqliteClient.ts +551 -0
- package/repos/effect/packages/sql/sqlite-wasm/src/SqliteMigrator.ts +55 -0
- package/repos/effect/packages/sql/sqlite-wasm/src/index.ts +14 -0
- package/repos/effect/packages/sql/sqlite-wasm/src/internal/opfsWorker.ts +7 -0
- package/repos/effect/packages/sql/sqlite-wasm/src/sqlite-wasm.d.ts +47 -0
- package/repos/effect/packages/sql/sqlite-wasm/test/Client.test.ts +6 -0
- package/repos/effect/packages/sql/sqlite-wasm/tsconfig.json +8 -0
- package/repos/effect/packages/sql/sqlite-wasm/vitest.config.ts +6 -0
- package/repos/effect/packages/tools/ai-codegen/codegen.schema.json +92 -0
- package/repos/effect/packages/tools/ai-codegen/docgen.json +4 -0
- package/repos/effect/packages/tools/ai-codegen/package.json +61 -0
- package/repos/effect/packages/tools/ai-codegen/src/Config.ts +292 -0
- package/repos/effect/packages/tools/ai-codegen/src/Discovery.ts +197 -0
- package/repos/effect/packages/tools/ai-codegen/src/Generator.ts +183 -0
- package/repos/effect/packages/tools/ai-codegen/src/Glob.ts +56 -0
- package/repos/effect/packages/tools/ai-codegen/src/PostProcess.ts +157 -0
- package/repos/effect/packages/tools/ai-codegen/src/SpecFetcher.ts +154 -0
- package/repos/effect/packages/tools/ai-codegen/src/bin.ts +10 -0
- package/repos/effect/packages/tools/ai-codegen/src/main.ts +237 -0
- package/repos/effect/packages/tools/ai-codegen/tsconfig.json +15 -0
- package/repos/effect/packages/tools/ai-docgen/docgen.json +4 -0
- package/repos/effect/packages/tools/ai-docgen/package.json +60 -0
- package/repos/effect/packages/tools/ai-docgen/src/Glob.ts +48 -0
- package/repos/effect/packages/tools/ai-docgen/src/main.ts +186 -0
- package/repos/effect/packages/tools/ai-docgen/tsconfig.json +14 -0
- package/repos/effect/packages/tools/bundle/docgen.json +4 -0
- package/repos/effect/packages/tools/bundle/fixtures/basic.ts +3 -0
- package/repos/effect/packages/tools/bundle/fixtures/batching.ts +25 -0
- package/repos/effect/packages/tools/bundle/fixtures/brand.ts +5 -0
- package/repos/effect/packages/tools/bundle/fixtures/cache.ts +10 -0
- package/repos/effect/packages/tools/bundle/fixtures/config.ts +13 -0
- package/repos/effect/packages/tools/bundle/fixtures/differ.ts +9 -0
- package/repos/effect/packages/tools/bundle/fixtures/http-client.ts +12 -0
- package/repos/effect/packages/tools/bundle/fixtures/logger.ts +5 -0
- package/repos/effect/packages/tools/bundle/fixtures/metric.ts +13 -0
- package/repos/effect/packages/tools/bundle/fixtures/optic.ts +6 -0
- package/repos/effect/packages/tools/bundle/fixtures/pubsub.ts +22 -0
- package/repos/effect/packages/tools/bundle/fixtures/queue.ts +18 -0
- package/repos/effect/packages/tools/bundle/fixtures/schedule.ts +9 -0
- package/repos/effect/packages/tools/bundle/fixtures/schema-fromJsonSchemaDocument.ts +16 -0
- package/repos/effect/packages/tools/bundle/fixtures/schema-representation-roundtrip.ts +16 -0
- package/repos/effect/packages/tools/bundle/fixtures/schema-string-transformation.ts +20 -0
- package/repos/effect/packages/tools/bundle/fixtures/schema-string.ts +8 -0
- package/repos/effect/packages/tools/bundle/fixtures/schema-template-literal.ts +8 -0
- package/repos/effect/packages/tools/bundle/fixtures/schema-toArbitraryLazy.ts +9 -0
- package/repos/effect/packages/tools/bundle/fixtures/schema-toCodeDocument.ts +12 -0
- package/repos/effect/packages/tools/bundle/fixtures/schema-toCodecJson.ts +9 -0
- package/repos/effect/packages/tools/bundle/fixtures/schema-toEquivalence.ts +9 -0
- package/repos/effect/packages/tools/bundle/fixtures/schema-toFormatter.ts +9 -0
- package/repos/effect/packages/tools/bundle/fixtures/schema-toJsonSchemaDocument.ts +9 -0
- package/repos/effect/packages/tools/bundle/fixtures/schema-toRepresentation.ts +9 -0
- package/repos/effect/packages/tools/bundle/fixtures/schema.ts +12 -0
- package/repos/effect/packages/tools/bundle/fixtures/stm.ts +21 -0
- package/repos/effect/packages/tools/bundle/fixtures/stream.ts +7 -0
- package/repos/effect/packages/tools/bundle/package.json +52 -0
- package/repos/effect/packages/tools/bundle/src/Cli.ts +104 -0
- package/repos/effect/packages/tools/bundle/src/Fixtures.ts +51 -0
- package/repos/effect/packages/tools/bundle/src/Plugins.ts +131 -0
- package/repos/effect/packages/tools/bundle/src/Reporter.ts +200 -0
- package/repos/effect/packages/tools/bundle/src/Rollup.ts +179 -0
- package/repos/effect/packages/tools/bundle/src/bin.ts +23 -0
- package/repos/effect/packages/tools/bundle/tsconfig.fixtures.json +13 -0
- package/repos/effect/packages/tools/bundle/tsconfig.json +9 -0
- package/repos/effect/packages/tools/bundle/tsconfig.src.json +13 -0
- package/repos/effect/packages/tools/jsdocs/docgen.json +4 -0
- package/repos/effect/packages/tools/jsdocs/package.json +64 -0
- package/repos/effect/packages/tools/jsdocs/src/Jsdocs.ts +3303 -0
- package/repos/effect/packages/tools/jsdocs/src/bin.ts +23 -0
- package/repos/effect/packages/tools/jsdocs/test/jsdocs.test.ts +979 -0
- package/repos/effect/packages/tools/jsdocs/tsconfig.json +8 -0
- package/repos/effect/packages/tools/jsdocs/vitest.config.ts +6 -0
- package/repos/effect/packages/tools/openapi-generator/CHANGELOG.md +691 -0
- package/repos/effect/packages/tools/openapi-generator/LICENSE +21 -0
- package/repos/effect/packages/tools/openapi-generator/docgen.json +4 -0
- package/repos/effect/packages/tools/openapi-generator/package.json +78 -0
- package/repos/effect/packages/tools/openapi-generator/src/HttpApiTransformer.ts +552 -0
- package/repos/effect/packages/tools/openapi-generator/src/JsonSchemaGenerator.ts +319 -0
- package/repos/effect/packages/tools/openapi-generator/src/OpenApiGenerator.ts +1201 -0
- package/repos/effect/packages/tools/openapi-generator/src/OpenApiPatch.ts +539 -0
- package/repos/effect/packages/tools/openapi-generator/src/OpenApiTransformer.ts +1019 -0
- package/repos/effect/packages/tools/openapi-generator/src/ParsedOperation.ts +277 -0
- package/repos/effect/packages/tools/openapi-generator/src/Utils.ts +111 -0
- package/repos/effect/packages/tools/openapi-generator/src/bin.ts +10 -0
- package/repos/effect/packages/tools/openapi-generator/src/main.ts +116 -0
- package/repos/effect/packages/tools/openapi-generator/test/JsonSchemaGenerator.test.ts +173 -0
- package/repos/effect/packages/tools/openapi-generator/test/OpenApiGenerator.test.ts +2130 -0
- package/repos/effect/packages/tools/openapi-generator/test/OpenApiGeneratorCli.test.ts +147 -0
- package/repos/effect/packages/tools/openapi-generator/test/OpenApiPatch.test.ts +380 -0
- package/repos/effect/packages/tools/openapi-generator/test/Utils.test.ts +33 -0
- package/repos/effect/packages/tools/openapi-generator/test/fixtures/cli-basic-spec.json +35 -0
- package/repos/effect/packages/tools/openapi-generator/test/fixtures/cli-warning-spec.json +57 -0
- package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/invalid-op.json +7 -0
- package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/missing-path.json +6 -0
- package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/missing-value.json +6 -0
- package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/valid-add.json +8 -0
- package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/valid-multiple.json +17 -0
- package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/valid-patch.yaml +6 -0
- package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/valid-remove.json +6 -0
- package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/valid-replace.json +7 -0
- package/repos/effect/packages/tools/openapi-generator/tsconfig.json +9 -0
- package/repos/effect/packages/tools/openapi-generator/vitest.config.ts +6 -0
- package/repos/effect/packages/tools/oxc/docgen.json +4 -0
- package/repos/effect/packages/tools/oxc/oxlintrc.json +83 -0
- package/repos/effect/packages/tools/oxc/package.json +72 -0
- package/repos/effect/packages/tools/oxc/src/oxlint/index.ts +18 -0
- package/repos/effect/packages/tools/oxc/src/oxlint/rules/jsdocs.ts +108 -0
- package/repos/effect/packages/tools/oxc/src/oxlint/rules/no-bigint-literals.ts +25 -0
- package/repos/effect/packages/tools/oxc/src/oxlint/rules/no-import-from-barrel-package.ts +144 -0
- package/repos/effect/packages/tools/oxc/src/oxlint/rules/no-js-extension-imports.ts +73 -0
- package/repos/effect/packages/tools/oxc/src/oxlint/rules/no-opaque-instance-fields.ts +92 -0
- package/repos/effect/packages/tools/oxc/test/jsdocs.test.ts +75 -0
- package/repos/effect/packages/tools/oxc/test/no-import-from-barrel-package.test.ts +182 -0
- package/repos/effect/packages/tools/oxc/test/no-js-extension-imports.test.ts +120 -0
- package/repos/effect/packages/tools/oxc/test/no-opaque-instance-fields.test.ts +276 -0
- package/repos/effect/packages/tools/oxc/test/utils.ts +61 -0
- package/repos/effect/packages/tools/oxc/tsconfig.json +8 -0
- package/repos/effect/packages/tools/oxc/vitest.config.ts +6 -0
- package/repos/effect/packages/tools/utils/docgen.json +4 -0
- package/repos/effect/packages/tools/utils/package.json +59 -0
- package/repos/effect/packages/tools/utils/src/Codegen.ts +214 -0
- package/repos/effect/packages/tools/utils/src/Glob.ts +61 -0
- package/repos/effect/packages/tools/utils/src/bin.ts +16 -0
- package/repos/effect/packages/tools/utils/src/commands/codegen.ts +44 -0
- package/repos/effect/packages/tools/utils/tsconfig.json +9 -0
- package/repos/effect/packages/vitest/CHANGELOG.md +601 -0
- package/repos/effect/packages/vitest/LICENSE +21 -0
- package/repos/effect/packages/vitest/README.md +320 -0
- package/repos/effect/packages/vitest/docgen.json +24 -0
- package/repos/effect/packages/vitest/package.json +60 -0
- package/repos/effect/packages/vitest/src/index.ts +259 -0
- package/repos/effect/packages/vitest/src/internal/internal.ts +374 -0
- package/repos/effect/packages/vitest/src/utils.ts +321 -0
- package/repos/effect/packages/vitest/test/index.test.ts +222 -0
- package/repos/effect/packages/vitest/test/isolation.test.ts +105 -0
- package/repos/effect/packages/vitest/test/nested-isolation.test.ts +212 -0
- package/repos/effect/packages/vitest/tsconfig.json +11 -0
- package/repos/effect/packages/vitest/typetest/index.tst.ts +56 -0
- package/repos/effect/packages/vitest/vitest.config.ts +6 -0
- package/repos/effect/patches/@changesets__assemble-release-plan.patch +26 -0
- package/repos/effect/patches/@changesets__get-github-info.patch +44 -0
- package/repos/effect/pnpm-lock.yaml +13483 -0
- package/repos/effect/pnpm-workspace.yaml +10 -0
- package/repos/effect/scripts/bundle-compare.sh +42 -0
- package/repos/effect/scripts/check-cookbook-schedule.ts +390 -0
- package/repos/effect/scripts/circular.mjs +26 -0
- package/repos/effect/scripts/clean.mjs +19 -0
- package/repos/effect/scripts/codemod.mjs +22 -0
- package/repos/effect/scripts/codemods/jsdoc.ts +79 -0
- package/repos/effect/scripts/docs.mjs +64 -0
- package/repos/effect/scripts/package-scalar.mjs +14 -0
- package/repos/effect/scripts/package-swagger.mjs +23 -0
- package/repos/effect/scripts/package.json +22 -0
- package/repos/effect/scripts/tsconfig.json +18 -0
- package/repos/effect/scripts/version.mjs +9 -0
- package/repos/effect/scripts/version.template.txt +2 -0
- package/repos/effect/scripts/worktree-setup.sh +27 -0
- package/repos/effect/stats.txt +30 -0
- package/repos/effect/tsconfig.base.json +46 -0
- package/repos/effect/tsconfig.json +128 -0
- package/repos/effect/tsconfig.packages.json +39 -0
- package/repos/effect/tstyche.json +7 -0
- package/repos/effect/vitest.config.ts +31 -0
- package/repos/effect/vitest.setup.ts +4 -0
- package/repos/effect/vitest.shared.ts +61 -0
- package/repos/effect.subtree.json +16 -0
|
@@ -0,0 +1,2773 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds and wires services for Effect applications.
|
|
3
|
+
*
|
|
4
|
+
* A `Layer<ROut, E, RIn>` describes how to acquire one or more services, which
|
|
5
|
+
* services are required to build them, and which errors can occur during
|
|
6
|
+
* acquisition. Layers can manage scoped resources, memoize shared services,
|
|
7
|
+
* combine with other layers, provide services to effects or streams, and attach
|
|
8
|
+
* error handling, tracing, or lifecycle hooks.
|
|
9
|
+
*
|
|
10
|
+
* @since 2.0.0
|
|
11
|
+
*/
|
|
12
|
+
import type { NonEmptyArray, NonEmptyReadonlyArray } from "./Array.ts"
|
|
13
|
+
import type * as Cause from "./Cause.ts"
|
|
14
|
+
import type * as Channel from "./Channel.ts"
|
|
15
|
+
import * as Context from "./Context.ts"
|
|
16
|
+
import * as Deferred from "./Deferred.ts"
|
|
17
|
+
import type { Effect } from "./Effect.ts"
|
|
18
|
+
import type * as Exit from "./Exit.ts"
|
|
19
|
+
import type { LazyArg } from "./Function.ts"
|
|
20
|
+
import { constant, constTrue, constUndefined, dual, identity } from "./Function.ts"
|
|
21
|
+
import * as core from "./internal/core.ts"
|
|
22
|
+
import * as internalEffect from "./internal/effect.ts"
|
|
23
|
+
import type { ErrorWithStackTraceLimit } from "./internal/tracer.ts"
|
|
24
|
+
import * as internalTracer from "./internal/tracer.ts"
|
|
25
|
+
import { type Pipeable, pipeArguments } from "./Pipeable.ts"
|
|
26
|
+
import { hasProperty } from "./Predicate.ts"
|
|
27
|
+
import { CurrentStackFrame } from "./References.ts"
|
|
28
|
+
import * as Scope from "./Scope.ts"
|
|
29
|
+
import type * as Stream from "./Stream.ts"
|
|
30
|
+
import * as Tracer from "./Tracer.ts"
|
|
31
|
+
import type * as Types from "./Types.ts"
|
|
32
|
+
import type * as Unify from "./Unify.ts"
|
|
33
|
+
|
|
34
|
+
const TypeId = "~effect/Layer"
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* A `Layer` describes how to build one or more services for dependency injection.
|
|
38
|
+
*
|
|
39
|
+
* **When to use**
|
|
40
|
+
*
|
|
41
|
+
* Use to model construction of application services for dependency injection,
|
|
42
|
+
* especially when services have dependencies, can fail during construction, or
|
|
43
|
+
* need scoped setup and release.
|
|
44
|
+
*
|
|
45
|
+
* **Details**
|
|
46
|
+
*
|
|
47
|
+
* A `Layer<ROut, E, RIn>` represents `ROut` as the services this layer
|
|
48
|
+
* provides, `E` as the possible errors during layer construction, and `RIn` as
|
|
49
|
+
* the services this layer requires as dependencies.
|
|
50
|
+
*
|
|
51
|
+
* @category models
|
|
52
|
+
* @since 2.0.0
|
|
53
|
+
*/
|
|
54
|
+
export interface Layer<in ROut, out E = never, out RIn = never> extends Variance<ROut, E, RIn>, Pipeable {
|
|
55
|
+
/** @internal */
|
|
56
|
+
build(memoMap: MemoMap, scope: Scope.Scope): Effect<Context.Context<ROut>, E, RIn>
|
|
57
|
+
[Unify.typeSymbol]?: unknown
|
|
58
|
+
[Unify.unifySymbol]?: LayerUnify<this>
|
|
59
|
+
[Unify.ignoreSymbol]?: LayerUnifyIgnore
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Type-level hook that allows `Layer` values to participate in `Unify`
|
|
64
|
+
* inference.
|
|
65
|
+
*
|
|
66
|
+
* **Details**
|
|
67
|
+
*
|
|
68
|
+
* This is used by Effect's pipe and unification machinery to preserve the
|
|
69
|
+
* provided services, error, and requirements of a `Layer`.
|
|
70
|
+
*
|
|
71
|
+
* @category models
|
|
72
|
+
* @since 4.0.0
|
|
73
|
+
*/
|
|
74
|
+
export interface LayerUnify<A extends { [Unify.typeSymbol]?: any }> {
|
|
75
|
+
Layer?: () => A[Unify.typeSymbol] extends Layer<any, any, any> | infer _ ? Layer<
|
|
76
|
+
Success<Extract<A[Unify.typeSymbol], Any>>,
|
|
77
|
+
Error<Extract<A[Unify.typeSymbol], Any>>,
|
|
78
|
+
Services<Extract<A[Unify.typeSymbol], Any>>
|
|
79
|
+
>
|
|
80
|
+
: never
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Type-level marker used by `Unify` for `Layer` types that should be ignored
|
|
85
|
+
* during unification.
|
|
86
|
+
*
|
|
87
|
+
* @category models
|
|
88
|
+
* @since 4.0.0
|
|
89
|
+
*/
|
|
90
|
+
export interface LayerUnifyIgnore {}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* The variance interface for Layer type parameters.
|
|
94
|
+
*
|
|
95
|
+
* @category models
|
|
96
|
+
* @since 2.0.0
|
|
97
|
+
*/
|
|
98
|
+
export interface Variance<in ROut, out E, out RIn> {
|
|
99
|
+
readonly [TypeId]: {
|
|
100
|
+
readonly _ROut: Types.Contravariant<ROut>
|
|
101
|
+
readonly _E: Types.Covariant<E>
|
|
102
|
+
readonly _RIn: Types.Covariant<RIn>
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* A type-level constraint for working with any `Layer` type.
|
|
107
|
+
*
|
|
108
|
+
* **When to use**
|
|
109
|
+
*
|
|
110
|
+
* Use to constrain generic parameters or layer collections to any `Layer`
|
|
111
|
+
* value while preserving its provided, error, and required service types for
|
|
112
|
+
* inference.
|
|
113
|
+
*
|
|
114
|
+
* **Details**
|
|
115
|
+
*
|
|
116
|
+
* This interface is used to constrain generic types to `Layer` values without
|
|
117
|
+
* specifying exact type parameters.
|
|
118
|
+
*
|
|
119
|
+
* @see {@link Layer} for the concrete layer interface
|
|
120
|
+
* @see {@link Services} for extracting required services from a layer type
|
|
121
|
+
* @see {@link Error} for extracting construction errors from a layer type
|
|
122
|
+
* @see {@link Success} for extracting provided services from a layer type
|
|
123
|
+
*
|
|
124
|
+
* @category utility types
|
|
125
|
+
* @since 3.9.0
|
|
126
|
+
*/
|
|
127
|
+
export interface Any {
|
|
128
|
+
readonly [TypeId]: {
|
|
129
|
+
readonly _ROut: any
|
|
130
|
+
readonly _E: any
|
|
131
|
+
readonly _RIn: any
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Extracts the service requirements (`RIn`) from a `Layer` type.
|
|
136
|
+
*
|
|
137
|
+
* **When to use**
|
|
138
|
+
*
|
|
139
|
+
* Use to derive the dependency requirements of a generic or inferred `Layer`
|
|
140
|
+
* without restating its `RIn` type parameter.
|
|
141
|
+
*
|
|
142
|
+
* @see {@link Success} for extracting the services provided by the same `Layer`
|
|
143
|
+
* @see {@link Error} for extracting the construction failure type from the same `Layer`
|
|
144
|
+
*
|
|
145
|
+
* @category utility types
|
|
146
|
+
* @since 4.0.0
|
|
147
|
+
*/
|
|
148
|
+
export type Services<T extends Any> = T extends infer L
|
|
149
|
+
? L extends Layer<infer _ROut, infer _E, infer _RIn> ? _RIn : never
|
|
150
|
+
: never
|
|
151
|
+
/**
|
|
152
|
+
* Extracts the error type (`E`) from a `Layer` type.
|
|
153
|
+
*
|
|
154
|
+
* **When to use**
|
|
155
|
+
*
|
|
156
|
+
* Use to derive a layer construction error type for helper types, wrappers, or
|
|
157
|
+
* APIs that preserve a layer failure channel.
|
|
158
|
+
*
|
|
159
|
+
* @see {@link Success} for extracting the services provided by the same `Layer`
|
|
160
|
+
* @see {@link Services} for extracting the dependency requirements of the same `Layer`
|
|
161
|
+
*
|
|
162
|
+
* @category utility types
|
|
163
|
+
* @since 2.0.0
|
|
164
|
+
*/
|
|
165
|
+
export type Error<T extends Any> = T extends Layer<infer _ROut, infer _E, infer _RIn> ? _E : never
|
|
166
|
+
/**
|
|
167
|
+
* Extracts the service output type (`ROut`) from a `Layer` type.
|
|
168
|
+
*
|
|
169
|
+
* **When to use**
|
|
170
|
+
*
|
|
171
|
+
* Use to derive the services provided by an existing or generic `Layer` without
|
|
172
|
+
* restating its `ROut` type parameter.
|
|
173
|
+
*
|
|
174
|
+
* @see {@link Error} for extracting the layer construction error type instead
|
|
175
|
+
* @see {@link Services} for extracting the layer input service requirements instead
|
|
176
|
+
*
|
|
177
|
+
* @category utility types
|
|
178
|
+
* @since 2.0.0
|
|
179
|
+
*/
|
|
180
|
+
export type Success<T extends Any> = T extends Layer<infer _ROut, infer _E, infer _RIn> ? _ROut : never
|
|
181
|
+
|
|
182
|
+
const MemoMapTypeId = "~effect/Layer/MemoMap"
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* A `MemoMap` is used to memoize layer construction and ensure sharing of
|
|
186
|
+
* layers.
|
|
187
|
+
*
|
|
188
|
+
* **Details**
|
|
189
|
+
*
|
|
190
|
+
* The `MemoMap` prevents duplicate construction of the same layer instance,
|
|
191
|
+
* enabling efficient resource sharing across layer dependencies.
|
|
192
|
+
*
|
|
193
|
+
* **Example** (Sharing layer construction with a memo map)
|
|
194
|
+
*
|
|
195
|
+
* ```ts
|
|
196
|
+
* import { Context, Effect, Layer } from "effect"
|
|
197
|
+
*
|
|
198
|
+
* class Database extends Context.Service<Database, {
|
|
199
|
+
* readonly query: (sql: string) => Effect.Effect<string>
|
|
200
|
+
* }>()("Database") {}
|
|
201
|
+
*
|
|
202
|
+
* // Create a custom MemoMap for manual layer building
|
|
203
|
+
* const program = Effect.gen(function*() {
|
|
204
|
+
* const memoMap = yield* Layer.makeMemoMap
|
|
205
|
+
* const scope = yield* Effect.scope
|
|
206
|
+
*
|
|
207
|
+
* const dbLayer = Layer.succeed(Database, {
|
|
208
|
+
* query: Effect.fn("Database.query")((sql: string) => Effect.succeed("result"))
|
|
209
|
+
* })
|
|
210
|
+
* const context = yield* Layer.buildWithMemoMap(dbLayer, memoMap, scope)
|
|
211
|
+
*
|
|
212
|
+
* return Context.get(context, Database)
|
|
213
|
+
* })
|
|
214
|
+
* ```
|
|
215
|
+
*
|
|
216
|
+
* @category models
|
|
217
|
+
* @since 2.0.0
|
|
218
|
+
*/
|
|
219
|
+
export interface MemoMap {
|
|
220
|
+
readonly [MemoMapTypeId]: typeof MemoMapTypeId
|
|
221
|
+
readonly get: <RIn, E, ROut>(
|
|
222
|
+
layer: Layer<ROut, E, RIn>,
|
|
223
|
+
scope: Scope.Scope
|
|
224
|
+
) => Effect<Context.Context<ROut>, E, RIn> | undefined
|
|
225
|
+
readonly getOrElseMemoize: <RIn, E, ROut>(
|
|
226
|
+
layer: Layer<ROut, E, RIn>,
|
|
227
|
+
scope: Scope.Scope,
|
|
228
|
+
build: (memoMap: MemoMap, scope: Scope.Scope) => Effect<Context.Context<ROut>, E, RIn>
|
|
229
|
+
) => Effect<Context.Context<ROut>, E, RIn>
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
type MemoMapEntry = {
|
|
233
|
+
observers: number
|
|
234
|
+
effect: Effect<Context.Context<any>, any>
|
|
235
|
+
readonly finalizer: (exit: Exit.Exit<unknown, unknown>) => Effect<void>
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
const memoMapReuse = <RIn, E, ROut>(
|
|
239
|
+
entry: MemoMapEntry,
|
|
240
|
+
scope: Scope.Scope
|
|
241
|
+
): Effect<Context.Context<ROut>, E, RIn> => {
|
|
242
|
+
entry.observers++
|
|
243
|
+
return internalEffect.andThen(
|
|
244
|
+
internalEffect.scopeAddFinalizerExit(scope, (exit) => entry.finalizer(exit)),
|
|
245
|
+
entry.effect
|
|
246
|
+
)
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Returns `true` if the specified value is a `Layer`, `false` otherwise.
|
|
251
|
+
*
|
|
252
|
+
* **Example** (Checking whether a value is a layer)
|
|
253
|
+
*
|
|
254
|
+
* ```ts
|
|
255
|
+
* import { Context, Effect, Layer } from "effect"
|
|
256
|
+
*
|
|
257
|
+
* class Database extends Context.Service<Database, {
|
|
258
|
+
* readonly query: (sql: string) => Effect.Effect<string>
|
|
259
|
+
* }>()("Database") {}
|
|
260
|
+
*
|
|
261
|
+
* const dbLayer = Layer.succeed(Database, {
|
|
262
|
+
* query: Effect.fn("Database.query")((sql: string) => Effect.succeed("result"))
|
|
263
|
+
* })
|
|
264
|
+
* const notALayer = { someProperty: "value" }
|
|
265
|
+
*
|
|
266
|
+
* console.log(Layer.isLayer(dbLayer)) // true
|
|
267
|
+
* console.log(Layer.isLayer(notALayer)) // false
|
|
268
|
+
* ```
|
|
269
|
+
*
|
|
270
|
+
* @category getters
|
|
271
|
+
* @since 2.0.0
|
|
272
|
+
*/
|
|
273
|
+
export const isLayer = (u: unknown): u is Layer<unknown, unknown, unknown> => hasProperty(u, TypeId)
|
|
274
|
+
|
|
275
|
+
const LayerProto = {
|
|
276
|
+
[TypeId]: {
|
|
277
|
+
_ROut: identity,
|
|
278
|
+
_E: identity,
|
|
279
|
+
_RIn: identity
|
|
280
|
+
},
|
|
281
|
+
pipe() {
|
|
282
|
+
return pipeArguments(this, arguments)
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
const fromBuildUnsafe = <ROut, E, RIn>(
|
|
287
|
+
build: (
|
|
288
|
+
memoMap: MemoMap,
|
|
289
|
+
scope: Scope.Scope
|
|
290
|
+
) => Effect<Context.Context<ROut>, E, RIn>
|
|
291
|
+
): Layer<ROut, E, RIn> => {
|
|
292
|
+
const self = Object.create(LayerProto)
|
|
293
|
+
self.build = build
|
|
294
|
+
return self
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Constructs a `Layer` from a function that uses a `MemoMap` and `Scope` to
|
|
299
|
+
* build the layer.
|
|
300
|
+
*
|
|
301
|
+
* **Details**
|
|
302
|
+
*
|
|
303
|
+
* The function receives a `MemoMap` for memoization and a `Scope` for resource management.
|
|
304
|
+
* A child scope is created, and if the build fails, the child scope is closed.
|
|
305
|
+
*
|
|
306
|
+
* **Example** (Constructing a layer from a build function)
|
|
307
|
+
*
|
|
308
|
+
* ```ts
|
|
309
|
+
* import { Context, Effect, Layer } from "effect"
|
|
310
|
+
*
|
|
311
|
+
* class Database extends Context.Service<Database, {
|
|
312
|
+
* readonly query: (sql: string) => Effect.Effect<string>
|
|
313
|
+
* }>()("Database") {}
|
|
314
|
+
*
|
|
315
|
+
* const databaseLayer = Layer.fromBuild(() =>
|
|
316
|
+
* Effect.sync(() =>
|
|
317
|
+
* Context.make(Database, {
|
|
318
|
+
* query: (sql: string) => Effect.succeed("result")
|
|
319
|
+
* })
|
|
320
|
+
* )
|
|
321
|
+
* )
|
|
322
|
+
* ```
|
|
323
|
+
*
|
|
324
|
+
* @category constructors
|
|
325
|
+
* @since 4.0.0
|
|
326
|
+
*/
|
|
327
|
+
export const fromBuild = <ROut, E, RIn>(
|
|
328
|
+
build: (
|
|
329
|
+
memoMap: MemoMap,
|
|
330
|
+
scope: Scope.Scope
|
|
331
|
+
) => Effect<Context.Context<ROut>, E, RIn>
|
|
332
|
+
): Layer<ROut, E, RIn> =>
|
|
333
|
+
fromBuildUnsafe((memoMap: MemoMap, scope: Scope.Scope) => {
|
|
334
|
+
const layerScope = Scope.forkUnsafe(scope)
|
|
335
|
+
return internalEffect.onExit(
|
|
336
|
+
build(memoMap, layerScope),
|
|
337
|
+
(exit) => exit._tag === "Failure" ? Scope.close(layerScope, exit) : internalEffect.void
|
|
338
|
+
)
|
|
339
|
+
})
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* Constructs a `Layer` from a function that uses a `MemoMap` and `Scope` to
|
|
343
|
+
* build the layer, with automatic memoization.
|
|
344
|
+
*
|
|
345
|
+
* **Details**
|
|
346
|
+
*
|
|
347
|
+
* This is similar to `fromBuild` but provides automatic memoization of the layer construction.
|
|
348
|
+
* The layer will be memoized based on the provided `MemoMap`.
|
|
349
|
+
*
|
|
350
|
+
* **Example** (Memoizing layer construction)
|
|
351
|
+
*
|
|
352
|
+
* ```ts
|
|
353
|
+
* import { Context, Effect, Layer } from "effect"
|
|
354
|
+
*
|
|
355
|
+
* class Database extends Context.Service<Database, {
|
|
356
|
+
* readonly query: (sql: string) => Effect.Effect<string>
|
|
357
|
+
* }>()("Database") {}
|
|
358
|
+
*
|
|
359
|
+
* const databaseLayer = Layer.fromBuildMemo(() =>
|
|
360
|
+
* Effect.sync(() =>
|
|
361
|
+
* Context.make(Database, {
|
|
362
|
+
* query: (sql: string) => Effect.succeed("result")
|
|
363
|
+
* })
|
|
364
|
+
* )
|
|
365
|
+
* )
|
|
366
|
+
* ```
|
|
367
|
+
*
|
|
368
|
+
* @category constructors
|
|
369
|
+
* @since 4.0.0
|
|
370
|
+
*/
|
|
371
|
+
export const fromBuildMemo = <ROut, E, RIn>(
|
|
372
|
+
build: (
|
|
373
|
+
memoMap: MemoMap,
|
|
374
|
+
scope: Scope.Scope
|
|
375
|
+
) => Effect<Context.Context<ROut>, E, RIn>
|
|
376
|
+
): Layer<ROut, E, RIn> => {
|
|
377
|
+
const self: Layer<ROut, E, RIn> = fromBuild((memoMap, scope) => memoMap.getOrElseMemoize(self, scope, build))
|
|
378
|
+
return self
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
const memoMapBuild = <RIn, E, ROut>(
|
|
382
|
+
memoMap: MemoMapImpl,
|
|
383
|
+
layer: Layer<ROut, E, RIn>,
|
|
384
|
+
scope: Scope.Scope,
|
|
385
|
+
build: (memoMap: MemoMap, scope: Scope.Scope) => Effect<Context.Context<ROut>, E, RIn>
|
|
386
|
+
): Effect<Context.Context<ROut>, E, RIn> => {
|
|
387
|
+
const layerScope = Scope.makeUnsafe()
|
|
388
|
+
const deferred = Deferred.makeUnsafe<Context.Context<ROut>, E>()
|
|
389
|
+
const entry: MemoMapEntry = {
|
|
390
|
+
observers: 1,
|
|
391
|
+
effect: Deferred.await(deferred),
|
|
392
|
+
finalizer: (exit: Exit.Exit<unknown, unknown>) =>
|
|
393
|
+
internalEffect.suspend(() => {
|
|
394
|
+
entry.observers--
|
|
395
|
+
if (entry.observers === 0) {
|
|
396
|
+
memoMap.map.delete(layer)
|
|
397
|
+
return Scope.close(layerScope, exit)
|
|
398
|
+
}
|
|
399
|
+
return internalEffect.void
|
|
400
|
+
})
|
|
401
|
+
}
|
|
402
|
+
memoMap.map.set(layer, entry)
|
|
403
|
+
return internalEffect.scopeAddFinalizerExit(scope, entry.finalizer).pipe(
|
|
404
|
+
internalEffect.flatMap(() => build(memoMap, layerScope)),
|
|
405
|
+
internalEffect.onExit((exit) => {
|
|
406
|
+
entry.effect = exit
|
|
407
|
+
return Deferred.done(deferred, exit)
|
|
408
|
+
})
|
|
409
|
+
)
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
class MemoMapImpl implements MemoMap {
|
|
413
|
+
get [MemoMapTypeId](): typeof MemoMapTypeId {
|
|
414
|
+
return MemoMapTypeId
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
readonly parent: MemoMap | undefined
|
|
418
|
+
|
|
419
|
+
constructor(parent?: MemoMap) {
|
|
420
|
+
this.parent = parent
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
readonly map = new Map<Layer<any, any, any>, MemoMapEntry>()
|
|
424
|
+
|
|
425
|
+
get<RIn, E, ROut>(
|
|
426
|
+
layer: Layer<ROut, E, RIn>,
|
|
427
|
+
scope: Scope.Scope
|
|
428
|
+
): Effect<Context.Context<ROut>, E, RIn> | undefined {
|
|
429
|
+
const local = this.map.get(layer)
|
|
430
|
+
if (local) {
|
|
431
|
+
return memoMapReuse(local, scope)
|
|
432
|
+
}
|
|
433
|
+
return this.parent?.get(layer, scope)
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
getOrElseMemoize<RIn, E, ROut>(
|
|
437
|
+
layer: Layer<ROut, E, RIn>,
|
|
438
|
+
scope: Scope.Scope,
|
|
439
|
+
build: (memoMap: MemoMap, scope: Scope.Scope) => Effect<Context.Context<ROut>, E, RIn>
|
|
440
|
+
): Effect<Context.Context<ROut>, E, RIn> {
|
|
441
|
+
const existing = this.get(layer, scope)
|
|
442
|
+
if (existing) {
|
|
443
|
+
return existing
|
|
444
|
+
}
|
|
445
|
+
return memoMapBuild(this, layer, scope, build)
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
/**
|
|
450
|
+
* Constructs a `MemoMap` synchronously so it can be used to build additional layers.
|
|
451
|
+
*
|
|
452
|
+
* **Example** (Creating a memo map unsafely)
|
|
453
|
+
*
|
|
454
|
+
* ```ts
|
|
455
|
+
* import { Context, Effect, Layer } from "effect"
|
|
456
|
+
*
|
|
457
|
+
* class Database extends Context.Service<Database, {
|
|
458
|
+
* readonly query: (sql: string) => Effect.Effect<string>
|
|
459
|
+
* }>()("Database") {}
|
|
460
|
+
*
|
|
461
|
+
* // Create a memo map for manual layer building
|
|
462
|
+
* const program = Effect.gen(function*() {
|
|
463
|
+
* const memoMap = Layer.makeMemoMapUnsafe()
|
|
464
|
+
* const scope = yield* Effect.scope
|
|
465
|
+
*
|
|
466
|
+
* const dbLayer = Layer.succeed(Database, {
|
|
467
|
+
* query: Effect.fn("Database.query")((sql: string) => Effect.succeed("result"))
|
|
468
|
+
* })
|
|
469
|
+
* const context = yield* Layer.buildWithMemoMap(dbLayer, memoMap, scope)
|
|
470
|
+
*
|
|
471
|
+
* return Context.get(context, Database)
|
|
472
|
+
* })
|
|
473
|
+
* ```
|
|
474
|
+
*
|
|
475
|
+
* @category memo map
|
|
476
|
+
* @since 4.0.0
|
|
477
|
+
*/
|
|
478
|
+
export const makeMemoMapUnsafe = (): MemoMap => new MemoMapImpl()
|
|
479
|
+
|
|
480
|
+
/**
|
|
481
|
+
* Constructs a child `MemoMap` synchronously, allowing it to reuse layers
|
|
482
|
+
* already memoized in the parent while isolating any new layer allocations to
|
|
483
|
+
* the child map.
|
|
484
|
+
*
|
|
485
|
+
* **When to use**
|
|
486
|
+
*
|
|
487
|
+
* Use to synchronously fork a memo map for manual layer building when child
|
|
488
|
+
* builds should see parent memoized layers without writing newly built layers
|
|
489
|
+
* back to the parent.
|
|
490
|
+
*
|
|
491
|
+
* @see {@link forkMemoMap} for allocating the child memo map inside `Effect`
|
|
492
|
+
* @see {@link makeMemoMapUnsafe} for creating a root memo map without a parent
|
|
493
|
+
*
|
|
494
|
+
* @category memo map
|
|
495
|
+
* @since 4.0.0
|
|
496
|
+
*/
|
|
497
|
+
export const forkMemoMapUnsafe = (parent: MemoMap): MemoMap => new MemoMapImpl(parent)
|
|
498
|
+
|
|
499
|
+
/**
|
|
500
|
+
* Constructs a `MemoMap` effectfully so it can be used to build additional layers.
|
|
501
|
+
*
|
|
502
|
+
* **Example** (Creating a memo map in an effect)
|
|
503
|
+
*
|
|
504
|
+
* ```ts
|
|
505
|
+
* import { Context, Effect, Layer } from "effect"
|
|
506
|
+
*
|
|
507
|
+
* class Database extends Context.Service<Database, {
|
|
508
|
+
* readonly query: (sql: string) => Effect.Effect<string>
|
|
509
|
+
* }>()("Database") {}
|
|
510
|
+
*
|
|
511
|
+
* // Create a memo map safely within an Effect
|
|
512
|
+
* const program = Effect.gen(function*() {
|
|
513
|
+
* const memoMap = yield* Layer.makeMemoMap
|
|
514
|
+
* const scope = yield* Effect.scope
|
|
515
|
+
*
|
|
516
|
+
* const dbLayer = Layer.succeed(Database, {
|
|
517
|
+
* query: Effect.fn("Database.query")((sql: string) => Effect.succeed("result"))
|
|
518
|
+
* })
|
|
519
|
+
* const context = yield* Layer.buildWithMemoMap(dbLayer, memoMap, scope)
|
|
520
|
+
*
|
|
521
|
+
* return Context.get(context, Database)
|
|
522
|
+
* })
|
|
523
|
+
* ```
|
|
524
|
+
*
|
|
525
|
+
* @category memo map
|
|
526
|
+
* @since 2.0.0
|
|
527
|
+
*/
|
|
528
|
+
export const makeMemoMap: Effect<MemoMap> = internalEffect.sync(makeMemoMapUnsafe)
|
|
529
|
+
|
|
530
|
+
/**
|
|
531
|
+
* Constructs a child `MemoMap` effectfully, allowing it to reuse layers already
|
|
532
|
+
* memoized in the parent while isolating any new layer allocations to the child
|
|
533
|
+
* map.
|
|
534
|
+
*
|
|
535
|
+
* **When to use**
|
|
536
|
+
*
|
|
537
|
+
* Use when a layer build should inherit already memoized layers from an
|
|
538
|
+
* existing `MemoMap` while keeping newly memoized layers out of the parent map.
|
|
539
|
+
*
|
|
540
|
+
* @see {@link makeMemoMap} for creating a root memo map in an `Effect`
|
|
541
|
+
* @see {@link forkMemoMapUnsafe} for the synchronous constructor variant
|
|
542
|
+
* @see {@link buildWithMemoMap} for building layers with an explicit memo map
|
|
543
|
+
*
|
|
544
|
+
* @category memo map
|
|
545
|
+
* @since 4.0.0
|
|
546
|
+
*/
|
|
547
|
+
export const forkMemoMap = (parent: MemoMap): Effect<MemoMap> => internalEffect.sync(() => forkMemoMapUnsafe(parent))
|
|
548
|
+
|
|
549
|
+
/**
|
|
550
|
+
* Context service for the current `MemoMap` used in layer construction.
|
|
551
|
+
*
|
|
552
|
+
* **When to use**
|
|
553
|
+
*
|
|
554
|
+
* Use when building custom layer operations that need to access the current
|
|
555
|
+
* memoization map from the fiber context.
|
|
556
|
+
*
|
|
557
|
+
* **Details**
|
|
558
|
+
*
|
|
559
|
+
* This service wraps a `MemoMap` as a `Context.Service`, making it available
|
|
560
|
+
* for dependency injection during layer construction.
|
|
561
|
+
*
|
|
562
|
+
* @see {@link MemoMap} the memoization map type wrapped by this service
|
|
563
|
+
*
|
|
564
|
+
* @category models
|
|
565
|
+
* @since 3.13.0
|
|
566
|
+
*/
|
|
567
|
+
export class CurrentMemoMap extends Context.Service<CurrentMemoMap, MemoMap>()("effect/Layer/CurrentMemoMap") {
|
|
568
|
+
static getOrCreate: <Services>(self: Context.Context<Services>) => MemoMap = Context.getOrElse(
|
|
569
|
+
this,
|
|
570
|
+
makeMemoMapUnsafe
|
|
571
|
+
)
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
/**
|
|
575
|
+
* Builds a layer into an `Effect` value, using the specified `MemoMap` to memoize
|
|
576
|
+
* the layer construction.
|
|
577
|
+
*
|
|
578
|
+
* **Example** (Building layers with an explicit memo map)
|
|
579
|
+
*
|
|
580
|
+
* ```ts
|
|
581
|
+
* import { Context, Effect, Layer } from "effect"
|
|
582
|
+
*
|
|
583
|
+
* class Database extends Context.Service<Database, {
|
|
584
|
+
* readonly query: (sql: string) => Effect.Effect<string>
|
|
585
|
+
* }>()("Database") {}
|
|
586
|
+
*
|
|
587
|
+
* class Logger extends Context.Service<Logger, {
|
|
588
|
+
* readonly log: (msg: string) => Effect.Effect<void>
|
|
589
|
+
* }>()("Logger") {}
|
|
590
|
+
*
|
|
591
|
+
* // Build layers with explicit memoization control
|
|
592
|
+
* const program = Effect.gen(function*() {
|
|
593
|
+
* const memoMap = yield* Layer.makeMemoMap
|
|
594
|
+
* const scope = yield* Effect.scope
|
|
595
|
+
*
|
|
596
|
+
* // Build database layer with memoization
|
|
597
|
+
* const dbLayer = Layer.succeed(Database, {
|
|
598
|
+
* query: Effect.fn("Database.query")((sql: string) => Effect.succeed("result"))
|
|
599
|
+
* })
|
|
600
|
+
* const dbContext = yield* Layer.buildWithMemoMap(dbLayer, memoMap, scope)
|
|
601
|
+
*
|
|
602
|
+
* // Build logger layer with same memoization (reuses memo if same layer)
|
|
603
|
+
* const loggerLayer = Layer.succeed(Logger, {
|
|
604
|
+
* log: Effect.fn("Logger.log")((msg: string) => Effect.sync(() => console.log(msg)))
|
|
605
|
+
* })
|
|
606
|
+
* const loggerContext = yield* Layer.buildWithMemoMap(
|
|
607
|
+
* loggerLayer,
|
|
608
|
+
* memoMap,
|
|
609
|
+
* scope
|
|
610
|
+
* )
|
|
611
|
+
*
|
|
612
|
+
* return {
|
|
613
|
+
* database: Context.get(dbContext, Database),
|
|
614
|
+
* logger: Context.get(loggerContext, Logger)
|
|
615
|
+
* }
|
|
616
|
+
* })
|
|
617
|
+
* ```
|
|
618
|
+
*
|
|
619
|
+
* @category memo map
|
|
620
|
+
* @since 2.0.0
|
|
621
|
+
*/
|
|
622
|
+
export const buildWithMemoMap: {
|
|
623
|
+
(
|
|
624
|
+
memoMap: MemoMap,
|
|
625
|
+
scope: Scope.Scope
|
|
626
|
+
): <RIn, E, ROut>(self: Layer<ROut, E, RIn>) => Effect<Context.Context<ROut>, E, RIn>
|
|
627
|
+
<RIn, E, ROut>(
|
|
628
|
+
self: Layer<ROut, E, RIn>,
|
|
629
|
+
memoMap: MemoMap,
|
|
630
|
+
scope: Scope.Scope
|
|
631
|
+
): Effect<Context.Context<ROut>, E, RIn>
|
|
632
|
+
} = dual(3, <RIn, E, ROut>(
|
|
633
|
+
self: Layer<ROut, E, RIn>,
|
|
634
|
+
memoMap: MemoMap,
|
|
635
|
+
scope: Scope.Scope
|
|
636
|
+
): Effect<Context.Context<ROut>, E, RIn> =>
|
|
637
|
+
internalEffect.provideService(
|
|
638
|
+
internalEffect.map(self.build(memoMap, scope), Context.add(CurrentMemoMap, memoMap)),
|
|
639
|
+
CurrentMemoMap,
|
|
640
|
+
memoMap
|
|
641
|
+
))
|
|
642
|
+
|
|
643
|
+
/**
|
|
644
|
+
* Builds a layer into a scoped value.
|
|
645
|
+
*
|
|
646
|
+
* **Example** (Building a layer into a context)
|
|
647
|
+
*
|
|
648
|
+
* ```ts
|
|
649
|
+
* import { Context, Effect, Layer } from "effect"
|
|
650
|
+
*
|
|
651
|
+
* class Database extends Context.Service<Database, {
|
|
652
|
+
* readonly query: (sql: string) => Effect.Effect<string>
|
|
653
|
+
* }>()("Database") {}
|
|
654
|
+
*
|
|
655
|
+
* // Build a layer to get its services
|
|
656
|
+
* const program = Effect.gen(function*() {
|
|
657
|
+
* const dbLayer = Layer.succeed(Database, {
|
|
658
|
+
* query: Effect.fn("Database.query")((sql: string) => Effect.succeed("result"))
|
|
659
|
+
* })
|
|
660
|
+
*
|
|
661
|
+
* // Build the layer into Context - automatically manages scope and memoization
|
|
662
|
+
* const context = yield* Layer.build(dbLayer)
|
|
663
|
+
*
|
|
664
|
+
* // Extract the specific service from the built layer
|
|
665
|
+
* const database = Context.get(context, Database)
|
|
666
|
+
*
|
|
667
|
+
* return yield* database.query("SELECT * FROM users")
|
|
668
|
+
* })
|
|
669
|
+
* ```
|
|
670
|
+
*
|
|
671
|
+
* @category destructors
|
|
672
|
+
* @since 2.0.0
|
|
673
|
+
*/
|
|
674
|
+
export const build = <RIn, E, ROut>(
|
|
675
|
+
self: Layer<ROut, E, RIn>
|
|
676
|
+
): Effect<Context.Context<ROut>, E, RIn | Scope.Scope> =>
|
|
677
|
+
core.withFiber((fiber) =>
|
|
678
|
+
buildWithMemoMap(
|
|
679
|
+
self,
|
|
680
|
+
CurrentMemoMap.getOrCreate(fiber.context),
|
|
681
|
+
Context.getUnsafe(fiber.context, Scope.Scope)
|
|
682
|
+
)
|
|
683
|
+
)
|
|
684
|
+
|
|
685
|
+
/**
|
|
686
|
+
* Builds a layer using an explicit scope.
|
|
687
|
+
*
|
|
688
|
+
* **When to use**
|
|
689
|
+
*
|
|
690
|
+
* Use to control the lifetime of layer resources with a scope supplied by the
|
|
691
|
+
* caller.
|
|
692
|
+
*
|
|
693
|
+
* **Details**
|
|
694
|
+
*
|
|
695
|
+
* Resources created by the layer are released when the supplied scope is
|
|
696
|
+
* closed, unless a resource extends its own scope.
|
|
697
|
+
*
|
|
698
|
+
* **Example** (Building a layer with an explicit scope)
|
|
699
|
+
*
|
|
700
|
+
* ```ts
|
|
701
|
+
* import { Context, Effect, Layer, Scope } from "effect"
|
|
702
|
+
*
|
|
703
|
+
* class Database extends Context.Service<Database, {
|
|
704
|
+
* readonly query: (sql: string) => Effect.Effect<string>
|
|
705
|
+
* }>()("Database") {}
|
|
706
|
+
*
|
|
707
|
+
* // Build a layer with explicit scope control
|
|
708
|
+
* const program = Effect.gen(function*() {
|
|
709
|
+
* const scope = yield* Effect.scope
|
|
710
|
+
*
|
|
711
|
+
* const dbLayer = Layer.effect(Database, Effect.gen(function*() {
|
|
712
|
+
* console.log("Initializing database...")
|
|
713
|
+
* yield* Scope.addFinalizer(
|
|
714
|
+
* scope,
|
|
715
|
+
* Effect.sync(() => console.log("Database closed"))
|
|
716
|
+
* )
|
|
717
|
+
* return { query: Effect.fn("Database.query")((sql: string) => Effect.succeed(`Result: ${sql}`)) }
|
|
718
|
+
* }))
|
|
719
|
+
*
|
|
720
|
+
* // Build with specific scope - resources tied to this scope
|
|
721
|
+
* const context = yield* Layer.buildWithScope(dbLayer, scope)
|
|
722
|
+
* const database = Context.get(context, Database)
|
|
723
|
+
*
|
|
724
|
+
* return yield* database.query("SELECT * FROM users")
|
|
725
|
+
* // Database will be closed when scope is closed
|
|
726
|
+
* })
|
|
727
|
+
* ```
|
|
728
|
+
*
|
|
729
|
+
* @category destructors
|
|
730
|
+
* @since 2.0.0
|
|
731
|
+
*/
|
|
732
|
+
export const buildWithScope: {
|
|
733
|
+
(scope: Scope.Scope): <RIn, E, ROut>(self: Layer<ROut, E, RIn>) => Effect<Context.Context<ROut>, E, RIn>
|
|
734
|
+
<RIn, E, ROut>(self: Layer<ROut, E, RIn>, scope: Scope.Scope): Effect<Context.Context<ROut>, E, RIn>
|
|
735
|
+
} = dual(2, <RIn, E, ROut>(
|
|
736
|
+
self: Layer<ROut, E, RIn>,
|
|
737
|
+
scope: Scope.Scope
|
|
738
|
+
): Effect<Context.Context<ROut>, E, RIn> =>
|
|
739
|
+
core.withFiber((fiber) =>
|
|
740
|
+
buildWithMemoMap(
|
|
741
|
+
self,
|
|
742
|
+
CurrentMemoMap.getOrCreate(fiber.context),
|
|
743
|
+
scope
|
|
744
|
+
)
|
|
745
|
+
))
|
|
746
|
+
|
|
747
|
+
/**
|
|
748
|
+
* Constructs a layer that provides a single service from an already available
|
|
749
|
+
* value.
|
|
750
|
+
*
|
|
751
|
+
* **When to use**
|
|
752
|
+
*
|
|
753
|
+
* Use when you need a `Layer` that provides a service from an already
|
|
754
|
+
* constructed implementation without effectful acquisition.
|
|
755
|
+
*
|
|
756
|
+
* **Example** (Creating a layer from a service implementation)
|
|
757
|
+
*
|
|
758
|
+
* ```ts
|
|
759
|
+
* import { Context, Effect, Layer } from "effect"
|
|
760
|
+
*
|
|
761
|
+
* class Database extends Context.Service<Database, {
|
|
762
|
+
* readonly query: (sql: string) => Effect.Effect<string>
|
|
763
|
+
* }>()("Database") {}
|
|
764
|
+
*
|
|
765
|
+
* const DatabaseLive = Layer.succeed(Database, {
|
|
766
|
+
* query: Effect.fn("Database.query")((sql: string) => Effect.succeed(`Query result: ${sql}`))
|
|
767
|
+
* })
|
|
768
|
+
* ```
|
|
769
|
+
*
|
|
770
|
+
* @see {@link sync} for constructing layers from lazy values
|
|
771
|
+
*
|
|
772
|
+
* @category constructors
|
|
773
|
+
* @since 2.0.0
|
|
774
|
+
*/
|
|
775
|
+
export const succeed: {
|
|
776
|
+
<I, S>(service: Context.Key<I, S>): (resource: S) => Layer<I>
|
|
777
|
+
<I, S>(service: Context.Key<I, S>, resource: Types.NoInfer<S>): Layer<I>
|
|
778
|
+
} = function() {
|
|
779
|
+
if (arguments.length === 1) {
|
|
780
|
+
return (resource: any) => succeedContext(Context.make(arguments[0], resource))
|
|
781
|
+
}
|
|
782
|
+
return succeedContext(Context.make(arguments[0], arguments[1]))
|
|
783
|
+
} as any
|
|
784
|
+
|
|
785
|
+
/**
|
|
786
|
+
* Constructs a layer that provides all services in an already available
|
|
787
|
+
* `Context`.
|
|
788
|
+
*
|
|
789
|
+
* **When to use**
|
|
790
|
+
*
|
|
791
|
+
* Use when you need a `Layer` built from an existing `Context`, including when
|
|
792
|
+
* you need to provide multiple services at once.
|
|
793
|
+
*
|
|
794
|
+
* **Details**
|
|
795
|
+
*
|
|
796
|
+
* This is a more general version of `succeed` that allows you to provide
|
|
797
|
+
* multiple services at once through a `Context`.
|
|
798
|
+
*
|
|
799
|
+
* **Example** (Providing multiple services from a context)
|
|
800
|
+
*
|
|
801
|
+
* ```ts
|
|
802
|
+
* import { Context, Effect, Layer } from "effect"
|
|
803
|
+
*
|
|
804
|
+
* class Database extends Context.Service<Database, {
|
|
805
|
+
* readonly query: (sql: string) => Effect.Effect<string>
|
|
806
|
+
* }>()("Database") {}
|
|
807
|
+
*
|
|
808
|
+
* class Logger extends Context.Service<Logger, {
|
|
809
|
+
* readonly log: (msg: string) => Effect.Effect<void>
|
|
810
|
+
* }>()("Logger") {}
|
|
811
|
+
*
|
|
812
|
+
* const context = Context.make(Database, {
|
|
813
|
+
* query: Effect.fn("Database.query")((sql: string) => Effect.succeed("result"))
|
|
814
|
+
* }).pipe(
|
|
815
|
+
* Context.add(Logger, {
|
|
816
|
+
* log: (msg: string) => Effect.sync(() => console.log(msg))
|
|
817
|
+
* })
|
|
818
|
+
* )
|
|
819
|
+
*
|
|
820
|
+
* const layer = Layer.succeedContext(context)
|
|
821
|
+
* ```
|
|
822
|
+
*
|
|
823
|
+
* @see {@link succeed} for providing a single service from a value
|
|
824
|
+
*
|
|
825
|
+
* @category constructors
|
|
826
|
+
* @since 2.0.0
|
|
827
|
+
*/
|
|
828
|
+
export const succeedContext = <A>(context: Context.Context<A>): Layer<A> =>
|
|
829
|
+
fromBuildUnsafe(constant(internalEffect.succeed(context)))
|
|
830
|
+
|
|
831
|
+
/**
|
|
832
|
+
* An empty layer that provides no services, cannot fail, has no requirements,
|
|
833
|
+
* and performs no construction or finalization work.
|
|
834
|
+
*
|
|
835
|
+
* **When to use**
|
|
836
|
+
*
|
|
837
|
+
* Use as the no-op branch when conditionally composing layers.
|
|
838
|
+
*
|
|
839
|
+
* **Example** (Disabling optional lifecycle work)
|
|
840
|
+
*
|
|
841
|
+
* ```ts
|
|
842
|
+
* import { Console, Layer } from "effect"
|
|
843
|
+
*
|
|
844
|
+
* declare const flag: boolean
|
|
845
|
+
*
|
|
846
|
+
* const StartupLogLive = flag
|
|
847
|
+
* ? Layer.effectDiscard(Console.log("application starting"))
|
|
848
|
+
* : Layer.empty
|
|
849
|
+
* ```
|
|
850
|
+
*
|
|
851
|
+
* @see {@link effectDiscard} for running an effect while providing no services
|
|
852
|
+
*
|
|
853
|
+
* @category constructors
|
|
854
|
+
* @since 2.0.0
|
|
855
|
+
*/
|
|
856
|
+
export const empty: Layer<never> = succeedContext(Context.empty())
|
|
857
|
+
|
|
858
|
+
/**
|
|
859
|
+
* Constructs a layer lazily that provides a single service.
|
|
860
|
+
*
|
|
861
|
+
* **When to use**
|
|
862
|
+
*
|
|
863
|
+
* Use when you need a `Layer` that provides one service whose value is created
|
|
864
|
+
* synchronously, but creation should be deferred until the layer is built.
|
|
865
|
+
*
|
|
866
|
+
* **Details**
|
|
867
|
+
*
|
|
868
|
+
* This is a lazy version of `succeed` where the service value is computed
|
|
869
|
+
* synchronously only when the layer is built.
|
|
870
|
+
*
|
|
871
|
+
* **Example** (Lazily providing a service)
|
|
872
|
+
*
|
|
873
|
+
* ```ts
|
|
874
|
+
* import { Context, Effect, Layer } from "effect"
|
|
875
|
+
*
|
|
876
|
+
* class Database extends Context.Service<Database, {
|
|
877
|
+
* readonly query: (sql: string) => Effect.Effect<string>
|
|
878
|
+
* }>()("Database") {}
|
|
879
|
+
*
|
|
880
|
+
* const layer = Layer.sync(Database, () => ({
|
|
881
|
+
* query: (sql: string) => Effect.succeed(`Query: ${sql}`)
|
|
882
|
+
* }))
|
|
883
|
+
* ```
|
|
884
|
+
*
|
|
885
|
+
* @see {@link succeed} for constructing layers from static values
|
|
886
|
+
*
|
|
887
|
+
* @category constructors
|
|
888
|
+
* @since 2.0.0
|
|
889
|
+
*/
|
|
890
|
+
export const sync: {
|
|
891
|
+
<I, S>(service: Context.Key<I, S>): (evaluate: LazyArg<S>) => Layer<I>
|
|
892
|
+
<I, S>(service: Context.Key<I, S>, evaluate: LazyArg<Types.NoInfer<S>>): Layer<I>
|
|
893
|
+
} = function() {
|
|
894
|
+
if (arguments.length === 1) {
|
|
895
|
+
return (evaluate: LazyArg<any>) => syncContext(() => Context.make(arguments[0], evaluate()))
|
|
896
|
+
}
|
|
897
|
+
return syncContext(() => Context.make(arguments[0], arguments[1]()))
|
|
898
|
+
} as any
|
|
899
|
+
|
|
900
|
+
/**
|
|
901
|
+
* Constructs a layer lazily that provides all services in a `Context`.
|
|
902
|
+
*
|
|
903
|
+
* **When to use**
|
|
904
|
+
*
|
|
905
|
+
* Use when you need a `Layer` that creates multiple services synchronously but
|
|
906
|
+
* defers that work until the layer is built.
|
|
907
|
+
*
|
|
908
|
+
* **Details**
|
|
909
|
+
*
|
|
910
|
+
* This is a lazy version of `succeedContext` where the `Context` is computed
|
|
911
|
+
* synchronously only when the layer is built.
|
|
912
|
+
*
|
|
913
|
+
* **Example** (Lazily providing a context)
|
|
914
|
+
*
|
|
915
|
+
* ```ts
|
|
916
|
+
* import { Context, Effect, Layer } from "effect"
|
|
917
|
+
*
|
|
918
|
+
* class Database extends Context.Service<Database, {
|
|
919
|
+
* readonly query: (sql: string) => Effect.Effect<string>
|
|
920
|
+
* }>()("Database") {}
|
|
921
|
+
*
|
|
922
|
+
* const layer = Layer.syncContext(() =>
|
|
923
|
+
* Context.make(Database, {
|
|
924
|
+
* query: (sql: string) => Effect.succeed(`Query: ${sql}`)
|
|
925
|
+
* })
|
|
926
|
+
* )
|
|
927
|
+
* ```
|
|
928
|
+
*
|
|
929
|
+
* @see {@link sync} for lazily providing a single service
|
|
930
|
+
* @see {@link succeedContext} for providing an already available context
|
|
931
|
+
*
|
|
932
|
+
* @category constructors
|
|
933
|
+
* @since 2.0.0
|
|
934
|
+
*/
|
|
935
|
+
export const syncContext = <A>(evaluate: LazyArg<Context.Context<A>>): Layer<A> =>
|
|
936
|
+
fromBuildMemo(constant(internalEffect.sync(evaluate)))
|
|
937
|
+
|
|
938
|
+
/**
|
|
939
|
+
* Constructs a layer from an effect that produces a single service.
|
|
940
|
+
*
|
|
941
|
+
* **When to use**
|
|
942
|
+
*
|
|
943
|
+
* Use when you need to construct a `Layer`-provided service with an `Effect`,
|
|
944
|
+
* dependencies, or scoped resource acquisition.
|
|
945
|
+
*
|
|
946
|
+
* **Details**
|
|
947
|
+
*
|
|
948
|
+
* This allows you to create a `Layer` from an `Effect` that produces a service.
|
|
949
|
+
* The `Effect` is executed in the scope of the layer, allowing for proper
|
|
950
|
+
* resource management.
|
|
951
|
+
*
|
|
952
|
+
* **Example** (Creating a layer from an effect)
|
|
953
|
+
*
|
|
954
|
+
* ```ts
|
|
955
|
+
* import { Context, Effect, Layer } from "effect"
|
|
956
|
+
*
|
|
957
|
+
* class Database extends Context.Service<Database, {
|
|
958
|
+
* readonly query: (sql: string) => Effect.Effect<string>
|
|
959
|
+
* }>()("Database") {}
|
|
960
|
+
*
|
|
961
|
+
* const layer = Layer.effect(Database,
|
|
962
|
+
* Effect.sync(() => ({
|
|
963
|
+
* query: (sql: string) => Effect.succeed(`Query: ${sql}`)
|
|
964
|
+
* }))
|
|
965
|
+
* )
|
|
966
|
+
* ```
|
|
967
|
+
*
|
|
968
|
+
* @see {@link effectContext} for effectfully providing multiple services
|
|
969
|
+
* @see {@link effectDiscard} for running construction work without providing services
|
|
970
|
+
*
|
|
971
|
+
* @category constructors
|
|
972
|
+
* @since 2.0.0
|
|
973
|
+
*/
|
|
974
|
+
export const effect: {
|
|
975
|
+
<I, S>(service: Context.Key<I, S>): <E, R>(
|
|
976
|
+
effect: Effect<S, E, R>
|
|
977
|
+
) => Layer<I, E, Exclude<R, Scope.Scope>>
|
|
978
|
+
<I, S, E, R>(
|
|
979
|
+
service: Context.Key<I, S>,
|
|
980
|
+
effect: Effect<Types.NoInfer<S>, E, R>
|
|
981
|
+
): Layer<I, E, Exclude<R, Scope.Scope>>
|
|
982
|
+
} = function() {
|
|
983
|
+
if (arguments.length === 1) {
|
|
984
|
+
return (effect: any) => effectImpl(arguments[0], effect)
|
|
985
|
+
}
|
|
986
|
+
return effectImpl(arguments[0], arguments[1])
|
|
987
|
+
} as any
|
|
988
|
+
|
|
989
|
+
const effectImpl = <I, S, E, R>(
|
|
990
|
+
service: Context.Key<I, S>,
|
|
991
|
+
effect: Effect<S, E, R>
|
|
992
|
+
): Layer<I, E, Exclude<R, Scope.Scope>> =>
|
|
993
|
+
effectContext(internalEffect.map(effect, (value) => Context.make(service, value)))
|
|
994
|
+
|
|
995
|
+
/**
|
|
996
|
+
* Constructs a layer from an effect that produces all services in a `Context`.
|
|
997
|
+
*
|
|
998
|
+
* **When to use**
|
|
999
|
+
*
|
|
1000
|
+
* Use when you need a `Layer` that effectfully constructs a `Context` with
|
|
1001
|
+
* multiple services.
|
|
1002
|
+
*
|
|
1003
|
+
* **Details**
|
|
1004
|
+
*
|
|
1005
|
+
* This allows you to create a `Layer` from an effectful computation that
|
|
1006
|
+
* returns multiple services. The `Effect` is executed in the scope of the
|
|
1007
|
+
* layer.
|
|
1008
|
+
*
|
|
1009
|
+
* **Example** (Creating a layer from an effectful context)
|
|
1010
|
+
*
|
|
1011
|
+
* ```ts
|
|
1012
|
+
* import { Context, Effect, Layer } from "effect"
|
|
1013
|
+
*
|
|
1014
|
+
* class Database extends Context.Service<
|
|
1015
|
+
* Database,
|
|
1016
|
+
* { readonly query: (sql: string) => Effect.Effect<string> }
|
|
1017
|
+
* >()("Database") {}
|
|
1018
|
+
*
|
|
1019
|
+
* const layer = Layer.effectContext(
|
|
1020
|
+
* Effect.succeed(Context.make(Database, {
|
|
1021
|
+
* query: (sql: string) => Effect.succeed(`Query: ${sql}`)
|
|
1022
|
+
* }))
|
|
1023
|
+
* )
|
|
1024
|
+
* ```
|
|
1025
|
+
*
|
|
1026
|
+
* @see {@link effect} for effectfully providing a single service
|
|
1027
|
+
*
|
|
1028
|
+
* @category constructors
|
|
1029
|
+
* @since 2.0.0
|
|
1030
|
+
*/
|
|
1031
|
+
export const effectContext = <A, E, R>(
|
|
1032
|
+
effect: Effect<Context.Context<A>, E, R>
|
|
1033
|
+
): Layer<A, E, Exclude<R, Scope.Scope>> => fromBuildMemo((_, scope) => Scope.provide(effect, scope))
|
|
1034
|
+
|
|
1035
|
+
/**
|
|
1036
|
+
* Constructs a layer from an effect, discarding its value and providing no
|
|
1037
|
+
* services.
|
|
1038
|
+
*
|
|
1039
|
+
* **When to use**
|
|
1040
|
+
*
|
|
1041
|
+
* Use when layer construction should run an Effect for its side effects while providing no
|
|
1042
|
+
* services.
|
|
1043
|
+
*
|
|
1044
|
+
* **Example** (Running an effect during layer construction)
|
|
1045
|
+
*
|
|
1046
|
+
* ```ts
|
|
1047
|
+
* import { Effect, Layer } from "effect"
|
|
1048
|
+
*
|
|
1049
|
+
* const initLayer = Layer.effectDiscard(
|
|
1050
|
+
* Effect.sync(() => {
|
|
1051
|
+
* console.log("Initializing application...")
|
|
1052
|
+
* })
|
|
1053
|
+
* )
|
|
1054
|
+
* ```
|
|
1055
|
+
*
|
|
1056
|
+
* @see {@link empty} for a no-op layer that performs no construction work
|
|
1057
|
+
*
|
|
1058
|
+
* @category constructors
|
|
1059
|
+
* @since 2.0.0
|
|
1060
|
+
*/
|
|
1061
|
+
export const effectDiscard = <X, E, R>(effect: Effect<X, E, R>): Layer<never, E, Exclude<R, Scope.Scope>> =>
|
|
1062
|
+
effectContext(internalEffect.as(effect, Context.empty()))
|
|
1063
|
+
|
|
1064
|
+
/**
|
|
1065
|
+
* Constructs a layer lazily using the specified factory.
|
|
1066
|
+
*
|
|
1067
|
+
* **Details**
|
|
1068
|
+
*
|
|
1069
|
+
* The factory is evaluated only when the suspended layer is first built, and
|
|
1070
|
+
* the result is memoized with normal layer sharing semantics.
|
|
1071
|
+
*
|
|
1072
|
+
* **Example** (Choosing a layer lazily)
|
|
1073
|
+
*
|
|
1074
|
+
* ```ts
|
|
1075
|
+
* import { Context, Layer } from "effect"
|
|
1076
|
+
*
|
|
1077
|
+
* class Config extends Context.Service<Config, string>()("Config") {}
|
|
1078
|
+
*
|
|
1079
|
+
* const useProd = true
|
|
1080
|
+
*
|
|
1081
|
+
* const layer = Layer.suspend(() =>
|
|
1082
|
+
* useProd
|
|
1083
|
+
* ? Layer.succeed(Config, "https://api.example.com")
|
|
1084
|
+
* : Layer.succeed(Config, "http://localhost:3000")
|
|
1085
|
+
* )
|
|
1086
|
+
* ```
|
|
1087
|
+
*
|
|
1088
|
+
* @category constructors
|
|
1089
|
+
* @since 2.0.0
|
|
1090
|
+
*/
|
|
1091
|
+
export const suspend = <A, E, R>(evaluate: LazyArg<Layer<A, E, R>>): Layer<A, E, R> =>
|
|
1092
|
+
fromBuildMemo((memoMap, scope) => internalEffect.suspend(() => evaluate().build(memoMap, scope)))
|
|
1093
|
+
|
|
1094
|
+
/**
|
|
1095
|
+
* Unwraps a `Layer` from an `Effect`, flattening the nested structure.
|
|
1096
|
+
*
|
|
1097
|
+
* **When to use**
|
|
1098
|
+
*
|
|
1099
|
+
* Use when you have an `Effect` that produces a `Layer` and you want to
|
|
1100
|
+
* use that layer directly.
|
|
1101
|
+
*
|
|
1102
|
+
* **Details**
|
|
1103
|
+
*
|
|
1104
|
+
* The resulting Layer will have the combined error and dependency types from
|
|
1105
|
+
* both the outer Effect and the inner Layer.
|
|
1106
|
+
*
|
|
1107
|
+
* **Example** (Unwrapping an effectful layer)
|
|
1108
|
+
*
|
|
1109
|
+
* ```ts
|
|
1110
|
+
* import { Context, Effect, Layer } from "effect"
|
|
1111
|
+
*
|
|
1112
|
+
* class Database extends Context.Service<Database, {
|
|
1113
|
+
* readonly query: (sql: string) => Effect.Effect<string>
|
|
1114
|
+
* }>()("Database") {}
|
|
1115
|
+
*
|
|
1116
|
+
* const layerEffect = Effect.succeed(
|
|
1117
|
+
* Layer.succeed(Database, { query: Effect.fn("Database.query")((sql: string) => Effect.succeed("result")) })
|
|
1118
|
+
* )
|
|
1119
|
+
*
|
|
1120
|
+
* const unwrappedLayer = Layer.unwrap(layerEffect)
|
|
1121
|
+
* ```
|
|
1122
|
+
*
|
|
1123
|
+
* @category converting
|
|
1124
|
+
* @since 4.0.0
|
|
1125
|
+
*/
|
|
1126
|
+
export const unwrap = <A, E1, R1, E, R>(
|
|
1127
|
+
self: Effect<Layer<A, E1, R1>, E, R>
|
|
1128
|
+
): Layer<A, E | E1, R1 | Exclude<R, Scope.Scope>> => {
|
|
1129
|
+
const service = Context.Service<Layer<A, E1, R1>>("effect/Layer/unwrap")
|
|
1130
|
+
return flatMap(effect(service)(self), Context.get(service))
|
|
1131
|
+
}
|
|
1132
|
+
|
|
1133
|
+
const mergeAllEffect = <Layers extends [Layer<never, any, any>, ...Array<Layer<never, any, any>>]>(
|
|
1134
|
+
layers: Layers,
|
|
1135
|
+
memoMap: MemoMap,
|
|
1136
|
+
scope: Scope.Scope
|
|
1137
|
+
): Effect<
|
|
1138
|
+
Context.Context<{ [k in keyof Layers]: Success<Layers[k]> }[number]>,
|
|
1139
|
+
{ [k in keyof Layers]: Error<Layers[k]> }[number],
|
|
1140
|
+
{ [k in keyof Layers]: Services<Layers[k]> }[number]
|
|
1141
|
+
> => {
|
|
1142
|
+
const parentScope = Scope.forkUnsafe(scope, "parallel")
|
|
1143
|
+
return internalEffect.forEach(layers, (layer) => layer.build(memoMap, Scope.forkUnsafe(parentScope, "sequential")), {
|
|
1144
|
+
concurrency: layers.length
|
|
1145
|
+
}).pipe(
|
|
1146
|
+
internalEffect.map((context) => Context.mergeAll(...(context as any)))
|
|
1147
|
+
)
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1150
|
+
/**
|
|
1151
|
+
* Combines all the provided layers concurrently, creating a new layer with
|
|
1152
|
+
* merged input, error, and output types.
|
|
1153
|
+
*
|
|
1154
|
+
* **When to use**
|
|
1155
|
+
*
|
|
1156
|
+
* Use when you need to combine multiple independent layers.
|
|
1157
|
+
*
|
|
1158
|
+
* **Details**
|
|
1159
|
+
*
|
|
1160
|
+
* All layers are built concurrently, and their outputs are merged into a single layer.
|
|
1161
|
+
*
|
|
1162
|
+
* If multiple merged layers depend on the same layer value, that dependency is
|
|
1163
|
+
* shared by default. Reuse a named layer value when you want services to share
|
|
1164
|
+
* the same resource, such as one database pool.
|
|
1165
|
+
*
|
|
1166
|
+
* **Example** (Merging independent layers)
|
|
1167
|
+
*
|
|
1168
|
+
* ```ts
|
|
1169
|
+
* import { Context, Effect, Layer } from "effect"
|
|
1170
|
+
*
|
|
1171
|
+
* class Database extends Context.Service<Database, {
|
|
1172
|
+
* readonly query: (sql: string) => Effect.Effect<string>
|
|
1173
|
+
* }>()("Database") {}
|
|
1174
|
+
*
|
|
1175
|
+
* class Logger extends Context.Service<Logger, {
|
|
1176
|
+
* readonly log: (msg: string) => Effect.Effect<void>
|
|
1177
|
+
* }>()("Logger") {}
|
|
1178
|
+
*
|
|
1179
|
+
* const dbLayer = Layer.succeed(Database, {
|
|
1180
|
+
* query: Effect.fn("Database.query")((sql: string) => Effect.succeed("result"))
|
|
1181
|
+
* })
|
|
1182
|
+
* const loggerLayer = Layer.succeed(Logger, {
|
|
1183
|
+
* log: Effect.fn("Logger.log")((msg: string) => Effect.sync(() => console.log(msg)))
|
|
1184
|
+
* })
|
|
1185
|
+
*
|
|
1186
|
+
* const mergedLayer = Layer.mergeAll(dbLayer, loggerLayer)
|
|
1187
|
+
* ```
|
|
1188
|
+
*
|
|
1189
|
+
* @see {@link merge} for merging one layer with another layer or array
|
|
1190
|
+
*
|
|
1191
|
+
* @category zipping
|
|
1192
|
+
* @since 2.0.0
|
|
1193
|
+
*/
|
|
1194
|
+
export const mergeAll = <Layers extends [Layer<never, any, any>, ...Array<Layer<never, any, any>>]>(
|
|
1195
|
+
...layers: Layers
|
|
1196
|
+
): Layer<
|
|
1197
|
+
Success<Layers[number]>,
|
|
1198
|
+
Error<Layers[number]>,
|
|
1199
|
+
Services<Layers[number]>
|
|
1200
|
+
> => fromBuild((memoMap, scope) => mergeAllEffect(layers, memoMap, scope))
|
|
1201
|
+
|
|
1202
|
+
/**
|
|
1203
|
+
* Merges this layer with another layer concurrently, producing a new layer with
|
|
1204
|
+
* combined input, error, and output types.
|
|
1205
|
+
*
|
|
1206
|
+
* **When to use**
|
|
1207
|
+
*
|
|
1208
|
+
* Use to combine an existing `Layer` with another `Layer` or an array of
|
|
1209
|
+
* layers while preserving pipeline style.
|
|
1210
|
+
*
|
|
1211
|
+
* **Details**
|
|
1212
|
+
*
|
|
1213
|
+
* This is a binary version of `mergeAll` that merges exactly two layers or one
|
|
1214
|
+
* layer with an array of layers. The layers are built concurrently and their
|
|
1215
|
+
* outputs are combined.
|
|
1216
|
+
*
|
|
1217
|
+
* **Example** (Merging two layers)
|
|
1218
|
+
*
|
|
1219
|
+
* ```ts
|
|
1220
|
+
* import { Context, Effect, Layer } from "effect"
|
|
1221
|
+
*
|
|
1222
|
+
* class Database extends Context.Service<Database, {
|
|
1223
|
+
* readonly query: (sql: string) => Effect.Effect<string>
|
|
1224
|
+
* }>()("Database") {}
|
|
1225
|
+
*
|
|
1226
|
+
* class Logger extends Context.Service<Logger, {
|
|
1227
|
+
* readonly log: (msg: string) => Effect.Effect<void>
|
|
1228
|
+
* }>()("Logger") {}
|
|
1229
|
+
*
|
|
1230
|
+
* const dbLayer = Layer.succeed(Database, {
|
|
1231
|
+
* query: Effect.fn("Database.query")((sql: string) => Effect.succeed("result"))
|
|
1232
|
+
* })
|
|
1233
|
+
* const loggerLayer = Layer.succeed(Logger, {
|
|
1234
|
+
* log: Effect.fn("Logger.log")((msg: string) => Effect.sync(() => console.log(msg)))
|
|
1235
|
+
* })
|
|
1236
|
+
*
|
|
1237
|
+
* const mergedLayer = Layer.merge(dbLayer, loggerLayer)
|
|
1238
|
+
* ```
|
|
1239
|
+
*
|
|
1240
|
+
* @see {@link mergeAll} for merging several layers at once
|
|
1241
|
+
*
|
|
1242
|
+
* @category zipping
|
|
1243
|
+
* @since 2.0.0
|
|
1244
|
+
*/
|
|
1245
|
+
export const merge: {
|
|
1246
|
+
<RIn, E, ROut>(
|
|
1247
|
+
that: Layer<ROut, E, RIn>
|
|
1248
|
+
): <RIn2, E2, ROut2>(self: Layer<ROut2, E2, RIn2>) => Layer<ROut | ROut2, E | E2, RIn | RIn2>
|
|
1249
|
+
<const Layers extends [Any, ...Array<Any>]>(
|
|
1250
|
+
that: Layers
|
|
1251
|
+
): <A, E, R>(
|
|
1252
|
+
self: Layer<A, E, R>
|
|
1253
|
+
) => Layer<
|
|
1254
|
+
A | Success<Layers[number]>,
|
|
1255
|
+
E | Error<Layers[number]>,
|
|
1256
|
+
| Services<Layers[number]>
|
|
1257
|
+
| R
|
|
1258
|
+
>
|
|
1259
|
+
<RIn2, E2, ROut2, RIn, E, ROut>(
|
|
1260
|
+
self: Layer<ROut2, E2, RIn2>,
|
|
1261
|
+
that: Layer<ROut, E, RIn>
|
|
1262
|
+
): Layer<ROut | ROut2, E | E2, RIn | RIn2>
|
|
1263
|
+
<A, E, R, const Layers extends [Any, ...Array<Any>]>(
|
|
1264
|
+
self: Layer<A, E, R>,
|
|
1265
|
+
that: Layers
|
|
1266
|
+
): Layer<
|
|
1267
|
+
A | Success<Layers[number]>,
|
|
1268
|
+
E | Error<Layers[number]>,
|
|
1269
|
+
| Services<Layers[number]>
|
|
1270
|
+
| R
|
|
1271
|
+
>
|
|
1272
|
+
} = dual(2, (
|
|
1273
|
+
self: Layer<any, any, any>,
|
|
1274
|
+
that: Layer<any, any, any> | ReadonlyArray<Layer<any, any, any>>
|
|
1275
|
+
) => mergeAll(self, ...(Array.isArray(that) ? that : [that])))
|
|
1276
|
+
|
|
1277
|
+
const provideWith = (
|
|
1278
|
+
self: Layer<any, any, any>,
|
|
1279
|
+
that: Layer<any, any, any> | ReadonlyArray<Layer<any, any, any>>,
|
|
1280
|
+
f: (
|
|
1281
|
+
selfContext: Context.Context<any>,
|
|
1282
|
+
thatContext: Context.Context<any>
|
|
1283
|
+
) => Context.Context<any>
|
|
1284
|
+
) =>
|
|
1285
|
+
fromBuild((memoMap, scope) =>
|
|
1286
|
+
internalEffect.flatMap(
|
|
1287
|
+
Array.isArray(that)
|
|
1288
|
+
? mergeAllEffect(that as NonEmptyArray<Layer<any, any, any>>, memoMap, scope)
|
|
1289
|
+
: (that as Layer<any, any, any>).build(memoMap, scope),
|
|
1290
|
+
(context) =>
|
|
1291
|
+
self.build(memoMap, scope).pipe(
|
|
1292
|
+
internalEffect.provideContext(context),
|
|
1293
|
+
internalEffect.map((merged) => f(merged, context))
|
|
1294
|
+
)
|
|
1295
|
+
)
|
|
1296
|
+
)
|
|
1297
|
+
|
|
1298
|
+
/**
|
|
1299
|
+
* Feeds the output services of the dependency layer into the requirements of
|
|
1300
|
+
* this layer, returning a layer that only provides the services from this layer.
|
|
1301
|
+
*
|
|
1302
|
+
* **When to use**
|
|
1303
|
+
*
|
|
1304
|
+
* Use when you need to hide an implementation dependency layer from callers.
|
|
1305
|
+
*
|
|
1306
|
+
* **Details**
|
|
1307
|
+
*
|
|
1308
|
+
* In `serviceLayer.pipe(Layer.provide(dependencyLayer))`, the dependency layer is
|
|
1309
|
+
* built first and is used to satisfy the requirements of `serviceLayer`.
|
|
1310
|
+
*
|
|
1311
|
+
* **Example** (Providing layer dependencies)
|
|
1312
|
+
*
|
|
1313
|
+
* ```ts
|
|
1314
|
+
* import { Context, Effect, Layer } from "effect"
|
|
1315
|
+
*
|
|
1316
|
+
* class Database extends Context.Service<Database, {
|
|
1317
|
+
* readonly query: (sql: string) => Effect.Effect<string>
|
|
1318
|
+
* }>()("Database") {}
|
|
1319
|
+
*
|
|
1320
|
+
* class UserService extends Context.Service<UserService, {
|
|
1321
|
+
* readonly getUser: (id: string) => Effect.Effect<{
|
|
1322
|
+
* id: string
|
|
1323
|
+
* name: string
|
|
1324
|
+
* }>
|
|
1325
|
+
* }>()("UserService") {}
|
|
1326
|
+
*
|
|
1327
|
+
* class Logger extends Context.Service<Logger, {
|
|
1328
|
+
* readonly log: (msg: string) => Effect.Effect<void>
|
|
1329
|
+
* }>()("Logger") {}
|
|
1330
|
+
*
|
|
1331
|
+
* // Create dependency layers
|
|
1332
|
+
* const databaseLayer = Layer.succeed(Database, {
|
|
1333
|
+
* query: Effect.fn("Database.query")((sql: string) => Effect.succeed(`DB: ${sql}`))
|
|
1334
|
+
* })
|
|
1335
|
+
*
|
|
1336
|
+
* const loggerLayer = Layer.succeed(Logger, {
|
|
1337
|
+
* log: Effect.fn("Logger.log")((msg: string) => Effect.sync(() => console.log(`[LOG] ${msg}`)))
|
|
1338
|
+
* })
|
|
1339
|
+
*
|
|
1340
|
+
* // UserService depends on Database and Logger
|
|
1341
|
+
* const userServiceLayer = Layer.effect(UserService, Effect.gen(function*() {
|
|
1342
|
+
* const database = yield* Database
|
|
1343
|
+
* const logger = yield* Logger
|
|
1344
|
+
*
|
|
1345
|
+
* return {
|
|
1346
|
+
* getUser: Effect.fn("UserService.getUser")(function*(id: string) {
|
|
1347
|
+
* yield* logger.log(`Looking up user ${id}`)
|
|
1348
|
+
* const result = yield* database.query(
|
|
1349
|
+
* `SELECT * FROM users WHERE id = ${id}`
|
|
1350
|
+
* )
|
|
1351
|
+
* return { id, name: result }
|
|
1352
|
+
* })
|
|
1353
|
+
* }
|
|
1354
|
+
* }))
|
|
1355
|
+
*
|
|
1356
|
+
* // Provide dependencies to UserService layer
|
|
1357
|
+
* const userServiceWithDependencies = userServiceLayer.pipe(
|
|
1358
|
+
* Layer.provide(Layer.mergeAll(databaseLayer, loggerLayer))
|
|
1359
|
+
* )
|
|
1360
|
+
*
|
|
1361
|
+
* // Now UserService layer has no dependencies
|
|
1362
|
+
* const program = Effect.gen(function*() {
|
|
1363
|
+
* const userService = yield* UserService
|
|
1364
|
+
* return yield* userService.getUser("123")
|
|
1365
|
+
* }).pipe(
|
|
1366
|
+
* Effect.provide(userServiceWithDependencies)
|
|
1367
|
+
* )
|
|
1368
|
+
* ```
|
|
1369
|
+
*
|
|
1370
|
+
* @see {@link provideMerge} for retaining the dependency services
|
|
1371
|
+
*
|
|
1372
|
+
* @category providing services
|
|
1373
|
+
* @since 2.0.0
|
|
1374
|
+
*/
|
|
1375
|
+
export const provide: {
|
|
1376
|
+
<RIn, E, ROut>(
|
|
1377
|
+
that: Layer<ROut, E, RIn>
|
|
1378
|
+
): <RIn2, E2, ROut2>(self: Layer<ROut2, E2, RIn2>) => Layer<ROut2, E | E2, RIn | Exclude<RIn2, ROut>>
|
|
1379
|
+
<const Layers extends [Any, ...Array<Any>]>(
|
|
1380
|
+
that: Layers
|
|
1381
|
+
): <A, E, R>(
|
|
1382
|
+
self: Layer<A, E, R>
|
|
1383
|
+
) => Layer<
|
|
1384
|
+
A,
|
|
1385
|
+
E | Error<Layers[number]>,
|
|
1386
|
+
| Services<Layers[number]>
|
|
1387
|
+
| Exclude<R, Success<Layers[number]>>
|
|
1388
|
+
>
|
|
1389
|
+
<RIn2, E2, ROut2, RIn, E, ROut>(
|
|
1390
|
+
self: Layer<ROut2, E2, RIn2>,
|
|
1391
|
+
that: Layer<ROut, E, RIn>
|
|
1392
|
+
): Layer<ROut2, E | E2, RIn | Exclude<RIn2, ROut>>
|
|
1393
|
+
<A, E, R, const Layers extends [Any, ...Array<Any>]>(
|
|
1394
|
+
self: Layer<A, E, R>,
|
|
1395
|
+
that: Layers
|
|
1396
|
+
): Layer<
|
|
1397
|
+
A,
|
|
1398
|
+
E | Error<Layers[number]>,
|
|
1399
|
+
| Services<Layers[number]>
|
|
1400
|
+
| Exclude<R, Success<Layers[number]>>
|
|
1401
|
+
>
|
|
1402
|
+
} = dual(2, (
|
|
1403
|
+
self: Layer<any, any, any>,
|
|
1404
|
+
that: Layer<any, any, any> | ReadonlyArray<Layer<any, any, any>>
|
|
1405
|
+
) => provideWith(self, that, identity))
|
|
1406
|
+
|
|
1407
|
+
/**
|
|
1408
|
+
* Feeds the output services of the dependency layer into the requirements of
|
|
1409
|
+
* this layer, returning a layer that provides both sets of services.
|
|
1410
|
+
*
|
|
1411
|
+
* **When to use**
|
|
1412
|
+
*
|
|
1413
|
+
* Use when you need to compose `Layer`s while keeping both the constructed
|
|
1414
|
+
* service and the dependency used to build it available.
|
|
1415
|
+
*
|
|
1416
|
+
* **Details**
|
|
1417
|
+
*
|
|
1418
|
+
* Prefer {@link provide} when the dependency should stay private.
|
|
1419
|
+
*
|
|
1420
|
+
* **Example** (Providing dependencies while retaining services)
|
|
1421
|
+
*
|
|
1422
|
+
* ```ts
|
|
1423
|
+
* import { Context, Effect, Layer } from "effect"
|
|
1424
|
+
*
|
|
1425
|
+
* class Database extends Context.Service<Database, {
|
|
1426
|
+
* readonly query: (sql: string) => Effect.Effect<string>
|
|
1427
|
+
* }>()("Database") {}
|
|
1428
|
+
*
|
|
1429
|
+
* class Logger extends Context.Service<Logger, {
|
|
1430
|
+
* readonly log: (msg: string) => Effect.Effect<void>
|
|
1431
|
+
* }>()("Logger") {}
|
|
1432
|
+
*
|
|
1433
|
+
* class UserService extends Context.Service<UserService, {
|
|
1434
|
+
* readonly getUser: (id: string) => Effect.Effect<{
|
|
1435
|
+
* id: string
|
|
1436
|
+
* name: string
|
|
1437
|
+
* }>
|
|
1438
|
+
* }>()("UserService") {}
|
|
1439
|
+
*
|
|
1440
|
+
* // Create dependency layers
|
|
1441
|
+
* const databaseLayer = Layer.succeed(Database, {
|
|
1442
|
+
* query: Effect.fn("Database.query")((sql: string) => Effect.succeed(`DB: ${sql}`))
|
|
1443
|
+
* })
|
|
1444
|
+
*
|
|
1445
|
+
* const loggerLayer = Layer.succeed(Logger, {
|
|
1446
|
+
* log: Effect.fn("Logger.log")((msg: string) => Effect.sync(() => console.log(`[LOG] ${msg}`)))
|
|
1447
|
+
* })
|
|
1448
|
+
*
|
|
1449
|
+
* // UserService depends on Database and Logger
|
|
1450
|
+
* const userServiceLayer = Layer.effect(UserService, Effect.gen(function*() {
|
|
1451
|
+
* const database = yield* Database
|
|
1452
|
+
* const logger = yield* Logger
|
|
1453
|
+
*
|
|
1454
|
+
* return {
|
|
1455
|
+
* getUser: Effect.fn("UserService.getUser")(function*(id: string) {
|
|
1456
|
+
* yield* logger.log(`Looking up user ${id}`)
|
|
1457
|
+
* const result = yield* database.query(
|
|
1458
|
+
* `SELECT * FROM users WHERE id = ${id}`
|
|
1459
|
+
* )
|
|
1460
|
+
* return { id, name: result }
|
|
1461
|
+
* })
|
|
1462
|
+
* }
|
|
1463
|
+
* }))
|
|
1464
|
+
*
|
|
1465
|
+
* // Provide dependencies and merge all services together
|
|
1466
|
+
* const allServicesLayer = userServiceLayer.pipe(
|
|
1467
|
+
* Layer.provideMerge(Layer.mergeAll(databaseLayer, loggerLayer))
|
|
1468
|
+
* )
|
|
1469
|
+
*
|
|
1470
|
+
* // Now the resulting layer provides UserService, Database, AND Logger
|
|
1471
|
+
* const program = Effect.gen(function*() {
|
|
1472
|
+
* const userService = yield* UserService
|
|
1473
|
+
* const logger = yield* Logger // Still available!
|
|
1474
|
+
* const database = yield* Database // Still available!
|
|
1475
|
+
*
|
|
1476
|
+
* const user = yield* userService.getUser("123")
|
|
1477
|
+
* yield* logger.log(`Found user: ${user.name}`)
|
|
1478
|
+
*
|
|
1479
|
+
* return user
|
|
1480
|
+
* }).pipe(
|
|
1481
|
+
* Effect.provide(allServicesLayer)
|
|
1482
|
+
* )
|
|
1483
|
+
* ```
|
|
1484
|
+
*
|
|
1485
|
+
* @see {@link provide} for keeping dependency services private
|
|
1486
|
+
*
|
|
1487
|
+
* @category providing services
|
|
1488
|
+
* @since 2.0.0
|
|
1489
|
+
*/
|
|
1490
|
+
export const provideMerge: {
|
|
1491
|
+
<RIn, E, ROut>(
|
|
1492
|
+
that: Layer<ROut, E, RIn>
|
|
1493
|
+
): <RIn2, E2, ROut2>(self: Layer<ROut2, E2, RIn2>) => Layer<ROut | ROut2, E | E2, RIn | Exclude<RIn2, ROut>>
|
|
1494
|
+
<const Layers extends [Any, ...Array<Any>]>(
|
|
1495
|
+
that: Layers
|
|
1496
|
+
): <A, E, R>(
|
|
1497
|
+
self: Layer<A, E, R>
|
|
1498
|
+
) => Layer<
|
|
1499
|
+
A | Success<Layers[number]>,
|
|
1500
|
+
E | Error<Layers[number]>,
|
|
1501
|
+
| Services<Layers[number]>
|
|
1502
|
+
| Exclude<R, Success<Layers[number]>>
|
|
1503
|
+
>
|
|
1504
|
+
<RIn2, E2, ROut2, RIn, E, ROut>(
|
|
1505
|
+
self: Layer<ROut2, E2, RIn2>,
|
|
1506
|
+
that: Layer<ROut, E, RIn>
|
|
1507
|
+
): Layer<ROut | ROut2, E | E2, RIn | Exclude<RIn2, ROut>>
|
|
1508
|
+
<A, E, R, const Layers extends [Any, ...Array<Any>]>(
|
|
1509
|
+
self: Layer<A, E, R>,
|
|
1510
|
+
that: Layers
|
|
1511
|
+
): Layer<
|
|
1512
|
+
A | Success<Layers[number]>,
|
|
1513
|
+
E | Error<Layers[number]>,
|
|
1514
|
+
| Services<Layers[number]>
|
|
1515
|
+
| Exclude<R, Success<Layers[number]>>
|
|
1516
|
+
>
|
|
1517
|
+
} = dual(2, (
|
|
1518
|
+
self: Layer<any, any, any>,
|
|
1519
|
+
that: Layer<any, any, any> | ReadonlyArray<Layer<any, any, any>>
|
|
1520
|
+
) =>
|
|
1521
|
+
provideWith(
|
|
1522
|
+
self,
|
|
1523
|
+
that,
|
|
1524
|
+
(self, that) => Context.merge(that, self)
|
|
1525
|
+
))
|
|
1526
|
+
|
|
1527
|
+
/**
|
|
1528
|
+
* Constructs a layer dynamically based on the output of this layer.
|
|
1529
|
+
*
|
|
1530
|
+
* **Example** (Creating services from layer output)
|
|
1531
|
+
*
|
|
1532
|
+
* ```ts
|
|
1533
|
+
* import { Context, Effect, Layer } from "effect"
|
|
1534
|
+
*
|
|
1535
|
+
* class Config extends Context.Service<Config, {
|
|
1536
|
+
* readonly dbUrl: string
|
|
1537
|
+
* readonly logLevel: string
|
|
1538
|
+
* }>()("Config") {}
|
|
1539
|
+
*
|
|
1540
|
+
* class Database extends Context.Service<Database, {
|
|
1541
|
+
* readonly query: (sql: string) => Effect.Effect<string>
|
|
1542
|
+
* }>()("Database") {}
|
|
1543
|
+
*
|
|
1544
|
+
* class Logger extends Context.Service<Logger, {
|
|
1545
|
+
* readonly log: (msg: string) => Effect.Effect<void>
|
|
1546
|
+
* }>()("Logger") {}
|
|
1547
|
+
*
|
|
1548
|
+
* // Base config layer
|
|
1549
|
+
* const configLayer = Layer.succeed(Config, {
|
|
1550
|
+
* dbUrl: "postgres://localhost:5432/mydb",
|
|
1551
|
+
* logLevel: "debug"
|
|
1552
|
+
* })
|
|
1553
|
+
*
|
|
1554
|
+
* // Dynamically create services based on config
|
|
1555
|
+
* const dynamicServiceLayer = configLayer.pipe(
|
|
1556
|
+
* Layer.flatMap((context) => {
|
|
1557
|
+
* const config = Context.get(context, Config)
|
|
1558
|
+
*
|
|
1559
|
+
* // Create database layer based on config
|
|
1560
|
+
* const dbLayer = Layer.succeed(Database, {
|
|
1561
|
+
* query: Effect.fn("Database.query")((sql: string) =>
|
|
1562
|
+
* Effect.succeed(
|
|
1563
|
+
* `Querying ${config.dbUrl}: ${sql}`
|
|
1564
|
+
* ))
|
|
1565
|
+
* })
|
|
1566
|
+
*
|
|
1567
|
+
* // Create logger layer based on config
|
|
1568
|
+
* const loggerLayer = Layer.succeed(Logger, {
|
|
1569
|
+
* log: Effect.fn("Logger.log")((msg: string) =>
|
|
1570
|
+
* config.logLevel === "debug"
|
|
1571
|
+
* ? Effect.sync(() => console.log(`[DEBUG] ${msg}`))
|
|
1572
|
+
* : Effect.sync(() => console.log(msg))
|
|
1573
|
+
* )
|
|
1574
|
+
* })
|
|
1575
|
+
*
|
|
1576
|
+
* // Return combined layer
|
|
1577
|
+
* return Layer.mergeAll(dbLayer, loggerLayer)
|
|
1578
|
+
* })
|
|
1579
|
+
* )
|
|
1580
|
+
*
|
|
1581
|
+
* // Use the dynamic services
|
|
1582
|
+
* const program = Effect.gen(function*() {
|
|
1583
|
+
* const database = yield* Database
|
|
1584
|
+
* const logger = yield* Logger
|
|
1585
|
+
*
|
|
1586
|
+
* yield* logger.log("Starting database query")
|
|
1587
|
+
* const result = yield* database.query("SELECT * FROM users")
|
|
1588
|
+
*
|
|
1589
|
+
* return result
|
|
1590
|
+
* }).pipe(
|
|
1591
|
+
* Effect.provide(dynamicServiceLayer)
|
|
1592
|
+
* )
|
|
1593
|
+
* ```
|
|
1594
|
+
*
|
|
1595
|
+
* @category sequencing
|
|
1596
|
+
* @since 2.0.0
|
|
1597
|
+
*/
|
|
1598
|
+
export const flatMap: {
|
|
1599
|
+
<A, A2, E2, R2>(
|
|
1600
|
+
f: (context: Context.Context<A>) => Layer<A2, E2, R2>
|
|
1601
|
+
): <E, R>(self: Layer<A, E, R>) => Layer<A2, E2 | E, R2 | R>
|
|
1602
|
+
<A, E, R, A2, E2, R2>(
|
|
1603
|
+
self: Layer<A, E, R>,
|
|
1604
|
+
f: (context: Context.Context<A>) => Layer<A2, E2, R2>
|
|
1605
|
+
): Layer<A2, E | E2, R | R2>
|
|
1606
|
+
} = dual(2, <A, E, R, A2, E2, R2>(
|
|
1607
|
+
self: Layer<A, E, R>,
|
|
1608
|
+
f: (context: Context.Context<A>) => Layer<A2, E2, R2>
|
|
1609
|
+
): Layer<A2, E | E2, R | R2> =>
|
|
1610
|
+
fromBuild((memoMap, scope) =>
|
|
1611
|
+
internalEffect.flatMap(
|
|
1612
|
+
self.build(memoMap, scope),
|
|
1613
|
+
(context) => f(context).build(memoMap, scope)
|
|
1614
|
+
)
|
|
1615
|
+
))
|
|
1616
|
+
|
|
1617
|
+
/**
|
|
1618
|
+
* Performs the specified effect if this layer succeeds.
|
|
1619
|
+
*
|
|
1620
|
+
* **When to use**
|
|
1621
|
+
*
|
|
1622
|
+
* Use to run an effectful observation after a layer has been built
|
|
1623
|
+
* successfully, such as logging or metrics, without changing the services the
|
|
1624
|
+
* layer provides.
|
|
1625
|
+
*
|
|
1626
|
+
* **Details**
|
|
1627
|
+
*
|
|
1628
|
+
* The callback receives the services produced by this layer. Its result is
|
|
1629
|
+
* discarded, and the original layer output is preserved.
|
|
1630
|
+
*
|
|
1631
|
+
* @see {@link tapError} for running an effect when layer construction fails with a typed error
|
|
1632
|
+
* @see {@link tapCause} for running an effect when layer construction fails with any cause
|
|
1633
|
+
*
|
|
1634
|
+
* @category sequencing
|
|
1635
|
+
* @since 2.0.0
|
|
1636
|
+
*/
|
|
1637
|
+
export const tap: {
|
|
1638
|
+
<ROut, XR extends ROut, RIn2, E2, X>(
|
|
1639
|
+
f: (context: Context.Context<XR>) => Effect<X, E2, RIn2>
|
|
1640
|
+
): <RIn, E>(self: Layer<ROut, E, RIn>) => Layer<ROut, E | E2, RIn | Exclude<RIn2, Scope.Scope>>
|
|
1641
|
+
<RIn, E, ROut, XR extends ROut, RIn2, E2, X>(
|
|
1642
|
+
self: Layer<ROut, E, RIn>,
|
|
1643
|
+
f: (context: Context.Context<XR>) => Effect<X, E2, RIn2>
|
|
1644
|
+
): Layer<ROut, E | E2, RIn | Exclude<RIn2, Scope.Scope>>
|
|
1645
|
+
} = dual(2, <RIn, E, ROut, XR extends ROut, RIn2, E2, X>(
|
|
1646
|
+
self: Layer<ROut, E, RIn>,
|
|
1647
|
+
f: (context: Context.Context<XR>) => Effect<X, E2, RIn2>
|
|
1648
|
+
): Layer<ROut, E | E2, RIn | Exclude<RIn2, Scope.Scope>> =>
|
|
1649
|
+
fromBuild((memoMap, scope) =>
|
|
1650
|
+
internalEffect.flatMap(
|
|
1651
|
+
self.build(memoMap, scope),
|
|
1652
|
+
(context) => Scope.provide(internalEffect.as(f(context as Context.Context<XR>), context), scope)
|
|
1653
|
+
)
|
|
1654
|
+
))
|
|
1655
|
+
|
|
1656
|
+
/**
|
|
1657
|
+
* Performs the specified effect if this layer fails.
|
|
1658
|
+
*
|
|
1659
|
+
* **When to use**
|
|
1660
|
+
*
|
|
1661
|
+
* Use to run logging, metrics, or other effects when layer construction fails
|
|
1662
|
+
* while preserving the original typed error.
|
|
1663
|
+
*
|
|
1664
|
+
* **Details**
|
|
1665
|
+
*
|
|
1666
|
+
* The callback receives the typed error. If the callback succeeds, the layer
|
|
1667
|
+
* still fails with the original error; if the callback fails, that failure is
|
|
1668
|
+
* added to the layer's error type.
|
|
1669
|
+
*
|
|
1670
|
+
* @see {@link tap} for running an effect when layer construction succeeds
|
|
1671
|
+
* @see {@link tapCause} for inspecting the full failure cause, including defects and interruption
|
|
1672
|
+
*
|
|
1673
|
+
* @category sequencing
|
|
1674
|
+
* @since 2.0.0
|
|
1675
|
+
*/
|
|
1676
|
+
export const tapError: {
|
|
1677
|
+
<E, XE extends E, RIn2, E2, X>(
|
|
1678
|
+
f: (e: XE) => Effect<X, E2, RIn2>
|
|
1679
|
+
): <RIn, ROut>(self: Layer<ROut, E, RIn>) => Layer<ROut, E | E2, RIn | Exclude<RIn2, Scope.Scope>>
|
|
1680
|
+
<RIn, E, XE extends E, ROut, RIn2, E2, X>(
|
|
1681
|
+
self: Layer<ROut, E, RIn>,
|
|
1682
|
+
f: (e: XE) => Effect<X, E2, RIn2>
|
|
1683
|
+
): Layer<ROut, E | E2, RIn | Exclude<RIn2, Scope.Scope>>
|
|
1684
|
+
} = dual(2, <RIn, E, XE extends E, ROut, RIn2, E2, X>(
|
|
1685
|
+
self: Layer<ROut, E, RIn>,
|
|
1686
|
+
f: (e: XE) => Effect<X, E2, RIn2>
|
|
1687
|
+
): Layer<ROut, E | E2, RIn | Exclude<RIn2, Scope.Scope>> =>
|
|
1688
|
+
fromBuild((memoMap, scope) =>
|
|
1689
|
+
internalEffect.catch_(
|
|
1690
|
+
self.build(memoMap, scope),
|
|
1691
|
+
(error) => Scope.provide(internalEffect.andThen(f(error as XE), internalEffect.fail(error)), scope)
|
|
1692
|
+
)
|
|
1693
|
+
))
|
|
1694
|
+
|
|
1695
|
+
/**
|
|
1696
|
+
* Performs the specified effect when this layer fails with any cause.
|
|
1697
|
+
*
|
|
1698
|
+
* **When to use**
|
|
1699
|
+
*
|
|
1700
|
+
* Use to run diagnostics or reporting when layer construction fails and the
|
|
1701
|
+
* full `Cause` is needed.
|
|
1702
|
+
*
|
|
1703
|
+
* **Details**
|
|
1704
|
+
*
|
|
1705
|
+
* The callback receives the layer's `Cause`, so it can inspect typed errors,
|
|
1706
|
+
* defects, and interruption information. If the callback succeeds, the layer
|
|
1707
|
+
* fails again with the original cause; if the callback fails, that failure is
|
|
1708
|
+
* added to the layer's error type.
|
|
1709
|
+
*
|
|
1710
|
+
* @see {@link tapError} for observing only typed layer construction errors
|
|
1711
|
+
* @see {@link catchCause} for recovering from a layer construction failure by switching to another layer
|
|
1712
|
+
*
|
|
1713
|
+
* @category sequencing
|
|
1714
|
+
* @since 4.0.0
|
|
1715
|
+
*/
|
|
1716
|
+
export const tapCause: {
|
|
1717
|
+
<E, XE extends E, RIn2, E2, X>(
|
|
1718
|
+
f: (cause: Cause.Cause<XE>) => Effect<X, E2, RIn2>
|
|
1719
|
+
): <RIn, ROut>(self: Layer<ROut, E, RIn>) => Layer<ROut, E | E2, RIn | Exclude<RIn2, Scope.Scope>>
|
|
1720
|
+
<RIn, E, XE extends E, ROut, RIn2, E2, X>(
|
|
1721
|
+
self: Layer<ROut, E, RIn>,
|
|
1722
|
+
f: (cause: Cause.Cause<XE>) => Effect<X, E2, RIn2>
|
|
1723
|
+
): Layer<ROut, E | E2, RIn | Exclude<RIn2, Scope.Scope>>
|
|
1724
|
+
} = dual(2, <RIn, E, XE extends E, ROut, RIn2, E2, X>(
|
|
1725
|
+
self: Layer<ROut, E, RIn>,
|
|
1726
|
+
f: (cause: Cause.Cause<XE>) => Effect<X, E2, RIn2>
|
|
1727
|
+
): Layer<ROut, E | E2, RIn | Exclude<RIn2, Scope.Scope>> =>
|
|
1728
|
+
fromBuild((memoMap, scope) =>
|
|
1729
|
+
internalEffect.catchCause(
|
|
1730
|
+
self.build(memoMap, scope),
|
|
1731
|
+
(cause) =>
|
|
1732
|
+
Scope.provide(internalEffect.andThen(f(cause as Cause.Cause<XE>), internalEffect.failCause(cause)), scope)
|
|
1733
|
+
)
|
|
1734
|
+
))
|
|
1735
|
+
|
|
1736
|
+
/**
|
|
1737
|
+
* Converts layer construction failures into defects, removing them from the
|
|
1738
|
+
* layer's error type.
|
|
1739
|
+
*
|
|
1740
|
+
* **Details**
|
|
1741
|
+
*
|
|
1742
|
+
* Use this only when failures should be treated as unrecoverable defects rather
|
|
1743
|
+
* than typed errors that callers can handle.
|
|
1744
|
+
*
|
|
1745
|
+
* **Example** (Converting layer failures to defects)
|
|
1746
|
+
*
|
|
1747
|
+
* ```ts
|
|
1748
|
+
* import { Context, Data, Effect, Layer } from "effect"
|
|
1749
|
+
*
|
|
1750
|
+
* class DatabaseError extends Data.TaggedError("DatabaseError")<{
|
|
1751
|
+
* message: string
|
|
1752
|
+
* }> {}
|
|
1753
|
+
*
|
|
1754
|
+
* class Database extends Context.Service<Database, {
|
|
1755
|
+
* readonly query: (sql: string) => Effect.Effect<string>
|
|
1756
|
+
* }>()("Database") {}
|
|
1757
|
+
*
|
|
1758
|
+
* // Layer that can fail during construction
|
|
1759
|
+
* const flakyDatabaseLayer = Layer.effect(Database, Effect.gen(function*() {
|
|
1760
|
+
* console.log("connecting")
|
|
1761
|
+
* return yield* new DatabaseError({ message: "Connection failed" })
|
|
1762
|
+
* }))
|
|
1763
|
+
*
|
|
1764
|
+
* // Convert failures to fiber death - removes error from type
|
|
1765
|
+
* const reliableDatabaseLayer = flakyDatabaseLayer.pipe(Layer.orDie)
|
|
1766
|
+
*
|
|
1767
|
+
* // Now the layer type is Layer<Database, never, never> - no error in type
|
|
1768
|
+
* const program = Effect.gen(function*() {
|
|
1769
|
+
* const database = yield* Database
|
|
1770
|
+
* return yield* database.query("SELECT * FROM users")
|
|
1771
|
+
* }).pipe(
|
|
1772
|
+
* Effect.provide(reliableDatabaseLayer)
|
|
1773
|
+
* )
|
|
1774
|
+
*
|
|
1775
|
+
* // Running the program prints "connecting", then the DatabaseError is
|
|
1776
|
+
* // converted into a fiber defect instead of remaining a typed error.
|
|
1777
|
+
* ```
|
|
1778
|
+
*
|
|
1779
|
+
* @category error handling
|
|
1780
|
+
* @since 2.0.0
|
|
1781
|
+
*/
|
|
1782
|
+
export const orDie = <A, E, R>(self: Layer<A, E, R>): Layer<A, never, R> =>
|
|
1783
|
+
fromBuildUnsafe((memoMap, scope) => internalEffect.orDie(self.build(memoMap, scope)))
|
|
1784
|
+
|
|
1785
|
+
const catch_: {
|
|
1786
|
+
<E, RIn2, E2, ROut2>(
|
|
1787
|
+
onError: (error: E) => Layer<ROut2, E2, RIn2>
|
|
1788
|
+
): <RIn, ROut>(self: Layer<ROut, E, RIn>) => Layer<ROut & ROut2, E2, RIn2 | RIn>
|
|
1789
|
+
<RIn, E, ROut, RIn2, E2, ROut2>(
|
|
1790
|
+
self: Layer<ROut, E, RIn>,
|
|
1791
|
+
onError: (error: E) => Layer<ROut2, E2, RIn2>
|
|
1792
|
+
): Layer<ROut & ROut2, E2, RIn | RIn2>
|
|
1793
|
+
} = dual(2, <RIn, E, ROut, RIn2, E2, ROut2>(
|
|
1794
|
+
self: Layer<ROut, E, RIn>,
|
|
1795
|
+
onError: (error: E) => Layer<ROut2, E2, RIn2>
|
|
1796
|
+
): Layer<ROut & ROut2, E2, RIn | RIn2> =>
|
|
1797
|
+
fromBuildUnsafe((memoMap, scope) =>
|
|
1798
|
+
internalEffect.catch_(
|
|
1799
|
+
self.build(memoMap, scope),
|
|
1800
|
+
(e) => onError(e).build(memoMap, scope)
|
|
1801
|
+
) as any
|
|
1802
|
+
))
|
|
1803
|
+
|
|
1804
|
+
export {
|
|
1805
|
+
/**
|
|
1806
|
+
* Recovers from all typed errors by switching to another layer.
|
|
1807
|
+
*
|
|
1808
|
+
* **When to use**
|
|
1809
|
+
*
|
|
1810
|
+
* Use when every typed `Layer` construction error should use the same
|
|
1811
|
+
* recovery path.
|
|
1812
|
+
*
|
|
1813
|
+
* @see {@link catchTag} for recovering from specific tagged errors
|
|
1814
|
+
* @see {@link catchCause} for recovering with access to the full cause
|
|
1815
|
+
*
|
|
1816
|
+
* @category error handling
|
|
1817
|
+
* @since 4.0.0
|
|
1818
|
+
*/
|
|
1819
|
+
catch_ as catch
|
|
1820
|
+
}
|
|
1821
|
+
|
|
1822
|
+
/**
|
|
1823
|
+
* Recovers from specific tagged errors.
|
|
1824
|
+
*
|
|
1825
|
+
* **When to use**
|
|
1826
|
+
*
|
|
1827
|
+
* Use when only some tagged `Layer` construction errors should be recovered.
|
|
1828
|
+
*
|
|
1829
|
+
* **Example** (Recovering from tagged layer errors)
|
|
1830
|
+
*
|
|
1831
|
+
* ```ts
|
|
1832
|
+
* import { Context, Data, Effect, Layer } from "effect"
|
|
1833
|
+
*
|
|
1834
|
+
* class ConfigError extends Data.TaggedError("ConfigError") {}
|
|
1835
|
+
*
|
|
1836
|
+
* class Config extends Context.Service<Config, {
|
|
1837
|
+
* readonly apiUrl: string
|
|
1838
|
+
* }>()("Config") {}
|
|
1839
|
+
*
|
|
1840
|
+
* const configLayer = Layer.effect(Config, Effect.fail(new ConfigError()))
|
|
1841
|
+
*
|
|
1842
|
+
* const fallbackLayer = Layer.succeed(Config, { apiUrl: "http://localhost" })
|
|
1843
|
+
*
|
|
1844
|
+
* const recovered = configLayer.pipe(
|
|
1845
|
+
* Layer.catchTag("ConfigError", () => fallbackLayer)
|
|
1846
|
+
* )
|
|
1847
|
+
* ```
|
|
1848
|
+
*
|
|
1849
|
+
* @see {@link catchCause} for recovering with access to the full cause
|
|
1850
|
+
*
|
|
1851
|
+
* @category error handling
|
|
1852
|
+
* @since 4.0.0
|
|
1853
|
+
*/
|
|
1854
|
+
export const catchTag: {
|
|
1855
|
+
<const K extends Types.Tags<E> | NonEmptyReadonlyArray<Types.Tags<E>>, E, RIn2, E2, ROut2>(
|
|
1856
|
+
k: K,
|
|
1857
|
+
f: (
|
|
1858
|
+
e: Types.ExtractTag<Types.NoInfer<E>, K extends NonEmptyReadonlyArray<string> ? K[number] : K>
|
|
1859
|
+
) => Layer<ROut2, E2, RIn2>
|
|
1860
|
+
): <RIn, ROut>(
|
|
1861
|
+
self: Layer<ROut, E, RIn>
|
|
1862
|
+
) => Layer<
|
|
1863
|
+
ROut & ROut2,
|
|
1864
|
+
E2 | Types.ExcludeTag<E, K extends NonEmptyReadonlyArray<string> ? K[number] : K>,
|
|
1865
|
+
RIn2 | RIn
|
|
1866
|
+
>
|
|
1867
|
+
<
|
|
1868
|
+
RIn,
|
|
1869
|
+
E,
|
|
1870
|
+
ROut,
|
|
1871
|
+
const K extends Types.Tags<E> | NonEmptyReadonlyArray<Types.Tags<E>>,
|
|
1872
|
+
RIn2,
|
|
1873
|
+
E2,
|
|
1874
|
+
ROut2
|
|
1875
|
+
>(
|
|
1876
|
+
self: Layer<ROut, E, RIn>,
|
|
1877
|
+
k: K,
|
|
1878
|
+
f: (e: Types.ExtractTag<E, K extends NonEmptyReadonlyArray<string> ? K[number] : K>) => Layer<ROut2, E2, RIn2>
|
|
1879
|
+
): Layer<
|
|
1880
|
+
ROut & ROut2,
|
|
1881
|
+
E2 | Types.ExcludeTag<E, K extends NonEmptyReadonlyArray<string> ? K[number] : K>,
|
|
1882
|
+
RIn | RIn2
|
|
1883
|
+
>
|
|
1884
|
+
} = dual(3, <
|
|
1885
|
+
RIn,
|
|
1886
|
+
E,
|
|
1887
|
+
ROut,
|
|
1888
|
+
const K extends Types.Tags<E> | NonEmptyReadonlyArray<Types.Tags<E>>,
|
|
1889
|
+
RIn2,
|
|
1890
|
+
E2,
|
|
1891
|
+
ROut2
|
|
1892
|
+
>(
|
|
1893
|
+
self: Layer<ROut, E, RIn>,
|
|
1894
|
+
k: K,
|
|
1895
|
+
f: (e: Types.ExtractTag<E, K extends NonEmptyReadonlyArray<string> ? K[number] : K>) => Layer<ROut2, E2, RIn2>
|
|
1896
|
+
): Layer<ROut & ROut2, E2 | Types.ExcludeTag<E, K extends NonEmptyReadonlyArray<string> ? K[number] : K>, RIn | RIn2> =>
|
|
1897
|
+
fromBuildUnsafe((memoMap, scope) =>
|
|
1898
|
+
internalEffect.catchTag(
|
|
1899
|
+
self.build(memoMap, scope),
|
|
1900
|
+
k,
|
|
1901
|
+
(error) => f(error).build(memoMap, scope)
|
|
1902
|
+
) as any
|
|
1903
|
+
))
|
|
1904
|
+
|
|
1905
|
+
/**
|
|
1906
|
+
* Recovers from any failure cause by switching to another layer.
|
|
1907
|
+
*
|
|
1908
|
+
* **When to use**
|
|
1909
|
+
*
|
|
1910
|
+
* Use when you need `Layer` recovery to inspect more than the typed error,
|
|
1911
|
+
* such as defects or interruption information.
|
|
1912
|
+
*
|
|
1913
|
+
* **Details**
|
|
1914
|
+
*
|
|
1915
|
+
* The handler receives the full `Cause` of the failed layer, including typed
|
|
1916
|
+
* errors, unexpected defects, and interruption information, and returns the
|
|
1917
|
+
* fallback layer to build instead. Finalizers for resources acquired by the
|
|
1918
|
+
* failed layer are still run before the fallback layer is acquired.
|
|
1919
|
+
*
|
|
1920
|
+
* **Example** (Recovering from layer failures by cause)
|
|
1921
|
+
*
|
|
1922
|
+
* ```ts
|
|
1923
|
+
* import { Context, Data, Effect, Layer } from "effect"
|
|
1924
|
+
*
|
|
1925
|
+
* class DatabaseError extends Data.TaggedError("DatabaseError")<{
|
|
1926
|
+
* message: string
|
|
1927
|
+
* }> {}
|
|
1928
|
+
*
|
|
1929
|
+
* class Database extends Context.Service<Database, {
|
|
1930
|
+
* readonly query: (sql: string) => Effect.Effect<string>
|
|
1931
|
+
* }>()("Database") {}
|
|
1932
|
+
*
|
|
1933
|
+
* const primaryDatabaseLayer = Layer.effect(Database,
|
|
1934
|
+
* Effect.fail(new DatabaseError({ message: "Primary DB unreachable" }))
|
|
1935
|
+
* )
|
|
1936
|
+
*
|
|
1937
|
+
* const databaseWithFallback = primaryDatabaseLayer.pipe(
|
|
1938
|
+
* Layer.catchCause(() => {
|
|
1939
|
+
* return Layer.succeed(Database, {
|
|
1940
|
+
* query: Effect.fn("Database.query")((sql: string) => Effect.succeed(`Memory: ${sql}`))
|
|
1941
|
+
* })
|
|
1942
|
+
* })
|
|
1943
|
+
* )
|
|
1944
|
+
*
|
|
1945
|
+
* const program = Effect.gen(function*() {
|
|
1946
|
+
* const database = yield* Database
|
|
1947
|
+
* const result = yield* database.query("SELECT * FROM users")
|
|
1948
|
+
* console.log(result)
|
|
1949
|
+
* }).pipe(
|
|
1950
|
+
* Effect.provide(databaseWithFallback)
|
|
1951
|
+
* )
|
|
1952
|
+
*
|
|
1953
|
+
* Effect.runPromise(program)
|
|
1954
|
+
* // Memory: SELECT * FROM users
|
|
1955
|
+
* ```
|
|
1956
|
+
*
|
|
1957
|
+
* @see {@link catchTag} for recovering from specific tagged errors
|
|
1958
|
+
*
|
|
1959
|
+
* @category error handling
|
|
1960
|
+
* @since 4.0.0
|
|
1961
|
+
*/
|
|
1962
|
+
export const catchCause: {
|
|
1963
|
+
<E, RIn2, E2, ROut2>(
|
|
1964
|
+
onError: (cause: Cause.Cause<E>) => Layer<ROut2, E2, RIn2>
|
|
1965
|
+
): <RIn, ROut>(self: Layer<ROut, E, RIn>) => Layer<ROut & ROut2, E2, RIn2 | RIn>
|
|
1966
|
+
<RIn, E, ROut, RIn2, E2, ROut22>(
|
|
1967
|
+
self: Layer<ROut, E, RIn>,
|
|
1968
|
+
onError: (cause: Cause.Cause<E>) => Layer<ROut22, E2, RIn2>
|
|
1969
|
+
): Layer<ROut & ROut22, E2, RIn | RIn2>
|
|
1970
|
+
} = dual(2, <RIn, E, ROut, RIn2, E2, ROut2>(
|
|
1971
|
+
self: Layer<ROut, E, RIn>,
|
|
1972
|
+
onError: (cause: Cause.Cause<E>) => Layer<ROut2, E2, RIn2>
|
|
1973
|
+
): Layer<ROut & ROut2, E2, RIn | RIn2> =>
|
|
1974
|
+
fromBuildUnsafe((memoMap, scope) =>
|
|
1975
|
+
internalEffect.catchCause(
|
|
1976
|
+
self.build(memoMap, scope),
|
|
1977
|
+
(cause) => onError(cause).build(memoMap, scope)
|
|
1978
|
+
) as any
|
|
1979
|
+
))
|
|
1980
|
+
|
|
1981
|
+
/**
|
|
1982
|
+
* Updates a service in the context with a new implementation.
|
|
1983
|
+
*
|
|
1984
|
+
* **When to use**
|
|
1985
|
+
*
|
|
1986
|
+
* Use to adapt or extend a service's behavior during the creation of a
|
|
1987
|
+
* layer.
|
|
1988
|
+
*
|
|
1989
|
+
* **Details**
|
|
1990
|
+
*
|
|
1991
|
+
* This function modifies the existing implementation of a service in the
|
|
1992
|
+
* context. It retrieves the current service, applies the provided
|
|
1993
|
+
* transformation function `f`, and replaces the old service with the
|
|
1994
|
+
* transformed one.
|
|
1995
|
+
*
|
|
1996
|
+
* @category providing services
|
|
1997
|
+
* @since 3.13.0
|
|
1998
|
+
*/
|
|
1999
|
+
export const updateService: {
|
|
2000
|
+
<I, A>(
|
|
2001
|
+
service: Context.Key<I, A>,
|
|
2002
|
+
f: (a: Types.NoInfer<A>) => A
|
|
2003
|
+
): <A1, E1, R1>(layer: Layer<A1, E1, R1>) => Layer<A1, E1, I | R1>
|
|
2004
|
+
<A1, E1, R1, I, A>(
|
|
2005
|
+
layer: Layer<A1, E1, R1>,
|
|
2006
|
+
service: Context.Key<I, A>,
|
|
2007
|
+
f: (a: Types.NoInfer<A>) => A
|
|
2008
|
+
): Layer<A1, E1, I | R1>
|
|
2009
|
+
} = dual(
|
|
2010
|
+
3,
|
|
2011
|
+
<A1, E1, R1, I, A>(
|
|
2012
|
+
layer: Layer<A1, E1, R1>,
|
|
2013
|
+
service: Context.Key<I, A>,
|
|
2014
|
+
f: (a: Types.NoInfer<A>) => A
|
|
2015
|
+
): Layer<A1, E1, I | R1> => provide(layer, effect(service, internalEffect.map(service, f)))
|
|
2016
|
+
)
|
|
2017
|
+
|
|
2018
|
+
/**
|
|
2019
|
+
* Creates a fresh version of this layer that will not be shared.
|
|
2020
|
+
*
|
|
2021
|
+
* **When to use**
|
|
2022
|
+
*
|
|
2023
|
+
* Use when you need two parts of an application to receive separate instances
|
|
2024
|
+
* of a resource, such as two independent client sessions.
|
|
2025
|
+
*
|
|
2026
|
+
* **Gotchas**
|
|
2027
|
+
*
|
|
2028
|
+
* Do not use it just to work around confusing composition. By default, sharing
|
|
2029
|
+
* the same layer value is usually the desired behavior.
|
|
2030
|
+
*
|
|
2031
|
+
* **Example** (Creating non-shared layer instances)
|
|
2032
|
+
*
|
|
2033
|
+
* ```ts
|
|
2034
|
+
* import { Context, Effect, Layer, Ref } from "effect"
|
|
2035
|
+
*
|
|
2036
|
+
* class Counter extends Context.Service<Counter, {
|
|
2037
|
+
* readonly id: number
|
|
2038
|
+
* }>()("Counter") {}
|
|
2039
|
+
*
|
|
2040
|
+
* class Left extends Context.Service<Left, {
|
|
2041
|
+
* readonly counterId: number
|
|
2042
|
+
* }>()("Left") {}
|
|
2043
|
+
*
|
|
2044
|
+
* class Right extends Context.Service<Right, {
|
|
2045
|
+
* readonly counterId: number
|
|
2046
|
+
* }>()("Right") {}
|
|
2047
|
+
*
|
|
2048
|
+
* const leftLayer = Layer.effect(Left, Effect.gen(function*() {
|
|
2049
|
+
* const counter = yield* Counter
|
|
2050
|
+
* return { counterId: counter.id }
|
|
2051
|
+
* }))
|
|
2052
|
+
*
|
|
2053
|
+
* const rightLayer = Layer.effect(Right, Effect.gen(function*() {
|
|
2054
|
+
* const counter = yield* Counter
|
|
2055
|
+
* return { counterId: counter.id }
|
|
2056
|
+
* }))
|
|
2057
|
+
*
|
|
2058
|
+
* const showIds = Effect.gen(function*() {
|
|
2059
|
+
* const left = yield* Left
|
|
2060
|
+
* const right = yield* Right
|
|
2061
|
+
* console.log(`same Counter: ${left.counterId === right.counterId}`)
|
|
2062
|
+
* })
|
|
2063
|
+
*
|
|
2064
|
+
* const program = Effect.gen(function*() {
|
|
2065
|
+
* const nextId = yield* Ref.make(0)
|
|
2066
|
+
*
|
|
2067
|
+
* const counterLayer = Layer.effect(Counter, Effect.gen(function*() {
|
|
2068
|
+
* const id = yield* Ref.updateAndGet(nextId, (n) => n + 1)
|
|
2069
|
+
* console.log("constructed Counter")
|
|
2070
|
+
* return { id }
|
|
2071
|
+
* }))
|
|
2072
|
+
*
|
|
2073
|
+
* const shared = Layer.merge(
|
|
2074
|
+
* Layer.provide(leftLayer, counterLayer),
|
|
2075
|
+
* Layer.provide(rightLayer, counterLayer)
|
|
2076
|
+
* )
|
|
2077
|
+
*
|
|
2078
|
+
* yield* Effect.provide(showIds, shared)
|
|
2079
|
+
*
|
|
2080
|
+
* const freshCounterLayer = Layer.fresh(counterLayer)
|
|
2081
|
+
* const fresh = Layer.merge(
|
|
2082
|
+
* Layer.provide(leftLayer, freshCounterLayer),
|
|
2083
|
+
* Layer.provide(rightLayer, freshCounterLayer)
|
|
2084
|
+
* )
|
|
2085
|
+
*
|
|
2086
|
+
* yield* Effect.provide(showIds, fresh)
|
|
2087
|
+
* })
|
|
2088
|
+
*
|
|
2089
|
+
* Effect.runPromise(program)
|
|
2090
|
+
* // constructed Counter
|
|
2091
|
+
* // same Counter: true
|
|
2092
|
+
* // constructed Counter
|
|
2093
|
+
* // constructed Counter
|
|
2094
|
+
* // same Counter: false
|
|
2095
|
+
* ```
|
|
2096
|
+
*
|
|
2097
|
+
* @category layers
|
|
2098
|
+
* @since 2.0.0
|
|
2099
|
+
*/
|
|
2100
|
+
export const fresh = <A, E, R>(self: Layer<A, E, R>): Layer<A, E, R> =>
|
|
2101
|
+
fromBuildUnsafe((_, scope) => self.build(makeMemoMapUnsafe(), scope))
|
|
2102
|
+
|
|
2103
|
+
/**
|
|
2104
|
+
* Builds this layer and keeps it alive until the returned effect is interrupted.
|
|
2105
|
+
*
|
|
2106
|
+
* **When to use**
|
|
2107
|
+
*
|
|
2108
|
+
* Use when you model your entire application as a layer, such as an HTTP
|
|
2109
|
+
* server.
|
|
2110
|
+
*
|
|
2111
|
+
* **Details**
|
|
2112
|
+
*
|
|
2113
|
+
* When the returned effect is interrupted, the layer scope is closed and all
|
|
2114
|
+
* finalizers registered during layer acquisition are run.
|
|
2115
|
+
*
|
|
2116
|
+
* **Example** (Launching an application layer)
|
|
2117
|
+
*
|
|
2118
|
+
* ```ts
|
|
2119
|
+
* import { Console, Context, Effect, Layer } from "effect"
|
|
2120
|
+
*
|
|
2121
|
+
* class HttpServer extends Context.Service<HttpServer, {
|
|
2122
|
+
* readonly start: () => Effect.Effect<string>
|
|
2123
|
+
* readonly stop: () => Effect.Effect<string>
|
|
2124
|
+
* }>()("HttpServer") {}
|
|
2125
|
+
*
|
|
2126
|
+
* class Logger extends Context.Service<Logger, {
|
|
2127
|
+
* readonly log: (msg: string) => Effect.Effect<void>
|
|
2128
|
+
* }>()("Logger") {}
|
|
2129
|
+
*
|
|
2130
|
+
* // Server layer that starts an HTTP server
|
|
2131
|
+
* const serverLayer = Layer.effect(HttpServer, Effect.gen(function*() {
|
|
2132
|
+
* yield* Console.log("Starting HTTP server...")
|
|
2133
|
+
*
|
|
2134
|
+
* return {
|
|
2135
|
+
* start: Effect.fn("HttpServer.start")(function*() {
|
|
2136
|
+
* yield* Console.log("Server listening on port 3000")
|
|
2137
|
+
* return "Server started"
|
|
2138
|
+
* }),
|
|
2139
|
+
* stop: Effect.fn("HttpServer.stop")(function*() {
|
|
2140
|
+
* yield* Console.log("Server stopped gracefully")
|
|
2141
|
+
* return "Server stopped"
|
|
2142
|
+
* })
|
|
2143
|
+
* }
|
|
2144
|
+
* }))
|
|
2145
|
+
*
|
|
2146
|
+
* const loggerLayer = Layer.succeed(Logger, {
|
|
2147
|
+
* log: Effect.fn("Logger.log")((msg: string) => Console.log(`[LOG] ${msg}`))
|
|
2148
|
+
* })
|
|
2149
|
+
*
|
|
2150
|
+
* // Application layer combining all services
|
|
2151
|
+
* const appLayer = Layer.mergeAll(serverLayer, loggerLayer)
|
|
2152
|
+
*
|
|
2153
|
+
* // Launch the application - runs until interrupted
|
|
2154
|
+
* const application = appLayer.pipe(
|
|
2155
|
+
* Layer.launch,
|
|
2156
|
+
* Effect.tapError((error) => Console.log(`Application failed: ${error}`)),
|
|
2157
|
+
* Effect.tap(() => Console.log("Application completed"))
|
|
2158
|
+
* )
|
|
2159
|
+
*
|
|
2160
|
+
* // This will run forever until externally interrupted
|
|
2161
|
+
* // Effect.runFork(application)
|
|
2162
|
+
* ```
|
|
2163
|
+
*
|
|
2164
|
+
* @category converting
|
|
2165
|
+
* @since 2.0.0
|
|
2166
|
+
*/
|
|
2167
|
+
export const launch = <RIn, E, ROut>(self: Layer<ROut, E, RIn>): Effect<never, E, RIn> =>
|
|
2168
|
+
internalEffect.scoped(internalEffect.andThen(build(self), internalEffect.never))
|
|
2169
|
+
|
|
2170
|
+
/**
|
|
2171
|
+
* A utility type for creating partial mocks of services in testing.
|
|
2172
|
+
*
|
|
2173
|
+
* **When to use**
|
|
2174
|
+
*
|
|
2175
|
+
* Use to type partial test service implementations where only exercised
|
|
2176
|
+
* effectful members are stubbed.
|
|
2177
|
+
*
|
|
2178
|
+
* **Details**
|
|
2179
|
+
*
|
|
2180
|
+
* This type makes `Effect`, `Stream`, and `Channel` values and functions
|
|
2181
|
+
* returning them optional, while keeping non-effectful properties required.
|
|
2182
|
+
* This allows you to provide only the methods you need to test while leaving
|
|
2183
|
+
* others unimplemented.
|
|
2184
|
+
*
|
|
2185
|
+
* @see {@link mock} for creating a mock layer from a partial service implementation
|
|
2186
|
+
*
|
|
2187
|
+
* @category testing
|
|
2188
|
+
* @since 3.17.0
|
|
2189
|
+
*/
|
|
2190
|
+
export type PartialEffectful<A extends object> = Types.Simplify<
|
|
2191
|
+
& {
|
|
2192
|
+
[K in keyof A as A[K] extends AnyEffectOrStream ? K : never]?: A[K]
|
|
2193
|
+
}
|
|
2194
|
+
& {
|
|
2195
|
+
[K in keyof A as A[K] extends AnyEffectOrStream ? never : K]: A[K]
|
|
2196
|
+
}
|
|
2197
|
+
>
|
|
2198
|
+
|
|
2199
|
+
type AnyEffectOrStream =
|
|
2200
|
+
| Effect<any, any, any>
|
|
2201
|
+
| Stream.Stream<any, any, any>
|
|
2202
|
+
| Channel.Channel<any, any, any, any, any, any, any>
|
|
2203
|
+
| ((...args: any) => Effect<any, any, any>)
|
|
2204
|
+
| ((...args: any) => Stream.Stream<any, any, any>)
|
|
2205
|
+
| ((...args: any) => Channel.Channel<any, any, any, any, any, any, any>)
|
|
2206
|
+
|
|
2207
|
+
/**
|
|
2208
|
+
* Creates a mock layer for testing purposes. You can provide a partial
|
|
2209
|
+
* implementation of the service. Any missing members that are `Effect`s,
|
|
2210
|
+
* `Stream`s, `Channel`s, or functions returning them will fail with an
|
|
2211
|
+
* unimplemented defect when used.
|
|
2212
|
+
*
|
|
2213
|
+
* **Details**
|
|
2214
|
+
*
|
|
2215
|
+
* Missing members are represented by a value that can be used as an `Effect`,
|
|
2216
|
+
* `Stream`, `Channel`, or as a function returning an `Effect`. This lets the
|
|
2217
|
+
* mock preserve the shape of common service methods while still failing loudly
|
|
2218
|
+
* when an unimplemented member is exercised.
|
|
2219
|
+
*
|
|
2220
|
+
* **Example** (Mocking services for tests)
|
|
2221
|
+
*
|
|
2222
|
+
* ```ts
|
|
2223
|
+
* import { Context, Effect, Layer } from "effect"
|
|
2224
|
+
*
|
|
2225
|
+
* class UserService extends Context.Service<UserService, {
|
|
2226
|
+
* readonly config: { apiUrl: string }
|
|
2227
|
+
* readonly getUser: (
|
|
2228
|
+
* id: string
|
|
2229
|
+
* ) => Effect.Effect<{ id: string; name: string }, Error>
|
|
2230
|
+
* readonly deleteUser: (id: string) => Effect.Effect<void, Error>
|
|
2231
|
+
* readonly updateUser: (
|
|
2232
|
+
* id: string,
|
|
2233
|
+
* data: object
|
|
2234
|
+
* ) => Effect.Effect<{ id: string; name: string }, Error>
|
|
2235
|
+
* }>()("UserService") {}
|
|
2236
|
+
*
|
|
2237
|
+
* // Create a partial mock - only implement what you need for testing
|
|
2238
|
+
* const testUserLayer = Layer.mock(UserService, {
|
|
2239
|
+
* config: { apiUrl: "https://test-api.com" }, // Required - non-Effect property
|
|
2240
|
+
* getUser: (id: string) => Effect.succeed({ id, name: "Test User" }) // Mock implementation
|
|
2241
|
+
* // deleteUser and updateUser are omitted - will throw UnimplementedError if called
|
|
2242
|
+
* })
|
|
2243
|
+
*
|
|
2244
|
+
* // Use in tests
|
|
2245
|
+
* const testProgram = Effect.gen(function*() {
|
|
2246
|
+
* const userService = yield* UserService
|
|
2247
|
+
*
|
|
2248
|
+
* // This works - we provided an implementation
|
|
2249
|
+
* const user = yield* userService.getUser("123")
|
|
2250
|
+
* console.log(user.name) // "Test User"
|
|
2251
|
+
*
|
|
2252
|
+
* // This would throw - we didn't implement deleteUser
|
|
2253
|
+
* // yield* userService.deleteUser("123") // UnimplementedError
|
|
2254
|
+
* }).pipe(
|
|
2255
|
+
* Effect.provide(testUserLayer)
|
|
2256
|
+
* )
|
|
2257
|
+
* ```
|
|
2258
|
+
*
|
|
2259
|
+
* @category testing
|
|
2260
|
+
* @since 3.17.0
|
|
2261
|
+
*/
|
|
2262
|
+
export const mock: {
|
|
2263
|
+
<I, S extends object>(service: Context.Key<I, S>): (implementation: PartialEffectful<S>) => Layer<I>
|
|
2264
|
+
<I, S extends object>(service: Context.Key<I, S>, implementation: Types.NoInfer<PartialEffectful<S>>): Layer<I>
|
|
2265
|
+
} = function() {
|
|
2266
|
+
if (arguments.length === 1) {
|
|
2267
|
+
return (implementation: any) => mockImpl(arguments[0], implementation)
|
|
2268
|
+
}
|
|
2269
|
+
return mockImpl(arguments[0], arguments[1])
|
|
2270
|
+
} as any
|
|
2271
|
+
|
|
2272
|
+
const mockImpl = <I, S extends object>(service: Context.Key<I, S>, implementation: PartialEffectful<S>): Layer<I> =>
|
|
2273
|
+
succeed(service)(
|
|
2274
|
+
new Proxy({ ...implementation as object } as S, {
|
|
2275
|
+
get(target, prop, _receiver) {
|
|
2276
|
+
if (prop in target) {
|
|
2277
|
+
return target[prop as keyof S]
|
|
2278
|
+
}
|
|
2279
|
+
const prevLimit = (Error as ErrorWithStackTraceLimit).stackTraceLimit
|
|
2280
|
+
;(Error as ErrorWithStackTraceLimit).stackTraceLimit = 2
|
|
2281
|
+
const error = new Error(`${service.key}: Unimplemented method "${prop.toString()}"`)
|
|
2282
|
+
;(Error as ErrorWithStackTraceLimit).stackTraceLimit = prevLimit
|
|
2283
|
+
error.name = "UnimplementedError"
|
|
2284
|
+
return makeUnimplemented(error)
|
|
2285
|
+
},
|
|
2286
|
+
has: constTrue
|
|
2287
|
+
})
|
|
2288
|
+
)
|
|
2289
|
+
|
|
2290
|
+
const makeUnimplemented = (error: globalThis.Error) => {
|
|
2291
|
+
const dead = Object.assign(internalEffect.die(error), {
|
|
2292
|
+
[StreamTypeId]: StreamTypeId,
|
|
2293
|
+
channel: {
|
|
2294
|
+
[ChannelTypeId]: ChannelTypeId,
|
|
2295
|
+
transform: () => internalEffect.succeed(dead),
|
|
2296
|
+
pipe() {
|
|
2297
|
+
return pipeArguments(this, arguments)
|
|
2298
|
+
}
|
|
2299
|
+
},
|
|
2300
|
+
[ChannelTypeId]: ChannelTypeId,
|
|
2301
|
+
transform: () => internalEffect.succeed(dead)
|
|
2302
|
+
})
|
|
2303
|
+
function unimplemented() {
|
|
2304
|
+
return dead
|
|
2305
|
+
}
|
|
2306
|
+
// @effect-diagnostics-next-line floatingEffect:off
|
|
2307
|
+
Object.assign(unimplemented, dead)
|
|
2308
|
+
Object.setPrototypeOf(unimplemented, Object.getPrototypeOf(dead))
|
|
2309
|
+
return unimplemented
|
|
2310
|
+
}
|
|
2311
|
+
|
|
2312
|
+
const StreamTypeId: Stream.TypeId = "~effect/Stream"
|
|
2313
|
+
const ChannelTypeId: Channel.TypeId = "~effect/Channel"
|
|
2314
|
+
|
|
2315
|
+
// -----------------------------------------------------------------------------
|
|
2316
|
+
// Type constraints
|
|
2317
|
+
// -----------------------------------------------------------------------------
|
|
2318
|
+
|
|
2319
|
+
/**
|
|
2320
|
+
* Ensures that a layer's success type extends a given type `ROut`.
|
|
2321
|
+
*
|
|
2322
|
+
* **Details**
|
|
2323
|
+
*
|
|
2324
|
+
* This function provides compile-time type checking to ensure that the success
|
|
2325
|
+
* value of a layer conforms to a specific type constraint.
|
|
2326
|
+
*
|
|
2327
|
+
* **Example** (Constraining layer success types)
|
|
2328
|
+
*
|
|
2329
|
+
* ```ts
|
|
2330
|
+
* import { Layer } from "effect"
|
|
2331
|
+
*
|
|
2332
|
+
* declare const FortyTwoLayer: Layer.Layer<42, never, never>
|
|
2333
|
+
* declare const StringLayer: Layer.Layer<string, never, never>
|
|
2334
|
+
*
|
|
2335
|
+
* // Define a constraint that the success type must be a number
|
|
2336
|
+
* const satisfiesNumber = Layer.satisfiesSuccessType<number>()
|
|
2337
|
+
*
|
|
2338
|
+
* // This works - Layer<42, never, never> extends Layer<number, never, never>
|
|
2339
|
+
* const validLayer = satisfiesNumber(FortyTwoLayer)
|
|
2340
|
+
*
|
|
2341
|
+
* // This would cause a TypeScript compilation error:
|
|
2342
|
+
* // const invalidLayer = satisfiesNumber(StringLayer)
|
|
2343
|
+
* // ^^^^^^^^^^^
|
|
2344
|
+
* // Type 'string' is not assignable to type 'number'
|
|
2345
|
+
* ```
|
|
2346
|
+
*
|
|
2347
|
+
* @category utility types
|
|
2348
|
+
* @since 4.0.0
|
|
2349
|
+
*/
|
|
2350
|
+
export const satisfiesSuccessType =
|
|
2351
|
+
<ROut>() => <ROut2 extends ROut, E, RIn>(layer: Layer<ROut2, E, RIn>): Layer<ROut2, E, RIn> => layer
|
|
2352
|
+
|
|
2353
|
+
/**
|
|
2354
|
+
* Ensures that a layer's error type extends a given type `E`.
|
|
2355
|
+
*
|
|
2356
|
+
* **Details**
|
|
2357
|
+
*
|
|
2358
|
+
* This function provides compile-time type checking to ensure that the error
|
|
2359
|
+
* type of a layer conforms to a specific type constraint.
|
|
2360
|
+
*
|
|
2361
|
+
* **Example** (Constraining layer error types)
|
|
2362
|
+
*
|
|
2363
|
+
* ```ts
|
|
2364
|
+
* import { Layer } from "effect"
|
|
2365
|
+
*
|
|
2366
|
+
* declare const ErrorLayer: Layer.Layer<never, Error, never>
|
|
2367
|
+
* declare const TypeErrorLayer: Layer.Layer<never, TypeError, never>
|
|
2368
|
+
* declare const StringLayer: Layer.Layer<never, string, never>
|
|
2369
|
+
*
|
|
2370
|
+
* // Define a constraint that the error type must be an Error
|
|
2371
|
+
* const satisfiesError = Layer.satisfiesErrorType<Error>()
|
|
2372
|
+
*
|
|
2373
|
+
* // This works - Layer<never, TypeError, never> extends Layer<never, Error, never>
|
|
2374
|
+
* const validLayer = satisfiesError(TypeErrorLayer)
|
|
2375
|
+
*
|
|
2376
|
+
* // This would cause a TypeScript compilation error:
|
|
2377
|
+
* // const invalidLayer = satisfiesError(StringLayer)
|
|
2378
|
+
* // ^^^^^^^^^^^
|
|
2379
|
+
* // Type 'string' is not assignable to type 'Error'
|
|
2380
|
+
* ```
|
|
2381
|
+
*
|
|
2382
|
+
* @category utility types
|
|
2383
|
+
* @since 4.0.0
|
|
2384
|
+
*/
|
|
2385
|
+
export const satisfiesErrorType =
|
|
2386
|
+
<E>() => <ROut, E2 extends E, RIn>(layer: Layer<ROut, E2, RIn>): Layer<ROut, E2, RIn> => layer
|
|
2387
|
+
|
|
2388
|
+
/**
|
|
2389
|
+
* Ensures that a layer's requirements type extends a given type `R`.
|
|
2390
|
+
*
|
|
2391
|
+
* **Details**
|
|
2392
|
+
*
|
|
2393
|
+
* This function provides compile-time type checking to ensure that the
|
|
2394
|
+
* requirements type of a layer conforms to a specific type constraint.
|
|
2395
|
+
*
|
|
2396
|
+
* **Example** (Constraining layer service requirements)
|
|
2397
|
+
*
|
|
2398
|
+
* ```ts
|
|
2399
|
+
* import { Layer } from "effect"
|
|
2400
|
+
*
|
|
2401
|
+
* declare const FortyTwoLayer: Layer.Layer<never, never, 42>
|
|
2402
|
+
* declare const StringLayer: Layer.Layer<never, never, string>
|
|
2403
|
+
*
|
|
2404
|
+
* // Define a constraint that the service requirements must be numbers
|
|
2405
|
+
* const satisfiesNumber = Layer.satisfiesServicesType<number>()
|
|
2406
|
+
*
|
|
2407
|
+
* // This works - Layer<never, never, 42> extends Layer<never, never, number>
|
|
2408
|
+
* const validLayer = satisfiesNumber(FortyTwoLayer)
|
|
2409
|
+
*
|
|
2410
|
+
* // This would cause a TypeScript compilation error:
|
|
2411
|
+
* // const invalidLayer = satisfiesNumber(StringLayer)
|
|
2412
|
+
* // ^^^^^^^^^^^
|
|
2413
|
+
* // Type 'string' is not assignable to type 'number'
|
|
2414
|
+
* ```
|
|
2415
|
+
*
|
|
2416
|
+
* @category utility types
|
|
2417
|
+
* @since 4.0.0
|
|
2418
|
+
*/
|
|
2419
|
+
export const satisfiesServicesType =
|
|
2420
|
+
<RIn>() => <ROut, E, RIn2 extends RIn>(layer: Layer<ROut, E, RIn2>): Layer<ROut, E, RIn2> => layer
|
|
2421
|
+
|
|
2422
|
+
// -----------------------------------------------------------------------------
|
|
2423
|
+
// Tracing
|
|
2424
|
+
// -----------------------------------------------------------------------------
|
|
2425
|
+
|
|
2426
|
+
/**
|
|
2427
|
+
* Represents options that can be used to control the behavior of spans created
|
|
2428
|
+
* for layers.
|
|
2429
|
+
*
|
|
2430
|
+
* **When to use**
|
|
2431
|
+
*
|
|
2432
|
+
* Use to configure tracing metadata, stack trace capture, and `onEnd`
|
|
2433
|
+
* finalization for spans created by `Layer.span` and `Layer.withSpan` during
|
|
2434
|
+
* layer construction.
|
|
2435
|
+
*
|
|
2436
|
+
* **Details**
|
|
2437
|
+
*
|
|
2438
|
+
* Extends `Tracer.SpanOptions` with `onEnd`, which runs when the layer span
|
|
2439
|
+
* ends as the layer scope closes.
|
|
2440
|
+
*
|
|
2441
|
+
* @see {@link span} for creating a layer span
|
|
2442
|
+
* @see {@link withSpan} for wrapping layer construction in a span
|
|
2443
|
+
*
|
|
2444
|
+
* @category options
|
|
2445
|
+
* @since 4.0.0
|
|
2446
|
+
*/
|
|
2447
|
+
export interface SpanOptions extends Tracer.SpanOptions {
|
|
2448
|
+
/**
|
|
2449
|
+
* Runs when the span associated with the layer ends, which happens when the
|
|
2450
|
+
* layer scope is closed.
|
|
2451
|
+
*/
|
|
2452
|
+
readonly onEnd?:
|
|
2453
|
+
| ((span: Tracer.Span, exit: Exit.Exit<unknown, unknown>) => Effect<void>)
|
|
2454
|
+
| undefined
|
|
2455
|
+
}
|
|
2456
|
+
|
|
2457
|
+
/**
|
|
2458
|
+
* Constructs a new `Layer` which creates a span and registers it as the current
|
|
2459
|
+
* parent span.
|
|
2460
|
+
*
|
|
2461
|
+
* **Details**
|
|
2462
|
+
*
|
|
2463
|
+
* This allows you to create a traced scope for layer construction, making all
|
|
2464
|
+
* operations within the layer constructor part of the same trace span. The span
|
|
2465
|
+
* is automatically ended when the layer's scope is closed. If `onEnd` is
|
|
2466
|
+
* provided, it receives the span and the layer scope's exit value when the span
|
|
2467
|
+
* ends.
|
|
2468
|
+
*
|
|
2469
|
+
* **Example** (Tracing layer construction with a span)
|
|
2470
|
+
*
|
|
2471
|
+
* ```ts
|
|
2472
|
+
* import { Console, Context, Effect, Layer } from "effect"
|
|
2473
|
+
* import type { Tracer } from "effect"
|
|
2474
|
+
*
|
|
2475
|
+
* class Database extends Context.Service<Database, {
|
|
2476
|
+
* readonly query: (sql: string) => Effect.Effect<string>
|
|
2477
|
+
* }>()("Database") {}
|
|
2478
|
+
*
|
|
2479
|
+
* // Create a traced layer - all operations performed during construction of
|
|
2480
|
+
* // the `Database` service are part of the "database-init" span
|
|
2481
|
+
* const databaseLayer = Layer.effect(Database, Effect.gen(function*() {
|
|
2482
|
+
* // These operations are traced under "database-init" span
|
|
2483
|
+
* yield* Effect.log("Connecting to database")
|
|
2484
|
+
* yield* Effect.sleep("100 millis")
|
|
2485
|
+
* yield* Effect.log("Database connected")
|
|
2486
|
+
*
|
|
2487
|
+
* const parentSpan = yield* Effect.currentParentSpan
|
|
2488
|
+
* yield* Console.log((parentSpan as Tracer.Span).name) // "database-init"
|
|
2489
|
+
*
|
|
2490
|
+
* return {
|
|
2491
|
+
* query: Effect.fn("Database.query")((sql: string) => Effect.succeed(`Result: ${sql}`))
|
|
2492
|
+
* }
|
|
2493
|
+
* })).pipe(Layer.provide(Layer.span("database-init")))
|
|
2494
|
+
*
|
|
2495
|
+
* // Can also use the `onEnd` callback to execute logic when the span ends
|
|
2496
|
+
* const tracedLayer = Layer.span("service-initialization", {
|
|
2497
|
+
* attributes: { version: "1.0.0" },
|
|
2498
|
+
* onEnd: (span, exit) =>
|
|
2499
|
+
* Effect.sync(() => {
|
|
2500
|
+
* console.log(`Span ${span.name} ended with:`, exit._tag)
|
|
2501
|
+
* })
|
|
2502
|
+
* })
|
|
2503
|
+
* ```
|
|
2504
|
+
*
|
|
2505
|
+
* @category tracing
|
|
2506
|
+
* @since 2.0.0
|
|
2507
|
+
*/
|
|
2508
|
+
export const span = (
|
|
2509
|
+
name: string,
|
|
2510
|
+
options?: SpanOptions
|
|
2511
|
+
): Layer<Tracer.ParentSpan> => {
|
|
2512
|
+
options = internalTracer.addSpanStackTrace(options)
|
|
2513
|
+
return effect(
|
|
2514
|
+
Tracer.ParentSpan,
|
|
2515
|
+
options?.onEnd
|
|
2516
|
+
? internalEffect.tap(
|
|
2517
|
+
internalEffect.makeSpanScoped(name, options),
|
|
2518
|
+
(span) => internalEffect.addFinalizer((exit) => options.onEnd!(span, exit))
|
|
2519
|
+
)
|
|
2520
|
+
: internalEffect.makeSpanScoped(name, options)
|
|
2521
|
+
)
|
|
2522
|
+
}
|
|
2523
|
+
|
|
2524
|
+
/**
|
|
2525
|
+
* Constructs a layer that provides an existing span as the current parent span.
|
|
2526
|
+
*
|
|
2527
|
+
* **Details**
|
|
2528
|
+
*
|
|
2529
|
+
* The supplied span is made available through `Tracer.ParentSpan` for layers
|
|
2530
|
+
* that are built with this layer. This API does not create, end, or close the
|
|
2531
|
+
* span; the caller remains responsible for the span's lifetime.
|
|
2532
|
+
*
|
|
2533
|
+
* **Example** (Referencing an existing parent span)
|
|
2534
|
+
*
|
|
2535
|
+
* ```ts
|
|
2536
|
+
* import { Console, Context, Effect, Layer, Tracer } from "effect"
|
|
2537
|
+
*
|
|
2538
|
+
* class Database extends Context.Service<Database, {
|
|
2539
|
+
* readonly query: (sql: string) => Effect.Effect<string>
|
|
2540
|
+
* }>()("Database") {}
|
|
2541
|
+
*
|
|
2542
|
+
* // Create a layer that uses an existing span as parent
|
|
2543
|
+
* const databaseLayer = Layer.effect(
|
|
2544
|
+
* Database,
|
|
2545
|
+
* Effect.gen(function*() {
|
|
2546
|
+
* yield* Effect.log("Initializing database")
|
|
2547
|
+
*
|
|
2548
|
+
* const parentSpan = yield* Effect.currentParentSpan
|
|
2549
|
+
* yield* Console.log(parentSpan.spanId) // "42"
|
|
2550
|
+
*
|
|
2551
|
+
* return {
|
|
2552
|
+
* query: Effect.fn("Database.query")((sql: string) => Effect.succeed(`Result: ${sql}`))
|
|
2553
|
+
* }
|
|
2554
|
+
* })
|
|
2555
|
+
* ).pipe(Layer.provide(Layer.parentSpan(Tracer.externalSpan({
|
|
2556
|
+
* spanId: "42",
|
|
2557
|
+
* traceId: "000"
|
|
2558
|
+
* }))))
|
|
2559
|
+
* ```
|
|
2560
|
+
*
|
|
2561
|
+
* @category tracing
|
|
2562
|
+
* @since 2.0.0
|
|
2563
|
+
*/
|
|
2564
|
+
export const parentSpan = (span: Tracer.AnySpan): Layer<Tracer.ParentSpan> =>
|
|
2565
|
+
succeedContext(Tracer.ParentSpan.context(span))
|
|
2566
|
+
|
|
2567
|
+
/**
|
|
2568
|
+
* Wraps a `Layer` with a new tracing span, making all operations in the layer
|
|
2569
|
+
* constructor part of the named trace span.
|
|
2570
|
+
*
|
|
2571
|
+
* **Details**
|
|
2572
|
+
*
|
|
2573
|
+
* This creates a new span for the layer's construction and execution. The span
|
|
2574
|
+
* is automatically ended when the layer's scope is closed. This is useful for
|
|
2575
|
+
* tracking the lifecycle and performance of layer initialization.
|
|
2576
|
+
*
|
|
2577
|
+
* **Example** (Wrapping a layer with a span)
|
|
2578
|
+
*
|
|
2579
|
+
* ```ts
|
|
2580
|
+
* import { Context, Effect, Layer } from "effect"
|
|
2581
|
+
*
|
|
2582
|
+
* class Database extends Context.Service<Database, {
|
|
2583
|
+
* readonly query: (sql: string) => Effect.Effect<string>
|
|
2584
|
+
* }>()("Database") {}
|
|
2585
|
+
*
|
|
2586
|
+
* class Logger extends Context.Service<Logger, {
|
|
2587
|
+
* readonly log: (msg: string) => Effect.Effect<void>
|
|
2588
|
+
* }>()("Logger") {}
|
|
2589
|
+
*
|
|
2590
|
+
* // Create layers with tracing
|
|
2591
|
+
* const databaseLayer = Layer.effect(Database, Effect.gen(function*() {
|
|
2592
|
+
* yield* Effect.log("Connecting to database")
|
|
2593
|
+
* yield* Effect.sleep("100 millis")
|
|
2594
|
+
* return {
|
|
2595
|
+
* query: Effect.fn("Database.query")((sql: string) => Effect.succeed(`Result: ${sql}`))
|
|
2596
|
+
* }
|
|
2597
|
+
* })).pipe(Layer.withSpan("database-initialization", {
|
|
2598
|
+
* attributes: { dbType: "postgres" }
|
|
2599
|
+
* }))
|
|
2600
|
+
*
|
|
2601
|
+
* const loggerLayer = Layer.succeed(Logger, {
|
|
2602
|
+
* log: Effect.fn("Logger.log")((msg: string) => Effect.sync(() => console.log(msg)))
|
|
2603
|
+
* }).pipe(Layer.withSpan("logger-initialization"))
|
|
2604
|
+
*
|
|
2605
|
+
* // Combine traced layers
|
|
2606
|
+
* const appLayer = Layer.mergeAll(databaseLayer, loggerLayer).pipe(
|
|
2607
|
+
* Layer.withSpan("app-initialization", {
|
|
2608
|
+
* onEnd: (span, exit) =>
|
|
2609
|
+
* Effect.sync(() => {
|
|
2610
|
+
* console.log(`Application initialization completed: ${exit._tag}`)
|
|
2611
|
+
* })
|
|
2612
|
+
* })
|
|
2613
|
+
* )
|
|
2614
|
+
*
|
|
2615
|
+
* const program = Effect.gen(function*() {
|
|
2616
|
+
* const database = yield* Database
|
|
2617
|
+
* const logger = yield* Logger
|
|
2618
|
+
*
|
|
2619
|
+
* yield* logger.log("Application ready")
|
|
2620
|
+
* return yield* database.query("SELECT * FROM users")
|
|
2621
|
+
* }).pipe(Effect.provide(appLayer))
|
|
2622
|
+
* ```
|
|
2623
|
+
*
|
|
2624
|
+
* @category tracing
|
|
2625
|
+
* @since 2.0.0
|
|
2626
|
+
*/
|
|
2627
|
+
export const withSpan: {
|
|
2628
|
+
(
|
|
2629
|
+
name: string,
|
|
2630
|
+
options?: SpanOptions
|
|
2631
|
+
): <A, E, R>(
|
|
2632
|
+
self: Layer<A, E, R>
|
|
2633
|
+
) => Layer<A, E, Exclude<R, Tracer.ParentSpan>>
|
|
2634
|
+
<A, E, R>(
|
|
2635
|
+
self: Layer<A, E, R>,
|
|
2636
|
+
name: string,
|
|
2637
|
+
options?: SpanOptions
|
|
2638
|
+
): Layer<A, E, Exclude<R, Tracer.ParentSpan>>
|
|
2639
|
+
} = function() {
|
|
2640
|
+
const dataFirst = typeof arguments[0] !== "string"
|
|
2641
|
+
const name = dataFirst ? arguments[1] : arguments[0]
|
|
2642
|
+
const options = internalTracer.addSpanStackTrace(dataFirst ? arguments[2] : arguments[1]) as SpanOptions
|
|
2643
|
+
if (dataFirst) {
|
|
2644
|
+
const self = arguments[0]
|
|
2645
|
+
return unwrap(
|
|
2646
|
+
internalEffect.map(
|
|
2647
|
+
options?.onEnd !== undefined
|
|
2648
|
+
? internalEffect.tap(
|
|
2649
|
+
internalEffect.makeSpanScoped(name, options),
|
|
2650
|
+
(span) => internalEffect.addFinalizer((exit) => options.onEnd!(span, exit))
|
|
2651
|
+
)
|
|
2652
|
+
: internalEffect.makeSpanScoped(name, options),
|
|
2653
|
+
(span) => withParentSpan(self, span)
|
|
2654
|
+
)
|
|
2655
|
+
)
|
|
2656
|
+
}
|
|
2657
|
+
return (self: Layer<any, any, any>) =>
|
|
2658
|
+
unwrap(
|
|
2659
|
+
internalEffect.map(
|
|
2660
|
+
options?.onEnd !== undefined
|
|
2661
|
+
? internalEffect.tap(
|
|
2662
|
+
internalEffect.makeSpanScoped(name, options),
|
|
2663
|
+
(span) => internalEffect.addFinalizer((exit) => options.onEnd!(span, exit))
|
|
2664
|
+
)
|
|
2665
|
+
: internalEffect.makeSpanScoped(name, options),
|
|
2666
|
+
(span) => withParentSpan(self, span)
|
|
2667
|
+
)
|
|
2668
|
+
)
|
|
2669
|
+
} as any
|
|
2670
|
+
|
|
2671
|
+
/**
|
|
2672
|
+
* Wraps a layer so spans created during its construction use the supplied span
|
|
2673
|
+
* as their parent.
|
|
2674
|
+
*
|
|
2675
|
+
* **Details**
|
|
2676
|
+
*
|
|
2677
|
+
* Use this to attach layer construction to an existing trace hierarchy. This API
|
|
2678
|
+
* does not create or end the supplied parent span.
|
|
2679
|
+
*
|
|
2680
|
+
* When the supplied span is a native `Span`, layer construction also receives
|
|
2681
|
+
* diagnostic information that helps associate failures with the layer call site.
|
|
2682
|
+
* External spans are only installed as the parent span and do not add this
|
|
2683
|
+
* diagnostic call-site information.
|
|
2684
|
+
*
|
|
2685
|
+
* **Example** (Attaching layers to an existing parent span)
|
|
2686
|
+
*
|
|
2687
|
+
* ```ts
|
|
2688
|
+
* import { Context, Effect, Layer, Tracer } from "effect"
|
|
2689
|
+
*
|
|
2690
|
+
* class Database extends Context.Service<Database, {
|
|
2691
|
+
* readonly query: (sql: string) => Effect.Effect<string>
|
|
2692
|
+
* }>()("Database") {}
|
|
2693
|
+
*
|
|
2694
|
+
* class Cache extends Context.Service<Cache, {
|
|
2695
|
+
* readonly get: (key: string) => Effect.Effect<string | null>
|
|
2696
|
+
* }>()("Cache") {}
|
|
2697
|
+
*
|
|
2698
|
+
* // Create layers
|
|
2699
|
+
* const DatabaseLayer = Layer.effect(Database, Effect.gen(function*() {
|
|
2700
|
+
* yield* Effect.log("Connecting to database")
|
|
2701
|
+
* return {
|
|
2702
|
+
* query: Effect.fn("Database.query")((sql: string) => Effect.succeed(`DB: ${sql}`))
|
|
2703
|
+
* }
|
|
2704
|
+
* }))
|
|
2705
|
+
*
|
|
2706
|
+
* const CacheLayer = Layer.effect(Cache, Effect.gen(function*() {
|
|
2707
|
+
* yield* Effect.log("Connecting to cache")
|
|
2708
|
+
* return {
|
|
2709
|
+
* get: Effect.fn("Cache.get")((key: string) => Effect.succeed(`Cache: ${key}`))
|
|
2710
|
+
* }
|
|
2711
|
+
* }))
|
|
2712
|
+
*
|
|
2713
|
+
* // Use with an existing parent span from Effect.withSpan
|
|
2714
|
+
* const program = Effect.withSpan("application-startup")(
|
|
2715
|
+
* Effect.gen(function*() {
|
|
2716
|
+
* const parentSpan = yield* Tracer.ParentSpan
|
|
2717
|
+
*
|
|
2718
|
+
* // Both layers will be children of "application-startup" span
|
|
2719
|
+
* const AppLayer = Layer.mergeAll(DatabaseLayer, CacheLayer).pipe(
|
|
2720
|
+
* Layer.withParentSpan(parentSpan)
|
|
2721
|
+
* )
|
|
2722
|
+
*
|
|
2723
|
+
* const context = yield* Layer.build(AppLayer)
|
|
2724
|
+
* const database = Context.get(context, Database)
|
|
2725
|
+
* const cache = Context.get(context, Cache)
|
|
2726
|
+
*
|
|
2727
|
+
* const dbResult = yield* database.query("SELECT * FROM users")
|
|
2728
|
+
* const cacheResult = yield* cache.get("user:123")
|
|
2729
|
+
*
|
|
2730
|
+
* return { dbResult, cacheResult }
|
|
2731
|
+
* })
|
|
2732
|
+
* )
|
|
2733
|
+
* ```
|
|
2734
|
+
*
|
|
2735
|
+
* @category tracing
|
|
2736
|
+
* @since 2.0.0
|
|
2737
|
+
*/
|
|
2738
|
+
export const withParentSpan: {
|
|
2739
|
+
(
|
|
2740
|
+
span: Tracer.AnySpan,
|
|
2741
|
+
options?: Tracer.TraceOptions
|
|
2742
|
+
): <A, E, R>(
|
|
2743
|
+
self: Layer<A, E, R>
|
|
2744
|
+
) => Layer<A, E, Exclude<R, Tracer.ParentSpan>>
|
|
2745
|
+
<A, E, R>(
|
|
2746
|
+
self: Layer<A, E, R>,
|
|
2747
|
+
span: Tracer.AnySpan,
|
|
2748
|
+
options?: Tracer.TraceOptions
|
|
2749
|
+
): Layer<A, E, Exclude<R, Tracer.ParentSpan>>
|
|
2750
|
+
} = function() {
|
|
2751
|
+
const dataFirst = isLayer(arguments[0])
|
|
2752
|
+
const span: Tracer.AnySpan = dataFirst ? arguments[1] : arguments[0]
|
|
2753
|
+
let options = dataFirst ? arguments[2] : arguments[1]
|
|
2754
|
+
let provideStackFrame: <A, E, R>(self: Layer<A, E, R>) => Layer<A, E, R> = identity
|
|
2755
|
+
if (span._tag === "Span") {
|
|
2756
|
+
options = internalTracer.addSpanStackTrace(options)
|
|
2757
|
+
provideStackFrame = provideSpanStackFrame(span.name, options?.captureStackTrace)
|
|
2758
|
+
}
|
|
2759
|
+
const parentSpanLayer = parentSpan(span)
|
|
2760
|
+
if (dataFirst) {
|
|
2761
|
+
return provide(provideStackFrame(arguments[0]), parentSpanLayer)
|
|
2762
|
+
}
|
|
2763
|
+
return (self: Layer<any, any, any>) => provide(provideStackFrame(self), parentSpanLayer)
|
|
2764
|
+
} as any
|
|
2765
|
+
|
|
2766
|
+
const provideSpanStackFrame = (name: string, stack: (() => string | undefined) | undefined) => {
|
|
2767
|
+
stack = typeof stack === "function" ? stack : constUndefined
|
|
2768
|
+
return updateService(CurrentStackFrame, (parent) => ({
|
|
2769
|
+
name,
|
|
2770
|
+
stack,
|
|
2771
|
+
parent
|
|
2772
|
+
}))
|
|
2773
|
+
}
|