@gaganref/confect-server 0.0.0-stage → 10.3.1-fork.2
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 +2119 -0
- package/LICENSE +7 -0
- package/README.md +16 -2
- package/dist/ActionCtx.d.ts +10 -0
- package/dist/ActionCtx.d.ts.map +1 -0
- package/dist/ActionCtx.js +18 -0
- package/dist/ActionCtx.js.map +1 -0
- package/dist/ActionRunner.d.ts +16 -0
- package/dist/ActionRunner.d.ts.map +1 -0
- package/dist/ActionRunner.js +18 -0
- package/dist/ActionRunner.js.map +1 -0
- package/dist/AiGatewayDecisionClient.d.ts +20 -0
- package/dist/AiGatewayDecisionClient.d.ts.map +1 -0
- package/dist/AiGatewayDecisionClient.js +31 -0
- package/dist/AiGatewayDecisionClient.js.map +1 -0
- package/dist/AiGatewayDecisionModel.d.ts +24 -0
- package/dist/AiGatewayDecisionModel.d.ts.map +1 -0
- package/dist/AiGatewayDecisionModel.js +27 -0
- package/dist/AiGatewayDecisionModel.js.map +1 -0
- package/dist/AiGatewayLanguageClient.d.ts +21 -0
- package/dist/AiGatewayLanguageClient.d.ts.map +1 -0
- package/dist/AiGatewayLanguageClient.js +32 -0
- package/dist/AiGatewayLanguageClient.js.map +1 -0
- package/dist/AiGatewayLanguageModel.d.ts +95 -0
- package/dist/AiGatewayLanguageModel.d.ts.map +1 -0
- package/dist/AiGatewayLanguageModel.js +42 -0
- package/dist/AiGatewayLanguageModel.js.map +1 -0
- package/dist/Auth.d.ts +20 -0
- package/dist/Auth.d.ts.map +1 -0
- package/dist/Auth.js +31 -0
- package/dist/Auth.js.map +1 -0
- package/dist/BlobNotFoundError.d.ts +9 -0
- package/dist/BlobNotFoundError.d.ts.map +1 -0
- package/dist/BlobNotFoundError.js +13 -0
- package/dist/BlobNotFoundError.js.map +1 -0
- package/dist/Callback.d.ts +31 -0
- package/dist/Callback.d.ts.map +1 -0
- package/dist/Callback.js +182 -0
- package/dist/Callback.js.map +1 -0
- package/dist/ComponentCtx.d.ts +71 -0
- package/dist/ComponentCtx.d.ts.map +1 -0
- package/dist/ComponentCtx.js +0 -0
- package/dist/ConvexConfigProvider.d.ts +21 -0
- package/dist/ConvexConfigProvider.d.ts.map +1 -0
- package/dist/ConvexConfigProvider.js +36 -0
- package/dist/ConvexConfigProvider.js.map +1 -0
- package/dist/ConvexFunctionDefinitions.d.ts +25 -0
- package/dist/ConvexFunctionDefinitions.d.ts.map +1 -0
- package/dist/ConvexFunctionDefinitions.js +25 -0
- package/dist/ConvexFunctionDefinitions.js.map +1 -0
- package/dist/ConvexLogger.d.ts +17 -0
- package/dist/ConvexLogger.d.ts.map +1 -0
- package/dist/ConvexLogger.js +33 -0
- package/dist/ConvexLogger.js.map +1 -0
- package/dist/CronJob.d.ts +14 -0
- package/dist/CronJob.d.ts.map +1 -0
- package/dist/CronJob.js +22 -0
- package/dist/CronJob.js.map +1 -0
- package/dist/CronJobs.d.ts +22 -0
- package/dist/CronJobs.d.ts.map +1 -0
- package/dist/CronJobs.js +83 -0
- package/dist/CronJobs.js.map +1 -0
- package/dist/DataModel.d.ts +28 -0
- package/dist/DataModel.d.ts.map +1 -0
- package/dist/DataModel.js +7 -0
- package/dist/DataModel.js.map +1 -0
- package/dist/DatabaseReader.d.ts +26 -0
- package/dist/DatabaseReader.d.ts.map +1 -0
- package/dist/DatabaseReader.js +33 -0
- package/dist/DatabaseReader.js.map +1 -0
- package/dist/DatabaseSchema.d.ts +67 -0
- package/dist/DatabaseSchema.d.ts.map +1 -0
- package/dist/DatabaseSchema.js +61 -0
- package/dist/DatabaseSchema.js.map +1 -0
- package/dist/DatabaseWriter.d.ts +44 -0
- package/dist/DatabaseWriter.d.ts.map +1 -0
- package/dist/DatabaseWriter.js +47 -0
- package/dist/DatabaseWriter.js.map +1 -0
- package/dist/Document.d.ts +37 -0
- package/dist/Document.d.ts.map +1 -0
- package/dist/Document.js +54 -0
- package/dist/Document.js.map +1 -0
- package/dist/ExecutionMetadata.d.ts +13 -0
- package/dist/ExecutionMetadata.d.ts.map +1 -0
- package/dist/ExecutionMetadata.js +19 -0
- package/dist/ExecutionMetadata.js.map +1 -0
- package/dist/FunctionImpl.d.ts +39 -0
- package/dist/FunctionImpl.d.ts.map +1 -0
- package/dist/FunctionImpl.js +46 -0
- package/dist/FunctionImpl.js.map +1 -0
- package/dist/FunctionRegistryItem.d.ts +36 -0
- package/dist/FunctionRegistryItem.d.ts.map +1 -0
- package/dist/FunctionRegistryItem.js +34 -0
- package/dist/FunctionRegistryItem.js.map +1 -0
- package/dist/GroupImpl.d.ts +77 -0
- package/dist/GroupImpl.d.ts.map +1 -0
- package/dist/GroupImpl.js +81 -0
- package/dist/GroupImpl.js.map +1 -0
- package/dist/GroupRegistry.d.ts +8 -0
- package/dist/GroupRegistry.d.ts.map +1 -0
- package/dist/GroupRegistry.js +26 -0
- package/dist/GroupRegistry.js.map +1 -0
- package/dist/Handler.d.ts +47 -0
- package/dist/Handler.d.ts.map +1 -0
- package/dist/Handler.js +7 -0
- package/dist/Handler.js.map +1 -0
- package/dist/HttpRouter.d.ts +80 -0
- package/dist/HttpRouter.d.ts.map +1 -0
- package/dist/HttpRouter.js +195 -0
- package/dist/HttpRouter.js.map +1 -0
- package/dist/MiddlewareImpl.d.ts +79 -0
- package/dist/MiddlewareImpl.d.ts.map +1 -0
- package/dist/MiddlewareImpl.js +58 -0
- package/dist/MiddlewareImpl.js.map +1 -0
- package/dist/MiddlewareRegistryItem.d.ts +12 -0
- package/dist/MiddlewareRegistryItem.d.ts.map +1 -0
- package/dist/MiddlewareRegistryItem.js +15 -0
- package/dist/MiddlewareRegistryItem.js.map +1 -0
- package/dist/MutationCtx.d.ts +10 -0
- package/dist/MutationCtx.d.ts.map +1 -0
- package/dist/MutationCtx.js +18 -0
- package/dist/MutationCtx.js.map +1 -0
- package/dist/MutationRunner.d.ts +27 -0
- package/dist/MutationRunner.d.ts.map +1 -0
- package/dist/MutationRunner.js +28 -0
- package/dist/MutationRunner.js.map +1 -0
- package/dist/MutationTransactionContext.d.ts +17 -0
- package/dist/MutationTransactionContext.d.ts.map +1 -0
- package/dist/MutationTransactionContext.js +20 -0
- package/dist/MutationTransactionContext.js.map +1 -0
- package/dist/OrderedQuery.d.ts +32 -0
- package/dist/OrderedQuery.d.ts.map +1 -0
- package/dist/OrderedQuery.js +36 -0
- package/dist/OrderedQuery.js.map +1 -0
- package/dist/QueryCtx.d.ts +10 -0
- package/dist/QueryCtx.d.ts.map +1 -0
- package/dist/QueryCtx.js +18 -0
- package/dist/QueryCtx.js.map +1 -0
- package/dist/QueryInitializer.d.ts +75 -0
- package/dist/QueryInitializer.d.ts.map +1 -0
- package/dist/QueryInitializer.js +105 -0
- package/dist/QueryInitializer.js.map +1 -0
- package/dist/QueryRunner.d.ts +46 -0
- package/dist/QueryRunner.d.ts.map +1 -0
- package/dist/QueryRunner.js +30 -0
- package/dist/QueryRunner.js.map +1 -0
- package/dist/QueryStream.d.ts +678 -0
- package/dist/QueryStream.d.ts.map +1 -0
- package/dist/QueryStream.js +943 -0
- package/dist/QueryStream.js.map +1 -0
- package/dist/QueryStreamCursor.d.ts +39 -0
- package/dist/QueryStreamCursor.d.ts.map +1 -0
- package/dist/QueryStreamCursor.js +52 -0
- package/dist/QueryStreamCursor.js.map +1 -0
- package/dist/QueryStreamIndexPrefix.d.ts +48 -0
- package/dist/QueryStreamIndexPrefix.d.ts.map +1 -0
- package/dist/QueryStreamIndexPrefix.js +38 -0
- package/dist/QueryStreamIndexPrefix.js.map +1 -0
- package/dist/QueryStreamIndexRange.d.ts +193 -0
- package/dist/QueryStreamIndexRange.d.ts.map +1 -0
- package/dist/QueryStreamIndexRange.js +241 -0
- package/dist/QueryStreamIndexRange.js.map +1 -0
- package/dist/QueryStreamKey.d.ts +64 -0
- package/dist/QueryStreamKey.d.ts.map +1 -0
- package/dist/QueryStreamKey.js +69 -0
- package/dist/QueryStreamKey.js.map +1 -0
- package/dist/QueryStreamKeyBounds.d.ts +136 -0
- package/dist/QueryStreamKeyBounds.d.ts.map +1 -0
- package/dist/QueryStreamKeyBounds.js +208 -0
- package/dist/QueryStreamKeyBounds.js.map +1 -0
- package/dist/QueryStreamKeyLabels.d.ts +27 -0
- package/dist/QueryStreamKeyLabels.d.ts.map +1 -0
- package/dist/QueryStreamKeyLabels.js +22 -0
- package/dist/QueryStreamKeyLabels.js.map +1 -0
- package/dist/QueryStreamKeyLayout.d.ts +179 -0
- package/dist/QueryStreamKeyLayout.d.ts.map +1 -0
- package/dist/QueryStreamKeyLayout.js +167 -0
- package/dist/QueryStreamKeyLayout.js.map +1 -0
- package/dist/QueryStreamKeyValues.d.ts +40 -0
- package/dist/QueryStreamKeyValues.d.ts.map +1 -0
- package/dist/QueryStreamKeyValues.js +57 -0
- package/dist/QueryStreamKeyValues.js.map +1 -0
- package/dist/QueryStreamOrderDirection.d.ts +24 -0
- package/dist/QueryStreamOrderDirection.d.ts.map +1 -0
- package/dist/QueryStreamOrderDirection.js +11 -0
- package/dist/QueryStreamOrderDirection.js.map +1 -0
- package/dist/QueryStreamPagination.d.ts +264 -0
- package/dist/QueryStreamPagination.d.ts.map +1 -0
- package/dist/QueryStreamPagination.js +172 -0
- package/dist/QueryStreamPagination.js.map +1 -0
- package/dist/QueryStreamReadBudget.d.ts +63 -0
- package/dist/QueryStreamReadBudget.d.ts.map +1 -0
- package/dist/QueryStreamReadBudget.js +81 -0
- package/dist/QueryStreamReadBudget.js.map +1 -0
- package/dist/QueryTransactionContext.d.ts +16 -0
- package/dist/QueryTransactionContext.d.ts.map +1 -0
- package/dist/QueryTransactionContext.js +17 -0
- package/dist/QueryTransactionContext.js.map +1 -0
- package/dist/RegisteredConvexFunction.d.ts +359 -0
- package/dist/RegisteredConvexFunction.d.ts.map +1 -0
- package/dist/RegisteredConvexFunction.js +154 -0
- package/dist/RegisteredConvexFunction.js.map +1 -0
- package/dist/RegisteredFunction.d.ts +143 -0
- package/dist/RegisteredFunction.d.ts.map +1 -0
- package/dist/RegisteredFunction.js +125 -0
- package/dist/RegisteredFunction.js.map +1 -0
- package/dist/RegisteredFunctions.d.ts +57 -0
- package/dist/RegisteredFunctions.d.ts.map +1 -0
- package/dist/RegisteredFunctions.js +32 -0
- package/dist/RegisteredFunctions.js.map +1 -0
- package/dist/RegisteredNodeFunction.d.ts +11 -0
- package/dist/RegisteredNodeFunction.d.ts.map +1 -0
- package/dist/RegisteredNodeFunction.js +45 -0
- package/dist/RegisteredNodeFunction.js.map +1 -0
- package/dist/Registry.d.ts +12 -0
- package/dist/Registry.d.ts.map +1 -0
- package/dist/Registry.js +17 -0
- package/dist/Registry.js.map +1 -0
- package/dist/RegistryItems.d.ts +21 -0
- package/dist/RegistryItems.d.ts.map +1 -0
- package/dist/RegistryItems.js +27 -0
- package/dist/RegistryItems.js.map +1 -0
- package/dist/RequestMetadata.d.ts +12 -0
- package/dist/RequestMetadata.d.ts.map +1 -0
- package/dist/RequestMetadata.js +16 -0
- package/dist/RequestMetadata.js.map +1 -0
- package/dist/ResolvedMiddleware.d.ts +24 -0
- package/dist/ResolvedMiddleware.d.ts.map +1 -0
- package/dist/ResolvedMiddleware.js +34 -0
- package/dist/ResolvedMiddleware.js.map +1 -0
- package/dist/Scheduler.d.ts +31 -0
- package/dist/Scheduler.d.ts.map +1 -0
- package/dist/Scheduler.js +35 -0
- package/dist/Scheduler.js.map +1 -0
- package/dist/Storage.d.ts +22 -0
- package/dist/Storage.d.ts.map +1 -0
- package/dist/Storage.js +27 -0
- package/dist/Storage.js.map +1 -0
- package/dist/StorageActionWriter.d.ts +35 -0
- package/dist/StorageActionWriter.d.ts.map +1 -0
- package/dist/StorageActionWriter.js +24 -0
- package/dist/StorageActionWriter.js.map +1 -0
- package/dist/StorageReader.d.ts +26 -0
- package/dist/StorageReader.d.ts.map +1 -0
- package/dist/StorageReader.js +22 -0
- package/dist/StorageReader.js.map +1 -0
- package/dist/StorageWriter.d.ts +29 -0
- package/dist/StorageWriter.d.ts.map +1 -0
- package/dist/StorageWriter.js +24 -0
- package/dist/StorageWriter.js.map +1 -0
- package/dist/Table.d.ts +274 -0
- package/dist/Table.d.ts.map +1 -0
- package/dist/Table.js +70 -0
- package/dist/Table.js.map +1 -0
- package/dist/TableInfo.d.ts +44 -0
- package/dist/TableInfo.d.ts.map +1 -0
- package/dist/TableInfo.js +7 -0
- package/dist/TableInfo.js.map +1 -0
- package/dist/TransactionMetadata.d.ts +12 -0
- package/dist/TransactionMetadata.d.ts.map +1 -0
- package/dist/TransactionMetadata.js +16 -0
- package/dist/TransactionMetadata.js.map +1 -0
- package/dist/VectorSearch.d.ts +23 -0
- package/dist/VectorSearch.d.ts.map +1 -0
- package/dist/VectorSearch.js +17 -0
- package/dist/VectorSearch.js.map +1 -0
- package/dist/_virtual/_rolldown/runtime.js +13 -0
- package/dist/index.d.ts +88 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/internal/AiGatewayDecisionClient.d.ts +7 -0
- package/dist/internal/AiGatewayDecisionClient.d.ts.map +1 -0
- package/dist/internal/AiGatewayDecisionClient.js +19 -0
- package/dist/internal/AiGatewayDecisionClient.js.map +1 -0
- package/dist/internal/AiGatewayLanguageClient.d.ts +7 -0
- package/dist/internal/AiGatewayLanguageClient.d.ts.map +1 -0
- package/dist/internal/AiGatewayLanguageClient.js +19 -0
- package/dist/internal/AiGatewayLanguageClient.js.map +1 -0
- package/dist/internal/AiGatewayServiceToken.d.ts +46 -0
- package/dist/internal/AiGatewayServiceToken.d.ts.map +1 -0
- package/dist/internal/AiGatewayServiceToken.js +62 -0
- package/dist/internal/AiGatewayServiceToken.js.map +1 -0
- package/dist/internal/constants.d.ts +2 -0
- package/dist/internal/constants.d.ts.map +1 -0
- package/dist/internal/constants.js +6 -0
- package/dist/internal/constants.js.map +1 -0
- package/dist/internal/utils.d.ts +13 -0
- package/dist/internal/utils.d.ts.map +1 -0
- package/dist/internal/utils.js +50 -0
- package/dist/internal/utils.js.map +1 -0
- package/dist/node.d.ts +2 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +1 -0
- package/package.json +68 -3
- package/src/ActionCtx.ts +45 -0
- package/src/ActionRunner.ts +36 -0
- package/src/AiGatewayDecisionClient.ts +40 -0
- package/src/AiGatewayDecisionModel.ts +46 -0
- package/src/AiGatewayLanguageClient.ts +41 -0
- package/src/AiGatewayLanguageModel.ts +61 -0
- package/src/Auth.ts +51 -0
- package/src/BlobNotFoundError.ts +12 -0
- package/src/Callback.ts +313 -0
- package/src/ComponentCtx.ts +192 -0
- package/src/ConvexConfigProvider.ts +39 -0
- package/src/ConvexFunctionDefinitions.ts +91 -0
- package/src/ConvexLogger.ts +43 -0
- package/src/CronJob.ts +42 -0
- package/src/CronJobs.ts +165 -0
- package/src/DataModel.ts +81 -0
- package/src/DatabaseReader.ts +118 -0
- package/src/DatabaseSchema.ts +139 -0
- package/src/DatabaseWriter.ts +232 -0
- package/src/Document.ts +146 -0
- package/src/ExecutionMetadata.ts +26 -0
- package/src/FunctionImpl.ts +96 -0
- package/src/FunctionRegistryItem.ts +85 -0
- package/src/GroupImpl.ts +167 -0
- package/src/GroupRegistry.ts +41 -0
- package/src/Handler.ts +191 -0
- package/src/HttpRouter.ts +388 -0
- package/src/MiddlewareImpl.ts +247 -0
- package/src/MiddlewareRegistryItem.ts +21 -0
- package/src/MutationCtx.ts +45 -0
- package/src/MutationRunner.ts +66 -0
- package/src/MutationTransactionContext.ts +48 -0
- package/src/OrderedQuery.ts +136 -0
- package/src/QueryCtx.ts +45 -0
- package/src/QueryInitializer.ts +537 -0
- package/src/QueryRunner.ts +91 -0
- package/src/QueryStream.ts +2476 -0
- package/src/QueryStreamCursor.ts +99 -0
- package/src/QueryStreamIndexPrefix.ts +79 -0
- package/src/QueryStreamIndexRange.ts +489 -0
- package/src/QueryStreamKey.ts +118 -0
- package/src/QueryStreamKeyBounds.ts +395 -0
- package/src/QueryStreamKeyLabels.ts +56 -0
- package/src/QueryStreamKeyLayout.ts +382 -0
- package/src/QueryStreamKeyValues.ts +112 -0
- package/src/QueryStreamOrderDirection.ts +29 -0
- package/src/QueryStreamPagination.ts +357 -0
- package/src/QueryStreamReadBudget.ts +167 -0
- package/src/QueryTransactionContext.ts +37 -0
- package/src/RegisteredConvexFunction.ts +415 -0
- package/src/RegisteredFunction.ts +391 -0
- package/src/RegisteredFunctions.ts +88 -0
- package/src/RegisteredNodeFunction.ts +120 -0
- package/src/Registry.ts +17 -0
- package/src/RegistryItems.ts +40 -0
- package/src/RequestMetadata.ts +20 -0
- package/src/ResolvedMiddleware.ts +70 -0
- package/src/Scheduler.ts +85 -0
- package/src/Storage.ts +37 -0
- package/src/StorageActionWriter.ts +59 -0
- package/src/StorageReader.ts +59 -0
- package/src/StorageWriter.ts +58 -0
- package/src/Table.ts +156 -0
- package/src/TableInfo.ts +106 -0
- package/src/TransactionMetadata.ts +20 -0
- package/src/VectorSearch.ts +75 -0
- package/src/index.ts +87 -0
- package/src/internal/AiGatewayDecisionClient.ts +16 -0
- package/src/internal/AiGatewayLanguageClient.ts +16 -0
- package/src/internal/AiGatewayServiceToken.ts +129 -0
- package/src/internal/constants.ts +1 -0
- package/src/internal/utils.ts +89 -0
- package/src/node.ts +1 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import type { GenericDocument, FieldTypeFromFieldPath, IndexRange as ConvexIndexRange, IndexRangeBuilder as ConvexIndexRangeBuilder } from "convex/server";
|
|
2
|
+
import * as Data from "effect/Data";
|
|
3
|
+
import * as Option from "effect/Option";
|
|
4
|
+
import * as Result from "effect/Result";
|
|
5
|
+
import type * as Types from "effect/Types";
|
|
6
|
+
import * as QueryStreamIndexPrefix from "./QueryStreamIndexPrefix";
|
|
7
|
+
import * as QueryStreamKeyBounds from "./QueryStreamKeyBounds";
|
|
8
|
+
import * as QueryStreamKeyValues from "./QueryStreamKeyValues";
|
|
9
|
+
import type * as QueryStreamOrderDirection from "./QueryStreamOrderDirection";
|
|
10
|
+
type Head<FieldPaths extends ReadonlyArray<string>> = FieldPaths extends readonly [infer H extends string, ...ReadonlyArray<string>] ? H : never;
|
|
11
|
+
type Tail<FieldPaths extends ReadonlyArray<string>> = FieldPaths extends readonly [
|
|
12
|
+
string,
|
|
13
|
+
...infer Rest extends ReadonlyArray<string>
|
|
14
|
+
] ? Rest : ReadonlyArray<string>;
|
|
15
|
+
declare const TypeId = "~@confect/server/QueryStreamIndexRange";
|
|
16
|
+
interface Equality {
|
|
17
|
+
readonly fieldPath: string;
|
|
18
|
+
readonly value: QueryStreamKeyValues.KeyValue;
|
|
19
|
+
}
|
|
20
|
+
interface Endpoint {
|
|
21
|
+
readonly value: QueryStreamKeyValues.KeyValue;
|
|
22
|
+
readonly inclusive: boolean;
|
|
23
|
+
}
|
|
24
|
+
type Interval = Data.TaggedEnum<{
|
|
25
|
+
Lower: {
|
|
26
|
+
readonly lower: Endpoint;
|
|
27
|
+
};
|
|
28
|
+
Upper: {
|
|
29
|
+
readonly upper: Endpoint;
|
|
30
|
+
};
|
|
31
|
+
Between: {
|
|
32
|
+
readonly lower: Endpoint;
|
|
33
|
+
readonly upper: Endpoint;
|
|
34
|
+
};
|
|
35
|
+
}>;
|
|
36
|
+
declare const Interval: {
|
|
37
|
+
readonly $is: <Tag extends "Between" | "Lower" | "Upper">(tag: Tag) => (u: unknown) => u is Extract<{
|
|
38
|
+
readonly _tag: "Between";
|
|
39
|
+
readonly lower: Endpoint;
|
|
40
|
+
readonly upper: Endpoint;
|
|
41
|
+
}, {
|
|
42
|
+
readonly _tag: Tag;
|
|
43
|
+
}> | Extract<{
|
|
44
|
+
readonly _tag: "Lower";
|
|
45
|
+
readonly lower: Endpoint;
|
|
46
|
+
}, {
|
|
47
|
+
readonly _tag: Tag;
|
|
48
|
+
}> | Extract<{
|
|
49
|
+
readonly _tag: "Upper";
|
|
50
|
+
readonly upper: Endpoint;
|
|
51
|
+
}, {
|
|
52
|
+
readonly _tag: Tag;
|
|
53
|
+
}>;
|
|
54
|
+
readonly $match: {
|
|
55
|
+
<Cases extends { readonly [Tag in "Between" | "Lower" | "Upper"]: (args: Extract<{
|
|
56
|
+
readonly _tag: "Between";
|
|
57
|
+
readonly lower: Endpoint;
|
|
58
|
+
readonly upper: Endpoint;
|
|
59
|
+
} | {
|
|
60
|
+
readonly _tag: "Lower";
|
|
61
|
+
readonly lower: Endpoint;
|
|
62
|
+
} | {
|
|
63
|
+
readonly _tag: "Upper";
|
|
64
|
+
readonly upper: Endpoint;
|
|
65
|
+
}, {
|
|
66
|
+
readonly _tag: Tag;
|
|
67
|
+
}>) => any; }>(cases: Cases): (value: {
|
|
68
|
+
readonly _tag: "Between";
|
|
69
|
+
readonly lower: Endpoint;
|
|
70
|
+
readonly upper: Endpoint;
|
|
71
|
+
} | {
|
|
72
|
+
readonly _tag: "Lower";
|
|
73
|
+
readonly lower: Endpoint;
|
|
74
|
+
} | {
|
|
75
|
+
readonly _tag: "Upper";
|
|
76
|
+
readonly upper: Endpoint;
|
|
77
|
+
}) => import("effect/Unify").Unify<ReturnType<Cases["Between" | "Lower" | "Upper"]>>;
|
|
78
|
+
<Cases extends { readonly [Tag in "Between" | "Lower" | "Upper"]: (args: Extract<{
|
|
79
|
+
readonly _tag: "Between";
|
|
80
|
+
readonly lower: Endpoint;
|
|
81
|
+
readonly upper: Endpoint;
|
|
82
|
+
} | {
|
|
83
|
+
readonly _tag: "Lower";
|
|
84
|
+
readonly lower: Endpoint;
|
|
85
|
+
} | {
|
|
86
|
+
readonly _tag: "Upper";
|
|
87
|
+
readonly upper: Endpoint;
|
|
88
|
+
}, {
|
|
89
|
+
readonly _tag: Tag;
|
|
90
|
+
}>) => any; }>(value: {
|
|
91
|
+
readonly _tag: "Between";
|
|
92
|
+
readonly lower: Endpoint;
|
|
93
|
+
readonly upper: Endpoint;
|
|
94
|
+
} | {
|
|
95
|
+
readonly _tag: "Lower";
|
|
96
|
+
readonly lower: Endpoint;
|
|
97
|
+
} | {
|
|
98
|
+
readonly _tag: "Upper";
|
|
99
|
+
readonly upper: Endpoint;
|
|
100
|
+
}, cases: Cases): import("effect/Unify").Unify<ReturnType<Cases["Between" | "Lower" | "Upper"]>>;
|
|
101
|
+
};
|
|
102
|
+
readonly Between: Data.TaggedEnum.ConstructorFrom<{
|
|
103
|
+
readonly _tag: "Between";
|
|
104
|
+
readonly lower: Endpoint;
|
|
105
|
+
readonly upper: Endpoint;
|
|
106
|
+
}, "_tag">;
|
|
107
|
+
readonly Lower: Data.TaggedEnum.ConstructorFrom<{
|
|
108
|
+
readonly _tag: "Lower";
|
|
109
|
+
readonly lower: Endpoint;
|
|
110
|
+
}, "_tag">;
|
|
111
|
+
readonly Upper: Data.TaggedEnum.ConstructorFrom<{
|
|
112
|
+
readonly _tag: "Upper";
|
|
113
|
+
readonly upper: Endpoint;
|
|
114
|
+
}, "_tag">;
|
|
115
|
+
};
|
|
116
|
+
interface Constraints {
|
|
117
|
+
readonly equalities: ReadonlyArray<Equality>;
|
|
118
|
+
readonly bounded: Option.Option<{
|
|
119
|
+
readonly fieldPath: string;
|
|
120
|
+
readonly interval: Interval;
|
|
121
|
+
}>;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* The equality prefix followed by at most one bounded field.
|
|
125
|
+
*
|
|
126
|
+
* @experimental
|
|
127
|
+
*/
|
|
128
|
+
export interface QueryStreamIndexRange<out RemainingFieldPaths extends ReadonlyArray<string> = ReadonlyArray<string>> {
|
|
129
|
+
readonly [TypeId]: Constraints & {
|
|
130
|
+
readonly _Remaining: Types.Covariant<RemainingFieldPaths>;
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* @experimental
|
|
135
|
+
*/
|
|
136
|
+
export type Remaining<IndexRange> = IndexRange extends QueryStreamIndexRange<infer RemainingFieldPaths> ? RemainingFieldPaths : never;
|
|
137
|
+
/**
|
|
138
|
+
* A typed index-range builder. `eq` must target the next unpinned index field,
|
|
139
|
+
* and consumes it; `gt`/`gte`/`lt`/`lte` bound the next field without consuming
|
|
140
|
+
* it (bounded field paths still vary within the range).
|
|
141
|
+
*
|
|
142
|
+
* @experimental
|
|
143
|
+
*/
|
|
144
|
+
export interface Builder<ConvexDoc extends GenericDocument, FieldPaths extends ReadonlyArray<string>> extends QueryStreamIndexRange<FieldPaths> {
|
|
145
|
+
readonly eq: (fieldPath: Head<FieldPaths>, value: FieldTypeFromFieldPath<ConvexDoc, Head<FieldPaths>>) => Builder<ConvexDoc, Tail<FieldPaths>>;
|
|
146
|
+
readonly gt: (fieldPath: Head<FieldPaths>, value: FieldTypeFromFieldPath<ConvexDoc, Head<FieldPaths>>) => LowerBoundedBuilder<ConvexDoc, FieldPaths>;
|
|
147
|
+
readonly gte: (fieldPath: Head<FieldPaths>, value: FieldTypeFromFieldPath<ConvexDoc, Head<FieldPaths>>) => LowerBoundedBuilder<ConvexDoc, FieldPaths>;
|
|
148
|
+
readonly lt: (fieldPath: Head<FieldPaths>, value: FieldTypeFromFieldPath<ConvexDoc, Head<FieldPaths>>) => QueryStreamIndexRange<FieldPaths>;
|
|
149
|
+
readonly lte: (fieldPath: Head<FieldPaths>, value: FieldTypeFromFieldPath<ConvexDoc, Head<FieldPaths>>) => QueryStreamIndexRange<FieldPaths>;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* After `gt`/`gte`, only an upper bound on the same field may follow.
|
|
153
|
+
*
|
|
154
|
+
* @experimental
|
|
155
|
+
*/
|
|
156
|
+
export interface LowerBoundedBuilder<ConvexDoc extends GenericDocument, FieldPaths extends ReadonlyArray<string>> extends QueryStreamIndexRange<FieldPaths> {
|
|
157
|
+
readonly lt: (fieldPath: Head<FieldPaths>, value: FieldTypeFromFieldPath<ConvexDoc, Head<FieldPaths>>) => QueryStreamIndexRange<FieldPaths>;
|
|
158
|
+
readonly lte: (fieldPath: Head<FieldPaths>, value: FieldTypeFromFieldPath<ConvexDoc, Head<FieldPaths>>) => QueryStreamIndexRange<FieldPaths>;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* The initial builder handed to a range callback.
|
|
162
|
+
*
|
|
163
|
+
* @experimental
|
|
164
|
+
*/
|
|
165
|
+
export declare const builder: <ConvexDoc extends GenericDocument, FieldPaths extends ReadonlyArray<string>>() => Builder<ConvexDoc, FieldPaths>;
|
|
166
|
+
/**
|
|
167
|
+
* Number of index fields pinned by equality constraints.
|
|
168
|
+
*
|
|
169
|
+
* @experimental
|
|
170
|
+
*/
|
|
171
|
+
export declare const equalityPrefixLength: (self: QueryStreamIndexRange) => number;
|
|
172
|
+
/**
|
|
173
|
+
* Apply one range to Convex's index-range builder.
|
|
174
|
+
*
|
|
175
|
+
* @experimental
|
|
176
|
+
*/
|
|
177
|
+
export declare const apply: (self: QueryStreamIndexRange, q: ConvexIndexRangeBuilder<GenericDocument, string[]>) => ConvexIndexRange;
|
|
178
|
+
/**
|
|
179
|
+
* Decompose the range between `indexBounds.lower` and `indexBounds.upper` (over
|
|
180
|
+
* the complete index `fieldPaths`, `_id` tiebreaker included) into a sequence
|
|
181
|
+
* of Convex-expressible ranges, ordered for the given direction.
|
|
182
|
+
*
|
|
183
|
+
* @experimental
|
|
184
|
+
*/
|
|
185
|
+
export declare const fromBounds: (fieldPaths: ReadonlyArray<string>, orderDirection: QueryStreamOrderDirection.QueryStreamOrderDirection, indexBounds: QueryStreamKeyBounds.IndexBounds) => Result.Result<ReadonlyArray<QueryStreamIndexRange>, QueryStreamIndexPrefix.IndexPrefixWidthMismatchError>;
|
|
186
|
+
/**
|
|
187
|
+
* Derive full-index bounds directly from the structural range.
|
|
188
|
+
*
|
|
189
|
+
* @experimental
|
|
190
|
+
*/
|
|
191
|
+
export declare const toBounds: (self: QueryStreamIndexRange) => QueryStreamKeyBounds.IndexBounds;
|
|
192
|
+
export {};
|
|
193
|
+
//# sourceMappingURL=QueryStreamIndexRange.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryStreamIndexRange.d.ts","sourceRoot":"","sources":["../src/QueryStreamIndexRange.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import { __exportAll } from "./_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { ValueOrder } from "./QueryStreamKeyValues.js";
|
|
3
|
+
import { entries, make as make$1 } from "./QueryStreamIndexPrefix.js";
|
|
4
|
+
import { isEmpty } from "./QueryStreamKeyBounds.js";
|
|
5
|
+
import { identity, pipe } from "effect/Function";
|
|
6
|
+
import * as Match from "effect/Match";
|
|
7
|
+
import * as Option from "effect/Option";
|
|
8
|
+
import * as Array from "effect/Array";
|
|
9
|
+
import * as Result from "effect/Result";
|
|
10
|
+
import * as Data from "effect/Data";
|
|
11
|
+
//#region src/QueryStreamIndexRange.ts
|
|
12
|
+
var QueryStreamIndexRange_exports = /* @__PURE__ */ __exportAll({
|
|
13
|
+
apply: () => apply,
|
|
14
|
+
builder: () => builder,
|
|
15
|
+
equalityPrefixLength: () => equalityPrefixLength,
|
|
16
|
+
fromBounds: () => fromBounds,
|
|
17
|
+
toBounds: () => toBounds
|
|
18
|
+
});
|
|
19
|
+
const TypeId = "~@confect/server/QueryStreamIndexRange";
|
|
20
|
+
const Interval = Data.taggedEnum();
|
|
21
|
+
const make = (constraints) => ({ [TypeId]: {
|
|
22
|
+
...constraints,
|
|
23
|
+
_Remaining: identity
|
|
24
|
+
} });
|
|
25
|
+
const makeBuilder = (equalities) => {
|
|
26
|
+
const upper = (inclusive) => (fieldPath, value) => make({
|
|
27
|
+
equalities,
|
|
28
|
+
bounded: Option.some({
|
|
29
|
+
fieldPath,
|
|
30
|
+
interval: Interval.Upper({ upper: {
|
|
31
|
+
value,
|
|
32
|
+
inclusive
|
|
33
|
+
} })
|
|
34
|
+
})
|
|
35
|
+
});
|
|
36
|
+
const lower = (inclusive) => (fieldPath, value) => {
|
|
37
|
+
const endpoint = {
|
|
38
|
+
value,
|
|
39
|
+
inclusive
|
|
40
|
+
};
|
|
41
|
+
const finish = (upperInclusive) => (_fieldPath, upperValue) => make({
|
|
42
|
+
equalities,
|
|
43
|
+
bounded: Option.some({
|
|
44
|
+
fieldPath,
|
|
45
|
+
interval: Interval.Between({
|
|
46
|
+
lower: endpoint,
|
|
47
|
+
upper: {
|
|
48
|
+
value: upperValue,
|
|
49
|
+
inclusive: upperInclusive
|
|
50
|
+
}
|
|
51
|
+
})
|
|
52
|
+
})
|
|
53
|
+
});
|
|
54
|
+
return {
|
|
55
|
+
...make({
|
|
56
|
+
equalities,
|
|
57
|
+
bounded: Option.some({
|
|
58
|
+
fieldPath,
|
|
59
|
+
interval: Interval.Lower({ lower: endpoint })
|
|
60
|
+
})
|
|
61
|
+
}),
|
|
62
|
+
lt: finish(false),
|
|
63
|
+
lte: finish(true)
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
return {
|
|
67
|
+
...make({
|
|
68
|
+
equalities,
|
|
69
|
+
bounded: Option.none()
|
|
70
|
+
}),
|
|
71
|
+
eq: (fieldPath, value) => makeBuilder(Array.append(equalities, {
|
|
72
|
+
fieldPath,
|
|
73
|
+
value
|
|
74
|
+
})),
|
|
75
|
+
gt: lower(false),
|
|
76
|
+
gte: lower(true),
|
|
77
|
+
lt: upper(false),
|
|
78
|
+
lte: upper(true)
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* The initial builder handed to a range callback.
|
|
83
|
+
*
|
|
84
|
+
* @experimental
|
|
85
|
+
*/
|
|
86
|
+
const builder = () => makeBuilder([]);
|
|
87
|
+
/**
|
|
88
|
+
* Number of index fields pinned by equality constraints.
|
|
89
|
+
*
|
|
90
|
+
* @experimental
|
|
91
|
+
*/
|
|
92
|
+
const equalityPrefixLength = (self) => self[TypeId].equalities.length;
|
|
93
|
+
/**
|
|
94
|
+
* Apply one range to Convex's index-range builder.
|
|
95
|
+
*
|
|
96
|
+
* @experimental
|
|
97
|
+
*/
|
|
98
|
+
const apply = (self, q) => {
|
|
99
|
+
const { equalities, bounded } = self[TypeId];
|
|
100
|
+
const prefix = Array.reduce(equalities, q, (target, { fieldPath, value }) => target.eq(fieldPath, value));
|
|
101
|
+
return Option.match(bounded, {
|
|
102
|
+
onNone: () => prefix,
|
|
103
|
+
onSome: ({ fieldPath, interval }) => {
|
|
104
|
+
const lower = (target, endpoint) => target[endpoint.inclusive ? "gte" : "gt"](fieldPath, endpoint.value);
|
|
105
|
+
const upper = (target, endpoint) => target[endpoint.inclusive ? "lte" : "lt"](fieldPath, endpoint.value);
|
|
106
|
+
return Interval.$match(interval, {
|
|
107
|
+
Lower: ({ lower: endpoint }) => lower(prefix, endpoint),
|
|
108
|
+
Upper: ({ upper: endpoint }) => upper(prefix, endpoint),
|
|
109
|
+
Between: (endpoints) => upper(lower(prefix, endpoints.lower), endpoints.upper)
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
};
|
|
114
|
+
var TaggedBound = class extends Data.Class {};
|
|
115
|
+
/**
|
|
116
|
+
* Dropping a bound's last entry bounds the remaining prefix exclusively.
|
|
117
|
+
*/
|
|
118
|
+
const excludePrefix = (tag) => Match.value(tag).pipe(Match.whenOr("gt", "gte", () => "gt"), Match.whenOr("lt", "lte", () => "lt"), Match.exhaustive);
|
|
119
|
+
/**
|
|
120
|
+
* Peel a bound down to the single entry that feeds the middle range.
|
|
121
|
+
*/
|
|
122
|
+
const peelBound = (indexEntries, tag) => indexEntries.length <= 1 ? {
|
|
123
|
+
peeled: [],
|
|
124
|
+
final: new TaggedBound({
|
|
125
|
+
indexEntries,
|
|
126
|
+
tag
|
|
127
|
+
})
|
|
128
|
+
} : pipe(peelBound(Array.dropRight(indexEntries, 1), excludePrefix(tag)), ({ final, peeled }) => ({
|
|
129
|
+
peeled: Array.prepend(peeled, new TaggedBound({
|
|
130
|
+
indexEntries,
|
|
131
|
+
tag
|
|
132
|
+
})),
|
|
133
|
+
final
|
|
134
|
+
}));
|
|
135
|
+
/**
|
|
136
|
+
* Pin every entry but the last, which gets the bound tag.
|
|
137
|
+
*/
|
|
138
|
+
const rangeFor = (prefix, indexEntries, tag) => Option.match(Array.last(indexEntries), {
|
|
139
|
+
onNone: () => make({
|
|
140
|
+
equalities: prefix,
|
|
141
|
+
bounded: Option.none()
|
|
142
|
+
}),
|
|
143
|
+
onSome: ([fieldPath, value]) => make({
|
|
144
|
+
equalities: Array.appendAll(prefix, Array.map(Array.dropRight(indexEntries, 1), ([path, pinned]) => ({
|
|
145
|
+
fieldPath: path,
|
|
146
|
+
value: pinned
|
|
147
|
+
}))),
|
|
148
|
+
bounded: Option.some({
|
|
149
|
+
fieldPath,
|
|
150
|
+
interval: tag === "gt" || tag === "gte" ? Interval.Lower({ lower: {
|
|
151
|
+
value,
|
|
152
|
+
inclusive: tag === "gte"
|
|
153
|
+
} }) : Interval.Upper({ upper: {
|
|
154
|
+
value,
|
|
155
|
+
inclusive: tag === "lte"
|
|
156
|
+
} })
|
|
157
|
+
})
|
|
158
|
+
})
|
|
159
|
+
});
|
|
160
|
+
/**
|
|
161
|
+
* Decompose the range between `indexBounds.lower` and `indexBounds.upper` (over
|
|
162
|
+
* the complete index `fieldPaths`, `_id` tiebreaker included) into a sequence
|
|
163
|
+
* of Convex-expressible ranges, ordered for the given direction.
|
|
164
|
+
*
|
|
165
|
+
* @experimental
|
|
166
|
+
*/
|
|
167
|
+
const fromBounds = (fieldPaths, orderDirection, indexBounds) => Result.gen(function* () {
|
|
168
|
+
const lowerIndexEntries = entries(yield* make$1(fieldPaths, indexBounds.lower.keyValues));
|
|
169
|
+
const upperIndexEntries = entries(yield* make$1(fieldPaths, indexBounds.upper.keyValues));
|
|
170
|
+
if (isEmpty(indexBounds)) return [];
|
|
171
|
+
const commonLength = pipe(Array.zip(indexBounds.lower.keyValues, indexBounds.upper.keyValues), Array.takeWhile(([lowerValue, upperValue]) => ValueOrder(lowerValue, upperValue) === 0), Array.length);
|
|
172
|
+
const equalities = pipe(Array.take(lowerIndexEntries, commonLength), Array.map(([fieldPath, value]) => ({
|
|
173
|
+
fieldPath,
|
|
174
|
+
value
|
|
175
|
+
})));
|
|
176
|
+
const lower = peelBound(Array.drop(lowerIndexEntries, commonLength), indexBounds.lower.inclusive ? "gte" : "gt");
|
|
177
|
+
const upper = peelBound(Array.drop(upperIndexEntries, commonLength), indexBounds.upper.inclusive ? "lte" : "lt");
|
|
178
|
+
const startIndexRanges = Array.map(lower.peeled, ({ indexEntries, tag }) => rangeFor(equalities, indexEntries, tag));
|
|
179
|
+
const endIndexRanges = Array.reverse(Array.map(upper.peeled, ({ indexEntries, tag }) => rangeFor(equalities, indexEntries, tag)));
|
|
180
|
+
const { indexEntries: lowerFinalIndexEntries, tag: lowerFinalTag } = lower.final;
|
|
181
|
+
const { indexEntries: upperFinalIndexEntries, tag: upperFinalTag } = upper.final;
|
|
182
|
+
const middleIndexRange = Array.isReadonlyArrayNonEmpty(lowerFinalIndexEntries) && Array.isReadonlyArrayNonEmpty(upperFinalIndexEntries) ? make({
|
|
183
|
+
equalities,
|
|
184
|
+
bounded: Option.some({
|
|
185
|
+
fieldPath: Array.headNonEmpty(lowerFinalIndexEntries)[0],
|
|
186
|
+
interval: Interval.Between({
|
|
187
|
+
lower: {
|
|
188
|
+
value: Array.headNonEmpty(lowerFinalIndexEntries)[1],
|
|
189
|
+
inclusive: lowerFinalTag === "gte"
|
|
190
|
+
},
|
|
191
|
+
upper: {
|
|
192
|
+
value: Array.headNonEmpty(upperFinalIndexEntries)[1],
|
|
193
|
+
inclusive: upperFinalTag === "lte"
|
|
194
|
+
}
|
|
195
|
+
})
|
|
196
|
+
})
|
|
197
|
+
}) : Array.isReadonlyArrayNonEmpty(lowerFinalIndexEntries) ? rangeFor(equalities, lowerFinalIndexEntries, lowerFinalTag) : rangeFor(equalities, upperFinalIndexEntries, upperFinalTag);
|
|
198
|
+
const indexRanges = Array.appendAll(Array.appendAll(startIndexRanges, Array.of(middleIndexRange)), endIndexRanges);
|
|
199
|
+
return orderDirection === "desc" ? Array.reverse(indexRanges) : indexRanges;
|
|
200
|
+
});
|
|
201
|
+
/**
|
|
202
|
+
* Derive full-index bounds directly from the structural range.
|
|
203
|
+
*
|
|
204
|
+
* @experimental
|
|
205
|
+
*/
|
|
206
|
+
const toBounds = (self) => {
|
|
207
|
+
const { equalities, bounded } = self[TypeId];
|
|
208
|
+
const keyValues = Array.map(equalities, (equality) => equality.value);
|
|
209
|
+
const unbounded = {
|
|
210
|
+
keyValues,
|
|
211
|
+
inclusive: true
|
|
212
|
+
};
|
|
213
|
+
const endpoint = ({ value, inclusive }) => ({
|
|
214
|
+
keyValues: Array.append(keyValues, value),
|
|
215
|
+
inclusive
|
|
216
|
+
});
|
|
217
|
+
return Option.match(bounded, {
|
|
218
|
+
onNone: () => ({
|
|
219
|
+
lower: unbounded,
|
|
220
|
+
upper: unbounded
|
|
221
|
+
}),
|
|
222
|
+
onSome: ({ interval }) => Interval.$match(interval, {
|
|
223
|
+
Lower: ({ lower }) => ({
|
|
224
|
+
lower: endpoint(lower),
|
|
225
|
+
upper: unbounded
|
|
226
|
+
}),
|
|
227
|
+
Upper: ({ upper }) => ({
|
|
228
|
+
lower: unbounded,
|
|
229
|
+
upper: endpoint(upper)
|
|
230
|
+
}),
|
|
231
|
+
Between: ({ lower, upper }) => ({
|
|
232
|
+
lower: endpoint(lower),
|
|
233
|
+
upper: endpoint(upper)
|
|
234
|
+
})
|
|
235
|
+
})
|
|
236
|
+
});
|
|
237
|
+
};
|
|
238
|
+
//#endregion
|
|
239
|
+
export { QueryStreamIndexRange_exports, apply, builder, equalityPrefixLength, fromBounds, toBounds };
|
|
240
|
+
|
|
241
|
+
//# sourceMappingURL=QueryStreamIndexRange.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryStreamIndexRange.js","names":["QueryStreamIndexPrefix.entries","QueryStreamIndexPrefix.make","QueryStreamKeyBounds.isEmpty","QueryStreamKeyValues.ValueOrder"],"sources":["../src/QueryStreamIndexRange.ts"],"sourcesContent":["import type {\n GenericDocument,\n FieldTypeFromFieldPath,\n IndexRange as ConvexIndexRange,\n IndexRangeBuilder as ConvexIndexRangeBuilder,\n} from \"convex/server\";\nimport * as Array from \"effect/Array\";\nimport * as Data from \"effect/Data\";\nimport { identity, pipe } from \"effect/Function\";\nimport * as Match from \"effect/Match\";\nimport * as Option from \"effect/Option\";\nimport * as Result from \"effect/Result\";\nimport type * as Types from \"effect/Types\";\nimport * as QueryStreamIndexPrefix from \"./QueryStreamIndexPrefix\";\nimport * as QueryStreamKeyBounds from \"./QueryStreamKeyBounds\";\nimport * as QueryStreamKeyValues from \"./QueryStreamKeyValues\";\nimport type * as QueryStreamOrderDirection from \"./QueryStreamOrderDirection\";\n\ntype Head<FieldPaths extends ReadonlyArray<string>> =\n FieldPaths extends readonly [infer H extends string, ...ReadonlyArray<string>]\n ? H\n : never;\n\ntype Tail<FieldPaths extends ReadonlyArray<string>> =\n FieldPaths extends readonly [\n string,\n ...infer Rest extends ReadonlyArray<string>,\n ]\n ? Rest\n : ReadonlyArray<string>;\n\n// The range builder mirrors Convex's `IndexRangeBuilder`, but *consumes* the\n// index-field tuple at the type level as `eq` pins field paths. The remaining\n// tuple supplies the initial visible ordering labels of the resulting stream.\n\nconst TypeId = \"~@confect/server/QueryStreamIndexRange\";\n\ninterface Equality {\n readonly fieldPath: string;\n readonly value: QueryStreamKeyValues.KeyValue;\n}\n\ninterface Endpoint {\n readonly value: QueryStreamKeyValues.KeyValue;\n readonly inclusive: boolean;\n}\n\ntype Interval = Data.TaggedEnum<{\n Lower: { readonly lower: Endpoint };\n Upper: { readonly upper: Endpoint };\n Between: { readonly lower: Endpoint; readonly upper: Endpoint };\n}>;\nconst Interval = Data.taggedEnum<Interval>();\n\ninterface Constraints {\n readonly equalities: ReadonlyArray<Equality>;\n readonly bounded: Option.Option<{\n readonly fieldPath: string;\n readonly interval: Interval;\n }>;\n}\n\n/**\n * The equality prefix followed by at most one bounded field.\n *\n * @experimental\n */\nexport interface QueryStreamIndexRange<\n out RemainingFieldPaths extends ReadonlyArray<string> = ReadonlyArray<string>,\n> {\n readonly [TypeId]: Constraints & {\n readonly _Remaining: Types.Covariant<RemainingFieldPaths>;\n };\n}\n\n/**\n * @experimental\n */\nexport type Remaining<IndexRange> =\n IndexRange extends QueryStreamIndexRange<infer RemainingFieldPaths>\n ? RemainingFieldPaths\n : never;\n\n/**\n * A typed index-range builder. `eq` must target the next unpinned index field,\n * and consumes it; `gt`/`gte`/`lt`/`lte` bound the next field without consuming\n * it (bounded field paths still vary within the range).\n *\n * @experimental\n */\nexport interface Builder<\n ConvexDoc extends GenericDocument,\n FieldPaths extends ReadonlyArray<string>,\n> extends QueryStreamIndexRange<FieldPaths> {\n readonly eq: (\n fieldPath: Head<FieldPaths>,\n value: FieldTypeFromFieldPath<ConvexDoc, Head<FieldPaths>>,\n ) => Builder<ConvexDoc, Tail<FieldPaths>>;\n readonly gt: (\n fieldPath: Head<FieldPaths>,\n value: FieldTypeFromFieldPath<ConvexDoc, Head<FieldPaths>>,\n ) => LowerBoundedBuilder<ConvexDoc, FieldPaths>;\n readonly gte: (\n fieldPath: Head<FieldPaths>,\n value: FieldTypeFromFieldPath<ConvexDoc, Head<FieldPaths>>,\n ) => LowerBoundedBuilder<ConvexDoc, FieldPaths>;\n readonly lt: (\n fieldPath: Head<FieldPaths>,\n value: FieldTypeFromFieldPath<ConvexDoc, Head<FieldPaths>>,\n ) => QueryStreamIndexRange<FieldPaths>;\n readonly lte: (\n fieldPath: Head<FieldPaths>,\n value: FieldTypeFromFieldPath<ConvexDoc, Head<FieldPaths>>,\n ) => QueryStreamIndexRange<FieldPaths>;\n}\n\n/**\n * After `gt`/`gte`, only an upper bound on the same field may follow.\n *\n * @experimental\n */\nexport interface LowerBoundedBuilder<\n ConvexDoc extends GenericDocument,\n FieldPaths extends ReadonlyArray<string>,\n> extends QueryStreamIndexRange<FieldPaths> {\n readonly lt: (\n fieldPath: Head<FieldPaths>,\n value: FieldTypeFromFieldPath<ConvexDoc, Head<FieldPaths>>,\n ) => QueryStreamIndexRange<FieldPaths>;\n readonly lte: (\n fieldPath: Head<FieldPaths>,\n value: FieldTypeFromFieldPath<ConvexDoc, Head<FieldPaths>>,\n ) => QueryStreamIndexRange<FieldPaths>;\n}\n\nconst make = (constraints: Constraints): QueryStreamIndexRange => ({\n [TypeId]: {\n ...constraints,\n _Remaining: identity as Types.Covariant<ReadonlyArray<string>>,\n },\n});\n\nconst makeBuilder = (\n equalities: ReadonlyArray<Equality>,\n): Builder<GenericDocument, ReadonlyArray<string>> => {\n const upper =\n (inclusive: boolean) =>\n (fieldPath: string, value: QueryStreamKeyValues.KeyValue) =>\n make({\n equalities,\n bounded: Option.some({\n fieldPath,\n interval: Interval.Upper({ upper: { value, inclusive } }),\n }),\n });\n const lower =\n (inclusive: boolean) =>\n (\n fieldPath: string,\n value: QueryStreamKeyValues.KeyValue,\n ): LowerBoundedBuilder<GenericDocument, ReadonlyArray<string>> => {\n const endpoint = { value, inclusive };\n const finish =\n (upperInclusive: boolean) =>\n (_fieldPath: string, upperValue: QueryStreamKeyValues.KeyValue) =>\n make({\n equalities,\n bounded: Option.some({\n fieldPath,\n interval: Interval.Between({\n lower: endpoint,\n upper: { value: upperValue, inclusive: upperInclusive },\n }),\n }),\n });\n return {\n ...make({\n equalities,\n bounded: Option.some({\n fieldPath,\n interval: Interval.Lower({ lower: endpoint }),\n }),\n }),\n lt: finish(false),\n lte: finish(true),\n };\n };\n return {\n ...make({ equalities, bounded: Option.none() }),\n eq: (fieldPath, value) =>\n makeBuilder(Array.append(equalities, { fieldPath, value })),\n gt: lower(false),\n gte: lower(true),\n lt: upper(false),\n lte: upper(true),\n };\n};\n\n/**\n * The initial builder handed to a range callback.\n *\n * @experimental\n */\nexport const builder = <\n ConvexDoc extends GenericDocument,\n FieldPaths extends ReadonlyArray<string>,\n>(): Builder<ConvexDoc, FieldPaths> =>\n makeBuilder([]) as unknown as Builder<ConvexDoc, FieldPaths>;\n\n/**\n * Number of index fields pinned by equality constraints.\n *\n * @experimental\n */\nexport const equalityPrefixLength = (self: QueryStreamIndexRange): number =>\n self[TypeId].equalities.length;\n\ninterface ConvexUpperBoundBuilder extends ConvexIndexRange {\n readonly lt: (\n fieldPath: string,\n value: QueryStreamKeyValues.KeyValue,\n ) => ConvexIndexRange;\n readonly lte: (\n fieldPath: string,\n value: QueryStreamKeyValues.KeyValue,\n ) => ConvexIndexRange;\n}\n\ninterface ConvexRangeBuilder extends ConvexUpperBoundBuilder {\n readonly eq: (\n fieldPath: string,\n value: QueryStreamKeyValues.KeyValue,\n ) => ConvexRangeBuilder;\n readonly gt: (\n fieldPath: string,\n value: QueryStreamKeyValues.KeyValue,\n ) => ConvexUpperBoundBuilder;\n readonly gte: (\n fieldPath: string,\n value: QueryStreamKeyValues.KeyValue,\n ) => ConvexUpperBoundBuilder;\n}\n\n/**\n * Apply one range to Convex's index-range builder.\n *\n * @experimental\n */\nexport const apply = (\n self: QueryStreamIndexRange,\n q: ConvexIndexRangeBuilder<GenericDocument, string[]>,\n): ConvexIndexRange => {\n const { equalities, bounded } = self[TypeId];\n // Convex tracks equality progress through a static field tuple. These paths\n // are runtime data; the range model owns their ordering. Its runtime builder\n // supports further equality calls, even when the SDK type has lost the tuple.\n const prefix = Array.reduce(\n equalities,\n q as ConvexRangeBuilder,\n (target, { fieldPath, value }) => target.eq(fieldPath, value),\n );\n return Option.match(bounded, {\n onNone: () => prefix,\n onSome: ({ fieldPath, interval }) => {\n const lower = (\n target: ConvexRangeBuilder,\n endpoint: Endpoint,\n ): ConvexUpperBoundBuilder =>\n target[endpoint.inclusive ? \"gte\" : \"gt\"](fieldPath, endpoint.value);\n const upper = (\n target: ConvexUpperBoundBuilder,\n endpoint: Endpoint,\n ): ConvexIndexRange =>\n target[endpoint.inclusive ? \"lte\" : \"lt\"](fieldPath, endpoint.value);\n return Interval.$match(interval, {\n Lower: ({ lower: endpoint }) => lower(prefix, endpoint),\n Upper: ({ upper: endpoint }) => upper(prefix, endpoint),\n Between: (endpoints) =>\n upper(lower(prefix, endpoints.lower), endpoints.upper),\n });\n },\n });\n};\n\n// Convex index ranges have the shape `eq(f1) … eq(fn), gt/gte(fm)?,\n// lt/lte(fm)?`—every field path pinned except the last, which may carry two\n// inequalities. An arbitrary range between two index keys therefore\n// decomposes into a *sequence* of Convex-expressible ranges (the port of\n// `convex-helpers`' `splitRange`): e.g. `(1, 2, 3) < key <= (1, 3, 2)` over\n// field paths `(f1, f2, f3)` becomes\n//\n// 1. eq(f1, 1), eq(f2, 2), gt(f3, 3)\n// 2. eq(f1, 1), gt(f2, 2), lt(f2, 3)\n// 3. eq(f1, 1), eq(f2, 3), lte(f3, 2)\n\ntype BoundTag = \"gt\" | \"gte\" | \"lt\" | \"lte\";\n\nclass TaggedBound extends Data.Class<{\n readonly indexEntries: QueryStreamIndexPrefix.IndexEntries;\n readonly tag: BoundTag;\n}> {}\n\n/**\n * Dropping a bound's last entry bounds the remaining prefix exclusively.\n */\nconst excludePrefix = (tag: BoundTag): BoundTag =>\n Match.value(tag).pipe(\n Match.whenOr(\"gt\", \"gte\", () => \"gt\" as const),\n Match.whenOr(\"lt\", \"lte\", () => \"lt\" as const),\n Match.exhaustive,\n );\n\n/**\n * Peel a bound down to the single entry that feeds the middle range.\n */\nconst peelBound = (\n indexEntries: QueryStreamIndexPrefix.IndexEntries,\n tag: BoundTag,\n): {\n readonly peeled: ReadonlyArray<TaggedBound>;\n readonly final: TaggedBound;\n} =>\n indexEntries.length <= 1\n ? { peeled: [], final: new TaggedBound({ indexEntries, tag }) }\n : pipe(\n peelBound(Array.dropRight(indexEntries, 1), excludePrefix(tag)),\n ({ final, peeled }) => ({\n peeled: Array.prepend(peeled, new TaggedBound({ indexEntries, tag })),\n final,\n }),\n );\n\n/**\n * Pin every entry but the last, which gets the bound tag.\n */\nconst rangeFor = (\n prefix: ReadonlyArray<Equality>,\n indexEntries: QueryStreamIndexPrefix.IndexEntries,\n tag: BoundTag,\n): QueryStreamIndexRange =>\n Option.match(Array.last(indexEntries), {\n onNone: () => make({ equalities: prefix, bounded: Option.none() }),\n onSome: ([fieldPath, value]) =>\n make({\n equalities: Array.appendAll(\n prefix,\n Array.map(Array.dropRight(indexEntries, 1), ([path, pinned]) => ({\n fieldPath: path,\n value: pinned,\n })),\n ),\n bounded: Option.some({\n fieldPath,\n interval:\n tag === \"gt\" || tag === \"gte\"\n ? Interval.Lower({ lower: { value, inclusive: tag === \"gte\" } })\n : Interval.Upper({ upper: { value, inclusive: tag === \"lte\" } }),\n }),\n }),\n });\n\n/**\n * Decompose the range between `indexBounds.lower` and `indexBounds.upper` (over\n * the complete index `fieldPaths`, `_id` tiebreaker included) into a sequence\n * of Convex-expressible ranges, ordered for the given direction.\n *\n * @experimental\n */\nexport const fromBounds = (\n fieldPaths: ReadonlyArray<string>,\n orderDirection: QueryStreamOrderDirection.QueryStreamOrderDirection,\n indexBounds: QueryStreamKeyBounds.IndexBounds,\n): Result.Result<\n ReadonlyArray<QueryStreamIndexRange>,\n QueryStreamIndexPrefix.IndexPrefixWidthMismatchError\n> =>\n Result.gen(function* () {\n const lowerIndexEntries = QueryStreamIndexPrefix.entries(\n yield* QueryStreamIndexPrefix.make(\n fieldPaths,\n indexBounds.lower.keyValues,\n ),\n );\n const upperIndexEntries = QueryStreamIndexPrefix.entries(\n yield* QueryStreamIndexPrefix.make(\n fieldPaths,\n indexBounds.upper.keyValues,\n ),\n );\n // Equal cuts are an empty range too: e.g. lower exclusive at `k` and\n // upper inclusive at `k`—the half-open (k, k]—both cut at\n // successor(k).\n if (QueryStreamKeyBounds.isEmpty(indexBounds)) {\n return [];\n }\n\n const commonLength = pipe(\n Array.zip(indexBounds.lower.keyValues, indexBounds.upper.keyValues),\n Array.takeWhile(\n ([lowerValue, upperValue]) =>\n QueryStreamKeyValues.ValueOrder(lowerValue, upperValue) === 0,\n ),\n Array.length,\n );\n const equalities = pipe(\n Array.take(lowerIndexEntries, commonLength),\n Array.map(([fieldPath, value]) => ({ fieldPath, value })),\n );\n\n const lower = peelBound(\n Array.drop(lowerIndexEntries, commonLength),\n indexBounds.lower.inclusive ? \"gte\" : \"gt\",\n );\n const upper = peelBound(\n Array.drop(upperIndexEntries, commonLength),\n indexBounds.upper.inclusive ? \"lte\" : \"lt\",\n );\n\n const startIndexRanges = Array.map(lower.peeled, ({ indexEntries, tag }) =>\n rangeFor(equalities, indexEntries, tag),\n );\n const endIndexRanges = Array.reverse(\n Array.map(upper.peeled, ({ indexEntries, tag }) =>\n rangeFor(equalities, indexEntries, tag),\n ),\n );\n\n const { indexEntries: lowerFinalIndexEntries, tag: lowerFinalTag } =\n lower.final;\n const { indexEntries: upperFinalIndexEntries, tag: upperFinalTag } =\n upper.final;\n const middleIndexRange =\n Array.isReadonlyArrayNonEmpty(lowerFinalIndexEntries) &&\n Array.isReadonlyArrayNonEmpty(upperFinalIndexEntries)\n ? make({\n equalities,\n bounded: Option.some({\n fieldPath: Array.headNonEmpty(lowerFinalIndexEntries)[0],\n interval: Interval.Between({\n lower: {\n value: Array.headNonEmpty(lowerFinalIndexEntries)[1],\n inclusive: lowerFinalTag === \"gte\",\n },\n upper: {\n value: Array.headNonEmpty(upperFinalIndexEntries)[1],\n inclusive: upperFinalTag === \"lte\",\n },\n }),\n }),\n })\n : Array.isReadonlyArrayNonEmpty(lowerFinalIndexEntries)\n ? rangeFor(equalities, lowerFinalIndexEntries, lowerFinalTag)\n : rangeFor(equalities, upperFinalIndexEntries, upperFinalTag);\n\n const indexRanges = Array.appendAll(\n Array.appendAll(startIndexRanges, Array.of(middleIndexRange)),\n endIndexRanges,\n );\n return orderDirection === \"desc\" ? Array.reverse(indexRanges) : indexRanges;\n });\n\n/**\n * Derive full-index bounds directly from the structural range.\n *\n * @experimental\n */\nexport const toBounds = (\n self: QueryStreamIndexRange,\n): QueryStreamKeyBounds.IndexBounds => {\n const { equalities, bounded } = self[TypeId];\n const keyValues = Array.map(equalities, (equality) => equality.value);\n const unbounded = { keyValues, inclusive: true };\n const endpoint = ({ value, inclusive }: Endpoint) => ({\n keyValues: Array.append(keyValues, value),\n inclusive,\n });\n return Option.match(bounded, {\n onNone: () => ({ lower: unbounded, upper: unbounded }),\n onSome: ({ interval }) =>\n Interval.$match(interval, {\n Lower: ({ lower }) => ({ lower: endpoint(lower), upper: unbounded }),\n Upper: ({ upper }) => ({ lower: unbounded, upper: endpoint(upper) }),\n Between: ({ lower, upper }) => ({\n lower: endpoint(lower),\n upper: endpoint(upper),\n }),\n }),\n });\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import * as Data from "effect/Data";
|
|
2
|
+
import * as Result from "effect/Result";
|
|
3
|
+
import * as QueryStreamKeyLayout from "./QueryStreamKeyLayout";
|
|
4
|
+
import type * as QueryStreamKeyValues from "./QueryStreamKeyValues";
|
|
5
|
+
declare const TypeId = "~@confect/server/QueryStreamKey";
|
|
6
|
+
interface Payload {
|
|
7
|
+
readonly [TypeId]: typeof TypeId;
|
|
8
|
+
readonly layout: QueryStreamKeyLayout.QueryStreamKeyLayout;
|
|
9
|
+
readonly values: QueryStreamKeyValues.QueryStreamKeyValues;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* @experimental
|
|
13
|
+
*/
|
|
14
|
+
export type QueryStreamKey = Data.TaggedEnum<{
|
|
15
|
+
Complete: Payload;
|
|
16
|
+
Prefix: Payload;
|
|
17
|
+
}>;
|
|
18
|
+
/**
|
|
19
|
+
* @experimental
|
|
20
|
+
*/
|
|
21
|
+
export type Complete = Data.TaggedEnum.Value<QueryStreamKey, "Complete">;
|
|
22
|
+
/**
|
|
23
|
+
* @experimental
|
|
24
|
+
*/
|
|
25
|
+
export type Prefix = Data.TaggedEnum.Value<QueryStreamKey, "Prefix">;
|
|
26
|
+
declare const KeyWidthMismatchError_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 & {
|
|
27
|
+
readonly _tag: "KeyWidthMismatchError";
|
|
28
|
+
} & Readonly<A>;
|
|
29
|
+
/**
|
|
30
|
+
* @experimental
|
|
31
|
+
*/
|
|
32
|
+
export declare class KeyWidthMismatchError extends KeyWidthMismatchError_base<{
|
|
33
|
+
readonly kind: "complete" | "prefix";
|
|
34
|
+
readonly width: number;
|
|
35
|
+
readonly actual: number;
|
|
36
|
+
}> {
|
|
37
|
+
get message(): string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* @experimental
|
|
41
|
+
*/
|
|
42
|
+
export declare const complete: (layout: QueryStreamKeyLayout.QueryStreamKeyLayout, values: QueryStreamKeyValues.QueryStreamKeyValues) => Result.Result<Complete, KeyWidthMismatchError>;
|
|
43
|
+
/**
|
|
44
|
+
* @experimental
|
|
45
|
+
*/
|
|
46
|
+
export declare const prefix: (layout: QueryStreamKeyLayout.QueryStreamKeyLayout, values: QueryStreamKeyValues.QueryStreamKeyValues) => Result.Result<Prefix, KeyWidthMismatchError>;
|
|
47
|
+
/**
|
|
48
|
+
* @experimental
|
|
49
|
+
*/
|
|
50
|
+
export declare const toPrefix: (self: Complete) => Prefix;
|
|
51
|
+
/**
|
|
52
|
+
* @experimental
|
|
53
|
+
*/
|
|
54
|
+
export declare const values: (self: QueryStreamKey) => QueryStreamKeyValues.QueryStreamKeyValues;
|
|
55
|
+
/**
|
|
56
|
+
* @experimental
|
|
57
|
+
*/
|
|
58
|
+
export declare const layout: (self: QueryStreamKey) => QueryStreamKeyLayout.QueryStreamKeyLayout;
|
|
59
|
+
/**
|
|
60
|
+
* @experimental
|
|
61
|
+
*/
|
|
62
|
+
export declare const isComplete: (value: unknown) => value is Complete;
|
|
63
|
+
export {};
|
|
64
|
+
//# sourceMappingURL=QueryStreamKey.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryStreamKey.d.ts","sourceRoot":"","sources":["../src/QueryStreamKey.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,aAAa,CAAC;AAEpC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,oBAAoB,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,KAAK,oBAAoB,MAAM,wBAAwB,CAAC;AAEpE,QAAA,MAAM,MAAM,oCAAoC,CAAC;AAEjD,UAAU,OAAO;IACf,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,MAAM,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC,oBAAoB,CAAC;IAC3D,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC,oBAAoB,CAAC;CAC5D;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC,CAAC;AAGH;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;AACzE;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;;;;AAErE;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,2BAEzC;IACA,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,QAAQ,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAE7B;CACF;AAED;;GAEG;AACH,eAAO,MAAM,QAAQ,WACX,oBAAoB,CAAC,oBAAoB,UACzC,oBAAoB,CAAC,oBAAoB,KAChD,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,qBAAqB,CAa/C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,MAAM,WACT,oBAAoB,CAAC,oBAAoB,UACzC,oBAAoB,CAAC,oBAAoB,KAChD,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAa7C,CAAC;AAGF;;GAEG;AACH,eAAO,MAAM,QAAQ,SAAU,QAAQ,KAAG,MAKtC,CAAC;AAEL;;GAEG;AACH,eAAO,MAAM,MAAM,SACX,cAAc,KACnB,oBAAoB,CAAC,oBAAmC,CAAC;AAC5D;;GAEG;AACH,eAAO,MAAM,MAAM,SACX,cAAc,KACnB,oBAAoB,CAAC,oBAAmC,CAAC;AAE5D;;GAEG;AACH,eAAO,MAAM,UAAU,UAAW,OAAO,KAAG,KAAK,IAAI,QAC0B,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { runtimeWidth } from "./QueryStreamKeyLayout.js";
|
|
2
|
+
import * as Predicate from "effect/Predicate";
|
|
3
|
+
import * as Result from "effect/Result";
|
|
4
|
+
import * as Data from "effect/Data";
|
|
5
|
+
//#region src/QueryStreamKey.ts
|
|
6
|
+
const TypeId = "~@confect/server/QueryStreamKey";
|
|
7
|
+
const QueryStreamKey = Data.taggedEnum();
|
|
8
|
+
/**
|
|
9
|
+
* @experimental
|
|
10
|
+
*/
|
|
11
|
+
var KeyWidthMismatchError = class extends Data.TaggedError("KeyWidthMismatchError") {
|
|
12
|
+
get message() {
|
|
13
|
+
return `Invalid ${this.kind} key width (${this.actual}); expected ${this.kind === "complete" ? "exactly" : "at most"} ${this.width}`;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* @experimental
|
|
18
|
+
*/
|
|
19
|
+
const complete = (layout, values) => {
|
|
20
|
+
const width = runtimeWidth(layout);
|
|
21
|
+
return values.length === width ? Result.succeed(QueryStreamKey.Complete({
|
|
22
|
+
[TypeId]: TypeId,
|
|
23
|
+
layout,
|
|
24
|
+
values
|
|
25
|
+
})) : Result.fail(new KeyWidthMismatchError({
|
|
26
|
+
kind: "complete",
|
|
27
|
+
width,
|
|
28
|
+
actual: values.length
|
|
29
|
+
}));
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* @experimental
|
|
33
|
+
*/
|
|
34
|
+
const prefix = (layout, values) => {
|
|
35
|
+
const width = runtimeWidth(layout);
|
|
36
|
+
return values.length <= width ? Result.succeed(QueryStreamKey.Prefix({
|
|
37
|
+
[TypeId]: TypeId,
|
|
38
|
+
layout,
|
|
39
|
+
values
|
|
40
|
+
})) : Result.fail(new KeyWidthMismatchError({
|
|
41
|
+
kind: "prefix",
|
|
42
|
+
width,
|
|
43
|
+
actual: values.length
|
|
44
|
+
}));
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* @experimental
|
|
48
|
+
*/
|
|
49
|
+
const toPrefix = (self) => QueryStreamKey.Prefix({
|
|
50
|
+
[TypeId]: TypeId,
|
|
51
|
+
layout: self.layout,
|
|
52
|
+
values: self.values
|
|
53
|
+
});
|
|
54
|
+
/**
|
|
55
|
+
* @experimental
|
|
56
|
+
*/
|
|
57
|
+
const values = (self) => self.values;
|
|
58
|
+
/**
|
|
59
|
+
* @experimental
|
|
60
|
+
*/
|
|
61
|
+
const layout = (self) => self.layout;
|
|
62
|
+
/**
|
|
63
|
+
* @experimental
|
|
64
|
+
*/
|
|
65
|
+
const isComplete = (value) => Predicate.hasProperty(value, TypeId) && QueryStreamKey.$is("Complete")(value);
|
|
66
|
+
//#endregion
|
|
67
|
+
export { KeyWidthMismatchError, complete, isComplete, layout, prefix, toPrefix, values };
|
|
68
|
+
|
|
69
|
+
//# sourceMappingURL=QueryStreamKey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryStreamKey.js","names":["QueryStreamKeyLayout.runtimeWidth"],"sources":["../src/QueryStreamKey.ts"],"sourcesContent":["import * as Data from \"effect/Data\";\nimport * as Predicate from \"effect/Predicate\";\nimport * as Result from \"effect/Result\";\nimport * as QueryStreamKeyLayout from \"./QueryStreamKeyLayout\";\nimport type * as QueryStreamKeyValues from \"./QueryStreamKeyValues\";\n\nconst TypeId = \"~@confect/server/QueryStreamKey\";\n\ninterface Payload {\n readonly [TypeId]: typeof TypeId;\n readonly layout: QueryStreamKeyLayout.QueryStreamKeyLayout;\n readonly values: QueryStreamKeyValues.QueryStreamKeyValues;\n}\n\n/**\n * @experimental\n */\nexport type QueryStreamKey = Data.TaggedEnum<{\n Complete: Payload;\n Prefix: Payload;\n}>;\nconst QueryStreamKey = Data.taggedEnum<QueryStreamKey>();\n\n/**\n * @experimental\n */\nexport type Complete = Data.TaggedEnum.Value<QueryStreamKey, \"Complete\">;\n/**\n * @experimental\n */\nexport type Prefix = Data.TaggedEnum.Value<QueryStreamKey, \"Prefix\">;\n\n/**\n * @experimental\n */\nexport class KeyWidthMismatchError extends Data.TaggedError(\n \"KeyWidthMismatchError\",\n)<{\n readonly kind: \"complete\" | \"prefix\";\n readonly width: number;\n readonly actual: number;\n}> {\n override get message(): string {\n return `Invalid ${this.kind} key width (${this.actual}); expected ${this.kind === \"complete\" ? \"exactly\" : \"at most\"} ${this.width}`;\n }\n}\n\n/**\n * @experimental\n */\nexport const complete = (\n layout: QueryStreamKeyLayout.QueryStreamKeyLayout,\n values: QueryStreamKeyValues.QueryStreamKeyValues,\n): Result.Result<Complete, KeyWidthMismatchError> => {\n const width = QueryStreamKeyLayout.runtimeWidth(layout);\n return values.length === width\n ? Result.succeed(\n QueryStreamKey.Complete({ [TypeId]: TypeId, layout, values }),\n )\n : Result.fail(\n new KeyWidthMismatchError({\n kind: \"complete\",\n width,\n actual: values.length,\n }),\n );\n};\n\n/**\n * @experimental\n */\nexport const prefix = (\n layout: QueryStreamKeyLayout.QueryStreamKeyLayout,\n values: QueryStreamKeyValues.QueryStreamKeyValues,\n): Result.Result<Prefix, KeyWidthMismatchError> => {\n const width = QueryStreamKeyLayout.runtimeWidth(layout);\n return values.length <= width\n ? Result.succeed(\n QueryStreamKey.Prefix({ [TypeId]: TypeId, layout, values }),\n )\n : Result.fail(\n new KeyWidthMismatchError({\n kind: \"prefix\",\n width,\n actual: values.length,\n }),\n );\n};\n\n// A complete key already satisfies the prefix width guarantee.\n/**\n * @experimental\n */\nexport const toPrefix = (self: Complete): Prefix =>\n QueryStreamKey.Prefix({\n [TypeId]: TypeId,\n layout: self.layout,\n values: self.values,\n });\n\n/**\n * @experimental\n */\nexport const values = (\n self: QueryStreamKey,\n): QueryStreamKeyValues.QueryStreamKeyValues => self.values;\n/**\n * @experimental\n */\nexport const layout = (\n self: QueryStreamKey,\n): QueryStreamKeyLayout.QueryStreamKeyLayout => self.layout;\n\n/**\n * @experimental\n */\nexport const isComplete = (value: unknown): value is Complete =>\n Predicate.hasProperty(value, TypeId) && QueryStreamKey.$is(\"Complete\")(value);\n"],"mappings":";;;;;AAMA,MAAM,SAAS;AAef,MAAM,iBAAiB,KAAK,WAA2B;;;;AAcvD,IAAa,wBAAb,cAA2C,KAAK,YAC9C,uBACF,CAAC,CAIE;CACD,IAAa,UAAkB;EAC7B,OAAO,WAAW,KAAK,KAAK,cAAc,KAAK,OAAO,cAAc,KAAK,SAAS,aAAa,YAAY,UAAU,GAAG,KAAK;CAC/H;AACF;;;;AAKA,MAAa,YACX,QACA,WACmD;CACnD,MAAM,QAAQA,aAAkC,MAAM;CACtD,OAAO,OAAO,WAAW,QACrB,OAAO,QACL,eAAe,SAAS;GAAG,SAAS;EAAQ;EAAQ;CAAO,CAAC,CAC9D,IACA,OAAO,KACL,IAAI,sBAAsB;EACxB,MAAM;EACN;EACA,QAAQ,OAAO;CACjB,CAAC,CACH;AACN;;;;AAKA,MAAa,UACX,QACA,WACiD;CACjD,MAAM,QAAQA,aAAkC,MAAM;CACtD,OAAO,OAAO,UAAU,QACpB,OAAO,QACL,eAAe,OAAO;GAAG,SAAS;EAAQ;EAAQ;CAAO,CAAC,CAC5D,IACA,OAAO,KACL,IAAI,sBAAsB;EACxB,MAAM;EACN;EACA,QAAQ,OAAO;CACjB,CAAC,CACH;AACN;;;;AAMA,MAAa,YAAY,SACvB,eAAe,OAAO;EACnB,SAAS;CACV,QAAQ,KAAK;CACb,QAAQ,KAAK;AACf,CAAC;;;;AAKH,MAAa,UACX,SAC8C,KAAK;;;;AAIrD,MAAa,UACX,SAC8C,KAAK;;;;AAKrD,MAAa,cAAc,UACzB,UAAU,YAAY,OAAO,MAAM,KAAK,eAAe,IAAI,UAAU,CAAC,CAAC,KAAK"}
|