@confect/server 9.0.1 → 9.1.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 (44) hide show
  1. package/CHANGELOG.md +34 -23
  2. package/dist/ActionCtx.d.ts +3 -2
  3. package/dist/ActionCtx.d.ts.map +1 -1
  4. package/dist/ActionCtx.js.map +1 -1
  5. package/dist/DatabaseReader.d.ts +18 -4324
  6. package/dist/DatabaseReader.d.ts.map +1 -1
  7. package/dist/DatabaseReader.js.map +1 -1
  8. package/dist/DatabaseWriter.d.ts +25 -33
  9. package/dist/DatabaseWriter.d.ts.map +1 -1
  10. package/dist/DatabaseWriter.js.map +1 -1
  11. package/dist/Document.d.ts +2 -0
  12. package/dist/Document.d.ts.map +1 -1
  13. package/dist/Document.js.map +1 -1
  14. package/dist/MutationCtx.d.ts +3 -2
  15. package/dist/MutationCtx.d.ts.map +1 -1
  16. package/dist/MutationCtx.js.map +1 -1
  17. package/dist/OrderedQuery.d.ts +6 -6
  18. package/dist/OrderedQuery.d.ts.map +1 -1
  19. package/dist/OrderedQuery.js.map +1 -1
  20. package/dist/QueryCtx.d.ts +3 -2
  21. package/dist/QueryCtx.d.ts.map +1 -1
  22. package/dist/QueryCtx.js.map +1 -1
  23. package/dist/QueryInitializer.d.ts +8 -8
  24. package/dist/QueryInitializer.d.ts.map +1 -1
  25. package/dist/QueryInitializer.js +2 -2
  26. package/dist/QueryInitializer.js.map +1 -1
  27. package/dist/RegisteredConvexFunction.d.ts +1 -1089
  28. package/dist/RegisteredConvexFunction.d.ts.map +1 -1
  29. package/dist/RegisteredFunction.d.ts +1 -8
  30. package/dist/RegisteredFunction.d.ts.map +1 -1
  31. package/dist/VectorSearch.d.ts +15 -28
  32. package/dist/VectorSearch.d.ts.map +1 -1
  33. package/dist/VectorSearch.js.map +1 -1
  34. package/dist/tsconfig.src.tsbuildinfo +1 -1
  35. package/package.json +2 -2
  36. package/src/ActionCtx.ts +10 -4
  37. package/src/DatabaseReader.ts +58 -13
  38. package/src/DatabaseWriter.ts +70 -7
  39. package/src/Document.ts +6 -0
  40. package/src/MutationCtx.ts +10 -4
  41. package/src/OrderedQuery.ts +6 -14
  42. package/src/QueryCtx.ts +10 -4
  43. package/src/QueryInitializer.ts +26 -28
  44. package/src/VectorSearch.ts +23 -8
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@confect/server",
3
3
  "description": "Backend bindings to the Convex platform",
4
- "version": "9.0.1",
4
+ "version": "9.1.0",
5
5
  "author": "RJ Dellecese",
6
6
  "bugs": {
7
7
  "url": "https://github.com/rjdellecese/confect/issues"
@@ -68,7 +68,7 @@
68
68
  "@effect/platform-node": "^0.106.0",
69
69
  "convex": "^1.32.0",
70
70
  "effect": "^3.21.2",
71
- "@confect/core": "^9.0.1"
71
+ "@confect/core": "^9.1.0"
72
72
  },
