@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.
- package/CHANGELOG.md +34 -23
- package/dist/ActionCtx.d.ts +3 -2
- package/dist/ActionCtx.d.ts.map +1 -1
- package/dist/ActionCtx.js.map +1 -1
- package/dist/DatabaseReader.d.ts +18 -4324
- package/dist/DatabaseReader.d.ts.map +1 -1
- package/dist/DatabaseReader.js.map +1 -1
- package/dist/DatabaseWriter.d.ts +25 -33
- package/dist/DatabaseWriter.d.ts.map +1 -1
- package/dist/DatabaseWriter.js.map +1 -1
- package/dist/Document.d.ts +2 -0
- package/dist/Document.d.ts.map +1 -1
- package/dist/Document.js.map +1 -1
- package/dist/MutationCtx.d.ts +3 -2
- package/dist/MutationCtx.d.ts.map +1 -1
- package/dist/MutationCtx.js.map +1 -1
- package/dist/OrderedQuery.d.ts +6 -6
- package/dist/OrderedQuery.d.ts.map +1 -1
- package/dist/OrderedQuery.js.map +1 -1
- package/dist/QueryCtx.d.ts +3 -2
- package/dist/QueryCtx.d.ts.map +1 -1
- package/dist/QueryCtx.js.map +1 -1
- package/dist/QueryInitializer.d.ts +8 -8
- package/dist/QueryInitializer.d.ts.map +1 -1
- package/dist/QueryInitializer.js +2 -2
- package/dist/QueryInitializer.js.map +1 -1
- package/dist/RegisteredConvexFunction.d.ts +1 -1089
- package/dist/RegisteredConvexFunction.d.ts.map +1 -1
- package/dist/RegisteredFunction.d.ts +1 -8
- package/dist/RegisteredFunction.d.ts.map +1 -1
- package/dist/VectorSearch.d.ts +15 -28
- package/dist/VectorSearch.d.ts.map +1 -1
- package/dist/VectorSearch.js.map +1 -1
- package/dist/tsconfig.src.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/ActionCtx.ts +10 -4
- package/src/DatabaseReader.ts +58 -13
- package/src/DatabaseWriter.ts +70 -7
- package/src/Document.ts +6 -0
- package/src/MutationCtx.ts +10 -4
- package/src/OrderedQuery.ts +6 -14
- package/src/QueryCtx.ts +10 -4
- package/src/QueryInitializer.ts +26 -28
- 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
|
|
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
|
|
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
|
|
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> =
|
|
8
|
-
|
|
9
|
-
>["Identifier"];
|
|
14
|
+
export type ActionCtx<DataModel extends GenericDataModel> =
|
|
15
|
+
GenericActionCtx<DataModel>;
|
package/src/DatabaseReader.ts
CHANGED
|
@@ -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: <
|
|
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
|
|
69
|
+
) as Table.WithName<IncludedTables<DatabaseSchema_>, TableName>;
|
|
42
70
|
|
|
43
|
-
return QueryInitializer.make<IncludedTables
|
|
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
|
-
|
|
56
|
-
|
|
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
|
-
> =
|
|
106
|
+
> = DatabaseReaderService<DatabaseSchema_>;
|
|
62
107
|
|
|
63
108
|
export const layer = <DatabaseSchema_ extends DatabaseSchema.AnyWithProps>(
|
|
64
109
|
databaseSchema: DatabaseSchema_,
|
package/src/DatabaseWriter.ts
CHANGED
|
@@ -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
|
-
|
|
146
|
-
|
|
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
|
-
> =
|
|
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;
|
package/src/MutationCtx.ts
CHANGED
|
@@ -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
|
|
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> =
|
|
10
|
-
|
|
11
|
-
>["Identifier"];
|
|
16
|
+
export type MutationCtx<DataModel extends GenericDataModel> =
|
|
17
|
+
GenericMutationCtx<DataModel>;
|
package/src/OrderedQuery.ts
CHANGED
|
@@ -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<
|
|
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<
|
|
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
|
|
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> =
|
|
8
|
-
|
|
9
|
-
>["Identifier"];
|
|
14
|
+
export type QueryCtx<DataModel extends GenericDataModel> =
|
|
15
|
+
GenericQueryCtx<DataModel>;
|
package/src/QueryInitializer.ts
CHANGED
|
@@ -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
|
-
|
|
34
|
+
export interface QueryInitializer<
|
|
35
35
|
DataModel_ extends DataModel.AnyWithProps,
|
|
36
36
|
TableName extends DataModel.TableNames<DataModel_>,
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
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<
|
|
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<
|
|
55
|
+
<IndexName extends keyof Indexes<ConvexTableInfo_>>(
|
|
61
56
|
indexName: IndexName,
|
|
62
57
|
indexRange?: (
|
|
63
58
|
q: IndexRangeBuilder<
|
|
64
|
-
|
|
65
|
-
NamedIndex<
|
|
59
|
+
TableInfo_["convexDocument"],
|
|
60
|
+
NamedIndex<ConvexTableInfo_, IndexName>
|
|
66
61
|
>,
|
|
67
62
|
) => IndexRange,
|
|
68
63
|
order?: "asc" | "desc",
|
|
69
|
-
): OrderedQuery.OrderedQuery<
|
|
70
|
-
<IndexName extends keyof Indexes<
|
|
64
|
+
): OrderedQuery.OrderedQuery<TableInfo_, TableName, Doc>;
|
|
65
|
+
<IndexName extends keyof Indexes<ConvexTableInfo_>>(
|
|
71
66
|
indexName: IndexName,
|
|
72
67
|
order?: "asc" | "desc",
|
|
73
|
-
): OrderedQuery.OrderedQuery<
|
|
68
|
+
): OrderedQuery.OrderedQuery<TableInfo_, TableName, Doc>;
|
|
74
69
|
};
|
|
75
|
-
readonly search: <IndexName extends keyof SearchIndexes<
|
|
70
|
+
readonly search: <IndexName extends keyof SearchIndexes<ConvexTableInfo_>>(
|
|
76
71
|
indexName: IndexName,
|
|
77
72
|
searchFilter: (
|
|
78
73
|
q: SearchFilterBuilder<
|
|
79
|
-
DocumentByInfo<
|
|
80
|
-
NamedSearchIndex<
|
|
74
|
+
DocumentByInfo<ConvexTableInfo_>,
|
|
75
|
+
NamedSearchIndex<ConvexTableInfo_, IndexName>
|
|
81
76
|
>,
|
|
82
77
|
) => SearchFilter,
|
|
83
|
-
) => OrderedQuery.OrderedQuery<
|
|
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
|
|
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.
|
|
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 '${
|
|
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
|
}
|
package/src/VectorSearch.ts
CHANGED
|
@@ -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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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 = <
|
|
39
|
-
|
|
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
|
-
|
|
59
|
+
VectorSearchService<DataModel_>;
|
|
45
60
|
|
|
46
61
|
export const layer = <DataModel_ extends DataModel.AnyWithProps>(
|
|
47
62
|
vectorSearch: ConvexVectorSearch<DataModel_>,
|