@shivaedev/sql 0.46.3 → 0.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +61 -27
  3. package/dist/backfillPostgres.d.ts +1 -1
  4. package/dist/backfillPostgres.d.ts.map +1 -1
  5. package/dist/backfillPostgres.js +1 -1
  6. package/dist/backfillPostgres.js.map +1 -1
  7. package/dist/batchedDelete.d.ts +1 -1
  8. package/dist/compositeRepository.d.ts +3 -1
  9. package/dist/compositeRepository.d.ts.map +1 -1
  10. package/dist/compositeRepository.js +2 -2
  11. package/dist/compositeRepository.js.map +1 -1
  12. package/dist/databaseAddress.d.ts.map +1 -1
  13. package/dist/databaseAddress.js +34 -18
  14. package/dist/databaseAddress.js.map +1 -1
  15. package/dist/deleteGroupsBatched.d.ts +1 -1
  16. package/dist/deleteGroupsBatched.d.ts.map +1 -1
  17. package/dist/deleteGroupsBatched.js +1 -1
  18. package/dist/deleteGroupsBatched.js.map +1 -1
  19. package/dist/makeAggregate.d.ts +2 -0
  20. package/dist/makeAggregate.d.ts.map +1 -1
  21. package/dist/makeAggregate.js +1 -0
  22. package/dist/makeAggregate.js.map +1 -1
  23. package/dist/migrations.js +1 -1
  24. package/dist/migrations.js.map +1 -1
  25. package/dist/orderedChildStatements.d.ts +1 -1
  26. package/dist/postgresChanges.js +1 -1
  27. package/dist/postgresChanges.js.map +1 -1
  28. package/dist/readSql.d.ts +19 -0
  29. package/dist/readSql.d.ts.map +1 -0
  30. package/dist/readSql.js +37 -0
  31. package/dist/readSql.js.map +1 -0
  32. package/dist/recordRepositoryRead.d.ts +12 -0
  33. package/dist/recordRepositoryRead.d.ts.map +1 -0
  34. package/dist/recordRepositoryRead.js +102 -0
  35. package/dist/recordRepositoryRead.js.map +1 -0
  36. package/dist/repository.d.ts.map +1 -1
  37. package/dist/repository.js +6 -5
  38. package/dist/repository.js.map +1 -1
  39. package/dist/repositoryChanges.d.ts +2 -2
  40. package/dist/repositoryChanges.d.ts.map +1 -1
  41. package/dist/repositoryChanges.js +30 -14
  42. package/dist/repositoryChanges.js.map +1 -1
  43. package/dist/repositoryCollection.d.ts +2 -0
  44. package/dist/repositoryCollection.d.ts.map +1 -1
  45. package/dist/repositoryCollection.js +14 -1
  46. package/dist/repositoryCollection.js.map +1 -1
  47. package/dist/repositoryQueries.d.ts +2 -0
  48. package/dist/repositoryQueries.d.ts.map +1 -1
  49. package/dist/repositoryQueries.js +3 -0
  50. package/dist/repositoryQueries.js.map +1 -1
  51. package/dist/repositoryWrites.d.ts +1 -1
  52. package/dist/transact.d.ts +5 -2
  53. package/dist/transact.d.ts.map +1 -1
  54. package/dist/transact.js +7 -3
  55. package/dist/transact.js.map +1 -1
  56. package/package.json +16 -16
  57. package/src/backfillPostgres.ts +1 -1
  58. package/src/compositeRepository.ts +9 -2
  59. package/src/databaseAddress.ts +36 -18
  60. package/src/deleteGroupsBatched.ts +0 -1
  61. package/src/makeAggregate.ts +4 -2
  62. package/src/migrations.ts +1 -1
  63. package/src/postgresChanges.ts +1 -1
  64. package/src/readSql.ts +51 -0
  65. package/src/recordRepositoryRead.ts +126 -0
  66. package/src/repository.ts +6 -5
  67. package/src/repositoryChanges.ts +42 -15
  68. package/src/repositoryCollection.ts +18 -1
  69. package/src/repositoryQueries.ts +5 -0
  70. package/src/transact.ts +14 -15
@@ -9,6 +9,7 @@ import type { Aggregate } from "#aggregateQuery.ts";
9
9
  import { latestPerGroup as makeLatestPerGroup } from "#latestPerGroup.ts";
10
10
  import { makeAggregate } from "#makeAggregate.ts";
11
11
  import { makeQueryClauses } from "#makeQueryClauses.ts";
12
+ import type { RecordRead } from "#recordRepositoryRead.ts";
12
13
  import type { FindMany, FindOne, LatestPerGroup } from "#repository.ts";
13
14
  import { makeFilter } from "#repositoryFilter.ts";
14
15
  import { sqlNameTransforms } from "#sqlNameTransforms.ts";
