effect-app 4.0.0-beta.99 → 4.0.0

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 (371) hide show
  1. package/CHANGELOG.md +2028 -0
  2. package/dist/Array.d.ts +2 -1
  3. package/dist/Array.d.ts.map +1 -1
  4. package/dist/Array.js +4 -4
  5. package/dist/Chunk.d.ts +2 -2
  6. package/dist/Chunk.d.ts.map +1 -1
  7. package/dist/Config/SecretURL.d.ts +3 -1
  8. package/dist/Config/SecretURL.d.ts.map +1 -1
  9. package/dist/Config/SecretURL.js +3 -6
  10. package/dist/Config/internal/configSecretURL.d.ts.map +1 -1
  11. package/dist/Config/internal/configSecretURL.js +2 -2
  12. package/dist/Config.d.ts +0 -5
  13. package/dist/Config.d.ts.map +1 -1
  14. package/dist/Config.js +7 -5
  15. package/dist/ConfigProvider.d.ts +0 -37
  16. package/dist/ConfigProvider.d.ts.map +1 -1
  17. package/dist/ConfigProvider.js +5 -41
  18. package/dist/Context.d.ts +6 -4
  19. package/dist/Context.d.ts.map +1 -1
  20. package/dist/Context.js +4 -3
  21. package/dist/DataDependencies.d.ts +136 -0
  22. package/dist/DataDependencies.d.ts.map +1 -0
  23. package/dist/DataDependencies.js +112 -0
  24. package/dist/Effect.d.ts +3 -3
  25. package/dist/Effect.d.ts.map +1 -1
  26. package/dist/Effect.js +6 -9
  27. package/dist/Emailer.d.ts +51 -0
  28. package/dist/Emailer.d.ts.map +1 -0
  29. package/dist/Emailer.js +7 -0
  30. package/dist/Function.d.ts.map +1 -1
  31. package/dist/Layer.d.ts +6 -3
  32. package/dist/Layer.d.ts.map +1 -1
  33. package/dist/Layer.js +3 -2
  34. package/dist/Model/Repository/Registry.d.ts +22 -0
  35. package/dist/Model/Repository/Registry.d.ts.map +1 -0
  36. package/dist/Model/Repository/Registry.js +18 -0
  37. package/dist/Model/Repository/dependency.d.ts +6 -0
  38. package/dist/Model/Repository/dependency.d.ts.map +1 -0
  39. package/dist/Model/Repository/dependency.js +29 -0
  40. package/dist/Model/Repository/ext.d.ts +60 -0
  41. package/dist/Model/Repository/ext.d.ts.map +1 -0
  42. package/dist/Model/Repository/ext.js +124 -0
  43. package/dist/Model/Repository/internal/internal.d.ts +68 -0
  44. package/dist/Model/Repository/internal/internal.d.ts.map +1 -0
  45. package/dist/Model/Repository/internal/internal.js +611 -0
  46. package/dist/Model/Repository/legacy.d.ts +21 -0
  47. package/dist/Model/Repository/legacy.d.ts.map +1 -0
  48. package/dist/Model/Repository/legacy.js +2 -0
  49. package/dist/Model/Repository/makeRepo.d.ts +71 -0
  50. package/dist/Model/Repository/makeRepo.d.ts.map +1 -0
  51. package/dist/Model/Repository/makeRepo.js +30 -0
  52. package/dist/Model/Repository/service.d.ts +121 -0
  53. package/dist/Model/Repository/service.d.ts.map +1 -0
  54. package/dist/Model/Repository/service.js +2 -0
  55. package/dist/Model/Repository/validation.d.ts +72 -0
  56. package/dist/Model/Repository/validation.d.ts.map +1 -0
  57. package/dist/Model/Repository/validation.js +39 -0
  58. package/dist/Model/Repository.d.ts +8 -0
  59. package/dist/Model/Repository.d.ts.map +1 -0
  60. package/dist/Model/Repository.js +8 -0
  61. package/dist/Model/dsl.d.ts +33 -0
  62. package/dist/Model/dsl.d.ts.map +1 -0
  63. package/dist/Model/dsl.js +43 -0
  64. package/dist/Model/filter/filterApi.d.ts +30 -0
  65. package/dist/Model/filter/filterApi.d.ts.map +1 -0
  66. package/dist/Model/filter/filterApi.js +2 -0
  67. package/dist/Model/filter/types/errors.d.ts +29 -0
  68. package/dist/Model/filter/types/errors.d.ts.map +1 -0
  69. package/dist/Model/filter/types/errors.js +2 -0
  70. package/dist/Model/filter/types/fields.d.ts +15 -0
  71. package/dist/Model/filter/types/fields.d.ts.map +1 -0
  72. package/dist/Model/filter/types/fields.js +2 -0
  73. package/dist/Model/filter/types/path/common.d.ts +316 -0
  74. package/dist/Model/filter/types/path/common.d.ts.map +1 -0
  75. package/dist/Model/filter/types/path/common.js +2 -0
  76. package/dist/Model/filter/types/path/eager.d.ts +94 -0
  77. package/dist/Model/filter/types/path/eager.d.ts.map +1 -0
  78. package/dist/Model/filter/types/path/eager.js +36 -0
  79. package/dist/Model/filter/types/path/index.d.ts +4 -0
  80. package/dist/Model/filter/types/path/index.d.ts.map +1 -0
  81. package/dist/Model/filter/types/path/index.js +3 -0
  82. package/dist/Model/filter/types/utils.d.ts +79 -0
  83. package/dist/Model/filter/types/utils.d.ts.map +1 -0
  84. package/dist/Model/filter/types/utils.js +2 -0
  85. package/dist/Model/filter/types/validator.d.ts +30 -0
  86. package/dist/Model/filter/types/validator.d.ts.map +1 -0
  87. package/dist/Model/filter/types/validator.js +2 -0
  88. package/dist/Model/filter/types.d.ts +5 -0
  89. package/dist/Model/filter/types.d.ts.map +1 -0
  90. package/dist/Model/filter/types.js +7 -0
  91. package/dist/Model/query/dsl.d.ts +630 -0
  92. package/dist/Model/query/dsl.d.ts.map +1 -0
  93. package/dist/Model/query/dsl.js +376 -0
  94. package/dist/Model/query/new-kid-interpreter.d.ts +132 -0
  95. package/dist/Model/query/new-kid-interpreter.d.ts.map +1 -0
  96. package/dist/Model/query/new-kid-interpreter.js +370 -0
  97. package/dist/Model/query.d.ts +15 -0
  98. package/dist/Model/query.d.ts.map +1 -0
  99. package/dist/Model/query.js +3 -0
  100. package/dist/Model.d.ts +6 -0
  101. package/dist/Model.d.ts.map +1 -0
  102. package/dist/Model.js +6 -0
  103. package/dist/NonEmptySet.d.ts +3 -1
  104. package/dist/NonEmptySet.d.ts.map +1 -1
  105. package/dist/NonEmptySet.js +2 -2
  106. package/dist/Option.d.ts +1 -0
  107. package/dist/Option.d.ts.map +1 -1
  108. package/dist/Option.js +3 -1
  109. package/dist/Pure.d.ts +5 -3
  110. package/dist/Pure.d.ts.map +1 -1
  111. package/dist/Pure.js +5 -2
  112. package/dist/QueueMaker.d.ts +11 -0
  113. package/dist/QueueMaker.d.ts.map +1 -0
  114. package/dist/QueueMaker.js +11 -0
  115. package/dist/RequestContext.d.ts +87 -0
  116. package/dist/RequestContext.d.ts.map +1 -0
  117. package/dist/RequestContext.js +45 -0
  118. package/dist/RequestScopedDependencies.d.ts +21 -0
  119. package/dist/RequestScopedDependencies.d.ts.map +1 -0
  120. package/dist/RequestScopedDependencies.js +16 -0
  121. package/dist/Schema/Class.d.ts +163 -16
  122. package/dist/Schema/Class.d.ts.map +1 -1
  123. package/dist/Schema/Class.js +193 -21
  124. package/dist/Schema/FastCheck.d.ts.map +1 -1
  125. package/dist/Schema/SchemaParser.d.ts +5 -0
  126. package/dist/Schema/SchemaParser.d.ts.map +1 -0
  127. package/dist/Schema/SchemaParser.js +6 -0
  128. package/dist/Schema/SpecialJsonSchema.d.ts +15 -2
  129. package/dist/Schema/SpecialJsonSchema.d.ts.map +1 -1
  130. package/dist/Schema/SpecialJsonSchema.js +70 -12
  131. package/dist/Schema/SpecialOpenApi.d.ts +1 -1
  132. package/dist/Schema/SpecialOpenApi.js +3 -3
  133. package/dist/Schema/brand.d.ts +5 -5
  134. package/dist/Schema/brand.d.ts.map +1 -1
  135. package/dist/Schema/brand.js +6 -4
  136. package/dist/Schema/email.d.ts.map +1 -1
  137. package/dist/Schema/email.js +8 -5
  138. package/dist/Schema/ext.d.ts +297 -72
  139. package/dist/Schema/ext.d.ts.map +1 -1
  140. package/dist/Schema/ext.js +331 -67
  141. package/dist/Schema/moreStrings.d.ts +82 -48
  142. package/dist/Schema/moreStrings.d.ts.map +1 -1
  143. package/dist/Schema/moreStrings.js +85 -51
  144. package/dist/Schema/numbers.d.ts +33 -21
  145. package/dist/Schema/numbers.d.ts.map +1 -1
  146. package/dist/Schema/numbers.js +64 -12
  147. package/dist/Schema/phoneNumber.d.ts.map +1 -1
  148. package/dist/Schema/phoneNumber.js +6 -6
  149. package/dist/Schema/schema.d.ts +1 -1
  150. package/dist/Schema/schema.d.ts.map +1 -1
  151. package/dist/Schema/schema.js +2 -2
  152. package/dist/Schema/strings.d.ts +18 -4
  153. package/dist/Schema/strings.d.ts.map +1 -1
  154. package/dist/Schema/strings.js +1 -5
  155. package/dist/Schema.d.ts +223 -6
  156. package/dist/Schema.d.ts.map +1 -1
  157. package/dist/Schema.js +189 -23
  158. package/dist/SchemaAST.d.ts +2 -0
  159. package/dist/SchemaAST.d.ts.map +1 -0
  160. package/dist/SchemaAST.js +2 -0
  161. package/dist/Set.d.ts +4 -1
  162. package/dist/Set.d.ts.map +1 -1
  163. package/dist/Set.js +3 -2
  164. package/dist/Store.d.ts +215 -0
  165. package/dist/Store.d.ts.map +1 -0
  166. package/dist/Store.js +113 -0
  167. package/dist/_ext/Array.d.ts +1 -1
  168. package/dist/_ext/Array.d.ts.map +1 -1
  169. package/dist/_ext/Array.js +4 -2
  170. package/dist/_ext/misc.d.ts +4 -1
  171. package/dist/_ext/misc.d.ts.map +1 -1
  172. package/dist/_ext/misc.js +4 -2
  173. package/dist/_ext/ord.ext.d.ts +2 -1
  174. package/dist/_ext/ord.ext.d.ts.map +1 -1
  175. package/dist/_ext/ord.ext.js +2 -2
  176. package/dist/builtin.d.ts +2 -14
  177. package/dist/builtin.d.ts.map +1 -1
  178. package/dist/builtin.js +1 -1
  179. package/dist/client/InvalidationKeys.d.ts +30 -0
  180. package/dist/client/InvalidationKeys.d.ts.map +1 -0
  181. package/dist/client/InvalidationKeys.js +37 -0
  182. package/dist/client/apiClientFactory.d.ts +13 -8
  183. package/dist/client/apiClientFactory.d.ts.map +1 -1
  184. package/dist/client/apiClientFactory.js +148 -29
  185. package/dist/client/clientFor.d.ts +48 -13
  186. package/dist/client/clientFor.d.ts.map +1 -1
  187. package/dist/client/clientFor.js +9 -1
  188. package/dist/client/errors.d.ts +74 -28
  189. package/dist/client/errors.d.ts.map +1 -1
  190. package/dist/client/errors.js +41 -10
  191. package/dist/client/makeClient.d.ts +487 -32
  192. package/dist/client/makeClient.d.ts.map +1 -1
  193. package/dist/client/makeClient.js +47 -21
  194. package/dist/client.d.ts +2 -0
  195. package/dist/client.d.ts.map +1 -1
  196. package/dist/client.js +3 -1
  197. package/dist/faker.d.ts.map +1 -1
  198. package/dist/http/Request.d.ts +2 -2
  199. package/dist/http/Request.d.ts.map +1 -1
  200. package/dist/http/Request.js +2 -2
  201. package/dist/http/internal/lib.d.ts +12 -12
  202. package/dist/http/internal/lib.d.ts.map +1 -1
  203. package/dist/http/internal/lib.js +13 -13
  204. package/dist/ids.d.ts +32 -14
  205. package/dist/ids.d.ts.map +1 -1
  206. package/dist/ids.js +38 -7
  207. package/dist/index.d.ts +3 -0
  208. package/dist/index.d.ts.map +1 -1
  209. package/dist/index.js +5 -1
  210. package/dist/middleware.d.ts +12 -6
  211. package/dist/middleware.d.ts.map +1 -1
  212. package/dist/middleware.js +13 -7
  213. package/dist/rpc/Invalidation.d.ts +1124 -0
  214. package/dist/rpc/Invalidation.d.ts.map +1 -0
  215. package/dist/rpc/Invalidation.js +178 -0
  216. package/dist/rpc/MiddlewareMaker.d.ts +10 -7
  217. package/dist/rpc/MiddlewareMaker.d.ts.map +1 -1
  218. package/dist/rpc/MiddlewareMaker.js +57 -37
  219. package/dist/rpc/RpcContextMap.d.ts +2 -2
  220. package/dist/rpc/RpcContextMap.d.ts.map +1 -1
  221. package/dist/rpc/RpcMiddleware.d.ts +13 -10
  222. package/dist/rpc/RpcMiddleware.d.ts.map +1 -1
  223. package/dist/rpc/RpcMiddleware.js +2 -2
  224. package/dist/rpc.d.ts +1 -1
  225. package/dist/rpc.d.ts.map +1 -1
  226. package/dist/rpc.js +2 -2
  227. package/dist/runtime.d.ts +19 -0
  228. package/dist/runtime.d.ts.map +1 -0
  229. package/dist/runtime.js +40 -0
  230. package/dist/setupRequest.d.ts +20 -0
  231. package/dist/setupRequest.d.ts.map +1 -0
  232. package/dist/setupRequest.js +72 -0
  233. package/dist/toast.d.ts +51 -0
  234. package/dist/toast.d.ts.map +1 -0
  235. package/dist/toast.js +34 -0
  236. package/dist/transform.d.ts +1 -1
  237. package/dist/transform.d.ts.map +1 -1
  238. package/dist/transform.js +4 -5
  239. package/dist/utils/effectify.d.ts +1 -1
  240. package/dist/utils/effectify.d.ts.map +1 -1
  241. package/dist/utils/effectify.js +2 -2
  242. package/dist/utils/extend.d.ts +6 -1
  243. package/dist/utils/extend.d.ts.map +1 -1
  244. package/dist/utils/extend.js +24 -6
  245. package/dist/utils/gen.d.ts +4 -4
  246. package/dist/utils/gen.d.ts.map +1 -1
  247. package/dist/utils/logLevel.d.ts +2 -2
  248. package/dist/utils/logLevel.d.ts.map +1 -1
  249. package/dist/utils/logger.d.ts +2 -1
  250. package/dist/utils/logger.d.ts.map +1 -1
  251. package/dist/utils/logger.js +2 -2
  252. package/dist/utils.d.ts +34 -39
  253. package/dist/utils.d.ts.map +1 -1
  254. package/dist/utils.js +33 -37
  255. package/dist/validation/validators.d.ts.map +1 -1
  256. package/dist/validation.d.ts.map +1 -1
  257. package/dist/withToast.d.ts +30 -0
  258. package/dist/withToast.d.ts.map +1 -0
  259. package/dist/withToast.js +64 -0
  260. package/package.json +26 -266
  261. package/src/Array.ts +5 -5
  262. package/src/Chunk.ts +3 -3
  263. package/src/Config/SecretURL.ts +6 -3
  264. package/src/Config/internal/configSecretURL.ts +2 -2
  265. package/src/Config.ts +6 -13
  266. package/src/ConfigProvider.ts +4 -47
  267. package/src/Context.ts +9 -8
  268. package/src/DataDependencies.ts +171 -0
  269. package/src/Effect.ts +9 -12
  270. package/src/Emailer.ts +51 -0
  271. package/src/Inputify.type.ts +1 -1
  272. package/src/Layer.ts +8 -5
  273. package/src/Model/Repository/Registry.ts +35 -0
  274. package/src/Model/Repository/dependency.ts +32 -0
  275. package/src/Model/Repository/ext.ts +374 -0
  276. package/src/Model/Repository/internal/internal.ts +988 -0
  277. package/src/Model/Repository/legacy.ts +29 -0
  278. package/src/Model/Repository/makeRepo.ts +168 -0
  279. package/src/Model/Repository/service.ts +676 -0
  280. package/src/Model/Repository/validation.ts +38 -0
  281. package/src/Model/Repository.ts +7 -0
  282. package/src/Model/dsl.ts +129 -0
  283. package/src/Model/filter/filterApi.ts +78 -0
  284. package/src/Model/filter/types/errors.ts +47 -0
  285. package/src/Model/filter/types/fields.ts +50 -0
  286. package/src/Model/filter/types/path/common.ts +404 -0
  287. package/src/Model/filter/types/path/eager.ts +329 -0
  288. package/src/Model/filter/types/path/index.ts +4 -0
  289. package/src/Model/filter/types/utils.ts +128 -0
  290. package/src/Model/filter/types/validator.ts +46 -0
  291. package/src/Model/filter/types.ts +6 -0
  292. package/src/Model/query/dsl.ts +3092 -0
  293. package/src/Model/query/new-kid-interpreter.ts +532 -0
  294. package/src/Model/query.ts +13 -0
  295. package/src/Model.ts +5 -0
  296. package/src/NonEmptySet.ts +6 -4
  297. package/src/Option.ts +2 -0
  298. package/src/Pure.ts +6 -3
  299. package/src/QueueMaker.ts +11 -0
  300. package/src/RequestContext.ts +48 -0
  301. package/src/RequestScopedDependencies.ts +45 -0
  302. package/src/Schema/Class.ts +550 -56
  303. package/src/Schema/SchemaParser.ts +12 -0
  304. package/src/Schema/SpecialJsonSchema.ts +75 -7
  305. package/src/Schema/SpecialOpenApi.ts +5 -5
  306. package/src/Schema/brand.ts +27 -12
  307. package/src/Schema/email.ts +9 -7
  308. package/src/Schema/ext.ts +408 -91
  309. package/src/Schema/moreStrings.ts +213 -88
  310. package/src/Schema/numbers.ts +107 -29
  311. package/src/Schema/phoneNumber.ts +8 -9
  312. package/src/Schema/schema.ts +1 -1
  313. package/src/Schema/strings.ts +23 -14
  314. package/src/Schema.ts +403 -46
  315. package/src/SchemaAST.ts +1 -0
  316. package/src/Set.ts +6 -2
  317. package/src/Store.ts +325 -0
  318. package/src/_ext/Array.ts +4 -2
  319. package/src/_ext/misc.ts +4 -1
  320. package/src/_ext/ord.ext.ts +2 -1
  321. package/src/builtin-json.d.ts +24 -0
  322. package/src/builtin.ts +16 -21
  323. package/src/client/InvalidationKeys.ts +55 -0
  324. package/src/client/apiClientFactory.ts +291 -126
  325. package/src/client/clientFor.ts +101 -33
  326. package/src/client/errors.ts +66 -20
  327. package/src/client/makeClient.ts +519 -60
  328. package/src/client.ts +6 -4
  329. package/src/http/Request.ts +4 -4
  330. package/src/http/internal/lib.ts +12 -12
  331. package/src/http.ts +1 -1
  332. package/src/ids.ts +45 -8
  333. package/src/index.ts +20 -16
  334. package/src/middleware.ts +12 -8
  335. package/src/rpc/Invalidation.ts +278 -0
  336. package/src/rpc/MiddlewareMaker.ts +86 -79
  337. package/src/rpc/README.md +2 -2
  338. package/src/rpc/RpcContextMap.ts +4 -4
  339. package/src/rpc/RpcMiddleware.ts +18 -13
  340. package/src/rpc.ts +4 -4
  341. package/src/runtime.ts +57 -0
  342. package/src/setupRequest.ts +138 -0
  343. package/src/toast.ts +54 -0
  344. package/src/transform.ts +4 -4
  345. package/src/utils/effectify.ts +1 -1
  346. package/src/utils/extend.ts +24 -5
  347. package/src/utils/gen.ts +7 -7
  348. package/src/utils/logLevel.ts +1 -1
  349. package/src/utils/logger.ts +3 -2
  350. package/src/utils.ts +85 -158
  351. package/src/validation.ts +2 -2
  352. package/src/withToast.ts +133 -0
  353. package/test/dist/rpc.test.d.ts.map +1 -1
  354. package/test/dist/rpcMiddlewareContext.test.d.ts.map +1 -0
  355. package/test/moreStrings.test.ts +55 -10
  356. package/test/rpc.test.ts +28 -11
  357. package/test/rpcMiddlewareContext.test.ts +63 -0
  358. package/test/schema.test.ts +318 -55
  359. package/test/secretURL.test.ts +4 -1
  360. package/test/special.test.ts +663 -131
  361. package/test/utils.test.ts +5 -5
  362. package/tsconfig.base.json +6 -4
  363. package/tsconfig.json +9 -1
  364. package/tsconfig.src.json +29 -29
  365. package/tsconfig.test.json +2 -2
  366. package/dist/Operations.d.ts +0 -124
  367. package/dist/Operations.d.ts.map +0 -1
  368. package/dist/Operations.js +0 -29
  369. package/eslint.config.mjs +0 -26
  370. package/src/Operations.ts +0 -55
  371. package/tsconfig.json.bak +0 -12
