@effect-app/infra 3.10.0 → 4.0.0-beta.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 (231) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/_check.sh +3 -0
  3. package/dist/CUPS.d.ts +22 -12
  4. package/dist/CUPS.d.ts.map +1 -1
  5. package/dist/CUPS.js +28 -29
  6. package/dist/Emailer/Sendgrid.js +13 -12
  7. package/dist/Emailer/service.d.ts +3 -13
  8. package/dist/Emailer/service.d.ts.map +1 -1
  9. package/dist/Emailer/service.js +3 -3
  10. package/dist/MainFiberSet.d.ts +18 -41
  11. package/dist/MainFiberSet.d.ts.map +1 -1
  12. package/dist/MainFiberSet.js +10 -10
  13. package/dist/Model/Repository/ext.d.ts.map +1 -1
  14. package/dist/Model/Repository/ext.js +13 -10
  15. package/dist/Model/Repository/internal/internal.d.ts +5 -5
  16. package/dist/Model/Repository/internal/internal.d.ts.map +1 -1
  17. package/dist/Model/Repository/internal/internal.js +52 -42
  18. package/dist/Model/Repository/legacy.d.ts +9 -9
  19. package/dist/Model/Repository/legacy.d.ts.map +1 -1
  20. package/dist/Model/Repository/makeRepo.d.ts +4 -4
  21. package/dist/Model/Repository/makeRepo.d.ts.map +1 -1
  22. package/dist/Model/Repository/makeRepo.js +1 -1
  23. package/dist/Model/Repository/service.d.ts +11 -11
  24. package/dist/Model/Repository/service.d.ts.map +1 -1
  25. package/dist/Model/Repository/validation.d.ts +17 -47
  26. package/dist/Model/Repository/validation.d.ts.map +1 -1
  27. package/dist/Model/Repository/validation.js +2 -2
  28. package/dist/Model/query/dsl.d.ts +22 -22
  29. package/dist/Model/query/dsl.d.ts.map +1 -1
  30. package/dist/Model/query/dsl.js +1 -1
  31. package/dist/Model/query/new-kid-interpreter.d.ts +1 -1
  32. package/dist/Model/query/new-kid-interpreter.js +7 -7
  33. package/dist/Operations.d.ts +22 -63
  34. package/dist/Operations.d.ts.map +1 -1
  35. package/dist/Operations.js +14 -14
  36. package/dist/OperationsRepo.d.ts +23 -7
  37. package/dist/OperationsRepo.d.ts.map +1 -1
  38. package/dist/OperationsRepo.js +4 -5
  39. package/dist/QueueMaker/SQLQueue.d.ts +6 -8
  40. package/dist/QueueMaker/SQLQueue.d.ts.map +1 -1
  41. package/dist/QueueMaker/SQLQueue.js +20 -24
  42. package/dist/QueueMaker/errors.js +1 -1
  43. package/dist/QueueMaker/memQueue.d.ts +2 -5
  44. package/dist/QueueMaker/memQueue.d.ts.map +1 -1
  45. package/dist/QueueMaker/memQueue.js +22 -26
  46. package/dist/QueueMaker/sbqueue.d.ts +2 -5
  47. package/dist/QueueMaker/sbqueue.d.ts.map +1 -1
  48. package/dist/QueueMaker/sbqueue.js +24 -28
  49. package/dist/RequestContext.d.ts +28 -41
  50. package/dist/RequestContext.d.ts.map +1 -1
  51. package/dist/RequestContext.js +4 -4
  52. package/dist/RequestFiberSet.d.ts +23 -50
  53. package/dist/RequestFiberSet.d.ts.map +1 -1
  54. package/dist/RequestFiberSet.js +14 -14
  55. package/dist/Store/ContextMapContainer.d.ts +4 -4
  56. package/dist/Store/ContextMapContainer.d.ts.map +1 -1
  57. package/dist/Store/ContextMapContainer.js +5 -5
  58. package/dist/Store/Cosmos.d.ts.map +1 -1
  59. package/dist/Store/Cosmos.js +21 -28
  60. package/dist/Store/Disk.d.ts.map +1 -1
  61. package/dist/Store/Disk.js +12 -16
  62. package/dist/Store/Memory.d.ts +2 -2
  63. package/dist/Store/Memory.d.ts.map +1 -1
  64. package/dist/Store/Memory.js +25 -33
  65. package/dist/Store/index.js +2 -2
  66. package/dist/Store/service.d.ts +9 -34
  67. package/dist/Store/service.d.ts.map +1 -1
  68. package/dist/Store/service.js +4 -4
  69. package/dist/Store/utils.d.ts.map +1 -1
  70. package/dist/Store/utils.js +10 -2
  71. package/dist/adapters/SQL/Model.d.ts +106 -162
  72. package/dist/adapters/SQL/Model.d.ts.map +1 -1
  73. package/dist/adapters/SQL/Model.js +92 -130
  74. package/dist/adapters/ServiceBus.d.ts +13 -44
  75. package/dist/adapters/ServiceBus.d.ts.map +1 -1
  76. package/dist/adapters/ServiceBus.js +13 -15
  77. package/dist/adapters/cosmos-client.d.ts +7 -3
  78. package/dist/adapters/cosmos-client.d.ts.map +1 -1
  79. package/dist/adapters/cosmos-client.js +5 -4
  80. package/dist/adapters/logger.d.ts +1 -1
  81. package/dist/adapters/logger.d.ts.map +1 -1
  82. package/dist/adapters/memQueue.d.ts +8 -21
  83. package/dist/adapters/memQueue.d.ts.map +1 -1
  84. package/dist/adapters/memQueue.js +4 -4
  85. package/dist/adapters/mongo-client.d.ts +6 -6
  86. package/dist/adapters/mongo-client.d.ts.map +1 -1
  87. package/dist/adapters/mongo-client.js +5 -4
  88. package/dist/adapters/redis-client.d.ts +14 -4
  89. package/dist/adapters/redis-client.d.ts.map +1 -1
  90. package/dist/adapters/redis-client.js +19 -18
  91. package/dist/api/ContextProvider.d.ts +10 -15
  92. package/dist/api/ContextProvider.d.ts.map +1 -1
  93. package/dist/api/ContextProvider.js +8 -8
  94. package/dist/api/codec.d.ts +1 -1
  95. package/dist/api/codec.d.ts.map +1 -1
  96. package/dist/api/codec.js +1 -1
  97. package/dist/api/internal/RequestContextMiddleware.d.ts +1 -1
  98. package/dist/api/internal/RequestContextMiddleware.d.ts.map +1 -1
  99. package/dist/api/internal/auth.d.ts +3 -3
  100. package/dist/api/internal/auth.d.ts.map +1 -1
  101. package/dist/api/internal/auth.js +8 -8
  102. package/dist/api/internal/events.d.ts +2 -2
  103. package/dist/api/internal/events.d.ts.map +1 -1
  104. package/dist/api/internal/events.js +9 -9
  105. package/dist/api/internal/health.d.ts +1 -1
  106. package/dist/api/internal/health.d.ts.map +1 -1
  107. package/dist/api/internal/health.js +2 -2
  108. package/dist/api/layerUtils.d.ts +14 -14
  109. package/dist/api/layerUtils.d.ts.map +1 -1
  110. package/dist/api/layerUtils.js +5 -5
  111. package/dist/api/middlewares.d.ts +0 -75
  112. package/dist/api/middlewares.d.ts.map +1 -1
  113. package/dist/api/middlewares.js +6 -51
  114. package/dist/api/reportError.js +4 -4
  115. package/dist/api/routing/middleware/RouterMiddleware.d.ts +4 -4
  116. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +1 -1
  117. package/dist/api/routing/middleware/middleware.d.ts +6 -7
  118. package/dist/api/routing/middleware/middleware.d.ts.map +1 -1
  119. package/dist/api/routing/middleware/middleware.js +9 -13
  120. package/dist/api/routing/schema/jwt.d.ts +1 -1
  121. package/dist/api/routing/schema/jwt.d.ts.map +1 -1
  122. package/dist/api/routing/schema/jwt.js +5 -4
  123. package/dist/api/routing/utils.d.ts +2 -2
  124. package/dist/api/routing/utils.d.ts.map +1 -1
  125. package/dist/api/routing/utils.js +10 -8
  126. package/dist/api/routing.d.ts +39 -37
  127. package/dist/api/routing.d.ts.map +1 -1
  128. package/dist/api/routing.js +17 -21
  129. package/dist/api/setupRequest.d.ts +4 -6
  130. package/dist/api/setupRequest.d.ts.map +1 -1
  131. package/dist/api/setupRequest.js +10 -9
  132. package/dist/arbs.d.ts +3 -3
  133. package/dist/arbs.d.ts.map +1 -1
  134. package/dist/arbs.js +2 -2
  135. package/dist/errorReporter.d.ts +1 -1
  136. package/dist/errorReporter.d.ts.map +1 -1
  137. package/dist/errorReporter.js +12 -12
  138. package/dist/fileUtil.d.ts +6 -6
  139. package/dist/fileUtil.d.ts.map +1 -1
  140. package/dist/logger/jsonLogger.d.ts.map +1 -1
  141. package/dist/logger/jsonLogger.js +19 -18
  142. package/dist/logger/logFmtLogger.d.ts.map +1 -1
  143. package/dist/logger/logFmtLogger.js +11 -13
  144. package/dist/logger/shared.d.ts +2 -2
  145. package/dist/logger/shared.d.ts.map +1 -1
  146. package/dist/logger/shared.js +7 -9
  147. package/dist/logger.d.ts +1 -1
  148. package/dist/logger.d.ts.map +1 -1
  149. package/dist/rateLimit.d.ts +2 -2
  150. package/dist/rateLimit.d.ts.map +1 -1
  151. package/dist/rateLimit.js +5 -5
  152. package/dist/test.d.ts +2 -2
  153. package/dist/test.d.ts.map +1 -1
  154. package/dist/test.js +6 -24
  155. package/package.json +19 -22
  156. package/src/CUPS.ts +15 -14
  157. package/src/Emailer/Sendgrid.ts +15 -13
  158. package/src/Emailer/service.ts +3 -3
  159. package/src/MainFiberSet.ts +16 -12
  160. package/src/Model/Repository/ext.ts +18 -16
  161. package/src/Model/Repository/internal/internal.ts +80 -69
  162. package/src/Model/Repository/legacy.ts +9 -9
  163. package/src/Model/Repository/makeRepo.ts +5 -5
  164. package/src/Model/Repository/service.ts +12 -12
  165. package/src/Model/Repository/validation.ts +1 -1
  166. package/src/Model/query/dsl.ts +13 -13
  167. package/src/Model/query/new-kid-interpreter.ts +8 -8
  168. package/src/Operations.ts +17 -14
  169. package/src/OperationsRepo.ts +3 -4
  170. package/src/QueueMaker/SQLQueue.ts +86 -89
  171. package/src/QueueMaker/errors.ts +1 -1
  172. package/src/QueueMaker/memQueue.ts +90 -91
  173. package/src/QueueMaker/sbqueue.ts +90 -92
  174. package/src/RequestContext.ts +3 -3
  175. package/src/RequestFiberSet.ts +17 -15
  176. package/src/Store/ContextMapContainer.ts +4 -4
  177. package/src/Store/Cosmos.ts +20 -27
  178. package/src/Store/Disk.ts +13 -17
  179. package/src/Store/Memory.ts +28 -34
  180. package/src/Store/index.ts +1 -1
  181. package/src/Store/service.ts +4 -4
  182. package/src/Store/utils.ts +9 -5
  183. package/src/adapters/SQL/Model.ts +255 -268
  184. package/src/adapters/ServiceBus.ts +17 -20
  185. package/src/adapters/cosmos-client.ts +5 -5
  186. package/src/adapters/memQueue.ts +3 -3
  187. package/src/adapters/mongo-client.ts +5 -5
  188. package/src/adapters/redis-client.ts +25 -19
  189. package/src/api/ContextProvider.ts +24 -34
  190. package/src/api/codec.ts +1 -1
  191. package/src/api/internal/auth.ts +11 -13
  192. package/src/api/internal/events.ts +11 -11
  193. package/src/api/internal/health.ts +1 -1
  194. package/src/api/layerUtils.ts +20 -20
  195. package/src/api/middlewares.ts +0 -97
  196. package/src/api/reportError.ts +3 -3
  197. package/src/api/routing/middleware/RouterMiddleware.ts +5 -6
  198. package/src/api/routing/middleware/middleware.ts +13 -25
  199. package/src/api/routing/schema/jwt.ts +9 -7
  200. package/src/api/routing/utils.ts +12 -10
  201. package/src/api/routing.ts +77 -79
  202. package/src/api/setupRequest.ts +9 -8
  203. package/src/arbs.ts +3 -3
  204. package/src/errorReporter.ts +12 -12
  205. package/src/logger/jsonLogger.ts +18 -17
  206. package/src/logger/logFmtLogger.ts +10 -12
  207. package/src/logger/shared.ts +6 -8
  208. package/src/rateLimit.ts +7 -7
  209. package/src/test.ts +7 -29
  210. package/test/contextProvider.test.ts +77 -70
  211. package/test/controller.test.ts +51 -39
  212. package/test/dist/contextProvider.test.d.ts.map +1 -1
  213. package/test/dist/controller.test.d.ts.map +1 -1
  214. package/test/dist/fixtures.d.ts +33 -81
  215. package/test/dist/fixtures.d.ts.map +1 -1
  216. package/test/dist/fixtures.js +9 -8
  217. package/test/dist/query.test.d.ts.map +1 -1
  218. package/test/dist/rawQuery.test.d.ts.map +1 -1
  219. package/test/dist/requires.test.d.ts.map +1 -1
  220. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
  221. package/test/fixtures.ts +9 -7
  222. package/test/query.test.ts +49 -41
  223. package/test/rawQuery.test.ts +44 -40
  224. package/test/requires.test.ts +40 -31
  225. package/test/rpc-multi-middleware.test.ts +13 -14
  226. package/test/validateSample.test.ts +2 -2
  227. package/tsconfig.json +1 -27
  228. package/dist/api/internal/middlewares.d.ts +0 -15
  229. package/dist/api/internal/middlewares.d.ts.map +0 -1
  230. package/dist/api/internal/middlewares.js +0 -168
  231. package/src/api/internal/middlewares.ts +0 -279