73
73
  "peerDependenciesMeta": {
74
74
  "@effect/platform-node": {
package/src/ActionCtx.ts CHANGED
@@ -1,9 +1,15 @@
1
1
  import type { GenericActionCtx, GenericDataModel } from "convex/server";
2
2
  import * as Context from "effect/Context";
3
3
 
4
- export const ActionCtx = <DataModel extends GenericDataModel>() =>
4
+ export type ActionCtxTag<DataModel extends GenericDataModel> = Context.Tag<
5
+ GenericActionCtx<DataModel>,
6
+ GenericActionCtx<DataModel>
7
+ >;
8
+
9
+ export const ActionCtx = <
10
+ DataModel extends GenericDataModel,
11
+ >(): ActionCtxTag<DataModel> =>
5
12
  Context.GenericTag<GenericActionCtx<DataModel>>("@confect/server/ActionCtx");
6
13
 
7
- export type ActionCtx<DataModel extends GenericDataModel> = ReturnType<
8
- typeof ActionCtx<DataModel>
9
- >["Identifier"];
14
+ export type ActionCtx<DataModel extends GenericDataModel> =
15
+ GenericActionCtx<DataModel>;
@@ -7,17 +7,45 @@ import type * as DataModel from "./DataModel";
7
7
  import * as QueryInitializer from "./QueryInitializer";
8
8
  import * as Table from "./Table";
9
9
 
10
+ type IncludedTables<DatabaseSchema_ extends DatabaseSchema.AnyWithProps> =
11
+ | DatabaseSchema.Tables<DatabaseSchema_>
12
+ | Table.SystemTables;
13
+
14
+ type IncludedDataModel<DatabaseSchema_ extends DatabaseSchema.AnyWithProps> =
15
+ DataModel.DataModel<IncludedTables<DatabaseSchema_>>;
16
+
17
+ export interface DatabaseReaderService<
18
+ DatabaseSchema_ extends DatabaseSchema.AnyWithProps,
19
+ Docs = {},
20
+ > {
21
+ readonly table: <
22
+ const TableName extends Table.Name<IncludedTables<DatabaseSchema_>>,
23
+ >(
24
+ tableName: TableName,
25
+ ) => QueryInitializer.QueryInitializer<
26
+ IncludedDataModel<DatabaseSchema_>,
27
+ TableName,
28
+ DataModel.TableInfoWithName<IncludedDataModel<DatabaseSchema_>, TableName>,
29
+ DataModel.TableInfoWithName_<IncludedDataModel<DatabaseSchema_>, TableName>,
30
+ TableName extends keyof Docs
31
+ ? Docs[TableName]
32
+ : DataModel.DocumentWithName<
33
+ IncludedDataModel<DatabaseSchema_>,
34
+ TableName
35
+ >
36
+ >;
37
+ }
38
+
10
39
  export const make = <DatabaseSchema_ extends DatabaseSchema.AnyWithProps>(
11
40
  databaseSchema: DatabaseSchema_,
12
41
  convexDatabaseReader: GenericDatabaseReader<
13
42
  DataModel.ToConvex<DataModel.FromSchema<DatabaseSchema_>>
14
43
  >,
15
- ) => {
16
- type Tables = DatabaseSchema.Tables<DatabaseSchema_>;
17
- type IncludedTables = Tables | Table.SystemTables;
18
-
44
+ ): DatabaseReaderService<DatabaseSchema_> => {
19
45
  return {
20
- table: <const TableName extends Table.Name<IncludedTables>>(
46
+ table: <
47
+ const TableName extends Table.Name<IncludedTables<DatabaseSchema_>>,
48
+ >(
21
49
  tableName: TableName,
22
50
  ) => {
23
51
  const isSystem = Object.hasOwn(Table.systemTables, tableName);
@@ -38,27 +66,44 @@ export const make = <DatabaseSchema_ extends DatabaseSchema.AnyWithProps>(
38
66
  tableName
39
67
  ]
40
68
  : databaseSchema.tables[tableName]
41
- ) as Table.WithName<IncludedTables, TableName>;
69
+ ) as Table.WithName<IncludedTables<DatabaseSchema_>, TableName>;
42
70
 
43
- return QueryInitializer.make<IncludedTables, TableName>(
71
+ return QueryInitializer.make<IncludedTables<DatabaseSchema_>, TableName>(
44
72
  tableName,
45
73
  baseDatabaseReader,
46
74
  table,
47
75
  );
48
76
  },
49
- };
77
+ } as DatabaseReaderService<DatabaseSchema_>;
50
78
  };
51
79
 
80
+ /**
81
+ * The tag's *Identifier* (the Effect requirements-channel type) is
82
+ * `Docs`-independent so a helper's `R` channel is the same whether or not a
83
+ * codegen document registry is supplied — this keeps it identical to what
84
+ * `Handler`/runtime provisioning provide. The tag's *Service* (what `yield*`
85
+ * produces) carries `Docs`, so queries resolve to the named doc interfaces.
86
+ */
87
+ export type DatabaseReaderTag<
88
+ DatabaseSchema_ extends DatabaseSchema.AnyWithProps,
89
+ Docs = {},
90
+ > = Context.Tag<
91
+ DatabaseReaderService<DatabaseSchema_>,
92
+ DatabaseReaderService<DatabaseSchema_, Docs>
93
+ >;
94
+
52
95
  export const DatabaseReader = <
53
96
  DatabaseSchema_ extends DatabaseSchema.AnyWithProps,
54
- >() =>
55
- Context.GenericTag<ReturnType<typeof make<DatabaseSchema_>>>(
56
- "@confect/server/DatabaseReader",
57
- );
97
+ Docs = {},
98
+ >(): DatabaseReaderTag<DatabaseSchema_, Docs> =>
99
+ Context.GenericTag<
100
+ DatabaseReaderService<DatabaseSchema_>,
101
+ DatabaseReaderService<DatabaseSchema_, Docs>
102
+ >("@confect/server/DatabaseReader");
58
103
 
59
104
  export type DatabaseReader<
60
105
  DatabaseSchema_ extends DatabaseSchema.AnyWithProps,
61
- > = ReturnType<typeof DatabaseReader<DatabaseSchema_>>["Identifier"];
106
+ > = DatabaseReaderService<DatabaseSchema_>;
62
107
 
63
108
  export const layer = <DatabaseSchema_ extends DatabaseSchema.AnyWithProps>(
64
109
  databaseSchema: DatabaseSchema_,
@@ -19,12 +19,73 @@ import * as QueryInitializer from "./QueryInitializer";
19
19
  import type * as Table from "./Table";
20
20
  import type * as TableInfo from "./TableInfo";
21
21
 
22
+ export interface DatabaseWriterTableAccessor<
23
+ DataModel_ extends DataModel.AnyWithProps,
24
+ TableName extends DataModel.TableNames<DataModel_>,
25
+ Doc = DocumentByName_<DataModel_, TableName>,
26
+ > {
27
+ readonly insert: (
28
+ document: Document.WithoutSystemFields<Doc>,
29
+ ) => Effect.Effect<GenericId<TableName>, Document.DocumentEncodeError>;
30
+ readonly patch: (
31
+ id: GenericId<TableName>,
32
+ patchedValues: Partial<Document.WithoutSystemFields<Doc>>,
33
+ ) => Effect.Effect<
34
+ void,
35
+ | QueryInitializer.GetByIdFailure
36
+ | Document.DocumentDecodeError
37
+ | Document.DocumentEncodeError
38
+ >;
39
+ readonly replace: (
40
+ id: GenericId<TableName>,
41
+ value: Document.WithoutSystemFields<Doc>,
42
+ ) => Effect.Effect<void, Document.DocumentEncodeError>;
43
+ readonly delete: (id: GenericId<TableName>) => Effect.Effect<void>;
44
+ }
45
+
46
+ /**
47
+ * The service shape backing the `DatabaseWriter` tag. Named (rather than an
48
+ * inferred anonymous object) so declaration emit prints
49
+ * `DatabaseWriterService<…>` by reference instead of expanding the data model.
50
+ * `Docs` is the optional named document registry (see `DatabaseReaderService`).
51
+ */
52
+ export interface DatabaseWriterService<
53
+ DatabaseSchema_ extends DatabaseSchema.AnyWithProps,
54
+ Docs = {},
55
+ > {
56
+ readonly table: <
57
+ const TableName extends DataModel.TableNames<
58
+ DataModel.FromSchema<DatabaseSchema_>
59
+ >,
60
+ >(
61
+ tableName: TableName,
62
+ ) => DatabaseWriterTableAccessor<
63
+ DataModel.FromSchema<DatabaseSchema_>,
64
+ TableName,
65
+ TableName extends keyof Docs
66
+ ? Docs[TableName]
67
+ : DocumentByName_<DataModel.FromSchema<DatabaseSchema_>, TableName>
68
+ >;
69
+ }
70
+
71
+ /**
72
+ * The tag's *Identifier* is `Docs`-independent (see `DatabaseReaderTag`); only
73
+ * the *Service* carries `Docs` so writer inputs print the named doc interfaces.
74
+ */
75
+ export type DatabaseWriterTag<
76
+ DatabaseSchema_ extends DatabaseSchema.AnyWithProps,
77
+ Docs = {},
78
+ > = Context.Tag<
79
+ DatabaseWriterService<DatabaseSchema_>,
80
+ DatabaseWriterService<DatabaseSchema_, Docs>
81
+ >;
82
+
22
83
  export const make = <DatabaseSchema_ extends DatabaseSchema.AnyWithProps>(
23
84
  databaseSchema: DatabaseSchema_,
24
85
  convexDatabaseWriter: GenericDatabaseWriter<
25
86
  DataModel.ToConvex<DataModel.FromSchema<DatabaseSchema_>>
26
87
  >,
27
- ) => {
88
+ ): DatabaseWriterService<DatabaseSchema_> => {
28
89
  type DataModel_ = DataModel.FromSchema<DatabaseSchema_>;
29
90
 
30
91
  const table = <const TableName extends DataModel.TableNames<DataModel_>>(
@@ -136,19 +197,21 @@ export const make = <DatabaseSchema_ extends DatabaseSchema.AnyWithProps>(
136
197
 
137
198
  return {
138
199
  table,
139
- };
200
+ } as DatabaseWriterService<DatabaseSchema_>;
140
201
  };
141
202
 
142
203
  export const DatabaseWriter = <
143
204
  DatabaseSchema_ extends DatabaseSchema.AnyWithProps,
144
- >() =>
145
- Context.GenericTag<ReturnType<typeof make<DatabaseSchema_>>>(
146
- "@confect/server/DatabaseWriter",
147
- );
205
+ Docs = {},
206
+ >(): DatabaseWriterTag<DatabaseSchema_, Docs> =>
207
+ Context.GenericTag<
208
+ DatabaseWriterService<DatabaseSchema_>,
209
+ DatabaseWriterService<DatabaseSchema_, Docs>
210
+ >("@confect/server/DatabaseWriter");
148
211
 
149
212
  export type DatabaseWriter<
150
213
  DatabaseSchema_ extends DatabaseSchema.AnyWithProps,
151
- > = ReturnType<typeof DatabaseWriter<DatabaseSchema_>>["Identifier"];
214
+ > = DatabaseWriterService<DatabaseSchema_>;
152
215
 
153
216
  export const layer = <DatabaseSchema_ extends DatabaseSchema.AnyWithProps>(
154
217
  databaseSchema: DatabaseSchema_,
package/src/Document.ts CHANGED
@@ -5,10 +5,16 @@ import * as Function from "effect/Function";
5
5
  import * as ParseResult from "effect/ParseResult";
6
6
  import * as Schema from "effect/Schema";
7
7
  import type { ReadonlyRecord } from "effect/Record";
8
+ import type * as DatabaseSchema from "./DatabaseSchema";
8
9
  import type * as DataModel from "./DataModel";
9
10
  import type { ReadonlyValue } from "./SchemaToValidator";
10
11
  import type * as TableInfo from "./TableInfo";
11
12
 
13
+ export type Document<
14
+ Schema_ extends DatabaseSchema.AnyWithProps,
15
+ TableName extends DatabaseSchema.TableNames<Schema_>,
16
+ > = DataModel.DocumentByName<DataModel.FromSchema<Schema_>, TableName>;
17
+
12
18
  export type WithoutSystemFields<Doc> = Omit<Doc, "_creationTime" | "_id">;
13
19
 
14
20
  export type Any = any;
@@ -1,11 +1,17 @@
1
1
  import type { GenericDataModel, GenericMutationCtx } from "convex/server";
2
2
  import * as Context from "effect/Context";
3
3
 
4
- export const MutationCtx = <DataModel extends GenericDataModel>() =>
4
+ export type MutationCtxTag<DataModel extends GenericDataModel> = Context.Tag<
5
+ GenericMutationCtx<DataModel>,
6
+ GenericMutationCtx<DataModel>
7
+ >;
8
+
9
+ export const MutationCtx = <
10
+ DataModel extends GenericDataModel,
11
+ >(): MutationCtxTag<DataModel> =>
5
12
  Context.GenericTag<GenericMutationCtx<DataModel>>(
6
13
  "@confect/server/MutationCtx",
7
14
  );
8
15
 
9
- export type MutationCtx<DataModel extends GenericDataModel> = ReturnType<
10
- typeof MutationCtx<DataModel>
11
- >["Identifier"];
16
+ export type MutationCtx<DataModel extends GenericDataModel> =
17
+ GenericMutationCtx<DataModel>;
@@ -15,25 +15,20 @@ import type * as TableInfo from "./TableInfo";
15
15
  export type OrderedQuery<
16
16
  TableInfo_ extends TableInfo.AnyWithProps,
17
17
  _TableName extends string,
18
+ Doc = TableInfo_["document"],
18
19
  > = {
19
20
  readonly first: () => Effect.Effect<
20
- Option.Option<TableInfo_["document"]>,
21
+ Option.Option<Doc>,
21
22
  Document.DocumentDecodeError
22
23
  >;
23
24
  readonly take: (
24
25
  n: number,
25
- ) => Effect.Effect<
26
- ReadonlyArray<TableInfo_["document"]>,
27
- Document.DocumentDecodeError
28
- >;
26
+ ) => Effect.Effect<ReadonlyArray<Doc>, Document.DocumentDecodeError>;
29
27
  readonly collect: () => Effect.Effect<
30
- ReadonlyArray<TableInfo_["document"]>,
31
- Document.DocumentDecodeError
32
- >;
33
- readonly stream: () => Stream.Stream<
34
- TableInfo_["document"],
28
+ ReadonlyArray<Doc>,
35
29
  Document.DocumentDecodeError
36
30
  >;
31
+ readonly stream: () => Stream.Stream<Doc, Document.DocumentDecodeError>;
37
32
  readonly paginate: (
38
33
  options: {
39
34
  cursor: string | null;
@@ -42,10 +37,7 @@ export type OrderedQuery<
42
37
  filter?: (
43
38
  q: FilterBuilder<TableInfo.ConvexTableInfo<TableInfo_>>,
44
39
  ) => ExpressionOrValue<boolean>,
45
- ) => Effect.Effect<
46
- PaginationResult<TableInfo_["document"]>,
47
- Document.DocumentDecodeError
48
- >;
40
+ ) => Effect.Effect<PaginationResult<Doc>, Document.DocumentDecodeError>;
49
41
  };
50
42
 
51
43
  export const make = <
package/src/QueryCtx.ts CHANGED
@@ -1,9 +1,15 @@
1
1
  import type { GenericDataModel, GenericQueryCtx } from "convex/server";
2
2
  import * as Context from "effect/Context";
3
3
 
4
- export const QueryCtx = <DataModel extends GenericDataModel>() =>
4
+ export type QueryCtxTag<DataModel extends GenericDataModel> = Context.Tag<
5
+ GenericQueryCtx<DataModel>,
6
+ GenericQueryCtx<DataModel>
7
+ >;
8
+
9
+ export const QueryCtx = <
10
+ DataModel extends GenericDataModel,
11
+ >(): QueryCtxTag<DataModel> =>
5
12
  Context.GenericTag<GenericQueryCtx<DataModel>>("@confect/server/QueryCtx");
6
13
 
7
- export type QueryCtx<DataModel extends GenericDataModel> = ReturnType<
8
- typeof QueryCtx<DataModel>
9
- >["Identifier"];
14
+ export type QueryCtx<DataModel extends GenericDataModel> =
15
+ GenericQueryCtx<DataModel>;
@@ -31,57 +31,52 @@ import * as OrderedQuery from "./OrderedQuery";
31
31
  import type * as Table from "./Table";
32
32
  import type * as TableInfo from "./TableInfo";
33
33
 
34
- type QueryInitializer<
34
+ export interface QueryInitializer<
35
35
  DataModel_ extends DataModel.AnyWithProps,
36
36
  TableName extends DataModel.TableNames<DataModel_>,
37
- _ConvexTableInfo extends GenericTableInfo,
38
- _TableInfo extends TableInfo.AnyWithProps,
39
- > = {
37
+ ConvexTableInfo_ extends GenericTableInfo,
38
+ TableInfo_ extends TableInfo.AnyWithProps,
39
+ Doc = TableInfo_["document"],
40
+ > {
40
41
  readonly get: {
41
42
  (
42
43
  id: GenericId<TableName>,
43
- ): Effect.Effect<
44
- _TableInfo["document"],
45
- Document.DocumentDecodeError | GetByIdFailure
46
- >;
47
- <IndexName extends keyof Indexes<_ConvexTableInfo>>(
44
+ ): Effect.Effect<Doc, Document.DocumentDecodeError | GetByIdFailure>;
45
+ <IndexName extends keyof Indexes<ConvexTableInfo_>>(
48
46
  indexName: IndexName,
49
47
  ...indexFieldValues: IndexFieldTypesForEq<
50
48
  DataModel.ToConvex<DataModel_>,
51
49
  TableName,
52
- Indexes<_ConvexTableInfo>[IndexName]
50
+ Indexes<ConvexTableInfo_>[IndexName]
53
51
  >
54
- ): Effect.Effect<
55
- _TableInfo["document"],
56
- Document.DocumentDecodeError | GetByIndexFailure
57
- >;
52
+ ): Effect.Effect<Doc, Document.DocumentDecodeError | GetByIndexFailure>;
58
53
  };
59
54
  readonly index: {
60
- <IndexName extends keyof Indexes<_ConvexTableInfo>>(
55
+ <IndexName extends keyof Indexes<ConvexTableInfo_>>(
61
56
  indexName: IndexName,
62
57
  indexRange?: (
63
58
  q: IndexRangeBuilder<
64
- _TableInfo["convexDocument"],
65
- NamedIndex<_ConvexTableInfo, IndexName>
59
+ TableInfo_["convexDocument"],
60
+ NamedIndex<ConvexTableInfo_, IndexName>
66
61
  >,
67
62
  ) => IndexRange,
68
63
  order?: "asc" | "desc",
69
- ): OrderedQuery.OrderedQuery<_TableInfo, TableName>;
70
- <IndexName extends keyof Indexes<_ConvexTableInfo>>(
64
+ ): OrderedQuery.OrderedQuery<TableInfo_, TableName, Doc>;
65
+ <IndexName extends keyof Indexes<ConvexTableInfo_>>(
71
66
  indexName: IndexName,
72
67
  order?: "asc" | "desc",
73
- ): OrderedQuery.OrderedQuery<_TableInfo, TableName>;
68
+ ): OrderedQuery.OrderedQuery<TableInfo_, TableName, Doc>;
74
69
  };
75
- readonly search: <IndexName extends keyof SearchIndexes<_ConvexTableInfo>>(
70
+ readonly search: <IndexName extends keyof SearchIndexes<ConvexTableInfo_>>(
76
71
  indexName: IndexName,
77
72
  searchFilter: (
78
73
  q: SearchFilterBuilder<
79
- DocumentByInfo<_ConvexTableInfo>,
80
- NamedSearchIndex<_ConvexTableInfo, IndexName>
74
+ DocumentByInfo<ConvexTableInfo_>,
75
+ NamedSearchIndex<ConvexTableInfo_, IndexName>
81
76
  >,
82
77
  ) => SearchFilter,
83
- ) => OrderedQuery.OrderedQuery<_TableInfo, TableName>;
84
- };
78
+ ) => OrderedQuery.OrderedQuery<TableInfo_, TableName, Doc>;
79
+ }
85
80
 
86
81
  export const make = <
87
82
  Tables extends Table.AnyWithProps,
@@ -148,7 +143,7 @@ export const make = <
148
143
  new GetByIndexFailure({
149
144
  tableName,
150
145
  indexName: indexName as string,
151
- indexFieldValues: indexFieldValues as string[],
146
+ indexFieldValues,
152
147
  }),
153
148
  ),
154
149
  ),