@@ -0,0 +1,12 @@
1
+ import * as SchemaParser from "effect/SchemaParser"
2
+ import { withDefaultParseOptions } from "./ext.ts"
3
+
4
+ export * from "effect/SchemaParser"
5
+
6
+ export const decodeEffectConcurrently: typeof SchemaParser.decodeEffect = withDefaultParseOptions(
7
+ SchemaParser.decodeEffect
8
+ )
9
+
10
+ export const decodeUnknownEffectConcurrently: typeof SchemaParser.decodeUnknownEffect = withDefaultParseOptions(
11
+ SchemaParser.decodeUnknownEffect
12
+ )
@@ -2,7 +2,8 @@
2
2
  * SpecialJsonSchema — A variant of Schema.toJsonSchemaDocument that
3
3
  * post-processes the output (e.g. flattens simple allOf).
4
4
  */
5
- import { type JsonSchema, type Schema, SchemaRepresentation } from "effect"
5
+ import type * as JsonSchema from "effect/JsonSchema"
6
+ import * as Schema from "effect/Schema"
6
7
 
7
8
  /**
8
9
  * Converts a schema to a JSON Schema Document (draft-2020-12), with
@@ -12,8 +13,7 @@ export function specialJsonSchemaDocument(
12
13
  schema: Schema.Top,
13
14
  options?: Schema.ToJsonSchemaOptions
14
15
  ): JsonSchema.Document<"draft-2020-12"> {
15
- const doc = SchemaRepresentation.fromAST(schema.ast)
16
- const jd = SchemaRepresentation.toJsonSchemaDocument(doc, options)
16
+ const jd = Schema.toJsonSchemaDocument(schema, options)
17
17
  const processedDefs: JsonSchema.Definitions = {}
18
18
  for (const [key, def] of Object.entries(jd.definitions)) {
19
19
  processedDefs[key] = postProcessJsonSchema(def)
@@ -50,9 +50,9 @@ export function flattenSimpleAllOf(obj: unknown): unknown {
50
50
  )
51
51
  if (canFlatten) {
52
52
  const { allOf: _, ...rest } = result
53
- let merged: Record<string, unknown> = { ...rest }
53
+ const merged: Record<string, unknown> = { ...rest }
54
54
  for (const entry of allOf) {
55
- merged = { ...merged, ...entry }
55
+ Object.assign(merged, entry)
56
56
  }
57
57
  return merged
58
58
  }
@@ -62,8 +62,76 @@ export function flattenSimpleAllOf(obj: unknown): unknown {
62
62
  }
63
63
 
64
64
  /**
65
- * Applies JSON Schema post-processing: flattens simple allOf.
65
+ * Recursively removes `additionalProperties: false` from JSON Schema objects.
66
+ * Only removes when the value is exactly `false` -- other values are left intact.
67
+ */
68
+ export function removeAdditionalPropertiesFalse(obj: unknown): unknown {
69
+ if (obj === null || typeof obj !== "object") return obj
70
+
71
+ if (globalThis.Array.isArray(obj)) {
72
+ return obj.map(removeAdditionalPropertiesFalse)
73
+ }
74
+
75
+ const record = obj as Record<string, unknown>
76
+ const result: Record<string, unknown> = {}
77
+ for (const [key, value] of Object.entries(record)) {
78
+ if (key === "additionalProperties" && value === false) continue
79
+ result[key] = removeAdditionalPropertiesFalse(value)
80
+ }
81
+
82
+ return result
83
+ }
84
+
85
+ /**
86
+ * Flattens nested `anyOf` entries: if an anyOf entry is itself just `{ anyOf: [...] }`
87
+ * with no other keys, its children are inlined. If only one item remains, the anyOf
88
+ * wrapper is removed entirely.
89
+ */
90
+ export function flattenNestedAnyOf(obj: unknown): unknown {
91
+ if (obj === null || typeof obj !== "object") return obj
92
+ if (globalThis.Array.isArray(obj)) return obj.map(flattenNestedAnyOf)
93
+
94
+ const record = obj as Record<string, unknown>
95
+ const result: Record<string, unknown> = {}
96
+ for (const [key, value] of Object.entries(record)) {
97
+ result[key] = flattenNestedAnyOf(value)
98
+ }
99
+
100
+ if (globalThis.Array.isArray(result["anyOf"])) {
101
+ const anyOf = result["anyOf"] as Array<unknown>
102
+ const flattened: Array<unknown> = []
103
+ for (const entry of anyOf) {
104
+ if (
105
+ typeof entry === "object"
106
+ && entry !== null
107
+ && !globalThis.Array.isArray(entry)
108
+ && "anyOf" in entry
109
+ && Object.keys(entry).length === 1
110
+ && globalThis.Array.isArray((entry as Record<string, unknown>)["anyOf"])
111
+ ) {
112
+ flattened.push(...(entry as Record<string, unknown>)["anyOf"] as Array<unknown>)
113
+ } else {
114
+ flattened.push(entry)
115
+ }
116
+ }
117
+ if (flattened.length === 1) {
118
+ const { anyOf: _, ...rest } = result
119
+ const single = flattened[0]
120
+ if (typeof single === "object" && single !== null && !globalThis.Array.isArray(single)) {
121
+ return { ...rest, ...single }
122
+ }
123
+ return single
124
+ }
125
+ result["anyOf"] = flattened
126
+ }
127
+
128
+ return result
129
+ }
130
+
131
+ /**
132
+ * Applies JSON Schema post-processing: flattens simple allOf,
133
+ * flattens nested anyOf, then strips additionalProperties: false.
66
134
  */
