@arcaelas/dynamite 1.0.29 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/README.md +13 -13
  2. package/{src → build/cjs}/@types/index.d.ts +26 -1
  3. package/build/cjs/@types/index.js.map +1 -0
  4. package/{src → build/cjs}/core/client.d.ts +22 -19
  5. package/build/cjs/core/client.js +384 -0
  6. package/build/cjs/core/client.js.map +1 -0
  7. package/build/cjs/core/decorator.d.ts +38 -0
  8. package/build/cjs/core/decorator.js +38 -0
  9. package/build/cjs/core/decorator.js.map +1 -0
  10. package/build/cjs/core/table.d.ts +55 -0
  11. package/build/cjs/core/table.js +851 -0
  12. package/build/cjs/core/table.js.map +1 -0
  13. package/build/cjs/decorators/indexes.d.ts +20 -0
  14. package/build/cjs/decorators/indexes.js +45 -0
  15. package/build/cjs/decorators/indexes.js.map +1 -0
  16. package/{src → build/cjs}/decorators/relations.d.ts +8 -7
  17. package/{src → build/cjs}/decorators/relations.js +9 -8
  18. package/build/cjs/decorators/relations.js.map +1 -0
  19. package/build/cjs/decorators/timestamps.d.ts +20 -0
  20. package/build/cjs/decorators/timestamps.js +34 -0
  21. package/build/cjs/decorators/timestamps.js.map +1 -0
  22. package/build/cjs/decorators/transforms.d.ts +41 -0
  23. package/build/cjs/decorators/transforms.js +98 -0
  24. package/build/cjs/decorators/transforms.js.map +1 -0
  25. package/{src → build/cjs}/index.d.ts +5 -3
  26. package/{src → build/cjs}/index.js +7 -6
  27. package/build/cjs/index.js.map +1 -0
  28. package/build/cjs/package.json +1 -0
  29. package/build/cjs/test/basic.d.ts +1 -0
  30. package/build/cjs/test/basic.js +248 -0
  31. package/build/cjs/test/basic.js.map +1 -0
  32. package/build/cjs/test/bulk.d.ts +1 -0
  33. package/build/cjs/test/bulk.js +108 -0
  34. package/build/cjs/test/bulk.js.map +1 -0
  35. package/build/cjs/test/contracts.d.ts +1 -0
  36. package/build/cjs/test/contracts.js +343 -0
  37. package/build/cjs/test/contracts.js.map +1 -0
  38. package/build/cjs/test/filters.d.ts +1 -0
  39. package/build/cjs/test/filters.js +190 -0
  40. package/build/cjs/test/filters.js.map +1 -0
  41. package/build/cjs/test/index.js +36 -0
  42. package/build/cjs/test/index.js.map +1 -0
  43. package/build/cjs/test/query_scan.d.ts +1 -0
  44. package/build/cjs/test/query_scan.js +195 -0
  45. package/build/cjs/test/query_scan.js.map +1 -0
  46. package/build/cjs/test/relations.d.ts +1 -0
  47. package/build/cjs/test/relations.js +246 -0
  48. package/build/cjs/test/relations.js.map +1 -0
  49. package/build/cjs/test/transactions.d.ts +1 -0
  50. package/build/cjs/test/transactions.js +145 -0
  51. package/build/cjs/test/transactions.js.map +1 -0
  52. package/{src → build/cjs}/utils/relations.js +1 -8
  53. package/build/cjs/utils/relations.js.map +1 -0
  54. package/build/cjs/utils/ulid.d.ts +10 -0
  55. package/build/cjs/utils/ulid.js +55 -0
  56. package/build/cjs/utils/ulid.js.map +1 -0
  57. package/build/esm/@types/index.d.ts +213 -0
  58. package/build/esm/@types/index.js +8 -0
  59. package/build/esm/@types/index.js.map +1 -0
  60. package/build/esm/core/client.d.ts +96 -0
  61. package/build/esm/core/client.js +375 -0
  62. package/build/esm/core/client.js.map +1 -0
  63. package/build/esm/core/decorator.d.ts +38 -0
  64. package/build/esm/core/decorator.js +34 -0
  65. package/build/esm/core/decorator.js.map +1 -0
  66. package/build/esm/core/table.d.ts +55 -0
  67. package/build/esm/core/table.js +848 -0
  68. package/build/esm/core/table.js.map +1 -0
  69. package/build/esm/decorators/indexes.d.ts +20 -0
  70. package/build/esm/decorators/indexes.js +42 -0
  71. package/build/esm/decorators/indexes.js.map +1 -0
  72. package/build/esm/decorators/relations.d.ts +75 -0
  73. package/build/esm/decorators/relations.js +112 -0
  74. package/build/esm/decorators/relations.js.map +1 -0
  75. package/build/esm/decorators/timestamps.d.ts +20 -0
  76. package/build/esm/decorators/timestamps.js +31 -0
  77. package/build/esm/decorators/timestamps.js.map +1 -0
  78. package/build/esm/decorators/transforms.d.ts +41 -0
  79. package/build/esm/decorators/transforms.js +92 -0
  80. package/build/esm/decorators/transforms.js.map +1 -0
  81. package/build/esm/index.d.ts +17 -0
  82. package/build/esm/index.js +24 -0
  83. package/build/esm/index.js.map +1 -0
  84. package/build/esm/package.json +1 -0
  85. package/build/esm/test/basic.d.ts +1 -0
  86. package/build/esm/test/basic.js +245 -0
  87. package/build/esm/test/basic.js.map +1 -0
  88. package/build/esm/test/bulk.d.ts +1 -0
  89. package/build/esm/test/bulk.js +105 -0
  90. package/build/esm/test/bulk.js.map +1 -0
  91. package/build/esm/test/contracts.d.ts +1 -0
  92. package/build/esm/test/contracts.js +340 -0
  93. package/build/esm/test/contracts.js.map +1 -0
  94. package/build/esm/test/filters.d.ts +1 -0
  95. package/build/esm/test/filters.js +187 -0
  96. package/build/esm/test/filters.js.map +1 -0
  97. package/build/esm/test/index.d.ts +1 -0
  98. package/build/esm/test/index.js +31 -0
  99. package/build/esm/test/index.js.map +1 -0
  100. package/build/esm/test/query_scan.d.ts +1 -0
  101. package/build/esm/test/query_scan.js +192 -0
  102. package/build/esm/test/query_scan.js.map +1 -0
  103. package/build/esm/test/relations.d.ts +1 -0
  104. package/build/esm/test/relations.js +243 -0
  105. package/build/esm/test/relations.js.map +1 -0
  106. package/build/esm/test/transactions.d.ts +1 -0
  107. package/build/esm/test/transactions.js +142 -0
  108. package/build/esm/test/transactions.js.map +1 -0
  109. package/build/esm/utils/relations.d.ts +42 -0
  110. package/build/esm/utils/relations.js +207 -0
  111. package/build/esm/utils/relations.js.map +1 -0
  112. package/build/esm/utils/ulid.d.ts +10 -0
  113. package/build/esm/utils/ulid.js +52 -0
  114. package/build/esm/utils/ulid.js.map +1 -0
  115. package/package.json +31 -9
  116. package/src/core/client.js +0 -296
  117. package/src/core/decorator.d.ts +0 -29
  118. package/src/core/decorator.js +0 -103
  119. package/src/core/table.d.ts +0 -81
  120. package/src/core/table.js +0 -892
  121. package/src/decorators/indexes.d.ts +0 -38
  122. package/src/decorators/indexes.js +0 -59
  123. package/src/decorators/timestamps.d.ts +0 -54
  124. package/src/decorators/timestamps.js +0 -72
  125. package/src/decorators/transforms.d.ts +0 -99
  126. package/src/decorators/transforms.js +0 -166
  127. package/src/index.test.js +0 -37
  128. /package/{src → build/cjs}/@types/index.js +0 -0
  129. /package/{src/index.test.d.ts → build/cjs/test/index.d.ts} +0 -0
  130. /package/{src → build/cjs}/utils/relations.d.ts +0 -0
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @file relations.ts
3
+ * @description Sistema de carga de relaciones con batch loading
4
+ * @autor Miguel Alejandro
5
+ * @fecha 2025-01-28
6
+ */
7
+ /**
8
+ * @description Opciones para include de relaciones
9
+ */
10
+ interface IncludeOptions {
11
+ where?: Record<string, any>;
12
+ attributes?: string[];
13
+ limit?: number;
14
+ offset?: number;
15
+ skip?: number;
16
+ order?: 'asc' | 'desc';
17
+ include?: Record<string, IncludeOptions | boolean>;
18
+ }
19
+ /**
20
+ * @description Procesa includes recursivamente para cargar relaciones con caché
21
+ * @param items Array de instancias a poblar
22
+ * @param include Objeto con relaciones a incluir
23
+ * @param TableClass Clase de la tabla actual
24
+ * @param depth Profundidad actual (máximo 5 para prevenir deep nesting)
25
+ * @param queryCache Caché de queries para evitar duplicados (opcional)
26
+ * @returns Items con relaciones pobladas
27
+ * @example
28
+ * ```typescript
29
+ * // Uso interno en Table.where()
30
+ * await processIncludes(users, {
31
+ * posts: {
32
+ * where: { published: true },
33
+ * limit: 5,
34
+ * include: {
35
+ * comments: true
36
+ * }
37
+ * }
38
+ * }, User);
39
+ * ```
40
+ */
41
+ export declare const processIncludes: (items: any[], include: Record<string, IncludeOptions | boolean>, TableClass: any, depth?: number, queryCache?: Map<string, Map<string, any>>) => Promise<any[]>;
42
+ export {};
@@ -0,0 +1,207 @@
1
+ /**
2
+ * @file relations.ts
3
+ * @description Sistema de carga de relaciones con batch loading
4
+ * @autor Miguel Alejandro
5
+ * @fecha 2025-01-28
6
+ */
7
+ import { ScanCommand } from "@aws-sdk/client-dynamodb";
8
+ import { marshall, unmarshall } from "@aws-sdk/util-dynamodb";
9
+ import { requireClient } from "../core/client.js";
10
+ import { SCHEMA } from "../core/decorator.js";
11
+ /**
12
+ * @description Batch load para HasMany/HasOne
13
+ * Obtiene items relacionados donde foreignKey IN parent_ids
14
+ */
15
+ const batchLoadHasMany = async (items, relation, options = {}) => {
16
+ const parent_ids = items.map(i => i[relation.localKey]).filter(Boolean);
17
+ if (!parent_ids.length)
18
+ return new Map();
19
+ // Obtener clase del modelo relacionado
20
+ const RelatedModel = relation.model();
21
+ // Construir filtros combinados
22
+ const filters = {
23
+ [relation.foreignKey]: { $in: parent_ids },
24
+ ...options.where
25
+ };
26
+ // Query con todas las opciones aplicadas
27
+ const related = await RelatedModel.where(filters, {
28
+ attributes: options.attributes,
29
+ order: options.order?.toUpperCase(),
30
+ limit: undefined, // Se aplica después de agrupar
31
+ offset: undefined,
32
+ });
33
+ // Agrupar por foreignKey
34
+ const grouped = new Map();
35
+ for (const item of related) {
36
+ const key = String(item[relation.foreignKey]);
37
+ if (!grouped.has(key))
38
+ grouped.set(key, []);
39
+ grouped.get(key).push(item);
40
+ }
41
+ // Aplicar limit por grupo
42
+ if (options.limit) {
43
+ const offset = options.skip ?? options.offset ?? 0;
44
+ for (const [key, groupItems] of grouped) {
45
+ grouped.set(key, groupItems.slice(offset, offset + options.limit));
46
+ }
47
+ }
48
+ return grouped;
49
+ };
50
+ /**
51
+ * @description Batch load para BelongsTo
52
+ * Obtiene items donde id IN local_keys
53
+ */
54
+ const batchLoadBelongsTo = async (items, relation, options = {}) => {
55
+ const local_keys = items.map(i => i[relation.localKey]).filter(Boolean);
56
+ if (!local_keys.length)
57
+ return new Map();
58
+ const RelatedModel = relation.model();
59
+ // Query con opciones aplicadas
60
+ const related = await RelatedModel.where({ [relation.foreignKey]: { $in: local_keys } }, { attributes: options.attributes });
61
+ const result = new Map();
62
+ for (const item of related) {
63
+ result.set(String(item[relation.foreignKey]), item);
64
+ }
65
+ return result;
66
+ };
67
+ /**
68
+ * @description Batch load para ManyToMany
69
+ * Obtiene items relacionados usando tabla pivot
70
+ */
71
+ const batchLoadManyToMany = async (items, relation, options = {}) => {
72
+ const parent_ids = items.map(i => i[relation.localKey]).filter(Boolean);
73
+ if (!parent_ids.length)
74
+ return new Map();
75
+ const client = requireClient();
76
+ // [1] Query pivot table usando OR chain (DynamoDB no soporta IN nativo)
77
+ const or_conditions = parent_ids.map((_, i) => `#fk = :id${i}`).join(' OR ');
78
+ const pivot_result = await client.send(new ScanCommand({
79
+ TableName: relation.pivotTable,
80
+ FilterExpression: parent_ids.length > 0 ? `(${or_conditions})` : undefined,
81
+ ExpressionAttributeNames: { '#fk': relation.foreignKey },
82
+ ExpressionAttributeValues: marshall(parent_ids.reduce((acc, id, i) => ({ ...acc, [`:id${i}`]: id }), {}))
83
+ }));
84
+ const pivot_rows = (pivot_result.Items ?? []).map(item => unmarshall(item));
85
+ if (pivot_rows.length === 0)
86
+ return new Map();
87
+ // [2] Extract unique related IDs
88
+ const related_ids = [...new Set(pivot_rows.map(row => row[relation.relatedKey]))];
89
+ // [3] Batch load related models con opciones aplicadas
90
+ const RelatedModel = relation.model();
91
+ // Construir filtros combinados
92
+ const filters = {
93
+ [relation.relatedPK]: { $in: related_ids },
94
+ ...options.where
95
+ };
96
+ const related_items = await RelatedModel.where(filters, {
97
+ attributes: options.attributes,
98
+ order: options.order?.toUpperCase(),
99
+ });
100
+ // [5] Map related items by ID
101
+ const related_map = new Map(related_items.map((item) => [String(item[relation.relatedPK]), item]));
102
+ // [6] Group by parent ID using pivot as bridge
103
+ const grouped = new Map();
104
+ for (const pivot of pivot_rows) {
105
+ const parent_id = String(pivot[relation.foreignKey]);
106
+ const related_id = String(pivot[relation.relatedKey]);
107
+ const related_item = related_map.get(related_id);
108
+ if (related_item) {
109
+ if (!grouped.has(parent_id))
110
+ grouped.set(parent_id, []);
111
+ grouped.get(parent_id).push(related_item);
112
+ }
113
+ }
114
+ // [7] Apply limit per group
115
+ if (options.limit) {
116
+ const offset = options.skip ?? options.offset ?? 0;
117
+ for (const [key, items_arr] of grouped) {
118
+ grouped.set(key, items_arr.slice(offset, offset + options.limit));
119
+ }
120
+ }
121
+ return grouped;
122
+ };
123
+ /**
124
+ * @description Procesa includes recursivamente para cargar relaciones con caché
125
+ * @param items Array de instancias a poblar
126
+ * @param include Objeto con relaciones a incluir
127
+ * @param TableClass Clase de la tabla actual
128
+ * @param depth Profundidad actual (máximo 5 para prevenir deep nesting)
129
+ * @param queryCache Caché de queries para evitar duplicados (opcional)
130
+ * @returns Items con relaciones pobladas
131
+ * @example
132
+ * ```typescript
133
+ * // Uso interno en Table.where()
134
+ * await processIncludes(users, {
135
+ * posts: {
136
+ * where: { published: true },
137
+ * limit: 5,
138
+ * include: {
139
+ * comments: true
140
+ * }
141
+ * }
142
+ * }, User);
143
+ * ```
144
+ */
145
+ export const processIncludes = async (items, include, TableClass, depth = 0, queryCache = new Map()) => {
146
+ // Límite reducido de 10 a 5 para mejor performance
147
+ if (!include || depth > 5 || !items.length)
148
+ return items;
149
+ const schema = TableClass[SCHEMA];
150
+ if (!schema)
151
+ return items;
152
+ const promises = Object.entries(include)
153
+ .filter(([key]) => Object.prototype.hasOwnProperty.call(schema.columns, key))
154
+ .map(async ([relation_key, options]) => {
155
+ const column = schema.columns[relation_key];
156
+ if (!column?.store?.relation)
157
+ return;
158
+ const relation = column.store.relation;
159
+ const opts = typeof options === 'boolean' ? {} : options;
160
+ // Generar clave de caché basada en tipo de relación y IDs de padres
161
+ const parent_ids = items.map(i => i[relation.localKey]).filter(Boolean);
162
+ const cache_key = `${relation.type}:${relation.model().name}:${JSON.stringify(parent_ids.sort())}:${JSON.stringify(opts.where || {})}`;
163
+ // Batch load según tipo con caché
164
+ let data;
165
+ // Verificar caché primero
166
+ if (queryCache.has(cache_key)) {
167
+ data = queryCache.get(cache_key);
168
+ }
169
+ else {
170
+ if (relation.type === 'HasMany') {
171
+ data = await batchLoadHasMany(items, relation, opts);
172
+ }
173
+ else if (relation.type === 'HasOne') {
174
+ const hasMany = await batchLoadHasMany(items, relation, { ...opts, limit: 1 });
175
+ data = new Map();
176
+ for (const [k, v] of hasMany) {
177
+ data.set(k, v[0] ?? null);
178
+ }
179
+ }
180
+ else if (relation.type === 'ManyToMany') {
181
+ data = await batchLoadManyToMany(items, relation, opts);
182
+ }
183
+ else {
184
+ // BelongsTo
185
+ data = await batchLoadBelongsTo(items, relation, opts);
186
+ }
187
+ // Guardar en caché
188
+ queryCache.set(cache_key, data);
189
+ }
190
+ for (const item of items) {
191
+ const key = String(item[relation.localKey]);
192
+ item[relation_key] = (relation.type === 'HasMany' || relation.type === 'ManyToMany')
193
+ ? data.get(key) ?? []
194
+ : data.get(key) ?? null;
195
+ }
196
+ // Recursión para includes anidados con caché propagado
197
+ if (opts.include && data.size) {
198
+ const all_related = Array.from(data.values()).flat().filter(Boolean);
199
+ if (all_related.length) {
200
+ await processIncludes(all_related, opts.include, relation.model(), depth + 1, queryCache);
201
+ }
202
+ }
203
+ });
204
+ await Promise.all(promises);
205
+ return items;
206
+ };
207
+ //# sourceMappingURL=relations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relations.js","sourceRoot":"","sources":["../../../src/utils/relations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @description ULID (Universally Unique Lexicographically Sortable Identifier) generator.
3
+ * @description Generador de ULID (Identificador Único Lexicográficamente Ordenable).
4
+ *
5
+ * 48 bits timestamp (ms) + 80 bits random, Crockford Base32 encoding.
6
+ * Monotonic within the same millisecond: sequential calls in the same ms produce incrementing IDs.
7
+ *
8
+ * Monotónico dentro del mismo milisegundo: llamadas secuenciales en el mismo ms producen IDs incrementales.
9
+ */
10
+ export declare function ulid(): string;
@@ -0,0 +1,52 @@
1
+ /**
2
+ * @description ULID (Universally Unique Lexicographically Sortable Identifier) generator.
3
+ * @description Generador de ULID (Identificador Único Lexicográficamente Ordenable).
4
+ *
5
+ * 48 bits timestamp (ms) + 80 bits random, Crockford Base32 encoding.
6
+ * Monotonic within the same millisecond: sequential calls in the same ms produce incrementing IDs.
7
+ *
8
+ * Monotónico dentro del mismo milisegundo: llamadas secuenciales en el mismo ms producen IDs incrementales.
9
+ */
10
+ const CHARS = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
11
+ let last_time = 0;
12
+ let last_random_hi = 0;
13
+ let last_random_lo = 0;
14
+ function encode_time(time, len) {
15
+ let str = '';
16
+ for (let i = len; i > 0; i--) {
17
+ str = CHARS[time % 32] + str;
18
+ time = Math.floor(time / 32);
19
+ }
20
+ return str;
21
+ }
22
+ function encode_random() {
23
+ let str = '';
24
+ let hi = last_random_hi;
25
+ let lo = last_random_lo;
26
+ for (let i = 0; i < 8; i++) {
27
+ str = CHARS[lo % 32] + str;
28
+ lo = Math.floor(lo / 32);
29
+ }
30
+ for (let i = 0; i < 8; i++) {
31
+ str = CHARS[hi % 32] + str;
32
+ hi = Math.floor(hi / 32);
33
+ }
34
+ return str;
35
+ }
36
+ export function ulid() {
37
+ let now = Date.now();
38
+ if (now === last_time) {
39
+ last_random_lo++;
40
+ if (last_random_lo > 0xFFFFFFFFFF) {
41
+ last_random_lo = 0;
42
+ last_random_hi++;
43
+ }
44
+ }
45
+ else {
46
+ last_time = now;
47
+ last_random_hi = Math.floor(Math.random() * 0xFFFFFFFFFF);
48
+ last_random_lo = Math.floor(Math.random() * 0xFFFFFFFFFF);
49
+ }
50
+ return encode_time(now, 10) + encode_random();
51
+ }
52
+ //# sourceMappingURL=ulid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ulid.js","sourceRoot":"","sources":["../../../src/utils/ulid.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,KAAK,GAAG,kCAAkC,CAAC;AAEjD,IAAI,SAAS,GAAG,CAAC,CAAC;AAClB,IAAI,cAAc,GAAG,CAAC,CAAC;AACvB,IAAI,cAAc,GAAG,CAAC,CAAC;AAEvB,SAAS,WAAW,CAAC,IAAY,EAAE,GAAW;IAC5C,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,GAAG,GAAG,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;QAC7B,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa;IACpB,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,EAAE,GAAG,cAAc,CAAC;IACxB,IAAI,EAAE,GAAG,cAAc,CAAC;IACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;QAC3B,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3B,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;QAC3B,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,IAAI;IAClB,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAErB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,cAAc,EAAE,CAAC;QACjB,IAAI,cAAc,GAAG,YAAY,EAAE,CAAC;YAClC,cAAc,GAAG,CAAC,CAAC;YACnB,cAAc,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,GAAG,CAAC;QAChB,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC;QAC1D,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC;AAChD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "author": {
3
- "email": "comunity@arcaelas.com",
3
+ "email": "community@arcaelas.com",
4
4
  "name": "Arcaelas Insiders",
