orm-dynamodb 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,181 @@
1
+ # orm-dynamodb
2
+
3
+ Lightweight TypeScript decorators for modeling DynamoDB items as classes.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install orm-dynamodb
9
+ ```
10
+
11
+ The package depends on `@aws-sdk/client-dynamodb` and `@aws-sdk/lib-dynamodb`.
12
+
13
+ Your TypeScript config must enable decorators:
14
+
15
+ ```json
16
+ {
17
+ "compilerOptions": {
18
+ "experimentalDecorators": true,
19
+ "emitDecoratorMetadata": true
20
+ }
21
+ }
22
+ ```
23
+
24
+ ## Quick Start
25
+
26
+ ```ts
27
+ import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
28
+ import {
29
+ BaseEntity,
30
+ Entity,
31
+ FromDbModel,
32
+ HashKeyValue,
33
+ Link,
34
+ SortKeyValue,
35
+ ToDbModel
36
+ } from 'orm-dynamodb';
37
+
38
+ BaseEntity.configure(new DynamoDBClient({ region: process.env.AWS_REGION || 'us-east-1' }));
39
+
40
+ @Entity('content', 'pk', 'sk')
41
+ class Author extends BaseEntity {
42
+ @HashKeyValue
43
+ get hashKey() {
44
+ return 'AUTHOR';
45
+ }
46
+
47
+ @SortKeyValue
48
+ get sortKey() {
49
+ return this.authorId;
50
+ }
51
+
52
+ authorId: string;
53
+ displayName: string;
54
+
55
+ constructor(authorId: string = '', displayName: string = '') {
56
+ super();
57
+ this.authorId = authorId;
58
+ this.displayName = displayName;
59
+ }
60
+ }
61
+
62
+ @Entity('content', 'pk', 'sk')
63
+ class Post extends BaseEntity {
64
+ @HashKeyValue
65
+ get hashKey() {
66
+ return 'POST';
67
+ }
68
+
69
+ @SortKeyValue
70
+ get sortKey() {
71
+ return this.slug;
72
+ }
73
+
74
+ slug: string;
75
+ title: string;
76
+ publishedAt: Date | null;
77
+
78
+ @Link(Author)
79
+ author: Author | undefined;
80
+
81
+ constructor(slug: string = '', title: string = '', publishedAt: Date | null = null) {
82
+ super();
83
+ this.slug = slug;
84
+ this.title = title;
85
+ this.publishedAt = publishedAt;
86
+ }
87
+
88
+ @ToDbModel
89
+ static toDbModel(post: Post) {
90
+ return {
91
+ publishedAt: post.publishedAt ? post.publishedAt.toISOString() : null
92
+ };
93
+ }
94
+
95
+ @FromDbModel
96
+ static fromDbModel(item: { publishedAt?: string | null }) {
97
+ return {
98
+ publishedAt: item.publishedAt ? new Date(item.publishedAt) : null
99
+ };
100
+ }
101
+ }
102
+
103
+ async function run() {
104
+ const post = new Post('decorators-with-dynamodb', 'Decorators With DynamoDB', new Date());
105
+ post.author = new Author('ada-lovelace', 'Ada Lovelace');
106
+
107
+ await post.save();
108
+
109
+ const loaded = await Post.get('decorators-with-dynamodb');
110
+ await loaded?.loadLinks();
111
+
112
+ console.log(loaded?.author?.displayName);
113
+ }
114
+ ```
115
+
116
+ ## API
117
+
118
+ The package exports:
119
+
120
+ - `BaseEntity`
121
+ - `Entity`
122
+ - `HashKeyValue`
123
+ - `SortKeyValue`
124
+ - `Link`
125
+ - `ToDbModel`
126
+ - `FromDbModel`
127
+
128
+ Core capabilities:
129
+
130
+ - explicit DynamoDB client configuration via `BaseEntity.configure(...)` or `@Entity(..., dbClient)`
131
+ - `save()`, `update()`, and `delete()` instance methods
132
+ - `get()`, `query()`, and common query helpers on the entity class
133
+ - linked entity references with `@Link(...)` and `loadLinks()`
134
+ - custom read/write mapping with `@ToDbModel` and `@FromDbModel`
135
+ - automatic `createdAt` and `updatedAt` timestamps
136
+
137
+ ## Local Development
138
+
139
+ Install dependencies:
140
+
141
+ ```bash
142
+ pnpm install
143
+ ```
144
+
145
+ Build the package:
146
+
147
+ ```bash
148
+ pnpm build
149
+ ```
150
+
151
+ Run the local example:
152
+
153
+ ```bash
154
+ pnpm exec tsx examples.ts
155
+ ```
156
+
157
+ Check what will be published:
158
+
159
+ ```bash
160
+ npm run pack:check
161
+ ```
162
+
163
+ ## Publish
164
+
165
+ Make sure the package name in `package.json` is the one you want to publish and is available on npm, then:
166
+
167
+ ```bash
168
+ npm login
169
+ npm publish
170
+ ```
171
+
172
+ If you rename the package, update the import path in this README to match.
173
+
174
+ ## Notes
175
+
176
+ - Static lookups assume the hash key can be derived from a default-constructed instance.
177
+ - Query helpers all operate within a single partition key value.
178
+ - Link loading currently issues individual `GetCommand` calls per linked record.
179
+ - This is a lightweight utility, not a schema or migration system.
180
+
181
+ See [examples.ts](./examples.ts) for a fuller usage example.
@@ -0,0 +1,21 @@
1
+ import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
2
+ import type { QueryOptions, EntityMetadata } from './types';
3
+ export declare class BaseEntity {
4
+ protected getMetadata(): EntityMetadata;
5
+ protected getKey(): any;
6
+ protected toItem(): any;
7
+ insert(): Promise<this>;
8
+ update(attributes: Partial<this>): Promise<this>;
9
+ delete(): Promise<void>;
10
+ loadLinks(): Promise<this>;
11
+ static configure(dynamoDBClient: DynamoDBClient, documentClientConfig?: any): void;
12
+ static get<T extends BaseEntity>(this: new (...args: any[]) => T, sortKeyValue: any): Promise<T | null>;
13
+ static query<T extends BaseEntity>(this: new (...args: any[]) => T, options?: QueryOptions): Promise<T[]>;
14
+ static queryAll<T extends BaseEntity>(this: new (...args: any[]) => T, limit?: number): Promise<T[]>;
15
+ static queryStartsWith<T extends BaseEntity>(this: new (...args: any[]) => T, sortKeyPrefix: string, limit?: number): Promise<T[]>;
16
+ static queryBetween<T extends BaseEntity>(this: new (...args: any[]) => T, start: any, end: any, limit?: number): Promise<T[]>;
17
+ static queryGreaterThan<T extends BaseEntity>(this: new (...args: any[]) => T, sortKeyValue: any, limit?: number): Promise<T[]>;
18
+ static queryLessThan<T extends BaseEntity>(this: new (...args: any[]) => T, sortKeyValue: any, limit?: number): Promise<T[]>;
19
+ static queryEquals<T extends BaseEntity>(this: new (...args: any[]) => T, sortKeyValue: any, limit?: number): Promise<T[]>;
20
+ }
21
+ //# sourceMappingURL=BaseEntity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseEntity.d.ts","sourceRoot":"","sources":["../BaseEntity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAS1D,OAAO,KAAK,EAAgB,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAG1E,qBAAa,UAAU;IAEnB,SAAS,CAAC,WAAW,IAAI,cAAc;IAIvC,SAAS,CAAC,MAAM;IAehB,SAAS,CAAC,MAAM;IA4DV,MAAM;IAuIN,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC;IAiChC,MAAM;IAyFN,SAAS;IAmGf,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,cAAc,EAAE,oBAAoB,CAAC,EAAE,GAAG;WAI9D,GAAG,CAAC,CAAC,SAAS,UAAU,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,YAAY,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;WAmChG,KAAK,CAAC,CAAC,SAAS,UAAU,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;WAwFlG,QAAQ,CAAC,CAAC,SAAS,UAAU,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;WAI7F,eAAe,CAAC,CAAC,SAAS,UAAU,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;WAO3H,YAAY,CAAC,CAAC,SAAS,UAAU,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;WAOvH,gBAAgB,CAAC,CAAC,SAAS,UAAU,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;WAOxH,aAAa,CAAC,CAAC,SAAS,UAAU,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;WAOrH,WAAW,CAAC,CAAC,SAAS,UAAU,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;CAMnI"}
@@ -0,0 +1,533 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseEntity = void 0;
4
+ const lib_dynamodb_1 = require("@aws-sdk/lib-dynamodb");
5
+ const symbols_1 = require("./symbols");
6
+ const client_1 = require("./client");
7
+ class BaseEntity {
8
+ getMetadata() {
9
+ return this.constructor.__entityMetadata__;
10
+ }
11
+ getKey() {
12
+ const metadata = this.getMetadata();
13
+ const key = {};
14
+ if (metadata.hashKeyGetter) {
15
+ key[metadata.hashKeyName] = this[metadata.hashKeyGetter];
16
+ }
17
+ if (metadata.sortKeyName && metadata.sortKeyGetter) {
18
+ key[metadata.sortKeyName] = this[metadata.sortKeyGetter];
19
+ }
20
+ return key;
21
+ }
22
+ toItem() {
23
+ const item = { ...this };
24
+ const metadata = this.getMetadata();
25
+ const key = this.getKey();
26
+ // Apply custom toDbModel mapper if defined
27
+ const toDbModelMapper = this.constructor[symbols_1.TO_DB_MODEL_METADATA];
28
+ if (toDbModelMapper) {
29
+ const mappedData = this.constructor[toDbModelMapper](this);
30
+ Object.assign(item, mappedData);
31
+ }
32
+ // Handle linked entities
33
+ const links = this.constructor.prototype[symbols_1.LINKS_METADATA] || [];
34
+ for (const link of links) {
35
+ const value = this[link.propertyKey];
36
+ const isInline = link.inline ?? false;
37
+ if (isInline) {
38
+ if (value !== undefined && value !== null) {
39
+ if (link.isArray) {
40
+ item[`__${link.propertyKey}ID`] = value.map((linkedItem) => {
41
+ const linkedKey = linkedItem.getKey();
42
+ const linkedMetadata = linkedItem.getMetadata();
43
+ const result = {
44
+ [linkedMetadata.hashKeyName]: linkedKey[linkedMetadata.hashKeyName]
45
+ };
46
+ if (linkedMetadata.sortKeyName) {
47
+ result[linkedMetadata.sortKeyName] = linkedKey[linkedMetadata.sortKeyName];
48
+ }
49
+ return result;
50
+ });
51
+ }
52
+ else {
53
+ const linkedItem = value;
54
+ const linkedKey = linkedItem.getKey();
55
+ const linkedMetadata = linkedItem.getMetadata();
56
+ const result = {
57
+ [linkedMetadata.hashKeyName]: linkedKey[linkedMetadata.hashKeyName]
58
+ };
59
+ if (linkedMetadata.sortKeyName) {
60
+ result[linkedMetadata.sortKeyName] = linkedKey[linkedMetadata.sortKeyName];
61
+ }
62
+ item[`__${link.propertyKey}ID`] = result;
63
+ }
64
+ }
65
+ }
66
+ else {
67
+ // Non-inline: ensure no stale __propertyID from a previous loadLinks() is persisted
68
+ delete item[`__${link.propertyKey}ID`];
69
+ }
70
+ // Remove the actual linked entity instances from being saved
71
+ delete item[link.propertyKey];
72
+ }
73
+ return {
74
+ ...key,
75
+ ...item
76
+ };
77
+ }
78
+ async insert() {
79
+ const metadata = this.getMetadata();
80
+ // Save linked entities first (cascade save)
81
+ const links = this.constructor.prototype[symbols_1.LINKS_METADATA] || [];
82
+ for (const link of links) {
83
+ const value = this[link.propertyKey];
84
+ if (value !== undefined && value !== null) {
85
+ if (Array.isArray(value)) {
86
+ // Save all linked entities in parallel
87
+ await Promise.all(value.map((linkedItem) => linkedItem.insert()));
88
+ }
89
+ else {
90
+ // Save single linked entity
91
+ await value.insert();
92
+ }
93
+ }
94
+ }
95
+ const item = this.toItem();
96
+ await (0, client_1.getDocClient)().send(new lib_dynamodb_1.PutCommand({
97
+ TableName: metadata.tableName,
98
+ Item: item
99
+ }));
100
+ // Write separate link records for non-inline links.
101
+ // Record shape: { [hashKey]: '__link', [sortKey]: '{parentHK}#{parentSK}#{property}#{linkedHK}#{linkedSK}',
102
+ // linkedHashKey, linkedSortKey, isArray }
103
+ // Requires the parent entity table to have a sort key.
104
+ const nonInlineLinks = links.filter(link => {
105
+ const isInline = link.inline ?? false;
106
+ return !isInline;
107
+ });
108
+ if (nonInlineLinks.length > 0 && !metadata.sortKeyName) {
109
+ throw new Error(`Entity "${metadata.tableName}" has non-inline @Link properties ` +
110
+ `(${nonInlineLinks.map(l => l.propertyKey).join(', ')}) but no sort key. ` +
111
+ `Non-inline links require a sort key. Use @Link(..., { inline: true }) or add a sort key.`);
112
+ }
113
+ if (metadata.sortKeyName && nonInlineLinks.length > 0) {
114
+ const parentKey = this.getKey();
115
+ const parentHKVal = String(parentKey[metadata.hashKeyName]);
116
+ const parentSKVal = String(parentKey[metadata.sortKeyName]);
117
+ for (const link of nonInlineLinks) {
118
+ const value = this[link.propertyKey];
119
+ // Delete all existing link records for this property before writing new ones.
120
+ // Runs even when value is null/undefined so clearing a link removes stale records.
121
+ const skPrefix = `${(0, client_1.encodeLinkSegment)(parentHKVal)}#${(0, client_1.encodeLinkSegment)(parentSKVal)}#${(0, client_1.encodeLinkSegment)(link.propertyKey)}#`;
122
+ const existingItems = await (0, client_1.paginatedQuery)({
123
+ TableName: metadata.tableName,
124
+ KeyConditionExpression: '#pk = :pkval AND begins_with(#sk, :skprefix)',
125
+ ExpressionAttributeNames: {
126
+ '#pk': metadata.hashKeyName,
127
+ '#sk': metadata.sortKeyName
128
+ },
129
+ ExpressionAttributeValues: {
130
+ ':pkval': '__link',
131
+ ':skprefix': skPrefix
132
+ }
133
+ });
134
+ if (existingItems.length > 0) {
135
+ const linkedEntityMetadata = link.entityClass.__entityMetadata__;
136
+ await Promise.all(existingItems.map(async (rec) => {
137
+ await (0, client_1.getDocClient)().send(new lib_dynamodb_1.DeleteCommand({
138
+ TableName: metadata.tableName,
139
+ Key: {
140
+ [metadata.hashKeyName]: rec[metadata.hashKeyName],
141
+ [metadata.sortKeyName]: rec[metadata.sortKeyName]
142
+ }
143
+ }));
144
+ // Delete corresponding back-reference from child's table
145
+ if (linkedEntityMetadata.sortKeyName) {
146
+ await (0, client_1.getDocClient)().send(new lib_dynamodb_1.DeleteCommand({
147
+ TableName: linkedEntityMetadata.tableName,
148
+ Key: {
149
+ [linkedEntityMetadata.hashKeyName]: '__backlink',
150
+ [linkedEntityMetadata.sortKeyName]: `${(0, client_1.encodeLinkSegment)(rec.linkedHashKey)}#${(0, client_1.encodeLinkSegment)(rec.linkedSortKey)}#${(0, client_1.encodeLinkSegment)(metadata.tableName)}#${(0, client_1.encodeLinkSegment)(parentHKVal)}#${(0, client_1.encodeLinkSegment)(parentSKVal)}#${(0, client_1.encodeLinkSegment)(link.propertyKey)}`
151
+ }
152
+ }));
153
+ }
154
+ }));
155
+ }
156
+ if (value == null)
157
+ continue;
158
+ const linkedItems = link.isArray ? value : [value];
159
+ await Promise.all(linkedItems.map(async (linkedItem) => {
160
+ const linkedKey = linkedItem.getKey();
161
+ const linkedMeta = linkedItem.getMetadata();
162
+ const linkedHKVal = String(linkedKey[linkedMeta.hashKeyName]);
163
+ const linkedSKVal = linkedMeta.sortKeyName
164
+ ? String(linkedKey[linkedMeta.sortKeyName])
165
+ : '';
166
+ const linkRecord = {
167
+ [metadata.hashKeyName]: '__link',
168
+ [metadata.sortKeyName]: `${(0, client_1.encodeLinkSegment)(parentHKVal)}#${(0, client_1.encodeLinkSegment)(parentSKVal)}#${(0, client_1.encodeLinkSegment)(link.propertyKey)}#${(0, client_1.encodeLinkSegment)(linkedHKVal)}#${(0, client_1.encodeLinkSegment)(linkedSKVal)}`,
169
+ linkedHashKey: linkedHKVal,
170
+ linkedSortKey: linkedSKVal,
171
+ isArray: link.isArray
172
+ };
173
+ await (0, client_1.getDocClient)().send(new lib_dynamodb_1.PutCommand({
174
+ TableName: metadata.tableName,
175
+ Item: linkRecord
176
+ }));
177
+ // Write back-reference in child's table so child deletions can clean up this forward link.
178
+ if (linkedMeta.sortKeyName) {
179
+ await (0, client_1.getDocClient)().send(new lib_dynamodb_1.PutCommand({
180
+ TableName: linkedMeta.tableName,
181
+ Item: {
182
+ [linkedMeta.hashKeyName]: '__backlink',
183
+ [linkedMeta.sortKeyName]: `${(0, client_1.encodeLinkSegment)(linkedHKVal)}#${(0, client_1.encodeLinkSegment)(linkedSKVal)}#${(0, client_1.encodeLinkSegment)(metadata.tableName)}#${(0, client_1.encodeLinkSegment)(parentHKVal)}#${(0, client_1.encodeLinkSegment)(parentSKVal)}#${(0, client_1.encodeLinkSegment)(link.propertyKey)}`,
184
+ parentTableName: metadata.tableName,
185
+ parentHashKeyName: metadata.hashKeyName,
186
+ parentSortKeyName: metadata.sortKeyName,
187
+ parentHashKey: parentHKVal,
188
+ parentSortKey: parentSKVal,
189
+ propertyKey: link.propertyKey
190
+ }
191
+ }));
192
+ }
193
+ }));
194
+ }
195
+ }
196
+ return this;
197
+ }
198
+ async update(attributes) {
199
+ const metadata = this.getMetadata();
200
+ const key = this.getKey();
201
+ const updateExpressions = [];
202
+ const expressionAttributeNames = {};
203
+ const expressionAttributeValues = {};
204
+ let index = 0;
205
+ for (const [attrName, attrValue] of Object.entries(attributes)) {
206
+ updateExpressions.push(`#attr${index} = :val${index}`);
207
+ expressionAttributeNames[`#attr${index}`] = attrName;
208
+ expressionAttributeValues[`:val${index}`] = attrValue;
209
+ index++;
210
+ }
211
+ updateExpressions.push(`#updatedAt = :updatedAt`);
212
+ expressionAttributeNames['#updatedAt'] = 'updatedAt';
213
+ expressionAttributeValues[':updatedAt'] = new Date().toISOString();
214
+ await (0, client_1.getDocClient)().send(new lib_dynamodb_1.UpdateCommand({
215
+ TableName: metadata.tableName,
216
+ Key: key,
217
+ UpdateExpression: `SET ${updateExpressions.join(', ')}`,
218
+ ExpressionAttributeNames: expressionAttributeNames,
219
+ ExpressionAttributeValues: expressionAttributeValues
220
+ }));
221
+ Object.assign(this, attributes);
222
+ return this;
223
+ }
224
+ async delete() {
225
+ const metadata = this.getMetadata();
226
+ const key = this.getKey();
227
+ // Clean up non-inline link records before deleting the parent to prevent orphans.
228
+ if (metadata.sortKeyName) {
229
+ const links = this.constructor.prototype[symbols_1.LINKS_METADATA] || [];
230
+ const parentHKVal = String(key[metadata.hashKeyName]);
231
+ const parentSKVal = String(key[metadata.sortKeyName]);
232
+ for (const link of links) {
233
+ const isInline = link.inline ?? false;
234
+ if (isInline)
235
+ continue;
236
+ const existingItems = await (0, client_1.paginatedQuery)({
237
+ TableName: metadata.tableName,
238
+ KeyConditionExpression: '#pk = :pkval AND begins_with(#sk, :skprefix)',
239
+ ExpressionAttributeNames: { '#pk': metadata.hashKeyName, '#sk': metadata.sortKeyName },
240
+ ExpressionAttributeValues: {
241
+ ':pkval': '__link',
242
+ ':skprefix': `${(0, client_1.encodeLinkSegment)(parentHKVal)}#${(0, client_1.encodeLinkSegment)(parentSKVal)}#${(0, client_1.encodeLinkSegment)(link.propertyKey)}#`
243
+ }
244
+ });
245
+ const linkedEntityMetadata = link.entityClass.__entityMetadata__;
246
+ await Promise.all(existingItems.map(async (rec) => {
247
+ await (0, client_1.getDocClient)().send(new lib_dynamodb_1.DeleteCommand({
248
+ TableName: metadata.tableName,
249
+ Key: {
250
+ [metadata.hashKeyName]: rec[metadata.hashKeyName],
251
+ [metadata.sortKeyName]: rec[metadata.sortKeyName]
252
+ }
253
+ }));
254
+ // Delete corresponding back-reference from child's table
255
+ if (linkedEntityMetadata.sortKeyName) {
256
+ await (0, client_1.getDocClient)().send(new lib_dynamodb_1.DeleteCommand({
257
+ TableName: linkedEntityMetadata.tableName,
258
+ Key: {
259
+ [linkedEntityMetadata.hashKeyName]: '__backlink',
260
+ [linkedEntityMetadata.sortKeyName]: `${(0, client_1.encodeLinkSegment)(rec.linkedHashKey)}#${(0, client_1.encodeLinkSegment)(rec.linkedSortKey)}#${(0, client_1.encodeLinkSegment)(metadata.tableName)}#${(0, client_1.encodeLinkSegment)(parentHKVal)}#${(0, client_1.encodeLinkSegment)(parentSKVal)}#${(0, client_1.encodeLinkSegment)(link.propertyKey)}`
261
+ }
262
+ }));
263
+ }
264
+ }));
265
+ }
266
+ }
267
+ // Clean up forward link records pointing TO this item (child-side cleanup via back-references).
268
+ if (metadata.sortKeyName) {
269
+ const itemHKVal = String(key[metadata.hashKeyName]);
270
+ const itemSKVal = String(key[metadata.sortKeyName]);
271
+ const backlinkPrefix = `${(0, client_1.encodeLinkSegment)(itemHKVal)}#${(0, client_1.encodeLinkSegment)(itemSKVal)}#`;
272
+ const backlinks = await (0, client_1.paginatedQuery)({
273
+ TableName: metadata.tableName,
274
+ KeyConditionExpression: '#pk = :pkval AND begins_with(#sk, :skprefix)',
275
+ ExpressionAttributeNames: { '#pk': metadata.hashKeyName, '#sk': metadata.sortKeyName },
276
+ ExpressionAttributeValues: {
277
+ ':pkval': '__backlink',
278
+ ':skprefix': backlinkPrefix
279
+ }
280
+ });
281
+ await Promise.all(backlinks.map(async (backlink) => {
282
+ // Delete the forward link record in the parent's table
283
+ const fwdSKVal = `${(0, client_1.encodeLinkSegment)(backlink.parentHashKey)}#${(0, client_1.encodeLinkSegment)(backlink.parentSortKey)}#${(0, client_1.encodeLinkSegment)(backlink.propertyKey)}#${(0, client_1.encodeLinkSegment)(itemHKVal)}#${(0, client_1.encodeLinkSegment)(itemSKVal)}`;
284
+ await (0, client_1.getDocClient)().send(new lib_dynamodb_1.DeleteCommand({
285
+ TableName: backlink.parentTableName,
286
+ Key: {
287
+ [backlink.parentHashKeyName]: '__link',
288
+ [backlink.parentSortKeyName]: fwdSKVal
289
+ }
290
+ }));
291
+ // Delete the back-reference record itself
292
+ await (0, client_1.getDocClient)().send(new lib_dynamodb_1.DeleteCommand({
293
+ TableName: metadata.tableName,
294
+ Key: {
295
+ [metadata.hashKeyName]: backlink[metadata.hashKeyName],
296
+ [metadata.sortKeyName]: backlink[metadata.sortKeyName]
297
+ }
298
+ }));
299
+ }));
300
+ }
301
+ await (0, client_1.getDocClient)().send(new lib_dynamodb_1.DeleteCommand({
302
+ TableName: metadata.tableName,
303
+ Key: key
304
+ }));
305
+ }
306
+ async loadLinks() {
307
+ const parentMetadata = this.getMetadata();
308
+ const parentKey = this.getKey();
309
+ const links = this.constructor.prototype[symbols_1.LINKS_METADATA] || [];
310
+ for (const link of links) {
311
+ if (!link.entityClass)
312
+ continue;
313
+ const EntityClass = link.entityClass;
314
+ const entityMetadata = EntityClass.__entityMetadata__;
315
+ const fromDbModelMapper = EntityClass[symbols_1.FROM_DB_MODEL_METADATA];
316
+ const instantiate = (raw) => {
317
+ let itemData = raw;
318
+ if (fromDbModelMapper) {
319
+ itemData = { ...raw, ...EntityClass[fromDbModelMapper](raw) };
320
+ }
321
+ const instance = new EntityClass();
322
+ Object.assign(instance, itemData);
323
+ return instance;
324
+ };
325
+ const idField = `__${link.propertyKey}ID`;
326
+ const idValue = this[idField];
327
+ if (idValue != null) {
328
+ // ── Inline path: IDs embedded on the parent item ──
329
+ if (Array.isArray(idValue)) {
330
+ const loaded = await Promise.all(idValue.map(async (keyObj) => {
331
+ const result = await (0, client_1.getDocClient)().send(new lib_dynamodb_1.GetCommand({
332
+ TableName: entityMetadata.tableName,
333
+ Key: keyObj
334
+ }));
335
+ return result.Item ? instantiate(result.Item) : null;
336
+ }));
337
+ this[link.propertyKey] = loaded.filter(e => e !== null);
338
+ }
339
+ else {
340
+ const result = await (0, client_1.getDocClient)().send(new lib_dynamodb_1.GetCommand({
341
+ TableName: entityMetadata.tableName,
342
+ Key: idValue
343
+ }));
344
+ if (result.Item) {
345
+ this[link.propertyKey] = instantiate(result.Item);
346
+ }
347
+ }
348
+ }
349
+ else if (parentMetadata.sortKeyName) {
350
+ // ── Non-inline path: look up separate link records, then fetch each entity ──
351
+ const parentHKVal = String(parentKey[parentMetadata.hashKeyName]);
352
+ const parentSKVal = String(parentKey[parentMetadata.sortKeyName]);
353
+ const skPrefix = `${(0, client_1.encodeLinkSegment)(parentHKVal)}#${(0, client_1.encodeLinkSegment)(parentSKVal)}#${(0, client_1.encodeLinkSegment)(link.propertyKey)}#`;
354
+ const linkItems = await (0, client_1.paginatedQuery)({
355
+ TableName: parentMetadata.tableName,
356
+ KeyConditionExpression: '#pk = :pkval AND begins_with(#sk, :skprefix)',
357
+ ExpressionAttributeNames: {
358
+ '#pk': parentMetadata.hashKeyName,
359
+ '#sk': parentMetadata.sortKeyName
360
+ },
361
+ ExpressionAttributeValues: {
362
+ ':pkval': '__link',
363
+ ':skprefix': skPrefix
364
+ }
365
+ });
366
+ if (linkItems.length === 0) {
367
+ // For array links with no records, set to empty array instead of leaving undefined
368
+ if (link.isArray) {
369
+ this[link.propertyKey] = [];
370
+ }
371
+ continue;
372
+ }
373
+ const loaded = await Promise.all(linkItems.map(async (linkRecord) => {
374
+ const linkedKey = {
375
+ [entityMetadata.hashKeyName]: linkRecord.linkedHashKey
376
+ };
377
+ if (entityMetadata.sortKeyName) {
378
+ linkedKey[entityMetadata.sortKeyName] = linkRecord.linkedSortKey;
379
+ }
380
+ const result = await (0, client_1.getDocClient)().send(new lib_dynamodb_1.GetCommand({
381
+ TableName: entityMetadata.tableName,
382
+ Key: linkedKey
383
+ }));
384
+ return result.Item ? instantiate(result.Item) : null;
385
+ }));
386
+ const filtered = loaded.filter(e => e !== null);
387
+ // Use stored link.isArray (from decoration time) to reconstruct the original shape
388
+ this[link.propertyKey] = link.isArray ? filtered : (filtered[0] ?? null);
389
+ }
390
+ }
391
+ return this;
392
+ }
393
+ static configure(dynamoDBClient, documentClientConfig) {
394
+ (0, client_1.configureClient)(dynamoDBClient, documentClientConfig);
395
+ }
396
+ static async get(sortKeyValue) {
397
+ const metadata = this.__entityMetadata__;
398
+ const tempInstance = new this();
399
+ const hashKeyValue = metadata.hashKeyGetter ? tempInstance[metadata.hashKeyGetter] : undefined;
400
+ const key = {
401
+ [metadata.hashKeyName]: hashKeyValue
402
+ };
403
+ if (metadata.sortKeyName && sortKeyValue !== undefined) {
404
+ key[metadata.sortKeyName] = sortKeyValue;
405
+ }
406
+ const result = await (0, client_1.getDocClient)().send(new lib_dynamodb_1.GetCommand({
407
+ TableName: metadata.tableName,
408
+ Key: key
409
+ }));
410
+ if (!result.Item) {
411
+ return null;
412
+ }
413
+ const fromDbModelMapper = this[symbols_1.FROM_DB_MODEL_METADATA];
414
+ let itemData = result.Item;
415
+ if (fromDbModelMapper) {
416
+ const mappedData = this[fromDbModelMapper](result.Item);
417
+ itemData = { ...result.Item, ...mappedData };
418
+ }
419
+ const instance = new this();
420
+ Object.assign(instance, itemData);
421
+ return instance;
422
+ }
423
+ static async query(options) {
424
+ const metadata = this.__entityMetadata__;
425
+ const tempInstance = new this();
426
+ const hashKeyValue = metadata.hashKeyGetter ? tempInstance[metadata.hashKeyGetter] : undefined;
427
+ let keyConditionExpression = `#hk = :hkval`;
428
+ const expressionAttributeNames = {
429
+ '#hk': metadata.hashKeyName
430
+ };
431
+ const expressionAttributeValues = {
432
+ ':hkval': hashKeyValue
433
+ };
434
+ if (options?.sortKeyCondition && metadata.sortKeyName) {
435
+ const sk = metadata.sortKeyName;
436
+ expressionAttributeNames['#sk'] = sk;
437
+ const condition = options.sortKeyCondition;
438
+ switch (condition.type) {
439
+ case 'equals':
440
+ keyConditionExpression += ` AND #sk = :skval`;
441
+ expressionAttributeValues[':skval'] = condition.value;
442
+ break;
443
+ case 'lessThan':
444
+ keyConditionExpression += ` AND #sk < :skval`;
445
+ expressionAttributeValues[':skval'] = condition.value;
446
+ break;
447
+ case 'lessThanOrEqual':
448
+ keyConditionExpression += ` AND #sk <= :skval`;
449
+ expressionAttributeValues[':skval'] = condition.value;
450
+ break;
451
+ case 'greaterThan':
452
+ keyConditionExpression += ` AND #sk > :skval`;
453
+ expressionAttributeValues[':skval'] = condition.value;
454
+ break;
455
+ case 'greaterThanOrEqual':
456
+ keyConditionExpression += ` AND #sk >= :skval`;
457
+ expressionAttributeValues[':skval'] = condition.value;
458
+ break;
459
+ case 'between':
460
+ keyConditionExpression += ` AND #sk BETWEEN :skstart AND :skend`;
461
+ expressionAttributeValues[':skstart'] = condition.start;
462
+ expressionAttributeValues[':skend'] = condition.end;
463
+ break;
464
+ case 'startsWith':
465
+ keyConditionExpression += ` AND begins_with(#sk, :skval)`;
466
+ expressionAttributeValues[':skval'] = condition.value;
467
+ break;
468
+ }
469
+ }
470
+ const queryParams = {
471
+ TableName: metadata.tableName,
472
+ KeyConditionExpression: keyConditionExpression,
473
+ ExpressionAttributeNames: expressionAttributeNames,
474
+ ExpressionAttributeValues: expressionAttributeValues
475
+ };
476
+ if (options?.limit) {
477
+ queryParams.Limit = options.limit;
478
+ }
479
+ if (options?.scanIndexForward !== undefined) {
480
+ queryParams.ScanIndexForward = options.scanIndexForward;
481
+ }
482
+ const result = await (0, client_1.getDocClient)().send(new lib_dynamodb_1.QueryCommand(queryParams));
483
+ if (!result.Items || result.Items.length === 0) {
484
+ return [];
485
+ }
486
+ const fromDbModelMapper = this[symbols_1.FROM_DB_MODEL_METADATA];
487
+ return result.Items.map(item => {
488
+ let itemData = item;
489
+ if (fromDbModelMapper) {
490
+ const mappedData = this[fromDbModelMapper](item);
491
+ itemData = { ...item, ...mappedData };
492
+ }
493
+ const instance = new this();
494
+ Object.assign(instance, itemData);
495
+ return instance;
496
+ });
497
+ }
498
+ static async queryAll(limit) {
499
+ return this.query({ limit });
500
+ }
501
+ static async queryStartsWith(sortKeyPrefix, limit) {
502
+ return this.query({
503
+ sortKeyCondition: { type: 'startsWith', value: sortKeyPrefix },
504
+ limit
505
+ });
506
+ }
507
+ static async queryBetween(start, end, limit) {
508
+ return this.query({
509
+ sortKeyCondition: { type: 'between', start, end },
510
+ limit
511
+ });
512
+ }
513
+ static async queryGreaterThan(sortKeyValue, limit) {
514
+ return this.query({
515
+ sortKeyCondition: { type: 'greaterThan', value: sortKeyValue },
516
+ limit
517
+ });
518
+ }
519
+ static async queryLessThan(sortKeyValue, limit) {
520
+ return this.query({
521
+ sortKeyCondition: { type: 'lessThan', value: sortKeyValue },
522
+ limit
523
+ });
524
+ }
525
+ static async queryEquals(sortKeyValue, limit) {
526
+ return this.query({
527
+ sortKeyCondition: { type: 'equals', value: sortKeyValue },
528
+ limit
529
+ });
530
+ }
531
+ }
532
+ exports.BaseEntity = BaseEntity;
533
+ //# sourceMappingURL=BaseEntity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseEntity.js","sourceRoot":"","sources":["../BaseEntity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
2
+ import { DynamoDBDocumentClient } from '@aws-sdk/lib-dynamodb';
3
+ export declare function configureClient(dynamoDBClient: DynamoDBClient, documentClientConfig?: any): void;
4
+ export declare function isClientConfigured(): boolean;
5
+ export declare function getDocClient(): DynamoDBDocumentClient;
6
+ export declare function paginatedQuery(params: any): Promise<any[]>;
7
+ export declare function encodeLinkSegment(v: string): string;
8
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAgB,MAAM,uBAAuB,CAAC;AAI7E,wBAAgB,eAAe,CAAC,cAAc,EAAE,cAAc,EAAE,oBAAoB,CAAC,EAAE,GAAG,GAAG,IAAI,CAEhG;AAED,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED,wBAAgB,YAAY,IAAI,sBAAsB,CAOrD;AAGD,wBAAsB,cAAc,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAYhE;AAGD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnD"}
package/dist/client.js ADDED
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.configureClient = configureClient;
4
+ exports.isClientConfigured = isClientConfigured;
5
+ exports.getDocClient = getDocClient;
6
+ exports.paginatedQuery = paginatedQuery;
7
+ exports.encodeLinkSegment = encodeLinkSegment;
8
+ const lib_dynamodb_1 = require("@aws-sdk/lib-dynamodb");
9
+ let _docClient;
10
+ function configureClient(dynamoDBClient, documentClientConfig) {
11
+ _docClient = lib_dynamodb_1.DynamoDBDocumentClient.from(dynamoDBClient, documentClientConfig);
12
+ }
13
+ function isClientConfigured() {
14
+ return _docClient !== undefined;
15
+ }
16
+ function getDocClient() {
17
+ if (!_docClient) {
18
+ throw new Error('DynamoDB client not configured. Call BaseEntity.configure(new DynamoDBClient({...})) before using the ORM.');
19
+ }
20
+ return _docClient;
21
+ }
22
+ // Exhaustively pages through a DynamoDB query, returning all matching items.
23
+ async function paginatedQuery(params) {
24
+ const items = [];
25
+ let lastKey = undefined;
26
+ do {
27
+ const result = await getDocClient().send(new lib_dynamodb_1.QueryCommand({
28
+ ...params,
29
+ ...(lastKey ? { ExclusiveStartKey: lastKey } : {})
30
+ }));
31
+ if (result.Items)
32
+ items.push(...result.Items);
33
+ lastKey = result.LastEvaluatedKey;
34
+ } while (lastKey);
35
+ return items;
36
+ }
37
+ // Escapes '#' in composite sort key segments to avoid prefix ambiguity.
38
+ function encodeLinkSegment(v) {
39
+ return v.replace(/#/g, '%23');
40
+ }
41
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../client.ts"],"names":[],"mappings":";;AAKA,0CAEC;AAED,gDAEC;AAED,oCAOC;AAGD,wCAYC;AAGD,8CAEC;AAvCD,wDAA6E;AAE7E,IAAI,UAA8C,CAAC;AAEnD,SAAgB,eAAe,CAAC,cAA8B,EAAE,oBAA0B;IACtF,UAAU,GAAG,qCAAsB,CAAC,IAAI,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAC;AACnF,CAAC;AAED,SAAgB,kBAAkB;IAC9B,OAAO,UAAU,KAAK,SAAS,CAAC;AACpC,CAAC;AAED,SAAgB,YAAY;IACxB,IAAI,CAAC,UAAU,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACX,4GAA4G,CAC/G,CAAC;IACN,CAAC;IACD,OAAO,UAAU,CAAC;AACtB,CAAC;AAED,6EAA6E;AACtE,KAAK,UAAU,cAAc,CAAC,MAAW;IAC5C,MAAM,KAAK,GAAU,EAAE,CAAC;IACxB,IAAI,OAAO,GAAoC,SAAS,CAAC;IACzD,GAAG,CAAC;QACA,MAAM,MAAM,GAA8D,MAAM,YAAY,EAAE,CAAC,IAAI,CAAC,IAAI,2BAAY,CAAC;YACjH,GAAG,MAAM;YACT,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrD,CAAC,CAAC,CAAC;QACJ,IAAI,MAAM,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9C,OAAO,GAAG,MAAM,CAAC,gBAAgB,CAAC;IACtC,CAAC,QAAQ,OAAO,EAAE;IAClB,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,wEAAwE;AACxE,SAAgB,iBAAiB,CAAC,CAAS;IACvC,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
2
+ import { BaseEntity } from './BaseEntity';
3
+ export declare function Entity(tableName: string, hashKeyName: string, sortKeyName?: string, dbClient?: DynamoDBClient): <T extends new (...args: any[]) => BaseEntity>(constructor: T) => T;
4
+ export declare function HashKeyValue(target: object, propertyKey: string, descriptor?: PropertyDescriptor): PropertyDescriptor | undefined;
5
+ export declare function SortKeyValue(target: object, propertyKey: string, descriptor?: PropertyDescriptor): PropertyDescriptor | undefined;
6
+ export declare function LinkObject(entityClass: new (...args: any[]) => BaseEntity, options?: {
7
+ inline?: boolean;
8
+ }): (target: object, propertyKey: string) => void;
9
+ export declare function LinkArray(entityClass: new (...args: any[]) => BaseEntity, options?: {
10
+ inline?: boolean;
11
+ }): (target: object, propertyKey: string) => void;
12
+ export declare function ToDbModel(target: any, propertyKey: string, descriptor?: PropertyDescriptor): PropertyDescriptor | undefined;
13
+ export declare function FromDbModel(target: any, propertyKey: string, descriptor?: PropertyDescriptor): PropertyDescriptor | undefined;
14
+ //# sourceMappingURL=decorators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,wBAAgB,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,cAAc,IACzF,CAAC,SAAS,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,UAAU,EAAE,aAAa,CAAC,KA2BnD,CAAC,CAE9B;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,kBAAkB,kCAGhG;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,kBAAkB,kCAGhG;AAED,wBAAgB,UAAU,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,UAAU,EAAE,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,IACrF,QAAQ,MAAM,EAAE,aAAa,MAAM,UAWvD;AAED,wBAAgB,SAAS,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,UAAU,EAAE,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,IACpF,QAAQ,MAAM,EAAE,aAAa,MAAM,UAWvD;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,kBAAkB,kCAG1F;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,kBAAkB,kCAG5F"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Entity = Entity;
4
+ exports.HashKeyValue = HashKeyValue;
5
+ exports.SortKeyValue = SortKeyValue;
6
+ exports.LinkObject = LinkObject;
7
+ exports.LinkArray = LinkArray;
8
+ exports.ToDbModel = ToDbModel;
9
+ exports.FromDbModel = FromDbModel;
10
+ const symbols_1 = require("./symbols");
11
+ const client_1 = require("./client");
12
+ function Entity(tableName, hashKeyName, sortKeyName, dbClient) {
13
+ return function (constructor) {
14
+ // Configure DynamoDB client from the decorator only when explicitly provided.
15
+ if (!(0, client_1.isClientConfigured)() && dbClient) {
16
+ (0, client_1.configureClient)(dbClient);
17
+ }
18
+ // Guard against using the reserved '__link' / '__backlink' hash key values.
19
+ const hkGetter = constructor.prototype[symbols_1.HASH_KEY_METADATA];
20
+ if (hkGetter) {
21
+ const tempInstance = new constructor();
22
+ if (tempInstance[hkGetter] === '__link' || tempInstance[hkGetter] === '__backlink') {
23
+ throw new Error(`Entity "${constructor.name}" uses reserved hash key value "${tempInstance[hkGetter]}". ` +
24
+ `This value is reserved for internal ORM records.`);
25
+ }
26
+ }
27
+ // Store metadata on the constructor
28
+ constructor.__entityMetadata__ = {
29
+ tableName: tableName || constructor.name,
30
+ hashKeyName,
31
+ sortKeyName,
32
+ hashKeyGetter: constructor.prototype[symbols_1.HASH_KEY_METADATA],
33
+ sortKeyGetter: constructor.prototype[symbols_1.SORT_KEY_METADATA]
34
+ };
35
+ return constructor;
36
+ };
37
+ }
38
+ function HashKeyValue(target, propertyKey, descriptor) {
39
+ target[symbols_1.HASH_KEY_METADATA] = propertyKey;
40
+ return descriptor;
41
+ }
42
+ function SortKeyValue(target, propertyKey, descriptor) {
43
+ target[symbols_1.SORT_KEY_METADATA] = propertyKey;
44
+ return descriptor;
45
+ }
46
+ function LinkObject(entityClass, options) {
47
+ return function (target, propertyKey) {
48
+ if (!target[symbols_1.LINKS_METADATA]) {
49
+ target[symbols_1.LINKS_METADATA] = [];
50
+ }
51
+ target[symbols_1.LINKS_METADATA].push({
52
+ propertyKey,
53
+ entityClass,
54
+ inline: options?.inline,
55
+ isArray: false
56
+ });
57
+ };
58
+ }
59
+ function LinkArray(entityClass, options) {
60
+ return function (target, propertyKey) {
61
+ if (!target[symbols_1.LINKS_METADATA]) {
62
+ target[symbols_1.LINKS_METADATA] = [];
63
+ }
64
+ target[symbols_1.LINKS_METADATA].push({
65
+ propertyKey,
66
+ entityClass,
67
+ inline: options?.inline,
68
+ isArray: true
69
+ });
70
+ };
71
+ }
72
+ function ToDbModel(target, propertyKey, descriptor) {
73
+ target[symbols_1.TO_DB_MODEL_METADATA] = propertyKey;
74
+ return descriptor;
75
+ }
76
+ function FromDbModel(target, propertyKey, descriptor) {
77
+ target[symbols_1.FROM_DB_MODEL_METADATA] = propertyKey;
78
+ return descriptor;
79
+ }
80
+ //# sourceMappingURL=decorators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../decorators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { BaseEntity } from './BaseEntity';
2
+ export { Entity, HashKeyValue, SortKeyValue, LinkObject, LinkArray, ToDbModel, FromDbModel, } from './decorators';
3
+ //# sourceMappingURL=dynamoDbORM.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamoDbORM.d.ts","sourceRoot":"","sources":["../dynamoDbORM.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EACH,MAAM,EACN,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,SAAS,EACT,SAAS,EACT,WAAW,GACd,MAAM,cAAc,CAAC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FromDbModel = exports.ToDbModel = exports.LinkArray = exports.LinkObject = exports.SortKeyValue = exports.HashKeyValue = exports.Entity = exports.BaseEntity = void 0;
4
+ var BaseEntity_1 = require("./BaseEntity");
5
+ Object.defineProperty(exports, "BaseEntity", { enumerable: true, get: function () { return BaseEntity_1.BaseEntity; } });
6
+ var decorators_1 = require("./decorators");
7
+ Object.defineProperty(exports, "Entity", { enumerable: true, get: function () { return decorators_1.Entity; } });
8
+ Object.defineProperty(exports, "HashKeyValue", { enumerable: true, get: function () { return decorators_1.HashKeyValue; } });
9
+ Object.defineProperty(exports, "SortKeyValue", { enumerable: true, get: function () { return decorators_1.SortKeyValue; } });
10
+ Object.defineProperty(exports, "LinkObject", { enumerable: true, get: function () { return decorators_1.LinkObject; } });
11
+ Object.defineProperty(exports, "LinkArray", { enumerable: true, get: function () { return decorators_1.LinkArray; } });
12
+ Object.defineProperty(exports, "ToDbModel", { enumerable: true, get: function () { return decorators_1.ToDbModel; } });
13
+ Object.defineProperty(exports, "FromDbModel", { enumerable: true, get: function () { return decorators_1.FromDbModel; } });
14
+ //# sourceMappingURL=dynamoDbORM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamoDbORM.js","sourceRoot":"","sources":["../dynamoDbORM.ts"],"names":[],"mappings":";;;AAAA,2CAA0C;AAAjC,wGAAA,UAAU,OAAA;AACnB,2CAQsB;AAPlB,oGAAA,MAAM,OAAA;AACN,0GAAA,YAAY,OAAA;AACZ,0GAAA,YAAY,OAAA;AACZ,wGAAA,UAAU,OAAA;AACV,uGAAA,SAAS,OAAA;AACT,uGAAA,SAAS,OAAA;AACT,yGAAA,WAAW,OAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './dynamoDbORM';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./dynamoDbORM"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gDAA8B"}
@@ -0,0 +1,6 @@
1
+ export declare const HASH_KEY_METADATA: unique symbol;
2
+ export declare const SORT_KEY_METADATA: unique symbol;
3
+ export declare const LINKS_METADATA: unique symbol;
4
+ export declare const TO_DB_MODEL_METADATA: unique symbol;
5
+ export declare const FROM_DB_MODEL_METADATA: unique symbol;
6
+ //# sourceMappingURL=symbols.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbols.d.ts","sourceRoot":"","sources":["../symbols.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,eAAoB,CAAC;AACnD,eAAO,MAAM,iBAAiB,eAAoB,CAAC;AACnD,eAAO,MAAM,cAAc,eAAkB,CAAC;AAC9C,eAAO,MAAM,oBAAoB,eAAsB,CAAC;AACxD,eAAO,MAAM,sBAAsB,eAAwB,CAAC"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FROM_DB_MODEL_METADATA = exports.TO_DB_MODEL_METADATA = exports.LINKS_METADATA = exports.SORT_KEY_METADATA = exports.HASH_KEY_METADATA = void 0;
4
+ exports.HASH_KEY_METADATA = Symbol('hashKey');
5
+ exports.SORT_KEY_METADATA = Symbol('sortKey');
6
+ exports.LINKS_METADATA = Symbol('links');
7
+ exports.TO_DB_MODEL_METADATA = Symbol('toDbModel');
8
+ exports.FROM_DB_MODEL_METADATA = Symbol('fromDbModel');
9
+ //# sourceMappingURL=symbols.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbols.js","sourceRoot":"","sources":["../symbols.ts"],"names":[],"mappings":";;;AAAa,QAAA,iBAAiB,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;AACtC,QAAA,iBAAiB,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;AACtC,QAAA,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;AACjC,QAAA,oBAAoB,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAC3C,QAAA,sBAAsB,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC"}
@@ -0,0 +1,43 @@
1
+ import type { BaseEntity } from './BaseEntity';
2
+ export interface LinkMetadata {
3
+ propertyKey: string;
4
+ entityClass: new (...args: any[]) => BaseEntity;
5
+ inline?: boolean;
6
+ isArray: boolean;
7
+ }
8
+ export type SortKeyCondition = {
9
+ type: 'equals';
10
+ value: any;
11
+ } | {
12
+ type: 'lessThan';
13
+ value: any;
14
+ } | {
15
+ type: 'lessThanOrEqual';
16
+ value: any;
17
+ } | {
18
+ type: 'greaterThan';
19
+ value: any;
20
+ } | {
21
+ type: 'greaterThanOrEqual';
22
+ value: any;
23
+ } | {
24
+ type: 'between';
25
+ start: any;
26
+ end: any;
27
+ } | {
28
+ type: 'startsWith';
29
+ value: string;
30
+ };
31
+ export interface QueryOptions {
32
+ sortKeyCondition?: SortKeyCondition;
33
+ limit?: number;
34
+ scanIndexForward?: boolean;
35
+ }
36
+ export interface EntityMetadata {
37
+ tableName?: string;
38
+ hashKeyName: string;
39
+ sortKeyName?: string;
40
+ hashKeyGetter?: string;
41
+ sortKeyGetter?: string;
42
+ }
43
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,WAAW,YAAY;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,UAAU,CAAC;IAChD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,gBAAgB,GACtB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,GAAG,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,GAAG,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,GAAG,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,GAAG,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,KAAK,EAAE,GAAG,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,GAAG,CAAC;IAAC,GAAG,EAAE,GAAG,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5C,MAAM,WAAW,YAAY;IACzB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "orm-dynamodb",
3
+ "version": "1.0.0",
4
+ "description": "Lightweight TypeScript decorators for modeling DynamoDB items as classes",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "default": "./dist/index.js"
11
+ }
12
+ },
13
+ "files": [
14
+ "dist",
15
+ "README.md"
16
+ ],
17
+ "sideEffects": false,
18
+ "scripts": {
19
+ "clean": "rm -rf dist",
20
+ "build": "npm run clean && tsc -p tsconfig.build.json",
21
+ "dev": "tsx examples.ts",
22
+ "test": "vitest run",
23
+ "test:watch": "vitest",
24
+ "test:ui": "vitest --ui",
25
+ "prepack": "npm run build",
26
+ "pack:check": "npm pack --dry-run"
27
+ },
28
+ "keywords": [
29
+ "dynamodb",
30
+ "orm-dynamodb",
31
+ "decorators",
32
+ "orm",
33
+ "typescript"
34
+ ],
35
+ "license": "ISC",
36
+ "dependencies": {
37
+ "@aws-sdk/client-dynamodb": "^3.0.0",
38
+ "@aws-sdk/lib-dynamodb": "^3.0.0",
39
+ "dotenv": "^17.4.2"
40
+ },
41
+ "devDependencies": {
42
+ "@types/node": "^20.0.0",
43
+ "@vitest/ui": "^4.1.4",
44
+ "tsx": "^4.21.0",
45
+ "typescript": "^5.0.0",
46
+ "vitest": "^4.1.4"
47
+ },
48
+ "packageManager": "pnpm@10.11.0+sha512.6540583f41cc5f628eb3d9773ecee802f4f9ef9923cc45b69890fb47991d4b092964694ec3a4f738a420c918a333062c8b925d312f42e4f0c263eb603551f977"
49
+ }