effect-dynamodb 0.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/LICENSE +21 -0
- package/README.md +69 -0
- package/dist/Aggregate.d.ts +210 -0
- package/dist/Aggregate.d.ts.map +1 -0
- package/dist/Aggregate.js +1169 -0
- package/dist/Aggregate.js.map +1 -0
- package/dist/Batch.d.ts +62 -0
- package/dist/Batch.d.ts.map +1 -0
- package/dist/Batch.js +218 -0
- package/dist/Batch.js.map +1 -0
- package/dist/Collection.d.ts +58 -0
- package/dist/Collection.d.ts.map +1 -0
- package/dist/Collection.js +195 -0
- package/dist/Collection.js.map +1 -0
- package/dist/Collections.d.ts +121 -0
- package/dist/Collections.d.ts.map +1 -0
- package/dist/Collections.js +121 -0
- package/dist/Collections.js.map +1 -0
- package/dist/DynamoClient.d.ts +317 -0
- package/dist/DynamoClient.d.ts.map +1 -0
- package/dist/DynamoClient.js +653 -0
- package/dist/DynamoClient.js.map +1 -0
- package/dist/DynamoModel.d.ts +278 -0
- package/dist/DynamoModel.d.ts.map +1 -0
- package/dist/DynamoModel.js +453 -0
- package/dist/DynamoModel.js.map +1 -0
- package/dist/DynamoSchema.d.ts +137 -0
- package/dist/DynamoSchema.d.ts.map +1 -0
- package/dist/DynamoSchema.js +188 -0
- package/dist/DynamoSchema.js.map +1 -0
- package/dist/Entity.d.ts +628 -0
- package/dist/Entity.d.ts.map +1 -0
- package/dist/Entity.js +2371 -0
- package/dist/Entity.js.map +1 -0
- package/dist/Errors.d.ts +227 -0
- package/dist/Errors.d.ts.map +1 -0
- package/dist/Errors.js +93 -0
- package/dist/Errors.js.map +1 -0
- package/dist/EventStore.d.ts +208 -0
- package/dist/EventStore.d.ts.map +1 -0
- package/dist/EventStore.js +333 -0
- package/dist/EventStore.js.map +1 -0
- package/dist/Expression.d.ts +50 -0
- package/dist/Expression.d.ts.map +1 -0
- package/dist/Expression.js +170 -0
- package/dist/Expression.js.map +1 -0
- package/dist/KeyComposer.d.ts +125 -0
- package/dist/KeyComposer.d.ts.map +1 -0
- package/dist/KeyComposer.js +257 -0
- package/dist/KeyComposer.js.map +1 -0
- package/dist/Marshaller.d.ts +30 -0
- package/dist/Marshaller.d.ts.map +1 -0
- package/dist/Marshaller.js +115 -0
- package/dist/Marshaller.js.map +1 -0
- package/dist/Projection.d.ts +28 -0
- package/dist/Projection.d.ts.map +1 -0
- package/dist/Projection.js +39 -0
- package/dist/Projection.js.map +1 -0
- package/dist/Query.d.ts +214 -0
- package/dist/Query.d.ts.map +1 -0
- package/dist/Query.js +397 -0
- package/dist/Query.js.map +1 -0
- package/dist/Table.d.ts +178 -0
- package/dist/Table.d.ts.map +1 -0
- package/dist/Table.js +211 -0
- package/dist/Table.js.map +1 -0
- package/dist/Transaction.d.ts +79 -0
- package/dist/Transaction.d.ts.map +1 -0
- package/dist/Transaction.js +215 -0
- package/dist/Transaction.js.map +1 -0
- package/dist/_AggregateCursor.d.ts +44 -0
- package/dist/_AggregateCursor.d.ts.map +1 -0
- package/dist/_AggregateCursor.js +18 -0
- package/dist/_AggregateCursor.js.map +1 -0
- package/dist/_AggregateEdges.d.ts +77 -0
- package/dist/_AggregateEdges.d.ts.map +1 -0
- package/dist/_AggregateEdges.js +41 -0
- package/dist/_AggregateEdges.js.map +1 -0
- package/dist/_AggregateSchemas.d.ts +69 -0
- package/dist/_AggregateSchemas.d.ts.map +1 -0
- package/dist/_AggregateSchemas.js +194 -0
- package/dist/_AggregateSchemas.js.map +1 -0
- package/dist/_AggregateTypes.d.ts +94 -0
- package/dist/_AggregateTypes.d.ts.map +1 -0
- package/dist/_AggregateTypes.js +7 -0
- package/dist/_AggregateTypes.js.map +1 -0
- package/dist/_EntityCombinators.d.ts +155 -0
- package/dist/_EntityCombinators.d.ts.map +1 -0
- package/dist/_EntityCombinators.js +158 -0
- package/dist/_EntityCombinators.js.map +1 -0
- package/dist/_EntityConfig.d.ts +100 -0
- package/dist/_EntityConfig.d.ts.map +1 -0
- package/dist/_EntityConfig.js +7 -0
- package/dist/_EntityConfig.js.map +1 -0
- package/dist/_EntityOps.d.ts +205 -0
- package/dist/_EntityOps.d.ts.map +1 -0
- package/dist/_EntityOps.js +137 -0
- package/dist/_EntityOps.js.map +1 -0
- package/dist/_EntitySchemas.d.ts +57 -0
- package/dist/_EntitySchemas.d.ts.map +1 -0
- package/dist/_EntitySchemas.js +298 -0
- package/dist/_EntitySchemas.js.map +1 -0
- package/dist/_EntityTypes.d.ts +81 -0
- package/dist/_EntityTypes.d.ts.map +1 -0
- package/dist/_EntityTypes.js +7 -0
- package/dist/_EntityTypes.js.map +1 -0
- package/dist/_sparse_check.d.ts +2 -0
- package/dist/_sparse_check.d.ts.map +1 -0
- package/dist/_sparse_check.js +193 -0
- package/dist/_sparse_check.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/AggregateCursor.d.ts +44 -0
- package/dist/internal/AggregateCursor.d.ts.map +1 -0
- package/dist/internal/AggregateCursor.js +18 -0
- package/dist/internal/AggregateCursor.js.map +1 -0
- package/dist/internal/AggregateEdges.d.ts +77 -0
- package/dist/internal/AggregateEdges.d.ts.map +1 -0
- package/dist/internal/AggregateEdges.js +41 -0
- package/dist/internal/AggregateEdges.js.map +1 -0
- package/dist/internal/AggregateSchemas.d.ts +69 -0
- package/dist/internal/AggregateSchemas.d.ts.map +1 -0
- package/dist/internal/AggregateSchemas.js +193 -0
- package/dist/internal/AggregateSchemas.js.map +1 -0
- package/dist/internal/AggregateTypes.d.ts +94 -0
- package/dist/internal/AggregateTypes.d.ts.map +1 -0
- package/dist/internal/AggregateTypes.js +7 -0
- package/dist/internal/AggregateTypes.js.map +1 -0
- package/dist/internal/BoundQuery.d.ts +107 -0
- package/dist/internal/BoundQuery.d.ts.map +1 -0
- package/dist/internal/BoundQuery.js +111 -0
- package/dist/internal/BoundQuery.js.map +1 -0
- package/dist/internal/EntityCombinators.d.ts +173 -0
- package/dist/internal/EntityCombinators.d.ts.map +1 -0
- package/dist/internal/EntityCombinators.js +183 -0
- package/dist/internal/EntityCombinators.js.map +1 -0
- package/dist/internal/EntityConfig.d.ts +100 -0
- package/dist/internal/EntityConfig.d.ts.map +1 -0
- package/dist/internal/EntityConfig.js +7 -0
- package/dist/internal/EntityConfig.js.map +1 -0
- package/dist/internal/EntityOps.d.ts +268 -0
- package/dist/internal/EntityOps.d.ts.map +1 -0
- package/dist/internal/EntityOps.js +153 -0
- package/dist/internal/EntityOps.js.map +1 -0
- package/dist/internal/EntitySchemas.d.ts +57 -0
- package/dist/internal/EntitySchemas.d.ts.map +1 -0
- package/dist/internal/EntitySchemas.js +299 -0
- package/dist/internal/EntitySchemas.js.map +1 -0
- package/dist/internal/EntityTypes.d.ts +128 -0
- package/dist/internal/EntityTypes.d.ts.map +1 -0
- package/dist/internal/EntityTypes.js +7 -0
- package/dist/internal/EntityTypes.js.map +1 -0
- package/dist/internal/Expr.d.ts +141 -0
- package/dist/internal/Expr.d.ts.map +1 -0
- package/dist/internal/Expr.js +332 -0
- package/dist/internal/Expr.js.map +1 -0
- package/dist/internal/PathBuilder.d.ts +88 -0
- package/dist/internal/PathBuilder.d.ts.map +1 -0
- package/dist/internal/PathBuilder.js +100 -0
- package/dist/internal/PathBuilder.js.map +1 -0
- package/dist/internal/TransactableOps.d.ts +25 -0
- package/dist/internal/TransactableOps.d.ts.map +1 -0
- package/dist/internal/TransactableOps.js +58 -0
- package/dist/internal/TransactableOps.js.map +1 -0
- package/dist/internal/sparse_check.d.ts +2 -0
- package/dist/internal/sparse_check.d.ts.map +1 -0
- package/dist/internal/sparse_check.js +196 -0
- package/dist/internal/sparse_check.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Marshaller — Thin wrapper around @aws-sdk/util-dynamodb for converting
|
|
3
|
+
* between JS objects and DynamoDB attribute maps, plus date-aware serialization
|
|
4
|
+
* for DynamoEncoding-annotated fields.
|
|
5
|
+
*/
|
|
6
|
+
import { marshall, unmarshall } from "@aws-sdk/util-dynamodb";
|
|
7
|
+
import { DateTime } from "effect";
|
|
8
|
+
/** Marshall a JS object to a DynamoDB attribute map */
|
|
9
|
+
export const toAttributeMap = (item) => marshall(item, { removeUndefinedValues: true, convertClassInstanceToMap: true });
|
|
10
|
+
/** Unmarshall a DynamoDB attribute map to a JS object */
|
|
11
|
+
export const fromAttributeMap = (item) => unmarshall(item);
|
|
12
|
+
/** Marshall a single value to a DynamoDB attribute value */
|
|
13
|
+
export const toAttributeValue = (value) => marshall({ v: value }).v;
|
|
14
|
+
/** Unmarshall a single DynamoDB attribute value */
|
|
15
|
+
export const fromAttributeValue = (value) => unmarshall({ v: value }).v;
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Date-aware serialization for DynamoEncoding-annotated fields
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
/**
|
|
20
|
+
* Convert a domain date value to the storage primitive based on DynamoEncoding.
|
|
21
|
+
*
|
|
22
|
+
* Domain types supported:
|
|
23
|
+
* - `DateTime.Utc` → ISO string, epoch ms, or epoch seconds
|
|
24
|
+
* - `DateTime.Zoned` → extended ISO string (only "string" storage)
|
|
25
|
+
* - `Date` → ISO string, epoch ms, or epoch seconds
|
|
26
|
+
*/
|
|
27
|
+
export const serializeDateForDynamo = (value, encoding) => {
|
|
28
|
+
let epochMs;
|
|
29
|
+
if (DateTime.isDateTime(value)) {
|
|
30
|
+
epochMs = DateTime.toEpochMillis(value);
|
|
31
|
+
}
|
|
32
|
+
else if (value instanceof Date) {
|
|
33
|
+
epochMs = value.getTime();
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
throw new Error(`serializeDateForDynamo: unsupported value type: ${typeof value}`);
|
|
37
|
+
}
|
|
38
|
+
switch (encoding.storage) {
|
|
39
|
+
case "string":
|
|
40
|
+
if (encoding.domain === "DateTime.Zoned" &&
|
|
41
|
+
DateTime.isDateTime(value) &&
|
|
42
|
+
DateTime.isZoned(value)) {
|
|
43
|
+
return DateTime.formatIsoZoned(value);
|
|
44
|
+
}
|
|
45
|
+
return new Date(epochMs).toISOString();
|
|
46
|
+
case "epochMs":
|
|
47
|
+
return epochMs;
|
|
48
|
+
case "epochSeconds":
|
|
49
|
+
return Math.floor(epochMs / 1000);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Convert a DynamoDB storage primitive back to the domain value based on DynamoEncoding.
|
|
54
|
+
*/
|
|
55
|
+
export const deserializeDateFromDynamo = (stored, encoding) => {
|
|
56
|
+
const label = `${encoding.domain}/${encoding.storage}`;
|
|
57
|
+
switch (encoding.domain) {
|
|
58
|
+
case "DateTime.Zoned": {
|
|
59
|
+
if (typeof stored !== "string") {
|
|
60
|
+
throw new Error(`deserializeDateFromDynamo: expected string for ${label}, got ${typeof stored}`);
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
const match = stored.match(/^(.+)\[(.+)\]$/);
|
|
64
|
+
if (match) {
|
|
65
|
+
const utc = DateTime.makeUnsafe(match[1]);
|
|
66
|
+
return DateTime.makeZonedUnsafe(utc, { timeZone: match[2] });
|
|
67
|
+
}
|
|
68
|
+
// Offset-only or plain ISO → treat as UTC-zoned
|
|
69
|
+
const utc = DateTime.makeUnsafe(stored);
|
|
70
|
+
return DateTime.makeZonedUnsafe(utc, { timeZone: "UTC" });
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
throw new Error(`deserializeDateFromDynamo: invalid DateTime.Zoned value "${stored}": ${e instanceof Error ? e.message : e}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
case "DateTime.Utc": {
|
|
77
|
+
if (encoding.storage === "string") {
|
|
78
|
+
if (typeof stored !== "string") {
|
|
79
|
+
throw new Error(`deserializeDateFromDynamo: expected string for ${label}, got ${typeof stored}`);
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
return DateTime.makeUnsafe(stored);
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
throw new Error(`deserializeDateFromDynamo: invalid DateTime.Utc value "${stored}": ${e instanceof Error ? e.message : e}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (typeof stored !== "number" || !Number.isFinite(stored)) {
|
|
89
|
+
throw new Error(`deserializeDateFromDynamo: expected finite number for ${label}, got ${typeof stored === "number" ? stored : typeof stored}`);
|
|
90
|
+
}
|
|
91
|
+
if (encoding.storage === "epochMs")
|
|
92
|
+
return DateTime.makeUnsafe(stored);
|
|
93
|
+
return DateTime.makeUnsafe(stored * 1000);
|
|
94
|
+
}
|
|
95
|
+
case "Date": {
|
|
96
|
+
if (encoding.storage === "string") {
|
|
97
|
+
if (typeof stored !== "string") {
|
|
98
|
+
throw new Error(`deserializeDateFromDynamo: expected string for ${label}, got ${typeof stored}`);
|
|
99
|
+
}
|
|
100
|
+
const d = new Date(stored);
|
|
101
|
+
if (Number.isNaN(d.getTime())) {
|
|
102
|
+
throw new Error(`deserializeDateFromDynamo: invalid Date value "${stored}"`);
|
|
103
|
+
}
|
|
104
|
+
return d;
|
|
105
|
+
}
|
|
106
|
+
if (typeof stored !== "number" || !Number.isFinite(stored)) {
|
|
107
|
+
throw new Error(`deserializeDateFromDynamo: expected finite number for ${label}, got ${typeof stored === "number" ? stored : typeof stored}`);
|
|
108
|
+
}
|
|
109
|
+
if (encoding.storage === "epochMs")
|
|
110
|
+
return new Date(stored);
|
|
111
|
+
return new Date(stored * 1000);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
//# sourceMappingURL=Marshaller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Marshaller.js","sourceRoot":"","sources":["../src/Marshaller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Projection — Select specific attributes in get/query operations.
|
|
3
|
+
*
|
|
4
|
+
* Projections reduce read capacity and network transfer by fetching only
|
|
5
|
+
* the requested attributes. The result is a partial record (not decoded
|
|
6
|
+
* through the full entity schema, since projected items may not match).
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* - projection(["name", "email"]) → { expression, names }
|
|
10
|
+
* - Pass to get/query operations via ProjectionExpression + ExpressionAttributeNames
|
|
11
|
+
*/
|
|
12
|
+
export interface ProjectionResult {
|
|
13
|
+
readonly expression: string;
|
|
14
|
+
readonly names: Record<string, string>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Build a ProjectionExpression from a list of attribute names.
|
|
18
|
+
* Uses ExpressionAttributeNames to safely handle reserved words.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* const proj = Projection.projection(["name", "email", "status"])
|
|
23
|
+
* // proj.expression === "#proj_name, #proj_email, #proj_status"
|
|
24
|
+
* // proj.names === { "#proj_name": "name", "#proj_email": "email", "#proj_status": "status" }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare const projection: (attributes: ReadonlyArray<string>) => ProjectionResult;
|
|
28
|
+
//# sourceMappingURL=Projection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Projection.d.ts","sourceRoot":"","sources":["../src/Projection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACvC;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,UAAU,GAAI,YAAY,aAAa,CAAC,MAAM,CAAC,KAAG,gBAkB9D,CAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Projection — Select specific attributes in get/query operations.
|
|
3
|
+
*
|
|
4
|
+
* Projections reduce read capacity and network transfer by fetching only
|
|
5
|
+
* the requested attributes. The result is a partial record (not decoded
|
|
6
|
+
* through the full entity schema, since projected items may not match).
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* - projection(["name", "email"]) → { expression, names }
|
|
10
|
+
* - Pass to get/query operations via ProjectionExpression + ExpressionAttributeNames
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Build a ProjectionExpression from a list of attribute names.
|
|
14
|
+
* Uses ExpressionAttributeNames to safely handle reserved words.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* const proj = Projection.projection(["name", "email", "status"])
|
|
19
|
+
* // proj.expression === "#proj_name, #proj_email, #proj_status"
|
|
20
|
+
* // proj.names === { "#proj_name": "name", "#proj_email": "email", "#proj_status": "status" }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export const projection = (attributes) => {
|
|
24
|
+
if (attributes.length === 0) {
|
|
25
|
+
return { expression: "", names: {} };
|
|
26
|
+
}
|
|
27
|
+
const names = {};
|
|
28
|
+
const parts = [];
|
|
29
|
+
for (const attr of attributes) {
|
|
30
|
+
const placeholder = `#proj_${attr}`;
|
|
31
|
+
names[placeholder] = attr;
|
|
32
|
+
parts.push(placeholder);
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
expression: parts.join(", "),
|
|
36
|
+
names,
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=Projection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Projection.js","sourceRoot":"","sources":["../src/Projection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,UAAiC,EAAoB,EAAE;IAChF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;IACtC,CAAC;IAED,MAAM,KAAK,GAA2B,EAAE,CAAA;IACxC,MAAM,KAAK,GAAkB,EAAE,CAAA;IAE/B,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,WAAW,GAAG,SAAS,IAAI,EAAE,CAAA;QACnC,KAAK,CAAC,WAAW,CAAC,GAAG,IAAI,CAAA;QACzB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IACzB,CAAC;IAED,OAAO;QACL,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,KAAK;KACN,CAAA;AACH,CAAC,CAAA"}
|
package/dist/Query.d.ts
ADDED
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query — Pure description of a DynamoDB query.
|
|
3
|
+
*
|
|
4
|
+
* `Query<A>` is a lazy, immutable data type that describes a query. No DynamoDB
|
|
5
|
+
* calls happen until a terminal (`execute`, `collect`, or `paginate`) is called. All
|
|
6
|
+
* combinators return a new Query — the original is unchanged.
|
|
7
|
+
*
|
|
8
|
+
* Implements Pipeable for ergonomic composition.
|
|
9
|
+
*/
|
|
10
|
+
import type { AttributeValue } from "@aws-sdk/client-dynamodb";
|
|
11
|
+
import { Effect, Pipeable, Stream } from "effect";
|
|
12
|
+
import { DynamoClient, type DynamoClientError } from "./DynamoClient.js";
|
|
13
|
+
import type { ValidationError } from "./Errors.js";
|
|
14
|
+
import { type Expr } from "./internal/Expr.js";
|
|
15
|
+
/**
|
|
16
|
+
* Sort key condition for narrowing query results within a partition.
|
|
17
|
+
* Exactly one operator should be provided.
|
|
18
|
+
*/
|
|
19
|
+
export type SortKeyCondition = {
|
|
20
|
+
readonly eq: string;
|
|
21
|
+
} | {
|
|
22
|
+
readonly lt: string;
|
|
23
|
+
} | {
|
|
24
|
+
readonly lte: string;
|
|
25
|
+
} | {
|
|
26
|
+
readonly gt: string;
|
|
27
|
+
} | {
|
|
28
|
+
readonly gte: string;
|
|
29
|
+
} | {
|
|
30
|
+
readonly between: readonly [string, string];
|
|
31
|
+
} | {
|
|
32
|
+
readonly beginsWith: string;
|
|
33
|
+
};
|
|
34
|
+
interface QueryState {
|
|
35
|
+
readonly tableName: string;
|
|
36
|
+
readonly indexName: string | undefined;
|
|
37
|
+
readonly pkField: string;
|
|
38
|
+
readonly pkValue: string;
|
|
39
|
+
readonly skField: string | undefined;
|
|
40
|
+
readonly skConditions: ReadonlyArray<{
|
|
41
|
+
readonly field: string;
|
|
42
|
+
readonly condition: SortKeyCondition;
|
|
43
|
+
}>;
|
|
44
|
+
readonly exprFilters: ReadonlyArray<Expr>;
|
|
45
|
+
readonly entityTypes: ReadonlyArray<string>;
|
|
46
|
+
readonly limitValue: number | undefined;
|
|
47
|
+
readonly maxPagesValue: number | undefined;
|
|
48
|
+
readonly scanForward: boolean;
|
|
49
|
+
readonly consistentRead: boolean;
|
|
50
|
+
readonly ignoreOwnershipFlag: boolean;
|
|
51
|
+
readonly exclusiveStartKey: Record<string, AttributeValue> | undefined;
|
|
52
|
+
readonly isScan: boolean;
|
|
53
|
+
readonly projection: ReadonlyArray<string> | undefined;
|
|
54
|
+
readonly projectionPaths: ReadonlyArray<ReadonlyArray<string | number>> | undefined;
|
|
55
|
+
readonly decoder: (raw: Record<string, unknown>) => Effect.Effect<unknown, ValidationError>;
|
|
56
|
+
/** Optional effect to resolve table name at execution time (for deferred resolution) */
|
|
57
|
+
readonly resolveTableName: Effect.Effect<string, never, any> | undefined;
|
|
58
|
+
}
|
|
59
|
+
declare const QueryTypeId: unique symbol;
|
|
60
|
+
export type QueryTypeId = typeof QueryTypeId;
|
|
61
|
+
/**
|
|
62
|
+
* A lazy, immutable description of a DynamoDB query. No calls happen until
|
|
63
|
+
* a terminal ({@link execute}, {@link collect}, or {@link paginate}) is invoked.
|
|
64
|
+
*
|
|
65
|
+
* All combinators ({@link where}, {@link filter}, {@link limit}, {@link reverse})
|
|
66
|
+
* return a new Query — the original is unchanged.
|
|
67
|
+
*
|
|
68
|
+
* @typeParam A - Decoded item type returned by the query
|
|
69
|
+
*/
|
|
70
|
+
export interface Query<A> extends Pipeable.Pipeable {
|
|
71
|
+
readonly [QueryTypeId]: QueryTypeId;
|
|
72
|
+
/** @internal */
|
|
73
|
+
readonly _state: QueryState;
|
|
74
|
+
/** @internal */
|
|
75
|
+
readonly _A: (_: never) => A;
|
|
76
|
+
}
|
|
77
|
+
export declare const make: <A>(config: {
|
|
78
|
+
readonly tableName: string;
|
|
79
|
+
readonly indexName: string | undefined;
|
|
80
|
+
readonly pkField: string;
|
|
81
|
+
readonly pkValue: string;
|
|
82
|
+
readonly skField: string | undefined;
|
|
83
|
+
readonly entityTypes: ReadonlyArray<string>;
|
|
84
|
+
readonly decoder: (raw: Record<string, unknown>) => Effect.Effect<A, ValidationError>;
|
|
85
|
+
readonly resolveTableName?: Effect.Effect<string, never, any> | undefined;
|
|
86
|
+
}) => Query<A>;
|
|
87
|
+
/**
|
|
88
|
+
* Create a scan-mode Query. Shares all combinators and terminals with Query
|
|
89
|
+
* but uses DynamoDB Scan instead of Query at execution time.
|
|
90
|
+
* No key condition — only filter expressions and entity type filter.
|
|
91
|
+
*/
|
|
92
|
+
export declare const makeScan: <A>(config: {
|
|
93
|
+
readonly tableName: string;
|
|
94
|
+
readonly indexName: string | undefined;
|
|
95
|
+
readonly entityTypes: ReadonlyArray<string>;
|
|
96
|
+
readonly decoder: (raw: Record<string, unknown>) => Effect.Effect<A, ValidationError>;
|
|
97
|
+
readonly resolveTableName?: Effect.Effect<string, never, any> | undefined;
|
|
98
|
+
}) => Query<A>;
|
|
99
|
+
/**
|
|
100
|
+
* Add a sort key condition to the query.
|
|
101
|
+
* Only one SK condition is supported (last one wins if multiple are added).
|
|
102
|
+
*/
|
|
103
|
+
export declare const where: {
|
|
104
|
+
(condition: SortKeyCondition): <A>(self: Query<A>) => Query<A>;
|
|
105
|
+
<A>(self: Query<A>, condition: SortKeyCondition): Query<A>;
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* Set the maximum number of items per DynamoDB page.
|
|
109
|
+
*/
|
|
110
|
+
export declare const limit: {
|
|
111
|
+
(n: number): <A>(self: Query<A>) => Query<A>;
|
|
112
|
+
<A>(self: Query<A>, n: number): Query<A>;
|
|
113
|
+
};
|
|
114
|
+
/**
|
|
115
|
+
* Reverse the sort order (sets ScanIndexForward = false).
|
|
116
|
+
*/
|
|
117
|
+
export declare const reverse: <A>(self: Query<A>) => Query<A>;
|
|
118
|
+
/**
|
|
119
|
+
* Enable consistent reads for this query (or scan).
|
|
120
|
+
*/
|
|
121
|
+
export declare const consistentRead: {
|
|
122
|
+
(): <A>(self: Query<A>) => Query<A>;
|
|
123
|
+
<A>(self: Query<A>): Query<A>;
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* Set the maximum number of DynamoDB pages to fetch.
|
|
127
|
+
* Pagination stops after this many pages even if `LastEvaluatedKey` is present.
|
|
128
|
+
*/
|
|
129
|
+
export declare const maxPages: {
|
|
130
|
+
(n: number): <A>(self: Query<A>) => Query<A>;
|
|
131
|
+
<A>(self: Query<A>, n: number): Query<A>;
|
|
132
|
+
};
|
|
133
|
+
/**
|
|
134
|
+
* Skip the `__edd_e__` entity type filter on this query.
|
|
135
|
+
* Useful for cross-entity queries or when you know the partition only contains
|
|
136
|
+
* items of the expected type.
|
|
137
|
+
*/
|
|
138
|
+
export declare const ignoreOwnership: <A>(self: Query<A>) => Query<A>;
|
|
139
|
+
/**
|
|
140
|
+
* Set the starting cursor for pagination. The cursor is an opaque string
|
|
141
|
+
* returned by {@link execute} that encodes the DynamoDB `ExclusiveStartKey`.
|
|
142
|
+
* Pass an empty string to start from the beginning.
|
|
143
|
+
*/
|
|
144
|
+
export declare const startFrom: {
|
|
145
|
+
(cursor: string): <A>(self: Query<A>) => Query<A>;
|
|
146
|
+
<A>(self: Query<A>, cursor: string): Query<A>;
|
|
147
|
+
};
|
|
148
|
+
/**
|
|
149
|
+
* Select specific attributes to return (ProjectionExpression).
|
|
150
|
+
* Reduces read capacity and network transfer. When projection is active,
|
|
151
|
+
* items are returned as raw `Record<string, unknown>` instead of decoded
|
|
152
|
+
* schema instances, since projected items may be partial.
|
|
153
|
+
*/
|
|
154
|
+
export declare const select: {
|
|
155
|
+
(attributes: ReadonlyArray<string>): <A>(self: Query<A>) => Query<Record<string, unknown>>;
|
|
156
|
+
<A>(self: Query<A>, attributes: ReadonlyArray<string>): Query<Record<string, unknown>>;
|
|
157
|
+
};
|
|
158
|
+
/**
|
|
159
|
+
* Add an Expr-based filter expression to the query.
|
|
160
|
+
* Multiple filterExpr calls are ANDed together.
|
|
161
|
+
*/
|
|
162
|
+
export declare const filterExpr: {
|
|
163
|
+
(expr: Expr): <A>(self: Query<A>) => Query<A>;
|
|
164
|
+
<A>(self: Query<A>, expr: Expr): Query<A>;
|
|
165
|
+
};
|
|
166
|
+
/**
|
|
167
|
+
* Apply path-based projections. Compiles path segments to ProjectionExpression.
|
|
168
|
+
* When projection is active, items are returned as raw `Record<string, unknown>`.
|
|
169
|
+
*/
|
|
170
|
+
export declare const selectPaths: {
|
|
171
|
+
(paths: ReadonlyArray<ReadonlyArray<string | number>>): <A>(self: Query<A>) => Query<Record<string, unknown>>;
|
|
172
|
+
<A>(self: Query<A>, paths: ReadonlyArray<ReadonlyArray<string | number>>): Query<Record<string, unknown>>;
|
|
173
|
+
};
|
|
174
|
+
/**
|
|
175
|
+
* A single page of query results with an opaque cursor for fetching the next page.
|
|
176
|
+
*/
|
|
177
|
+
export interface Page<A> {
|
|
178
|
+
readonly items: Array<A>;
|
|
179
|
+
/** Opaque cursor for the next page, or `null` if there are no more results. */
|
|
180
|
+
readonly cursor: string | null;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Execute the query and collect all pages into a single array.
|
|
184
|
+
*/
|
|
185
|
+
export declare const collect: <A>(self: Query<A>) => Effect.Effect<Array<A>, DynamoClientError | ValidationError, DynamoClient>;
|
|
186
|
+
/**
|
|
187
|
+
* Execute a single DynamoDB page and return a {@link Page} with an opaque cursor.
|
|
188
|
+
* Combine with {@link startFrom} to iterate through pages:
|
|
189
|
+
*
|
|
190
|
+
* ```ts
|
|
191
|
+
* const first = yield* query.pipe(Query.limit(25), Query.execute)
|
|
192
|
+
* if (first.cursor) {
|
|
193
|
+
* const second = yield* query.pipe(Query.limit(25), Query.startFrom(first.cursor), Query.execute)
|
|
194
|
+
* }
|
|
195
|
+
* ```
|
|
196
|
+
*/
|
|
197
|
+
export declare const execute: <A>(self: Query<A>) => Effect.Effect<Page<A>, DynamoClientError | ValidationError, DynamoClient>;
|
|
198
|
+
/**
|
|
199
|
+
* Execute the query and return a Stream of page arrays.
|
|
200
|
+
*/
|
|
201
|
+
export declare const paginate: <A>(self: Query<A>) => Effect.Effect<Stream.Stream<Array<A>, DynamoClientError | ValidationError>, never, DynamoClient>;
|
|
202
|
+
/**
|
|
203
|
+
* Execute a count query. Uses `Select: "COUNT"` on DynamoDB — no items are returned.
|
|
204
|
+
* Returns the total count across all pages (respects maxPages).
|
|
205
|
+
*/
|
|
206
|
+
export declare const count: <A>(self: Query<A>) => Effect.Effect<number, DynamoClientError, DynamoClient>;
|
|
207
|
+
/**
|
|
208
|
+
* Return the built DynamoDB command input without executing.
|
|
209
|
+
* Useful for debugging, logging, or passing to DynamoClient directly.
|
|
210
|
+
*/
|
|
211
|
+
export declare const asParams: <A>(self: Query<A>) => Effect.Effect<Record<string, unknown>, never, any>;
|
|
212
|
+
export declare const isQuery: (u: unknown) => u is Query<unknown>;
|
|
213
|
+
export {};
|
|
214
|
+
//# sourceMappingURL=Query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Query.d.ts","sourceRoot":"","sources":["../src/Query.ts"],"names":[],"mappings":"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"}
|