@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
@@ -13,7 +13,7 @@ import type {} from "@effect-app/infra/test.arbs"
13
13
  /**
14
14
  * @tsplus global
15
15
  */
16
- import type {} from "@effect-app/infra/ext"
16
+ import type {} from "@effect-app/infra/lib/ext/Array"
17
17
  /**
18
18
  * @tsplus global
19
19
  */
package/_src/errors.ts CHANGED
@@ -1,5 +1,3 @@
1
- import { NotLoggedInError } from "@effect-app/infra-adapters/errors"
2
-
3
1
  export class NotFoundError<T extends string = string> {
4
2
  public readonly _tag = "NotFoundError"
5
3
  public readonly message: string
@@ -8,7 +6,18 @@ export class NotFoundError<T extends string = string> {
8
6
  }
9
7
  }
10
8
 
11
- export { NotLoggedInError, UnauthorizedError, ValidationError } from "@effect-app/infra-adapters/errors"
9
+ export class ValidationError {
10
+ public readonly _tag = "ValidationError"
11
+ constructor(public readonly errors: ReadonlyArray<unknown>) {}
12
+ }
13
+
14
+ export class NotLoggedInError {
15
+ public readonly _tag = "NotLoggedInError"
16
+ }
17
+
18
+ export class UnauthorizedError {
19
+ public readonly _tag = "UnauthorizedError"
20
+ }
12
21
 
