effect-dynamodb 0.1.0 → 1.0.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/dist/DynamoClient.d.ts +2 -2
- package/dist/DynamoClient.d.ts.map +1 -1
- package/dist/DynamoClient.js +1 -3
- package/dist/DynamoClient.js.map +1 -1
- package/package.json +1 -1
- package/dist/_AggregateCursor.d.ts +0 -44
- package/dist/_AggregateCursor.d.ts.map +0 -1
- package/dist/_AggregateCursor.js +0 -18
- package/dist/_AggregateCursor.js.map +0 -1
- package/dist/_AggregateEdges.d.ts +0 -77
- package/dist/_AggregateEdges.d.ts.map +0 -1
- package/dist/_AggregateEdges.js +0 -41
- package/dist/_AggregateEdges.js.map +0 -1
- package/dist/_AggregateSchemas.d.ts +0 -69
- package/dist/_AggregateSchemas.d.ts.map +0 -1
- package/dist/_AggregateSchemas.js +0 -194
- package/dist/_AggregateSchemas.js.map +0 -1
- package/dist/_AggregateTypes.d.ts +0 -94
- package/dist/_AggregateTypes.d.ts.map +0 -1
- package/dist/_AggregateTypes.js +0 -7
- package/dist/_AggregateTypes.js.map +0 -1
- package/dist/_EntityCombinators.d.ts +0 -155
- package/dist/_EntityCombinators.d.ts.map +0 -1
- package/dist/_EntityCombinators.js +0 -158
- package/dist/_EntityCombinators.js.map +0 -1
- package/dist/_EntityConfig.d.ts +0 -100
- package/dist/_EntityConfig.d.ts.map +0 -1
- package/dist/_EntityConfig.js +0 -7
- package/dist/_EntityConfig.js.map +0 -1
- package/dist/_EntityOps.d.ts +0 -205
- package/dist/_EntityOps.d.ts.map +0 -1
- package/dist/_EntityOps.js +0 -137
- package/dist/_EntityOps.js.map +0 -1
- package/dist/_EntitySchemas.d.ts +0 -57
- package/dist/_EntitySchemas.d.ts.map +0 -1
- package/dist/_EntitySchemas.js +0 -298
- package/dist/_EntitySchemas.js.map +0 -1
- package/dist/_EntityTypes.d.ts +0 -81
- package/dist/_EntityTypes.d.ts.map +0 -1
- package/dist/_EntityTypes.js +0 -7
- package/dist/_EntityTypes.js.map +0 -1
- package/dist/_sparse_check.d.ts +0 -2
- package/dist/_sparse_check.d.ts.map +0 -1
- package/dist/_sparse_check.js +0 -193
- package/dist/_sparse_check.js.map +0 -1
package/dist/_sparse_check.js
DELETED
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Type-level verification for sparse GSI all-or-none constraints.
|
|
3
|
-
* This file is NOT shipped — it exists solely for `pnpm check` validation.
|
|
4
|
-
*
|
|
5
|
-
* Enforcement:
|
|
6
|
-
* - Data-first: Entity.set(self, updates) — type error at the call site (NoInfer<U>)
|
|
7
|
-
* - Data-last: .pipe(Entity.set(updates)) — clean types, runtime validation catches
|
|
8
|
-
* partial GSI composites. Runtime is always active on all code paths.
|
|
9
|
-
*
|
|
10
|
-
* § Why data-last loses the constraint (with core Effect comparison):
|
|
11
|
-
*
|
|
12
|
-
* Core Effect duals like Ref.set and HashMap.set use a SHARED type parameter
|
|
13
|
-
* across the outer and inner functions:
|
|
14
|
-
*
|
|
15
|
-
* Ref.set: <A>(value: A) → (self: Ref<A>) → Effect<void>
|
|
16
|
-
* HashMap.set: <K, V>(key: K, v: V) → (self: HashMap<K, V>) → HashMap<K, V>
|
|
17
|
-
*
|
|
18
|
-
* In data-last, A/V are inferred from the arguments. When piped, `self` is
|
|
19
|
-
* checked against that inferred type. Because Ref and HashMap are INVARIANT
|
|
20
|
-
* in their type parameter, a mismatch between the inferred A and self's A
|
|
21
|
-
* produces a type error on self.
|
|
22
|
-
*
|
|
23
|
-
* Entity.set is different. The update constraint U is an all-or-none union:
|
|
24
|
-
*
|
|
25
|
-
* U = { tenantId: string; region: string } | { tenantId?: never; region?: never }
|
|
26
|
-
*
|
|
27
|
-
* If we used the same shared-parameter pattern:
|
|
28
|
-
*
|
|
29
|
-
* <U>(updates: U) → (self: EntityUpdate<..., U, ...>) → EntityUpdate<..., U, ...>
|
|
30
|
-
*
|
|
31
|
-
* Then Entity.set({ tenantId: "t-3" }) infers U = { tenantId: string }. When
|
|
32
|
-
* piped, self's U (the all-or-none union above) would need to extend
|
|
33
|
-
* { tenantId: string }. But it doesn't — the NoneAllowed branch has
|
|
34
|
-
* tenantId?: never. So this WOULD error, but at the self position, producing
|
|
35
|
-
* a confusing "EntityUpdate<...> is not assignable to EntityUpdate<...>" message
|
|
36
|
-
* rather than the clear "missing property 'region'" error from data-first.
|
|
37
|
-
*
|
|
38
|
-
* Worse: for non-constrained fields the error is reversed. Entity.set({ name: "Alice" })
|
|
39
|
-
* infers U = { name: string }, then self's U (the all-or-none union) would need
|
|
40
|
-
* to extend { name: string } — but { tenantId?: never; region?: never } doesn't
|
|
41
|
-
* have name at all, so it would ALSO error, even though the update is perfectly valid.
|
|
42
|
-
*
|
|
43
|
-
* The module-level Entity.set uses `Updates extends Record<string, unknown>` in
|
|
44
|
-
* data-last to avoid these false positives, accepting that the constraint is
|
|
45
|
-
* enforced only at runtime. Data-first uses NoInfer<U> for precise type-level
|
|
46
|
-
* enforcement.
|
|
47
|
-
*
|
|
48
|
-
* § Entity-scoped set (the solution):
|
|
49
|
-
*
|
|
50
|
-
* Each Entity instance exposes a `.set` dual where U is pre-bound from the
|
|
51
|
-
* entity definition — following the schemaBodyJson(schema) factory pattern
|
|
52
|
-
* from Effect HTTP. Because U is resolved at entity creation (not inferred
|
|
53
|
-
* from the updates argument), both data-first and data-last paths are type-safe.
|
|
54
|
-
*/
|
|
55
|
-
import { Effect, HashMap, pipe, Ref, Schema } from "effect";
|
|
56
|
-
import * as DynamoSchema from "./DynamoSchema.js";
|
|
57
|
-
import * as Entity from "./Entity.js";
|
|
58
|
-
import * as Table from "./Table.js";
|
|
59
|
-
const AppSchema = DynamoSchema.make({ name: "test", version: 1 });
|
|
60
|
-
const MainTable = Table.make({ schema: AppSchema });
|
|
61
|
-
class Employee extends Schema.Class("Employee")({
|
|
62
|
-
employeeId: Schema.String,
|
|
63
|
-
name: Schema.NonEmptyString,
|
|
64
|
-
tenantId: Schema.String,
|
|
65
|
-
region: Schema.String,
|
|
66
|
-
}) {
|
|
67
|
-
}
|
|
68
|
-
const Employees = Entity.make({
|
|
69
|
-
model: Employee,
|
|
70
|
-
table: MainTable,
|
|
71
|
-
entityType: "Employee",
|
|
72
|
-
indexes: {
|
|
73
|
-
primary: {
|
|
74
|
-
pk: { field: "pk", composite: ["employeeId"] },
|
|
75
|
-
sk: { field: "sk", composite: [] },
|
|
76
|
-
},
|
|
77
|
-
byTenant: {
|
|
78
|
-
index: "gsi1",
|
|
79
|
-
pk: { field: "gsi1pk", composite: ["tenantId"] },
|
|
80
|
-
sk: { field: "gsi1sk", composite: ["region"] },
|
|
81
|
-
},
|
|
82
|
-
},
|
|
83
|
-
});
|
|
84
|
-
// -----------------------------------------------------------------------
|
|
85
|
-
// DATA-FIRST: Entity.set(self, updates) — runtime validated
|
|
86
|
-
// GSI all-or-none is no longer enforced at the type level (TS 25-member
|
|
87
|
-
// union assignability limit). These all compile; partial composites
|
|
88
|
-
// produce a ValidationError at runtime.
|
|
89
|
-
// -----------------------------------------------------------------------
|
|
90
|
-
// Partial GSI composites: tenantId without region — caught at runtime
|
|
91
|
-
Entity.set(Employees.update({ employeeId: "e-1" }), { tenantId: "t-3" });
|
|
92
|
-
// All GSI composites
|
|
93
|
-
Entity.set(Employees.update({ employeeId: "e-1" }), { tenantId: "t-3", region: "us-east-1" });
|
|
94
|
-
// No GSI composites
|
|
95
|
-
Entity.set(Employees.update({ employeeId: "e-1" }), { name: "Alice" });
|
|
96
|
-
// -----------------------------------------------------------------------
|
|
97
|
-
// PIPE PATH: .pipe(Entity.set({ ... })) — clean types, runtime-validated
|
|
98
|
-
// -----------------------------------------------------------------------
|
|
99
|
-
// Partial GSI composites: no type error in pipe path (runtime catches it)
|
|
100
|
-
const _pipeBadRuntime = Effect.gen(function* () {
|
|
101
|
-
yield* Employees.update({ employeeId: "e-1" }).pipe(Entity.set({ tenantId: "t-3" }));
|
|
102
|
-
});
|
|
103
|
-
// GOOD: all GSI composites in pipe
|
|
104
|
-
const _pipeGood1 = Effect.gen(function* () {
|
|
105
|
-
yield* Employees.update({ employeeId: "e-1" }).pipe(Entity.set({ tenantId: "t-3", region: "us-east-1" }));
|
|
106
|
-
});
|
|
107
|
-
// GOOD: no GSI composites in pipe
|
|
108
|
-
const _pipeGood2 = Effect.gen(function* () {
|
|
109
|
-
yield* Employees.update({ employeeId: "e-1" }).pipe(Entity.set({ name: "Alice" }));
|
|
110
|
-
});
|
|
111
|
-
// -----------------------------------------------------------------------
|
|
112
|
-
// PIPE CHAIN: Entity.set → Effect.map → Effect.catchTag composes cleanly
|
|
113
|
-
// -----------------------------------------------------------------------
|
|
114
|
-
// Partial GSI in pipe chain — no type error; runtime validation catches it.
|
|
115
|
-
// .asEffect() crosses the entity-op/Effect boundary before Effect combinators.
|
|
116
|
-
const _pipeChainPartial = Effect.gen(function* () {
|
|
117
|
-
const result = yield* Employees.update({ employeeId: "e-1" }).pipe(Entity.set({ tenantId: "t-3" }), (op) => op.asEffect(), Effect.map(() => "unexpected success"), Effect.catchTag("ValidationError", (e) => Effect.succeed(`Caught ValidationError: ${e.cause}`)));
|
|
118
|
-
return result;
|
|
119
|
-
});
|
|
120
|
-
// Full pipe chain with all GSI composites — .asEffect() at the boundary
|
|
121
|
-
const _pipeChainGood = Effect.gen(function* () {
|
|
122
|
-
const result = yield* Employees.update({ employeeId: "e-1" }).pipe(Entity.set({ tenantId: "t-3", region: "us-east-1" }), Entity.expectedVersion(1), (op) => op.asEffect(), Effect.map(() => "success"), Effect.catchTag("OptimisticLockError", () => Effect.succeed("lock failed")));
|
|
123
|
-
return result;
|
|
124
|
-
});
|
|
125
|
-
// -----------------------------------------------------------------------
|
|
126
|
-
// CORE EFFECT COMPARISON — why Ref.set / HashMap.set catch data-last
|
|
127
|
-
// mismatches but Entity.set cannot
|
|
128
|
-
// -----------------------------------------------------------------------
|
|
129
|
-
// Ref.set: shared type parameter A — invariant container catches mismatches
|
|
130
|
-
const _refExample = Effect.gen(function* () {
|
|
131
|
-
const ref = yield* Ref.make("red");
|
|
132
|
-
// Data-first: TYPE ERROR — "green" not in "red" | "blue"
|
|
133
|
-
// @ts-expect-error
|
|
134
|
-
yield* Ref.set(ref, "green");
|
|
135
|
-
// Data-last: ALSO TYPE ERROR — Ref<"red"|"blue"> not assignable to Ref<"green">
|
|
136
|
-
// The shared A is inferred as "green" from the argument, then self (Ref<"red"|"blue">)
|
|
137
|
-
// is checked — Ref is invariant, so the mismatch is caught.
|
|
138
|
-
// @ts-expect-error
|
|
139
|
-
yield* pipe(ref, Ref.set("green"));
|
|
140
|
-
});
|
|
141
|
-
// HashMap.set: shared type parameters K, V — invariant container catches mismatches
|
|
142
|
-
const _hashMapExample = Effect.gen(function* () {
|
|
143
|
-
const map = HashMap.make(["a", 1], ["b", 2]); // HashMap<string, number>
|
|
144
|
-
// Data-first: TYPE ERROR — "hello" is not number
|
|
145
|
-
// @ts-expect-error
|
|
146
|
-
HashMap.set(map, "c", "hello");
|
|
147
|
-
// Data-last: ALSO TYPE ERROR — HashMap<string, number> not assignable to HashMap<string, string>
|
|
148
|
-
// V is inferred as string from "hello", then self (HashMap<string, number>) is checked.
|
|
149
|
-
// @ts-expect-error
|
|
150
|
-
pipe(map, HashMap.set("c", "hello"));
|
|
151
|
-
});
|
|
152
|
-
// Entity.set: WHY it's different — the constraint is a union, not a simple type
|
|
153
|
-
//
|
|
154
|
-
// If Entity.set used the Ref/HashMap pattern (shared U parameter), then:
|
|
155
|
-
//
|
|
156
|
-
// Entity.set({ name: "Alice" }) // infers U = { name: string }
|
|
157
|
-
// // Returns: (self: EntityUpdate<..., { name: string }, ...>) => EntityUpdate<...>
|
|
158
|
-
//
|
|
159
|
-
// // When piped, self's U is the all-or-none union:
|
|
160
|
-
// // { tenantId: string; region: string } | { tenantId?: never; region?: never }
|
|
161
|
-
// // This union is NOT assignable to { name: string } — FALSE POSITIVE error.
|
|
162
|
-
// // A perfectly valid non-GSI update would be rejected.
|
|
163
|
-
//
|
|
164
|
-
// So the module-level Entity.set uses `Updates extends Record<string, unknown>`
|
|
165
|
-
// in data-last, accepting any record and deferring validation to runtime.
|
|
166
|
-
// -----------------------------------------------------------------------
|
|
167
|
-
// ENTITY-SCOPED SET: Employees.set() — runtime validated
|
|
168
|
-
// -----------------------------------------------------------------------
|
|
169
|
-
// Each Entity instance exposes a `.set` dual where U is pre-bound from the
|
|
170
|
-
// entity definition. GSI all-or-none is enforced at runtime.
|
|
171
|
-
// DATA-FIRST: partial GSI composites caught at runtime
|
|
172
|
-
Employees.set(Employees.update({ employeeId: "e-1" }), { tenantId: "t-3" });
|
|
173
|
-
// DATA-LAST: partial GSI composites caught at runtime
|
|
174
|
-
const _entityScopedBad = Effect.gen(function* () {
|
|
175
|
-
yield* Employees.update({ employeeId: "e-1" }).pipe(Employees.set({ tenantId: "t-3" }));
|
|
176
|
-
});
|
|
177
|
-
// GOOD: all GSI composites in entity-scoped pipe
|
|
178
|
-
const _entityScopedGood1 = Effect.gen(function* () {
|
|
179
|
-
yield* Employees.update({ employeeId: "e-1" }).pipe(Employees.set({ tenantId: "t-3", region: "us-east-1" }));
|
|
180
|
-
});
|
|
181
|
-
// GOOD: no GSI composites in entity-scoped pipe
|
|
182
|
-
const _entityScopedGood2 = Effect.gen(function* () {
|
|
183
|
-
yield* Employees.update({ employeeId: "e-1" }).pipe(Employees.set({ name: "Alice" }));
|
|
184
|
-
});
|
|
185
|
-
// PIPE CHAIN: Entity-scoped set composes with Effect.map/catchTag
|
|
186
|
-
const _entityScopedChain = Effect.gen(function* () {
|
|
187
|
-
const result = yield* Employees.update({ employeeId: "e-1" }).pipe(Employees.set({ tenantId: "t-3", region: "us-east-1" }), Employees.expectedVersion(1), (op) => op.asEffect(), Effect.map(() => "success"), Effect.catchTag("OptimisticLockError", () => Effect.succeed("lock failed")));
|
|
188
|
-
return result;
|
|
189
|
-
});
|
|
190
|
-
void _pipeBadRuntime, _pipeGood1, _pipeGood2, _pipeChainPartial, _pipeChainGood;
|
|
191
|
-
void _refExample, _hashMapExample;
|
|
192
|
-
void _entityScopedBad, _entityScopedGood1, _entityScopedGood2, _entityScopedChain;
|
|
193
|
-
//# sourceMappingURL=_sparse_check.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_sparse_check.js","sourceRoot":"","sources":["../src/_sparse_check.ts"],"names":[],"mappings":"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"}
|