@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,3903 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents Effect schemas as runtime trees.
|
|
3
|
+
*
|
|
4
|
+
* Every `Schema` has an AST made from nodes for declarations, primitives,
|
|
5
|
+
* literals, arrays, objects, unions, suspended schemas, checks, annotations,
|
|
6
|
+
* encoding links, and parsing context. Most users work with the higher-level
|
|
7
|
+
* `Schema` module. Use `SchemaAST` when you need to inspect schema nodes, build
|
|
8
|
+
* ASTs programmatically, change encoded or decoded views, collect issues, or
|
|
9
|
+
* run low-level schema checks.
|
|
10
|
+
*
|
|
11
|
+
* @since 4.0.0
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import * as Arr from "./Array.ts"
|
|
15
|
+
import * as Cause from "./Cause.ts"
|
|
16
|
+
import type * as Combiner from "./Combiner.ts"
|
|
17
|
+
import * as Effect from "./Effect.ts"
|
|
18
|
+
import * as Exit from "./Exit.ts"
|
|
19
|
+
import { format, formatPropertyKey } from "./Formatter.ts"
|
|
20
|
+
import { memoize } from "./Function.ts"
|
|
21
|
+
import { effectIsExit, iterateEager } from "./internal/effect.ts"
|
|
22
|
+
import * as internalRecord from "./internal/record.ts"
|
|
23
|
+
import * as InternalAnnotations from "./internal/schema/annotations.ts"
|
|
24
|
+
import * as InternalSchemaCause from "./internal/schema/cause.ts"
|
|
25
|
+
import * as Option from "./Option.ts"
|
|
26
|
+
import * as Pipeable from "./Pipeable.ts"
|
|
27
|
+
import * as Predicate from "./Predicate.ts"
|
|
28
|
+
import * as RegEx from "./RegExp.ts"
|
|
29
|
+
import * as Result from "./Result.ts"
|
|
30
|
+
import type * as Schema from "./Schema.ts"
|
|
31
|
+
import * as SchemaGetter from "./SchemaGetter.ts"
|
|
32
|
+
import * as SchemaIssue from "./SchemaIssue.ts"
|
|
33
|
+
import type * as SchemaParser from "./SchemaParser.ts"
|
|
34
|
+
import * as SchemaTransformation from "./SchemaTransformation.ts"
|
|
35
|
+
import type * as FastCheck from "./testing/FastCheck.ts"
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Discriminated union of all AST node types.
|
|
39
|
+
*
|
|
40
|
+
* **Details**
|
|
41
|
+
*
|
|
42
|
+
* Every `Schema` has an `.ast` property of this type. Use the guard functions
|
|
43
|
+
* ({@link isString}, {@link isObjects}, etc.) to narrow to a specific variant,
|
|
44
|
+
* then access variant-specific fields.
|
|
45
|
+
*
|
|
46
|
+
* - All variants share the {@link Base} fields: `annotations`, `checks`,
|
|
47
|
+
* `encoding`, `context`.
|
|
48
|
+
* - Discriminate on the `_tag` field (e.g. `"String"`, `"Objects"`, `"Union"`).
|
|
49
|
+
*
|
|
50
|
+
* @see {@link Base}
|
|
51
|
+
* @see {@link isAST}
|
|
52
|
+
* @category models
|
|
53
|
+
* @since 3.10.0
|
|
54
|
+
*/
|
|
55
|
+
export type AST =
|
|
56
|
+
| Declaration
|
|
57
|
+
| Null
|
|
58
|
+
| Undefined
|
|
59
|
+
| Void
|
|
60
|
+
| Never
|
|
61
|
+
| Unknown
|
|
62
|
+
| Any
|
|
63
|
+
| String
|
|
64
|
+
| Number
|
|
65
|
+
| Boolean
|
|
66
|
+
| BigInt
|
|
67
|
+
| Symbol
|
|
68
|
+
| Literal
|
|
69
|
+
| UniqueSymbol
|
|
70
|
+
| ObjectKeyword
|
|
71
|
+
| Enum
|
|
72
|
+
| TemplateLiteral
|
|
73
|
+
| Arrays
|
|
74
|
+
| Objects
|
|
75
|
+
| Union
|
|
76
|
+
| Suspend
|
|
77
|
+
|
|
78
|
+
function makeGuard<T extends AST["_tag"]>(tag: T) {
|
|
79
|
+
return (ast: AST): ast is Extract<AST, { _tag: T }> => ast._tag === tag
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Returns `true` if the value is an {@link AST} node (any variant).
|
|
84
|
+
*
|
|
85
|
+
* **Details**
|
|
86
|
+
*
|
|
87
|
+
* Uses the internal `TypeId` brand to distinguish AST nodes from arbitrary
|
|
88
|
+
* objects.
|
|
89
|
+
*
|
|
90
|
+
* @see {@link AST}
|
|
91
|
+
* @category guards
|
|
92
|
+
* @since 4.0.0
|
|
93
|
+
*/
|
|
94
|
+
export function isAST(u: unknown): u is AST {
|
|
95
|
+
return Predicate.hasProperty(u, TypeId) && u[TypeId] === TypeId
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Narrows an {@link AST} to {@link Declaration}.
|
|
100
|
+
*
|
|
101
|
+
* **When to use**
|
|
102
|
+
*
|
|
103
|
+
* Use to recognize declaration AST nodes before running declaration-specific
|
|
104
|
+
* handling.
|
|
105
|
+
*
|
|
106
|
+
* @see {@link Declaration} for the AST node type narrowed by this guard
|
|
107
|
+
*
|
|
108
|
+
* @category guards
|
|
109
|
+
* @since 3.10.0
|
|
110
|
+
*/
|
|
111
|
+
export const isDeclaration = makeGuard("Declaration")
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Narrows an {@link AST} to {@link Null}.
|
|
115
|
+
*
|
|
116
|
+
* **When to use**
|
|
117
|
+
*
|
|
118
|
+
* Use to recognize an AST node that represents exactly the `null` literal when
|
|
119
|
+
* inspecting, traversing, or transforming schema ASTs.
|
|
120
|
+
*
|
|
121
|
+
* @see {@link Null} for the AST node type narrowed by this guard
|
|
122
|
+
* @see {@link null_ null} for the singleton `Null` AST instance
|
|
123
|
+
* @see {@link isLiteral} for exact primitive literal AST nodes
|
|
124
|
+
*
|
|
125
|
+
* @category guards
|
|
126
|
+
* @since 4.0.0
|
|
127
|
+
*/
|
|
128
|
+
export const isNull = makeGuard("Null")
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Narrows an {@link AST} to {@link Undefined}.
|
|
132
|
+
*
|
|
133
|
+
* **When to use**
|
|
134
|
+
*
|
|
135
|
+
* Use to identify AST nodes that represent exactly the JavaScript `undefined`
|
|
136
|
+
* value.
|
|
137
|
+
*
|
|
138
|
+
* @see {@link isVoid} for narrowing AST nodes that represent TypeScript `void` instead of exact `undefined`
|
|
139
|
+
*
|
|
140
|
+
* @category guards
|
|
141
|
+
* @since 4.0.0
|
|
142
|
+
*/
|
|
143
|
+
export const isUndefined = makeGuard("Undefined")
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Narrows an {@link AST} to {@link Void}.
|
|
147
|
+
*
|
|
148
|
+
* **When to use**
|
|
149
|
+
*
|
|
150
|
+
* Use to identify AST nodes that represent the TypeScript `void` type before
|
|
151
|
+
* handling `Void`-specific schema behavior.
|
|
152
|
+
*
|
|
153
|
+
* @see {@link isUndefined} for narrowing AST nodes that represent the literal `undefined` value instead of TypeScript `void`
|
|
154
|
+
*
|
|
155
|
+
* @category guards
|
|
156
|
+
* @since 4.0.0
|
|
157
|
+
*/
|
|
158
|
+
export const isVoid = makeGuard("Void")
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Narrows an {@link AST} to {@link Never}.
|
|
162
|
+
*
|
|
163
|
+
* **When to use**
|
|
164
|
+
*
|
|
165
|
+
* Use to detect the AST node for a schema that can never match before handling
|
|
166
|
+
* other schema variants.
|
|
167
|
+
*
|
|
168
|
+
* @see {@link Never} for the AST node type narrowed by this guard
|
|
169
|
+
* @see {@link never} for the singleton `Never` AST instance
|
|
170
|
+
*
|
|
171
|
+
* @category guards
|
|
172
|
+
* @since 4.0.0
|
|
173
|
+
*/
|
|
174
|
+
export const isNever = makeGuard("Never")
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Narrows an {@link AST} to {@link Unknown}.
|
|
178
|
+
*
|
|
179
|
+
* **When to use**
|
|
180
|
+
*
|
|
181
|
+
* Use when you need to inspect a schema AST and handle the `Unknown` node
|
|
182
|
+
* variant specifically.
|
|
183
|
+
*
|
|
184
|
+
* @see {@link isAny} for the guard for the `Any` node, whose parsed result is typed as `any` rather than `unknown`
|
|
185
|
+
*
|
|
186
|
+
* @category guards
|
|
187
|
+
* @since 4.0.0
|
|
188
|
+
*/
|
|
189
|
+
export const isUnknown = makeGuard("Unknown")
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Narrows an {@link AST} to {@link Any}.
|
|
193
|
+
*
|
|
194
|
+
* **When to use**
|
|
195
|
+
*
|
|
196
|
+
* Use when you need to inspect a schema AST and handle the `Any` node
|
|
197
|
+
* variant specifically.
|
|
198
|
+
*
|
|
199
|
+
* @see {@link isUnknown} for the guard for the `Unknown` node, whose parsed result is typed as `unknown` rather than `any`
|
|
200
|
+
*
|
|
201
|
+
* @category guards
|
|
202
|
+
* @since 4.0.0
|
|
203
|
+
*/
|
|
204
|
+
export const isAny = makeGuard("Any")
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Narrows an {@link AST} to {@link String}.
|
|
208
|
+
*
|
|
209
|
+
* **When to use**
|
|
210
|
+
*
|
|
211
|
+
* Use to detect schema AST nodes that match any string value while inspecting
|
|
212
|
+
* or transforming a Schema AST.
|
|
213
|
+
*
|
|
214
|
+
* @see {@link String} for the AST node class narrowed by this guard
|
|
215
|
+
* @see {@link string} for the singleton `String` AST instance
|
|
216
|
+
* @see {@link isLiteral} for exact primitive literal AST nodes, including exact string literals
|
|
217
|
+
*
|
|
218
|
+
* @category guards
|
|
219
|
+
* @since 4.0.0
|
|
220
|
+
*/
|
|
221
|
+
export const isString = makeGuard("String")
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Narrows an {@link AST} to {@link Number}.
|
|
225
|
+
*
|
|
226
|
+
* **When to use**
|
|
227
|
+
*
|
|
228
|
+
* Use to detect `Number` AST nodes while inspecting, traversing, or transforming
|
|
229
|
+
* schema ASTs.
|
|
230
|
+
*
|
|
231
|
+
* @category guards
|
|
232
|
+
* @since 4.0.0
|
|
233
|
+
*/
|
|
234
|
+
export const isNumber = makeGuard("Number")
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Narrows an {@link AST} to {@link Boolean}.
|
|
238
|
+
*
|
|
239
|
+
* **When to use**
|
|
240
|
+
*
|
|
241
|
+
* Use to identify the `Boolean` AST variant while inspecting, traversing, or
|
|
242
|
+
* transforming schema definitions.
|
|
243
|
+
*
|
|
244
|
+
* @see {@link Boolean} for the AST node type matched by this guard
|
|
245
|
+
* @see {@link boolean} for the singleton instance to use when constructing a boolean AST directly
|
|
246
|
+
*
|
|
247
|
+
* @category guards
|
|
248
|
+
* @since 4.0.0
|
|
249
|
+
*/
|
|
250
|
+
export const isBoolean = makeGuard("Boolean")
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Narrows an {@link AST} to {@link BigInt}.
|
|
254
|
+
*
|
|
255
|
+
* **When to use**
|
|
256
|
+
*
|
|
257
|
+
* Use to identify bigint AST nodes while inspecting or transforming schema ASTs.
|
|
258
|
+
*
|
|
259
|
+
* @see {@link BigInt} for the AST node matched by this guard
|
|
260
|
+
* @see {@link bigInt} for the singleton instance; use `isBigInt` when narrowing an existing `AST` value
|
|
261
|
+
*
|
|
262
|
+
* @category guards
|
|
263
|
+
* @since 4.0.0
|
|
264
|
+
*/
|
|
265
|
+
export const isBigInt = makeGuard("BigInt")
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Narrows an {@link AST} to {@link Symbol}.
|
|
269
|
+
*
|
|
270
|
+
* **When to use**
|
|
271
|
+
*
|
|
272
|
+
* Use to narrow an `AST` node before handling the `Symbol` variant for schemas
|
|
273
|
+
* that accept any JavaScript symbol value.
|
|
274
|
+
*
|
|
275
|
+
* @see {@link isUniqueSymbol} for the sibling guard that narrows the `UniqueSymbol` variant for one exact symbol value
|
|
276
|
+
*
|
|
277
|
+
* @category guards
|
|
278
|
+
* @since 4.0.0
|
|
279
|
+
*/
|
|
280
|
+
export const isSymbol = makeGuard("Symbol")
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Narrows an {@link AST} to {@link Literal}.
|
|
284
|
+
*
|
|
285
|
+
* **When to use**
|
|
286
|
+
*
|
|
287
|
+
* Use to recognize exact string, number, boolean, or bigint literal AST nodes.
|
|
288
|
+
*
|
|
289
|
+
* @see {@link Literal} for the AST node type narrowed by this guard
|
|
290
|
+
* @see {@link LiteralValue} for the values stored by literal nodes
|
|
291
|
+
*
|
|
292
|
+
* @category guards
|
|
293
|
+
* @since 3.10.0
|
|
294
|
+
*/
|
|
295
|
+
export const isLiteral = makeGuard("Literal")
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Narrows an {@link AST} to {@link UniqueSymbol}.
|
|
299
|
+
*
|
|
300
|
+
* @category guards
|
|
301
|
+
* @since 3.10.0
|
|
302
|
+
*/
|
|
303
|
+
export const isUniqueSymbol = makeGuard("UniqueSymbol")
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* Narrows an {@link AST} to {@link ObjectKeyword}.
|
|
307
|
+
*
|
|
308
|
+
* **When to use**
|
|
309
|
+
*
|
|
310
|
+
* Use to identify the AST node for the TypeScript `object` keyword when
|
|
311
|
+
* inspecting or transforming a Schema AST.
|
|
312
|
+
*
|
|
313
|
+
* @see {@link ObjectKeyword} for the AST node matched by this guard
|
|
314
|
+
* @see {@link objectKeyword} for the singleton `ObjectKeyword` AST instance
|
|
315
|
+
* @see {@link isObjects} for struct and record AST nodes
|
|
316
|
+
*
|
|
317
|
+
* @category guards
|
|
318
|
+
* @since 3.10.0
|
|
319
|
+
*/
|
|
320
|
+
export const isObjectKeyword = makeGuard("ObjectKeyword")
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Narrows an {@link AST} to {@link Enum}.
|
|
324
|
+
*
|
|
325
|
+
* **When to use**
|
|
326
|
+
*
|
|
327
|
+
* Use to recognize enum AST nodes before reading enum cases or running
|
|
328
|
+
* enum-specific handling.
|
|
329
|
+
*
|
|
330
|
+
* @see {@link Enum} for the AST node type narrowed by this guard
|
|
331
|
+
*
|
|
332
|
+
* @category guards
|
|
333
|
+
* @since 4.0.0
|
|
334
|
+
*/
|
|
335
|
+
export const isEnum = makeGuard("Enum")
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* Narrows an {@link AST} to {@link TemplateLiteral}.
|
|
339
|
+
*
|
|
340
|
+
* @category guards
|
|
341
|
+
* @since 3.10.0
|
|
342
|
+
*/
|
|
343
|
+
export const isTemplateLiteral = makeGuard("TemplateLiteral")
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Narrows an {@link AST} to {@link Arrays}.
|
|
347
|
+
*
|
|
348
|
+
* **When to use**
|
|
349
|
+
*
|
|
350
|
+
* Use to recognize array-like AST nodes before reading their element, rest, or
|
|
351
|
+
* mutability metadata.
|
|
352
|
+
*
|
|
353
|
+
* @see {@link Arrays} for the AST node type narrowed by this guard
|
|
354
|
+
*
|
|
355
|
+
* @category guards
|
|
356
|
+
* @since 4.0.0
|
|
357
|
+
*/
|
|
358
|
+
export const isArrays = makeGuard("Arrays")
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Narrows an {@link AST} to {@link Objects}.
|
|
362
|
+
*
|
|
363
|
+
* @category guards
|
|
364
|
+
* @since 4.0.0
|
|
365
|
+
*/
|
|
366
|
+
export const isObjects = makeGuard("Objects")
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* Narrows an {@link AST} to {@link Union}.
|
|
370
|
+
*
|
|
371
|
+
* @category guards
|
|
372
|
+
* @since 3.10.0
|
|
373
|
+
*/
|
|
374
|
+
export const isUnion = makeGuard("Union")
|
|
375
|
+
|
|
376
|
+
/**
|
|
377
|
+
* Narrows an {@link AST} to {@link Suspend}.
|
|
378
|
+
*
|
|
379
|
+
* @category guards
|
|
380
|
+
* @since 3.10.0
|
|
381
|
+
*/
|
|
382
|
+
export const isSuspend = makeGuard("Suspend")
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* Represents a single step in an {@link Encoding} chain.
|
|
386
|
+
*
|
|
387
|
+
* **Details**
|
|
388
|
+
*
|
|
389
|
+
* A link pairs a target {@link AST} with a `Transformation` or `Middleware`
|
|
390
|
+
* that converts values between the current node and the target.
|
|
391
|
+
*
|
|
392
|
+
* - `to` — the AST node on the other side of this transformation step.
|
|
393
|
+
* - `transformation` — the bidirectional conversion logic (decode/encode).
|
|
394
|
+
*
|
|
395
|
+
* Links are composed into a non-empty array ({@link Encoding}) attached to
|
|
396
|
+
* AST nodes that have a different encoded representation.
|
|
397
|
+
*
|
|
398
|
+
* @see {@link Encoding}
|
|
399
|
+
* @see {@link decodeTo}
|
|
400
|
+
* @category models
|
|
401
|
+
* @since 4.0.0
|
|
402
|
+
*/
|
|
403
|
+
export class Link {
|
|
404
|
+
readonly to: AST
|
|
405
|
+
readonly transformation:
|
|
406
|
+
| SchemaTransformation.Transformation<any, any, any, any>
|
|
407
|
+
| SchemaTransformation.Middleware<any, any, any, any, any, any>
|
|
408
|
+
|
|
409
|
+
constructor(
|
|
410
|
+
to: AST,
|
|
411
|
+
transformation:
|
|
412
|
+
| SchemaTransformation.Transformation<any, any, any, any>
|
|
413
|
+
| SchemaTransformation.Middleware<any, any, any, any, any, any>
|
|
414
|
+
) {
|
|
415
|
+
this.to = to
|
|
416
|
+
this.transformation = transformation
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
* A non-empty chain of {@link Link} values representing the transformation
|
|
422
|
+
* steps between a schema's decoded (type) form and its encoded (wire) form.
|
|
423
|
+
*
|
|
424
|
+
* **Details**
|
|
425
|
+
*
|
|
426
|
+
* Stored on {@link Base.encoding}. When `undefined`, the node has no
|
|
427
|
+
* encoding transformation (type and encoded forms are identical).
|
|
428
|
+
*
|
|
429
|
+
* @see {@link Link}
|
|
430
|
+
* @see {@link toEncoded}
|
|
431
|
+
* @category models
|
|
432
|
+
* @since 4.0.0
|
|
433
|
+
*/
|
|
434
|
+
export type Encoding = readonly [Link, ...Array<Link>]
|
|
435
|
+
|
|
436
|
+
/**
|
|
437
|
+
* Options that control schema parsing, validation, transformation, and output behavior.
|
|
438
|
+
*
|
|
439
|
+
* **Details**
|
|
440
|
+
*
|
|
441
|
+
* Pass to `Schema.decodeUnknown`, `Schema.encode`, and related APIs to customize
|
|
442
|
+
* error reporting, excess property handling, output key ordering, check
|
|
443
|
+
* execution, and asynchronous parser concurrency.
|
|
444
|
+
*
|
|
445
|
+
* - `errors` — `"first"` (default) stops at the first error; `"all"` collects
|
|
446
|
+
* every error.
|
|
447
|
+
* - `onExcessProperty` — `"ignore"` (default) strips unknown object keys;
|
|
448
|
+
* `"error"` fails; `"preserve"` keeps them.
|
|
449
|
+
* - `propertyOrder` — `"none"` (default) lets the system choose key order;
|
|
450
|
+
* `"original"` preserves input key order.
|
|
451
|
+
* - `disableChecks` — skips validation checks while still applying defaults and
|
|
452
|
+
* transformations.
|
|
453
|
+
* - `concurrency` — maximum number of async parse effects to run concurrently;
|
|
454
|
+
* defaults to `1`, or use `"unbounded"`.
|
|
455
|
+
*
|
|
456
|
+
* @category options
|
|
457
|
+
* @since 3.10.0
|
|
458
|
+
*/
|
|
459
|
+
export interface ParseOptions {
|
|
460
|
+
/**
|
|
461
|
+
* Controls how many parsing errors are reported.
|
|
462
|
+
*
|
|
463
|
+
* **Details**
|
|
464
|
+
*
|
|
465
|
+
* The default, `"first"`, stops at the first error. Set the option to `"all"`
|
|
466
|
+
* to collect every parsing error, which can help with debugging or with
|
|
467
|
+
* presenting more complete error messages to a user.
|
|
468
|
+
*
|
|
469
|
+
* @default "first"
|
|
470
|
+
*/
|
|
471
|
+
readonly errors?: "first" | "all" | undefined
|
|
472
|
+
|
|
473
|
+
/**
|
|
474
|
+
* Controls how object parsing handles keys that are not declared by the schema.
|
|
475
|
+
*
|
|
476
|
+
* **Details**
|
|
477
|
+
*
|
|
478
|
+
* The default, `"ignore"`, strips unspecified properties from the output. Use
|
|
479
|
+
* `"error"` to fail when an excess property is present, or `"preserve"` to
|
|
480
|
+
* keep excess properties in the output.
|
|
481
|
+
*
|
|
482
|
+
* @default "ignore"
|
|
483
|
+
*/
|
|
484
|
+
readonly onExcessProperty?: "ignore" | "error" | "preserve" | undefined
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* The `propertyOrder` option provides control over the order of object fields
|
|
488
|
+
* in the output. This feature is useful when the sequence of keys is
|
|
489
|
+
* important for the consuming processes or when maintaining the input order
|
|
490
|
+
* enhances readability and usability.
|
|
491
|
+
*
|
|
492
|
+
* **Details**
|
|
493
|
+
*
|
|
494
|
+
* By default, the `propertyOrder` option is set to `"none"`. This means that
|
|
495
|
+
* the internal system decides the order of keys to optimize parsing speed.
|
|
496
|
+
*
|
|
497
|
+
* Setting `propertyOrder` to `"original"` ensures that the keys are ordered
|
|
498
|
+
* as they appear in the input during the decoding/encoding process.
|
|
499
|
+
*
|
|
500
|
+
* **Gotchas**
|
|
501
|
+
*
|
|
502
|
+
* The key order for `"none"` should not be considered stable and may change
|
|
503
|
+
* in future updates without notice.
|
|
504
|
+
*
|
|
505
|
+
* @default "none"
|
|
506
|
+
*/
|
|
507
|
+
readonly propertyOrder?: "none" | "original" | undefined
|
|
508
|
+
|
|
509
|
+
/**
|
|
510
|
+
* Whether to disable checks while still applying defaults and
|
|
511
|
+
* transformations.
|
|
512
|
+
*/
|
|
513
|
+
readonly disableChecks?: boolean | undefined
|
|
514
|
+
|
|
515
|
+
/**
|
|
516
|
+
* The maximum number of async effects to run concurrently.
|
|
517
|
+
*
|
|
518
|
+
* @default 1
|
|
519
|
+
*/
|
|
520
|
+
readonly concurrency?: number | "unbounded" | undefined
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
/** @internal */
|
|
524
|
+
export const defaultParseOptions: ParseOptions = {}
|
|
525
|
+
|
|
526
|
+
/**
|
|
527
|
+
* Represents per-property metadata attached to AST nodes via {@link Base.context}.
|
|
528
|
+
*
|
|
529
|
+
* **Details**
|
|
530
|
+
*
|
|
531
|
+
* Tracks whether a property key is optional, mutable, has a constructor
|
|
532
|
+
* default, or carries key-level annotations. Typically set by helpers like
|
|
533
|
+
* {@link optionalKey} and `Schema.mutableKey`.
|
|
534
|
+
*
|
|
535
|
+
* - `isOptional` — the property key may be absent from the input.
|
|
536
|
+
* - `isMutable` — the property is `readonly` when `false`.
|
|
537
|
+
* - `defaultValue` — an {@link Encoding} applied during construction to
|
|
538
|
+
* supply missing values.
|
|
539
|
+
* - `annotations` — key-level annotations (e.g. description of the key
|
|
540
|
+
* itself).
|
|
541
|
+
*
|
|
542
|
+
* @see {@link optionalKey}
|
|
543
|
+
* @see {@link isOptional}
|
|
544
|
+
* @category models
|
|
545
|
+
* @since 4.0.0
|
|
546
|
+
*/
|
|
547
|
+
export class Context {
|
|
548
|
+
readonly isOptional: boolean
|
|
549
|
+
readonly isMutable: boolean
|
|
550
|
+
/** Used for constructor default values (e.g. `withConstructorDefault` API) */
|
|
551
|
+
readonly defaultValue: Encoding | undefined
|
|
552
|
+
readonly annotations: Schema.Annotations.Key<unknown> | undefined
|
|
553
|
+
|
|
554
|
+
constructor(
|
|
555
|
+
isOptional: boolean,
|
|
556
|
+
isMutable: boolean,
|
|
557
|
+
/** Used for constructor default values (e.g. `withConstructorDefault` API) */
|
|
558
|
+
defaultValue: Encoding | undefined = undefined,
|
|
559
|
+
annotations: Schema.Annotations.Key<unknown> | undefined = undefined
|
|
560
|
+
) {
|
|
561
|
+
this.isOptional = isOptional
|
|
562
|
+
this.isMutable = isMutable
|
|
563
|
+
this.defaultValue = defaultValue
|
|
564
|
+
this.annotations = annotations
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
/**
|
|
569
|
+
* Non-empty array of validation {@link Check} values attached to an AST node
|
|
570
|
+
* via {@link Base.checks}.
|
|
571
|
+
*
|
|
572
|
+
* **Details**
|
|
573
|
+
*
|
|
574
|
+
* Checks are run after basic type matching succeeds. They represent
|
|
575
|
+
* refinements like `minLength`, `pattern`, `int`, etc.
|
|
576
|
+
*
|
|
577
|
+
* @see {@link Check}
|
|
578
|
+
* @see {@link Filter}
|
|
579
|
+
* @see {@link FilterGroup}
|
|
580
|
+
* @category models
|
|
581
|
+
* @since 4.0.0
|
|
582
|
+
*/
|
|
583
|
+
export type Checks = readonly [Check<any>, ...Array<Check<any>>]
|
|
584
|
+
|
|
585
|
+
const TypeId = "~effect/Schema"
|
|
586
|
+
|
|
587
|
+
/**
|
|
588
|
+
* Represents the abstract base class for all {@link AST} node variants.
|
|
589
|
+
*
|
|
590
|
+
* **Details**
|
|
591
|
+
*
|
|
592
|
+
* Every AST node extends `Base` and inherits these fields:
|
|
593
|
+
*
|
|
594
|
+
* - `annotations` — user-supplied metadata (identifier, title, description,
|
|
595
|
+
* arbitrary keys).
|
|
596
|
+
* - `checks` — optional {@link Checks} for post-type-match validation.
|
|
597
|
+
* - `encoding` — optional {@link Encoding} chain for type ↔ wire
|
|
598
|
+
* transformations.
|
|
599
|
+
* - `context` — optional {@link Context} for per-property metadata.
|
|
600
|
+
*
|
|
601
|
+
* Subclasses add a `_tag` discriminant and variant-specific data.
|
|
602
|
+
*
|
|
603
|
+
* @see {@link AST}
|
|
604
|
+
* @category models
|
|
605
|
+
* @since 4.0.0
|
|
606
|
+
*/
|
|
607
|
+
export abstract class Base {
|
|
608
|
+
readonly [TypeId] = TypeId
|
|
609
|
+
abstract readonly _tag: string
|
|
610
|
+
readonly annotations: Schema.Annotations.Annotations | undefined
|
|
611
|
+
readonly checks: Checks | undefined
|
|
612
|
+
readonly encoding: Encoding | undefined
|
|
613
|
+
readonly context: Context | undefined
|
|
614
|
+
|
|
615
|
+
constructor(
|
|
616
|
+
annotations: Schema.Annotations.Annotations | undefined = undefined,
|
|
617
|
+
checks: Checks | undefined = undefined,
|
|
618
|
+
encoding: Encoding | undefined = undefined,
|
|
619
|
+
context: Context | undefined = undefined
|
|
620
|
+
) {
|
|
621
|
+
this.annotations = annotations
|
|
622
|
+
this.checks = checks
|
|
623
|
+
this.encoding = encoding
|
|
624
|
+
this.context = context
|
|
625
|
+
}
|
|
626
|
+
toString() {
|
|
627
|
+
return `<${this._tag}>`
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
/**
|
|
632
|
+
* AST node for user-defined opaque types with custom parsing logic.
|
|
633
|
+
*
|
|
634
|
+
* **When to use**
|
|
635
|
+
*
|
|
636
|
+
* Use when you need a custom schema AST node because none of the built-in
|
|
637
|
+
* nodes fit.
|
|
638
|
+
*
|
|
639
|
+
* **Details**
|
|
640
|
+
*
|
|
641
|
+
* - `typeParameters` — inner schemas this declaration is parameterized over
|
|
642
|
+
* (e.g. the element type for a custom collection).
|
|
643
|
+
* - `run` — factory that receives `typeParameters` and returns a parser that
|
|
644
|
+
* validates or transforms raw input.
|
|
645
|
+
*
|
|
646
|
+
* @see {@link isDeclaration}
|
|
647
|
+
* @category models
|
|
648
|
+
* @since 3.10.0
|
|
649
|
+
*/
|
|
650
|
+
export class Declaration extends Base {
|
|
651
|
+
readonly _tag = "Declaration"
|
|
652
|
+
readonly typeParameters: ReadonlyArray<AST>
|
|
653
|
+
readonly run: (
|
|
654
|
+
typeParameters: ReadonlyArray<AST>
|
|
655
|
+
) => (input: unknown, self: Declaration, options: ParseOptions) => Effect.Effect<any, SchemaIssue.Issue, any>
|
|
656
|
+
readonly encodingChecks: Checks | undefined
|
|
657
|
+
|
|
658
|
+
constructor(
|
|
659
|
+
typeParameters: ReadonlyArray<AST>,
|
|
660
|
+
run: (
|
|
661
|
+
typeParameters: ReadonlyArray<AST>
|
|
662
|
+
) => (input: unknown, self: Declaration, options: ParseOptions) => Effect.Effect<any, SchemaIssue.Issue, any>,
|
|
663
|
+
annotations?: Schema.Annotations.Annotations,
|
|
664
|
+
checks?: Checks,
|
|
665
|
+
encoding?: Encoding,
|
|
666
|
+
context?: Context,
|
|
667
|
+
encodingChecks?: Checks
|
|
668
|
+
) {
|
|
669
|
+
super(annotations, checks, encoding, context)
|
|
670
|
+
this.typeParameters = typeParameters
|
|
671
|
+
this.run = run
|
|
672
|
+
this.encodingChecks = encodingChecks
|
|
673
|
+
}
|
|
674
|
+
/** @internal */
|
|
675
|
+
getParser(): SchemaParser.Parser {
|
|
676
|
+
const run = this.run(this.typeParameters)
|
|
677
|
+
return (oinput, options) => {
|
|
678
|
+
if (Option.isNone(oinput)) return Effect.succeedNone
|
|
679
|
+
return Effect.mapEager(run(oinput.value, this, options), Option.some)
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
private rebuild(recur: (ast: AST) => AST, checks: Checks | undefined, encodingChecks: Checks | undefined) {
|
|
683
|
+
const tps = mapOrSame(this.typeParameters, recur)
|
|
684
|
+
return tps === this.typeParameters ?
|
|
685
|
+
this :
|
|
686
|
+
new Declaration(tps, this.run, this.annotations, checks, undefined, this.context, encodingChecks)
|
|
687
|
+
}
|
|
688
|
+
/** @internal */
|
|
689
|
+
recur(recur: (ast: AST) => AST) {
|
|
690
|
+
return this.rebuild(recur, this.checks, this.encodingChecks)
|
|
691
|
+
}
|
|
692
|
+
/** @internal */
|
|
693
|
+
flip(recur: (ast: AST) => AST) {
|
|
694
|
+
return this.rebuild(recur, this.encodingChecks, this.checks)
|
|
695
|
+
}
|
|
696
|
+
/** @internal */
|
|
697
|
+
getExpected(): string {
|
|
698
|
+
const expected = this.annotations?.expected
|
|
699
|
+
if (typeof expected === "string") return expected
|
|
700
|
+
return "<Declaration>"
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
/**
|
|
705
|
+
* AST node matching the `null` literal value.
|
|
706
|
+
*
|
|
707
|
+
* **Details**
|
|
708
|
+
*
|
|
709
|
+
* Parsing succeeds only when the input is exactly `null`.
|
|
710
|
+
*
|
|
711
|
+
* @see {@link null_ null}
|
|
712
|
+
* @see {@link isNull}
|
|
713
|
+
* @category models
|
|
714
|
+
* @since 4.0.0
|
|
715
|
+
*/
|
|
716
|
+
export class Null extends Base {
|
|
717
|
+
readonly _tag = "Null"
|
|
718
|
+
/** @internal */
|
|
719
|
+
getParser() {
|
|
720
|
+
return fromConst(this, null)
|
|
721
|
+
}
|
|
722
|
+
/** @internal */
|
|
723
|
+
getExpected(): string {
|
|
724
|
+
return "null"
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
const null_ = new Null()
|
|
729
|
+
export {
|
|
730
|
+
/**
|
|
731
|
+
* Provides the singleton {@link Null} AST instance.
|
|
732
|
+
*
|
|
733
|
+
* **When to use**
|
|
734
|
+
*
|
|
735
|
+
* Use when you need the shared AST node for exact null values while inspecting
|
|
736
|
+
* or constructing schema ASTs.
|
|
737
|
+
*
|
|
738
|
+
* @category constants
|
|
739
|
+
* @since 4.0.0
|
|
740
|
+
*/
|
|
741
|
+
null_ as null
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
/**
|
|
745
|
+
* AST node matching the `undefined` value.
|
|
746
|
+
*
|
|
747
|
+
* **Details**
|
|
748
|
+
*
|
|
749
|
+
* Parsing succeeds only when the input is exactly `undefined`.
|
|
750
|
+
*
|
|
751
|
+
* @see {@link undefined}
|
|
752
|
+
* @see {@link isUndefined}
|
|
753
|
+
* @category models
|
|
754
|
+
* @since 4.0.0
|
|
755
|
+
*/
|
|
756
|
+
export class Undefined extends Base {
|
|
757
|
+
readonly _tag = "Undefined"
|
|
758
|
+
/** @internal */
|
|
759
|
+
getParser() {
|
|
760
|
+
return fromConst(this, undefined)
|
|
761
|
+
}
|
|
762
|
+
/** @internal */
|
|
763
|
+
toCodecJson(): AST {
|
|
764
|
+
return replaceEncoding(this, [undefinedToNull])
|
|
765
|
+
}
|
|
766
|
+
/** @internal */
|
|
767
|
+
getExpected(): string {
|
|
768
|
+
return "undefined"
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
const undefinedToNull = new Link(
|
|
773
|
+
null_,
|
|
774
|
+
new SchemaTransformation.Transformation(
|
|
775
|
+
SchemaGetter.transform(() => undefined),
|
|
776
|
+
SchemaGetter.transform(() => null)
|
|
777
|
+
)
|
|
778
|
+
)
|
|
779
|
+
|
|
780
|
+
const undefined_ = new Undefined()
|
|
781
|
+
export {
|
|
782
|
+
/**
|
|
783
|
+
* Provides the singleton {@link Undefined} AST instance.
|
|
784
|
+
*
|
|
785
|
+
* **When to use**
|
|
786
|
+
*
|
|
787
|
+
* Use when you need the shared AST node for exact undefined values while
|
|
788
|
+
* inspecting or constructing schema ASTs.
|
|
789
|
+
*
|
|
790
|
+
* @category constants
|
|
791
|
+
* @since 4.0.0
|
|
792
|
+
*/
|
|
793
|
+
undefined_ as undefined
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
/**
|
|
797
|
+
* AST node matching the `void` type (accepts `undefined` at runtime).
|
|
798
|
+
*
|
|
799
|
+
* **Details**
|
|
800
|
+
*
|
|
801
|
+
* Behaves like {@link Undefined} for parsing but represents the TypeScript
|
|
802
|
+
* `void` type semantically.
|
|
803
|
+
*
|
|
804
|
+
* @see {@link void_ void}
|
|
805
|
+
* @see {@link isVoid}
|
|
806
|
+
* @category models
|
|
807
|
+
* @since 4.0.0
|
|
808
|
+
*/
|
|
809
|
+
export class Void extends Base {
|
|
810
|
+
readonly _tag = "Void"
|
|
811
|
+
/** @internal */
|
|
812
|
+
getParser() {
|
|
813
|
+
return fromConst(this, undefined)
|
|
814
|
+
}
|
|
815
|
+
/** @internal */
|
|
816
|
+
toCodecJson(): AST {
|
|
817
|
+
return replaceEncoding(this, [undefinedToNull])
|
|
818
|
+
}
|
|
819
|
+
/** @internal */
|
|
820
|
+
getExpected(): string {
|
|
821
|
+
return "void"
|
|
822
|
+
}
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
const void_ = new Void()
|
|
826
|
+
export {
|
|
827
|
+
/**
|
|
828
|
+
* Provides the singleton {@link Void} AST instance.
|
|
829
|
+
*
|
|
830
|
+
* **When to use**
|
|
831
|
+
*
|
|
832
|
+
* Use when constructing or comparing AST nodes that represent the TypeScript
|
|
833
|
+
* `void` type and accept `undefined` at runtime.
|
|
834
|
+
*
|
|
835
|
+
* @see {@link Void} for the AST node class
|
|
836
|
+
* @see {@link undefined} for the sibling AST singleton that matches exactly `undefined`
|
|
837
|
+
* @see {@link isVoid} for narrowing an AST to a `Void` node
|
|
838
|
+
*
|
|
839
|
+
* @category constructors
|
|
840
|
+
* @since 4.0.0
|
|
841
|
+
*/
|
|
842
|
+
void_ as void
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
/**
|
|
846
|
+
* AST node representing the `never` type — no value matches.
|
|
847
|
+
*
|
|
848
|
+
* **Details**
|
|
849
|
+
*
|
|
850
|
+
* Parsing always fails. Useful as a placeholder in unions or as the result
|
|
851
|
+
* of narrowing that eliminates all options.
|
|
852
|
+
*
|
|
853
|
+
* @see {@link never}
|
|
854
|
+
* @see {@link isNever}
|
|
855
|
+
* @category models
|
|
856
|
+
* @since 4.0.0
|
|
857
|
+
*/
|
|
858
|
+
export class Never extends Base {
|
|
859
|
+
readonly _tag = "Never"
|
|
860
|
+
/** @internal */
|
|
861
|
+
getParser() {
|
|
862
|
+
return fromRefinement(this, Predicate.isNever)
|
|
863
|
+
}
|
|
864
|
+
/** @internal */
|
|
865
|
+
getExpected(): string {
|
|
866
|
+
return "never"
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
|
|
870
|
+
/**
|
|
871
|
+
* Provides the singleton {@link Never} AST instance.
|
|
872
|
+
*
|
|
873
|
+
* **When to use**
|
|
874
|
+
*
|
|
875
|
+
* Use to reuse the canonical bottom-type AST node when constructing,
|
|
876
|
+
* comparing, or returning ASTs.
|
|
877
|
+
*
|
|
878
|
+
* @see {@link Never} for the AST node class
|
|
879
|
+
* @see {@link isNever} for narrowing an AST to a `Never` node
|
|
880
|
+
*
|
|
881
|
+
* @category constructors
|
|
882
|
+
* @since 4.0.0
|
|
883
|
+
*/
|
|
884
|
+
export const never = new Never()
|
|
885
|
+
|
|
886
|
+
/**
|
|
887
|
+
* AST node representing the `any` type — every value matches.
|
|
888
|
+
*
|
|
889
|
+
* @see {@link any}
|
|
890
|
+
* @see {@link isAny}
|
|
891
|
+
*
|
|
892
|
+
* @category models
|
|
893
|
+
* @since 4.0.0
|
|
894
|
+
*/
|
|
895
|
+
export class Any extends Base {
|
|
896
|
+
readonly _tag = "Any"
|
|
897
|
+
/** @internal */
|
|
898
|
+
getParser() {
|
|
899
|
+
return fromRefinement(this, Predicate.isUnknown)
|
|
900
|
+
}
|
|
901
|
+
/** @internal */
|
|
902
|
+
getExpected(): string {
|
|
903
|
+
return "any"
|
|
904
|
+
}
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
/**
|
|
908
|
+
* Provides the singleton {@link Any} AST instance.
|
|
909
|
+
*
|
|
910
|
+
* **When to use**
|
|
911
|
+
*
|
|
912
|
+
* Use when you need the singleton AST node for the TypeScript `any` type and
|
|
913
|
+
* intentionally want parsing to accept every input value.
|
|
914
|
+
*
|
|
915
|
+
* @see {@link unknown} for the sibling AST singleton that also accepts every value while preserving the safer `unknown` type
|
|
916
|
+
*
|
|
917
|
+
* @category constructors
|
|
918
|
+
* @since 4.0.0
|
|
919
|
+
*/
|
|
920
|
+
export const any = new Any()
|
|
921
|
+
|
|
922
|
+
/**
|
|
923
|
+
* AST node representing the `unknown` type — every value matches.
|
|
924
|
+
*
|
|
925
|
+
* **Details**
|
|
926
|
+
*
|
|
927
|
+
* Unlike {@link Any}, this is type-safe: the parsed result is typed as
|
|
928
|
+
* `unknown` rather than `any`.
|
|
929
|
+
*
|
|
930
|
+
* @see {@link unknown}
|
|
931
|
+
* @see {@link isUnknown}
|
|
932
|
+
* @category models
|
|
933
|
+
* @since 4.0.0
|
|
934
|
+
*/
|
|
935
|
+
export class Unknown extends Base {
|
|
936
|
+
readonly _tag = "Unknown"
|
|
937
|
+
/** @internal */
|
|
938
|
+
getParser() {
|
|
939
|
+
return fromRefinement(this, Predicate.isUnknown)
|
|
940
|
+
}
|
|
941
|
+
/** @internal */
|
|
942
|
+
getExpected(): string {
|
|
943
|
+
return "unknown"
|
|
944
|
+
}
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
/**
|
|
948
|
+
* Provides the singleton {@link Unknown} AST instance.
|
|
949
|
+
*
|
|
950
|
+
* **When to use**
|
|
951
|
+
*
|
|
952
|
+
* Use when you need the reusable AST singleton for a schema node that accepts
|
|
953
|
+
* every value while keeping parsed values opaque.
|
|
954
|
+
*
|
|
955
|
+
* @see {@link any} for the singleton that accepts every value as `any`
|
|
956
|
+
*
|
|
957
|
+
* @category constructors
|
|
958
|
+
* @since 4.0.0
|
|
959
|
+
*/
|
|
960
|
+
export const unknown = new Unknown()
|
|
961
|
+
|
|
962
|
+
/**
|
|
963
|
+
* AST node matching the TypeScript `object` type — accepts objects, arrays,
|
|
964
|
+
* and functions (anything non-primitive and non-null).
|
|
965
|
+
*
|
|
966
|
+
* @see {@link objectKeyword}
|
|
967
|
+
* @see {@link isObjectKeyword}
|
|
968
|
+
*
|
|
969
|
+
* @category models
|
|
970
|
+
* @since 3.10.0
|
|
971
|
+
*/
|
|
972
|
+
export class ObjectKeyword extends Base {
|
|
973
|
+
readonly _tag = "ObjectKeyword"
|
|
974
|
+
/** @internal */
|
|
975
|
+
getParser() {
|
|
976
|
+
return fromRefinement(this, Predicate.isObjectKeyword)
|
|
977
|
+
}
|
|
978
|
+
/** @internal */
|
|
979
|
+
getExpected(): string {
|
|
980
|
+
return "object | array | function"
|
|
981
|
+
}
|
|
982
|
+
}
|
|
983
|
+
|
|
984
|
+
/**
|
|
985
|
+
* Provides the singleton {@link ObjectKeyword} AST instance.
|
|
986
|
+
*
|
|
987
|
+
* **When to use**
|
|
988
|
+
*
|
|
989
|
+
* Use to reuse the canonical AST node for the TypeScript `object` keyword when
|
|
990
|
+
* building or comparing `SchemaAST` values directly.
|
|
991
|
+
*
|
|
992
|
+
* @see {@link ObjectKeyword} for the AST node class
|
|
993
|
+
* @see {@link isObjectKeyword} for narrowing an AST to an `ObjectKeyword` node
|
|
994
|
+
*
|
|
995
|
+
* @category constructors
|
|
996
|
+
* @since 3.10.0
|
|
997
|
+
*/
|
|
998
|
+
export const objectKeyword = new ObjectKeyword()
|
|
999
|
+
|
|
1000
|
+
/**
|
|
1001
|
+
* AST node representing a TypeScript `enum`.
|
|
1002
|
+
*
|
|
1003
|
+
* **Details**
|
|
1004
|
+
*
|
|
1005
|
+
* Holds `enums` as an array of `[name, value]` pairs where values are
|
|
1006
|
+
* `string | number`. Parsing succeeds when the input matches any enum value.
|
|
1007
|
+
*
|
|
1008
|
+
* @see {@link isEnum}
|
|
1009
|
+
* @category models
|
|
1010
|
+
* @since 4.0.0
|
|
1011
|
+
*/
|
|
1012
|
+
export class Enum extends Base {
|
|
1013
|
+
readonly _tag = "Enum"
|
|
1014
|
+
readonly enums: ReadonlyArray<readonly [string, string | number]>
|
|
1015
|
+
|
|
1016
|
+
constructor(
|
|
1017
|
+
enums: ReadonlyArray<readonly [string, string | number]>,
|
|
1018
|
+
annotations?: Schema.Annotations.Annotations,
|
|
1019
|
+
checks?: Checks,
|
|
1020
|
+
encoding?: Encoding,
|
|
1021
|
+
context?: Context
|
|
1022
|
+
) {
|
|
1023
|
+
super(annotations, checks, encoding, context)
|
|
1024
|
+
this.enums = enums
|
|
1025
|
+
}
|
|
1026
|
+
/** @internal */
|
|
1027
|
+
getParser() {
|
|
1028
|
+
const values = new Set<unknown>(this.enums.map(([, v]) => v))
|
|
1029
|
+
return fromRefinement(
|
|
1030
|
+
this,
|
|
1031
|
+
(input): input is typeof this.enums[number][1] => values.has(input)
|
|
1032
|
+
)
|
|
1033
|
+
}
|
|
1034
|
+
/** @internal */
|
|
1035
|
+
toCodecStringTree(): AST {
|
|
1036
|
+
if (this.enums.some(([_, v]) => typeof v === "number")) {
|
|
1037
|
+
const coercions = Object.fromEntries(this.enums.map(([_, v]) => [globalThis.String(v), v]))
|
|
1038
|
+
return replaceEncoding(this, [
|
|
1039
|
+
new Link(
|
|
1040
|
+
new Union(Object.keys(coercions).map((k) => new Literal(k)), "anyOf"),
|
|
1041
|
+
new SchemaTransformation.Transformation(
|
|
1042
|
+
SchemaGetter.transform((s) => coercions[s]),
|
|
1043
|
+
SchemaGetter.String()
|
|
1044
|
+
)
|
|
1045
|
+
)
|
|
1046
|
+
])
|
|
1047
|
+
}
|
|
1048
|
+
return this
|
|
1049
|
+
}
|
|
1050
|
+
/** @internal */
|
|
1051
|
+
getExpected(): string {
|
|
1052
|
+
return this.enums.map(([_, value]) => JSON.stringify(value)).join(" | ")
|
|
1053
|
+
}
|
|
1054
|
+
}
|
|
1055
|
+
|
|
1056
|
+
type TemplateLiteralPart =
|
|
1057
|
+
| String
|
|
1058
|
+
| Number
|
|
1059
|
+
| BigInt
|
|
1060
|
+
| Literal
|
|
1061
|
+
| TemplateLiteral
|
|
1062
|
+
| Union<TemplateLiteralPart>
|
|
1063
|
+
|
|
1064
|
+
function isTemplateLiteralPart(ast: AST): ast is TemplateLiteralPart {
|
|
1065
|
+
switch (ast._tag) {
|
|
1066
|
+
case "String":
|
|
1067
|
+
case "Number":
|
|
1068
|
+
case "BigInt":
|
|
1069
|
+
case "Literal":
|
|
1070
|
+
case "TemplateLiteral":
|
|
1071
|
+
return true
|
|
1072
|
+
case "Union":
|
|
1073
|
+
return ast.types.every(isTemplateLiteralPart)
|
|
1074
|
+
default:
|
|
1075
|
+
return false
|
|
1076
|
+
}
|
|
1077
|
+
}
|
|
1078
|
+
|
|
1079
|
+
/**
|
|
1080
|
+
* AST node representing a TypeScript template literal type
|
|
1081
|
+
* (e.g. `` `user_${string}` ``).
|
|
1082
|
+
*
|
|
1083
|
+
* **Details**
|
|
1084
|
+
*
|
|
1085
|
+
* `parts` is an array of AST nodes; each part contributes to the
|
|
1086
|
+
* template literal pattern. A regex is derived from the parts to validate
|
|
1087
|
+
* strings at runtime.
|
|
1088
|
+
*
|
|
1089
|
+
* @see {@link isTemplateLiteral}
|
|
1090
|
+
* @category models
|
|
1091
|
+
* @since 3.10.0
|
|
1092
|
+
*/
|
|
1093
|
+
export class TemplateLiteral extends Base {
|
|
1094
|
+
readonly _tag = "TemplateLiteral"
|
|
1095
|
+
readonly parts: ReadonlyArray<AST>
|
|
1096
|
+
/** @internal */
|
|
1097
|
+
readonly encodedParts: ReadonlyArray<TemplateLiteralPart>
|
|
1098
|
+
|
|
1099
|
+
constructor(
|
|
1100
|
+
parts: ReadonlyArray<AST>,
|
|
1101
|
+
annotations?: Schema.Annotations.Annotations,
|
|
1102
|
+
checks?: Checks,
|
|
1103
|
+
encoding?: Encoding,
|
|
1104
|
+
context?: Context
|
|
1105
|
+
) {
|
|
1106
|
+
super(annotations, checks, encoding, context)
|
|
1107
|
+
const encodedParts: Array<TemplateLiteralPart> = []
|
|
1108
|
+
for (const part of parts) {
|
|
1109
|
+
const encoded = toEncoded(part)
|
|
1110
|
+
if (isTemplateLiteralPart(encoded)) {
|
|
1111
|
+
encodedParts.push(encoded)
|
|
1112
|
+
} else {
|
|
1113
|
+
throw new Error(`Invalid TemplateLiteral part ${encoded._tag}`)
|
|
1114
|
+
}
|
|
1115
|
+
}
|
|
1116
|
+
this.parts = parts
|
|
1117
|
+
this.encodedParts = encodedParts
|
|
1118
|
+
}
|
|
1119
|
+
/** @internal */
|
|
1120
|
+
getParser(recur: (ast: AST) => SchemaParser.Parser): SchemaParser.Parser {
|
|
1121
|
+
const parser = recur(this.asTemplateLiteralParser())
|
|
1122
|
+
return (oinput: Option.Option<unknown>, options: ParseOptions) =>
|
|
1123
|
+
Effect.mapBothEager(parser(oinput, options), {
|
|
1124
|
+
onSuccess: () => oinput,
|
|
1125
|
+
onFailure: (issue) => new SchemaIssue.Composite(this, oinput, [issue])
|
|
1126
|
+
})
|
|
1127
|
+
}
|
|
1128
|
+
/** @internal */
|
|
1129
|
+
getExpected(): string {
|
|
1130
|
+
return "string"
|
|
1131
|
+
}
|
|
1132
|
+
/** @internal */
|
|
1133
|
+
asTemplateLiteralParser(): Arrays {
|
|
1134
|
+
const tuple = new Arrays(false, this.parts.map(templateLiteralPartFromString), [])
|
|
1135
|
+
const regExp = getTemplateLiteralRegExp(this)
|
|
1136
|
+
return decodeTo(
|
|
1137
|
+
string,
|
|
1138
|
+
tuple,
|
|
1139
|
+
new SchemaTransformation.Transformation(
|
|
1140
|
+
SchemaGetter.transformOrFail((s: string) => {
|
|
1141
|
+
const match = regExp.exec(s)
|
|
1142
|
+
if (match) return Effect.succeed(match.slice(1, this.parts.length + 1))
|
|
1143
|
+
return Effect.fail(
|
|
1144
|
+
new SchemaIssue.InvalidValue(Option.some(s), {
|
|
1145
|
+
message: `Expected a value matching ${regExp.source}, got ${format(s)}`
|
|
1146
|
+
})
|
|
1147
|
+
)
|
|
1148
|
+
}),
|
|
1149
|
+
SchemaGetter.transform((parts) => parts.join(""))
|
|
1150
|
+
)
|
|
1151
|
+
)
|
|
1152
|
+
}
|
|
1153
|
+
}
|
|
1154
|
+
|
|
1155
|
+
/**
|
|
1156
|
+
* AST node matching a specific `unique symbol` value.
|
|
1157
|
+
*
|
|
1158
|
+
* **Details**
|
|
1159
|
+
*
|
|
1160
|
+
* Parsing succeeds only when the input is reference-equal to the stored
|
|
1161
|
+
* `symbol`.
|
|
1162
|
+
*
|
|
1163
|
+
* @see {@link isUniqueSymbol}
|
|
1164
|
+
* @category models
|
|
1165
|
+
* @since 3.10.0
|
|
1166
|
+
*/
|
|
1167
|
+
export class UniqueSymbol extends Base {
|
|
1168
|
+
readonly _tag = "UniqueSymbol"
|
|
1169
|
+
readonly symbol: symbol
|
|
1170
|
+
|
|
1171
|
+
constructor(
|
|
1172
|
+
symbol: symbol,
|
|
1173
|
+
annotations?: Schema.Annotations.Annotations,
|
|
1174
|
+
checks?: Checks,
|
|
1175
|
+
encoding?: Encoding,
|
|
1176
|
+
context?: Context
|
|
1177
|
+
) {
|
|
1178
|
+
super(annotations, checks, encoding, context)
|
|
1179
|
+
this.symbol = symbol
|
|
1180
|
+
}
|
|
1181
|
+
/** @internal */
|
|
1182
|
+
getParser() {
|
|
1183
|
+
return fromConst(this, this.symbol)
|
|
1184
|
+
}
|
|
1185
|
+
/** @internal */
|
|
1186
|
+
toCodecStringTree(): AST {
|
|
1187
|
+
return replaceEncoding(this, [symbolToString])
|
|
1188
|
+
}
|
|
1189
|
+
/** @internal */
|
|
1190
|
+
getExpected(): string {
|
|
1191
|
+
return globalThis.String(this.symbol)
|
|
1192
|
+
}
|
|
1193
|
+
}
|
|
1194
|
+
|
|
1195
|
+
/**
|
|
1196
|
+
* The set of primitive types that can appear as a {@link Literal} value.
|
|
1197
|
+
*
|
|
1198
|
+
* @see {@link Literal}
|
|
1199
|
+
*
|
|
1200
|
+
* @category models
|
|
1201
|
+
* @since 3.10.0
|
|
1202
|
+
*/
|
|
1203
|
+
export type LiteralValue = string | number | boolean | bigint
|
|
1204
|
+
|
|
1205
|
+
/**
|
|
1206
|
+
* AST node matching an exact primitive value (string, number, boolean, or
|
|
1207
|
+
* bigint).
|
|
1208
|
+
*
|
|
1209
|
+
* **Details**
|
|
1210
|
+
*
|
|
1211
|
+
* Parsing succeeds only when the input is strictly equal (`===`) to the
|
|
1212
|
+
* stored `literal`. Numeric literals must be finite — `Infinity`, `-Infinity`,
|
|
1213
|
+
* and `NaN` are rejected at construction time.
|
|
1214
|
+
*
|
|
1215
|
+
* **Example** (Creating a literal AST)
|
|
1216
|
+
*
|
|
1217
|
+
* ```ts
|
|
1218
|
+
* import { SchemaAST } from "effect"
|
|
1219
|
+
*
|
|
1220
|
+
* const ast = new SchemaAST.Literal("active")
|
|
1221
|
+
* console.log(ast.literal) // "active"
|
|
1222
|
+
* ```
|
|
1223
|
+
*
|
|
1224
|
+
* @see {@link LiteralValue}
|
|
1225
|
+
* @see {@link isLiteral}
|
|
1226
|
+
* @category models
|
|
1227
|
+
* @since 3.10.0
|
|
1228
|
+
*/
|
|
1229
|
+
export class Literal extends Base {
|
|
1230
|
+
readonly _tag = "Literal"
|
|
1231
|
+
readonly literal: LiteralValue
|
|
1232
|
+
|
|
1233
|
+
constructor(
|
|
1234
|
+
literal: LiteralValue,
|
|
1235
|
+
annotations?: Schema.Annotations.Annotations,
|
|
1236
|
+
checks?: Checks,
|
|
1237
|
+
encoding?: Encoding,
|
|
1238
|
+
context?: Context
|
|
1239
|
+
) {
|
|
1240
|
+
super(annotations, checks, encoding, context)
|
|
1241
|
+
if (typeof literal === "number" && !globalThis.Number.isFinite(literal)) {
|
|
1242
|
+
throw new Error(`A numeric literal must be finite, got ${format(literal)}`)
|
|
1243
|
+
}
|
|
1244
|
+
this.literal = literal
|
|
1245
|
+
}
|
|
1246
|
+
/** @internal */
|
|
1247
|
+
getParser() {
|
|
1248
|
+
return fromConst(this, this.literal)
|
|
1249
|
+
}
|
|
1250
|
+
/** @internal */
|
|
1251
|
+
toCodecJson(): AST {
|
|
1252
|
+
return typeof this.literal === "bigint" ? literalToString(this) : this
|
|
1253
|
+
}
|
|
1254
|
+
/** @internal */
|
|
1255
|
+
toCodecStringTree(): AST {
|
|
1256
|
+
return typeof this.literal === "string" ? this : literalToString(this)
|
|
1257
|
+
}
|
|
1258
|
+
/** @internal */
|
|
1259
|
+
getExpected(): string {
|
|
1260
|
+
return typeof this.literal === "string" ? JSON.stringify(this.literal) : globalThis.String(this.literal)
|
|
1261
|
+
}
|
|
1262
|
+
}
|
|
1263
|
+
|
|
1264
|
+
function literalToString(ast: Literal): Literal {
|
|
1265
|
+
const literalAsString = globalThis.String(ast.literal)
|
|
1266
|
+
return replaceEncoding(ast, [
|
|
1267
|
+
new Link(
|
|
1268
|
+
new Literal(literalAsString),
|
|
1269
|
+
new SchemaTransformation.Transformation(
|
|
1270
|
+
SchemaGetter.transform(() => ast.literal),
|
|
1271
|
+
SchemaGetter.transform(() => literalAsString)
|
|
1272
|
+
)
|
|
1273
|
+
)
|
|
1274
|
+
])
|
|
1275
|
+
}
|
|
1276
|
+
|
|
1277
|
+
/**
|
|
1278
|
+
* AST node matching any `string` value.
|
|
1279
|
+
*
|
|
1280
|
+
* @see {@link string}
|
|
1281
|
+
* @see {@link isString}
|
|
1282
|
+
*
|
|
1283
|
+
* @category models
|
|
1284
|
+
* @since 4.0.0
|
|
1285
|
+
*/
|
|
1286
|
+
export class String extends Base {
|
|
1287
|
+
readonly _tag = "String"
|
|
1288
|
+
/** @internal */
|
|
1289
|
+
getParser() {
|
|
1290
|
+
return fromRefinement(this, Predicate.isString)
|
|
1291
|
+
}
|
|
1292
|
+
/** @internal */
|
|
1293
|
+
getExpected(): string {
|
|
1294
|
+
return "string"
|
|
1295
|
+
}
|
|
1296
|
+
}
|
|
1297
|
+
|
|
1298
|
+
/**
|
|
1299
|
+
* Provides the singleton {@link String} AST instance.
|
|
1300
|
+
*
|
|
1301
|
+
* **When to use**
|
|
1302
|
+
*
|
|
1303
|
+
* Use as the shared `SchemaAST` node for unconstrained JavaScript strings.
|
|
1304
|
+
*
|
|
1305
|
+
* @see {@link String} for the AST node class
|
|
1306
|
+
* @see {@link isString} for narrowing an AST to a string node
|
|
1307
|
+
*
|
|
1308
|
+
* @category constructors
|
|
1309
|
+
* @since 4.0.0
|
|
1310
|
+
*/
|
|
1311
|
+
export const string = new String()
|
|
1312
|
+
|
|
1313
|
+
/**
|
|
1314
|
+
* AST node matching any `number` value (including `NaN`, `Infinity`,
|
|
1315
|
+
* `-Infinity`).
|
|
1316
|
+
*
|
|
1317
|
+
* **Details**
|
|
1318
|
+
*
|
|
1319
|
+
* Default JSON serialization:
|
|
1320
|
+
*
|
|
1321
|
+
* - Finite numbers are serialized as JSON numbers.
|
|
1322
|
+
* - `Infinity`, `-Infinity`, and `NaN` are serialized as JSON strings.
|
|
1323
|
+
*
|
|
1324
|
+
* If the node has an `isFinite` or `isInt` check, the string fallback is
|
|
1325
|
+
* skipped since non-finite values cannot occur.
|
|
1326
|
+
*
|
|
1327
|
+
* @see {@link number}
|
|
1328
|
+
* @see {@link isNumber}
|
|
1329
|
+
* @category models
|
|
1330
|
+
* @since 4.0.0
|
|
1331
|
+
*/
|
|
1332
|
+
export class Number extends Base {
|
|
1333
|
+
readonly _tag = "Number"
|
|
1334
|
+
/** @internal */
|
|
1335
|
+
getParser() {
|
|
1336
|
+
return fromRefinement(this, Predicate.isNumber)
|
|
1337
|
+
}
|
|
1338
|
+
/** @internal */
|
|
1339
|
+
toCodecJson(): AST {
|
|
1340
|
+
if (this.checks && (hasCheck(this.checks, "isFinite") || hasCheck(this.checks, "isInt"))) {
|
|
1341
|
+
return this
|
|
1342
|
+
}
|
|
1343
|
+
return replaceEncoding(this, [numberToJson])
|
|
1344
|
+
}
|
|
1345
|
+
/** @internal */
|
|
1346
|
+
toCodecStringTree(): AST {
|
|
1347
|
+
if (this.checks && (hasCheck(this.checks, "isFinite") || hasCheck(this.checks, "isInt"))) {
|
|
1348
|
+
return replaceEncoding(this, [finiteToString])
|
|
1349
|
+
}
|
|
1350
|
+
return replaceEncoding(this, [numberToString])
|
|
1351
|
+
}
|
|
1352
|
+
/** @internal */
|
|
1353
|
+
getExpected(): string {
|
|
1354
|
+
return "number"
|
|
1355
|
+
}
|
|
1356
|
+
}
|
|
1357
|
+
|
|
1358
|
+
// oxlint-disable-next-line only-used-in-recursion - @gcanti what's this? :-)
|
|
1359
|
+
function hasCheck(checks: ReadonlyArray<Check<unknown>>, tag: string): boolean {
|
|
1360
|
+
return checks.some((c) => {
|
|
1361
|
+
switch (c._tag) {
|
|
1362
|
+
case "Filter":
|
|
1363
|
+
return c.annotations?.meta?._tag === tag
|
|
1364
|
+
case "FilterGroup":
|
|
1365
|
+
return hasCheck(c.checks, tag)
|
|
1366
|
+
}
|
|
1367
|
+
})
|
|
1368
|
+
}
|
|
1369
|
+
|
|
1370
|
+
/**
|
|
1371
|
+
* Provides the singleton {@link Number} AST instance.
|
|
1372
|
+
*
|
|
1373
|
+
* **When to use**
|
|
1374
|
+
*
|
|
1375
|
+
* Use when you need the canonical `SchemaAST` node for schemas that accept any
|
|
1376
|
+
* JavaScript number value.
|
|
1377
|
+
*
|
|
1378
|
+
* @see {@link Number} for the AST node class and serialization behavior
|
|
1379
|
+
* @see {@link Literal} for exact finite numeric literal AST nodes
|
|
1380
|
+
*
|
|
1381
|
+
* @category constructors
|
|
1382
|
+
* @since 4.0.0
|
|
1383
|
+
*/
|
|
1384
|
+
export const number = new Number()
|
|
1385
|
+
|
|
1386
|
+
/**
|
|
1387
|
+
* AST node matching any `boolean` value (`true` or `false`).
|
|
1388
|
+
*
|
|
1389
|
+
* @see {@link boolean}
|
|
1390
|
+
* @see {@link isBoolean}
|
|
1391
|
+
*
|
|
1392
|
+
* @category models
|
|
1393
|
+
* @since 4.0.0
|
|
1394
|
+
*/
|
|
1395
|
+
export class Boolean extends Base {
|
|
1396
|
+
readonly _tag = "Boolean"
|
|
1397
|
+
/** @internal */
|
|
1398
|
+
getParser() {
|
|
1399
|
+
return fromRefinement(this, Predicate.isBoolean)
|
|
1400
|
+
}
|
|
1401
|
+
/** @internal */
|
|
1402
|
+
getExpected(): string {
|
|
1403
|
+
return "boolean"
|
|
1404
|
+
}
|
|
1405
|
+
}
|
|
1406
|
+
|
|
1407
|
+
/**
|
|
1408
|
+
* Provides the singleton {@link Boolean} AST instance.
|
|
1409
|
+
*
|
|
1410
|
+
* **When to use**
|
|
1411
|
+
*
|
|
1412
|
+
* Use to reuse the standard AST node that accepts either `true` or `false` when
|
|
1413
|
+
* constructing schema ASTs directly.
|
|
1414
|
+
*
|
|
1415
|
+
* @see {@link Boolean} for the AST node class
|
|
1416
|
+
* @see {@link Literal} for exact boolean literal AST nodes
|
|
1417
|
+
*
|
|
1418
|
+
* @category constructors
|
|
1419
|
+
* @since 4.0.0
|
|
1420
|
+
*/
|
|
1421
|
+
export const boolean = new Boolean()
|
|
1422
|
+
|
|
1423
|
+
/**
|
|
1424
|
+
* AST node matching any `symbol` value.
|
|
1425
|
+
*
|
|
1426
|
+
* **When to use**
|
|
1427
|
+
*
|
|
1428
|
+
* Use when you need the AST node class for schemas that match any JavaScript
|
|
1429
|
+
* symbol value.
|
|
1430
|
+
*
|
|
1431
|
+
* **Details**
|
|
1432
|
+
*
|
|
1433
|
+
* When serialized to a string-based codec, symbols are converted via
|
|
1434
|
+
* `Symbol.keyFor` and must be registered with `Symbol.for`.
|
|
1435
|
+
*
|
|
1436
|
+
* @see {@link symbol}
|
|
1437
|
+
* @see {@link isSymbol}
|
|
1438
|
+
* @category models
|
|
1439
|
+
* @since 4.0.0
|
|
1440
|
+
*/
|
|
1441
|
+
export class Symbol extends Base {
|
|
1442
|
+
readonly _tag = "Symbol"
|
|
1443
|
+
/** @internal */
|
|
1444
|
+
getParser() {
|
|
1445
|
+
return fromRefinement(this, Predicate.isSymbol)
|
|
1446
|
+
}
|
|
1447
|
+
/** @internal */
|
|
1448
|
+
toCodecStringTree(): AST {
|
|
1449
|
+
return replaceEncoding(this, [symbolToString])
|
|
1450
|
+
}
|
|
1451
|
+
/** @internal */
|
|
1452
|
+
getExpected(): string {
|
|
1453
|
+
return "symbol"
|
|
1454
|
+
}
|
|
1455
|
+
}
|
|
1456
|
+
|
|
1457
|
+
/**
|
|
1458
|
+
* Provides the singleton {@link Symbol} AST instance.
|
|
1459
|
+
*
|
|
1460
|
+
* **When to use**
|
|
1461
|
+
*
|
|
1462
|
+
* Use to reuse the singleton AST node for schemas that match any JavaScript
|
|
1463
|
+
* symbol value.
|
|
1464
|
+
*
|
|
1465
|
+
* **Gotchas**
|
|
1466
|
+
*
|
|
1467
|
+
* String-based codecs can encode only symbols registered with `Symbol.for`,
|
|
1468
|
+
* because the implementation uses `Symbol.keyFor`.
|
|
1469
|
+
*
|
|
1470
|
+
* @see {@link UniqueSymbol} for an AST node that matches one specific symbol
|
|
1471
|
+
*
|
|
1472
|
+
* @category constructors
|
|
1473
|
+
* @since 4.0.0
|
|
1474
|
+
*/
|
|
1475
|
+
export const symbol = new Symbol()
|
|
1476
|
+
|
|
1477
|
+
/**
|
|
1478
|
+
* AST node matching any `bigint` value.
|
|
1479
|
+
*
|
|
1480
|
+
* **Details**
|
|
1481
|
+
*
|
|
1482
|
+
* When serialized to a string-based codec, bigints are converted to/from
|
|
1483
|
+
* their decimal string representation.
|
|
1484
|
+
*
|
|
1485
|
+
* @see {@link bigInt}
|
|
1486
|
+
* @see {@link isBigInt}
|
|
1487
|
+
* @category models
|
|
1488
|
+
* @since 4.0.0
|
|
1489
|
+
*/
|
|
1490
|
+
export class BigInt extends Base {
|
|
1491
|
+
readonly _tag = "BigInt"
|
|
1492
|
+
/** @internal */
|
|
1493
|
+
getParser() {
|
|
1494
|
+
return fromRefinement(this, Predicate.isBigInt)
|
|
1495
|
+
}
|
|
1496
|
+
/** @internal */
|
|
1497
|
+
toCodecStringTree(): AST {
|
|
1498
|
+
return replaceEncoding(this, [bigIntToString])
|
|
1499
|
+
}
|
|
1500
|
+
/** @internal */
|
|
1501
|
+
getExpected(): string {
|
|
1502
|
+
return "bigint"
|
|
1503
|
+
}
|
|
1504
|
+
}
|
|
1505
|
+
|
|
1506
|
+
/**
|
|
1507
|
+
* Provides the singleton {@link BigInt} AST instance.
|
|
1508
|
+
*
|
|
1509
|
+
* **When to use**
|
|
1510
|
+
*
|
|
1511
|
+
* Use to reuse the canonical `BigInt` AST node when constructing, inspecting,
|
|
1512
|
+
* or transforming schemas at the AST level.
|
|
1513
|
+
*
|
|
1514
|
+
* @see {@link BigInt} for the AST node class and string-codec behavior
|
|
1515
|
+
* @see {@link isBigInt} for narrowing an AST to a `BigInt` node
|
|
1516
|
+
*
|
|
1517
|
+
* @category constructors
|
|
1518
|
+
* @since 4.0.0
|
|
1519
|
+
*/
|
|
1520
|
+
export const bigInt = new BigInt()
|
|
1521
|
+
|
|
1522
|
+
/**
|
|
1523
|
+
* AST node for array-like types — both tuples and arrays.
|
|
1524
|
+
*
|
|
1525
|
+
* **When to use**
|
|
1526
|
+
*
|
|
1527
|
+
* Use when constructing or inspecting AST nodes for tuple or array-like schemas,
|
|
1528
|
+
* including rest elements.
|
|
1529
|
+
*
|
|
1530
|
+
* **Details**
|
|
1531
|
+
*
|
|
1532
|
+
* - `elements` — positional element types (tuple elements). An element is
|
|
1533
|
+
* optional if its {@link Context.isOptional} is `true`.
|
|
1534
|
+
* - `rest` — the rest/variadic element types. When non-empty, the first
|
|
1535
|
+
* entry is the "spread" type (e.g. `...Array<string>`), and subsequent
|
|
1536
|
+
* entries are trailing positional elements after the spread.
|
|
1537
|
+
* - `isMutable` — whether the resulting array is `readonly` (`false`) or
|
|
1538
|
+
* mutable (`true`).
|
|
1539
|
+
*
|
|
1540
|
+
* **Gotchas**
|
|
1541
|
+
*
|
|
1542
|
+
* Construction enforces TypeScript ordering rules: a required element
|
|
1543
|
+
* cannot follow an optional one, and an optional element cannot follow a
|
|
1544
|
+
* rest element.
|
|
1545
|
+
*
|
|
1546
|
+
* **Example** (Inspecting a tuple AST)
|
|
1547
|
+
*
|
|
1548
|
+
* ```ts
|
|
1549
|
+
* import { Schema, SchemaAST } from "effect"
|
|
1550
|
+
*
|
|
1551
|
+
* const schema = Schema.Tuple([Schema.String, Schema.Number])
|
|
1552
|
+
* const ast = schema.ast
|
|
1553
|
+
*
|
|
1554
|
+
* if (SchemaAST.isArrays(ast)) {
|
|
1555
|
+
* console.log(ast.elements.length) // 2
|
|
1556
|
+
* console.log(ast.rest.length) // 0
|
|
1557
|
+
* }
|
|
1558
|
+
* ```
|
|
1559
|
+
*
|
|
1560
|
+
* @see {@link isArrays}
|
|
1561
|
+
* @see {@link Objects}
|
|
1562
|
+
* @category models
|
|
1563
|
+
* @since 4.0.0
|
|
1564
|
+
*/
|
|
1565
|
+
export class Arrays extends Base {
|
|
1566
|
+
readonly _tag = "Arrays"
|
|
1567
|
+
readonly isMutable: boolean
|
|
1568
|
+
readonly elements: ReadonlyArray<AST>
|
|
1569
|
+
readonly rest: ReadonlyArray<AST>
|
|
1570
|
+
readonly encodingChecks: Checks | undefined
|
|
1571
|
+
|
|
1572
|
+
constructor(
|
|
1573
|
+
isMutable: boolean,
|
|
1574
|
+
elements: ReadonlyArray<AST>,
|
|
1575
|
+
rest: ReadonlyArray<AST>,
|
|
1576
|
+
annotations?: Schema.Annotations.Annotations,
|
|
1577
|
+
checks?: Checks,
|
|
1578
|
+
encoding?: Encoding,
|
|
1579
|
+
context?: Context,
|
|
1580
|
+
encodingChecks?: Checks
|
|
1581
|
+
) {
|
|
1582
|
+
super(annotations, checks, encoding, context)
|
|
1583
|
+
this.isMutable = isMutable
|
|
1584
|
+
this.elements = elements
|
|
1585
|
+
this.rest = rest
|
|
1586
|
+
this.encodingChecks = encodingChecks
|
|
1587
|
+
|
|
1588
|
+
// A required element cannot follow an optional element. ts(1257)
|
|
1589
|
+
const i = elements.findIndex(isOptional)
|
|
1590
|
+
if (i !== -1 && (elements.slice(i + 1).some((e) => !isOptional(e)) || rest.length > 1)) {
|
|
1591
|
+
throw new Error("A required element cannot follow an optional element. ts(1257)")
|
|
1592
|
+
}
|
|
1593
|
+
|
|
1594
|
+
// An optional element cannot follow a rest element.ts(1266)
|
|
1595
|
+
if (rest.length > 1 && rest.slice(1).some(isOptional)) {
|
|
1596
|
+
throw new Error("An optional element cannot follow a rest element. ts(1266)")
|
|
1597
|
+
}
|
|
1598
|
+
}
|
|
1599
|
+
/** @internal */
|
|
1600
|
+
getParser(recur: (ast: AST) => SchemaParser.Parser): SchemaParser.Parser {
|
|
1601
|
+
// oxlint-disable-next-line @typescript-eslint/no-this-alias
|
|
1602
|
+
const ast = this
|
|
1603
|
+
const elements = ast.elements.map((ast) => ({ ast, parser: recur(ast) }))
|
|
1604
|
+
const rest = ast.rest.map((ast) => ({ ast, parser: recur(ast) }))
|
|
1605
|
+
const elementLen = elements.length
|
|
1606
|
+
|
|
1607
|
+
const [head, ...tail] = rest
|
|
1608
|
+
const tailLen = tail.length
|
|
1609
|
+
|
|
1610
|
+
function getParser(
|
|
1611
|
+
tailThreshold: number,
|
|
1612
|
+
index: number
|
|
1613
|
+
): { readonly ast: AST; readonly parser: SchemaParser.Parser } {
|
|
1614
|
+
if (index < elementLen) {
|
|
1615
|
+
return elements[index]
|
|
1616
|
+
} else if (index >= tailThreshold) {
|
|
1617
|
+
return tail[index - tailThreshold]
|
|
1618
|
+
}
|
|
1619
|
+
return head
|
|
1620
|
+
}
|
|
1621
|
+
|
|
1622
|
+
return Effect.fnUntracedEager(function*(oinput, options) {
|
|
1623
|
+
if (oinput._tag === "None") {
|
|
1624
|
+
return oinput
|
|
1625
|
+
}
|
|
1626
|
+
const input = oinput.value
|
|
1627
|
+
|
|
1628
|
+
// If the input is not an array, return early with an error
|
|
1629
|
+
if (!Array.isArray(input)) {
|
|
1630
|
+
return yield* Effect.fail(new SchemaIssue.InvalidType(ast, oinput))
|
|
1631
|
+
}
|
|
1632
|
+
|
|
1633
|
+
const len = input.length
|
|
1634
|
+
const state = {
|
|
1635
|
+
ast,
|
|
1636
|
+
getParser,
|
|
1637
|
+
oinput,
|
|
1638
|
+
len,
|
|
1639
|
+
tailThreshold: resolveTailThreshold(len, elementLen, tailLen),
|
|
1640
|
+
output: new globalThis.Array(len),
|
|
1641
|
+
issues: undefined as Arr.NonEmptyArray<SchemaIssue.Issue> | undefined,
|
|
1642
|
+
options
|
|
1643
|
+
}
|
|
1644
|
+
const concurrency = resolveConcurrency(options?.concurrency)
|
|
1645
|
+
const eff = parseArray(state, input, {
|
|
1646
|
+
concurrency: concurrency?.concurrency,
|
|
1647
|
+
end: ast.rest.length === 0 ? elementLen : Math.max(len, elementLen + tailLen)
|
|
1648
|
+
})
|
|
1649
|
+
if (eff) yield* eff
|
|
1650
|
+
|
|
1651
|
+
// ---------------------------------------------
|
|
1652
|
+
// handle excess indexes
|
|
1653
|
+
// ---------------------------------------------
|
|
1654
|
+
if (ast.rest.length === 0 && len > elementLen) {
|
|
1655
|
+
for (let i = elementLen; i <= len - 1; i++) {
|
|
1656
|
+
const issue = new SchemaIssue.Pointer([i], new SchemaIssue.UnexpectedKey(ast, input[i]))
|
|
1657
|
+
if (options.errors === "all") {
|
|
1658
|
+
if (state.issues) state.issues.push(issue)
|
|
1659
|
+
else state.issues = [issue]
|
|
1660
|
+
} else {
|
|
1661
|
+
return yield* Effect.fail(new SchemaIssue.Composite(ast, oinput, [issue]))
|
|
1662
|
+
}
|
|
1663
|
+
}
|
|
1664
|
+
}
|
|
1665
|
+
if (state.issues) {
|
|
1666
|
+
return yield* Effect.fail(new SchemaIssue.Composite(ast, oinput, state.issues))
|
|
1667
|
+
}
|
|
1668
|
+
return Option.some(state.output)
|
|
1669
|
+
})
|
|
1670
|
+
}
|
|
1671
|
+
private rebuild(recur: (ast: AST) => AST, checks: Checks | undefined, encodingChecks: Checks | undefined) {
|
|
1672
|
+
const elements = mapOrSame(this.elements, recur)
|
|
1673
|
+
const rest = mapOrSame(this.rest, recur)
|
|
1674
|
+
return elements === this.elements && rest === this.rest ?
|
|
1675
|
+
this :
|
|
1676
|
+
new Arrays(
|
|
1677
|
+
this.isMutable,
|
|
1678
|
+
elements,
|
|
1679
|
+
rest,
|
|
1680
|
+
this.annotations,
|
|
1681
|
+
checks,
|
|
1682
|
+
undefined,
|
|
1683
|
+
this.context,
|
|
1684
|
+
encodingChecks
|
|
1685
|
+
)
|
|
1686
|
+
}
|
|
1687
|
+
/** @internal */
|
|
1688
|
+
recur(recur: (ast: AST) => AST) {
|
|
1689
|
+
return this.rebuild(recur, this.checks, this.encodingChecks)
|
|
1690
|
+
}
|
|
1691
|
+
/** @internal */
|
|
1692
|
+
flip(recur: (ast: AST) => AST) {
|
|
1693
|
+
return this.rebuild(recur, this.encodingChecks, this.checks)
|
|
1694
|
+
}
|
|
1695
|
+
/** @internal */
|
|
1696
|
+
getExpected(): string {
|
|
1697
|
+
return "array"
|
|
1698
|
+
}
|
|
1699
|
+
}
|
|
1700
|
+
const parseArray = iterateEager<{
|
|
1701
|
+
readonly ast: AST
|
|
1702
|
+
readonly oinput: Option.Option<unknown>
|
|
1703
|
+
readonly len: number
|
|
1704
|
+
readonly getParser: (
|
|
1705
|
+
tailThreshold: number,
|
|
1706
|
+
index: number
|
|
1707
|
+
) => { readonly ast: AST; readonly parser: SchemaParser.Parser }
|
|
1708
|
+
readonly tailThreshold: number
|
|
1709
|
+
readonly options: ParseOptions
|
|
1710
|
+
readonly output: Array<unknown>
|
|
1711
|
+
issues: Array<SchemaIssue.Issue> | undefined
|
|
1712
|
+
}, unknown>()({
|
|
1713
|
+
onItem(s, item, i) {
|
|
1714
|
+
const value = i < s.len ? Option.some(item) : Option.none()
|
|
1715
|
+
return s.getParser(s.tailThreshold, i).parser(value, s.options)
|
|
1716
|
+
},
|
|
1717
|
+
step(s, _, exit, i) {
|
|
1718
|
+
if (exit._tag === "Failure") {
|
|
1719
|
+
return wrapPropertyKeyIssue(s, s.ast, i, exit)
|
|
1720
|
+
} else if (exit.value._tag === "Some") {
|
|
1721
|
+
s.output[i] = exit.value.value
|
|
1722
|
+
} else {
|
|
1723
|
+
const p = s.getParser(s.tailThreshold, i)
|
|
1724
|
+
if (isOptional(p.ast)) return
|
|
1725
|
+
const issue = new SchemaIssue.Pointer([i], new SchemaIssue.MissingKey(p.ast.context?.annotations))
|
|
1726
|
+
if (s.options.errors === "all") {
|
|
1727
|
+
if (s.issues) s.issues.push(issue)
|
|
1728
|
+
else s.issues = [issue]
|
|
1729
|
+
} else {
|
|
1730
|
+
return Exit.fail(new SchemaIssue.Composite(s.ast, s.oinput, [issue]))
|
|
1731
|
+
}
|
|
1732
|
+
}
|
|
1733
|
+
}
|
|
1734
|
+
})
|
|
1735
|
+
|
|
1736
|
+
function resolveTailThreshold(
|
|
1737
|
+
inputLen: number,
|
|
1738
|
+
elementLen: number,
|
|
1739
|
+
tailLen: number
|
|
1740
|
+
) {
|
|
1741
|
+
return Math.max(elementLen, inputLen - tailLen)
|
|
1742
|
+
}
|
|
1743
|
+
|
|
1744
|
+
const resolveConcurrency = (value: number | "unbounded" | undefined) => {
|
|
1745
|
+
value = value === "unbounded" ? Infinity : value ?? 1
|
|
1746
|
+
return value > 1 ? { concurrency: value } : undefined
|
|
1747
|
+
}
|
|
1748
|
+
|
|
1749
|
+
const wrapPropertyKeyIssue = (
|
|
1750
|
+
s: {
|
|
1751
|
+
readonly oinput: Option.Option<unknown>
|
|
1752
|
+
readonly options: ParseOptions
|
|
1753
|
+
issues: Array<SchemaIssue.Issue> | undefined
|
|
1754
|
+
},
|
|
1755
|
+
ast: AST,
|
|
1756
|
+
key: PropertyKey,
|
|
1757
|
+
exit: Exit.Failure<any, SchemaIssue.Issue>
|
|
1758
|
+
) => {
|
|
1759
|
+
if (exit.cause.reasons.length === 0) {
|
|
1760
|
+
return exit
|
|
1761
|
+
}
|
|
1762
|
+
const issue = InternalSchemaCause.getSchemaIssue(exit.cause)
|
|
1763
|
+
if (issue === undefined) {
|
|
1764
|
+
return Exit.failCause(
|
|
1765
|
+
Cause.map(
|
|
1766
|
+
exit.cause,
|
|
1767
|
+
(issue) => new SchemaIssue.Composite(ast, s.oinput, [new SchemaIssue.Pointer([key], issue)])
|
|
1768
|
+
)
|
|
1769
|
+
)
|
|
1770
|
+
}
|
|
1771
|
+
const pointer = new SchemaIssue.Pointer([key], issue)
|
|
1772
|
+
if (s.options.errors === "all") {
|
|
1773
|
+
if (s.issues) s.issues.push(pointer)
|
|
1774
|
+
else s.issues = [pointer]
|
|
1775
|
+
} else {
|
|
1776
|
+
return Exit.fail(new SchemaIssue.Composite(ast, s.oinput, [pointer]))
|
|
1777
|
+
}
|
|
1778
|
+
}
|
|
1779
|
+
|
|
1780
|
+
/**
|
|
1781
|
+
* floating point or integer, with optional exponent
|
|
1782
|
+
* @internal
|
|
1783
|
+
*/
|
|
1784
|
+
export const FINITE_PATTERN = "[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?"
|
|
1785
|
+
|
|
1786
|
+
const isNumberStringRegExp = new globalThis.RegExp(`(?:${FINITE_PATTERN}|Infinity|-Infinity|NaN)`)
|
|
1787
|
+
|
|
1788
|
+
/**
|
|
1789
|
+
* Returns the object keys that match the index signature parameter schema.
|
|
1790
|
+
* @internal
|
|
1791
|
+
*/
|
|
1792
|
+
export function getIndexSignatureKeys(
|
|
1793
|
+
input: { readonly [x: PropertyKey]: unknown },
|
|
1794
|
+
parameter: AST
|
|
1795
|
+
): ReadonlyArray<PropertyKey> {
|
|
1796
|
+
const encoded = toEncoded(parameter)
|
|
1797
|
+
switch (encoded._tag) {
|
|
1798
|
+
case "String":
|
|
1799
|
+
return Object.keys(input)
|
|
1800
|
+
case "TemplateLiteral": {
|
|
1801
|
+
const regExp = getTemplateLiteralRegExp(encoded)
|
|
1802
|
+
return Object.keys(input).filter((k) => regExp.test(k))
|
|
1803
|
+
}
|
|
1804
|
+
case "Symbol":
|
|
1805
|
+
return Object.getOwnPropertySymbols(input)
|
|
1806
|
+
case "Number":
|
|
1807
|
+
return Object.keys(input).filter((k) => isNumberStringRegExp.test(k))
|
|
1808
|
+
case "Union":
|
|
1809
|
+
return [...new Set(encoded.types.flatMap((t) => getIndexSignatureKeys(input, t)))]
|
|
1810
|
+
default:
|
|
1811
|
+
return []
|
|
1812
|
+
}
|
|
1813
|
+
}
|
|
1814
|
+
|
|
1815
|
+
/**
|
|
1816
|
+
* Represents a named property within an {@link Objects} node.
|
|
1817
|
+
*
|
|
1818
|
+
* **Details**
|
|
1819
|
+
*
|
|
1820
|
+
* Pairs a `name` (any `PropertyKey`) with a `type` ({@link AST}). The
|
|
1821
|
+
* property's optionality and mutability are determined by the `type`'s
|
|
1822
|
+
* {@link Context}.
|
|
1823
|
+
*
|
|
1824
|
+
* @see {@link Objects}
|
|
1825
|
+
* @category models
|
|
1826
|
+
* @since 3.10.0
|
|
1827
|
+
*/
|
|
1828
|
+
export class PropertySignature {
|
|
1829
|
+
readonly name: PropertyKey
|
|
1830
|
+
readonly type: AST
|
|
1831
|
+
|
|
1832
|
+
constructor(
|
|
1833
|
+
name: PropertyKey,
|
|
1834
|
+
type: AST
|
|
1835
|
+
) {
|
|
1836
|
+
this.name = name
|
|
1837
|
+
this.type = type
|
|
1838
|
+
}
|
|
1839
|
+
}
|
|
1840
|
+
|
|
1841
|
+
/**
|
|
1842
|
+
* Represents a bidirectional merge strategy for index signature key-value pairs.
|
|
1843
|
+
*
|
|
1844
|
+
* **Details**
|
|
1845
|
+
*
|
|
1846
|
+
* Used by {@link IndexSignature} when the same key appears multiple times
|
|
1847
|
+
* (e.g. from `Schema.extend` or overlapping records). Provides separate
|
|
1848
|
+
* `decode` and `encode` combiners that determine how duplicate entries are
|
|
1849
|
+
* merged.
|
|
1850
|
+
*
|
|
1851
|
+
* @see {@link IndexSignature}
|
|
1852
|
+
* @category models
|
|
1853
|
+
* @since 4.0.0
|
|
1854
|
+
*/
|
|
1855
|
+
export class KeyValueCombiner {
|
|
1856
|
+
readonly decode: Combiner.Combiner<readonly [key: PropertyKey, value: any]> | undefined
|
|
1857
|
+
readonly encode: Combiner.Combiner<readonly [key: PropertyKey, value: any]> | undefined
|
|
1858
|
+
|
|
1859
|
+
constructor(
|
|
1860
|
+
decode: Combiner.Combiner<readonly [key: PropertyKey, value: any]> | undefined,
|
|
1861
|
+
encode: Combiner.Combiner<readonly [key: PropertyKey, value: any]> | undefined
|
|
1862
|
+
) {
|
|
1863
|
+
this.decode = decode
|
|
1864
|
+
this.encode = encode
|
|
1865
|
+
}
|
|
1866
|
+
/** @internal */
|
|
1867
|
+
flip(): KeyValueCombiner {
|
|
1868
|
+
return new KeyValueCombiner(this.encode, this.decode)
|
|
1869
|
+
}
|
|
1870
|
+
}
|
|
1871
|
+
|
|
1872
|
+
/**
|
|
1873
|
+
* Represents an index signature entry within an {@link Objects} node.
|
|
1874
|
+
*
|
|
1875
|
+
* **When to use**
|
|
1876
|
+
*
|
|
1877
|
+
* Use when constructing or inspecting object AST entries for record-like keys
|
|
1878
|
+
* and values.
|
|
1879
|
+
*
|
|
1880
|
+
* **Details**
|
|
1881
|
+
*
|
|
1882
|
+
* - `parameter` — the key type AST (e.g. {@link String} for `string` keys,
|
|
1883
|
+
* {@link TemplateLiteral} for patterned keys).
|
|
1884
|
+
* - `type` — the value type SchemaAST.
|
|
1885
|
+
* - `merge` — optional {@link KeyValueCombiner} for handling duplicate keys.
|
|
1886
|
+
*
|
|
1887
|
+
* **Gotchas**
|
|
1888
|
+
*
|
|
1889
|
+
* Using `Schema.optionalKey` on the value type is not allowed for index
|
|
1890
|
+
* signatures (throws at construction); use `Schema.optional` instead.
|
|
1891
|
+
*
|
|
1892
|
+
* @see {@link Objects}
|
|
1893
|
+
* @see {@link PropertySignature}
|
|
1894
|
+
* @category models
|
|
1895
|
+
* @since 3.10.0
|
|
1896
|
+
*/
|
|
1897
|
+
export class IndexSignature {
|
|
1898
|
+
readonly parameter: AST
|
|
1899
|
+
readonly type: AST
|
|
1900
|
+
readonly merge: KeyValueCombiner | undefined
|
|
1901
|
+
|
|
1902
|
+
constructor(
|
|
1903
|
+
parameter: AST,
|
|
1904
|
+
type: AST,
|
|
1905
|
+
merge: KeyValueCombiner | undefined
|
|
1906
|
+
) {
|
|
1907
|
+
this.parameter = parameter
|
|
1908
|
+
this.type = type
|
|
1909
|
+
this.merge = merge
|
|
1910
|
+
if (isOptional(type) && !containsUndefined(type)) {
|
|
1911
|
+
throw new Error("Cannot use `Schema.optionalKey` with index signatures, use `Schema.optional` instead.")
|
|
1912
|
+
}
|
|
1913
|
+
}
|
|
1914
|
+
}
|
|
1915
|
+
|
|
1916
|
+
/**
|
|
1917
|
+
* AST node for object-like schemas, including structs and records.
|
|
1918
|
+
*
|
|
1919
|
+
* **When to use**
|
|
1920
|
+
*
|
|
1921
|
+
* Use when constructing or inspecting AST nodes for structs or records rather
|
|
1922
|
+
* than array-like schemas.
|
|
1923
|
+
*
|
|
1924
|
+
* **Details**
|
|
1925
|
+
*
|
|
1926
|
+
* - `propertySignatures` — named properties with their types (struct fields).
|
|
1927
|
+
* - `indexSignatures` — index signature entries (record patterns), each with
|
|
1928
|
+
* a `parameter` AST for matching keys and a `type` AST for values.
|
|
1929
|
+
*
|
|
1930
|
+
* An `Objects` node with no properties and no index signatures performs only a
|
|
1931
|
+
* non-nullish check: it accepts any value except `null` and `undefined`,
|
|
1932
|
+
* including primitive values.
|
|
1933
|
+
*
|
|
1934
|
+
* **Gotchas**
|
|
1935
|
+
*
|
|
1936
|
+
* Duplicate property names throw at construction time.
|
|
1937
|
+
*
|
|
1938
|
+
* **Example** (Inspecting a struct AST)
|
|
1939
|
+
*
|
|
1940
|
+
* ```ts
|
|
1941
|
+
* import { Schema, SchemaAST } from "effect"
|
|
1942
|
+
*
|
|
1943
|
+
* const schema = Schema.Struct({ name: Schema.String })
|
|
1944
|
+
* const ast = schema.ast
|
|
1945
|
+
*
|
|
1946
|
+
* if (SchemaAST.isObjects(ast)) {
|
|
1947
|
+
* for (const ps of ast.propertySignatures) {
|
|
1948
|
+
* console.log(ps.name, ps.type._tag)
|
|
1949
|
+
* }
|
|
1950
|
+
* // "name" "String"
|
|
1951
|
+
* }
|
|
1952
|
+
* ```
|
|
1953
|
+
*
|
|
1954
|
+
* @see {@link isObjects}
|
|
1955
|
+
* @see {@link PropertySignature}
|
|
1956
|
+
* @see {@link IndexSignature}
|
|
1957
|
+
* @see {@link Arrays}
|
|
1958
|
+
* @category models
|
|
1959
|
+
* @since 4.0.0
|
|
1960
|
+
*/
|
|
1961
|
+
export class Objects extends Base {
|
|
1962
|
+
readonly _tag = "Objects"
|
|
1963
|
+
readonly propertySignatures: ReadonlyArray<PropertySignature>
|
|
1964
|
+
readonly indexSignatures: ReadonlyArray<IndexSignature>
|
|
1965
|
+
readonly encodingChecks: Checks | undefined
|
|
1966
|
+
|
|
1967
|
+
constructor(
|
|
1968
|
+
propertySignatures: ReadonlyArray<PropertySignature>,
|
|
1969
|
+
indexSignatures: ReadonlyArray<IndexSignature>,
|
|
1970
|
+
annotations?: Schema.Annotations.Annotations,
|
|
1971
|
+
checks?: Checks,
|
|
1972
|
+
encoding?: Encoding,
|
|
1973
|
+
context?: Context,
|
|
1974
|
+
encodingChecks?: Checks
|
|
1975
|
+
) {
|
|
1976
|
+
super(annotations, checks, encoding, context)
|
|
1977
|
+
this.propertySignatures = propertySignatures
|
|
1978
|
+
this.indexSignatures = indexSignatures
|
|
1979
|
+
this.encodingChecks = encodingChecks
|
|
1980
|
+
|
|
1981
|
+
// Duplicate property signatures
|
|
1982
|
+
const duplicates = propertySignatures.map((ps) => ps.name).filter((name, i, arr) => arr.indexOf(name) !== i)
|
|
1983
|
+
if (duplicates.length > 0) {
|
|
1984
|
+
throw new Error(`Duplicate identifiers: ${JSON.stringify(duplicates)}. ts(2300)`)
|
|
1985
|
+
}
|
|
1986
|
+
}
|
|
1987
|
+
/** @internal */
|
|
1988
|
+
getParser(recur: (ast: AST) => SchemaParser.Parser): SchemaParser.Parser {
|
|
1989
|
+
// oxlint-disable-next-line @typescript-eslint/no-this-alias
|
|
1990
|
+
const ast = this
|
|
1991
|
+
const expectedKeys: Array<PropertyKey> = []
|
|
1992
|
+
const expectedKeysSet = new Set<PropertyKey>()
|
|
1993
|
+
const properties: Array<{
|
|
1994
|
+
readonly ps: PropertySignature | IndexSignature
|
|
1995
|
+
readonly parser: SchemaParser.Parser
|
|
1996
|
+
readonly name: PropertyKey
|
|
1997
|
+
readonly type: AST
|
|
1998
|
+
}> = []
|
|
1999
|
+
for (const ps of ast.propertySignatures) {
|
|
2000
|
+
expectedKeys.push(ps.name)
|
|
2001
|
+
expectedKeysSet.add(ps.name)
|
|
2002
|
+
properties.push({
|
|
2003
|
+
ps,
|
|
2004
|
+
parser: recur(ps.type),
|
|
2005
|
+
name: ps.name,
|
|
2006
|
+
type: ps.type
|
|
2007
|
+
})
|
|
2008
|
+
}
|
|
2009
|
+
const indexCount = ast.indexSignatures.length
|
|
2010
|
+
// ---------------------------------------------
|
|
2011
|
+
// handle empty struct
|
|
2012
|
+
// ---------------------------------------------
|
|
2013
|
+
if (ast.propertySignatures.length === 0 && ast.indexSignatures.length === 0) {
|
|
2014
|
+
return fromRefinement(ast, Predicate.isNotNullish)
|
|
2015
|
+
}
|
|
2016
|
+
|
|
2017
|
+
const parseIndexes = indexCount > 0 ?
|
|
2018
|
+
iterateEager<{
|
|
2019
|
+
readonly oinput: Option.Option<unknown>
|
|
2020
|
+
readonly input: Record<PropertyKey, unknown>
|
|
2021
|
+
readonly options: ParseOptions
|
|
2022
|
+
readonly out: Record<PropertyKey, unknown>
|
|
2023
|
+
issues: Array<SchemaIssue.Issue> | undefined
|
|
2024
|
+
}, [key: PropertyKey, is: IndexSignature]>()({
|
|
2025
|
+
onItem: Effect.fnUntracedEager(function*(
|
|
2026
|
+
s,
|
|
2027
|
+
[key, is]
|
|
2028
|
+
) {
|
|
2029
|
+
const parserKey = recur(indexSignatureParameterFromString(is.parameter))
|
|
2030
|
+
const effKey = parserKey(Option.some(key), s.options)
|
|
2031
|
+
const exitKey = (effectIsExit(effKey) ? effKey : yield* Effect.exit(effKey)) as Exit.Exit<
|
|
2032
|
+
Option.Option<PropertyKey>,
|
|
2033
|
+
SchemaIssue.Issue
|
|
2034
|
+
>
|
|
2035
|
+
if (exitKey._tag === "Failure") {
|
|
2036
|
+
const eff = wrapPropertyKeyIssue(s, ast, key, exitKey)
|
|
2037
|
+
if (eff) yield* eff
|
|
2038
|
+
return
|
|
2039
|
+
}
|
|
2040
|
+
|
|
2041
|
+
const value: Option.Option<unknown> = Option.some(s.input[key])
|
|
2042
|
+
const parserValue = recur(is.type)
|
|
2043
|
+
const effValue = parserValue(value, s.options)
|
|
2044
|
+
const exitValue = effectIsExit(effValue) ? effValue : yield* Effect.exit(effValue)
|
|
2045
|
+
if (exitValue._tag === "Failure") {
|
|
2046
|
+
const eff = wrapPropertyKeyIssue(s, ast, key, exitValue)
|
|
2047
|
+
if (eff) yield* eff
|
|
2048
|
+
return
|
|
2049
|
+
} else if (exitKey.value._tag === "Some" && exitValue.value._tag === "Some") {
|
|
2050
|
+
const k2 = exitKey.value.value
|
|
2051
|
+
if (expectedKeysSet.has(key) || expectedKeysSet.has(k2)) {
|
|
2052
|
+
return
|
|
2053
|
+
}
|
|
2054
|
+
const v2 = exitValue.value.value
|
|
2055
|
+
if (is.merge && is.merge.decode && Object.hasOwn(s.out, k2)) {
|
|
2056
|
+
const [k, v] = is.merge.decode.combine([k2, s.out[k2]], [k2, v2])
|
|
2057
|
+
internalRecord.set(s.out, k, v)
|
|
2058
|
+
} else {
|
|
2059
|
+
internalRecord.set(s.out, k2, v2)
|
|
2060
|
+
}
|
|
2061
|
+
}
|
|
2062
|
+
}),
|
|
2063
|
+
step: (_s, _, exit: Exit.Exit<void, SchemaIssue.Issue>) => exit._tag === "Failure" ? exit : undefined
|
|
2064
|
+
}) :
|
|
2065
|
+
undefined
|
|
2066
|
+
|
|
2067
|
+
return Effect.fnUntracedEager(function*(oinput, options) {
|
|
2068
|
+
if (oinput._tag === "None") {
|
|
2069
|
+
return oinput
|
|
2070
|
+
}
|
|
2071
|
+
const input = oinput.value as Record<PropertyKey, unknown>
|
|
2072
|
+
|
|
2073
|
+
// If the input is not a record, return early with an error
|
|
2074
|
+
if (!(typeof input === "object" && input !== null && !Array.isArray(input))) {
|
|
2075
|
+
return yield* Effect.fail(new SchemaIssue.InvalidType(ast, oinput))
|
|
2076
|
+
}
|
|
2077
|
+
|
|
2078
|
+
const out: Record<PropertyKey, unknown> = {}
|
|
2079
|
+
const state = {
|
|
2080
|
+
ast,
|
|
2081
|
+
oinput,
|
|
2082
|
+
input,
|
|
2083
|
+
out,
|
|
2084
|
+
issues: undefined as Arr.NonEmptyArray<SchemaIssue.Issue> | undefined,
|
|
2085
|
+
options
|
|
2086
|
+
}
|
|
2087
|
+
const errorsAllOption = options.errors === "all"
|
|
2088
|
+
const onExcessPropertyError = options.onExcessProperty === "error"
|
|
2089
|
+
const onExcessPropertyPreserve = options.onExcessProperty === "preserve"
|
|
2090
|
+
|
|
2091
|
+
// ---------------------------------------------
|
|
2092
|
+
// handle excess properties
|
|
2093
|
+
// ---------------------------------------------
|
|
2094
|
+
let inputKeys: Array<PropertyKey> | undefined
|
|
2095
|
+
if (ast.indexSignatures.length === 0 && (onExcessPropertyError || onExcessPropertyPreserve)) {
|
|
2096
|
+
inputKeys = Reflect.ownKeys(input)
|
|
2097
|
+
for (let i = 0; i < inputKeys.length; i++) {
|
|
2098
|
+
const key = inputKeys[i]
|
|
2099
|
+
if (!expectedKeysSet.has(key)) {
|
|
2100
|
+
// key is unexpected
|
|
2101
|
+
if (onExcessPropertyError) {
|
|
2102
|
+
const issue = new SchemaIssue.Pointer([key], new SchemaIssue.UnexpectedKey(ast, input[key]))
|
|
2103
|
+
if (errorsAllOption) {
|
|
2104
|
+
if (state.issues) {
|
|
2105
|
+
state.issues.push(issue)
|
|
2106
|
+
} else {
|
|
2107
|
+
state.issues = [issue]
|
|
2108
|
+
}
|
|
2109
|
+
continue
|
|
2110
|
+
} else {
|
|
2111
|
+
return yield* Effect.fail(new SchemaIssue.Composite(ast, oinput, [issue]))
|
|
2112
|
+
}
|
|
2113
|
+
} else {
|
|
2114
|
+
// preserve key
|
|
2115
|
+
internalRecord.set(out, key, input[key])
|
|
2116
|
+
}
|
|
2117
|
+
}
|
|
2118
|
+
}
|
|
2119
|
+
}
|
|
2120
|
+
|
|
2121
|
+
const concurrency = resolveConcurrency(options?.concurrency)
|
|
2122
|
+
|
|
2123
|
+
// ---------------------------------------------
|
|
2124
|
+
// handle property signatures
|
|
2125
|
+
// ---------------------------------------------
|
|
2126
|
+
const eff = parseProperties(state, properties, concurrency)
|
|
2127
|
+
if (eff) yield* eff
|
|
2128
|
+
|
|
2129
|
+
// ---------------------------------------------
|
|
2130
|
+
// handle index signatures
|
|
2131
|
+
// ---------------------------------------------
|
|
2132
|
+
if (parseIndexes) {
|
|
2133
|
+
const keyPairs = Arr.empty<[PropertyKey, IndexSignature]>()
|
|
2134
|
+
for (let i = 0; i < indexCount; i++) {
|
|
2135
|
+
const is = ast.indexSignatures[i]
|
|
2136
|
+
const keys = getIndexSignatureKeys(input, is.parameter)
|
|
2137
|
+
for (let j = 0; j < keys.length; j++) {
|
|
2138
|
+
const key = keys[j]
|
|
2139
|
+
keyPairs.push([key, is])
|
|
2140
|
+
}
|
|
2141
|
+
}
|
|
2142
|
+
const eff = parseIndexes(state, keyPairs, concurrency)
|
|
2143
|
+
if (eff) yield* eff
|
|
2144
|
+
}
|
|
2145
|
+
|
|
2146
|
+
if (state.issues) {
|
|
2147
|
+
return yield* Effect.fail(new SchemaIssue.Composite(ast, oinput, state.issues))
|
|
2148
|
+
}
|
|
2149
|
+
if (options.propertyOrder === "original") {
|
|
2150
|
+
// preserve input keys order
|
|
2151
|
+
const keys = (inputKeys ?? Reflect.ownKeys(input)).concat(expectedKeys)
|
|
2152
|
+
const preserved: Record<PropertyKey, unknown> = {}
|
|
2153
|
+
for (const key of keys) {
|
|
2154
|
+
if (Object.hasOwn(out, key)) {
|
|
2155
|
+
internalRecord.set(preserved, key, out[key])
|
|
2156
|
+
}
|
|
2157
|
+
}
|
|
2158
|
+
return Option.some(preserved)
|
|
2159
|
+
}
|
|
2160
|
+
return Option.some(out)
|
|
2161
|
+
})
|
|
2162
|
+
}
|
|
2163
|
+
private rebuild(
|
|
2164
|
+
recur: (ast: AST) => AST,
|
|
2165
|
+
flipMerge: boolean,
|
|
2166
|
+
checks: Checks | undefined,
|
|
2167
|
+
encodingChecks: Checks | undefined
|
|
2168
|
+
): Objects {
|
|
2169
|
+
const props = mapOrSame(this.propertySignatures, (ps) => {
|
|
2170
|
+
const t = recur(ps.type)
|
|
2171
|
+
return t === ps.type ? ps : new PropertySignature(ps.name, t)
|
|
2172
|
+
})
|
|
2173
|
+
|
|
2174
|
+
const indexes = mapOrSame(this.indexSignatures, (is) => {
|
|
2175
|
+
const p = recur(is.parameter)
|
|
2176
|
+
const t = recur(is.type)
|
|
2177
|
+
const merge = flipMerge ? is.merge?.flip() : is.merge
|
|
2178
|
+
return p === is.parameter && t === is.type && merge === is.merge
|
|
2179
|
+
? is
|
|
2180
|
+
: new IndexSignature(p, t, merge)
|
|
2181
|
+
})
|
|
2182
|
+
|
|
2183
|
+
return props === this.propertySignatures && indexes === this.indexSignatures
|
|
2184
|
+
? this
|
|
2185
|
+
: new Objects(
|
|
2186
|
+
props,
|
|
2187
|
+
indexes,
|
|
2188
|
+
this.annotations,
|
|
2189
|
+
checks,
|
|
2190
|
+
undefined,
|
|
2191
|
+
this.context,
|
|
2192
|
+
encodingChecks
|
|
2193
|
+
)
|
|
2194
|
+
}
|
|
2195
|
+
/** @internal */
|
|
2196
|
+
flip(recur: (ast: AST) => AST): AST {
|
|
2197
|
+
return this.rebuild(recur, true, this.encodingChecks, this.checks)
|
|
2198
|
+
}
|
|
2199
|
+
/** @internal */
|
|
2200
|
+
recur(recur: (ast: AST) => AST): AST {
|
|
2201
|
+
return this.rebuild(recur, false, this.checks, this.encodingChecks)
|
|
2202
|
+
}
|
|
2203
|
+
/** @internal */
|
|
2204
|
+
getExpected(): string {
|
|
2205
|
+
if (this.propertySignatures.length === 0 && this.indexSignatures.length === 0) return "object | array"
|
|
2206
|
+
return "object"
|
|
2207
|
+
}
|
|
2208
|
+
}
|
|
2209
|
+
|
|
2210
|
+
type ParsedProperty = {
|
|
2211
|
+
readonly ps: PropertySignature | IndexSignature
|
|
2212
|
+
readonly parser: SchemaParser.Parser
|
|
2213
|
+
readonly name: PropertyKey
|
|
2214
|
+
readonly type: AST
|
|
2215
|
+
}
|
|
2216
|
+
|
|
2217
|
+
const parseProperties = iterateEager<{
|
|
2218
|
+
readonly ast: AST
|
|
2219
|
+
readonly oinput: Option.Option<unknown>
|
|
2220
|
+
readonly input: Record<PropertyKey, unknown>
|
|
2221
|
+
readonly options: ParseOptions
|
|
2222
|
+
readonly out: Record<PropertyKey, unknown>
|
|
2223
|
+
issues: Array<SchemaIssue.Issue> | undefined
|
|
2224
|
+
}, ParsedProperty>()({
|
|
2225
|
+
onItem(
|
|
2226
|
+
s: {
|
|
2227
|
+
readonly oinput: Option.Option<unknown>
|
|
2228
|
+
readonly input: Record<PropertyKey, unknown>
|
|
2229
|
+
readonly options: ParseOptions
|
|
2230
|
+
readonly out: Record<PropertyKey, unknown>
|
|
2231
|
+
issues: Array<SchemaIssue.Issue> | undefined
|
|
2232
|
+
},
|
|
2233
|
+
p
|
|
2234
|
+
) {
|
|
2235
|
+
const value: Option.Option<unknown> = Object.hasOwn(s.input, p.name)
|
|
2236
|
+
? Option.some(s.input[p.name])
|
|
2237
|
+
: Option.none()
|
|
2238
|
+
return p.parser(value, s.options)
|
|
2239
|
+
},
|
|
2240
|
+
step(s, p, exit) {
|
|
2241
|
+
if (exit._tag === "Failure") {
|
|
2242
|
+
return wrapPropertyKeyIssue(s, s.ast, p.name, exit)
|
|
2243
|
+
} else if (exit.value._tag === "Some") {
|
|
2244
|
+
internalRecord.set(s.out, p.name, exit.value.value)
|
|
2245
|
+
} else if (!isOptional(p.type)) {
|
|
2246
|
+
const issue = new SchemaIssue.Pointer([p.name], new SchemaIssue.MissingKey(p.type.context?.annotations))
|
|
2247
|
+
if (s.options.errors === "all") {
|
|
2248
|
+
if (s.issues) s.issues.push(issue)
|
|
2249
|
+
else s.issues = [issue]
|
|
2250
|
+
return
|
|
2251
|
+
} else {
|
|
2252
|
+
return Exit.fail(
|
|
2253
|
+
new SchemaIssue.Composite(s.ast, s.oinput, [issue])
|
|
2254
|
+
)
|
|
2255
|
+
}
|
|
2256
|
+
}
|
|
2257
|
+
}
|
|
2258
|
+
})
|
|
2259
|
+
|
|
2260
|
+
function mergeChecks(checks: Checks | undefined, b: AST): Checks | undefined {
|
|
2261
|
+
if (!checks) {
|
|
2262
|
+
return b.checks
|
|
2263
|
+
}
|
|
2264
|
+
if (!b.checks) {
|
|
2265
|
+
return checks
|
|
2266
|
+
}
|
|
2267
|
+
return [...checks, ...b.checks]
|
|
2268
|
+
}
|
|
2269
|
+
|
|
2270
|
+
/** @internal */
|
|
2271
|
+
export function struct<Fields extends Schema.Struct.Fields>(
|
|
2272
|
+
fields: Fields,
|
|
2273
|
+
checks: Checks | undefined,
|
|
2274
|
+
annotations?: Schema.Annotations.Annotations
|
|
2275
|
+
): Objects {
|
|
2276
|
+
return new Objects(
|
|
2277
|
+
Reflect.ownKeys(fields).map((key) => {
|
|
2278
|
+
return new PropertySignature(key, fields[key].ast)
|
|
2279
|
+
}),
|
|
2280
|
+
[],
|
|
2281
|
+
annotations,
|
|
2282
|
+
checks
|
|
2283
|
+
)
|
|
2284
|
+
}
|
|
2285
|
+
|
|
2286
|
+
/** @internal */
|
|
2287
|
+
export function getAST<S extends Schema.Top>(self: S): S["ast"] {
|
|
2288
|
+
return self.ast
|
|
2289
|
+
}
|
|
2290
|
+
|
|
2291
|
+
/** @internal */
|
|
2292
|
+
export function tuple<Elements extends Schema.Tuple.Elements>(
|
|
2293
|
+
elements: Elements,
|
|
2294
|
+
checks: Checks | undefined = undefined
|
|
2295
|
+
): Arrays {
|
|
2296
|
+
return new Arrays(false, elements.map((e) => e.ast), [], undefined, checks)
|
|
2297
|
+
}
|
|
2298
|
+
|
|
2299
|
+
/** @internal */
|
|
2300
|
+
export function union<Members extends ReadonlyArray<Schema.Top>>(
|
|
2301
|
+
members: Members,
|
|
2302
|
+
mode: "anyOf" | "oneOf",
|
|
2303
|
+
checks: Checks | undefined
|
|
2304
|
+
): Union<Members[number]["ast"]> {
|
|
2305
|
+
return new Union(members.map(getAST), mode, undefined, checks)
|
|
2306
|
+
}
|
|
2307
|
+
|
|
2308
|
+
/** @internal */
|
|
2309
|
+
export function structWithRest(ast: Objects, records: ReadonlyArray<Objects>): Objects {
|
|
2310
|
+
if (ast.encoding || records.some((r) => r.encoding)) {
|
|
2311
|
+
throw new Error("StructWithRest does not support encodings")
|
|
2312
|
+
}
|
|
2313
|
+
let propertySignatures = ast.propertySignatures
|
|
2314
|
+
let indexSignatures = ast.indexSignatures
|
|
2315
|
+
let checks = ast.checks
|
|
2316
|
+
for (const r of records) {
|
|
2317
|
+
propertySignatures = propertySignatures.concat(r.propertySignatures)
|
|
2318
|
+
indexSignatures = indexSignatures.concat(r.indexSignatures)
|
|
2319
|
+
checks = mergeChecks(checks, r)
|
|
2320
|
+
}
|
|
2321
|
+
return new Objects(propertySignatures, indexSignatures, undefined, checks)
|
|
2322
|
+
}
|
|
2323
|
+
|
|
2324
|
+
/** @internal */
|
|
2325
|
+
export function tupleWithRest(ast: Arrays, rest: ReadonlyArray<AST>): Arrays {
|
|
2326
|
+
if (ast.encoding) {
|
|
2327
|
+
throw new Error("TupleWithRest does not support encodings")
|
|
2328
|
+
}
|
|
2329
|
+
return new Arrays(ast.isMutable, ast.elements, rest, undefined, ast.checks)
|
|
2330
|
+
}
|
|
2331
|
+
|
|
2332
|
+
type Type =
|
|
2333
|
+
| "null"
|
|
2334
|
+
| "array"
|
|
2335
|
+
| "object"
|
|
2336
|
+
| "string"
|
|
2337
|
+
| "number"
|
|
2338
|
+
| "boolean"
|
|
2339
|
+
| "symbol"
|
|
2340
|
+
| "undefined"
|
|
2341
|
+
| "bigint"
|
|
2342
|
+
| "function"
|
|
2343
|
+
|
|
2344
|
+
/** @internal */
|
|
2345
|
+
export type Sentinel = {
|
|
2346
|
+
readonly key: PropertyKey
|
|
2347
|
+
readonly literal: LiteralValue | symbol
|
|
2348
|
+
}
|
|
2349
|
+
|
|
2350
|
+
function getCandidateTypes(ast: AST): ReadonlyArray<Type> {
|
|
2351
|
+
switch (ast._tag) {
|
|
2352
|
+
case "Null":
|
|
2353
|
+
return ["null"]
|
|
2354
|
+
case "Undefined":
|
|
2355
|
+
case "Void":
|
|
2356
|
+
return ["undefined"]
|
|
2357
|
+
case "String":
|
|
2358
|
+
case "TemplateLiteral":
|
|
2359
|
+
return ["string"]
|
|
2360
|
+
case "Number":
|
|
2361
|
+
return ["number"]
|
|
2362
|
+
case "Boolean":
|
|
2363
|
+
return ["boolean"]
|
|
2364
|
+
case "Symbol":
|
|
2365
|
+
case "UniqueSymbol":
|
|
2366
|
+
return ["symbol"]
|
|
2367
|
+
case "BigInt":
|
|
2368
|
+
return ["bigint"]
|
|
2369
|
+
case "Arrays":
|
|
2370
|
+
return ["array"]
|
|
2371
|
+
case "ObjectKeyword":
|
|
2372
|
+
return ["object", "array", "function"]
|
|
2373
|
+
case "Objects":
|
|
2374
|
+
return ast.propertySignatures.length || ast.indexSignatures.length
|
|
2375
|
+
? ["object"]
|
|
2376
|
+
: ["object", "array"]
|
|
2377
|
+
case "Enum":
|
|
2378
|
+
return Array.from(new Set(ast.enums.map(([, v]) => typeof v)))
|
|
2379
|
+
case "Literal":
|
|
2380
|
+
return [typeof ast.literal]
|
|
2381
|
+
case "Union":
|
|
2382
|
+
return Array.from(new Set(ast.types.flatMap(getCandidateTypes)))
|
|
2383
|
+
default:
|
|
2384
|
+
return [
|
|
2385
|
+
"null",
|
|
2386
|
+
"undefined",
|
|
2387
|
+
"string",
|
|
2388
|
+
"number",
|
|
2389
|
+
"boolean",
|
|
2390
|
+
"symbol",
|
|
2391
|
+
"bigint",
|
|
2392
|
+
"object",
|
|
2393
|
+
"array",
|
|
2394
|
+
"function"
|
|
2395
|
+
]
|
|
2396
|
+
}
|
|
2397
|
+
}
|
|
2398
|
+
|
|
2399
|
+
/** @internal */
|
|
2400
|
+
export function collectSentinels(ast: AST): Array<Sentinel> {
|
|
2401
|
+
switch (ast._tag) {
|
|
2402
|
+
default:
|
|
2403
|
+
return []
|
|
2404
|
+
case "Declaration": {
|
|
2405
|
+
const s = ast.annotations?.["~sentinels"]
|
|
2406
|
+
return Array.isArray(s) ? s : []
|
|
2407
|
+
}
|
|
2408
|
+
case "Objects":
|
|
2409
|
+
return ast.propertySignatures.flatMap((ps): Array<Sentinel> => {
|
|
2410
|
+
const type = ps.type
|
|
2411
|
+
if (!isOptional(type)) {
|
|
2412
|
+
if (isLiteral(type)) {
|
|
2413
|
+
return [{ key: ps.name, literal: type.literal }]
|
|
2414
|
+
}
|
|
2415
|
+
if (isUniqueSymbol(type)) {
|
|
2416
|
+
return [{ key: ps.name, literal: type.symbol }]
|
|
2417
|
+
}
|
|
2418
|
+
}
|
|
2419
|
+
return []
|
|
2420
|
+
})
|
|
2421
|
+
case "Arrays":
|
|
2422
|
+
return ast.elements.flatMap((e, i) => {
|
|
2423
|
+
return isLiteral(e) && !isOptional(e)
|
|
2424
|
+
? [{ key: i, literal: e.literal }]
|
|
2425
|
+
: []
|
|
2426
|
+
})
|
|
2427
|
+
case "Suspend":
|
|
2428
|
+
return collectSentinels(ast.thunk())
|
|
2429
|
+
}
|
|
2430
|
+
}
|
|
2431
|
+
|
|
2432
|
+
type CandidateIndex = {
|
|
2433
|
+
byType?: { [K in Type]?: Array<AST> }
|
|
2434
|
+
bySentinel?: Map<PropertyKey, Map<LiteralValue | symbol, Array<AST>>>
|
|
2435
|
+
otherwise?: { [K in Type]?: Array<AST> }
|
|
2436
|
+
}
|
|
2437
|
+
|
|
2438
|
+
const candidateIndexCache = new WeakMap<ReadonlyArray<AST>, CandidateIndex>()
|
|
2439
|
+
|
|
2440
|
+
function getIndex(types: ReadonlyArray<AST>): CandidateIndex {
|
|
2441
|
+
let idx = candidateIndexCache.get(types)
|
|
2442
|
+
if (idx) return idx
|
|
2443
|
+
|
|
2444
|
+
idx = {}
|
|
2445
|
+
for (const a of types) {
|
|
2446
|
+
const encoded = toEncoded(a)
|
|
2447
|
+
if (isNever(encoded)) continue
|
|
2448
|
+
|
|
2449
|
+
const types = getCandidateTypes(encoded)
|
|
2450
|
+
const sentinels = collectSentinels(encoded)
|
|
2451
|
+
|
|
2452
|
+
// by-type (always filled – cheap primary filter)
|
|
2453
|
+
idx.byType ??= {}
|
|
2454
|
+
for (const t of types) (idx.byType[t] ??= []).push(a)
|
|
2455
|
+
|
|
2456
|
+
if (sentinels.length > 0) { // discriminated variants
|
|
2457
|
+
idx.bySentinel ??= new Map()
|
|
2458
|
+
for (const { key, literal } of sentinels) {
|
|
2459
|
+
let m = idx.bySentinel.get(key)
|
|
2460
|
+
if (!m) idx.bySentinel.set(key, m = new Map())
|
|
2461
|
+
let arr = m.get(literal)
|
|
2462
|
+
if (!arr) m.set(literal, arr = [])
|
|
2463
|
+
arr.push(a)
|
|
2464
|
+
}
|
|
2465
|
+
} else { // non-discriminated
|
|
2466
|
+
idx.otherwise ??= {}
|
|
2467
|
+
for (const t of types) (idx.otherwise[t] ??= []).push(a)
|
|
2468
|
+
}
|
|
2469
|
+
}
|
|
2470
|
+
|
|
2471
|
+
candidateIndexCache.set(types, idx)
|
|
2472
|
+
return idx
|
|
2473
|
+
}
|
|
2474
|
+
|
|
2475
|
+
function filterLiterals(input: any) {
|
|
2476
|
+
return (ast: AST) => {
|
|
2477
|
+
const encoded = toEncoded(ast)
|
|
2478
|
+
return encoded._tag === "Literal" ?
|
|
2479
|
+
encoded.literal === input
|
|
2480
|
+
: encoded._tag === "UniqueSymbol" ?
|
|
2481
|
+
encoded.symbol === input
|
|
2482
|
+
: true
|
|
2483
|
+
}
|
|
2484
|
+
}
|
|
2485
|
+
|
|
2486
|
+
/**
|
|
2487
|
+
* The goal is to reduce the number of a union members that will be checked.
|
|
2488
|
+
* This is useful to reduce the number of issues that will be returned.
|
|
2489
|
+
*
|
|
2490
|
+
* @internal
|
|
2491
|
+
*/
|
|
2492
|
+
export function getCandidates(input: any, types: ReadonlyArray<AST>): ReadonlyArray<AST> {
|
|
2493
|
+
const idx = getIndex(types)
|
|
2494
|
+
const runtimeType: Type = input === null ? "null" : Array.isArray(input) ? "array" : typeof input
|
|
2495
|
+
|
|
2496
|
+
// 1. Try sentinel-based dispatch (most selective)
|
|
2497
|
+
if (idx.bySentinel) {
|
|
2498
|
+
const base = idx.otherwise?.[runtimeType] ?? []
|
|
2499
|
+
if (runtimeType === "object" || runtimeType === "array") {
|
|
2500
|
+
for (const [k, m] of idx.bySentinel) {
|
|
2501
|
+
if (Object.hasOwn(input, k)) {
|
|
2502
|
+
const match = m.get((input as any)[k])
|
|
2503
|
+
if (match) return [...match, ...base].filter(filterLiterals(input))
|
|
2504
|
+
}
|
|
2505
|
+
}
|
|
2506
|
+
}
|
|
2507
|
+
return base
|
|
2508
|
+
}
|
|
2509
|
+
|
|
2510
|
+
// 2. Fallback: runtime-type dispatch only
|
|
2511
|
+
return (idx.byType?.[runtimeType] ?? []).filter(filterLiterals(input))
|
|
2512
|
+
}
|
|
2513
|
+
|
|
2514
|
+
/**
|
|
2515
|
+
* AST node representing a union of schemas.
|
|
2516
|
+
*
|
|
2517
|
+
* **Details**
|
|
2518
|
+
*
|
|
2519
|
+
* - `types` — the member AST nodes.
|
|
2520
|
+
* - `mode` — `"anyOf"` succeeds on the first match (like TypeScript unions);
|
|
2521
|
+
* `"oneOf"` requires exactly one member to match (fails if multiple do).
|
|
2522
|
+
*
|
|
2523
|
+
* During parsing, members are tried in order. An internal candidate index
|
|
2524
|
+
* narrows which members to try based on the runtime type of the input and
|
|
2525
|
+
* discriminant ("sentinel") fields, making large unions efficient.
|
|
2526
|
+
*
|
|
2527
|
+
* **Example** (Inspecting a union AST)
|
|
2528
|
+
*
|
|
2529
|
+
* ```ts
|
|
2530
|
+
* import { Schema, SchemaAST } from "effect"
|
|
2531
|
+
*
|
|
2532
|
+
* const schema = Schema.Union([Schema.String, Schema.Number])
|
|
2533
|
+
* const ast = schema.ast
|
|
2534
|
+
*
|
|
2535
|
+
* if (SchemaAST.isUnion(ast)) {
|
|
2536
|
+
* console.log(ast.types.length) // 2
|
|
2537
|
+
* console.log(ast.mode) // "anyOf"
|
|
2538
|
+
* }
|
|
2539
|
+
* ```
|
|
2540
|
+
*
|
|
2541
|
+
* @see {@link isUnion}
|
|
2542
|
+
* @category models
|
|
2543
|
+
* @since 3.10.0
|
|
2544
|
+
*/
|
|
2545
|
+
export class Union<A extends AST = AST> extends Base {
|
|
2546
|
+
readonly _tag = "Union"
|
|
2547
|
+
readonly types: ReadonlyArray<A>
|
|
2548
|
+
readonly mode: "anyOf" | "oneOf"
|
|
2549
|
+
readonly encodingChecks: Checks | undefined
|
|
2550
|
+
|
|
2551
|
+
constructor(
|
|
2552
|
+
types: ReadonlyArray<A>,
|
|
2553
|
+
mode: "anyOf" | "oneOf",
|
|
2554
|
+
annotations?: Schema.Annotations.Annotations,
|
|
2555
|
+
checks?: Checks,
|
|
2556
|
+
encoding?: Encoding,
|
|
2557
|
+
context?: Context,
|
|
2558
|
+
encodingChecks?: Checks
|
|
2559
|
+
) {
|
|
2560
|
+
super(annotations, checks, encoding, context)
|
|
2561
|
+
this.types = types
|
|
2562
|
+
this.mode = mode
|
|
2563
|
+
this.encodingChecks = encodingChecks
|
|
2564
|
+
}
|
|
2565
|
+
/** @internal */
|
|
2566
|
+
getParser(recur: (ast: AST) => SchemaParser.Parser): SchemaParser.Parser {
|
|
2567
|
+
// oxlint-disable-next-line @typescript-eslint/no-this-alias
|
|
2568
|
+
const ast = this
|
|
2569
|
+
|
|
2570
|
+
return (oinput, options) => {
|
|
2571
|
+
if (oinput._tag === "None") {
|
|
2572
|
+
return Effect.succeed(oinput)
|
|
2573
|
+
}
|
|
2574
|
+
const input = oinput.value
|
|
2575
|
+
const candidates = getCandidates(input, ast.types)
|
|
2576
|
+
|
|
2577
|
+
const state = {
|
|
2578
|
+
ast,
|
|
2579
|
+
recur,
|
|
2580
|
+
oinput,
|
|
2581
|
+
input,
|
|
2582
|
+
out: undefined,
|
|
2583
|
+
successes: [],
|
|
2584
|
+
issues: undefined as Arr.NonEmptyArray<SchemaIssue.Issue> | undefined,
|
|
2585
|
+
options
|
|
2586
|
+
}
|
|
2587
|
+
const concurrency = resolveConcurrency(options?.concurrency)
|
|
2588
|
+
const eff = parseUnion(state, candidates, concurrency)
|
|
2589
|
+
if (!eff) {
|
|
2590
|
+
return state.out
|
|
2591
|
+
? Effect.succeed(state.out)
|
|
2592
|
+
: Effect.fail(new SchemaIssue.AnyOf(ast, input, state.issues ?? []))
|
|
2593
|
+
}
|
|
2594
|
+
return Effect.flatMap(eff, (_) => {
|
|
2595
|
+
return state.out
|
|
2596
|
+
? Effect.succeed(state.out)
|
|
2597
|
+
: Effect.fail(new SchemaIssue.AnyOf(ast, input, state.issues ?? []))
|
|
2598
|
+
})
|
|
2599
|
+
}
|
|
2600
|
+
}
|
|
2601
|
+
private rebuild(recur: (ast: AST) => AST, checks: Checks | undefined, encodingChecks: Checks | undefined) {
|
|
2602
|
+
const types = mapOrSame(this.types, recur)
|
|
2603
|
+
return types === this.types ?
|
|
2604
|
+
this :
|
|
2605
|
+
new Union(types, this.mode, this.annotations, checks, undefined, this.context, encodingChecks)
|
|
2606
|
+
}
|
|
2607
|
+
/** @internal */
|
|
2608
|
+
recur(recur: (ast: AST) => AST) {
|
|
2609
|
+
return this.rebuild(recur, this.checks, this.encodingChecks)
|
|
2610
|
+
}
|
|
2611
|
+
/** @internal */
|
|
2612
|
+
flip(recur: (ast: AST) => AST) {
|
|
2613
|
+
return this.rebuild(recur, this.encodingChecks, this.checks)
|
|
2614
|
+
}
|
|
2615
|
+
/** @internal */
|
|
2616
|
+
getExpected(getExpected: (ast: AST) => string): string {
|
|
2617
|
+
const expected = this.annotations?.expected
|
|
2618
|
+
if (typeof expected === "string") return expected
|
|
2619
|
+
|
|
2620
|
+
if (this.types.length === 0) return "never"
|
|
2621
|
+
|
|
2622
|
+
const types = this.types.map((type) => {
|
|
2623
|
+
const encoded = toEncoded(type)
|
|
2624
|
+
switch (encoded._tag) {
|
|
2625
|
+
case "Arrays": {
|
|
2626
|
+
const literals = encoded.elements.filter(isLiteral)
|
|
2627
|
+
if (literals.length > 0) {
|
|
2628
|
+
return `${formatIsMutable(encoded.isMutable)}[ ${
|
|
2629
|
+
literals.map((e) => getExpected(e) + formatIsOptional(e.context?.isOptional)).join(", ")
|
|
2630
|
+
}, ... ]`
|
|
2631
|
+
}
|
|
2632
|
+
break
|
|
2633
|
+
}
|
|
2634
|
+
case "Objects": {
|
|
2635
|
+
const literals = encoded.propertySignatures.filter((ps) => isLiteral(ps.type))
|
|
2636
|
+
if (literals.length > 0) {
|
|
2637
|
+
return `{ ${
|
|
2638
|
+
literals.map((ps) =>
|
|
2639
|
+
`${formatIsMutable(ps.type.context?.isMutable)}${formatPropertyKey(ps.name)}${
|
|
2640
|
+
formatIsOptional(ps.type.context?.isOptional)
|
|
2641
|
+
}: ${getExpected(ps.type)}`
|
|
2642
|
+
).join(", ")
|
|
2643
|
+
}, ... }`
|
|
2644
|
+
}
|
|
2645
|
+
break
|
|
2646
|
+
}
|
|
2647
|
+
}
|
|
2648
|
+
return getExpected(encoded)
|
|
2649
|
+
})
|
|
2650
|
+
return Array.from(new Set(types)).join(" | ")
|
|
2651
|
+
}
|
|
2652
|
+
}
|
|
2653
|
+
|
|
2654
|
+
const parseUnion = iterateEager<{
|
|
2655
|
+
readonly recur: (ast: AST) => SchemaParser.Parser
|
|
2656
|
+
readonly ast: Union
|
|
2657
|
+
readonly oinput: Option.Option<unknown>
|
|
2658
|
+
readonly input: unknown
|
|
2659
|
+
readonly options: ParseOptions
|
|
2660
|
+
out: Option.Option<unknown> | undefined
|
|
2661
|
+
successes: Array<AST>
|
|
2662
|
+
issues: Array<SchemaIssue.Issue> | undefined
|
|
2663
|
+
}, AST>()({
|
|
2664
|
+
onItem(s, ast) {
|
|
2665
|
+
const parser = s.recur(ast)
|
|
2666
|
+
return parser(s.oinput, s.options)
|
|
2667
|
+
},
|
|
2668
|
+
step(s, candidate, exit) {
|
|
2669
|
+
if (exit._tag === "Failure") {
|
|
2670
|
+
const issue = InternalSchemaCause.getSchemaIssue(exit.cause)
|
|
2671
|
+
if (issue === undefined) {
|
|
2672
|
+
return exit
|
|
2673
|
+
}
|
|
2674
|
+
if (s.issues) s.issues.push(issue)
|
|
2675
|
+
else s.issues = [issue]
|
|
2676
|
+
} else {
|
|
2677
|
+
if (s.out && s.ast.mode === "oneOf") {
|
|
2678
|
+
s.successes.push(candidate)
|
|
2679
|
+
return Exit.fail(new SchemaIssue.OneOf(s.ast, s.input, s.successes))
|
|
2680
|
+
}
|
|
2681
|
+
s.out = exit.value
|
|
2682
|
+
s.successes.push(candidate)
|
|
2683
|
+
if (s.ast.mode === "anyOf") {
|
|
2684
|
+
return Exit.void
|
|
2685
|
+
}
|
|
2686
|
+
}
|
|
2687
|
+
}
|
|
2688
|
+
})
|
|
2689
|
+
|
|
2690
|
+
const nonFiniteLiterals = new Union([
|
|
2691
|
+
new Literal("Infinity"),
|
|
2692
|
+
new Literal("-Infinity"),
|
|
2693
|
+
new Literal("NaN")
|
|
2694
|
+
], "anyOf")
|
|
2695
|
+
|
|
2696
|
+
const numberToJson = new Link(
|
|
2697
|
+
new Union([number, nonFiniteLiterals], "anyOf"),
|
|
2698
|
+
new SchemaTransformation.Transformation(
|
|
2699
|
+
SchemaGetter.Number(),
|
|
2700
|
+
SchemaGetter.transform((n) => globalThis.Number.isFinite(n) ? n : globalThis.String(n))
|
|
2701
|
+
)
|
|
2702
|
+
)
|
|
2703
|
+
|
|
2704
|
+
function formatIsMutable(isMutable: boolean | undefined): string {
|
|
2705
|
+
return isMutable ? "" : "readonly "
|
|
2706
|
+
}
|
|
2707
|
+
|
|
2708
|
+
function formatIsOptional(isOptional: boolean | undefined): string {
|
|
2709
|
+
return isOptional ? "?" : ""
|
|
2710
|
+
}
|
|
2711
|
+
|
|
2712
|
+
/** @internal */
|
|
2713
|
+
export function memoizeThunk<A>(f: () => A): () => A {
|
|
2714
|
+
let done = false
|
|
2715
|
+
let a: A
|
|
2716
|
+
return () => {
|
|
2717
|
+
if (done) {
|
|
2718
|
+
return a
|
|
2719
|
+
}
|
|
2720
|
+
a = f()
|
|
2721
|
+
done = true
|
|
2722
|
+
return a
|
|
2723
|
+
}
|
|
2724
|
+
}
|
|
2725
|
+
|
|
2726
|
+
/**
|
|
2727
|
+
* AST node for lazy/recursive schemas.
|
|
2728
|
+
*
|
|
2729
|
+
* **Details**
|
|
2730
|
+
*
|
|
2731
|
+
* Wraps a thunk (`() => AST`) that is memoized on first call. Use this to
|
|
2732
|
+
* define recursive or mutually recursive schemas without infinite loops at
|
|
2733
|
+
* construction time.
|
|
2734
|
+
*
|
|
2735
|
+
* **Example** (Defining recursive schema ASTs)
|
|
2736
|
+
*
|
|
2737
|
+
* ```ts
|
|
2738
|
+
* import { Schema, SchemaAST } from "effect"
|
|
2739
|
+
*
|
|
2740
|
+
* interface Category {
|
|
2741
|
+
* readonly name: string
|
|
2742
|
+
* readonly children: ReadonlyArray<Category>
|
|
2743
|
+
* }
|
|
2744
|
+
*
|
|
2745
|
+
* const Category = Schema.Struct({
|
|
2746
|
+
* name: Schema.String,
|
|
2747
|
+
* children: Schema.Array(Schema.suspend((): Schema.Codec<Category> => Category))
|
|
2748
|
+
* })
|
|
2749
|
+
*
|
|
2750
|
+
* // The recursive branch is a Suspend node
|
|
2751
|
+
* ```
|
|
2752
|
+
*
|
|
2753
|
+
* @see {@link isSuspend}
|
|
2754
|
+
* @category models
|
|
2755
|
+
* @since 3.10.0
|
|
2756
|
+
*/
|
|
2757
|
+
export class Suspend extends Base {
|
|
2758
|
+
readonly _tag = "Suspend"
|
|
2759
|
+
readonly thunk: () => AST
|
|
2760
|
+
|
|
2761
|
+
constructor(
|
|
2762
|
+
thunk: () => AST,
|
|
2763
|
+
annotations?: Schema.Annotations.Annotations,
|
|
2764
|
+
checks?: Checks,
|
|
2765
|
+
encoding?: Encoding,
|
|
2766
|
+
context?: Context
|
|
2767
|
+
) {
|
|
2768
|
+
if (checks !== undefined) {
|
|
2769
|
+
throw new Error("Cannot add checks to Suspend")
|
|
2770
|
+
}
|
|
2771
|
+
super(annotations, undefined, encoding, context)
|
|
2772
|
+
this.thunk = memoizeThunk(thunk)
|
|
2773
|
+
}
|
|
2774
|
+
/** @internal */
|
|
2775
|
+
getParser(recur: (ast: AST) => SchemaParser.Parser): SchemaParser.Parser {
|
|
2776
|
+
return recur(this.thunk())
|
|
2777
|
+
}
|
|
2778
|
+
/** @internal */
|
|
2779
|
+
recur(recur: (ast: AST) => AST) {
|
|
2780
|
+
return new Suspend(
|
|
2781
|
+
() => recur(this.thunk()),
|
|
2782
|
+
this.annotations,
|
|
2783
|
+
undefined,
|
|
2784
|
+
undefined,
|
|
2785
|
+
this.context
|
|
2786
|
+
)
|
|
2787
|
+
}
|
|
2788
|
+
/** @internal */
|
|
2789
|
+
getExpected(getExpected: (ast: AST) => string): string {
|
|
2790
|
+
return getExpected(this.thunk())
|
|
2791
|
+
}
|
|
2792
|
+
}
|
|
2793
|
+
|
|
2794
|
+
/** @internal */
|
|
2795
|
+
export function getEncodingChecks(ast: AST): Checks | undefined {
|
|
2796
|
+
switch (ast._tag) {
|
|
2797
|
+
case "Declaration":
|
|
2798
|
+
case "Arrays":
|
|
2799
|
+
case "Objects":
|
|
2800
|
+
case "Union":
|
|
2801
|
+
return ast.encodingChecks
|
|
2802
|
+
default:
|
|
2803
|
+
return undefined
|
|
2804
|
+
}
|
|
2805
|
+
}
|
|
2806
|
+
|
|
2807
|
+
// -----------------------------------------------------------------------------
|
|
2808
|
+
// Checks
|
|
2809
|
+
// -----------------------------------------------------------------------------
|
|
2810
|
+
|
|
2811
|
+
/**
|
|
2812
|
+
* Represents a single validation check attached to an AST node.
|
|
2813
|
+
*
|
|
2814
|
+
* **Details**
|
|
2815
|
+
*
|
|
2816
|
+
* - `run` — the validation function. Returns `undefined` on success, or an
|
|
2817
|
+
* `Issue` on failure.
|
|
2818
|
+
* - `annotations` — optional filter-level metadata (expected message, meta
|
|
2819
|
+
* tags, arbitrary constraint hints).
|
|
2820
|
+
* - `aborted` — when `true`, parsing stops immediately after this filter
|
|
2821
|
+
* fails (no further checks run).
|
|
2822
|
+
*
|
|
2823
|
+
* Use `.annotate()` to add metadata and `.abort()` to mark as aborting.
|
|
2824
|
+
* Combine with another check via `.and()` to form a {@link FilterGroup}.
|
|
2825
|
+
*
|
|
2826
|
+
* @see {@link FilterGroup}
|
|
2827
|
+
* @see {@link Check}
|
|
2828
|
+
* @see {@link isPattern}
|
|
2829
|
+
* @category models
|
|
2830
|
+
* @since 4.0.0
|
|
2831
|
+
*/
|
|
2832
|
+
export class Filter<in E> extends Pipeable.Class {
|
|
2833
|
+
readonly _tag = "Filter"
|
|
2834
|
+
readonly run: (input: E, self: AST, options: ParseOptions) => SchemaIssue.Issue | undefined
|
|
2835
|
+
readonly annotations: Schema.Annotations.Filter | undefined
|
|
2836
|
+
/**
|
|
2837
|
+
* Whether the parsing process should be aborted after this check has failed.
|
|
2838
|
+
*/
|
|
2839
|
+
readonly aborted: boolean
|
|
2840
|
+
|
|
2841
|
+
constructor(
|
|
2842
|
+
run: (input: E, self: AST, options: ParseOptions) => SchemaIssue.Issue | undefined,
|
|
2843
|
+
annotations: Schema.Annotations.Filter | undefined = undefined,
|
|
2844
|
+
/**
|
|
2845
|
+
* Whether the parsing process should be aborted after this check has failed.
|
|
2846
|
+
*/
|
|
2847
|
+
aborted: boolean = false
|
|
2848
|
+
) {
|
|
2849
|
+
super()
|
|
2850
|
+
this.run = run
|
|
2851
|
+
this.annotations = annotations
|
|
2852
|
+
this.aborted = aborted
|
|
2853
|
+
}
|
|
2854
|
+
annotate(annotations: Schema.Annotations.Filter): Filter<E> {
|
|
2855
|
+
return new Filter(this.run, { ...this.annotations, ...annotations }, this.aborted)
|
|
2856
|
+
}
|
|
2857
|
+
abort(): Filter<E> {
|
|
2858
|
+
return new Filter(this.run, this.annotations, true)
|
|
2859
|
+
}
|
|
2860
|
+
and(other: Check<E>, annotations?: Schema.Annotations.Filter): FilterGroup<E>
|
|
2861
|
+
and(other: Check<E>, annotations?: Schema.Annotations.Filter): FilterGroup<E> {
|
|
2862
|
+
return new FilterGroup([this, other], annotations)
|
|
2863
|
+
}
|
|
2864
|
+
}
|
|
2865
|
+
|
|
2866
|
+
/**
|
|
2867
|
+
* Represents a composite validation check grouping multiple {@link Check} values.
|
|
2868
|
+
*
|
|
2869
|
+
* **Details**
|
|
2870
|
+
*
|
|
2871
|
+
* Created by calling `.and()` on a {@link Filter} or another `FilterGroup`.
|
|
2872
|
+
* All inner checks are run; failures from aborted filters still stop
|
|
2873
|
+
* evaluation.
|
|
2874
|
+
*
|
|
2875
|
+
* @see {@link Filter}
|
|
2876
|
+
* @see {@link Check}
|
|
2877
|
+
* @category models
|
|
2878
|
+
* @since 4.0.0
|
|
2879
|
+
*/
|
|
2880
|
+
export class FilterGroup<in E> extends Pipeable.Class {
|
|
2881
|
+
readonly _tag = "FilterGroup"
|
|
2882
|
+
readonly checks: readonly [Check<E>, ...Array<Check<E>>]
|
|
2883
|
+
readonly annotations: Schema.Annotations.Filter | undefined
|
|
2884
|
+
|
|
2885
|
+
constructor(
|
|
2886
|
+
checks: readonly [Check<E>, ...Array<Check<E>>],
|
|
2887
|
+
annotations: Schema.Annotations.Filter | undefined = undefined
|
|
2888
|
+
) {
|
|
2889
|
+
super()
|
|
2890
|
+
this.checks = checks
|
|
2891
|
+
this.annotations = annotations
|
|
2892
|
+
}
|
|
2893
|
+
annotate(annotations: Schema.Annotations.Filter): FilterGroup<E> {
|
|
2894
|
+
return new FilterGroup(this.checks, { ...this.annotations, ...annotations })
|
|
2895
|
+
}
|
|
2896
|
+
and(other: Check<E>, annotations?: Schema.Annotations.Filter): FilterGroup<E>
|
|
2897
|
+
and(other: Check<E>, annotations?: Schema.Annotations.Filter): FilterGroup<E> {
|
|
2898
|
+
return new FilterGroup([this, other], annotations)
|
|
2899
|
+
}
|
|
2900
|
+
}
|
|
2901
|
+
|
|
2902
|
+
/**
|
|
2903
|
+
* A validation check — either a single {@link Filter} or a composite
|
|
2904
|
+
* {@link FilterGroup}.
|
|
2905
|
+
*
|
|
2906
|
+
* **Details**
|
|
2907
|
+
*
|
|
2908
|
+
* Stored in the {@link Checks} array on {@link Base.checks}.
|
|
2909
|
+
*
|
|
2910
|
+
* @see {@link Filter}
|
|
2911
|
+
* @see {@link FilterGroup}
|
|
2912
|
+
* @category models
|
|
2913
|
+
* @since 4.0.0
|
|
2914
|
+
*/
|
|
2915
|
+
export type Check<T> = Filter<T> | FilterGroup<T>
|
|
2916
|
+
|
|
2917
|
+
/** @internal */
|
|
2918
|
+
export function makeFilter<T>(
|
|
2919
|
+
filter: (input: T, ast: AST, options: ParseOptions) => Schema.FilterOutput,
|
|
2920
|
+
annotations?: Schema.Annotations.Filter | undefined,
|
|
2921
|
+
aborted: boolean = false
|
|
2922
|
+
): Filter<T> {
|
|
2923
|
+
return new Filter(
|
|
2924
|
+
(input, ast, options) => SchemaIssue.make(input, ast, filter(input, ast, options)),
|
|
2925
|
+
annotations,
|
|
2926
|
+
aborted
|
|
2927
|
+
)
|
|
2928
|
+
}
|
|
2929
|
+
|
|
2930
|
+
/** @internal */
|
|
2931
|
+
export function makeFilterByGuard<T extends E, E>(
|
|
2932
|
+
is: (value: E) => value is T,
|
|
2933
|
+
annotations?: Schema.Annotations.Filter
|
|
2934
|
+
): Filter<any> {
|
|
2935
|
+
return new Filter(
|
|
2936
|
+
(input: E) => is(input) ? undefined : new SchemaIssue.InvalidValue(Option.some(input)),
|
|
2937
|
+
annotations,
|
|
2938
|
+
true // after a guard, we always want to abort
|
|
2939
|
+
)
|
|
2940
|
+
}
|
|
2941
|
+
|
|
2942
|
+
/**
|
|
2943
|
+
* Creates a {@link Filter} that validates strings by running `RegExp.test`.
|
|
2944
|
+
*
|
|
2945
|
+
* **When to use**
|
|
2946
|
+
*
|
|
2947
|
+
* Use when string validation should be represented as a schema `Filter` backed
|
|
2948
|
+
* by a regular expression.
|
|
2949
|
+
*
|
|
2950
|
+
* **Details**
|
|
2951
|
+
*
|
|
2952
|
+
* The filter can be used with `Schema.filter` or attached directly to a
|
|
2953
|
+
* `String` AST node through checks. The regular expression source is stored in
|
|
2954
|
+
* annotations for serialization and arbitrary generation.
|
|
2955
|
+
*
|
|
2956
|
+
* **Gotchas**
|
|
2957
|
+
*
|
|
2958
|
+
* Use a non-global, non-sticky regular expression, or reset `lastIndex`
|
|
2959
|
+
* yourself, because `RegExp.test` is stateful for expressions with the `g` or
|
|
2960
|
+
* `y` flag.
|
|
2961
|
+
*
|
|
2962
|
+
* **Example** (Validating an email pattern)
|
|
2963
|
+
*
|
|
2964
|
+
* ```ts
|
|
2965
|
+
* import { SchemaAST } from "effect"
|
|
2966
|
+
*
|
|
2967
|
+
* const emailFilter = SchemaAST.isPattern(/^[^@]+@[^@]+$/)
|
|
2968
|
+
* ```
|
|
2969
|
+
*
|
|
2970
|
+
* @see {@link Filter}
|
|
2971
|
+
* @category constructors
|
|
2972
|
+
* @since 4.0.0
|
|
2973
|
+
*/
|
|
2974
|
+
export function isPattern(regExp: globalThis.RegExp, annotations?: Schema.Annotations.Filter) {
|
|
2975
|
+
const source = regExp.source
|
|
2976
|
+
return makeFilter(
|
|
2977
|
+
(s: string) => regExp.test(s),
|
|
2978
|
+
{
|
|
2979
|
+
expected: `a string matching the RegExp ${source}`,
|
|
2980
|
+
meta: {
|
|
2981
|
+
_tag: "isPattern",
|
|
2982
|
+
regExp
|
|
2983
|
+
},
|
|
2984
|
+
arbitrary: {
|
|
2985
|
+
constraint: {
|
|
2986
|
+
patterns: [regExp.source]
|
|
2987
|
+
}
|
|
2988
|
+
},
|
|
2989
|
+
...annotations
|
|
2990
|
+
}
|
|
2991
|
+
)
|
|
2992
|
+
}
|
|
2993
|
+
|
|
2994
|
+
function modifyOwnPropertyDescriptors<A extends AST>(
|
|
2995
|
+
ast: A,
|
|
2996
|
+
f: (
|
|
2997
|
+
d: { [P in keyof A]: TypedPropertyDescriptor<A[P]> }
|
|
2998
|
+
) => void
|
|
2999
|
+
): A {
|
|
3000
|
+
const d = Object.getOwnPropertyDescriptors(ast)
|
|
3001
|
+
f(d)
|
|
3002
|
+
return Object.create(Object.getPrototypeOf(ast), d)
|
|
3003
|
+
}
|
|
3004
|
+
|
|
3005
|
+
/** @internal */
|
|
3006
|
+
export function replaceEncoding<A extends AST>(ast: A, encoding: Encoding | undefined): A {
|
|
3007
|
+
if (ast.encoding === encoding) {
|
|
3008
|
+
return ast
|
|
3009
|
+
}
|
|
3010
|
+
return modifyOwnPropertyDescriptors(ast, (d) => {
|
|
3011
|
+
d.encoding.value = encoding
|
|
3012
|
+
})
|
|
3013
|
+
}
|
|
3014
|
+
|
|
3015
|
+
/** @internal */
|
|
3016
|
+
export function replaceContext<A extends AST>(ast: A, context: Context | undefined): A {
|
|
3017
|
+
if (ast.context === context) {
|
|
3018
|
+
return ast
|
|
3019
|
+
}
|
|
3020
|
+
return modifyOwnPropertyDescriptors(ast, (d) => {
|
|
3021
|
+
d.context.value = context
|
|
3022
|
+
})
|
|
3023
|
+
}
|
|
3024
|
+
|
|
3025
|
+
/** @internal */
|
|
3026
|
+
export function getLastEncoding(ast: AST): AST {
|
|
3027
|
+
return ast.encoding ? getLastEncoding(ast.encoding[ast.encoding.length - 1].to) : ast
|
|
3028
|
+
}
|
|
3029
|
+
|
|
3030
|
+
/** @internal */
|
|
3031
|
+
export function annotate<A extends AST>(ast: A, annotations: Schema.Annotations.Annotations): A {
|
|
3032
|
+
if (ast.checks) {
|
|
3033
|
+
const last = ast.checks[ast.checks.length - 1]
|
|
3034
|
+
return replaceChecks(ast, Arr.append(ast.checks.slice(0, -1), last.annotate(annotations)))
|
|
3035
|
+
}
|
|
3036
|
+
return modifyOwnPropertyDescriptors(ast, (d) => {
|
|
3037
|
+
d.annotations.value = { ...d.annotations.value, ...annotations }
|
|
3038
|
+
})
|
|
3039
|
+
}
|
|
3040
|
+
|
|
3041
|
+
/** @internal */
|
|
3042
|
+
export function replaceChecks<A extends AST>(ast: A, checks: Checks | undefined): A {
|
|
3043
|
+
if (ast._tag === "Suspend" && checks !== undefined) {
|
|
3044
|
+
throw new Error("Cannot add checks to Suspend")
|
|
3045
|
+
}
|
|
3046
|
+
if (ast.checks === checks) {
|
|
3047
|
+
return ast
|
|
3048
|
+
}
|
|
3049
|
+
return modifyOwnPropertyDescriptors(ast, (d) => {
|
|
3050
|
+
d.checks.value = checks
|
|
3051
|
+
})
|
|
3052
|
+
}
|
|
3053
|
+
|
|
3054
|
+
/** @internal */
|
|
3055
|
+
export function appendChecks<A extends AST>(ast: A, checks: Checks): A {
|
|
3056
|
+
return replaceChecks(ast, ast.checks ? [...ast.checks, ...checks] : checks)
|
|
3057
|
+
}
|
|
3058
|
+
|
|
3059
|
+
function updateLastLink(encoding: Encoding, f: (ast: AST) => AST): Encoding {
|
|
3060
|
+
const links = encoding
|
|
3061
|
+
const last = links[links.length - 1]
|
|
3062
|
+
const to = f(last.to)
|
|
3063
|
+
if (to !== last.to) {
|
|
3064
|
+
return Arr.append(encoding.slice(0, encoding.length - 1), new Link(to, last.transformation))
|
|
3065
|
+
}
|
|
3066
|
+
return encoding
|
|
3067
|
+
}
|
|
3068
|
+
|
|
3069
|
+
/** @internal */
|
|
3070
|
+
export function applyToLastLink(f: (ast: AST) => AST) {
|
|
3071
|
+
return <A extends AST>(ast: A): A => ast.encoding ? replaceEncoding(ast, updateLastLink(ast.encoding, f)) : ast
|
|
3072
|
+
}
|
|
3073
|
+
|
|
3074
|
+
/** @internal */
|
|
3075
|
+
export function middlewareDecoding(
|
|
3076
|
+
ast: AST,
|
|
3077
|
+
middleware: SchemaTransformation.Middleware<any, any, any, any, any, any>
|
|
3078
|
+
): AST {
|
|
3079
|
+
return appendTransformation(ast, middleware, toType(ast))
|
|
3080
|
+
}
|
|
3081
|
+
|
|
3082
|
+
/** @internal */
|
|
3083
|
+
export function middlewareEncoding(
|
|
3084
|
+
ast: AST,
|
|
3085
|
+
middleware: SchemaTransformation.Middleware<any, any, any, any, any, any>
|
|
3086
|
+
): AST {
|
|
3087
|
+
return appendTransformation(toEncoded(ast), middleware, ast)
|
|
3088
|
+
}
|
|
3089
|
+
|
|
3090
|
+
function appendTransformation<A extends AST>(
|
|
3091
|
+
from: AST,
|
|
3092
|
+
transformation:
|
|
3093
|
+
| SchemaTransformation.Transformation<any, any, any, any>
|
|
3094
|
+
| SchemaTransformation.Middleware<any, any, any, any, any, any>,
|
|
3095
|
+
to: A
|
|
3096
|
+
): A {
|
|
3097
|
+
const link = new Link(from, transformation)
|
|
3098
|
+
return replaceEncoding(to, to.encoding ? [...to.encoding, link] : [link])
|
|
3099
|
+
}
|
|
3100
|
+
|
|
3101
|
+
/** @internal */
|
|
3102
|
+
export function brand(ast: AST, brand: string): AST {
|
|
3103
|
+
const existing = InternalAnnotations.resolveBrands(ast)
|
|
3104
|
+
const brands = existing ? [...existing, brand] : [brand]
|
|
3105
|
+
return annotate(ast, { brands })
|
|
3106
|
+
}
|
|
3107
|
+
|
|
3108
|
+
/**
|
|
3109
|
+
* Maps over the array but will return the original array if no changes occur.
|
|
3110
|
+
* @internal
|
|
3111
|
+
*/
|
|
3112
|
+
export function mapOrSame<A>(as: Arr.NonEmptyReadonlyArray<A>, f: (a: A) => A): Arr.NonEmptyReadonlyArray<A>
|
|
3113
|
+
export function mapOrSame<A>(as: ReadonlyArray<A>, f: (a: A) => A): ReadonlyArray<A>
|
|
3114
|
+
export function mapOrSame<A>(as: ReadonlyArray<A>, f: (a: A) => A): ReadonlyArray<A> {
|
|
3115
|
+
let changed = false
|
|
3116
|
+
const out: Array<A> = new Array(as.length)
|
|
3117
|
+
for (let i = 0; i < as.length; i++) {
|
|
3118
|
+
const a = as[i]
|
|
3119
|
+
const fa = f(a)
|
|
3120
|
+
if (fa !== a) {
|
|
3121
|
+
changed = true
|
|
3122
|
+
}
|
|
3123
|
+
out[i] = fa
|
|
3124
|
+
}
|
|
3125
|
+
return changed ? out : as
|
|
3126
|
+
}
|
|
3127
|
+
|
|
3128
|
+
/** @internal */
|
|
3129
|
+
export function annotateKey<A extends AST>(ast: A, annotations: Schema.Annotations.Key<unknown>): A {
|
|
3130
|
+
const context = ast.context ?
|
|
3131
|
+
new Context(
|
|
3132
|
+
ast.context.isOptional,
|
|
3133
|
+
ast.context.isMutable,
|
|
3134
|
+
ast.context.defaultValue,
|
|
3135
|
+
{ ...ast.context.annotations, ...annotations }
|
|
3136
|
+
) :
|
|
3137
|
+
new Context(false, false, undefined, annotations)
|
|
3138
|
+
return replaceContext(ast, context)
|
|
3139
|
+
}
|
|
3140
|
+
|
|
3141
|
+
/** @internal */
|
|
3142
|
+
export const optionalKeyLastLink = applyToLastLink(optionalKey)
|
|
3143
|
+
|
|
3144
|
+
/**
|
|
3145
|
+
* Marks an AST node's property key as optional by setting
|
|
3146
|
+
* {@link Context.isOptional} to `true`.
|
|
3147
|
+
*
|
|
3148
|
+
* **Details**
|
|
3149
|
+
*
|
|
3150
|
+
* Also propagates the optional flag through the last link of the encoding
|
|
3151
|
+
* chain if present.
|
|
3152
|
+
*
|
|
3153
|
+
* @see {@link isOptional}
|
|
3154
|
+
* @see {@link Context}
|
|
3155
|
+
* @category transforming
|
|
3156
|
+
* @since 4.0.0
|
|
3157
|
+
*/
|
|
3158
|
+
export function optionalKey<A extends AST>(ast: A): A {
|
|
3159
|
+
const context = ast.context ?
|
|
3160
|
+
ast.context.isOptional === false ?
|
|
3161
|
+
new Context(true, ast.context.isMutable, ast.context.defaultValue, ast.context.annotations) :
|
|
3162
|
+
ast.context :
|
|
3163
|
+
new Context(true, false)
|
|
3164
|
+
return optionalKeyLastLink(replaceContext(ast, context))
|
|
3165
|
+
}
|
|
3166
|
+
|
|
3167
|
+
const mutableKeyLastLink = applyToLastLink(mutableKey)
|
|
3168
|
+
|
|
3169
|
+
/** @internal */
|
|
3170
|
+
export function mutableKey<A extends AST>(ast: A): A {
|
|
3171
|
+
const context = ast.context ?
|
|
3172
|
+
ast.context.isMutable === false ?
|
|
3173
|
+
new Context(ast.context.isOptional, true, ast.context.defaultValue, ast.context.annotations) :
|
|
3174
|
+
ast.context :
|
|
3175
|
+
new Context(false, true)
|
|
3176
|
+
return mutableKeyLastLink(replaceContext(ast, context))
|
|
3177
|
+
}
|
|
3178
|
+
|
|
3179
|
+
/** @internal */
|
|
3180
|
+
export function withConstructorDefault<A extends AST>(
|
|
3181
|
+
ast: A,
|
|
3182
|
+
defaultValue: Effect.Effect<unknown, SchemaIssue.Issue>
|
|
3183
|
+
): A {
|
|
3184
|
+
const transformation = new SchemaTransformation.Transformation(
|
|
3185
|
+
SchemaGetter.withDefault(defaultValue),
|
|
3186
|
+
SchemaGetter.passthrough()
|
|
3187
|
+
)
|
|
3188
|
+
const encoding: Encoding = [new Link(unknown, transformation)]
|
|
3189
|
+
const context = ast.context ?
|
|
3190
|
+
new Context(ast.context.isOptional, ast.context.isMutable, encoding, ast.context.annotations) :
|
|
3191
|
+
new Context(false, false, encoding)
|
|
3192
|
+
return replaceContext(ast, context)
|
|
3193
|
+
}
|
|
3194
|
+
|
|
3195
|
+
/**
|
|
3196
|
+
* Attaches a `Transformation` to the `to` AST, making it decode from the
|
|
3197
|
+
* `from` AST and encode back to it.
|
|
3198
|
+
*
|
|
3199
|
+
* **Details**
|
|
3200
|
+
*
|
|
3201
|
+
* This is the low-level primitive behind `Schema.transform` and
|
|
3202
|
+
* `Schema.transformOrFail`. It appends a {@link Link} to the `to` node's
|
|
3203
|
+
* encoding chain.
|
|
3204
|
+
*
|
|
3205
|
+
* - Returns a new AST with the same type as `to`.
|
|
3206
|
+
*
|
|
3207
|
+
* @see {@link Link}
|
|
3208
|
+
* @see {@link Encoding}
|
|
3209
|
+
* @see {@link flip}
|
|
3210
|
+
* @category transforming
|
|
3211
|
+
* @since 4.0.0
|
|
3212
|
+
*/
|
|
3213
|
+
export function decodeTo<A extends AST>(
|
|
3214
|
+
from: AST,
|
|
3215
|
+
to: A,
|
|
3216
|
+
transformation: SchemaTransformation.Transformation<any, any, any, any>
|
|
3217
|
+
): A {
|
|
3218
|
+
return appendTransformation(from, transformation, to)
|
|
3219
|
+
}
|
|
3220
|
+
|
|
3221
|
+
function parseParameter(ast: AST): {
|
|
3222
|
+
literals: ReadonlyArray<PropertyKey>
|
|
3223
|
+
parameters: ReadonlyArray<AST>
|
|
3224
|
+
} {
|
|
3225
|
+
switch (ast._tag) {
|
|
3226
|
+
case "Literal":
|
|
3227
|
+
return {
|
|
3228
|
+
literals: Predicate.isPropertyKey(ast.literal) ? [ast.literal] : [],
|
|
3229
|
+
parameters: []
|
|
3230
|
+
}
|
|
3231
|
+
case "UniqueSymbol":
|
|
3232
|
+
return {
|
|
3233
|
+
literals: [ast.symbol],
|
|
3234
|
+
parameters: []
|
|
3235
|
+
}
|
|
3236
|
+
case "String":
|
|
3237
|
+
case "Number":
|
|
3238
|
+
case "Symbol":
|
|
3239
|
+
case "TemplateLiteral":
|
|
3240
|
+
return {
|
|
3241
|
+
literals: [],
|
|
3242
|
+
parameters: [ast]
|
|
3243
|
+
}
|
|
3244
|
+
case "Union": {
|
|
3245
|
+
const out: {
|
|
3246
|
+
literals: ReadonlyArray<PropertyKey>
|
|
3247
|
+
parameters: ReadonlyArray<AST>
|
|
3248
|
+
} = { literals: [], parameters: [] }
|
|
3249
|
+
for (let i = 0; i < ast.types.length; i++) {
|
|
3250
|
+
const parsed = parseParameter(ast.types[i])
|
|
3251
|
+
out.literals = out.literals.concat(parsed.literals)
|
|
3252
|
+
out.parameters = out.parameters.concat(parsed.parameters)
|
|
3253
|
+
}
|
|
3254
|
+
return out
|
|
3255
|
+
}
|
|
3256
|
+
}
|
|
3257
|
+
return { literals: [], parameters: [] }
|
|
3258
|
+
}
|
|
3259
|
+
|
|
3260
|
+
/** @internal */
|
|
3261
|
+
export function record(key: AST, value: AST, keyValueCombiner: KeyValueCombiner | undefined): Objects {
|
|
3262
|
+
const { literals, parameters: indexSignatures } = parseParameter(key)
|
|
3263
|
+
return new Objects(
|
|
3264
|
+
literals.map((literal) => new PropertySignature(literal, value)),
|
|
3265
|
+
indexSignatures.map((parameter) => new IndexSignature(parameter, value, keyValueCombiner))
|
|
3266
|
+
)
|
|
3267
|
+
}
|
|
3268
|
+
|
|
3269
|
+
// -------------------------------------------------------------------------------------
|
|
3270
|
+
// Public APIs
|
|
3271
|
+
// -------------------------------------------------------------------------------------
|
|
3272
|
+
|
|
3273
|
+
/**
|
|
3274
|
+
* Returns `true` if the AST node represents an optional property.
|
|
3275
|
+
*
|
|
3276
|
+
* **Details**
|
|
3277
|
+
*
|
|
3278
|
+
* Checks `ast.context?.isOptional`. Defaults to `false` when no
|
|
3279
|
+
* {@link Context} is set.
|
|
3280
|
+
*
|
|
3281
|
+
* @see {@link optionalKey}
|
|
3282
|
+
* @see {@link Context}
|
|
3283
|
+
* @category predicates
|
|
3284
|
+
* @since 4.0.0
|
|
3285
|
+
*/
|
|
3286
|
+
export function isOptional(ast: AST): boolean {
|
|
3287
|
+
return ast.context?.isOptional ?? false
|
|
3288
|
+
}
|
|
3289
|
+
|
|
3290
|
+
/** @internal */
|
|
3291
|
+
export function isMutable(ast: AST): boolean {
|
|
3292
|
+
return ast.context?.isMutable ?? false
|
|
3293
|
+
}
|
|
3294
|
+
|
|
3295
|
+
/**
|
|
3296
|
+
* Strips all encoding transformations from an AST, returning the decoded
|
|
3297
|
+
* (type-level) representation.
|
|
3298
|
+
*
|
|
3299
|
+
* **Details**
|
|
3300
|
+
*
|
|
3301
|
+
* - Memoized: same input reference → same output reference.
|
|
3302
|
+
* - Recursively walks into composite nodes ({@link Arrays}, {@link Objects},
|
|
3303
|
+
* {@link Union}, {@link Suspend}).
|
|
3304
|
+
*
|
|
3305
|
+
* **Example** (Getting the type AST)
|
|
3306
|
+
*
|
|
3307
|
+
* ```ts
|
|
3308
|
+
* import { Schema, SchemaAST } from "effect"
|
|
3309
|
+
*
|
|
3310
|
+
* const schema = Schema.NumberFromString
|
|
3311
|
+
* const typeAst = SchemaAST.toType(schema.ast)
|
|
3312
|
+
* console.log(typeAst._tag) // "Number"
|
|
3313
|
+
* ```
|
|
3314
|
+
*
|
|
3315
|
+
* @see {@link toEncoded}
|
|
3316
|
+
* @see {@link flip}
|
|
3317
|
+
* @category transforming
|
|
3318
|
+
* @since 4.0.0
|
|
3319
|
+
*/
|
|
3320
|
+
export const toType = memoize(<A extends AST>(ast: A): A => {
|
|
3321
|
+
if (ast.encoding) {
|
|
3322
|
+
return toType(replaceEncoding(ast, undefined))
|
|
3323
|
+
}
|
|
3324
|
+
const out: any = ast
|
|
3325
|
+
const type = out.recur?.(toType) ?? out
|
|
3326
|
+
if (getEncodingChecks(type)) {
|
|
3327
|
+
return modifyOwnPropertyDescriptors(type, (d) => {
|
|
3328
|
+
d.encodingChecks.value = undefined
|
|
3329
|
+
})
|
|
3330
|
+
}
|
|
3331
|
+
return type
|
|
3332
|
+
})
|
|
3333
|
+
|
|
3334
|
+
/**
|
|
3335
|
+
* Returns the encoded (wire-format) AST by flipping and then stripping
|
|
3336
|
+
* encodings.
|
|
3337
|
+
*
|
|
3338
|
+
* **Details**
|
|
3339
|
+
*
|
|
3340
|
+
* Equivalent to `toType(flip(ast))`. This gives you the AST that describes
|
|
3341
|
+
* the shape of the serialized/encoded data.
|
|
3342
|
+
*
|
|
3343
|
+
* - Memoized: same input reference → same output reference.
|
|
3344
|
+
*
|
|
3345
|
+
* **Example** (Getting the encoded AST)
|
|
3346
|
+
*
|
|
3347
|
+
* ```ts
|
|
3348
|
+
* import { Schema, SchemaAST } from "effect"
|
|
3349
|
+
*
|
|
3350
|
+
* const schema = Schema.NumberFromString
|
|
3351
|
+
* const encodedAst = SchemaAST.toEncoded(schema.ast)
|
|
3352
|
+
* console.log(encodedAst._tag) // "String"
|
|
3353
|
+
* ```
|
|
3354
|
+
*
|
|
3355
|
+
* @see {@link toType}
|
|
3356
|
+
* @see {@link flip}
|
|
3357
|
+
* @category transforming
|
|
3358
|
+
* @since 4.0.0
|
|
3359
|
+
*/
|
|
3360
|
+
export const toEncoded = memoize((ast: AST): AST => {
|
|
3361
|
+
return toType(flip(ast))
|
|
3362
|
+
})
|
|
3363
|
+
|
|
3364
|
+
function flipEncoding(ast: AST, encoding: Encoding): AST {
|
|
3365
|
+
const links = encoding
|
|
3366
|
+
const len = links.length
|
|
3367
|
+
const last = links[len - 1]
|
|
3368
|
+
const ls: Arr.NonEmptyArray<Link> = [
|
|
3369
|
+
new Link(flip(replaceEncoding(ast, undefined)), links[0].transformation.flip())
|
|
3370
|
+
]
|
|
3371
|
+
for (let i = 1; i < len; i++) {
|
|
3372
|
+
ls.unshift(new Link(flip(links[i - 1].to), links[i].transformation.flip()))
|
|
3373
|
+
}
|
|
3374
|
+
const to = flip(last.to)
|
|
3375
|
+
if (to.encoding) {
|
|
3376
|
+
return replaceEncoding(to, [...to.encoding, ...ls])
|
|
3377
|
+
} else {
|
|
3378
|
+
return replaceEncoding(to, ls)
|
|
3379
|
+
}
|
|
3380
|
+
}
|
|
3381
|
+
|
|
3382
|
+
/**
|
|
3383
|
+
* Swaps the decode and encode directions of an AST's {@link Encoding} chain.
|
|
3384
|
+
*
|
|
3385
|
+
* **Details**
|
|
3386
|
+
*
|
|
3387
|
+
* After flipping, what was decoding becomes encoding and vice versa. This is
|
|
3388
|
+
* the core operation behind `Schema.encode` — encoding a value is decoding
|
|
3389
|
+
* with a flipped SchemaAST.
|
|
3390
|
+
*
|
|
3391
|
+
* - Memoized: same input reference → same output reference.
|
|
3392
|
+
* - Recursively walks composite nodes.
|
|
3393
|
+
*
|
|
3394
|
+
* @see {@link toType}
|
|
3395
|
+
* @see {@link toEncoded}
|
|
3396
|
+
* @category transforming
|
|
3397
|
+
* @since 4.0.0
|
|
3398
|
+
*/
|
|
3399
|
+
export const flip = memoize((ast: AST): AST => {
|
|
3400
|
+
if (ast.encoding) {
|
|
3401
|
+
return flipEncoding(ast, ast.encoding)
|
|
3402
|
+
}
|
|
3403
|
+
const out: any = ast
|
|
3404
|
+
return out.flip?.(flip) ?? out.recur?.(flip) ?? out
|
|
3405
|
+
})
|
|
3406
|
+
|
|
3407
|
+
/** @internal */
|
|
3408
|
+
export function containsUndefined(ast: AST): boolean {
|
|
3409
|
+
switch (ast._tag) {
|
|
3410
|
+
case "Undefined":
|
|
3411
|
+
return true
|
|
3412
|
+
case "Union":
|
|
3413
|
+
return ast.types.some(containsUndefined)
|
|
3414
|
+
default:
|
|
3415
|
+
return false
|
|
3416
|
+
}
|
|
3417
|
+
}
|
|
3418
|
+
|
|
3419
|
+
function getTemplateLiteralSource(ast: TemplateLiteral, top: boolean): string {
|
|
3420
|
+
return ast.encodedParts.map((part) =>
|
|
3421
|
+
handleTemplateLiteralASTPartParens(part, getTemplateLiteralASTPartPattern(part), top)
|
|
3422
|
+
).join("")
|
|
3423
|
+
}
|
|
3424
|
+
|
|
3425
|
+
/** @internal */
|
|
3426
|
+
export const getTemplateLiteralRegExp = memoize((ast: TemplateLiteral): RegExp => {
|
|
3427
|
+
return new globalThis.RegExp(`^${getTemplateLiteralSource(ast, true)}$`)
|
|
3428
|
+
})
|
|
3429
|
+
|
|
3430
|
+
function getTemplateLiteralASTPartPattern(part: TemplateLiteralPart): string {
|
|
3431
|
+
switch (part._tag) {
|
|
3432
|
+
case "Literal":
|
|
3433
|
+
return RegEx.escape(globalThis.String(part.literal))
|
|
3434
|
+
case "String":
|
|
3435
|
+
return STRING_PATTERN
|
|
3436
|
+
case "Number":
|
|
3437
|
+
return FINITE_PATTERN
|
|
3438
|
+
case "BigInt":
|
|
3439
|
+
return BIGINT_PATTERN
|
|
3440
|
+
case "TemplateLiteral":
|
|
3441
|
+
return getTemplateLiteralSource(part, false)
|
|
3442
|
+
case "Union":
|
|
3443
|
+
return part.types.map(getTemplateLiteralASTPartPattern).join("|")
|
|
3444
|
+
}
|
|
3445
|
+
}
|
|
3446
|
+
|
|
3447
|
+
function handleTemplateLiteralASTPartParens(part: TemplateLiteralPart, s: string, top: boolean): string {
|
|
3448
|
+
if (isUnion(part)) {
|
|
3449
|
+
if (!top) {
|
|
3450
|
+
return `(?:${s})`
|
|
3451
|
+
}
|
|
3452
|
+
} else if (!top) {
|
|
3453
|
+
return s
|
|
3454
|
+
}
|
|
3455
|
+
return `(${s})`
|
|
3456
|
+
}
|
|
3457
|
+
|
|
3458
|
+
function fromConst<const T>(
|
|
3459
|
+
ast: AST,
|
|
3460
|
+
value: T
|
|
3461
|
+
): SchemaParser.Parser {
|
|
3462
|
+
const succeed = Effect.succeedSome(value)
|
|
3463
|
+
return (oinput) => {
|
|
3464
|
+
if (oinput._tag === "None") {
|
|
3465
|
+
return Effect.succeedNone
|
|
3466
|
+
}
|
|
3467
|
+
return oinput.value === value
|
|
3468
|
+
? succeed
|
|
3469
|
+
: Effect.fail(new SchemaIssue.InvalidType(ast, oinput))
|
|
3470
|
+
}
|
|
3471
|
+
}
|
|
3472
|
+
|
|
3473
|
+
function fromRefinement<T>(
|
|
3474
|
+
ast: AST,
|
|
3475
|
+
refinement: (input: unknown) => input is T
|
|
3476
|
+
): SchemaParser.Parser {
|
|
3477
|
+
return (oinput) => {
|
|
3478
|
+
if (oinput._tag === "None") {
|
|
3479
|
+
return Effect.succeedNone
|
|
3480
|
+
}
|
|
3481
|
+
return refinement(oinput.value)
|
|
3482
|
+
? Effect.succeed(oinput)
|
|
3483
|
+
: Effect.fail(new SchemaIssue.InvalidType(ast, oinput))
|
|
3484
|
+
}
|
|
3485
|
+
}
|
|
3486
|
+
|
|
3487
|
+
/** @internal */
|
|
3488
|
+
export const enumsToLiterals = memoize((ast: Enum): Union<Literal> => {
|
|
3489
|
+
return new Union(
|
|
3490
|
+
ast.enums.map((e) => new Literal(e[1], { title: e[0] })),
|
|
3491
|
+
"anyOf"
|
|
3492
|
+
)
|
|
3493
|
+
})
|
|
3494
|
+
|
|
3495
|
+
/** @internal */
|
|
3496
|
+
export function toCodec(f: (ast: AST) => AST) {
|
|
3497
|
+
function out(ast: AST): AST {
|
|
3498
|
+
return ast.encoding ? replaceEncoding(ast, updateLastLink(ast.encoding, out)) : f(ast)
|
|
3499
|
+
}
|
|
3500
|
+
return memoize(out)
|
|
3501
|
+
}
|
|
3502
|
+
|
|
3503
|
+
const indexSignatureParameterFromString = toCodec((ast) => {
|
|
3504
|
+
switch (ast._tag) {
|
|
3505
|
+
default:
|
|
3506
|
+
return ast
|
|
3507
|
+
case "Number":
|
|
3508
|
+
return ast.toCodecStringTree()
|
|
3509
|
+
case "Union":
|
|
3510
|
+
return ast.recur(indexSignatureParameterFromString)
|
|
3511
|
+
}
|
|
3512
|
+
})
|
|
3513
|
+
|
|
3514
|
+
const templateLiteralPartFromString = toCodec((ast) => {
|
|
3515
|
+
switch (ast._tag) {
|
|
3516
|
+
default:
|
|
3517
|
+
return ast
|
|
3518
|
+
case "String":
|
|
3519
|
+
case "TemplateLiteral":
|
|
3520
|
+
return ast
|
|
3521
|
+
case "BigInt":
|
|
3522
|
+
case "Number":
|
|
3523
|
+
case "Literal":
|
|
3524
|
+
return ast.toCodecStringTree()
|
|
3525
|
+
case "Union":
|
|
3526
|
+
return ast.recur(templateLiteralPartFromString)
|
|
3527
|
+
}
|
|
3528
|
+
})
|
|
3529
|
+
|
|
3530
|
+
/**
|
|
3531
|
+
* any string, including newlines
|
|
3532
|
+
* @internal
|
|
3533
|
+
*/
|
|
3534
|
+
export const STRING_PATTERN = "[\\s\\S]*?"
|
|
3535
|
+
|
|
3536
|
+
const isStringFiniteRegExp = new globalThis.RegExp(`^${FINITE_PATTERN}$`)
|
|
3537
|
+
|
|
3538
|
+
/** @internal */
|
|
3539
|
+
export function isStringFinite(annotations?: Schema.Annotations.Filter) {
|
|
3540
|
+
return isPattern(
|
|
3541
|
+
isStringFiniteRegExp,
|
|
3542
|
+
{
|
|
3543
|
+
expected: "a string representing a finite number",
|
|
3544
|
+
meta: {
|
|
3545
|
+
_tag: "isStringFinite",
|
|
3546
|
+
regExp: isStringFiniteRegExp
|
|
3547
|
+
},
|
|
3548
|
+
...annotations
|
|
3549
|
+
}
|
|
3550
|
+
)
|
|
3551
|
+
}
|
|
3552
|
+
|
|
3553
|
+
const finiteString = appendChecks(string, [isStringFinite()])
|
|
3554
|
+
|
|
3555
|
+
const finiteToString = new Link(
|
|
3556
|
+
finiteString,
|
|
3557
|
+
SchemaTransformation.numberFromString
|
|
3558
|
+
)
|
|
3559
|
+
|
|
3560
|
+
const numberToString = new Link(
|
|
3561
|
+
new Union([finiteString, nonFiniteLiterals], "anyOf"),
|
|
3562
|
+
SchemaTransformation.numberFromString
|
|
3563
|
+
)
|
|
3564
|
+
|
|
3565
|
+
/**
|
|
3566
|
+
* signed integer only (no leading "+" because TypeScript doesn't support it)
|
|
3567
|
+
*/
|
|
3568
|
+
const BIGINT_PATTERN = "-?\\d+"
|
|
3569
|
+
|
|
3570
|
+
const isStringBigIntRegExp = new globalThis.RegExp(`^${BIGINT_PATTERN}$`)
|
|
3571
|
+
|
|
3572
|
+
/** @internal */
|
|
3573
|
+
export function isStringBigInt(annotations?: Schema.Annotations.Filter) {
|
|
3574
|
+
return isPattern(
|
|
3575
|
+
isStringBigIntRegExp,
|
|
3576
|
+
{
|
|
3577
|
+
expected: "a string representing a bigint",
|
|
3578
|
+
meta: {
|
|
3579
|
+
_tag: "isStringBigInt",
|
|
3580
|
+
regExp: isStringBigIntRegExp
|
|
3581
|
+
},
|
|
3582
|
+
...annotations
|
|
3583
|
+
}
|
|
3584
|
+
)
|
|
3585
|
+
}
|
|
3586
|
+
|
|
3587
|
+
/** @internal */
|
|
3588
|
+
export const bigIntString = appendChecks(string, [isStringBigInt({
|
|
3589
|
+
expected: "a string representing a bigint"
|
|
3590
|
+
})])
|
|
3591
|
+
|
|
3592
|
+
const bigIntToString = new Link(
|
|
3593
|
+
bigIntString,
|
|
3594
|
+
SchemaTransformation.bigintFromString
|
|
3595
|
+
)
|
|
3596
|
+
|
|
3597
|
+
const REGEXP_PATTERN = "Symbol\\((.*)\\)"
|
|
3598
|
+
|
|
3599
|
+
const isStringSymbolRegExp = new globalThis.RegExp(`^${REGEXP_PATTERN}$`)
|
|
3600
|
+
|
|
3601
|
+
/** @internal */
|
|
3602
|
+
export const symbolString = appendChecks(string, [isStringSymbol()])
|
|
3603
|
+
|
|
3604
|
+
/**
|
|
3605
|
+
* to distinguish between Symbol and String, we need to add a check to the string keyword
|
|
3606
|
+
*/
|
|
3607
|
+
const symbolToString = new Link(
|
|
3608
|
+
symbolString,
|
|
3609
|
+
new SchemaTransformation.Transformation(
|
|
3610
|
+
SchemaGetter.transform((description) => globalThis.Symbol.for(isStringSymbolRegExp.exec(description)![1])),
|
|
3611
|
+
SchemaGetter.transformOrFail((sym: symbol) => {
|
|
3612
|
+
const key = globalThis.Symbol.keyFor(sym)
|
|
3613
|
+
if (key !== undefined) {
|
|
3614
|
+
return Effect.succeed(globalThis.String(sym))
|
|
3615
|
+
}
|
|
3616
|
+
return Effect.fail(
|
|
3617
|
+
new SchemaIssue.Forbidden(Option.some(sym), { message: "cannot serialize to string, Symbol is not registered" })
|
|
3618
|
+
)
|
|
3619
|
+
})
|
|
3620
|
+
)
|
|
3621
|
+
)
|
|
3622
|
+
|
|
3623
|
+
/** @internal */
|
|
3624
|
+
export function isStringSymbol(annotations?: Schema.Annotations.Filter) {
|
|
3625
|
+
return isPattern(
|
|
3626
|
+
isStringSymbolRegExp,
|
|
3627
|
+
{
|
|
3628
|
+
expected: "a string representing a symbol",
|
|
3629
|
+
meta: {
|
|
3630
|
+
_tag: "isStringSymbol",
|
|
3631
|
+
regExp: isStringSymbolRegExp
|
|
3632
|
+
},
|
|
3633
|
+
...annotations
|
|
3634
|
+
}
|
|
3635
|
+
)
|
|
3636
|
+
}
|
|
3637
|
+
|
|
3638
|
+
/** @internal */
|
|
3639
|
+
export function collectIssues<T>(
|
|
3640
|
+
checks: ReadonlyArray<Check<T>>,
|
|
3641
|
+
value: T,
|
|
3642
|
+
issues: Array<SchemaIssue.Issue>,
|
|
3643
|
+
ast: AST,
|
|
3644
|
+
options: ParseOptions
|
|
3645
|
+
) {
|
|
3646
|
+
for (let i = 0; i < checks.length; i++) {
|
|
3647
|
+
const check = checks[i]
|
|
3648
|
+
if (check._tag === "FilterGroup") {
|
|
3649
|
+
collectIssues(check.checks, value, issues, ast, options)
|
|
3650
|
+
} else {
|
|
3651
|
+
const issue = check.run(value, ast, options)
|
|
3652
|
+
if (issue) {
|
|
3653
|
+
issues.push(new SchemaIssue.Filter(value, check, issue))
|
|
3654
|
+
if (check.aborted || options?.errors !== "all") {
|
|
3655
|
+
return
|
|
3656
|
+
}
|
|
3657
|
+
}
|
|
3658
|
+
}
|
|
3659
|
+
}
|
|
3660
|
+
}
|
|
3661
|
+
|
|
3662
|
+
/** @internal */
|
|
3663
|
+
export function runChecks<T>(
|
|
3664
|
+
checks: readonly [Check<T>, ...Array<Check<T>>],
|
|
3665
|
+
s: T
|
|
3666
|
+
): Result.Result<T, SchemaIssue.Issue> {
|
|
3667
|
+
const issues: Array<SchemaIssue.Issue> = []
|
|
3668
|
+
collectIssues(checks, s, issues, unknown, { errors: "all" })
|
|
3669
|
+
if (Arr.isArrayNonEmpty(issues)) {
|
|
3670
|
+
const issue = new SchemaIssue.Composite(unknown, Option.some(s), issues)
|
|
3671
|
+
return Result.fail(issue)
|
|
3672
|
+
}
|
|
3673
|
+
return Result.succeed(s)
|
|
3674
|
+
}
|
|
3675
|
+
|
|
3676
|
+
/** @internal */
|
|
3677
|
+
export const ClassTypeId = "~effect/Schema/Class"
|
|
3678
|
+
|
|
3679
|
+
/** @internal */
|
|
3680
|
+
export const STRUCTURAL_ANNOTATION_KEY = "~structural"
|
|
3681
|
+
|
|
3682
|
+
/**
|
|
3683
|
+
* Returns all annotations from the AST node.
|
|
3684
|
+
*
|
|
3685
|
+
* **Details**
|
|
3686
|
+
*
|
|
3687
|
+
* If the node has {@link Checks}, returns annotations from the last check
|
|
3688
|
+
* (which is where user-supplied annotations end up after `.pipe(Schema.annotations(...))`).
|
|
3689
|
+
* Otherwise returns `Base.annotations` directly.
|
|
3690
|
+
*
|
|
3691
|
+
* **Example** (Reading annotations)
|
|
3692
|
+
*
|
|
3693
|
+
* ```ts
|
|
3694
|
+
* import { Schema, SchemaAST } from "effect"
|
|
3695
|
+
*
|
|
3696
|
+
* const schema = Schema.String.annotate({ title: "Name" })
|
|
3697
|
+
* const annotations = SchemaAST.resolve(schema.ast)
|
|
3698
|
+
* console.log(annotations?.title) // "Name"
|
|
3699
|
+
* ```
|
|
3700
|
+
*
|
|
3701
|
+
* @see {@link resolveAt}
|
|
3702
|
+
* @see {@link resolveIdentifier}
|
|
3703
|
+
* @see {@link resolveTitle}
|
|
3704
|
+
* @see {@link resolveDescription}
|
|
3705
|
+
* @category annotations
|
|
3706
|
+
* @since 4.0.0
|
|
3707
|
+
*/
|
|
3708
|
+
export const resolve: (ast: AST) => Schema.Annotations.Annotations | undefined = InternalAnnotations.resolve
|
|
3709
|
+
|
|
3710
|
+
/**
|
|
3711
|
+
* Returns a single annotation value by key from the AST node.
|
|
3712
|
+
*
|
|
3713
|
+
* **Details**
|
|
3714
|
+
*
|
|
3715
|
+
* Like {@link resolve}, reads from the last check's annotations when checks
|
|
3716
|
+
* are present. Returns `undefined` if the key is not found.
|
|
3717
|
+
*
|
|
3718
|
+
* @see {@link resolve}
|
|
3719
|
+
* @category annotations
|
|
3720
|
+
* @since 4.0.0
|
|
3721
|
+
*/
|
|
3722
|
+
export const resolveAt: <A>(key: string) => (ast: AST) => A | undefined = InternalAnnotations.resolveAt
|
|
3723
|
+
|
|
3724
|
+
/**
|
|
3725
|
+
* Returns the `identifier` annotation from the AST node, if set.
|
|
3726
|
+
*
|
|
3727
|
+
* **Details**
|
|
3728
|
+
*
|
|
3729
|
+
* The identifier is typically set by `Schema.annotations({ identifier: "..." })`
|
|
3730
|
+
* and is used for error messages and schema identification.
|
|
3731
|
+
*
|
|
3732
|
+
* @see {@link resolve}
|
|
3733
|
+
* @see {@link resolveTitle}
|
|
3734
|
+
* @category annotations
|
|
3735
|
+
* @since 4.0.0
|
|
3736
|
+
*/
|
|
3737
|
+
export const resolveIdentifier: (ast: AST) => string | undefined = InternalAnnotations.resolveIdentifier
|
|
3738
|
+
|
|
3739
|
+
/**
|
|
3740
|
+
* Returns the `title` annotation from the AST node, if set.
|
|
3741
|
+
*
|
|
3742
|
+
* @see {@link resolve}
|
|
3743
|
+
* @see {@link resolveIdentifier}
|
|
3744
|
+
* @see {@link resolveDescription}
|
|
3745
|
+
*
|
|
3746
|
+
* @category annotations
|
|
3747
|
+
* @since 4.0.0
|
|
3748
|
+
*/
|
|
3749
|
+
export const resolveTitle: (ast: AST) => string | undefined = InternalAnnotations.resolveTitle
|
|
3750
|
+
|
|
3751
|
+
/**
|
|
3752
|
+
* Returns the `description` annotation from the AST node, if set.
|
|
3753
|
+
*
|
|
3754
|
+
* @see {@link resolve}
|
|
3755
|
+
* @see {@link resolveTitle}
|
|
3756
|
+
* @see {@link resolveIdentifier}
|
|
3757
|
+
*
|
|
3758
|
+
* @category annotations
|
|
3759
|
+
* @since 4.0.0
|
|
3760
|
+
*/
|
|
3761
|
+
export const resolveDescription: (ast: AST) => string | undefined = InternalAnnotations.resolveDescription
|
|
3762
|
+
|
|
3763
|
+
/**
|
|
3764
|
+
* Returns true if the value is a JSON value.
|
|
3765
|
+
*
|
|
3766
|
+
* When a cyclic reference is detected, returns false.
|
|
3767
|
+
*
|
|
3768
|
+
* @internal
|
|
3769
|
+
*/
|
|
3770
|
+
export function isJson(u: unknown): u is Schema.Json {
|
|
3771
|
+
// `onPath` is the current recursion stack: nodes between the root and the
|
|
3772
|
+
// one being visited. A hit here means we looped back to an ancestor — a
|
|
3773
|
+
// real cycle, not a DAG — so the value is not JSON.
|
|
3774
|
+
const onPath = new Set<unknown>()
|
|
3775
|
+
// `validated` memoizes subtrees we've already fully checked. Without it, a
|
|
3776
|
+
// diamond-shaped DAG (same node reached through multiple parents) would be
|
|
3777
|
+
// re-traversed once per parent, which is exponential in the nesting depth.
|
|
3778
|
+
const validated = new Set<unknown>()
|
|
3779
|
+
return recur(u)
|
|
3780
|
+
|
|
3781
|
+
function recur(u: unknown): boolean {
|
|
3782
|
+
if (u === null || typeof u === "string" || typeof u === "boolean") {
|
|
3783
|
+
return true
|
|
3784
|
+
}
|
|
3785
|
+
if (typeof u === "number") {
|
|
3786
|
+
return globalThis.Number.isFinite(u)
|
|
3787
|
+
}
|
|
3788
|
+
if (typeof u !== "object" || u === undefined) {
|
|
3789
|
+
return false
|
|
3790
|
+
}
|
|
3791
|
+
if (onPath.has(u)) {
|
|
3792
|
+
return false
|
|
3793
|
+
}
|
|
3794
|
+
if (validated.has(u)) {
|
|
3795
|
+
return true
|
|
3796
|
+
}
|
|
3797
|
+
onPath.add(u)
|
|
3798
|
+
const ok = Array.isArray(u)
|
|
3799
|
+
? u.every(recur)
|
|
3800
|
+
: Object.keys(u).every((key) => recur((u as Record<string, unknown>)[key]))
|
|
3801
|
+
// Pop on exit so siblings reaching the same node via a different path
|
|
3802
|
+
// don't see it as an ancestor (that would reject valid DAGs).
|
|
3803
|
+
onPath.delete(u)
|
|
3804
|
+
if (ok) {
|
|
3805
|
+
validated.add(u)
|
|
3806
|
+
}
|
|
3807
|
+
return ok
|
|
3808
|
+
}
|
|
3809
|
+
}
|
|
3810
|
+
|
|
3811
|
+
/** @internal */
|
|
3812
|
+
export const Json = new Declaration(
|
|
3813
|
+
[],
|
|
3814
|
+
() => (input, ast) =>
|
|
3815
|
+
isJson(input) ?
|
|
3816
|
+
Effect.succeed(input) :
|
|
3817
|
+
Effect.fail(new SchemaIssue.InvalidType(ast, Option.some(input))),
|
|
3818
|
+
{
|
|
3819
|
+
typeConstructor: {
|
|
3820
|
+
_tag: "effect/Json"
|
|
3821
|
+
},
|
|
3822
|
+
generation: {
|
|
3823
|
+
runtime: `Schema.Json`,
|
|
3824
|
+
Type: `Schema.Json`
|
|
3825
|
+
},
|
|
3826
|
+
expected: "JSON value",
|
|
3827
|
+
toCodecJson: () => new Link(unknown, SchemaTransformation.passthrough()),
|
|
3828
|
+
toArbitrary: () => (fc: typeof FastCheck) => fc.jsonValue()
|
|
3829
|
+
}
|
|
3830
|
+
)
|
|
3831
|
+
|
|
3832
|
+
/** @internal */
|
|
3833
|
+
export const MutableJson = annotate(Json, {
|
|
3834
|
+
typeConstructor: {
|
|
3835
|
+
_tag: "effect/MutableJson"
|
|
3836
|
+
},
|
|
3837
|
+
generation: {
|
|
3838
|
+
runtime: `Schema.MutableJson`,
|
|
3839
|
+
Type: `Schema.MutableJson`
|
|
3840
|
+
}
|
|
3841
|
+
})
|
|
3842
|
+
|
|
3843
|
+
/** @internal */
|
|
3844
|
+
export const unknownToNull = new Link(
|
|
3845
|
+
null_,
|
|
3846
|
+
new SchemaTransformation.Transformation(
|
|
3847
|
+
SchemaGetter.passthrough(),
|
|
3848
|
+
SchemaGetter.transform(() => null)
|
|
3849
|
+
)
|
|
3850
|
+
)
|
|
3851
|
+
|
|
3852
|
+
/** @internal */
|
|
3853
|
+
export const unknownToJson = new Link(
|
|
3854
|
+
Json,
|
|
3855
|
+
SchemaTransformation.passthrough()
|
|
3856
|
+
)
|
|
3857
|
+
|
|
3858
|
+
/**
|
|
3859
|
+
* Returns true if the value is a StringTree value.
|
|
3860
|
+
*
|
|
3861
|
+
* When a cyclic reference is detected, returns false.
|
|
3862
|
+
*
|
|
3863
|
+
* @internal
|
|
3864
|
+
*/
|
|
3865
|
+
export function isStringTree(u: unknown): u is Schema.StringTree {
|
|
3866
|
+
const seen = new Set<unknown>()
|
|
3867
|
+
return recur(u)
|
|
3868
|
+
|
|
3869
|
+
function recur(u: unknown): boolean {
|
|
3870
|
+
if (u === undefined || typeof u === "string") {
|
|
3871
|
+
return true
|
|
3872
|
+
}
|
|
3873
|
+
if (typeof u !== "object" || u === null) {
|
|
3874
|
+
return false
|
|
3875
|
+
}
|
|
3876
|
+
if (seen.has(u)) {
|
|
3877
|
+
return false
|
|
3878
|
+
}
|
|
3879
|
+
seen.add(u)
|
|
3880
|
+
if (Array.isArray(u)) {
|
|
3881
|
+
return u.every(recur)
|
|
3882
|
+
}
|
|
3883
|
+
return Object.keys(u).every((key) => recur((u as Record<string, unknown>)[key]))
|
|
3884
|
+
}
|
|
3885
|
+
}
|
|
3886
|
+
|
|
3887
|
+
const StringTree = new Declaration(
|
|
3888
|
+
[],
|
|
3889
|
+
() => (input, ast) =>
|
|
3890
|
+
isStringTree(input) ?
|
|
3891
|
+
Effect.succeed(input) :
|
|
3892
|
+
Effect.fail(new SchemaIssue.InvalidType(ast, Option.some(input))),
|
|
3893
|
+
{
|
|
3894
|
+
expected: "StringTree",
|
|
3895
|
+
toCodecStringTree: () => new Link(unknown, SchemaTransformation.passthrough())
|
|
3896
|
+
}
|
|
3897
|
+
)
|
|
3898
|
+
|
|
3899
|
+
/** @internal */
|
|
3900
|
+
export const unknownToStringTree = new Link(
|
|
3901
|
+
StringTree,
|
|
3902
|
+
SchemaTransformation.passthrough()
|
|
3903
|
+
)
|