5
5
  "url": "https://github.com/arcaelas"
6
6
  },
@@ -15,6 +15,7 @@
15
15
  "pluralize": "^8.0.0",
16
16
  "uuid": "^11.1.0"
17
17
  },
18
+ "description": "Modern decorator-first ORM for AWS DynamoDB with TypeScript support. Type-safe models, relationships, validations, and transactions.",
18
19
  "devDependencies": {
19
20
  "@eslint/js": "^9.39.1",
20
21
  "@types/node": "^24.0.6",
@@ -24,13 +25,31 @@
24
25
  "typescript": "^5.8.3",
25
26
  "typescript-eslint": "^8.49.0"
26
27
  },
28
+ "exports": {
29
+ ".": {
30
+ "import": "./build/esm/index.js",
31
+ "require": "./build/cjs/index.js",
32
+ "types": "./build/esm/index.d.ts"
33
+ }
34
+ },
27
35
  "files": [
28
- "src/**/*.js",
29
- "src/**/*.d.ts"
36
+ "build"
30
37
  ],
31
38
  "homepage": "https://github.com/arcaelas/dynamite",
39
+ "keywords": [
40
+ "dynamodb",
41
+ "orm",
42
+ "aws",
43
+ "dynamodb-orm",
44
+ "typescript",
45
+ "decorators",
46
+ "arcaelas",
47
+ "arcaelas insiders",
48
+ "arcaelas-insiders"
49
+ ],
32
50
  "license": "ISC",
