@arcaelas/dynamite 1.0.8 → 1.0.10

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 (101) hide show
  1. package/build/__tests__/crud.spec.d.ts +7 -0
  2. package/build/__tests__/crud.spec.js +287 -0
  3. package/build/__tests__/crud.spec.js.map +1 -0
  4. package/build/__tests__/debug-decorators.spec.d.ts +7 -0
  5. package/build/__tests__/debug-decorators.spec.js +143 -0
  6. package/build/__tests__/debug-decorators.spec.js.map +1 -0
  7. package/build/__tests__/decorators.spec.d.ts +7 -0
  8. package/build/__tests__/decorators.spec.js +203 -0
  9. package/build/__tests__/decorators.spec.js.map +1 -0
  10. package/build/__tests__/instance-crud.spec.d.ts +7 -0
  11. package/build/__tests__/instance-crud.spec.js +184 -0
  12. package/build/__tests__/instance-crud.spec.js.map +1 -0
  13. package/build/src/core/client.d.ts +65 -0
  14. package/build/src/core/client.js +152 -0
  15. package/build/src/core/client.js.map +1 -0
  16. package/build/{core → src/core}/table.d.ts +41 -9
  17. package/build/src/core/table.js +406 -0
  18. package/build/src/core/table.js.map +1 -0
  19. package/build/{core → src/core}/wrapper.d.ts +12 -2
  20. package/build/src/core/wrapper.js +27 -0
  21. package/build/src/core/wrapper.js.map +1 -0
  22. package/build/src/decorators/created_at.d.ts +8 -0
  23. package/build/{decorators → src/decorators}/created_at.js +6 -10
  24. package/build/src/decorators/created_at.js.map +1 -0
  25. package/build/src/decorators/default.d.ts +8 -0
  26. package/build/{decorators → src/decorators}/default.js +18 -13
  27. package/build/src/decorators/default.js.map +1 -0
  28. package/build/src/decorators/index.d.ts +8 -0
  29. package/build/src/decorators/index.js +26 -0
  30. package/build/src/decorators/index.js.map +1 -0
  31. package/build/src/decorators/index_sort.d.ts +8 -0
  32. package/build/src/decorators/index_sort.js +30 -0
  33. package/build/src/decorators/index_sort.js.map +1 -0
  34. package/build/src/decorators/mutate.d.ts +9 -0
  35. package/build/{decorators → src/decorators}/mutate.js +22 -15
  36. package/build/src/decorators/mutate.js.map +1 -0
  37. package/build/src/decorators/name.d.ts +8 -0
  38. package/build/src/decorators/name.js +42 -0
  39. package/build/src/decorators/name.js.map +1 -0
  40. package/build/src/decorators/not_null.d.ts +8 -0
  41. package/build/src/decorators/not_null.js +20 -0
  42. package/build/src/decorators/not_null.js.map +1 -0
  43. package/build/src/decorators/primary_key.d.ts +8 -0
  44. package/build/src/decorators/primary_key.js +26 -0
  45. package/build/src/decorators/primary_key.js.map +1 -0
  46. package/build/src/decorators/updated_at.d.ts +8 -0
  47. package/build/src/decorators/updated_at.js +18 -0
  48. package/build/src/decorators/updated_at.js.map +1 -0
  49. package/build/src/decorators/validate.d.ts +8 -0
  50. package/build/{decorators → src/decorators}/validate.js +18 -12
  51. package/build/src/decorators/validate.js.map +1 -0
  52. package/build/{index.d.ts → src/index.d.ts} +5 -3
  53. package/build/{index.js → src/index.js} +14 -7
  54. package/build/src/index.js.map +1 -0
  55. package/build/src/utils/batch-relations.d.ts +14 -0
  56. package/build/src/utils/batch-relations.js +130 -0
  57. package/build/src/utils/batch-relations.js.map +1 -0
  58. package/build/src/utils/naming.d.ts +8 -0
  59. package/build/src/utils/naming.js +18 -0
  60. package/build/src/utils/naming.js.map +1 -0
  61. package/build/src/utils/projection.d.ts +12 -0
  62. package/build/src/utils/projection.js +50 -0
  63. package/build/src/utils/projection.js.map +1 -0
  64. package/build/src/utils/relations.d.ts +23 -0
  65. package/build/src/utils/relations.js +205 -0
  66. package/build/src/utils/relations.js.map +1 -0
  67. package/package.json +1 -1
  68. package/build/core/table.js +0 -349
  69. package/build/core/table.js.map +0 -1
  70. package/build/core/wrapper.js +0 -26
  71. package/build/core/wrapper.js.map +0 -1
  72. package/build/decorators/created_at.d.ts +0 -4
  73. package/build/decorators/created_at.js.map +0 -1
  74. package/build/decorators/default.d.ts +0 -2
  75. package/build/decorators/default.js.map +0 -1
  76. package/build/decorators/index.d.ts +0 -1
  77. package/build/decorators/index.js +0 -24
  78. package/build/decorators/index.js.map +0 -1
  79. package/build/decorators/index_sort.d.ts +0 -1
  80. package/build/decorators/index_sort.js +0 -27
  81. package/build/decorators/index_sort.js.map +0 -1
  82. package/build/decorators/mutate.d.ts +0 -2
  83. package/build/decorators/mutate.js.map +0 -1
  84. package/build/decorators/name.d.ts +0 -1
  85. package/build/decorators/name.js +0 -41
  86. package/build/decorators/name.js.map +0 -1
  87. package/build/decorators/not_null.d.ts +0 -4
  88. package/build/decorators/not_null.js +0 -28
  89. package/build/decorators/not_null.js.map +0 -1
  90. package/build/decorators/primary_key.d.ts +0 -7
  91. package/build/decorators/primary_key.js +0 -30
  92. package/build/decorators/primary_key.js.map +0 -1
  93. package/build/decorators/updated_at.d.ts +0 -4
  94. package/build/decorators/updated_at.js +0 -23
  95. package/build/decorators/updated_at.js.map +0 -1
  96. package/build/decorators/validate.d.ts +0 -1
  97. package/build/decorators/validate.js.map +0 -1
  98. package/build/index.js.map +0 -1
  99. package/build/utils/naming.d.ts +0 -1
  100. package/build/utils/naming.js +0 -18
  101. package/build/utils/naming.js.map +0 -1