67
135
  export function postProcessJsonSchema(obj: JsonSchema.JsonSchema): JsonSchema.JsonSchema {
68
- return flattenSimpleAllOf(obj) as JsonSchema.JsonSchema
136
+ return removeAdditionalPropertiesFalse(flattenNestedAnyOf(flattenSimpleAllOf(obj))) as JsonSchema.JsonSchema
69
137
  }
@@ -11,15 +11,15 @@
11
11
  * Usage with the OpenApi `Transform` annotation:
12
12
  *
13
13
  * ```ts
14
- * import { OpenApi } from "effect/unstable"
15
- * import { deduplicateOpenApiSchemas } from "./SpecialOpenApi.js"
14
+ * import { OpenApi } from "effect/http-api"
15
+ * import { deduplicateOpenApiSchemas } from "./SpecialOpenApi.ts"
16
16
  *
17
17
  * const api = HttpApi.make("myApi")
18
18
  * .pipe(HttpApi.annotateContext(OpenApi.annotations({ transform: deduplicateOpenApiSchemas })))
19
19
  * ```
20
20
  */
21
21
 
22
- import { postProcessJsonSchema } from "./SpecialJsonSchema.js"
22
+ import { postProcessJsonSchema } from "./SpecialJsonSchema.ts"
23
23
 