33
- "main": "src/index.js",
51
+ "main": "./build/cjs/index.js",
52
+ "module": "./build/esm/index.js",
34
53
  "name": "@arcaelas/dynamite",
35
54
  "publishConfig": {
36
55
  "access": "public",
@@ -41,11 +60,14 @@
41
60
  "url": "https://github.com/arcaelas/dynamite.git"
42
61
  },
43
62
  "scripts": {
44
- "build": "tsc && tsc-alias",
63
+ "build": "yarn build:esm && yarn build:cjs",
64
+ "build:cjs": "tsc --module commonjs --moduleResolution node --outDir build/cjs && tsc-alias --outDir build/cjs && echo '{\"type\":\"commonjs\"}' > build/cjs/package.json",
65
+ "build:esm": "tsc --module ESNext --moduleResolution bundler --outDir build/esm && tsc-alias --resolve-full-paths --outDir build/esm && echo '{\"type\":\"module\"}' > build/esm/package.json",
45
66
  "docs": "mkdocs gh-deploy --force",
46
- "deploy": "npm version patch && npm publish --access=public",
47
- "prepublishOnly": "yarn build",
48
- "postpublish": "find src -type f \\( -name '*.js' -o -name '*.d.ts' -o -name '*.map' \\) -delete"
67
+ "lint": "eslint src/ --fix",
68
+ "prepublishOnly": "rm -rf build && npm version minor && yarn build",
69
+ "release": "npm publish --access public"
49
70
  },
50
- "version": "1.0.29"
71
+ "types": "./build/esm/index.d.ts",
72
+ "version": "2.1.0"
51
73
  }