@effect-app/infra 0.7.0 → 0.8.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 (284) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/_cjs/errors.cjs +21 -22
  3. package/_cjs/errors.cjs.map +1 -1
  4. package/_cjs/lib/api/authorization.jwt.cjs +1 -1
  5. package/_cjs/{vendor/Cache/Cache/operations/makeWith.cjs → lib/api/codec.cjs} +16 -13
  6. package/_cjs/lib/api/codec.cjs.map +1 -0
  7. package/_cjs/{services/memQueue.cjs → lib/api/express/makeJsonSchema.cjs} +42 -22
  8. package/_cjs/lib/api/express/makeJsonSchema.cjs.map +1 -0
  9. package/_cjs/lib/api/express/makeOpenApiSpecs.cjs +66 -0
  10. package/_cjs/lib/api/express/makeOpenApiSpecs.cjs.map +1 -0
  11. package/_cjs/lib/api/express/schema/jwt.cjs +43 -0
  12. package/_cjs/lib/api/express/schema/jwt.cjs.map +1 -0
  13. package/_cjs/lib/api/express/schema/requestHandler.cjs +166 -0
  14. package/_cjs/lib/api/express/schema/requestHandler.cjs.map +1 -0
  15. package/_cjs/lib/api/express/schema/routing.cjs +121 -0
  16. package/_cjs/lib/api/express/schema/routing.cjs.map +1 -0
  17. package/_cjs/lib/api/routing.cjs +28 -28
  18. package/_cjs/lib/api/routing.cjs.map +1 -1
  19. package/_cjs/lib/api/writeDocs.cjs +4 -4
  20. package/_cjs/lib/api/writeDocs.cjs.map +1 -1
  21. package/_cjs/services/Store/Disk.cjs +1 -1
  22. package/_cjs/services/simpledb/cosmosdb.cjs +98 -0
  23. package/_cjs/services/simpledb/cosmosdb.cjs.map +1 -0
  24. package/_cjs/services/simpledb/diskdb.cjs +118 -0
  25. package/_cjs/services/simpledb/diskdb.cjs.map +1 -0
  26. package/_cjs/services/simpledb/fileutil.cjs +36 -0
  27. package/_cjs/services/simpledb/fileutil.cjs.map +1 -0
  28. package/_cjs/{vendor/Cache/Cache/_internal/CacheState.cjs → services/simpledb/index.cjs} +31 -24
  29. package/_cjs/services/simpledb/index.cjs.map +1 -0
  30. package/_cjs/services/simpledb/memdb.cjs +74 -0
  31. package/_cjs/services/simpledb/memdb.cjs.map +1 -0
  32. package/_cjs/services/simpledb/mongodb.cjs +86 -0
  33. package/_cjs/services/simpledb/mongodb.cjs.map +1 -0
  34. package/_cjs/services/simpledb/redisdb.cjs +120 -0
  35. package/_cjs/services/simpledb/redisdb.cjs.map +1 -0
  36. package/_cjs/services/simpledb/shared.cjs +80 -0
  37. package/_cjs/services/simpledb/shared.cjs.map +1 -0
  38. package/_cjs/services/simpledb/simpledb.cjs +77 -0
  39. package/_cjs/services/simpledb/simpledb.cjs.map +1 -0
  40. package/_src/_global.ext.ts +1 -1
  41. package/_src/errors.ts +12 -3
  42. package/_src/lib/api/app.ts.bak +125 -0
  43. package/_src/lib/api/authorization.jwt.ts +1 -1
  44. package/_src/lib/api/codec.ts +27 -0
  45. package/_src/lib/api/errors.ts.bak +20 -0
  46. package/_src/lib/api/express/makeJsonSchema.ts +49 -0
  47. package/_src/lib/api/express/makeOpenApiSpecs.ts +60 -0
  48. package/_src/lib/api/express/routing.ts.bak +460 -0
  49. package/_src/lib/api/express/schema/jwt.ts +38 -0
  50. package/_src/lib/api/express/schema/requestHandler.ts +360 -0
  51. package/_src/lib/api/express/schema/routing.ts +202 -0
  52. package/_src/lib/api/routing.ts +5 -10
  53. package/_src/lib/api/writeDocs.ts +4 -5
  54. package/_src/services/Store/Disk.ts +1 -1
  55. package/_src/services/simpledb/cosmosdb.ts +134 -0
  56. package/_src/services/simpledb/diskdb.ts +158 -0
  57. package/_src/services/simpledb/fileutil.ts +28 -0
  58. package/_src/services/simpledb/index.ts +6 -0
  59. package/_src/services/simpledb/memdb.ts +79 -0
  60. package/_src/services/simpledb/mongodb.ts +99 -0
  61. package/_src/services/simpledb/redisdb.ts +182 -0
  62. package/_src/services/simpledb/shared.ts +117 -0
  63. package/_src/services/simpledb/simpledb.ts +117 -0
  64. package/dist/_global.ext.d.ts +1 -1
  65. package/dist/_global.ext.d.ts.map +1 -1
  66. package/dist/errors.d.ts +11 -2
  67. package/dist/errors.d.ts.map +1 -1
  68. package/dist/errors.js +17 -3
  69. package/dist/lib/api/authorization.jwt.d.ts +1 -1
  70. package/dist/lib/api/authorization.jwt.d.ts.map +1 -1
  71. package/dist/lib/api/authorization.jwt.js +2 -2
  72. package/dist/lib/api/codec.d.ts +7 -0
  73. package/dist/lib/api/codec.d.ts.map +1 -0
  74. package/dist/lib/api/codec.js +19 -0
  75. package/dist/lib/api/express/makeJsonSchema.d.ts +30 -0
  76. package/dist/lib/api/express/makeJsonSchema.d.ts.map +1 -0
  77. package/dist/lib/api/express/makeJsonSchema.js +40 -0
  78. package/dist/lib/api/express/makeOpenApiSpecs.d.ts +55 -0
  79. package/dist/lib/api/express/makeOpenApiSpecs.d.ts.map +1 -0
  80. package/dist/lib/api/express/makeOpenApiSpecs.js +56 -0
  81. package/dist/lib/api/express/schema/jwt.d.ts +5 -0
  82. package/dist/lib/api/express/schema/jwt.d.ts.map +1 -0
  83. package/dist/lib/api/express/schema/jwt.js +32 -0
  84. package/dist/lib/api/express/schema/requestHandler.d.ts +71 -0
  85. package/dist/lib/api/express/schema/requestHandler.d.ts.map +1 -0
  86. package/dist/lib/api/express/schema/requestHandler.js +140 -0
  87. package/dist/lib/api/express/schema/routing.d.ts +45 -0
  88. package/dist/lib/api/express/schema/routing.d.ts.map +1 -0
  89. package/dist/lib/api/express/schema/routing.js +95 -0
  90. package/dist/lib/api/routing.d.ts +4 -4
  91. package/dist/lib/api/routing.d.ts.map +1 -1
  92. package/dist/lib/api/routing.js +29 -28
  93. package/dist/lib/api/writeDocs.d.ts +1 -1
  94. package/dist/lib/api/writeDocs.d.ts.map +1 -1
  95. package/dist/lib/api/writeDocs.js +5 -5
  96. package/dist/services/Store/Disk.js +2 -2
  97. package/dist/services/simpledb/cosmosdb.d.ts +13 -0
  98. package/dist/services/simpledb/cosmosdb.d.ts.map +1 -0
  99. package/dist/services/simpledb/cosmosdb.js +88 -0
  100. package/dist/services/simpledb/diskdb.d.ts +12 -0
  101. package/dist/services/simpledb/diskdb.d.ts.map +1 -0
  102. package/dist/services/simpledb/diskdb.js +96 -0
  103. package/dist/services/simpledb/fileutil.d.ts +7 -0
  104. package/dist/services/simpledb/fileutil.d.ts.map +1 -0
  105. package/dist/services/simpledb/fileutil.js +25 -0
  106. package/dist/services/simpledb/index.d.ts +7 -0
  107. package/dist/services/simpledb/index.d.ts.map +1 -0
  108. package/dist/services/simpledb/index.js +7 -0
  109. package/dist/services/simpledb/memdb.d.ts +12 -0
  110. package/dist/services/simpledb/memdb.d.ts.map +1 -0
  111. package/dist/services/simpledb/memdb.js +55 -0
  112. package/dist/services/simpledb/mongodb.d.ts +13 -0
  113. package/dist/services/simpledb/mongodb.d.ts.map +1 -0
  114. package/dist/services/simpledb/mongodb.js +55 -0
  115. package/dist/services/simpledb/redisdb.d.ts +25 -0
  116. package/dist/services/simpledb/redisdb.d.ts.map +1 -0
  117. package/dist/services/simpledb/redisdb.js +105 -0
  118. package/dist/services/simpledb/shared.d.ts +63 -0
  119. package/dist/services/simpledb/shared.d.ts.map +1 -0
  120. package/dist/services/simpledb/shared.js +65 -0
  121. package/dist/services/simpledb/simpledb.d.ts +23 -0
  122. package/dist/services/simpledb/simpledb.d.ts.map +1 -0
  123. package/dist/services/simpledb/simpledb.js +56 -0
  124. package/package.json +126 -238
  125. package/_cjs/ext.cjs +0 -4
  126. package/_cjs/ext.cjs.map +0 -1
  127. package/_cjs/lib/fileUtil.cjs +0 -36
  128. package/_cjs/lib/fileUtil.cjs.map +0 -1
  129. package/_cjs/services/CUPS/service.cjs +0 -15
  130. package/_cjs/services/CUPS/service.cjs.map +0 -1
  131. package/_cjs/services/CUPS.cjs +0 -113
  132. package/_cjs/services/CUPS.cjs.map +0 -1
  133. package/_cjs/services/Cache.cjs +0 -39
  134. package/_cjs/services/Cache.cjs.map +0 -1
  135. package/_cjs/services/ServiceBus.cjs +0 -69
  136. package/_cjs/services/ServiceBus.cjs.map +0 -1
  137. package/_cjs/services/memQueue.cjs.map +0 -1
  138. package/_cjs/vendor/Cache/Cache/_internal/AtomicBoolean.cjs +0 -14
  139. package/_cjs/vendor/Cache/Cache/_internal/AtomicBoolean.cjs.map +0 -1
  140. package/_cjs/vendor/Cache/Cache/_internal/AtomicNumber.cjs +0 -29
  141. package/_cjs/vendor/Cache/Cache/_internal/AtomicNumber.cjs.map +0 -1
  142. package/_cjs/vendor/Cache/Cache/_internal/AtomicReference.cjs +0 -32
  143. package/_cjs/vendor/Cache/Cache/_internal/AtomicReference.cjs.map +0 -1
  144. package/_cjs/vendor/Cache/Cache/_internal/CacheInternal.cjs +0 -266
  145. package/_cjs/vendor/Cache/Cache/_internal/CacheInternal.cjs.map +0 -1
  146. package/_cjs/vendor/Cache/Cache/_internal/CacheState.cjs.map +0 -1
  147. package/_cjs/vendor/Cache/Cache/_internal/KeySet.cjs +0 -67
  148. package/_cjs/vendor/Cache/Cache/_internal/KeySet.cjs.map +0 -1
  149. package/_cjs/vendor/Cache/Cache/_internal/MapKey.cjs +0 -44
  150. package/_cjs/vendor/Cache/Cache/_internal/MapKey.cjs.map +0 -1
  151. package/_cjs/vendor/Cache/Cache/_internal/MapValue.cjs +0 -33
  152. package/_cjs/vendor/Cache/Cache/_internal/MapValue.cjs.map +0 -1
  153. package/_cjs/vendor/Cache/Cache/definition.cjs +0 -13
  154. package/_cjs/vendor/Cache/Cache/definition.cjs.map +0 -1
  155. package/_cjs/vendor/Cache/Cache/operations/make.cjs +0 -20
  156. package/_cjs/vendor/Cache/Cache/operations/make.cjs.map +0 -1
  157. package/_cjs/vendor/Cache/Cache/operations/makeWith.cjs.map +0 -1
  158. package/_cjs/vendor/Cache/Cache/operations.cjs +0 -28
  159. package/_cjs/vendor/Cache/Cache/operations.cjs.map +0 -1
  160. package/_cjs/vendor/Cache/Cache.cjs +0 -28
  161. package/_cjs/vendor/Cache/Cache.cjs.map +0 -1
  162. package/_cjs/vendor/Cache/CacheStats/definition.cjs +0 -13
  163. package/_cjs/vendor/Cache/CacheStats/definition.cjs.map +0 -1
  164. package/_cjs/vendor/Cache/CacheStats.cjs +0 -17
  165. package/_cjs/vendor/Cache/CacheStats.cjs.map +0 -1
  166. package/_cjs/vendor/Cache/EntryStats/definition.cjs +0 -11
  167. package/_cjs/vendor/Cache/EntryStats/definition.cjs.map +0 -1
  168. package/_cjs/vendor/Cache/EntryStats.cjs +0 -17
  169. package/_cjs/vendor/Cache/EntryStats.cjs.map +0 -1
  170. package/_cjs/vendor/Cache/Lookup/definition.cjs +0 -6
  171. package/_cjs/vendor/Cache/Lookup/definition.cjs.map +0 -1
  172. package/_cjs/vendor/Cache/Lookup.cjs +0 -17
  173. package/_cjs/vendor/Cache/Lookup.cjs.map +0 -1
  174. package/_cjs/vendor/Cache/index.cjs +0 -17
  175. package/_cjs/vendor/Cache/index.cjs.map +0 -1
  176. package/_src/ext.ts +0 -1
  177. package/_src/lib/fileUtil.ts +0 -56
  178. package/_src/services/CUPS/service.ts +0 -16
  179. package/_src/services/CUPS.ts +0 -105
  180. package/_src/services/Cache.ts +0 -45
  181. package/_src/services/ServiceBus.ts +0 -111
  182. package/_src/services/memQueue.ts +0 -30
  183. package/_src/vendor/Cache/Cache/_internal/AtomicBoolean.ts +0 -7
  184. package/_src/vendor/Cache/Cache/_internal/AtomicNumber.ts +0 -28
  185. package/_src/vendor/Cache/Cache/_internal/AtomicReference.ts +0 -30
  186. package/_src/vendor/Cache/Cache/_internal/CacheInternal.ts +0 -293
  187. package/_src/vendor/Cache/Cache/_internal/CacheState.ts +0 -56
  188. package/_src/vendor/Cache/Cache/_internal/KeySet.ts +0 -58
  189. package/_src/vendor/Cache/Cache/_internal/MapKey.ts +0 -43
  190. package/_src/vendor/Cache/Cache/_internal/MapValue.ts +0 -39
  191. package/_src/vendor/Cache/Cache/definition.ts +0 -112
  192. package/_src/vendor/Cache/Cache/operations/make.ts +0 -17
  193. package/_src/vendor/Cache/Cache/operations/makeWith.ts +0 -32
  194. package/_src/vendor/Cache/Cache/operations.ts +0 -4
  195. package/_src/vendor/Cache/Cache.ts +0 -4
  196. package/_src/vendor/Cache/CacheStats/definition.ts +0 -23
  197. package/_src/vendor/Cache/CacheStats.ts +0 -3
  198. package/_src/vendor/Cache/EntryStats/definition.ts +0 -19
  199. package/_src/vendor/Cache/EntryStats.ts +0 -3
  200. package/_src/vendor/Cache/Lookup/definition.ts +0 -15
  201. package/_src/vendor/Cache/Lookup.ts +0 -3
  202. package/_src/vendor/Cache/global.ts.bak +0 -23
  203. package/_src/vendor/Cache/index.ts +0 -4
  204. package/dist/ext.d.ts +0 -2
  205. package/dist/ext.d.ts.map +0 -1
  206. package/dist/ext.js +0 -2
  207. package/dist/lib/fileUtil.d.ts +0 -22
  208. package/dist/lib/fileUtil.d.ts.map +0 -1
  209. package/dist/lib/fileUtil.js +0 -23
  210. package/dist/services/CUPS/service.d.ts +0 -19
  211. package/dist/services/CUPS/service.d.ts.map +0 -1
  212. package/dist/services/CUPS/service.js +0 -5
  213. package/dist/services/CUPS.d.ts +0 -10
  214. package/dist/services/CUPS.d.ts.map +0 -1
  215. package/dist/services/CUPS.js +0 -89
  216. package/dist/services/Cache.d.ts +0 -28
  217. package/dist/services/Cache.d.ts.map +0 -1
  218. package/dist/services/Cache.js +0 -28
  219. package/dist/services/ServiceBus.d.ts +0 -26
  220. package/dist/services/ServiceBus.d.ts.map +0 -1
  221. package/dist/services/ServiceBus.js +0 -53
  222. package/dist/services/memQueue.d.ts +0 -18
  223. package/dist/services/memQueue.d.ts.map +0 -1
  224. package/dist/services/memQueue.js +0 -24
  225. package/dist/vendor/Cache/Cache/_internal/AtomicBoolean.d.ts +0 -5
  226. package/dist/vendor/Cache/Cache/_internal/AtomicBoolean.d.ts.map +0 -1
  227. package/dist/vendor/Cache/Cache/_internal/AtomicBoolean.js +0 -7
  228. package/dist/vendor/Cache/Cache/_internal/AtomicNumber.d.ts +0 -8
  229. package/dist/vendor/Cache/Cache/_internal/AtomicNumber.d.ts.map +0 -1
  230. package/dist/vendor/Cache/Cache/_internal/AtomicNumber.js +0 -22
  231. package/dist/vendor/Cache/Cache/_internal/AtomicReference.d.ts +0 -10
  232. package/dist/vendor/Cache/Cache/_internal/AtomicReference.d.ts.map +0 -1
  233. package/dist/vendor/Cache/Cache/_internal/AtomicReference.js +0 -25
  234. package/dist/vendor/Cache/Cache/_internal/CacheInternal.d.ts +0 -51
  235. package/dist/vendor/Cache/Cache/_internal/CacheInternal.d.ts.map +0 -1
  236. package/dist/vendor/Cache/Cache/_internal/CacheInternal.js +0 -253
  237. package/dist/vendor/Cache/Cache/_internal/CacheState.d.ts +0 -33
  238. package/dist/vendor/Cache/Cache/_internal/CacheState.d.ts.map +0 -1
  239. package/dist/vendor/Cache/Cache/_internal/CacheState.js +0 -21
  240. package/dist/vendor/Cache/Cache/_internal/KeySet.d.ts +0 -20
  241. package/dist/vendor/Cache/Cache/_internal/KeySet.d.ts.map +0 -1
  242. package/dist/vendor/Cache/Cache/_internal/KeySet.js +0 -61
  243. package/dist/vendor/Cache/Cache/_internal/MapKey.d.ts +0 -24
  244. package/dist/vendor/Cache/Cache/_internal/MapKey.d.ts.map +0 -1
  245. package/dist/vendor/Cache/Cache/_internal/MapKey.js +0 -37
  246. package/dist/vendor/Cache/Cache/_internal/MapValue.d.ts +0 -32
  247. package/dist/vendor/Cache/Cache/_internal/MapValue.d.ts.map +0 -1
  248. package/dist/vendor/Cache/Cache/_internal/MapValue.js +0 -24
  249. package/dist/vendor/Cache/Cache/definition.d.ts +0 -100
  250. package/dist/vendor/Cache/Cache/definition.d.ts.map +0 -1
  251. package/dist/vendor/Cache/Cache/definition.js +0 -5
  252. package/dist/vendor/Cache/Cache/operations/make.d.ts +0 -12
  253. package/dist/vendor/Cache/Cache/operations/make.d.ts.map +0 -1
  254. package/dist/vendor/Cache/Cache/operations/make.js +0 -12
  255. package/dist/vendor/Cache/Cache/operations/makeWith.d.ts +0 -14
  256. package/dist/vendor/Cache/Cache/operations/makeWith.d.ts.map +0 -1
  257. package/dist/vendor/Cache/Cache/operations/makeWith.js +0 -15
  258. package/dist/vendor/Cache/Cache/operations.d.ts +0 -3
  259. package/dist/vendor/Cache/Cache/operations.d.ts.map +0 -1
  260. package/dist/vendor/Cache/Cache/operations.js +0 -4
  261. package/dist/vendor/Cache/Cache.d.ts +0 -3
  262. package/dist/vendor/Cache/Cache.d.ts.map +0 -1
  263. package/dist/vendor/Cache/Cache.js +0 -4
  264. package/dist/vendor/Cache/CacheStats/definition.d.ts +0 -19
  265. package/dist/vendor/Cache/CacheStats/definition.d.ts.map +0 -1
  266. package/dist/vendor/Cache/CacheStats/definition.js +0 -6
  267. package/dist/vendor/Cache/CacheStats.d.ts +0 -2
  268. package/dist/vendor/Cache/CacheStats.d.ts.map +0 -1
  269. package/dist/vendor/Cache/CacheStats.js +0 -3
  270. package/dist/vendor/Cache/EntryStats/definition.d.ts +0 -17
  271. package/dist/vendor/Cache/EntryStats/definition.d.ts.map +0 -1
  272. package/dist/vendor/Cache/EntryStats/definition.js +0 -4
  273. package/dist/vendor/Cache/EntryStats.d.ts +0 -2
  274. package/dist/vendor/Cache/EntryStats.d.ts.map +0 -1
  275. package/dist/vendor/Cache/EntryStats.js +0 -3
  276. package/dist/vendor/Cache/Lookup/definition.d.ts +0 -17
  277. package/dist/vendor/Cache/Lookup/definition.d.ts.map +0 -1
  278. package/dist/vendor/Cache/Lookup/definition.js +0 -2
  279. package/dist/vendor/Cache/Lookup.d.ts +0 -2
  280. package/dist/vendor/Cache/Lookup.d.ts.map +0 -1
  281. package/dist/vendor/Cache/Lookup.js +0 -3
  282. package/dist/vendor/Cache/index.d.ts +0 -5
  283. package/dist/vendor/Cache/index.d.ts.map +0 -1
  284. package/dist/vendor/Cache/index.js +0 -5