13
22
  /**
14
23
  * The user carries a valid Userprofile, but there is a problem with the login none the less.
@@ -0,0 +1,125 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { flow } from "@effect-app/core/Function"
3
+ import * as MO from "@effect-app/schema"
4
+
5
+ import { NotFoundError, UnauthorizedError } from "./errors.js"
6
+
7
+ export function handle<
8
+ TModule extends Record<
9
+ string,
10
+ any // { Model: MO.SchemaAny; new (...args: any[]): any } | MO.SchemaAny
11
+ >
12
+ >(
13
+ _: TModule & { ResponseOpenApi?: any },
14
+ adaptResponse?: any
15
+ ): <R, E>(
16
+ h: (
17
+ r: InstanceType<
18
+ MO.GetRequest<TModule> extends { new(...args: any[]): any } ? MO.GetRequest<TModule>
19
+ : never
20
+ >
21
+ ) => Effect<R, E, MO.ParsedShapeOf<Extr<MO.GetResponse<TModule>>>>
22
+ ) => {
23
+ h: typeof h
24
+ Request: MO.GetRequest<TModule>
25
+ Response: MO.GetResponse<TModule>
26
+ ResponseOpenApi: any
27
+ } {
28
+ // TODO: Prevent over providing // no strict/shrink yet.
29
+ const Request = MO.extractRequest(_)
30
+ const Response = MO.extractResponse(_)
31
+
32
+ return <R, E>(
33
+ h: (
34
+ r: InstanceType<
35
+ MO.GetRequest<TModule> extends { new(...args: any[]): any } ? MO.GetRequest<TModule>
36
+ : never
37
+ >
38
+ ) => Effect<R, E, MO.ParsedShapeOf<Extr<MO.GetResponse<TModule>>>>
39
+ ) => ({
40
+ adaptResponse,
41
+ h,
42
+ Request,
43
+ Response,
44
+ ResponseOpenApi: _.ResponseOpenApi ?? Response
45
+ } as any)
46
+ }
47
+
48
+ type Extr<T> = T extends { Model: MO.SchemaAny } ? T["Model"]
49
+ : T extends MO.SchemaAny ? T
50
+ : never
51
+
52
+ export function accessM_<T, UserId, Err>(
53
+ canAccess: (rsc: T, userId: UserId) => boolean,
54
+ bad: (rsc: T, userId: UserId) => Err
55
+ ) {
56
+ return <R, E, A>(
57
+ rsc: T,
58
+ userId: UserId,
59
+ ok: (rsc: T) => Effect<R, E, A>
60
+ ): Effect<R, E | Err, A> => {
61
+ if (canAccess(rsc, userId)) {
62
+ return ok(rsc)
63
+ }
64
+ return Effect.fail(bad(rsc, userId))
65
+ }
66
+ }
67
+
68
+ export function access_<T, UserId, Err>(
69
+ canAccess: (rsc: T, userId: UserId) => boolean,
70
+ bad: (rsc: T, userId: UserId) => Err
71
+ ) {
72
+ const auth = accessM_(canAccess, bad)
73
+ return <A>(rsc: T, userId: UserId, ok: (rsc: T) => A) => auth(rsc, userId, flow(ok, Effect.succeed))
74
+ }
75
+
76
+ export function accessM<T, UserId, Err>(
77
+ canAccess: (rsc: T, userId: UserId) => boolean,
78
+ bad: (rsc: T, userId: UserId) => Err
79
+ ) {
80
+ return <R, E, A>(userId: UserId, ok: (rsc: T) => Effect<R, E, A>) =>
81
+ (rsc: T): Effect<R, E | Err, A> => {
82
+ if (canAccess(rsc, userId)) {
83
+ return ok(rsc)
84
+ }
85
+ return Effect.fail(bad(rsc, userId))
86
+ }
87
+ }
88
+
89
+ export function access<T, UserId, Err>(
90
+ canAccess: (rsc: T, userId: UserId) => boolean,
91
+ bad: (rsc: T, userId: UserId) => Err
92
+ ) {
93
+ const auth = accessM(canAccess, bad)
94
+ return <A>(userId: UserId, ok: (rsc: T) => A) => auth(userId, flow(ok, Effect.succeed))
95
+ }
96
+
97
+ export function makeAuthorize<T, UserId>(
98
+ canAccess: (rsc: T, userId: UserId) => boolean,
99
+ type: string,
100
+ getId: (t: T) => string | number
101
+ ) {
102
+ return {
103
+ access_: access_(canAccess, () => new UnauthorizedError()),
104
+ access: access(canAccess, () => new UnauthorizedError()),
105
+ accessM_: accessM_(canAccess, () => new UnauthorizedError()),
106
+ accessM: accessM(canAccess, () => new UnauthorizedError()),
107
+
108
+ accessOrHide_: access_(
109
+ canAccess,
110
+ r => new NotFoundError(type, getId(r).toString())
111
+ ),
112
+ accessOrHide: access(
113
+ canAccess,
114
+ r => new NotFoundError(type, getId(r).toString())
115
+ ),
116
+ accessOrHideM_: accessM_(
117
+ canAccess,
118
+ r => new NotFoundError(type, getId(r).toString())
119
+ ),
120
+ accessOrHideM: accessM(
121
+ canAccess,
122
+ r => new NotFoundError(type, getId(r).toString())
123
+ )
124
+ }
125
+ }
@@ -1,5 +1,5 @@
1
1
  // import { configM, UserSVC } from "@/services.js"
2
- import * as Ex from "@effect-app/infra-adapters/express/index"
2
+ import * as Ex from "@effect-app/infra-adapters/express"
3
3
  import { expressjwt } from "express-jwt"
4
4
  import jwtAuthz from "express-jwt-authz"
5
5
  import jwksRsa from "jwks-rsa"
@@ -0,0 +1,27 @@
1
+ import * as MO from "@effect-app/schema"
2
+ import { Encoder, Parser } from "@effect-app/schema"
3
+ import type { ParserEnv } from "@effect-app/schema/custom/Parser"
4
+
5
+ export function makeCodec<
6
+ ParsedShape extends { id: Id },
7
+ ConstructorInput,
8
+ Encoded,
9
+ Api,
10
+ Id
11
+ >(self: MO.Schema<unknown, ParsedShape, ConstructorInput, Encoded, Api>) {
12
+ const parse = MO.condemnDie(Parser.for(self))
13
+ // TODO: strict
14
+ const decode = (e: Encoded, env?: ParserEnv) => parse(e, env)
15
+ const enc = Encoder.for(self)
16
+
17
+ const encode = (u: ParsedShape) => Effect(() => enc(u))
18
+ const encodeToMap = toMap(encode)
19
+ return [decode, encode, encodeToMap] as const
20
+ }
21
+
22
+ function toMap<E, A extends { id: Id }, Id>(encode: (a: A) => Effect<never, never, E>) {
23
+ return (a: ReadonlyArray<A>) =>
24
+ a.map(task => Effect.tuple(Effect(task.id as A["id"]), encode(task)))
25
+ .collectAll()
26
+ .map(_ => new Map(_))
27
+ }
@@ -0,0 +1,20 @@
1
+ export class NotFoundError {
2
+ public readonly _tag = "NotFoundError"
3
+ public readonly message: string
4
+ constructor(type: string, id: string) {
5
+ this.message = `Didn't find ${type}#${id}`
6
+ }
7
+ }
8
+
9
+ export class ValidationError {
10
+ public readonly _tag = "ValidationError"
11
+ constructor(public readonly errors: ReadonlyArray<unknown>) {}
12
+ }
13
+
14
+ export class NotLoggedInError {
15
+ public readonly _tag = "NotLoggedInError"
16
+ }
17
+
18
+ export class UnauthorizedError {
19
+ public readonly _tag = "UnauthorizedError"
20
+ }
@@ -0,0 +1,49 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+
3
+ import * as RS from "./schema/routing.js"
4
+
5
+ type Methods = "GET" | "PUT" | "POST" | "PATCH" | "DELETE"
6
+
7
+ const rx = /:(\w+)/g
8
+
9
+ type _A<C> = C extends Chunk<infer A> ? A : never
10
+
11
+ /**
12
+ * Work in progress JSONSchema generator.
13
+ */
14
+ export function makeJsonSchema(r: Iterable<RS.RouteDescriptorAny>) {
15
+ return Chunk.fromIterable(r)
16
+ .forEachEffect(RS.makeFromSchema)
17
+ .map(e => {
18
+ const map = ({ method, path, responses, ...rest }: _A<typeof e>) => ({
19
+ [method]: {
20
+ ...rest,
21
+ responses: (responses as Array<any>).reduce(
22
+ (prev, cur) => {
23
+ prev[cur.statusCode] = cur.type
24
+ return prev
25
+ },
26
+ {} as Record<Response["statusCode"], Response["type"]>
27
+ )
28
+ }
29
+ })
30
+ return e.reduce(
31
+ {} as Record<string, Record<Methods, ReturnType<typeof map>>>,
32
+ (prev, e) => {
33
+ const path = e.path.split("?")[0].replace(rx, (_a, b) => `{${b}}`)
34
+ prev[path] = {
35
+ ...prev[path],
36
+ ...map(e) as any
37
+ }
38
+ return prev
39
+ }
40
+ )
41
+ })
42
+ }
43
+
44
+ class Response {
45
+ constructor(
46
+ public readonly statusCode: number,
47
+ public readonly type: any // string | JSONSchema | SubSchema
48
+ ) {}
49
+ }
@@ -0,0 +1,60 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import type * as Plutus from "@effect-app/infra-adapters/Openapi/atlas-plutus"
3
+ import type { JSONSchema, SubSchema } from "@effect-app/infra-adapters/Openapi/atlas-plutus/JsonSchema/index"
4
+ import { References } from "@effect-app/infra-adapters/Openapi/atlas-plutus/Schema/index"
5
+ import { makeJsonSchema } from "./makeJsonSchema.js"
6
+ import type { RouteDescriptorAny } from "./schema/routing.js"
7
+
8
+ export function makeOpenApiSpecs(
9
+ rdescs: Iterable<RouteDescriptorAny>,
10
+ info: Plutus.Info
11
+ ) {
12
+ return Effect.gen(function*($) {
13
+ const ref = yield* $(Ref.make<Map<string, JSONSchema | SubSchema>>(new Map()))
14
+ const withRef = Effect.provideService(References)({ ref })
15
+ const paths = yield* $(pipe(makeJsonSchema(rdescs), withRef))
16
+ const refs = yield* $(ref.get)
17
+ const parameterRefs: Record<string, any> = {} // todos
18
+ const schemas: Record<string, any> = {}
19
+ const securitySchemes = {
20
+ bearerAuth: {
21
+ type: "http",
22
+ scheme: "bearer",
23
+ bearerFormat: "JWT"
24
+ }
25
+ } // { basicAuth: { type: "http", scheme: "basic" } }
26
+ const components = { securitySchemes, schemas, parameters: parameterRefs }
27
+
28
+ for (const entry of refs.entries()) {
29
+ // eslint-disable-next-line prefer-destructuring
30
+ schemas[entry[0]] = entry[1]
31
+ }
32
+
33
+ return {
34
+ openapi: "3.0.0",
35
+ info: {
36
+ title: info.title,
37
+ description: info.description,
38
+ termsOfService: info.tos,
39
+ contact: info.contact
40
+ ? {
41
+ name: info.contact.name,
42
+ email: info.contact.email,
43
+ url: info.contact.url
44
+ }
45
+ : undefined,
46
+ license: info.license
47
+ ? {
48
+ name: info.license.name,
49
+ url: info.license.url
50
+ }
51
+ : undefined,
52
+ version: info.version
53
+ },
54
+ tags: [],
55
+ paths,
56
+ components
57
+ // test,
58
+ }
59
+ })
60
+ }