@@ -7,19 +7,22 @@
7
7
  /**
8
8
  * @since 1.0.0
9
9
  */
10
- import * as RRX from "@effect/experimental/RequestResolver"
11
- import * as VariantSchema from "@effect/experimental/VariantSchema"
12
- import { SqlClient } from "@effect/sql/SqlClient"
13
- import * as SqlResolver from "@effect/sql/SqlResolver"
14
- import * as SqlSchema from "@effect/sql/SqlSchema"
10
+ import * as VariantSchema from "effect/unstable/schema/VariantSchema"
11
+ import { SqlClient } from "effect/unstable/sql/SqlClient"
12
+ import * as SqlResolver from "effect/unstable/sql/SqlResolver"
13
+ import * as SqlSchema from "effect/unstable/sql/SqlSchema"
15
14
  import crypto from "crypto" // TODO
16
15
  import type { Brand } from "effect/Brand"
17
16
  import * as DateTime from "effect/DateTime"
18
- import type { DurationInput } from "effect/Duration"
17
+ import type { Input } from "effect/Duration"
19
18
  import * as Effect from "effect/Effect"
19
+ import { identity } from "effect/Function"
20
20
  import * as Option from "effect/Option"
21
- import * as ParseResult from "effect/ParseResult"
21
+ import * as Predicate from "effect/Predicate"
22
+ import * as RequestResolver from "effect/RequestResolver"
22
23
  import * as Schema from "effect/Schema"
