@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.
Files changed (2055) hide show
  1. package/HARNESS.md +34 -0
  2. package/README.md +113 -0
  3. package/dist/bin/effect-harness.d.ts +2 -0
  4. package/dist/bin/effect-harness.js +39 -0
  5. package/dist/bin/effect-harness.js.map +1 -0
  6. package/dist/src/cli/Main.d.ts +6 -0
  7. package/dist/src/cli/Main.js +141 -0
  8. package/dist/src/cli/Main.js.map +1 -0
  9. package/dist/src/harness/CraftSkills.d.ts +14 -0
  10. package/dist/src/harness/CraftSkills.js +164 -0
  11. package/dist/src/harness/CraftSkills.js.map +1 -0
  12. package/dist/src/harness/Errors.d.ts +24 -0
  13. package/dist/src/harness/Errors.js +26 -0
  14. package/dist/src/harness/Errors.js.map +1 -0
  15. package/dist/src/harness/GuardrailRules.d.ts +6 -0
  16. package/dist/src/harness/GuardrailRules.js +303 -0
  17. package/dist/src/harness/GuardrailRules.js.map +1 -0
  18. package/dist/src/harness/Guardrails.d.ts +10 -0
  19. package/dist/src/harness/Guardrails.js +69 -0
  20. package/dist/src/harness/Guardrails.js.map +1 -0
  21. package/dist/src/harness/Init.d.ts +9 -0
  22. package/dist/src/harness/Init.js +234 -0
  23. package/dist/src/harness/Init.js.map +1 -0
  24. package/dist/src/harness/Model.d.ts +44 -0
  25. package/dist/src/harness/Model.js +169 -0
  26. package/dist/src/harness/Model.js.map +1 -0
  27. package/dist/src/harness/ModuleSources.d.ts +5 -0
  28. package/dist/src/harness/ModuleSources.js +47 -0
  29. package/dist/src/harness/ModuleSources.js.map +1 -0
  30. package/dist/src/harness/PnpmWorkspace.d.ts +2 -0
  31. package/dist/src/harness/PnpmWorkspace.js +23 -0
  32. package/dist/src/harness/PnpmWorkspace.js.map +1 -0
  33. package/dist/src/harness/Publish.d.ts +53 -0
  34. package/dist/src/harness/Publish.js +282 -0
  35. package/dist/src/harness/Publish.js.map +1 -0
  36. package/dist/src/harness/SelfVerify.d.ts +4 -0
  37. package/dist/src/harness/SelfVerify.js +56 -0
  38. package/dist/src/harness/SelfVerify.js.map +1 -0
  39. package/dist/src/harness/SourcePin.d.ts +12 -0
  40. package/dist/src/harness/SourcePin.js +320 -0
  41. package/dist/src/harness/SourcePin.js.map +1 -0
  42. package/dist/src/harness/Status.d.ts +12 -0
  43. package/dist/src/harness/Status.js +88 -0
  44. package/dist/src/harness/Status.js.map +1 -0
  45. package/dist/src/harness/TargetVerify.d.ts +8 -0
  46. package/dist/src/harness/TargetVerify.js +432 -0
  47. package/dist/src/harness/TargetVerify.js.map +1 -0
  48. package/dist/src/harness/TestContract.d.ts +6 -0
  49. package/dist/src/harness/TestContract.js +45 -0
  50. package/dist/src/harness/TestContract.js.map +1 -0
  51. package/dist/src/platform/Json.d.ts +8 -0
  52. package/dist/src/platform/Json.js +35 -0
  53. package/dist/src/platform/Json.js.map +1 -0
  54. package/dist/src/platform/ManagedFiles.d.ts +8 -0
  55. package/dist/src/platform/ManagedFiles.js +59 -0
  56. package/dist/src/platform/ManagedFiles.js.map +1 -0
  57. package/dist/src/platform/Process.d.ts +8 -0
  58. package/dist/src/platform/Process.js +80 -0
  59. package/dist/src/platform/Process.js.map +1 -0
  60. package/guide/default-capabilities.md +38 -0
  61. package/guide/index.md +49 -0
  62. package/guide/setup.md +64 -0
  63. package/harness/default-capabilities.md +32 -0
  64. package/harness/exposure.md +46 -0
  65. package/harness/feedback/index.md +60 -0
  66. package/harness/index.md +22 -0
  67. package/harness/official-inventory.md +85 -0
  68. package/harness/runtime/codex/AGENTS.fragment.md +28 -0
  69. package/harness/runtime/codex/agents/effect-worker.md +26 -0
  70. package/harness/runtime/codex/skills/effect-code/SKILL.md +72 -0
  71. package/harness/runtime/codex/skills/effect-code/agents/openai.yaml +4 -0
  72. package/harness/runtime/codex/skills/effect-feedback/SKILL.md +66 -0
  73. package/harness/runtime/codex/skills/effect-feedback/agents/openai.yaml +4 -0
  74. package/harness/source.md +52 -0
  75. package/harness/target-agent-contract.md +205 -0
  76. package/package.json +68 -0
  77. package/repos/craft-skills.manifest.json +34 -0
  78. package/repos/effect/.agents/skills/grill-me/SKILL.md +43 -0
  79. package/repos/effect/.agents/skills/jsdocs/SKILL.md +203 -0
  80. package/repos/effect/.agents/skills/scratchpad/SKILL.md +44 -0
  81. package/repos/effect/.agents/skills/scratchpad/agents/openai.yaml +7 -0
  82. package/repos/effect/.agents/skills/scratchpad/scripts/extract-example.mjs +260 -0
  83. package/repos/effect/.changeset/add-bigdecimal-sumall-multiplyall.md +5 -0
  84. package/repos/effect/.changeset/add-chunk-schema.md +5 -0
  85. package/repos/effect/.changeset/add-command-hidden.md +19 -0
  86. package/repos/effect/.changeset/add-config-nested.md +5 -0
  87. package/repos/effect/.changeset/add-flag-hidden.md +15 -0
  88. package/repos/effect/.changeset/add-from-string-schemas.md +5 -0
  89. package/repos/effect/.changeset/add-headers-remove-many.md +5 -0
  90. package/repos/effect/.changeset/add-indexeddb-kvs-layer.md +5 -0
  91. package/repos/effect/.changeset/add-make-msgpack.md +5 -0
  92. package/repos/effect/.changeset/add-make-option.md +5 -0
  93. package/repos/effect/.changeset/add-missing-tx-modules.md +11 -0
  94. package/repos/effect/.changeset/add-newtype-module.md +5 -0
  95. package/repos/effect/.changeset/add-scalar-show-operation-id.md +5 -0
  96. package/repos/effect/.changeset/add-schedule-tap.md +5 -0
  97. package/repos/effect/.changeset/add-schema-annotate-encoded.md +5 -0
  98. package/repos/effect/.changeset/add-schema-array-ensure.md +5 -0
  99. package/repos/effect/.changeset/add-schema-bigdecimal.md +5 -0
  100. package/repos/effect/.changeset/add-schema-datetime.md +5 -0
  101. package/repos/effect/.changeset/add-schema-option-from-optional-nullor.md +5 -0
  102. package/repos/effect/.changeset/add-schema-option-from-undefined-nullish.md +5 -0
  103. package/repos/effect/.changeset/add-schema-string-encoding.md +5 -0
  104. package/repos/effect/.changeset/add-sql-pglite.md +5 -0
  105. package/repos/effect/.changeset/add-standard-jsdoc-rule.md +5 -0
  106. package/repos/effect/.changeset/add-stream-broadcastn.md +5 -0
  107. package/repos/effect/.changeset/add-unstable-encoding-export.md +5 -0
  108. package/repos/effect/.changeset/afraid-cobras-like.md +5 -0
  109. package/repos/effect/.changeset/ai-openai-config-field-leak.md +6 -0
  110. package/repos/effect/.changeset/ai-openai-file-nullable-fields.md +5 -0
  111. package/repos/effect/.changeset/anthropic-4-6-structured-output.md +5 -0
  112. package/repos/effect/.changeset/asyncresult-exhaustive.md +5 -0
  113. package/repos/effect/.changeset/atom-stream-error-type.md +5 -0
  114. package/repos/effect/.changeset/beige-paths-sort.md +5 -0
  115. package/repos/effect/.changeset/better-apples-nail.md +5 -0
  116. package/repos/effect/.changeset/better-rocks-arrive.md +5 -0
  117. package/repos/effect/.changeset/big-pans-look.md +5 -0
  118. package/repos/effect/.changeset/blue-dingos-greet.md +5 -0
  119. package/repos/effect/.changeset/blue-ligers-cheat.md +5 -0
  120. package/repos/effect/.changeset/blue-onions-smile.md +5 -0
  121. package/repos/effect/.changeset/blue-ravens-type.md +5 -0
  122. package/repos/effect/.changeset/blue-trams-kiss.md +7 -0
  123. package/repos/effect/.changeset/bold-chairs-yawn.md +5 -0
  124. package/repos/effect/.changeset/bold-planets-shout.md +30 -0
  125. package/repos/effect/.changeset/breezy-meals-see.md +5 -0
  126. package/repos/effect/.changeset/bright-bugs-bow.md +5 -0
  127. package/repos/effect/.changeset/bright-canyons-clean.md +5 -0
  128. package/repos/effect/.changeset/bright-dogs-fail.md +5 -0
  129. package/repos/effect/.changeset/bright-flags-stand.md +5 -0
  130. package/repos/effect/.changeset/bright-laws-teach.md +5 -0
  131. package/repos/effect/.changeset/bright-lemons-dance.md +5 -0
  132. package/repos/effect/.changeset/bright-planes-smash.md +5 -0
  133. package/repos/effect/.changeset/bright-rats-attend.md +5 -0
  134. package/repos/effect/.changeset/bright-toes-rush.md +5 -0
  135. package/repos/effect/.changeset/bumpy-boxes-teach.md +5 -0
  136. package/repos/effect/.changeset/busy-lions-sneeze.md +5 -0
  137. package/repos/effect/.changeset/busy-maps-attend.md +7 -0
  138. package/repos/effect/.changeset/calm-buckets-own.md +5 -0
  139. package/repos/effect/.changeset/calm-carrots-march.md +7 -0
  140. package/repos/effect/.changeset/calm-cars-rest.md +5 -0
  141. package/repos/effect/.changeset/calm-panthers-nail.md +5 -0
  142. package/repos/effect/.changeset/calm-seas-smile.md +5 -0
  143. package/repos/effect/.changeset/calm-squids-hug.md +5 -0
  144. package/repos/effect/.changeset/chatty-poets-type.md +5 -0
  145. package/repos/effect/.changeset/chilled-mice-wash.md +5 -0
  146. package/repos/effect/.changeset/chilly-pumas-rule.md +5 -0
  147. package/repos/effect/.changeset/chubby-buckets-feel.md +5 -0
  148. package/repos/effect/.changeset/chubby-parents-flow.md +5 -0
  149. package/repos/effect/.changeset/chubby-planets-fall.md +5 -0
  150. package/repos/effect/.changeset/clean-balloons-tan.md +5 -0
  151. package/repos/effect/.changeset/clean-bulldogs-care.md +5 -0
  152. package/repos/effect/.changeset/clean-dryers-sneeze.md +5 -0
  153. package/repos/effect/.changeset/clean-geese-work.md +5 -0
  154. package/repos/effect/.changeset/clean-goats-wave.md +5 -0
  155. package/repos/effect/.changeset/clean-needles-shake.md +23 -0
  156. package/repos/effect/.changeset/clean-tires-guess.md +5 -0
  157. package/repos/effect/.changeset/clear-spies-boil.md +5 -0
  158. package/repos/effect/.changeset/cli-help-choices.md +5 -0
  159. package/repos/effect/.changeset/cold-knives-lie.md +35 -0
  160. package/repos/effect/.changeset/cold-rooms-show.md +5 -0
  161. package/repos/effect/.changeset/cold-sloths-wave.md +5 -0
  162. package/repos/effect/.changeset/compact-json-schema-enum.md +25 -0
  163. package/repos/effect/.changeset/config-withdefault-eager.md +7 -0
  164. package/repos/effect/.changeset/config.json +24 -0
  165. package/repos/effect/.changeset/consolidate-encoding.md +5 -0
  166. package/repos/effect/.changeset/consolidate-sql-error.md +16 -0
  167. package/repos/effect/.changeset/crisp-seas-warn.md +5 -0
  168. package/repos/effect/.changeset/cuddly-rooms-bet.md +5 -0
  169. package/repos/effect/.changeset/curly-poems-talk.md +5 -0
  170. package/repos/effect/.changeset/curly-spies-relax.md +5 -0
  171. package/repos/effect/.changeset/curvy-apples-float.md +5 -0
  172. package/repos/effect/.changeset/custom-http-security-openapi-generator.md +5 -0
  173. package/repos/effect/.changeset/cute-heads-thank.md +5 -0
  174. package/repos/effect/.changeset/cyan-loops-grow.md +5 -0
  175. package/repos/effect/.changeset/cyan-radios-switch.md +5 -0
  176. package/repos/effect/.changeset/deep-rivers-spend.md +5 -0
  177. package/repos/effect/.changeset/dirty-lamps-trade.md +5 -0
  178. package/repos/effect/.changeset/dirty-laws-wear.md +5 -0
  179. package/repos/effect/.changeset/duration-temporal-object-input.md +7 -0
  180. package/repos/effect/.changeset/eager-coats-cheat.md +5 -0
  181. package/repos/effect/.changeset/early-birds-dream.md +5 -0
  182. package/repos/effect/.changeset/early-donuts-argue.md +5 -0
  183. package/repos/effect/.changeset/early-peaches-check.md +6 -0
  184. package/repos/effect/.changeset/eff-691-default-logger-ordering.md +5 -0
  185. package/repos/effect/.changeset/eff-693-rpcgroup-handler-deps.md +5 -0
  186. package/repos/effect/.changeset/eff-694-cli-completions-module.md +5 -0
  187. package/repos/effect/.changeset/eff-695-layer-mock-dual-api.md +5 -0
  188. package/repos/effect/.changeset/eff-697-rpcserialization-json-array-decode.md +5 -0
  189. package/repos/effect/.changeset/eff-698-rpcserialization-unreachable-branch.md +5 -0
  190. package/repos/effect/.changeset/eff-700-httpapi-middleware-errors.md +12 -0
  191. package/repos/effect/.changeset/eff-701-httpapierror-respondable.md +5 -0
  192. package/repos/effect/.changeset/eff-704-stream-merge-predicate.md +5 -0
  193. package/repos/effect/.changeset/eff-705-layer-tap-apis.md +5 -0
  194. package/repos/effect/.changeset/eff-706-servicemap-mutate.md +6 -0
  195. package/repos/effect/.changeset/eff-716-response-id-tracker-map.md +5 -0
  196. package/repos/effect/.changeset/eff-717-openai-socket-cancel.md +5 -0
  197. package/repos/effect/.changeset/eff-718-embedding-model-surface.md +13 -0
  198. package/repos/effect/.changeset/eff-725-fix-catch-jsdoc.md +5 -0
  199. package/repos/effect/.changeset/eff-726-model-dimensions.md +7 -0
  200. package/repos/effect/.changeset/eff-727-cli-help-alignment.md +5 -0
  201. package/repos/effect/.changeset/eff-730-language-model-incremental-fallback.md +5 -0
  202. package/repos/effect/.changeset/eff-736-cached-with-ttl.md +5 -0
  203. package/repos/effect/.changeset/eff-738-cron-prev.md +5 -0
  204. package/repos/effect/.changeset/eff-739-openai-function-call-done.md +5 -0
  205. package/repos/effect/.changeset/eff-740-missing-summary-parts.md +5 -0
  206. package/repos/effect/.changeset/eff-742-http-client-request-web.md +5 -0
  207. package/repos/effect/.changeset/eff-744-sqlite-migrator-lock.md +5 -0
  208. package/repos/effect/.changeset/eff-746-fixed-iteration-catchup.md +5 -0
  209. package/repos/effect/.changeset/eff-747-unify-effect.md +5 -0
  210. package/repos/effect/.changeset/eff-754-url-builder-any.md +6 -0
  211. package/repos/effect/.changeset/eff-755-references-core.md +5 -0
  212. package/repos/effect/.changeset/eff-769-select-text-highlight.md +5 -0
  213. package/repos/effect/.changeset/eff-774-mutable-list-append-all-empty-array.md +5 -0
  214. package/repos/effect/.changeset/eff-777-schema-make-effect.md +5 -0
  215. package/repos/effect/.changeset/eff-778-http-middleware-path-logger.md +5 -0
  216. package/repos/effect/.changeset/eff-779-keyvaluestore-layer-sql.md +5 -0
  217. package/repos/effect/.changeset/eff-780-layer-unify.md +5 -0
  218. package/repos/effect/.changeset/eff-781-fix-stream-toqueue-types.md +5 -0
  219. package/repos/effect/.changeset/eff-782-httpapi-status-literals.md +5 -0
  220. package/repos/effect/.changeset/eff-783-atom-http-api-errors.md +5 -0
  221. package/repos/effect/.changeset/eff-819-cluster-workflow-shard-groups.md +5 -0
  222. package/repos/effect/.changeset/eight-turkeys-own.md +7 -0
  223. package/repos/effect/.changeset/eighty-lies-deny.md +5 -0
  224. package/repos/effect/.changeset/eighty-poets-draw.md +9 -0
  225. package/repos/effect/.changeset/eighty-swans-scream.md +5 -0
  226. package/repos/effect/.changeset/eighty-teeth-sniff.md +5 -0
  227. package/repos/effect/.changeset/eleven-apes-share.md +5 -0
  228. package/repos/effect/.changeset/eleven-numbers-bake.md +5 -0
  229. package/repos/effect/.changeset/empty-gifts-beg.md +5 -0
  230. package/repos/effect/.changeset/empty-http-rpc-client.md +5 -0
  231. package/repos/effect/.changeset/eventlog-unencrypted.md +5 -0
  232. package/repos/effect/.changeset/expand-schema-filter-output.md +24 -0
  233. package/repos/effect/.changeset/export-schema-encode-keys-interface.md +7 -0
  234. package/repos/effect/.changeset/extract-semaphore-latch.md +10 -0
  235. package/repos/effect/.changeset/fair-bees-relax.md +5 -0
  236. package/repos/effect/.changeset/fair-buttons-share.md +7 -0
  237. package/repos/effect/.changeset/fair-cooks-stop.md +5 -0
  238. package/repos/effect/.changeset/fair-cups-train.md +5 -0
  239. package/repos/effect/.changeset/fair-dryers-speak.md +5 -0
  240. package/repos/effect/.changeset/fair-forks-shake.md +5 -0
  241. package/repos/effect/.changeset/fair-pandas-prove.md +5 -0
  242. package/repos/effect/.changeset/fair-pants-float.md +5 -0
  243. package/repos/effect/.changeset/fair-poems-visit.md +5 -0
  244. package/repos/effect/.changeset/famous-wolves-lead.md +5 -0
  245. package/repos/effect/.changeset/fancy-glasses-grow.md +5 -0
  246. package/repos/effect/.changeset/fast-times-camp.md +5 -0
  247. package/repos/effect/.changeset/few-birds-matter.md +5 -0
  248. package/repos/effect/.changeset/few-cougars-dig.md +5 -0
  249. package/repos/effect/.changeset/few-foxes-grin.md +5 -0
  250. package/repos/effect/.changeset/few-mirrors-pull.md +14 -0
  251. package/repos/effect/.changeset/few-socks-poke.md +5 -0
  252. package/repos/effect/.changeset/fiber-runtime-start-metrics.md +5 -0
  253. package/repos/effect/.changeset/fiery-jokes-care.md +5 -0
  254. package/repos/effect/.changeset/fiery-mammals-call.md +5 -0
  255. package/repos/effect/.changeset/fine-walls-decide.md +5 -0
  256. package/repos/effect/.changeset/first-success-of.md +5 -0
  257. package/repos/effect/.changeset/five-parents-relax.md +5 -0
  258. package/repos/effect/.changeset/five-worms-rhyme.md +5 -0
  259. package/repos/effect/.changeset/fix-1332.md +5 -0
  260. package/repos/effect/.changeset/fix-1917.md +11 -0
  261. package/repos/effect/.changeset/fix-1927.md +5 -0
  262. package/repos/effect/.changeset/fix-1940.md +7 -0
  263. package/repos/effect/.changeset/fix-1947.md +7 -0
  264. package/repos/effect/.changeset/fix-2002.md +5 -0
  265. package/repos/effect/.changeset/fix-2012.md +5 -0
  266. package/repos/effect/.changeset/fix-2015.md +5 -0
  267. package/repos/effect/.changeset/fix-2260.md +5 -0
  268. package/repos/effect/.changeset/fix-2268.md +5 -0
  269. package/repos/effect/.changeset/fix-2271.md +5 -0
  270. package/repos/effect/.changeset/fix-2384.md +7 -0
  271. package/repos/effect/.changeset/fix-ai-empty-params-structured-output.md +5 -0
  272. package/repos/effect/.changeset/fix-ai-text-toolkit-typing.md +5 -0
  273. package/repos/effect/.changeset/fix-catch-orelse-error-erasure.md +5 -0
  274. package/repos/effect/.changeset/fix-class-constructor-defaults.md +5 -0
  275. package/repos/effect/.changeset/fix-cli-mixed-global-flag-context.md +7 -0
  276. package/repos/effect/.changeset/fix-config-withDefault.md +5 -0
  277. package/repos/effect/.changeset/fix-config-withdefault-filter.md +7 -0
  278. package/repos/effect/.changeset/fix-datetime-gmt.md +5 -0
  279. package/repos/effect/.changeset/fix-devtools-flush-on-teardown.md +10 -0
  280. package/repos/effect/.changeset/fix-duration-symmetric-rounding.md +5 -0
  281. package/repos/effect/.changeset/fix-entity-manager-defect-replay.md +5 -0
  282. package/repos/effect/.changeset/fix-entity-proxy-rpc-handler-context.md +5 -0
  283. package/repos/effect/.changeset/fix-entity-proxy-server-path-params.md +5 -0
  284. package/repos/effect/.changeset/fix-from-readable-stream-cancel-defect.md +5 -0
  285. package/repos/effect/.changeset/fix-graph-undirected-traversal.md +5 -0
  286. package/repos/effect/.changeset/fix-has-interrupts-only-empty.md +5 -0
  287. package/repos/effect/.changeset/fix-hashmap-bit31-ordering.md +5 -0
  288. package/repos/effect/.changeset/fix-headers-proto-enumerability.md +5 -0
  289. package/repos/effect/.changeset/fix-http-incoming-message-parse-options.md +5 -0
  290. package/repos/effect/.changeset/fix-httpapi-endpoint-error-inference.md +5 -0
  291. package/repos/effect/.changeset/fix-httpapi-schema-types.md +5 -0
  292. package/repos/effect/.changeset/fix-httpapi-security-middleware-cache.md +5 -0
  293. package/repos/effect/.changeset/fix-is-json-dag.md +7 -0
  294. package/repos/effect/.changeset/fix-json-schema-anyof-oneof-siblings.md +5 -0
  295. package/repos/effect/.changeset/fix-json-schema-import-json.md +5 -0
  296. package/repos/effect/.changeset/fix-keepalive-blocked-timers.md +5 -0
  297. package/repos/effect/.changeset/fix-mcp-param-name-resolution.md +5 -0
  298. package/repos/effect/.changeset/fix-mermaid-escape-special-chars.md +5 -0
  299. package/repos/effect/.changeset/fix-mutable-list-filter-length.md +5 -0
  300. package/repos/effect/.changeset/fix-object-keyword-json-schema.md +5 -0
  301. package/repos/effect/.changeset/fix-openai-mcp-tool-names.md +5 -0
  302. package/repos/effect/.changeset/fix-openapi-generator-form-urlencoded.md +5 -0
  303. package/repos/effect/.changeset/fix-openapi-generator-swagger2openapi.md +5 -0
  304. package/repos/effect/.changeset/fix-openapi-preserve-multiple-response-content-types.md +5 -0
  305. package/repos/effect/.changeset/fix-openrouter-sparse-array.md +5 -0
  306. package/repos/effect/.changeset/fix-otel-logger-clock-skew.md +7 -0
  307. package/repos/effect/.changeset/fix-otel-logger-severity-number.md +20 -0
  308. package/repos/effect/.changeset/fix-queue-collect-duplication.md +5 -0
  309. package/repos/effect/.changeset/fix-random-string-seeds.md +5 -0
  310. package/repos/effect/.changeset/fix-ratelimiter-tokenbucket-redis-ttl.md +5 -0
  311. package/repos/effect/.changeset/fix-remainder-scientific-notation.md +5 -0
  312. package/repos/effect/.changeset/fix-request-resolver-pending-batches-leak.md +5 -0
  313. package/repos/effect/.changeset/fix-retry-transient-autocomplete.md +5 -0
  314. package/repos/effect/.changeset/fix-rpc-http-requestids-finalizer.md +5 -0
  315. package/repos/effect/.changeset/fix-rpc-json-id-edges.md +5 -0
  316. package/repos/effect/.changeset/fix-schedule-fixed-double-exec.md +9 -0
  317. package/repos/effect/.changeset/fix-schedule-reduce-sync-state.md +5 -0
  318. package/repos/effect/.changeset/fix-schema-arbitrary-exclusive-bounds.md +5 -0
  319. package/repos/effect/.changeset/fix-schema-defect-message.md +5 -0
  320. package/repos/effect/.changeset/fix-schema-encode-keys-property-keys.md +5 -0
  321. package/repos/effect/.changeset/fix-schema-encodekeys-class.md +5 -0
  322. package/repos/effect/.changeset/fix-schema-encodekeys-struct.md +5 -0
  323. package/repos/effect/.changeset/fix-schema-identifier-expected-message.md +5 -0
  324. package/repos/effect/.changeset/fix-schema-is-uuid.md +5 -0
  325. package/repos/effect/.changeset/fix-schema-option-non-schema-failures.md +17 -0
  326. package/repos/effect/.changeset/fix-schema-parser-checks.md +9 -0
  327. package/repos/effect/.changeset/fix-searchparam-initial-decode.md +5 -0
  328. package/repos/effect/.changeset/fix-serializable-wire-transfer.md +7 -0
  329. package/repos/effect/.changeset/fix-stream-grouped-within-flush.md +5 -0
  330. package/repos/effect/.changeset/fix-stream-run-for-each-while.md +5 -0
  331. package/repos/effect/.changeset/fix-stream-scan-effect.md +5 -0
  332. package/repos/effect/.changeset/fix-stream-scoped-scope.md +5 -0
  333. package/repos/effect/.changeset/fix-strip-approval-artifacts-multi-round.md +13 -0
  334. package/repos/effect/.changeset/fix-struct-utility-types-simplify.md +5 -0
  335. package/repos/effect/.changeset/fix-structwithrest-index-signatures.md +6 -0
  336. package/repos/effect/.changeset/fix-tagged-union-class-sentinels.md +5 -0
  337. package/repos/effect/.changeset/fix-tagged-union-match-unify.md +6 -0
  338. package/repos/effect/.changeset/fix-to-tagged-union-isanyof-custom-tags.md +10 -0
  339. package/repos/effect/.changeset/fix-tuple-with-rest-post-rest-index-drift.md +5 -0
  340. package/repos/effect/.changeset/fix-tuple-with-rest-post-rest-validation.md +5 -0
  341. package/repos/effect/.changeset/fix-types-voidifempty.md +5 -0
  342. package/repos/effect/.changeset/fix-void-response-encoding.md +5 -0
  343. package/repos/effect/.changeset/fix-workflow-proxy-rpc-handler-context.md +5 -0
  344. package/repos/effect/.changeset/flat-chicken-remain.md +5 -0
  345. package/repos/effect/.changeset/floppy-cows-spend.md +5 -0
  346. package/repos/effect/.changeset/floppy-items-admire.md +5 -0
  347. package/repos/effect/.changeset/floppy-pigs-kiss.md +5 -0
  348. package/repos/effect/.changeset/fluffy-meals-matter.md +5 -0
  349. package/repos/effect/.changeset/fluffy-pumas-push.md +5 -0
  350. package/repos/effect/.changeset/forked-memo-maps.md +6 -0
  351. package/repos/effect/.changeset/forty-hounds-cheer.md +5 -0
  352. package/repos/effect/.changeset/forty-otters-cry.md +5 -0
  353. package/repos/effect/.changeset/forty-rings-film.md +7 -0
  354. package/repos/effect/.changeset/forty-signs-stay.md +5 -0
  355. package/repos/effect/.changeset/forty-swans-divide.md +5 -0
  356. package/repos/effect/.changeset/forty-trees-pay.md +5 -0
  357. package/repos/effect/.changeset/four-papayas-bow.md +5 -0
  358. package/repos/effect/.changeset/four-points-repeat.md +5 -0
  359. package/repos/effect/.changeset/fresh-cats-smash.md +5 -0
  360. package/repos/effect/.changeset/fresh-emus-cheat.md +5 -0
  361. package/repos/effect/.changeset/fresh-monkeys-smoke.md +9 -0
  362. package/repos/effect/.changeset/fruity-houses-learn.md +6 -0
  363. package/repos/effect/.changeset/full-adults-double.md +5 -0
  364. package/repos/effect/.changeset/funny-crabs-hang.md +6 -0
  365. package/repos/effect/.changeset/funny-forks-move.md +5 -0
  366. package/repos/effect/.changeset/fuzzy-camels-hunt.md +5 -0
  367. package/repos/effect/.changeset/fuzzy-dodos-help.md +5 -0
  368. package/repos/effect/.changeset/fuzzy-lions-perform.md +5 -0
  369. package/repos/effect/.changeset/fuzzy-planets-sneeze.md +5 -0
  370. package/repos/effect/.changeset/gold-meteors-move.md +5 -0
  371. package/repos/effect/.changeset/gold-readers-hug.md +5 -0
  372. package/repos/effect/.changeset/gold-rings-start.md +5 -0
  373. package/repos/effect/.changeset/good-tools-work.md +7 -0
  374. package/repos/effect/.changeset/graph-algorithm-fixes.md +5 -0
  375. package/repos/effect/.changeset/great-trains-mate.md +5 -0
  376. package/repos/effect/.changeset/great-trams-report.md +5 -0
  377. package/repos/effect/.changeset/green-beds-unref.md +7 -0
  378. package/repos/effect/.changeset/green-chips-wash.md +5 -0
  379. package/repos/effect/.changeset/green-moons-smile.md +5 -0
  380. package/repos/effect/.changeset/green-pugs-play.md +5 -0
  381. package/repos/effect/.changeset/green-rings-prove.md +5 -0
  382. package/repos/effect/.changeset/happy-mirrors-dream.md +5 -0
  383. package/repos/effect/.changeset/heavy-loops-cut.md +5 -0
  384. package/repos/effect/.changeset/heavy-trams-fix.md +5 -0
  385. package/repos/effect/.changeset/hip-socks-travel.md +5 -0
  386. package/repos/effect/.changeset/honest-pens-thank.md +5 -0
  387. package/repos/effect/.changeset/honest-rivers-notice.md +5 -0
  388. package/repos/effect/.changeset/hot-taxis-fry.md +5 -0
  389. package/repos/effect/.changeset/httpapi-endpoint-relax-constraints.md +5 -0
  390. package/repos/effect/.changeset/httpapi-schema-service-types.md +6 -0
  391. package/repos/effect/.changeset/huge-moons-rhyme.md +5 -0
  392. package/repos/effect/.changeset/humble-pigs-dig.md +5 -0
  393. package/repos/effect/.changeset/icy-flies-cross.md +5 -0
  394. package/repos/effect/.changeset/itchy-radios-poke.md +5 -0
  395. package/repos/effect/.changeset/itchy-results-bet.md +5 -0
  396. package/repos/effect/.changeset/itchy-shrimps-deny.md +5 -0
  397. package/repos/effect/.changeset/itchy-toes-promise.md +5 -0
  398. package/repos/effect/.changeset/k8s-last-transition-null.md +5 -0
  399. package/repos/effect/.changeset/khaki-cats-learn.md +5 -0
  400. package/repos/effect/.changeset/khaki-melons-appear.md +5 -0
  401. package/repos/effect/.changeset/kind-hounds-float.md +5 -0
  402. package/repos/effect/.changeset/kind-windows-fall.md +5 -0
  403. package/repos/effect/.changeset/late-hotels-rule.md +5 -0
  404. package/repos/effect/.changeset/late-lamps-care.md +5 -0
  405. package/repos/effect/.changeset/late-rivers-applaud.md +5 -0
  406. package/repos/effect/.changeset/layer-map-dynamic-idle-ttl.md +5 -0
  407. package/repos/effect/.changeset/lazy-queens-rush.md +5 -0
  408. package/repos/effect/.changeset/lazy-recursive-forward-refs.md +5 -0
  409. package/repos/effect/.changeset/lazy-timers-exist.md +5 -0
  410. package/repos/effect/.changeset/legal-pants-drop.md +5 -0
  411. package/repos/effect/.changeset/lemon-taxis-sin.md +5 -0
  412. package/repos/effect/.changeset/light-kids-sneeze.md +5 -0
  413. package/repos/effect/.changeset/little-dryers-allow.md +7 -0
  414. package/repos/effect/.changeset/long-cameras-think.md +5 -0
  415. package/repos/effect/.changeset/lovely-cobras-change.md +5 -0
  416. package/repos/effect/.changeset/lovely-frogs-rescue.md +5 -0
  417. package/repos/effect/.changeset/lucky-buttons-jump.md +5 -0
  418. package/repos/effect/.changeset/lucky-phones-listen.md +5 -0
  419. package/repos/effect/.changeset/lucky-worms-type.md +5 -0
  420. package/repos/effect/.changeset/mean-dingos-share.md +5 -0
  421. package/repos/effect/.changeset/mean-trains-smash.md +5 -0
  422. package/repos/effect/.changeset/metal-parts-yell.md +5 -0
  423. package/repos/effect/.changeset/mighty-games-matter.md +5 -0
  424. package/repos/effect/.changeset/modern-uuid-guid-filter.md +5 -0
  425. package/repos/effect/.changeset/nasty-geese-grow.md +5 -0
  426. package/repos/effect/.changeset/neat-goats-wave.md +5 -0
  427. package/repos/effect/.changeset/neat-kings-chew.md +5 -0
  428. package/repos/effect/.changeset/neat-lions-rest.md +5 -0
  429. package/repos/effect/.changeset/neat-snails-wash.md +5 -0
  430. package/repos/effect/.changeset/neat-taxis-notice.md +5 -0
  431. package/repos/effect/.changeset/new-dogs-swim.md +5 -0
  432. package/repos/effect/.changeset/new-toes-stop.md +5 -0
  433. package/repos/effect/.changeset/ninety-geese-exist.md +5 -0
  434. package/repos/effect/.changeset/odd-boats-think.md +5 -0
  435. package/repos/effect/.changeset/odd-bulldogs-sleep.md +5 -0
  436. package/repos/effect/.changeset/odd-fans-glow.md +5 -0
  437. package/repos/effect/.changeset/odd-forks-talk.md +5 -0
  438. package/repos/effect/.changeset/odd-laws-draw.md +5 -0
  439. package/repos/effect/.changeset/odd-owls-smoke.md +5 -0
  440. package/repos/effect/.changeset/odd-socks-boil.md +5 -0
  441. package/repos/effect/.changeset/odd-suns-dance.md +5 -0
  442. package/repos/effect/.changeset/old-brooms-cry.md +5 -0
  443. package/repos/effect/.changeset/old-facts-stand.md +5 -0
  444. package/repos/effect/.changeset/old-mirrors-float.md +5 -0
  445. package/repos/effect/.changeset/olive-poems-visit.md +5 -0
  446. package/repos/effect/.changeset/open-hotels-remain.md +5 -0
  447. package/repos/effect/.changeset/openai-compat-nullable-tool-name.md +7 -0
  448. package/repos/effect/.changeset/openai-compat-reasoning.md +5 -0
  449. package/repos/effect/.changeset/otel-resource-env-precedence.md +5 -0
  450. package/repos/effect/.changeset/perfect-buckets-tickle.md +5 -0
  451. package/repos/effect/.changeset/petite-months-allow.md +6 -0
  452. package/repos/effect/.changeset/platform-crypto-service.md +9 -0
  453. package/repos/effect/.changeset/platform-node-shared-barrel.md +5 -0
  454. package/repos/effect/.changeset/plenty-moons-pull.md +5 -0
  455. package/repos/effect/.changeset/polite-brooms-tickle.md +5 -0
  456. package/repos/effect/.changeset/polite-pigs-speak.md +5 -0
  457. package/repos/effect/.changeset/polite-tables-kneel.md +5 -0
  458. package/repos/effect/.changeset/port-react-hydration.md +8 -0
  459. package/repos/effect/.changeset/pre.json +588 -0
  460. package/repos/effect/.changeset/public-deer-ring.md +5 -0
  461. package/repos/effect/.changeset/public-jeans-stop.md +5 -0
  462. package/repos/effect/.changeset/pubsub-publish-false.md +5 -0
  463. package/repos/effect/.changeset/puny-pens-clap.md +6 -0
  464. package/repos/effect/.changeset/purple-bars-prove.md +5 -0
  465. package/repos/effect/.changeset/purple-schools-float.md +5 -0
  466. package/repos/effect/.changeset/purple-turtles-draw.md +5 -0
  467. package/repos/effect/.changeset/quick-dragons-fix.md +5 -0
  468. package/repos/effect/.changeset/quick-falcons-travel.md +5 -0
  469. package/repos/effect/.changeset/quick-geese-relax.md +5 -0
  470. package/repos/effect/.changeset/quick-lamps-dig.md +5 -0
  471. package/repos/effect/.changeset/quick-lizards-fall.md +5 -0
  472. package/repos/effect/.changeset/quick-trees-join.md +5 -0
  473. package/repos/effect/.changeset/quiet-carpets-grin.md +5 -0
  474. package/repos/effect/.changeset/quiet-files-hunt.md +5 -0
  475. package/repos/effect/.changeset/quiet-lamps-jam.md +5 -0
  476. package/repos/effect/.changeset/quiet-radios-wave.md +5 -0
  477. package/repos/effect/.changeset/quiet-redis-scripts.md +5 -0
  478. package/repos/effect/.changeset/ready-olives-divide.md +5 -0
  479. package/repos/effect/.changeset/real-trains-ring.md +5 -0
  480. package/repos/effect/.changeset/red-pigs-repair.md +5 -0
  481. package/repos/effect/.changeset/redacted-representation-options.md +7 -0
  482. package/repos/effect/.changeset/refactor-cli-global-flags.md +27 -0
  483. package/repos/effect/.changeset/refactor-config-provider.md +23 -0
  484. package/repos/effect/.changeset/refactor-representation-references.md +5 -0
  485. package/repos/effect/.changeset/remove-effect-transactionwith.md +5 -0
  486. package/repos/effect/.changeset/remove-http-span-counter.md +5 -0
  487. package/repos/effect/.changeset/remove-nullor.md +5 -0
  488. package/repos/effect/.changeset/remove-openapi-fromapi-options.md +7 -0
  489. package/repos/effect/.changeset/remove-types-mergerecord.md +5 -0
  490. package/repos/effect/.changeset/remove-unused-utils-apis.md +5 -0
  491. package/repos/effect/.changeset/rename-rebuild-out.md +5 -0
  492. package/repos/effect/.changeset/restore-schema-parse-options.md +5 -0
  493. package/repos/effect/.changeset/rich-dots-push.md +5 -0
  494. package/repos/effect/.changeset/rich-hoops-nail.md +5 -0
  495. package/repos/effect/.changeset/rich-sloths-draw.md +5 -0
  496. package/repos/effect/.changeset/ripe-lies-battle.md +5 -0
  497. package/repos/effect/.changeset/rpc-middleware-provides-fix.md +5 -0
  498. package/repos/effect/.changeset/scalar-custom-fetch.md +5 -0
  499. package/repos/effect/.changeset/schema-as-class.md +17 -0
  500. package/repos/effect/.changeset/schema-asserts-signature.md +5 -0
  501. package/repos/effect/.changeset/schema-clean-up-additionalProperties.md +7 -0
  502. package/repos/effect/.changeset/schema-datetime-utc-from-string.md +5 -0
  503. package/repos/effect/.changeset/schema-decoding-defaults-services.md +7 -0
  504. package/repos/effect/.changeset/schema-defaults-issue-channel.md +7 -0
  505. package/repos/effect/.changeset/schema-dollar-prefix.md +5 -0
  506. package/repos/effect/.changeset/schema-missing-self-generic.md +5 -0
  507. package/repos/effect/.changeset/schema-ordered-arbitrary-constraints.md +12 -0
  508. package/repos/effect/.changeset/schema-parser-adapter-errors.md +5 -0
  509. package/repos/effect/.changeset/schema-refactor-toCodecJson.md +5 -0
  510. package/repos/effect/.changeset/schema-remove-annotate-in.md +5 -0
  511. package/repos/effect/.changeset/schema-rename-makeUnsafe-to-make.md +7 -0
  512. package/repos/effect/.changeset/schema-rename-parser-makeUnsafe.md +5 -0
  513. package/repos/effect/.changeset/schema-result-combinators.md +5 -0
  514. package/repos/effect/.changeset/schema-struct-simplify.md +5 -0
  515. package/repos/effect/.changeset/seven-mugs-marry.md +5 -0
  516. package/repos/effect/.changeset/shaggy-birds-stay.md +5 -0
  517. package/repos/effect/.changeset/shaggy-cities-push.md +5 -0
  518. package/repos/effect/.changeset/shaggy-numbers-accept.md +5 -0
  519. package/repos/effect/.changeset/sharp-emus-applaud.md +5 -0
  520. package/repos/effect/.changeset/sharp-goats-wink.md +5 -0
  521. package/repos/effect/.changeset/sharp-pandas-care.md +5 -0
  522. package/repos/effect/.changeset/sharp-peas-march.md +5 -0
  523. package/repos/effect/.changeset/sharp-rules-draw.md +5 -0
  524. package/repos/effect/.changeset/sharp-singers-sort.md +5 -0
  525. package/repos/effect/.changeset/shiny-trains-hug.md +5 -0
  526. package/repos/effect/.changeset/short-cows-relate.md +5 -0
  527. package/repos/effect/.changeset/short-foxes-admire.md +5 -0
  528. package/repos/effect/.changeset/shy-cycles-flow.md +5 -0
  529. package/repos/effect/.changeset/shy-geckos-sniff.md +30 -0
  530. package/repos/effect/.changeset/silent-geckos-matter.md +5 -0
  531. package/repos/effect/.changeset/silent-needles-design.md +6 -0
  532. package/repos/effect/.changeset/silent-plants-matter.md +8 -0
  533. package/repos/effect/.changeset/silent-spoons-stare.md +5 -0
  534. package/repos/effect/.changeset/silly-loops-tickle.md +5 -0
  535. package/repos/effect/.changeset/silver-bulk-indexeddb.md +5 -0
  536. package/repos/effect/.changeset/silver-emus-smoke.md +5 -0
  537. package/repos/effect/.changeset/silver-kings-poke.md +5 -0
  538. package/repos/effect/.changeset/silver-snails-sqlite.md +17 -0
  539. package/repos/effect/.changeset/silver-wings-watch.md +5 -0
  540. package/repos/effect/.changeset/six-cups-taste.md +5 -0
  541. package/repos/effect/.changeset/sixty-mails-shout.md +5 -0
  542. package/repos/effect/.changeset/sixty-socks-yell.md +5 -0
  543. package/repos/effect/.changeset/slimy-planets-divide.md +5 -0
  544. package/repos/effect/.changeset/slimy-turtles-juggle.md +5 -0
  545. package/repos/effect/.changeset/slow-beans-battle.md +28 -0
  546. package/repos/effect/.changeset/slow-berries-enjoy.md +5 -0
  547. package/repos/effect/.changeset/small-bugs-hunt.md +5 -0
  548. package/repos/effect/.changeset/small-crabs-care.md +9 -0
  549. package/repos/effect/.changeset/small-pets-sit.md +6 -0
  550. package/repos/effect/.changeset/smart-ducks-jump.md +6 -0
  551. package/repos/effect/.changeset/smart-pillows-buy.md +6 -0
  552. package/repos/effect/.changeset/smart-timers-fly.md +5 -0
  553. package/repos/effect/.changeset/smart-tips-sort.md +5 -0
  554. package/repos/effect/.changeset/social-pumas-prove.md +5 -0
  555. package/repos/effect/.changeset/soft-comics-wink.md +5 -0
  556. package/repos/effect/.changeset/soft-delete-sqlmodel.md +5 -0
  557. package/repos/effect/.changeset/soft-seals-allow.md +5 -0
  558. package/repos/effect/.changeset/solid-cougars-attack.md +5 -0
  559. package/repos/effect/.changeset/solid-doors-ring.md +5 -0
  560. package/repos/effect/.changeset/solid-items-tease.md +5 -0
  561. package/repos/effect/.changeset/solid-towns-smoke.md +5 -0
  562. package/repos/effect/.changeset/sour-canyons-rescue.md +5 -0
  563. package/repos/effect/.changeset/sparkly-bears-act.md +5 -0
  564. package/repos/effect/.changeset/sparkly-coins-sit.md +5 -0
  565. package/repos/effect/.changeset/spotty-comics-fry.md +5 -0
  566. package/repos/effect/.changeset/sql-migrator-mjs-mts.md +5 -0
  567. package/repos/effect/.changeset/stale-dots-tell.md +5 -0
  568. package/repos/effect/.changeset/stale-snakes-know.md +5 -0
  569. package/repos/effect/.changeset/strict-areas-end.md +5 -0
  570. package/repos/effect/.changeset/strict-buckets-hug.md +8 -0
  571. package/repos/effect/.changeset/strip-resolved-approvals.md +5 -0
  572. package/repos/effect/.changeset/strong-balloons-tickle.md +5 -0
  573. package/repos/effect/.changeset/strong-bees-queue.md +5 -0
  574. package/repos/effect/.changeset/struct-record.md +5 -0
  575. package/repos/effect/.changeset/sunny-ads-hang.md +5 -0
  576. package/repos/effect/.changeset/sunny-bikes-sleep.md +5 -0
  577. package/repos/effect/.changeset/sunny-rooms-invent.md +5 -0
  578. package/repos/effect/.changeset/sweet-donuts-bet.md +5 -0
  579. package/repos/effect/.changeset/sweet-hotels-give.md +5 -0
  580. package/repos/effect/.changeset/sweet-views-learn.md +5 -0
  581. package/repos/effect/.changeset/swift-spiders-unpack.md +5 -0
  582. package/repos/effect/.changeset/swift-symbols-stand.md +5 -0
  583. package/repos/effect/.changeset/tagged-error-class-optional-empty-props.md +5 -0
  584. package/repos/effect/.changeset/tall-hairs-return.md +5 -0
  585. package/repos/effect/.changeset/tall-mails-listen.md +5 -0
  586. package/repos/effect/.changeset/tall-queens-cheer.md +5 -0
  587. package/repos/effect/.changeset/tall-wombats-wave.md +5 -0
  588. package/repos/effect/.changeset/tangy-colts-lose.md +5 -0
  589. package/repos/effect/.changeset/tasty-comics-send.md +5 -0
  590. package/repos/effect/.changeset/ten-kings-fry.md +5 -0
  591. package/repos/effect/.changeset/thick-pandas-wait.md +5 -0
  592. package/repos/effect/.changeset/thin-ducks-wonder.md +5 -0
  593. package/repos/effect/.changeset/thirty-ducks-go.md +5 -0
  594. package/repos/effect/.changeset/thirty-pans-love.md +5 -0
  595. package/repos/effect/.changeset/three-corners-sort.md +5 -0
  596. package/repos/effect/.changeset/three-ravens-jam.md +5 -0
  597. package/repos/effect/.changeset/three-tomatoes-wave.md +5 -0
  598. package/repos/effect/.changeset/tidy-foxes-own.md +5 -0
  599. package/repos/effect/.changeset/tidy-icons-glow.md +5 -0
  600. package/repos/effect/.changeset/tidy-stacks-encode.md +5 -0
  601. package/repos/effect/.changeset/tidy-stars-drive.md +5 -0
  602. package/repos/effect/.changeset/tiny-buckets-wave.md +5 -0
  603. package/repos/effect/.changeset/tiny-lilies-flash.md +5 -0
  604. package/repos/effect/.changeset/tiny-rabbits-smile.md +5 -0
  605. package/repos/effect/.changeset/tocodecjson-return-json-type.md +10 -0
  606. package/repos/effect/.changeset/tool-get-json-schema-tests.md +5 -0
  607. package/repos/effect/.changeset/true-actors-battle.md +5 -0
  608. package/repos/effect/.changeset/twenty-buttons-cheer.md +5 -0
  609. package/repos/effect/.changeset/two-roses-double.md +5 -0
  610. package/repos/effect/.changeset/unify-error-defect-stack-options.md +23 -0
  611. package/repos/effect/.changeset/update-schema-arbitrary-report.md +22 -0
  612. package/repos/effect/.changeset/upset-colts-stick.md +5 -0
  613. package/repos/effect/.changeset/vast-bananas-send.md +5 -0
  614. package/repos/effect/.changeset/vast-deserts-travel.md +5 -0
  615. package/repos/effect/.changeset/violet-peaches-feel.md +5 -0
  616. package/repos/effect/.changeset/vitest-layer-top-level-options.md +5 -0
  617. package/repos/effect/.changeset/wacky-grapes-poke.md +5 -0
  618. package/repos/effect/.changeset/wacky-rice-add.md +5 -0
  619. package/repos/effect/.changeset/warm-dolls-brake.md +5 -0
  620. package/repos/effect/.changeset/warm-friends-tie.md +5 -0
  621. package/repos/effect/.changeset/warm-snails-shop.md +7 -0
  622. package/repos/effect/.changeset/wet-news-invent.md +5 -0
  623. package/repos/effect/.changeset/wild-readers-clean.md +5 -0
  624. package/repos/effect/.changeset/wild-suns-bearer-space.md +5 -0
  625. package/repos/effect/.changeset/wise-ants-wave.md +6 -0
  626. package/repos/effect/.changeset/wise-flags-shift.md +22 -0
  627. package/repos/effect/.changeset/wise-oranges-stay.md +5 -0
  628. package/repos/effect/.changeset/witty-lobsters-share.md +5 -0
  629. package/repos/effect/.changeset/yellow-adults-study.md +5 -0
  630. package/repos/effect/.changeset/yellow-clocks-dance.md +5 -0
  631. package/repos/effect/.changeset/yellow-dingos-jump.md +5 -0
  632. package/repos/effect/.changeset/young-doors-change.md +5 -0
  633. package/repos/effect/.envrc +1 -0
  634. package/repos/effect/.github/actions/setup/action.yaml +33 -0
  635. package/repos/effect/.github/workflows/ai-codegen.yml +66 -0
  636. package/repos/effect/.github/workflows/bundle-comment.yml +72 -0
  637. package/repos/effect/.github/workflows/check.yml +195 -0
  638. package/repos/effect/.github/workflows/release.yml +47 -0
  639. package/repos/effect/.github/workflows/snapshot.yml +34 -0
  640. package/repos/effect/.oxlintrc.json +25 -0
  641. package/repos/effect/.patterns/effect.md +102 -0
  642. package/repos/effect/.patterns/jsdoc.md +53 -0
  643. package/repos/effect/.patterns/testing.md +44 -0
  644. package/repos/effect/.specs/README.md +2 -0
  645. package/repos/effect/.vscode/extensions.json +6 -0
  646. package/repos/effect/.vscode/settings.json +44 -0
  647. package/repos/effect/AGENTS.md +139 -0
  648. package/repos/effect/LICENSE +21 -0
  649. package/repos/effect/LLMS.md +343 -0
  650. package/repos/effect/MIGRATION.md +83 -0
  651. package/repos/effect/README.md +3 -0
  652. package/repos/effect/TODOS.md +28 -0
  653. package/repos/effect/ai-docs/README.md +44 -0
  654. package/repos/effect/ai-docs/package.json +36 -0
  655. package/repos/effect/ai-docs/src/01_effect/01_basics/01_effect-gen.ts +30 -0
  656. package/repos/effect/ai-docs/src/01_effect/01_basics/02_effect-fn.ts +39 -0
  657. package/repos/effect/ai-docs/src/01_effect/01_basics/10_creating-effects.ts +74 -0
  658. package/repos/effect/ai-docs/src/01_effect/01_basics/index.md +5 -0
  659. package/repos/effect/ai-docs/src/01_effect/02_services/01_service.ts +45 -0
  660. package/repos/effect/ai-docs/src/01_effect/02_services/10_reference.ts +10 -0
  661. package/repos/effect/ai-docs/src/01_effect/02_services/20_layer-composition.ts +70 -0
  662. package/repos/effect/ai-docs/src/01_effect/02_services/20_layer-unwrap.ts +66 -0
  663. package/repos/effect/ai-docs/src/01_effect/02_services/index.md +5 -0
  664. package/repos/effect/ai-docs/src/01_effect/03_errors/01_error-handling.ts +30 -0
  665. package/repos/effect/ai-docs/src/01_effect/03_errors/10_catch-tags.ts +24 -0
  666. package/repos/effect/ai-docs/src/01_effect/03_errors/20_reason-errors.ts +64 -0
  667. package/repos/effect/ai-docs/src/01_effect/03_errors/index.md +1 -0
  668. package/repos/effect/ai-docs/src/01_effect/04_resources/10_acquire-release.ts +105 -0
  669. package/repos/effect/ai-docs/src/01_effect/04_resources/20_layer-side-effects.ts +31 -0
  670. package/repos/effect/ai-docs/src/01_effect/04_resources/30_layer-map.ts +86 -0
  671. package/repos/effect/ai-docs/src/01_effect/04_resources/index.md +3 -0
  672. package/repos/effect/ai-docs/src/01_effect/05_running/10_run-main.ts +30 -0
  673. package/repos/effect/ai-docs/src/01_effect/05_running/20_layer-launch.ts +27 -0
  674. package/repos/effect/ai-docs/src/01_effect/05_running/index.md +1 -0
  675. package/repos/effect/ai-docs/src/01_effect/06_pubsub/10_pubsub.ts +56 -0
  676. package/repos/effect/ai-docs/src/01_effect/06_pubsub/index.md +3 -0
  677. package/repos/effect/ai-docs/src/02_stream/10_creating-streams.ts +103 -0
  678. package/repos/effect/ai-docs/src/02_stream/20_consuming-streams.ts +137 -0
  679. package/repos/effect/ai-docs/src/02_stream/30_encoding.ts +165 -0
  680. package/repos/effect/ai-docs/src/02_stream/index.md +4 -0
  681. package/repos/effect/ai-docs/src/03_integration/10_managed-runtime.ts +129 -0
  682. package/repos/effect/ai-docs/src/03_integration/index.md +5 -0
  683. package/repos/effect/ai-docs/src/05_batching/10_request-resolver.ts +89 -0
  684. package/repos/effect/ai-docs/src/05_batching/index.md +3 -0
  685. package/repos/effect/ai-docs/src/06_schedule/10_schedules.ts +102 -0
  686. package/repos/effect/ai-docs/src/06_schedule/index.md +3 -0
  687. package/repos/effect/ai-docs/src/07_datetime/10_creating-and-formatting.ts +30 -0
  688. package/repos/effect/ai-docs/src/07_datetime/20_time-zones.ts +44 -0
  689. package/repos/effect/ai-docs/src/07_datetime/index.md +5 -0
  690. package/repos/effect/ai-docs/src/08_observability/10_logging.ts +66 -0
  691. package/repos/effect/ai-docs/src/08_observability/20_otlp-tracing.ts +95 -0
  692. package/repos/effect/ai-docs/src/08_observability/index.md +7 -0
  693. package/repos/effect/ai-docs/src/09_testing/10_effect-tests.ts +55 -0
  694. package/repos/effect/ai-docs/src/09_testing/20_layer-tests.ts +138 -0
  695. package/repos/effect/ai-docs/src/09_testing/index.md +1 -0
  696. package/repos/effect/ai-docs/src/50_http-client/10_basics.ts +102 -0
  697. package/repos/effect/ai-docs/src/50_http-client/index.md +3 -0
  698. package/repos/effect/ai-docs/src/51_http-server/10_basics.ts +116 -0
  699. package/repos/effect/ai-docs/src/51_http-server/fixtures/api/Api.ts +14 -0
  700. package/repos/effect/ai-docs/src/51_http-server/fixtures/api/Authorization.ts +36 -0
  701. package/repos/effect/ai-docs/src/51_http-server/fixtures/api/System.ts +10 -0
  702. package/repos/effect/ai-docs/src/51_http-server/fixtures/api/Users.ts +91 -0
  703. package/repos/effect/ai-docs/src/51_http-server/fixtures/domain/User.ts +12 -0
  704. package/repos/effect/ai-docs/src/51_http-server/fixtures/domain/UserErrors.ts +22 -0
  705. package/repos/effect/ai-docs/src/51_http-server/fixtures/server/Authorization.ts +36 -0
  706. package/repos/effect/ai-docs/src/51_http-server/fixtures/server/Users/http.ts +71 -0
  707. package/repos/effect/ai-docs/src/51_http-server/fixtures/server/Users.ts +62 -0
  708. package/repos/effect/ai-docs/src/51_http-server/index.md +3 -0
  709. package/repos/effect/ai-docs/src/60_child-process/10_working-with-child-processes.ts +117 -0
  710. package/repos/effect/ai-docs/src/60_child-process/index.md +3 -0
  711. package/repos/effect/ai-docs/src/70_cli/10_basics.ts +136 -0
  712. package/repos/effect/ai-docs/src/70_cli/index.md +5 -0
  713. package/repos/effect/ai-docs/src/71_ai/10_language-model.ts +156 -0
  714. package/repos/effect/ai-docs/src/71_ai/20_tools.ts +226 -0
  715. package/repos/effect/ai-docs/src/71_ai/30_chat.ts +158 -0
  716. package/repos/effect/ai-docs/src/71_ai/fixtures/domain/LaunchPlan.ts +9 -0
  717. package/repos/effect/ai-docs/src/71_ai/index.md +5 -0
  718. package/repos/effect/ai-docs/src/80_cluster/10_entities.ts +97 -0
  719. package/repos/effect/ai-docs/src/80_cluster/index.md +4 -0
  720. package/repos/effect/ai-docs/src/index.md +12 -0
  721. package/repos/effect/ai-docs/tsconfig.json +24 -0
  722. package/repos/effect/cookbooks/schedule.md +3507 -0
  723. package/repos/effect/deno.json +33 -0
  724. package/repos/effect/docker-compose.yaml +18 -0
  725. package/repos/effect/dprint.json +32 -0
  726. package/repos/effect/flake.lock +27 -0
  727. package/repos/effect/flake.nix +24 -0
  728. package/repos/effect/jsdocs.config.json +16 -0
  729. package/repos/effect/migration/cause.md +163 -0
  730. package/repos/effect/migration/equality.md +72 -0
  731. package/repos/effect/migration/error-handling.md +106 -0
  732. package/repos/effect/migration/fiber-keep-alive.md +74 -0
  733. package/repos/effect/migration/fiberref.md +109 -0
  734. package/repos/effect/migration/forking.md +94 -0
  735. package/repos/effect/migration/generators.md +32 -0
  736. package/repos/effect/migration/layer-memoization.md +98 -0
  737. package/repos/effect/migration/runtime.md +88 -0
  738. package/repos/effect/migration/schema.md +1032 -0
  739. package/repos/effect/migration/scope.md +50 -0
  740. package/repos/effect/migration/services.md +235 -0
  741. package/repos/effect/migration/v3-to-v4.md +421 -0
  742. package/repos/effect/migration/yieldable.md +173 -0
  743. package/repos/effect/package.json +104 -0
  744. package/repos/effect/packages/ai/anthropic/CHANGELOG.md +611 -0
  745. package/repos/effect/packages/ai/anthropic/codegen.yml +63 -0
  746. package/repos/effect/packages/ai/anthropic/docgen.json +26 -0
  747. package/repos/effect/packages/ai/anthropic/package.json +67 -0
  748. package/repos/effect/packages/ai/anthropic/src/AnthropicClient.ts +432 -0
  749. package/repos/effect/packages/ai/anthropic/src/AnthropicConfig.ts +84 -0
  750. package/repos/effect/packages/ai/anthropic/src/AnthropicError.ts +212 -0
  751. package/repos/effect/packages/ai/anthropic/src/AnthropicLanguageModel.ts +3098 -0
  752. package/repos/effect/packages/ai/anthropic/src/AnthropicTelemetry.ts +132 -0
  753. package/repos/effect/packages/ai/anthropic/src/AnthropicTool.ts +2512 -0
  754. package/repos/effect/packages/ai/anthropic/src/Generated.ts +12600 -0
  755. package/repos/effect/packages/ai/anthropic/src/index.ts +40 -0
  756. package/repos/effect/packages/ai/anthropic/src/internal/errors.ts +370 -0
  757. package/repos/effect/packages/ai/anthropic/src/internal/utilities.ts +26 -0
  758. package/repos/effect/packages/ai/anthropic/test/AnthropicLanguageModel.test.ts +300 -0
  759. package/repos/effect/packages/ai/anthropic/tsconfig.json +8 -0
  760. package/repos/effect/packages/ai/anthropic/vitest.config.ts +6 -0
  761. package/repos/effect/packages/ai/openai/CHANGELOG.md +668 -0
  762. package/repos/effect/packages/ai/openai/codegen.yaml +41 -0
  763. package/repos/effect/packages/ai/openai/docgen.json +24 -0
  764. package/repos/effect/packages/ai/openai/package.json +67 -0
  765. package/repos/effect/packages/ai/openai/src/Generated.ts +35774 -0
  766. package/repos/effect/packages/ai/openai/src/OpenAiClient.ts +730 -0
  767. package/repos/effect/packages/ai/openai/src/OpenAiClientGenerated.ts +202 -0
  768. package/repos/effect/packages/ai/openai/src/OpenAiConfig.ts +93 -0
  769. package/repos/effect/packages/ai/openai/src/OpenAiEmbeddingModel.ts +258 -0
  770. package/repos/effect/packages/ai/openai/src/OpenAiError.ts +242 -0
  771. package/repos/effect/packages/ai/openai/src/OpenAiLanguageModel.ts +3133 -0
  772. package/repos/effect/packages/ai/openai/src/OpenAiSchema.ts +1286 -0
  773. package/repos/effect/packages/ai/openai/src/OpenAiTelemetry.ts +162 -0
  774. package/repos/effect/packages/ai/openai/src/OpenAiTool.ts +342 -0
  775. package/repos/effect/packages/ai/openai/src/index.ts +55 -0
  776. package/repos/effect/packages/ai/openai/src/internal/errors.ts +349 -0
  777. package/repos/effect/packages/ai/openai/src/internal/utilities.ts +33 -0
  778. package/repos/effect/packages/ai/openai/test/OpenAiClient.test.ts +798 -0
  779. package/repos/effect/packages/ai/openai/test/OpenAiEmbeddingModel.test.ts +289 -0
  780. package/repos/effect/packages/ai/openai/test/OpenAiLanguageModel.test.ts +1528 -0
  781. package/repos/effect/packages/ai/openai/test/OpenAiSchema.test.ts +273 -0
  782. package/repos/effect/packages/ai/openai/tsconfig.json +8 -0
  783. package/repos/effect/packages/ai/openai/vitest.config.ts +6 -0
  784. package/repos/effect/packages/ai/openai-compat/CHANGELOG.md +626 -0
  785. package/repos/effect/packages/ai/openai-compat/docgen.json +24 -0
  786. package/repos/effect/packages/ai/openai-compat/package.json +69 -0
  787. package/repos/effect/packages/ai/openai-compat/src/OpenAiClient.ts +1221 -0
  788. package/repos/effect/packages/ai/openai-compat/src/OpenAiConfig.ts +87 -0
  789. package/repos/effect/packages/ai/openai-compat/src/OpenAiEmbeddingModel.ts +254 -0
  790. package/repos/effect/packages/ai/openai-compat/src/OpenAiError.ts +178 -0
  791. package/repos/effect/packages/ai/openai-compat/src/OpenAiLanguageModel.ts +1951 -0
  792. package/repos/effect/packages/ai/openai-compat/src/OpenAiTelemetry.ts +164 -0
  793. package/repos/effect/packages/ai/openai-compat/src/index.ts +35 -0
  794. package/repos/effect/packages/ai/openai-compat/src/internal/errors.ts +327 -0
  795. package/repos/effect/packages/ai/openai-compat/src/internal/utilities.ts +33 -0
  796. package/repos/effect/packages/ai/openai-compat/test/OpenAiClient.test.ts +474 -0
  797. package/repos/effect/packages/ai/openai-compat/test/OpenAiEmbeddingModel.test.ts +216 -0
  798. package/repos/effect/packages/ai/openai-compat/test/OpenAiLanguageModel.test.ts +1505 -0
  799. package/repos/effect/packages/ai/openai-compat/tsconfig.json +8 -0
  800. package/repos/effect/packages/ai/openai-compat/vitest.config.ts +6 -0
  801. package/repos/effect/packages/ai/openrouter/CHANGELOG.md +607 -0
  802. package/repos/effect/packages/ai/openrouter/codegen.yml +35 -0
  803. package/repos/effect/packages/ai/openrouter/docgen.json +24 -0
  804. package/repos/effect/packages/ai/openrouter/package.json +67 -0
  805. package/repos/effect/packages/ai/openrouter/src/Generated.ts +10028 -0
  806. package/repos/effect/packages/ai/openrouter/src/OpenRouterClient.ts +357 -0
  807. package/repos/effect/packages/ai/openrouter/src/OpenRouterConfig.ts +99 -0
  808. package/repos/effect/packages/ai/openrouter/src/OpenRouterError.ts +225 -0
  809. package/repos/effect/packages/ai/openrouter/src/OpenRouterLanguageModel.ts +1796 -0
  810. package/repos/effect/packages/ai/openrouter/src/index.ts +30 -0
  811. package/repos/effect/packages/ai/openrouter/src/internal/errors.ts +375 -0
  812. package/repos/effect/packages/ai/openrouter/src/internal/utilities.ts +92 -0
  813. package/repos/effect/packages/ai/openrouter/tsconfig.json +10 -0
  814. package/repos/effect/packages/ai/openrouter/vitest.config.ts +6 -0
  815. package/repos/effect/packages/atom/react/CHANGELOG.md +599 -0
  816. package/repos/effect/packages/atom/react/LICENSE +21 -0
  817. package/repos/effect/packages/atom/react/README.md +7 -0
  818. package/repos/effect/packages/atom/react/docgen.json +25 -0
  819. package/repos/effect/packages/atom/react/package.json +79 -0
  820. package/repos/effect/packages/atom/react/src/Hooks.ts +476 -0
  821. package/repos/effect/packages/atom/react/src/ReactHydration.ts +109 -0
  822. package/repos/effect/packages/atom/react/src/RegistryContext.ts +108 -0
  823. package/repos/effect/packages/atom/react/src/ScopedAtom.ts +151 -0
  824. package/repos/effect/packages/atom/react/src/index.ts +23 -0
  825. package/repos/effect/packages/atom/react/test/index.test.tsx +650 -0
  826. package/repos/effect/packages/atom/react/tsconfig.json +8 -0
  827. package/repos/effect/packages/atom/react/vitest.config.ts +9 -0
  828. package/repos/effect/packages/atom/react/vitest.setup.ts +8 -0
  829. package/repos/effect/packages/atom/solid/CHANGELOG.md +595 -0
  830. package/repos/effect/packages/atom/solid/LICENSE +21 -0
  831. package/repos/effect/packages/atom/solid/README.md +7 -0
  832. package/repos/effect/packages/atom/solid/docgen.json +26 -0
  833. package/repos/effect/packages/atom/solid/package.json +72 -0
  834. package/repos/effect/packages/atom/solid/src/Hooks.ts +359 -0
  835. package/repos/effect/packages/atom/solid/src/RegistryContext.ts +80 -0
  836. package/repos/effect/packages/atom/solid/src/index.ts +13 -0
  837. package/repos/effect/packages/atom/solid/test/index.test.tsx +296 -0
  838. package/repos/effect/packages/atom/solid/tsconfig.json +8 -0
  839. package/repos/effect/packages/atom/solid/vitest.config.ts +15 -0
  840. package/repos/effect/packages/atom/solid/vitest.setup.ts +8 -0
  841. package/repos/effect/packages/atom/vue/CHANGELOG.md +593 -0
  842. package/repos/effect/packages/atom/vue/LICENSE +21 -0
  843. package/repos/effect/packages/atom/vue/README.md +7 -0
  844. package/repos/effect/packages/atom/vue/docgen.json +24 -0
  845. package/repos/effect/packages/atom/vue/package.json +68 -0
  846. package/repos/effect/packages/atom/vue/src/index.ts +211 -0
  847. package/repos/effect/packages/atom/vue/test/index.test.ts +5 -0
  848. package/repos/effect/packages/atom/vue/tsconfig.json +14 -0
  849. package/repos/effect/packages/atom/vue/vitest.config.ts +8 -0
  850. package/repos/effect/packages/effect/CHANGELOG.md +1607 -0
  851. package/repos/effect/packages/effect/CONFIG.md +690 -0
  852. package/repos/effect/packages/effect/HTTPAPI.md +3213 -0
  853. package/repos/effect/packages/effect/LICENSE +21 -0
  854. package/repos/effect/packages/effect/MCP.md +369 -0
  855. package/repos/effect/packages/effect/OPTIC.md +620 -0
  856. package/repos/effect/packages/effect/README.md +53 -0
  857. package/repos/effect/packages/effect/SCHEMA.md +7284 -0
  858. package/repos/effect/packages/effect/benchmark/schema/Enums.ts +40 -0
  859. package/repos/effect/packages/effect/benchmark/schema/Optic.ts +79 -0
  860. package/repos/effect/packages/effect/benchmark/schema/array.ts +74 -0
  861. package/repos/effect/packages/effect/benchmark/schema/filter.ts +74 -0
  862. package/repos/effect/packages/effect/benchmark/schema/object.ts +82 -0
  863. package/repos/effect/packages/effect/benchmark/schema/tagged-union.ts +69 -0
  864. package/repos/effect/packages/effect/benchmark/schema/transformation.ts +91 -0
  865. package/repos/effect/packages/effect/benchmark/stream/splitLines.ts +46 -0
  866. package/repos/effect/packages/effect/docgen.json +38 -0
  867. package/repos/effect/packages/effect/package.json +127 -0
  868. package/repos/effect/packages/effect/src/Array.ts +4908 -0
  869. package/repos/effect/packages/effect/src/BigDecimal.ts +1943 -0
  870. package/repos/effect/packages/effect/src/BigInt.ts +1029 -0
  871. package/repos/effect/packages/effect/src/Boolean.ts +481 -0
  872. package/repos/effect/packages/effect/src/Brand.ts +318 -0
  873. package/repos/effect/packages/effect/src/Cache.ts +1295 -0
  874. package/repos/effect/packages/effect/src/Cause.ts +1939 -0
  875. package/repos/effect/packages/effect/src/Channel.ts +8615 -0
  876. package/repos/effect/packages/effect/src/ChannelSchema.ts +308 -0
  877. package/repos/effect/packages/effect/src/Chunk.ts +2976 -0
  878. package/repos/effect/packages/effect/src/Clock.ts +194 -0
  879. package/repos/effect/packages/effect/src/Combiner.ts +316 -0
  880. package/repos/effect/packages/effect/src/Config.ts +1416 -0
  881. package/repos/effect/packages/effect/src/ConfigProvider.ts +1159 -0
  882. package/repos/effect/packages/effect/src/Console.ts +653 -0
  883. package/repos/effect/packages/effect/src/Context.ts +1339 -0
  884. package/repos/effect/packages/effect/src/Cron.ts +1212 -0
  885. package/repos/effect/packages/effect/src/Crypto.ts +318 -0
  886. package/repos/effect/packages/effect/src/Data.ts +774 -0
  887. package/repos/effect/packages/effect/src/DateTime.ts +2922 -0
  888. package/repos/effect/packages/effect/src/Deferred.ts +917 -0
  889. package/repos/effect/packages/effect/src/Differ.ts +32 -0
  890. package/repos/effect/packages/effect/src/Duration.ts +1827 -0
  891. package/repos/effect/packages/effect/src/Effect.ts +15347 -0
  892. package/repos/effect/packages/effect/src/Effectable.ts +68 -0
  893. package/repos/effect/packages/effect/src/Encoding.ts +1046 -0
  894. package/repos/effect/packages/effect/src/Equal.ts +550 -0
  895. package/repos/effect/packages/effect/src/Equivalence.ts +870 -0
  896. package/repos/effect/packages/effect/src/ErrorReporter.ts +543 -0
  897. package/repos/effect/packages/effect/src/ExecutionPlan.ts +416 -0
  898. package/repos/effect/packages/effect/src/Exit.ts +1085 -0
  899. package/repos/effect/packages/effect/src/Fiber.ts +632 -0
  900. package/repos/effect/packages/effect/src/FiberHandle.ts +815 -0
  901. package/repos/effect/packages/effect/src/FiberMap.ts +1030 -0
  902. package/repos/effect/packages/effect/src/FiberSet.ts +713 -0
  903. package/repos/effect/packages/effect/src/FileSystem.ts +1394 -0
  904. package/repos/effect/packages/effect/src/Filter.ts +827 -0
  905. package/repos/effect/packages/effect/src/Formatter.ts +319 -0
  906. package/repos/effect/packages/effect/src/Function.ts +1415 -0
  907. package/repos/effect/packages/effect/src/Graph.ts +4892 -0
  908. package/repos/effect/packages/effect/src/HKT.ts +213 -0
  909. package/repos/effect/packages/effect/src/Hash.ts +539 -0
  910. package/repos/effect/packages/effect/src/HashMap.ts +1236 -0
  911. package/repos/effect/packages/effect/src/HashRing.ts +426 -0
  912. package/repos/effect/packages/effect/src/HashSet.ts +605 -0
  913. package/repos/effect/packages/effect/src/Inspectable.ts +329 -0
  914. package/repos/effect/packages/effect/src/Iterable.ts +2483 -0
  915. package/repos/effect/packages/effect/src/JsonPatch.ts +469 -0
  916. package/repos/effect/packages/effect/src/JsonPointer.ts +80 -0
  917. package/repos/effect/packages/effect/src/JsonSchema.ts +948 -0
  918. package/repos/effect/packages/effect/src/Latch.ts +373 -0
  919. package/repos/effect/packages/effect/src/Layer.ts +2773 -0
  920. package/repos/effect/packages/effect/src/LayerMap.ts +468 -0
  921. package/repos/effect/packages/effect/src/LogLevel.ts +412 -0
  922. package/repos/effect/packages/effect/src/Logger.ts +1284 -0
  923. package/repos/effect/packages/effect/src/ManagedRuntime.ts +381 -0
  924. package/repos/effect/packages/effect/src/Match.ts +2606 -0
  925. package/repos/effect/packages/effect/src/Metric.ts +4058 -0
  926. package/repos/effect/packages/effect/src/MutableHashMap.ts +845 -0
  927. package/repos/effect/packages/effect/src/MutableHashSet.ts +422 -0
  928. package/repos/effect/packages/effect/src/MutableList.ts +967 -0
  929. package/repos/effect/packages/effect/src/MutableRef.ts +822 -0
  930. package/repos/effect/packages/effect/src/Newtype.ts +319 -0
  931. package/repos/effect/packages/effect/src/NonEmptyIterable.ts +221 -0
  932. package/repos/effect/packages/effect/src/Number.ts +860 -0
  933. package/repos/effect/packages/effect/src/Optic.ts +1701 -0
  934. package/repos/effect/packages/effect/src/Option.ts +2664 -0
  935. package/repos/effect/packages/effect/src/Order.ts +982 -0
  936. package/repos/effect/packages/effect/src/Ordering.ts +182 -0
  937. package/repos/effect/packages/effect/src/PartitionedSemaphore.ts +561 -0
  938. package/repos/effect/packages/effect/src/Path.ts +870 -0
  939. package/repos/effect/packages/effect/src/Pipeable.ts +674 -0
  940. package/repos/effect/packages/effect/src/PlatformError.ts +221 -0
  941. package/repos/effect/packages/effect/src/Pool.ts +699 -0
  942. package/repos/effect/packages/effect/src/Predicate.ts +1872 -0
  943. package/repos/effect/packages/effect/src/PrimaryKey.ts +123 -0
  944. package/repos/effect/packages/effect/src/PubSub.ts +2797 -0
  945. package/repos/effect/packages/effect/src/Pull.ts +376 -0
  946. package/repos/effect/packages/effect/src/Queue.ts +1962 -0
  947. package/repos/effect/packages/effect/src/Random.ts +549 -0
  948. package/repos/effect/packages/effect/src/RcMap.ts +612 -0
  949. package/repos/effect/packages/effect/src/RcRef.ts +225 -0
  950. package/repos/effect/packages/effect/src/Record.ts +1563 -0
  951. package/repos/effect/packages/effect/src/Redactable.ts +168 -0
  952. package/repos/effect/packages/effect/src/Redacted.ts +314 -0
  953. package/repos/effect/packages/effect/src/Reducer.ts +178 -0
  954. package/repos/effect/packages/effect/src/Ref.ts +801 -0
  955. package/repos/effect/packages/effect/src/References.ts +786 -0
  956. package/repos/effect/packages/effect/src/RegExp.ts +82 -0
  957. package/repos/effect/packages/effect/src/Request.ts +598 -0
  958. package/repos/effect/packages/effect/src/RequestResolver.ts +1249 -0
  959. package/repos/effect/packages/effect/src/Resource.ts +184 -0
  960. package/repos/effect/packages/effect/src/Result.ts +1939 -0
  961. package/repos/effect/packages/effect/src/Runtime.ts +432 -0
  962. package/repos/effect/packages/effect/src/Schedule.ts +3564 -0
  963. package/repos/effect/packages/effect/src/Scheduler.ts +285 -0
  964. package/repos/effect/packages/effect/src/Schema.ts +14653 -0
  965. package/repos/effect/packages/effect/src/SchemaAST.ts +3903 -0
  966. package/repos/effect/packages/effect/src/SchemaGetter.ts +1870 -0
  967. package/repos/effect/packages/effect/src/SchemaIssue.ts +1176 -0
  968. package/repos/effect/packages/effect/src/SchemaParser.ts +1105 -0
  969. package/repos/effect/packages/effect/src/SchemaRepresentation.ts +3944 -0
  970. package/repos/effect/packages/effect/src/SchemaTransformation.ts +1818 -0
  971. package/repos/effect/packages/effect/src/SchemaUtils.ts +51 -0
  972. package/repos/effect/packages/effect/src/Scope.ts +572 -0
  973. package/repos/effect/packages/effect/src/ScopedCache.ts +820 -0
  974. package/repos/effect/packages/effect/src/ScopedRef.ts +192 -0
  975. package/repos/effect/packages/effect/src/Semaphore.ts +517 -0
  976. package/repos/effect/packages/effect/src/Sink.ts +2174 -0
  977. package/repos/effect/packages/effect/src/Stdio.ts +143 -0
  978. package/repos/effect/packages/effect/src/Stream.ts +11722 -0
  979. package/repos/effect/packages/effect/src/String.ts +1427 -0
  980. package/repos/effect/packages/effect/src/Struct.ts +979 -0
  981. package/repos/effect/packages/effect/src/SubscriptionRef.ts +1021 -0
  982. package/repos/effect/packages/effect/src/Symbol.ts +31 -0
  983. package/repos/effect/packages/effect/src/SynchronizedRef.ts +668 -0
  984. package/repos/effect/packages/effect/src/Take.ts +46 -0
  985. package/repos/effect/packages/effect/src/Terminal.ts +188 -0
  986. package/repos/effect/packages/effect/src/Tracer.ts +683 -0
  987. package/repos/effect/packages/effect/src/Trie.ts +953 -0
  988. package/repos/effect/packages/effect/src/Tuple.ts +737 -0
  989. package/repos/effect/packages/effect/src/TxChunk.ts +822 -0
  990. package/repos/effect/packages/effect/src/TxDeferred.ts +319 -0
  991. package/repos/effect/packages/effect/src/TxHashMap.ts +2165 -0
  992. package/repos/effect/packages/effect/src/TxHashSet.ts +908 -0
  993. package/repos/effect/packages/effect/src/TxPriorityQueue.ts +567 -0
  994. package/repos/effect/packages/effect/src/TxPubSub.ts +684 -0
  995. package/repos/effect/packages/effect/src/TxQueue.ts +1488 -0
  996. package/repos/effect/packages/effect/src/TxReentrantLock.ts +655 -0
  997. package/repos/effect/packages/effect/src/TxRef.ts +282 -0
  998. package/repos/effect/packages/effect/src/TxSemaphore.ts +707 -0
  999. package/repos/effect/packages/effect/src/TxSubscriptionRef.ts +518 -0
  1000. package/repos/effect/packages/effect/src/Types.ts +1121 -0
  1001. package/repos/effect/packages/effect/src/UndefinedOr.ts +239 -0
  1002. package/repos/effect/packages/effect/src/Unify.ts +314 -0
  1003. package/repos/effect/packages/effect/src/Utils.ts +221 -0
  1004. package/repos/effect/packages/effect/src/index.ts +712 -0
  1005. package/repos/effect/packages/effect/src/internal/array.ts +8 -0
  1006. package/repos/effect/packages/effect/src/internal/concurrency.ts +52 -0
  1007. package/repos/effect/packages/effect/src/internal/core.ts +666 -0
  1008. package/repos/effect/packages/effect/src/internal/dateTime.ts +1264 -0
  1009. package/repos/effect/packages/effect/src/internal/doNotation.ts +117 -0
  1010. package/repos/effect/packages/effect/src/internal/effect.ts +6427 -0
  1011. package/repos/effect/packages/effect/src/internal/equal.ts +28 -0
  1012. package/repos/effect/packages/effect/src/internal/errors.ts +9 -0
  1013. package/repos/effect/packages/effect/src/internal/executionPlan.ts +120 -0
  1014. package/repos/effect/packages/effect/src/internal/hashMap.ts +1309 -0
  1015. package/repos/effect/packages/effect/src/internal/hashSet.ts +190 -0
  1016. package/repos/effect/packages/effect/src/internal/layer.ts +88 -0
  1017. package/repos/effect/packages/effect/src/internal/matcher.ts +637 -0
  1018. package/repos/effect/packages/effect/src/internal/metric.ts +2 -0
  1019. package/repos/effect/packages/effect/src/internal/option.ts +98 -0
  1020. package/repos/effect/packages/effect/src/internal/random.ts +20 -0
  1021. package/repos/effect/packages/effect/src/internal/rcRef.ts +189 -0
  1022. package/repos/effect/packages/effect/src/internal/record.ts +18 -0
  1023. package/repos/effect/packages/effect/src/internal/redacted.ts +19 -0
  1024. package/repos/effect/packages/effect/src/internal/references.ts +72 -0
  1025. package/repos/effect/packages/effect/src/internal/request.ts +205 -0
  1026. package/repos/effect/packages/effect/src/internal/result.ts +112 -0
  1027. package/repos/effect/packages/effect/src/internal/schedule.ts +248 -0
  1028. package/repos/effect/packages/effect/src/internal/schema/annotations.ts +37 -0
  1029. package/repos/effect/packages/effect/src/internal/schema/arbitrary.ts +894 -0
  1030. package/repos/effect/packages/effect/src/internal/schema/cause.ts +26 -0
  1031. package/repos/effect/packages/effect/src/internal/schema/equivalence.ts +154 -0
  1032. package/repos/effect/packages/effect/src/internal/schema/representation.ts +799 -0
  1033. package/repos/effect/packages/effect/src/internal/schema/schema.ts +128 -0
  1034. package/repos/effect/packages/effect/src/internal/stream.ts +28 -0
  1035. package/repos/effect/packages/effect/src/internal/tracer.ts +41 -0
  1036. package/repos/effect/packages/effect/src/internal/trie.ts +733 -0
  1037. package/repos/effect/packages/effect/src/internal/version.ts +2 -0
  1038. package/repos/effect/packages/effect/src/testing/FastCheck.ts +89 -0
  1039. package/repos/effect/packages/effect/src/testing/TestClock.ts +547 -0
  1040. package/repos/effect/packages/effect/src/testing/TestConsole.ts +369 -0
  1041. package/repos/effect/packages/effect/src/testing/TestSchema.ts +567 -0
  1042. package/repos/effect/packages/effect/src/testing/index.ts +25 -0
  1043. package/repos/effect/packages/effect/src/unstable/ai/AiError.ts +1629 -0
  1044. package/repos/effect/packages/effect/src/unstable/ai/AnthropicStructuredOutput.ts +407 -0
  1045. package/repos/effect/packages/effect/src/unstable/ai/Chat.ts +931 -0
  1046. package/repos/effect/packages/effect/src/unstable/ai/EmbeddingModel.ts +269 -0
  1047. package/repos/effect/packages/effect/src/unstable/ai/IdGenerator.ts +300 -0
  1048. package/repos/effect/packages/effect/src/unstable/ai/LanguageModel.ts +2221 -0
  1049. package/repos/effect/packages/effect/src/unstable/ai/McpSchema.ts +2527 -0
  1050. package/repos/effect/packages/effect/src/unstable/ai/McpServer.ts +1468 -0
  1051. package/repos/effect/packages/effect/src/unstable/ai/Model.ts +166 -0
  1052. package/repos/effect/packages/effect/src/unstable/ai/OpenAiStructuredOutput.ts +476 -0
  1053. package/repos/effect/packages/effect/src/unstable/ai/Prompt.ts +2234 -0
  1054. package/repos/effect/packages/effect/src/unstable/ai/Response.ts +2582 -0
  1055. package/repos/effect/packages/effect/src/unstable/ai/ResponseIdTracker.ts +139 -0
  1056. package/repos/effect/packages/effect/src/unstable/ai/Telemetry.ts +515 -0
  1057. package/repos/effect/packages/effect/src/unstable/ai/Tokenizer.ts +176 -0
  1058. package/repos/effect/packages/effect/src/unstable/ai/Tool.ts +2003 -0
  1059. package/repos/effect/packages/effect/src/unstable/ai/Toolkit.ts +554 -0
  1060. package/repos/effect/packages/effect/src/unstable/ai/index.ts +90 -0
  1061. package/repos/effect/packages/effect/src/unstable/ai/internal/codec-transformer.ts +13 -0
  1062. package/repos/effect/packages/effect/src/unstable/cli/Argument.ts +749 -0
  1063. package/repos/effect/packages/effect/src/unstable/cli/CliError.ts +549 -0
  1064. package/repos/effect/packages/effect/src/unstable/cli/CliOutput.ts +607 -0
  1065. package/repos/effect/packages/effect/src/unstable/cli/Command.ts +1610 -0
  1066. package/repos/effect/packages/effect/src/unstable/cli/Completions.ts +123 -0
  1067. package/repos/effect/packages/effect/src/unstable/cli/Flag.ts +986 -0
  1068. package/repos/effect/packages/effect/src/unstable/cli/GlobalFlag.ts +295 -0
  1069. package/repos/effect/packages/effect/src/unstable/cli/HelpDoc.ts +323 -0
  1070. package/repos/effect/packages/effect/src/unstable/cli/Param.ts +2193 -0
  1071. package/repos/effect/packages/effect/src/unstable/cli/Primitive.ts +766 -0
  1072. package/repos/effect/packages/effect/src/unstable/cli/Prompt.ts +3852 -0
  1073. package/repos/effect/packages/effect/src/unstable/cli/SEMANTICS.md +157 -0
  1074. package/repos/effect/packages/effect/src/unstable/cli/index.ts +60 -0
  1075. package/repos/effect/packages/effect/src/unstable/cli/internal/ansi.ts +152 -0
  1076. package/repos/effect/packages/effect/src/unstable/cli/internal/auto-suggest.ts +41 -0
  1077. package/repos/effect/packages/effect/src/unstable/cli/internal/command.ts +340 -0
  1078. package/repos/effect/packages/effect/src/unstable/cli/internal/completions/bash.ts +222 -0
  1079. package/repos/effect/packages/effect/src/unstable/cli/internal/completions/descriptor.ts +133 -0
  1080. package/repos/effect/packages/effect/src/unstable/cli/internal/completions/fish.ts +253 -0
  1081. package/repos/effect/packages/effect/src/unstable/cli/internal/completions/zsh.ts +220 -0
  1082. package/repos/effect/packages/effect/src/unstable/cli/internal/config.ts +272 -0
  1083. package/repos/effect/packages/effect/src/unstable/cli/internal/help.ts +181 -0
  1084. package/repos/effect/packages/effect/src/unstable/cli/internal/lexer.ts +70 -0
  1085. package/repos/effect/packages/effect/src/unstable/cli/internal/parser.ts +932 -0
  1086. package/repos/effect/packages/effect/src/unstable/cluster/ClusterCron.ts +163 -0
  1087. package/repos/effect/packages/effect/src/unstable/cluster/ClusterError.ts +238 -0
  1088. package/repos/effect/packages/effect/src/unstable/cluster/ClusterMetrics.ts +112 -0
  1089. package/repos/effect/packages/effect/src/unstable/cluster/ClusterSchema.ts +170 -0
  1090. package/repos/effect/packages/effect/src/unstable/cluster/ClusterWorkflowEngine.ts +778 -0
  1091. package/repos/effect/packages/effect/src/unstable/cluster/DeliverAt.ts +58 -0
  1092. package/repos/effect/packages/effect/src/unstable/cluster/Entity.ts +779 -0
  1093. package/repos/effect/packages/effect/src/unstable/cluster/EntityAddress.ts +93 -0
  1094. package/repos/effect/packages/effect/src/unstable/cluster/EntityId.ts +50 -0
  1095. package/repos/effect/packages/effect/src/unstable/cluster/EntityProxy.ts +263 -0
  1096. package/repos/effect/packages/effect/src/unstable/cluster/EntityProxyServer.ts +149 -0
  1097. package/repos/effect/packages/effect/src/unstable/cluster/EntityResource.ts +184 -0
  1098. package/repos/effect/packages/effect/src/unstable/cluster/EntityType.ts +52 -0
  1099. package/repos/effect/packages/effect/src/unstable/cluster/Envelope.ts +433 -0
  1100. package/repos/effect/packages/effect/src/unstable/cluster/HttpRunner.ts +345 -0
  1101. package/repos/effect/packages/effect/src/unstable/cluster/K8sHttpClient.ts +297 -0
  1102. package/repos/effect/packages/effect/src/unstable/cluster/MachineId.ts +54 -0
  1103. package/repos/effect/packages/effect/src/unstable/cluster/Message.ts +314 -0
  1104. package/repos/effect/packages/effect/src/unstable/cluster/MessageStorage.ts +1072 -0
  1105. package/repos/effect/packages/effect/src/unstable/cluster/Reply.ts +455 -0
  1106. package/repos/effect/packages/effect/src/unstable/cluster/Runner.ts +129 -0
  1107. package/repos/effect/packages/effect/src/unstable/cluster/RunnerAddress.ts +112 -0
  1108. package/repos/effect/packages/effect/src/unstable/cluster/RunnerHealth.ts +145 -0
  1109. package/repos/effect/packages/effect/src/unstable/cluster/RunnerServer.ts +220 -0
  1110. package/repos/effect/packages/effect/src/unstable/cluster/RunnerStorage.ts +243 -0
  1111. package/repos/effect/packages/effect/src/unstable/cluster/Runners.ts +690 -0
  1112. package/repos/effect/packages/effect/src/unstable/cluster/ShardId.ts +178 -0
  1113. package/repos/effect/packages/effect/src/unstable/cluster/Sharding.ts +1488 -0
  1114. package/repos/effect/packages/effect/src/unstable/cluster/ShardingConfig.ts +367 -0
  1115. package/repos/effect/packages/effect/src/unstable/cluster/ShardingRegistrationEvent.ts +76 -0
  1116. package/repos/effect/packages/effect/src/unstable/cluster/SingleRunner.ts +75 -0
  1117. package/repos/effect/packages/effect/src/unstable/cluster/Singleton.ts +56 -0
  1118. package/repos/effect/packages/effect/src/unstable/cluster/SingletonAddress.ts +49 -0
  1119. package/repos/effect/packages/effect/src/unstable/cluster/Snowflake.ts +282 -0
  1120. package/repos/effect/packages/effect/src/unstable/cluster/SocketRunner.ts +96 -0
  1121. package/repos/effect/packages/effect/src/unstable/cluster/SqlMessageStorage.ts +1045 -0
  1122. package/repos/effect/packages/effect/src/unstable/cluster/SqlRunnerStorage.ts +700 -0
  1123. package/repos/effect/packages/effect/src/unstable/cluster/TestRunner.ts +36 -0
  1124. package/repos/effect/packages/effect/src/unstable/cluster/index.ts +195 -0
  1125. package/repos/effect/packages/effect/src/unstable/cluster/internal/entityManager.ts +678 -0
  1126. package/repos/effect/packages/effect/src/unstable/cluster/internal/entityReaper.ts +58 -0
  1127. package/repos/effect/packages/effect/src/unstable/cluster/internal/hash.ts +23 -0
  1128. package/repos/effect/packages/effect/src/unstable/cluster/internal/interruptors.ts +2 -0
  1129. package/repos/effect/packages/effect/src/unstable/cluster/internal/resourceMap.ts +100 -0
  1130. package/repos/effect/packages/effect/src/unstable/cluster/internal/resourceRef.ts +99 -0
  1131. package/repos/effect/packages/effect/src/unstable/devtools/DevTools.ts +68 -0
  1132. package/repos/effect/packages/effect/src/unstable/devtools/DevToolsClient.ts +236 -0
  1133. package/repos/effect/packages/effect/src/unstable/devtools/DevToolsSchema.ts +558 -0
  1134. package/repos/effect/packages/effect/src/unstable/devtools/DevToolsServer.ts +94 -0
  1135. package/repos/effect/packages/effect/src/unstable/devtools/index.ts +25 -0
  1136. package/repos/effect/packages/effect/src/unstable/encoding/Msgpack.ts +383 -0
  1137. package/repos/effect/packages/effect/src/unstable/encoding/Ndjson.ts +602 -0
  1138. package/repos/effect/packages/effect/src/unstable/encoding/Sse.ts +593 -0
  1139. package/repos/effect/packages/effect/src/unstable/encoding/index.ts +20 -0
  1140. package/repos/effect/packages/effect/src/unstable/eventlog/Event.ts +447 -0
  1141. package/repos/effect/packages/effect/src/unstable/eventlog/EventGroup.ts +193 -0
  1142. package/repos/effect/packages/effect/src/unstable/eventlog/EventJournal.ts +795 -0
  1143. package/repos/effect/packages/effect/src/unstable/eventlog/EventLog.ts +1030 -0
  1144. package/repos/effect/packages/effect/src/unstable/eventlog/EventLogEncryption.ts +169 -0
  1145. package/repos/effect/packages/effect/src/unstable/eventlog/EventLogMessage.ts +354 -0
  1146. package/repos/effect/packages/effect/src/unstable/eventlog/EventLogRemote.ts +377 -0
  1147. package/repos/effect/packages/effect/src/unstable/eventlog/EventLogServer.ts +242 -0
  1148. package/repos/effect/packages/effect/src/unstable/eventlog/EventLogServerEncrypted.ts +268 -0
  1149. package/repos/effect/packages/effect/src/unstable/eventlog/EventLogServerUnencrypted.ts +898 -0
  1150. package/repos/effect/packages/effect/src/unstable/eventlog/EventLogSessionAuth.ts +524 -0
  1151. package/repos/effect/packages/effect/src/unstable/eventlog/SqlEventJournal.ts +353 -0
  1152. package/repos/effect/packages/effect/src/unstable/eventlog/SqlEventLogServerEncrypted.ts +343 -0
  1153. package/repos/effect/packages/effect/src/unstable/eventlog/SqlEventLogServerUnencrypted.ts +527 -0
  1154. package/repos/effect/packages/effect/src/unstable/eventlog/index.ts +75 -0
  1155. package/repos/effect/packages/effect/src/unstable/eventlog/internal/identityRootSecretDerivation.ts +153 -0
  1156. package/repos/effect/packages/effect/src/unstable/http/Cookies.ts +952 -0
  1157. package/repos/effect/packages/effect/src/unstable/http/Etag.ts +141 -0
  1158. package/repos/effect/packages/effect/src/unstable/http/FetchHttpClient.ts +123 -0
  1159. package/repos/effect/packages/effect/src/unstable/http/FindMyWay.ts +15 -0
  1160. package/repos/effect/packages/effect/src/unstable/http/Headers.ts +438 -0
  1161. package/repos/effect/packages/effect/src/unstable/http/HttpBody.ts +545 -0
  1162. package/repos/effect/packages/effect/src/unstable/http/HttpClient.ts +1630 -0
  1163. package/repos/effect/packages/effect/src/unstable/http/HttpClientError.ts +328 -0
  1164. package/repos/effect/packages/effect/src/unstable/http/HttpClientRequest.ts +968 -0
  1165. package/repos/effect/packages/effect/src/unstable/http/HttpClientResponse.ts +408 -0
  1166. package/repos/effect/packages/effect/src/unstable/http/HttpEffect.ts +400 -0
  1167. package/repos/effect/packages/effect/src/unstable/http/HttpIncomingMessage.ts +153 -0
  1168. package/repos/effect/packages/effect/src/unstable/http/HttpMethod.ts +124 -0
  1169. package/repos/effect/packages/effect/src/unstable/http/HttpMiddleware.ts +394 -0
  1170. package/repos/effect/packages/effect/src/unstable/http/HttpPlatform.ts +165 -0
  1171. package/repos/effect/packages/effect/src/unstable/http/HttpRouter.ts +1341 -0
  1172. package/repos/effect/packages/effect/src/unstable/http/HttpServer.ts +329 -0
  1173. package/repos/effect/packages/effect/src/unstable/http/HttpServerError.ts +374 -0
  1174. package/repos/effect/packages/effect/src/unstable/http/HttpServerRequest.ts +1081 -0
  1175. package/repos/effect/packages/effect/src/unstable/http/HttpServerRespondable.ts +115 -0
  1176. package/repos/effect/packages/effect/src/unstable/http/HttpServerResponse.ts +1381 -0
  1177. package/repos/effect/packages/effect/src/unstable/http/HttpStaticServer.ts +464 -0
  1178. package/repos/effect/packages/effect/src/unstable/http/HttpTraceContext.ts +160 -0
  1179. package/repos/effect/packages/effect/src/unstable/http/Multipart.ts +830 -0
  1180. package/repos/effect/packages/effect/src/unstable/http/Multipasta/HeadersParser.ts +14 -0
  1181. package/repos/effect/packages/effect/src/unstable/http/Multipasta/Node.ts +14 -0
  1182. package/repos/effect/packages/effect/src/unstable/http/Multipasta/Search.ts +14 -0
  1183. package/repos/effect/packages/effect/src/unstable/http/Multipasta/Web.ts +14 -0
  1184. package/repos/effect/packages/effect/src/unstable/http/Multipasta.ts +15 -0
  1185. package/repos/effect/packages/effect/src/unstable/http/Template.ts +262 -0
  1186. package/repos/effect/packages/effect/src/unstable/http/Url.ts +330 -0
  1187. package/repos/effect/packages/effect/src/unstable/http/UrlParams.ts +678 -0
  1188. package/repos/effect/packages/effect/src/unstable/http/index.ts +145 -0
  1189. package/repos/effect/packages/effect/src/unstable/http/internal/preResponseHandler.ts +15 -0
  1190. package/repos/effect/packages/effect/src/unstable/httpapi/HttpApi.ts +316 -0
  1191. package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiBuilder.ts +1015 -0
  1192. package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiClient.ts +1005 -0
  1193. package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiEndpoint.ts +1545 -0
  1194. package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiError.ts +443 -0
  1195. package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiGroup.ts +381 -0
  1196. package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiMiddleware.ts +478 -0
  1197. package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiScalar.ts +267 -0
  1198. package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiSchema.ts +733 -0
  1199. package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiSecurity.ts +244 -0
  1200. package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiSwagger.ts +68 -0
  1201. package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiTest.ts +112 -0
  1202. package/repos/effect/packages/effect/src/unstable/httpapi/OpenApi.ts +1098 -0
  1203. package/repos/effect/packages/effect/src/unstable/httpapi/index.ts +70 -0
  1204. package/repos/effect/packages/effect/src/unstable/httpapi/internal/html.ts +18 -0
  1205. package/repos/effect/packages/effect/src/unstable/httpapi/internal/httpApiScalar.ts +5 -0
  1206. package/repos/effect/packages/effect/src/unstable/httpapi/internal/httpApiSwagger.ts +9 -0
  1207. package/repos/effect/packages/effect/src/unstable/observability/Otlp.ts +172 -0
  1208. package/repos/effect/packages/effect/src/unstable/observability/OtlpExporter.ts +149 -0
  1209. package/repos/effect/packages/effect/src/unstable/observability/OtlpLogger.ts +340 -0
  1210. package/repos/effect/packages/effect/src/unstable/observability/OtlpMetrics.ts +826 -0
  1211. package/repos/effect/packages/effect/src/unstable/observability/OtlpResource.ts +288 -0
  1212. package/repos/effect/packages/effect/src/unstable/observability/OtlpSerialization.ts +66 -0
  1213. package/repos/effect/packages/effect/src/unstable/observability/OtlpTracer.ts +442 -0
  1214. package/repos/effect/packages/effect/src/unstable/observability/PrometheusMetrics.ts +468 -0
  1215. package/repos/effect/packages/effect/src/unstable/observability/index.ts +45 -0
  1216. package/repos/effect/packages/effect/src/unstable/observability/internal/otlpEnv.ts +39 -0
  1217. package/repos/effect/packages/effect/src/unstable/observability/internal/otlpProtobuf.ts +779 -0
  1218. package/repos/effect/packages/effect/src/unstable/observability/internal/protobuf.ts +262 -0
  1219. package/repos/effect/packages/effect/src/unstable/persistence/KeyValueStore.ts +864 -0
  1220. package/repos/effect/packages/effect/src/unstable/persistence/Persistable.ts +252 -0
  1221. package/repos/effect/packages/effect/src/unstable/persistence/PersistedCache.ts +111 -0
  1222. package/repos/effect/packages/effect/src/unstable/persistence/PersistedQueue.ts +1196 -0
  1223. package/repos/effect/packages/effect/src/unstable/persistence/Persistence.ts +1071 -0
  1224. package/repos/effect/packages/effect/src/unstable/persistence/RateLimiter.ts +748 -0
  1225. package/repos/effect/packages/effect/src/unstable/persistence/Redis.ts +188 -0
  1226. package/repos/effect/packages/effect/src/unstable/persistence/index.ts +40 -0
  1227. package/repos/effect/packages/effect/src/unstable/process/ChildProcess.ts +1036 -0
  1228. package/repos/effect/packages/effect/src/unstable/process/ChildProcessSpawner.ts +285 -0
  1229. package/repos/effect/packages/effect/src/unstable/process/index.ts +15 -0
  1230. package/repos/effect/packages/effect/src/unstable/reactivity/AsyncResult.ts +1081 -0
  1231. package/repos/effect/packages/effect/src/unstable/reactivity/Atom.ts +2520 -0
  1232. package/repos/effect/packages/effect/src/unstable/reactivity/AtomHttpApi.ts +352 -0
  1233. package/repos/effect/packages/effect/src/unstable/reactivity/AtomRef.ts +352 -0
  1234. package/repos/effect/packages/effect/src/unstable/reactivity/AtomRegistry.ts +1127 -0
  1235. package/repos/effect/packages/effect/src/unstable/reactivity/AtomRpc.ts +305 -0
  1236. package/repos/effect/packages/effect/src/unstable/reactivity/Hydration.ts +155 -0
  1237. package/repos/effect/packages/effect/src/unstable/reactivity/Reactivity.ts +348 -0
  1238. package/repos/effect/packages/effect/src/unstable/reactivity/index.ts +45 -0
  1239. package/repos/effect/packages/effect/src/unstable/rpc/Rpc.ts +1255 -0
  1240. package/repos/effect/packages/effect/src/unstable/rpc/RpcClient.ts +1370 -0
  1241. package/repos/effect/packages/effect/src/unstable/rpc/RpcClientError.ts +57 -0
  1242. package/repos/effect/packages/effect/src/unstable/rpc/RpcGroup.ts +409 -0
  1243. package/repos/effect/packages/effect/src/unstable/rpc/RpcMessage.ts +402 -0
  1244. package/repos/effect/packages/effect/src/unstable/rpc/RpcMiddleware.ts +344 -0
  1245. package/repos/effect/packages/effect/src/unstable/rpc/RpcSchema.ts +97 -0
  1246. package/repos/effect/packages/effect/src/unstable/rpc/RpcSerialization.ts +546 -0
  1247. package/repos/effect/packages/effect/src/unstable/rpc/RpcServer.ts +1492 -0
  1248. package/repos/effect/packages/effect/src/unstable/rpc/RpcTest.ts +56 -0
  1249. package/repos/effect/packages/effect/src/unstable/rpc/RpcWorker.ts +118 -0
  1250. package/repos/effect/packages/effect/src/unstable/rpc/Utils.ts +120 -0
  1251. package/repos/effect/packages/effect/src/unstable/rpc/index.ts +65 -0
  1252. package/repos/effect/packages/effect/src/unstable/schema/Model.ts +862 -0
  1253. package/repos/effect/packages/effect/src/unstable/schema/VariantSchema.ts +604 -0
  1254. package/repos/effect/packages/effect/src/unstable/schema/index.ts +15 -0
  1255. package/repos/effect/packages/effect/src/unstable/socket/Socket.ts +911 -0
  1256. package/repos/effect/packages/effect/src/unstable/socket/SocketServer.ts +147 -0
  1257. package/repos/effect/packages/effect/src/unstable/socket/index.ts +15 -0
  1258. package/repos/effect/packages/effect/src/unstable/sql/Migrator.ts +440 -0
  1259. package/repos/effect/packages/effect/src/unstable/sql/SqlClient.ts +342 -0
  1260. package/repos/effect/packages/effect/src/unstable/sql/SqlConnection.ts +83 -0
  1261. package/repos/effect/packages/effect/src/unstable/sql/SqlError.ts +590 -0
  1262. package/repos/effect/packages/effect/src/unstable/sql/SqlModel.ts +359 -0
  1263. package/repos/effect/packages/effect/src/unstable/sql/SqlResolver.ts +380 -0
  1264. package/repos/effect/packages/effect/src/unstable/sql/SqlSchema.ts +172 -0
  1265. package/repos/effect/packages/effect/src/unstable/sql/SqlStream.ts +81 -0
  1266. package/repos/effect/packages/effect/src/unstable/sql/Statement.ts +1500 -0
  1267. package/repos/effect/packages/effect/src/unstable/sql/index.ts +50 -0
  1268. package/repos/effect/packages/effect/src/unstable/workers/Transferable.ts +191 -0
  1269. package/repos/effect/packages/effect/src/unstable/workers/Worker.ts +245 -0
  1270. package/repos/effect/packages/effect/src/unstable/workers/WorkerError.ts +148 -0
  1271. package/repos/effect/packages/effect/src/unstable/workers/WorkerRunner.ts +57 -0
  1272. package/repos/effect/packages/effect/src/unstable/workers/index.ts +25 -0
  1273. package/repos/effect/packages/effect/src/unstable/workflow/Activity.ts +322 -0
  1274. package/repos/effect/packages/effect/src/unstable/workflow/DurableClock.ts +117 -0
  1275. package/repos/effect/packages/effect/src/unstable/workflow/DurableDeferred.ts +653 -0
  1276. package/repos/effect/packages/effect/src/unstable/workflow/DurableQueue.ts +360 -0
  1277. package/repos/effect/packages/effect/src/unstable/workflow/Workflow.ts +898 -0
  1278. package/repos/effect/packages/effect/src/unstable/workflow/WorkflowEngine.ts +759 -0
  1279. package/repos/effect/packages/effect/src/unstable/workflow/WorkflowProxy.ts +212 -0
  1280. package/repos/effect/packages/effect/src/unstable/workflow/WorkflowProxyServer.ts +151 -0
  1281. package/repos/effect/packages/effect/src/unstable/workflow/index.ts +45 -0
  1282. package/repos/effect/packages/effect/src/unstable/workflow/internal/crypto.ts +15 -0
  1283. package/repos/effect/packages/effect/test/Array.test.ts +1579 -0
  1284. package/repos/effect/packages/effect/test/AtomRef.test.ts +27 -0
  1285. package/repos/effect/packages/effect/test/BigDecimal.test.ts +525 -0
  1286. package/repos/effect/packages/effect/test/BigInt.test.ts +57 -0
  1287. package/repos/effect/packages/effect/test/Boolean.test.ts +289 -0
  1288. package/repos/effect/packages/effect/test/Brand.test.ts +160 -0
  1289. package/repos/effect/packages/effect/test/Cache.test.ts +1423 -0
  1290. package/repos/effect/packages/effect/test/Cause.test.ts +834 -0
  1291. package/repos/effect/packages/effect/test/Channel.test.ts +556 -0
  1292. package/repos/effect/packages/effect/test/Chunk.test.ts +874 -0
  1293. package/repos/effect/packages/effect/test/Combiner.test.ts +42 -0
  1294. package/repos/effect/packages/effect/test/Config.test.ts +1416 -0
  1295. package/repos/effect/packages/effect/test/ConfigProvider.test.ts +726 -0
  1296. package/repos/effect/packages/effect/test/Cron.test.ts +401 -0
  1297. package/repos/effect/packages/effect/test/Crypto.test.ts +86 -0
  1298. package/repos/effect/packages/effect/test/Data.test.ts +269 -0
  1299. package/repos/effect/packages/effect/test/DateTime.test.ts +953 -0
  1300. package/repos/effect/packages/effect/test/Deferred.test.ts +165 -0
  1301. package/repos/effect/packages/effect/test/Duration.test.ts +679 -0
  1302. package/repos/effect/packages/effect/test/Effect.test.ts +2658 -0
  1303. package/repos/effect/packages/effect/test/EffectEager.test.ts +678 -0
  1304. package/repos/effect/packages/effect/test/EffectKeepAlive.test.ts +71 -0
  1305. package/repos/effect/packages/effect/test/Equal.test.ts +1278 -0
  1306. package/repos/effect/packages/effect/test/Equivalence.test.ts +170 -0
  1307. package/repos/effect/packages/effect/test/ExecutionPlan.test.ts +117 -0
  1308. package/repos/effect/packages/effect/test/Exit.test.ts +12 -0
  1309. package/repos/effect/packages/effect/test/Fiber.test.ts +9 -0
  1310. package/repos/effect/packages/effect/test/FiberHandle.test.ts +146 -0
  1311. package/repos/effect/packages/effect/test/FiberMap.test.ts +171 -0
  1312. package/repos/effect/packages/effect/test/FiberSet.test.ts +119 -0
  1313. package/repos/effect/packages/effect/test/Formatter.test.ts +247 -0
  1314. package/repos/effect/packages/effect/test/Function.test.ts +333 -0
  1315. package/repos/effect/packages/effect/test/Graph.test.ts +3505 -0
  1316. package/repos/effect/packages/effect/test/HashMap.test.ts +618 -0
  1317. package/repos/effect/packages/effect/test/HashSet.test.ts +298 -0
  1318. package/repos/effect/packages/effect/test/HttpClient.test.ts +131 -0
  1319. package/repos/effect/packages/effect/test/Iterable.test.ts +486 -0
  1320. package/repos/effect/packages/effect/test/JsonPatch.test.ts +948 -0
  1321. package/repos/effect/packages/effect/test/JsonPointer.test.ts +353 -0
  1322. package/repos/effect/packages/effect/test/JsonSchema.test.ts +1253 -0
  1323. package/repos/effect/packages/effect/test/Latch.test.ts +21 -0
  1324. package/repos/effect/packages/effect/test/Layer.test.ts +648 -0
  1325. package/repos/effect/packages/effect/test/LayerMap.test.ts +98 -0
  1326. package/repos/effect/packages/effect/test/LogLevel.test.ts +28 -0
  1327. package/repos/effect/packages/effect/test/Logger.test.ts +154 -0
  1328. package/repos/effect/packages/effect/test/ManagedRuntime.test.ts +58 -0
  1329. package/repos/effect/packages/effect/test/Match.test.ts +27 -0
  1330. package/repos/effect/packages/effect/test/Metric.test.ts +682 -0
  1331. package/repos/effect/packages/effect/test/Migrator.test.ts +69 -0
  1332. package/repos/effect/packages/effect/test/MutableHashMap.test.ts +309 -0
  1333. package/repos/effect/packages/effect/test/MutableHashSet.test.ts +10 -0
  1334. package/repos/effect/packages/effect/test/MutableList.test.ts +58 -0
  1335. package/repos/effect/packages/effect/test/Newtype.test.ts +90 -0
  1336. package/repos/effect/packages/effect/test/Number.test.ts +422 -0
  1337. package/repos/effect/packages/effect/test/Optic.test.ts +452 -0
  1338. package/repos/effect/packages/effect/test/Option.test.ts +564 -0
  1339. package/repos/effect/packages/effect/test/Order.test.ts +163 -0
  1340. package/repos/effect/packages/effect/test/Ordering.test.ts +18 -0
  1341. package/repos/effect/packages/effect/test/PartitionedSemaphore.test.ts +74 -0
  1342. package/repos/effect/packages/effect/test/Pathfinding.test.ts +426 -0
  1343. package/repos/effect/packages/effect/test/Pool.test.ts +422 -0
  1344. package/repos/effect/packages/effect/test/Predicate.test.ts +555 -0
  1345. package/repos/effect/packages/effect/test/PubSub.test.ts +538 -0
  1346. package/repos/effect/packages/effect/test/Queue.test.ts +317 -0
  1347. package/repos/effect/packages/effect/test/Random.test.ts +238 -0
  1348. package/repos/effect/packages/effect/test/RcMap.test.ts +237 -0
  1349. package/repos/effect/packages/effect/test/RcRef.test.ts +97 -0
  1350. package/repos/effect/packages/effect/test/Record.test.ts +395 -0
  1351. package/repos/effect/packages/effect/test/Redacted.test.ts +59 -0
  1352. package/repos/effect/packages/effect/test/Reducer.test.ts +12 -0
  1353. package/repos/effect/packages/effect/test/Ref.test.ts +187 -0
  1354. package/repos/effect/packages/effect/test/Request.test.ts +305 -0
  1355. package/repos/effect/packages/effect/test/Resource.test.ts +59 -0
  1356. package/repos/effect/packages/effect/test/Result.test.ts +517 -0
  1357. package/repos/effect/packages/effect/test/Schedule.test.ts +395 -0
  1358. package/repos/effect/packages/effect/test/Scheduler.test.ts +70 -0
  1359. package/repos/effect/packages/effect/test/Scope.test.ts +19 -0
  1360. package/repos/effect/packages/effect/test/ScopedCache.test.ts +2316 -0
  1361. package/repos/effect/packages/effect/test/ScopedRef.test.ts +80 -0
  1362. package/repos/effect/packages/effect/test/Semaphore.test.ts +469 -0
  1363. package/repos/effect/packages/effect/test/Sink.test.ts +230 -0
  1364. package/repos/effect/packages/effect/test/Stream.test.ts +4712 -0
  1365. package/repos/effect/packages/effect/test/String.test.ts +690 -0
  1366. package/repos/effect/packages/effect/test/Struct.test.ts +216 -0
  1367. package/repos/effect/packages/effect/test/SubscriptionRef.test.ts +90 -0
  1368. package/repos/effect/packages/effect/test/Symbol.test.ts +50 -0
  1369. package/repos/effect/packages/effect/test/SynchronizedRef.test.ts +105 -0
  1370. package/repos/effect/packages/effect/test/TestClock.test.ts +71 -0
  1371. package/repos/effect/packages/effect/test/Tracer.test.ts +410 -0
  1372. package/repos/effect/packages/effect/test/Trie.test.ts +531 -0
  1373. package/repos/effect/packages/effect/test/Tuple.test.ts +127 -0
  1374. package/repos/effect/packages/effect/test/TxChunk.test.ts +342 -0
  1375. package/repos/effect/packages/effect/test/TxDeferred.test.ts +197 -0
  1376. package/repos/effect/packages/effect/test/TxHashMap.test.ts +963 -0
  1377. package/repos/effect/packages/effect/test/TxHashSet.test.ts +442 -0
  1378. package/repos/effect/packages/effect/test/TxPriorityQueue.test.ts +187 -0
  1379. package/repos/effect/packages/effect/test/TxPubSub.test.ts +391 -0
  1380. package/repos/effect/packages/effect/test/TxQueue.test.ts +1260 -0
  1381. package/repos/effect/packages/effect/test/TxReentrantLock.test.ts +413 -0
  1382. package/repos/effect/packages/effect/test/TxSemaphore.test.ts +283 -0
  1383. package/repos/effect/packages/effect/test/TxSubscriptionRef.test.ts +197 -0
  1384. package/repos/effect/packages/effect/test/UndefinedOr.test.ts +65 -0
  1385. package/repos/effect/packages/effect/test/cluster/ClusterWorkflowEngine.test.ts +652 -0
  1386. package/repos/effect/packages/effect/test/cluster/Entity.test.ts +81 -0
  1387. package/repos/effect/packages/effect/test/cluster/K8sHttpClient.test.ts +34 -0
  1388. package/repos/effect/packages/effect/test/cluster/MessageStorage.test.ts +196 -0
  1389. package/repos/effect/packages/effect/test/cluster/Sharding.test.ts +578 -0
  1390. package/repos/effect/packages/effect/test/cluster/TestEntity.ts +132 -0
  1391. package/repos/effect/packages/effect/test/reactivity/AsyncResult.test.ts +41 -0
  1392. package/repos/effect/packages/effect/test/reactivity/Atom.test.ts +2551 -0
  1393. package/repos/effect/packages/effect/test/reactivity/AtomHttpApi.test.ts +86 -0
  1394. package/repos/effect/packages/effect/test/reactivity/AtomRpc.test.ts +70 -0
  1395. package/repos/effect/packages/effect/test/rpc/Rpc.test.ts +73 -0
  1396. package/repos/effect/packages/effect/test/rpc/RpcClient.test.ts +58 -0
  1397. package/repos/effect/packages/effect/test/rpc/RpcSerialization.test.ts +171 -0
  1398. package/repos/effect/packages/effect/test/schema/HMR.test.ts +72 -0
  1399. package/repos/effect/packages/effect/test/schema/Schema.test.ts +9133 -0
  1400. package/repos/effect/packages/effect/test/schema/SchemaAST.test.ts +280 -0
  1401. package/repos/effect/packages/effect/test/schema/SchemaGetter.test.ts +383 -0
  1402. package/repos/effect/packages/effect/test/schema/SchemaIssue.test.ts +9 -0
  1403. package/repos/effect/packages/effect/test/schema/SchemaParser.test.ts +323 -0
  1404. package/repos/effect/packages/effect/test/schema/fixtures/HMR-Class.ts +5 -0
  1405. package/repos/effect/packages/effect/test/schema/fixtures/HMR-sanity-check.ts +3 -0
  1406. package/repos/effect/packages/effect/test/schema/representation/fromASTs.test.ts +820 -0
  1407. package/repos/effect/packages/effect/test/schema/representation/fromJsonSchemaDocument.test.ts +2137 -0
  1408. package/repos/effect/packages/effect/test/schema/representation/toCodeDocument.test.ts +2089 -0
  1409. package/repos/effect/packages/effect/test/schema/representation/toJsonSchemaMultiDocument.test.ts +39 -0
  1410. package/repos/effect/packages/effect/test/schema/representation/toSchema.test.ts +506 -0
  1411. package/repos/effect/packages/effect/test/schema/toArbitrary.test.ts +1693 -0
  1412. package/repos/effect/packages/effect/test/schema/toCodec.test.ts +3149 -0
  1413. package/repos/effect/packages/effect/test/schema/toDifferJsonPatch.test.ts +239 -0
  1414. package/repos/effect/packages/effect/test/schema/toEquivalence.test.ts +519 -0
  1415. package/repos/effect/packages/effect/test/schema/toFormatter.test.ts +565 -0
  1416. package/repos/effect/packages/effect/test/schema/toIso.test.ts +394 -0
  1417. package/repos/effect/packages/effect/test/schema/toJsonSchemaDocument.test.ts +3630 -0
  1418. package/repos/effect/packages/effect/test/schema/toStandardJSONSchemaV1.test.ts +126 -0
  1419. package/repos/effect/packages/effect/test/schema/toStandardSchemaV1.test.ts +495 -0
  1420. package/repos/effect/packages/effect/test/schema/v3-v4.test.ts +250 -0
  1421. package/repos/effect/packages/effect/test/testing/TestSchema.test.ts +78 -0
  1422. package/repos/effect/packages/effect/test/unstable/ai/AiError.test.ts +823 -0
  1423. package/repos/effect/packages/effect/test/unstable/ai/AnthropicStructuredOutput.test.ts +593 -0
  1424. package/repos/effect/packages/effect/test/unstable/ai/Chat.test.ts +147 -0
  1425. package/repos/effect/packages/effect/test/unstable/ai/EmbeddingModel.test.ts +185 -0
  1426. package/repos/effect/packages/effect/test/unstable/ai/LanguageModel.test.ts +1714 -0
  1427. package/repos/effect/packages/effect/test/unstable/ai/LanguageModelTrackerLifecycle.test.ts +413 -0
  1428. package/repos/effect/packages/effect/test/unstable/ai/McpServer.test.ts +82 -0
  1429. package/repos/effect/packages/effect/test/unstable/ai/Model.test.ts +16 -0
  1430. package/repos/effect/packages/effect/test/unstable/ai/OpenAiStructuredOutput.test.ts +723 -0
  1431. package/repos/effect/packages/effect/test/unstable/ai/Prompt.test.ts +346 -0
  1432. package/repos/effect/packages/effect/test/unstable/ai/ResponseIdTracker.test.ts +424 -0
  1433. package/repos/effect/packages/effect/test/unstable/ai/Tool.test.ts +1264 -0
  1434. package/repos/effect/packages/effect/test/unstable/ai/utils.ts +68 -0
  1435. package/repos/effect/packages/effect/test/unstable/cli/Arguments.test.ts +390 -0
  1436. package/repos/effect/packages/effect/test/unstable/cli/Command.test.ts +1801 -0
  1437. package/repos/effect/packages/effect/test/unstable/cli/Errors.test.ts +150 -0
  1438. package/repos/effect/packages/effect/test/unstable/cli/Help.test.ts +572 -0
  1439. package/repos/effect/packages/effect/test/unstable/cli/LogLevel.test.ts +202 -0
  1440. package/repos/effect/packages/effect/test/unstable/cli/Param.test.ts +391 -0
  1441. package/repos/effect/packages/effect/test/unstable/cli/Primitive.test.ts +321 -0
  1442. package/repos/effect/packages/effect/test/unstable/cli/Prompt.test.ts +597 -0
  1443. package/repos/effect/packages/effect/test/unstable/cli/completions/completions.test.ts +656 -0
  1444. package/repos/effect/packages/effect/test/unstable/cli/completions/descriptor.test.ts +245 -0
  1445. package/repos/effect/packages/effect/test/unstable/cli/fixtures/ComprehensiveCli.ts +422 -0
  1446. package/repos/effect/packages/effect/test/unstable/cli/services/MockTerminal.ts +135 -0
  1447. package/repos/effect/packages/effect/test/unstable/cli/services/TestActions.ts +36 -0
  1448. package/repos/effect/packages/effect/test/unstable/encoding/Ndjson.test.ts +18 -0
  1449. package/repos/effect/packages/effect/test/unstable/encoding/Sse.test.ts +62 -0
  1450. package/repos/effect/packages/effect/test/unstable/eventlog/EventJournal.test.ts +25 -0
  1451. package/repos/effect/packages/effect/test/unstable/eventlog/EventLog.test.ts +104 -0
  1452. package/repos/effect/packages/effect/test/unstable/eventlog/EventLogIdentityDerivation.test.ts +85 -0
  1453. package/repos/effect/packages/effect/test/unstable/eventlog/EventLogRemote.test.ts +176 -0
  1454. package/repos/effect/packages/effect/test/unstable/eventlog/EventLogSessionAuth.test.ts +130 -0
  1455. package/repos/effect/packages/effect/test/unstable/eventlog/SqlEventLogServerUnencryptedStorageTest.ts +169 -0
  1456. package/repos/effect/packages/effect/test/unstable/http/Cookies.test.ts +80 -0
  1457. package/repos/effect/packages/effect/test/unstable/http/Headers.test.ts +73 -0
  1458. package/repos/effect/packages/effect/test/unstable/http/HttpClient.test.ts +306 -0
  1459. package/repos/effect/packages/effect/test/unstable/http/HttpClientRequest.test.ts +164 -0
  1460. package/repos/effect/packages/effect/test/unstable/http/HttpEffect.test.ts +254 -0
  1461. package/repos/effect/packages/effect/test/unstable/http/HttpMiddleware.test.ts +57 -0
  1462. package/repos/effect/packages/effect/test/unstable/http/HttpServerError.test.ts +121 -0
  1463. package/repos/effect/packages/effect/test/unstable/http/HttpServerRequest.test.ts +157 -0
  1464. package/repos/effect/packages/effect/test/unstable/http/HttpServerResponse.test.ts +76 -0
  1465. package/repos/effect/packages/effect/test/unstable/http/Multipart.test.ts +69 -0
  1466. package/repos/effect/packages/effect/test/unstable/http/Url.test.ts +98 -0
  1467. package/repos/effect/packages/effect/test/unstable/http/UrlParams.test.ts +30 -0
  1468. package/repos/effect/packages/effect/test/unstable/httpapi/HttpApiBuilder.test.ts +186 -0
  1469. package/repos/effect/packages/effect/test/unstable/httpapi/HttpApiClient.test.ts +446 -0
  1470. package/repos/effect/packages/effect/test/unstable/httpapi/HttpApiEndpoint.test.ts +160 -0
  1471. package/repos/effect/packages/effect/test/unstable/httpapi/HttpApiSchema.test.ts +108 -0
  1472. package/repos/effect/packages/effect/test/unstable/httpapi/HttpApiSecurity.test.ts +41 -0
  1473. package/repos/effect/packages/effect/test/unstable/httpapi/OpenApi.test.ts +39 -0
  1474. package/repos/effect/packages/effect/test/unstable/observability/OtlpConfig.test.ts +151 -0
  1475. package/repos/effect/packages/effect/test/unstable/observability/OtlpExporter.test.ts +108 -0
  1476. package/repos/effect/packages/effect/test/unstable/observability/OtlpMetrics.test.ts +518 -0
  1477. package/repos/effect/packages/effect/test/unstable/observability/OtlpResource.test.ts +84 -0
  1478. package/repos/effect/packages/effect/test/unstable/observability/PrometheusMetrics.test.ts +417 -0
  1479. package/repos/effect/packages/effect/test/unstable/persistence/KeyValueStore.test.ts +164 -0
  1480. package/repos/effect/packages/effect/test/unstable/persistence/KeyValueStoreTest.ts +85 -0
  1481. package/repos/effect/packages/effect/test/unstable/persistence/PersistedCache.test.ts +4 -0
  1482. package/repos/effect/packages/effect/test/unstable/persistence/PersistedCacheTest.ts +111 -0
  1483. package/repos/effect/packages/effect/test/unstable/persistence/PersistedQueue.test.ts +4 -0
  1484. package/repos/effect/packages/effect/test/unstable/persistence/PersistedQueueTest.ts +106 -0
  1485. package/repos/effect/packages/effect/test/unstable/persistence/RateLimiter.test.ts +145 -0
  1486. package/repos/effect/packages/effect/test/unstable/persistence/Redis.test.ts +43 -0
  1487. package/repos/effect/packages/effect/test/unstable/process/ChildProcess.test.ts +352 -0
  1488. package/repos/effect/packages/effect/test/unstable/schema/VariantSchema.test.ts +72 -0
  1489. package/repos/effect/packages/effect/test/unstable/sql/SqlError.test.ts +228 -0
  1490. package/repos/effect/packages/effect/test/unstable/sql/SqlSchema.test.ts +168 -0
  1491. package/repos/effect/packages/effect/test/unstable/workers/WorkerError.test.ts +90 -0
  1492. package/repos/effect/packages/effect/test/unstable/workflow/DurableQueue.test.ts +105 -0
  1493. package/repos/effect/packages/effect/test/unstable/workflow/WorkflowEngine.test.ts +60 -0
  1494. package/repos/effect/packages/effect/test/utils/assert.ts +182 -0
  1495. package/repos/effect/packages/effect/test/utils/chunkCoordination.ts +36 -0
  1496. package/repos/effect/packages/effect/test/utils/counter.ts +54 -0
  1497. package/repos/effect/packages/effect/tsconfig.json +8 -0
  1498. package/repos/effect/packages/effect/typetest/AiError.tst.ts +49 -0
  1499. package/repos/effect/packages/effect/typetest/Array.tst.ts +1289 -0
  1500. package/repos/effect/packages/effect/typetest/Brand.tst.ts +51 -0
  1501. package/repos/effect/packages/effect/typetest/Channel.tst.ts +112 -0
  1502. package/repos/effect/packages/effect/typetest/Config.tst.ts +31 -0
  1503. package/repos/effect/packages/effect/typetest/Data.tst.ts +121 -0
  1504. package/repos/effect/packages/effect/typetest/Effect.tst.ts +976 -0
  1505. package/repos/effect/packages/effect/typetest/Equivalence.tst.ts +19 -0
  1506. package/repos/effect/packages/effect/typetest/Newtype.tst.ts +72 -0
  1507. package/repos/effect/packages/effect/typetest/Optic.tst.ts +130 -0
  1508. package/repos/effect/packages/effect/typetest/Option.tst.ts +72 -0
  1509. package/repos/effect/packages/effect/typetest/Order.tst.ts +19 -0
  1510. package/repos/effect/packages/effect/typetest/Predicate.tst.ts +251 -0
  1511. package/repos/effect/packages/effect/typetest/Result.tst.ts +353 -0
  1512. package/repos/effect/packages/effect/typetest/Schedule.tst.ts +21 -0
  1513. package/repos/effect/packages/effect/typetest/Stream.tst.ts +197 -0
  1514. package/repos/effect/packages/effect/typetest/Struct.tst.ts +422 -0
  1515. package/repos/effect/packages/effect/typetest/Tuple.tst.ts +177 -0
  1516. package/repos/effect/packages/effect/typetest/Types.tst.ts +364 -0
  1517. package/repos/effect/packages/effect/typetest/VariantSchema.tst.ts +76 -0
  1518. package/repos/effect/packages/effect/typetest/schema/Array.tst.ts +46 -0
  1519. package/repos/effect/packages/effect/typetest/schema/Literals.tst.ts +58 -0
  1520. package/repos/effect/packages/effect/typetest/schema/Record.tst.ts +145 -0
  1521. package/repos/effect/packages/effect/typetest/schema/Schema.tst.ts +1854 -0
  1522. package/repos/effect/packages/effect/typetest/schema/Struct.tst.ts +745 -0
  1523. package/repos/effect/packages/effect/typetest/schema/Tuple.tst.ts +199 -0
  1524. package/repos/effect/packages/effect/typetest/schema/Union.tst.ts +198 -0
  1525. package/repos/effect/packages/effect/typetest/schema/api.tst.ts +276 -0
  1526. package/repos/effect/packages/effect/typetest/schema/toArbitrary.tst.ts +65 -0
  1527. package/repos/effect/packages/effect/typetest/schema/toIso.tst.ts +282 -0
  1528. package/repos/effect/packages/effect/typetest/unstable/ai/LanguageModel.tst.ts +191 -0
  1529. package/repos/effect/packages/effect/typetest/unstable/ai/Tool.tst.ts +33 -0
  1530. package/repos/effect/packages/effect/typetest/unstable/cli/Command.tst.ts +124 -0
  1531. package/repos/effect/packages/effect/typetest/unstable/cli/Param.tst.ts +20 -0
  1532. package/repos/effect/packages/effect/typetest/unstable/cli/Prompt.tst.ts +97 -0
  1533. package/repos/effect/packages/effect/typetest/unstable/encoding/Ndjson.tst.ts +24 -0
  1534. package/repos/effect/packages/effect/typetest/unstable/http/HttpClient.tst.ts +143 -0
  1535. package/repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiBuilder.tst.ts +98 -0
  1536. package/repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiClient.tst.ts +677 -0
  1537. package/repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiEndpoint.tst.ts +466 -0
  1538. package/repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiMiddleware.tst.ts +90 -0
  1539. package/repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiSchema.tst.ts +135 -0
  1540. package/repos/effect/packages/effect/typetest/unstable/reactivity/AsyncResult.tst.ts +65 -0
  1541. package/repos/effect/packages/effect/typetest/unstable/reactivity/AtomHttpApi.tst.ts +63 -0
  1542. package/repos/effect/packages/effect/typetest/unstable/rpc/Rpc.tst.ts +74 -0
  1543. package/repos/effect/packages/effect/typetest/unstable/rpc/RpcGroup.tst.ts +61 -0
  1544. package/repos/effect/packages/effect/typetest/unstable/rpc/RpcMiddleware.tst.ts +41 -0
  1545. package/repos/effect/packages/effect/typetest/unstable/rpc/RpcServer.tst.ts +26 -0
  1546. package/repos/effect/packages/effect/typetest/unstable/sql/SqlSchema.tst.ts +75 -0
  1547. package/repos/effect/packages/effect/typetest/unstable/workflow/Workflow.tst.ts +16 -0
  1548. package/repos/effect/packages/effect/vitest.config.ts +11 -0
  1549. package/repos/effect/packages/opentelemetry/CHANGELOG.md +620 -0
  1550. package/repos/effect/packages/opentelemetry/LICENSE +21 -0
  1551. package/repos/effect/packages/opentelemetry/README.md +5 -0
  1552. package/repos/effect/packages/opentelemetry/docgen.json +30 -0
  1553. package/repos/effect/packages/opentelemetry/package.json +126 -0
  1554. package/repos/effect/packages/opentelemetry/src/Logger.ts +193 -0
  1555. package/repos/effect/packages/opentelemetry/src/Metrics.ts +138 -0
  1556. package/repos/effect/packages/opentelemetry/src/NodeSdk.ts +162 -0
  1557. package/repos/effect/packages/opentelemetry/src/Resource.ts +147 -0
  1558. package/repos/effect/packages/opentelemetry/src/Tracer.ts +594 -0
  1559. package/repos/effect/packages/opentelemetry/src/WebSdk.ts +140 -0
  1560. package/repos/effect/packages/opentelemetry/src/index.ts +35 -0
  1561. package/repos/effect/packages/opentelemetry/src/internal/attributes.ts +28 -0
  1562. package/repos/effect/packages/opentelemetry/src/internal/metrics.ts +463 -0
  1563. package/repos/effect/packages/opentelemetry/src/internal/utilities.ts +5 -0
  1564. package/repos/effect/packages/opentelemetry/test/Logger.test.ts +122 -0
  1565. package/repos/effect/packages/opentelemetry/test/Metrics.test.ts +339 -0
  1566. package/repos/effect/packages/opentelemetry/test/Tracer.test.ts +167 -0
  1567. package/repos/effect/packages/opentelemetry/tsconfig.json +8 -0
  1568. package/repos/effect/packages/opentelemetry/vitest.config.ts +6 -0
  1569. package/repos/effect/packages/platform-browser/CHANGELOG.md +637 -0
  1570. package/repos/effect/packages/platform-browser/LICENSE +21 -0
  1571. package/repos/effect/packages/platform-browser/README.md +1 -0
  1572. package/repos/effect/packages/platform-browser/docgen.json +21 -0
  1573. package/repos/effect/packages/platform-browser/package.json +74 -0
  1574. package/repos/effect/packages/platform-browser/src/BrowserCrypto.ts +97 -0
  1575. package/repos/effect/packages/platform-browser/src/BrowserHttpClient.ts +430 -0
  1576. package/repos/effect/packages/platform-browser/src/BrowserKeyValueStore.ts +177 -0
  1577. package/repos/effect/packages/platform-browser/src/BrowserPersistence.ts +334 -0
  1578. package/repos/effect/packages/platform-browser/src/BrowserRuntime.ts +53 -0
  1579. package/repos/effect/packages/platform-browser/src/BrowserSocket.ts +52 -0
  1580. package/repos/effect/packages/platform-browser/src/BrowserStream.ts +56 -0
  1581. package/repos/effect/packages/platform-browser/src/BrowserWorker.ts +98 -0
  1582. package/repos/effect/packages/platform-browser/src/BrowserWorkerRunner.ts +199 -0
  1583. package/repos/effect/packages/platform-browser/src/Clipboard.ts +143 -0
  1584. package/repos/effect/packages/platform-browser/src/Geolocation.ts +233 -0
  1585. package/repos/effect/packages/platform-browser/src/IndexedDb.ts +113 -0
  1586. package/repos/effect/packages/platform-browser/src/IndexedDbDatabase.ts +648 -0
  1587. package/repos/effect/packages/platform-browser/src/IndexedDbQueryBuilder.ts +2032 -0
  1588. package/repos/effect/packages/platform-browser/src/IndexedDbTable.ts +260 -0
  1589. package/repos/effect/packages/platform-browser/src/IndexedDbVersion.ts +138 -0
  1590. package/repos/effect/packages/platform-browser/src/Permissions.ts +146 -0
  1591. package/repos/effect/packages/platform-browser/src/index.ts +90 -0
  1592. package/repos/effect/packages/platform-browser/test/BrowserCrypto.test.ts +74 -0
  1593. package/repos/effect/packages/platform-browser/test/BrowserHttpClient.test.ts +91 -0
  1594. package/repos/effect/packages/platform-browser/test/BrowserKeyValueStore.test.ts +23 -0
  1595. package/repos/effect/packages/platform-browser/test/BrowserPersistence.test.ts +209 -0
  1596. package/repos/effect/packages/platform-browser/test/BrowserPersistencePersistedCache.test.ts +29 -0
  1597. package/repos/effect/packages/platform-browser/test/IndexedDbDatabase.test.ts +253 -0
  1598. package/repos/effect/packages/platform-browser/test/IndexedDbQueryBuilder.test.ts +1459 -0
  1599. package/repos/effect/packages/platform-browser/test/IndexedDbTable.test.ts +101 -0
  1600. package/repos/effect/packages/platform-browser/test/IndexedDbVersion.test.ts +50 -0
  1601. package/repos/effect/packages/platform-browser/test/Permissions.test.ts +12 -0
  1602. package/repos/effect/packages/platform-browser/test/RpcWorker.test.ts +19 -0
  1603. package/repos/effect/packages/platform-browser/test/fixtures/rpc-e2e.ts +141 -0
  1604. package/repos/effect/packages/platform-browser/test/fixtures/rpc-schemas.ts +157 -0
  1605. package/repos/effect/packages/platform-browser/test/fixtures/rpc-worker.ts +12 -0
  1606. package/repos/effect/packages/platform-browser/tsconfig.json +8 -0
  1607. package/repos/effect/packages/platform-browser/vitest.config.ts +17 -0
  1608. package/repos/effect/packages/platform-browser/vitest.setup.ts +5 -0
  1609. package/repos/effect/packages/platform-bun/CHANGELOG.md +691 -0
  1610. package/repos/effect/packages/platform-bun/LICENSE +21 -0
  1611. package/repos/effect/packages/platform-bun/README.md +7 -0
  1612. package/repos/effect/packages/platform-bun/docgen.json +20 -0
  1613. package/repos/effect/packages/platform-bun/package.json +73 -0
  1614. package/repos/effect/packages/platform-bun/src/BunChildProcessSpawner.ts +6 -0
  1615. package/repos/effect/packages/platform-bun/src/BunClusterHttp.ts +174 -0
  1616. package/repos/effect/packages/platform-bun/src/BunClusterSocket.ts +153 -0
  1617. package/repos/effect/packages/platform-bun/src/BunCrypto.ts +24 -0
  1618. package/repos/effect/packages/platform-bun/src/BunFileSystem.ts +20 -0
  1619. package/repos/effect/packages/platform-bun/src/BunHttpClient.ts +9 -0
  1620. package/repos/effect/packages/platform-bun/src/BunHttpPlatform.ts +50 -0
  1621. package/repos/effect/packages/platform-bun/src/BunHttpServer.ts +600 -0
  1622. package/repos/effect/packages/platform-bun/src/BunHttpServerRequest.ts +19 -0
  1623. package/repos/effect/packages/platform-bun/src/BunMultipart.ts +54 -0
  1624. package/repos/effect/packages/platform-bun/src/BunPath.ts +37 -0
  1625. package/repos/effect/packages/platform-bun/src/BunRedis.ts +88 -0
  1626. package/repos/effect/packages/platform-bun/src/BunRuntime.ts +52 -0
  1627. package/repos/effect/packages/platform-bun/src/BunServices.ts +49 -0
  1628. package/repos/effect/packages/platform-bun/src/BunSink.ts +8 -0
  1629. package/repos/effect/packages/platform-bun/src/BunSocket.ts +54 -0
  1630. package/repos/effect/packages/platform-bun/src/BunSocketServer.ts +8 -0
  1631. package/repos/effect/packages/platform-bun/src/BunStdio.ts +22 -0
  1632. package/repos/effect/packages/platform-bun/src/BunStream.ts +68 -0
  1633. package/repos/effect/packages/platform-bun/src/BunTerminal.ts +32 -0
  1634. package/repos/effect/packages/platform-bun/src/BunWorker.ts +92 -0
  1635. package/repos/effect/packages/platform-bun/src/BunWorkerRunner.ts +113 -0
  1636. package/repos/effect/packages/platform-bun/src/index.ts +115 -0
  1637. package/repos/effect/packages/platform-bun/tsconfig.json +12 -0
  1638. package/repos/effect/packages/platform-node/CHANGELOG.md +695 -0
  1639. package/repos/effect/packages/platform-node/LICENSE +21 -0
  1640. package/repos/effect/packages/platform-node/README.md +7 -0
  1641. package/repos/effect/packages/platform-node/docgen.json +24 -0
  1642. package/repos/effect/packages/platform-node/package.json +82 -0
  1643. package/repos/effect/packages/platform-node/src/Mime.ts +25 -0
  1644. package/repos/effect/packages/platform-node/src/NodeChildProcessSpawner.ts +6 -0
  1645. package/repos/effect/packages/platform-node/src/NodeClusterHttp.ts +155 -0
  1646. package/repos/effect/packages/platform-node/src/NodeClusterSocket.ts +176 -0
  1647. package/repos/effect/packages/platform-node/src/NodeCrypto.ts +24 -0
  1648. package/repos/effect/packages/platform-node/src/NodeFileSystem.ts +21 -0
  1649. package/repos/effect/packages/platform-node/src/NodeHttpClient.ts +664 -0
  1650. package/repos/effect/packages/platform-node/src/NodeHttpIncomingMessage.ts +141 -0
  1651. package/repos/effect/packages/platform-node/src/NodeHttpPlatform.ts +70 -0
  1652. package/repos/effect/packages/platform-node/src/NodeHttpServer.ts +646 -0
  1653. package/repos/effect/packages/platform-node/src/NodeHttpServerRequest.ts +33 -0
  1654. package/repos/effect/packages/platform-node/src/NodeMultipart.ts +183 -0
  1655. package/repos/effect/packages/platform-node/src/NodePath.ts +40 -0
  1656. package/repos/effect/packages/platform-node/src/NodeRedis.ts +92 -0
  1657. package/repos/effect/packages/platform-node/src/NodeRuntime.ts +53 -0
  1658. package/repos/effect/packages/platform-node/src/NodeServices.ts +50 -0
  1659. package/repos/effect/packages/platform-node/src/NodeSink.ts +8 -0
  1660. package/repos/effect/packages/platform-node/src/NodeSocket.ts +72 -0
  1661. package/repos/effect/packages/platform-node/src/NodeSocketServer.ts +8 -0
  1662. package/repos/effect/packages/platform-node/src/NodeStdio.ts +22 -0
  1663. package/repos/effect/packages/platform-node/src/NodeStream.ts +8 -0
  1664. package/repos/effect/packages/platform-node/src/NodeTerminal.ts +32 -0
  1665. package/repos/effect/packages/platform-node/src/NodeWorker.ts +121 -0
  1666. package/repos/effect/packages/platform-node/src/NodeWorkerRunner.ts +110 -0
  1667. package/repos/effect/packages/platform-node/src/Undici.ts +29 -0
  1668. package/repos/effect/packages/platform-node/src/index.ts +130 -0
  1669. package/repos/effect/packages/platform-node/test/HttpApi.test.ts +1831 -0
  1670. package/repos/effect/packages/platform-node/test/HttpStaticServer.test.ts +253 -0
  1671. package/repos/effect/packages/platform-node/test/HttpStaticServerConditional.test.ts +296 -0
  1672. package/repos/effect/packages/platform-node/test/NodeCrypto.test.ts +59 -0
  1673. package/repos/effect/packages/platform-node/test/NodeHttpClient.test.ts +157 -0
  1674. package/repos/effect/packages/platform-node/test/NodeHttpPlatform.test.ts +51 -0
  1675. package/repos/effect/packages/platform-node/test/NodeHttpServer.test.ts +598 -0
  1676. package/repos/effect/packages/platform-node/test/NodeRedis.test.ts +31 -0
  1677. package/repos/effect/packages/platform-node/test/NodeSocket.test.ts +153 -0
  1678. package/repos/effect/packages/platform-node/test/OpenApi.test.ts +1573 -0
  1679. package/repos/effect/packages/platform-node/test/RpcServer.test.ts +213 -0
  1680. package/repos/effect/packages/platform-node/test/__snapshots__/HttpApi.test.ts.snap +715 -0
  1681. package/repos/effect/packages/platform-node/test/cluster/MessageStorageTest.ts +196 -0
  1682. package/repos/effect/packages/platform-node/test/cluster/SocketRunner.test.ts +120 -0
  1683. package/repos/effect/packages/platform-node/test/cluster/SqlMessageStorage.test.ts +222 -0
  1684. package/repos/effect/packages/platform-node/test/cluster/SqlRunnerStorage.test.ts +101 -0
  1685. package/repos/effect/packages/platform-node/test/fixtures/http-static-server/conditional.txt +1 -0
  1686. package/repos/effect/packages/platform-node/test/fixtures/http-static-server/custom/home.html +1 -0
  1687. package/repos/effect/packages/platform-node/test/fixtures/http-static-server/file.binx +1 -0
  1688. package/repos/effect/packages/platform-node/test/fixtures/http-static-server/guide/index.html +1 -0
  1689. package/repos/effect/packages/platform-node/test/fixtures/http-static-server/hello.txt +1 -0
  1690. package/repos/effect/packages/platform-node/test/fixtures/http-static-server/index.html +1 -0
  1691. package/repos/effect/packages/platform-node/test/fixtures/http-static-server/range.txt +1 -0
  1692. package/repos/effect/packages/platform-node/test/fixtures/http-static-server-outside.txt +1 -0
  1693. package/repos/effect/packages/platform-node/test/fixtures/mysql2-utils.ts +64 -0
  1694. package/repos/effect/packages/platform-node/test/fixtures/pg-utils.ts +39 -0
  1695. package/repos/effect/packages/platform-node/test/fixtures/rpc-e2e.ts +149 -0
  1696. package/repos/effect/packages/platform-node/test/fixtures/rpc-schemas.ts +175 -0
  1697. package/repos/effect/packages/platform-node/test/fixtures/text.txt +1 -0
  1698. package/repos/effect/packages/platform-node/tsconfig.json +12 -0
  1699. package/repos/effect/packages/platform-node/vitest.config.ts +6 -0
  1700. package/repos/effect/packages/platform-node-shared/CHANGELOG.md +617 -0
  1701. package/repos/effect/packages/platform-node-shared/LICENSE +21 -0
  1702. package/repos/effect/packages/platform-node-shared/README.md +7 -0
  1703. package/repos/effect/packages/platform-node-shared/docgen.json +38 -0
  1704. package/repos/effect/packages/platform-node-shared/package.json +76 -0
  1705. package/repos/effect/packages/platform-node-shared/src/NodeChildProcessSpawner.ts +713 -0
  1706. package/repos/effect/packages/platform-node-shared/src/NodeClusterSocket.ts +70 -0
  1707. package/repos/effect/packages/platform-node-shared/src/NodeCrypto.ts +60 -0
  1708. package/repos/effect/packages/platform-node-shared/src/NodeFileSystem.ts +652 -0
  1709. package/repos/effect/packages/platform-node-shared/src/NodePath.ts +80 -0
  1710. package/repos/effect/packages/platform-node-shared/src/NodeRuntime.ts +59 -0
  1711. package/repos/effect/packages/platform-node-shared/src/NodeSink.ts +116 -0
  1712. package/repos/effect/packages/platform-node-shared/src/NodeSocket.ts +269 -0
  1713. package/repos/effect/packages/platform-node-shared/src/NodeSocketServer.ts +301 -0
  1714. package/repos/effect/packages/platform-node-shared/src/NodeStdio.ts +67 -0
  1715. package/repos/effect/packages/platform-node-shared/src/NodeStream.ts +445 -0
  1716. package/repos/effect/packages/platform-node-shared/src/NodeTerminal.ts +129 -0
  1717. package/repos/effect/packages/platform-node-shared/src/index.ts +65 -0
  1718. package/repos/effect/packages/platform-node-shared/src/internal/utils.ts +51 -0
  1719. package/repos/effect/packages/platform-node-shared/test/NodeChildProcessSpawner.test.ts +1069 -0
  1720. package/repos/effect/packages/platform-node-shared/test/NodeFileSystem.test.ts +214 -0
  1721. package/repos/effect/packages/platform-node-shared/test/NodeSink.test.ts +153 -0
  1722. package/repos/effect/packages/platform-node-shared/test/NodeStream.test.ts +173 -0
  1723. package/repos/effect/packages/platform-node-shared/test/fixtures/bash/no-permissions.sh +3 -0
  1724. package/repos/effect/packages/platform-node-shared/test/fixtures/bash/parent-exits-early.sh +31 -0
  1725. package/repos/effect/packages/platform-node-shared/test/fixtures/bash/spawn-children.sh +32 -0
  1726. package/repos/effect/packages/platform-node-shared/test/fixtures/config/SHOUTING +1 -0
  1727. package/repos/effect/packages/platform-node-shared/test/fixtures/config/integer +1 -0
  1728. package/repos/effect/packages/platform-node-shared/test/fixtures/config/nested/config +1 -0
  1729. package/repos/effect/packages/platform-node-shared/test/fixtures/config/secret +1 -0
  1730. package/repos/effect/packages/platform-node-shared/test/fixtures/helloworld.tar.gz +0 -0
  1731. package/repos/effect/packages/platform-node-shared/test/fixtures/text.txt +1 -0
  1732. package/repos/effect/packages/platform-node-shared/tsconfig.json +11 -0
  1733. package/repos/effect/packages/platform-node-shared/vitest.config.ts +6 -0
  1734. package/repos/effect/packages/sql/clickhouse/CHANGELOG.md +681 -0
  1735. package/repos/effect/packages/sql/clickhouse/LICENSE +21 -0
  1736. package/repos/effect/packages/sql/clickhouse/README.md +7 -0
  1737. package/repos/effect/packages/sql/clickhouse/docgen.json +24 -0
  1738. package/repos/effect/packages/sql/clickhouse/package.json +72 -0
  1739. package/repos/effect/packages/sql/clickhouse/src/ClickhouseClient.ts +546 -0
  1740. package/repos/effect/packages/sql/clickhouse/src/ClickhouseMigrator.ts +51 -0
  1741. package/repos/effect/packages/sql/clickhouse/src/index.ts +15 -0
  1742. package/repos/effect/packages/sql/clickhouse/test/Client.test.ts +6 -0
  1743. package/repos/effect/packages/sql/clickhouse/test/SqlErrorClassification.test.ts +75 -0
  1744. package/repos/effect/packages/sql/clickhouse/tsconfig.json +12 -0
  1745. package/repos/effect/packages/sql/clickhouse/vitest.config.ts +6 -0
  1746. package/repos/effect/packages/sql/d1/CHANGELOG.md +597 -0
  1747. package/repos/effect/packages/sql/d1/LICENSE +21 -0
  1748. package/repos/effect/packages/sql/d1/README.md +7 -0
  1749. package/repos/effect/packages/sql/d1/docgen.json +24 -0
  1750. package/repos/effect/packages/sql/d1/package.json +75 -0
  1751. package/repos/effect/packages/sql/d1/src/D1Client.ts +249 -0
  1752. package/repos/effect/packages/sql/d1/src/index.ts +10 -0
  1753. package/repos/effect/packages/sql/d1/test/Client.test.ts +65 -0
  1754. package/repos/effect/packages/sql/d1/test/Resolver.test.ts +176 -0
  1755. package/repos/effect/packages/sql/d1/test/utils.ts +38 -0
  1756. package/repos/effect/packages/sql/d1/tsconfig.json +8 -0
  1757. package/repos/effect/packages/sql/d1/vitest.config.ts +6 -0
  1758. package/repos/effect/packages/sql/libsql/CHANGELOG.md +601 -0
  1759. package/repos/effect/packages/sql/libsql/LICENSE +21 -0
  1760. package/repos/effect/packages/sql/libsql/README.md +7 -0
  1761. package/repos/effect/packages/sql/libsql/docgen.json +24 -0
  1762. package/repos/effect/packages/sql/libsql/package.json +73 -0
  1763. package/repos/effect/packages/sql/libsql/src/LibsqlClient.ts +381 -0
  1764. package/repos/effect/packages/sql/libsql/src/LibsqlMigrator.ts +46 -0
  1765. package/repos/effect/packages/sql/libsql/src/index.ts +15 -0
  1766. package/repos/effect/packages/sql/libsql/test/Client.test.ts +106 -0
  1767. package/repos/effect/packages/sql/libsql/test/Resolver.test.ts +177 -0
  1768. package/repos/effect/packages/sql/libsql/test/util.ts +54 -0
  1769. package/repos/effect/packages/sql/libsql/tsconfig.json +9 -0
  1770. package/repos/effect/packages/sql/libsql/vitest.config.ts +6 -0
  1771. package/repos/effect/packages/sql/mssql/CHANGELOG.md +601 -0
  1772. package/repos/effect/packages/sql/mssql/LICENSE +21 -0
  1773. package/repos/effect/packages/sql/mssql/README.md +7 -0
  1774. package/repos/effect/packages/sql/mssql/docgen.json +24 -0
  1775. package/repos/effect/packages/sql/mssql/package.json +70 -0
  1776. package/repos/effect/packages/sql/mssql/src/MssqlClient.ts +732 -0
  1777. package/repos/effect/packages/sql/mssql/src/MssqlMigrator.ts +45 -0
  1778. package/repos/effect/packages/sql/mssql/src/Parameter.ts +64 -0
  1779. package/repos/effect/packages/sql/mssql/src/Procedure.ts +213 -0
  1780. package/repos/effect/packages/sql/mssql/src/index.ts +32 -0
  1781. package/repos/effect/packages/sql/mssql/test/Client.test.ts +91 -0
  1782. package/repos/effect/packages/sql/mssql/test/SqlErrorClassification.test.ts +206 -0
  1783. package/repos/effect/packages/sql/mssql/tsconfig.json +8 -0
  1784. package/repos/effect/packages/sql/mssql/vitest.config.ts +6 -0
  1785. package/repos/effect/packages/sql/mysql2/CHANGELOG.md +603 -0
  1786. package/repos/effect/packages/sql/mysql2/LICENSE +21 -0
  1787. package/repos/effect/packages/sql/mysql2/README.md +7 -0
  1788. package/repos/effect/packages/sql/mysql2/docgen.json +24 -0
  1789. package/repos/effect/packages/sql/mysql2/package.json +71 -0
  1790. package/repos/effect/packages/sql/mysql2/src/MysqlClient.ts +517 -0
  1791. package/repos/effect/packages/sql/mysql2/src/MysqlMigrator.ts +102 -0
  1792. package/repos/effect/packages/sql/mysql2/src/index.ts +15 -0
  1793. package/repos/effect/packages/sql/mysql2/test/Client.test.ts +34 -0
  1794. package/repos/effect/packages/sql/mysql2/test/KeyValueStore.test.ts +16 -0
  1795. package/repos/effect/packages/sql/mysql2/test/Model.test.ts +227 -0
  1796. package/repos/effect/packages/sql/mysql2/test/MysqlClient.test.ts +35 -0
  1797. package/repos/effect/packages/sql/mysql2/test/Persistence.test.ts +22 -0
  1798. package/repos/effect/packages/sql/mysql2/test/SqlErrorClassification.test.ts +133 -0
  1799. package/repos/effect/packages/sql/mysql2/test/SqlEventLogServerUnencrypted.test.ts +7 -0
  1800. package/repos/effect/packages/sql/mysql2/test/utils.ts +64 -0
  1801. package/repos/effect/packages/sql/mysql2/tsconfig.json +9 -0
  1802. package/repos/effect/packages/sql/mysql2/vitest.config.ts +6 -0
  1803. package/repos/effect/packages/sql/pg/CHANGELOG.md +3432 -0
  1804. package/repos/effect/packages/sql/pg/LICENSE +21 -0
  1805. package/repos/effect/packages/sql/pg/README.md +7 -0
  1806. package/repos/effect/packages/sql/pg/docgen.json +24 -0
  1807. package/repos/effect/packages/sql/pg/package.json +77 -0
  1808. package/repos/effect/packages/sql/pg/src/PgClient.ts +947 -0
  1809. package/repos/effect/packages/sql/pg/src/PgMigrator.ts +120 -0
  1810. package/repos/effect/packages/sql/pg/src/index.ts +15 -0
  1811. package/repos/effect/packages/sql/pg/test/Client.test.ts +373 -0
  1812. package/repos/effect/packages/sql/pg/test/KeyValueStore.test.ts +16 -0
  1813. package/repos/effect/packages/sql/pg/test/Persistence.test.ts +20 -0
  1814. package/repos/effect/packages/sql/pg/test/SqlErrorClassification.test.ts +81 -0
  1815. package/repos/effect/packages/sql/pg/test/SqlEventLogServerUnencrypted.test.ts +7 -0
  1816. package/repos/effect/packages/sql/pg/test/TransactionAcquire.test.ts +52 -0
  1817. package/repos/effect/packages/sql/pg/test/utils.ts +49 -0
  1818. package/repos/effect/packages/sql/pg/tsconfig.json +9 -0
  1819. package/repos/effect/packages/sql/pg/vitest.config.ts +6 -0
  1820. package/repos/effect/packages/sql/pglite/CHANGELOG.md +198 -0
  1821. package/repos/effect/packages/sql/pglite/LICENSE +21 -0
  1822. package/repos/effect/packages/sql/pglite/README.md +7 -0
  1823. package/repos/effect/packages/sql/pglite/docgen.json +24 -0
  1824. package/repos/effect/packages/sql/pglite/package.json +74 -0
  1825. package/repos/effect/packages/sql/pglite/src/PgliteClient.ts +503 -0
  1826. package/repos/effect/packages/sql/pglite/src/PgliteMigrator.ts +44 -0
  1827. package/repos/effect/packages/sql/pglite/src/index.ts +15 -0
  1828. package/repos/effect/packages/sql/pglite/test/Client.test.ts +149 -0
  1829. package/repos/effect/packages/sql/pglite/test/Migrator.test.ts +45 -0
  1830. package/repos/effect/packages/sql/pglite/test/SqlErrorClassification.test.ts +56 -0
  1831. package/repos/effect/packages/sql/pglite/test/Transaction.test.ts +62 -0
  1832. package/repos/effect/packages/sql/pglite/tsconfig.json +8 -0
  1833. package/repos/effect/packages/sql/pglite/vitest.config.ts +6 -0
  1834. package/repos/effect/packages/sql/sqlite-bun/CHANGELOG.md +601 -0
  1835. package/repos/effect/packages/sql/sqlite-bun/LICENSE +21 -0
  1836. package/repos/effect/packages/sql/sqlite-bun/README.md +7 -0
  1837. package/repos/effect/packages/sql/sqlite-bun/docgen.json +24 -0
  1838. package/repos/effect/packages/sql/sqlite-bun/package.json +69 -0
  1839. package/repos/effect/packages/sql/sqlite-bun/src/SqliteClient.ts +262 -0
  1840. package/repos/effect/packages/sql/sqlite-bun/src/SqliteMigrator.ts +90 -0
  1841. package/repos/effect/packages/sql/sqlite-bun/src/index.ts +15 -0
  1842. package/repos/effect/packages/sql/sqlite-bun/test/Client.test.ts +6 -0
  1843. package/repos/effect/packages/sql/sqlite-bun/tsconfig.json +11 -0
  1844. package/repos/effect/packages/sql/sqlite-bun/vitest.config.ts +6 -0
  1845. package/repos/effect/packages/sql/sqlite-do/CHANGELOG.md +601 -0
  1846. package/repos/effect/packages/sql/sqlite-do/LICENSE +21 -0
  1847. package/repos/effect/packages/sql/sqlite-do/README.md +7 -0
  1848. package/repos/effect/packages/sql/sqlite-do/docgen.json +24 -0
  1849. package/repos/effect/packages/sql/sqlite-do/package.json +68 -0
  1850. package/repos/effect/packages/sql/sqlite-do/src/SqliteClient.ts +249 -0
  1851. package/repos/effect/packages/sql/sqlite-do/src/SqliteMigrator.ts +45 -0
  1852. package/repos/effect/packages/sql/sqlite-do/src/index.ts +15 -0
  1853. package/repos/effect/packages/sql/sqlite-do/test/Client.test.ts +24 -0
  1854. package/repos/effect/packages/sql/sqlite-do/tsconfig.json +8 -0
  1855. package/repos/effect/packages/sql/sqlite-do/vitest.config.ts +6 -0
  1856. package/repos/effect/packages/sql/sqlite-node/CHANGELOG.md +3415 -0
  1857. package/repos/effect/packages/sql/sqlite-node/LICENSE +21 -0
  1858. package/repos/effect/packages/sql/sqlite-node/README.md +7 -0
  1859. package/repos/effect/packages/sql/sqlite-node/docgen.json +24 -0
  1860. package/repos/effect/packages/sql/sqlite-node/package.json +72 -0
  1861. package/repos/effect/packages/sql/sqlite-node/src/SqliteClient.ts +312 -0
  1862. package/repos/effect/packages/sql/sqlite-node/src/SqliteMigrator.ts +90 -0
  1863. package/repos/effect/packages/sql/sqlite-node/src/index.ts +15 -0
  1864. package/repos/effect/packages/sql/sqlite-node/test/Client.test.ts +75 -0
  1865. package/repos/effect/packages/sql/sqlite-node/test/KeyValueStore.test.ts +29 -0
  1866. package/repos/effect/packages/sql/sqlite-node/test/Persistence.test.ts +109 -0
  1867. package/repos/effect/packages/sql/sqlite-node/test/Resolver.test.ts +183 -0
  1868. package/repos/effect/packages/sql/sqlite-node/test/SqlEventJournal.test.ts +84 -0
  1869. package/repos/effect/packages/sql/sqlite-node/test/SqlEventLogServerEncrypted.test.ts +249 -0
  1870. package/repos/effect/packages/sql/sqlite-node/test/SqlEventLogServerUnencrypted.test.ts +110 -0
  1871. package/repos/effect/packages/sql/sqlite-node/test/SqliteMigrator.test.ts +48 -0
  1872. package/repos/effect/packages/sql/sqlite-node/tsconfig.json +8 -0
  1873. package/repos/effect/packages/sql/sqlite-node/vitest.config.ts +6 -0
  1874. package/repos/effect/packages/sql/sqlite-react-native/CHANGELOG.md +601 -0
  1875. package/repos/effect/packages/sql/sqlite-react-native/LICENSE +21 -0
  1876. package/repos/effect/packages/sql/sqlite-react-native/README.md +7 -0
  1877. package/repos/effect/packages/sql/sqlite-react-native/docgen.json +24 -0
  1878. package/repos/effect/packages/sql/sqlite-react-native/package.json +69 -0
  1879. package/repos/effect/packages/sql/sqlite-react-native/src/SqliteClient.ts +354 -0
  1880. package/repos/effect/packages/sql/sqlite-react-native/src/SqliteMigrator.ts +55 -0
  1881. package/repos/effect/packages/sql/sqlite-react-native/src/index.ts +15 -0
  1882. package/repos/effect/packages/sql/sqlite-react-native/test/Client.test.ts +6 -0
  1883. package/repos/effect/packages/sql/sqlite-react-native/tsconfig.json +8 -0
  1884. package/repos/effect/packages/sql/sqlite-react-native/vitest.config.ts +6 -0
  1885. package/repos/effect/packages/sql/sqlite-wasm/CHANGELOG.md +601 -0
  1886. package/repos/effect/packages/sql/sqlite-wasm/LICENSE +21 -0
  1887. package/repos/effect/packages/sql/sqlite-wasm/README.md +7 -0
  1888. package/repos/effect/packages/sql/sqlite-wasm/docgen.json +24 -0
  1889. package/repos/effect/packages/sql/sqlite-wasm/package.json +69 -0
  1890. package/repos/effect/packages/sql/sqlite-wasm/src/OpfsWorker.ts +118 -0
  1891. package/repos/effect/packages/sql/sqlite-wasm/src/SqliteClient.ts +551 -0
  1892. package/repos/effect/packages/sql/sqlite-wasm/src/SqliteMigrator.ts +55 -0
  1893. package/repos/effect/packages/sql/sqlite-wasm/src/index.ts +14 -0
  1894. package/repos/effect/packages/sql/sqlite-wasm/src/internal/opfsWorker.ts +7 -0
  1895. package/repos/effect/packages/sql/sqlite-wasm/src/sqlite-wasm.d.ts +47 -0
  1896. package/repos/effect/packages/sql/sqlite-wasm/test/Client.test.ts +6 -0
  1897. package/repos/effect/packages/sql/sqlite-wasm/tsconfig.json +8 -0
  1898. package/repos/effect/packages/sql/sqlite-wasm/vitest.config.ts +6 -0
  1899. package/repos/effect/packages/tools/ai-codegen/codegen.schema.json +92 -0
  1900. package/repos/effect/packages/tools/ai-codegen/docgen.json +4 -0
  1901. package/repos/effect/packages/tools/ai-codegen/package.json +61 -0
  1902. package/repos/effect/packages/tools/ai-codegen/src/Config.ts +292 -0
  1903. package/repos/effect/packages/tools/ai-codegen/src/Discovery.ts +197 -0
  1904. package/repos/effect/packages/tools/ai-codegen/src/Generator.ts +183 -0
  1905. package/repos/effect/packages/tools/ai-codegen/src/Glob.ts +56 -0
  1906. package/repos/effect/packages/tools/ai-codegen/src/PostProcess.ts +157 -0
  1907. package/repos/effect/packages/tools/ai-codegen/src/SpecFetcher.ts +154 -0
  1908. package/repos/effect/packages/tools/ai-codegen/src/bin.ts +10 -0
  1909. package/repos/effect/packages/tools/ai-codegen/src/main.ts +237 -0
  1910. package/repos/effect/packages/tools/ai-codegen/tsconfig.json +15 -0
  1911. package/repos/effect/packages/tools/ai-docgen/docgen.json +4 -0
  1912. package/repos/effect/packages/tools/ai-docgen/package.json +60 -0
  1913. package/repos/effect/packages/tools/ai-docgen/src/Glob.ts +48 -0
  1914. package/repos/effect/packages/tools/ai-docgen/src/main.ts +186 -0
  1915. package/repos/effect/packages/tools/ai-docgen/tsconfig.json +14 -0
  1916. package/repos/effect/packages/tools/bundle/docgen.json +4 -0
  1917. package/repos/effect/packages/tools/bundle/fixtures/basic.ts +3 -0
  1918. package/repos/effect/packages/tools/bundle/fixtures/batching.ts +25 -0
  1919. package/repos/effect/packages/tools/bundle/fixtures/brand.ts +5 -0
  1920. package/repos/effect/packages/tools/bundle/fixtures/cache.ts +10 -0
  1921. package/repos/effect/packages/tools/bundle/fixtures/config.ts +13 -0
  1922. package/repos/effect/packages/tools/bundle/fixtures/differ.ts +9 -0
  1923. package/repos/effect/packages/tools/bundle/fixtures/http-client.ts +12 -0
  1924. package/repos/effect/packages/tools/bundle/fixtures/logger.ts +5 -0
  1925. package/repos/effect/packages/tools/bundle/fixtures/metric.ts +13 -0
  1926. package/repos/effect/packages/tools/bundle/fixtures/optic.ts +6 -0
  1927. package/repos/effect/packages/tools/bundle/fixtures/pubsub.ts +22 -0
  1928. package/repos/effect/packages/tools/bundle/fixtures/queue.ts +18 -0
  1929. package/repos/effect/packages/tools/bundle/fixtures/schedule.ts +9 -0
  1930. package/repos/effect/packages/tools/bundle/fixtures/schema-fromJsonSchemaDocument.ts +16 -0
  1931. package/repos/effect/packages/tools/bundle/fixtures/schema-representation-roundtrip.ts +16 -0
  1932. package/repos/effect/packages/tools/bundle/fixtures/schema-string-transformation.ts +20 -0
  1933. package/repos/effect/packages/tools/bundle/fixtures/schema-string.ts +8 -0
  1934. package/repos/effect/packages/tools/bundle/fixtures/schema-template-literal.ts +8 -0
  1935. package/repos/effect/packages/tools/bundle/fixtures/schema-toArbitraryLazy.ts +9 -0
  1936. package/repos/effect/packages/tools/bundle/fixtures/schema-toCodeDocument.ts +12 -0
  1937. package/repos/effect/packages/tools/bundle/fixtures/schema-toCodecJson.ts +9 -0
  1938. package/repos/effect/packages/tools/bundle/fixtures/schema-toEquivalence.ts +9 -0
  1939. package/repos/effect/packages/tools/bundle/fixtures/schema-toFormatter.ts +9 -0
  1940. package/repos/effect/packages/tools/bundle/fixtures/schema-toJsonSchemaDocument.ts +9 -0
  1941. package/repos/effect/packages/tools/bundle/fixtures/schema-toRepresentation.ts +9 -0
  1942. package/repos/effect/packages/tools/bundle/fixtures/schema.ts +12 -0
  1943. package/repos/effect/packages/tools/bundle/fixtures/stm.ts +21 -0
  1944. package/repos/effect/packages/tools/bundle/fixtures/stream.ts +7 -0
  1945. package/repos/effect/packages/tools/bundle/package.json +52 -0
  1946. package/repos/effect/packages/tools/bundle/src/Cli.ts +104 -0
  1947. package/repos/effect/packages/tools/bundle/src/Fixtures.ts +51 -0
  1948. package/repos/effect/packages/tools/bundle/src/Plugins.ts +131 -0
  1949. package/repos/effect/packages/tools/bundle/src/Reporter.ts +200 -0
  1950. package/repos/effect/packages/tools/bundle/src/Rollup.ts +179 -0
  1951. package/repos/effect/packages/tools/bundle/src/bin.ts +23 -0
  1952. package/repos/effect/packages/tools/bundle/tsconfig.fixtures.json +13 -0
  1953. package/repos/effect/packages/tools/bundle/tsconfig.json +9 -0
  1954. package/repos/effect/packages/tools/bundle/tsconfig.src.json +13 -0
  1955. package/repos/effect/packages/tools/jsdocs/docgen.json +4 -0
  1956. package/repos/effect/packages/tools/jsdocs/package.json +64 -0
  1957. package/repos/effect/packages/tools/jsdocs/src/Jsdocs.ts +3303 -0
  1958. package/repos/effect/packages/tools/jsdocs/src/bin.ts +23 -0
  1959. package/repos/effect/packages/tools/jsdocs/test/jsdocs.test.ts +979 -0
  1960. package/repos/effect/packages/tools/jsdocs/tsconfig.json +8 -0
  1961. package/repos/effect/packages/tools/jsdocs/vitest.config.ts +6 -0
  1962. package/repos/effect/packages/tools/openapi-generator/CHANGELOG.md +691 -0
  1963. package/repos/effect/packages/tools/openapi-generator/LICENSE +21 -0
  1964. package/repos/effect/packages/tools/openapi-generator/docgen.json +4 -0
  1965. package/repos/effect/packages/tools/openapi-generator/package.json +78 -0
  1966. package/repos/effect/packages/tools/openapi-generator/src/HttpApiTransformer.ts +552 -0
  1967. package/repos/effect/packages/tools/openapi-generator/src/JsonSchemaGenerator.ts +319 -0
  1968. package/repos/effect/packages/tools/openapi-generator/src/OpenApiGenerator.ts +1201 -0
  1969. package/repos/effect/packages/tools/openapi-generator/src/OpenApiPatch.ts +539 -0
  1970. package/repos/effect/packages/tools/openapi-generator/src/OpenApiTransformer.ts +1019 -0
  1971. package/repos/effect/packages/tools/openapi-generator/src/ParsedOperation.ts +277 -0
  1972. package/repos/effect/packages/tools/openapi-generator/src/Utils.ts +111 -0
  1973. package/repos/effect/packages/tools/openapi-generator/src/bin.ts +10 -0
  1974. package/repos/effect/packages/tools/openapi-generator/src/main.ts +116 -0
  1975. package/repos/effect/packages/tools/openapi-generator/test/JsonSchemaGenerator.test.ts +173 -0
  1976. package/repos/effect/packages/tools/openapi-generator/test/OpenApiGenerator.test.ts +2130 -0
  1977. package/repos/effect/packages/tools/openapi-generator/test/OpenApiGeneratorCli.test.ts +147 -0
  1978. package/repos/effect/packages/tools/openapi-generator/test/OpenApiPatch.test.ts +380 -0
  1979. package/repos/effect/packages/tools/openapi-generator/test/Utils.test.ts +33 -0
  1980. package/repos/effect/packages/tools/openapi-generator/test/fixtures/cli-basic-spec.json +35 -0
  1981. package/repos/effect/packages/tools/openapi-generator/test/fixtures/cli-warning-spec.json +57 -0
  1982. package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/invalid-op.json +7 -0
  1983. package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/missing-path.json +6 -0
  1984. package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/missing-value.json +6 -0
  1985. package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/valid-add.json +8 -0
  1986. package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/valid-multiple.json +17 -0
  1987. package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/valid-patch.yaml +6 -0
  1988. package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/valid-remove.json +6 -0
  1989. package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/valid-replace.json +7 -0
  1990. package/repos/effect/packages/tools/openapi-generator/tsconfig.json +9 -0
  1991. package/repos/effect/packages/tools/openapi-generator/vitest.config.ts +6 -0
  1992. package/repos/effect/packages/tools/oxc/docgen.json +4 -0
  1993. package/repos/effect/packages/tools/oxc/oxlintrc.json +83 -0
  1994. package/repos/effect/packages/tools/oxc/package.json +72 -0
  1995. package/repos/effect/packages/tools/oxc/src/oxlint/index.ts +18 -0
  1996. package/repos/effect/packages/tools/oxc/src/oxlint/rules/jsdocs.ts +108 -0
  1997. package/repos/effect/packages/tools/oxc/src/oxlint/rules/no-bigint-literals.ts +25 -0
  1998. package/repos/effect/packages/tools/oxc/src/oxlint/rules/no-import-from-barrel-package.ts +144 -0
  1999. package/repos/effect/packages/tools/oxc/src/oxlint/rules/no-js-extension-imports.ts +73 -0
  2000. package/repos/effect/packages/tools/oxc/src/oxlint/rules/no-opaque-instance-fields.ts +92 -0
  2001. package/repos/effect/packages/tools/oxc/test/jsdocs.test.ts +75 -0
  2002. package/repos/effect/packages/tools/oxc/test/no-import-from-barrel-package.test.ts +182 -0
  2003. package/repos/effect/packages/tools/oxc/test/no-js-extension-imports.test.ts +120 -0
  2004. package/repos/effect/packages/tools/oxc/test/no-opaque-instance-fields.test.ts +276 -0
  2005. package/repos/effect/packages/tools/oxc/test/utils.ts +61 -0
  2006. package/repos/effect/packages/tools/oxc/tsconfig.json +8 -0
  2007. package/repos/effect/packages/tools/oxc/vitest.config.ts +6 -0
  2008. package/repos/effect/packages/tools/utils/docgen.json +4 -0
  2009. package/repos/effect/packages/tools/utils/package.json +59 -0
  2010. package/repos/effect/packages/tools/utils/src/Codegen.ts +214 -0
  2011. package/repos/effect/packages/tools/utils/src/Glob.ts +61 -0
  2012. package/repos/effect/packages/tools/utils/src/bin.ts +16 -0
  2013. package/repos/effect/packages/tools/utils/src/commands/codegen.ts +44 -0
  2014. package/repos/effect/packages/tools/utils/tsconfig.json +9 -0
  2015. package/repos/effect/packages/vitest/CHANGELOG.md +601 -0
  2016. package/repos/effect/packages/vitest/LICENSE +21 -0
  2017. package/repos/effect/packages/vitest/README.md +320 -0
  2018. package/repos/effect/packages/vitest/docgen.json +24 -0
  2019. package/repos/effect/packages/vitest/package.json +60 -0
  2020. package/repos/effect/packages/vitest/src/index.ts +259 -0
  2021. package/repos/effect/packages/vitest/src/internal/internal.ts +374 -0
  2022. package/repos/effect/packages/vitest/src/utils.ts +321 -0
  2023. package/repos/effect/packages/vitest/test/index.test.ts +222 -0
  2024. package/repos/effect/packages/vitest/test/isolation.test.ts +105 -0
  2025. package/repos/effect/packages/vitest/test/nested-isolation.test.ts +212 -0
  2026. package/repos/effect/packages/vitest/tsconfig.json +11 -0
  2027. package/repos/effect/packages/vitest/typetest/index.tst.ts +56 -0
  2028. package/repos/effect/packages/vitest/vitest.config.ts +6 -0
  2029. package/repos/effect/patches/@changesets__assemble-release-plan.patch +26 -0
  2030. package/repos/effect/patches/@changesets__get-github-info.patch +44 -0
  2031. package/repos/effect/pnpm-lock.yaml +13483 -0
  2032. package/repos/effect/pnpm-workspace.yaml +10 -0
  2033. package/repos/effect/scripts/bundle-compare.sh +42 -0
  2034. package/repos/effect/scripts/check-cookbook-schedule.ts +390 -0
  2035. package/repos/effect/scripts/circular.mjs +26 -0
  2036. package/repos/effect/scripts/clean.mjs +19 -0
  2037. package/repos/effect/scripts/codemod.mjs +22 -0
  2038. package/repos/effect/scripts/codemods/jsdoc.ts +79 -0
  2039. package/repos/effect/scripts/docs.mjs +64 -0
  2040. package/repos/effect/scripts/package-scalar.mjs +14 -0
  2041. package/repos/effect/scripts/package-swagger.mjs +23 -0
  2042. package/repos/effect/scripts/package.json +22 -0
  2043. package/repos/effect/scripts/tsconfig.json +18 -0
  2044. package/repos/effect/scripts/version.mjs +9 -0
  2045. package/repos/effect/scripts/version.template.txt +2 -0
  2046. package/repos/effect/scripts/worktree-setup.sh +27 -0
  2047. package/repos/effect/stats.txt +30 -0
  2048. package/repos/effect/tsconfig.base.json +46 -0
  2049. package/repos/effect/tsconfig.json +128 -0
  2050. package/repos/effect/tsconfig.packages.json +39 -0
  2051. package/repos/effect/tstyche.json +7 -0
  2052. package/repos/effect/vitest.config.ts +31 -0
  2053. package/repos/effect/vitest.setup.ts +4 -0
  2054. package/repos/effect/vitest.shared.ts +61 -0
  2055. package/repos/effect.subtree.json +16 -0