@@ -1,13 +1,16 @@
1
- import { DynamoDBClientConfig } from "@aws-sdk/client-dynamodb";
2
1
  import { InferAttributes, STORE, WrapperEntry } from "./wrapper";
3
- export declare function connect(cfg: DynamoDBClientConfig): void;
2
+ /** Base Table class for DynamoDB ORM with CRUD operations */
4
3
  export default class Table<T extends {} = any> {
5
4
  protected [STORE]: {
6
5
  [K in keyof T]?: T[K];
7
6
  };
7
+ /** Initialize table instance with data */
8
8
  constructor(data: InferAttributes<T>);
9
+ /** Save instance to database (create or update) */
9
10
  save(): Promise<this>;
10
- update(patch: InferAttributes<T>): Promise<this>;
11
+ /** Update instance with partial data */
12
+ update(patch: Partial<InferAttributes<T>>): Promise<this>;
13
+ /** Delete instance from database */
11
14
  destroy(): Promise<void>;
12
15
  static create<M extends Table>(this: {
13
16
  new (data: InferAttributes<M>): M;
@@ -17,6 +20,16 @@ export default class Table<T extends {} = any> {
17
20
  new (data: InferAttributes<M>): M;
18
21
  prototype: M;
19
22
  }, id: string, record: InferAttributes<M>): Promise<void>;
23
+ /**
24
+ * Actualiza múltiples registros que coincidan con los filtros especificados
25
+ * @param updates - Objeto con los valores a actualizar
26
+ * @param filters - Filtros para seleccionar qué registros actualizar
27
+ * @returns Número de registros actualizados
28
+ */
29
+ static updateWhere<M extends Table>(this: {
30
+ new (data: InferAttributes<M>): M;
31
+ prototype: M;
32
+ }, updates: Partial<InferAttributes<M>>, filters: Partial<InferAttributes<M>>): Promise<number>;
20
33
  static destroy<M extends Table>(this: {
21
34
  new (data: InferAttributes<M>): M;
22
35
  prototype: M;
@@ -50,22 +63,27 @@ export default class Table<T extends {} = any> {
50
63
  limit?: number;
51
64
  skip?: number;
52
65
  order?: "ASC" | "DESC";
66
+ include?: Record<string, any>;
53
67
  }): Promise<M[]>;
54
68
  static where<M extends Table, K extends keyof InferAttributes<M>>(this: {
55
69
  new (data: InferAttributes<M>): M;
56
70
  prototype: M;
57
- }, key: K, op: "=" | "!=" | "<" | "<=" | ">" | ">=", value: InferAttributes<M>[K], options?: {
71
+ }, key: K, op: "=" | "!=" | "<" | "<=" | ">" | ">=" | "in" | "not-in", value: InferAttributes<M>[K] | InferAttributes<M>[K][], options?: {
58
72
  limit?: number;
59
73
  skip?: number;
60
74
  order?: "ASC" | "DESC";
75
+ include?: Record<string, any>;
61
76
  }): Promise<M[]>;
62
77
  static where<M extends Table>(this: {
63
78
  new (data: InferAttributes<M>): M;
64
79
  prototype: M;
65
- }, filters: Partial<InferAttributes<M>>, options?: {
80
+ }, filters: Partial<{
81
+ [K in keyof InferAttributes<M>]: InferAttributes<M>[K] | InferAttributes<M>[K][];
82
+ }>, options?: {
66
83
  limit?: number;
67
84
  skip?: number;
68
85
  order?: "ASC" | "DESC";
86
+ include?: Record<string, any>;
69
87
  }): Promise<M[]>;
70
88
  /**
71
89
  * Obtiene el primer elemento que coincida con la condición especificada.
@@ -91,11 +109,13 @@ export default class Table<T extends {} = any> {
91
109
  static first<M extends Table, K extends keyof InferAttributes<M>>(this: {
92
110
  new (data: InferAttributes<M>): M;
93
111
  prototype: M;
94
- }, key: K, op: "=" | "!=" | "<" | "<=" | ">" | ">=", value: InferAttributes<M>[K]): Promise<M | undefined>;
112
+ }, key: K, op: "=" | "!=" | "<" | "<=" | ">" | ">=" | "in" | "not-in", value: InferAttributes<M>[K] | InferAttributes<M>[K][]): Promise<M | undefined>;
95
113
  static first<M extends Table>(this: {
96
114
  new (data: InferAttributes<M>): M;
97
115
  prototype: M;
98
- }, filters: Partial<InferAttributes<M>>): Promise<M | undefined>;
116
+ }, filters: Partial<{
117
+ [K in keyof InferAttributes<M>]: InferAttributes<M>[K] | InferAttributes<M>[K][];
118
+ }>): Promise<M | undefined>;
99
119
  /**
100
120
  * Obtiene el último elemento que coincida con la condición especificada.
101
121
  * Equivalente a where() con { limit: 1, skip: 0, order: "DESC" }.
@@ -120,11 +140,23 @@ export default class Table<T extends {} = any> {
120
140
  static last<M extends Table, K extends keyof InferAttributes<M>>(this: {
121
141
  new (data: InferAttributes<M>): M;
122
142
  prototype: M;
123
- }, key: K, op: "=" | "!=" | "<" | "<=" | ">" | ">=", value: InferAttributes<M>[K]): Promise<M | undefined>;
143
+ }, key: K, op: "=" | "!=" | "<" | "<=" | ">" | ">=" | "in" | "not-in", value: InferAttributes<M>[K] | InferAttributes<M>[K][]): Promise<M | undefined>;
124
144
  static last<M extends Table>(this: {
125
145
  new (data: InferAttributes<M>): M;
126
146
  prototype: M;
127
- }, filters: Partial<InferAttributes<M>>): Promise<M | undefined>;
147
+ }, filters: Partial<{
148
+ [K in keyof InferAttributes<M>]: InferAttributes<M>[K] | InferAttributes<M>[K][];
149
+ }>): Promise<M | undefined>;
150
+ /**
151
+ * Obtiene los metadatos del modelo para uso interno del sistema de relaciones.
152
+ *
153
+ * @template M Instancia de la clase Table.
154
+ * @returns Los metadatos del wrapper del modelo.
155
+ */
156
+ static getMeta<M extends Table>(this: {
157
+ new (data: InferAttributes<M>): M;
158
+ prototype: M;
159
+ }): WrapperEntry;
128
160
  toJSON(): Record<string, unknown>;
129
161
  toString(): string;
130
162
  }
@@ -0,0 +1,406 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.STORE = void 0;
37
+ const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
38
+ const util_dynamodb_1 = require("@aws-sdk/util-dynamodb");
39
+ const relations_1 = require("../utils/relations");
40
+ const client_1 = require("./client");
41
+ const wrapper_1 = __importStar(require("./wrapper"));
42
+ Object.defineProperty(exports, "STORE", { enumerable: true, get: function () { return wrapper_1.STORE; } });
43
+ /** Get required DynamoDB client */
44
+ const requireClient = () => (0, client_1.getGlobalClient)();
45
+ /** Get metadata for constructor or throw error */
46
+ const mustMeta = (ctor) => {
47
+ const meta = wrapper_1.default.get(ctor);
48
+ if (!meta)
49
+ throw new Error(`Class ${ctor.name} not registered in wrapper`);
50
+ return meta;
51
+ };
52
+ /** Base Table class for DynamoDB ORM with CRUD operations */
53
+ class Table {
54
+ /** Initialize table instance with data */
55
+ constructor(data) {
56
+ requireClient();
57
+ const meta = mustMeta(Object.getPrototypeOf(this).constructor);
58
+ meta.columns.forEach((c) => {
59
+ if (!(c.name in data))
60
+ this[c.name] = undefined;
61
+ });
62
+ Object.assign(this, data);
63
+ }
64
+ /** Save instance to database (create or update) */
65
+ async save() {
66
+ const id = this["id"];
67
+ const Ctor = this.constructor;
68
+ const record = this.toJSON();
69
+ if (id === undefined || id === null) {
70
+ delete record.id;
71
+ const fresh = await Ctor.create(record);
72
+ Object.assign(this, fresh);
73
+ }
74
+ else {
75
+ await Ctor.update(String(id), record);
76
+ }
77
+ return this;
78
+ }
79
+ /** Update instance with partial data */
80
+ async update(patch) {
81
+ const id = this["id"];
82
+ if (id === undefined || id === null)
83
+ throw new Error("update() requiere id");
84
+ Object.assign(this, patch);
85
+ const Ctor = this.constructor;
86
+ await Ctor.update(String(id), this.toJSON());
87
+ return this;
88
+ }
89
+ /** Delete instance from database */
90
+ async destroy() {
91
+ const id = this["id"];
92
+ if (id === undefined || id === null)
93
+ throw new Error("destroy() requiere id");
94
+ const Ctor = this.constructor;
95
+ await Ctor.destroy(String(id));
96
+ }
97
+ /* ------------------------------- static CRUD --------------------------- */
98
+ static async create(data) {
99
+ const client = requireClient();
100
+ const meta = mustMeta(this);
101
+ const payload = new this(data).toJSON();
102
+ await client.send(new client_dynamodb_1.PutItemCommand({
103
+ TableName: meta.name,
104
+ Item: (0, util_dynamodb_1.marshall)(payload, { removeUndefinedValues: true }),
105
+ }));
106
+ return new this(data);
107
+ }
108
+ // prettier-ignore
109
+ static async update(id, record) {
110
+ const client = requireClient();
111
+ const meta = mustMeta(this);
112
+ const payload = { ...record, id };
113
+ await client.send(new client_dynamodb_1.PutItemCommand({
114
+ TableName: meta.name,
115
+ Item: (0, util_dynamodb_1.marshall)(payload, { removeUndefinedValues: true }),
116
+ }));
117
+ }
118
+ /**
119
+ * Actualiza múltiples registros que coincidan con los filtros especificados
120
+ * @param updates - Objeto con los valores a actualizar
121
+ * @param filters - Filtros para seleccionar qué registros actualizar
122
+ * @returns Número de registros actualizados
123
+ */
124
+ // prettier-ignore
125
+ static async updateWhere(updates, filters) {
126
+ // Buscar todos los registros que coincidan con los filtros
127
+ const records = await this.where(filters);
128
+ // Actualizar cada registro individualmente
129
+ let updatedCount = 0;
130
+ for (const record of records) {
131
+ try {
132
+ await this.update(record.id, { ...record.toJSON(), ...updates });
133
+ updatedCount++;
134
+ }
135
+ catch (error) {
136
+ // Continuar con el siguiente registro si hay un error
137
+ console.warn(`Error actualizando registro ${record.id}:`, error);
138
+ }
139
+ }
140
+ return updatedCount;
141
+ }
142
+ // prettier-ignore
143
+ static async destroy(id) {
144
+ const client = requireClient();
145
+ const meta = mustMeta(this);
146
+ try {
147
+ await client.send(new client_dynamodb_1.DeleteItemCommand({
148
+ TableName: meta.name,
149
+ Key: (0, util_dynamodb_1.marshall)({ id }),
150
+ }));
151
+ }
152
+ catch (err) {
153
+ if (err.name === "ResourceNotFoundException")
154
+ return null;
155
+ throw err;
156
+ }
157
+ return null;
158
+ }
159
+ static async where(...args) {
160
+ try {
161
+ requireClient();
162
+ const meta = mustMeta(this);
163
+ const conditions = [];
164
+ // Detección y extracción de opciones
165
+ const last = args.at(-1);
166
+ const hasOptions = typeof last === "object" &&
167
+ last !== null &&
168
+ ("limit" in last ||
169
+ "skip" in last ||
170
+ "order" in last ||
171
+ "include" in last);
172
+ const options = hasOptions ? args.pop() : {};
173
+ // Separar opciones de query e include
174
+ const { queryOptions, includeOptions } = (0, relations_1.separateQueryOptions)(options);
175
+ // Validar opciones de query
176
+ if (queryOptions.limit !== undefined && queryOptions.limit < 0) {
177
+ throw new Error("Argumentos inválidos");
178
+ }
179
+ if (queryOptions.skip !== undefined && queryOptions.skip < 0) {
180
+ throw new Error("Argumentos inválidos");
181
+ }
182
+ if (queryOptions.order !== undefined &&
183
+ !["ASC", "DESC"].includes(queryOptions.order)) {
184
+ throw new Error("Argumentos inválidos");
185
+ }
186
+ const limit = queryOptions.limit ?? 100;
187
+ const skip = queryOptions.skip ?? 0;
188
+ const order = (queryOptions.order ?? "ASC");
189
+ // Parseo de condiciones según variante
190
+ if (args.length === 1 &&
191
+ typeof args[0] === "object" &&
192
+ !Array.isArray(args[0])) {
193
+ for (const [key, value] of Object.entries(args[0])) {
194
+ // Validar que el campo existe en el modelo
195
+ if (!meta.columns.has(key)) {
196
+ return [];
197
+ }
198
+ // Detectar arrays y convertir a operador 'in'
199
+ if (Array.isArray(value)) {
200
+ if (value.length === 0) {
201
+ throw new Error("Array vacío no permitido en filtros");
202
+ }
203
+ if (value.length > 100) {
204
+ throw new Error("Operador 'in' limitado a 100 valores máximo");
205
+ }
206
+ conditions.push({ key, op: "in", value });
207
+ }
208
+ else {
209
+ conditions.push({ key, op: "=", value });
210
+ }
211
+ }
212
+ }
213
+ else if (args.length === 2) {
214
+ const [key, value] = args;
215
+ // Validar que el campo existe en el modelo
216
+ if (!meta.columns.has(key)) {
217
+ return [];
218
+ }
219
+ conditions.push({ key, op: "=", value });
220
+ }
221
+ else if (args.length === 3) {
222
+ const [key, op, value] = args;
223
+ // Validar operador
224
+ const validOps = ["=", "!=", "<", "<=", ">", ">=", "in", "not-in"];
225
+ if (!validOps.includes(op)) {
226
+ throw new Error("Argumentos inválidos");
227
+ }
228
+ // Validar arrays para operadores in/not-in
229
+ if (op === "in" || op === "not-in") {
230
+ if (!Array.isArray(value)) {
231
+ throw new Error(`Operador '${op}' requiere un array`);
232
+ }
233
+ if (value.length === 0) {
234
+ throw new Error(`Operador '${op}' requiere array no vacío`);
235
+ }
236
+ if (value.length > 100) {
237
+ throw new Error(`Operador '${op}' limitado a 100 valores máximo`);
238
+ }
239
+ }
240
+ else if (Array.isArray(value)) {
241
+ throw new Error(`Operador '${op}' no acepta arrays`);
242
+ }
243
+ // Validar que el campo existe en el modelo
244
+ if (!meta.columns.has(key)) {
245
+ return [];
246
+ }
247
+ conditions.push({ key, op, value });
248
+ }
249
+ else {
250
+ throw new Error("Argumentos inválidos");
251
+ }
252
+ // Si no hay condiciones, hacer scan completo
253
+ if (conditions.length === 0) {
254
+ const client = requireClient();
255
+ const res = await client.send(new client_dynamodb_1.ScanCommand({
256
+ TableName: meta.name,
257
+ }));
258
+ let items = (res.Items ?? []).map((i) => new this((0, util_dynamodb_1.unmarshall)(i)));
259
+ const paginatedItems = items.slice(skip, skip + limit);
260
+ // Procesar includes si están presentes
261
+ if (includeOptions && Object.keys(includeOptions).length > 0) {
262
+ console.log("DEBUG: processIncludes called with:", includeOptions);
263
+ const result = await (0, relations_1.processIncludes)(this, [...paginatedItems], includeOptions);
264
+ console.log("DEBUG: processIncludes result:", result.length, "items");
265
+ return result;
266
+ }
267
+ return paginatedItems;
268
+ }
269
+ // Query optimizado si es por PK/SK e igualdad
270
+ const column = meta.columns.get(conditions[0].key);
271
+ const isIndex = column?.index || column?.indexSort;
272
+ if (conditions.length === 1 && isIndex && conditions[0].op === "=") {
273
+ const client = requireClient();
274
+ const { key, value } = conditions[0];
275
+ const res = await client.send(new client_dynamodb_1.QueryCommand({
276
+ TableName: meta.name,
277
+ KeyConditionExpression: `#K = :v`,
278
+ ExpressionAttributeNames: { "#K": key },
279
+ ExpressionAttributeValues: (0, util_dynamodb_1.marshall)({ ":v": value }),
280
+ Limit: limit,
281
+ ScanIndexForward: order === "ASC",
282
+ }));
283
+ let items = (res.Items ?? []).map((i) => new this((0, util_dynamodb_1.unmarshall)(i)));
284
+ const paginatedItems = skip > 0 ? items.slice(skip, skip + limit) : items;
285
+ // Procesar includes si están presentes
286
+ if (includeOptions && Object.keys(includeOptions).length > 0) {
287
+ console.log("DEBUG: processIncludes called with (optimized path):", includeOptions);
288
+ const result = await (0, relations_1.processIncludes)(this, [...paginatedItems], includeOptions);
289
+ console.log("DEBUG: processIncludes result (optimized path):", result.length, "items");
290
+ return result;
291
+ }
292
+ return paginatedItems;
293
+ }
294
+ // Fallback: Scan + FilterExpression
295
+ const normalize = (op) => (op === "!=" ? "<>" : op);
296
+ const exprParts = [];
297
+ const names = {};
298
+ const vals = {};
299
+ conditions.forEach((c, i) => {
300
+ const nk = `#k${i}`;
301
+ names[nk] = c.key;
302
+ if (c.op === "in" || c.op === "not-in") {
303
+ // Manejar arrays para operadores IN/NOT-IN
304
+ const values = c.value;
305
+ const placeholders = values
306
+ .map((_, idx) => `:v${i}_${idx}`)
307
+ .join(", ");
308
+ const expression = c.op === "in"
309
+ ? `${nk} IN (${placeholders})`
310
+ : `NOT (${nk} IN (${placeholders}))`;
311
+ exprParts.push(expression);
312
+ // Agregar cada valor del array
313
+ values.forEach((val, idx) => {
314
+ vals[`:v${i}_${idx}`] = val;
315
+ });
316
+ }
317
+ else {
318
+ // Operadores simples
319
+ const nv = `:v${i}`;
320
+ exprParts.push(`${nk} ${normalize(c.op)} ${nv}`);
321
+ vals[nv] = c.value;
322
+ }
323
+ });
324
+ const client = requireClient();
325
+ const res = await client.send(new client_dynamodb_1.ScanCommand({
326
+ TableName: meta.name,
327
+ FilterExpression: exprParts.join(" AND "),
328
+ ExpressionAttributeNames: names,
329
+ ExpressionAttributeValues: (0, util_dynamodb_1.marshall)(vals),
330
+ }));
331
+ let items = (res.Items ?? []).map((i) => new this((0, util_dynamodb_1.unmarshall)(i)));
332
+ // Ordenar items según el primer campo de condición
333
+ if (conditions.length > 0) {
334
+ const sortKey = conditions[0].key;
335
+ items.sort((a, b) => {
336
+ const aVal = a[sortKey];
337
+ const bVal = b[sortKey];
338
+ // Ordenamiento numérico o string
339
+ if (typeof aVal === "number" && typeof bVal === "number") {
340
+ return order === "ASC" ? aVal - bVal : bVal - aVal;
341
+ }
342
+ else {
343
+ const comparison = String(aVal).localeCompare(String(bVal));
344
+ return order === "ASC" ? comparison : -comparison;
345
+ }
346
+ });
347
+ }
348
+ const paginatedItems = items.slice(skip, skip + limit);
349
+ // Procesar includes si están presentes
350
+ if (includeOptions && Object.keys(includeOptions).length > 0) {
351
+ console.log("DEBUG: processIncludes called with:", includeOptions);
352
+ const result = await (0, relations_1.processIncludes)(this, [...paginatedItems], includeOptions);
353
+ console.log("DEBUG: processIncludes result:", result.length, "items");
354
+ return result;
355
+ }
356
+ return paginatedItems;
357
+ }
358
+ finally {
359
+ // Limpiar cache de relaciones al finalizar
360
+ (0, relations_1.clearRelationCache)(this);
361
+ }
362
+ }
363
+ static async first(...args) {
364
+ const results = await this.where(...args, {
365
+ limit: 1,
366
+ skip: 0,
367
+ order: "ASC",
368
+ });
369
+ return results[0] || undefined;
370
+ }
371
+ static async last(...args) {
372
+ const results = await this.where(...args, {
373
+ limit: 1,
374
+ skip: 0,
375
+ order: "DESC",
376
+ });
377
+ return results[0] || undefined;
378
+ }
379
+ /**
380
+ * Obtiene los metadatos del modelo para uso interno del sistema de relaciones.
381
+ *
382
+ * @template M Instancia de la clase Table.
383
+ * @returns Los metadatos del wrapper del modelo.
384
+ */
385
+ static getMeta() {
386
+ return mustMeta(this);
387
+ }
388
+ /* --------------------------- helpers de instancia ---------------------- */
389
+ toJSON() {
390
+ const meta = mustMeta(Object.getPrototypeOf(this).constructor);
391
+ const buf = this[wrapper_1.STORE] ?? {};
392
+ const out = {};
393
+ for (const [prop, col] of meta.columns) {
394
+ if (prop in buf)
395
+ out[col.name] = buf[prop];
396
+ else if (prop in this)
397
+ out[col.name] = this[prop];
398
+ }
399
+ return out;
400
+ }
401
+ toString() {
402
+ return JSON.stringify(this.toJSON());
403
+ }
404
+ }
405
+ exports.default = Table;
406
+ //# sourceMappingURL=table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../../../src/core/table.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,7 @@ type KeepFunction<T> = {
19
19
  type KeepBranded<T, Brand extends symbol> = {
20
20
  [K in keyof T as IsBranded<T[K], Brand> extends true ? K : never]: T[K];
21
21
  };
22
+ /** Type utility for inferring model attributes, excluding non-attributes and functions */
22
23
  export type InferAttributes<T> = RemoveFunction<RemoveNullish<RemoveBranded<RemoveBranded<T, typeof CreationOptionalBrand>, typeof NonAttributeBrand>>> & Partial<KeepBranded<T, typeof CreationOptionalBrand>>;
23
24
  export type Mutate = (value: any) => Inmutable;
24
25
  export type Default = Inmutable | (() => Inmutable);
@@ -33,12 +34,21 @@ export interface Column {
33
34
  indexSort?: true;
34
35
  unique?: true;
35
36
  }
37
+ export interface RelationMetadata {
38
+ type: "hasMany" | "belongsTo";
39
+ targetModel: () => any;
40
+ foreignKey: string;
41
+ localKey?: string;
42
+ }
36
43
  export interface WrapperEntry {
37
44
  name: string;
38
45
  columns: Map<string | symbol, Column>;
46
+ relations: Map<string | symbol, RelationMetadata>;
39
47
  }
40
48
  declare const wrapper: Map<Function, WrapperEntry>;
41
49
  export declare const STORE: unique symbol;
42
50
  export default wrapper;
43
- export declare function ensureConfig(ctor: Function, tableName: string): WrapperEntry;
44
- export declare function ensureColumn(entry: WrapperEntry, prop: string | symbol, columnName: string): Column;
51
+ /** Get or create wrapper entry for a constructor */
52
+ export declare const ensureConfig: (ctor: Function, tableName: string) => WrapperEntry;
53
+ /** Get or create column configuration for a property */
54
+ export declare const ensureColumn: (entry: WrapperEntry, prop: string | symbol, columnName: string) => Column;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ensureColumn = exports.ensureConfig = exports.STORE = void 0;
4
+ const wrapper = new Map();
5
+ exports.STORE = Symbol("dynamite:values");
6
+ exports.default = wrapper;
7
+ /** Get or create wrapper entry for a constructor */
8
+ const ensureConfig = (ctor, tableName) => {
9
+ const existing = wrapper.get(ctor);
10
+ if (existing)
11
+ return existing;
12
+ const entry = { name: tableName, columns: new Map(), relations: new Map() };
13
+ wrapper.set(ctor, entry);
14
+ return entry;
15
+ };
16
+ exports.ensureConfig = ensureConfig;
17
+ /** Get or create column configuration for a property */
18
+ const ensureColumn = (entry, prop, columnName) => {
19
+ const existing = entry.columns.get(prop);
20
+ if (existing)
21
+ return existing;
22
+ const col = { name: columnName, mutate: [], validate: [] };
23
+ entry.columns.set(prop, col);
24
+ return col;
25
+ };
26
+ exports.ensureColumn = ensureColumn;
27
+ //# sourceMappingURL=wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrapper.js","sourceRoot":"","sources":["../../../src/core/wrapper.ts"],"names":[],"mappings":";;;AAkEA,MAAM,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;AACrC,QAAA,KAAK,GAAkB,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAC9D,kBAAe,OAAO,CAAC;AAEvB,oDAAoD;AAC7C,MAAM,YAAY,GAAG,CAC1B,IAAc,EACd,SAAiB,EACH,EAAE;IAChB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzB,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AATW,QAAA,YAAY,gBASvB;AAEF,wDAAwD;AACjD,MAAM,YAAY,GAAG,CAC1B,KAAmB,EACnB,IAAqB,EACrB,UAAkB,EACV,EAAE;IACV,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC3D,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC7B,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAVW,QAAA,YAAY,gBAUvB"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @file created_at.ts
3
+ * @descripcion Decorador @CreatedAt para timestamp de creación
4
+ * @autor Miguel Alejandro
5
+ * @fecha 2025-01-27
6
+ */
7
+ /** Decorador para establecer timestamp automático de creación */
8
+ export default function CreatedAt(): PropertyDecorator;
@@ -1,11 +1,9 @@
1
1
  "use strict";
2
- /*
3
- * Dinamite ORM — @CreatedAt Decorator (wrapper)
4
- * -------------------------------------------
5
- * Establece un valor por defecto con la fecha/hora actual (ISO‑string)
6
- * usando @Default.
7
- *
8
- * © 2025 Miguel Alejandro
2
+ /**
3
+ * @file created_at.ts
4
+ * @descripcion Decorador @CreatedAt para timestamp de creación
5
+ * @autor Miguel Alejandro
6
+ * @fecha 2025-01-27
9
7
  */
10
8
  var __importDefault = (this && this.__importDefault) || function (mod) {
11
9
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -13,9 +11,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
13
11
  Object.defineProperty(exports, "__esModule", { value: true });
14
12
  exports.default = CreatedAt;
15
13
  const default_1 = __importDefault(require("./default"));
16
- /**
17
- * Asigna automáticamente la fecha de creación en nuevas instancias.
18
- */
14
+ /** Decorador para establecer timestamp automático de creación */
19
15
  function CreatedAt() {
20
16
  return (0, default_1.default)(() => new Date().toISOString());
21
17
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"created_at.js","sourceRoot":"","sources":["../../../src/decorators/created_at.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;AAKH,4BAEC;AALD,wDAAgC;AAEhC,iEAAiE;AACjE,SAAwB,SAAS;IAC/B,OAAO,IAAA,iBAAO,EAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @file default.ts
3
+ * @descripcion Decorador @Default para valores por defecto
4
+ * @autor Miguel Alejandro
5
+ * @fecha 2025-01-27
6
+ */
7
+ /** Decorador para establecer valores por defecto en propiedades */
8
+ export default function Default(factory: any): PropertyDecorator;