@shivaedev/sql 0.38.0 → 0.39.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 CHANGED
@@ -1,5 +1,16 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.39.0 - 2026-11-04
4
+
5
+ ### Added
6
+
7
+ - Repositories expose `findOne` with model-derived filters, ordering and projections, returning `Option` for a matching decoded row.
8
+ - `compositeRecordKey` encodes decoded model key fields into the record key published by repository writes, including `NumberFromString` and bigint keys.
9
+
10
+ ### Changed
11
+
12
+ - Require Effect 4.0.7 and its matching companion packages. A PostgreSQL connection the server terminates now fails with the server's error, such as `terminating connection due to administrator command`, instead of a generic `Connection closed`, following `@effect/sql-pg` 4.0.7.
13
+
3
14
  ## 0.38.0 - 2026-11-04
4
15
 
5
16
  ### Added
package/README.md CHANGED
@@ -247,6 +247,18 @@ const listInvoiceLines = (name: string | undefined) =>
247
247
  });
248
248
  ```
249
249
 
250
+ For a filtered single-row read, use `findOne`:
251
+
252
+ ```ts
253
+ const found = yield* lines.findOne({
254
+ where: { amount: 52, note: null },
255
+ select: ["name", "amount"],
256
+ orderBy: { field: "name", direction: "asc" },
257
+ });
258
+ ```
259
+
260
+ It returns `Option.some` of the selected decoded fields, or `Option.none` when no row matches. It accepts the same filters, projections and ordering as `findMany`, with a fixed SQL limit of one. Supply ordering when several rows can match and the choice matters. SQL and schema failures remain in the error channel.
261
+
250
262
  Filter entries are joined with `AND`. A field value uses equality; a null filter matches SQL `NULL`, and an omitted or `undefined` value leaves the field unconstrained. Filters use decoded field values, so `amount` takes a number. Selected results are decoded records with the selected fields' types; this function returns `Array<{ readonly name: string; readonly amount: number }>`.
251
263
 
252
264
  Use `{ in: values }` to match any value in a list, alongside equality entries:
@@ -444,7 +456,19 @@ const ingest = Effect.gen(function* () {
444
456
  });
445
457
  ```
446
458
 
447
- The application creates `readings` with `PRIMARY KEY (source, sequence)`; `sequence` and `amount` are text columns for these codecs. Composite keys contain at least two model fields. `findById` and `delete` take an object containing every key field and encode each through its field schema. `update` and `updateVoid` use the full key from the model's update input and leave the key columns unchanged. Missing key fields fail with `SchemaError` before SQL runs. A scalar `idColumn` keeps native CRUD signatures. Writes announce a composite row as the table name, a colon and a JSON array of the returned key values in `idColumn` order, such as `readings:["meter","1"]`; a PostgreSQL `bigint` key value appears as its decimal string. Build matching subscription ids with `compositeId` from `@shivaedev/changes/keys.ts`, using stored values in that same column order: `collection("readings", Schema.String).item(compositeId(["meter", "1"]))`. Manual invalidations use the same id: `invalidateOnCommit({ readings: [compositeId(["meter", "1"])] })`.
459
+ The application creates `readings` with `PRIMARY KEY (source, sequence)`; `sequence` and `amount` are text columns for these codecs. Composite keys contain at least two model fields. `findById` and `delete` take an object containing every key field and encode each through its field schema. `update` and `updateVoid` use the full key from the model's update input and leave the key columns unchanged. Missing key fields fail with `SchemaError` before SQL runs. A scalar `idColumn` keeps native CRUD signatures. Writes announce a composite row as the table name, a colon and a JSON array of the returned key values in `idColumn` order, such as `readings:["meter","1"]`; a PostgreSQL `bigint` key value appears as its decimal string. Use `compositeRecordKey` to derive a matching subscription key from a decoded row:
460
+
461
+ ```ts
462
+ import { compositeRecordKey } from "@shivaedev/sql/compositeRecordKey.ts";
463
+
464
+ const key = yield* compositeRecordKey(
465
+ Reading,
466
+ { tableName: "readings", idColumn: ["source", "sequence"] },
467
+ { source: "meter", sequence: 1 },
468
+ );
469
+ ```
470
+
471
+ Pass `[key]` to native Reactivity subscriptions or `invalidateOnCommit`. The helper encodes only the named key fields through the model's select schemas, in `idColumn` order, so decoded `NumberFromString` fields and bigint ids match the writer's stored key values. Codec encoding services remain in the Effect environment, and encoding failures are typed `SchemaError`. It also unwraps native PostgreSQL parameters such as `int8`. The low-level `compositeId` from `@shivaedev/changes/keys.ts` continues to accept stored values in that same column order.
448
472
 
