@shivaedev/sql 0.22.0 → 0.24.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.
- package/CHANGELOG.md +21 -0
- package/README.md +60 -24
- package/dist/ChangeDeclarations.d.ts +5 -0
- package/dist/ChangeDeclarations.d.ts.map +1 -0
- package/dist/ChangeDeclarations.js +3 -0
- package/dist/ChangeDeclarations.js.map +1 -0
- package/dist/batchWrites.d.ts +1 -1
- package/dist/batchWrites.d.ts.map +1 -1
- package/dist/batchWrites.js +6 -3
- package/dist/batchWrites.js.map +1 -1
- package/dist/compositeRepository.d.ts +2 -2
- package/dist/compositeRepository.d.ts.map +1 -1
- package/dist/compositeRepository.js +1 -8
- package/dist/compositeRepository.js.map +1 -1
- package/dist/conditionalUpsert.d.ts +11 -4
- package/dist/conditionalUpsert.d.ts.map +1 -1
- package/dist/conditionalUpsert.js +7 -3
- package/dist/conditionalUpsert.js.map +1 -1
- package/dist/conflictWrites.d.ts +14 -1
- package/dist/conflictWrites.d.ts.map +1 -1
- package/dist/conflictWrites.js +5 -3
- package/dist/conflictWrites.js.map +1 -1
- package/dist/insertFromSelect.js +1 -1
- package/dist/insertFromSelect.js.map +1 -1
- package/dist/mapSqlError.d.ts +6 -0
- package/dist/mapSqlError.d.ts.map +1 -0
- package/dist/mapSqlError.js +22 -0
- package/dist/mapSqlError.js.map +1 -0
- package/dist/repository.js +1 -1
- package/dist/repository.js.map +1 -1
- package/dist/repositoryChanges.d.ts +4 -3
- package/dist/repositoryChanges.d.ts.map +1 -1
- package/dist/repositoryChanges.js +46 -13
- package/dist/repositoryChanges.js.map +1 -1
- package/dist/repositoryWrites.d.ts.map +1 -1
- package/dist/repositoryWrites.js +5 -5
- package/dist/repositoryWrites.js.map +1 -1
- package/dist/testing.d.ts +15 -1
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +50 -4
- package/dist/testing.js.map +1 -1
- package/dist/upsertResult.d.ts +13 -0
- package/dist/upsertResult.d.ts.map +1 -0
- package/dist/upsertResult.js +9 -0
- package/dist/upsertResult.js.map +1 -0
- package/dist/versionedRepository.js +6 -6
- package/dist/versionedRepository.js.map +1 -1
- package/dist/versionedStatements.d.ts +0 -1
- package/dist/versionedStatements.d.ts.map +1 -1
- package/dist/versionedStatements.js +1 -2
- package/dist/versionedStatements.js.map +1 -1
- package/package.json +4 -4
- package/src/ChangeDeclarations.ts +5 -0
- package/src/batchWrites.ts +6 -2
- package/src/compositeRepository.ts +3 -9
- package/src/conditionalUpsert.ts +11 -7
- package/src/conflictWrites.ts +5 -3
- package/src/insertFromSelect.ts +1 -1
- package/src/mapSqlError.ts +31 -0
- package/src/repository.ts +1 -1
- package/src/repositoryChanges.ts +56 -19
- package/src/repositoryWrites.ts +7 -5
- package/src/testing.ts +68 -3
- package/src/upsertResult.ts +18 -0
- package/src/versionedRepository.ts +6 -6
- package/src/versionedStatements.ts +1 -2
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export function mapSqlError(options) {
|
|
2
|
+
return (error) => {
|
|
3
|
+
const reason = error.reason;
|
|
4
|
+
let constraint;
|
|
5
|
+
if (reason._tag === "UniqueViolation") {
|
|
6
|
+
constraint = reason.constraint;
|
|
7
|
+
}
|
|
8
|
+
else if (reason._tag === "ConstraintError"
|
|
9
|
+
&& typeof reason.cause === "object"
|
|
10
|
+
&& reason.cause !== null
|
|
11
|
+
&& "code" in reason.cause
|
|
12
|
+
&& (reason.cause.code === "23503" || reason.cause.code === "23514")
|
|
13
|
+
&& "constraint" in reason.cause
|
|
14
|
+
&& typeof reason.cause.constraint === "string") {
|
|
15
|
+
constraint = reason.cause.constraint;
|
|
16
|
+
}
|
|
17
|
+
return constraint !== undefined && Object.hasOwn(options.constraints, constraint)
|
|
18
|
+
? (options.constraints[constraint] ?? options.fallback)(error)
|
|
19
|
+
: options.fallback(error);
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=mapSqlError.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapSqlError.js","sourceRoot":"","sources":["../src/mapSqlError.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,WAAW,CAAC,OAG3B;IACA,OAAO,CAAC,KAAe,EAAE,EAAE;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5B,IAAI,UAA8B,CAAC;QACnC,IAAI,MAAM,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YACvC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QAChC,CAAC;aAAM,IACN,MAAM,CAAC,IAAI,KAAK,iBAAiB;eAC9B,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ;eAChC,MAAM,CAAC,KAAK,KAAK,IAAI;eACrB,MAAM,IAAI,MAAM,CAAC,KAAK;eACtB,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;eAChE,YAAY,IAAI,MAAM,CAAC,KAAK;eAC5B,OAAO,MAAM,CAAC,KAAK,CAAC,UAAU,KAAK,QAAQ,EAC7C,CAAC;YACF,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;QACtC,CAAC;QACD,OAAO,UAAU,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC;YAChF,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC;YAC9D,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC,CAAC;AACH,CAAC"}
|
package/dist/repository.js
CHANGED
|
@@ -14,7 +14,7 @@ export function makeRepository(model, options) {
|
|
|
14
14
|
const sql = yield* SqlClient.SqlClient;
|
|
15
15
|
const composite = typeof options.idColumn === "object";
|
|
16
16
|
const idColumns = (composite ? options.idColumn : [options.idColumn]).map(String);
|
|
17
|
-
const changes = yield* repositoryChanges(sql, options.tableName, idColumns);
|
|
17
|
+
const changes = yield* repositoryChanges(sql, options.tableName, idColumns, model.fields);
|
|
18
18
|
const crud = makeCompositeCrud(model, sql, { ...options, columns: idColumns }, changes);
|
|
19
19
|
const queries = makeQueries(model, sql, options);
|
|
20
20
|
return options.versionColumn === undefined
|
package/dist/repository.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../src/repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAe,MAAM,QAAQ,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAoB,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAoC,MAAM,yBAAyB,CAAC;AAC9F,OAAO,EAA6C,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACnG,OAAO,EAAE,oBAAoB,EAAqB,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAgB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAiB,mBAAmB,EAA4C,MAAM,yBAAyB,CAAC;AAwBvH,MAAM,OAAO,0BAA2B,SAAQ,IAAI,CAAC,WAAW,CAAC,4BAA4B,CAK3F;CAAG;AAsEL,MAAM,UAAU,cAAc,CAC7B,KAAa,EACb,OAIC;IAED,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;QACjC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC;QACvC,MAAM,SAAS,GAAG,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC;QACvD,MAAM,SAAS,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClF,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../src/repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAe,MAAM,QAAQ,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAoB,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAoC,MAAM,yBAAyB,CAAC;AAC9F,OAAO,EAA6C,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACnG,OAAO,EAAE,oBAAoB,EAAqB,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAgB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAiB,mBAAmB,EAA4C,MAAM,yBAAyB,CAAC;AAwBvH,MAAM,OAAO,0BAA2B,SAAQ,IAAI,CAAC,WAAW,CAAC,4BAA4B,CAK3F;CAAG;AAsEL,MAAM,UAAU,cAAc,CAC7B,KAAa,EACb,OAIC;IAED,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;QACjC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC;QACvC,MAAM,SAAS,GAAG,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC;QACvD,MAAM,SAAS,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClF,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1F,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;QACxF,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,OAAO,CAAC,aAAa,KAAK,SAAS;YACzC,CAAC,CAAC;gBACA,GAAG,IAAI;gBACP,gBAAgB,EAAE,oBAAoB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,EAAE,kBAAkB,CAAC;gBAC/F,UAAU,EAAE,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,EAAE,YAAY,CAAC;gBAC7E,GAAG,CAAC,OAAO,CAAC,eAAe,KAAK,SAAS;oBACxC,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,SAAS,EAAE,CAAC,CAAC;gBAChH,GAAG,OAAO;aACV;YACF,CAAC,CAAC;gBACA,GAAG,IAAI;gBACP,GAAG,mBAAmB,CAAC,KAAK,EAAE,GAAG,EAAE;oBAClC,GAAG,OAAO;oBACV,OAAO;oBACP,QAAQ,EAAE,CAAC,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,0BAA0B,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;oBACxI,SAAS;oBACT,aAAa,EAAE,OAAO,CAAC,aAAa;iBACpC,CAAC;gBACF,GAAG,OAAO;aACV,CAAC;IACL,CAAC,CAAC,EAAE,CAAC;AACN,CAAC"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { Effect } from "effect";
|
|
1
|
+
import { Effect, type Schema } from "effect";
|
|
2
2
|
import * as Reactivity from "effect/reactivity/Reactivity";
|
|
3
3
|
import { SqlClient } from "effect/sql";
|
|
4
4
|
export type RepositoryChanges = Effect.Success<ReturnType<typeof repositoryChanges>>;
|
|
5
|
-
export declare const repositoryChanges: (sql: SqlClient.SqlClient, table: string, columns: readonly string[]) => Effect.Effect<{
|
|
6
|
-
record: (rows: readonly Readonly<Record<string, unknown>>[]) => Effect.Effect<void,
|
|
5
|
+
export declare const repositoryChanges: (sql: SqlClient.SqlClient, table: string, columns: readonly string[], fields?: Schema.Struct.Fields | undefined) => Effect.Effect<{
|
|
6
|
+
record: (rows: readonly Readonly<Record<string, unknown>>[]) => Effect.Effect<void, Schema.SchemaError, never>;
|
|
7
|
+
returning: (base?: import("effect/sql/Statement").Statement<import("effect/sql/SqlConnection").Row>) => import("effect/sql/Statement").Fragment;
|
|
7
8
|
write: <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, import("effect/sql/SqlError").SqlError | Exclude<E, import("effect/sql/SqlError").SqlError>, Exclude<Exclude<R, SqlClient.SqlClient>, Reactivity.Reactivity>>;
|
|
8
9
|
}, never, never>;
|
|
9
10
|
//# sourceMappingURL=repositoryChanges.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repositoryChanges.d.ts","sourceRoot":"","sources":["../src/repositoryChanges.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"repositoryChanges.d.ts","sourceRoot":"","sources":["../src/repositoryChanges.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAgB,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC3D,OAAO,KAAK,UAAU,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAgBvC,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC,CAAC;AAErF,eAAO,MAAM,iBAAiB;;;YA6Dd,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAIrD,CAAC"}
|
|
@@ -1,32 +1,65 @@
|
|
|
1
|
-
import { Effect, Option } from "effect";
|
|
1
|
+
import { Effect, Hash, Option } from "effect";
|
|
2
2
|
import * as Reactivity from "effect/reactivity/Reactivity";
|
|
3
3
|
import { SqlClient } from "effect/sql";
|
|
4
|
+
import { declaredBuckets } from "@shivaedev/changes/buckets.ts";
|
|
5
|
+
import { invalidationKeys } from "@shivaedev/changes/keys.ts";
|
|
6
|
+
import { ChangeDeclarations } from "#ChangeDeclarations.ts";
|
|
4
7
|
import { invalidateOnCommit, transact } from "#transact.ts";
|
|
5
|
-
const ITEM_KEY_LIMIT = 1000;
|
|
6
8
|
function encodeKeyValue(_key, value) {
|
|
7
9
|
return typeof value === "bigint" ? String(value) : value;
|
|
8
10
|
}
|
|
9
|
-
|
|
11
|
+
function recordId(value) {
|
|
12
|
+
return typeof value === "string" || typeof value === "number" || typeof value === "bigint" || typeof value === "boolean"
|
|
13
|
+
? String(value)
|
|
14
|
+
: Hash.hash(value);
|
|
15
|
+
}
|
|
16
|
+
export const repositoryChanges = Effect.fnUntraced(function* (sql, table, columns, fields = {}) {
|
|
17
|
+
const buckets = declaredBuckets(fields);
|
|
18
|
+
const bucketKeys = Effect.fnUntraced(function* (row) {
|
|
19
|
+
const keys = [];
|
|
20
|
+
for (const [index, { field, decode }] of buckets.entries()) {
|
|
21
|
+
for (const value of [row[field], row[`shivaeOldBucket${index}`]]) {
|
|
22
|
+
if (value === null || value === undefined) {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const decoded = yield* decode(value);
|
|
26
|
+
if (decoded === null || decoded === undefined) {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
keys.push({ _tag: "Bucket", collection: table, field, value: decoded });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return invalidationKeys(keys);
|
|
33
|
+
});
|
|
34
|
+
function returning(base = sql `*`) {
|
|
35
|
+
return sql.csv([base, ...buckets.map(({ field }, index) => sql `old.${sql(field)} as ${sql(`shivaeOldBucket${index}`)}`)]);
|
|
36
|
+
}
|
|
10
37
|
const initial = yield* Effect.serviceOption(Reactivity.Reactivity);
|
|
11
38
|
const fallback = Option.isSome(initial) ? initial.value : yield* Reactivity.make;
|
|
12
39
|
function provide(effect) {
|
|
13
40
|
return Effect.flatMap(Effect.serviceOption(Reactivity.Reactivity), (current) => effect.pipe(Effect.provideService(SqlClient.SqlClient, sql), Effect.provideService(Reactivity.Reactivity, Option.getOrElse(current, () => fallback))));
|
|
14
41
|
}
|
|
15
|
-
|
|
42
|
+
const record = Effect.fnUntraced(function* (rows) {
|
|
16
43
|
if (rows.length === 0) {
|
|
17
|
-
return
|
|
44
|
+
return;
|
|
18
45
|
}
|
|
19
|
-
|
|
20
|
-
|
|
46
|
+
const keys = new Set([table]);
|
|
47
|
+
for (const row of rows) {
|
|
48
|
+
const id = columns.length === 1
|
|
49
|
+
? row[columns[0] ?? ""]
|
|
50
|
+
: JSON.stringify(columns.map((column) => row[column]), encodeKeyValue);
|
|
51
|
+
keys.add(`${table}:${recordId(id)}`);
|
|
52
|
+
for (const key of yield* bucketKeys(row)) {
|
|
53
|
+
keys.add(key);
|
|
54
|
+
}
|
|
21
55
|
}
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
56
|
+
const declarations = yield* ChangeDeclarations;
|
|
57
|
+
yield* declarations.declare(table, [...keys], rows.length);
|
|
58
|
+
yield* provide(invalidateOnCommit([...keys]));
|
|
59
|
+
});
|
|
27
60
|
function write(effect) {
|
|
28
61
|
return provide(transact(effect, { onSqlError: (error) => error }));
|
|
29
62
|
}
|
|
30
|
-
return { record, write };
|
|
63
|
+
return { record, returning, write };
|
|
31
64
|
});
|
|
32
65
|
//# sourceMappingURL=repositoryChanges.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repositoryChanges.js","sourceRoot":"","sources":["../src/repositoryChanges.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"repositoryChanges.js","sourceRoot":"","sources":["../src/repositoryChanges.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repositoryWrites.d.ts","sourceRoot":"","sources":["../src/repositoryWrites.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,KAAK,SAAS,EAAa,MAAM,YAAY,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,wBAAgB,gBAAgB,CAC/B,KAAK,EAAE,KAAK,CAAC,GAAG,EAChB,GAAG,EAAE,SAAS,CAAC,SAAS,EACxB,OAAO,EAAE;IAAE,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,EAC3G,OAAO,EAAE,iBAAiB;
|
|
1
|
+
{"version":3,"file":"repositoryWrites.d.ts","sourceRoot":"","sources":["../src/repositoryWrites.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,KAAK,SAAS,EAAa,MAAM,YAAY,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,wBAAgB,gBAAgB,CAC/B,KAAK,EAAE,KAAK,CAAC,GAAG,EAChB,GAAG,EAAE,SAAS,CAAC,SAAS,EACxB,OAAO,EAAE;IAAE,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,EAC3G,OAAO,EAAE,iBAAiB;IAmDzB,MAAM,OAAO,OAAO;IACpB,MAAM,UAAU,OAAO;IAEvB,UAAU,UAAU,OAAO;IAC3B,MAAM,UAAU,OAAO,aAAa;QAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAIlE,UAAU,UAAU,OAAO;EAE5B"}
|
package/dist/repositoryWrites.js
CHANGED
|
@@ -11,11 +11,11 @@ export function repositoryWrites(model, sql, options, changes) {
|
|
|
11
11
|
}
|
|
12
12
|
function insert(input) {
|
|
13
13
|
return Effect.flatMap(record(input), (row) => (Object.keys(row).length === 0
|
|
14
|
-
? sql `insert into ${sql(tableName)} default values returning
|
|
15
|
-
: sql `insert into ${sql(tableName)} ${sql.insert(row)} returning
|
|
14
|
+
? sql `insert into ${sql(tableName)} default values returning ${changes.returning()}`
|
|
15
|
+
: sql `insert into ${sql(tableName)} ${sql.insert(row)} returning ${changes.returning()}`).pipe(Effect.tap(changes.record)));
|
|
16
16
|
}
|
|
17
17
|
function update(input) {
|
|
18
|
-
return Effect.flatMap(record(input), (row) => sql `update ${sql(tableName)} set ${sql.update(row, idColumns)} where ${predicate(row)} returning
|
|
18
|
+
return Effect.flatMap(record(input), (row) => sql `update ${sql(tableName)} set ${sql.update(row, idColumns)} where ${predicate(row)} returning ${changes.returning()}`.pipe(Effect.tap(changes.record)));
|
|
19
19
|
}
|
|
20
20
|
const insertRow = SqlSchema.findOne({ execute: insert, Request: model.insert, Result: model });
|
|
21
21
|
const insertVoid = SqlSchema.void({ execute: insert, Request: model.insert });
|
|
@@ -28,13 +28,13 @@ export function repositoryWrites(model, sql, options, changes) {
|
|
|
28
28
|
}
|
|
29
29
|
const isKey = Schema.is(key);
|
|
30
30
|
const removeByKey = SqlSchema.void({
|
|
31
|
-
execute: (id) => Effect.flatMap(record({ [idColumn]: id }), (encoded) => sql `delete from ${sql(tableName)} where ${predicate(encoded)} returning
|
|
31
|
+
execute: (id) => Effect.flatMap(record({ [idColumn]: id }), (encoded) => sql `delete from ${sql(tableName)} where ${predicate(encoded)} returning ${changes.returning()}`.pipe(Effect.tap(changes.record))),
|
|
32
32
|
Request: key,
|
|
33
33
|
});
|
|
34
34
|
function remove(input) {
|
|
35
35
|
return idColumns.length === 1 && isKey(input)
|
|
36
36
|
? removeByKey(input)
|
|
37
|
-
: Effect.flatMap(filterRecord(input), (filter) => Effect.flatMap(where(filter, true), (clause) => sql `delete from ${sql(tableName)} where ${clause} returning
|
|
37
|
+
: Effect.flatMap(filterRecord(input), (filter) => Effect.flatMap(where(filter, true), (clause) => sql `delete from ${sql(tableName)} where ${clause} returning ${changes.returning()}`.pipe(Effect.tap(changes.record), Effect.asVoid)));
|
|
38
38
|
}
|
|
39
39
|
return {
|
|
40
40
|
delete: (id) => changes.write(remove(id)).pipe(Effect.withSpan(`${spanPrefix}.delete`)),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repositoryWrites.js","sourceRoot":"","sources":["../src/repositoryWrites.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAExC,OAAO,EAAkB,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,MAAM,UAAU,gBAAgB,CAC/B,KAAgB,EAChB,GAAwB,EACxB,OAA2G,EAC3G,OAA0B;IAE1B,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IACrD,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACxF,MAAM,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACnG,SAAS,SAAS,CAAC,KAAwC;QAC1D,OAAO,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAA,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACnF,CAAC;IACD,SAAS,MAAM,CAAC,KAAc;QAC7B,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAC5C,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC;YAC7B,CAAC,CAAC,GAAG,CAAA,eAAe,GAAG,CAAC,SAAS,CAAC,6BAA6B;
|
|
1
|
+
{"version":3,"file":"repositoryWrites.js","sourceRoot":"","sources":["../src/repositoryWrites.ts"],"names":[],"mappings":"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"}
|
package/dist/testing.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Effect } from "effect";
|
|
2
2
|
import { SqlClient } from "effect/sql";
|
|
3
|
+
import { type BucketKey, type ItemKey } from "@shivaedev/changes/keys.ts";
|
|
3
4
|
declare const UnannouncedWrites_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
4
5
|
readonly _tag: "UnannouncedWrites";
|
|
5
6
|
} & Readonly<A>;
|
|
@@ -7,6 +8,19 @@ export declare class UnannouncedWrites extends UnannouncedWrites_base<{
|
|
|
7
8
|
readonly tables: readonly string[];
|
|
8
9
|
}> {
|
|
9
10
|
}
|
|
10
|
-
export
|
|
11
|
+
export interface ChangeCoverage {
|
|
12
|
+
readonly covers: Readonly<Record<string, readonly (ItemKey | BucketKey)[]>>;
|
|
13
|
+
}
|
|
14
|
+
export declare const withChangeCoverage: <A, E, R>(body: Effect.Effect<A, E, R>, options?: ChangeCoverage | undefined) => Effect.Effect<A, import("effect/sql/SqlError").SqlError | UnannouncedWrites | Exclude<E, import("effect/sql/SqlError").SqlError>, import("effect/reactivity/Reactivity").Reactivity | SqlClient.SqlClient | Exclude<Exclude<R, never>, never>>;
|
|
15
|
+
declare const PublishedKeysMismatch_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
16
|
+
readonly _tag: "PublishedKeysMismatch";
|
|
17
|
+
} & Readonly<A>;
|
|
18
|
+
export declare class PublishedKeysMismatch extends PublishedKeysMismatch_base<{
|
|
19
|
+
readonly expected: readonly unknown[];
|
|
20
|
+
readonly actual: readonly unknown[];
|
|
21
|
+
}> {
|
|
22
|
+
get message(): string;
|
|
23
|
+
}
|
|
24
|
+
export declare function expectPublished(keys: readonly unknown[]): <A, E, R>(body: Effect.Effect<A, E, R>) => Effect.Effect<A, E | PublishedKeysMismatch, Exclude<R, never>>;
|
|
11
25
|
export {};
|
|
12
26
|
//# sourceMappingURL=testing.d.ts.map
|
package/dist/testing.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;;;;
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,OAAO,EAAoB,MAAM,4BAA4B,CAAC;;;;AAI5F,qBAAa,iBAAkB,SAAQ,uBAAsC;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;CAAG;AAEvH,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;CAC5E;AAQD,eAAO,MAAM,kBAAkB,GAAsD,CAAC,EAAE,CAAC,EAAE,CAAC,uTAqD1F,CAAC;;;;AAEH,qBAAa,qBAAsB,SAAQ,2BAA0C;IACpF,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC;CACpC,CAAC;IACD,IAAa,OAAO,WAEnB;CACD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,IACA,CAAC,EAAE,CAAC,EAAE,CAAC,kGAmB9D"}
|
package/dist/testing.js
CHANGED
|
@@ -1,23 +1,45 @@
|
|
|
1
1
|
import { Data, Effect } from "effect";
|
|
2
2
|
import { SqlClient } from "effect/sql";
|
|
3
|
-
import {
|
|
3
|
+
import { invalidationKeys } from "@shivaedev/changes/keys.ts";
|
|
4
|
+
import { ChangeDeclarations } from "#ChangeDeclarations.ts";
|
|
5
|
+
import { ChangeObserver, transact } from "#transact.ts";
|
|
4
6
|
export class UnannouncedWrites extends Data.TaggedError("UnannouncedWrites") {
|
|
5
7
|
}
|
|
6
|
-
export const withChangeCoverage = Effect.fn("Changes.withChangeCoverage")(function* (body) {
|
|
8
|
+
export const withChangeCoverage = Effect.fn("Changes.withChangeCoverage")(function* (body, options) {
|
|
7
9
|
const observer = yield* ChangeObserver;
|
|
8
10
|
const sql = yield* SqlClient.SqlClient;
|
|
9
11
|
const named = new Set();
|
|
12
|
+
const declarations = new Map();
|
|
13
|
+
const outer = yield* ChangeDeclarations;
|
|
10
14
|
const written = sql `select relid, relname, (n_tup_ins + n_tup_upd + n_tup_del)::int as writes from pg_stat_xact_user_tables`;
|
|
11
15
|
const checked = Effect.gen(function* () {
|
|
12
16
|
const before = new Map((yield* written).map((row) => [row.relid, row.writes]));
|
|
13
17
|
const result = yield* body;
|
|
14
|
-
const missing = (yield* written).filter((row) =>
|
|
18
|
+
const missing = (yield* written).filter((row) => {
|
|
19
|
+
const count = row.writes - (before.get(row.relid) ?? 0);
|
|
20
|
+
if (count <= 0) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
const automatic = declarations.get(row.relname);
|
|
24
|
+
const explicit = options?.covers[row.relname] ?? [];
|
|
25
|
+
const expected = [...(automatic?.keys ?? []), ...invalidationKeys(explicit)];
|
|
26
|
+
return (count > (automatic?.rows ?? 0) && explicit.length === 0) || expected.some((key) => !named.has(key));
|
|
27
|
+
});
|
|
15
28
|
if (missing.length > 0) {
|
|
16
29
|
return yield* Effect.fail(new UnannouncedWrites({ tables: missing.map((row) => row.relname).sort() }));
|
|
17
30
|
}
|
|
18
31
|
return result;
|
|
19
32
|
});
|
|
20
|
-
return yield* checked.pipe(transact({ onSqlError: (error) => error }), Effect.provideService(
|
|
33
|
+
return yield* checked.pipe(transact({ onSqlError: (error) => error }), Effect.provideService(ChangeDeclarations, {
|
|
34
|
+
declare: (table, keys, rows) => Effect.andThen(Effect.sync(() => {
|
|
35
|
+
const entry = declarations.get(table) ?? { keys: new Set(), rows: 0 };
|
|
36
|
+
for (const key of keys) {
|
|
37
|
+
entry.keys.add(key);
|
|
38
|
+
}
|
|
39
|
+
entry.rows += rows;
|
|
40
|
+
declarations.set(table, entry);
|
|
41
|
+
}), outer.declare(table, keys, rows)),
|
|
42
|
+
}), Effect.provideService(ChangeObserver, (event) => {
|
|
21
43
|
if (event._tag === "Recorded") {
|
|
22
44
|
for (const key of event.changes) {
|
|
23
45
|
named.add(key);
|
|
@@ -26,4 +48,28 @@ export const withChangeCoverage = Effect.fn("Changes.withChangeCoverage")(functi
|
|
|
26
48
|
return observer(event);
|
|
27
49
|
}));
|
|
28
50
|
});
|
|
51
|
+
export class PublishedKeysMismatch extends Data.TaggedError("PublishedKeysMismatch") {
|
|
52
|
+
get message() {
|
|
53
|
+
return `Expected published keys ${JSON.stringify(this.expected)}; actual published keys ${JSON.stringify(this.actual)}`;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export function expectPublished(keys) {
|
|
57
|
+
return Effect.fn("Changes.expectPublished")(function* (body) {
|
|
58
|
+
const observer = yield* ChangeObserver;
|
|
59
|
+
const actual = new Set();
|
|
60
|
+
const result = yield* body.pipe(Effect.provideService(ChangeObserver, (event) => {
|
|
61
|
+
if (event._tag === "Published") {
|
|
62
|
+
for (const key of event.changes) {
|
|
63
|
+
actual.add(key);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return observer(event);
|
|
67
|
+
}));
|
|
68
|
+
const expected = new Set(keys);
|
|
69
|
+
if (actual.size !== expected.size || [...expected].some((key) => !actual.has(key))) {
|
|
70
|
+
return yield* Effect.fail(new PublishedKeysMismatch({ actual: [...actual], expected: [...expected] }));
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
});
|
|
74
|
+
}
|
|
29
75
|
//# sourceMappingURL=testing.js.map
|
package/dist/testing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Effect, Schema } from "effect";
|
|
2
|
+
import type { Model } from "effect/schema";
|
|
3
|
+
import type { SqlClient } from "effect/sql";
|
|
4
|
+
export interface UpsertRow<TRow> {
|
|
5
|
+
readonly inserted: boolean;
|
|
6
|
+
readonly row: TRow;
|
|
7
|
+
}
|
|
8
|
+
export declare function upsertReturning(sql: SqlClient.SqlClient): import("effect/sql/Statement").Statement<import("effect/sql/SqlConnection").Row>;
|
|
9
|
+
export declare function makeUpsertDecoder(model: Model.Any): (row: Readonly<Record<string, unknown>> | undefined) => Effect.Effect<{
|
|
10
|
+
inserted: boolean;
|
|
11
|
+
row: unknown;
|
|
12
|
+
}, Schema.SchemaError, unknown>;
|
|
13
|
+
//# sourceMappingURL=upsertResult.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upsertResult.d.ts","sourceRoot":"","sources":["../src/upsertResult.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,SAAS,CAAC,IAAI;IAC9B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;CACnB;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,SAAS,CAAC,SAAS,oFAEvD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,SAEpC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS;;;gCAE1D"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Effect, Schema } from "effect";
|
|
2
|
+
export function upsertReturning(sql) {
|
|
3
|
+
return sql `*, (xmax = 0) as ${sql("effectSqlInserted")}`;
|
|
4
|
+
}
|
|
5
|
+
export function makeUpsertDecoder(model) {
|
|
6
|
+
const decode = Schema.decodeUnknownEffect(model);
|
|
7
|
+
return (row) => Effect.map(decode(row), (decoded) => ({ inserted: row?.effectSqlInserted === true, row: decoded }));
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=upsertResult.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upsertResult.js","sourceRoot":"","sources":["../src/upsertResult.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AASxC,MAAM,UAAU,eAAe,CAAC,GAAwB;IACvD,OAAO,GAAG,CAAA,oBAAoB,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAgB;IACjD,MAAM,MAAM,GAAG,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACjD,OAAO,CAAC,GAAkD,EAAE,EAAE,CAC7D,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,iBAAiB,KAAK,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AACtG,CAAC"}
|
|
@@ -7,7 +7,7 @@ export function makeVersionedWrites(model, sql, options) {
|
|
|
7
7
|
function insert(input) {
|
|
8
8
|
return Effect.gen(function* () {
|
|
9
9
|
const statement = yield* statements.insert(input);
|
|
10
|
-
const rows = yield* sql `${statement} returning
|
|
10
|
+
const rows = yield* sql `${statement} returning ${changes.returning()}`;
|
|
11
11
|
yield* changes.record(rows);
|
|
12
12
|
return yield* decodeRow(rows[0]);
|
|
13
13
|
}).pipe(changes.write, Effect.withSpan(`${spanPrefix}.insert`));
|
|
@@ -15,14 +15,14 @@ export function makeVersionedWrites(model, sql, options) {
|
|
|
15
15
|
function insertVoid(input) {
|
|
16
16
|
return Effect.gen(function* () {
|
|
17
17
|
const statement = yield* statements.insert(input);
|
|
18
|
-
const rows = yield* sql `${statement} returning ${
|
|
18
|
+
const rows = yield* sql `${statement} returning ${changes.returning()}`;
|
|
19
19
|
yield* changes.record(rows);
|
|
20
20
|
}).pipe(changes.write, Effect.withSpan(`${spanPrefix}.insertVoid`));
|
|
21
21
|
}
|
|
22
22
|
function insertOrIgnore(input) {
|
|
23
23
|
return Effect.gen(function* () {
|
|
24
24
|
const statement = yield* statements.insert(input, true);
|
|
25
|
-
const rows = yield* sql `${statement} returning
|
|
25
|
+
const rows = yield* sql `${statement} returning ${changes.returning()}`;
|
|
26
26
|
yield* changes.record(rows);
|
|
27
27
|
return rows.length === 0 ? Option.none() : Option.some(yield* decodeRow(rows[0]));
|
|
28
28
|
}).pipe(changes.write, Effect.withSpan(`${spanPrefix}.insertOrIgnore`));
|
|
@@ -30,7 +30,7 @@ export function makeVersionedWrites(model, sql, options) {
|
|
|
30
30
|
function update(input) {
|
|
31
31
|
return Effect.gen(function* () {
|
|
32
32
|
const { statement, classify } = yield* statements.update(input);
|
|
33
|
-
const rows = yield* sql `${statement} returning
|
|
33
|
+
const rows = yield* sql `${statement} returning ${changes.returning()}`;
|
|
34
34
|
if (rows.length === 0) {
|
|
35
35
|
return yield* classify();
|
|
36
36
|
}
|
|
@@ -41,7 +41,7 @@ export function makeVersionedWrites(model, sql, options) {
|
|
|
41
41
|
function updateVoid(input) {
|
|
42
42
|
return Effect.gen(function* () {
|
|
43
43
|
const { statement, classify } = yield* statements.update(input);
|
|
44
|
-
const rows = yield* sql `${statement} returning ${
|
|
44
|
+
const rows = yield* sql `${statement} returning ${changes.returning()}`;
|
|
45
45
|
if (rows.length === 0) {
|
|
46
46
|
return yield* classify();
|
|
47
47
|
}
|
|
@@ -51,7 +51,7 @@ export function makeVersionedWrites(model, sql, options) {
|
|
|
51
51
|
function deleteRow(id, expected) {
|
|
52
52
|
return Effect.gen(function* () {
|
|
53
53
|
const { statement, classify } = yield* statements.remove(id, expected);
|
|
54
|
-
const rows = yield* sql `${statement} returning ${
|
|
54
|
+
const rows = yield* sql `${statement} returning ${changes.returning()}`;
|
|
55
55
|
if (rows.length === 0) {
|
|
56
56
|
return yield* classify();
|
|
57
57
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"versionedRepository.js","sourceRoot":"","sources":["../src/versionedRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAMhD,OAAO,EAAyB,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAsCrF,MAAM,UAAU,mBAAmB,CAClC,KAAgB,EAChB,GAAwB,EACxB,OAAgG;IAEhG,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACxC,MAAM,UAAU,GAAG,mBAAmB,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACpD,SAAS,MAAM,CAAC,KAAc;QAC7B,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAC1B,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAClD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAAA,GAAG,SAAS,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"versionedRepository.js","sourceRoot":"","sources":["../src/versionedRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,7 +16,6 @@ export declare function versionedStatements(model: Model.Any, sql: SqlClient.Sql
|
|
|
16
16
|
classify: () => Effect.Effect<never, OptimisticConcurrencyError | import("effect/sql/SqlError").SqlError, never>;
|
|
17
17
|
statement: import("effect/sql/Statement").Statement<import("effect/sql/SqlConnection").Row>;
|
|
18
18
|
}, Schema.SchemaError, unknown>;
|
|
19
|
-
returningKeys: import("effect/sql/Statement").Fragment;
|
|
20
19
|
update: (input: Readonly<Record<string, unknown>>) => Effect.Effect<{
|
|
21
20
|
classify: () => Effect.Effect<never, OptimisticConcurrencyError | import("effect/sql/SqlError").SqlError, never>;
|
|
22
21
|
statement: import("effect/sql/Statement").Statement<import("effect/sql/SqlConnection").Row>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"versionedStatements.d.ts","sourceRoot":"","sources":["../src/versionedStatements.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAGjE,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,KAAK,0BAA0B,CAAC;IACrH,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAC/B;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,gBAAgB;
|
|
1
|
+
{"version":3,"file":"versionedStatements.d.ts","sourceRoot":"","sources":["../src/versionedStatements.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAGjE,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,KAAK,0BAA0B,CAAC;IACrH,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAC/B;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,gBAAgB;oBAsCjF,OAAO;iBAsBV,OAAO,YAAY,MAAM;;;;oBAftB,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;;;;EA2BxD"}
|
|
@@ -21,7 +21,6 @@ export function versionedStatements(model, sql, options) {
|
|
|
21
21
|
const record = Schema.decodeUnknownEffect(Schema.Record(Schema.String, Schema.Unknown));
|
|
22
22
|
const validateVersion = Schema.decodeUnknownEffect(Version);
|
|
23
23
|
const clause = options.conflictColumns === undefined ? undefined : makeConflictClause(model, sql, { ...options, conflictColumns: options.conflictColumns });
|
|
24
|
-
const returningKeys = sql.csv(idColumns.map((column) => sql `${sql(column)}`));
|
|
25
24
|
function key(input) {
|
|
26
25
|
return idColumns.length === 1 ? { [idColumns[0] ?? ""]: input } : input;
|
|
27
26
|
}
|
|
@@ -70,6 +69,6 @@ export function versionedStatements(model, sql, options) {
|
|
|
70
69
|
};
|
|
71
70
|
});
|
|
72
71
|
}
|
|
73
|
-
return { insert, remove,
|
|
72
|
+
return { insert, remove, update };
|
|
74
73
|
}
|
|
75
74
|
//# sourceMappingURL=versionedStatements.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"versionedStatements.js","sourceRoot":"","sources":["../src/versionedStatements.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5D,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC;AAUtF,MAAM,UAAU,mBAAmB,CAAC,KAAgB,EAAE,GAAwB,EAAE,OAAyB;IACxG,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAClE,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAChC,SAAS,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACxB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC,CAAC,CACF,CAAC;IACF,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7D,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAClD,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,2BAA2B,aAAa,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,aAAa,GAAG,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;IACzD,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACxF,MAAM,eAAe,GAAG,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC5D,MAAM,MAAM,GACX,OAAO,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAC9I,
|
|
1
|
+
{"version":3,"file":"versionedStatements.js","sourceRoot":"","sources":["../src/versionedStatements.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shivaedev/sql",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.24.0",
|
|
4
4
|
"description": "Schema-derived repositories over native Effect SQL",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"effect"
|
|
@@ -43,16 +43,16 @@
|
|
|
43
43
|
"README.md"
|
|
44
44
|
],
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@shivaedev/changes": "0.
|
|
46
|
+
"@shivaedev/changes": "0.5.0"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
49
|
"@effect/platform-node": "4.0.5",
|
|
50
50
|
"@effect/sql-pg": "4.0.5",
|
|
51
51
|
"@effect/sql-sqlite-node": "4.0.5",
|
|
52
|
-
"@shivaedev/quality": "0.
|
|
52
|
+
"@shivaedev/quality": "0.43.0",
|
|
53
53
|
"@shivaedev/service": "0.5.0",
|
|
54
54
|
"@shivaedev/test": "0.10.0",
|
|
55
|
-
"@shivaedev/test-story": "0.
|
|
55
|
+
"@shivaedev/test-story": "0.22.0",
|
|
56
56
|
"@types/node": "24.19.2",
|
|
57
57
|
"effect": "4.0.5",
|
|
58
58
|
"typescript": "7.0.2",
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Context, Effect } from "effect";
|
|
2
|
+
|
|
3
|
+
export const ChangeDeclarations = Context.Reference<{
|
|
4
|
+
declare: (table: string, keys: readonly string[], rows: number) => Effect.Effect<void>;
|
|
5
|
+
}>("@shivaedev/sql/ChangeDeclarations", { defaultValue: () => ({ declare: () => Effect.void }) });
|
package/src/batchWrites.ts
CHANGED
|
@@ -4,6 +4,7 @@ import type { SqlClient } from "effect/sql";
|
|
|
4
4
|
import type { SqlError } from "effect/sql/SqlError";
|
|
5
5
|
import type { Fragment } from "effect/sql/Statement";
|
|
6
6
|
import type { RepositoryChanges } from "./repositoryChanges.ts";
|
|
7
|
+
import { makeUpsertDecoder, upsertReturning } from "./upsertResult.ts";
|
|
7
8
|
|
|
8
9
|
export type InsertMany<TModel extends Model.Any, TServices = never> = (
|
|
9
10
|
inputs: readonly TModel["insert"]["Type"][],
|
|
@@ -19,10 +20,13 @@ export function makeInsertMany<TServices = never>(
|
|
|
19
20
|
options: { readonly tableName: string; readonly spanPrefix: string; readonly changes: RepositoryChanges },
|
|
20
21
|
operation: string,
|
|
21
22
|
prepare: (row: Readonly<Record<string, unknown>>) => Effect.Effect<Fragment, Schema.SchemaError, TServices> = () => Effect.succeed(sql``),
|
|
23
|
+
upsert = false,
|
|
22
24
|
) {
|
|
23
25
|
const encode = Schema.encodeEffect(model.insert);
|
|
24
26
|
const record = Schema.decodeUnknownEffect(Schema.Record(Schema.String, Schema.Unknown));
|
|
25
27
|
const decode = Schema.decodeUnknownEffect(Schema.Array(model));
|
|
28
|
+
const decodeUpsert = makeUpsertDecoder(model);
|
|
29
|
+
const returning = options.changes.returning(upsert ? upsertReturning(sql) : sql`*`);
|
|
26
30
|
return (inputs: readonly unknown[]) =>
|
|
27
31
|
Effect.gen(function* () {
|
|
28
32
|
if (inputs.length === 0) {
|
|
@@ -41,9 +45,9 @@ export function makeInsertMany<TServices = never>(
|
|
|
41
45
|
let parameters = 0;
|
|
42
46
|
let suffix: Fragment = sql``;
|
|
43
47
|
const flush = Effect.gen(function* () {
|
|
44
|
-
const returned = yield* sql`insert into ${sql(options.tableName)} (${names}) values ${sql.csv(chunk)} ${suffix} returning
|
|
48
|
+
const returned = yield* sql`insert into ${sql(options.tableName)} (${names}) values ${sql.csv(chunk)} ${suffix} returning ${returning}`;
|
|
45
49
|
changedRows.push(...returned);
|
|
46
|
-
for (const row of yield* decode(returned)) {
|
|
50
|
+
for (const row of yield* upsert ? Effect.forEach(returned, decodeUpsert) : decode(returned)) {
|
|
47
51
|
results.push(row);
|
|
48
52
|
}
|
|
49
53
|
chunk = [];
|