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.
- package/README.md +9 -1
- package/dist/{chunk-4TYK3AV6.js → chunk-6AIAHP3A.js} +471 -14
- package/dist/{chunk-SGYBE2OV.js → chunk-QEOFIXTN.js} +818 -13
- package/dist/{chunk-ITHQ2EDH.js → chunk-QQNP43JL.js} +1 -1
- package/dist/cli.js +2 -2
- package/dist/index.d.ts +113 -75
- package/dist/index.js +131 -7
- package/dist/testing/index.d.ts +1 -1
- package/dist/testing/index.js +2 -2
- package/dist/{types--tdHK3vi.d.ts → types-xJRn5qkv.d.ts} +884 -16
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
import {
|
|
3
3
|
buildBridgeBundle,
|
|
4
4
|
normalizeSelectSpec
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-QEOFIXTN.js";
|
|
6
6
|
import {
|
|
7
7
|
MetadataRegistry
|
|
8
|
-
} from "./chunk-
|
|
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
|
|
2
|
-
export {
|
|
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
|
|
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/
|
|
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
|
|
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,
|
|
1129
|
-
*
|
|
1130
|
-
*
|
|
1131
|
-
*
|
|
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,
|
|
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-
|
|
94
|
+
} from "./chunk-QEOFIXTN.js";
|
|
90
95
|
import {
|
|
91
96
|
CdcEmulator,
|
|
92
97
|
createCdcEmulator
|
|
93
|
-
} from "./chunk-
|
|
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-
|
|
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: (
|
|
604
|
-
`declarative transaction: expanded to ${
|
|
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,
|
package/dist/testing/index.d.ts
CHANGED
|
@@ -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
|
|
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
|
/**
|
package/dist/testing/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createCdcEmulator
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-QQNP43JL.js";
|
|
4
4
|
import {
|
|
5
5
|
ClientManager,
|
|
6
6
|
MetadataRegistry,
|
|
7
7
|
TableMapping,
|
|
8
8
|
resolveModelClass
|
|
9
|
-
} from "../chunk-
|
|
9
|
+
} from "../chunk-6AIAHP3A.js";
|
|
10
10
|
|
|
11
11
|
// src/memory/memory-store.ts
|
|
12
12
|
function deepClone(value) {
|