effect 4.0.0-beta.63 → 4.0.0-beta.64

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.
@@ -17,10 +17,11 @@ import * as SqlResolver from "./SqlResolver.ts";
17
17
  * @since 4.0.0
18
18
  * @category repository
19
19
  */
20
- export declare const makeRepository: <S extends Model.Any, Id extends (keyof S["Type"]) & (keyof S["update"]["Type"]) & (keyof S["fields"])>(Model: S, options: {
20
+ export declare const makeRepository: <S extends Model.Any, Id extends (keyof S["Type"]) & (keyof S["update"]["Type"]) & (keyof S["fields"]), SoftDelete extends keyof S["fields"] = never>(Model: S, options: {
21
21
  readonly tableName: string;
22
22
  readonly spanPrefix: string;
23
23
  readonly idColumn: Id;
24
+ readonly softDeleteColumn?: SoftDelete | undefined;
24
25
  }) => Effect.Effect<{
25
26
  readonly insert: (insert: S["insert"]["Type"]) => Effect.Effect<S["Type"], Schema.SchemaError | SqlError, S["DecodingServices"] | S["insert"]["EncodingServices"]>;
26
27
  readonly insertVoid: (insert: S["insert"]["Type"]) => Effect.Effect<void, Schema.SchemaError | SqlError, S["insert"]["EncodingServices"]>;
@@ -35,10 +36,11 @@ export declare const makeRepository: <S extends Model.Any, Id extends (keyof S["
35
36
  * @since 4.0.0
36
37
  * @category repository
37
38
  */
38
- export declare const makeResolvers: <S extends Model.Any, Id extends (keyof S["Type"]) & (keyof S["update"]["Type"]) & (keyof S["fields"])>(Model: S, options: {
39
+ export declare const makeResolvers: <S extends Model.Any, Id extends (keyof S["Type"]) & (keyof S["update"]["Type"]) & (keyof S["fields"]), SoftDelete extends keyof S["fields"] = never>(Model: S, options: {
39
40
  readonly tableName: string;
40
41
  readonly spanPrefix: string;
41
42
  readonly idColumn: Id;
43
+ readonly softDeleteColumn?: SoftDelete | undefined;
42
44
  }) => Effect.Effect<{
43
45
  readonly insert: RequestResolver.RequestResolver<SqlResolver.SqlRequest<S["insert"]["Type"], S["Type"], ResultLengthMismatch | SqlError, S["insert"]["EncodingServices"]>>;
44
46
  readonly insertVoid: RequestResolver.RequestResolver<SqlResolver.SqlRequest<S["insert"]["Type"], void, SqlError, S["insert"]["EncodingServices"]>>;
@@ -1 +1 @@
1
- {"version":3,"file":"SqlModel.d.ts","sourceRoot":"","sources":["../../../src/unstable/sql/SqlModel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SqlModel.d.ts","sourceRoot":"","sources":["../../../src/unstable/sql/SqlModel.ts"],"names":[],"mappings":"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"}
@@ -13,12 +13,15 @@ export const makeRepository = (Model, options) => Effect.gen(function* () {
13
13
  const sql = yield* SqlClient;
14
14
  const idSchema = Model.fields[options.idColumn];
15
15
  const idColumn = options.idColumn;
16
+ const softDeleteColumn = options.softDeleteColumn;
17
+ const withSoftDeleteFilter = where => softDeleteColumn === undefined ? where : sql.and([where, sql`${sql(softDeleteColumn)} is null`]);
18
+ const setSoftDeleted = softDeleteColumn === undefined ? undefined : sql`${sql(softDeleteColumn)} = CURRENT_TIMESTAMP`;
16
19
  const insertSchema = SqlSchema.findOne({
17
20
  Request: Model.insert,
18
21
  Result: Model,
19
22
  execute: request => sql.onDialectOrElse({
20
23
  mysql: () => sql`insert into ${sql(options.tableName)} ${sql.insert(request)};
21
- select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID();`.unprepared.pipe(Effect.map(([, results]) => results)),
24
+ select * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = LAST_INSERT_ID()`)};`.unprepared.pipe(Effect.map(([, results]) => results)),
22
25
  orElse: () => sql`insert into ${sql(options.tableName)} ${sql.insert(request).returning("*")}`
23
26
  })
24
27
  });
@@ -36,9 +39,9 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
36
39
  Request: Model.update,
37
40
  Result: Model,
38
41
  execute: request => sql.onDialectOrElse({
39
- mysql: () => sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${sql(idColumn)} = ${request[idColumn]};
40
- select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idColumn]};`.unprepared.pipe(Effect.map(([, results]) => results)),
41
- orElse: () => sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${sql(idColumn)} = ${request[idColumn]} returning *`
42
+ mysql: () => sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${request[idColumn]}`)};
43
+ select * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${request[idColumn]}`)};`.unprepared.pipe(Effect.map(([, results]) => results)),
44
+ orElse: () => sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${request[idColumn]}`)} returning *`
42
45
  })
43
46
  });
44
47
  const update = update => updateSchema(update).pipe(Effect.catchTag("NoSuchElementError", Effect.die), Effect.withSpan(`${options.spanPrefix}.update`, {
@@ -50,7 +53,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
50
53
  }));
51
54
  const updateVoidSchema = SqlSchema.void({
52
55
  Request: Model.update,
53
- execute: request => sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${sql(idColumn)} = ${request[idColumn]}`
56
+ execute: request => sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${request[idColumn]}`)}`
54
57
  });
55
58
  const updateVoid = update => updateVoidSchema(update).pipe(Effect.withSpan(`${options.spanPrefix}.updateVoid`, {
56
59
  attributes: {
@@ -62,7 +65,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
62
65
  const findByIdSchema = SqlSchema.findOne({
63
66
  Request: idSchema,
64
67
  Result: Model,
65
- execute: id => sql`select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${id}`
68
+ execute: id => sql`select * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${id}`)}`
66
69
  });
67
70
  const findById = id => findByIdSchema(id).pipe(Effect.withSpan(`${options.spanPrefix}.findById`, {
68
71
  attributes: {
@@ -73,7 +76,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
73
76
  }));
74
77
  const deleteSchema = SqlSchema.void({
75
78
  Request: idSchema,
76
- execute: id => sql`delete from ${sql(options.tableName)} where ${sql(idColumn)} = ${id}`
79
+ execute: id => softDeleteColumn === undefined ? sql`delete from ${sql(options.tableName)} where ${sql(idColumn)} = ${id}` : sql`update ${sql(options.tableName)} set ${setSoftDeleted} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${id}`)}`
77
80
  });
78
81
  const delete_ = id => deleteSchema(id).pipe(Effect.withSpan(`${options.spanPrefix}.delete`, {
79
82
  attributes: {
@@ -101,12 +104,15 @@ export const makeResolvers = (Model, options) => Effect.gen(function* () {
101
104
  const sql = yield* SqlClient;
102
105
  const idSchema = Model.fields[options.idColumn];
103
106
  const idColumn = options.idColumn;
107
+ const softDeleteColumn = options.softDeleteColumn;
108
+ const withSoftDeleteFilter = where => softDeleteColumn === undefined ? where : sql.and([where, sql`${sql(softDeleteColumn)} is null`]);
109
+ const setSoftDeleted = softDeleteColumn === undefined ? undefined : sql`${sql(softDeleteColumn)} = CURRENT_TIMESTAMP`;
104
110
  const insert = SqlResolver.ordered({
105
111
  Request: Model.insert,
106
112
  Result: Model,
107
113
  execute: request => sql.onDialectOrElse({
108
114
  mysql: () => Effect.forEach(request, request => sql`insert into ${sql(options.tableName)} ${sql.insert(request)};
109
- select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID();`.unprepared.pipe(Effect.map(([, results]) => results[0])), {
115
+ select * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = LAST_INSERT_ID()`)};`.unprepared.pipe(Effect.map(([, results]) => results[0])), {
110
116
  concurrency: 10
111
117
  }),
112
118
  orElse: () => sql`insert into ${sql(options.tableName)} ${sql.insert(request).returning("*")}`
@@ -122,11 +128,11 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
122
128
  ResultId(request) {
123
129
  return request[idColumn];
124
130
  },
125
- execute: ids => sql`select * from ${sql(options.tableName)} where ${sql.in(idColumn, ids)}`
131
+ execute: ids => sql`select * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql.in(idColumn, ids))}`
126
132
  }).pipe(RequestResolver.withSpan(`${options.spanPrefix}.findByIdResolver`));
127
133
  const delete_ = SqlResolver.void({
128
134
  Request: idSchema,
129
- execute: ids => sql`delete from ${sql(options.tableName)} where ${sql.in(idColumn, ids)}`
135
+ execute: ids => softDeleteColumn === undefined ? sql`delete from ${sql(options.tableName)} where ${sql.in(idColumn, ids)}` : sql`update ${sql(options.tableName)} set ${setSoftDeleted} where ${withSoftDeleteFilter(sql.in(idColumn, ids))}`
130
136
  }).pipe(RequestResolver.withSpan(`${options.spanPrefix}.deleteResolver`));
131
137
  return {
132
138
  insert,
@@ -1 +1 @@
1
- {"version":3,"file":"SqlModel.js","names":["Effect","RequestResolver","SqlClient","SqlResolver","SqlSchema","makeRepository","Model","options","gen","sql","idSchema","fields","idColumn","insertSchema","findOne","Request","insert","Result","execute","request","onDialectOrElse","mysql","tableName","unprepared","pipe","map","results","orElse","returning","catchTag","die","withSpan","spanPrefix","captureStackTrace","insertVoidSchema","void","insertVoid","updateSchema","update","attributes","id","updateVoidSchema","updateVoid","findByIdSchema","findById","deleteSchema","delete_","delete","makeResolvers","ordered","forEach","concurrency","Id","ResultId","ids","in"],"sources":["../../../src/unstable/sql/SqlModel.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"SqlModel.js","names":["Effect","RequestResolver","SqlClient","SqlResolver","SqlSchema","makeRepository","Model","options","gen","sql","idSchema","fields","idColumn","softDeleteColumn","withSoftDeleteFilter","where","undefined","and","setSoftDeleted","insertSchema","findOne","Request","insert","Result","execute","request","onDialectOrElse","mysql","tableName","unprepared","pipe","map","results","orElse","returning","catchTag","die","withSpan","spanPrefix","captureStackTrace","insertVoidSchema","void","insertVoid","updateSchema","update","attributes","id","updateVoidSchema","updateVoid","findByIdSchema","findById","deleteSchema","delete_","delete","makeResolvers","ordered","forEach","concurrency","Id","ResultId","ids","in"],"sources":["../../../src/unstable/sql/SqlModel.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "effect",
3
3
  "type": "module",
4
- "version": "4.0.0-beta.63",
4
+ "version": "4.0.0-beta.64",
5
5
  "license": "MIT",
6
6
  "description": "The missing standard library for TypeScript, for writing production-grade software.",
7
7
  "homepage": "https://effect.website",
@@ -21,11 +21,13 @@ import * as SqlSchema from "./SqlSchema.ts"
21
21
  */
22
22
  export const makeRepository = <
23
23
  S extends Model.Any,
24
- Id extends (keyof S["Type"]) & (keyof S["update"]["Type"]) & (keyof S["fields"])
24
+ Id extends (keyof S["Type"]) & (keyof S["update"]["Type"]) & (keyof S["fields"]),
25
+ SoftDelete extends keyof S["fields"] = never
25
26
  >(Model: S, options: {
26
27
  readonly tableName: string
27
28
  readonly spanPrefix: string
28
29
  readonly idColumn: Id
30
+ readonly softDeleteColumn?: SoftDelete | undefined
29
31
  }): Effect.Effect<
30
32
  {
31
33
  readonly insert: (
@@ -66,6 +68,12 @@ export const makeRepository = <
66
68
  const sql = yield* SqlClient
67
69
  const idSchema = Model.fields[options.idColumn] as Schema.Top
68
70
  const idColumn = options.idColumn as string
71
+ const softDeleteColumn = options.softDeleteColumn as string | undefined
72
+ const withSoftDeleteFilter = (where: any) =>
73
+ softDeleteColumn === undefined ? where : sql.and([where, sql`${sql(softDeleteColumn)} is null`])
74
+ const setSoftDeleted = softDeleteColumn === undefined
75
+ ? undefined
76
+ : sql`${sql(softDeleteColumn)} = CURRENT_TIMESTAMP`
69
77
 
70
78
  const insertSchema = SqlSchema.findOne({
71
79
  Request: Model.insert,
@@ -74,9 +82,10 @@ export const makeRepository = <
74
82
  sql.onDialectOrElse({
75
83
  mysql: () =>
76
84
  sql`insert into ${sql(options.tableName)} ${sql.insert(request as any)};
77
- select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID();`.unprepared.pipe(
78
- Effect.map(([, results]) => results as any)
79
- ),
85
+ select * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = LAST_INSERT_ID()`)};`
86
+ .unprepared.pipe(
87
+ Effect.map(([, results]) => results as any)
88
+ ),
80
89
  orElse: () => sql`insert into ${sql(options.tableName)} ${sql.insert(request as any).returning("*")}`
81
90
  })
82
91
  })
@@ -111,15 +120,16 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
111
120
  execute: (request: any) =>
112
121
  sql.onDialectOrElse({
113
122
  mysql: () =>
114
- sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${sql(idColumn)} = ${
115
- request[idColumn]
123
+ sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${
124
+ withSoftDeleteFilter(sql`${sql(idColumn)} = ${request[idColumn]}`)
116
125
  };
117
- select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idColumn]};`.unprepared.pipe(
118
- Effect.map(([, results]) => results as any)
119
- ),
126
+ select * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${request[idColumn]}`)};`
127
+ .unprepared.pipe(
128
+ Effect.map(([, results]) => results as any)
129
+ ),
120
130
  orElse: () =>
121
- sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${sql(idColumn)} = ${
122
- request[idColumn]
131
+ sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${
132
+ withSoftDeleteFilter(sql`${sql(idColumn)} = ${request[idColumn]}`)
123
133
  } returning *`
124
134
  })
125
135
  })
@@ -142,8 +152,8 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
142
152
  const updateVoidSchema = SqlSchema.void({
143
153
  Request: Model.update,
144
154
  execute: (request: any) =>
145
- sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${sql(idColumn)} = ${
146
- request[idColumn]
155
+ sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${
156
+ withSoftDeleteFilter(sql`${sql(idColumn)} = ${request[idColumn]}`)
147
157
  }`
148
158
  })
149
159
  const updateVoid = (
@@ -160,7 +170,8 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
160
170
  const findByIdSchema = SqlSchema.findOne({
161
171
  Request: idSchema,
162
172
  Result: Model,
163
- execute: (id: any) => sql`select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${id}`
173
+ execute: (id: any) =>
174
+ sql`select * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${id}`)}`
164
175
  })
165
176
  const findById = (
166
177
  id: S["fields"][Id]["Type"]
@@ -177,7 +188,12 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
177
188
 
178
189
  const deleteSchema = SqlSchema.void({
179
190
  Request: idSchema,
180
- execute: (id: any) => sql`delete from ${sql(options.tableName)} where ${sql(idColumn)} = ${id}`
191
+ execute: (id: any) =>
192
+ softDeleteColumn === undefined
193
+ ? sql`delete from ${sql(options.tableName)} where ${sql(idColumn)} = ${id}`
194
+ : sql`update ${sql(options.tableName)} set ${setSoftDeleted} where ${
195
+ withSoftDeleteFilter(sql`${sql(idColumn)} = ${id}`)
196
+ }`
181
197
  })
182
198
  const delete_ = (
183
199
  id: S["fields"][Id]["Type"]
@@ -201,13 +217,15 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
201
217
  */
202
218
  export const makeResolvers = <
203
219
  S extends Model.Any,
204
- Id extends (keyof S["Type"]) & (keyof S["update"]["Type"]) & (keyof S["fields"])
220
+ Id extends (keyof S["Type"]) & (keyof S["update"]["Type"]) & (keyof S["fields"]),
221
+ SoftDelete extends keyof S["fields"] = never
205
222
  >(
206
223
  Model: S,
207
224
  options: {
208
225
  readonly tableName: string
209
226
  readonly spanPrefix: string
210
227
  readonly idColumn: Id
228
+ readonly softDeleteColumn?: SoftDelete | undefined
211
229
  }
212
230
  ): Effect.Effect<
213
231
  {
@@ -246,6 +264,12 @@ export const makeResolvers = <
246
264
  const sql = yield* SqlClient
247
265
  const idSchema = Model.fields[options.idColumn] as Schema.Top
248
266
  const idColumn = options.idColumn as string
267
+ const softDeleteColumn = options.softDeleteColumn as string | undefined
268
+ const withSoftDeleteFilter = (where: any) =>
269
+ softDeleteColumn === undefined ? where : sql.and([where, sql`${sql(softDeleteColumn)} is null`])
270
+ const setSoftDeleted = softDeleteColumn === undefined
271
+ ? undefined
272
+ : sql`${sql(softDeleteColumn)} = CURRENT_TIMESTAMP`
249
273
 
250
274
  const insert: RequestResolver.RequestResolver<
251
275
  SqlResolver.SqlRequest<
@@ -262,9 +286,10 @@ export const makeResolvers = <
262
286
  mysql: () =>
263
287
  Effect.forEach(request, (request: any) =>
264
288
  sql`insert into ${sql(options.tableName)} ${sql.insert(request)};
265
- select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID();`.unprepared.pipe(
266
- Effect.map(([, results]) => results[0] as any)
267
- ), { concurrency: 10 }),
289
+ select * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = LAST_INSERT_ID()`)};`
290
+ .unprepared.pipe(
291
+ Effect.map(([, results]) => results[0] as any)
292
+ ), { concurrency: 10 }),
268
293
  orElse: () => sql`insert into ${sql(options.tableName)} ${sql.insert(request).returning("*")}`
269
294
  })
270
295
  }).pipe(
@@ -293,7 +318,8 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
293
318
  ResultId(request: any) {
294
319
  return request[idColumn]
295
320
  },
296
- execute: (ids: any) => sql`select * from ${sql(options.tableName)} where ${sql.in(idColumn, ids)}`
321
+ execute: (ids: any) =>
322
+ sql`select * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql.in(idColumn, ids))}`
297
323
  }).pipe(
298
324
  RequestResolver.withSpan(`${options.spanPrefix}.findByIdResolver`)
299
325
  )
@@ -307,7 +333,12 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
307
333
  >
308
334
  > = SqlResolver.void({
309
335
  Request: idSchema,
310
- execute: (ids: any) => sql`delete from ${sql(options.tableName)} where ${sql.in(idColumn, ids)}`
336
+ execute: (ids: any) =>
337
+ softDeleteColumn === undefined
338
+ ? sql`delete from ${sql(options.tableName)} where ${sql.in(idColumn, ids)}`
339
+ : sql`update ${sql(options.tableName)} set ${setSoftDeleted} where ${
340
+ withSoftDeleteFilter(sql.in(idColumn, ids))
341
+ }`
311
342
  }).pipe(
312
343
  RequestResolver.withSpan(`${options.spanPrefix}.deleteResolver`)
313
344
  )