@@ -0,0 +1,360 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* eslint-disable @typescript-eslint/ban-types */
3
+ import * as MO from "@effect-app/schema"
4
+ import type { Methods } from "@effect-app/schema"
5
+ import { Parser } from "@effect-app/schema"
6
+ import type express from "express"
7
+ import { ValidationError } from "../../../../errors.js"
8
+
9
+ export type _R<T extends Effect<any, any, any>> = [T] extends [
10
+ Effect<infer R, any, any>
11
+ ] ? R
12
+ : never
13
+
14
+ export type _E<T extends Effect<any, any, any>> = [T] extends [
15
+ Effect<any, infer E, any>
16
+ ] ? E
17
+ : never
18
+
19
+ export type Request<
20
+ PathA,
21
+ CookieA,
22
+ QueryA,
23
+ BodyA,
24
+ HeaderA,
25
+ ReqA extends PathA & QueryA & BodyA
26
+ > = MO.ReqResSchemed<unknown, ReqA> & {
27
+ method: Methods
28
+ path: string
29
+ Cookie?: MO.ReqRes<Record<string, string>, CookieA>
30
+ Path?: MO.ReqRes<Record<string, string>, PathA>
31
+ Body?: MO.ReqRes<unknown, BodyA>
32
+ Query?: MO.ReqRes<Record<string, string>, QueryA>
33
+ Headers?: MO.ReqRes<Record<string, string>, HeaderA>
34
+ }
35
+
36
+ export type Request2<
37
+ Path extends string,
38
+ Method extends Methods,
39
+ ReqA
40
+ > = MO.ReqResSchemed<unknown, ReqA> & {
41
+ method: Method
42
+ path: Path
43
+ }
44
+
45
+ export type Encode<A, E> = (a: A) => E
46
+
47
+ // function getErrorMessage(current: ContextEntry) {
48
+ // switch (current.type.name) {
49
+ // case "NonEmptyString":
50
+ // return "Must not be empty"
51
+ // }
52
+ // if (current.type.name?.startsWith("NonEmptyReadonlyArray<")) {
53
+ // return "Must not be empty"
54
+ // }
55
+ // return `Invalid value specified`
56
+ // }
57
+ export function decodeErrors(x: unknown) {
58
+ return [x]
59
+ }
60
+
61
+ // const ValidationApplicative = Effect.getValidationApplicative(
62
+ // makeAssociative<ReadonlyArray<{ type: string; errors: ReturnType<typeof decodeErrors> }>>(
63
+ // (l, r) => l.concat(r)
64
+ // )
65
+ // )
66
+
67
+ // const structValidation = DSL.structF(ValidationApplicative)
68
+ export function parseRequestParams<PathA, CookieA, QueryA, BodyA, HeaderA>(
69
+ parsers: RequestParsers<PathA, CookieA, QueryA, BodyA, HeaderA>
70
+ ) {
71
+ return ({ body, cookies, headers, params, query }: express.Request) =>
72
+ Effect.struct({
73
+ body: parsers
74
+ .parseBody(body)
75
+ .exit.flatMap(_ =>
76
+ _.isFailure() && !_.cause.isFailure()
77
+ ? (Effect.failCauseSync(() => _.cause) as Effect<never, ValidationError, never>)
78
+ : Effect(
79
+ _.isSuccess()
80
+ ? { _tag: "Success" as const, value: _.value }
81
+ : { _tag: "Failure", errors: _.cause.failures }
82
+ )
83
+ ),
84
+ cookie: parsers
85
+ .parseCookie(cookies)
86
+ .exit.flatMap(_ =>
87
+ _.isFailure() && !_.cause.isFailure()
88
+ ? (Effect.failCauseSync(() => _.cause) as Effect<never, ValidationError, never>)
89
+ : Effect(
90
+ _.isSuccess()
91
+ ? { _tag: "Success" as const, value: _.value }
92
+ : { _tag: "Failure", errors: _.cause.failures }
93
+ )
94
+ ),
95
+ headers: parsers
96
+ .parseHeaders(headers)
97
+ .exit.flatMap(_ =>
98
+ _.isFailure() && !_.cause.isFailure()
99
+ ? (Effect.failCauseSync(() => _.cause) as Effect<never, ValidationError, never>)
100
+ : Effect(
101
+ _.isSuccess()
102
+ ? { _tag: "Success" as const, value: _.value }
103
+ : { _tag: "Failure", errors: _.cause.failures }
104
+ )
105
+ ),
106
+ query: parsers
107
+ .parseQuery(query)
108
+ .exit.flatMap(_ =>
109
+ _.isFailure() && !_.cause.isFailure()
110
+ ? (Effect.failCauseSync(() => _.cause) as Effect<never, ValidationError, never>)
111
+ : Effect(
112
+ _.isSuccess()
113
+ ? { _tag: "Success" as const, value: _.value }
114
+ : { _tag: "Failure", errors: _.cause.failures }
115
+ )
116
+ ),
117
+ path: parsers
118
+ .parsePath(params)
119
+ .exit.flatMap(_ =>
120
+ _.isFailure() && !_.cause.isFailure()
121
+ ? (Effect.failCauseSync(() => _.cause) as Effect<never, ValidationError, never>)
122
+ : Effect(
123
+ _.isSuccess()
124
+ ? { _tag: "Success" as const, value: _.value }
125
+ : { _tag: "Failure", errors: _.cause.failures }
126
+ )
127
+ )
128
+ }).flatMap(({ body, cookie, headers, path, query }) => {
129
+ const errors: unknown[] = []
130
+ if (body._tag === "Failure") {
131
+ errors.push(makeError("body")(body.errors))
132
+ }
133
+ if (cookie._tag === "Failure") {
134
+ errors.push(makeError("cookie")(cookie.errors))
135
+ }
136
+ if (headers._tag === "Failure") {
137
+ errors.push(makeError("headers")(headers.errors))
138
+ }
139
+ if (path._tag === "Failure") {
140
+ errors.push(makeError("path")(path.errors))
141
+ }
142
+ if (query._tag === "Failure") {
143
+ errors.push(makeError("path")(path.errors))
144
+ }
145
+ if (errors.length) {
146
+ return Effect.fail(new ValidationError(errors))
147
+ }
148
+ return Effect({
149
+ body: body.value!,
150
+ cookie: cookie.value!,
151
+ headers: headers.value!,
152
+ path: path.value!,
153
+ query: query.value!
154
+ })
155
+ })
156
+ }
157
+
158
+ // // eslint-disable-next-line @typescript-eslint/no-explicit-any
159
+ // function mapErrors_<E, NE, NER extends Record<string, Effect<any, E, any>>>(
160
+ // t: NER, // TODO: enforce non empty
161
+ // mapErrors: (k: keyof NER) => (err: E) => NE
162
+ // ): {
163
+ // [K in keyof NER]: Effect<_R<NER[K]>, NE, Effect.Success<NER[K]>>
164
+ // } {
165
+ // return typedKeysOf(t).reduce(
166
+ // (prev, cur) => {
167
+ // prev[cur] = t[cur].mapError(mapErrors(cur))
168
+ // return prev
169
+ // },
170
+ // {} as {
171
+ // [K in keyof NER]: Effect<_R<NER[K]>, NE, Effect.Success<NER[K]>>
172
+ // }
173
+ // )
174
+ // }
175
+
176
+ function makeError(type: string) {
177
+ return (e: unknown) => [{ type, errors: decodeErrors(e) }]
178
+ }
179
+
180
+ export function respondSuccess<ReqA, A, E>(
181
+ encodeResponse: (req: ReqA) => Encode<A, E>
182
+ ) {
183
+ return (req: ReqA, res: express.Response) =>
184
+ flow(encodeResponse(req), Effect.succeed, _ =>
185
+ _.flatMap(r =>
186
+ Effect(() => {
187
+ r === undefined
188
+ ? res.status(204).send()
189
+ : res.status(200).send(r === null ? JSON.stringify(null) : r)
190
+ })
191
+ ))
192
+ }
193
+
194
+ export interface RequestHandlerOptRes<
195
+ R,
196
+ PathA,
197
+ CookieA,
198
+ QueryA,
199
+ BodyA,
200
+ HeaderA,
201
+ ReqA extends PathA & QueryA & BodyA,
202
+ ResA,
203
+ ResE
204
+ > {
205
+ adaptResponse?: any
206
+ h: (i: PathA & QueryA & BodyA & {}) => Effect<R, ResE, ResA>
207
+ Request: Request<PathA, CookieA, QueryA, BodyA, HeaderA, ReqA>
208
+ Response?: MO.ReqRes<unknown, ResA> | MO.ReqResSchemed<unknown, ResA>
209
+ }
210
+
211
+ export interface RequestHandler<
212
+ R,
213
+ PathA,
214
+ CookieA,
215
+ QueryA,
216
+ BodyA,
217
+ HeaderA,
218
+ ReqA extends PathA & QueryA & BodyA,
219
+ ResA,
220
+ ResE
221
+ > {
222
+ adaptResponse?: any
223
+ h: (i: PathA & QueryA & BodyA & {}) => Effect<R, ResE, ResA>
224
+ Request: Request<PathA, CookieA, QueryA, BodyA, HeaderA, ReqA>
225
+ Response: MO.ReqRes<unknown, ResA> | MO.ReqResSchemed<unknown, ResA>
226
+ ResponseOpenApi?: any
227
+ }
228
+
229
+ export interface RequestHandler2<
230
+ R,
231
+ Path extends string,
232
+ Method extends Methods,
233
+ ReqA,
234
+ ResA,
235
+ ResE
236
+ > {
237
+ h: (i: ReqA) => Effect<R, ResE, ResA>
238
+ Request: Request2<Path, Method, ReqA>
239
+ Response: MO.ReqRes<unknown, ResA> | MO.ReqResSchemed<unknown, ResA>
240
+ }
241
+
242
+ export type MiddlewareHandler<ResE, R2 = never, PR = never> = (
243
+ req: express.Request,
244
+ res: express.Response
245
+ ) => Layer<R2, ResE, PR>
246
+
247
+ export type Middleware<
248
+ R,
249
+ PathA,
250
+ CookieA,
251
+ QueryA,
252
+ BodyA,
253
+ HeaderA,
254
+ ReqA extends PathA & QueryA & BodyA,
255
+ ResA,
256
+ ResE,
257
+ R2 = never,
258
+ PR = never
259
+ > = (
260
+ handler: RequestHandler<R, PathA, CookieA, QueryA, BodyA, HeaderA, ReqA, ResA, ResE>
261
+ ) => {
262
+ handler: typeof handler
263
+ handle: MiddlewareHandler<ResE, R2, PR>
264
+ }
265
+
266
+ export type Middleware2<R, ReqA, ResA, R2 = never, PR = never> = Middleware<
267
+ R,
268
+ any,
269
+ any,
270
+ any,
271
+ any,
272
+ any,
273
+ ReqA,
274
+ ResA,
275
+ any,
276
+ R2,
277
+ PR
278
+ >
279
+
280
+ export function makeRequestParsers<
281
+ R,
282
+ PathA,
283
+ CookieA,
284
+ QueryA,
285
+ BodyA,
286
+ HeaderA,
287
+ ReqA extends PathA & QueryA & BodyA,
288
+ ResA,
289
+ Errors
290
+ >(
291
+ Request: RequestHandler<
292
+ R,
293
+ PathA,
294
+ CookieA,
295
+ QueryA,
296
+ BodyA,
297
+ HeaderA,
298
+ ReqA,
299
+ ResA,
300
+ Errors
301
+ >["Request"]
302
+ ): RequestParsers<PathA, CookieA, QueryA, BodyA, HeaderA> {
303
+ const ph = Effect(
304
+ Opt.fromNullable(Request.Headers)
305
+ .map(s => s)
306
+ .map(Parser.for)
307
+ .map(MO.condemn)
308
+ )
309
+ const parseHeaders = (u: unknown) => ph.flatMapOpt(d => d(u))
310
+
311
+ const pq = Effect(
312
+ Opt.fromNullable(Request.Query)
313
+ .map(s => s)
314
+ .map(Parser.for)
315
+ .map(MO.condemn)
316
+ )
317
+ const parseQuery = (u: unknown) => pq.flatMapOpt(d => d(u))
318
+
319
+ const pb = Effect(
320
+ Opt.fromNullable(Request.Body)
321
+ .map(s => s)
322
+ .map(Parser.for)
323
+ .map(MO.condemn)
324
+ )
325
+ const parseBody = (u: unknown) => pb.flatMapOpt(d => d(u))
326
+
327
+ const pp = Effect(
328
+ Opt.fromNullable(Request.Path)
329
+ .map(s => s)
330
+ .map(Parser.for)
331
+ .map(MO.condemn)
332
+ )
333
+ const parsePath = (u: unknown) => pp.flatMapOpt(d => d(u))
334
+
335
+ const pc = Effect(
336
+ Opt.fromNullable(Request.Cookie)
337
+ .map(s => s)
338
+ .map(Parser.for)
339
+ .map(MO.condemn)
340
+ )
341
+ const parseCookie = (u: unknown) => pc.flatMapOpt(d => d(u))
342
+
343
+ return {
344
+ parseBody,
345
+ parseCookie,
346
+ parseHeaders,
347
+ parsePath,
348
+ parseQuery
349
+ }
350
+ }
351
+
352
+ type Decode<A> = (u: unknown) => Effect<never, unknown, A>
353
+
354
+ export interface RequestParsers<PathA, CookieA, QueryA, BodyA, HeaderA> {
355
+ parseHeaders: Decode<Opt<HeaderA>>
356
+ parseQuery: Decode<Opt<QueryA>>
357
+ parseBody: Decode<Opt<BodyA>>
358
+ parsePath: Decode<Opt<PathA>>
359
+ parseCookie: Decode<Opt<CookieA>>
360
+ }
@@ -0,0 +1,202 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import * as MO from "@effect-app/schema"
3
+ import type { Methods } from "@effect-app/schema"
4
+
5
+ import type { JSONSchema, ParameterLocation, SubSchema } from "@effect-app/infra-adapters/Openapi/atlas-plutus"
6
+ import { isObjectSchema } from "@effect-app/infra-adapters/Openapi/atlas-plutus"
7
+ import * as OpenApi from "@effect-app/infra-adapters/Openapi/index"
8
+ import type { RequestHandler, RequestHandlerOptRes } from "./requestHandler.js"
9
+
10
+ export function asRouteDescriptionAny<R extends RouteDescriptorAny>(i: R) {
11
+ return i as RouteDescriptorAny
12
+ }
13
+
14
+ export function arrAsRouteDescriptionAny<R extends RouteDescriptorAny>(
15
+ arr: ReadonlyArray<R>
16
+ ) {
17
+ return arr.map(asRouteDescriptionAny)
18
+ }
19
+
20
+ export interface RouteDescriptor<
21
+ R,
22
+ PathA,
23
+ CookieA,
24
+ QueryA,
25
+ BodyA,
26
+ HeaderA,
27
+ ReqA extends PathA & QueryA & BodyA,
28
+ ResA,
29
+ Errors,
30
+ METHOD extends Methods = Methods
31
+ > {
32
+ path: string
33
+ method: METHOD
34
+ handler: RequestHandler<R, PathA, CookieA, QueryA, BodyA, HeaderA, ReqA, ResA, Errors>
35
+ info?: {
36
+ tags: ReadonlyArray<string>
37
+ }
38
+ }
39
+
40
+ export type RouteDescriptorAny = RouteDescriptor<
41
+ any,
42
+ any,
43
+ any,
44
+ any,
45
+ any,
46
+ any,
47
+ any,
48
+ any,
49
+ any
50
+ >
51
+
52
+ export function makeRouteDescriptor<
53
+ R,
54
+ PathA,
55
+ CookieA,
56
+ QueryA,
57
+ BodyA,
58
+ HeaderA,
59
+ ReqA extends PathA & QueryA & BodyA,
60
+ ResA = void,
61
+ Errors = any,
62
+ METHOD extends Methods = Methods
63
+ >(
64
+ path: string,
65
+ method: METHOD,
66
+ handler: RequestHandlerOptRes<
67
+ R,
68
+ PathA,
69
+ CookieA,
70
+ QueryA,
71
+ BodyA,
72
+ HeaderA,
73
+ ReqA,
74
+ ResA,
75
+ Errors
76
+ >
77
+ ) {
78
+ return { path, method, handler, _tag: "Schema" } as RouteDescriptor<
79
+ R,
80
+ PathA,
81
+ CookieA,
82
+ QueryA,
83
+ BodyA,
84
+ HeaderA,
85
+ ReqA,
86
+ ResA,
87
+ Errors,
88
+ METHOD
89
+ >
90
+ }
91
+
92
+ export function makeFromSchema<ResA>(
93
+ e: RouteDescriptor<any, any, any, any, any, any, ResA, any, any>
94
+ ) {
95
+ const jsonSchema_ = OpenApi.for
96
+ const jsonSchema = <E, A>(r: MO.ReqRes<E, A>) => jsonSchema_(r)
97
+ const { Request: Req, Response: Res_, ResponseOpenApi } = e.handler
98
+ const r = ResponseOpenApi ?? Res_
99
+ const Res = r ? MO.extractSchema(r) : MO.Void
100
+ // TODO EffectOpt.fromNullable(Req.Headers).flatMapOpt(jsonSchema)
101
+ // TODO: use the path vs body etc serialisation also in the Client.
102
+ const makeReqQuerySchema = Effect(Opt.fromNullable(Req.Query)).flatMap(_ =>
103
+ _.match(
104
+ () => Effect(Opt.none),
105
+ _ => jsonSchema(_).map(Opt.some)
106
+ )
107
+ )
108
+ const makeReqHeadersSchema = Effect(Opt.fromNullable(Req.Headers)).flatMap(_ =>
109
+ _.match(
110
+ () => Effect(Opt.none),
111
+ _ => jsonSchema(_).map(Opt.some)
112
+ )
113
+ )
114
+ const makeReqCookieSchema = Effect(Opt.fromNullable(Req.Cookie)).flatMap(_ =>
115
+ _.match(
116
+ () => Effect(Opt.none),
117
+ _ => jsonSchema(_).map(Opt.some)
118
+ )
119
+ )
120
+ const makeReqPathSchema = Effect(Opt.fromNullable(Req.Path)).flatMap(_ =>
121
+ _.match(
122
+ () => Effect(Opt.none),
123
+ _ => jsonSchema(_).map(Opt.some)
124
+ )
125
+ )
126
+ const makeReqBodySchema = Effect(Opt.fromNullable(Req.Body)).flatMap(_ =>
127
+ _.match(
128
+ () => Effect(Opt.none),
129
+ _ => jsonSchema(_).map(Opt.some)
130
+ )
131
+ )
132
+ // const makeReqSchema = schema(Req)
133
+
134
+ const makeResSchema = jsonSchema_(Res)
135
+
136
+ function makeParameters(inn: ParameterLocation) {
137
+ return (a: Opt<JSONSchema | SubSchema>) => {
138
+ return a
139
+ .flatMap(o => (isObjectSchema(o) ? Opt(o) : Opt.none))
140
+ .map(x => {
141
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
142
+ return Object.keys(x.properties!).map(p => {
143
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
144
+ const schema = x.properties![p]
145
+ const required = Boolean(x.required?.includes(p))
146
+ return { name: p, in: inn, required, schema }
147
+ })
148
+ })
149
+ .getOrElse(() => [])
150
+ }
151
+ }
152
+
153
+ return Effect.struct({
154
+ req: jsonSchema(Req.Model),
155
+ reqQuery: makeReqQuerySchema,
156
+ reqHeaders: makeReqHeadersSchema,
157
+ reqBody: makeReqBodySchema,
158
+ reqPath: makeReqPathSchema,
159
+ reqCookie: makeReqCookieSchema,
160
+ res: makeResSchema
161
+ }).map(_ => {
162
+ // console.log("$$$ REQ", _.req)
163
+ const isEmpty = !e.handler.Response || e.handler.Response === MO.Void
164
+ return {
165
+ path: e.path,
166
+ method: e.method.toLowerCase(),
167
+ tags: e.info?.tags,
168
+ description: _.req?.description,
169
+ summary: _.req?.summary,
170
+ operationId: _.req?.title,
171
+ parameters: [
172
+ ...makeParameters("path")(_.reqPath),
173
+ ...makeParameters("query")(_.reqQuery),
174
+ ...makeParameters("header")(_.reqHeaders),
175
+ ...makeParameters("cookie")(_.reqCookie)
176
+ ],
177
+ requestBody: _.reqBody.map(schema => ({
178
+ content: { "application/json": { schema } }
179
+ })).value,
180
+ responses: [
181
+ isEmpty
182
+ ? new Response(204, { description: "Empty" })
183
+ : new Response(200, {
184
+ description: "OK",
185
+ content: { "application/json": { schema: _.res } }
186
+ }),
187
+ new Response(400, { description: "ValidationError" })
188
+ ].concat(
189
+ e.path.includes(":") && isEmpty
190
+ ? [new Response(404, { description: "NotFoundError" })]
191
+ : []
192
+ )
193
+ }
194
+ })
195
+ }
196
+
197
+ class Response {
198
+ constructor(
199
+ public readonly statusCode: number,
200
+ public readonly type: any // string | JSONSchema | SubSchema
201
+ ) {}
202
+ }
@@ -1,24 +1,19 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import * as Ex from "@effect-app/infra-adapters/express"
2
3
  import type { _E, _R } from "@effect-app/prelude/_ext/Prelude.ext"
