@effect-dynamodb/schema 1.9.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 +53 -0
- package/dist/Aggregate.d.ts +128 -0
- package/dist/Aggregate.d.ts.map +1 -0
- package/dist/Aggregate.js +69 -0
- package/dist/Aggregate.js.map +1 -0
- package/dist/DynamoModel.d.ts +370 -0
- package/dist/DynamoModel.d.ts.map +1 -0
- package/dist/DynamoModel.js +541 -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 +239 -0
- package/dist/Entity.d.ts.map +1 -0
- package/dist/Entity.js +558 -0
- package/dist/Entity.js.map +1 -0
- package/dist/Errors.d.ts +387 -0
- package/dist/Errors.d.ts.map +1 -0
- package/dist/Errors.js +218 -0
- package/dist/Errors.js.map +1 -0
- package/dist/KeyComposer.d.ts +264 -0
- package/dist/KeyComposer.d.ts.map +1 -0
- package/dist/KeyComposer.js +516 -0
- package/dist/KeyComposer.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/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -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 +117 -0
- package/dist/internal/AggregateEdges.d.ts.map +1 -0
- package/dist/internal/AggregateEdges.js +51 -0
- package/dist/internal/AggregateEdges.js.map +1 -0
- package/dist/internal/AggregateSchemas.d.ts +76 -0
- package/dist/internal/AggregateSchemas.d.ts.map +1 -0
- package/dist/internal/AggregateSchemas.js +164 -0
- package/dist/internal/AggregateSchemas.js.map +1 -0
- package/dist/internal/AggregateTypes.d.ts +132 -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/DefaultCrypto.d.ts +26 -0
- package/dist/internal/DefaultCrypto.d.ts.map +1 -0
- package/dist/internal/DefaultCrypto.js +40 -0
- package/dist/internal/DefaultCrypto.js.map +1 -0
- package/dist/internal/EntityConfig.d.ts +152 -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/EntitySchemas.d.ts +198 -0
- package/dist/internal/EntitySchemas.d.ts.map +1 -0
- package/dist/internal/EntitySchemas.js +798 -0
- package/dist/internal/EntitySchemas.js.map +1 -0
- package/dist/internal/EntityTypes.d.ts +233 -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/SchemaAccessors.d.ts +90 -0
- package/dist/internal/SchemaAccessors.d.ts.map +1 -0
- package/dist/internal/SchemaAccessors.js +171 -0
- package/dist/internal/SchemaAccessors.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KeyComposer — Composite key composition for DynamoDB keys.
|
|
3
|
+
*
|
|
4
|
+
* v2 uses attribute-list composition (composite: ["userId"]) instead of
|
|
5
|
+
* template strings ("USER#${userId}"). The DynamoSchema module handles
|
|
6
|
+
* the key format; KeyComposer extracts attribute values and delegates.
|
|
7
|
+
*/
|
|
8
|
+
import type * as DynamoSchema from "./DynamoSchema.js";
|
|
9
|
+
import type { CompositeKeyHoleError } from "./Errors.js";
|
|
10
|
+
/** Index key part definition (pk or sk of an index) */
|
|
11
|
+
export interface KeyPart {
|
|
12
|
+
readonly field: string;
|
|
13
|
+
readonly composite: ReadonlyArray<string>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Per-half policy value controlling how `Entity.update` and time-series
|
|
17
|
+
* `.append` handle a GSI half the writer touches but can't compose.
|
|
18
|
+
*
|
|
19
|
+
* Per-half evaluation gate (v1.7.1): a half is *touched* iff at least one of
|
|
20
|
+
* its composite names appears in the update payload (regardless of value,
|
|
21
|
+
* including `undefined`) OR appears in `Entity.remove([...])`. Untouched
|
|
22
|
+
* halves are skipped entirely — no SET, no REMOVE, no policy fires.
|
|
23
|
+
*
|
|
24
|
+
* For *touched* halves the policy decides the outcome when the structural
|
|
25
|
+
* rule can't compose (empty leading prefix OR hole pattern):
|
|
26
|
+
* - `"sparse"` — REMOVE this half's key attribute (the half drops out of the
|
|
27
|
+
* GSI). The other half follows its own per-half outcome independently —
|
|
28
|
+
* there is no GSI-wide cascade. The DDB projection rule means an item with
|
|
29
|
+
* only one key attribute is invisible in the GSI; the surviving half's
|
|
30
|
+
* value is preserved for rejoin without other writers re-firing.
|
|
31
|
+
* - `"preserve"` — noop (leave the stored key for this half untouched). The
|
|
32
|
+
* stored value may go stale until either (a) the next write that touches
|
|
33
|
+
* this half supplies enough composites to recompose, or (b) a composite of
|
|
34
|
+
* this half is named in `Entity.remove([...])` — the cascade override
|
|
35
|
+
* then REMOVEs this half's key.
|
|
36
|
+
*
|
|
37
|
+
* Halves not declared in `indexPolicy` default to `"preserve"`. See
|
|
38
|
+
* `DESIGN.md §7 Policy-Aware GSI Composition` for the full decision rules
|
|
39
|
+
* (per-half evaluation gate, per-half outcome, cascade override, decision
|
|
40
|
+
* table).
|
|
41
|
+
*/
|
|
42
|
+
export type IndexPolicyKey = "sparse" | "preserve";
|
|
43
|
+
/**
|
|
44
|
+
* Per-half index policy declaration. Both halves default to `"preserve"`
|
|
45
|
+
* when omitted (or when `indexPolicy` is omitted entirely from the GSI
|
|
46
|
+
* config).
|
|
47
|
+
*
|
|
48
|
+
* The standard composition path has only payload-level information (no
|
|
49
|
+
* read-before-write), so per-attribute policy callbacks were removed in
|
|
50
|
+
* v3 — within a single half, per-attribute mixing has no coherent semantic
|
|
51
|
+
* because a half is a single concatenated string.
|
|
52
|
+
*/
|
|
53
|
+
export interface IndexPolicy {
|
|
54
|
+
readonly pk?: IndexPolicyKey | undefined;
|
|
55
|
+
readonly sk?: IndexPolicyKey | undefined;
|
|
56
|
+
}
|
|
57
|
+
/** Index definition for primary or secondary index (internal format) */
|
|
58
|
+
export interface IndexDefinition {
|
|
59
|
+
readonly index?: string | undefined;
|
|
60
|
+
readonly collection?: string | ReadonlyArray<string> | undefined;
|
|
61
|
+
readonly type?: "isolated" | "clustered" | undefined;
|
|
62
|
+
readonly pk: KeyPart;
|
|
63
|
+
readonly sk: KeyPart;
|
|
64
|
+
readonly casing?: DynamoSchema.Casing | undefined;
|
|
65
|
+
/**
|
|
66
|
+
* Optional per-half policy for `Entity.update` and `.append`. Not consulted
|
|
67
|
+
* on `put()` — put always omits a GSI's keys when any of its composites is
|
|
68
|
+
* missing.
|
|
69
|
+
*/
|
|
70
|
+
readonly indexPolicy?: IndexPolicy | undefined;
|
|
71
|
+
}
|
|
72
|
+
/** GSI definition as specified on Entity.make() indexes config.
|
|
73
|
+
* Mirrors the primaryKey structure with an added `name` for the physical GSI. */
|
|
74
|
+
export interface GsiConfig {
|
|
75
|
+
/** Physical GSI name (e.g., `"gsi1"`). */
|
|
76
|
+
readonly name: string;
|
|
77
|
+
/** Optional collection name. String for single, array for sub-collections. */
|
|
78
|
+
readonly collection?: string | ReadonlyArray<string> | undefined;
|
|
79
|
+
/** SK ordering mode. `"isolated"` (default) puts entity type before composites; `"clustered"` puts entity type after composites (required for sub-collections). */
|
|
80
|
+
readonly type?: "isolated" | "clustered" | undefined;
|
|
81
|
+
/** Partition key: physical field name + composite attributes. */
|
|
82
|
+
readonly pk: KeyPart;
|
|
83
|
+
/** Sort key: physical field name + composite attributes. */
|
|
84
|
+
readonly sk: KeyPart;
|
|
85
|
+
/**
|
|
86
|
+
* Per-half sparse/preserve policy. Applied by `Entity.update` and
|
|
87
|
+
* time-series `.append`. Defaults to `"preserve"` on each half. Not
|
|
88
|
+
* applied on `put()`. See `DESIGN.md §7 Policy-Aware GSI Composition`.
|
|
89
|
+
*/
|
|
90
|
+
readonly indexPolicy?: IndexPolicy | undefined;
|
|
91
|
+
}
|
|
92
|
+
/** Normalize a GsiConfig (entity input) to an IndexDefinition (internal format). */
|
|
93
|
+
export declare const normalizeGsiConfig: (config: GsiConfig) => IndexDefinition;
|
|
94
|
+
/**
|
|
95
|
+
* Extract composite attribute values from an entity record.
|
|
96
|
+
*
|
|
97
|
+
* Given composite: ["tenantId", "email"] and record: { tenantId: "t-1", email: "a@b.com" }
|
|
98
|
+
* Returns: ["t-1", "a@b.com"]
|
|
99
|
+
*/
|
|
100
|
+
export declare const extractComposites: (composite: ReadonlyArray<string>, record: Record<string, unknown>) => ReadonlyArray<string>;
|
|
101
|
+
/**
|
|
102
|
+
* Non-throwing variant of extractComposites. Returns undefined when any
|
|
103
|
+
* composite attribute is missing or null. Used for sparse GSI support —
|
|
104
|
+
* if a GSI's composites aren't all present, the index is simply skipped.
|
|
105
|
+
*/
|
|
106
|
+
export declare const tryExtractComposites: (composite: ReadonlyArray<string>, record: Record<string, unknown>) => ReadonlyArray<string> | undefined;
|
|
107
|
+
/**
|
|
108
|
+
* Serialize a value for use in a composite key.
|
|
109
|
+
*
|
|
110
|
+
* Numeric values are zero-padded for correct lexicographic sort order:
|
|
111
|
+
* - number → 16-digit zero-padded string (covers Number.MAX_SAFE_INTEGER)
|
|
112
|
+
* - bigint → 38-digit zero-padded string (covers DynamoDB's max precision)
|
|
113
|
+
*
|
|
114
|
+
* DateTime values are formatted as ISO strings for correct sort order:
|
|
115
|
+
* - DateTime.Zoned → ISO string with offset (preserves timezone info)
|
|
116
|
+
* - DateTime.Utc → ISO string
|
|
117
|
+
* - Date → ISO string
|
|
118
|
+
*/
|
|
119
|
+
export declare const serializeValue: (value: unknown) => string;
|
|
120
|
+
/**
|
|
121
|
+
* Compose a partition key for an entity index.
|
|
122
|
+
*
|
|
123
|
+
* For non-collection indexes: `$schema#v<version>#entityType#attr1#attr2`
|
|
124
|
+
* For collection indexes: `$schema#v<version>#collectionName#attr1#attr2`
|
|
125
|
+
*/
|
|
126
|
+
export declare const composePk: (schema: DynamoSchema.DynamoSchema, entityType: string, index: IndexDefinition, record: Record<string, unknown>) => string;
|
|
127
|
+
/**
|
|
128
|
+
* Compose a sort key for an entity index.
|
|
129
|
+
*
|
|
130
|
+
* For isolated indexes: `$schema#v<version>#entityType_version#attr1#attr2`
|
|
131
|
+
* For clustered indexes: `$schema#v<version>#collectionName#entityType_version#attr1#attr2`
|
|
132
|
+
* For non-collection indexes: `$schema#v<version>#entityType#attr1#attr2`
|
|
133
|
+
*/
|
|
134
|
+
export declare const composeSk: (schema: DynamoSchema.DynamoSchema, entityType: string, entityVersion: number, index: IndexDefinition, record: Record<string, unknown>) => string;
|
|
135
|
+
/**
|
|
136
|
+
* Compose all key attributes for a single index.
|
|
137
|
+
* Returns a record mapping field names to composed key values.
|
|
138
|
+
*/
|
|
139
|
+
export declare const composeIndexKeys: (schema: DynamoSchema.DynamoSchema, entityType: string, entityVersion: number, index: IndexDefinition, record: Record<string, unknown>) => Record<string, string>;
|
|
140
|
+
/**
|
|
141
|
+
* Non-throwing variant of composeIndexKeys. Returns undefined if any composite
|
|
142
|
+
* attribute is missing. Used for sparse GSI support.
|
|
143
|
+
*/
|
|
144
|
+
export declare const tryComposeIndexKeys: (schema: DynamoSchema.DynamoSchema, entityType: string, entityVersion: number, index: IndexDefinition, record: Record<string, unknown>) => Record<string, string> | undefined;
|
|
145
|
+
/**
|
|
146
|
+
* Compose keys for all indexes of an entity.
|
|
147
|
+
* Returns a flat record of all key field -> value mappings.
|
|
148
|
+
*/
|
|
149
|
+
export declare const composeAllKeys: (schema: DynamoSchema.DynamoSchema, entityType: string, entityVersion: number, indexes: Record<string, IndexDefinition>, record: Record<string, unknown>) => Record<string, string>;
|
|
150
|
+
/**
|
|
151
|
+
* Result of policy-aware GSI update composition.
|
|
152
|
+
*
|
|
153
|
+
* - `sets`: map of GSI key field name → composed value (emit as SET clauses).
|
|
154
|
+
* - `removes`: list of GSI key field names to REMOVE (item drops out of GSI).
|
|
155
|
+
*
|
|
156
|
+
* `sets` and `removes` are mutually exclusive — a single field never appears
|
|
157
|
+
* in both for the same update.
|
|
158
|
+
*/
|
|
159
|
+
export interface GsiUpdateResult {
|
|
160
|
+
readonly sets: Record<string, string>;
|
|
161
|
+
readonly removes: ReadonlyArray<string>;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Compose a sort key from the leading prefix `[sk_0, ..., sk_(stopBefore-1)]`
|
|
165
|
+
* of an index's SK composites. Used by v3's structural composition rule when a
|
|
166
|
+
* trailing SK composite is absent and the half's `indexPolicy.sk` is
|
|
167
|
+
* `"preserve"` (or absent — defaults to preserve), or when a hole pattern is
|
|
168
|
+
* encountered under `"sparse"`.
|
|
169
|
+
*
|
|
170
|
+
* `stopBefore === 0` produces the bare entity/collection prefix with no
|
|
171
|
+
* composite values (the item still belongs to the GSI but at the broadest
|
|
172
|
+
* scope — `begins_with(sk, "<prefix>")` matches it).
|
|
173
|
+
*
|
|
174
|
+
* See `DESIGN.md §7 Policy-Aware GSI Composition`.
|
|
175
|
+
*/
|
|
176
|
+
export declare const composeSkPrefixUpTo: (schema: DynamoSchema.DynamoSchema, entityType: string, entityVersion: number, index: IndexDefinition, record: Record<string, unknown>, stopBefore: number) => string;
|
|
177
|
+
/**
|
|
178
|
+
* Policy-aware GSI key composition for `Entity.update` and time-series
|
|
179
|
+
* `.append` — v1.7.1 per-half structural composition with per-half evaluation
|
|
180
|
+
* gate and per-half cascade.
|
|
181
|
+
*
|
|
182
|
+
* **Per-half evaluation gate (reframed in v1.7.3 as a skip-predicate).** Each
|
|
183
|
+
* half (PK and SK) is independently asked one question: *can this half be
|
|
184
|
+
* safely skipped?* The gate exists for exactly one reason — multi-writer
|
|
185
|
+
* protection: prevent writer A from clobbering keys for halves it doesn't
|
|
186
|
+
* own when writer B does own them. The skip-predicate states that purpose
|
|
187
|
+
* directly: skip iff multi-writer protection actually applies (the half has
|
|
188
|
+
* composites, no composite was explicitly removed, and every composite is
|
|
189
|
+
* absent from BOTH `updatePayload` AND `keyRecord` — so this writer is
|
|
190
|
+
* genuinely not claiming ownership of this half on this call). If the half
|
|
191
|
+
* cannot be safely skipped, it is evaluated by the structural rule.
|
|
192
|
+
*
|
|
193
|
+
* Pre-v1.7.3 the predicate was inverted ("list cases for which to evaluate"
|
|
194
|
+
* as a chain of `||` clauses) and had to enumerate every shape: payload
|
|
195
|
+
* membership (v1.7.0), `removedSet` membership (v1.7.1), `keyRecord`
|
|
196
|
+
* membership (v1.7.2). Each missed shape required another tactical patch:
|
|
197
|
+
* v1.7.1 missed the multi-writer leak (#41), v1.7.2 missed the
|
|
198
|
+
* PK-composites-only case (#43), v1.7.2 then missed the empty-composite-half
|
|
199
|
+
* case (#46) because every `.some(...)` clause trivially returned `false`
|
|
200
|
+
* for an empty composite array. The skip-predicate closes the entire class
|
|
201
|
+
* of degenerate-case bugs structurally.
|
|
202
|
+
*
|
|
203
|
+
* **Two-way payload classification.**
|
|
204
|
+
* - **present** (`attr: <value>` in payload, or inherited from `keyRecord`)
|
|
205
|
+
* — value is used in composition.
|
|
206
|
+
* - **absent** (key omitted, or `attr: null`, or `attr: undefined`) — the
|
|
207
|
+
* structural rule treats all three identically.
|
|
208
|
+
*
|
|
209
|
+
* **Per-half outcome (v1.7.1 unified rule).** For each touched half:
|
|
210
|
+
* 1. Run the structural rule (longest leading prefix of present values in
|
|
211
|
+
* the merged record).
|
|
212
|
+
* 2. If the prefix is non-empty AND there's no hole → SET (full or truncated).
|
|
213
|
+
* 3. Otherwise (empty leading prefix OR hole pattern):
|
|
214
|
+
* - `'sparse'` → REMOVE this half's key.
|
|
215
|
+
* - `'preserve'` AND any composite of this half is in `removedSet` →
|
|
216
|
+
* REMOVE (cascade override under preserve).
|
|
217
|
+
* - `'preserve'` AND no composite in `removedSet` → noop (stored key
|
|
218
|
+
* retained, may be stale until next write touches the half).
|
|
219
|
+
*
|
|
220
|
+
* **Per-half roll-up (v1.7.1).** Each half's outcome applies to its own key
|
|
221
|
+
* attribute only. PK dropping doesn't drop SK; SK dropping doesn't drop PK.
|
|
222
|
+
* The item may be invisible in the GSI during a single-half-dropped period
|
|
223
|
+
* (DDB projection rule needs both keys for query visibility), but the
|
|
224
|
+
* surviving half's value persists for rejoin without other writers re-firing.
|
|
225
|
+
* The v1.7.0 GSI-wide cascade is gone.
|
|
226
|
+
*
|
|
227
|
+
* **`Entity.remove([attr])` cascade (v1.7.1: per-half).** Composites in
|
|
228
|
+
* `removedSet` contribute to the merged record as "absent" (same as
|
|
229
|
+
* undefined-in-payload) AND make their containing half "touched" for the
|
|
230
|
+
* evaluation gate AND trigger the cascade override under preserve. The
|
|
231
|
+
* cascade no longer drops both halves of every GSI containing the cleared
|
|
232
|
+
* attribute — only the half(s) whose composite list contains it.
|
|
233
|
+
*
|
|
234
|
+
* See `DESIGN.md §7 Policy-Aware GSI Composition` for the full decision
|
|
235
|
+
* table and worked multi-writer examples.
|
|
236
|
+
*/
|
|
237
|
+
export declare const composeGsiKeysForUpdatePolicyAware: (schema: DynamoSchema.DynamoSchema, entityType: string, entityVersion: number, indexes: Record<string, IndexDefinition>, updatePayload: Record<string, unknown>, keyRecord: Record<string, unknown>, options?: {
|
|
238
|
+
readonly removedSet?: ReadonlySet<string> | undefined;
|
|
239
|
+
}) => GsiUpdateResult;
|
|
240
|
+
/** @internal — re-export for documentation cross-reference. */
|
|
241
|
+
export type { CompositeKeyHoleError };
|
|
242
|
+
/**
|
|
243
|
+
* Compose a partial sort key prefix for query operations.
|
|
244
|
+
* Used when not all SK composite attributes are provided.
|
|
245
|
+
*
|
|
246
|
+
* For example, if SK composite is ["department", "hireDate"] and only "department"
|
|
247
|
+
* is provided, this generates a begins_with prefix.
|
|
248
|
+
*/
|
|
249
|
+
export declare const composeSortKeyPrefix: (schema: DynamoSchema.DynamoSchema, entityType: string, entityVersion: number, index: IndexDefinition, record: Record<string, unknown>) => string;
|
|
250
|
+
/**
|
|
251
|
+
* Compose an event-item sort key by decorating the current-item SK.
|
|
252
|
+
*
|
|
253
|
+
* Given `currentSk = "$app#v1#telemetry_1"` and `orderByValue = 42`, returns
|
|
254
|
+
* `"$app#v1#telemetry_1#e#0000000000000042"` (with default lowercase casing).
|
|
255
|
+
*/
|
|
256
|
+
export declare const composeEventSk: (currentSk: string, orderByValue: unknown, casing?: DynamoSchema.Casing) => string;
|
|
257
|
+
/**
|
|
258
|
+
* Compose the prefix used to scope `.history()` queries to event items only.
|
|
259
|
+
*
|
|
260
|
+
* Given `currentSk = "$app#v1#telemetry_1"`, returns
|
|
261
|
+
* `"$app#v1#telemetry_1#e#"`.
|
|
262
|
+
*/
|
|
263
|
+
export declare const composeEventSkPrefix: (currentSk: string, casing?: DynamoSchema.Casing) => string;
|
|
264
|
+
//# sourceMappingURL=KeyComposer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KeyComposer.d.ts","sourceRoot":"","sources":["../src/KeyComposer.ts"],"names":[],"mappings":"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"}
|