graphddb 0.2.5 → 0.3.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.
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  ChangeCaptureRegistry,
3
3
  resolveModelClass
4
- } from "./chunk-4TYK3AV6.js";
4
+ } from "./chunk-6AIAHP3A.js";
5
5
 
6
6
  // src/cdc/prng.ts
7
7
  var SeededRandom = class {
package/dist/cli.js CHANGED
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  buildBridgeBundle,
4
4
  normalizeSelectSpec
5
- } from "./chunk-SGYBE2OV.js";
5
+ } from "./chunk-QEOFIXTN.js";
6
6
  import {
7
7
  MetadataRegistry
8
- } from "./chunk-4TYK3AV6.js";
8
+ } from "./chunk-6AIAHP3A.js";
9
9
 
10
10
  // src/cli.ts
11
11
  import { createRequire } from "module";
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { S as SelectableOf, g as PrimaryKeyOf, h as RequestContext, i as Middleware, j as ReadRequestKind, k as CtxModel, l as ReadParams, m as ReadRequestCtx, D as DynamoDBOperation, I as Item, E as Executor, n as RetryPolicy, o as ExecutionPlanSpec, p as SegmentedKey, q as SelectBuilderSpec, r as RawCondition, s as TransactionSpec, t as Manifest, u as RetryOverride, v as ExecutionPlan, w as ResolvedKey, R as ReadExecOptions, a as ExecutorResult, B as BatchGetExecInput, P as PutInput, W as WriteExecOptions, b as WriteResult, U as UpdateInput, c as DeleteInput, d as BatchWriteExecItem, e as BatchExecOptions, T as TransactWriteExecItem, x as CdcEmulatorOptions, y as ChangeHandler, z as Unsubscribe, F as FaultSpec, A as ConcurrentRecomputeRef, C as ChangeEvent, G as EventLog, H as ReplayOptions, J as ShardId, K as TransactionItemSpec, L as Param, N as ParamDescriptor, O as DefinitionMap, Q as OperationDefinition, f as DDBModel, M as ModelStatic, V as WriteDefinitionOptions, X as PartialQueryKeyOf, Y as StrictSelectSpec, Z as EntityInput, _ as UniqueQueryKeyOf, $ as EntityRef, a0 as ConditionInput, a1 as QueryModelContract, a2 as QueryMethodSpec, a3 as CommandModelContract, a4 as CommandMethodSpec, a5 as ContractSpec, a6 as QuerySpec, a7 as CommandSpec, a8 as ContextSpec, a9 as OperationsDocument, aa as AnyOperationDefinition, ab as BridgeBundle, ac as ConditionSpec } from './types--tdHK3vi.js';
2
- export { ad as BatchDeleteRequest, ae as BatchGetOptions, af as BatchGetRequest, ag as BatchGetResult, ah as BatchPutRequest, ai as BatchResult, aj as BatchWriteRequest, ak as CONTRACT_RANGE_FANOUT_CONCURRENCY, al as CdcMode, am as Change, an as ChangeBatch, ao as ChangeEventName, ap as ClockMode, aq as Column, ar as ColumnMap, as as CommandContractMethodSpec, at as CommandInputShape, au as CommandMethod, av as CommandPlan, aw as CommandResolutionTarget, ax as CommandResultKind, ay as CommandSelectShape, az as CompiledFragment, aA as ComposeSpec, aB as CondSlot, aC as ConditionCheckInput, aD as Connection, aE as ContractCallSignature, aF as ContractCardinality, aG as ContractCommandParams, aH as ContractCommandResult, aI as ContractComposeNode, aJ as ContractFromRef, aK as ContractInputArity, aL as ContractItem, aM as ContractKeyFieldRef, aN as ContractKeyInput, aO as ContractKeyRef, aP as ContractKeySpec, aQ as ContractKind, aR as ContractMethodOp, aS as ContractParamRef, aT as ContractQueryParams, aU as ContractResolution, aV as CtxBase, aW as DEFAULT_MAX_ATTEMPTS, aX as DEFAULT_RETRY_POLICY, aY as DeleteOptions, aZ as DeriveEffect, a_ as DerivedEdgeWrite, a$ as DerivedUpdate, b0 as DescriptorBinding, b1 as ENTITY_WRITES_MARKER, b2 as EdgeEffect, b3 as EffectPath, b4 as EmitEffect, b5 as EntityWritesDefinition, b6 as EntityWritesShape, b7 as ExecutableCommandContract, b8 as ExecutableQueryContract, b9 as FilterInput, ba as FilterSpec, bb as FragmentInput, bc as GsiDefinitionMarker, bd as GsiOptions, be as IdempotencyEffect, bf as InProcessWriteDescriptor, bg as InputArity, bh as KeyDefinitionMarker, bi as KeySegment, bj as KeySlot, bk as KeyStructure, bl as KeyedResult, bm as LIFECYCLE_CONTRACT_MARKER, bn as LifecycleContract, bo as LifecycleEffects, bp as LiteralParam, bq as ManifestEntity, br as ManifestField, bs as ManifestFieldType, bt as ManifestGsi, bu as ManifestKey, bv as ManifestRelation, bw as ManifestTable, bx as ModelRef, by as MutateMode, bz as MutateOptions, bA as MutateParallelResult, bB as MutateTransactionResult, bC as MutationBody, bD as MutationDescriptorMap, bE as MutationFragment, bF as MutationInputProxy, bG as MutationInputRef, bH as MutationIntent, bI as NumberParam, bJ as OperationKind, bK as OperationSpec, bL as ParallelOpResult, bM as ParamKind, bN as ParamSpec, bO as ParamStructure, bP as PersistCtx, bQ as PersistOrigin, bR as PlannedCommandMethod, bS as PutOptions, bT as QueryContractMethodSpec, bU as QueryEnvelopeResult, bV as QueryKeyOf, bW as QueryMethod, bX as QueryResult, bY as RangeConditionSpec, bZ as ReadEnvelope, b_ as ReadOpCtx, b$ as ReadOpKind, c0 as ReadOperationType, c1 as ReadRouteDescriptor, c2 as ReadRouteOptions, c3 as ReadRouteResult, c4 as RecordedCompose, c5 as RelationBuilder, c6 as RelationSelect, c7 as RelationSpec, c8 as RequiresEffect, c9 as Resolution, ca as RetryInfo, cb as RetryOperationKind, cc as SPEC_VERSION, cd as SegmentSpec, ce as SelectBuilder, cf as SelectOf, cg as StartingPosition, ch as StreamViewType, ci as StringParam, cj as TransactionContext, ck as TransactionItemType, cl as UniqueEffect, cm as Updatable, cn as UpdateOptions, co as WhenSpec, cp as WriteCtx, cq as WriteDescriptor, cr as WriteEnvelope, cs as WriteInput, ct as WriteKind, cu as WriteLifecyclePhase, cv as WriteMiddleware, cw as WriteOperationType, cx as WriteRecorder, cy as WriteResultProjection, cz as attachModelClass, cA as buildDeleteInput, cB as buildPutInput, cC as buildUpdateInput, cD as compileFragment, cE as compileMutationPlan, cF as compileSingleFragmentPlan, cG as cond, cH as contractOfMethodSpec, cI as definePlan, cJ as entityWrites, cK as executeBatchGet, cL as executeBatchWrite, cM as executeCommandMethod, cN as executeDelete, cO as executeKeyedBatchGet, cP as executePut, cQ as executeQueryMethod, cR as executeRangeFanout, cS as executeTransaction, cT as executeUpdate, cU as from, cV as getEntityWrites, cW as gsi, cX as isColumn, cY as isCommandModelContract, cZ as isCommandPlan, c_ as isContractComposeNode, c$ as isContractFromRef, d0 as isContractKeyFieldRef, d1 as isContractKeyRef, d2 as isContractParamRef, d3 as isEntityWritesDefinition, d4 as isKeySegment, d5 as isLifecycleContract, d6 as isMutationFragment, d7 as isMutationInputRef, d8 as isParam, d9 as isPlannedCommandMethod, da as isQueryModelContract, db as isRetryableError, dc as isRetryableTransactionCancellation, dd as k, de as key, df as lifecyclePhaseForIntent, dg as mintContractKeyFieldRef, dh as mintContractParamRef, di as mutation, dj as param, dk as publicCommandModel, dl as publicQueryModel, dm as query, dn as resolveLifecycle, dp as wholeKeysSentinel } from './types--tdHK3vi.js';
1
+ import { S as SelectableOf, g as PrimaryKeyOf, h as RequestContext, i as Middleware, j as ReadRequestKind, k as CtxModel, l as ReadParams, m as ReadRequestCtx, D as DynamoDBOperation, I as Item, E as Executor, n as RetryPolicy, o as ExecutionPlanSpec, p as EntityMetadata, K as KeyDefinition, G as GsiDefinition, F as FieldOptions, q as DynamoType, r as RelationOptions, A as AggregateOptions, s as AggregateValue, t as SelectBuilderSpec, u as RawCondition, v as TransactionSpec, w as Manifest, x as RetryOverride, y as ExecutionPlan, z as FieldMetadata, H as ResolvedKey, R as ReadExecOptions, a as ExecutorResult, B as BatchGetExecInput, P as PutInput, W as WriteExecOptions, b as WriteResult, U as UpdateInput, c as DeleteInput, d as BatchWriteExecItem, e as BatchExecOptions, T as TransactWriteExecItem, J as CdcEmulatorOptions, L as ChangeHandler, N as Unsubscribe, O as FaultSpec, Q as ConcurrentRecomputeRef, C as ChangeEvent, V as EventLog, X as ReplayOptions, Y as ShardId, Z as RelationMetadata, _ as TransactionItemSpec, $ as Param, a0 as ParamDescriptor, a1 as DefinitionMap, a2 as OperationDefinition, f as DDBModel, M as ModelStatic, a3 as WriteDefinitionOptions, a4 as PartialQueryKeyOf, a5 as StrictSelectSpec, a6 as EntityInput, a7 as UniqueQueryKeyOf, a8 as EntityRef, a9 as ConditionInput, aa as QueryModelContract, ab as QueryMethodSpec, ac as CommandModelContract, ad as CommandMethodSpec, ae as ContractSpec, af as QuerySpec, ag as CommandSpec, ah as ContextSpec, ai as OperationsDocument, aj as AnyOperationDefinition, ak as BridgeBundle, al as ConditionSpec } from './types-xJRn5qkv.js';
2
+ export { am as AggregateMetadata, an as BatchDeleteRequest, ao as BatchGetOptions, ap as BatchGetRequest, aq as BatchGetResult, ar as BatchPutRequest, as as BatchResult, at as BatchWriteRequest, au as CONTRACT_RANGE_FANOUT_CONCURRENCY, av as CdcMode, aw as Change, ax as ChangeBatch, ay as ChangeEventName, az as ClockMode, aA as CollectionEffect, aB as CollectionOptions, aC as Column, aD as ColumnMap, aE as CommandContractMethodSpec, aF as CommandInputShape, aG as CommandMethod, aH as CommandPlan, aI as CommandResolutionTarget, aJ as CommandResultKind, aK as CommandSelectShape, aL as CompiledFragment, aM as ComposeSpec, aN as CondSlot, aO as ConditionCheckInput, aP as Connection, aQ as ContractCallSignature, aR as ContractCardinality, aS as ContractCommandParams, aT as ContractCommandResult, aU as ContractComposeNode, aV as ContractFromRef, aW as ContractInputArity, aX as ContractItem, aY as ContractKeyFieldRef, aZ as ContractKeyInput, a_ as ContractKeyRef, a$ as ContractKeySpec, b0 as ContractKind, b1 as ContractMethodOp, b2 as ContractParamRef, b3 as ContractQueryParams, b4 as ContractResolution, b5 as CounterAggregate, b6 as CounterEffect, b7 as CtxBase, b8 as DEFAULT_MAX_ATTEMPTS, b9 as DEFAULT_RETRY_POLICY, ba as DeleteOptions, bb as DeriveEffect, bc as DerivedEdgeWrite, bd as DerivedUpdate, be as DescriptorBinding, bf as ENTITY_WRITES_MARKER, bg as EdgeEffect, bh as EffectPath, bi as EmbeddedMetadata, bj as EmitEffect, bk as EntityWritesDefinition, bl as EntityWritesShape, bm as ExecutableCommandContract, bn as ExecutableQueryContract, bo as FilterInput, bp as FilterSpec, bq as FragmentInput, br as GsiDefinitionMarker, bs as GsiOptions, bt as IdempotencyEffect, bu as InProcessWriteDescriptor, bv as InputArity, bw as KeyDefinitionMarker, bx as KeySegment, by as KeySlot, bz as KeyStructure, bA as KeyedResult, bB as LIFECYCLE_CONTRACT_MARKER, bC as LifecycleContract, bD as LifecycleEffects, bE as LiteralParam, bF as MaintainConsistency, bG as MaintainEffect, bH as MaintainEvent, bI as MaintainItem, bJ as MaintainTrigger, bK as MaintainUpdateMode, bL as MaintenanceGraph, bM as ManifestEntity, bN as ManifestField, bO as ManifestFieldType, bP as ManifestGsi, bQ as ManifestKey, bR as ManifestRelation, bS as ManifestTable, bT as ModelRef, bU as MutateMode, bV as MutateOptions, bW as MutateParallelResult, bX as MutateTransactionResult, bY as MutationBody, bZ as MutationDescriptorMap, b_ as MutationFragment, b$ as MutationInputProxy, c0 as MutationInputRef, c1 as MutationIntent, c2 as NumberParam, c3 as OperationKind, c4 as OperationSpec, c5 as ParallelOpResult, c6 as ParamKind, c7 as ParamSpec, c8 as ParamStructure, c9 as PersistCtx, ca as PersistOrigin, cb as PlannedCommandMethod, cc as ProjectionMap, cd as ProjectionTransform, ce as ProjectionTransformOp, cf as PutOptions, cg as QueryContractMethodSpec, ch as QueryEnvelopeResult, ci as QueryKeyOf, cj as QueryMethod, ck as QueryResult, cl as RangeConditionSpec, cm as ReadEnvelope, cn as ReadOpCtx, co as ReadOpKind, cp as ReadOperationType, cq as ReadRouteDescriptor, cr as ReadRouteOptions, cs as ReadRouteResult, ct as RecordedCompose, cu as RelationBuilder, cv as RelationConsistency, cw as RelationLimitOptions, cx as RelationPattern, cy as RelationProjection, cz as RelationReadOptions, cA as RelationSelect, cB as RelationSpec, cC as RelationUpdateMode, cD as RelationWriteOptions, cE as RequiresEffect, cF as Resolution, cG as RetryInfo, cH as RetryOperationKind, cI as SPEC_VERSION, cJ as SegmentSpec, cK as SegmentedKey, cL as SelectBuilder, cM as SelectOf, cN as SnapshotEffect, cO as StartingPosition, cP as StreamViewType, cQ as StringParam, cR as TransactionContext, cS as TransactionItemType, cT as UniqueEffect, cU as Updatable, cV as UpdateOptions, cW as WhenSpec, cX as WriteCtx, cY as WriteDescriptor, cZ as WriteEnvelope, c_ as WriteInput, c$ as WriteKind, d0 as WriteLifecyclePhase, d1 as WriteMiddleware, d2 as WriteOperationType, d3 as WriteRecorder, d4 as WriteResultProjection, d5 as attachModelClass, d6 as buildDeleteInput, d7 as buildMaintenanceGraph, d8 as buildPutInput, d9 as buildUpdateInput, da as compileFragment, db as compileMutationPlan, dc as compileSingleFragmentPlan, dd as cond, de as contractOfMethodSpec, df as definePlan, dg as entityWrites, dh as executeBatchGet, di as executeBatchWrite, dj as executeCommandMethod, dk as executeDelete, dl as executeKeyedBatchGet, dm as executePut, dn as executeQueryMethod, dp as executeRangeFanout, dq as executeTransaction, dr as executeUpdate, ds as from, dt as getEntityWrites, du as gsi, dv as identity, dw as isColumn, dx as isCommandModelContract, dy as isCommandPlan, dz as isContractComposeNode, dA as isContractFromRef, dB as isContractKeyFieldRef, dC as isContractKeyRef, dD as isContractParamRef, dE as isEntityWritesDefinition, dF as isKeySegment, dG as isLifecycleContract, dH as isMaintainTrigger, dI as isMutationFragment, dJ as isMutationInputRef, dK as isParam, dL as isPlannedCommandMethod, dM as isQueryModelContract, dN as isRetryableError, dO as isRetryableTransactionCancellation, dP as k, dQ as key, dR as lifecyclePhaseForIntent, dS as maintainTrigger, dT as mintContractKeyFieldRef, dU as mintContractParamRef, dV as mutation, dW as param, dX as preview, dY as publicCommandModel, dZ as publicQueryModel, d_ as query, d$ as resolveLifecycle, e0 as wholeKeysSentinel } from './types-xJRn5qkv.js';
3
3
  import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