24
24
  /**
25
25
  * Deduplicates `components.schemas` entries in an OpenAPI spec.
@@ -70,7 +70,7 @@ export function deduplicateOpenApiSchemas(
70
70
  }
71
71
  }
72
72
 
73
- if (remapping.size === 0) return postProcessJsonSchema(spec) as Record<string, any>
73
+ if (remapping.size === 0) return postProcessJsonSchema(spec)
74
74
 
75
75
  // Build new schemas object without duplicates
76
76
  const newSchemas: Record<string, any> = {}
@@ -85,7 +85,7 @@ export function deduplicateOpenApiSchemas(
85
85
  newSpec["components"]["schemas"] = newSchemas
86
86
  rewriteRefs(newSpec, remapping)
87
87
 
88
- return postProcessJsonSchema(newSpec) as Record<string, any>
88
+ return postProcessJsonSchema(newSpec)
89
89
  }
90
90
 
91
91
  /**
@@ -1,7 +1,7 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
  /* eslint-disable @typescript-eslint/no-unsafe-return */
3
- import type { Option } from "effect"
4
3
  import * as B from "effect/Brand"
4
+ import type * as Option from "effect/Option"
5
5
  import type * as Result from "effect/Result"
6
6
  import * as S from "effect/Schema"
7
7
 
