@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.
Files changed (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +53 -0
  3. package/dist/Aggregate.d.ts +128 -0
  4. package/dist/Aggregate.d.ts.map +1 -0
  5. package/dist/Aggregate.js +69 -0
  6. package/dist/Aggregate.js.map +1 -0
  7. package/dist/DynamoModel.d.ts +370 -0
  8. package/dist/DynamoModel.d.ts.map +1 -0
  9. package/dist/DynamoModel.js +541 -0
  10. package/dist/DynamoModel.js.map +1 -0
  11. package/dist/DynamoSchema.d.ts +137 -0
  12. package/dist/DynamoSchema.d.ts.map +1 -0
  13. package/dist/DynamoSchema.js +188 -0
  14. package/dist/DynamoSchema.js.map +1 -0
  15. package/dist/Entity.d.ts +239 -0
  16. package/dist/Entity.d.ts.map +1 -0
  17. package/dist/Entity.js +558 -0
  18. package/dist/Entity.js.map +1 -0
  19. package/dist/Errors.d.ts +387 -0
  20. package/dist/Errors.d.ts.map +1 -0
  21. package/dist/Errors.js +218 -0
  22. package/dist/Errors.js.map +1 -0
  23. package/dist/KeyComposer.d.ts +264 -0
  24. package/dist/KeyComposer.d.ts.map +1 -0
  25. package/dist/KeyComposer.js +516 -0
  26. package/dist/KeyComposer.js.map +1 -0
  27. package/dist/Projection.d.ts +28 -0
  28. package/dist/Projection.d.ts.map +1 -0
  29. package/dist/Projection.js +39 -0
  30. package/dist/Projection.js.map +1 -0
  31. package/dist/index.d.ts +32 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +26 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/internal/AggregateCursor.d.ts +44 -0
  36. package/dist/internal/AggregateCursor.d.ts.map +1 -0
  37. package/dist/internal/AggregateCursor.js +18 -0
  38. package/dist/internal/AggregateCursor.js.map +1 -0
  39. package/dist/internal/AggregateEdges.d.ts +117 -0
  40. package/dist/internal/AggregateEdges.d.ts.map +1 -0
  41. package/dist/internal/AggregateEdges.js +51 -0
  42. package/dist/internal/AggregateEdges.js.map +1 -0
  43. package/dist/internal/AggregateSchemas.d.ts +76 -0
  44. package/dist/internal/AggregateSchemas.d.ts.map +1 -0
  45. package/dist/internal/AggregateSchemas.js +164 -0
  46. package/dist/internal/AggregateSchemas.js.map +1 -0
  47. package/dist/internal/AggregateTypes.d.ts +132 -0
  48. package/dist/internal/AggregateTypes.d.ts.map +1 -0
  49. package/dist/internal/AggregateTypes.js +7 -0
  50. package/dist/internal/AggregateTypes.js.map +1 -0
  51. package/dist/internal/DefaultCrypto.d.ts +26 -0
  52. package/dist/internal/DefaultCrypto.d.ts.map +1 -0
  53. package/dist/internal/DefaultCrypto.js +40 -0
  54. package/dist/internal/DefaultCrypto.js.map +1 -0
  55. package/dist/internal/EntityConfig.d.ts +152 -0
  56. package/dist/internal/EntityConfig.d.ts.map +1 -0
  57. package/dist/internal/EntityConfig.js +7 -0
  58. package/dist/internal/EntityConfig.js.map +1 -0
  59. package/dist/internal/EntitySchemas.d.ts +198 -0
  60. package/dist/internal/EntitySchemas.d.ts.map +1 -0
  61. package/dist/internal/EntitySchemas.js +798 -0
  62. package/dist/internal/EntitySchemas.js.map +1 -0
  63. package/dist/internal/EntityTypes.d.ts +233 -0
  64. package/dist/internal/EntityTypes.d.ts.map +1 -0
  65. package/dist/internal/EntityTypes.js +7 -0
  66. package/dist/internal/EntityTypes.js.map +1 -0
  67. package/dist/internal/SchemaAccessors.d.ts +90 -0
  68. package/dist/internal/SchemaAccessors.d.ts.map +1 -0
  69. package/dist/internal/SchemaAccessors.js +171 -0
  70. package/dist/internal/SchemaAccessors.js.map +1 -0
  71. 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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"}