449
473
  `conflictColumns` is a nonempty tuple of inserted model fields backed by a database unique constraint or primary key. It can differ from the primary key, including a unique external key beside a generated ID. Declaring it adds these methods:
450
474
 
@@ -892,6 +916,7 @@ Import the module that defines the name; there is no root entry.
892
916
  - `@shivaedev/sql/keysetPage.ts`: `keysetPage(options)`, `KeysetOrder`, `KeysetPageQuery`, `KeysetPage` — Native seek and order fragments with a required unique tie-breaker, validated page size and one-row lookahead; predicates, result schemas and cursor formats stay with the caller.
893
917
  - `@shivaedev/sql/int8.ts`: `int8(field)` — PostgreSQL bigint storage codec using the supplied field schema.
894
918
  - `@shivaedev/sql/int4Array.ts`: `int4Array(field)` — PostgreSQL integer-array storage codec, including typed empty arrays.
919
+ - `@shivaedev/sql/compositeRecordKey.ts`: `compositeRecordKey(model, { tableName, idColumn }, value)` — Encodes decoded composite key fields into the published record key.
895
920
  - `@shivaedev/sql/repository.ts`: `makeRepository(model, options)` — `tableName`, scalar or composite `idColumn`, `spanPrefix`, optional `versionColumn`, `conflictColumns` and `conflictWhere`, and `collection` required for bucket models; requires native `SqlClient`.
896
921
  - `@shivaedev/sql/repository.ts`: `OptimisticConcurrencyError` — Typed stale or missing-row failure for versioned writes, with `tableName`, `id`, `expectedVersion`, `reason: "missing" | "stale"`.
897
922
  - `@shivaedev/sql/tupleIn.ts`: `tupleIn(model, fields, tuples, types)` — Filter entry matching two or more fields together against a list of tuples, for `where` in reads and unversioned deletes.
@@ -0,0 +1,8 @@
1
+ import { Effect, Schema } from "effect";
2
+ import type { Model } from "effect/schema";
3
+ import type { CompositeKey } from "#compositeRepository.ts";
4
+ export declare function compositeRecordKey<TModel extends Model.Any, const TColumns extends CompositeKey<TModel>>(model: TModel, options: {
5
+ readonly tableName: string;
6
+ readonly idColumn: TColumns;
7
+ }, value: Pick<Schema.Struct.Type<TModel["fields"]>, TColumns[number]>): Effect.Effect<string, Schema.SchemaError, TModel["fields"][TColumns[number]]["EncodingServices"]>;
8
+ //# sourceMappingURL=compositeRecordKey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compositeRecordKey.d.ts","sourceRoot":"","sources":["../src/compositeRecordKey.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D,wBAAgB,kBAAkB,CAAC,MAAM,SAAS,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,SAAS,YAAY,CAAC,MAAM,CAAC,EACvG,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;IAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,EACpE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,GACjE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import * as PgTypes from "@effect/sql-pg/PgTypes";
2
+ import { Effect, Schema } from "effect";
3
+ import { compositeId, recordKey } from "@shivaedev/changes/keys.ts";
4
+ export function compositeRecordKey(model, options, value) {
5
+ return Effect.fn("Sql.compositeRecordKey")(function* () {
6
+ const fields = Object.fromEntries(Object.entries(model.fields).filter(([column]) => options.idColumn.includes(column)));
7
+ const encoded = yield* Schema.encodeUnknownEffect(Schema.Struct(fields))(value);
8
+ const values = options.idColumn.map((column) => {
9
+ const stored = encoded[column];
10
+ return PgTypes.isParameter(stored) ? stored.value : stored;
11
+ });
12
+ return recordKey(options.tableName, compositeId(values));
13
+ })();
14
+ }
15
+ //# sourceMappingURL=compositeRecordKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compositeRecordKey.js","sourceRoot":"","sources":["../src/compositeRecordKey.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAExC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAQpE,MAAM,UAAU,kBAAkB,CACjC,KAAgB,EAChB,OAA6E,EAC7E,KAAwC;IAExC,OAAO,MAAM,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAC,QAAQ,CAAC;QACnD,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACxH,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAChF,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;YAC/B,OAAO,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAC5D,CAAC,CAAC,CAAC;QACH,OAAO,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,EAAE,CAAC;AACN,CAAC"}
@@ -22,6 +22,7 @@ export interface FindMany<TModel extends Model.Any, TKey extends Key<TModel>> {
22
22
  readonly select?: readonly [TKey, ...TKey[]];
23
23
  readonly where?: FindManyFilter<TModel>;
24
24
  }
