@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,3303 @@
1
+ /*
2
+ AI prompt for writing Effect public API JSDoc:
3
+
4
+ This package owns Effect public API JSDoc parsing, extraction, and model generation.
5
+ */
6
+
7
+ import * as Effect from "effect/Effect"
8
+ import { globSync } from "glob"
9
+ import * as crypto from "node:crypto"
10
+ import * as fs from "node:fs"
11
+ import * as path from "node:path"
12
+ import * as ts from "typescript"
13
+
14
+ type ExportBucket = "value" | "type"
15
+ type DocScope = "module" | "declaration" | "namespace" | "namespace-declaration" | "member"
16
+
17
+ type Result<A, E> =
18
+ | { readonly _tag: "Success"; readonly value: A }
19
+ | { readonly _tag: "Failure"; readonly error: E }
20
+
21
+ interface SourceFileWithParseDiagnostics extends ts.SourceFile {
22
+ readonly parseDiagnostics: ReadonlyArray<ts.Diagnostic>
23
+ }
24
+
25
+ /**
26
+ * Result type returned by the JSDoc parser helpers.
27
+ *
28
+ * @category utility types
29
+ * @since 4.0.0
30
+ */
31
+ export type JSDocResult<A, E> = Result<A, E>
32
+
33
+ /**
34
+ * Diagnostic emitted when a JSDoc block does not follow the standard shape.
35
+ *
36
+ * @category models
37
+ * @since 4.0.0
38
+ */
39
+ export interface JSDocDiagnostic {
40
+ readonly code: string
41
+ readonly message: string
42
+ }
43
+
44
+ /**
45
+ * Parse error containing all diagnostics collected for a JSDoc block or file.
46
+ *
47
+ * @category models
48
+ * @since 4.0.0
49
+ */
50
+ export interface JSDocParseError {
51
+ readonly diagnostics: ReadonlyArray<JSDocDiagnostic>
52
+ }
53
+
54
+ /**
55
+ * Parsed `@see` tag text and any inline links it contains.
56
+ *
57
+ * @category models
58
+ * @since 4.0.0
59
+ */
60
+ export interface ParsedSeeTag {
61
+ readonly text: string
62
+ readonly links: ReadonlyArray<ParsedInlineLink>
63
+ }
64
+
65
+ /**
66
+ * TypeScript symbol target resolved for a parsed inline JSDoc link.
67
+ *
68
+ * @category models
69
+ * @since 4.0.0
70
+ */
71
+ export interface ParsedInlineLinkSymbol {
72
+ readonly file: string
73
+ readonly range: readonly [number, number]
74
+ }
75
+
76
+ /**
77
+ * Parsed inline JSDoc link target and optional display text.
78
+ *
79
+ * @category models
80
+ * @since 4.0.0
81
+ */
82
+ export interface ParsedInlineLink {
83
+ readonly raw: string
84
+ readonly target: string
85
+ readonly text: string | null
86
+ readonly range?: readonly [number, number]
87
+ readonly symbol?: ParsedInlineLinkSymbol
88
+ }
89
+
90
+ /**
91
+ * Parsed JSDoc description sections.
92
+ *
93
+ * @category models
94
+ * @since 4.0.0
95
+ */
96
+ export interface ParsedDescription {
97
+ readonly short: string
98
+ readonly whenToUse: string | null
99
+ readonly details: string | null
100
+ readonly gotchas: string | null
101
+ }
102
+
103
+ /**
104
+ * Parsed example section from a JSDoc block.
105
+ *
106
+ * @category models
107
+ * @since 4.0.0
108
+ */
109
+ export interface ParsedExample {
110
+ readonly title: string
111
+ readonly body: string | null
112
+ readonly code: string
113
+ }
114
+
115
+ /**
116
+ * Raw module-level JSDoc block collected from the top of a checked file.
117
+ *
118
+ * @category models
119
+ * @since 4.0.0
120
+ */
121
+ export interface ParsedModuleJSDoc {
122
+ readonly raw: string
123
+ readonly range: readonly [number, number]
124
+ }
125
+
126
+ interface ParsedModuleTags {
127
+ readonly since: string
128
+ readonly deprecated: string | null
129
+ readonly see: ReadonlyArray<ParsedSeeTag>
130
+ }
131
+
132
+ /**
133
+ * Parsed tags required for a root public declaration.
134
+ *
135
+ * @category models
136
+ * @since 4.0.0
137
+ */
138
+ export interface ParsedDeclarationTags {
139
+ readonly category: string
140
+ readonly since: string
141
+ readonly deprecated: string | null
142
+ readonly see: ReadonlyArray<ParsedSeeTag>
143
+ }
144
+
145
+ /**
146
+ * Parsed tags allowed for namespace JSDoc.
147
+ *
148
+ * @category models
149
+ * @since 4.0.0
150
+ */
151
+ export interface ParsedNamespaceTags {
152
+ readonly category: string | null
153
+ readonly since: string
154
+ readonly deprecated: string | null
155
+ readonly see: ReadonlyArray<ParsedSeeTag>
156
+ }
157
+
158
+ /**
159
+ * Parsed tags allowed for documented members.
160
+ *
161
+ * @category models
162
+ * @since 4.0.0
163
+ */
164
+ export interface ParsedMemberTags {
165
+ readonly since: string | null
166
+ readonly default: string | null
167
+ readonly deprecated: string | null
168
+ readonly see: ReadonlyArray<ParsedSeeTag>
169
+ }
170
+
171
+ /**
172
+ * Parsed documented member within a declaration or another member.
173
+ *
174
+ * @category models
175
+ * @since 4.0.0
176
+ */
177
+ export interface ParsedMember {
178
+ readonly name: string
179
+ readonly signature: string | null
180
+ readonly range: readonly [number, number]
181
+ readonly description: ParsedDescription
182
+ readonly examples: ReadonlyArray<ParsedExample>
183
+ readonly tags: ParsedMemberTags
184
+ readonly members: ReadonlyArray<ParsedMember>
185
+ }
186
+
187
+ /**
188
+ * Parsed root declaration exported from a checked file.
189
+ *
190
+ * @category models
191
+ * @since 4.0.0
192
+ */
193
+ export interface ParsedRootDeclaration {
194
+ readonly name: string
195
+ readonly bucket: ExportBucket
196
+ readonly signature: string | null
197
+ readonly range: readonly [number, number]
198
+ readonly description: ParsedDescription
199
+ readonly examples: ReadonlyArray<ParsedExample>
200
+ readonly tags: ParsedDeclarationTags
201
+ readonly members: ReadonlyArray<ParsedMember>
202
+ }
203
+
204
+ /**
205
+ * Parsed type declaration exported from inside a namespace.
206
+ *
207
+ * @category models
208
+ * @since 4.0.0
209
+ */
210
+ export interface ParsedNamespaceDeclaration {
211
+ readonly name: string
212
+ readonly signature: string | null
213
+ readonly range: readonly [number, number]
214
+ readonly description: ParsedDescription
215
+ readonly examples: ReadonlyArray<ParsedExample>
216
+ readonly tags: ParsedNamespaceTags
217
+ readonly members: ReadonlyArray<ParsedMember>
218
+ }
219
+
220
+ /**
221
+ * Parsed namespace and its documented exported type declarations.
222
+ *
223
+ * @category models
224
+ * @since 4.0.0
225
+ */
226
+ export interface ParsedNamespace {
227
+ readonly name: string
228
+ readonly signature: string | null
229
+ readonly range: readonly [number, number]
230
+ readonly description: ParsedDescription
231
+ readonly examples: ReadonlyArray<ParsedExample>
232
+ readonly tags: ParsedNamespaceTags
233
+ readonly declarations: ReadonlyArray<ParsedNamespaceDeclaration>
234
+ readonly namespaces: ReadonlyArray<ParsedNamespace>
235
+ }
236
+
237
+ /**
238
+ * Parsed public JSDoc data collected from one checked file.
239
+ *
240
+ * @category models
241
+ * @since 4.0.0
242
+ */
243
+ export interface ParsedJSDocFile {
244
+ readonly moduleJSDoc?: ParsedModuleJSDoc
245
+ readonly declarations: ReadonlyArray<ParsedRootDeclaration>
246
+ readonly namespaces: ReadonlyArray<ParsedNamespace>
247
+ }
248
+
249
+ /**
250
+ * Barrel import metadata for a public module included in the JSDoc dump.
251
+ *
252
+ * @category models
253
+ * @since 4.0.0
254
+ */
255
+ export type ParsedJSDocBarrelImport =
256
+ | {
257
+ readonly type: "namespace"
258
+ readonly module: string
259
+ readonly name: string
260
+ }
261
+ | {
262
+ readonly type: "flat"
263
+ readonly module: string
264
+ }
265
+
266
+ /**
267
+ * Import specifiers for a public module included in the JSDoc dump.
268
+ *
269
+ * @category models
270
+ * @since 4.0.0
271
+ */
272
+ export interface ParsedJSDocImports {
273
+ readonly module: string
274
+ readonly barrel: ParsedJSDocBarrelImport | null
275
+ readonly flatNames: ReadonlyArray<string>
276
+ }
277
+
278
+ export type JSDocApiKind = "root-declaration" | "namespace" | "namespace-declaration" | "member"
279
+
280
+ export type JSDocApiImportGuidance =
281
+ | {
282
+ readonly style: "namespace-barrel"
283
+ readonly importDeclaration: string
284
+ readonly usage: string
285
+ }
286
+ | {
287
+ readonly style: "named-barrel"
288
+ readonly importDeclaration: string
289
+ readonly usage: string
290
+ }
291
+ | {
292
+ readonly style: "named-module"
293
+ readonly importDeclaration: string
294
+ readonly usage: string
295
+ }
296
+
297
+ export type JSDocApiSeeLinkResolution =
298
+ | {
299
+ readonly _tag: "Resolved"
300
+ readonly apiId: string
301
+ readonly apiFqn: string
302
+ }
303
+ | {
304
+ readonly _tag: "Unresolved"
305
+ readonly reason: "not-found" | "ambiguous"
306
+ readonly candidates: ReadonlyArray<string>
307
+ }
308
+
309
+ export interface JSDocApiSeeLink extends ParsedInlineLink {
310
+ readonly resolution: JSDocApiSeeLinkResolution
311
+ }
312
+
313
+ export interface JSDocApiSeeTag {
314
+ readonly text: string
315
+ readonly links: ReadonlyArray<JSDocApiSeeLink>
316
+ }
317
+
318
+ export interface JSDocApiTags {
319
+ readonly category: string | null
320
+ readonly since: string | null
321
+ readonly deprecated: string | null
322
+ readonly default: string | null
323
+ }
324
+
325
+ export interface JSDocApi {
326
+ readonly id: string
327
+ readonly kind: JSDocApiKind
328
+ readonly moduleName: string
329
+ readonly apiName: string
330
+ readonly localName: string
331
+ readonly signature: string | null
332
+ readonly parentApiName: string | null
333
+ readonly apiFqn: string
334
+ readonly hasFqnCollision: boolean
335
+ readonly bucket: ExportBucket | null
336
+ readonly importable: boolean
337
+ readonly namespacePath: ReadonlyArray<string>
338
+ readonly memberPath: ReadonlyArray<string>
339
+ readonly source: {
340
+ readonly file: string
341
+ readonly path: ReadonlyArray<string | number>
342
+ readonly range: readonly [number, number]
343
+ }
344
+ readonly description: ParsedDescription
345
+ readonly examples: ReadonlyArray<ParsedExample>
346
+ readonly tags: JSDocApiTags
347
+ readonly see: ReadonlyArray<JSDocApiSeeTag>
348
+ readonly importGuidance: JSDocApiImportGuidance | null
349
+ }
350
+
351
+ interface ParsedBarrelExports {
352
+ readonly namespace: ReadonlyMap<string, string>
353
+ readonly flat: ReadonlySet<string>
354
+ readonly named: ReadonlyMap<string, ReadonlySet<string>>
355
+ }
356
+
357
+ /**
358
+ * Parsed public JSDoc data paired with the normalized source file path.
359
+ *
360
+ * @category models
361
+ * @since 4.0.0
362
+ */
363
+ export interface ParsedJSDocFileDumpEntry extends ParsedJSDocFile {
364
+ readonly file: string
365
+ readonly imports: ParsedJSDocImports
366
+ }
367
+
368
+ interface AstNode {
369
+ readonly type: string
370
+ readonly range: [number, number]
371
+ readonly [key: string]: any
372
+ }
373
+
374
+ interface JSDocTag {
375
+ readonly name: string
376
+ value: string
377
+ readonly line: number
378
+ }
379
+
380
+ interface JSDocBlock {
381
+ readonly range: [number, number]
382
+ readonly raw: string
383
+ readonly lines: Array<string>
384
+ readonly tags: Array<JSDocTag>
385
+ readonly parsed?: ParsedCoreJSDoc
386
+ readonly diagnostics: Array<JSDocDiagnostic>
387
+ readonly internal: boolean
388
+ }
389
+
390
+ interface ParsedCoreJSDoc {
391
+ readonly description: ParsedDescription
392
+ readonly examples: ReadonlyArray<ParsedExample>
393
+ readonly tags: ReadonlyArray<JSDocTag>
394
+ }
395
+
396
+ interface ProgramCacheEntry {
397
+ readonly program?: ts.Program
398
+ readonly error?: string
399
+ reported: boolean
400
+ }
401
+
402
+ interface PackageMetadata {
403
+ readonly root: string
404
+ readonly sourceRoot: string
405
+ readonly name: string
406
+ readonly exports: unknown
407
+ }
408
+
409
+ interface PackageExportMatch {
410
+ readonly key: string
411
+ readonly value: unknown
412
+ readonly star: string | null
413
+ readonly specificity: number
414
+ readonly prefixLength: number
415
+ }
416
+
417
+ interface ParsedConfigResult {
418
+ readonly parsed?: ts.ParsedCommandLine
419
+ readonly error?: string
420
+ }
421
+
422
+ const programCache = new Map<string, ProgramCacheEntry>()
423
+ const packageMetadataCache = new Map<string, Result<PackageMetadata, string>>()
424
+ const barrelExportCache = new Map<string, Result<ParsedBarrelExports, string>>()
425
+ const tagOrder = new Map([
426
+ ["deprecated", 0],
427
+ ["default", 1],
428
+ ["see", 2],
429
+ ["category", 3],
430
+ ["since", 4]
431
+ ])
432
+ const signatureTypeFormatFlags = ts.TypeFormatFlags.NoTruncation |
433
+ ts.TypeFormatFlags.UseSingleQuotesForStringLiteralType
434
+
435
+ const stableSemverRegex = /^\d+\.\d+\.\d+$/
436
+ const urlRegex = /^https?:\/\//
437
+
438
+ function diagnostic(code: string, message: string): JSDocDiagnostic {
439
+ return { code, message }
440
+ }
441
+
442
+ function normalizePathName(filePath: string): string {
443
+ return filePath.replaceAll(path.sep, "/")
444
+ }
445
+
446
+ function normalizePackagePath(filePath: string): string {
447
+ return normalizePathName(filePath).replace(/^\.\//, "./")
448
+ }
449
+
450
+ function escapeRegExp(value: string): string {
451
+ return value.replace(/[|\\{}()[\]^$+?.]/g, "\\$&")
452
+ }
453
+
454
+ function globToRegExp(glob: string): RegExp {
455
+ let source = "^"
456
+ for (let index = 0; index < glob.length; index++) {
457
+ const char = glob[index]
458
+ const next = glob[index + 1]
459
+ if (char === "*") {
460
+ if (next === "*") {
461
+ source += ".*"
462
+ index++
463
+ } else {
464
+ source += "[^/]*"
465
+ }
466
+ } else if (char === "?") {
467
+ source += "[^/]"
468
+ } else {
469
+ source += escapeRegExp(char)
470
+ }
471
+ }
472
+ return new RegExp(`${source}$`)
473
+ }
474
+
475
+ /**
476
+ * Creates a predicate that checks whether a filename is included by the configured JSDoc globs.
477
+ *
478
+ * @category constructors
479
+ * @since 4.0.0
480
+ */
481
+ export function createJSDocFileMatcher(options: {
482
+ readonly cwd: string
483
+ readonly include?: ReadonlyArray<string>
484
+ readonly exclude?: ReadonlyArray<string>
485
+ }): (filename: string) => boolean {
486
+ const include = options.include?.map(globToRegExp)
487
+ const exclude = options.exclude?.map(globToRegExp)
488
+ return (filename) => {
489
+ const normalizedFilename = normalizePathName(filename)
490
+ const relativeFilename = normalizePathName(path.relative(options.cwd, filename))
491
+ const matches = (regexp: RegExp) => regexp.test(normalizedFilename) || regexp.test(relativeFilename)
492
+ if (include !== undefined && !include.some(matches)) {
493
+ return false
494
+ }
495
+ if (exclude !== undefined && exclude.some(matches)) {
496
+ return false
497
+ }
498
+ return true
499
+ }
500
+ }
501
+
502
+ function isRecord(value: unknown): value is Record<string, unknown> {
503
+ return typeof value === "object" && value !== null && !Array.isArray(value)
504
+ }
505
+
506
+ function findPackageRoot(filename: string): string | undefined {
507
+ let directory = path.dirname(path.resolve(filename))
508
+ while (true) {
509
+ const packageJsonPath = path.join(directory, "package.json")
510
+ if (fs.existsSync(packageJsonPath)) {
511
+ return directory
512
+ }
513
+ const parent = path.dirname(directory)
514
+ if (parent === directory) {
515
+ return undefined
516
+ }
517
+ directory = parent
518
+ }
519
+ }
520
+
521
+ function readPackageMetadata(root: string): Result<PackageMetadata, string> {
522
+ const normalizedRoot = path.resolve(root)
523
+ const cached = packageMetadataCache.get(normalizedRoot)
524
+ if (cached !== undefined) {
525
+ return cached
526
+ }
527
+ const packageJsonPath = path.join(normalizedRoot, "package.json")
528
+ let parsed: unknown
529
+ try {
530
+ parsed = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"))
531
+ } catch (error) {
532
+ const result = {
533
+ _tag: "Failure",
534
+ error: `unable to read package.json at ${packageJsonPath}: ${String(error)}`
535
+ } as const
536
+ packageMetadataCache.set(normalizedRoot, result)
537
+ return result
538
+ }
539
+ if (!isRecord(parsed)) {
540
+ const result = { _tag: "Failure", error: `package.json at ${packageJsonPath} must be an object` } as const
541
+ packageMetadataCache.set(normalizedRoot, result)
542
+ return result
543
+ }
544
+ if (typeof parsed.name !== "string" || parsed.name.length === 0) {
545
+ const result = {
546
+ _tag: "Failure",
547
+ error: `package.json at ${packageJsonPath} must include a non-empty name`
548
+ } as const
549
+ packageMetadataCache.set(normalizedRoot, result)
550
+ return result
551
+ }
552
+ if (parsed.exports === undefined) {
553
+ const result = { _tag: "Failure", error: `package.json at ${packageJsonPath} must include exports` } as const
554
+ packageMetadataCache.set(normalizedRoot, result)
555
+ return result
556
+ }
557
+ const result = {
558
+ _tag: "Success",
559
+ value: {
560
+ root: normalizedRoot,
561
+ sourceRoot: path.join(normalizedRoot, "src"),
562
+ name: parsed.name,
563
+ exports: parsed.exports
564
+ }
565
+ } as const
566
+ packageMetadataCache.set(normalizedRoot, result)
567
+ return result
568
+ }
569
+
570
+ function parseBarrelExports(indexPath: string): Result<ParsedBarrelExports, string> {
571
+ const normalizedIndexPath = path.resolve(indexPath)
572
+ const cached = barrelExportCache.get(normalizedIndexPath)
573
+ if (cached !== undefined) {
574
+ return cached
575
+ }
576
+ let source: string
577
+ try {
578
+ source = fs.readFileSync(normalizedIndexPath, "utf8")
579
+ } catch (error) {
580
+ const result = {
581
+ _tag: "Failure",
582
+ error: `unable to read barrel file ${normalizedIndexPath}: ${String(error)}`
583
+ } as const
584
+ barrelExportCache.set(normalizedIndexPath, result)
585
+ return result
586
+ }
587
+ const sourceFile = ts.createSourceFile(normalizedIndexPath, source, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS)
588
+ const namespace = new Map<string, string>()
589
+ const flat = new Set<string>()
590
+ const named = new Map<string, Set<string>>()
591
+ for (const statement of sourceFile.statements) {
592
+ if (
593
+ ts.isExportDeclaration(statement) &&
594
+ statement.moduleSpecifier !== undefined &&
595
+ ts.isStringLiteralLike(statement.moduleSpecifier)
596
+ ) {
597
+ const moduleSpecifier = normalizePathName(statement.moduleSpecifier.text)
598
+ if (statement.exportClause === undefined) {
599
+ flat.add(moduleSpecifier)
600
+ } else if (ts.isNamespaceExport(statement.exportClause)) {
601
+ namespace.set(moduleSpecifier, statement.exportClause.name.text)
602
+ } else if (ts.isNamedExports(statement.exportClause)) {
603
+ const names = named.get(moduleSpecifier) ?? new Set<string>()
604
+ for (const specifier of statement.exportClause.elements) {
605
+ names.add(specifier.name.text)
606
+ }
607
+ named.set(moduleSpecifier, names)
608
+ }
609
+ }
610
+ }
611
+ const result = { _tag: "Success", value: { namespace, flat, named } } as const
612
+ barrelExportCache.set(normalizedIndexPath, result)
613
+ return result
614
+ }
615
+
616
+ function getPackageExportMatch(exports: unknown, subpath: string): PackageExportMatch | undefined {
617
+ if (!isRecord(exports)) {
618
+ return subpath === "." ? { key: ".", value: exports, star: null, specificity: 1, prefixLength: 1 } : undefined
619
+ }
620
+ if (Object.hasOwn(exports, subpath)) {
621
+ return {
622
+ key: subpath,
623
+ value: exports[subpath],
624
+ star: null,
625
+ specificity: Number.MAX_SAFE_INTEGER,
626
+ prefixLength: subpath.length
627
+ }
628
+ }
629
+ const matches: Array<PackageExportMatch> = []
630
+ for (const [key, value] of Object.entries(exports)) {
631
+ const starIndex = key.indexOf("*")
632
+ if (!key.startsWith(".") || starIndex === -1) {
633
+ continue
634
+ }
635
+ const prefix = key.slice(0, starIndex)
636
+ const suffix = key.slice(starIndex + 1)
637
+ if (!subpath.startsWith(prefix) || !subpath.endsWith(suffix)) {
638
+ continue
639
+ }
640
+ matches.push({
641
+ key,
642
+ value,
643
+ star: subpath.slice(prefix.length, subpath.length - suffix.length),
644
+ specificity: prefix.length + suffix.length,
645
+ prefixLength: prefix.length
646
+ })
647
+ }
648
+ return matches.sort((a, b) =>
649
+ b.specificity - a.specificity || b.prefixLength - a.prefixLength || b.key.length - a.key.length
650
+ )[0]
651
+ }
652
+
653
+ function packageExportTargetMatches(value: unknown, star: string | null, expectedTarget: string): boolean {
654
+ if (typeof value === "string") {
655
+ const target = normalizePackagePath(star === null ? value : value.replaceAll("*", star))
656
+ return target === expectedTarget
657
+ }
658
+ if (value === null || value === undefined) {
659
+ return false
660
+ }
661
+ if (Array.isArray(value)) {
662
+ return value.some((item) => packageExportTargetMatches(item, star, expectedTarget))
663
+ }
664
+ if (isRecord(value)) {
665
+ return Object.values(value).some((item) => packageExportTargetMatches(item, star, expectedTarget))
666
+ }
667
+ return false
668
+ }
669
+
670
+ function isPackageSubpathExported(
671
+ packageExports: unknown,
672
+ subpath: string,
673
+ expectedTarget: string
674
+ ): boolean {
675
+ const match = getPackageExportMatch(packageExports, subpath)
676
+ return match !== undefined && packageExportTargetMatches(match.value, match.star, expectedTarget)
677
+ }
678
+
679
+ function isPathInside(parent: string, child: string): boolean {
680
+ const relative = path.relative(parent, child)
681
+ return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative))
682
+ }
683
+
684
+ function packageSpecifier(packageName: string, subpath: string): string {
685
+ return subpath === "" ? packageName : `${packageName}/${subpath}`
686
+ }
687
+
688
+ function resolveBarrelImport(
689
+ metadata: PackageMetadata,
690
+ filename: string
691
+ ): Result<{ readonly barrel: ParsedJSDocBarrelImport | null; readonly flatNames: ReadonlyArray<string> }, string> {
692
+ let directory = path.dirname(filename)
693
+ while (isPathInside(metadata.sourceRoot, directory)) {
694
+ const indexPath = path.join(directory, "index.ts")
695
+ if (indexPath !== filename && fs.existsSync(indexPath)) {
696
+ const expectedExport = `./${normalizePathName(path.relative(directory, filename))}`
697
+ const parsed = parseBarrelExports(indexPath)
698
+ if (parsed._tag === "Failure") {
699
+ return parsed
700
+ }
701
+ const barrelSubpath = normalizePathName(path.relative(metadata.sourceRoot, directory))
702
+ const exportSubpath = barrelSubpath === "" ? "." : `./${barrelSubpath}`
703
+ const exportTarget = barrelSubpath === "" ? "./src/index.ts" : `./src/${barrelSubpath}/index.ts`
704
+ if (isPackageSubpathExported(metadata.exports, exportSubpath, exportTarget)) {
705
+ const moduleSpecifier = packageSpecifier(metadata.name, barrelSubpath)
706
+ const flatNames = Array.from(parsed.value.named.get(expectedExport) ?? [])
707
+ const namespace = parsed.value.namespace.get(expectedExport)
708
+ if (namespace !== undefined) {
709
+ return {
710
+ _tag: "Success",
711
+ value: { barrel: { type: "namespace", module: moduleSpecifier, name: namespace }, flatNames }
712
+ }
713
+ }
714
+ if (parsed.value.flat.has(expectedExport)) {
715
+ return {
716
+ _tag: "Success",
717
+ value: { barrel: { type: "flat", module: moduleSpecifier }, flatNames }
718
+ }
719
+ }
720
+ if (flatNames.length > 0) {
721
+ return {
722
+ _tag: "Success",
723
+ value: { barrel: { type: "flat", module: moduleSpecifier }, flatNames }
724
+ }
725
+ }
726
+ }
727
+ }
728
+ if (directory === metadata.sourceRoot) {
729
+ break
730
+ }
731
+ directory = path.dirname(directory)
732
+ }
733
+ return { _tag: "Success", value: { barrel: null, flatNames: [] } }
734
+ }
735
+
736
+ function resolveJSDocImports(
737
+ cwd: string,
738
+ filename: string
739
+ ): Result<ParsedJSDocImports, string> {
740
+ const absoluteFilename = path.resolve(filename)
741
+ const packageRoot = findPackageRoot(absoluteFilename)
742
+ const relativeFilename = normalizePathName(path.relative(cwd, absoluteFilename))
743
+ if (packageRoot === undefined) {
744
+ return { _tag: "Failure", error: `no package.json found for ${relativeFilename}` }
745
+ }
746
+ const metadata = readPackageMetadata(packageRoot)
747
+ if (metadata._tag === "Failure") {
748
+ return metadata
749
+ }
750
+ const relativeToSourceRoot = normalizePathName(path.relative(metadata.value.sourceRoot, absoluteFilename))
751
+ if (!isPathInside(metadata.value.sourceRoot, absoluteFilename)) {
752
+ return {
753
+ _tag: "Failure",
754
+ error: `${relativeFilename} is not under ${normalizePathName(path.relative(cwd, metadata.value.sourceRoot))}`
755
+ }
756
+ }
757
+ if (path.basename(absoluteFilename) === "index.ts") {
758
+ return {
759
+ _tag: "Failure",
760
+ error: `${relativeFilename} is a barrel file; exclude it from jsdocs`
761
+ }
762
+ }
763
+ if (path.extname(absoluteFilename) !== ".ts" || absoluteFilename.endsWith(".d.ts")) {
764
+ return {
765
+ _tag: "Failure",
766
+ error: `${relativeFilename} is not a TypeScript source module`
767
+ }
768
+ }
769
+ const moduleSubpath = relativeToSourceRoot.slice(0, -".ts".length)
770
+ const moduleExportSubpath = `./${moduleSubpath}`
771
+ const moduleExportTarget = `./src/${relativeToSourceRoot}`
772
+ if (!isPackageSubpathExported(metadata.value.exports, moduleExportSubpath, moduleExportTarget)) {
773
+ return {
774
+ _tag: "Failure",
775
+ error: `package.json exports do not expose ${
776
+ packageSpecifier(metadata.value.name, moduleSubpath)
777
+ } for ${relativeFilename}`
778
+ }
779
+ }
780
+ const barrel = resolveBarrelImport(metadata.value, absoluteFilename)
781
+ if (barrel._tag === "Failure") {
782
+ return barrel
783
+ }
784
+ return {
785
+ _tag: "Success",
786
+ value: {
787
+ module: packageSpecifier(metadata.value.name, moduleSubpath),
788
+ barrel: barrel.value.barrel,
789
+ flatNames: barrel.value.flatNames
790
+ }
791
+ }
792
+ }
793
+
794
+ export function getSourceText(context: {
795
+ readonly sourceCode: { readonly text?: string; getText(node?: unknown): string }
796
+ }): string {
797
+ return context.sourceCode.text ?? context.sourceCode.getText()
798
+ }
799
+
800
+ export function getCwd(context: { readonly cwd?: string; getCwd?: () => string }): string {
801
+ return context.cwd ?? context.getCwd?.() ?? process.cwd()
802
+ }
803
+
804
+ function skipWhitespace(source: string, end: number): number {
805
+ while (end > 0 && /\s/.test(source[end - 1])) {
806
+ end--
807
+ }
808
+ return end
809
+ }
810
+
811
+ function isSkippableDirectiveComment(line: string): boolean {
812
+ const trimmed = line.trim()
813
+ return trimmed.startsWith("// @ts-expect-error") ||
814
+ trimmed.startsWith("// @ts-ignore") ||
815
+ trimmed.startsWith("// @effect-diagnostics") ||
816
+ trimmed.startsWith("// eslint-disable-next-line") ||
817
+ trimmed.startsWith("// oxlint-disable-next-line")
818
+ }
819
+
820
+ function skipDirectiveComments(source: string, end: number): number {
821
+ while (end > 0) {
822
+ const lineStart = source.lastIndexOf("\n", end - 1) + 1
823
+ if (!isSkippableDirectiveComment(source.slice(lineStart, end))) {
824
+ return end
825
+ }
826
+ end = skipWhitespace(source, lineStart)
827
+ }
828
+ return end
829
+ }
830
+
831
+ export function findLeadingJSDoc(
832
+ source: string,
833
+ node: AstNode,
834
+ ignoredRange?: [number, number]
835
+ ): JSDocBlock | undefined {
836
+ const end = skipDirectiveComments(source, skipWhitespace(source, node.range[0]))
837
+ if (!source.slice(0, end).endsWith("*/")) {
838
+ return undefined
839
+ }
840
+
841
+ const start = source.lastIndexOf("/*", end)
842
+ if (start === -1 || source[start + 2] !== "*") {
843
+ return undefined
844
+ }
845
+ const range: [number, number] = [start, end]
846
+ if (ignoredRange !== undefined && range[0] === ignoredRange[0] && range[1] === ignoredRange[1]) {
847
+ return undefined
848
+ }
849
+ return parseJSDocBlock(source.slice(start, end), range)
850
+ }
851
+
852
+ /**
853
+ * Parses one raw JSDoc block into the standard description, example, and tag structure.
854
+ *
855
+ * **Details**
856
+ *
857
+ * The block must have one short description paragraph, optional `When to use`, `Details`, and `Gotchas` sections in that order, then any example sections before tags. Example titles must be unique after trimming and lowercasing, each example must contain exactly one non-empty TypeScript code fence, and boundaries between sections, examples, and tags must use exactly one blank line.
858
+ *
859
+ * **Example** (Parsing a block)
860
+ *
861
+ * ```ts
862
+ * const rawBlock = [
863
+ * "/" + "**",
864
+ * " * A value.",
865
+ * " *",
866
+ * " * @category models",
867
+ * " * @since 4.0.0",
868
+ * " *" + "/"
869
+ * ].join("\n")
870
+ * const result = parseJSDoc(rawBlock)
871
+ * ```
872
+ *
873
+ * @category parsing
874
+ * @since 4.0.0
875
+ */
876
+ export function parseJSDoc(raw: string): Result<ParsedCoreJSDoc, JSDocParseError> {
877
+ const block = parseJSDocBlock(raw, [0, raw.length])
878
+ if (block.internal) {
879
+ return { _tag: "Failure", error: { diagnostics: [diagnostic("internal", "Internal JSDoc blocks are ignored")] } }
880
+ }
881
+ if (block.diagnostics.length > 0 || block.parsed === undefined) {
882
+ return { _tag: "Failure", error: { diagnostics: block.diagnostics } }
883
+ }
884
+ return { _tag: "Success", value: block.parsed }
885
+ }
886
+
887
+ function parseLooseJSDocBlock(raw: string, range: [number, number]): JSDocBlock {
888
+ const body = raw.replace(/^\/\*\*/, "").replace(/\*\/$/, "")
889
+ const rawLines = body.split(/\r\n|\r|\n/)
890
+ const lines = rawLines.map((line) => line.replace(/^\s*\* ?/, "").trimEnd())
891
+ const normalized = trimStructuralBlankLines(lines)
892
+ const tags = parseTags(normalized)
893
+ const internal = tags.some((tag) => tag.name === "internal")
894
+ return { range, raw, lines: normalized, tags, diagnostics: [], internal }
895
+ }
896
+
897
+ function parseJSDocBlock(raw: string, range: [number, number]): JSDocBlock {
898
+ const base = parseLooseJSDocBlock(raw, range)
899
+ const { lines: normalized, tags, internal } = base
900
+ if (internal) {
901
+ return base
902
+ }
903
+ const result = parseCoreJSDoc(normalized, tags)
904
+ const block: JSDocBlock = {
905
+ ...base,
906
+ range,
907
+ raw,
908
+ lines: normalized,
909
+ tags,
910
+ diagnostics: result._tag === "Failure" ? Array.from(result.error.diagnostics) : [],
911
+ internal
912
+ }
913
+ return result._tag === "Success" ? { ...block, parsed: result.value } : block
914
+ }
915
+
916
+ function trimStructuralBlankLines(lines: Array<string>): Array<string> {
917
+ let start = 0
918
+ let end = lines.length
919
+ if (lines[start]?.trim() === "") {
920
+ start++
921
+ }
922
+ if (end > start && lines[end - 1]?.trim() === "") {
923
+ end--
924
+ }
925
+ return lines.slice(start, end)
926
+ }
927
+
928
+ function parseTags(lines: Array<string>): Array<JSDocTag> {
929
+ const tags: Array<JSDocTag> = []
930
+ let current: JSDocTag | undefined
931
+ let inFence = false
932
+
933
+ for (let index = 0; index < lines.length; index++) {
934
+ const trimmed = lines[index].trim()
935
+ if (trimmed.startsWith("```")) {
936
+ inFence = !inFence
937
+ current = undefined
938
+ continue
939
+ }
940
+ if (inFence) {
941
+ continue
942
+ }
943
+
944
+ const match = /^@([A-Za-z][\w-]*)(?:\s+(.*))?$/.exec(trimmed)
945
+ if (match) {
946
+ current = { name: match[1], value: match[2]?.trim() ?? "", line: index }
947
+ tags.push(current)
948
+ continue
949
+ }
950
+
951
+ if (current !== undefined && trimmed !== "") {
952
+ current.value = current.value === "" ? trimmed : `${current.value}\n${trimmed}`
953
+ } else if (trimmed === "") {
954
+ current = undefined
955
+ }
956
+ }
957
+
958
+ return tags
959
+ }
960
+
961
+ function parseCoreJSDoc(lines: Array<string>, tags: Array<JSDocTag>): Result<ParsedCoreJSDoc, JSDocParseError> {
962
+ const diagnostics: Array<JSDocDiagnostic> = []
963
+ const firstTagLine = tags[0]?.line ?? lines.length
964
+ const content = lines.slice(0, firstTagLine)
965
+
966
+ if (lines.length === 0) {
967
+ diagnostics.push(diagnostic("missing-description", "JSDoc must include a short description"))
968
+ }
969
+ if (content.at(-1)?.trim() === "" && tags.length > 0) {
970
+ // exactly one blank before tags is validated by ensuring the last content line is blank and the previous is not blank
971
+ if (content.length < 2 || content[content.length - 2]?.trim() === "") {
972
+ diagnostics.push(
973
+ diagnostic("invalid-spacing", "JSDoc tags must be separated from description content by exactly one blank line")
974
+ )
975
+ }
976
+ } else if (tags.length > 0 && content.length > 0) {
977
+ diagnostics.push(
978
+ diagnostic("invalid-spacing", "JSDoc tags must be separated from description content by exactly one blank line")
979
+ )
980
+ }
981
+
982
+ if (content[0]?.trim() === "") {
983
+ diagnostics.push(diagnostic("leading-blank", "JSDoc must not start with a blank line"))
984
+ }
985
+ const contentWithoutTagBlank = tags.length > 0 && content.at(-1)?.trim() === "" ? content.slice(0, -1) : content
986
+ if (contentWithoutTagBlank.at(-1)?.trim() === "") {
987
+ diagnostics.push(diagnostic("trailing-blank", "JSDoc description must not end with a blank line"))
988
+ }
989
+
990
+ const parsedContent = parseDescriptionContent(contentWithoutTagBlank)
991
+ diagnostics.push(...parsedContent.diagnostics)
992
+
993
+ if (diagnostics.length > 0 || parsedContent.value === undefined) {
994
+ return { _tag: "Failure", error: { diagnostics: uniqueDiagnostics(diagnostics) } }
995
+ }
996
+ return {
997
+ _tag: "Success",
998
+ value: {
999
+ description: parsedContent.value.description,
1000
+ examples: parsedContent.value.examples,
1001
+ tags
1002
+ }
1003
+ }
1004
+ }
1005
+
1006
+ function uniqueDiagnostics(
1007
+ diagnostics: ReadonlyArray<JSDocDiagnostic>
1008
+ ): ReadonlyArray<JSDocDiagnostic> {
1009
+ const seen = new Set<string>()
1010
+ return diagnostics.filter((item) => {
1011
+ const key = `${item.code}:${item.message}`
1012
+ if (seen.has(key)) {
1013
+ return false
1014
+ }
1015
+ seen.add(key)
1016
+ return true
1017
+ })
1018
+ }
1019
+
1020
+ const standardHeadings = ["**When to use**", "**Details**", "**Gotchas**"] as const
1021
+
1022
+ type StandardHeading = typeof standardHeadings[number]
1023
+
1024
+ const whenToUsePrefixes = ["Use to", "Use when", "Use as", "Use with"] as const
1025
+
1026
+ interface ParsedContentResult {
1027
+ readonly value?: {
1028
+ readonly description: ParsedDescription
1029
+ readonly examples: ReadonlyArray<ParsedExample>
1030
+ }
1031
+ readonly diagnostics: ReadonlyArray<JSDocDiagnostic>
1032
+ }
1033
+
1034
+ function parseDescriptionContent(lines: Array<string>): ParsedContentResult {
1035
+ const diagnostics: Array<JSDocDiagnostic> = []
1036
+ const sections: Record<StandardHeading, string | null> = {
1037
+ "**When to use**": null,
1038
+ "**Details**": null,
1039
+ "**Gotchas**": null
1040
+ }
1041
+ const examples: Array<ParsedExample> = []
1042
+ const exampleTitles = new Set<string>()
1043
+ let index = 0
1044
+ let currentSectionOrder = -1
1045
+ let examplesStarted = false
1046
+
1047
+ while (index < lines.length && lines[index].trim() !== "" && !isHeadingLine(lines[index])) {
1048
+ if (isForbiddenMarkdownHeading(lines[index], false)) {
1049
+ diagnostics.push(diagnostic("invalid-heading", "Markdown headings are not allowed in JSDoc descriptions"))
1050
+ }
1051
+ index++
1052
+ }
1053
+
1054
+ const shortLines = lines.slice(0, index)
1055
+ if (shortLines.length === 0 || joinBody(shortLines).trim() === "") {
1056
+ diagnostics.push(diagnostic("missing-description", "JSDoc must include a short description"))
1057
+ }
1058
+ if (index < lines.length && lines[index].trim() === "") {
1059
+ const next = lines[index + 1]
1060
+ if (next !== undefined && !isHeadingLine(next)) {
1061
+ diagnostics.push(diagnostic("multiple-description-paragraphs", "JSDoc short description must be one paragraph"))
1062
+ }
1063
+ }
1064
+
1065
+ while (index < lines.length) {
1066
+ if (lines[index].trim() !== "") {
1067
+ diagnostics.push(diagnostic("invalid-spacing", "JSDoc sections must be separated by exactly one blank line"))
1068
+ break
1069
+ }
1070
+ if (lines[index + 1]?.trim() === "") {
1071
+ diagnostics.push(diagnostic("invalid-spacing", "JSDoc sections must be separated by exactly one blank line"))
1072
+ while (lines[index + 1]?.trim() === "") index++
1073
+ }
1074
+ index++
1075
+ if (index >= lines.length) {
1076
+ break
1077
+ }
1078
+
1079
+ const line = lines[index].trim()
1080
+ if (line.startsWith("**Example**")) {
1081
+ examplesStarted = true
1082
+ const parsed = parseExample(lines, index)
1083
+ diagnostics.push(...parsed.diagnostics)
1084
+ if (parsed.example !== undefined) {
1085
+ const key = parsed.example.title.trim().toLowerCase()
1086
+ if (exampleTitles.has(key)) {
1087
+ diagnostics.push(diagnostic("duplicate-example", `Duplicate example title: ${parsed.example.title.trim()}`))
1088
+ }
1089
+ exampleTitles.add(key)
1090
+ examples.push(parsed.example)
1091
+ }
1092
+ index = parsed.nextIndex
1093
+ continue
1094
+ }
1095
+
1096
+ const heading = standardHeadings.find((candidate) => candidate === line)
1097
+ if (heading !== undefined) {
1098
+ if (examplesStarted) {
1099
+ diagnostics.push(diagnostic("section-after-example", `${heading} must appear before examples`))
1100
+ }
1101
+ const order = standardHeadings.indexOf(heading)
1102
+ if (order <= currentSectionOrder) {
1103
+ diagnostics.push(diagnostic("section-out-of-order", `${heading} is out of order or duplicated`))
1104
+ }
1105
+ currentSectionOrder = Math.max(currentSectionOrder, order)
1106
+ if (sections[heading] !== null) {
1107
+ diagnostics.push(diagnostic("duplicate-section", `${heading} may appear at most once`))
1108
+ }
1109
+ const parsed = parseSection(lines, index)
1110
+ diagnostics.push(...parsed.diagnostics)
1111
+ sections[heading] = parsed.body
1112
+ index = parsed.nextIndex
1113
+ continue
1114
+ }
1115
+
1116
+ if (isNearMissHeading(line)) {
1117
+ diagnostics.push(diagnostic("invalid-heading", `Invalid JSDoc section heading: ${line}`))
1118
+ index++
1119
+ continue
1120
+ }
1121
+ if (isBoldOnlyLine(line)) {
1122
+ diagnostics.push(diagnostic("unknown-heading", `Unknown JSDoc section heading: ${line}`))
1123
+ index++
1124
+ continue
1125
+ }
1126
+ if (isForbiddenMarkdownHeading(line, false)) {
1127
+ diagnostics.push(diagnostic("invalid-heading", "Markdown headings are not allowed in JSDoc descriptions"))
1128
+ index++
1129
+ continue
1130
+ }
1131
+ diagnostics.push(
1132
+ diagnostic("invalid-description", "JSDoc description content must appear under a standard section heading")
1133
+ )
1134
+ index++
1135
+ }
1136
+
1137
+ const whenToUse = sections["**When to use**"]
1138
+ if (whenToUse !== null && !hasWhenToUsePrefix(whenToUse)) {
1139
+ diagnostics.push(
1140
+ diagnostic(
1141
+ "when-to-use-format",
1142
+ `**When to use** must start with one of: ${whenToUsePrefixes.map((prefix) => `\`${prefix}\``).join(", ")}`
1143
+ )
1144
+ )
1145
+ }
1146
+
1147
+ if (diagnostics.length > 0) {
1148
+ return { diagnostics }
1149
+ }
1150
+ return {
1151
+ value: {
1152
+ description: {
1153
+ short: joinBody(shortLines),
1154
+ whenToUse: sections["**When to use**"],
1155
+ details: sections["**Details**"],
1156
+ gotchas: sections["**Gotchas**"]
1157
+ },
1158
+ examples
1159
+ },
1160
+ diagnostics
1161
+ }
1162
+ }
1163
+
1164
+ function hasWhenToUsePrefix(text: string): boolean {
1165
+ const trimmed = text.trimStart()
1166
+ return whenToUsePrefixes.some((prefix) => trimmed === prefix || trimmed.startsWith(`${prefix} `))
1167
+ }
1168
+
1169
+ function parseSection(lines: Array<string>, headingIndex: number): {
1170
+ readonly body: string | null
1171
+ readonly nextIndex: number
1172
+ readonly diagnostics: ReadonlyArray<JSDocDiagnostic>
1173
+ } {
1174
+ const diagnostics: Array<JSDocDiagnostic> = []
1175
+ if (lines[headingIndex + 1]?.trim() !== "") {
1176
+ diagnostics.push(
1177
+ diagnostic("invalid-spacing", `${lines[headingIndex].trim()} must be followed by exactly one blank line`)
1178
+ )
1179
+ }
1180
+ let index = headingIndex + 2
1181
+ const bodyStart = index
1182
+ let inFence = false
1183
+ while (index < lines.length) {
1184
+ const trimmed = lines[index].trim()
1185
+ if (trimmed.startsWith("```")) {
1186
+ if (trimmed === "```ts") {
1187
+ diagnostics.push(diagnostic("loose-ts-fence", "TypeScript examples must use **Example** (Title) sections"))
1188
+ }
1189
+ inFence = !inFence
1190
+ }
1191
+ if (!inFence && trimmed === "" && isHeadingLine(lines[index + 1])) {
1192
+ break
1193
+ }
1194
+ if (!inFence && trimmed !== "" && isForbiddenMarkdownHeading(trimmed, false)) {
1195
+ diagnostics.push(diagnostic("invalid-heading", "Markdown headings are not allowed in JSDoc descriptions"))
1196
+ }
1197
+ if (
1198
+ !inFence && isBoldOnlyLine(trimmed) && !standardHeadings.includes(trimmed as StandardHeading) &&
1199
+ !trimmed.startsWith("**Example**")
1200
+ ) {
1201
+ diagnostics.push(diagnostic("unknown-heading", `Unknown JSDoc section heading: ${trimmed}`))
1202
+ }
1203
+ index++
1204
+ }
1205
+ const bodyLines = lines.slice(bodyStart, index)
1206
+ if (joinBody(bodyLines).trim() === "") {
1207
+ diagnostics.push(diagnostic("empty-section", `${lines[headingIndex].trim()} must have a non-empty body`))
1208
+ }
1209
+ if (bodyLines.at(-1)?.trim() === "") {
1210
+ diagnostics.push(diagnostic("invalid-spacing", "Section bodies must not end with extra blank lines"))
1211
+ }
1212
+ return { body: joinBody(bodyLines), nextIndex: index, diagnostics }
1213
+ }
1214
+
1215
+ function parseExample(lines: Array<string>, headingIndex: number): {
1216
+ readonly example?: ParsedExample
1217
+ readonly nextIndex: number
1218
+ readonly diagnostics: ReadonlyArray<JSDocDiagnostic>
1219
+ } {
1220
+ const diagnostics: Array<JSDocDiagnostic> = []
1221
+ const heading = lines[headingIndex].trim()
1222
+ const match = /^\*\*Example\*\* \((.+)\)$/.exec(heading)
1223
+ if (!match || match[1].trim() === "") {
1224
+ diagnostics.push(diagnostic("malformed-example", "TypeScript examples must use **Example** (Title)"))
1225
+ }
1226
+ if (lines[headingIndex + 1]?.trim() !== "") {
1227
+ diagnostics.push(diagnostic("invalid-spacing", "Example headings must be followed by exactly one blank line"))
1228
+ }
1229
+
1230
+ let index = headingIndex + 2
1231
+ const bodyStart = index
1232
+ let fenceIndex = -1
1233
+ while (index < lines.length) {
1234
+ const trimmed = lines[index].trim()
1235
+ if (trimmed === "```ts") {
1236
+ fenceIndex = index
1237
+ break
1238
+ }
1239
+ if (trimmed.startsWith("```")) {
1240
+ diagnostics.push(diagnostic("malformed-example", "Examples may only contain one TypeScript code fence"))
1241
+ }
1242
+ if (trimmed === "" && isHeadingLine(lines[index + 1])) {
1243
+ break
1244
+ }
1245
+ if (trimmed.startsWith("@")) {
1246
+ break
1247
+ }
1248
+ index++
1249
+ }
1250
+
1251
+ if (fenceIndex === -1) {
1252
+ diagnostics.push(diagnostic("malformed-example", "Examples must include a non-empty ```ts fence"))
1253
+ return { nextIndex: index, diagnostics }
1254
+ }
1255
+
1256
+ const bodyLines = lines.slice(bodyStart, fenceIndex)
1257
+ const nonEmptyBody = joinBody(bodyLines).trim() !== ""
1258
+ if (nonEmptyBody && bodyLines.at(-1)?.trim() !== "") {
1259
+ diagnostics.push(
1260
+ diagnostic("invalid-spacing", "Example prose must be separated from code by exactly one blank line")
1261
+ )
1262
+ }
1263
+ const prose = nonEmptyBody ? joinBody(bodyLines.slice(0, bodyLines.at(-1)?.trim() === "" ? -1 : undefined)) : null
1264
+
1265
+ index = fenceIndex + 1
1266
+ const codeStart = index
1267
+ while (index < lines.length && lines[index].trim() !== "```") {
1268
+ if (lines[index].trim() === "```ts") {
1269
+ diagnostics.push(diagnostic("malformed-example", "Examples must contain exactly one TypeScript code fence"))
1270
+ }
1271
+ index++
1272
+ }
1273
+ const codeLines = lines.slice(codeStart, index)
1274
+ if (index >= lines.length) {
1275
+ diagnostics.push(diagnostic("malformed-example", "Examples must close the TypeScript code fence"))
1276
+ }
1277
+ if (joinBody(codeLines).trim() === "") {
1278
+ diagnostics.push(diagnostic("malformed-example", "Examples must include non-empty TypeScript code"))
1279
+ }
1280
+ index++
1281
+ if (index < lines.length && lines[index].trim() !== "" && !lines[index].trim().startsWith("@")) {
1282
+ diagnostics.push(
1283
+ diagnostic("invalid-spacing", "Examples must be separated from following content by exactly one blank line")
1284
+ )
1285
+ }
1286
+
1287
+ const result = { nextIndex: index, diagnostics }
1288
+ return match
1289
+ ? { ...result, example: { title: match[1].trim(), body: prose, code: joinBody(codeLines) } }
1290
+ : result
1291
+ }
1292
+
1293
+ function parseModuleExamples(block: JSDocBlock): {
1294
+ readonly examples: ReadonlyArray<ParsedExample>
1295
+ readonly diagnostics: ReadonlyArray<JSDocDiagnostic>
1296
+ } {
1297
+ const diagnostics: Array<JSDocDiagnostic> = []
1298
+ const examples: Array<ParsedExample> = []
1299
+ const exampleTitles = new Set<string>()
1300
+ const firstTagLine = block.tags[0]?.line ?? block.lines.length
1301
+ const lines = block.lines.slice(0, firstTagLine)
1302
+ let index = 0
1303
+ while (index < lines.length) {
1304
+ const trimmed = lines[index].trim()
1305
+ if (trimmed.startsWith("**Example**")) {
1306
+ const parsed = parseExample(lines, index)
1307
+ diagnostics.push(...parsed.diagnostics)
1308
+ if (parsed.example !== undefined) {
1309
+ const key = parsed.example.title.trim().toLowerCase()
1310
+ if (exampleTitles.has(key)) {
1311
+ diagnostics.push(diagnostic("duplicate-example", `Duplicate example title: ${parsed.example.title.trim()}`))
1312
+ }
1313
+ exampleTitles.add(key)
1314
+ examples.push(parsed.example)
1315
+ }
1316
+ index = Math.max(parsed.nextIndex, index + 1)
1317
+ continue
1318
+ }
1319
+ if (trimmed.startsWith("```")) {
1320
+ diagnostics.push(
1321
+ diagnostic("loose-ts-fence", "Code fences in module JSDoc must use **Example** (Title) sections")
1322
+ )
1323
+ index++
1324
+ while (index < lines.length && !lines[index].trim().startsWith("```")) index++
1325
+ if (index < lines.length) index++
1326
+ continue
1327
+ }
1328
+ index++
1329
+ }
1330
+ return { examples, diagnostics }
1331
+ }
1332
+
1333
+ function joinBody(lines: ReadonlyArray<string>): string {
1334
+ let start = 0
1335
+ let end = lines.length
1336
+ while (start < end && lines[start]?.trim() === "") start++
1337
+ while (end > start && lines[end - 1]?.trim() === "") end--
1338
+ return lines.slice(start, end).join("\n")
1339
+ }
1340
+
1341
+ function isHeadingLine(line: string | undefined): boolean {
1342
+ if (line === undefined) return false
1343
+ const trimmed = line.trim()
1344
+ return standardHeadings.includes(trimmed as StandardHeading) || trimmed.startsWith("**Example**") ||
1345
+ isNearMissHeading(trimmed) || isBoldOnlyLine(trimmed) || isForbiddenMarkdownHeading(trimmed, false)
1346
+ }
1347
+
1348
+ function isNearMissHeading(line: string): boolean {
1349
+ return /^\*\*(When to use|When To Use|Details|Gotchas).*\*\*/.test(line) &&
1350
+ !standardHeadings.includes(line as StandardHeading)
1351
+ }
1352
+
1353
+ function isBoldOnlyLine(line: string): boolean {
1354
+ return /^\*\*[^*]+\*\*(?:\s*)$/.test(line)
1355
+ }
1356
+
1357
+ function isForbiddenMarkdownHeading(line: string, inFence: boolean): boolean {
1358
+ return !inFence && /^#{1,6}\s+/.test(line.trim())
1359
+ }
1360
+
1361
+ function parseSeeTag(value: string): ParsedSeeTag {
1362
+ return { text: value, links: extractParsedInlineLinks(value) }
1363
+ }
1364
+
1365
+ function extractParsedInlineLinks(source: string): ReadonlyArray<ParsedInlineLink> {
1366
+ const links: Array<ParsedInlineLink> = []
1367
+ let index = source.indexOf("{@link")
1368
+ while (index !== -1) {
1369
+ if (!isInlineLinkStart(source, index)) {
1370
+ index = source.indexOf("{@link", index + 1)
1371
+ continue
1372
+ }
1373
+ const end = source.indexOf("}", index + "{@link".length)
1374
+ if (end === -1) {
1375
+ break
1376
+ }
1377
+ const raw = source.slice(index, end + 1)
1378
+ const content = raw.slice("{@link".length, -1).trim()
1379
+ const pipeIndex = content.indexOf("|")
1380
+ const beforeLabel = pipeIndex === -1 ? content : content.slice(0, pipeIndex).trim()
1381
+ const target = beforeLabel.split(/\s+/)[0] ?? ""
1382
+ const text = pipeIndex === -1
1383
+ ? beforeLabel.slice(target.length).trim() || null
1384
+ : content.slice(pipeIndex + 1).trim() || null
1385
+ links.push({ raw, target, text })
1386
+ index = source.indexOf("{@link", end + 1)
1387
+ }
1388
+ return links
1389
+ }
1390
+
1391
+ function buildTags(
1392
+ scope: DocScope,
1393
+ tags: ReadonlyArray<JSDocTag>
1394
+ ): Result<ParsedModuleTags | ParsedDeclarationTags | ParsedNamespaceTags | ParsedMemberTags, JSDocParseError> {
1395
+ const diagnostics: Array<JSDocDiagnostic> = []
1396
+ const allowed = scope === "declaration"
1397
+ ? new Set(["deprecated", "see", "category", "since"])
1398
+ : scope === "member"
1399
+ ? new Set(["deprecated", "default", "see", "since"])
1400
+ : scope === "module"
1401
+ ? new Set(["deprecated", "see", "since"])
1402
+ : new Set(["deprecated", "see", "category", "since"])
1403
+ let previousOrder = -1
1404
+ const values = new Map<string, Array<string>>()
1405
+
1406
+ for (const tag of tags) {
1407
+ if (tag.name === "internal") {
1408
+ continue
1409
+ }
1410
+ if (tag.name === "example") {
1411
+ diagnostics.push(
1412
+ diagnostic("forbidden-tag", "@example is not allowed; use a canonical **Example** (Title) section")
1413
+ )
1414
+ continue
1415
+ }
1416
+ if (!allowed.has(tag.name)) {
1417
+ diagnostics.push(
1418
+ diagnostic(
1419
+ "forbidden-tag",
1420
+ `@${tag.name} is not allowed in ${scope === "namespace-declaration" ? "namespace" : scope} JSDoc`
1421
+ )
1422
+ )
1423
+ continue
1424
+ }
1425
+ const order = tagOrder.get(tag.name) ?? previousOrder
1426
+ if (order < previousOrder) {
1427
+ diagnostics.push(diagnostic("tag-out-of-order", `@${tag.name} is out of order in JSDoc`))
1428
+ }
1429
+ previousOrder = Math.max(previousOrder, order)
1430
+ values.set(tag.name, [...values.get(tag.name) ?? [], tag.value.trim()])
1431
+ }
1432
+
1433
+ const singletonTags = scope === "member" ? ["deprecated", "default", "since"] : ["deprecated", "category", "since"]
1434
+ for (const tag of singletonTags) {
1435
+ if ((values.get(tag)?.length ?? 0) > 1) {
1436
+ diagnostics.push(diagnostic("duplicate-tag", `JSDoc blocks may contain at most one @${tag} tag`))
1437
+ }
1438
+ }
1439
+
1440
+ const see = values.get("see") ?? []
1441
+ for (const value of see) {
1442
+ if (value === "") {
1443
+ diagnostics.push(diagnostic("empty-tag", "@see must include a value"))
1444
+ }
1445
+ }
1446
+ const deprecated = values.get("deprecated")?.[0] ?? null
1447
+ if (deprecated === "") diagnostics.push(diagnostic("empty-tag", "@deprecated must include a message"))
1448
+ const since = values.get("since")?.[0] ?? null
1449
+ if ((scope === "declaration" || scope === "namespace" || scope === "namespace-declaration") && since === null) {
1450
+ diagnostics.push(
1451
+ diagnostic(
1452
+ "missing-tag",
1453
+ scope === "declaration" ? "Public JSDoc must include @since" : "Namespace JSDoc must include @since"
1454
+ )
1455
+ )
1456
+ }
1457
+ if (scope === "module" && since === null) {
1458
+ diagnostics.push(diagnostic("missing-tag", "Module JSDoc must include @since"))
1459
+ }
1460
+ if (since !== null && !stableSemverRegex.test(since)) {
1461
+ diagnostics.push(diagnostic("invalid-since", "@since must be a stable semver version like 1.2.3"))
1462
+ }
1463
+
1464
+ if (scope === "declaration") {
1465
+ const category = values.get("category")?.[0] ?? null
1466
+ if (category === null) diagnostics.push(diagnostic("missing-tag", "Public JSDoc must include @category"))
1467
+ if (category === "") diagnostics.push(diagnostic("empty-tag", "@category must include a value"))
1468
+ if (diagnostics.length > 0 || category === null || since === null) {
1469
+ return { _tag: "Failure", error: { diagnostics } }
1470
+ }
1471
+ return { _tag: "Success", value: { category, since, deprecated, see: see.map(parseSeeTag) } }
1472
+ }
1473
+
1474
+ if (scope === "member") {
1475
+ const defaultValue = values.get("default")?.[0] ?? null
1476
+ if (defaultValue === "") diagnostics.push(diagnostic("empty-tag", "@default must include a value"))
1477
+ if (diagnostics.length > 0) return { _tag: "Failure", error: { diagnostics } }
1478
+ return { _tag: "Success", value: { since, default: defaultValue, deprecated, see: see.map(parseSeeTag) } }
1479
+ }
1480
+
1481
+ if (scope === "module") {
1482
+ if (diagnostics.length > 0 || since === null) return { _tag: "Failure", error: { diagnostics } }
1483
+ return { _tag: "Success", value: { since, deprecated, see: see.map(parseSeeTag) } }
1484
+ }
1485
+
1486
+ const category = values.get("category")?.[0] ?? null
1487
+ if (category === "") diagnostics.push(diagnostic("empty-tag", "@category must include a value"))
1488
+ if (diagnostics.length > 0 || since === null) return { _tag: "Failure", error: { diagnostics } }
1489
+ return { _tag: "Success", value: { category, since, deprecated, see: see.map(parseSeeTag) } }
1490
+ }
1491
+
1492
+ function formatDiagnostic(diagnostic: ts.Diagnostic): string {
1493
+ return ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n")
1494
+ }
1495
+
1496
+ function parseTsConfig(tsconfigPath: string): ParsedConfigResult {
1497
+ const config = ts.readConfigFile(tsconfigPath, ts.sys.readFile)
1498
+ if (config.error !== undefined) {
1499
+ return { error: `Unable to read TypeScript config ${tsconfigPath}: ${formatDiagnostic(config.error)}` }
1500
+ }
1501
+
1502
+ const parsed = ts.parseJsonConfigFileContent(config.config, ts.sys, path.dirname(tsconfigPath))
1503
+ if (parsed.errors.length > 0) {
1504
+ return {
1505
+ error: `Unable to parse TypeScript config ${tsconfigPath}: ${parsed.errors.map(formatDiagnostic).join("; ")}`
1506
+ }
1507
+ }
1508
+ return { parsed }
1509
+ }
1510
+
1511
+ function collectTsConfigFiles(tsconfigPath: string, seen: Set<string>, fileNames: Set<string>): ParsedConfigResult {
1512
+ if (seen.has(tsconfigPath)) return {}
1513
+ seen.add(tsconfigPath)
1514
+ const result = parseTsConfig(tsconfigPath)
1515
+ if (result.error !== undefined || result.parsed === undefined) return result
1516
+ for (const fileName of result.parsed.fileNames) fileNames.add(fileName)
1517
+ for (const reference of result.parsed.projectReferences ?? []) {
1518
+ const referenceResult = collectTsConfigFiles(ts.resolveProjectReferencePath(reference), seen, fileNames)
1519
+ if (referenceResult.error !== undefined) return referenceResult
1520
+ }
1521
+ return result
1522
+ }
1523
+
1524
+ export function getProgram(tsconfigPath: string): ProgramCacheEntry {
1525
+ const cached = programCache.get(tsconfigPath)
1526
+ if (cached !== undefined) return cached
1527
+ const fileNames = new Set<string>()
1528
+ const result = collectTsConfigFiles(tsconfigPath, new Set(), fileNames)
1529
+ if (result.error !== undefined || result.parsed === undefined) {
1530
+ const entry = { error: result.error ?? `Unable to parse TypeScript config ${tsconfigPath}`, reported: false }
1531
+ programCache.set(tsconfigPath, entry)
1532
+ return entry
1533
+ }
1534
+ const program = ts.createProgram(Array.from(fileNames), result.parsed.options)
1535
+ const entry = { program, reported: false }
1536
+ programCache.set(tsconfigPath, entry)
1537
+ return entry
1538
+ }
1539
+
1540
+ function resolveJSDocLinkSymbol(
1541
+ link: ts.JSDocLink,
1542
+ checker: ts.TypeChecker
1543
+ ): ts.Symbol | undefined {
1544
+ return link.name === undefined ? undefined : checker.getSymbolAtLocation(link.name)
1545
+ }
1546
+
1547
+ function isInlineLinkStart(source: string, index: number): boolean {
1548
+ if (!source.startsWith("{@link", index)) return false
1549
+ const next = source[index + "{@link".length]
1550
+ return next === undefined || /\s|}/.test(next)
1551
+ }
1552
+
1553
+ function hasInlineLink(block: JSDocBlock): boolean {
1554
+ return block.lines.some((line) => {
1555
+ let index = line.indexOf("{@link")
1556
+ while (index !== -1) {
1557
+ if (isInlineLinkStart(line, index)) return true
1558
+ index = line.indexOf("{@link", index + 1)
1559
+ }
1560
+ return false
1561
+ })
1562
+ }
1563
+
1564
+ function extractInlineLinkTarget(linkText: string): string {
1565
+ const content = linkText.slice("{@link".length, linkText.endsWith("}") ? -1 : undefined).trim()
1566
+ const pipeIndex = content.indexOf("|")
1567
+ const beforeLabel = pipeIndex === -1 ? content : content.slice(0, pipeIndex).trim()
1568
+ return beforeLabel.split(/\s+/)[0] ?? ""
1569
+ }
1570
+
1571
+ function malformedInlineLinks(block: JSDocBlock): Array<string> {
1572
+ const source = block.lines.join("\n")
1573
+ const malformed: Array<string> = []
1574
+ let index = source.indexOf("{@link")
1575
+ while (index !== -1) {
1576
+ if (!isInlineLinkStart(source, index)) {
1577
+ index = source.indexOf("{@link", index + 1)
1578
+ continue
1579
+ }
1580
+ const end = source.indexOf("}", index + "{@link".length)
1581
+ const text = end === -1 ? source.slice(index).split(/\r?\n/, 1)[0] : source.slice(index, end + 1)
1582
+ if (end === -1 || extractInlineLinkTarget(text) === "") malformed.push(text)
1583
+ index = source.indexOf("{@link", end === -1 ? index + 1 : end + 1)
1584
+ }
1585
+ return malformed
1586
+ }
1587
+
1588
+ function collectJSDocLinks(sourceFile: ts.SourceFile, block: JSDocBlock): Array<ts.JSDocLink> {
1589
+ const links: Array<ts.JSDocLink> = []
1590
+ function inspectJSDoc(node: ts.Node) {
1591
+ for (const jsdoc of (node as { readonly jsDoc?: ReadonlyArray<ts.JSDoc> }).jsDoc ?? []) {
1592
+ if (jsdoc.pos !== block.range[0] || jsdoc.end !== block.range[1]) continue
1593
+ ts.forEachChild(jsdoc, function visit(child) {
1594
+ if (ts.isJSDocLink(child)) links.push(child)
1595
+ ts.forEachChild(child, visit)
1596
+ })
1597
+ }
1598
+ }
1599
+ function visit(node: ts.Node) {
1600
+ inspectJSDoc(node)
1601
+ ts.forEachChild(node, visit)
1602
+ }
1603
+ visit(sourceFile)
1604
+ return links
1605
+ }
1606
+
1607
+ function collectJSDocSeeLinks(sourceFile: ts.SourceFile, block: JSDocBlock): Array<ts.JSDocLink> {
1608
+ const links: Array<ts.JSDocLink> = []
1609
+ function inspectJSDoc(node: ts.Node) {
1610
+ for (const jsdoc of (node as { readonly jsDoc?: ReadonlyArray<ts.JSDoc> }).jsDoc ?? []) {
1611
+ if (jsdoc.pos !== block.range[0] || jsdoc.end !== block.range[1]) continue
1612
+ ts.forEachChild(jsdoc, function visit(child) {
1613
+ if (ts.isJSDocSeeTag(child)) {
1614
+ ts.forEachChild(child, function visitSeeTag(seeTagChild) {
1615
+ if (ts.isJSDocLink(seeTagChild)) links.push(seeTagChild)
1616
+ ts.forEachChild(seeTagChild, visitSeeTag)
1617
+ })
1618
+ return
1619
+ }
1620
+ ts.forEachChild(child, visit)
1621
+ })
1622
+ }
1623
+ }
1624
+ function visit(node: ts.Node) {
1625
+ inspectJSDoc(node)
1626
+ ts.forEachChild(node, visit)
1627
+ }
1628
+ visit(sourceFile)
1629
+ return links
1630
+ }
1631
+
1632
+ function resolvedSymbolTarget(symbol: ts.Symbol, checker: ts.TypeChecker): ts.Symbol {
1633
+ return (symbol.flags & ts.SymbolFlags.Alias) === 0 ? symbol : checker.getAliasedSymbol(symbol)
1634
+ }
1635
+
1636
+ function isLocalSourceFile(cwd: string, sourceFile: ts.SourceFile): boolean {
1637
+ if (sourceFile.isDeclarationFile) return false
1638
+ const relative = path.relative(cwd, sourceFile.fileName)
1639
+ return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative))
1640
+ }
1641
+
1642
+ function symbolDeclarations(symbol: ts.Symbol, checker: ts.TypeChecker): ReadonlyArray<ts.Declaration> {
1643
+ const target = resolvedSymbolTarget(symbol, checker)
1644
+ const declarations = new Set<ts.Declaration>()
1645
+ if (target.valueDeclaration !== undefined) declarations.add(target.valueDeclaration)
1646
+ for (const declaration of target.declarations ?? []) declarations.add(declaration)
1647
+ return Array.from(declarations)
1648
+ }
1649
+
1650
+ function symbolHasPublicJSDoc(symbol: ts.Symbol, checker: ts.TypeChecker): boolean {
1651
+ return symbolDeclarations(symbol, checker).some((declaration) => {
1652
+ const block = getNodeJSDoc(declaration)
1653
+ return block !== undefined && !block.internal && block.parsed !== undefined
1654
+ })
1655
+ }
1656
+
1657
+ function isMemberDeclaration(declaration: ts.Declaration): boolean {
1658
+ return ts.isPropertySignature(declaration) || ts.isMethodSignature(declaration) ||
1659
+ ts.isPropertyDeclaration(declaration) || ts.isMethodDeclaration(declaration) ||
1660
+ ts.isGetAccessorDeclaration(declaration) || ts.isSetAccessorDeclaration(declaration)
1661
+ }
1662
+
1663
+ function undocumentedSeeLinkTarget(
1664
+ symbol: ts.Symbol,
1665
+ checker: ts.TypeChecker,
1666
+ cwd: string
1667
+ ): ts.Declaration | undefined {
1668
+ const localDeclarations = symbolDeclarations(symbol, checker).filter((declaration) =>
1669
+ isMemberDeclaration(declaration) && isLocalSourceFile(cwd, declaration.getSourceFile())
1670
+ )
1671
+ if (localDeclarations.length === 0 || symbolHasPublicJSDoc(symbol, checker)) return undefined
1672
+ return localDeclarations[0]
1673
+ }
1674
+
1675
+ function inlineLinkSymbol(
1676
+ symbol: ts.Symbol,
1677
+ cwd: string,
1678
+ checker: ts.TypeChecker
1679
+ ): ParsedInlineLinkSymbol | undefined {
1680
+ const target = resolvedSymbolTarget(symbol, checker)
1681
+ const declaration = target.valueDeclaration ?? target.declarations?.[0]
1682
+ if (declaration === undefined) return undefined
1683
+ return {
1684
+ file: normalizeFile(cwd, declaration.getSourceFile().fileName),
1685
+ range: nodeRange(declaration)
1686
+ }
1687
+ }
1688
+
1689
+ function attachSeeLinkSymbolsFromSourceFile<
1690
+ T extends ParsedModuleTags | ParsedDeclarationTags | ParsedNamespaceTags | ParsedMemberTags
1691
+ >(
1692
+ tags: T,
1693
+ sourceFile: ts.SourceFile,
1694
+ block: JSDocBlock,
1695
+ linkContext: { readonly checker: ts.TypeChecker; readonly entry: ProgramCacheEntry; readonly cwd: string }
1696
+ ): T {
1697
+ const resolved = new Map<
1698
+ string,
1699
+ Array<{ readonly range: readonly [number, number]; readonly symbol?: ParsedInlineLinkSymbol }>
1700
+ >()
1701
+ for (const link of collectJSDocLinks(sourceFile, block)) {
1702
+ const text = link.getText(sourceFile)
1703
+ const target = extractInlineLinkTarget(text)
1704
+ if (target === "" || urlRegex.test(target)) continue
1705
+ const symbol = resolveJSDocLinkSymbol(link, linkContext.checker)
1706
+ const info = symbol === undefined ? undefined : inlineLinkSymbol(symbol, linkContext.cwd, linkContext.checker)
1707
+ const items = resolved.get(text) ?? []
1708
+ items.push(info === undefined ? { range: [link.pos, link.end] } : { range: [link.pos, link.end], symbol: info })
1709
+ resolved.set(text, items)
1710
+ }
1711
+ return {
1712
+ ...tags,
1713
+ see: tags.see.map((tag) => ({
1714
+ ...tag,
1715
+ links: tag.links.map((link) => {
1716
+ const items = resolved.get(link.raw)
1717
+ const info = items?.shift()
1718
+ if (info === undefined) return link
1719
+ return info.symbol === undefined
1720
+ ? { ...link, range: info.range }
1721
+ : { ...link, range: info.range, symbol: info.symbol }
1722
+ })
1723
+ }))
1724
+ }
1725
+ }
1726
+
1727
+ function attachSeeLinkSymbols<T extends ParsedDeclarationTags | ParsedNamespaceTags | ParsedMemberTags>(
1728
+ tags: T,
1729
+ node: ts.Node,
1730
+ block: JSDocBlock,
1731
+ linkContext: { readonly checker: ts.TypeChecker; readonly entry: ProgramCacheEntry; readonly cwd: string }
1732
+ ): T {
1733
+ return attachSeeLinkSymbolsFromSourceFile(tags, node.getSourceFile(), block, linkContext)
1734
+ }
1735
+
1736
+ export interface JSDocModelDiagnostic extends JSDocDiagnostic {
1737
+ readonly range: readonly [number, number]
1738
+ }
1739
+
1740
+ export interface JSDocModelFile extends ParsedJSDocFile {
1741
+ readonly file: string
1742
+ readonly hash: string
1743
+ readonly diagnostics: ReadonlyArray<JSDocModelDiagnostic>
1744
+ readonly imports?: ParsedJSDocImports
1745
+ }
1746
+
1747
+ export interface JSDocModel {
1748
+ readonly version: 2
1749
+ readonly generatedBy: "@effect/jsdocs"
1750
+ readonly generatedAt: string
1751
+ readonly files: ReadonlyArray<JSDocModelFile>
1752
+ readonly apis: ReadonlyArray<JSDocApi>
1753
+ }
1754
+
1755
+ export interface JSDocConfig {
1756
+ readonly tsconfig: string
1757
+ readonly include: ReadonlyArray<string>
1758
+ readonly exclude?: ReadonlyArray<string>
1759
+ readonly output: string
1760
+ }
1761
+
1762
+ export interface ExtractJSDocsOptions extends JSDocConfig {
1763
+ readonly cwd?: string
1764
+ }
1765
+
1766
+ function isIdentifierName(value: string): boolean {
1767
+ return /^[$A-Z_a-z][$\w]*$/.test(value)
1768
+ }
1769
+
1770
+ function renderInlineLinks(text: string): string {
1771
+ return text.replace(/\{@link\s+([^}]+)\}/g, (_match, content: string) => {
1772
+ const pipeIndex = content.indexOf("|")
1773
+ const beforeLabel = pipeIndex === -1 ? content.trim() : content.slice(0, pipeIndex).trim()
1774
+ const target = beforeLabel.split(/\s+/)[0] ?? ""
1775
+ const label = pipeIndex === -1
1776
+ ? beforeLabel.slice(target.length).trim() || target
1777
+ : content.slice(pipeIndex + 1).trim() || target
1778
+ return `\`${label.replace(/:var$/, "")}\``
1779
+ })
1780
+ }
1781
+
1782
+ function renderDescription(description: ParsedDescription): ParsedDescription {
1783
+ return {
1784
+ short: renderInlineLinks(description.short),
1785
+ whenToUse: description.whenToUse === null ? null : renderInlineLinks(description.whenToUse),
1786
+ details: description.details === null ? null : renderInlineLinks(description.details),
1787
+ gotchas: description.gotchas === null ? null : renderInlineLinks(description.gotchas)
1788
+ }
1789
+ }
1790
+
1791
+ function renderExamples(examples: ReadonlyArray<ParsedExample>): ReadonlyArray<ParsedExample> {
1792
+ return examples.map((example) => ({
1793
+ ...example,
1794
+ body: example.body === null ? null : renderInlineLinks(example.body)
1795
+ }))
1796
+ }
1797
+
1798
+ function apiTags(
1799
+ tags: ParsedDeclarationTags | ParsedNamespaceTags | ParsedMemberTags
1800
+ ): JSDocApiTags {
1801
+ return {
1802
+ category: "category" in tags ? tags.category : null,
1803
+ since: tags.since,
1804
+ deprecated: tags.deprecated,
1805
+ default: "default" in tags ? tags.default : null
1806
+ }
1807
+ }
1808
+
1809
+ function unresolvedSeeTag(tag: ParsedSeeTag): JSDocApiSeeTag {
1810
+ return {
1811
+ text: renderInlineLinks(tag.text),
1812
+ links: tag.links.map((link) => ({
1813
+ ...link,
1814
+ resolution: { _tag: "Unresolved", reason: "not-found", candidates: [] }
1815
+ }))
1816
+ }
1817
+ }
1818
+
1819
+ function unresolvedSee(tags: ReadonlyArray<ParsedSeeTag>): ReadonlyArray<JSDocApiSeeTag> {
1820
+ return tags.map(unresolvedSeeTag)
1821
+ }
1822
+
1823
+ function apiId(kind: JSDocApiKind, bucket: ExportBucket | null, apiFqn: string): string {
1824
+ return `${kind}:${bucket ?? "none"}:${apiFqn}`
1825
+ }
1826
+
1827
+ function importGuidance(
1828
+ imports: ParsedJSDocImports,
1829
+ kind: JSDocApiKind,
1830
+ bucket: ExportBucket | null,
1831
+ apiName: string
1832
+ ): JSDocApiImportGuidance | null {
1833
+ if (kind !== "root-declaration" || bucket !== "value" || !isIdentifierName(apiName)) {
1834
+ return null
1835
+ }
1836
+ if (imports.flatNames.includes(apiName) && imports.barrel !== null) {
1837
+ return {
1838
+ style: "named-barrel",
1839
+ importDeclaration: `import { ${apiName} } from "${imports.barrel.module}"`,
1840
+ usage: apiName
1841
+ }
1842
+ }
1843
+ if (imports.barrel?.type === "namespace") {
1844
+ if (!isIdentifierName(imports.barrel.name)) return null
1845
+ return {
1846
+ style: "namespace-barrel",
1847
+ importDeclaration: `import { ${imports.barrel.name} } from "${imports.barrel.module}"`,
1848
+ usage: `${imports.barrel.name}.${apiName}`
1849
+ }
1850
+ }
1851
+ if (imports.barrel?.type === "flat") {
1852
+ return {
1853
+ style: "named-barrel",
1854
+ importDeclaration: `import { ${apiName} } from "${imports.barrel.module}"`,
1855
+ usage: apiName
1856
+ }
1857
+ }
1858
+ return {
1859
+ style: "named-module",
1860
+ importDeclaration: `import { ${apiName} } from "${imports.module}"`,
1861
+ usage: apiName
1862
+ }
1863
+ }
1864
+
1865
+ function makeApi(input: {
1866
+ readonly file: JSDocModelFile
1867
+ readonly imports: ParsedJSDocImports
1868
+ readonly kind: JSDocApiKind
1869
+ readonly bucket: ExportBucket | null
1870
+ readonly apiName: string
1871
+ readonly localName: string
1872
+ readonly signature: string | null
1873
+ readonly parentApiName: string | null
1874
+ readonly namespacePath: ReadonlyArray<string>
1875
+ readonly memberPath: ReadonlyArray<string>
1876
+ readonly sourcePath: ReadonlyArray<string | number>
1877
+ readonly sourceRange: readonly [number, number]
1878
+ readonly description: ParsedDescription
1879
+ readonly examples: ReadonlyArray<ParsedExample>
1880
+ readonly tags: ParsedDeclarationTags | ParsedNamespaceTags | ParsedMemberTags
1881
+ }): JSDocApi {
1882
+ const apiFqn = `${input.imports.module}.${input.apiName}`
1883
+ return {
1884
+ id: apiId(input.kind, input.bucket, apiFqn),
1885
+ kind: input.kind,
1886
+ moduleName: input.imports.module,
1887
+ apiName: input.apiName,
1888
+ localName: input.localName,
1889
+ signature: input.signature,
1890
+ parentApiName: input.parentApiName,
1891
+ apiFqn,
1892
+ hasFqnCollision: false,
1893
+ bucket: input.bucket,
1894
+ importable: input.kind === "root-declaration",
1895
+ namespacePath: input.namespacePath,
1896
+ memberPath: input.memberPath,
1897
+ source: {
1898
+ file: input.file.file,
1899
+ path: input.sourcePath,
1900
+ range: input.sourceRange
1901
+ },
1902
+ description: renderDescription(input.description),
1903
+ examples: renderExamples(input.examples),
1904
+ tags: apiTags(input.tags),
1905
+ see: unresolvedSee(input.tags.see),
1906
+ importGuidance: importGuidance(input.imports, input.kind, input.bucket, input.apiName)
1907
+ }
1908
+ }
1909
+
1910
+ function buildJSDocApis(files: ReadonlyArray<JSDocModelFile>): ReadonlyArray<JSDocApi> {
1911
+ const apis: Array<JSDocApi> = []
1912
+ const addMembers = (
1913
+ file: JSDocModelFile,
1914
+ imports: ParsedJSDocImports,
1915
+ members: ReadonlyArray<ParsedMember>,
1916
+ parentApiName: string,
1917
+ namespacePath: ReadonlyArray<string>,
1918
+ memberPath: ReadonlyArray<string>,
1919
+ sourcePath: ReadonlyArray<string | number>
1920
+ ) => {
1921
+ members.forEach((member, index) => {
1922
+ const nextMemberPath = [...memberPath, member.name]
1923
+ const apiName = `${parentApiName}.${nextMemberPath.join(".")}`
1924
+ apis.push(makeApi({
1925
+ file,
1926
+ imports,
1927
+ kind: "member",
1928
+ bucket: null,
1929
+ apiName,
1930
+ localName: member.name,
1931
+ signature: member.signature,
1932
+ parentApiName,
1933
+ namespacePath,
1934
+ memberPath: nextMemberPath,
1935
+ sourcePath: [...sourcePath, "members", index],
1936
+ sourceRange: member.range,
1937
+ description: member.description,
1938
+ examples: member.examples,
1939
+ tags: member.tags
1940
+ }))
1941
+ addMembers(file, imports, member.members, parentApiName, namespacePath, nextMemberPath, [
1942
+ ...sourcePath,
1943
+ "members",
1944
+ index
1945
+ ])
1946
+ })
1947
+ }
1948
+ const addNamespaces = (
1949
+ file: JSDocModelFile,
1950
+ imports: ParsedJSDocImports,
1951
+ namespaces: ReadonlyArray<ParsedNamespace>,
1952
+ namespacePath: ReadonlyArray<string>,
1953
+ sourcePath: ReadonlyArray<string | number>
1954
+ ) => {
1955
+ namespaces.forEach((namespace, index) => {
1956
+ const nextNamespacePath = [...namespacePath, namespace.name]
1957
+ const namespaceApiName = nextNamespacePath.join(".")
1958
+ apis.push(makeApi({
1959
+ file,
1960
+ imports,
1961
+ kind: "namespace",
1962
+ bucket: null,
1963
+ apiName: namespaceApiName,
1964
+ localName: namespace.name,
1965
+ signature: namespace.signature,
1966
+ parentApiName: namespacePath.length === 0 ? null : namespacePath.join("."),
1967
+ namespacePath: nextNamespacePath,
1968
+ memberPath: [],
1969
+ sourcePath: [...sourcePath, index],
1970
+ sourceRange: namespace.range,
1971
+ description: namespace.description,
1972
+ examples: namespace.examples,
1973
+ tags: namespace.tags
1974
+ }))
1975
+ namespace.declarations.forEach((declaration, declarationIndex) => {
1976
+ const apiName = `${namespaceApiName}.${declaration.name}`
1977
+ apis.push(makeApi({
1978
+ file,
1979
+ imports,
1980
+ kind: "namespace-declaration",
1981
+ bucket: "type",
1982
+ apiName,
1983
+ localName: declaration.name,
1984
+ signature: declaration.signature,
1985
+ parentApiName: namespaceApiName,
1986
+ namespacePath: nextNamespacePath,
1987
+ memberPath: [],
1988
+ sourcePath: [...sourcePath, index, "declarations", declarationIndex],
1989
+ sourceRange: declaration.range,
1990
+ description: declaration.description,
1991
+ examples: declaration.examples,
1992
+ tags: declaration.tags
1993
+ }))
1994
+ addMembers(file, imports, declaration.members, apiName, nextNamespacePath, [], [
1995
+ ...sourcePath,
1996
+ index,
1997
+ "declarations",
1998
+ declarationIndex
1999
+ ])
2000
+ })
2001
+ addNamespaces(file, imports, namespace.namespaces, nextNamespacePath, [...sourcePath, index, "namespaces"])
2002
+ })
2003
+ }
2004
+ for (const file of files) {
2005
+ if (file.imports === undefined) continue
2006
+ const imports = file.imports
2007
+ file.declarations.forEach((declaration, index) => {
2008
+ apis.push(makeApi({
2009
+ file,
2010
+ imports,
2011
+ kind: "root-declaration",
2012
+ bucket: declaration.bucket,
2013
+ apiName: declaration.name,
2014
+ localName: declaration.name,
2015
+ signature: declaration.signature,
2016
+ parentApiName: null,
2017
+ namespacePath: [],
2018
+ memberPath: [],
2019
+ sourcePath: ["declarations", index],
2020
+ sourceRange: declaration.range,
2021
+ description: declaration.description,
2022
+ examples: declaration.examples,
2023
+ tags: declaration.tags
2024
+ }))
2025
+ addMembers(file, imports, declaration.members, declaration.name, [], [], ["declarations", index])
2026
+ })
2027
+ addNamespaces(file, imports, file.namespaces, [], ["namespaces"])
2028
+ }
2029
+ return resolveJSDocApiSeeLinks(markFqnCollisions(apis))
2030
+ }
2031
+
2032
+ function markFqnCollisions(apis: ReadonlyArray<JSDocApi>): ReadonlyArray<JSDocApi> {
2033
+ const counts = new Map<string, number>()
2034
+ for (const api of apis) counts.set(api.apiFqn, (counts.get(api.apiFqn) ?? 0) + 1)
2035
+ return apis.map((api) => ({ ...api, hasFqnCollision: (counts.get(api.apiFqn) ?? 0) > 1 }))
2036
+ }
2037
+
2038
+ function normalizeSeeTarget(target: string): ReadonlyArray<string> {
2039
+ const withoutKind = target.replace(/:[A-Za-z]+$/, "")
2040
+ const out = [withoutKind]
2041
+ if (withoutKind.endsWith("_")) out.push(withoutKind.slice(0, -1))
2042
+ return Array.from(new Set(out.filter((item) => item.length > 0)))
2043
+ }
2044
+
2045
+ function sourceRangeKey(file: string, range: readonly [number, number]): string {
2046
+ return `${file}:${range[0]}:${range[1]}`
2047
+ }
2048
+
2049
+ function rangeContains(outer: readonly [number, number], inner: readonly [number, number]): boolean {
2050
+ return outer[0] <= inner[0] && inner[1] <= outer[1]
2051
+ }
2052
+
2053
+ function rangeOverlaps(self: readonly [number, number], that: readonly [number, number]): boolean {
2054
+ return self[0] <= that[1] && that[0] <= self[1]
2055
+ }
2056
+
2057
+ function rangeWidth(range: readonly [number, number]): number {
2058
+ return range[1] - range[0]
2059
+ }
2060
+
2061
+ function seeTargetNames(link: ParsedInlineLink): ReadonlySet<string> {
2062
+ const names = new Set<string>()
2063
+ const add = (target: string) => {
2064
+ for (const normalized of normalizeSeeTarget(target)) {
2065
+ const parts = normalized.split(".").filter((part) => part.length > 0)
2066
+ for (const part of parts) names.add(part)
2067
+ if (parts.length > 0) names.add(parts.join("."))
2068
+ }
2069
+ }
2070
+ add(link.target)
2071
+ if (link.text !== null) add(link.text)
2072
+ return names
2073
+ }
2074
+
2075
+ function apiMatchesSeeTarget(api: JSDocApi, names: ReadonlySet<string>): boolean {
2076
+ if (names.size === 0) return true
2077
+ if (names.has(api.localName) || names.has(api.apiName)) return true
2078
+ for (const name of names) {
2079
+ if (api.apiName.endsWith(`.${name}`)) return true
2080
+ }
2081
+ return false
2082
+ }
2083
+
2084
+ function createJSDocApiSeeLinkResolver(apis: ReadonlyArray<JSDocApi>) {
2085
+ const byModuleAndName = new Map<string, JSDocApi>()
2086
+ const byLocalName = new Map<string, Array<JSDocApi>>()
2087
+ const bySourceRange = new Map<string, JSDocApi>()
2088
+ const bySourceFile = new Map<string, Array<JSDocApi>>()
2089
+ for (const api of apis) {
2090
+ byModuleAndName.set(`${api.moduleName}:${api.apiName}`, api)
2091
+ bySourceRange.set(sourceRangeKey(api.source.file, api.source.range), api)
2092
+ const sourceApis = bySourceFile.get(api.source.file) ?? []
2093
+ sourceApis.push(api)
2094
+ bySourceFile.set(api.source.file, sourceApis)
2095
+ for (const name of new Set([api.apiName, api.localName])) {
2096
+ const existing = byLocalName.get(name) ?? []
2097
+ existing.push(api)
2098
+ byLocalName.set(name, existing)
2099
+ }
2100
+ }
2101
+ const resolveSymbol = (link: ParsedInlineLink): JSDocApiSeeLinkResolution | undefined => {
2102
+ if (link.symbol === undefined) return undefined
2103
+ const symbol = link.symbol
2104
+ const exact = bySourceRange.get(sourceRangeKey(symbol.file, symbol.range))
2105
+ if (exact !== undefined) return { _tag: "Resolved", apiId: exact.id, apiFqn: exact.apiFqn }
2106
+ const names = seeTargetNames(link)
2107
+ const candidates = (bySourceFile.get(symbol.file) ?? []).filter((api) =>
2108
+ apiMatchesSeeTarget(api, names) &&
2109
+ (rangeContains(symbol.range, api.source.range) ||
2110
+ rangeContains(api.source.range, symbol.range) ||
2111
+ rangeOverlaps(symbol.range, api.source.range))
2112
+ ).sort((self, that) => rangeWidth(self.source.range) - rangeWidth(that.source.range))
2113
+ const unique = Array.from(new Map(candidates.map((candidate) => [candidate.id, candidate])).values())
2114
+ if (unique.length === 1) return { _tag: "Resolved", apiId: unique[0].id, apiFqn: unique[0].apiFqn }
2115
+ if (unique.length > 1) {
2116
+ return { _tag: "Unresolved", reason: "ambiguous", candidates: unique.map((candidate) => candidate.id) }
2117
+ }
2118
+ const sameFileByName = (bySourceFile.get(symbol.file) ?? []).filter((api) => apiMatchesSeeTarget(api, names))
2119
+ const uniqueByName = Array.from(new Map(sameFileByName.map((candidate) => [candidate.id, candidate])).values())
2120
+ if (uniqueByName.length === 1) {
2121
+ return { _tag: "Resolved", apiId: uniqueByName[0].id, apiFqn: uniqueByName[0].apiFqn }
2122
+ }
2123
+ if (uniqueByName.length > 1) {
2124
+ return { _tag: "Unresolved", reason: "ambiguous", candidates: uniqueByName.map((candidate) => candidate.id) }
2125
+ }
2126
+ return undefined
2127
+ }
2128
+ return (
2129
+ context: { readonly moduleName: string; readonly namespacePath: ReadonlyArray<string> },
2130
+ link: ParsedInlineLink
2131
+ ): JSDocApiSeeLinkResolution => {
2132
+ const symbolResolution = resolveSymbol(link)
2133
+ if (symbolResolution !== undefined) return symbolResolution
2134
+ const targets = new Set<string>()
2135
+ for (const target of normalizeSeeTarget(link.target)) targets.add(target)
2136
+ if (link.text !== null) {
2137
+ for (const target of normalizeSeeTarget(link.text)) targets.add(target)
2138
+ }
2139
+ for (const target of targets) {
2140
+ const sameModule = byModuleAndName.get(`${context.moduleName}:${target}`)
2141
+ if (sameModule !== undefined) return { _tag: "Resolved", apiId: sameModule.id, apiFqn: sameModule.apiFqn }
2142
+ if (!target.includes(".") && context.namespacePath.length > 0) {
2143
+ const sameNamespace = byModuleAndName.get(
2144
+ `${context.moduleName}:${[...context.namespacePath, target].join(".")}`
2145
+ )
2146
+ if (sameNamespace !== undefined) {
2147
+ return { _tag: "Resolved", apiId: sameNamespace.id, apiFqn: sameNamespace.apiFqn }
2148
+ }
2149
+ }
2150
+ }
2151
+ const candidates = Array.from(targets).flatMap((target) => byLocalName.get(target) ?? [])
2152
+ const unique = Array.from(new Map(candidates.map((candidate) => [candidate.id, candidate])).values())
2153
+ if (unique.length === 1) return { _tag: "Resolved", apiId: unique[0].id, apiFqn: unique[0].apiFqn }
2154
+ if (unique.length > 1) {
2155
+ return { _tag: "Unresolved", reason: "ambiguous", candidates: unique.map((candidate) => candidate.id) }
2156
+ }
2157
+ return { _tag: "Unresolved", reason: "not-found", candidates: [] }
2158
+ }
2159
+ }
2160
+
2161
+ function resolveJSDocApiSeeLinks(apis: ReadonlyArray<JSDocApi>): ReadonlyArray<JSDocApi> {
2162
+ const resolve = createJSDocApiSeeLinkResolver(apis)
2163
+ return apis.map((api) => ({
2164
+ ...api,
2165
+ see: api.see.map((tag) => ({
2166
+ ...tag,
2167
+ links: tag.links.map((link) => ({ ...link, resolution: resolve(api, link) }))
2168
+ }))
2169
+ }))
2170
+ }
2171
+
2172
+ function sameDiagnostic(self: JSDocModelDiagnostic, that: JSDocModelDiagnostic): boolean {
2173
+ return self.code === that.code && self.message === that.message &&
2174
+ self.range[0] === that.range[0] && self.range[1] === that.range[1]
2175
+ }
2176
+
2177
+ function unresolvedPublicSeeDiagnostic(link: JSDocApiSeeLink): JSDocModelDiagnostic | undefined {
2178
+ if (link.resolution._tag === "Resolved" || link.range === undefined) return undefined
2179
+ const message = link.resolution.reason === "ambiguous"
2180
+ ? `@see link ${link.raw} is ambiguous; it must resolve to exactly one public JSDoc API. Candidates: ${
2181
+ link.resolution.candidates.join(", ")
2182
+ }`
2183
+ : `@see link ${link.raw} does not resolve to a public JSDoc API. Check that the target is exported and has valid public JSDoc.`
2184
+ return { ...diagnostic("public-see-target", message), range: link.range }
2185
+ }
2186
+
2187
+ function appendPublicSeeDiagnostics(
2188
+ files: ReadonlyArray<JSDocModelFile>,
2189
+ apis: ReadonlyArray<JSDocApi>
2190
+ ): { readonly files: ReadonlyArray<JSDocModelFile>; readonly added: boolean } {
2191
+ const diagnosticsByFile = new Map(files.map((file) => [file.file, [...file.diagnostics]]))
2192
+ let added = false
2193
+ for (const api of apis) {
2194
+ const diagnostics = diagnosticsByFile.get(api.source.file)
2195
+ if (diagnostics === undefined) continue
2196
+ for (const tag of api.see) {
2197
+ for (const link of tag.links) {
2198
+ const item = unresolvedPublicSeeDiagnostic(link)
2199
+ if (item === undefined || diagnostics.some((diagnostic) => sameDiagnostic(diagnostic, item))) continue
2200
+ diagnostics.push(item)
2201
+ added = true
2202
+ }
2203
+ }
2204
+ }
2205
+ if (!added) return { files, added }
2206
+ return {
2207
+ added,
2208
+ files: files.map((file) => ({
2209
+ ...file,
2210
+ diagnostics: diagnosticsByFile.get(file.file) ?? file.diagnostics
2211
+ }))
2212
+ }
2213
+ }
2214
+
2215
+ function moduleSeeTags(
2216
+ file: JSDocModelFile,
2217
+ sourceFile: ts.SourceFile,
2218
+ linkContext: { readonly checker: ts.TypeChecker; readonly entry: ProgramCacheEntry; readonly cwd: string }
2219
+ ): ReadonlyArray<JSDocApiSeeTag> {
2220
+ if (file.moduleJSDoc === undefined) return []
2221
+ const block = parseLooseJSDocBlock(file.moduleJSDoc.raw, [file.moduleJSDoc.range[0], file.moduleJSDoc.range[1]])
2222
+ if (block.internal) return []
2223
+ const tags = buildTags("module", block.tags)
2224
+ const moduleTags: ParsedModuleTags = tags._tag === "Success"
2225
+ ? tags.value as ParsedModuleTags
2226
+ : {
2227
+ since: "0.0.0",
2228
+ deprecated: null,
2229
+ see: block.tags.filter((tag) => tag.name === "see" && tag.value.trim() !== "").map((tag) =>
2230
+ parseSeeTag(tag.value.trim())
2231
+ )
2232
+ }
2233
+ const withSymbols = attachSeeLinkSymbolsFromSourceFile(moduleTags, sourceFile, block, linkContext)
2234
+ return unresolvedSee(withSymbols.see)
2235
+ }
2236
+
2237
+ function appendModulePublicSeeDiagnostics(
2238
+ files: ReadonlyArray<JSDocModelFile>,
2239
+ apis: ReadonlyArray<JSDocApi>,
2240
+ context: {
2241
+ readonly sourceFilesByFile: ReadonlyMap<string, ts.SourceFile>
2242
+ readonly checker: ts.TypeChecker
2243
+ readonly entry: ProgramCacheEntry
2244
+ readonly cwd: string
2245
+ }
2246
+ ): { readonly files: ReadonlyArray<JSDocModelFile>; readonly added: boolean } {
2247
+ const diagnosticsByFile = new Map(files.map((file) => [file.file, [...file.diagnostics]]))
2248
+ const resolve = createJSDocApiSeeLinkResolver(apis)
2249
+ let added = false
2250
+ for (const file of files) {
2251
+ if (file.imports === undefined || file.moduleJSDoc === undefined) continue
2252
+ const sourceFile = context.sourceFilesByFile.get(file.file)
2253
+ const diagnostics = diagnosticsByFile.get(file.file)
2254
+ if (sourceFile === undefined || diagnostics === undefined) continue
2255
+ for (const tag of moduleSeeTags(file, sourceFile, context)) {
2256
+ for (const link of tag.links) {
2257
+ const item = unresolvedPublicSeeDiagnostic({
2258
+ ...link,
2259
+ resolution: resolve({ moduleName: file.imports.module, namespacePath: [] }, link)
2260
+ })
2261
+ if (item === undefined || diagnostics.some((diagnostic) => sameDiagnostic(diagnostic, item))) continue
2262
+ diagnostics.push(item)
2263
+ added = true
2264
+ }
2265
+ }
2266
+ }
2267
+ if (!added) return { files, added }
2268
+ return {
2269
+ added,
2270
+ files: files.map((file) => ({
2271
+ ...file,
2272
+ diagnostics: diagnosticsByFile.get(file.file) ?? file.diagnostics
2273
+ }))
2274
+ }
2275
+ }
2276
+
2277
+ function buildJSDocApisWithPublicSeeDiagnostics(
2278
+ files: ReadonlyArray<JSDocModelFile>,
2279
+ context?: {
2280
+ readonly sourceFilesByFile: ReadonlyMap<string, ts.SourceFile>
2281
+ readonly checker: ts.TypeChecker
2282
+ readonly entry: ProgramCacheEntry
2283
+ readonly cwd: string
2284
+ }
2285
+ ): {
2286
+ readonly files: ReadonlyArray<JSDocModelFile>
2287
+ readonly apis: ReadonlyArray<JSDocApi>
2288
+ } {
2289
+ let current = files
2290
+ for (let index = 0; index < 5; index++) {
2291
+ const apis = buildJSDocApis(current)
2292
+ const publicSee = appendPublicSeeDiagnostics(current, apis)
2293
+ const moduleSee = context === undefined
2294
+ ? { files: publicSee.files, added: false }
2295
+ : appendModulePublicSeeDiagnostics(publicSee.files, apis, context)
2296
+ const next = { files: moduleSee.files, added: publicSee.added || moduleSee.added }
2297
+ if (!next.added) return { files: current, apis }
2298
+ current = next.files
2299
+ }
2300
+ return { files: current, apis: buildJSDocApis(current) }
2301
+ }
2302
+
2303
+ interface ExampleImportPolicy {
2304
+ readonly allowedNamedBySource: ReadonlyMap<string, ReadonlySet<string>>
2305
+ readonly namespaceModuleBySource: ReadonlyMap<string, { readonly barrelModule: string; readonly name: string }>
2306
+ readonly flatModuleBySource: ReadonlyMap<
2307
+ string,
2308
+ { readonly barrelModule: string; readonly names: ReadonlySet<string> }
2309
+ >
2310
+ readonly namedModuleBySource: ReadonlyMap<string, ReadonlySet<string>>
2311
+ }
2312
+
2313
+ function createExampleImportPolicy(files: ReadonlyArray<JSDocModelFile>): ExampleImportPolicy {
2314
+ const allowedNamed = new Map<string, Set<string>>()
2315
+ const namespaceModuleBySource = new Map<string, { readonly barrelModule: string; readonly name: string }>()
2316
+ const flatModuleBySource = new Map<string, { readonly barrelModule: string; readonly names: ReadonlySet<string> }>()
2317
+ const namedModuleBySource = new Map<string, ReadonlySet<string>>()
2318
+ const addAllowed = (source: string, name: string) => {
2319
+ const names = allowedNamed.get(source) ?? new Set<string>()
2320
+ names.add(name)
2321
+ allowedNamed.set(source, names)
2322
+ }
2323
+ for (const file of files) {
2324
+ if (file.imports === undefined) continue
2325
+ const rootValues = file.declarations.filter((declaration) =>
2326
+ declaration.bucket === "value" && isIdentifierName(declaration.name)
2327
+ ).map((declaration) => declaration.name)
2328
+ if (file.imports.barrel?.type === "namespace") {
2329
+ addAllowed(file.imports.barrel.module, file.imports.barrel.name)
2330
+ for (const name of file.imports.flatNames) addAllowed(file.imports.barrel.module, name)
2331
+ namespaceModuleBySource.set(file.imports.module, {
2332
+ barrelModule: file.imports.barrel.module,
2333
+ name: file.imports.barrel.name
2334
+ })
2335
+ continue
2336
+ }
2337
+ if (file.imports.barrel?.type === "flat") {
2338
+ for (const name of new Set([...rootValues, ...file.imports.flatNames])) {
2339
+ addAllowed(file.imports.barrel.module, name)
2340
+ }
2341
+ flatModuleBySource.set(file.imports.module, {
2342
+ barrelModule: file.imports.barrel.module,
2343
+ names: new Set([...rootValues, ...file.imports.flatNames])
2344
+ })
2345
+ continue
2346
+ }
2347
+ for (const name of rootValues) addAllowed(file.imports.module, name)
2348
+ namedModuleBySource.set(file.imports.module, new Set(rootValues))
2349
+ }
2350
+ return { allowedNamedBySource: allowedNamed, namespaceModuleBySource, flatModuleBySource, namedModuleBySource }
2351
+ }
2352
+
2353
+ function importSpecifierName(specifier: ts.ImportSpecifier): string {
2354
+ return specifier.propertyName?.text ?? specifier.name.text
2355
+ }
2356
+
2357
+ function validateExampleImports(
2358
+ code: string,
2359
+ policy: ExampleImportPolicy
2360
+ ): ReadonlyArray<JSDocDiagnostic> {
2361
+ const diagnostics: Array<JSDocDiagnostic> = []
2362
+ const sourceFile = ts.createSourceFile("example.ts", code, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS)
2363
+ for (const statement of sourceFile.statements) {
2364
+ if (!ts.isImportDeclaration(statement) || !ts.isStringLiteralLike(statement.moduleSpecifier)) continue
2365
+ if (statement.importClause?.isTypeOnly) continue
2366
+ const source = statement.moduleSpecifier.text
2367
+ const namedAllowed = policy.allowedNamedBySource.get(source)
2368
+ const namespaceModule = policy.namespaceModuleBySource.get(source)
2369
+ const flatModule = policy.flatModuleBySource.get(source)
2370
+ const namedModule = policy.namedModuleBySource.get(source)
2371
+ const clause = statement.importClause
2372
+ if (clause === undefined) continue
2373
+ if (namespaceModule !== undefined) {
2374
+ diagnostics.push(diagnostic(
2375
+ "example-import-style",
2376
+ `JSDoc examples should use \`import { ${namespaceModule.name} } from "${namespaceModule.barrelModule}"\` instead of importing from "${source}"`
2377
+ ))
2378
+ continue
2379
+ }
2380
+ if (flatModule !== undefined) {
2381
+ diagnostics.push(diagnostic(
2382
+ "example-import-style",
2383
+ `JSDoc examples should import ${
2384
+ Array.from(flatModule.names).map((name) => `\`${name}\``).join(", ")
2385
+ } from "${flatModule.barrelModule}" instead of "${source}"`
2386
+ ))
2387
+ continue
2388
+ }
2389
+ if (clause.namedBindings !== undefined && ts.isNamespaceImport(clause.namedBindings)) {
2390
+ if (namedAllowed !== undefined || namedModule !== undefined) {
2391
+ diagnostics.push(diagnostic("example-import-style", `JSDoc examples should use named imports from "${source}"`))
2392
+ }
2393
+ continue
2394
+ }
2395
+ if (clause.name !== undefined && (namedAllowed !== undefined || namedModule !== undefined)) {
2396
+ diagnostics.push(
2397
+ diagnostic("example-import-style", `JSDoc examples should not use default imports from "${source}"`)
2398
+ )
2399
+ }
2400
+ if (clause.namedBindings !== undefined && ts.isNamedImports(clause.namedBindings) && namedAllowed !== undefined) {
2401
+ for (const specifier of clause.namedBindings.elements) {
2402
+ if (specifier.isTypeOnly) continue
2403
+ const imported = importSpecifierName(specifier)
2404
+ if (!namedAllowed.has(imported)) {
2405
+ diagnostics.push(diagnostic(
2406
+ "example-import-style",
2407
+ `JSDoc example import \`${imported}\` from "${source}" is not a canonical public API import`
2408
+ ))
2409
+ }
2410
+ }
2411
+ }
2412
+ }
2413
+ return diagnostics
2414
+ }
2415
+
2416
+ function appendExampleImportDiagnostics(files: ReadonlyArray<JSDocModelFile>): ReadonlyArray<JSDocModelFile> {
2417
+ const policy = createExampleImportPolicy(files)
2418
+ const checkExamples = (
2419
+ examples: ReadonlyArray<ParsedExample>,
2420
+ range: readonly [number, number] = [0, 0] as const
2421
+ ): ReadonlyArray<JSDocModelDiagnostic> =>
2422
+ examples.flatMap((example) => validateExampleImports(example.code, policy).map((item) => ({ ...item, range })))
2423
+ const checkModuleExamples = (moduleJSDoc: ParsedModuleJSDoc | undefined): ReadonlyArray<JSDocModelDiagnostic> => {
2424
+ if (moduleJSDoc === undefined) return []
2425
+ const block = parseLooseJSDocBlock(moduleJSDoc.raw, [moduleJSDoc.range[0], moduleJSDoc.range[1]])
2426
+ if (block.internal) return []
2427
+ return checkExamples(parseModuleExamples(block).examples, moduleJSDoc.range)
2428
+ }
2429
+ const checkMembers = (members: ReadonlyArray<ParsedMember>): ReadonlyArray<JSDocModelDiagnostic> =>
2430
+ members.flatMap((member) => [
2431
+ ...checkExamples(member.examples),
2432
+ ...checkMembers(member.members)
2433
+ ])
2434
+ const checkNamespaces = (namespaces: ReadonlyArray<ParsedNamespace>): ReadonlyArray<JSDocModelDiagnostic> =>
2435
+ namespaces.flatMap((namespace) => [
2436
+ ...checkExamples(namespace.examples),
2437
+ ...namespace.declarations.flatMap((declaration) => [
2438
+ ...checkExamples(declaration.examples),
2439
+ ...checkMembers(declaration.members)
2440
+ ]),
2441
+ ...checkNamespaces(namespace.namespaces)
2442
+ ])
2443
+ return files.map((file) => {
2444
+ const diagnostics = [
2445
+ ...file.diagnostics,
2446
+ ...checkModuleExamples(file.moduleJSDoc),
2447
+ ...file.declarations.flatMap((declaration) => [
2448
+ ...checkExamples(declaration.examples),
2449
+ ...checkMembers(declaration.members)
2450
+ ]),
2451
+ ...checkNamespaces(file.namespaces)
2452
+ ]
2453
+ return diagnostics.length === file.diagnostics.length
2454
+ ? file
2455
+ : { ...file, diagnostics: uniqueModelDiagnostics(diagnostics) }
2456
+ })
2457
+ }
2458
+
2459
+ function uniqueModelDiagnostics(
2460
+ diagnostics: ReadonlyArray<JSDocModelDiagnostic>
2461
+ ): ReadonlyArray<JSDocModelDiagnostic> {
2462
+ const seen = new Set<string>()
2463
+ return diagnostics.filter((item) => {
2464
+ const key = `${item.code}:${item.message}:${item.range[0]}:${item.range[1]}`
2465
+ if (seen.has(key)) return false
2466
+ seen.add(key)
2467
+ return true
2468
+ })
2469
+ }
2470
+
2471
+ function nodeRange(node: ts.Node): [number, number] {
2472
+ return [node.getStart(), node.getEnd()]
2473
+ }
2474
+
2475
+ function normalizeFile(cwd: string, filename: string): string {
2476
+ return normalizePathName(path.relative(cwd, filename))
2477
+ }
2478
+
2479
+ function hashSource(source: string): string {
2480
+ return crypto.createHash("sha256").update(source).digest("hex")
2481
+ }
2482
+
2483
+ function getNodeJSDoc(node: ts.Node): JSDocBlock | undefined {
2484
+ const jsDocs = (node as { readonly jsDoc?: ReadonlyArray<ts.JSDoc> }).jsDoc
2485
+ const jsDoc = jsDocs?.[jsDocs.length - 1]
2486
+ if (jsDoc === undefined) return undefined
2487
+ const source = node.getSourceFile().text
2488
+ return parseJSDocBlock(source.slice(jsDoc.pos, jsDoc.end), [jsDoc.pos, jsDoc.end])
2489
+ }
2490
+
2491
+ function addModelDiagnostics(
2492
+ out: Array<JSDocModelDiagnostic>,
2493
+ range: [number, number],
2494
+ diagnostics: ReadonlyArray<JSDocDiagnostic>
2495
+ ) {
2496
+ for (const item of diagnostics) out.push({ ...item, range })
2497
+ }
2498
+
2499
+ function addJSDocLinkDiagnostics(
2500
+ sourceFile: ts.SourceFile,
2501
+ block: JSDocBlock,
2502
+ diagnostics: Array<JSDocModelDiagnostic>,
2503
+ linkContext: { readonly checker: ts.TypeChecker; readonly entry: ProgramCacheEntry; readonly cwd: string }
2504
+ ) {
2505
+ if (!hasInlineLink(block)) return
2506
+ for (const link of malformedInlineLinks(block)) {
2507
+ diagnostics.push({ ...diagnostic("malformed-link", `Malformed JSDoc inline link: ${link}`), range: block.range })
2508
+ }
2509
+ for (const link of collectJSDocLinks(sourceFile, block)) {
2510
+ const text = link.getText(sourceFile)
2511
+ const target = extractInlineLinkTarget(text)
2512
+ if (target === "") continue
2513
+ if (urlRegex.test(target)) {
2514
+ diagnostics.push({
2515
+ ...diagnostic("url-link", `JSDoc inline link must target a TypeScript symbol: ${text}`),
2516
+ range: [link.pos, link.end]
2517
+ })
2518
+ } else if (resolveJSDocLinkSymbol(link, linkContext.checker) === undefined) {
2519
+ diagnostics.push({
2520
+ ...diagnostic("unresolved-link", `Unresolved JSDoc inline link: ${text}`),
2521
+ range: [link.pos, link.end]
2522
+ })
2523
+ }
2524
+ }
2525
+ for (const link of collectJSDocSeeLinks(sourceFile, block)) {
2526
+ const text = link.getText(sourceFile)
2527
+ const target = extractInlineLinkTarget(text)
2528
+ if (target === "" || urlRegex.test(target)) continue
2529
+ const symbol = resolveJSDocLinkSymbol(link, linkContext.checker)
2530
+ if (symbol === undefined) continue
2531
+ if (undocumentedSeeLinkTarget(symbol, linkContext.checker, linkContext.cwd) !== undefined) {
2532
+ diagnostics.push({
2533
+ ...diagnostic("undocumented-see-target", `@see link target must have public JSDoc: ${text}`),
2534
+ range: [link.pos, link.end]
2535
+ })
2536
+ }
2537
+ }
2538
+ }
2539
+
2540
+ function parseDocumentedTs(
2541
+ node: ts.Node,
2542
+ scope: DocScope,
2543
+ diagnostics: Array<JSDocModelDiagnostic>,
2544
+ required = true,
2545
+ linkContext?: { readonly checker: ts.TypeChecker; readonly entry: ProgramCacheEntry; readonly cwd: string }
2546
+ ) {
2547
+ const block = getNodeJSDoc(node)
2548
+ if (block?.internal) return undefined
2549
+ if (block === undefined) {
2550
+ if (required) {
2551
+ diagnostics.push({
2552
+ ...diagnostic("missing-jsdoc", scope === "member" ? "Member JSDoc is required" : "Public JSDoc is required"),
2553
+ range: nodeRange(node)
2554
+ })
2555
+ }
2556
+ return undefined
2557
+ }
2558
+ addModelDiagnostics(diagnostics, block.range, block.diagnostics)
2559
+ if (block.parsed === undefined) return undefined
2560
+ const tags = buildTags(scope, block.parsed.tags)
2561
+ if (tags._tag === "Failure") {
2562
+ addModelDiagnostics(diagnostics, block.range, tags.error.diagnostics)
2563
+ return undefined
2564
+ }
2565
+ const parsedTags = tags.value as ParsedDeclarationTags | ParsedNamespaceTags | ParsedMemberTags
2566
+ if (linkContext !== undefined) addJSDocLinkDiagnostics(node.getSourceFile(), block, diagnostics, linkContext)
2567
+ return {
2568
+ core: block.parsed,
2569
+ tags: linkContext === undefined ? parsedTags : attachSeeLinkSymbols(parsedTags, node, block, linkContext)
2570
+ }
2571
+ }
2572
+
2573
+ function hasExportModifier(node: ts.Node): boolean {
2574
+ return ts.canHaveModifiers(node) &&
2575
+ (ts.getModifiers(node)?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword) ?? false)
2576
+ }
2577
+
2578
+ function hasDefaultModifier(node: ts.Node): boolean {
2579
+ return ts.canHaveModifiers(node) &&
2580
+ (ts.getModifiers(node)?.some((modifier) => modifier.kind === ts.SyntaxKind.DefaultKeyword) ?? false)
2581
+ }
2582
+
2583
+ function declarationName(node: ts.Node): string | undefined {
2584
+ if (
2585
+ (ts.isInterfaceDeclaration(node) || ts.isTypeAliasDeclaration(node) || ts.isClassDeclaration(node) ||
2586
+ ts.isFunctionDeclaration(node) || ts.isModuleDeclaration(node)) && node.name !== undefined
2587
+ ) return node.name.text
2588
+ if (ts.isVariableStatement(node)) {
2589
+ return node.declarationList.declarations.map((declaration) => {
2590
+ if (ts.isIdentifier(declaration.name)) return declaration.name.text
2591
+ if (ts.isObjectBindingPattern(declaration.name)) {
2592
+ return declaration.name.elements.map((element) =>
2593
+ element.propertyName?.getText(element.getSourceFile()) ?? element.name.getText(element.getSourceFile())
2594
+ ).join(", ")
2595
+ }
2596
+ return ""
2597
+ }).filter(Boolean).join(", ")
2598
+ }
2599
+ return undefined
2600
+ }
2601
+
2602
+ function publicDeclarationRange(node: ts.Node, name: string): readonly [number, number] {
2603
+ if (ts.isVariableStatement(node)) {
2604
+ const declaration = node.declarationList.declarations.find((item) =>
2605
+ ts.isIdentifier(item.name) && item.name.text === name
2606
+ )
2607
+ if (declaration !== undefined) return nodeRange(declaration)
2608
+ }
2609
+ return nodeRange(node)
2610
+ }
2611
+
2612
+ function bucketOfTs(node: ts.Node): ExportBucket | undefined {
2613
+ if (ts.isVariableStatement(node) || ts.isFunctionDeclaration(node) || ts.isClassDeclaration(node)) return "value"
2614
+ if (ts.isTypeAliasDeclaration(node) || ts.isInterfaceDeclaration(node)) return "type"
2615
+ return undefined
2616
+ }
2617
+
2618
+ function normalizeSignature(cwd: string, text: string): string | null {
2619
+ const normalizedCwd = normalizePathName(cwd)
2620
+ const signature = text.replaceAll(normalizedCwd, ".").replaceAll(cwd, ".").replace(/\r\n?/g, "\n").replace(
2621
+ /[ \t]+$/gm,
2622
+ ""
2623
+ ).trim()
2624
+ return signature === "" ? null : signature
2625
+ }
2626
+
2627
+ function displaySignature(text: string): string {
2628
+ return text.replace(/import\((?:"[^"]+"|'[^']+')\)\.([A-Za-z_$][A-Za-z0-9_$]*(?:\.[A-Za-z_$][A-Za-z0-9_$]*)*)/g, "$1")
2629
+ }
2630
+
2631
+ function parseableSignature(cwd: string, text: string): string | null {
2632
+ const signature = normalizeSignature(cwd, displaySignature(text))
2633
+ if (signature === null) return null
2634
+ const source = ts.createSourceFile(
2635
+ "signature.ts",
2636
+ signature,
2637
+ ts.ScriptTarget.Latest,
2638
+ true,
2639
+ ts.ScriptKind.TS
2640
+ ) as SourceFileWithParseDiagnostics
2641
+ return source.parseDiagnostics.length === 0 ? signature : null
2642
+ }
2643
+
2644
+ function signatureLocalName(name: string): string {
2645
+ const sanitized = name.replace(/[^A-Za-z0-9_$]/g, "_")
2646
+ return `_${sanitized === "" ? "api" : sanitized}`
2647
+ }
2648
+
2649
+ function signatureExportName(name: string): string {
2650
+ return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(name) ? name : JSON.stringify(name)
2651
+ }
2652
+
2653
+ function signatureAlias(name: string, text: string): string {
2654
+ const localName = signatureLocalName(name)
2655
+ return `declare const ${localName}: ${text}
2656
+ export { ${localName} as ${signatureExportName(name)} }`
2657
+ }
2658
+
2659
+ function signatureParameterDeclaration(parameter: ts.Symbol): ts.ParameterDeclaration | undefined {
2660
+ const declaration = parameter.valueDeclaration ?? parameter.declarations?.[0]
2661
+ return declaration !== undefined && ts.isParameter(declaration) ? declaration : undefined
2662
+ }
2663
+
2664
+ function signatureParameterName(parameter: ts.Symbol): string {
2665
+ const declaration = signatureParameterDeclaration(parameter)
2666
+ if (declaration !== undefined && ts.isIdentifier(declaration.name)) return declaration.name.text
2667
+ return parameter.getName()
2668
+ }
2669
+
2670
+ function signatureFunctionThisKind(type: ts.Type, checker: ts.TypeChecker, location: ts.Node): string {
2671
+ const thisParameter = checker.getSignaturesOfType(type, ts.SignatureKind.Call)[0]?.thisParameter
2672
+ if (thisParameter === undefined) return "none"
2673
+ const thisType = checker.typeToString(
2674
+ checker.getTypeOfSymbolAtLocation(thisParameter, location),
2675
+ location,
2676
+ signatureTypeFormatFlags
2677
+ )
2678
+ return thisType === "unassigned" ? "unassigned" : "self"
2679
+ }
2680
+
2681
+ function isSignatureFunctionKind(kind: string): boolean {
2682
+ return kind.startsWith("body:") || kind.startsWith("function:")
2683
+ }
2684
+
2685
+ function signatureTransformCountKind(count: number): string {
2686
+ if (count <= 3) return String(count)
2687
+ if (count <= 7) return "4"
2688
+ if (count <= 15) return "8"
2689
+ return "16"
2690
+ }
2691
+
2692
+ function signatureParameterKind(
2693
+ parameter: ts.Symbol | undefined,
2694
+ checker: ts.TypeChecker,
2695
+ location: ts.Node
2696
+ ): string {
2697
+ if (parameter === undefined) return "none"
2698
+ const declaration = signatureParameterDeclaration(parameter)
2699
+ if (declaration?.dotDotDotToken !== undefined) return "rest"
2700
+ const name = signatureParameterName(parameter).replace(/_$/, "").toLowerCase()
2701
+ const type = checker.getTypeOfSymbolAtLocation(parameter, declaration ?? location)
2702
+ if (name === "self" || name === "that") return "self"
2703
+ if (name === "body") return `body:${signatureFunctionThisKind(type, checker, location)}`
2704
+ if (name === "name" || name === "spanname") return "name"
2705
+ if (name.includes("refinement")) return "refinement"
2706
+ if (name.includes("predicate")) return "predicate"
2707
+ if (name === "options" || name === "option" || name === "opts" || name === "config" || name === "args") {
2708
+ return "options"
2709
+ }
2710
+ if (name === "f" || name === "fn" || name === "callback") {
2711
+ return `function:${signatureFunctionThisKind(type, checker, location)}`
2712
+ }
2713
+ if (checker.getSignaturesOfType(type, ts.SignatureKind.Call).length > 0) {
2714
+ return `function:${signatureFunctionThisKind(type, checker, location)}`
2715
+ }
2716
+ if ((type.flags & ts.TypeFlags.StringLike) !== 0) return "primitive:string"
2717
+ if ((type.flags & ts.TypeFlags.NumberLike) !== 0) return "primitive:number"
2718
+ if ((type.flags & ts.TypeFlags.BooleanLike) !== 0) return "primitive:boolean"
2719
+ if ((type.flags & ts.TypeFlags.BigIntLike) !== 0) return "primitive:bigint"
2720
+ if ((type.flags & ts.TypeFlags.ESSymbolLike) !== 0) return "primitive:symbol"
2721
+ if ((type.flags & ts.TypeFlags.Object) !== 0 || checker.getPropertiesOfType(type).length > 0) return "object"
2722
+ return "other"
2723
+ }
2724
+
2725
+ function signatureTailKind(signature: ts.Signature, checker: ts.TypeChecker, location: ts.Node): string {
2726
+ if (signature.parameters.length <= 1) return "none"
2727
+ const firstKind = signatureParameterKind(signature.parameters[0], checker, location)
2728
+ const tailKinds = signature.parameters.slice(1).map((parameter) =>
2729
+ signatureParameterKind(parameter, checker, location)
2730
+ )
2731
+ if (firstKind === "options") {
2732
+ const hasTransformTail = tailKinds.length > 1 && tailKinds.slice(1).every(isSignatureFunctionKind)
2733
+ return `${tailKinds[0]}:${hasTransformTail ? "transform" : "none"}`
2734
+ }
2735
+ if (tailKinds.every(isSignatureFunctionKind)) {
2736
+ return firstKind.startsWith("body:")
2737
+ ? "transform"
2738
+ : `transform:${signatureTransformCountKind(tailKinds.length)}`
2739
+ }
2740
+ return tailKinds[0]
2741
+ }
2742
+
2743
+ function signatureShapeKey(signature: ts.Signature, checker: ts.TypeChecker, location: ts.Node): string {
2744
+ const hasRest = signature.parameters.some((parameter) =>
2745
+ signatureParameterDeclaration(parameter)?.dotDotDotToken !== undefined
2746
+ )
2747
+ const returnType = checker.getReturnTypeOfSignature(signature)
2748
+ const returnMode = checker.getSignaturesOfType(returnType, ts.SignatureKind.Call).length > 0 ? "curried" : "direct"
2749
+ return [
2750
+ hasRest ? "rest" : "fixed",
2751
+ signatureParameterKind(signature.parameters[0], checker, location),
2752
+ signatureTailKind(signature, checker, location),
2753
+ returnMode
2754
+ ].join(":")
2755
+ }
2756
+
2757
+ function representativeSignatures(
2758
+ signatures: ReadonlyArray<ts.Signature>,
2759
+ checker: ts.TypeChecker,
2760
+ location: ts.Node
2761
+ ): ReadonlyArray<ts.Signature> {
2762
+ const seen = new Set<string>()
2763
+ const out: Array<ts.Signature> = []
2764
+ for (const signature of signatures) {
2765
+ const key = signatureShapeKey(signature, checker, location)
2766
+ if (seen.has(key)) continue
2767
+ seen.add(key)
2768
+ out.push(signature)
2769
+ }
2770
+ return out
2771
+ }
2772
+
2773
+ function functionSignature(
2774
+ name: string,
2775
+ symbol: ts.Symbol,
2776
+ location: ts.Node,
2777
+ checker: ts.TypeChecker,
2778
+ cwd: string
2779
+ ): string | null {
2780
+ const target = resolvedSymbolTarget(symbol, checker)
2781
+ const type = checker.getTypeOfSymbolAtLocation(target, location)
2782
+ const signatures = checker.getSignaturesOfType(type, ts.SignatureKind.Call)
2783
+ if (signatures.length === 0) return null
2784
+ const callSignatures: Array<string> = []
2785
+ for (const signature of representativeSignatures(signatures, checker, location)) {
2786
+ const text = normalizeSignature(
2787
+ cwd,
2788
+ checker.signatureToString(signature, location, signatureTypeFormatFlags, ts.SignatureKind.Call)
2789
+ )
2790
+ if (text === null) return null
2791
+ callSignatures.push(text)
2792
+ }
2793
+ const declaration = parseableSignature(
2794
+ cwd,
2795
+ callSignatures.map((text) => `declare function ${name}${text}`).join("\n")
2796
+ )
2797
+ if (declaration !== null) return declaration
2798
+ const callSignatureAlias = parseableSignature(
2799
+ cwd,
2800
+ signatureAlias(
2801
+ name,
2802
+ `{
2803
+ ${callSignatures.map((text) => ` ${text};`).join("\n")}
2804
+ }`
2805
+ )
2806
+ )
2807
+ if (callSignatureAlias !== null) return callSignatureAlias
2808
+ const typeText = normalizeSignature(cwd, checker.typeToString(type, location, signatureTypeFormatFlags))
2809
+ if (typeText === null) return null
2810
+ return parseableSignature(cwd, `declare const ${name}: ${typeText}`) ??
2811
+ parseableSignature(cwd, signatureAlias(name, typeText))
2812
+ }
2813
+
2814
+ function symbolSignature(
2815
+ name: string,
2816
+ bucket: ExportBucket,
2817
+ symbol: ts.Symbol,
2818
+ location: ts.Node,
2819
+ checker: ts.TypeChecker,
2820
+ cwd: string
2821
+ ): string | null {
2822
+ if (bucket !== "value") return null
2823
+ const target = resolvedSymbolTarget(symbol, checker)
2824
+ const type = checker.getTypeOfSymbolAtLocation(target, location)
2825
+ if (checker.getSignaturesOfType(type, ts.SignatureKind.Call).length === 0) return null
2826
+ return functionSignature(name, symbol, location, checker, cwd)
2827
+ }
2828
+
2829
+ function declarationSignature(
2830
+ name: string,
2831
+ bucket: ExportBucket,
2832
+ node: ts.Node,
2833
+ checker: ts.TypeChecker,
2834
+ cwd: string
2835
+ ): string | null {
2836
+ if (ts.isVariableStatement(node)) {
2837
+ const declaration = node.declarationList.declarations.find((item) =>
2838
+ ts.isIdentifier(item.name) && item.name.text === name
2839
+ )
2840
+ if (declaration === undefined) return null
2841
+ const symbol = checker.getSymbolAtLocation(declaration.name)
2842
+ return symbol === undefined ? null : symbolSignature(name, bucket, symbol, declaration.name, checker, cwd)
2843
+ }
2844
+ const nameNode = ts.isFunctionDeclaration(node) || ts.isClassDeclaration(node) || ts.isInterfaceDeclaration(node) ||
2845
+ ts.isTypeAliasDeclaration(node)
2846
+ ? node.name
2847
+ : undefined
2848
+ if (nameNode === undefined) return null
2849
+ const symbol = checker.getSymbolAtLocation(nameNode)
2850
+ return symbol === undefined ? null : symbolSignature(name, bucket, symbol, nameNode, checker, cwd)
2851
+ }
2852
+
2853
+ function exportSpecifierSignature(
2854
+ name: string,
2855
+ bucket: ExportBucket,
2856
+ specifier: ts.ExportSpecifier,
2857
+ checker: ts.TypeChecker,
2858
+ cwd: string
2859
+ ): string | null {
2860
+ const symbol = checker.getSymbolAtLocation(specifier.name) ??
2861
+ (specifier.propertyName === undefined ? undefined : checker.getSymbolAtLocation(specifier.propertyName))
2862
+ return symbol === undefined ? null : symbolSignature(name, bucket, symbol, specifier.name, checker, cwd)
2863
+ }
2864
+
2865
+ function parseMembersFromTsType(
2866
+ type: ts.TypeNode | undefined,
2867
+ diagnostics: Array<JSDocModelDiagnostic>,
2868
+ linkContext: { readonly checker: ts.TypeChecker; readonly entry: ProgramCacheEntry; readonly cwd: string }
2869
+ ): Array<ParsedMember> {
2870
+ if (!type) return []
2871
+ if (ts.isTypeLiteralNode(type)) return parseTsMembers(type.members, diagnostics, linkContext)
2872
+ if (ts.isUnionTypeNode(type) || ts.isIntersectionTypeNode(type)) {
2873
+ return type.types.flatMap((item) => parseMembersFromTsType(item, diagnostics, linkContext))
2874
+ }
2875
+ if (ts.isParenthesizedTypeNode(type) || ts.isTypeOperatorNode(type)) {
2876
+ return parseMembersFromTsType(type.type, diagnostics, linkContext)
2877
+ }
2878
+ if (ts.isArrayTypeNode(type)) return parseMembersFromTsType(type.elementType, diagnostics, linkContext)
2879
+ if (ts.isConditionalTypeNode(type)) {
2880
+ return [
2881
+ ...parseMembersFromTsType(type.checkType, diagnostics, linkContext),
2882
+ ...parseMembersFromTsType(type.extendsType, diagnostics, linkContext),
2883
+ ...parseMembersFromTsType(type.trueType, diagnostics, linkContext),
2884
+ ...parseMembersFromTsType(type.falseType, diagnostics, linkContext)
2885
+ ]
2886
+ }
2887
+ if (ts.isTypeReferenceNode(type)) {
2888
+ return type.typeArguments?.flatMap((item) => parseMembersFromTsType(item, diagnostics, linkContext)) ?? []
2889
+ }
2890
+ if (ts.isMappedTypeNode(type)) return parseMembersFromTsType(type.type, diagnostics, linkContext)
2891
+ if (ts.isIndexedAccessTypeNode(type)) {
2892
+ return [
2893
+ ...parseMembersFromTsType(type.objectType, diagnostics, linkContext),
2894
+ ...parseMembersFromTsType(type.indexType, diagnostics, linkContext)
2895
+ ]
2896
+ }
2897
+ if (ts.isFunctionTypeNode(type) || ts.isConstructorTypeNode(type)) {
2898
+ return parseMembersFromTsType(type.type, diagnostics, linkContext)
2899
+ }
2900
+ return []
2901
+ }
2902
+
2903
+ function memberName(member: ts.TypeElement | ts.ClassElement): string {
2904
+ if (
2905
+ ts.isPropertySignature(member) || ts.isMethodSignature(member) || ts.isPropertyDeclaration(member) ||
2906
+ ts.isMethodDeclaration(member) || ts.isGetAccessorDeclaration(member) || ts.isSetAccessorDeclaration(member)
2907
+ ) {
2908
+ const name = member.name
2909
+ if (ts.isComputedPropertyName(name)) return name.expression.getText(member.getSourceFile())
2910
+ return name.getText(member.getSourceFile()).replace(/^[']|[']$/g, "")
2911
+ }
2912
+ return ""
2913
+ }
2914
+
2915
+ function memberType(member: ts.TypeElement | ts.ClassElement): ts.TypeNode | undefined {
2916
+ if (
2917
+ ts.isPropertySignature(member) || ts.isMethodSignature(member) || ts.isPropertyDeclaration(member) ||
2918
+ ts.isMethodDeclaration(member) || ts.isGetAccessorDeclaration(member) || ts.isSetAccessorDeclaration(member)
2919
+ ) return member.type
2920
+ return undefined
2921
+ }
2922
+
2923
+ function parseTsMembers(
2924
+ members: ts.NodeArray<ts.TypeElement | ts.ClassElement>,
2925
+ diagnostics: Array<JSDocModelDiagnostic>,
2926
+ linkContext: { readonly checker: ts.TypeChecker; readonly entry: ProgramCacheEntry; readonly cwd: string }
2927
+ ): Array<ParsedMember> {
2928
+ const out: Array<ParsedMember> = []
2929
+ for (const member of members) {
2930
+ if (
2931
+ ts.isCallSignatureDeclaration(member) || ts.isConstructSignatureDeclaration(member) ||
2932
+ ts.isIndexSignatureDeclaration(member) || member.kind === ts.SyntaxKind.Constructor
2933
+ ) continue
2934
+ const documented = parseDocumentedTs(member, "member", diagnostics, false, linkContext)
2935
+ if (documented === undefined) continue
2936
+ const name = memberName(member)
2937
+ if (name === "") continue
2938
+ const nested = parseMembersFromTsType(memberType(member), diagnostics, linkContext)
2939
+ out.push({
2940
+ name,
2941
+ signature: null,
2942
+ range: nodeRange(member),
2943
+ description: documented.core.description,
2944
+ examples: documented.core.examples,
2945
+ tags: documented.tags as ParsedMemberTags,
2946
+ members: nested
2947
+ })
2948
+ }
2949
+ return out
2950
+ }
2951
+
2952
+ function parseDeclarationMembersTs(
2953
+ node: ts.Node,
2954
+ diagnostics: Array<JSDocModelDiagnostic>,
2955
+ linkContext: { readonly checker: ts.TypeChecker; readonly entry: ProgramCacheEntry; readonly cwd: string }
2956
+ ): Array<ParsedMember> {
2957
+ if (ts.isInterfaceDeclaration(node)) return parseTsMembers(node.members, diagnostics, linkContext)
2958
+ if (ts.isClassDeclaration(node)) return parseTsMembers(node.members, diagnostics, linkContext)
2959
+ if (ts.isTypeAliasDeclaration(node)) return parseMembersFromTsType(node.type, diagnostics, linkContext)
2960
+ if (ts.isVariableStatement(node)) {
2961
+ return node.declarationList.declarations.flatMap((d) => parseMembersFromTsType(d.type, diagnostics, linkContext))
2962
+ }
2963
+ if (ts.isFunctionDeclaration(node)) return parseMembersFromTsType(node.type, diagnostics, linkContext)
2964
+ return []
2965
+ }
2966
+
2967
+ function hasDeclareModifier(node: ts.Node): boolean {
2968
+ return ts.canHaveModifiers(node) &&
2969
+ (ts.getModifiers(node)?.some((modifier) => modifier.kind === ts.SyntaxKind.DeclareKeyword) ?? false)
2970
+ }
2971
+
2972
+ function parseNamespaceTs(
2973
+ node: ts.ModuleDeclaration,
2974
+ diagnostics: Array<JSDocModelDiagnostic>,
2975
+ linkContext: { readonly checker: ts.TypeChecker; readonly entry: ProgramCacheEntry; readonly cwd: string },
2976
+ isInsideDeclare = false
2977
+ ): ParsedNamespace | undefined {
2978
+ if (!ts.isIdentifier(node.name)) return undefined
2979
+ if (!isInsideDeclare && !hasDeclareModifier(node)) {
2980
+ diagnostics.push({
2981
+ ...diagnostic("namespace-declare", "Namespaces must be declared with declare namespace"),
2982
+ range: nodeRange(node)
2983
+ })
2984
+ return undefined
2985
+ }
2986
+ const documented = parseDocumentedTs(node, "namespace", diagnostics, true, linkContext)
2987
+ if (documented === undefined) return undefined
2988
+ const declarations: Array<ParsedNamespaceDeclaration> = []
2989
+ const namespaces: Array<ParsedNamespace> = []
2990
+ if (node.body !== undefined && ts.isModuleBlock(node.body)) {
2991
+ for (const statement of node.body.statements) {
2992
+ if (!hasExportModifier(statement)) continue
2993
+ if (ts.isModuleDeclaration(statement)) {
2994
+ const nested = parseNamespaceTs(statement, diagnostics, linkContext, true)
2995
+ if (nested !== undefined) namespaces.push(nested)
2996
+ continue
2997
+ }
2998
+ if (ts.isEnumDeclaration(statement)) {
2999
+ diagnostics.push({ ...diagnostic("enum", "Enums are not allowed"), range: nodeRange(statement) })
3000
+ continue
3001
+ }
3002
+ const bucket = bucketOfTs(statement)
3003
+ if (bucket !== "type") {
3004
+ diagnostics.push({
3005
+ ...diagnostic("namespace-value", "Namespace exports must be type declarations"),
3006
+ range: nodeRange(statement)
3007
+ })
3008
+ continue
3009
+ }
3010
+ const nestedDocumented = parseDocumentedTs(statement, "namespace-declaration", diagnostics, true, linkContext)
3011
+ if (nestedDocumented === undefined) continue
3012
+ const name = declarationName(statement)
3013
+ if (name === undefined || name.length === 0) {
3014
+ diagnostics.push({
3015
+ ...diagnostic("missing-name", "Namespace declaration name could not be determined"),
3016
+ range: nodeRange(statement)
3017
+ })
3018
+ continue
3019
+ }
3020
+ declarations.push({
3021
+ name,
3022
+ signature: null,
3023
+ range: publicDeclarationRange(statement, name),
3024
+ description: nestedDocumented.core.description,
3025
+ examples: nestedDocumented.core.examples,
3026
+ tags: nestedDocumented.tags as ParsedNamespaceTags,
3027
+ members: parseDeclarationMembersTs(statement, diagnostics, linkContext)
3028
+ })
3029
+ }
3030
+ }
3031
+ return {
3032
+ name: node.name.text,
3033
+ signature: null,
3034
+ range: nodeRange(node),
3035
+ description: documented.core.description,
3036
+ examples: documented.core.examples,
3037
+ tags: documented.tags as ParsedNamespaceTags,
3038
+ declarations,
3039
+ namespaces
3040
+ }
3041
+ }
3042
+
3043
+ function skipLeadingIgnoredTrivia(source: string): number {
3044
+ let index = source.charCodeAt(0) === 0xfeff ? 1 : 0
3045
+ while (index < source.length) {
3046
+ while (index < source.length && /\s/.test(source[index])) index++
3047
+ if (!source.startsWith("//", index)) return index
3048
+ const lineEnd = source.indexOf("\n", index)
3049
+ const end = lineEnd === -1 ? source.length : lineEnd + 1
3050
+ if (!isSkippableDirectiveComment(source.slice(index, end))) return index
3051
+ index = end
3052
+ }
3053
+ return index
3054
+ }
3055
+
3056
+ function sourceFileTopLevelJSDoc(sourceFile: ts.SourceFile): ParsedModuleJSDoc | undefined {
3057
+ const source = sourceFile.text
3058
+ const start = skipLeadingIgnoredTrivia(source)
3059
+ if (!source.startsWith("/**", start)) return undefined
3060
+ const end = source.indexOf("*/", start + 3)
3061
+ if (end === -1) return undefined
3062
+ const range = [start, end + 2] as const
3063
+ const firstStatement = sourceFile.statements[0]
3064
+ if (firstStatement !== undefined) {
3065
+ const jsDocs = (firstStatement as { readonly jsDoc?: ReadonlyArray<ts.JSDoc> }).jsDoc ?? []
3066
+ if (
3067
+ jsDocs.some((jsDoc) => jsDoc.pos === range[0] && jsDoc.end === range[1]) &&
3068
+ !ts.isImportDeclaration(firstStatement) &&
3069
+ !ts.isImportEqualsDeclaration(firstStatement)
3070
+ ) return undefined
3071
+ }
3072
+ return { raw: source.slice(range[0], range[1]), range }
3073
+ }
3074
+
3075
+ function parseModuleJSDocTs(
3076
+ sourceFile: ts.SourceFile,
3077
+ moduleJSDoc: ParsedModuleJSDoc,
3078
+ diagnostics: Array<JSDocModelDiagnostic>,
3079
+ linkContext: { readonly checker: ts.TypeChecker; readonly entry: ProgramCacheEntry; readonly cwd: string }
3080
+ ): ParsedModuleJSDoc | undefined {
3081
+ const block = parseLooseJSDocBlock(moduleJSDoc.raw, [moduleJSDoc.range[0], moduleJSDoc.range[1]])
3082
+ if (block.internal) return undefined
3083
+ const tags = buildTags("module", block.tags)
3084
+ if (tags._tag === "Failure") addModelDiagnostics(diagnostics, block.range, tags.error.diagnostics)
3085
+ const examples = parseModuleExamples(block)
3086
+ addModelDiagnostics(diagnostics, block.range, examples.diagnostics)
3087
+ addJSDocLinkDiagnostics(sourceFile, block, diagnostics, linkContext)
3088
+ return moduleJSDoc
3089
+ }
3090
+
3091
+ function parseSourceFileDocs(
3092
+ cwd: string,
3093
+ sourceFile: ts.SourceFile,
3094
+ checker: ts.TypeChecker,
3095
+ entry: ProgramCacheEntry
3096
+ ): { readonly parsed: ParsedJSDocFile; readonly diagnostics: ReadonlyArray<JSDocModelDiagnostic> } {
3097
+ const diagnostics: Array<JSDocModelDiagnostic> = []
3098
+ const declarations: Array<ParsedRootDeclaration> = []
3099
+ const namespaces: Array<ParsedNamespace> = []
3100
+ const linkContext = { checker, entry, cwd }
3101
+ const checkedFunctionOverloads = new Set<string>()
3102
+ const moduleJSDoc = sourceFileTopLevelJSDoc(sourceFile)
3103
+ const parsedModuleJSDoc = moduleJSDoc === undefined
3104
+ ? undefined
3105
+ : parseModuleJSDocTs(sourceFile, moduleJSDoc, diagnostics, linkContext)
3106
+
3107
+ for (const statement of sourceFile.statements) {
3108
+ if (ts.isExportAssignment(statement)) continue
3109
+ if (ts.isExportDeclaration(statement)) {
3110
+ if (statement.exportClause === undefined) continue
3111
+ if (ts.isNamedExports(statement.exportClause) && statement.exportClause.elements.length === 0) {
3112
+ diagnostics.push({
3113
+ ...diagnostic("empty-export", "Empty export declarations are not allowed"),
3114
+ range: nodeRange(statement)
3115
+ })
3116
+ }
3117
+ if (ts.isNamedExports(statement.exportClause)) {
3118
+ for (const specifier of statement.exportClause.elements) {
3119
+ const documented = parseDocumentedTs(specifier, "declaration", diagnostics, true, linkContext)
3120
+ if (documented === undefined) continue
3121
+ declarations.push({
3122
+ name: specifier.name.text,
3123
+ bucket: statement.isTypeOnly || specifier.isTypeOnly ? "type" : "value",
3124
+ signature: exportSpecifierSignature(
3125
+ specifier.name.text,
3126
+ statement.isTypeOnly || specifier.isTypeOnly ? "type" : "value",
3127
+ specifier,
3128
+ checker,
3129
+ cwd
3130
+ ),
3131
+ range: nodeRange(specifier),
3132
+ description: documented.core.description,
3133
+ examples: documented.core.examples,
3134
+ tags: documented.tags as ParsedDeclarationTags,
3135
+ members: []
3136
+ })
3137
+ }
3138
+ }
3139
+ continue
3140
+ }
3141
+ if (!hasExportModifier(statement) || hasDefaultModifier(statement)) continue
3142
+ if (ts.isModuleDeclaration(statement)) {
3143
+ const namespace = parseNamespaceTs(statement, diagnostics, linkContext)
3144
+ if (namespace !== undefined) namespaces.push(namespace)
3145
+ continue
3146
+ }
3147
+ if (ts.isEnumDeclaration(statement)) {
3148
+ diagnostics.push({ ...diagnostic("enum", "Enums are not allowed"), range: nodeRange(statement) })
3149
+ continue
3150
+ }
3151
+ const bucket = bucketOfTs(statement)
3152
+ if (bucket === undefined) continue
3153
+ if (ts.isFunctionDeclaration(statement) && statement.name !== undefined) {
3154
+ const name = statement.name.text
3155
+ if (statement.body === undefined) {
3156
+ if (checkedFunctionOverloads.has(name)) continue
3157
+ checkedFunctionOverloads.add(name)
3158
+ } else if (checkedFunctionOverloads.has(name)) {
3159
+ continue
3160
+ }
3161
+ }
3162
+ const documented = parseDocumentedTs(statement, "declaration", diagnostics, true, linkContext)
3163
+ if (documented === undefined) continue
3164
+ const name = declarationName(statement)
3165
+ if (name === undefined || name.length === 0) {
3166
+ diagnostics.push({
3167
+ ...diagnostic("missing-name", "Root declaration name could not be determined"),
3168
+ range: nodeRange(statement)
3169
+ })
3170
+ continue
3171
+ }
3172
+ declarations.push({
3173
+ name,
3174
+ bucket,
3175
+ signature: declarationSignature(name, bucket, statement, checker, cwd),
3176
+ range: publicDeclarationRange(statement, name),
3177
+ description: documented.core.description,
3178
+ examples: documented.core.examples,
3179
+ tags: documented.tags as ParsedDeclarationTags,
3180
+ members: parseDeclarationMembersTs(statement, diagnostics, linkContext)
3181
+ })
3182
+ }
3183
+ return {
3184
+ parsed: {
3185
+ ...(parsedModuleJSDoc === undefined ? {} : { moduleJSDoc: parsedModuleJSDoc }),
3186
+ declarations,
3187
+ namespaces
3188
+ },
3189
+ diagnostics: uniqueDiagnostics(diagnostics) as Array<JSDocModelDiagnostic>
3190
+ }
3191
+ }
3192
+
3193
+ export function loadJSDocConfig(cwd = process.cwd(), configPath = "jsdocs.config.json"): JSDocConfig {
3194
+ const absolute = path.resolve(cwd, configPath)
3195
+ const parsed = JSON.parse(fs.readFileSync(absolute, "utf8")) as JSDocConfig
3196
+ return parsed
3197
+ }
3198
+
3199
+ export function extractJSDocsSync(options: ExtractJSDocsOptions): JSDocModel {
3200
+ const cwd = path.resolve(options.cwd ?? process.cwd())
3201
+ const tsconfigPath = path.resolve(cwd, options.tsconfig)
3202
+ const entry = getProgram(tsconfigPath)
3203
+ if (entry.error !== undefined || entry.program === undefined) {
3204
+ throw new Error(entry.error ?? `Unable to read ${tsconfigPath}`)
3205
+ }
3206
+ const program = entry.program
3207
+ const checker = program.getTypeChecker()
3208
+ const sourceByPath = new Map(program.getSourceFiles().map((file) => [path.resolve(file.fileName), file]))
3209
+ const sourceFilesByFile = new Map(program.getSourceFiles().map((file) => [normalizeFile(cwd, file.fileName), file]))
3210
+ const files = globSync([...options.include], {
3211
+ cwd,
3212
+ absolute: true,
3213
+ nodir: true,
3214
+ ignore: [...options.exclude ?? []]
3215
+ }).sort()
3216
+ const modelFiles: Array<JSDocModelFile> = []
3217
+ for (const filename of files) {
3218
+ const source = fs.readFileSync(filename, "utf8")
3219
+ const file = normalizeFile(cwd, filename)
3220
+ const hash = hashSource(source)
3221
+ const sourceFile = sourceByPath.get(path.resolve(filename))
3222
+ if (sourceFile === undefined) {
3223
+ modelFiles.push({
3224
+ file,
3225
+ hash,
3226
+ diagnostics: [{ ...diagnostic("tsconfig", `${file} is not included in ${options.tsconfig}`), range: [0, 0] }],
3227
+ declarations: [],
3228
+ namespaces: []
3229
+ })
3230
+ continue
3231
+ }
3232
+ const result = parseSourceFileDocs(cwd, sourceFile, checker, entry)
3233
+ if (
3234
+ result.diagnostics.length === 0 && result.parsed.declarations.length === 0 &&
3235
+ result.parsed.namespaces.length === 0 && result.parsed.moduleJSDoc === undefined
3236
+ ) continue
3237
+ const fileDiagnostics = [...result.diagnostics]
3238
+ let importsValue: ParsedJSDocImports | undefined
3239
+ if (
3240
+ result.parsed.declarations.length > 0 || result.parsed.namespaces.length > 0 ||
3241
+ result.parsed.moduleJSDoc !== undefined
3242
+ ) {
3243
+ const imports = resolveJSDocImports(cwd, filename)
3244
+ if (imports._tag === "Success") importsValue = imports.value
3245
+ else {
3246
+ fileDiagnostics.push({
3247
+ ...diagnostic(
3248
+ "imports",
3249
+ `Unable to resolve jsdocs imports: ${imports.error}. Add the missing barrel/package export or exclude this file from jsdocs.`
3250
+ ),
3251
+ range: [0, 0]
3252
+ })
3253
+ }
3254
+ }
3255
+ modelFiles.push({
3256
+ file,
3257
+ hash,
3258
+ diagnostics: fileDiagnostics,
3259
+ ...(importsValue === undefined ? {} : { imports: importsValue }),
3260
+ ...result.parsed
3261
+ })
3262
+ }
3263
+ const filesWithExampleDiagnostics = appendExampleImportDiagnostics(modelFiles)
3264
+ const withPublicSeeDiagnostics = buildJSDocApisWithPublicSeeDiagnostics(filesWithExampleDiagnostics, {
3265
+ sourceFilesByFile,
3266
+ checker,
3267
+ entry,
3268
+ cwd
3269
+ })
3270
+ return {
3271
+ version: 2,
3272
+ generatedBy: "@effect/jsdocs",
3273
+ generatedAt: new Date().toISOString(),
3274
+ files: withPublicSeeDiagnostics.files,
3275
+ apis: withPublicSeeDiagnostics.apis
3276
+ }
3277
+ }
3278
+
3279
+ export const extractJSDocs = (options: ExtractJSDocsOptions): Effect.Effect<JSDocModel> =>
3280
+ Effect.sync(() => extractJSDocsSync(options))
3281
+
3282
+ export function writeJSDocModel(cwd: string, output: string, model: JSDocModel) {
3283
+ const filename = path.resolve(cwd, output)
3284
+ fs.mkdirSync(path.dirname(filename), { recursive: true })
3285
+ fs.writeFileSync(filename, `${JSON.stringify(model, null, 2)}\n`)
3286
+ }
3287
+
3288
+ export function readJSDocModel(filename: string): Result<JSDocModel, string> {
3289
+ if (!fs.existsSync(filename)) return { _tag: "Failure", error: "missing" }
3290
+ try {
3291
+ const parsed = JSON.parse(fs.readFileSync(filename, "utf8")) as JSDocModel
3292
+ if (parsed.version !== 2) return { _tag: "Failure", error: "Unsupported jsdocs model version" }
3293
+ if (!Array.isArray(parsed.files)) return { _tag: "Failure", error: "Invalid jsdocs model: files must be an array" }
3294
+ if (!Array.isArray(parsed.apis)) return { _tag: "Failure", error: "Invalid jsdocs model: apis must be an array" }
3295
+ return { _tag: "Success", value: parsed }
3296
+ } catch (error) {
3297
+ return { _tag: "Failure", error: `Invalid jsdocs model: ${error instanceof Error ? error.message : String(error)}` }
3298
+ }
3299
+ }
3300
+
3301
+ export function sourceHash(source: string): string {
3302
+ return hashSource(source)
3303
+ }