@@ -28,20 +28,35 @@ export interface Constructor<in out A extends B.Brand<any>> {
28
28
  is(a: Unbranded<A>): a is Unbranded<A> & A
29
29
  }
30
30
 
31
- type BrandAnnotations<C extends B.Brand<any>> =
32
- & S.Annotations.Filter
33
- & (
34
- C extends string ? { readonly toArbitrary?: S.Annotations.ToArbitrary.Declaration<C, readonly []> }
35
- : {}
36
- )
31
+ type BrandAnnotations = S.Annotations.Filter
32
+
33
+ export interface BrandedSchema<S extends S.Top, C extends B.Brand<any>> extends
34
+ S.Bottom<
35
+ C,
36
+ S["Encoded"],
37
+ S["DecodingServices"],
38
+ S["EncodingServices"],
39
+ S["ast"],
40
+ BrandedSchema<S, C>,
41
+ S["~type.make.in"],
42
+ S["Iso"],
43
+ S["~type.parameters"],
44
+ C,
45
+ S["~type.mutability"],
46
+ S["~type.optionality"],
47
+ S["~type.constructor.default"],
48
+ S["~encoded.mutability"],
49
+ S["~encoded.optionality"]
50
+ >
51
+ {}
37
52
 
38
53
  export const fromBrand = <C extends B.Brand<any>>(
39
- constructor: Constructor<C>,
40
- options?: BrandAnnotations<C>
54
+ _constructor: Constructor<C>,
55
+ options?: BrandAnnotations
41
56
  ) =>
