@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
package/dist/Entity.js
ADDED
|
@@ -0,0 +1,558 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Entity (pure definition layer) — builds the AWS-free half of an Entity:
|
|
3
|
+
* the domain model binding, primary key + index definitions, system-field
|
|
4
|
+
* configuration, unique constraints, and the derived schemas (`inputSchema`,
|
|
5
|
+
* `updateSchema`, `createSchema`).
|
|
6
|
+
*
|
|
7
|
+
* This module is AWS-SDK-free in BOTH its runtime import graph and its
|
|
8
|
+
* emitted `.d.ts` surface. The full `effect-dynamodb` package extends the
|
|
9
|
+
* {@link EntityDefinition} produced here with the AWS-coupled CRUD/query
|
|
10
|
+
* operations (DynamoClient, Marshaller, expression compilation), reusing
|
|
11
|
+
* {@link buildEntityDefinition} so the derivation has a single source of truth.
|
|
12
|
+
*
|
|
13
|
+
* `Entity.make()` here returns a pure {@link EntityDefinition}. Consumers who
|
|
14
|
+
* only need the derived schemas (e.g. HttpApi payloads, validation) can import
|
|
15
|
+
* it from `@effect-dynamodb/schema` without pulling the AWS SDK into their
|
|
16
|
+
* dependency graph or type surface.
|
|
17
|
+
*/
|
|
18
|
+
import { Duration, Option, SchemaAST } from "effect";
|
|
19
|
+
import { getIdentifierField, getSparseFields, isConfiguredModel, isHidden, isRecordAst, isRecordSchema, isRef, isRefField, } from "./DynamoModel.js";
|
|
20
|
+
import { makeCompositeNullableError } from "./Errors.js";
|
|
21
|
+
import { allCompositeAttributes, buildDerivedSchemas, buildFieldEncodings, getFields, getSchemaFields, resolveSystemFields, resolveUniqueFields, validateNoTransformOverride, } from "./internal/EntitySchemas.js";
|
|
22
|
+
import { normalizeGsiConfig } from "./KeyComposer.js";
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// TTL helpers (pure — Duration parsing only)
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
/**
|
|
27
|
+
* Normalize a TTL config value to whole seconds.
|
|
28
|
+
*
|
|
29
|
+
* Accepts a `Duration.Duration` or a humanized string (e.g. `"7 days"`,
|
|
30
|
+
* `"24 hours"`), parsed via Effect's `Duration` input grammar. A bare `number`
|
|
31
|
+
* is intentionally NOT accepted at the type level — `Duration.fromInput` treats
|
|
32
|
+
* a number as **milliseconds**, so `3600` would silently mean 3.6 s (a 1000×
|
|
33
|
+
* footgun); callers must pass `Duration.seconds(3600)` or `"3600 seconds"`.
|
|
34
|
+
*
|
|
35
|
+
* Throws `[EDD-9005]` for a non-finite (infinite) duration — an infinite TTL
|
|
36
|
+
* epoch is nonsensical. {@link make} validates every configured TTL eagerly via
|
|
37
|
+
* this helper, so the write path never observes an invalid value.
|
|
38
|
+
*/
|
|
39
|
+
export const normalizeTtlSeconds = (input) => {
|
|
40
|
+
let duration;
|
|
41
|
+
if (typeof input === "string") {
|
|
42
|
+
const parsed = Duration.fromInput(input);
|
|
43
|
+
if (Option.isNone(parsed)) {
|
|
44
|
+
throw new Error(`[EDD-9005] TTL string "${input}" is not a valid duration (expected e.g. "7 days", "24 hours", "30 minutes").`);
|
|
45
|
+
}
|
|
46
|
+
duration = parsed.value;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
duration = input;
|
|
50
|
+
}
|
|
51
|
+
const seconds = Duration.toSeconds(duration);
|
|
52
|
+
if (!Number.isFinite(seconds)) {
|
|
53
|
+
const shown = typeof input === "string" ? `"${input}"` : "the provided Duration";
|
|
54
|
+
throw new Error(`[EDD-9005] TTL must resolve to a finite duration; ${shown} resolves to a non-finite (infinite) TTL, which is not a valid DynamoDB TTL epoch.`);
|
|
55
|
+
}
|
|
56
|
+
return seconds;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Extract the optional TTL from a unique-constraint definition. Only the object
|
|
60
|
+
* form (`{ fields, ttl }`) carries a TTL; the bare-array form never does.
|
|
61
|
+
*
|
|
62
|
+
* @internal
|
|
63
|
+
*/
|
|
64
|
+
export const resolveUniqueTtl = (def) => typeof def === "object" && !Array.isArray(def) && "ttl" in def ? def.ttl : undefined;
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
// buildEntityDefinition — pure validation + derivation
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
/**
|
|
69
|
+
* @internal Run all `make()`-time validation and derivation for an entity and
|
|
70
|
+
* return the bundle of pure locals. Shared by the schema-package {@link make}
|
|
71
|
+
* and the runtime `effect-dynamodb` `Entity.make` so derivation has a single
|
|
72
|
+
* source of truth.
|
|
73
|
+
*
|
|
74
|
+
* @throws on invalid configuration (EDD-90xx).
|
|
75
|
+
*/
|
|
76
|
+
export const buildEntityDefinition = (config) => {
|
|
77
|
+
// Unwrap ConfiguredModel to get the raw model and attribute overrides
|
|
78
|
+
const configured = isConfiguredModel(config.model) ? config.model : undefined;
|
|
79
|
+
const rawModel = configured ? configured.model : config.model;
|
|
80
|
+
const configuredAttributes = configured?.attributes ?? {};
|
|
81
|
+
const isSchemaClass = typeof rawModel === "function";
|
|
82
|
+
const modelFields = getFields(rawModel);
|
|
83
|
+
const hasHiddenFields = Object.values(modelFields).some(isHidden);
|
|
84
|
+
const systemFields = resolveSystemFields(config.timestamps, config.versioned, config.timeSeries, modelFields, configuredAttributes);
|
|
85
|
+
// ---------------------------------------------------------------------------
|
|
86
|
+
// Validate indexes
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
const primaryIndex = config.indexes.primary;
|
|
89
|
+
if (primaryIndex.pk.composite.length === 0 && primaryIndex.sk.composite.length === 0) {
|
|
90
|
+
throw new Error(`[EDD-9001] Entity "${config.entityType}": primary key must have at least one composite attribute in pk or sk`);
|
|
91
|
+
}
|
|
92
|
+
// Build the set of valid composite attribute names: model fields + ref-derived ID fields
|
|
93
|
+
const validCompositeFields = new Set(Object.keys(modelFields));
|
|
94
|
+
for (const fieldName of Object.keys(modelFields)) {
|
|
95
|
+
if (isRefField(fieldName, config.model)) {
|
|
96
|
+
validCompositeFields.add(`${fieldName}Id`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
for (const [indexName, indexDef] of Object.entries(config.indexes)) {
|
|
100
|
+
for (const attr of [...indexDef.pk.composite, ...indexDef.sk.composite]) {
|
|
101
|
+
if (!validCompositeFields.has(attr)) {
|
|
102
|
+
throw new Error(`[EDD-9002] Entity "${config.entityType}": index "${indexName}" references unknown attribute "${attr}". ` +
|
|
103
|
+
`Valid attributes: ${[...validCompositeFields].sort().join(", ")}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// ---------------------------------------------------------------------------
|
|
108
|
+
// EDD-9025: composite attribute schemas must not include `null`.
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
const resolveCompositeSchemaForNullCheck = (compositeAttr) => {
|
|
111
|
+
if (compositeAttr in modelFields) {
|
|
112
|
+
return { schema: modelFields[compositeAttr], source: `model field` };
|
|
113
|
+
}
|
|
114
|
+
if (config.refs) {
|
|
115
|
+
for (const [refFieldName, refValue] of Object.entries(config.refs)) {
|
|
116
|
+
if (`${refFieldName}Id` !== compositeAttr)
|
|
117
|
+
continue;
|
|
118
|
+
const refEntity = refValue.entity;
|
|
119
|
+
const idField = getIdentifierField(refEntity.model);
|
|
120
|
+
if (!idField)
|
|
121
|
+
return undefined;
|
|
122
|
+
return { schema: idField.schema, source: `ref "${refFieldName}" identifier` };
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return undefined;
|
|
126
|
+
};
|
|
127
|
+
const findNullInAst = (ast, path, seen = new Set()) => {
|
|
128
|
+
if (seen.has(ast))
|
|
129
|
+
return undefined;
|
|
130
|
+
seen.add(ast);
|
|
131
|
+
if (SchemaAST.isNull(ast))
|
|
132
|
+
return `${path}.Null`;
|
|
133
|
+
if (SchemaAST.isUnion(ast)) {
|
|
134
|
+
for (let i = 0; i < ast.types.length; i++) {
|
|
135
|
+
const found = findNullInAst(ast.types[i], `${path}.Union[${i}]`, seen);
|
|
136
|
+
if (found)
|
|
137
|
+
return found;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return undefined;
|
|
141
|
+
};
|
|
142
|
+
const checkCompositeForNull = (surface, compositeAttr) => {
|
|
143
|
+
const resolved = resolveCompositeSchemaForNullCheck(compositeAttr);
|
|
144
|
+
if (!resolved)
|
|
145
|
+
return;
|
|
146
|
+
const found = findNullInAst(resolved.schema.ast, resolved.source);
|
|
147
|
+
if (found) {
|
|
148
|
+
throw makeCompositeNullableError({
|
|
149
|
+
entityType: config.entityType,
|
|
150
|
+
surface,
|
|
151
|
+
compositeAttribute: compositeAttr,
|
|
152
|
+
schemaPath: found,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
for (const attr of [
|
|
157
|
+
...config.indexes.primary.pk.composite,
|
|
158
|
+
...config.indexes.primary.sk.composite,
|
|
159
|
+
]) {
|
|
160
|
+
checkCompositeForNull("primaryKey", attr);
|
|
161
|
+
}
|
|
162
|
+
for (const [indexName, indexDef] of Object.entries(config.indexes)) {
|
|
163
|
+
if (indexName === "primary")
|
|
164
|
+
continue;
|
|
165
|
+
for (const attr of [...indexDef.pk.composite, ...indexDef.sk.composite]) {
|
|
166
|
+
checkCompositeForNull(`index "${indexName}"`, attr);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (config.unique) {
|
|
170
|
+
for (const [constraintName, constraintDef] of Object.entries(config.unique)) {
|
|
171
|
+
const fields = resolveUniqueFields(constraintDef);
|
|
172
|
+
for (const f of fields) {
|
|
173
|
+
checkCompositeForNull(`unique:${constraintName}`, f);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// ---------------------------------------------------------------------------
|
|
178
|
+
// Validate timeSeries config (EDD-9010..9016)
|
|
179
|
+
// ---------------------------------------------------------------------------
|
|
180
|
+
if (config.timeSeries !== undefined && config.timeSeries !== null) {
|
|
181
|
+
const ts = config.timeSeries;
|
|
182
|
+
const orderBy = ts.orderBy;
|
|
183
|
+
if (!(orderBy in modelFields)) {
|
|
184
|
+
throw new Error(`[EDD-9010] Entity "${config.entityType}": timeSeries.orderBy "${orderBy}" does not name a model field. ` +
|
|
185
|
+
`Valid model fields: ${Object.keys(modelFields).sort().join(", ")}`);
|
|
186
|
+
}
|
|
187
|
+
const primary = config.indexes.primary;
|
|
188
|
+
const pkSkComposites = new Set([...primary.pk.composite, ...primary.sk.composite]);
|
|
189
|
+
if (pkSkComposites.has(orderBy)) {
|
|
190
|
+
throw new Error(`[EDD-9011] Entity "${config.entityType}": timeSeries.orderBy "${orderBy}" must not appear ` +
|
|
191
|
+
`in the primary key pk or sk composite — it shadows the #e# event-SK infix.`);
|
|
192
|
+
}
|
|
193
|
+
if (config.versioned !== undefined && config.versioned !== null && config.versioned !== false) {
|
|
194
|
+
throw new Error(`[EDD-9012] Entity "${config.entityType}": timeSeries and versioned are mutually exclusive. ` +
|
|
195
|
+
`Pick one consistency model per entity.`);
|
|
196
|
+
}
|
|
197
|
+
if (config.softDelete !== undefined &&
|
|
198
|
+
config.softDelete !== null &&
|
|
199
|
+
config.softDelete !== false) {
|
|
200
|
+
throw new Error(`[EDD-9015] Entity "${config.entityType}": timeSeries and softDelete are mutually exclusive. ` +
|
|
201
|
+
`Append on a soft-deleted item would land on a new empty row — not a sound resurrection model.`);
|
|
202
|
+
}
|
|
203
|
+
if (ts.appendInput === undefined || ts.appendInput === null) {
|
|
204
|
+
throw new Error(`[EDD-9016] Entity "${config.entityType}": timeSeries.appendInput is required. ` +
|
|
205
|
+
`Define a Schema.Struct whose fields are the subset of the model allowed in .append() input. ` +
|
|
206
|
+
`Fields outside appendInput are preserved on the current item — this is the enrichment-preservation guarantee. ` +
|
|
207
|
+
`To opt out (dangerous), pass the full model schema explicitly.`);
|
|
208
|
+
}
|
|
209
|
+
const appendInputFields = (() => {
|
|
210
|
+
const ai = ts.appendInput;
|
|
211
|
+
const fields = getSchemaFields(ai);
|
|
212
|
+
if (fields)
|
|
213
|
+
return Object.keys(fields);
|
|
214
|
+
throw new Error(`[EDD-9016] Entity "${config.entityType}": timeSeries.appendInput must be a Schema.Struct or Schema.Class (.fields required).`);
|
|
215
|
+
})();
|
|
216
|
+
const appendInputFieldSet = new Set(appendInputFields);
|
|
217
|
+
if (!appendInputFieldSet.has(orderBy)) {
|
|
218
|
+
throw new Error(`[EDD-9013] Entity "${config.entityType}": timeSeries.appendInput must include orderBy "${orderBy}". ` +
|
|
219
|
+
`Without it .append() cannot evaluate the CAS condition.`);
|
|
220
|
+
}
|
|
221
|
+
for (const composite of pkSkComposites) {
|
|
222
|
+
if (!appendInputFieldSet.has(composite)) {
|
|
223
|
+
throw new Error(`[EDD-9013] Entity "${config.entityType}": timeSeries.appendInput missing primary-key composite "${composite}". ` +
|
|
224
|
+
`Every PK/SK composite must appear in appendInput so the event can be addressed.`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
for (const fieldName of Object.keys(modelFields)) {
|
|
228
|
+
if (isRefField(fieldName, config.model)) {
|
|
229
|
+
if (orderBy === fieldName || orderBy === `${fieldName}Id`) {
|
|
230
|
+
throw new Error(`[EDD-9014] Entity "${config.entityType}": timeSeries.orderBy "${orderBy}" names a ref ` +
|
|
231
|
+
`or ref-derived id field. Refs are create-time denormalisations and cannot serve as the event clock.`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
for (const fieldName of Object.keys(modelFields)) {
|
|
236
|
+
if (isRefField(fieldName, config.model)) {
|
|
237
|
+
if (appendInputFieldSet.has(`${fieldName}Id`)) {
|
|
238
|
+
throw new Error(`[EDD-9014] Entity "${config.entityType}": timeSeries.appendInput must not include ref-derived ` +
|
|
239
|
+
`"${fieldName}Id" — refs cannot be reassigned via .append(). Use .update() to change a ref.`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// ---------------------------------------------------------------------------
|
|
245
|
+
// Validate generatedId config (EDD-9008)
|
|
246
|
+
// ---------------------------------------------------------------------------
|
|
247
|
+
if (config.generatedId !== undefined && config.generatedId !== null) {
|
|
248
|
+
const gid = config.generatedId;
|
|
249
|
+
const field = gid.field;
|
|
250
|
+
if (!(field in modelFields)) {
|
|
251
|
+
throw new Error(`[EDD-9008] Entity "${config.entityType}": generatedId.field "${field}" does not name a model field. ` +
|
|
252
|
+
`Valid model fields: ${Object.keys(modelFields).sort().join(", ")}`);
|
|
253
|
+
}
|
|
254
|
+
const primary = config.indexes.primary;
|
|
255
|
+
const pkSkComposites = new Set([...primary.pk.composite, ...primary.sk.composite]);
|
|
256
|
+
if (!pkSkComposites.has(field)) {
|
|
257
|
+
throw new Error(`[EDD-9008] Entity "${config.entityType}": generatedId.field "${field}" must participate in the ` +
|
|
258
|
+
`primary key (pk or sk composite). An auto-generated id that does not compose into the primary ` +
|
|
259
|
+
`key cannot address the item. Primary-key composites: ${[...pkSkComposites].sort().join(", ")}`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
// ---------------------------------------------------------------------------
|
|
263
|
+
// Resolve refs at make() time
|
|
264
|
+
// ---------------------------------------------------------------------------
|
|
265
|
+
const resolvedRefs = config.refs
|
|
266
|
+
? Object.entries(config.refs).map(([fieldName, refValue]) => {
|
|
267
|
+
const refEntity = refValue.entity;
|
|
268
|
+
const fieldSchema = modelFields[fieldName];
|
|
269
|
+
if (!fieldSchema) {
|
|
270
|
+
throw new Error(`Entity "${config.entityType}": refs config references field "${fieldName}" which does not exist in the model`);
|
|
271
|
+
}
|
|
272
|
+
if (!isRef(fieldSchema) && !isRefField(fieldName, config.model)) {
|
|
273
|
+
throw new Error(`Entity "${config.entityType}": refs config references field "${fieldName}" which does not have the DynamoModel.ref annotation. Add DynamoModel.ref to the model field or set { ref: true } in DynamoModel.configure.`);
|
|
274
|
+
}
|
|
275
|
+
const idField = getIdentifierField(refEntity.model);
|
|
276
|
+
if (!idField) {
|
|
277
|
+
throw new Error(`Entity "${config.entityType}": ref field "${fieldName}" references entity "${refEntity.entityType}" which has no identifier field. Add DynamoModel.identifier to the model field or set { identifier: true } in DynamoModel.configure.`);
|
|
278
|
+
}
|
|
279
|
+
return {
|
|
280
|
+
fieldName,
|
|
281
|
+
idFieldName: `${fieldName}Id`,
|
|
282
|
+
identifierField: idField.name,
|
|
283
|
+
identifierSchema: idField.schema,
|
|
284
|
+
refEntity,
|
|
285
|
+
refEntityType: refEntity.entityType,
|
|
286
|
+
};
|
|
287
|
+
})
|
|
288
|
+
: [];
|
|
289
|
+
const hasRefs = resolvedRefs.length > 0;
|
|
290
|
+
// ---------------------------------------------------------------------------
|
|
291
|
+
// Auto-generate cascade indexes from expanded ref configs
|
|
292
|
+
// ---------------------------------------------------------------------------
|
|
293
|
+
const cascadeIndexes = {};
|
|
294
|
+
if (config.refs) {
|
|
295
|
+
for (const [refFieldName, refValue] of Object.entries(config.refs)) {
|
|
296
|
+
const cascadeConfig = refValue.cascade;
|
|
297
|
+
if (!cascadeConfig)
|
|
298
|
+
continue;
|
|
299
|
+
const ref = resolvedRefs.find((r) => r.fieldName === refFieldName);
|
|
300
|
+
cascadeIndexes[`_cascade_${refFieldName}`] = {
|
|
301
|
+
index: cascadeConfig.index,
|
|
302
|
+
pk: { field: cascadeConfig.pk.field, composite: [ref.idFieldName] },
|
|
303
|
+
sk: { field: cascadeConfig.sk.field, composite: [...config.indexes.primary.pk.composite] },
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
const initialIndexes = {
|
|
308
|
+
...config.indexes,
|
|
309
|
+
...cascadeIndexes,
|
|
310
|
+
};
|
|
311
|
+
// Build immutable fields set from ConfiguredModel
|
|
312
|
+
const immutableFields = new Set();
|
|
313
|
+
for (const [fieldName, attrConfig] of Object.entries(configuredAttributes)) {
|
|
314
|
+
if (attrConfig.immutable)
|
|
315
|
+
immutableFields.add(fieldName);
|
|
316
|
+
}
|
|
317
|
+
// Resolve identifier field name from model annotation
|
|
318
|
+
const resolvedIdentifier = getIdentifierField(config.model)?.name;
|
|
319
|
+
// Validate: no model field combines a transform schema with a ConfiguredModel override.
|
|
320
|
+
validateNoTransformOverride(modelFields, configuredAttributes);
|
|
321
|
+
// Resolve effective field encodings.
|
|
322
|
+
const fieldEncodings = buildFieldEncodings(modelFields, configuredAttributes);
|
|
323
|
+
const generatedIdField = config.generatedId !== undefined && config.generatedId !== null
|
|
324
|
+
? config.generatedId.field
|
|
325
|
+
: undefined;
|
|
326
|
+
const generatedIdVersion = config.generatedId !== undefined && config.generatedId !== null
|
|
327
|
+
? (config.generatedId.version ?? "v4")
|
|
328
|
+
: undefined;
|
|
329
|
+
const schemas = buildDerivedSchemas(modelFields, initialIndexes, systemFields, resolvedRefs, immutableFields, resolvedIdentifier, config.timeSeries, fieldEncodings, generatedIdField);
|
|
330
|
+
const entityType = config.entityType;
|
|
331
|
+
const entityVersion = 1;
|
|
332
|
+
// ---------------------------------------------------------------------------
|
|
333
|
+
// Sparse Map fields (storedAs: 'sparse') — validation + resolution
|
|
334
|
+
// ---------------------------------------------------------------------------
|
|
335
|
+
const sparseFields = getSparseFields(config.model);
|
|
336
|
+
const hasSparseFields = Object.keys(sparseFields).length > 0;
|
|
337
|
+
if (hasSparseFields) {
|
|
338
|
+
for (const fieldName of Object.keys(sparseFields)) {
|
|
339
|
+
const fieldSchema = modelFields[fieldName];
|
|
340
|
+
if (!fieldSchema) {
|
|
341
|
+
throw new Error(`[EDD-9020] Entity "${config.entityType}": sparse field "${fieldName}" does not exist on the model`);
|
|
342
|
+
}
|
|
343
|
+
const recordInfo = isRecordSchema(fieldSchema);
|
|
344
|
+
if (!recordInfo) {
|
|
345
|
+
throw new Error(`[EDD-9020] Entity "${config.entityType}": sparse field "${fieldName}" must be a Schema.Record. ` +
|
|
346
|
+
`Got a non-Record schema. Sparse storage flattens Record entries into per-key top-level attributes.`);
|
|
347
|
+
}
|
|
348
|
+
if (isRecordAst(recordInfo.valueAst)) {
|
|
349
|
+
throw new Error(`[EDD-9021] Entity "${config.entityType}": sparse field "${fieldName}" has a Record-typed value schema. ` +
|
|
350
|
+
`Nested sparse Records are not supported — use Schema.Struct, Schema.Number, etc. for the inner value.`);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
const allComposites = new Set(allCompositeAttributes(initialIndexes));
|
|
354
|
+
for (const fieldName of Object.keys(sparseFields)) {
|
|
355
|
+
if (allComposites.has(fieldName)) {
|
|
356
|
+
throw new Error(`[EDD-9022] Entity "${config.entityType}": sparse field "${fieldName}" cannot be a primary-key or GSI composite. ` +
|
|
357
|
+
`Composite values must be known at make() time; sparse-map keys are not.`);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
if (config.unique) {
|
|
361
|
+
const sparseSet = new Set(Object.keys(sparseFields));
|
|
362
|
+
for (const [constraintName, constraintDef] of Object.entries(config.unique)) {
|
|
363
|
+
const fields = resolveUniqueFields(constraintDef);
|
|
364
|
+
for (const f of fields) {
|
|
365
|
+
if (sparseSet.has(f)) {
|
|
366
|
+
throw new Error(`[EDD-9022] Entity "${config.entityType}": unique constraint "${constraintName}" cannot reference sparse field "${f}".`);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
const seenPrefix = new Map();
|
|
372
|
+
for (const [fieldName, sparse] of Object.entries(sparseFields)) {
|
|
373
|
+
const existing = seenPrefix.get(sparse.prefix);
|
|
374
|
+
if (existing) {
|
|
375
|
+
throw new Error(`[EDD-9023] Entity "${config.entityType}": sparse fields "${existing}" and "${fieldName}" share prefix "${sparse.prefix}". Prefixes must be distinct.`);
|
|
376
|
+
}
|
|
377
|
+
seenPrefix.set(sparse.prefix, fieldName);
|
|
378
|
+
if (sparse.prefix !== fieldName && sparse.prefix in modelFields) {
|
|
379
|
+
throw new Error(`[EDD-9023] Entity "${config.entityType}": sparse field "${fieldName}" prefix "${sparse.prefix}" collides with non-sparse field "${sparse.prefix}".`);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
// EDD-9005: validate every configured TTL eagerly at make() time.
|
|
384
|
+
{
|
|
385
|
+
const configuredTtls = [];
|
|
386
|
+
if (typeof config.versioned === "object" && config.versioned?.ttl !== undefined) {
|
|
387
|
+
configuredTtls.push(config.versioned.ttl);
|
|
388
|
+
}
|
|
389
|
+
if (typeof config.softDelete === "object" && config.softDelete?.ttl !== undefined) {
|
|
390
|
+
configuredTtls.push(config.softDelete.ttl);
|
|
391
|
+
}
|
|
392
|
+
if (config.timeSeries?.ttl !== undefined)
|
|
393
|
+
configuredTtls.push(config.timeSeries.ttl);
|
|
394
|
+
if (config.unique) {
|
|
395
|
+
for (const def of Object.values(config.unique)) {
|
|
396
|
+
const uTtl = resolveUniqueTtl(def);
|
|
397
|
+
if (uTtl !== undefined)
|
|
398
|
+
configuredTtls.push(uTtl);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
for (const ttl of configuredTtls)
|
|
402
|
+
normalizeTtlSeconds(ttl);
|
|
403
|
+
}
|
|
404
|
+
// ---------------------------------------------------------------------------
|
|
405
|
+
// Field renaming: domain name → DynamoDB attribute name (from ConfiguredModel)
|
|
406
|
+
// ---------------------------------------------------------------------------
|
|
407
|
+
const fieldRenames = {};
|
|
408
|
+
for (const [domainName, attrConfig] of Object.entries(configuredAttributes)) {
|
|
409
|
+
const field = attrConfig.field;
|
|
410
|
+
if (field)
|
|
411
|
+
fieldRenames[domainName] = field;
|
|
412
|
+
}
|
|
413
|
+
const hasRenames = Object.keys(fieldRenames).length > 0;
|
|
414
|
+
const renameToDynamo = (item) => {
|
|
415
|
+
if (!hasRenames)
|
|
416
|
+
return;
|
|
417
|
+
for (const [domain, dynamo] of Object.entries(fieldRenames)) {
|
|
418
|
+
if (domain in item) {
|
|
419
|
+
item[dynamo] = item[domain];
|
|
420
|
+
delete item[domain];
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
};
|
|
424
|
+
const renameFromDynamo = (item) => {
|
|
425
|
+
if (!hasRenames)
|
|
426
|
+
return;
|
|
427
|
+
for (const [domain, dynamo] of Object.entries(fieldRenames)) {
|
|
428
|
+
if (dynamo in item) {
|
|
429
|
+
item[domain] = item[dynamo];
|
|
430
|
+
delete item[dynamo];
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
};
|
|
434
|
+
const resolveDbName = (domainName) => fieldRenames[domainName] ?? domainName;
|
|
435
|
+
return {
|
|
436
|
+
configuredAttributes: configuredAttributes,
|
|
437
|
+
rawModel,
|
|
438
|
+
isSchemaClass,
|
|
439
|
+
modelFields,
|
|
440
|
+
hasHiddenFields,
|
|
441
|
+
systemFields,
|
|
442
|
+
validCompositeFields,
|
|
443
|
+
resolvedRefs,
|
|
444
|
+
hasRefs,
|
|
445
|
+
cascadeIndexes,
|
|
446
|
+
initialIndexes,
|
|
447
|
+
immutableFields,
|
|
448
|
+
resolvedIdentifier,
|
|
449
|
+
fieldEncodings,
|
|
450
|
+
schemas,
|
|
451
|
+
entityType,
|
|
452
|
+
entityVersion,
|
|
453
|
+
sparseFields,
|
|
454
|
+
hasSparseFields,
|
|
455
|
+
fieldRenames,
|
|
456
|
+
hasRenames,
|
|
457
|
+
renameToDynamo,
|
|
458
|
+
renameFromDynamo,
|
|
459
|
+
resolveDbName,
|
|
460
|
+
generatedIdField,
|
|
461
|
+
generatedIdVersion,
|
|
462
|
+
};
|
|
463
|
+
};
|
|
464
|
+
// ---------------------------------------------------------------------------
|
|
465
|
+
// Pure decode helper used by the definition's `_decodeRecord` is AWS-coupled
|
|
466
|
+
// (it lives in the runtime package). The pure definition exposes only
|
|
467
|
+
// `_attachPrototype`, which is pure.
|
|
468
|
+
// ---------------------------------------------------------------------------
|
|
469
|
+
const buildAttachPrototype = (data) => {
|
|
470
|
+
// Schema.Class models carry a prototype; Schema.Struct models do not.
|
|
471
|
+
// Mirror the runtime's attachPrototype exactly.
|
|
472
|
+
const rawModel = data.rawModel;
|
|
473
|
+
return (decoded) => data.isSchemaClass ? Object.assign(Object.create(rawModel.prototype), decoded) : decoded;
|
|
474
|
+
};
|
|
475
|
+
// ---------------------------------------------------------------------------
|
|
476
|
+
// Entity.make — pure definition constructor
|
|
477
|
+
// ---------------------------------------------------------------------------
|
|
478
|
+
/**
|
|
479
|
+
* Create a pure Entity definition.
|
|
480
|
+
*
|
|
481
|
+
* Returns an {@link EntityDefinition} carrying the model binding, index
|
|
482
|
+
* definitions, system-field configuration, and the derived `inputSchema` /
|
|
483
|
+
* `updateSchema` / `createSchema`. This pure form is AWS-SDK-free — import it
|
|
484
|
+
* from `@effect-dynamodb/schema` when you only need the derived schemas (e.g.
|
|
485
|
+
* for HttpApi payloads or validation).
|
|
486
|
+
*
|
|
487
|
+
* The full operational `Entity.make` (with CRUD/query operations) is exported
|
|
488
|
+
* from `effect-dynamodb`; its return type extends {@link EntityDefinition}.
|
|
489
|
+
*
|
|
490
|
+
* @example
|
|
491
|
+
* ```typescript
|
|
492
|
+
* const Tasks = Entity.make({
|
|
493
|
+
* model: Task,
|
|
494
|
+
* entityType: "Task",
|
|
495
|
+
* primaryKey: { pk: { field: "pk", composite: ["taskId"] }, sk: { field: "sk", composite: [] } },
|
|
496
|
+
* })
|
|
497
|
+
* // typeof Tasks.inputSchema.Type → the typed input payload
|
|
498
|
+
* ```
|
|
499
|
+
*/
|
|
500
|
+
export const make = (config) => {
|
|
501
|
+
const gsiIndexes = {};
|
|
502
|
+
if (config.indexes) {
|
|
503
|
+
for (const [name, gsi] of Object.entries(config.indexes)) {
|
|
504
|
+
gsiIndexes[name] = normalizeGsiConfig(gsi);
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
const indexes = { primary: config.primaryKey, ...gsiIndexes };
|
|
508
|
+
return makeDefinitionImpl({ ...config, indexes });
|
|
509
|
+
};
|
|
510
|
+
const makeDefinitionImpl = (config) => {
|
|
511
|
+
const data = buildEntityDefinition(config);
|
|
512
|
+
let allIndexes = data.initialIndexes;
|
|
513
|
+
let schema;
|
|
514
|
+
let tableTag;
|
|
515
|
+
const attachPrototype = buildAttachPrototype(data);
|
|
516
|
+
const definition = {
|
|
517
|
+
_tag: "Entity",
|
|
518
|
+
model: config.model,
|
|
519
|
+
entityType: config.entityType,
|
|
520
|
+
get indexes() {
|
|
521
|
+
return allIndexes;
|
|
522
|
+
},
|
|
523
|
+
timestamps: config.timestamps,
|
|
524
|
+
versioned: config.versioned,
|
|
525
|
+
softDelete: config.softDelete,
|
|
526
|
+
unique: config.unique,
|
|
527
|
+
identifier: data.resolvedIdentifier,
|
|
528
|
+
timeSeries: config.timeSeries,
|
|
529
|
+
generatedId: config.generatedId,
|
|
530
|
+
_resolvedRefs: data.resolvedRefs.map((r) => ({
|
|
531
|
+
fieldName: r.fieldName,
|
|
532
|
+
idFieldName: r.idFieldName,
|
|
533
|
+
identifierField: r.identifierField,
|
|
534
|
+
refEntityType: r.refEntityType,
|
|
535
|
+
})),
|
|
536
|
+
_attachPrototype: attachPrototype,
|
|
537
|
+
_configure: (injectedSchema, injectedTableTag) => {
|
|
538
|
+
schema = injectedSchema;
|
|
539
|
+
tableTag = injectedTableTag;
|
|
540
|
+
},
|
|
541
|
+
_injectIndex: (name, def) => {
|
|
542
|
+
allIndexes = { ...allIndexes, [name]: def };
|
|
543
|
+
},
|
|
544
|
+
get _schema() {
|
|
545
|
+
return schema;
|
|
546
|
+
},
|
|
547
|
+
get _tableTag() {
|
|
548
|
+
return tableTag;
|
|
549
|
+
},
|
|
550
|
+
systemFields: data.systemFields,
|
|
551
|
+
schemas: data.schemas,
|
|
552
|
+
inputSchema: data.schemas.inputSchema,
|
|
553
|
+
createSchema: data.schemas.createSchema,
|
|
554
|
+
updateSchema: data.schemas.updateSchema,
|
|
555
|
+
};
|
|
556
|
+
return definition;
|
|
557
|
+
};
|
|
558
|
+
//# sourceMappingURL=Entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Entity.js","sourceRoot":"","sources":["../src/Entity.ts"],"names":[],"mappings":"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"}
|