25
+ export type FindOne<TModel extends Model.Any, TKey extends Key<TModel>> = Omit<FindMany<TModel, TKey>, "limit">;
25
26
  export interface LatestPerGroup<TModel extends Model.Any> {
26
27
  readonly limit: number;
27
28
  readonly orderBy: readonly [OrderBy<TModel>, ...OrderBy<TModel>[]];
@@ -1 +1 @@
1
- {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../src/repository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../src/repository.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"repository.js","sourceRoot":"","sources":["../src/repository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../src/repository.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,10 @@
1
- import { Effect, Schema } from "effect";
1
+ import { Effect, type Option, Schema } from "effect";
2
2
  import type { Model } from "effect/schema";
3
3
  import { 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 { Aggregate } from "#aggregateQuery.ts";
7
- import type { FindMany, LatestPerGroup } from "#repository.ts";
7
+ import type { FindMany, FindOne, LatestPerGroup } from "#repository.ts";
8
8
  type Key<TModel extends Model.Any> = Extract<keyof TModel["fields"] & keyof Row<TModel>, string>;
9
9
  type Row<TModel extends Model.Any> = Schema.Struct.Type<TModel["fields"]>;
10
10
  export interface RepositorySelect<TFields extends Schema.Struct.Fields, TServices = never> {
@@ -15,6 +15,7 @@ export interface Queries<TModel extends Model.Any> {
15
15
  aggregate: Aggregate<TModel>;
16
16
  count: (query?: Pick<FindMany<TModel, Key<TModel>>, "where">) => Effect.Effect<number, SqlError | Schema.SchemaError, TModel["fields"][Key<TModel>]["EncodingServices"]>;
17
17
  findMany: <TKey extends Key<TModel> = Key<TModel>>(query?: FindMany<TModel, TKey>) => Effect.Effect<Pick<Row<TModel>, TKey>[], SqlError | Schema.SchemaError, TModel["fields"][Key<TModel>]["EncodingServices"] | TModel["fields"][TKey]["DecodingServices"]>;
18
+ findOne: <TKey extends Key<TModel> = Key<TModel>>(query?: FindOne<TModel, TKey>) => Effect.Effect<Option.Option<Pick<Row<TModel>, TKey>>, SqlError | Schema.SchemaError, TModel["fields"][Key<TModel>]["EncodingServices"] | TModel["fields"][TKey]["DecodingServices"]>;
18
19
  latestPerGroup: (query: LatestPerGroup<TModel>) => Effect.Effect<Row<TModel>[], SqlError | Schema.SchemaError, TModel["fields"][Key<TModel>]["EncodingServices"] | TModel["fields"][Key<TModel>]["DecodingServices"]>;
19
20
  select: <TKey extends Key<TModel> = Key<TModel>>(query?: FindMany<TModel, TKey>) => RepositorySelect<Pick<TModel["fields"], TKey>, TModel["fields"][Key<TModel>]["EncodingServices"]>;
20
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"repositoryQueries.d.ts","sourceRoot":"","sources":["../src/repositoryQueries.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repositoryQueries.d.ts","sourceRoot":"","sources":["../src/repositoryQueries.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { Effect, Schema } from "effect";
1
+ import { Array as Arr, Effect, Schema } from "effect";
2
2
  import { SqlClient } from "effect/sql";
3
3
  import { groupColumns } from "#adapters/groupColumns.ts";
4
4
  import { storageSchema } from "#adapters/storageSchema.ts";
@@ -51,7 +51,8 @@ export function makeQueries(model, options) {
51
51
  return yield* readLatest(query, order, rowLimit);
52
52
  }).pipe(Effect.withSpan(`${options.spanPrefix}.latestPerGroup`));
53
53
  }
54
- return { aggregate, count, findMany, latestPerGroup, select };
54
+ const findOne = (query = {}) => findMany({ ...query, limit: 1 }).pipe(Effect.map(Arr.head), Effect.withSpan(`${options.spanPrefix}.findOne`));
55
+ return { aggregate, count, findMany, findOne, latestPerGroup, select };
55
56
  })();
56
57
  }
57
58
  //# sourceMappingURL=repositoryQueries.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"repositoryQueries.js","sourceRoot":"","sources":["../src/repositoryQueries.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repositoryQueries.js","sourceRoot":"","sources":["../src/repositoryQueries.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.38.0",
3
+ "version": "0.39.0",
4
4
  "description": "Schema-derived repositories over native Effect SQL",
5
5
  "keywords": [
6
6
  "effect"
@@ -43,27 +43,27 @@
43
43
  "README.md"
44
44
  ],
45
45
  "dependencies": {
46
- "@shivaedev/changes": "0.10.0",
47
- "@shivaedev/service": "0.7.0"
46
+ "@shivaedev/changes": "0.10.1",
47
+ "@shivaedev/service": "0.7.1"
48
48
  },
49
49
  "devDependencies": {
50
- "@effect/platform-node": "4.0.6",
51
- "@effect/sql-pg": "4.0.6",
52
- "@effect/sql-sqlite-node": "4.0.6",
53
- "@shivaedev/contract": "0.36.0",
54
- "@shivaedev/jobs": "0.35.1",
55
- "@shivaedev/quality": "0.61.0",
56
- "@shivaedev/test-kits": "0.3.1",
57
- "@shivaedev/test-sql": "0.21.0",
58
- "@shivaedev/test-story": "0.39.0",
50
+ "@effect/platform-node": "4.0.7",
51
+ "@effect/sql-pg": "4.0.7",
52
+ "@effect/sql-sqlite-node": "4.0.7",
53
+ "@shivaedev/contract": "0.36.1",
54
+ "@shivaedev/jobs": "0.36.0",
55
+ "@shivaedev/quality": "0.61.1",
56
+ "@shivaedev/test-kits": "0.4.0",
57
+ "@shivaedev/test-sql": "0.21.1",
58
+ "@shivaedev/test-story": "0.39.1",
59
59
  "@types/node": "24.19.2",
60
- "effect": "4.0.6",
60
+ "effect": "4.0.7",
61
61
  "typescript": "7.0.2",
62
62
  "vitest": "5.0.5"
63
63
  },
64
64
  "peerDependencies": {
65
- "@effect/sql-pg": "4.0.6",
66
- "effect": "4.0.6"
65
+ "@effect/sql-pg": "4.0.7",
66
+ "effect": "4.0.7"
67
67
  },
68
68
  "peerDependenciesMeta": {
69
69
  "@effect/sql-pg": {
@@ -0,0 +1,26 @@
1
+ import * as PgTypes from "@effect/sql-pg/PgTypes";
2
+ import { Effect, Schema } from "effect";
3
+ import type { Model } from "effect/schema";
4
+ import { compositeId, recordKey } from "@shivaedev/changes/keys.ts";
5
+ import type { CompositeKey } from "#compositeRepository.ts";
6
+
7
+ export function compositeRecordKey<TModel extends Model.Any, const TColumns extends CompositeKey<TModel>>(
8
+ model: TModel,
9
+ options: { readonly tableName: string; readonly idColumn: TColumns },
10
+ value: Pick<Schema.Struct.Type<TModel["fields"]>, TColumns[number]>,
11
+ ): Effect.Effect<string, Schema.SchemaError, TModel["fields"][TColumns[number]]["EncodingServices"]>;
12
+ export function compositeRecordKey(
13
+ model: Model.Any,
14
+ options: { readonly tableName: string; readonly idColumn: readonly string[] },
15
+ value: Readonly<Record<string, unknown>>,
16
+ ): Effect.Effect<string, Schema.SchemaError, unknown> {
17
+ return Effect.fn("Sql.compositeRecordKey")(function* () {
18
+ const fields = Object.fromEntries(Object.entries(model.fields).filter(([column]) => options.idColumn.includes(column)));
19
+ const encoded = yield* Schema.encodeUnknownEffect(Schema.Struct(fields))(value);
20
+ const values = options.idColumn.map((column) => {
21
+ const stored = encoded[column];
22
+ return PgTypes.isParameter(stored) ? stored.value : stored;
23
+ });
24
+ return recordKey(options.tableName, compositeId(values));
25
+ })();
26
+ }
package/src/repository.ts CHANGED
@@ -28,6 +28,8 @@ export interface FindMany<TModel extends Model.Any, TKey extends Key<TModel>> {
28
28
  readonly where?: FindManyFilter<TModel>;
29
29
  }
30
30
 
31
+ export type FindOne<TModel extends Model.Any, TKey extends Key<TModel>> = Omit<FindMany<TModel, TKey>, "limit">;
32
+
31
33
  export interface LatestPerGroup<TModel extends Model.Any> {
32
34
  readonly limit: number;
33
35
  readonly orderBy: readonly [OrderBy<TModel>, ...OrderBy<TModel>[]];
@@ -1,4 +1,4 @@
1
- import { Effect, Schema } from "effect";
1
+ import { Array as Arr, Effect, type Option, Schema } from "effect";
2
2
  import type { Model } from "effect/schema";
3
3
  import { SqlClient } from "effect/sql";
4
4
  import type { SqlError } from "effect/sql/SqlError";
@@ -9,7 +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 { FindMany, LatestPerGroup } from "#repository.ts";
12
+ import type { FindMany, FindOne, LatestPerGroup } from "#repository.ts";
13
13
  import { makeFilter } from "#repositoryFilter.ts";
14
14
  import { sqlNameTransforms } from "#sqlNameTransforms.ts";
15
15
 
@@ -35,6 +35,13 @@ export interface Queries<TModel extends Model.Any> {
35
35
  SqlError | Schema.SchemaError,
36
36
  TModel["fields"][Key<TModel>]["EncodingServices"] | TModel["fields"][TKey]["DecodingServices"]
37
37
  >;
38
+ findOne: <TKey extends Key<TModel> = Key<TModel>>(
39
+ query?: FindOne<TModel, TKey>,
40
+ ) => Effect.Effect<
41
+ Option.Option<Pick<Row<TModel>, TKey>>,
42
+ SqlError | Schema.SchemaError,
43
+ TModel["fields"][Key<TModel>]["EncodingServices"] | TModel["fields"][TKey]["DecodingServices"]
44
+ >;
38
45
  latestPerGroup: (
39
46
  query: LatestPerGroup<TModel>,
40
47
  ) => Effect.Effect<
@@ -108,6 +115,8 @@ export function makeQueries<TModel extends Model.Any>(
108
115
  return yield* readLatest(query, order, rowLimit);
109
116
  }).pipe(Effect.withSpan(`${options.spanPrefix}.latestPerGroup`));
110
117
  }
111
- return { aggregate, count, findMany, latestPerGroup, select };
118
+ const findOne: Queries<TModel>["findOne"] = (query = {}) =>
119
+ findMany({ ...query, limit: 1 }).pipe(Effect.map(Arr.head), Effect.withSpan(`${options.spanPrefix}.findOne`));
120
+ return { aggregate, count, findMany, findOne, latestPerGroup, select };
112
121
  })();
113
122
  }