42
- <Self extends S.Top>(self: Self): S.brand<Self["Rebuild"], B.Brand.Keys<C>> => {
43
- const branded = S.fromBrand(options?.identifier ?? "Brand", constructor as any)(self as any)
44
- return options ? (branded as any).pipe(S.annotate(options)) : branded as any
57
+ <Self extends S.Top>(self: Self): BrandedSchema<Self, C> => {
58
+ const branded = self.pipe(S.brand("Brand"))
59
+ return (options ? branded.pipe(S.annotate(options)) : branded) as BrandedSchema<Self, C>
45
60
  }
46
61
 
47
62
  export type Brands<P> = P extends B.Brand<any> ? B.Brand.Brands<P>
@@ -2,8 +2,8 @@ import type { Refinement } from "effect-app/Function"
2
2
  import { isValidEmail } from "effect-app/validation"
3
3
  import * as S from "effect/Schema"
4
4
  import type { Simplify } from "effect/Types"
5
- import type { B } from "./schema.js"
6
- import type { NonEmptyStringBrand } from "./strings.js"
5
+ import type { B } from "./schema.ts"
6
+ import type { NonEmptyStringBrand } from "./strings.ts"
7
7
 
8
8
  export interface EmailBrand extends Simplify<NonEmptyStringBrand & B.Brand<"Email">> {}
9
9
 
@@ -20,11 +20,13 @@ export const Email = S
20
20
  S.check(S.isMinLength(3), /* a@b */ S.isMaxLength(998)),
21
21
  S.refine(isValidEmail as Refinement<string, Email>, {
22
22
  identifier: "Email",
23
- title: "Email",
24
23
  description: "an email according to RFC 5322",
25
- jsonSchema: { format: "email", minLength: 3, maxLength: 998 }
26
- }),
27
- S.annotate({
28
- toArbitrary: () => (fc) => fc.emailAddress().map((_) => _ as Email)
24
+ // JSON Schema minLength counts code points; isMinLength(3) is UTF-16 units (ceil(3/2)=2).
25
+ jsonSchema: { format: "email", minLength: 2, maxLength: 998 },
26
+ // Native Arbitrary cannot invert `isValidEmail`; without a constraint, rejection sampling
27
+ // discards (almost) every random string.
28
+ arbitraryConstraint: {
29
+ patterns: [{ source: "^[a-z]{3,10}@[a-z]{3,10}\\.(?:com|net|org|de)$", flags: "" }]
30
+ }
29
31
  })
30
32
  )