3
4
  import type { GetRequest, GetResponse } from "@effect-app/prelude/schema"
4
5
  import { extractSchema, SchemaNamed } from "@effect-app/prelude/schema"
5
6
  import * as MO from "@effect-app/prelude/schema"
6
7
  import { pretty } from "@effect-app/prelude/utils"
7
- import * as Ex from "@effect-app/infra-adapters/express/index"
8
- import type {
9
- Encode,
10
- RequestHandler,
11
- RequestHandlerOptRes,
12
- RequestParsers
13
- } from "@effect-app/infra-adapters/express/schema/requestHandler"
14
- import { parseRequestParams } from "@effect-app/infra-adapters/express/schema/requestHandler"
15
- import type { RouteDescriptorAny } from "@effect-app/infra-adapters/express/schema/routing"
16
- import { makeRouteDescriptor } from "@effect-app/infra-adapters/express/schema/routing"
17
8
  import type express from "express"
18
9
  import type { ValidationError } from "../../errors.js"
19
10
  import { RequestContext, RequestId } from "../../lib/RequestContext.js"
20
11
  import type { SupportedErrors } from "./defaultErrorHandler.js"
21
12
  import { defaultBasicErrorHandler } from "./defaultErrorHandler.js"
13
+ import type { Encode, RequestHandler, RequestHandlerOptRes, RequestParsers } from "./express/schema/requestHandler.js"
14
+ import { parseRequestParams } from "./express/schema/requestHandler.js"
15
+ import type { RouteDescriptorAny } from "./express/schema/routing.js"
16
+ import { makeRouteDescriptor } from "./express/schema/routing.js"
22
17
  import { reportRequestError } from "./reportError.js"
