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.
Files changed (45) hide show
  1. package/dist/DynamoClient.d.ts +2 -2
  2. package/dist/DynamoClient.d.ts.map +1 -1
  3. package/dist/DynamoClient.js +1 -3
  4. package/dist/DynamoClient.js.map +1 -1
  5. package/package.json +1 -1
  6. package/dist/_AggregateCursor.d.ts +0 -44
  7. package/dist/_AggregateCursor.d.ts.map +0 -1
  8. package/dist/_AggregateCursor.js +0 -18
  9. package/dist/_AggregateCursor.js.map +0 -1
  10. package/dist/_AggregateEdges.d.ts +0 -77
  11. package/dist/_AggregateEdges.d.ts.map +0 -1
  12. package/dist/_AggregateEdges.js +0 -41
  13. package/dist/_AggregateEdges.js.map +0 -1
  14. package/dist/_AggregateSchemas.d.ts +0 -69
  15. package/dist/_AggregateSchemas.d.ts.map +0 -1
  16. package/dist/_AggregateSchemas.js +0 -194
  17. package/dist/_AggregateSchemas.js.map +0 -1
  18. package/dist/_AggregateTypes.d.ts +0 -94
  19. package/dist/_AggregateTypes.d.ts.map +0 -1
  20. package/dist/_AggregateTypes.js +0 -7
  21. package/dist/_AggregateTypes.js.map +0 -1
  22. package/dist/_EntityCombinators.d.ts +0 -155
  23. package/dist/_EntityCombinators.d.ts.map +0 -1
  24. package/dist/_EntityCombinators.js +0 -158
  25. package/dist/_EntityCombinators.js.map +0 -1
  26. package/dist/_EntityConfig.d.ts +0 -100
  27. package/dist/_EntityConfig.d.ts.map +0 -1
  28. package/dist/_EntityConfig.js +0 -7
  29. package/dist/_EntityConfig.js.map +0 -1
  30. package/dist/_EntityOps.d.ts +0 -205
  31. package/dist/_EntityOps.d.ts.map +0 -1
  32. package/dist/_EntityOps.js +0 -137
  33. package/dist/_EntityOps.js.map +0 -1
  34. package/dist/_EntitySchemas.d.ts +0 -57
  35. package/dist/_EntitySchemas.d.ts.map +0 -1
  36. package/dist/_EntitySchemas.js +0 -298
  37. package/dist/_EntitySchemas.js.map +0 -1
  38. package/dist/_EntityTypes.d.ts +0 -81
  39. package/dist/_EntityTypes.d.ts.map +0 -1
  40. package/dist/_EntityTypes.js +0 -7
  41. package/dist/_EntityTypes.js.map +0 -1
  42. package/dist/_sparse_check.d.ts +0 -2
  43. package/dist/_sparse_check.d.ts.map +0 -1
  44. package/dist/_sparse_check.js +0 -193
  45. package/dist/_sparse_check.js.map +0 -1
@@ -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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"}