4
4
  import { DynamoDBDocumentClient } from '@aws-sdk/lib-dynamodb';
5
5
 
@@ -34,7 +34,7 @@ type ListOptions<T, S extends SelectableOf<T> = SelectableOf<T>> = {
34
34
 
35
35
  /**
36
36
  * Read-middleware runtime (issue #138). Drives the registered {@link Middleware}
37
- * list through the read hook points R1–R5 with the ordering the proposal
37
+ * list through the read hook points R1–R5 with the ordering docs/middleware.md
38
38
  * specifies:
39
39
  *
40
40
  * - `before*` (R1 / R2) run **first-registered-first** (FIFO);
@@ -52,7 +52,7 @@ type ListOptions<T, S extends SelectableOf<T> = SelectableOf<T>> = {
52
52
  * set stable even if middleware is (un)registered mid-flight, and is
53
53
  * concurrency-safe under parallel fan-out (#31).
54
54
  *
55
- * @see docs/proposals/read-middleware.md
55
+ * @see docs/middleware.md
56
56
  */
57
57
 
58
58
  /**
@@ -313,71 +313,6 @@ interface RelationExecutionPlan {
313
313
  readonly resultPaths: readonly string[];
314
314
  }
315
315
 
316
- type DynamoType = 'S' | 'N' | 'BOOL' | 'B' | 'SS' | 'NS' | 'L' | 'M';
317
- interface FieldOptions {
318
- format?: 'datetime' | 'date';
319
- readonly?: boolean;
320
- serialize?: (value: unknown) => unknown;
321
- deserialize?: (value: unknown) => unknown;
322
- }
323
- interface FieldMetadata {
324
- propertyName: string;
325
- dynamoType: DynamoType;
326
- options?: FieldOptions;
327
- /**
328
- * For a `@literal(...)` field — a `string`-stored field whose value is one of a
329
- * known, finite set — the allowed literal values, in declaration order (issue
330
- * #75). Recorded purely as model metadata so a Contract param bound into the
331
- * field can recover the precise `literal` param-kind from its bind position
332
- * (`src/spec/contracts.ts`), serializing as `{ type: 'literal', literals: [...] }`
333
- * instead of the imprecise `'string'`. JSON-safe by construction (a non-empty
334
- * array of strings). `undefined` for every other field decorator (`@string`,
335
- * `@number`, …), so plain fields are byte-for-byte unchanged (backward compat).
336
- */
337
- literals?: readonly string[];
338
- }
339
-
340
- interface KeyDefinition {
341
- /** The canonical structured key (PK/SK segment lists). */
342
- segmented: SegmentedKey;
343
- inputFieldNames: string[];
344
- }
345
- interface GsiDefinition {
346
- indexName: string;
347
- /** The canonical structured key (PK/SK segment lists). */
348
- segmented: SegmentedKey;
349
- inputFieldNames: string[];
350
- unique: boolean;
351
- }
352
- interface RelationLimitOptions {
353
- default: number;
354
- max: number;
355
- }
356
- interface RelationOptions {
357
- limit?: RelationLimitOptions;
358
- order?: 'ASC' | 'DESC';
359
- }
360
- interface RelationMetadata {
361
- type: 'hasMany' | 'hasOne' | 'belongsTo';
362
- propertyName: string;
363
- targetFactory: () => new (...args: unknown[]) => unknown;
364
- keyBinding: Record<string, string>;
365
- options?: RelationOptions;
366
- }
367
- interface EmbeddedMetadata {
368
- propertyName: string;
369
- modelFactory: () => new (...args: unknown[]) => unknown;
370
- }
371
- interface EntityMetadata {
372
- tableName: string;
373
- prefix: string;
374
- fields: FieldMetadata[];
375
- primaryKey: KeyDefinition | null;
376
- gsiDefinitions: GsiDefinition[];
377
- relations: RelationMetadata[];
378
- embeddedFields: EmbeddedMetadata[];
379
- }
380
-
381
316
  interface LintRule {
382
317
  id: string;
383
318
  severity: 'error' | 'warning';
@@ -401,6 +336,22 @@ declare class Linter {
401
336
  declare class MetadataRegistry {
402
337
  private static store;
403
338
  private static _linter;
339
+ /**
340
+ * A monotonically-increasing counter bumped on every change to the set of
341
+ * registered models ({@link register} / {@link clear}). It lets a consumer that
342
+ * caches a structure derived from the whole registry (e.g. the maintenance graph
343
+ * in `src/spec/mutation-command.ts`) detect that the registry has changed since
344
+ * the cache was built and rebuild — closing the silent-drop window where a model
345
+ * registered after a cache build would be invisible to it. Only the membership
346
+ * of {@link store} changes here; per-model lazy finalize ({@link finalize}) does
347
+ * not bump it (it adds no relations/triggers, so it cannot change the graph).
348
+ */
349
+ private static _generation;
350
+ /**
351
+ * The current registry generation (see {@link _generation}). A consumer caches
352
+ * the value it built against and rebuilds when it no longer matches.
353
+ */
354
+ static get generation(): number;
404
355
  static register(target: Function, metadata: EntityMetadata): void;
405
356
  static get(target: Function): EntityMetadata;
406
357
  static has(target: Function): boolean;
@@ -531,9 +482,92 @@ declare const map: FieldDecorator<Record<string, unknown>>;
531
482
  declare function embedded(modelFactory: () => new (...args: unknown[]) => unknown): (_value: undefined, context: ClassFieldDecoratorContext) => void;
532
483
 
533
484
  declare function hasMany(targetFactory: () => new (...args: unknown[]) => unknown, keyBinding: Record<string, string>, options?: RelationOptions): (_value: undefined, context: ClassFieldDecoratorContext) => void;
534
- declare function belongsTo(targetFactory: () => new (...args: unknown[]) => unknown, keyBinding: Record<string, string>): (_value: undefined, context: ClassFieldDecoratorContext) => void;
485
+ declare function belongsTo(targetFactory: () => new (...args: unknown[]) => unknown, keyBinding: Record<string, string>, options?: RelationOptions): (_value: undefined, context: ClassFieldDecoratorContext) => void;
535
486
  declare function hasOne(targetFactory: () => new (...args: unknown[]) => unknown, keyBinding: Record<string, string>): (_value: undefined, context: ClassFieldDecoratorContext) => void;
536
487
 
488
+ /**
489
+ * `@aggregate` — a **scalar-aggregate** field decorator (Epic #118 §5.2 counter /
490
+ * latest preset; issue #122).
491
+ *
492
+ * Where `@hasMany` / `@belongsTo` declare a *navigation* (a relation yielding
493
+ * model instances) and `@string` / `@number` declare a *stored* attribute,
494
+ * `@aggregate` declares a **scalar value derived by aggregating a source
495
+ * entity's rows**. It is a field (the decorated property holds a `number` /
496
+ * `string`), but — like a relation — it carries a source `targetFactory` +
497
+ * `keyBinding` selecting the rows it aggregates. The declaration surface mirrors
498
+ * the RFC §5.2 example:
499
+ *
500
+ * ```ts
501
+ * @model({ table: 'AppTable', prefix: 'THREAD' })
502
+ * class ThreadSummaryModel extends DDBModel {
503
+ * @string threadId!: string;
504
+ *
505
+ * @aggregate(() => PostModel, { threadId: 'threadId' }, {
506
+ * pattern: 'counter', value: count(),
507
+ * write: { maintainedOn: ['Post.created', 'Post.removed'] },
508
+ * })
509
+ * postCount!: number;
510
+ *
511
+ * @aggregate(() => PostModel, { threadId: 'threadId' }, {
512
+ * pattern: 'counter', value: max('createdAt'),
513
+ * write: { maintainedOn: ['Post.created'] },
514
+ * })
515
+ * lastPostAt!: string;
516
+ * }
517
+ * ```
518
+ *
519
+ * ## Scope (issue #122)
520
+ *
521
+ * This is the **declaration surface only** — the decorator records an
522
+ * {@link AggregateMetadata} into its own collector array (drained by `@model`
523
+ * into `EntityMetadata.aggregates`), exactly as the relation decorators push to
524
+ * the relation collector. The aggregation *effect* (maintenance graph #124,
525
+ * compile injection #125, runtime #127) is out of scope and consumes this
526
+ * metadata later.
527
+ *
528
+ * ## Vocabulary reuse (no double definition)
529
+ *
530
+ * `options.pattern` is the shared {@link RelationPattern} (typically `'counter'`)
531
+ * and `options.write` is the shared {@link RelationWriteOptions} — `maintainedOn`
532
+ * triggers on the `created|updated|removed` event vocabulary plus
533
+ * `consistency` (`transactional|eventual`) / `updateMode` (`mutation|stream`).
534
+ * Both were defined by B (#121) in `src/metadata/types.ts` and are **reused**
535
+ * here, never re-defined.
536
+ *
537
+ * @param targetFactory - Resolves the source entity whose rows are aggregated
538
+ * (lazy, mirroring the relation decorators, to tolerate circular imports).
539
+ * @param keyBinding - The key binding selecting the source rows
540
+ * (target key field → source field).
541
+ * @param options - The aggregate preset / value / maintenance-write declaration.
542
+ */
543
+ declare function aggregate(targetFactory: () => new (...args: unknown[]) => unknown, keyBinding: Record<string, string>, options: AggregateOptions): (_value: undefined, context: ClassFieldDecoratorContext) => void;
544
+ /**
545
+ * Value helper for an `@aggregate` field: the **count** aggregation — the
546
+ * cardinality of source rows matched by the key binding (Epic #118 §5.2
547
+ * `counter` preset, `count()`). It takes no source field (it counts rows, not a
548
+ * value), so the decorated field is a `number` (e.g. `postCount!: number`).
549
+ *
550
+ * Produces the {@link AggregateValue} IR node `{ op: 'count' }`. This is the
551
+ * standalone, recorder-free authoring helper used directly in the decorator
552
+ * argument (mirroring the standalone `preview(...)` / `identity(...)` projection
553
+ * helpers A (#120) exposes for relation options).
554
+ */
555
+ declare function count(): AggregateValue;
556
+ /**
557
+ * Value helper for an `@aggregate` field: the **max** aggregation — the maximum
558
+ * value of a named source `field` across the rows matched by the key binding
559
+ * (Epic #118 §5.2 `counter` / latest preset, `max('createdAt')`). The decorated
560
+ * field's type matches the source field's (e.g. `lastPostAt!: string` ←
561
+ * `max('createdAt')`).
562
+ *
563
+ * Produces the {@link AggregateValue} IR node `{ op: 'max', field }`.
564
+ *
565
+ * @param field - The source field whose maximum is tracked (e.g. `'createdAt'`).
566
+ * @throws if `field` is not a non-empty string (an aggregation over no source
567
+ * field is meaningless — a defensive runtime check mirroring `@literal`'s).
568
+ */
569
+ declare function max(field: string): AggregateValue;
570
+
537
571
  declare class TableMapping {
538
572
  private static mapping;
539
573
  static set(mapping: Record<string, string>): void;
@@ -1125,10 +1159,14 @@ declare function decodePerKeyCursor(cursor: string, expectedKey: Record<string,
1125
1159
  /**
1126
1160
  * Creates a Linter pre-loaded with rules safe for Entity registration.
1127
1161
  *
1128
- * Rules included: no-scan, require-limit, gsi-ambiguity, missing-gsi, relation-depth.
1129
- * query-boundary is excluded because it flags non-unique GSIs which
1130
- * are valid for list() operations; boundary enforcement is handled
1131
- * at runtime by the planner's boundary-check.
1162
+ * Rules included: no-scan, require-limit, gsi-ambiguity, missing-gsi,
1163
+ * relation-depth, same-partition-preset, plus the Epic #118 Phase 1 maintenance
1164
+ * validators (issue #126): missing-context, 400kb, hot-partition, fan-out,
1165
+ * multi-maintainer-same-row. The maintenance validators are no-ops for any
1166
+ * relation that does not declare `write.maintainedOn`, so unannotated models are
1167
+ * unaffected. query-boundary is excluded because it flags non-unique GSIs which
1168
+ * are valid for list() operations; boundary enforcement is handled at runtime by
1169
+ * the planner's boundary-check.
1132
1170
  */
1133
1171
  declare function createDefaultLinter(): Linter;
1134
1172
 
@@ -2290,4 +2328,4 @@ declare function assertBundleSerializable(bundle: BridgeBundle): void;
2290
2328
  */
2291
2329
  declare function buildBridgeBundle(queries?: DefinitionMap, commands?: DefinitionMap, registry?: typeof MetadataRegistry, transactions?: Record<string, TransactionDefinition>, contractInputs?: ContractInputs): BridgeBundle;
2292
2330
 
2293
- export { type AnyModelContract, AnyOperationDefinition, BATCH_GET_MAX_KEYS, BATCH_WRITE_MAX_ITEMS, BatchExecOptions, BatchGetExecInput, BatchWriteExecItem, BridgeBundle, type BuiltContracts, CdcEmulator, CdcEmulatorOptions, ChangeEvent, ChangeHandler, ClientManager, type CollectParams, CommandMethodSpec, CommandModelContract, CommandSpec, ConcurrentRecomputeRef, type ConditionExpressionResult, ConditionInput, ConditionSpec, type ContextOwnership, type ContextOwnershipMap, ContextSpec, type ContractBoundaryViolation, type ContractInputs, type ContractMap, type ContractN1Violation, ContractSpec, CtxModel, DDBModel, DefinitionMap, DeleteInput, DynamoDBOperation, DynamoExecutor, type DynamoType, EDGE_WRITES_MARKER, type EdgeLifecycle, type EdgeWriteDeclaration, type EdgeWriteRecorder, type EdgeWritesDefinition, type EmbeddedMetadata, type EntityMetadata, EntityRef, EventLog, ExecutionPlan, Executor, ExecutorResult, type ExplainInput, FaultSpec, type FieldMetadata, type FieldOptions, type FilterExpressionResult, type GsiDefinition, Item, type KeyDefinition, type LintResult, type LintRule, Linter, type ListInput, type ListOptions, MAX_TRANSACT_ITEMS, Manifest, MetadataRegistry, Middleware, type ModelOptions, ModelStatic, OLD_VALUE_NAMESPACE, OperationDefinition, OperationsDocument, Param, ParamDescriptor, type Parameterize, PartialQueryKeyOf, type PerKeyCursorEnvelope, type PlanInput, PrimaryKeyOf, type ProjectionResult, PutInput, QueryMethodSpec, QueryModelContract, type QueryOptions$1 as QueryOptions, QuerySpec, RawCondition, ReadExecOptions, ReadParams, ReadRequestCtx, ReadRequestKind, type RelationLimitOptions, type RelationMetadata, type RelationOptions, type RelationTraversalOptions, ReplayOptions, RequestContext, ResolvedKey, RetryOverride, RetryPolicy, RetryingExecutor, SegmentedKey, SelectableOf, ShardId, TableMapping, TransactWriteExecItem, type TransactionDefinition, TransactionItemSpec, type TransactionParamShape, type TransactionRef, TransactionSpec, type TxConditionCheckOptions, type TxForEachInstruction, type TxForEachOptions, type TxInstruction, type TxRecorder, type TxWriteInstruction, type TxWriteOptions, UniqueQueryKeyOf, type UpdateExpressionResult, UpdateInput, type WhenComparison, WriteDefinitionOptions, WriteExecOptions, WriteResult, assertBundleSerializable, assertContractBoundaries, assertContractN1Safe, assertJsonSerializable, assertSupportedCondition, belongsTo, binary, boolean, buildBridgeBundle, buildConditionExpression, buildContexts, buildContracts, buildManifest, buildOperations, buildProjection, buildQuerySpec, buildTransactionSpec, buildTransactions, buildUpdateExpression, collectContractBoundaryViolations, collectContractN1Violations, compileFilterExpression, createCdcEmulator, createDefaultLinter, datetime, decodeCursor, decodePerKeyCursor, defineCommands, defineDelete, defineList, definePut, defineQueries, defineQuery, defineTransaction, defineTransactions, defineUpdate, deriveEdgeWriteItems, deriveEdgeWriteItemsFor, deriveModelEdgeWriteItems, derivePrefix, detectRelationFields, edgeWrites, embedded, encodeCursor, encodePerKeyCursor, evaluateFilter, execute, executeDeclarativeTransaction, executeExplain, executeList, executeQuery, expandTransaction, field, getEdgeWrites, getImplicitKeyFields, gsiAmbiguityRule, hasMany, hasOne, hydrate, isEdgeWritesDefinition, isSelectBuilder, isTransactionRef, list, literal, map, missingGsiRule, model, noScanRule, number, numberSet, plan, queryBoundaryRule, relationDepthRule, requireLimitRule, resolveKey, resolveRelations, serializeContractKey, serializeFieldValue, string, stringSet, validateDepth, validateGsiAmbiguity, when };
2331
+ export { AggregateOptions, AggregateValue, type AnyModelContract, AnyOperationDefinition, BATCH_GET_MAX_KEYS, BATCH_WRITE_MAX_ITEMS, BatchExecOptions, BatchGetExecInput, BatchWriteExecItem, BridgeBundle, type BuiltContracts, CdcEmulator, CdcEmulatorOptions, ChangeEvent, ChangeHandler, ClientManager, type CollectParams, CommandMethodSpec, CommandModelContract, CommandSpec, ConcurrentRecomputeRef, type ConditionExpressionResult, ConditionInput, ConditionSpec, type ContextOwnership, type ContextOwnershipMap, ContextSpec, type ContractBoundaryViolation, type ContractInputs, type ContractMap, type ContractN1Violation, ContractSpec, CtxModel, DDBModel, DefinitionMap, DeleteInput, DynamoDBOperation, DynamoExecutor, DynamoType, EDGE_WRITES_MARKER, type EdgeLifecycle, type EdgeWriteDeclaration, type EdgeWriteRecorder, type EdgeWritesDefinition, EntityMetadata, EntityRef, EventLog, ExecutionPlan, Executor, ExecutorResult, type ExplainInput, FaultSpec, FieldMetadata, FieldOptions, type FilterExpressionResult, GsiDefinition, Item, KeyDefinition, type LintResult, type LintRule, Linter, type ListInput, type ListOptions, MAX_TRANSACT_ITEMS, Manifest, MetadataRegistry, Middleware, type ModelOptions, ModelStatic, OLD_VALUE_NAMESPACE, OperationDefinition, OperationsDocument, Param, ParamDescriptor, type Parameterize, PartialQueryKeyOf, type PerKeyCursorEnvelope, type PlanInput, PrimaryKeyOf, type ProjectionResult, PutInput, QueryMethodSpec, QueryModelContract, type QueryOptions$1 as QueryOptions, QuerySpec, RawCondition, ReadExecOptions, ReadParams, ReadRequestCtx, ReadRequestKind, RelationMetadata, RelationOptions, type RelationTraversalOptions, ReplayOptions, RequestContext, ResolvedKey, RetryOverride, RetryPolicy, RetryingExecutor, SelectableOf, ShardId, TableMapping, TransactWriteExecItem, type TransactionDefinition, TransactionItemSpec, type TransactionParamShape, type TransactionRef, TransactionSpec, type TxConditionCheckOptions, type TxForEachInstruction, type TxForEachOptions, type TxInstruction, type TxRecorder, type TxWriteInstruction, type TxWriteOptions, UniqueQueryKeyOf, type UpdateExpressionResult, UpdateInput, type WhenComparison, WriteDefinitionOptions, WriteExecOptions, WriteResult, aggregate, assertBundleSerializable, assertContractBoundaries, assertContractN1Safe, assertJsonSerializable, assertSupportedCondition, belongsTo, binary, boolean, buildBridgeBundle, buildConditionExpression, buildContexts, buildContracts, buildManifest, buildOperations, buildProjection, buildQuerySpec, buildTransactionSpec, buildTransactions, buildUpdateExpression, collectContractBoundaryViolations, collectContractN1Violations, compileFilterExpression, count, createCdcEmulator, createDefaultLinter, datetime, decodeCursor, decodePerKeyCursor, defineCommands, defineDelete, defineList, definePut, defineQueries, defineQuery, defineTransaction, defineTransactions, defineUpdate, deriveEdgeWriteItems, deriveEdgeWriteItemsFor, deriveModelEdgeWriteItems, derivePrefix, detectRelationFields, edgeWrites, embedded, encodeCursor, encodePerKeyCursor, evaluateFilter, execute, executeDeclarativeTransaction, executeExplain, executeList, executeQuery, expandTransaction, field, getEdgeWrites, getImplicitKeyFields, gsiAmbiguityRule, hasMany, hasOne, hydrate, isEdgeWritesDefinition, isSelectBuilder, isTransactionRef, list, literal, map, max, missingGsiRule, model, noScanRule, number, numberSet, plan, queryBoundaryRule, relationDepthRule, requireLimitRule, resolveKey, resolveRelations, serializeContractKey, serializeFieldValue, string, stringSet, validateDepth, validateGsiAmbiguity, when };
package/dist/index.js CHANGED
@@ -16,6 +16,7 @@ import {
16
16
  buildBridgeBundle,
17
17
  buildContexts,
18
18
  buildContracts,
19
+ buildMaintenanceGraph,
19
20
  buildManifest,
20
21
  buildOperations,
21
22
  buildProjection,
@@ -56,6 +57,7 @@ import {
56
57
  getEntityWrites,
57
58
  getImplicitKeyFields,
58
59
  hydrate,
60
+ identity,
59
61
  isCommandModelContract,
60
62
  isCommandPlan,
61
63
  isContractComposeNode,
@@ -66,6 +68,7 @@ import {
66
68
  isEdgeWritesDefinition,
67
69
  isEntityWritesDefinition,
68
70
  isLifecycleContract,
71
+ isMaintainTrigger,
69
72
  isMutationFragment,
70
73
  isMutationInputRef,
71
74
  isPlannedCommandMethod,
@@ -73,11 +76,13 @@ import {
73
76
  isSelectBuilder,
74
77
  isTransactionRef,
75
78
  lifecyclePhaseForIntent,
79
+ maintainTrigger,
76
80
  mapWithConcurrency,
77
81
  mintContractKeyFieldRef,
78
82
  mintContractParamRef,
79
83
  mutation,
80
84
  plan,
85
+ preview,
81
86
  publicCommandModel,
82
87
  publicQueryModel,
83
88
  query,
@@ -86,11 +91,11 @@ import {
86
91
  validateDepth,
87
92
  when,
88
93
  wholeKeysSentinel
89
- } from "./chunk-SGYBE2OV.js";
94
+ } from "./chunk-QEOFIXTN.js";
90
95
  import {
91
96
  CdcEmulator,
92
97
  createCdcEmulator
93
- } from "./chunk-ITHQ2EDH.js";
98
+ } from "./chunk-QQNP43JL.js";
94
99
  import {
95
100
  BATCH_GET_MAX_KEYS,
96
101
  BATCH_WRITE_MAX_ITEMS,
@@ -139,7 +144,7 @@ import {
139
144
  resolveKey,
140
145
  resolveModelClass,
141
146
  serializeFieldValue
142
- } from "./chunk-4TYK3AV6.js";
147
+ } from "./chunk-6AIAHP3A.js";
143
148
 
144
149
  // src/metadata/prefix.ts
145
150
  function derivePrefix(customPrefix, className) {
@@ -189,6 +194,7 @@ function validateGsiAmbiguity(primaryKey, gsiDefinitions) {
189
194
  var pendingFields = [];
190
195
  var pendingEmbedded = [];
191
196
  var pendingRelations = [];
197
+ var pendingAggregates = [];
192
198
  function collectField(field2) {
193
199
  pendingFields.push(field2);
194
200
  }
@@ -198,6 +204,9 @@ function collectEmbedded(embedded2) {
198
204
  function collectRelation(relation) {
199
205
  pendingRelations.push(relation);
200
206
  }
207
+ function collectAggregate(aggregate2) {
208
+ pendingAggregates.push(aggregate2);
209
+ }
201
210
  function drainFields() {
202
211
  const result = pendingFields;
203
212
  pendingFields = [];
@@ -213,6 +222,11 @@ function drainRelations() {
213
222
  pendingRelations = [];
214
223
  return result;
215
224
  }
225
+ function drainAggregates() {
226
+ const result = pendingAggregates;
227
+ pendingAggregates = [];
228
+ return result;
229
+ }
216
230
 
217
231
  // src/decorators/model.ts
218
232
  function model(options) {
@@ -220,6 +234,7 @@ function model(options) {
220
234
  const fields = drainFields();
221
235
  const embeddedFields = drainEmbedded();
222
236
  const relations = drainRelations();
237
+ const aggregates = drainAggregates();
223
238
  const prefix = derivePrefix(options.prefix, context.name);
224
239
  MetadataRegistry.register(target, {
225
240
  tableName: options.table,
@@ -228,6 +243,7 @@ function model(options) {
228
243
  primaryKey: null,
229
244
  gsiDefinitions: [],
230
245
  relations,
246
+ aggregates,
231
247
  embeddedFields
232
248
  });
233
249
  };
@@ -322,7 +338,7 @@ function hasMany(targetFactory, keyBinding, options) {
322
338
  });
323
339
  };
324
340
  }
325
- function belongsTo(targetFactory, keyBinding) {
341
+ function belongsTo(targetFactory, keyBinding, options) {
326
342
  return function(_value, context) {
327
343
  const propertyName = String(context.name);
328
344
  assertRelationPropertyNameAllowed(propertyName);
@@ -330,7 +346,8 @@ function belongsTo(targetFactory, keyBinding) {
330
346
  type: "belongsTo",
331
347
  propertyName,
332
348
  targetFactory,
333
- keyBinding
349
+ keyBinding,
350
+ options
334
351
  });
335
352
  };
336
353
  }
@@ -347,6 +364,29 @@ function hasOne(targetFactory, keyBinding) {
347
364
  };
348
365
  }
349
366
 
367
+ // src/decorators/aggregate.ts
368
+ function aggregate(targetFactory, keyBinding, options) {
369
+ return function(_value, context) {
370
+ collectAggregate({
371
+ propertyName: String(context.name),
372
+ targetFactory,
373
+ keyBinding,
374
+ options
375
+ });
376
+ };
377
+ }
378
+ function count() {
379
+ return { op: "count" };
380
+ }
381
+ function max(field2) {
382
+ if (typeof field2 !== "string" || field2.length === 0) {
383
+ throw new Error(
384
+ `max(...) requires a non-empty source field name to aggregate (e.g. max('createdAt')), but received ${JSON.stringify(field2)}.`
385
+ );
386
+ }
387
+ return { op: "max", field: field2 };
388
+ }
389
+
350
390
  // src/operations/declarative-transaction.ts
351
391
  var PLACEHOLDER_RE = /\{[^{}]+\}/g;
352
392
  function resolveTemplate(template, params, element) {
@@ -484,6 +524,79 @@ function entityByName(manifest, name) {
484
524
  function physicalTableName(manifest, logical) {
485
525
  return manifest.tables[logical]?.physicalName ?? logical;
486
526
  }
527
+ function applyMaintainTransform(op, args, value) {
528
+ if (op === "identity") return value;
529
+ if (op === "preview") {
530
+ const n = args[0];
531
+ if (typeof n !== "number" || !Number.isInteger(n) || n <= 0) {
532
+ throw new Error(
533
+ `declarative transaction: a maintenance \`preview\` projection has a non-positive-integer length bound (${JSON.stringify(n)}).`
534
+ );
535
+ }
536
+ if (value === null || value === void 0) return value;
537
+ return String(value).slice(0, n);
538
+ }
539
+ throw new Error(
540
+ `declarative transaction: unknown maintenance projection op '${String(op)}' (expected 'identity' / 'preview').`
541
+ );
542
+ }
543
+ function buildMaintainProjection(maintain, params, element) {
544
+ const out = {};
545
+ for (const [attr, transform] of Object.entries(maintain.projection)) {
546
+ const value = resolveValue(`{${transform.inputField}}`, params, element);
547
+ out[attr] = applyMaintainTransform(transform.op, transform.args, value);
548
+ }
549
+ return out;
550
+ }
551
+ function buildMaintainUpdateItem(spec, maintain, table, key2, params, element) {
552
+ const update = { TableName: table, Key: key2 };
553
+ if (maintain.kind === "counter") {
554
+ const counter = maintain.counter;
555
+ if (counter === void 0) {
556
+ throw new Error(
557
+ `declarative transaction: a 'counter' maintenance write on '${spec.entity}' has no \`counter\` payload.`
558
+ );
559
+ }
560
+ update.UpdateExpression = "ADD #a0 :a0";
561
+ update.ExpressionAttributeNames = { "#a0": counter.attribute };
562
+ update.ExpressionAttributeValues = {
563
+ ":a0": typeof counter.delta === "string" ? Number(counter.delta) : counter.delta
564
+ };
565
+ return { Update: update };
566
+ }
567
+ const projection = buildMaintainProjection(maintain, params, element);
568
+ if (maintain.kind === "collection") {
569
+ const field2 = maintain.collection?.field;
570
+ if (field2 === void 0) {
571
+ throw new Error(
572
+ `declarative transaction: a 'collection' maintenance write on '${spec.entity}' has no \`collection.field\`.`
573
+ );
574
+ }
575
+ update.UpdateExpression = "SET #c = list_append(if_not_exists(#c, :empty), :item)";
576
+ update.ExpressionAttributeNames = { "#c": field2 };
577
+ update.ExpressionAttributeValues = { ":empty": [], ":item": [projection] };
578
+ } else {
579
+ const names = {};
580
+ const values = {};
581
+ const sets = [];
582
+ let i = 0;
583
+ for (const [attr, value] of Object.entries(projection)) {
584
+ names[`#m${i}`] = attr;
585
+ values[`:m${i}`] = value;
586
+ sets.push(`#m${i} = :m${i}`);
587
+ i++;
588
+ }
589
+ if (sets.length === 0) {
590
+ throw new Error(
591
+ `declarative transaction: a 'snapshot' maintenance write on '${spec.entity}' has an empty projection.`
592
+ );
593
+ }
594
+ update.UpdateExpression = `SET ${sets.join(", ")}`;
595
+ update.ExpressionAttributeNames = names;
596
+ update.ExpressionAttributeValues = values;
597
+ }
598
+ return { Update: update };
599
+ }
487
600
  function buildTransactItem(spec, manifest, params, element) {
488
601
  const literal2 = spec.literalKey === true;
489
602
  const entity = literal2 ? void 0 : entityByName(manifest, spec.entity);
@@ -511,6 +624,9 @@ function buildTransactItem(spec, manifest, params, element) {
511
624
  applyCondition(spec.condition, check, params, element);
512
625
  return { ConditionCheck: check };
513
626
  }
627
+ if (spec.maintain !== void 0) {
628
+ return buildMaintainUpdateItem(spec, spec.maintain, table, key2, params, element);
629
+ }
514
630
  const changes = resolveRecord(spec.changes, params, element);
515
631
  const adds = resolveRecord(spec.add, params, element);
516
632
  const names = {};
@@ -600,8 +716,8 @@ async function executeDeclarativeTransaction(spec, manifest, params) {
600
716
  expanded.map((e) => e.item),
601
717
  {
602
718
  modelBySignature,
603
- limitError: (count) => new Error(
604
- `declarative transaction: expanded to ${count} items, exceeds the DynamoDB TransactWriteItems limit of ${MAX_TRANSACT_ITEMS}.`
719
+ limitError: (count2) => new Error(
720
+ `declarative transaction: expanded to ${count2} items, exceeds the DynamoDB TransactWriteItems limit of ${MAX_TRANSACT_ITEMS}.`
605
721
  )
606
722
  }
607
723
  );
@@ -1063,6 +1179,7 @@ export {
1063
1179
  SPEC_VERSION,
1064
1180
  TableMapping,
1065
1181
  TransactionContext,
1182
+ aggregate,
1066
1183
  assertBundleSerializable,
1067
1184
  assertContractBoundaries,
1068
1185
  assertContractN1Safe,
@@ -1077,6 +1194,7 @@ export {
1077
1194
  buildContexts,
1078
1195
  buildContracts,
1079
1196
  buildDeleteInput,
1197
+ buildMaintenanceGraph,
1080
1198
  buildManifest,
1081
1199
  buildOperations,
1082
1200
  buildProjection,
@@ -1094,6 +1212,7 @@ export {
1094
1212
  compileSingleFragmentPlan,
1095
1213
  cond,
1096
1214
  contractOfMethodSpec,
1215
+ count,
1097
1216
  createCdcEmulator,
1098
1217
  createDefaultLinter,
1099
1218
  datetime,
@@ -1146,6 +1265,7 @@ export {
1146
1265
  hasMany,
1147
1266
  hasOne,
1148
1267
  hydrate,
1268
+ identity,
1149
1269
  isColumn,
1150
1270
  isCommandModelContract,
1151
1271
  isCommandPlan,
@@ -1158,6 +1278,7 @@ export {
1158
1278
  isEntityWritesDefinition,
1159
1279
  isKeySegment,
1160
1280
  isLifecycleContract,
1281
+ isMaintainTrigger,
1161
1282
  isMutationFragment,
1162
1283
  isMutationInputRef,
1163
1284
  isParam,
@@ -1172,7 +1293,9 @@ export {
1172
1293
  lifecyclePhaseForIntent,
1173
1294
  list,
1174
1295
  literal,
1296
+ maintainTrigger,
1175
1297
  map,
1298
+ max,
1176
1299
  mintContractKeyFieldRef,
1177
1300
  mintContractParamRef,
1178
1301
  missingGsiRule,
@@ -1183,6 +1306,7 @@ export {
1183
1306
  numberSet,
1184
1307
  param,
1185
1308
  plan,
1309
+ preview,
1186
1310
  publicCommandModel,
1187
1311
  publicQueryModel,
1188
1312
  query,
@@ -1,4 +1,4 @@
1
- import { E as Executor, D as DynamoDBOperation, R as ReadExecOptions, a as ExecutorResult, B as BatchGetExecInput, P as PutInput, W as WriteExecOptions, b as WriteResult, U as UpdateInput, c as DeleteInput, d as BatchWriteExecItem, e as BatchExecOptions, T as TransactWriteExecItem, M as ModelStatic, f as DDBModel, C as ChangeEvent } from '../types--tdHK3vi.js';
1
+ import { E as Executor, D as DynamoDBOperation, R as ReadExecOptions, a as ExecutorResult, B as BatchGetExecInput, P as PutInput, W as WriteExecOptions, b as WriteResult, U as UpdateInput, c as DeleteInput, d as BatchWriteExecItem, e as BatchExecOptions, T as TransactWriteExecItem, M as ModelStatic, f as DDBModel, C as ChangeEvent } from '../types-xJRn5qkv.js';
2
2
  import '@aws-sdk/client-dynamodb';
3
3
 
4
4
  /**
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  createCdcEmulator
3
- } from "../chunk-ITHQ2EDH.js";
3
+ } from "../chunk-QQNP43JL.js";
4
4
  import {
5
5
  ClientManager,
6
6
  MetadataRegistry,
7
7
  TableMapping,
8
8
  resolveModelClass
9
- } from "../chunk-4TYK3AV6.js";
9
+ } from "../chunk-6AIAHP3A.js";
10
10
 
11
11
  // src/memory/memory-store.ts
12
12
  function deepClone(value) {