@@ -57,6 +58,7 @@ export interface Queries<TModel extends Model.Any> {
57
58
  export function makeQueries<TModel extends Model.Any>(
58
59
  model: TModel,
59
60
  options: {
61
+ readonly recordRead: RecordRead;
60
62
  readonly tableName: string;
61
63
  readonly spanPrefix: string;
62
64
  },
@@ -72,6 +74,7 @@ export function makeQueries<TModel extends Model.Any>(
72
74
  function count(query: Pick<FindMany<TModel, Key<TModel>>, "where"> = {}): Effect.Effect<number, SqlError | Schema.SchemaError, unknown> {
73
75
  return Effect.gen(function* () {
74
76
  const predicate = yield* where(query.where, true, true);
77
+ yield* options.recordRead(query.where);
75
78
  const rows = yield* sql`select cast(count(*) as text) as count from ${sql(options.tableName)} where ${predicate}`;
76
79
  const [result] = yield* Schema.decodeUnknownEffect(CountResult)(rows);
77
80
  return result.count;
@@ -88,6 +91,7 @@ export function makeQueries<TModel extends Model.Any>(
88
91
  const predicate = yield* where(query.where, true, true);
89
92
  const order = yield* orderClause(query.orderBy);
90
93
  const limit = yield* limitClause(query.limit);
94
+ yield* options.recordRead(query.where);
91
95
  return sql`select ${sql.csv(groupColumns(model.fields, keys).map(({ column }) => sql`${sql(column)}`))} from ${sql(options.tableName)} where ${predicate} ${order} ${limit}`;
92
96
  });
93
97
  return { fields, statement };
@@ -112,6 +116,7 @@ export function makeQueries<TModel extends Model.Any>(
112
116
  return Effect.gen(function* () {
113
117
  const order = yield* orderClause(query.orderBy);
114
118
  const rowLimit = yield* decodeLimit(query.limit);
119
+ yield* options.recordRead(query.where);
115
120
  return yield* readLatest(query, order, rowLimit);
116
121
  }).pipe(Effect.withSpan(`${options.spanPrefix}.latestPerGroup`));
117
122
  }
package/src/transact.ts CHANGED
@@ -79,29 +79,28 @@ export interface TransactOptions<TError> {
79
79
  readonly onSqlError: (error: SqlError) => TError;
80
80
  }
81
81
 
82
+ type Transacted<A, E, R> = Effect.Effect<A, E, R | SqlClient.SqlClient | Reactivity.Reactivity>;
83
+
82
84
  export const transact: {
83
- <TError>(
84
- options: TransactOptions<TError>,
85
- ): <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, Exclude<E, SqlError> | TError, R | SqlClient.SqlClient | Reactivity.Reactivity>;
86
- <A, E, R, TError>(
87
- effect: Effect.Effect<A, E, R>,
88
- options: TransactOptions<TError>,
89
- ): Effect.Effect<A, Exclude<E, SqlError> | TError, R | SqlClient.SqlClient | Reactivity.Reactivity>;
85
+ (): <A, E, R>(effect: Effect.Effect<A, E, R>) => Transacted<A, E | SqlError, R>;
86
+ <TError>(options: TransactOptions<TError>): <A, E, R>(effect: Effect.Effect<A, E, R>) => Transacted<A, Exclude<E, SqlError> | TError, R>;
87
+ <A, E, R>(effect: Effect.Effect<A, E, R>): Transacted<A, E | SqlError, R>;
88
+ <A, E, R, TError>(effect: Effect.Effect<A, E, R>, options: TransactOptions<TError>): Transacted<A, Exclude<E, SqlError> | TError, R>;
90
89
  } = dual(
91
- 2,
92
- Effect.fn("Transact.transact")(function* <A, E, R, TError>(effect: Effect.Effect<A, E, R>, options: TransactOptions<TError>) {
90
+ (args) => Effect.isEffect(args[0]),
91
+ Effect.fn("Transact.transact")(function* <A, E, R, TError>(effect: Effect.Effect<A, E, R>, options?: TransactOptions<TError>) {
93
92
  const sql = yield* SqlClient.SqlClient;
94
93
  const native = yield* Effect.serviceOption(sql.transactionService);
95
- return yield* invalidations
94
+ const transacted = invalidations
96
95
  .within((body, boundary) =>
97
96
  native._tag === "Some"
98
97
  ? sql.withTransaction(body)
99
98
  : boundary.restore(sql.withTransaction(Effect.tap(body, () => sql.afterCommit(boundary.committed)))),
100
99
  )(effect)
101
- .pipe(
102
- Effect.provideService(invalidations.Observer, observe),
103
- Effect.provideService(invalidations.CommittedSink, committed),
104
- Effect.catchIf(isSqlError, (error) => Effect.fail(options.onSqlError(error))),
105
- );
100
+ .pipe(Effect.provideService(invalidations.Observer, observe), Effect.provideService(invalidations.CommittedSink, committed));
101
+ if (options === undefined) {
102
+ return yield* transacted;
103
+ }
104
+ return yield* Effect.catchIf(transacted, isSqlError, (error) => Effect.fail(options.onSqlError(error)));
106
105
  }),
107
106
  );