23
18
  import { snipString, snipValue } from "./util.js"
24
19
 
@@ -1,9 +1,8 @@
1
- import { makeOpenApiSpecs } from "@effect-app/infra-adapters/express/makeOpenApiSpecs"
2
- import type { RouteDescriptorAny } from "@effect-app/infra-adapters/express/schema/routing"
3
- import * as Plutus from "@effect-app/infra-adapters/Openapi/atlas-plutus"
4
- import { writeTextFile } from "@effect-app/infra-adapters/simpledb/fileutil"
5
-
6
1
  import { typedValuesOf } from "@effect-app/core/utils"
2
+ import * as Plutus from "@effect-app/infra-adapters/Openapi/atlas-plutus"
3
+ import { writeTextFile } from "../../services/simpledb/fileutil.js"
4
+ import { makeOpenApiSpecs } from "./express/makeOpenApiSpecs.js"
5
+ import type { RouteDescriptorAny } from "./express/schema/routing.js"
7
6
 
8
7
  export function writeOpenapiDocs(rdescs: Record<string, Record<string, RouteDescriptorAny>>) {
9
8
  return makeOpenApiSpecs(
@@ -1,5 +1,5 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import * as fu from "@effect-app/infra-adapters/simpledb/fileutil"
2
+ import * as fu from "../simpledb/fileutil.js"
3
3
 
4
4
  import fs from "fs"
5
5