24
+ import * as Getter from "effect/SchemaGetter"
25
+ import * as Transformation from "effect/SchemaTransformation"
23
26
  import type { Scope } from "effect/Scope"
24
27
 
25
28
  const {
@@ -30,8 +33,7 @@ const {
30
33
  Struct,
31
34
  Union,
32
35
  extract,
33
- fieldEvolve,
34
- fieldFromKey
36
+ fieldEvolve
35
37
  } = VariantSchema.make({
36
38
  variants: ["select", "insert", "update", "json", "jsonCreate", "jsonUpdate"],
37
39
  defaultVariant: "select"
@@ -41,26 +43,13 @@ const {
41
43
  * @since 1.0.0
42
44
  * @category models
43
45
  */
44
- export type Any = Schema.Schema.Any & {
45
- readonly fields: Schema.Struct.Fields
46
- readonly insert: Schema.Schema.Any
47
- readonly update: Schema.Schema.Any
48
- readonly json: Schema.Schema.Any
49
- readonly jsonCreate: Schema.Schema.Any
50
- readonly jsonUpdate: Schema.Schema.Any
51
- }
52
-
53
- /**
54
- * @since 1.0.0
55
- * @category models
56
- */
57
- export type AnyNoContext = Schema.Schema.AnyNoContext & {
46
+ export type Any = Schema.Top & {
58
47
  readonly fields: Schema.Struct.Fields
59
- readonly insert: Schema.Schema.AnyNoContext
60
- readonly update: Schema.Schema.AnyNoContext
61
- readonly json: Schema.Schema.AnyNoContext
62
- readonly jsonCreate: Schema.Schema.AnyNoContext
63
- readonly jsonUpdate: Schema.Schema.AnyNoContext
48
+ readonly insert: Schema.Top
49
+ readonly update: Schema.Top
50
+ readonly json: Schema.Top
51
+ readonly jsonCreate: Schema.Top
52
+ readonly jsonUpdate: Schema.Top
64
53
  }
65
54
 
66
55
  /**
@@ -84,14 +73,14 @@ export {
84
73
  * @since 1.0.0
85
74
  * @category constructors
86
75
  * @example
87
- * import { Schema } from "effect/Schema"
88
- * import { Model } from "@effect/sql"
76
+ * import { Schema } from "effect"
77
+ * import { Model } from "effect/unstable/schema"
89
78
  *
90
79
  * export const GroupId = Schema.Number.pipe(Schema.brand("GroupId"))
91
80
  *
92
81
  * export class Group extends Model.Class<Group>("Group")({
93
82
  * id: Model.Generated(GroupId),
94
- * name: Schema.NonEmptyTrimmedString,
83
+ * name: Schema.String,
95
84
  * createdAt: Model.DateTimeInsertFromDate,
96
85
  * updatedAt: Model.DateTimeUpdateFromDate
97
86
  * }) {}
@@ -138,11 +127,6 @@ export {
138
127
  * @category fields
139
128
  */
140
129
  FieldExcept,
141
- /**
142
- * @since 1.0.0
143
- * @category fields
144
- */
145
- fieldFromKey,
146
130
  /**
147
131
  * @since 1.0.0
148
132
  * @category fields
@@ -164,7 +148,8 @@ export {
164
148
  * @since 1.0.0
165
149
  * @category fields
166
150
  */
167
- export const fields: <A extends VariantSchema.Struct<any>>(self: A) => A[VariantSchema.TypeId] = VariantSchema.fields
151
+ export const fields: <A extends VariantSchema.Struct<any>>(self: A) => A[typeof VariantSchema.TypeId] =
152
+ VariantSchema.fields
168
153
 
169
154
  /**
170
155
  * @since 1.0.0
@@ -176,7 +161,7 @@ export const Override: <A>(value: A) => A & Brand<"Override"> = VariantSchema.Ov
176
161
  * @since 1.0.0
177
162
  * @category generated
178
163
  */
179
- export interface Generated<S extends Schema.Schema.All | Schema.PropertySignature.All> extends
164
+ export interface Generated<S extends Schema.Top> extends
180
165
  VariantSchema.Field<{
181
166
  readonly select: S
182
167
  readonly update: S
@@ -192,7 +177,7 @@ export interface Generated<S extends Schema.Schema.All | Schema.PropertySignatur
192
177
  * @since 1.0.0
193
178
  * @category generated
194
179
  */
195
- export const Generated = <S extends Schema.Schema.All | Schema.PropertySignature.All>(
180
+ export const Generated = <S extends Schema.Top>(
196
181
  schema: S
197
182
  ): Generated<S> =>
198
183
  Field({
@@ -205,7 +190,7 @@ export const Generated = <S extends Schema.Schema.All | Schema.PropertySignature
205
190
  * @since 1.0.0
206
191
  * @category generated
207
192
  */
208
- export interface GeneratedByApp<S extends Schema.Schema.All | Schema.PropertySignature.All>
193
+ export interface GeneratedByApp<S extends Schema.Top>
209
194
  extends
210
195
  VariantSchema.Field<{
211
196
  readonly select: S
@@ -223,7 +208,7 @@ export interface GeneratedByApp<S extends Schema.Schema.All | Schema.PropertySig
223
208
  * @since 1.0.0
224
209
  * @category generated
225
210
  */
226
- export const GeneratedByApp = <S extends Schema.Schema.All | Schema.PropertySignature.All>(
211
+ export const GeneratedByApp = <S extends Schema.Top>(
227
212
  schema: S
228
213
  ): GeneratedByApp<S> =>
229
214
  Field({
@@ -237,7 +222,7 @@ export const GeneratedByApp = <S extends Schema.Schema.All | Schema.PropertySign
237
222
  * @since 1.0.0
238
223
  * @category sensitive
239
224
  */
240
- export interface Sensitive<S extends Schema.Schema.All | Schema.PropertySignature.All> extends
225
+ export interface Sensitive<S extends Schema.Top> extends
241
226
  VariantSchema.Field<{
242
227
  readonly select: S
243
228
  readonly insert: S
@@ -252,7 +237,7 @@ export interface Sensitive<S extends Schema.Schema.All | Schema.PropertySignatur
252
237
  * @since 1.0.0
253
238
  * @category sensitive
254
239
  */
255
- export const Sensitive = <S extends Schema.Schema.All | Schema.PropertySignature.All>(
240
+ export const Sensitive = <S extends Schema.Top>(
256
241
  schema: S
257
242
  ): Sensitive<S> =>
258
243
  Field({
@@ -261,6 +246,29 @@ export const Sensitive = <S extends Schema.Schema.All | Schema.PropertySignature
261
246
  update: schema
262
247
  })
263
248
 
249
+ /**
250
+ * @since 1.0.0
251
+ * @category optional
252
+ */
253
+ export interface optionalOption<S extends Schema.Top>
254
+ extends Schema.decodeTo<Schema.Option<Schema.toType<S>>, Schema.optionalKey<Schema.NullOr<S>>>
255
+ {}
256
+
257
+ /**
258
+ * @since 1.0.0
259
+ * @category optional
260
+ */
261
+ export const optionalOption = <S extends Schema.Top>(schema: S): optionalOption<S> =>
262
+ Schema.optionalKey(Schema.NullOr(schema)).pipe(
263
+ Schema.decodeTo(
264
+ Schema.Option(Schema.toType(schema)),
265
+ Transformation.transformOptional<Option.Option<S["Type"]>, S["Type"] | null>({
266
+ decode: (oe) => oe.pipe(Option.filter(Predicate.isNotNull), Option.some),
267
+ encode: Option.flatten
268
+ }) as any
269
+ )
270
+ )
271
+
264
272
  /**
265
273
  * Convert a field to one that is optional for all variants.
266
274
  *
@@ -270,14 +278,14 @@ export const Sensitive = <S extends Schema.Schema.All | Schema.PropertySignature
270
278
  * @since 1.0.0
271
279
  * @category optional
272
280
  */
273
- export interface FieldOption<S extends Schema.Schema.Any> extends
281
+ export interface FieldOption<S extends Schema.Top> extends
274
282
  VariantSchema.Field<{
275
283
  readonly select: Schema.OptionFromNullOr<S>
276
284
  readonly insert: Schema.OptionFromNullOr<S>
277
285
  readonly update: Schema.OptionFromNullOr<S>
278
- readonly json: Schema.optionalWith<S, { as: "Option" }>
279
- readonly jsonCreate: Schema.optionalWith<S, { as: "Option"; nullable: true }>
280
- readonly jsonUpdate: Schema.optionalWith<S, { as: "Option"; nullable: true }>
286
+ readonly json: optionalOption<S>
287
+ readonly jsonCreate: optionalOption<S>
288
+ readonly jsonUpdate: optionalOption<S>
281
289
  }>
282
290
  {}
283
291
 
@@ -290,14 +298,14 @@ export interface FieldOption<S extends Schema.Schema.Any> extends
290
298
  * @since 1.0.0
291
299
  * @category optional
292
300
  */
293
- export const FieldOption: <Field extends VariantSchema.Field<any> | Schema.Schema.Any>(
301
+ export const FieldOption: <Field extends VariantSchema.Field<any> | Schema.Top>(
294
302
  self: Field
295
- ) => Field extends Schema.Schema.Any ? FieldOption<Field>
303
+ ) => Field extends Schema.Top ? FieldOption<Field>
296
304
  : Field extends VariantSchema.Field<infer S> ? VariantSchema.Field<
297
305
  {
298
- readonly [K in keyof S]: S[K] extends Schema.Schema.Any
306
+ readonly [K in keyof S]: S[K] extends Schema.Top
299
307
  ? K extends VariantsDatabase ? Schema.OptionFromNullOr<S[K]>
300
- : Schema.optionalWith<S[K], { as: "Option"; nullable: true }>
308
+ : optionalOption<S[K]>
301
309
  : never
302
310
  }
303
311
  >
@@ -305,40 +313,16 @@ export const FieldOption: <Field extends VariantSchema.Field<any> | Schema.Schem
305
313
  select: Schema.OptionFromNullOr,
306
314
  insert: Schema.OptionFromNullOr,
307
315
  update: Schema.OptionFromNullOr,
308
- json: Schema.optionalWith({ as: "Option" }),
309
- jsonCreate: Schema.optionalWith({ as: "Option", nullable: true }),
310
- jsonUpdate: Schema.optionalWith({ as: "Option", nullable: true })
316
+ json: optionalOption,
317
+ jsonCreate: optionalOption,
318
+ jsonUpdate: optionalOption
311
319
  }) as any
312
320
 
313
321
  /**
314
322
  * @since 1.0.0
315
323
  * @category date & time
316
324
  */
317
- export interface DateTimeFromDate extends
318
- Schema.transform<
319
- typeof Schema.ValidDateFromSelf,
320
- typeof Schema.DateTimeUtcFromSelf
321
- >
322
- {}
323
-
324
- /**
325
- * @since 1.0.0
326
- * @category date & time
327
- */
328
- export const DateTimeFromDate: DateTimeFromDate = Schema.transform(
329
- Schema.ValidDateFromSelf,
330
- Schema.DateTimeUtcFromSelf,
331
- {
332
- decode: DateTime.unsafeFromDate,
333
- encode: DateTime.toDateUtc
334
- }
335
- )
336
-
337
- /**
338
- * @since 1.0.0
339
- * @category date & time
340
- */
341
- export interface Date extends Schema.transformOrFail<typeof Schema.String, typeof Schema.DateTimeUtcFromSelf> {}
325
+ export interface Date extends Schema.decodeTo<Schema.instanceOf<DateTime.Utc>, Schema.String> {}
342
326
 
343
327
  /**
344
328
  * A schema for a `DateTime.Utc` that is serialized as a date string in the
@@ -347,64 +331,43 @@ export interface Date extends Schema.transformOrFail<typeof Schema.String, typeo
347
331
  * @since 1.0.0
348
332
  * @category date & time
349
333
  */
350
- export const Date: Date = Schema.transformOrFail(
351
- Schema.String,
352
- Schema.DateTimeUtcFromSelf,
353
- {
354
- decode: (s, _, ast) =>
355
- DateTime.make(s).pipe(
356
- Option.map(DateTime.removeTime),
357
- Option.match({
358
- onNone: () => ParseResult.fail(new ParseResult.Type(ast, s)),
359
- onSome: (dt) => ParseResult.succeed(dt)
360
- })
361
- ),
362
- encode: (dt) => ParseResult.succeed(DateTime.formatIsoDate(dt))
363
- }
334
+ export const Date: Date = Schema.String.pipe(
335
+ Schema.decodeTo(Schema.DateTimeUtc, {
336
+ decode: Getter.dateTimeUtcFromInput().map(DateTime.removeTime),
337
+ encode: Getter.transform(DateTime.formatIsoDate)
338
+ })
364
339
  )
365
340
 
366
341
  /**
367
342
  * @since 1.0.0
368
343
  * @category date & time
369
344
  */
370
- export const DateWithNow = VariantSchema.Overrideable(Date, Schema.DateTimeUtcFromSelf, {
371
- generate: Option.match({
372
- onNone: () => Effect.map(DateTime.now, DateTime.removeTime),
373
- onSome: (dt) => Effect.succeed(DateTime.removeTime(dt))
374
- })
345
+ export const DateWithNow = VariantSchema.Overrideable(Date, {
346
+ defaultValue: Effect.map(DateTime.now, DateTime.removeTime)
375
347
  })
376
348
 
377
349
  /**
378
350
  * @since 1.0.0
379
351
  * @category date & time
380
352
  */
381
- export const DateTimeWithNow = VariantSchema.Overrideable(Schema.String, Schema.DateTimeUtcFromSelf, {
382
- generate: Option.match({
383
- onNone: () => Effect.map(DateTime.now, DateTime.formatIso),
384
- onSome: (dt) => Effect.succeed(DateTime.formatIso(dt))
385
- })
353
+ export const DateTimeWithNow = VariantSchema.Overrideable(Schema.DateTimeUtcFromString, {
354
+ defaultValue: DateTime.now
386
355
  })
387
356
 
388
357
  /**
389
358
  * @since 1.0.0
390
359
  * @category date & time
391
360
  */
392
- export const DateTimeFromDateWithNow = VariantSchema.Overrideable(Schema.DateFromSelf, Schema.DateTimeUtcFromSelf, {
393
- generate: Option.match({
394
- onNone: () => Effect.map(DateTime.now, DateTime.toDateUtc),
395
- onSome: (dt) => Effect.succeed(DateTime.toDateUtc(dt))
396
- })
361
+ export const DateTimeFromDateWithNow = VariantSchema.Overrideable(Schema.DateTimeUtcFromDate, {
362
+ defaultValue: DateTime.now
397
363
  })
398
364
 
399
365
  /**
400
366
  * @since 1.0.0
401
367
  * @category date & time
402
368
  */
403
- export const DateTimeFromNumberWithNow = VariantSchema.Overrideable(Schema.Number, Schema.DateTimeUtcFromSelf, {
404
- generate: Option.match({
405
- onNone: () => Effect.map(DateTime.now, DateTime.toEpochMillis),
406
- onSome: (dt) => Effect.succeed(DateTime.toEpochMillis(dt))
407
- })
369
+ export const DateTimeFromNumberWithNow = VariantSchema.Overrideable(Schema.DateTimeUtcFromMillis, {
370
+ defaultValue: DateTime.now
408
371
  })
409
372
 
410
373
  /**
@@ -413,9 +376,9 @@ export const DateTimeFromNumberWithNow = VariantSchema.Overrideable(Schema.Numbe
413
376
  */
414
377
  export interface DateTimeInsert extends
415
378
  VariantSchema.Field<{
416
- readonly select: typeof Schema.DateTimeUtc
417
- readonly insert: VariantSchema.Overrideable<DateTime.Utc, string>
418
- readonly json: typeof Schema.DateTimeUtc
379
+ readonly select: Schema.DateTimeUtcFromString
380
+ readonly insert: VariantSchema.Overrideable<Schema.DateTimeUtcFromString>
381
+ readonly json: Schema.DateTimeUtcFromString
419
382
  }>
420
383
  {}
421
384
 
@@ -429,9 +392,9 @@ export interface DateTimeInsert extends
429
392
  * @category date & time
430
393
  */
431
394
  export const DateTimeInsert: DateTimeInsert = Field({
432
- select: Schema.DateTimeUtc,
395
+ select: Schema.DateTimeUtcFromString,
433
396
  insert: DateTimeWithNow,
434
- json: Schema.DateTimeUtc
397
+ json: Schema.DateTimeUtcFromString
435
398
  })
436
399
 
437
400
  /**
@@ -440,9 +403,9 @@ export const DateTimeInsert: DateTimeInsert = Field({
440
403
  */
441
404
  export interface DateTimeInsertFromDate extends
442
405
  VariantSchema.Field<{
443
- readonly select: DateTimeFromDate
444
- readonly insert: VariantSchema.Overrideable<DateTime.Utc, globalThis.Date>
445
- readonly json: typeof Schema.DateTimeUtc
406
+ readonly select: Schema.DateTimeUtcFromDate
407
+ readonly insert: VariantSchema.Overrideable<Schema.DateTimeUtcFromDate>
408
+ readonly json: Schema.DateTimeUtcFromString
446
409
  }>
447
410
  {}
448
411
 
@@ -456,9 +419,9 @@ export interface DateTimeInsertFromDate extends
456
419
  * @category date & time
457
420
  */
458
421
  export const DateTimeInsertFromDate: DateTimeInsertFromDate = Field({
459
- select: DateTimeFromDate,
422
+ select: Schema.DateTimeUtcFromDate,
460
423
  insert: DateTimeFromDateWithNow,
461
- json: Schema.DateTimeUtc
424
+ json: Schema.DateTimeUtcFromString
462
425
  })
463
426
 
464
427
  /**
@@ -467,9 +430,9 @@ export const DateTimeInsertFromDate: DateTimeInsertFromDate = Field({
467
430
  */
468
431
  export interface DateTimeInsertFromNumber extends
469
432
  VariantSchema.Field<{
470
- readonly select: typeof Schema.DateTimeUtcFromNumber
471
- readonly insert: VariantSchema.Overrideable<DateTime.Utc, number>
472
- readonly json: typeof Schema.DateTimeUtcFromNumber
433
+ readonly select: Schema.DateTimeUtcFromMillis
434
+ readonly insert: VariantSchema.Overrideable<Schema.DateTimeUtcFromMillis>
435
+ readonly json: Schema.DateTimeUtcFromMillis
473
436
  }>
474
437
  {}
475
438
 
@@ -483,9 +446,9 @@ export interface DateTimeInsertFromNumber extends
483
446
  * @category date & time
484
447
  */
485
448
  export const DateTimeInsertFromNumber: DateTimeInsertFromNumber = Field({
486
- select: Schema.DateTimeUtcFromNumber,
449
+ select: Schema.DateTimeUtcFromMillis,
487
450
  insert: DateTimeFromNumberWithNow,
488
- json: Schema.DateTimeUtcFromNumber
451
+ json: Schema.DateTimeUtcFromMillis
489
452
  })
490
453
 
491
454
  /**
@@ -494,10 +457,10 @@ export const DateTimeInsertFromNumber: DateTimeInsertFromNumber = Field({
494
457
  */
495
458
  export interface DateTimeUpdate extends
496
459
  VariantSchema.Field<{
497
- readonly select: typeof Schema.DateTimeUtc
498
- readonly insert: VariantSchema.Overrideable<DateTime.Utc, string>
499
- readonly update: VariantSchema.Overrideable<DateTime.Utc, string>
500
- readonly json: typeof Schema.DateTimeUtc
460
+ readonly select: Schema.DateTimeUtcFromString
461
+ readonly insert: VariantSchema.Overrideable<Schema.DateTimeUtcFromString>
462
+ readonly update: VariantSchema.Overrideable<Schema.DateTimeUtcFromString>
463
+ readonly json: Schema.DateTimeUtcFromString
501
464
  }>
502
465
  {}
503
466
 
@@ -512,10 +475,10 @@ export interface DateTimeUpdate extends
512
475
  * @category date & time
513
476
  */
514
477
  export const DateTimeUpdate: DateTimeUpdate = Field({
515
- select: Schema.DateTimeUtc,
478
+ select: Schema.DateTimeUtcFromString,
516
479
  insert: DateTimeWithNow,
517
480
  update: DateTimeWithNow,
518
- json: Schema.DateTimeUtc
481
+ json: Schema.DateTimeUtcFromString
519
482
  })
520
483
 
521
484
  /**
@@ -524,10 +487,10 @@ export const DateTimeUpdate: DateTimeUpdate = Field({
524
487
  */
525
488
  export interface DateTimeUpdateFromDate extends
526
489
  VariantSchema.Field<{
527
- readonly select: DateTimeFromDate
528
- readonly insert: VariantSchema.Overrideable<DateTime.Utc, globalThis.Date>
529
- readonly update: VariantSchema.Overrideable<DateTime.Utc, globalThis.Date>
530
- readonly json: typeof Schema.DateTimeUtc
490
+ readonly select: Schema.DateTimeUtcFromDate
491
+ readonly insert: VariantSchema.Overrideable<Schema.DateTimeUtcFromDate>
492
+ readonly update: VariantSchema.Overrideable<Schema.DateTimeUtcFromDate>
493
+ readonly json: Schema.DateTimeUtcFromString
531
494
  }>
532
495
  {}
533
496
 
@@ -542,10 +505,10 @@ export interface DateTimeUpdateFromDate extends
542
505
  * @category date & time
543
506
  */
544
507
  export const DateTimeUpdateFromDate: DateTimeUpdateFromDate = Field({
545
- select: DateTimeFromDate,
508
+ select: Schema.DateTimeUtcFromDate,
546
509
  insert: DateTimeFromDateWithNow,
547
510
  update: DateTimeFromDateWithNow,
548
- json: Schema.DateTimeUtc
511
+ json: Schema.DateTimeUtcFromString
549
512
  })
550
513
 
551
514
  /**
@@ -554,10 +517,10 @@ export const DateTimeUpdateFromDate: DateTimeUpdateFromDate = Field({
554
517
  */
555
518
  export interface DateTimeUpdateFromNumber extends
556
519
  VariantSchema.Field<{
557
- readonly select: typeof Schema.DateTimeUtcFromNumber
558
- readonly insert: VariantSchema.Overrideable<DateTime.Utc, number>
559
- readonly update: VariantSchema.Overrideable<DateTime.Utc, number>
560
- readonly json: typeof Schema.DateTimeUtcFromNumber
520
+ readonly select: Schema.DateTimeUtcFromMillis
521
+ readonly insert: VariantSchema.Overrideable<Schema.DateTimeUtcFromMillis>
522
+ readonly update: VariantSchema.Overrideable<Schema.DateTimeUtcFromMillis>
523
+ readonly json: Schema.DateTimeUtcFromMillis
561
524
  }>
562
525
  {}
563
526
 
@@ -572,22 +535,22 @@ export interface DateTimeUpdateFromNumber extends
572
535
  * @category date & time
573
536
  */
574
537
  export const DateTimeUpdateFromNumber: DateTimeUpdateFromNumber = Field({
575
- select: Schema.DateTimeUtcFromNumber,
538
+ select: Schema.DateTimeUtcFromMillis,
576
539
  insert: DateTimeFromNumberWithNow,
577
540
  update: DateTimeFromNumberWithNow,
578
- json: Schema.DateTimeUtcFromNumber
541
+ json: Schema.DateTimeUtcFromMillis
579
542
  })
580
543
 
581
544
  /**
582
545
  * @since 1.0.0
583
546
  * @category json
584
547
  */
585
- export interface JsonFromString<S extends Schema.Schema.All | Schema.PropertySignature.All>
548
+ export interface JsonFromString<S extends Schema.Top>
586
549
  extends
587
550
  VariantSchema.Field<{
588
- readonly select: Schema.Schema<Schema.Schema.Type<S>, string, Schema.Schema.Context<S>>
589
- readonly insert: Schema.Schema<Schema.Schema.Type<S>, string, Schema.Schema.Context<S>>
590
- readonly update: Schema.Schema<Schema.Schema.Type<S>, string, Schema.Schema.Context<S>>
551
+ readonly select: Schema.fromJsonString<S>
552
+ readonly insert: Schema.fromJsonString<S>
553
+ readonly update: Schema.fromJsonString<S>
591
554
  readonly json: S
592
555
  readonly jsonCreate: S
593
556
  readonly jsonUpdate: S
@@ -602,10 +565,10 @@ export interface JsonFromString<S extends Schema.Schema.All | Schema.PropertySig
602
565
  * @since 1.0.0
603
566
  * @category json
604
567
  */
605
- export const JsonFromString = <S extends Schema.Schema.All | Schema.PropertySignature.All>(
568
+ export const JsonFromString = <S extends Schema.Top>(
606
569
  schema: S
607
570
  ): JsonFromString<S> => {
608
- const parsed = Schema.parseJson(schema as any)
571
+ const parsed = Schema.fromJsonString(schema)
609
572
  return Field({
610
573
  select: parsed,
611
574
  insert: parsed,
@@ -613,7 +576,7 @@ export const JsonFromString = <S extends Schema.Schema.All | Schema.PropertySign
613
576
  json: schema,
614
577
  jsonCreate: schema,
615
578
  jsonUpdate: schema
616
- }) as any
579
+ })
617
580
  }
618
581
 
619
582
  /**
@@ -634,80 +597,79 @@ export const makeRepository = <
634
597
  {
635
598
  readonly insert: (
636
599
  insert: S["insert"]["Type"]
637
- ) => Effect.Effect<S["Type"], never, S["Context"] | S["insert"]["Context"]>
600
+ ) => Effect.Effect<S["Type"], Schema.SchemaError, S["DecodingServices"] | S["insert"]["EncodingServices"]>
638
601
  readonly insertVoid: (
639
602
  insert: S["insert"]["Type"]
640
- ) => Effect.Effect<void, never, S["Context"] | S["insert"]["Context"]>
603
+ ) => Effect.Effect<void, Schema.SchemaError, S["insert"]["EncodingServices"]>
641
604
  readonly update: (
642
605
  update: S["update"]["Type"]
643
- ) => Effect.Effect<S["Type"], never, S["Context"] | S["update"]["Context"]>
606
+ ) => Effect.Effect<S["Type"], Schema.SchemaError, S["DecodingServices"] | S["update"]["EncodingServices"]>
644
607
  readonly updateVoid: (
645
608
  update: S["update"]["Type"]
646
- ) => Effect.Effect<void, never, S["Context"] | S["update"]["Context"]>
609
+ ) => Effect.Effect<void, Schema.SchemaError, S["update"]["EncodingServices"]>
647
610
  readonly findById: (
648
- id: Schema.Schema.Type<S["fields"][Id]>
649
- ) => Effect.Effect<Option.Option<S["Type"]>, never, S["Context"] | Schema.Schema.Context<S["fields"][Id]>>
611
+ id: S["fields"][Id]["Type"]
612
+ ) => Effect.Effect<
613
+ Option.Option<S["Type"]>,
614
+ Schema.SchemaError,
615
+ S["DecodingServices"] | S["fields"][Id]["EncodingServices"]
616
+ >
650
617
  readonly delete: (
651
- id: Schema.Schema.Type<S["fields"][Id]>
652
- ) => Effect.Effect<void, never, Schema.Schema.Context<S["fields"][Id]>>
618
+ id: S["fields"][Id]["Type"]
619
+ ) => Effect.Effect<void, Schema.SchemaError, S["fields"][Id]["EncodingServices"]>
653
620
  },
654
621
  never,
655
622
  SqlClient
656
623
  > =>
657
624
  Effect.gen(function*() {
658
625
  const sql = yield* SqlClient
659
- const idSchema = Model.fields[options.idColumn] as Schema.Schema.Any
626
+ const idSchema = Model.fields[options.idColumn] as Schema.Top
660
627
  const idColumn = options.idColumn as string
661
628
  const versionColumn = options.versionColumn
662
629
 
663
- // TODO: insert version automatically...
664
- // I guess we should hide the versionColumn and insert it in the schema instead
665
- const insertSchema = SqlSchema.single({
630
+ const insertSchema = SqlSchema.findOne({
666
631
  Request: Model.insert,
667
632
  Result: Model,
668
633
  execute: (request) =>
669
634
  sql.onDialectOrElse({
670
635
  mysql: () =>
671
- sql`insert into ${sql(options.tableName)} ${sql.insert(request)};
636
+ sql`insert into ${sql(options.tableName)} ${sql.insert(request as any)};
672
637
  select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID();`
673
638
  .unprepared
674
639
  .pipe(
675
640
  Effect.map(([, results]) => results as any)
676
641
  ),
677
- orElse: () => sql`insert into ${sql(options.tableName)} ${sql.insert(request).returning("*")}`
642
+ orElse: () => sql`insert into ${sql(options.tableName)} ${sql.insert(request as any).returning("*")}`
678
643
  })
679
644
  })
680
645
  const insert = (
681
646
  insert: S["insert"]["Type"]
682
- ): Effect.Effect<S["Type"], never, S["Context"] | S["insert"]["Context"]> =>
647
+ ): Effect.Effect<S["Type"], Schema.SchemaError, S["DecodingServices"] | S["insert"]["EncodingServices"]> =>
683
648
  insertSchema(insert).pipe(
684
- Effect.orDie,
685
- Effect.withSpan(`${options.spanPrefix}.insert`, {
686
- captureStackTrace: false,
687
- attributes: { insert }
649
+ Effect.catchTag("NoSuchElementError", Effect.die),
650
+ Effect.withSpan(`${options.spanPrefix}.insert`, {}, {
651
+ captureStackTrace: false
688
652
  })
689
653
  ) as any
690
654
 
691
655
  const insertVoidSchema = SqlSchema.void({
692
656
  Request: Model.insert,
693
- execute: (request) => sql`insert into ${sql(options.tableName)} ${sql.insert(request)}`
657
+ execute: (request) => sql`insert into ${sql(options.tableName)} ${sql.insert(request as any)}`
694
658
  })
695
659
  const insertVoid = (
696
660
  insert: S["insert"]["Type"]
697
- ): Effect.Effect<void, never, S["Context"] | S["insert"]["Context"]> =>
661
+ ): Effect.Effect<void, Schema.SchemaError, S["insert"]["EncodingServices"]> =>
698
662
  insertVoidSchema(insert).pipe(
699
- Effect.orDie,
700
- Effect.withSpan(`${options.spanPrefix}.insertVoid`, {
701
- captureStackTrace: false,
702
- attributes: { insert }
663
+ Effect.withSpan(`${options.spanPrefix}.insertVoid`, {}, {
664
+ captureStackTrace: false
703
665
  })
704
666
  ) as any
705
667
 
706
- const updateSchema = SqlSchema.single({
668
+ const updateSchema = SqlSchema.findOne({
707
669
  Request: Model.update,
708
670
  Result: Model,
709
671
  execute: versionColumn
710
- ? (request) =>
672
+ ? (request: any) =>
711
673
  sql.onDialectOrElse({
712
674
  mysql: () =>
713
675
  sql`update ${sql(options.tableName)} set ${
@@ -725,7 +687,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
725
687
  request[versionColumn]
726
688
  } returning *`
727
689
  })
728
- : (request) =>
690
+ : (request: any) =>
729
691
  sql.onDialectOrElse({
730
692
  mysql: () =>
731
693
  sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${sql(idColumn)} = ${
@@ -744,66 +706,69 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
744
706
  })
745
707
  const update = (
746
708
  update: S["update"]["Type"]
747
- ): Effect.Effect<S["Type"], never, S["Context"] | S["update"]["Context"]> =>
709
+ ): Effect.Effect<S["Type"], Schema.SchemaError, S["DecodingServices"] | S["update"]["EncodingServices"]> =>
748
710
  updateSchema(update).pipe(
749
- Effect.orDie,
711
+ Effect.catchTag("NoSuchElementError", Effect.die),
750
712
  Effect.withSpan(`${options.spanPrefix}.update`, {
751
- captureStackTrace: false,
752
- attributes: { update }
713
+ attributes: { id: (update as any)[idColumn] }
714
+ }, {
715
+ captureStackTrace: false
753
716
  })
754
717
  ) as any
755
718
 
756
719
  const updateVoidSchema = SqlSchema.void({
757
720
  Request: Model.update,
758
721
  execute: versionColumn
759
- ? (request) =>
722
+ ? (request: any) =>
760
723
  sql`update ${sql(options.tableName)} set ${
761
724
  sql.update({ ...request, [versionColumn]: crypto.randomUUID() }, [idColumn])
762
725
  } where ${sql(idColumn)} = ${request[idColumn]} and ${sql(versionColumn)} = ${request[versionColumn]}`
763
- : (request) =>
726
+ : (request: any) =>
764
727
  sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${sql(idColumn)} = ${
765
728
  request[idColumn]
766
729
  }`
767
730
  })
768
731
  const updateVoid = (
769
732
  update: S["update"]["Type"]
770
- ): Effect.Effect<void, never, S["Context"] | S["update"]["Context"]> =>
733
+ ): Effect.Effect<void, Schema.SchemaError, S["update"]["EncodingServices"]> =>
771
734
  updateVoidSchema(update).pipe(
772
- Effect.orDie,
773
735
  Effect.withSpan(`${options.spanPrefix}.updateVoid`, {
774
- captureStackTrace: false,
775
- attributes: { update }
736
+ attributes: { id: (update as any)[idColumn] }
737
+ }, {
738
+ captureStackTrace: false
776
739
  })
777
740
  ) as any
778
741
 
779
- const findByIdSchema = SqlSchema.findOne({
742
+ const findByIdSchema = SqlSchema.findOneOption({
780
743
  Request: idSchema,
781
744
  Result: Model,
782
- execute: (id) => sql`select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${id}`
745
+ execute: (id: any) => sql`select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${id}`
783
746
  })
784
747
  const findById = (
785
- id: Schema.Schema.Type<S["fields"][Id]>
786
- ): Effect.Effect<Option.Option<S["Type"]>, never, S["Context"] | Schema.Schema.Context<S["fields"][Id]>> =>
748
+ id: S["fields"][Id]["Type"]
749
+ ): Effect.Effect<
750
+ Option.Option<S["Type"]>,
751
+ Schema.SchemaError,
752
+ S["DecodingServices"] | S["fields"][Id]["EncodingServices"]
753
+ > =>
787
754
  findByIdSchema(id).pipe(
788
- Effect.orDie,
789
- Effect.withSpan(`${options.spanPrefix}.findById`, {
790
- captureStackTrace: false,
791
- attributes: { id }
755
+ Effect.withSpan(`${options.spanPrefix}.findById`, { attributes: { id } }, {
756
+ captureStackTrace: false
792
757
  })
793
758
  ) as any
794
759
 
795
760
  const deleteSchema = SqlSchema.void({
796
761
  Request: idSchema,
797
- execute: (id) => sql`delete from ${sql(options.tableName)} where ${sql(idColumn)} = ${id}`
762
+ execute: (id: any) => sql`delete from ${sql(options.tableName)} where ${sql(idColumn)} = ${id}`
798
763
  })
799
764
  const delete_ = (
800
- id: Schema.Schema.Type<S["fields"][Id]>
801
- ): Effect.Effect<void, never, Schema.Schema.Context<S["fields"][Id]>> =>
765
+ id: S["fields"][Id]["Type"]
766
+ ): Effect.Effect<void, Schema.SchemaError, S["fields"][Id]["EncodingServices"]> =>
802
767
  deleteSchema(id).pipe(
803
- Effect.orDie,
804
768
  Effect.withSpan(`${options.spanPrefix}.delete`, {
805
- captureStackTrace: false,
806
769
  attributes: { id }
770
+ }, {
771
+ captureStackTrace: false
807
772
  })
808
773
  ) as any
809
774
 
@@ -817,7 +782,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
817
782
  * @category repository
818
783
  */
819
784
  export const makeDataLoaders = <
820
- S extends AnyNoContext,
785
+ S extends Any,
821
786
  Id extends (keyof S["Type"]) & (keyof S["update"]["Type"]) & (keyof S["fields"])
822
787
  >(
823
788
  Model: S,
@@ -825,113 +790,135 @@ export const makeDataLoaders = <
825
790
  readonly tableName: string
826
791
  readonly spanPrefix: string
827
792
  readonly idColumn: Id
828
- readonly window: DurationInput
793
+ readonly window: Input
829
794
  readonly maxBatchSize?: number | undefined
830
795
  }
831
796
  ): Effect.Effect<
832
797
  {
833
- readonly insert: (insert: S["insert"]["Type"]) => Effect.Effect<S["Type"]>
834
- readonly insertVoid: (insert: S["insert"]["Type"]) => Effect.Effect<void>
835
- readonly findById: (id: Schema.Schema.Type<S["fields"][Id]>) => Effect.Effect<Option.Option<S["Type"]>>
836
- readonly delete: (id: Schema.Schema.Type<S["fields"][Id]>) => Effect.Effect<void>
798
+ readonly insert: (
799
+ insert: S["insert"]["Type"]
800
+ ) => Effect.Effect<
801
+ S["Type"],
802
+ Schema.SchemaError,
803
+ S["DecodingServices"] | S["insert"]["EncodingServices"]
804
+ >
805
+ readonly insertVoid: (
806
+ insert: S["insert"]["Type"]
807
+ ) => Effect.Effect<void, Schema.SchemaError, S["insert"]["EncodingServices"]>
808
+ readonly findById: (
809
+ id: S["fields"][Id]["Type"]
810
+ ) => Effect.Effect<
811
+ S["Type"],
812
+ Schema.SchemaError,
813
+ S["DecodingServices"] | S["fields"][Id]["EncodingServices"]
814
+ >
815
+ readonly delete: (
816
+ id: S["fields"][Id]["Type"]
817
+ ) => Effect.Effect<void, Schema.SchemaError, S["fields"][Id]["EncodingServices"]>
837
818
  },
838
819
  never,
839
820
  SqlClient | Scope
840
821
  > =>
841
822
  Effect.gen(function*() {
842
823
  const sql = yield* SqlClient
843
- const idSchema = Model.fields[options.idColumn] as Schema.Schema.Any
824
+ const idSchema = Model.fields[options.idColumn] as Schema.Top
844
825
  const idColumn = options.idColumn as string
826
+ const setMaxBatchSize = options.maxBatchSize ? RequestResolver.batchN(options.maxBatchSize) : identity
845
827
 
846
- const insertResolver = yield* SqlResolver.ordered(`${options.spanPrefix}/insert`, {
828
+ const insertResolver = SqlResolver.ordered({
847
829
  Request: Model.insert,
848
830
  Result: Model,
849
- execute: (request) =>
831
+ execute: (request: any) =>
850
832
  sql.onDialectOrElse({
851
833
  mysql: () =>
852
- Effect.forEach(request, (request) =>
834
+ Effect.forEach(request, (request: any) =>
853
835
  sql`insert into ${sql(options.tableName)} ${sql.insert(request)};
854
836
  select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID();`
855
837
  .unprepared
856
838
  .pipe(
857
- Effect.map(([, results]) => results as any)
839
+ Effect.map(([, results]) => results![0] as any)
858
840
  ), { concurrency: 10 }),
859
841
  orElse: () => sql`insert into ${sql(options.tableName)} ${sql.insert(request).returning("*")}`
860
842
  })
861
- })
862
- const insertLoader = yield* RRX.dataLoader(insertResolver, {
863
- window: options.window,
864
- maxBatchSize: options.maxBatchSize!
865
- })
866
- const insertExecute = insertResolver.makeExecute(insertLoader)
843
+ }).pipe(
844
+ RequestResolver.setDelay(options.window),
845
+ setMaxBatchSize,
846
+ RequestResolver.withSpan(`${options.spanPrefix}.insertResolver`)
847
+ )
848
+ const insertExecute = SqlResolver.request(insertResolver)
867
849
  const insert = (
868
850
  insert: S["insert"]["Type"]
869
- ): Effect.Effect<S["Type"], never, S["Context"] | S["insert"]["Context"]> =>
851
+ ): Effect.Effect<
852
+ S["Type"],
853
+ Schema.SchemaError,
854
+ S["DecodingServices"] | S["insert"]["EncodingServices"]
855
+ > =>
870
856
  insertExecute(insert).pipe(
871
- Effect.orDie,
872
- Effect.withSpan(`${options.spanPrefix}.insert`, {
873
- captureStackTrace: false,
874
- attributes: { insert }
857
+ Effect.catchTag("ResultLengthMismatch", Effect.die),
858
+ Effect.withSpan(`${options.spanPrefix}.insert`, {}, {
859
+ captureStackTrace: false
875
860
  })
876
- )
861
+ ) as any
877
862
 
878
- const insertVoidResolver = yield* SqlResolver.void(`${options.spanPrefix}/insertVoid`, {
863
+ const insertVoidResolver = SqlResolver.void({
879
864
  Request: Model.insert,
880
- execute: (request) => sql`insert into ${sql(options.tableName)} ${sql.insert(request)}`
881
- })
882
- const insertVoidLoader = yield* RRX.dataLoader(insertVoidResolver, {
883
- window: options.window,
884
- maxBatchSize: options.maxBatchSize!
885
- })
886
- const insertVoidExecute = insertVoidResolver.makeExecute(insertVoidLoader)
865
+ execute: (request: any) => sql`insert into ${sql(options.tableName)} ${sql.insert(request)}`
866
+ }).pipe(
867
+ RequestResolver.setDelay(options.window),
868
+ setMaxBatchSize,
869
+ RequestResolver.withSpan(`${options.spanPrefix}.insertVoidResolver`)
870
+ )
871
+ const insertVoidExecute = SqlResolver.request(insertVoidResolver)
887
872
  const insertVoid = (
888
873
  insert: S["insert"]["Type"]
889
- ): Effect.Effect<void, never, S["Context"] | S["insert"]["Context"]> =>
874
+ ): Effect.Effect<void, Schema.SchemaError, S["insert"]["EncodingServices"]> =>
890
875
  insertVoidExecute(insert).pipe(
891
- Effect.orDie,
892
- Effect.withSpan(`${options.spanPrefix}.insertVoid`, {
893
- captureStackTrace: false,
894
- attributes: { insert }
876
+ Effect.withSpan(`${options.spanPrefix}.insertVoid`, {}, {
877
+ captureStackTrace: false
895
878
  })
896
- )
879
+ ) as any
897
880
 
898
- const findByIdResolver = yield* SqlResolver.findById(`${options.spanPrefix}/findById`, {
881
+ const findByIdResolver = SqlResolver.findById({
899
882
  Id: idSchema,
900
883
  Result: Model,
901
- ResultId(request) {
884
+ ResultId(request: any) {
902
885
  return request[idColumn]
903
886
  },
904
- execute: (ids) => sql`select * from ${sql(options.tableName)} where ${sql.in(idColumn, ids)}`
905
- })
906
- const findByIdLoader = yield* RRX.dataLoader(findByIdResolver, {
907
- window: options.window,
908
- maxBatchSize: options.maxBatchSize!
909
- })
910
- const findByIdExecute = findByIdResolver.makeExecute(findByIdLoader)
911
- const findById = (id: Schema.Schema.Type<S["fields"][Id]>): Effect.Effect<Option.Option<S["Type"]>> =>
887
+ execute: (ids: any) => sql`select * from ${sql(options.tableName)} where ${sql.in(idColumn, ids)}`
888
+ }).pipe(
889
+ RequestResolver.setDelay(options.window),
890
+ setMaxBatchSize,
891
+ RequestResolver.withSpan(`${options.spanPrefix}.findByIdResolver`)
892
+ )
893
+ const findByIdExecute = SqlResolver.request(findByIdResolver)
894
+ const findById = (
895
+ id: S["fields"][Id]["Type"]
896
+ ): Effect.Effect<
897
+ S["Type"],
898
+ Schema.SchemaError,
899
+ S["DecodingServices"] | S["fields"][Id]["EncodingServices"]
900
+ > =>
912
901
  findByIdExecute(id).pipe(
913
- Effect.orDie,
914
- Effect.withSpan(`${options.spanPrefix}.findById`, {
915
- captureStackTrace: false,
916
- attributes: { id }
902
+ Effect.withSpan(`${options.spanPrefix}.findById`, { attributes: { id } }, {
903
+ captureStackTrace: false
917
904
  })
918
905
  ) as any
919
906
 
920
- const deleteResolver = yield* SqlResolver.void(`${options.spanPrefix}/delete`, {
907
+ const deleteResolver = SqlResolver.void({
921
908
  Request: idSchema,
922
- execute: (ids) => sql`delete from ${sql(options.tableName)} where ${sql.in(idColumn, ids)}`
923
- })
924
- const deleteLoader = yield* RRX.dataLoader(deleteResolver, {
925
- window: options.window,
926
- maxBatchSize: options.maxBatchSize!
927
- })
928
- const deleteExecute = deleteResolver.makeExecute(deleteLoader)
929
- const delete_ = (id: Schema.Schema.Type<S["fields"][Id]>): Effect.Effect<void> =>
909
+ execute: (ids: any) => sql`delete from ${sql(options.tableName)} where ${sql.in(idColumn, ids)}`
910
+ }).pipe(
911
+ RequestResolver.setDelay(options.window),
912
+ setMaxBatchSize,
913
+ RequestResolver.withSpan(`${options.spanPrefix}.deleteResolver`)
914
+ )
915
+ const deleteExecute = SqlResolver.request(deleteResolver)
916
+ const delete_ = (
917
+ id: S["fields"][Id]["Type"]
918
+ ): Effect.Effect<void, Schema.SchemaError, S["fields"][Id]["EncodingServices"]> =>
930
919
  deleteExecute(id).pipe(
931
- Effect.orDie,
932
- Effect.withSpan(`${options.spanPrefix}.delete`, {
933
- captureStackTrace: false,
934
- attributes: { id }
920
+ Effect.withSpan(`${options.spanPrefix}.delete`, { attributes: { id } }, {
921
+ captureStackTrace: false
935
922
  })
936
923
  ) as any
937
924