@@ -0,0 +1,3213 @@
1
+ # Overview
2
+
3
+ The `HttpApi` modules let you describe your HTTP API once and use that description to run a server, generate documentation, and create a type-safe client.
4
+
5
+ An API is built from three building blocks:
6
+
7
+ - **HttpEndpoint** — a single route (path + HTTP method) with schemas for its request and response.
8
+ - **HttpApiGroup** — a collection of related endpoints (e.g., all user-related routes).
9
+ - **HttpApi** — the top-level object that combines groups into a complete API.
10
+
11
+ ```
12
+ HttpApi
13
+ ├── HttpGroup
14
+ │ ├── HttpEndpoint
15
+ │ └── HttpEndpoint
16
+ └── HttpGroup
17
+ ├── HttpEndpoint
18
+ ├── HttpEndpoint
19
+ └── HttpEndpoint
20
+ ```
21
+
22
+ From one API definition you can:
23
+
24
+ - **Start a server** that implements and serves every endpoint.
25
+ - **Generate documentation** (Scalar or Swagger) automatically.
26
+ - **Derive a client** with a typed method for each endpoint.
27
+
28
+ One definition powers the server, docs, and client — change it once and everything stays in sync.
29
+
30
+ # Getting Started
31
+
32
+ ## Defining and Implementing an API
33
+
34
+ Let's build a minimal API with one endpoint that returns `"Hello, World!"`. You'll define what the endpoint looks like, implement it, and start a server.
35
+
36
+ ```
37
+ HttpApi ("MyApi")
38
+ └── HttpGroup ("Greetings")
39
+ └── HttpEndpoint ("hello-world")
40
+ ```
41
+
42
+ **Example** (Hello World)
43
+
44
+ ```ts
45
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
46
+ import { Effect, Layer, Schema } from "effect"
47
+ import { HttpRouter } from "effect/unstable/http"
48
+ import { HttpApi, HttpApiBuilder, HttpApiEndpoint, HttpApiGroup } from "effect/unstable/httpapi"
49
+ import { createServer } from "node:http"
50
+
51
+ // Definition
52
+ const Api = HttpApi.make("MyApi").add(
53
+ // Define the API group
54
+ HttpApiGroup.make("Greetings").add(
55
+ // Define the endpoint
56
+ HttpApiEndpoint.get("hello", "/", {
57
+ // Define the success schema
58
+ success: Schema.String
59
+ })
60
+ )
61
+ )
62
+
63
+ // Implementation
64
+ const GroupLive = HttpApiBuilder.group(
65
+ Api,
66
+ "Greetings", // The name of the group to handle
67
+ (handlers) =>
68
+ handlers.handle(
69
+ "hello", // The name of the endpoint to handle
70
+ () => Effect.succeed("Hello, World!") // The handler function
71
+ )
72
+ )
73
+
74
+ // Server
75
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
76
+ Layer.provide(GroupLive),
77
+ HttpRouter.serve,
78
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
79
+ )
80
+
81
+ // Launch
82
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
83
+ ```
84
+
85
+ After running the code, open a browser and navigate to http://localhost:3000. The server will respond with:
86
+
87
+ ```
88
+ Hello, World!
89
+ ```
90
+
91
+ ## Serving The Auto Generated OpenAPI Documentation
92
+
93
+ Adding a documentation layer gives you an interactive page where you (and your API consumers) can explore endpoints, try requests, and see response shapes — all generated automatically from your API definition. You can choose between the `HttpApiScalar` module (Scalar UI) or the `HttpApiSwagger` module (Swagger UI); both do the same job.
94
+
95
+ **Example** (Serving Scalar Documentation)
96
+
97
+ To include Scalar in your server setup, provide the `HttpApiScalar.layer` when configuring the server.
98
+
99
+ ```ts
100
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
101
+ // Provide the Scalar layer so clients can access auto-generated docs
102
+ Layer.provide(GroupLive),
103
+ Layer.provide(HttpApiScalar.layer(Api)),
104
+ HttpRouter.serve,
105
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
106
+ )
107
+ ```
108
+
109
+ After running the server, open your browser and navigate to http://localhost:3000/docs.
110
+
111
+ This URL will display the Scalar documentation, allowing you to explore the API's endpoints, request parameters, and response structures interactively.
112
+
113
+ **Example** (Serving Swagger Documentation)
114
+
115
+ To include Swagger in your server setup, provide the `HttpApiSwagger.layer` when configuring the server.
116
+
117
+ ```ts
118
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
119
+ Layer.provide(GroupLive),
120
+ // Provide the Swagger layer so clients can access auto-generated docs
121
+ Layer.provide(HttpApiSwagger.layer(Api)), // "/docs" is the default path.
122
+ // or Layer.provide(HttpApiScalar.layer(Api)),
123
+ HttpRouter.serve,
124
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
125
+ )
126
+ ```
127
+
128
+ After running the server, open your browser and navigate to http://localhost:3000/docs.
129
+
130
+ This URL will display the Swagger documentation, allowing you to explore the API's endpoints, request parameters, and response structures interactively.
131
+
132
+ ## Adding Annotations to Schemas
133
+
134
+ Annotations attach extra information to your schemas — like a human-readable description or an identifier shown in the docs UI. They don't change runtime behavior; they enrich the generated documentation.
135
+
136
+ ```ts
137
+ const User = Schema.Struct({
138
+ id: Schema.Int,
139
+ name: Schema.String
140
+ }).annotate({
141
+ description: "A user", // The description of the user
142
+ identifier: "User" // Used in the Scalar UI under the Model section
143
+ })
144
+ ```
145
+
146
+ ## Deriving a Client
147
+
148
+ Once you've defined an API, you can generate a fully typed client from it using the `HttpApiClient` module. The client gives you a method for every endpoint, so calling your API feels like calling a local function — with full type safety and no manual HTTP handling.
149
+
150
+ **Example** (Deriving and Using a Client)
151
+
152
+ ```ts
153
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
154
+ import { Effect, Layer, Schema } from "effect"
155
+ import { HttpRouter } from "effect/unstable/http"
156
+ import { FetchHttpClient } from "effect/unstable/http"
157
+ import { HttpApi, HttpApiBuilder, HttpApiClient, HttpApiEndpoint, HttpApiGroup } from "effect/unstable/httpapi"
158
+ import { createServer } from "node:http"
159
+
160
+ const Api = HttpApi.make("MyApi")
161
+ .add(
162
+ HttpApiGroup.make("Greetings")
163
+ .add(
164
+ HttpApiEndpoint.get("hello", "/", {
165
+ success: Schema.String
166
+ })
167
+ )
168
+ )
169
+
170
+ const GroupLive = HttpApiBuilder.group(
171
+ Api,
172
+ "Greetings",
173
+ (handlers) => handlers.handle("hello", () => Effect.succeed("Hello, World!"))
174
+ )
175
+
176
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
177
+ Layer.provide(GroupLive),
178
+ HttpRouter.serve,
179
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
180
+ )
181
+
182
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
183
+
184
+ // Create a program that derives and uses the client
185
+ const program = Effect.gen(function*() {
186
+ // Derive the client
187
+ const client = yield* HttpApiClient.make(Api, {
188
+ baseUrl: "http://localhost:3000"
189
+ })
190
+ // Call the "hello-world" endpoint
191
+ const hello = yield* client.Greetings.hello()
192
+ console.log(hello)
193
+ })
194
+
195
+ // Provide a Fetch-based HTTP client and run the program
196
+ Effect.runFork(program.pipe(Effect.provide(FetchHttpClient.layer)))
197
+ /*
198
+ Output:
199
+ [18:55:26.051] INFO (#2): Listening on http://0.0.0.0:3000
200
+ [18:55:26.057] INFO (#12) http.span=2ms: Sent HTTP response { 'http.method': 'GET', 'http.url': '/', 'http.status': 200 }
201
+ Hello, World!
202
+ */
203
+ ```
204
+
205
+ # Design Principles
206
+
207
+ - **Schemas first**: Every piece of data flowing in or out of an endpoint — path params, query strings, headers, payloads, responses, and errors — is described by a schema. The framework uses these schemas to validate requests, serialize responses, generate docs, and type the client.
208
+ - **Metadata lives on schemas**: Configuration like HTTP status codes and content types is attached directly to the schema via annotations, not to the endpoint. This keeps all the information about a data shape in one place.
209
+
210
+ In particular:
211
+
212
+ - **Request**
213
+ - **Payload encoding / content type** is controlled with `HttpApiSchema.as*` helpers:
214
+ - `asJson` — parse the body as JSON (default)
215
+ - `asFormUrlEncoded` — parse the body as URL-encoded form data
216
+ - `asText` — parse the body as plain text
217
+ - `asUint8Array` — parse the body as raw binary data
218
+ - `asMultipart` — parse the body as a multipart form (for file uploads)
219
+ - `asMultipartStream` — parse the body as a streaming multipart form
220
+ - **Response**
221
+ - **Status code** is set via the `HttpApiSchema.status` API (or `httpApiStatus` annotation)
222
+ - **Encoding / content type** is controlled with `HttpApiSchema.as*` helpers:
223
+ - `asJson` — send the body as JSON (default)
224
+ - `asFormUrlEncoded` — send the body as URL-encoded form data
225
+ - `asText` — send the body as plain text
226
+ - `asUint8Array` — send the body as raw binary data
227
+
228
+ ## Anatomy of an Endpoint
229
+
230
+ An endpoint definition describes everything the framework needs to know about a single HTTP route: which URL parameters it expects, what query strings and headers it reads, what the request body looks like, and what it can respond with (both successes and errors). All of these are optional.
231
+
232
+ `HttpApiEndpoint` automatically coerces request and response schemas by default. Path / query / header schemas use `Schema.toCodecStringTree`, while JSON payload / success / error schemas use `Schema.toCodecJson`. This means you can define schemas in their natural domain types (for example `Schema.Int`), without manually adding string / JSON transformations.
233
+
234
+ ```ts
235
+ const User = Schema.Struct({
236
+ id: Schema.String,
237
+ name: Schema.String
238
+ })
239
+
240
+ // ┌─── Endpoint name (used in the client as the method name)
241
+ // │ ┌─── Endpoint path
242
+ // ▼ ▼
243
+ HttpApiEndpoint.patch("updateUser", "/user/:id", {
244
+ // Parameters from the route pattern (e.g. /user/:id).
245
+ // Can be a record of fields or a full schema.
246
+ params: {
247
+ // ┌─── Schema for the "id" parameter.
248
+ // ▼
249
+ id: Schema.String
250
+ },
251
+
252
+ // (optional) Query string parameters (e.g. ?mode=merge).
253
+ // Can be a record of fields or a full schema.
254
+ query: {
255
+ // ┌─── Schema for the "mode" query parameter
256
+ // ▼
257
+ mode: Schema.Literals(["merge", "replace"])
258
+ },
259
+
260
+ // (optional) Request headers.
261
+ // Can be a record of fields or a full schema.
262
+ headers: {
263
+ "x-api-key": Schema.String,
264
+ "x-request-id": Schema.String
265
+ },
266
+
267
+ // The request payload can be a single schema or an array of schemas.
268
+ // - Default encoding is JSON.
269
+ // - Default status for success is 200.
270
+ // For GET requests, the payload must be a record of schemas.
271
+ payload: [
272
+ // JSON payload (default encoding).
273
+ Schema.Struct({
274
+ name: Schema.String
275
+ }),
276
+ // text/plain payload.
277
+ Schema.String.pipe(HttpApiSchema.asText())
278
+ ],
279
+
280
+ // Possible success responses.
281
+ // Default is 200 OK with no content if omitted.
282
+ success: [
283
+ // JSON response (default encoding).
284
+ User,
285
+ // text/plain response with a custom status code.
286
+ Schema.String
287
+ .pipe(
288
+ HttpApiSchema.status(206),
289
+ HttpApiSchema.asText()
290
+ )
291
+ ],
292
+
293
+ // Possible error responses.
294
+ error: [
295
+ // Default is 500 Internal Server Error with JSON encoding.
296
+ Schema.Finite,
297
+
298
+ // text/plain error with a custom status code.
299
+ Schema.String
300
+ .pipe(
301
+ HttpApiSchema.status(404),
302
+ HttpApiSchema.asText()
303
+ ),
304
+
305
+ // Any schema that encodes to `Schema.Void` is treated as "no content".
306
+ // Here it uses a custom status code.
307
+ Schema.Void
308
+ .pipe(HttpApiSchema.status(401))
309
+ ]
310
+ })
311
+ ```
312
+
313
+ # Routing
314
+
315
+ This section walks through defining endpoints for common HTTP methods — GET, POST, DELETE, and PATCH — using a user-management API as a running example:
316
+
317
+ - `GET /users` — retrieve all users.
318
+ - `GET /users/:userId` — retrieve a specific user by ID.
319
+ - `POST /users` — create a new user.
320
+ - `DELETE /users/:userId` — delete a user by ID.
321
+ - `PATCH /users/:userId` — update a user by ID.
322
+
323
+ ## GET
324
+
325
+ Use `HttpApiEndpoint.get` to create a GET endpoint. Provide a name (used as the method name in generated clients), a path, and optionally a `success` schema describing what the endpoint returns. Without a success schema the default response is `204 No Content`.
326
+
327
+ **Example** (Defining a GET Endpoint to Retrieve All Users)
328
+
329
+ ```ts
330
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
331
+ import { Effect, Layer, Schema } from "effect"
332
+ import { HttpRouter } from "effect/unstable/http"
333
+ import { HttpApi, HttpApiBuilder, HttpApiEndpoint, HttpApiGroup, HttpApiScalar } from "effect/unstable/httpapi"
334
+ import { createServer } from "node:http"
335
+
336
+ // Define a schema representing a User entity
337
+ const User = Schema.Struct({
338
+ id: Schema.Int,
339
+ name: Schema.String
340
+ })
341
+
342
+ const Api = HttpApi.make("MyApi")
343
+ .add(
344
+ HttpApiGroup.make("Users")
345
+ .add(
346
+ // Define the "getUsers" endpoint, returning a list of users
347
+ // ┌─── Endpoint name (used in the client as the method name)
348
+ // │ ┌─── Endpoint path
349
+ // ▼ ▼
350
+ HttpApiEndpoint.get("getUsers", "/users", {
351
+ // ┌─── success schema
352
+ // │
353
+ // ▼
354
+ success: Schema.Array(User)
355
+ })
356
+ )
357
+ )
358
+
359
+ const GroupLive = HttpApiBuilder.group(
360
+ Api,
361
+ "Users",
362
+ (handlers) =>
363
+ handlers.handle("getUsers", () =>
364
+ Effect.succeed(
365
+ [{ id: 1, name: "User 1" }, { id: 2, name: "User 2" }]
366
+ ))
367
+ )
368
+
369
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
370
+ Layer.provide(GroupLive),
371
+ Layer.provide(HttpApiScalar.layer(Api)),
372
+ HttpRouter.serve,
373
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
374
+ )
375
+
376
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
377
+ ```
378
+
379
+ ## POST
380
+
381
+ Use `HttpApiEndpoint.post` to create an endpoint that accepts data. The `payload` option describes the shape of the request body, and `success` describes what the endpoint returns.
382
+
383
+ **Example** (Defining a POST Endpoint with Payload and Success Schemas)
384
+
385
+ ```ts
386
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
387
+ import { Effect, Layer, Schema } from "effect"
388
+ import { HttpRouter } from "effect/unstable/http"
389
+ import { HttpApi, HttpApiBuilder, HttpApiEndpoint, HttpApiGroup, HttpApiScalar } from "effect/unstable/httpapi"
390
+ import { createServer } from "node:http"
391
+
392
+ const User = Schema.Struct({
393
+ id: Schema.Int,
394
+ name: Schema.String
395
+ })
396
+
397
+ const Api = HttpApi.make("MyApi")
398
+ .add(
399
+ HttpApiGroup.make("Users")
400
+ .add(
401
+ HttpApiEndpoint.get("getUsers", "/users", {
402
+ success: Schema.Array(User)
403
+ }),
404
+ HttpApiEndpoint.get("getUser", "/user/:id", {
405
+ params: {
406
+ id: Schema.Int
407
+ },
408
+ success: User
409
+ }),
410
+ // Define a POST endpoint for creating a new user
411
+ HttpApiEndpoint.post("createUser", "/user", {
412
+ // Define the request body schema (payload)
413
+ payload: User,
414
+ // Define the schema for a successful response
415
+ success: User
416
+ })
417
+ )
418
+ )
419
+
420
+ const GroupLive = HttpApiBuilder.group(
421
+ Api,
422
+ "Users",
423
+ (handlers) =>
424
+ handlers
425
+ .handle("getUsers", () =>
426
+ Effect.succeed(
427
+ [{ id: 1, name: "User 1" }, { id: 2, name: "User 2" }]
428
+ ))
429
+ .handle("getUser", (ctx) => {
430
+ const id = ctx.params.id
431
+ return Effect.succeed({ id, name: `User ${id}` })
432
+ })
433
+ .handle("createUser", (ctx) => {
434
+ // ┌─── User
435
+ // ▼
436
+ const user = ctx.payload
437
+ return Effect.succeed(user)
438
+ })
439
+ )
440
+
441
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
442
+ Layer.provide(GroupLive),
443
+ Layer.provide(HttpApiScalar.layer(Api)),
444
+ HttpRouter.serve,
445
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
446
+ )
447
+
448
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
449
+ ```
450
+
451
+ ## DELETE
452
+
453
+ Use `HttpApiEndpoint.delete` to create an endpoint that removes a resource.
454
+
455
+ **Example** (Defining a DELETE Endpoint with Parameters)
456
+
457
+ ```ts
458
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
459
+ import { Effect, Layer, Schema } from "effect"
460
+ import { HttpRouter } from "effect/unstable/http"
461
+ import { HttpApi, HttpApiBuilder, HttpApiEndpoint, HttpApiGroup, HttpApiScalar } from "effect/unstable/httpapi"
462
+ import { createServer } from "node:http"
463
+
464
+ const User = Schema.Struct({
465
+ id: Schema.Int,
466
+ name: Schema.String
467
+ })
468
+
469
+ const IdParam = Schema.Int
470
+
471
+ const Api = HttpApi.make("MyApi")
472
+ .add(
473
+ HttpApiGroup.make("Users")
474
+ .add(
475
+ HttpApiEndpoint.get("getUsers", "/users", {
476
+ success: Schema.Array(User)
477
+ }),
478
+ HttpApiEndpoint.get("getUser", "/user/:id", {
479
+ params: {
480
+ id: IdParam
481
+ },
482
+ success: User
483
+ }),
484
+ HttpApiEndpoint.post("createUser", "/user", {
485
+ payload: User,
486
+ success: User
487
+ }),
488
+ HttpApiEndpoint.delete("deleteUser", "/user/:id", {
489
+ params: {
490
+ id: IdParam
491
+ }
492
+ })
493
+ )
494
+ )
495
+
496
+ const GroupLive = HttpApiBuilder.group(
497
+ Api,
498
+ "Users",
499
+ (handlers) =>
500
+ handlers
501
+ .handle("getUsers", () =>
502
+ Effect.succeed(
503
+ [{ id: 1, name: "User 1" }, { id: 2, name: "User 2" }]
504
+ ))
505
+ .handle("getUser", (ctx) => {
506
+ const id = ctx.params.id
507
+ return Effect.succeed({ id, name: `User ${id}` })
508
+ })
509
+ .handle("createUser", (ctx) => {
510
+ const user = ctx.payload
511
+ return Effect.succeed(user)
512
+ })
513
+ .handle("deleteUser", (ctx) => {
514
+ const id = ctx.params.id
515
+ return Effect.log(`Deleting user ${id}`)
516
+ })
517
+ )
518
+
519
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
520
+ Layer.provide(GroupLive),
521
+ Layer.provide(HttpApiScalar.layer(Api)),
522
+ HttpRouter.serve,
523
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
524
+ )
525
+
526
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
527
+ ```
528
+
529
+ ## PATCH
530
+
531
+ Use `HttpApiEndpoint.patch` to create an endpoint that partially updates a resource. Like POST, you can define `payload` (the fields to update) and `success` (the response after the update).
532
+
533
+ **Example** (Defining a PATCH Endpoint for Updating a User)
534
+
535
+ ```ts
536
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
537
+ import { Effect, Layer, Schema } from "effect"
538
+ import { HttpRouter } from "effect/unstable/http"
539
+ import { HttpApi, HttpApiBuilder, HttpApiEndpoint, HttpApiGroup, HttpApiScalar } from "effect/unstable/httpapi"
540
+ import { createServer } from "node:http"
541
+
542
+ const User = Schema.Struct({
543
+ id: Schema.Int,
544
+ name: Schema.String
545
+ })
546
+
547
+ const IdParam = Schema.Int
548
+
549
+ const Api = HttpApi.make("MyApi")
550
+ .add(
551
+ HttpApiGroup.make("Users")
552
+ .add(
553
+ HttpApiEndpoint.get("getUsers", "/users", {
554
+ success: Schema.Array(User)
555
+ }),
556
+ HttpApiEndpoint.get("getUser", "/user/:id", {
557
+ params: {
558
+ id: IdParam
559
+ },
560
+ success: User
561
+ }),
562
+ HttpApiEndpoint.post("createUser", "/user", {
563
+ payload: User,
564
+ success: User
565
+ }),
566
+ HttpApiEndpoint.delete("deleteUser", "/user/:id", {
567
+ params: {
568
+ id: IdParam
569
+ }
570
+ }),
571
+ HttpApiEndpoint.patch("updateUser", "/user/:id", {
572
+ params: {
573
+ id: IdParam
574
+ },
575
+ // Specify the schema for the request payload
576
+ payload: Schema.Struct({
577
+ name: Schema.String // Only the name can be updated
578
+ }),
579
+ // Specify the schema for a successful response
580
+ success: User
581
+ })
582
+ )
583
+ )
584
+
585
+ const GroupLive = HttpApiBuilder.group(
586
+ Api,
587
+ "Users",
588
+ (handlers) =>
589
+ handlers
590
+ .handle("getUsers", () =>
591
+ Effect.succeed(
592
+ [{ id: 1, name: "User 1" }, { id: 2, name: "User 2" }]
593
+ ))
594
+ .handle("getUser", (ctx) => {
595
+ const id = ctx.params.id
596
+ return Effect.succeed({ id, name: `User ${id}` })
597
+ })
598
+ .handle("createUser", (ctx) => {
599
+ const user = ctx.payload
600
+ return Effect.succeed(user)
601
+ })
602
+ .handle("deleteUser", (ctx) => {
603
+ const id = ctx.params.id
604
+ return Effect.log(`Deleting user ${id}`)
605
+ })
606
+ .handle("updateUser", (ctx) => {
607
+ const id = ctx.params.id
608
+ return Effect.succeed({ id, name: `User ${id}` })
609
+ })
610
+ )
611
+
612
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
613
+ Layer.provide(GroupLive),
614
+ Layer.provide(HttpApiScalar.layer(Api)),
615
+ HttpRouter.serve,
616
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
617
+ )
618
+
619
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
620
+ ```
621
+
622
+ ## Parameters
623
+
624
+ Path parameters let you capture dynamic values from the URL. For example, `/user/:id` extracts the `id` segment. Use the `params` option to declare a record of fields or a full schema — the framework will parse and validate the value before your handler runs.
625
+
626
+ **Example** (Defining a GET Endpoint to Retrieve a User by ID)
627
+
628
+ ```ts
629
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
630
+ import { Effect, Layer, Schema } from "effect"
631
+ import { HttpRouter } from "effect/unstable/http"
632
+ import { HttpApi, HttpApiBuilder, HttpApiEndpoint, HttpApiGroup, HttpApiScalar } from "effect/unstable/httpapi"
633
+ import { createServer } from "node:http"
634
+
635
+ const User = Schema.Struct({
636
+ id: Schema.Int,
637
+ name: Schema.String
638
+ })
639
+
640
+ const Api = HttpApi.make("MyApi")
641
+ .add(
642
+ HttpApiGroup.make("Users")
643
+ .add(
644
+ HttpApiEndpoint.get("getUsers", "/users", {
645
+ success: Schema.Array(User)
646
+ }),
647
+ // a GET endpoint with a parameter ":id"
648
+ HttpApiEndpoint.get("getUser", "/user/:id", {
649
+ params: {
650
+ // ┌─── schema for the "id" parameter
651
+ // ▼
652
+ id: Schema.Int
653
+ },
654
+ success: User
655
+ })
656
+ )
657
+ )
658
+
659
+ const GroupLive = HttpApiBuilder.group(
660
+ Api,
661
+ "Users",
662
+ (handlers) =>
663
+ handlers
664
+ .handle("getUsers", () =>
665
+ Effect.succeed(
666
+ [{ id: 1, name: "User 1" }, { id: 2, name: "User 2" }]
667
+ ))
668
+ .handle("getUser", (ctx) => {
669
+ // ┌─── number
670
+ // ▼
671
+ const id = ctx.params.id
672
+ return Effect.succeed({ id, name: `User ${id}` })
673
+ })
674
+ )
675
+
676
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
677
+ Layer.provide(GroupLive),
678
+ Layer.provide(HttpApiScalar.layer(Api)),
679
+ HttpRouter.serve,
680
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
681
+ )
682
+
683
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
684
+ ```
685
+
686
+ ## Catch-All Endpoints
687
+
688
+ Set the path to `"*"` to match any URL that no other endpoint handles. This is useful for custom "not found" pages or fallback responses.
689
+
690
+ **Example** (Defining a Catch-All Endpoint)
691
+
692
+ ```ts
693
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
694
+ import { Effect, Layer, Schema } from "effect"
695
+ import { HttpRouter } from "effect/unstable/http"
696
+ import { HttpApi, HttpApiBuilder, HttpApiEndpoint, HttpApiGroup, HttpApiScalar } from "effect/unstable/httpapi"
697
+ import { createServer } from "node:http"
698
+
699
+ const User = Schema.Struct({
700
+ id: Schema.Int,
701
+ name: Schema.String
702
+ })
703
+
704
+ const IdParam = Schema.Int
705
+
706
+ const Api = HttpApi.make("MyApi")
707
+ .add(
708
+ HttpApiGroup.make("Users")
709
+ .add(
710
+ HttpApiEndpoint.get("getUsers", "/users", {
711
+ success: Schema.Array(User)
712
+ }),
713
+ HttpApiEndpoint.get("getUser", "/user/:id", {
714
+ params: {
715
+ id: IdParam
716
+ },
717
+ success: User
718
+ }),
719
+ HttpApiEndpoint.post("createUser", "/user", {
720
+ payload: User,
721
+ success: User
722
+ }),
723
+ HttpApiEndpoint.delete("deleteUser", "/user/:id", {
724
+ params: {
725
+ id: IdParam
726
+ }
727
+ }),
728
+ HttpApiEndpoint.patch("updateUser", "/user/:id", {
729
+ params: {
730
+ id: IdParam
731
+ },
732
+ payload: Schema.Struct({
733
+ name: Schema.String
734
+ }),
735
+ success: User
736
+ }),
737
+ // catch-all endpoint
738
+ HttpApiEndpoint.get("catchAll", "*", {
739
+ success: Schema.String
740
+ })
741
+ )
742
+ )
743
+
744
+ const GroupLive = HttpApiBuilder.group(
745
+ Api,
746
+ "Users",
747
+ (handlers) =>
748
+ handlers
749
+ .handle("getUsers", () =>
750
+ Effect.succeed(
751
+ [{ id: 1, name: "User 1" }, { id: 2, name: "User 2" }]
752
+ ))
753
+ .handle("getUser", (ctx) => {
754
+ const id = ctx.params.id
755
+ return Effect.succeed({ id, name: `User ${id}` })
756
+ })
757
+ .handle("createUser", (ctx) => {
758
+ const user = ctx.payload
759
+ return Effect.succeed(user)
760
+ })
761
+ .handle("deleteUser", (ctx) => {
762
+ const id = ctx.params.id
763
+ return Effect.log(`Deleting user ${id}`)
764
+ })
765
+ .handle("updateUser", (ctx) => {
766
+ const id = ctx.params.id
767
+ return Effect.succeed({ id, name: `User ${id}` })
768
+ })
769
+ .handle("catchAll", () => {
770
+ return Effect.succeed("Not found")
771
+ })
772
+ )
773
+
774
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
775
+ Layer.provide(GroupLive),
776
+ Layer.provide(HttpApiScalar.layer(Api)),
777
+ HttpRouter.serve,
778
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
779
+ )
780
+
781
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
782
+ ```
783
+
784
+ > [!IMPORTANT]
785
+ > The catch-all endpoint must be the last endpoint in the group.
786
+
787
+ > [!IMPORTANT]
788
+ > (OpenAPI). A catch-all endpoint is not included in the OpenAPI specification because can't be represented as a path.
789
+
790
+ ## Prefixing
791
+
792
+ Prefixes let you prepend a common path segment to endpoints, groups, or an entire API. This avoids repeating the same base path on every endpoint.
793
+
794
+ **Example** (Using Prefixes for Common Path Management)
795
+
796
+ ```ts
797
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
798
+ import { Effect, Layer, Schema } from "effect"
799
+ import { HttpRouter } from "effect/unstable/http"
800
+ import { HttpApi, HttpApiBuilder, HttpApiEndpoint, HttpApiGroup, HttpApiScalar } from "effect/unstable/httpapi"
801
+ import { createServer } from "node:http"
802
+
803
+ const Api = HttpApi.make("MyApi")
804
+ .add(
805
+ HttpApiGroup.make("group")
806
+ .add(
807
+ HttpApiEndpoint.get("endpointA", "/a", {
808
+ success: Schema.String
809
+ })
810
+ // Prefix for this endpoint
811
+ .prefix("/endpointPrefix"),
812
+ HttpApiEndpoint.get("endpointB", "/b", {
813
+ success: Schema.String
814
+ })
815
+ )
816
+ // Prefix for all endpoints in the group
817
+ .prefix("/groupPrefix")
818
+ )
819
+ // Prefix for the entire API
820
+ .prefix("/apiPrefix")
821
+
822
+ const GroupLive = HttpApiBuilder.group(
823
+ Api,
824
+ "group",
825
+ (handlers) =>
826
+ handlers
827
+ .handle("endpointA", () => Effect.succeed("Endpoint A"))
828
+ .handle("endpointB", () => Effect.succeed("Endpoint B"))
829
+ )
830
+
831
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
832
+ Layer.provide(GroupLive),
833
+ Layer.provide(HttpApiScalar.layer(Api)),
834
+ HttpRouter.serve,
835
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
836
+ )
837
+
838
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
839
+ ```
840
+
841
+ You can test this endpoint using a GET request. For example:
842
+
843
+ ```sh
844
+ curl http://localhost:3000/apiPrefix/groupPrefix/endpointPrefix/a # Returns 200 OK
845
+ curl http://localhost:3000/apiPrefix/groupPrefix/b # Returns 200 OK
846
+ ```
847
+
848
+ # Request
849
+
850
+ ## Query Parameters
851
+
852
+ Query parameters are the `?key=value` pairs appended to a URL. Use the `query` option to declare a record of fields or a full schema — the framework will parse, validate, and type them for you.
853
+
854
+ **Example** (Defining Query Parameters with Metadata)
855
+
856
+ ```ts
857
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
858
+ import { Effect, Layer, Schema } from "effect"
859
+ import { HttpRouter } from "effect/unstable/http"
860
+ import { HttpApi, HttpApiBuilder, HttpApiEndpoint, HttpApiGroup, HttpApiScalar } from "effect/unstable/httpapi"
861
+ import { createServer } from "node:http"
862
+
863
+ const User = Schema.Struct({
864
+ id: Schema.Int,
865
+ name: Schema.String
866
+ })
867
+
868
+ const Page = Schema.Int.check(Schema.isGreaterThan(0))
869
+
870
+ const Api = HttpApi.make("MyApi")
871
+ .add(
872
+ HttpApiGroup.make("Users")
873
+ .add(
874
+ HttpApiEndpoint.get("getUsers", "/users", {
875
+ success: Schema.Array(User),
876
+ // Specify a schema for each query parameter
877
+ query: {
878
+ // Parameter "page" for pagination
879
+ page: Schema.optionalKey(Page),
880
+ // Parameter "sort" for sorting options
881
+ sort: Schema.optionalKey(Schema.Literals(["id", "name"]))
882
+ }
883
+ })
884
+ )
885
+ )
886
+
887
+ const GroupLive = HttpApiBuilder.group(
888
+ Api,
889
+ "Users",
890
+ (handlers) =>
891
+ handlers
892
+ .handle("getUsers", (ctx) => {
893
+ const { page, sort } = ctx.query
894
+ console.log(`Getting users with page ${page} and sort ${sort}`)
895
+ return Effect.succeed(
896
+ [{ id: 1, name: "User 1" }, { id: 2, name: "User 2" }]
897
+ )
898
+ })
899
+ )
900
+
901
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
902
+ Layer.provide(GroupLive),
903
+ Layer.provide(HttpApiScalar.layer(Api)),
904
+ HttpRouter.serve,
905
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
906
+ )
907
+
908
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
909
+ ```
910
+
911
+ #### Defining an Array of Values for a Query Parameter
912
+
913
+ A single query parameter can carry multiple values (e.g., `?a=1&a=2`). Wrap the parameter's schema in `Schema.Array` to accept an array of values.
914
+
915
+ **Example** (Defining an Array of String Values for a Query Parameter)
916
+
917
+ ```ts
918
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
919
+ import { Effect, Layer, Schema } from "effect"
920
+ import { HttpRouter } from "effect/unstable/http"
921
+ import { HttpApi, HttpApiBuilder, HttpApiEndpoint, HttpApiGroup, HttpApiScalar } from "effect/unstable/httpapi"
922
+ import { createServer } from "node:http"
923
+
924
+ const User = Schema.Struct({
925
+ id: Schema.Int,
926
+ name: Schema.String
927
+ })
928
+
929
+ const Api = HttpApi.make("MyApi")
930
+ .add(
931
+ HttpApiGroup.make("Users")
932
+ .add(
933
+ HttpApiEndpoint.get("getUsers", "/users", {
934
+ success: Schema.Array(User),
935
+ query: {
936
+ a: Schema.optionalKey(Schema.Array(Schema.String))
937
+ }
938
+ })
939
+ )
940
+ )
941
+
942
+ const GroupLive = HttpApiBuilder.group(
943
+ Api,
944
+ "Users",
945
+ (handlers) =>
946
+ handlers
947
+ .handle("getUsers", (ctx) => {
948
+ console.log(ctx.query)
949
+ return Effect.succeed(
950
+ [{ id: 1, name: "User 1" }, { id: 2, name: "User 2" }]
951
+ )
952
+ })
953
+ )
954
+
955
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
956
+ Layer.provide(GroupLive),
957
+ Layer.provide(HttpApiScalar.layer(Api)),
958
+ HttpRouter.serve,
959
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
960
+ )
961
+
962
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
963
+ ```
964
+
965
+ You can test this endpoint by passing an array of values in the query string. For example:
966
+
967
+ ```sh
968
+ curl "http://localhost:3000/users?a=1&a=2" # Two values for the `a` parameter
969
+ ```
970
+
971
+ The query string sends two values (`1` and `2`) for the `a` parameter. The server will process and validate these values according to the schema.
972
+
973
+ Both the following requests will be valid:
974
+
975
+ ```sh
976
+ curl "http://localhost:3000/users" # No values for the `a` parameter
977
+ curl "http://localhost:3000/users?a=1" # One value for the `a` parameter
978
+ ```
979
+
980
+ ## Request Headers
981
+
982
+ Use the `headers` option to declare a record of fields or a full schema for the request headers the endpoint expects.
983
+
984
+ > [!IMPORTANT]
985
+ > All headers are normalized to lowercase. Always use lowercase keys for the headers.
986
+
987
+ **Example** (Describe and validate custom headers)
988
+
989
+ ```ts
990
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
991
+ import { Effect, Layer, Schema } from "effect"
992
+ import { HttpRouter } from "effect/unstable/http"
993
+ import { HttpApi, HttpApiBuilder, HttpApiEndpoint, HttpApiGroup, HttpApiScalar } from "effect/unstable/httpapi"
994
+ import { createServer } from "node:http"
995
+
996
+ const User = Schema.Struct({
997
+ id: Schema.Int,
998
+ name: Schema.String
999
+ })
1000
+
1001
+ const Api = HttpApi.make("MyApi")
1002
+ .add(
1003
+ HttpApiGroup.make("Users")
1004
+ .add(
1005
+ HttpApiEndpoint.get("getUsers", "/users", {
1006
+ // Always use lowercase keys for the headers
1007
+ headers: {
1008
+ "x-api-key": Schema.String,
1009
+ "x-request-id": Schema.String
1010
+ },
1011
+ success: Schema.Array(User)
1012
+ })
1013
+ )
1014
+ )
1015
+
1016
+ const GroupLive = HttpApiBuilder.group(
1017
+ Api,
1018
+ "Users",
1019
+ (handlers) =>
1020
+ handlers.handle("getUsers", () =>
1021
+ Effect.succeed(
1022
+ [{ id: 1, name: "User 1" }, { id: 2, name: "User 2" }]
1023
+ ))
1024
+ )
1025
+
1026
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
1027
+ Layer.provide(GroupLive),
1028
+ Layer.provide(HttpApiScalar.layer(Api)),
1029
+ HttpRouter.serve,
1030
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
1031
+ )
1032
+
1033
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
1034
+ ```
1035
+
1036
+ You can test the endpoint by sending the headers:
1037
+
1038
+ ```sh
1039
+ curl -H "X-API-Key: 1234567890" -H "X-Request-ID: 1234567890" http://localhost:3000/users
1040
+ ```
1041
+
1042
+ The server validates these headers against the declared schema before handling the request.
1043
+
1044
+ ## Handling Multipart Requests
1045
+
1046
+ To accept file uploads, mark the payload as multipart with `HttpApiSchema.asMultipart`. Use `Multipart.FilesSchema` for the file fields — uploaded files will be persisted to disk automatically.
1047
+
1048
+ **Example** (Defining an Endpoint for File Uploads)
1049
+
1050
+ ```ts
1051
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
1052
+ import { Effect, Layer, Schema } from "effect"
1053
+ import { HttpRouter, Multipart } from "effect/unstable/http"
1054
+ import {
1055
+ HttpApi,
1056
+ HttpApiBuilder,
1057
+ HttpApiEndpoint,
1058
+ HttpApiGroup,
1059
+ HttpApiScalar,
1060
+ HttpApiSchema
1061
+ } from "effect/unstable/httpapi"
1062
+ import { createServer } from "node:http"
1063
+
1064
+ const Api = HttpApi.make("MyApi")
1065
+ .add(
1066
+ HttpApiGroup.make("Users")
1067
+ .add(
1068
+ HttpApiEndpoint.post("upload", "/users/upload", {
1069
+ // Specify that the payload is a multipart request
1070
+ payload: HttpApiSchema.asMultipart(
1071
+ Schema.Struct({
1072
+ // Define a "files" field to handle file uploads
1073
+ files: Multipart.FilesSchema
1074
+ })
1075
+ ),
1076
+ success: Schema.String
1077
+ })
1078
+ )
1079
+ )
1080
+
1081
+ const GroupLive = HttpApiBuilder.group(
1082
+ Api,
1083
+ "Users",
1084
+ (handlers) =>
1085
+ handlers
1086
+ .handle("upload", (ctx) => {
1087
+ // ┌─── readonly Multipart.PersistedFile[]
1088
+ // ▼
1089
+ const { files } = ctx.payload
1090
+ console.log(files)
1091
+ return Effect.succeed("Uploaded")
1092
+ })
1093
+ )
1094
+
1095
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
1096
+ Layer.provide(GroupLive),
1097
+ Layer.provide(HttpApiScalar.layer(Api)),
1098
+ HttpRouter.serve,
1099
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
1100
+ )
1101
+
1102
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
1103
+ ```
1104
+
1105
+ You can test this endpoint by sending a multipart request with a file upload. For example:
1106
+
1107
+ ```sh
1108
+ echo "Sample file content" | curl -X POST -F "files=@-" http://localhost:3000/users/upload
1109
+ ```
1110
+
1111
+ ## Changing the Request Encoding
1112
+
1113
+ By default, request bodies are JSON. To accept a different format — like form-urlencoded data — pipe the payload schema through the appropriate `HttpApiSchema.as*` helper.
1114
+
1115
+ **Example** (Customizing Request Encoding)
1116
+
1117
+ ```ts
1118
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
1119
+ import { Effect, Layer, Schema } from "effect"
1120
+ import { HttpRouter } from "effect/unstable/http"
1121
+ import {
1122
+ HttpApi,
1123
+ HttpApiBuilder,
1124
+ HttpApiEndpoint,
1125
+ HttpApiGroup,
1126
+ HttpApiScalar,
1127
+ HttpApiSchema
1128
+ } from "effect/unstable/httpapi"
1129
+ import { createServer } from "node:http"
1130
+
1131
+ const User = Schema.Struct({
1132
+ id: Schema.Int,
1133
+ name: Schema.String
1134
+ })
1135
+
1136
+ const Api = HttpApi.make("MyApi")
1137
+ .add(
1138
+ HttpApiGroup.make("Users")
1139
+ .add(
1140
+ HttpApiEndpoint.post("createUser", "/user", {
1141
+ // Set the request payload as a string encoded with query parameters
1142
+ payload: Schema.Struct({
1143
+ id: Schema.Int,
1144
+ name: Schema.String
1145
+ })
1146
+ // Specify the encoding as form url encoded
1147
+ .pipe(HttpApiSchema.asFormUrlEncoded()),
1148
+ success: User
1149
+ })
1150
+ )
1151
+ )
1152
+
1153
+ const GroupLive = HttpApiBuilder.group(
1154
+ Api,
1155
+ "Users",
1156
+ (handlers) =>
1157
+ handlers
1158
+ .handle("createUser", (ctx) => {
1159
+ const user = ctx.payload
1160
+ return Effect.succeed(user)
1161
+ })
1162
+ )
1163
+
1164
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
1165
+ Layer.provide(GroupLive),
1166
+ Layer.provide(HttpApiScalar.layer(Api)),
1167
+ HttpRouter.serve,
1168
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
1169
+ )
1170
+
1171
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
1172
+ ```
1173
+
1174
+ You can test this endpoint using a URL-encoded request body. For example:
1175
+
1176
+ ```sh
1177
+ curl http://localhost:3000/user \
1178
+ --request POST \
1179
+ --header 'Accept: */*' \
1180
+ --header 'Content-Type: application/x-www-form-urlencoded' \
1181
+ --data-urlencode 'id=1' \
1182
+ --data-urlencode 'name=John'
1183
+ ```
1184
+
1185
+ ## Accessing the HttpServerRequest
1186
+
1187
+ Inside a handler, `ctx.request` gives you access to the raw incoming HTTP request. Use this when you need low-level details not covered by the endpoint schema (e.g., the HTTP method or raw URL).
1188
+
1189
+ **Example** (Accessing the Request Object in a GET Endpoint)
1190
+
1191
+ ```ts
1192
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
1193
+ import { Effect, Layer, Schema } from "effect"
1194
+ import { HttpRouter } from "effect/unstable/http"
1195
+ import { HttpApi, HttpApiBuilder, HttpApiEndpoint, HttpApiGroup } from "effect/unstable/httpapi"
1196
+ import { createServer } from "node:http"
1197
+
1198
+ const Api = HttpApi.make("MyApi").add(
1199
+ HttpApiGroup.make("Greetings").add(
1200
+ HttpApiEndpoint.get("hello", "/", {
1201
+ success: Schema.String
1202
+ })
1203
+ )
1204
+ )
1205
+
1206
+ const GroupLive = HttpApiBuilder.group(
1207
+ Api,
1208
+ "Greetings",
1209
+ (handlers) =>
1210
+ handlers.handle(
1211
+ "hello",
1212
+ (ctx) => {
1213
+ // ┌─── HttpServerRequest
1214
+ // ▼
1215
+ const req = ctx.request
1216
+ // Access the request method
1217
+ console.log(req.method)
1218
+ return Effect.succeed("Hello, World!")
1219
+ }
1220
+ )
1221
+ )
1222
+
1223
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
1224
+ Layer.provide(GroupLive),
1225
+ HttpRouter.serve,
1226
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
1227
+ )
1228
+
1229
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
1230
+ ```
1231
+
1232
+ ## Validating Request Cookies
1233
+
1234
+ There is no `cookies` option on endpoints. Instead, validated cookie access goes through the security middleware system: define an `HttpApiSecurity.apiKey` with `in: "cookie"` and attach it to a middleware. The cookie value is decoded and handed to your security handler as a `Redacted` credential.
1235
+
1236
+ **Example** (Validating a Session Cookie)
1237
+
1238
+ ```ts
1239
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
1240
+ import { Context, Effect, Layer, Redacted, Schema } from "effect"
1241
+ import { HttpRouter } from "effect/unstable/http"
1242
+ import {
1243
+ HttpApi,
1244
+ HttpApiBuilder,
1245
+ HttpApiEndpoint,
1246
+ HttpApiGroup,
1247
+ HttpApiMiddleware,
1248
+ HttpApiScalar,
1249
+ HttpApiSecurity
1250
+ } from "effect/unstable/httpapi"
1251
+ import { createServer } from "node:http"
1252
+
1253
+ // Define the service providing the current user
1254
+ class CurrentUser
1255
+ extends Context.Service<CurrentUser, { readonly id: number; readonly name: string }>()("CurrentUser")
1256
+ {}
1257
+
1258
+ // Define the security scheme: read the "session" cookie
1259
+ const sessionCookie = HttpApiSecurity.apiKey({ in: "cookie", key: "session" })
1260
+
1261
+ class Auth extends HttpApiMiddleware.Service<Auth, {
1262
+ provides: CurrentUser
1263
+ }>()("Auth", {
1264
+ error: Schema.String.annotate({
1265
+ httpApiStatus: 401,
1266
+ description: "Auth error"
1267
+ }),
1268
+ security: { session: sessionCookie }
1269
+ }) {}
1270
+
1271
+ const Api = HttpApi.make("api").add(
1272
+ HttpApiGroup.make("group")
1273
+ .add(
1274
+ HttpApiEndpoint.get("me", "/me", {
1275
+ success: Schema.Struct({ id: Schema.Finite })
1276
+ })
1277
+ )
1278
+ .middleware(Auth)
1279
+ )
1280
+
1281
+ const AuthLive = Layer.succeed(
1282
+ Auth,
1283
+ {
1284
+ session: (effect, opts) =>
1285
+ Effect.provideServiceEffect(
1286
+ effect,
1287
+ CurrentUser,
1288
+ Effect.gen(function*() {
1289
+ const value = Redacted.value(opts.credential)
1290
+ if (value !== "valid-session") {
1291
+ return yield* Effect.fail("Invalid session")
1292
+ }
1293
+ return { id: 1, name: "John Doe" }
1294
+ })
1295
+ )
1296
+ }
1297
+ )
1298
+
1299
+ const GroupLive = HttpApiBuilder.group(
1300
+ Api,
1301
+ "group",
1302
+ (handlers) =>
1303
+ handlers.handle("me", () =>
1304
+ Effect.gen(function*() {
1305
+ const user = yield* CurrentUser
1306
+ return { id: user.id }
1307
+ }))
1308
+ ).pipe(Layer.provide(AuthLive))
1309
+
1310
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
1311
+ Layer.provide(GroupLive),
1312
+ Layer.provide(HttpApiScalar.layer(Api)),
1313
+ HttpRouter.serve,
1314
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
1315
+ )
1316
+
1317
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
1318
+
1319
+ // Valid session:
1320
+ // curl "http://localhost:3000/me" --cookie "session=valid-session"
1321
+ // {"id":1}
1322
+ //
1323
+ // Invalid session:
1324
+ // curl "http://localhost:3000/me" --cookie "session=wrong"
1325
+ // "Invalid session"
1326
+ ```
1327
+
1328
+ For quick, unvalidated access you can read cookies directly from `ctx.request.cookies` inside any handler. These cookies won't appear in the OpenAPI spec.
1329
+
1330
+ **Example** (Reading Cookies Directly in a Handler)
1331
+
1332
+ ```ts
1333
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
1334
+ import { Effect, Layer, Schema } from "effect"
1335
+ import { HttpRouter } from "effect/unstable/http"
1336
+ import { HttpApi, HttpApiBuilder, HttpApiEndpoint, HttpApiGroup } from "effect/unstable/httpapi"
1337
+ import { createServer } from "node:http"
1338
+
1339
+ const Api = HttpApi.make("api").add(
1340
+ HttpApiGroup.make("group").add(
1341
+ HttpApiEndpoint.get("me", "/me", {
1342
+ success: Schema.String
1343
+ })
1344
+ )
1345
+ )
1346
+
1347
+ const GroupLive = HttpApiBuilder.group(
1348
+ Api,
1349
+ "group",
1350
+ (handlers) =>
1351
+ handlers.handle("me", (ctx) => {
1352
+ const lang = ctx.request.cookies.lang ?? "en"
1353
+ return Effect.succeed(`Language: ${lang}`)
1354
+ })
1355
+ )
1356
+
1357
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
1358
+ Layer.provide(GroupLive),
1359
+ HttpRouter.serve,
1360
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
1361
+ )
1362
+
1363
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
1364
+
1365
+ // curl "http://localhost:3000/me" --cookie "lang=it"
1366
+ // "Language: it"
1367
+ ```
1368
+
1369
+ ## Streaming Requests
1370
+
1371
+ To receive large or continuous data from the client, define the payload as a `Uint8Array` and pipe it through `HttpApiSchema.asUint8Array()`. The handler receives the raw bytes, which you can decode as needed.
1372
+
1373
+ **Example** (Handling Streaming Requests)
1374
+
1375
+ ```ts
1376
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
1377
+ import { Effect, Layer, Schema } from "effect"
1378
+ import { HttpRouter } from "effect/unstable/http"
1379
+ import { HttpApi, HttpApiBuilder, HttpApiEndpoint, HttpApiGroup, HttpApiSchema } from "effect/unstable/httpapi"
1380
+ import { createServer } from "node:http"
1381
+
1382
+ const Api = HttpApi.make("myApi").add(
1383
+ HttpApiGroup.make("group").add(
1384
+ HttpApiEndpoint.post("acceptStream", "/stream", {
1385
+ // Define the payload as a Uint8Array with a specific encoding
1386
+ payload: Schema.Uint8Array.pipe(
1387
+ HttpApiSchema.asUint8Array() // default content type: application/octet-stream
1388
+ ),
1389
+ success: Schema.String
1390
+ })
1391
+ )
1392
+ )
1393
+
1394
+ const GroupLive = HttpApiBuilder.group(
1395
+ Api,
1396
+ "group",
1397
+ (handlers) =>
1398
+ handlers.handle(
1399
+ "acceptStream",
1400
+ (ctx) => {
1401
+ // Decode the incoming binary data into a string
1402
+ return Effect.succeed(new TextDecoder().decode(ctx.payload))
1403
+ }
1404
+ )
1405
+ )
1406
+
1407
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
1408
+ Layer.provide(GroupLive),
1409
+ HttpRouter.serve,
1410
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
1411
+ )
1412
+
1413
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
1414
+ ```
1415
+
1416
+ You can test the streaming request using `curl` or any tool that supports sending binary data. For example:
1417
+
1418
+ ```sh
1419
+ echo "abc" | curl -X POST 'http://localhost:3000/stream' --data-binary @- -H "Content-Type: application/octet-stream"
1420
+ # Output: abc
1421
+ ```
1422
+
1423
+ # Response
1424
+
1425
+ ## Status Codes
1426
+
1427
+ Success responses default to `200 OK`. To use a different status code, annotate the success schema with `HttpApiSchema.status(code)` or set the `httpApiStatus` annotation.
1428
+
1429
+ **Example** (Defining a GET Endpoint with a custom status code)
1430
+
1431
+ ```ts
1432
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
1433
+ import { Effect, Layer, Schema } from "effect"
1434
+ import { HttpRouter } from "effect/unstable/http"
1435
+ import {
1436
+ HttpApi,
1437
+ HttpApiBuilder,
1438
+ HttpApiEndpoint,
1439
+ HttpApiGroup,
1440
+ HttpApiScalar,
1441
+ HttpApiSchema
1442
+ } from "effect/unstable/httpapi"
1443
+ import { createServer } from "node:http"
1444
+
1445
+ const User = Schema.Struct({
1446
+ id: Schema.Int,
1447
+ name: Schema.String
1448
+ })
1449
+
1450
+ const Api = HttpApi.make("MyApi")
1451
+ .add(
1452
+ HttpApiGroup.make("Users")
1453
+ .add(
1454
+ HttpApiEndpoint.get("getUsers", "/users", {
1455
+ success: Schema.Array(User)
1456
+ .pipe(HttpApiSchema.status(206))
1457
+ })
1458
+ )
1459
+ )
1460
+
1461
+ const GroupLive = HttpApiBuilder.group(
1462
+ Api,
1463
+ "Users",
1464
+ (handlers) =>
1465
+ handlers
1466
+ .handle("getUsers", () => {
1467
+ return Effect.succeed(
1468
+ [{ id: 1, name: "User 1" }, { id: 2, name: "User 2" }]
1469
+ )
1470
+ })
1471
+ )
1472
+
1473
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
1474
+ Layer.provide(GroupLive),
1475
+ Layer.provide(HttpApiScalar.layer(Api)),
1476
+ HttpRouter.serve,
1477
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
1478
+ )
1479
+
1480
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
1481
+ ```
1482
+
1483
+ ## Changing the Response Encoding
1484
+
1485
+ Responses default to JSON. To return a different format — like CSV or plain text — pipe the success schema through the matching `HttpApiSchema.as*` helper and, optionally, set a custom `contentType`.
1486
+
1487
+ **Example** (Returning Data as `text/csv`)
1488
+
1489
+ ```ts
1490
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
1491
+ import { Effect, Layer, Schema } from "effect"
1492
+ import { HttpRouter } from "effect/unstable/http"
1493
+ import {
1494
+ HttpApi,
1495
+ HttpApiBuilder,
1496
+ HttpApiEndpoint,
1497
+ HttpApiGroup,
1498
+ HttpApiScalar,
1499
+ HttpApiSchema
1500
+ } from "effect/unstable/httpapi"
1501
+ import { createServer } from "node:http"
1502
+
1503
+ const Api = HttpApi.make("MyApi")
1504
+ .add(
1505
+ HttpApiGroup.make("Users")
1506
+ .add(
1507
+ HttpApiEndpoint.get("csv", "/users/csv", {
1508
+ success: Schema.String.pipe(
1509
+ // Set the success response as a string with CSV encoding
1510
+ HttpApiSchema.asText({
1511
+ // Define the content type as text/csv
1512
+ contentType: "text/csv"
1513
+ })
1514
+ )
1515
+ })
1516
+ )
1517
+ )
1518
+
1519
+ const GroupLive = HttpApiBuilder.group(
1520
+ Api,
1521
+ "Users",
1522
+ (handlers) =>
1523
+ handlers
1524
+ .handle("csv", (ctx) => {
1525
+ return Effect.succeed("id,name\n1,John\n2,Jane")
1526
+ })
1527
+ )
1528
+
1529
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
1530
+ Layer.provide(GroupLive),
1531
+ Layer.provide(HttpApiScalar.layer(Api)),
1532
+ HttpRouter.serve,
1533
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
1534
+ )
1535
+
1536
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
1537
+ ```
1538
+
1539
+ You can test this endpoint using a GET request. For example:
1540
+
1541
+ ```sh
1542
+ curl http://localhost:3000/users/csv
1543
+ ```
1544
+
1545
+ The following encodings are supported:
1546
+
1547
+ - `Json` the default encoding (default content type: `application/json`)
1548
+ - `Uint8Array` the encoding for binary data (default content type: `application/octet-stream`)
1549
+ - `Text` the encoding for text data (default content type: `text/plain`)
1550
+
1551
+ ## Setting Response Headers
1552
+
1553
+ To add custom headers to the outgoing response, call `HttpEffect.appendPreResponseHandler` inside your handler. The callback receives the request and response objects and must return the updated response.
1554
+
1555
+ **Example** (Adding a Custom Response Header)
1556
+
1557
+ ```ts
1558
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
1559
+ import { Effect, Layer, Schema } from "effect"
1560
+ import { HttpEffect, HttpRouter, HttpServerResponse } from "effect/unstable/http"
1561
+ import { HttpApi, HttpApiBuilder, HttpApiEndpoint, HttpApiGroup } from "effect/unstable/httpapi"
1562
+ import { createServer } from "node:http"
1563
+
1564
+ const Api = HttpApi.make("api").add(
1565
+ HttpApiGroup.make("group").add(
1566
+ HttpApiEndpoint.get("hello", "/hello", {
1567
+ success: Schema.String
1568
+ })
1569
+ )
1570
+ )
1571
+
1572
+ const GroupLive = HttpApiBuilder.group(
1573
+ Api,
1574
+ "group",
1575
+ (handlers) =>
1576
+ handlers.handle("hello", () =>
1577
+ Effect.gen(function*() {
1578
+ yield* HttpEffect.appendPreResponseHandler((_req, response) =>
1579
+ Effect.succeed(HttpServerResponse.setHeader(response, "x-custom", "hello"))
1580
+ )
1581
+ return "Hello, World!"
1582
+ }))
1583
+ )
1584
+
1585
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
1586
+ Layer.provide(GroupLive),
1587
+ HttpRouter.serve,
1588
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
1589
+ )
1590
+
1591
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
1592
+
1593
+ // curl -v "http://localhost:3000/hello" 2>&1 | grep -i "x-custom"
1594
+ // < x-custom: hello
1595
+ ```
1596
+
1597
+ ## Setting Response Cookies
1598
+
1599
+ Set cookies on the response using `HttpEffect.appendPreResponseHandler` together with `HttpServerResponse.setCookie`. For cookies tied to an `HttpApiSecurity.apiKey`, use the shortcut `HttpApiBuilder.securitySetCookie` instead.
1600
+
1601
+ **Example** (Setting a Response Cookie)
1602
+
1603
+ ```ts
1604
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
1605
+ import { Effect, Layer, Schema } from "effect"
1606
+ import { HttpEffect, HttpRouter, HttpServerResponse } from "effect/unstable/http"
1607
+ import { HttpApi, HttpApiBuilder, HttpApiEndpoint, HttpApiGroup } from "effect/unstable/httpapi"
1608
+ import { createServer } from "node:http"
1609
+
1610
+ const Api = HttpApi.make("api").add(
1611
+ HttpApiGroup.make("group").add(
1612
+ HttpApiEndpoint.get("hello", "/hello", {
1613
+ success: Schema.String
1614
+ })
1615
+ )
1616
+ )
1617
+
1618
+ const GroupLive = HttpApiBuilder.group(
1619
+ Api,
1620
+ "group",
1621
+ (handlers) =>
1622
+ handlers.handle("hello", () =>
1623
+ Effect.gen(function*() {
1624
+ yield* HttpEffect.appendPreResponseHandler((_req, response) =>
1625
+ Effect.succeed(HttpServerResponse.setCookieUnsafe(response, "my-cookie", "my-value", {
1626
+ httpOnly: true,
1627
+ secure: true,
1628
+ path: "/"
1629
+ }))
1630
+ )
1631
+ return "Hello, World!"
1632
+ }))
1633
+ )
1634
+
1635
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
1636
+ Layer.provide(GroupLive),
1637
+ HttpRouter.serve,
1638
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
1639
+ )
1640
+
1641
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
1642
+
1643
+ // curl -v "http://localhost:3000/hello" 2>&1 | grep -i "set-cookie"
1644
+ // < set-cookie: my-cookie=my-value; Path=/; HttpOnly; Secure
1645
+ ```
1646
+
1647
+ ## Redirects
1648
+
1649
+ To redirect the client to a different URL, return an `HttpServerResponse.redirect` from the handler. The redirect is not modeled in the schema — the endpoint definition stays as "no content".
1650
+
1651
+ ```ts
1652
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
1653
+ import { Effect, Layer, Schema } from "effect"
1654
+ import { HttpRouter } from "effect/unstable/http"
1655
+ import { HttpServerResponse } from "effect/unstable/http"
1656
+ import { HttpApi, HttpApiBuilder, HttpApiEndpoint, HttpApiGroup, HttpApiScalar } from "effect/unstable/httpapi"
1657
+ import { createServer } from "node:http"
1658
+
1659
+ const Api = HttpApi.make("MyApi").add(
1660
+ HttpApiGroup.make("group").add(
1661
+ HttpApiEndpoint.get("newPage", "/new", {
1662
+ success: Schema.String
1663
+ }),
1664
+ // Schema-wise this is just "no content" (redirect headers aren't modeled here)
1665
+ HttpApiEndpoint.get("oldPage", "/old")
1666
+ )
1667
+ )
1668
+
1669
+ const GroupLive = HttpApiBuilder.group(
1670
+ Api,
1671
+ "group",
1672
+ (handlers) =>
1673
+ handlers
1674
+ .handle("newPage", () => Effect.succeed("You are on /new"))
1675
+ .handle("oldPage", () =>
1676
+ Effect.succeed(
1677
+ HttpServerResponse.redirect("/new", { status: 302 })
1678
+ ))
1679
+ )
1680
+
1681
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
1682
+ Layer.provide(GroupLive),
1683
+ Layer.provide(HttpApiScalar.layer(Api)),
1684
+ HttpRouter.serve,
1685
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
1686
+ )
1687
+
1688
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
1689
+
1690
+ // curl "http://localhost:3000/old" -L
1691
+ ```
1692
+
1693
+ ## Streaming Responses
1694
+
1695
+ To stream data to the client over time, return an `HttpServerResponse.stream` from the handler. The stream emits chunks at whatever pace you choose.
1696
+
1697
+ **Example** (Implementing a Streaming Endpoint)
1698
+
1699
+ ```ts
1700
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
1701
+ import { Effect, Layer, Schedule, Schema, Stream } from "effect"
1702
+ import { HttpRouter, HttpServerResponse } from "effect/unstable/http"
1703
+ import { HttpApi, HttpApiBuilder, HttpApiEndpoint, HttpApiGroup, HttpApiSchema } from "effect/unstable/httpapi"
1704
+ import { createServer } from "node:http"
1705
+
1706
+ const Api = HttpApi.make("myApi").add(
1707
+ HttpApiGroup.make("group").add(
1708
+ HttpApiEndpoint.get("getStream", "/stream", {
1709
+ success: Schema.String.pipe(
1710
+ HttpApiSchema.asText({
1711
+ contentType: "application/octet-stream"
1712
+ })
1713
+ )
1714
+ })
1715
+ )
1716
+ )
1717
+
1718
+ // Simulate a stream of data
1719
+ const stream = Stream.make("a", "b", "c").pipe(
1720
+ Stream.schedule(Schedule.spaced("500 millis")),
1721
+ Stream.map((s) => new TextEncoder().encode(s))
1722
+ )
1723
+
1724
+ const GroupLive = HttpApiBuilder.group(
1725
+ Api,
1726
+ "group",
1727
+ (handlers) =>
1728
+ handlers.handle(
1729
+ "getStream",
1730
+ () => Effect.succeed(HttpServerResponse.stream(stream))
1731
+ )
1732
+ )
1733
+
1734
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
1735
+ Layer.provide(GroupLive),
1736
+ HttpRouter.serve,
1737
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
1738
+ )
1739
+
1740
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
1741
+ ```
1742
+
1743
+ You can test the streaming response using `curl` or any similar HTTP client that supports streaming:
1744
+
1745
+ ```sh
1746
+ curl 'http://localhost:3000/stream' --no-buffer
1747
+ ```
1748
+
1749
+ The response will stream data (`a`, `b`, `c`) with a 500ms interval between each item.
1750
+
1751
+ # Error Handling
1752
+
1753
+ ## Adding Custom Error Responses
1754
+
1755
+ Endpoints can declare the errors they may return. Each error is a schema annotated with an HTTP status code via `HttpApiSchema.status(code)`. The status is set once on the schema and reused wherever that schema appears. When your handler fails with a matching error, the framework serializes it and responds with the declared status.
1756
+
1757
+ **Example** (Defining Error Responses for an Endpoint)
1758
+
1759
+ ```ts
1760
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
1761
+ import { Effect, Layer, Schema } from "effect"
1762
+ import { HttpRouter } from "effect/unstable/http"
1763
+ import {
1764
+ HttpApi,
1765
+ HttpApiBuilder,
1766
+ HttpApiEndpoint,
1767
+ HttpApiGroup,
1768
+ HttpApiScalar,
1769
+ HttpApiSchema
1770
+ } from "effect/unstable/httpapi"
1771
+ import { createServer } from "node:http"
1772
+
1773
+ const User = Schema.Struct({
1774
+ id: Schema.Int,
1775
+ name: Schema.String
1776
+ })
1777
+
1778
+ const UserNotFound = Schema.Struct({
1779
+ _tag: Schema.tag("UserNotFound"),
1780
+ message: Schema.String
1781
+ }).pipe(HttpApiSchema.status(404))
1782
+
1783
+ const Unauthorized = Schema.Struct({
1784
+ _tag: Schema.tag("Unauthorized")
1785
+ }).pipe(HttpApiSchema.status(401))
1786
+
1787
+ const Api = HttpApi.make("MyApi")
1788
+ .add(
1789
+ HttpApiGroup.make("Users")
1790
+ .add(
1791
+ HttpApiEndpoint.get("getUser", "/user/:id", {
1792
+ params: {
1793
+ id: Schema.Int
1794
+ },
1795
+ success: User,
1796
+ error: [UserNotFound, Unauthorized /** etc. */]
1797
+ })
1798
+ )
1799
+ .add(
1800
+ HttpApiEndpoint.delete("deleteUser", "/user/:id", {
1801
+ params: {
1802
+ id: Schema.Int
1803
+ },
1804
+ error: [UserNotFound, Unauthorized /** etc. */]
1805
+ })
1806
+ )
1807
+ )
1808
+
1809
+ const GroupLive = HttpApiBuilder.group(
1810
+ Api,
1811
+ "Users",
1812
+ (handlers) =>
1813
+ handlers
1814
+ .handle("getUser", (ctx) => {
1815
+ const id = ctx.params.id
1816
+ if (id === 1) {
1817
+ return Effect.fail(UserNotFound.make({ message: "User not found" }))
1818
+ }
1819
+ return Effect.succeed({ id, name: `User ${id}` })
1820
+ })
1821
+ .handle("deleteUser", (ctx) => {
1822
+ const id = ctx.params.id
1823
+ if (id === 1) {
1824
+ return Effect.fail(UserNotFound.make({ message: "User not found" }))
1825
+ }
1826
+ return Effect.succeed(void 0)
1827
+ })
1828
+ )
1829
+
1830
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
1831
+ Layer.provide(GroupLive),
1832
+ Layer.provide(HttpApiScalar.layer(Api)),
1833
+ HttpRouter.serve,
1834
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
1835
+ )
1836
+
1837
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
1838
+ ```
1839
+
1840
+ You can test these endpoints. For example:
1841
+
1842
+ ```sh
1843
+ curl http://localhost:3000/user/1 # Returns 404 Not Found
1844
+ curl http://localhost:3000/user/2 # Returns 200 OK
1845
+ curl -X DELETE http://localhost:3000/user/1 # Returns 404 Not Found
1846
+ curl -X DELETE http://localhost:3000/user/2 # Returns 200 OK
1847
+ ```
1848
+
1849
+ ## Predefined Error Types
1850
+
1851
+ The `HttpApiError` module provides ready-made error schemas for common HTTP status codes (404, 401, etc.). Using these saves you from defining boilerplate error types and keeps error handling consistent across your API.
1852
+
1853
+ **Example** (Adding a Predefined Error to an Endpoint)
1854
+
1855
+ ```ts
1856
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
1857
+ import { Effect, Layer, Schema } from "effect"
1858
+ import { HttpRouter } from "effect/unstable/http"
1859
+ import {
1860
+ HttpApi,
1861
+ HttpApiBuilder,
1862
+ HttpApiEndpoint,
1863
+ HttpApiError,
1864
+ HttpApiGroup,
1865
+ HttpApiScalar
1866
+ } from "effect/unstable/httpapi"
1867
+ import { createServer } from "node:http"
1868
+
1869
+ const User = Schema.Struct({
1870
+ id: Schema.Int,
1871
+ name: Schema.String
1872
+ })
1873
+
1874
+ const Api = HttpApi.make("MyApi")
1875
+ .add(
1876
+ HttpApiGroup.make("Users")
1877
+ .add(
1878
+ HttpApiEndpoint.get("getUser", "/user/:id", {
1879
+ params: {
1880
+ id: Schema.Int
1881
+ },
1882
+ success: User,
1883
+ error: [
1884
+ // Add a 404 error JSON response for this endpoint
1885
+ HttpApiError.NotFound,
1886
+ // Add a 401 error JSON response for unauthorized access
1887
+ HttpApiError.Unauthorized
1888
+ ]
1889
+ })
1890
+ )
1891
+ )
1892
+
1893
+ const GroupLive = HttpApiBuilder.group(
1894
+ Api,
1895
+ "Users",
1896
+ (handlers) =>
1897
+ handlers
1898
+ .handle("getUser", (ctx) => {
1899
+ const id = ctx.params.id
1900
+ if (id === 1) {
1901
+ return Effect.fail(new HttpApiError.NotFound({}))
1902
+ }
1903
+ return Effect.succeed({ id, name: `User ${id}` })
1904
+ })
1905
+ )
1906
+
1907
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
1908
+ Layer.provide(GroupLive),
1909
+ Layer.provide(HttpApiScalar.layer(Api)),
1910
+ HttpRouter.serve,
1911
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
1912
+ )
1913
+
1914
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
1915
+ ```
1916
+
1917
+ | Name | Status | Description |
1918
+ | --------------------- | ------ | -------------------------------------------------------------------------------------------------- |
1919
+ | `HttpApiDecodeError` | 400 | Represents an error where the request did not match the expected schema. Includes detailed issues. |
1920
+ | `BadRequest` | 400 | Indicates that the request was malformed or invalid. |
1921
+ | `Unauthorized` | 401 | Indicates that authentication is required but missing or invalid. |
1922
+ | `Forbidden` | 403 | Indicates that the client does not have permission to access the requested resource. |
1923
+ | `NotFound` | 404 | Indicates that the requested resource could not be found. |
1924
+ | `MethodNotAllowed` | 405 | Indicates that the HTTP method used is not allowed for the requested resource. |
1925
+ | `NotAcceptable` | 406 | Indicates that the requested resource cannot be delivered in a format acceptable to the client. |
1926
+ | `RequestTimeout` | 408 | Indicates that the server timed out waiting for the client request. |
1927
+ | `Conflict` | 409 | Indicates a conflict in the request, such as conflicting data. |
1928
+ | `Gone` | 410 | Indicates that the requested resource is no longer available and will not return. |
1929
+ | `InternalServerError` | 500 | Indicates an unexpected server error occurred. |
1930
+ | `NotImplemented` | 501 | Indicates that the requested functionality is not implemented on the server. |
1931
+ | `ServiceUnavailable` | 503 | Indicates that the server is temporarily unavailable, often due to maintenance or overload. |
1932
+
1933
+ #### Predefined NoContent Error Types
1934
+
1935
+ Each predefined error also has a `NoContent` variant that responds with the status code but no body.
1936
+
1937
+ **Example** (Using a Predefined NoContent Error Type)
1938
+
1939
+ ```ts
1940
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
1941
+ import { Effect, Layer, Schema } from "effect"
1942
+ import { HttpRouter } from "effect/unstable/http"
1943
+ import {
1944
+ HttpApi,
1945
+ HttpApiBuilder,
1946
+ HttpApiEndpoint,
1947
+ HttpApiError,
1948
+ HttpApiGroup,
1949
+ HttpApiScalar
1950
+ } from "effect/unstable/httpapi"
1951
+ import { createServer } from "node:http"
1952
+
1953
+ const User = Schema.Struct({
1954
+ id: Schema.Int,
1955
+ name: Schema.String
1956
+ })
1957
+
1958
+ const Api = HttpApi.make("MyApi")
1959
+ .add(
1960
+ HttpApiGroup.make("Users")
1961
+ .add(
1962
+ HttpApiEndpoint.get("getUser", "/user/:id", {
1963
+ params: {
1964
+ id: Schema.Int
1965
+ },
1966
+ success: User,
1967
+ error: [
1968
+ // Add a 404 error no-content response for this endpoint
1969
+ HttpApiError.NotFoundNoContent,
1970
+ // Add a 401 error no-content response for unauthorized access
1971
+ HttpApiError.UnauthorizedNoContent
1972
+ ]
1973
+ })
1974
+ )
1975
+ )
1976
+
1977
+ const GroupLive = HttpApiBuilder.group(
1978
+ Api,
1979
+ "Users",
1980
+ (handlers) =>
1981
+ handlers
1982
+ .handle("getUser", (ctx) => {
1983
+ const id = ctx.params.id
1984
+ if (id === 1) {
1985
+ return Effect.fail(new HttpApiError.NotFound({}))
1986
+ }
1987
+ return Effect.succeed({ id, name: `User ${id}` })
1988
+ })
1989
+ )
1990
+
1991
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
1992
+ Layer.provide(GroupLive),
1993
+ Layer.provide(HttpApiScalar.layer(Api)),
1994
+ HttpRouter.serve,
1995
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
1996
+ )
1997
+
1998
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
1999
+ ```
2000
+
2001
+ ## Customizing Schema Error Responses
2002
+
2003
+ By default, when a request fails schema validation (e.g., an invalid query parameter or a malformed path parameter), the framework responds with an empty `400 Bad Request`. If you want to replace that response with a custom error, use `HttpApiMiddleware.layerSchemaErrorTransform`.
2004
+
2005
+ This function creates a [middleware](#middlewares) layer that intercepts any `SchemaError` thrown during request decoding and lets you return your own error instead.
2006
+
2007
+ **Example** (Returning a Custom Error on Validation Failure)
2008
+
2009
+ In this example, if a client sends a non-integer `id` query parameter, the API responds with a `422` status and a JSON body describing the problem, instead of the default empty `400`.
2010
+
2011
+ ```ts
2012
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
2013
+ import { Effect, Layer, Schema } from "effect"
2014
+ import { HttpRouter } from "effect/unstable/http"
2015
+ import {
2016
+ HttpApi,
2017
+ HttpApiBuilder,
2018
+ HttpApiEndpoint,
2019
+ HttpApiGroup,
2020
+ HttpApiMiddleware,
2021
+ HttpApiScalar,
2022
+ HttpApiSchema
2023
+ } from "effect/unstable/httpapi"
2024
+ import { createServer } from "node:http"
2025
+
2026
+ // Define a custom error for validation failures
2027
+ class ValidationError extends Schema.TaggedErrorClass<ValidationError>()(
2028
+ "ValidationError",
2029
+ {
2030
+ message: Schema.String
2031
+ }
2032
+ ) {}
2033
+
2034
+ // Define the middleware service, declaring the error it can produce
2035
+ class SchemaErrorHandler extends HttpApiMiddleware.Service<SchemaErrorHandler>()(
2036
+ "api/SchemaErrorHandler",
2037
+ {
2038
+ error: ValidationError.pipe(HttpApiSchema.status(422))
2039
+ }
2040
+ ) {}
2041
+
2042
+ // Implement the middleware layer
2043
+ const SchemaErrorHandlerLive = HttpApiMiddleware.layerSchemaErrorTransform(
2044
+ SchemaErrorHandler,
2045
+ (schemaError) =>
2046
+ Effect.fail(
2047
+ new ValidationError({
2048
+ message: `Invalid request: ${schemaError.message}`
2049
+ })
2050
+ )
2051
+ )
2052
+
2053
+ const User = Schema.Struct({
2054
+ id: Schema.Int,
2055
+ name: Schema.String
2056
+ })
2057
+
2058
+ const Api = HttpApi.make("MyApi").add(
2059
+ HttpApiGroup.make("Users").add(
2060
+ HttpApiEndpoint.get("getUser", "/user", {
2061
+ query: {
2062
+ id: Schema.Int
2063
+ },
2064
+ success: User
2065
+ })
2066
+ // Attach the middleware to this endpoint only
2067
+ .middleware(SchemaErrorHandler)
2068
+ )
2069
+ )
2070
+
2071
+ const GroupLive = HttpApiBuilder.group(
2072
+ Api,
2073
+ "Users",
2074
+ (handlers) => handlers.handle("getUser", (ctx) => Effect.succeed({ id: ctx.query.id, name: `User ${ctx.query.id}` }))
2075
+ )
2076
+
2077
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
2078
+ Layer.provide(GroupLive),
2079
+ Layer.provide(SchemaErrorHandlerLive),
2080
+ Layer.provide(HttpApiScalar.layer(Api)),
2081
+ HttpRouter.serve,
2082
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
2083
+ )
2084
+
2085
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
2086
+
2087
+ // Test:
2088
+ // curl "http://localhost:3000/user?id=1" # 200 OK
2089
+ // curl "http://localhost:3000/user?id=abc" # 422 with ValidationError JSON
2090
+ ```
2091
+
2092
+ The middleware can be attached at different scopes:
2093
+
2094
+ - **Endpoint**: `.middleware(SchemaErrorHandler)` on a single endpoint (as shown above).
2095
+ - **Group**: `.middleware(SchemaErrorHandler)` on a group to cover all its endpoints.
2096
+ - **API**: `.middleware(SchemaErrorHandler)` on the API to cover every endpoint.
2097
+
2098
+ # Middlewares
2099
+
2100
+ Middleware lets you run shared logic — like logging or authentication — before (or around) your handlers. Define a middleware as a class extending `HttpApiMiddleware.Service`, implement it as a `Layer`, and attach it to an endpoint, a group, or the entire API.
2101
+
2102
+ **Example** (Defining a Logger Middleware)
2103
+
2104
+ ```ts
2105
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
2106
+ import { Effect, Layer, Schema } from "effect"
2107
+ import { HttpRouter, HttpServerRequest } from "effect/unstable/http"
2108
+ import {
2109
+ HttpApi,
2110
+ HttpApiBuilder,
2111
+ HttpApiEndpoint,
2112
+ HttpApiGroup,
2113
+ HttpApiMiddleware,
2114
+ HttpApiScalar,
2115
+ HttpApiSchema
2116
+ } from "effect/unstable/httpapi"
2117
+ import { createServer } from "node:http"
2118
+
2119
+ class Logger extends HttpApiMiddleware.Service<Logger>()("Http/Logger", {
2120
+ // default is 500 Internal Server Error with JSON encoding
2121
+ error: Schema.String
2122
+ .pipe(
2123
+ HttpApiSchema.status(405), // override default status code
2124
+ HttpApiSchema.asText() // override default encoding
2125
+ )
2126
+ }) {}
2127
+
2128
+ const User = Schema.Struct({
2129
+ id: Schema.Finite,
2130
+ name: Schema.String
2131
+ })
2132
+
2133
+ const Api = HttpApi.make("api").add(
2134
+ HttpApiGroup.make("group").add(
2135
+ HttpApiEndpoint.get("getUser", "/user/:id", {
2136
+ params: {
2137
+ id: Schema.Int
2138
+ },
2139
+ success: User
2140
+ })
2141
+ // Apply the middleware to a single endpoint
2142
+ .middleware(Logger)
2143
+ )
2144
+ // Or apply the middleware to the entire group
2145
+ .middleware(Logger)
2146
+ )
2147
+ const GroupLive = HttpApiBuilder.group(
2148
+ Api,
2149
+ "group",
2150
+ (handlers) =>
2151
+ handlers.handle("getUser", (ctx) => {
2152
+ const id = ctx.params.id
2153
+ return Effect.succeed({ id, name: `User ${id}` })
2154
+ })
2155
+ )
2156
+
2157
+ const LoggerLive = Layer.effect(
2158
+ Logger,
2159
+ Effect.gen(function*() {
2160
+ yield* Effect.log("creating Logger middleware")
2161
+
2162
+ return (res) =>
2163
+ Effect.gen(function*() {
2164
+ const request = yield* HttpServerRequest.HttpServerRequest
2165
+ yield* Effect.log(`Request: ${request.method} ${request.url}`)
2166
+ return yield* res
2167
+ })
2168
+ })
2169
+ )
2170
+
2171
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
2172
+ Layer.provide(GroupLive),
2173
+ Layer.provide(HttpApiScalar.layer(Api)),
2174
+ Layer.provide(LoggerLive),
2175
+ HttpRouter.serve,
2176
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
2177
+ )
2178
+
2179
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
2180
+
2181
+ // Test this with this curl command:
2182
+ // curl "http://localhost:3000/user/1"
2183
+ ```
2184
+
2185
+ # Security
2186
+
2187
+ The `HttpApiSecurity` module lets you declare how an endpoint is protected. These declarations show up in the generated OpenAPI spec and are enforced at runtime through middleware.
2188
+
2189
+ Supported authorization types:
2190
+
2191
+ | Authorization Type | Description |
2192
+ | ------------------------ | ---------------------------------------------------------------- |
2193
+ | `HttpApiSecurity.apiKey` | API key authorization via headers, query parameters, or cookies. |
2194
+ | `HttpApiSecurity.basic` | HTTP Basic authentication. |
2195
+ | `HttpApiSecurity.bearer` | Bearer token authentication. |
2196
+
2197
+ Attach a security scheme to an endpoint, group, or the entire API via `HttpApiMiddleware`.
2198
+
2199
+ **Example** (Defining Security Middleware)
2200
+
2201
+ ```ts
2202
+ import { Context, Schema } from "effect"
2203
+ import { HttpApi, HttpApiEndpoint, HttpApiGroup, HttpApiMiddleware, HttpApiSecurity } from "effect/unstable/httpapi"
2204
+
2205
+ // Define a schema for the "User"
2206
+ class User extends Schema.Class<User>("User")({ id: Schema.Finite }) {}
2207
+
2208
+ // Define a schema for the "Unauthorized" error
2209
+ class Unauthorized extends Schema.TaggedErrorClass<Unauthorized>()(
2210
+ "Unauthorized",
2211
+ {},
2212
+ // Specify the HTTP status code for unauthorized errors
2213
+ { httpApiStatus: 401 }
2214
+ ) {}
2215
+
2216
+ // Define a Context.Tag for the authenticated user
2217
+ class CurrentUser extends Context.Service<CurrentUser, User>()("CurrentUser") {}
2218
+
2219
+ // Create the Authorization middleware
2220
+ class Authorization extends HttpApiMiddleware.Service<Authorization, {
2221
+ // Specify the resource this middleware will provide
2222
+ provides: CurrentUser
2223
+ }>()(
2224
+ "Authorization",
2225
+ {
2226
+ // Define the error schema for unauthorized access
2227
+ error: Unauthorized,
2228
+ // Add security definitions
2229
+ security: {
2230
+ // ┌─── Custom name for the security definition
2231
+ // ▼
2232
+ myBearer: HttpApiSecurity.bearer
2233
+ // Additional security definitions can be added here.
2234
+ // They will attempt to be resolved in the order they are defined.
2235
+ }
2236
+ }
2237
+ ) {}
2238
+
2239
+ const api = HttpApi.make("api")
2240
+ .add(
2241
+ HttpApiGroup.make("group")
2242
+ .add(
2243
+ HttpApiEndpoint.get("get", "/", {
2244
+ success: Schema.String
2245
+ })
2246
+ // Apply the middleware to a single endpoint
2247
+ .middleware(Authorization)
2248
+ )
2249
+ // Or apply the middleware to the entire group
2250
+ .middleware(Authorization)
2251
+ )
2252
+ // Or apply the middleware to the entire API
2253
+ .middleware(Authorization)
2254
+ ```
2255
+
2256
+ ## Implementing HttpApiSecurity middleware
2257
+
2258
+ To enforce a security scheme, implement its middleware as a `Layer`. The layer returns an object with a handler for each security definition. Each handler receives the credential (e.g., a Bearer token as a `Redacted` value) and must return the resource the middleware provides (e.g., the current user).
2259
+
2260
+ **Example** (Implementing Bearer Token Authentication Middleware)
2261
+
2262
+ ```ts
2263
+ import { Context, Effect, Layer, Redacted, Schema } from "effect"
2264
+ import { HttpApiMiddleware, HttpApiSecurity } from "effect/unstable/httpapi"
2265
+
2266
+ class User extends Schema.Class<User>("User")({ id: Schema.Finite }) {}
2267
+
2268
+ class Unauthorized extends Schema.TaggedErrorClass<Unauthorized>()(
2269
+ "Unauthorized",
2270
+ {},
2271
+ // Specify the HTTP status code for unauthorized errors
2272
+ { httpApiStatus: 401 }
2273
+ ) {}
2274
+
2275
+ class CurrentUser extends Context.Service<CurrentUser, User>()("CurrentUser") {}
2276
+
2277
+ class Authorization extends HttpApiMiddleware.Service<Authorization, {
2278
+ provides: CurrentUser
2279
+ }>()(
2280
+ "Authorization",
2281
+ {
2282
+ error: Unauthorized,
2283
+ security: {
2284
+ myBearer: HttpApiSecurity.bearer
2285
+ }
2286
+ }
2287
+ ) {}
2288
+
2289
+ const AuthorizationLive = Layer.succeed(
2290
+ Authorization,
2291
+ // Return the security handlers for the middleware
2292
+ {
2293
+ // Define the handler for the Bearer token
2294
+ // The Bearer token is redacted for security
2295
+ myBearer: (effect, opts) =>
2296
+ Effect.provideServiceEffect(
2297
+ effect,
2298
+ CurrentUser,
2299
+ Effect.gen(function*() {
2300
+ yield* Effect.log(
2301
+ "checking bearer token",
2302
+ Redacted.value(opts.credential)
2303
+ )
2304
+ // Return a mock User object as the CurrentUser
2305
+ return new User({ id: 1 })
2306
+ })
2307
+ )
2308
+ }
2309
+ )
2310
+ ```
2311
+
2312
+ ## Adding Descriptions to Security Definitions
2313
+
2314
+ Use `HttpApiSecurity.annotate` to attach metadata — like a description — to a security definition. This metadata appears in the generated docs.
2315
+
2316
+ **Example** (Adding a Description to a Bearer Token Security Definition)
2317
+
2318
+ ```ts
2319
+ import { Context, Schema } from "effect"
2320
+ import { HttpApiMiddleware, HttpApiSecurity, OpenApi } from "effect/unstable/httpapi"
2321
+
2322
+ class User extends Schema.Class<User>("User")({ id: Schema.Finite }) {}
2323
+
2324
+ class Unauthorized extends Schema.TaggedErrorClass<Unauthorized>()(
2325
+ "Unauthorized",
2326
+ {},
2327
+ // Specify the HTTP status code for unauthorized errors
2328
+ { httpApiStatus: 401 }
2329
+ ) {}
2330
+
2331
+ class CurrentUser extends Context.Service<CurrentUser, User>()("CurrentUser") {}
2332
+
2333
+ class Authorization extends HttpApiMiddleware.Service<Authorization, {
2334
+ provides: CurrentUser
2335
+ }>()(
2336
+ "Authorization",
2337
+ {
2338
+ error: Unauthorized,
2339
+ security: {
2340
+ myBearer: HttpApiSecurity.bearer.pipe(
2341
+ // Add a description to the security definition
2342
+ HttpApiSecurity.annotate(OpenApi.Description, "my description")
2343
+ )
2344
+ }
2345
+ }
2346
+ ) {}
2347
+ ```
2348
+
2349
+ ## Setting HttpApiSecurity cookies
2350
+
2351
+ Use `HttpApiBuilder.securitySetCookie` to set a security cookie from a handler. The cookie is created with `HttpOnly` and `Secure` flags by default.
2352
+
2353
+ **Example** (Setting a Security Cookie in a Login Handler)
2354
+
2355
+ ```ts
2356
+ import { Redacted, Schema } from "effect"
2357
+ import { HttpApi, HttpApiBuilder, HttpApiEndpoint, HttpApiGroup, HttpApiSecurity } from "effect/unstable/httpapi"
2358
+
2359
+ const Api = HttpApi.make("MyApi")
2360
+ .add(
2361
+ HttpApiGroup.make("Users")
2362
+ .add(
2363
+ HttpApiEndpoint.get("login", "/login", {
2364
+ params: {
2365
+ success: Schema.String
2366
+ }
2367
+ })
2368
+ )
2369
+ )
2370
+
2371
+ // Define the security configuration for an API key stored in a cookie
2372
+ const security = HttpApiSecurity.apiKey({
2373
+ // Specify that the API key is stored in a cookie
2374
+ in: "cookie",
2375
+ // Define the cookie name,
2376
+ key: "token"
2377
+ })
2378
+
2379
+ const UsersApiLive = HttpApiBuilder.group(Api, "Users", (handlers) =>
2380
+ handlers.handle("login", () =>
2381
+ // Set the security cookie with a redacted value
2382
+ HttpApiBuilder.securitySetCookie(security, Redacted.make("keep me secret"))))
2383
+ ```
2384
+
2385
+ # Using Services Inside a HttpApiEndpoint
2386
+
2387
+ Handlers can access any Effect service. Because `HttpApiBuilder.group` returns an `Effect`, you can `yield*` services directly inside your handler logic.
2388
+
2389
+ **Example** (Using Services in a Endpoint Implementation)
2390
+
2391
+ ```ts
2392
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
2393
+ import { Context, Effect, Layer, Schema } from "effect"
2394
+ import { HttpRouter } from "effect/unstable/http"
2395
+ import { HttpApi, HttpApiBuilder, HttpApiEndpoint, HttpApiGroup, HttpApiScalar } from "effect/unstable/httpapi"
2396
+ import { createServer } from "node:http"
2397
+
2398
+ const User = Schema.Struct({
2399
+ id: Schema.Int,
2400
+ name: Schema.String
2401
+ })
2402
+
2403
+ // Define the UsersRepository service
2404
+ class UsersRepository extends Context.Service<UsersRepository, {
2405
+ readonly findById: (id: number) => Effect.Effect<typeof User.Type>
2406
+ }>()("UsersRepository") {}
2407
+
2408
+ const Api = HttpApi.make("MyApi")
2409
+ .add(
2410
+ HttpApiGroup.make("Users")
2411
+ .add(
2412
+ HttpApiEndpoint.get("getUser", "/user/:id", {
2413
+ params: {
2414
+ id: Schema.Int
2415
+ },
2416
+ success: User
2417
+ })
2418
+ )
2419
+ )
2420
+
2421
+ const GroupLive = HttpApiBuilder.group(
2422
+ Api,
2423
+ "Users",
2424
+ (handlers) =>
2425
+ handlers
2426
+ .handle("getUser", (ctx) => {
2427
+ const id = ctx.params.id
2428
+ return Effect.gen(function*() {
2429
+ // Access the UsersRepository service
2430
+ const repository = yield* UsersRepository
2431
+ return yield* repository.findById(id)
2432
+ })
2433
+ })
2434
+ )
2435
+
2436
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
2437
+ Layer.provide(GroupLive),
2438
+ Layer.provide(HttpApiScalar.layer(Api)),
2439
+ Layer.provide(
2440
+ Layer.succeed(UsersRepository, {
2441
+ findById: (id) => Effect.succeed({ id, name: `User ${id}` })
2442
+ })
2443
+ ),
2444
+ HttpRouter.serve,
2445
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
2446
+ )
2447
+
2448
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
2449
+ ```
2450
+
2451
+ # OpenAPI Documentation
2452
+
2453
+ Add interactive API documentation with `HttpApiScalar` (Scalar UI) or `HttpApiSwagger` (Swagger UI). Both read your API definition and generate a browsable docs page at `/docs`.
2454
+
2455
+ **Example** (Adding Scalar Documentation to an API)
2456
+
2457
+ ```ts
2458
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
2459
+ import { Effect, Layer, Schema } from "effect"
2460
+ import { HttpRouter } from "effect/unstable/http"
2461
+ import { HttpApi, HttpApiBuilder, HttpApiEndpoint, HttpApiGroup, HttpApiScalar } from "effect/unstable/httpapi"
2462
+ import { createServer } from "node:http"
2463
+
2464
+ const User = Schema.Struct({
2465
+ id: Schema.Int,
2466
+ name: Schema.String
2467
+ })
2468
+
2469
+ const IdParam = Schema.Int
2470
+
2471
+ const Api = HttpApi.make("MyApi")
2472
+ .add(
2473
+ HttpApiGroup.make("Users")
2474
+ .add(
2475
+ HttpApiEndpoint.get("getUsers", "/users", {
2476
+ success: Schema.Array(User)
2477
+ }),
2478
+ HttpApiEndpoint.get("getUser", "/user/:id", {
2479
+ params: {
2480
+ id: IdParam
2481
+ },
2482
+ success: User
2483
+ }),
2484
+ HttpApiEndpoint.post("createUser", "/user", {
2485
+ payload: User,
2486
+ success: User
2487
+ }),
2488
+ HttpApiEndpoint.delete("deleteUser", "/user/:id", {
2489
+ params: {
2490
+ id: IdParam
2491
+ }
2492
+ }),
2493
+ HttpApiEndpoint.patch("updateUser", "/user/:id", {
2494
+ params: {
2495
+ id: IdParam
2496
+ },
2497
+ // Specify the schema for the request payload
2498
+ payload: Schema.Struct({
2499
+ name: Schema.String // Only the name can be updated
2500
+ }),
2501
+ // Specify the schema for a successful response
2502
+ success: User
2503
+ })
2504
+ )
2505
+ )
2506
+
2507
+ const GroupLive = HttpApiBuilder.group(
2508
+ Api,
2509
+ "Users",
2510
+ (handlers) =>
2511
+ handlers
2512
+ .handle("getUsers", () =>
2513
+ Effect.succeed(
2514
+ [{ id: 1, name: "User 1" }, { id: 2, name: "User 2" }]
2515
+ ))
2516
+ .handle("getUser", (ctx) => {
2517
+ const id = ctx.params.id
2518
+ return Effect.succeed({ id, name: `User ${id}` })
2519
+ })
2520
+ .handle("createUser", (ctx) => {
2521
+ const user = ctx.payload
2522
+ return Effect.succeed(user)
2523
+ })
2524
+ .handle("deleteUser", (ctx) => {
2525
+ const id = ctx.params.id
2526
+ return Effect.log(`Deleting user ${id}`)
2527
+ })
2528
+ .handle("updateUser", (ctx) => {
2529
+ const id = ctx.params.id
2530
+ return Effect.succeed({ id, name: `User ${id}` })
2531
+ })
2532
+ )
2533
+
2534
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
2535
+ Layer.provide(GroupLive),
2536
+ Layer.provide(HttpApiScalar.layer(Api)), // "/docs" is the default path.
2537
+ HttpRouter.serve,
2538
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
2539
+ )
2540
+
2541
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
2542
+ ```
2543
+
2544
+ After running the server, open your browser and navigate to http://localhost:3000/docs.
2545
+
2546
+ This URL will display the Scalar documentation, allowing you to explore the API's endpoints, request parameters, and response structures interactively.
2547
+
2548
+ ## Adding OpenAPI Annotations
2549
+
2550
+ Annotations let you enrich the generated OpenAPI spec with titles, descriptions, server URLs, and more. They are added via the `.annotate` method on `HttpApi`, `HttpApiGroup`, or `HttpApiEndpoint`.
2551
+
2552
+ #### HttpApi
2553
+
2554
+ Below is a list of available annotations for a top-level `HttpApi`. They can be added using the `.annotate` method:
2555
+
2556
+ | Annotation | Description |
2557
+ | --------------------------- | ------------------------------------------------------------------------------------------------------------------ |
2558
+ | `HttpApi.AdditionalSchemas` | Adds custom schemas to the final OpenAPI specification. Only schemas with an `identifier` annotation are included. |
2559
+ | `OpenApi.Description` | Sets a general description for the API. |
2560
+ | `OpenApi.Title` | Sets the title of the API. |
2561
+ | `OpenApi.Version` | Sets the version of the API. |
2562
+ | `OpenApi.License` | Defines the license used by the API. |
2563
+ | `OpenApi.Summary` | Provides a brief summary of the API. |
2564
+ | `OpenApi.Servers` | Lists server URLs and optional metadata such as variables. |
2565
+ | `OpenApi.Override` | Merges the supplied fields into the resulting specification. |
2566
+ | `OpenApi.Transform` | Allows you to modify the final specification with a custom function. |
2567
+
2568
+ **Example** (Annotating the Top-Level API)
2569
+
2570
+ ```ts
2571
+ import { Schema } from "effect"
2572
+ import { HttpApi, OpenApi } from "effect/unstable/httpapi"
2573
+
2574
+ const api = HttpApi.make("api")
2575
+ // Provide additional schemas
2576
+ .annotate(HttpApi.AdditionalSchemas, [
2577
+ Schema.String.annotate({ identifier: "MyString" })
2578
+ ])
2579
+ // Add a description
2580
+ .annotate(OpenApi.Description, "my description")
2581
+ // Set license information
2582
+ .annotate(OpenApi.License, { name: "MIT", url: "http://example.com" })
2583
+ // Provide a summary
2584
+ .annotate(OpenApi.Summary, "my summary")
2585
+ // Define servers
2586
+ .annotate(OpenApi.Servers, [
2587
+ {
2588
+ url: "http://example.com",
2589
+ description: "example",
2590
+ variables: { a: { default: "b", enum: ["c"], description: "d" } }
2591
+ }
2592
+ ])
2593
+ // Override parts of the generated specification
2594
+ .annotate(OpenApi.Override, {
2595
+ tags: [{ name: "a", description: "a-description" }]
2596
+ })
2597
+ // Apply a transform function to the final specification
2598
+ .annotate(OpenApi.Transform, (spec) => ({
2599
+ ...spec,
2600
+ tags: [...spec.tags, { name: "b", description: "b-description" }]
2601
+ }))
2602
+
2603
+ // Generate the OpenAPI specification from the annotated API
2604
+ const spec = OpenApi.fromApi(api)
2605
+
2606
+ console.log(JSON.stringify(spec, null, 2))
2607
+ /*
2608
+ Output:
2609
+ {
2610
+ "openapi": "3.1.0",
2611
+ "info": {
2612
+ "title": "Api",
2613
+ "version": "0.0.1",
2614
+ "description": "my description",
2615
+ "license": {
2616
+ "name": "MIT",
2617
+ "url": "http://example.com"
2618
+ },
2619
+ "summary": "my summary"
2620
+ },
2621
+ "paths": {},
2622
+ "components": {
2623
+ "schemas": {
2624
+ "MyString": {
2625
+ "type": "string"
2626
+ }
2627
+ },
2628
+ "securitySchemes": {}
2629
+ },
2630
+ "security": [],
2631
+ "tags": [
2632
+ {
2633
+ "name": "a",
2634
+ "description": "a-description"
2635
+ },
2636
+ {
2637
+ "name": "b",
2638
+ "description": "b-description"
2639
+ }
2640
+ ],
2641
+ "servers": [
2642
+ {
2643
+ "url": "http://example.com",
2644
+ "description": "example",
2645
+ "variables": {
2646
+ "a": {
2647
+ "default": "b",
2648
+ "enum": [
2649
+ "c"
2650
+ ],
2651
+ "description": "d"
2652
+ }
2653
+ }
2654
+ }
2655
+ ]
2656
+ }
2657
+ */
2658
+ ```
2659
+
2660
+ #### HttpApiGroup
2661
+
2662
+ The following annotations can be added to an `HttpApiGroup`:
2663
+
2664
+ | Annotation | Description |
2665
+ | ---------------------- | --------------------------------------------------------------------- |
2666
+ | `OpenApi.Description` | Sets a description for this group. |
2667
+ | `OpenApi.ExternalDocs` | Provides external documentation links for the group. |
2668
+ | `OpenApi.Override` | Merges specified fields into the resulting specification. |
2669
+ | `OpenApi.Transform` | Lets you modify the final group specification with a custom function. |
2670
+ | `OpenApi.Exclude` | Excludes the group from the final OpenAPI specification. |
2671
+
2672
+ **Example** (Annotating a Group)
2673
+
2674
+ ```ts
2675
+ import { HttpApi, HttpApiGroup, OpenApi } from "effect/unstable/httpapi"
2676
+
2677
+ const api = HttpApi.make("api")
2678
+ .add(
2679
+ HttpApiGroup.make("group")
2680
+ // Add a description for the group
2681
+ .annotate(OpenApi.Description, "my description")
2682
+ // Provide external documentation links
2683
+ .annotate(OpenApi.ExternalDocs, {
2684
+ url: "http://example.com",
2685
+ description: "example"
2686
+ })
2687
+ // Override parts of the final output
2688
+ .annotate(OpenApi.Override, { name: "my name" })
2689
+ // Transform the final specification for this group
2690
+ .annotate(OpenApi.Transform, (spec) => ({
2691
+ ...spec,
2692
+ name: spec.name + "-transformed"
2693
+ }))
2694
+ )
2695
+ .add(
2696
+ HttpApiGroup.make("excluded")
2697
+ // Exclude the group from the final specification
2698
+ .annotate(OpenApi.Exclude, true)
2699
+ )
2700
+
2701
+ // Generate the OpenAPI spec
2702
+ const spec = OpenApi.fromApi(api)
2703
+
2704
+ console.log(JSON.stringify(spec, null, 2))
2705
+ /*
2706
+ Output:
2707
+ {
2708
+ "openapi": "3.1.0",
2709
+ "info": {
2710
+ "title": "Api",
2711
+ "version": "0.0.1"
2712
+ },
2713
+ "paths": {},
2714
+ "components": {
2715
+ "schemas": {},
2716
+ "securitySchemes": {}
2717
+ },
2718
+ "security": [],
2719
+ "tags": [
2720
+ {
2721
+ "name": "my name-transformed",
2722
+ "description": "my description",
2723
+ "externalDocs": {
2724
+ "url": "http://example.com",
2725
+ "description": "example"
2726
+ }
2727
+ }
2728
+ ]
2729
+ }
2730
+ */
2731
+ ```
2732
+
2733
+ #### HttpApiEndpoint
2734
+
2735
+ For an `HttpApiEndpoint`, you can use the following annotations:
2736
+
2737
+ | Annotation | Description |
2738
+ | ---------------------- | --------------------------------------------------------------------------- |
2739
+ | `OpenApi.Description` | Adds a description for this endpoint. |
2740
+ | `OpenApi.Summary` | Provides a short summary of the endpoint's purpose. |
2741
+ | `OpenApi.Deprecated` | Marks the endpoint as deprecated. |
2742
+ | `OpenApi.ExternalDocs` | Supplies external documentation links for the endpoint. |
2743
+ | `OpenApi.Override` | Merges specified fields into the resulting specification for this endpoint. |
2744
+ | `OpenApi.Transform` | Lets you modify the final endpoint specification with a custom function. |
2745
+ | `OpenApi.Exclude` | Excludes the endpoint from the final OpenAPI specification. |
2746
+
2747
+ **Example** (Annotating an Endpoint)
2748
+
2749
+ ```ts
2750
+ import { Schema } from "effect"
2751
+ import { HttpApi, HttpApiEndpoint, HttpApiGroup, OpenApi } from "effect/unstable/httpapi"
2752
+
2753
+ const api = HttpApi.make("api").add(
2754
+ HttpApiGroup.make("group")
2755
+ .add(
2756
+ HttpApiEndpoint.get("get", "/", {
2757
+ success: Schema.String
2758
+ })
2759
+ // Add a description
2760
+ .annotate(OpenApi.Description, "my description")
2761
+ // Provide a summary
2762
+ .annotate(OpenApi.Summary, "my summary")
2763
+ // Mark the endpoint as deprecated
2764
+ .annotate(OpenApi.Deprecated, true)
2765
+ // Provide external documentation
2766
+ .annotate(OpenApi.ExternalDocs, {
2767
+ url: "http://example.com",
2768
+ description: "example"
2769
+ })
2770
+ )
2771
+ .add(
2772
+ HttpApiEndpoint.get("excluded", "/excluded", {
2773
+ success: Schema.String
2774
+ })
2775
+ // Exclude this endpoint from the final specification
2776
+ .annotate(OpenApi.Exclude, true)
2777
+ )
2778
+ )
2779
+
2780
+ // Generate the OpenAPI spec
2781
+ const spec = OpenApi.fromApi(api)
2782
+
2783
+ console.log(JSON.stringify(spec, null, 2))
2784
+ /*
2785
+ Output:
2786
+ {
2787
+ "openapi": "3.1.0",
2788
+ "info": {
2789
+ "title": "Api",
2790
+ "version": "0.0.1"
2791
+ },
2792
+ "paths": {
2793
+ "/": {
2794
+ "get": {
2795
+ "tags": [
2796
+ "group"
2797
+ ],
2798
+ "operationId": "group.get",
2799
+ "parameters": [],
2800
+ "security": [],
2801
+ "responses": {
2802
+ "200": {
2803
+ "description": "Success",
2804
+ "content": {
2805
+ "application/json": {
2806
+ "schema": {
2807
+ "$ref": "#/components/schemas/String_"
2808
+ }
2809
+ }
2810
+ }
2811
+ },
2812
+ "400": {
2813
+ "description": "The request or response did not match the expected schema",
2814
+ "content": {
2815
+ "application/json": {
2816
+ "schema": {
2817
+ "type": "object",
2818
+ "properties": {
2819
+ "_tag": {
2820
+ "type": "string",
2821
+ "enum": [
2822
+ "HttpApiSchemaError"
2823
+ ]
2824
+ },
2825
+ "message": {
2826
+ "$ref": "#/components/schemas/String_"
2827
+ }
2828
+ },
2829
+ "required": [
2830
+ "_tag",
2831
+ "message"
2832
+ ],
2833
+ "additionalProperties": false
2834
+ }
2835
+ }
2836
+ }
2837
+ }
2838
+ },
2839
+ "description": "my description",
2840
+ "summary": "my summary",
2841
+ "deprecated": true,
2842
+ "externalDocs": {
2843
+ "url": "http://example.com",
2844
+ "description": "example"
2845
+ }
2846
+ }
2847
+ }
2848
+ },
2849
+ "components": {
2850
+ "schemas": {
2851
+ "String_": {
2852
+ "type": "string"
2853
+ }
2854
+ },
2855
+ "securitySchemes": {}
2856
+ },
2857
+ "security": [],
2858
+ "tags": [
2859
+ {
2860
+ "name": "group"
2861
+ }
2862
+ ]
2863
+ }
2864
+ */
2865
+ ```
2866
+
2867
+ The default response description is "Success". You can override this by annotating the schema.
2868
+
2869
+ **Example** (Defining a custom response description)
2870
+
2871
+ ```ts
2872
+ import { Schema } from "effect"
2873
+ import { HttpApi, HttpApiEndpoint, HttpApiGroup, OpenApi } from "effect/unstable/httpapi"
2874
+
2875
+ const User = Schema.Struct({
2876
+ id: Schema.Finite,
2877
+ name: Schema.String
2878
+ }).annotate({ identifier: "User" })
2879
+
2880
+ const api = HttpApi.make("api").add(
2881
+ HttpApiGroup.make("group").add(
2882
+ HttpApiEndpoint.get("getUsers", "/users", {
2883
+ success: Schema.Array(User).annotate({
2884
+ description: "Returns an array of users"
2885
+ })
2886
+ })
2887
+ )
2888
+ )
2889
+
2890
+ const spec = OpenApi.fromApi(api)
2891
+
2892
+ console.log(JSON.stringify(spec.paths, null, 2))
2893
+ /*
2894
+ Output:
2895
+ {
2896
+ "/users": {
2897
+ "get": {
2898
+ "tags": [
2899
+ "group"
2900
+ ],
2901
+ "operationId": "group.getUsers",
2902
+ "parameters": [],
2903
+ "security": [],
2904
+ "responses": {
2905
+ "200": {
2906
+ "description": "Returns an array of users",
2907
+ "content": {
2908
+ "application/json": {
2909
+ "schema": {
2910
+ "type": "array",
2911
+ "items": {
2912
+ "type": "object",
2913
+ "properties": {
2914
+ "id": {
2915
+ "type": "number"
2916
+ },
2917
+ "name": {
2918
+ "$ref": "#/components/schemas/String_"
2919
+ }
2920
+ },
2921
+ "required": [
2922
+ "id",
2923
+ "name"
2924
+ ],
2925
+ "additionalProperties": false
2926
+ },
2927
+ "description": "Returns an array of users"
2928
+ }
2929
+ }
2930
+ }
2931
+ },
2932
+ "400": {
2933
+ "description": "The request or response did not match the expected schema",
2934
+ "content": {
2935
+ "application/json": {
2936
+ "schema": {
2937
+ "type": "object",
2938
+ "properties": {
2939
+ "_tag": {
2940
+ "type": "string",
2941
+ "enum": [
2942
+ "HttpApiSchemaError"
2943
+ ]
2944
+ },
2945
+ "message": {
2946
+ "$ref": "#/components/schemas/String_"
2947
+ }
2948
+ },
2949
+ "required": [
2950
+ "_tag",
2951
+ "message"
2952
+ ],
2953
+ "additionalProperties": false
2954
+ }
2955
+ }
2956
+ }
2957
+ }
2958
+ }
2959
+ }
2960
+ }
2961
+ }
2962
+ */
2963
+ ```
2964
+
2965
+ ## Top Level Groups
2966
+
2967
+ When a group is `topLevel`, its name is not prepended to operation IDs in the OpenAPI spec. Use this when the group is just for tagging and you want shorter, cleaner operation IDs.
2968
+
2969
+ **Example** (Using a Top-Level Group)
2970
+
2971
+ ```ts
2972
+ import { Schema } from "effect"
2973
+ import { HttpApi, HttpApiEndpoint, HttpApiGroup, OpenApi } from "effect/unstable/httpapi"
2974
+
2975
+ const api = HttpApi.make("api").add(
2976
+ // Mark the group as top-level
2977
+ HttpApiGroup.make("group", { topLevel: true }).add(
2978
+ HttpApiEndpoint.get("get", "/", {
2979
+ success: Schema.String
2980
+ })
2981
+ )
2982
+ )
2983
+
2984
+ // Generate the OpenAPI spec
2985
+ const spec = OpenApi.fromApi(api)
2986
+
2987
+ console.log(JSON.stringify(spec.paths, null, 2))
2988
+ /*
2989
+ Output:
2990
+ {
2991
+ "/": {
2992
+ "get": { // The operation ID is not prefixed with "group"
2993
+ "tags": [
2994
+ "group"
2995
+ ],
2996
+ "operationId": "get",
2997
+ "parameters": [],
2998
+ "security": [],
2999
+ "responses": {
3000
+ "200": {
3001
+ "description": "Success",
3002
+ "content": {
3003
+ "application/json": {
3004
+ "schema": {
3005
+ "$ref": "#/components/schemas/String_"
3006
+ }
3007
+ }
3008
+ }
3009
+ },
3010
+ "400": {
3011
+ "description": "The request or response did not match the expected schema",
3012
+ "content": {
3013
+ "application/json": {
3014
+ "schema": {
3015
+ "type": "object",
3016
+ "properties": {
3017
+ "_tag": {
3018
+ "type": "string",
3019
+ "enum": [
3020
+ "HttpApiSchemaError"
3021
+ ]
3022
+ },
3023
+ "message": {
3024
+ "$ref": "#/components/schemas/String_"
3025
+ }
3026
+ },
3027
+ "required": [
3028
+ "_tag",
3029
+ "message"
3030
+ ],
3031
+ "additionalProperties": false
3032
+ }
3033
+ }
3034
+ }
3035
+ }
3036
+ }
3037
+ }
3038
+ }
3039
+ }
3040
+ */
3041
+ ```
3042
+
3043
+ # Deriving a Client
3044
+
3045
+ The `HttpApiClient` module generates a fully typed client from your API definition. Each endpoint becomes a method — grouped by `HttpApiGroup` name — so calling your API is as simple as calling a function.
3046
+
3047
+ **Example** (Deriving and Using a Client)
3048
+
3049
+ ```ts
3050
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
3051
+ import { Effect, Layer, Schema } from "effect"
3052
+ import { HttpRouter } from "effect/unstable/http"
3053
+ import { FetchHttpClient } from "effect/unstable/http"
3054
+ import { HttpApi, HttpApiBuilder, HttpApiClient, HttpApiEndpoint, HttpApiGroup } from "effect/unstable/httpapi"
3055
+ import { createServer } from "node:http"
3056
+
3057
+ const Api = HttpApi.make("MyApi")
3058
+ .add(
3059
+ HttpApiGroup.make("Greetings")
3060
+ .add(
3061
+ HttpApiEndpoint.get("hello", "/", {
3062
+ success: Schema.String
3063
+ })
3064
+ )
3065
+ )
3066
+
3067
+ const GroupLive = HttpApiBuilder.group(
3068
+ Api,
3069
+ "Greetings",
3070
+ (handlers) => handlers.handle("hello", () => Effect.succeed("Hello, World!"))
3071
+ )
3072
+
3073
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
3074
+ Layer.provide(GroupLive),
3075
+ HttpRouter.serve,
3076
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
3077
+ )
3078
+
3079
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
3080
+
3081
+ // Create a program that derives and uses the client
3082
+ const program = Effect.gen(function*() {
3083
+ // Derive the client
3084
+ const client = yield* HttpApiClient.make(Api, {
3085
+ baseUrl: "http://localhost:3000"
3086
+ })
3087
+ // Call the "hello-world" endpoint
3088
+ const hello = yield* client.Greetings.hello()
3089
+ console.log(hello)
3090
+ })
3091
+
3092
+ // Provide a Fetch-based HTTP client and run the program
3093
+ Effect.runFork(program.pipe(Effect.provide(FetchHttpClient.layer)))
3094
+ /*
3095
+ Output:
3096
+ [18:55:26.051] INFO (#2): Listening on http://0.0.0.0:3000
3097
+ [18:55:26.057] INFO (#12) http.span=2ms: Sent HTTP response { 'http.method': 'GET', 'http.url': '/', 'http.status': 200 }
3098
+ Hello, World!
3099
+ */
3100
+ ```
3101
+
3102
+ ## Top Level Groups
3103
+
3104
+ When a group is `topLevel`, its endpoints are exposed as top-level methods on the client instead of being nested under the group name.
3105
+
3106
+ **Example** (Using a Top-Level Group in the Client)
3107
+
3108
+ ```ts
3109
+ import { NodeHttpServer, NodeRuntime } from "@effect/platform-node"
3110
+ import { Effect, Layer, Schema } from "effect"
3111
+ import { HttpRouter } from "effect/unstable/http"
3112
+ import { FetchHttpClient } from "effect/unstable/http"
3113
+ import { HttpApi, HttpApiBuilder, HttpApiClient, HttpApiEndpoint, HttpApiGroup } from "effect/unstable/httpapi"
3114
+ import { createServer } from "node:http"
3115
+
3116
+ const Api = HttpApi.make("MyApi")
3117
+ .add(
3118
+ HttpApiGroup.make("Greetings", { topLevel: true })
3119
+ .add(
3120
+ HttpApiEndpoint.get("hello", "/", {
3121
+ success: Schema.String
3122
+ })
3123
+ )
3124
+ )
3125
+
3126
+ const GroupLive = HttpApiBuilder.group(
3127
+ Api,
3128
+ "Greetings",
3129
+ (handlers) => handlers.handle("hello", () => Effect.succeed("Hello, World!"))
3130
+ )
3131
+
3132
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
3133
+ Layer.provide(GroupLive),
3134
+ HttpRouter.serve,
3135
+ Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 }))
3136
+ )
3137
+
3138
+ Layer.launch(ApiLive).pipe(NodeRuntime.runMain)
3139
+
3140
+ const program = Effect.gen(function*() {
3141
+ const client = yield* HttpApiClient.make(Api, {
3142
+ baseUrl: "http://localhost:3000"
3143
+ })
3144
+ // The `hello` method is not nested under the "group" name
3145
+ const hello = yield* client.hello()
3146
+ console.log(hello)
3147
+ })
3148
+
3149
+ Effect.runFork(program.pipe(Effect.provide(FetchHttpClient.layer)))
3150
+ ```
3151
+
3152
+ # Converting to a Web Handler
3153
+
3154
+ If you need to plug your API into an existing HTTP server (instead of using `NodeHttpServer`), convert it to a standard web handler with `HttpApiBuilder.toWebHandler`. The returned `handler` function takes a `Request` and returns a `Response`.
3155
+
3156
+ **Example** (Creating and Serving a Web Handler)
3157
+
3158
+ ```ts
3159
+ import { Effect, Layer, Schema } from "effect"
3160
+ import { HttpRouter, HttpServer } from "effect/unstable/http"
3161
+ import { HttpApi, HttpApiBuilder, HttpApiEndpoint, HttpApiGroup, HttpApiScalar } from "effect/unstable/httpapi"
3162
+ import * as http from "node:http"
3163
+
3164
+ const Api = HttpApi.make("myApi").add(
3165
+ HttpApiGroup.make("group").add(
3166
+ HttpApiEndpoint.get("get", "/", {
3167
+ success: Schema.String
3168
+ })
3169
+ )
3170
+ )
3171
+
3172
+ const GroupLive = HttpApiBuilder.group(
3173
+ Api,
3174
+ "group",
3175
+ (handlers) => handlers.handle("get", () => Effect.succeed("Hello, world!"))
3176
+ )
3177
+
3178
+ const ApiLive = HttpApiBuilder.layer(Api).pipe(
3179
+ Layer.provide(GroupLive),
3180
+ Layer.provide(HttpApiScalar.layer(Api)),
3181
+ Layer.provide(HttpServer.layerServices)
3182
+ )
3183
+
3184
+ // Convert the API to a web handler
3185
+ const { dispose, handler } = HttpRouter.toWebHandler(
3186
+ Layer.mergeAll(ApiLive)
3187
+ )
3188
+
3189
+ // Serving the handler using a custom HTTP server
3190
+ http
3191
+ .createServer(async (req, res) => {
3192
+ const url = `http://${req.headers.host}${req.url}`
3193
+ const init: RequestInit = {
3194
+ method: req.method!
3195
+ }
3196
+
3197
+ const response = await handler(new Request(url, init))
3198
+
3199
+ res.writeHead(
3200
+ response.status,
3201
+ response.statusText,
3202
+ Object.fromEntries(response.headers.entries())
3203
+ )
3204
+ const responseBody = await response.arrayBuffer()
3205
+ res.end(Buffer.from(responseBody))
3206
+ })
3207
+ .listen(3000, () => {
3208
+ console.log("Server running at http://localhost:3000/")
3209
+ })
3210
+ .on("close", () => {
3211
+ dispose()
3212
+ })
3213
+ ```