@@ -313,10 +308,13 @@ export class GetByIndexFailure extends Schema.TaggedError<GetByIndexFailure>()(
313
308
  {
314
309
  tableName: Schema.String,
315
310
  indexName: Schema.String,
316
- indexFieldValues: Schema.Array(Schema.String),
311
+ indexFieldValues: Schema.Array(Schema.Unknown),
317
312
  },
318
313
  ) {
319
314
  override get message(): string {
320
- return `No documents found in table '${this.tableName}' with index '${this.indexName}' and field values '${this.indexFieldValues}'`;
315
+ return `No documents found in table '${this.tableName}' with index '${this.indexName}' and field values '${JSON.stringify(
316
+ this.indexFieldValues,
317
+ (_key, value) => (typeof value === "bigint" ? value.toString() : value),
318
+ )}'`;
321
319
  }
322
320
  }
@@ -14,10 +14,13 @@ import type * as DataModel from "./DataModel";
14
14
  type ConvexVectorSearch<DataModel_ extends DataModel.AnyWithProps> =
15
15
  GenericActionCtx<DataModel.ToConvex<DataModel_>>["vectorSearch"];
16
16
 
17
- export const make =
18
- <DataModel_ extends DataModel.AnyWithProps>(
19
- vectorSearch: ConvexVectorSearch<DataModel_>,
20
- ) =>
17
+ /**
18
+ * The service shape backing the `VectorSearch` tag. Named so declaration emit
19
+ * references it instead of expanding the call signature at every usage.
20
+ */
21
+ export interface VectorSearchService<
22
+ DataModel_ extends DataModel.AnyWithProps,
23
+ > {
21
24
  <
22
25
  TableName extends DataModel.TableNames<DataModel_>,
23
26
  IndexName extends VectorIndexNames<
@@ -32,16 +35,28 @@ export const make =
32
35
  IndexName
33
36
  >
34
37
  >,
35
- ): Effect.Effect<Array<{ _id: GenericId<TableName>; _score: number }>> =>
38
+ ): Effect.Effect<Array<{ _id: GenericId<TableName>; _score: number }>>;
39
+ }
40
+
41
+ export type VectorSearchTag<DataModel_ extends DataModel.AnyWithProps> =
42
+ Context.Tag<VectorSearchService<DataModel_>, VectorSearchService<DataModel_>>;
43
+
44
+ export const make =
45
+ <DataModel_ extends DataModel.AnyWithProps>(
46
+ vectorSearch: ConvexVectorSearch<DataModel_>,
47
+ ): VectorSearchService<DataModel_> =>
48
+ (tableName, indexName, query) =>
36
49
  Effect.promise(() => vectorSearch(tableName, indexName, query));
37
50
 
38
- export const VectorSearch = <DataModel_ extends DataModel.AnyWithProps>() =>
39
- Context.GenericTag<ReturnType<typeof make<DataModel_>>>(
51
+ export const VectorSearch = <
52
+ DataModel_ extends DataModel.AnyWithProps,
53
+ >(): VectorSearchTag<DataModel_> =>
54
+ Context.GenericTag<VectorSearchService<DataModel_>>(
40
55
  "@confect/server/VectorSearch",
41
56
  );
42
57
 
43
58
  export type VectorSearch<DataModel_ extends DataModel.AnyWithProps> =
44
- ReturnType<typeof VectorSearch<DataModel_>>["Identifier"];
59
+ VectorSearchService<DataModel_>;
45
60
 
46
61
  export const layer = <DataModel_ extends DataModel.AnyWithProps>(
47
62
  vectorSearch: ConvexVectorSearch<DataModel_>,