@arcaelas/dynamite 1.0.10 → 1.0.14
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 +1165 -152
- package/package.json +8 -10
- package/SECURITY.md +0 -41
- package/build/__tests__/crud.spec.d.ts +0 -7
- package/build/__tests__/crud.spec.js +0 -287
- package/build/__tests__/crud.spec.js.map +0 -1
- package/build/__tests__/debug-decorators.spec.d.ts +0 -7
- package/build/__tests__/debug-decorators.spec.js +0 -143
- package/build/__tests__/debug-decorators.spec.js.map +0 -1
- package/build/__tests__/decorators.spec.d.ts +0 -7
- package/build/__tests__/decorators.spec.js +0 -203
- package/build/__tests__/decorators.spec.js.map +0 -1
- package/build/__tests__/instance-crud.spec.d.ts +0 -7
- package/build/__tests__/instance-crud.spec.js +0 -184
- package/build/__tests__/instance-crud.spec.js.map +0 -1
- package/build/src/core/client.d.ts +0 -65
- package/build/src/core/client.js +0 -152
- package/build/src/core/client.js.map +0 -1
- package/build/src/core/table.d.ts +0 -164
- package/build/src/core/table.js +0 -406
- package/build/src/core/table.js.map +0 -1
- package/build/src/core/wrapper.d.ts +0 -54
- package/build/src/core/wrapper.js +0 -27
- package/build/src/core/wrapper.js.map +0 -1
- package/build/src/decorators/created_at.d.ts +0 -8
- package/build/src/decorators/created_at.js +0 -18
- package/build/src/decorators/created_at.js.map +0 -1
- package/build/src/decorators/default.d.ts +0 -8
- package/build/src/decorators/default.js +0 -57
- package/build/src/decorators/default.js.map +0 -1
- package/build/src/decorators/index.d.ts +0 -8
- package/build/src/decorators/index.js +0 -26
- package/build/src/decorators/index.js.map +0 -1
- package/build/src/decorators/index_sort.d.ts +0 -8
- package/build/src/decorators/index_sort.js +0 -30
- package/build/src/decorators/index_sort.js.map +0 -1
- package/build/src/decorators/mutate.d.ts +0 -9
- package/build/src/decorators/mutate.js +0 -60
- package/build/src/decorators/mutate.js.map +0 -1
- package/build/src/decorators/name.d.ts +0 -8
- package/build/src/decorators/name.js +0 -42
- package/build/src/decorators/name.js.map +0 -1
- package/build/src/decorators/not_null.d.ts +0 -8
- package/build/src/decorators/not_null.js +0 -20
- package/build/src/decorators/not_null.js.map +0 -1
- package/build/src/decorators/primary_key.d.ts +0 -8
- package/build/src/decorators/primary_key.js +0 -26
- package/build/src/decorators/primary_key.js.map +0 -1
- package/build/src/decorators/updated_at.d.ts +0 -8
- package/build/src/decorators/updated_at.js +0 -18
- package/build/src/decorators/updated_at.js.map +0 -1
- package/build/src/decorators/validate.d.ts +0 -8
- package/build/src/decorators/validate.js +0 -60
- package/build/src/decorators/validate.js.map +0 -1
- package/build/src/index.d.ts +0 -13
- package/build/src/index.js +0 -38
- package/build/src/index.js.map +0 -1
- package/build/src/utils/batch-relations.d.ts +0 -14
- package/build/src/utils/batch-relations.js +0 -130
- package/build/src/utils/batch-relations.js.map +0 -1
- package/build/src/utils/naming.d.ts +0 -8
- package/build/src/utils/naming.js +0 -18
- package/build/src/utils/naming.js.map +0 -1
- package/build/src/utils/projection.d.ts +0 -12
- package/build/src/utils/projection.js +0 -50
- package/build/src/utils/projection.js.map +0 -1
- package/build/src/utils/relations.d.ts +0 -23
- package/build/src/utils/relations.js +0 -205
- package/build/src/utils/relations.js.map +0 -1
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* @file batch-relations.ts
|
|
4
|
-
* @description Optimized batch loading for relations
|
|
5
|
-
* @autor Miguel Alejandro
|
|
6
|
-
* @fecha 2025-01-27
|
|
7
|
-
*/
|
|
8
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.cleanupRelationCache = exports.processIncludesBatch = exports.batchLoadBelongsTo = exports.batchLoadHasMany = void 0;
|
|
10
|
-
/** Cache multi-nivel con TTL */
|
|
11
|
-
const relCache = new Map();
|
|
12
|
-
/** Batch loader para hasMany relations */
|
|
13
|
-
const batchLoadHasMany = async (Model, parentItems, relation) => {
|
|
14
|
-
const { targetModel, foreignKey, localKey } = relation;
|
|
15
|
-
const TargetModel = targetModel();
|
|
16
|
-
// Agrupar claves para batch query
|
|
17
|
-
const parentKeys = parentItems.map((item) => item[localKey]).filter(Boolean);
|
|
18
|
-
if (!parentKeys.length)
|
|
19
|
-
return new Map();
|
|
20
|
-
// Single query con 'in' operator
|
|
21
|
-
const relatedItems = await TargetModel.where({
|
|
22
|
-
[foreignKey]: { in: parentKeys },
|
|
23
|
-
});
|
|
24
|
-
// Group by foreign key
|
|
25
|
-
const grouped = new Map();
|
|
26
|
-
relatedItems.forEach((item) => {
|
|
27
|
-
const key = item[foreignKey];
|
|
28
|
-
if (!grouped.has(key))
|
|
29
|
-
grouped.set(key, []);
|
|
30
|
-
grouped.get(key).push(item);
|
|
31
|
-
});
|
|
32
|
-
return grouped;
|
|
33
|
-
};
|
|
34
|
-
exports.batchLoadHasMany = batchLoadHasMany;
|
|
35
|
-
/** Batch loader para belongsTo relations con cache */
|
|
36
|
-
const batchLoadBelongsTo = async (Model, parentItems, relation) => {
|
|
37
|
-
const { targetModel, localKey, foreignKey } = relation;
|
|
38
|
-
const TargetModel = targetModel();
|
|
39
|
-
const cacheKey = `${TargetModel.name}_belongsTo`;
|
|
40
|
-
// Verificar cache existente
|
|
41
|
-
const cache = relCache.get(cacheKey) || new Map();
|
|
42
|
-
relCache.set(cacheKey, cache);
|
|
43
|
-
const now = Date.now();
|
|
44
|
-
// Separar keys en cache vs no-cache
|
|
45
|
-
const keysToFetch = [];
|
|
46
|
-
const cachedResults = new Map();
|
|
47
|
-
parentItems.forEach((item) => {
|
|
48
|
-
const key = item[localKey];
|
|
49
|
-
if (!key)
|
|
50
|
-
return;
|
|
51
|
-
const cached = cache.get(key);
|
|
52
|
-
if (cached && cached.expires > now) {
|
|
53
|
-
cachedResults.set(key, cached.data);
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
keysToFetch.push(key);
|
|
57
|
-
}
|
|
58
|
-
});
|
|
59
|
-
// Fetch missing items
|
|
60
|
-
if (keysToFetch.length) {
|
|
61
|
-
const fetchedItems = await TargetModel.where({
|
|
62
|
-
[foreignKey]: { in: keysToFetch },
|
|
63
|
-
});
|
|
64
|
-
// Update cache (5min TTL)
|
|
65
|
-
const expires = now + 300000;
|
|
66
|
-
fetchedItems.forEach((item) => {
|
|
67
|
-
const key = item[foreignKey];
|
|
68
|
-
cache.set(key, { data: item, expires });
|
|
69
|
-
cachedResults.set(key, item);
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
return cachedResults;
|
|
73
|
-
};
|
|
74
|
-
exports.batchLoadBelongsTo = batchLoadBelongsTo;
|
|
75
|
-
/** Optimized processIncludes con batch loading */
|
|
76
|
-
const processIncludesBatch = async (Model, items, include, depth = 0) => {
|
|
77
|
-
if (!include || depth > 10 || !items.length)
|
|
78
|
-
return items;
|
|
79
|
-
const meta = Model.getMeta();
|
|
80
|
-
// Process all relations in parallel
|
|
81
|
-
const relationPromises = Object.entries(include).map(async ([relationKey, relationOptions]) => {
|
|
82
|
-
const relation = meta.relations.get(relationKey);
|
|
83
|
-
if (!relation)
|
|
84
|
-
return;
|
|
85
|
-
let relatedData;
|
|
86
|
-
// Use batch loading based on relation type
|
|
87
|
-
if (relation.type === "hasMany") {
|
|
88
|
-
relatedData = await (0, exports.batchLoadHasMany)(Model, items, relation);
|
|
89
|
-
}
|
|
90
|
-
else {
|
|
91
|
-
relatedData = await (0, exports.batchLoadBelongsTo)(Model, items, relation);
|
|
92
|
-
}
|
|
93
|
-
// Assign relations to items
|
|
94
|
-
items.forEach((item) => {
|
|
95
|
-
const key = item[relation.localKey];
|
|
96
|
-
const related = relatedData.get(key);
|
|
97
|
-
if (relation.type === "hasMany") {
|
|
98
|
-
item[relationKey] = related || [];
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
item[relationKey] = related || null;
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
// Recursive processing for nested includes
|
|
105
|
-
if (relationOptions?.include && relatedData.size) {
|
|
106
|
-
const allRelated = Array.from(relatedData.values()).flat();
|
|
107
|
-
const TargetModel = relation.targetModel();
|
|
108
|
-
await (0, exports.processIncludesBatch)(TargetModel, allRelated, relationOptions.include, depth + 1);
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
await Promise.all(relationPromises);
|
|
112
|
-
return items;
|
|
113
|
-
};
|
|
114
|
-
exports.processIncludesBatch = processIncludesBatch;
|
|
115
|
-
/** Clear expired cache entries */
|
|
116
|
-
const cleanupRelationCache = () => {
|
|
117
|
-
const now = Date.now();
|
|
118
|
-
relCache.forEach((cache, modelKey) => {
|
|
119
|
-
cache.forEach((entry, key) => {
|
|
120
|
-
if (entry.expires <= now)
|
|
121
|
-
cache.delete(key);
|
|
122
|
-
});
|
|
123
|
-
if (cache.size === 0)
|
|
124
|
-
relCache.delete(modelKey);
|
|
125
|
-
});
|
|
126
|
-
};
|
|
127
|
-
exports.cleanupRelationCache = cleanupRelationCache;
|
|
128
|
-
// Auto cleanup every 5 minutes
|
|
129
|
-
setInterval(exports.cleanupRelationCache, 300000);
|
|
130
|
-
//# sourceMappingURL=batch-relations.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"batch-relations.js","sourceRoot":"","sources":["../../../src/utils/batch-relations.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file naming.ts
|
|
3
|
-
* @descripcion Utilidades de conversión de nombres
|
|
4
|
-
* @autor Miguel Alejandro
|
|
5
|
-
* @fecha 2025-01-27
|
|
6
|
-
*/
|
|
7
|
-
/** Convierte nombre de clase a formato snake_case plural para tablas */
|
|
8
|
-
export declare function toSnakePlural(input: string): string;
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* @file naming.ts
|
|
4
|
-
* @descripcion Utilidades de conversión de nombres
|
|
5
|
-
* @autor Miguel Alejandro
|
|
6
|
-
* @fecha 2025-01-27
|
|
7
|
-
*/
|
|
8
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.toSnakePlural = toSnakePlural;
|
|
13
|
-
const pluralize_1 = __importDefault(require("pluralize"));
|
|
14
|
-
/** Convierte nombre de clase a formato snake_case plural para tablas */
|
|
15
|
-
function toSnakePlural(input) {
|
|
16
|
-
return (0, pluralize_1.default)(input.replace(/([a-z0-9])([A-Z])/g, "$1_$2").toLowerCase());
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=naming.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"naming.js","sourceRoot":"","sources":["../../../src/utils/naming.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;AAKH,sCAEC;AALD,0DAAkC;AAElC,wEAAwE;AACxE,SAAgB,aAAa,CAAC,KAAa;IACzC,OAAO,IAAA,mBAAS,EAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAC/E,CAAC"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file projection.ts
|
|
3
|
-
* @description Selective field loading and projection optimization
|
|
4
|
-
* @autor Miguel Alejandro
|
|
5
|
-
* @fecha 2025-01-27
|
|
6
|
-
*/
|
|
7
|
-
/** Build DynamoDB ProjectionExpression */
|
|
8
|
-
export declare const buildProjection: (attributes?: string[], meta?: any) => string | undefined;
|
|
9
|
-
/** Optimize attributes loading for relations */
|
|
10
|
-
export declare const optimizeRelationAttributes: (include: any, baseAttributes?: string[]) => string[];
|
|
11
|
-
/** Smart attribute selection for common patterns */
|
|
12
|
-
export declare const getSmartAttributes: (Model: any, scenario: "list" | "detail" | "minimal") => string[];
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* @file projection.ts
|
|
4
|
-
* @description Selective field loading and projection optimization
|
|
5
|
-
* @autor Miguel Alejandro
|
|
6
|
-
* @fecha 2025-01-27
|
|
7
|
-
*/
|
|
8
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.getSmartAttributes = exports.optimizeRelationAttributes = exports.buildProjection = void 0;
|
|
10
|
-
/** Build DynamoDB ProjectionExpression */
|
|
11
|
-
const buildProjection = (attributes, meta) => {
|
|
12
|
-
if (!attributes?.length || !meta)
|
|
13
|
-
return undefined;
|
|
14
|
-
// Validate attributes exist in model
|
|
15
|
-
const validAttributes = attributes.filter((attr) => meta.columns.has(attr) || meta.relations.has(attr));
|
|
16
|
-
return validAttributes.length ? validAttributes.join(", ") : undefined;
|
|
17
|
-
};
|
|
18
|
-
exports.buildProjection = buildProjection;
|
|
19
|
-
/** Optimize attributes loading for relations */
|
|
20
|
-
const optimizeRelationAttributes = (include, baseAttributes) => {
|
|
21
|
-
const attributes = new Set(baseAttributes || []);
|
|
22
|
-
// Add foreign keys needed for relations
|
|
23
|
-
Object.entries(include || {}).forEach(([relationKey, options]) => {
|
|
24
|
-
attributes.add(relationKey);
|
|
25
|
-
// Add foreign key fields
|
|
26
|
-
if (options?.foreignKey)
|
|
27
|
-
attributes.add(options.foreignKey);
|
|
28
|
-
if (options?.localKey)
|
|
29
|
-
attributes.add(options.localKey);
|
|
30
|
-
});
|
|
31
|
-
return Array.from(attributes);
|
|
32
|
-
};
|
|
33
|
-
exports.optimizeRelationAttributes = optimizeRelationAttributes;
|
|
34
|
-
/** Smart attribute selection for common patterns */
|
|
35
|
-
const getSmartAttributes = (Model, scenario) => {
|
|
36
|
-
const meta = Model.getMeta();
|
|
37
|
-
const columns = Array.from(meta.columns.keys());
|
|
38
|
-
switch (scenario) {
|
|
39
|
-
case "minimal":
|
|
40
|
-
return columns.filter((col) => meta.columns.get(col)?.isKey ||
|
|
41
|
-
["id", "name", "title", "email"].includes(col));
|
|
42
|
-
case "list":
|
|
43
|
-
return columns.filter((col) => !["description", "content", "body", "metadata"].includes(col));
|
|
44
|
-
case "detail":
|
|
45
|
-
default:
|
|
46
|
-
return columns;
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
exports.getSmartAttributes = getSmartAttributes;
|
|
50
|
-
//# sourceMappingURL=projection.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"projection.js","sourceRoot":"","sources":["../../../src/utils/projection.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,0CAA0C;AACnC,MAAM,eAAe,GAAG,CAC7B,UAAqB,EACrB,IAAU,EACU,EAAE;IACtB,IAAI,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAEnD,qCAAqC;IACrC,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,CACvC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAC7D,CAAC;IAEF,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACzE,CAAC,CAAC;AAZW,QAAA,eAAe,mBAY1B;AAEF,gDAAgD;AACzC,MAAM,0BAA0B,GAAG,CACxC,OAAY,EACZ,cAAyB,EACf,EAAE;IACZ,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;IAEjD,wCAAwC;IACxC,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,OAAO,CACnC,CAAC,CAAC,WAAW,EAAE,OAAO,CAAgB,EAAE,EAAE;QACxC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAE5B,yBAAyB;QACzB,IAAI,OAAO,EAAE,UAAU;YAAE,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC5D,IAAI,OAAO,EAAE,QAAQ;YAAE,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC,CACF,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAChC,CAAC,CAAC;AAlBW,QAAA,0BAA0B,8BAkBrC;AAEF,oDAAoD;AAC7C,MAAM,kBAAkB,GAAG,CAChC,KAAU,EACV,QAAuC,EAC7B,EAAE;IACZ,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAa,CAAC;IAE5D,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,SAAS;YACZ,OAAO,OAAO,CAAC,MAAM,CACnB,CAAC,GAAW,EAAE,EAAE,CACd,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK;gBAC5B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CACjD,CAAC;QAEJ,KAAK,MAAM;YACT,OAAO,OAAO,CAAC,MAAM,CACnB,CAAC,GAAW,EAAE,EAAE,CACd,CAAC,CAAC,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAChE,CAAC;QAEJ,KAAK,QAAQ,CAAC;QACd;YACE,OAAO,OAAO,CAAC;IACnB,CAAC;AACH,CAAC,CAAC;AAzBW,QAAA,kBAAkB,sBAyB7B"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file relations.ts
|
|
3
|
-
* @descripcion Sistema de relaciones completo ultra-conciso
|
|
4
|
-
* @autor Miguel Alejandro
|
|
5
|
-
* @fecha 2025-01-27
|
|
6
|
-
*/
|
|
7
|
-
/** Decorador @hasMany para relaciones 1:N */
|
|
8
|
-
export declare const hasMany: (targetModel: () => any, foreignKey: string, localKey?: string) => (target: any, propertyKey: string) => void;
|
|
9
|
-
/** Decorador @belongsTo para relaciones N:1 */
|
|
10
|
-
export declare const belongsTo: (targetModel: () => any, localKey: string, foreignKey?: string) => (target: any, propertyKey: string) => void;
|
|
11
|
-
/** Automatic optimized includes processing with transparent batch loading */
|
|
12
|
-
export declare const processIncludes: (Model: any, items: any[], include: any, depth?: number) => Promise<any[]>;
|
|
13
|
-
/** Clear relation cache for specific model */
|
|
14
|
-
export declare const clearRelationCache: (Model: any) => boolean;
|
|
15
|
-
/** Start the cleanup interval */
|
|
16
|
-
export declare const startCleanupInterval: () => void;
|
|
17
|
-
/** Stop the cleanup interval */
|
|
18
|
-
export declare const stopCleanupInterval: () => void;
|
|
19
|
-
/** Separar opciones de query e include */
|
|
20
|
-
export declare const separateQueryOptions: (options: any) => {
|
|
21
|
-
queryOptions: any;
|
|
22
|
-
includeOptions: any;
|
|
23
|
-
};
|
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* @file relations.ts
|
|
4
|
-
* @descripcion Sistema de relaciones completo ultra-conciso
|
|
5
|
-
* @autor Miguel Alejandro
|
|
6
|
-
* @fecha 2025-01-27
|
|
7
|
-
*/
|
|
8
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.separateQueryOptions = exports.stopCleanupInterval = exports.startCleanupInterval = exports.clearRelationCache = exports.processIncludes = exports.belongsTo = exports.hasMany = void 0;
|
|
10
|
-
const wrapper_1 = require("../core/wrapper");
|
|
11
|
-
const naming_1 = require("./naming");
|
|
12
|
-
const relCache = new Map();
|
|
13
|
-
/** Decorador @hasMany para relaciones 1:N */
|
|
14
|
-
const hasMany = (targetModel, foreignKey, localKey = "id") => (target, propertyKey) => {
|
|
15
|
-
// Registrar metadatos de relación
|
|
16
|
-
(0, wrapper_1.ensureConfig)(target.constructor, (0, naming_1.toSnakePlural)(target.constructor.name)).relations.set(propertyKey, {
|
|
17
|
-
type: "hasMany",
|
|
18
|
-
targetModel,
|
|
19
|
-
foreignKey,
|
|
20
|
-
localKey,
|
|
21
|
-
});
|
|
22
|
-
// Definir getter dinámico para la propiedad de relación
|
|
23
|
-
Object.defineProperty(target, propertyKey, {
|
|
24
|
-
get: function () {
|
|
25
|
-
// Intentar obtener datos cargados previamente
|
|
26
|
-
const cached = this[`_${propertyKey}`];
|
|
27
|
-
if (cached !== undefined)
|
|
28
|
-
return cached;
|
|
29
|
-
// Si no hay datos cargados, retornar array vacío (lazy loading no implementado aquí)
|
|
30
|
-
console.warn(`Relación ${propertyKey} no cargada. Use includes en la consulta.`);
|
|
31
|
-
return [];
|
|
32
|
-
},
|
|
33
|
-
configurable: true,
|
|
34
|
-
enumerable: false,
|
|
35
|
-
});
|
|
36
|
-
};
|
|
37
|
-
exports.hasMany = hasMany;
|
|
38
|
-
/** Decorador @belongsTo para relaciones N:1 */
|
|
39
|
-
const belongsTo = (targetModel, localKey, foreignKey = "id") => (target, propertyKey) => {
|
|
40
|
-
// Registrar metadatos de relación
|
|
41
|
-
(0, wrapper_1.ensureConfig)(target.constructor, (0, naming_1.toSnakePlural)(target.constructor.name)).relations.set(propertyKey, {
|
|
42
|
-
type: "belongsTo",
|
|
43
|
-
targetModel,
|
|
44
|
-
localKey,
|
|
45
|
-
foreignKey,
|
|
46
|
-
});
|
|
47
|
-
// Definir getter dinámico para la propiedad de relación
|
|
48
|
-
Object.defineProperty(target, propertyKey, {
|
|
49
|
-
get: function () {
|
|
50
|
-
// Intentar obtener datos cargados previamente
|
|
51
|
-
const cached = this[`_${propertyKey}`];
|
|
52
|
-
if (cached !== undefined)
|
|
53
|
-
return cached;
|
|
54
|
-
// Si no hay datos cargados, retornar null (lazy loading no implementado aquí)
|
|
55
|
-
console.warn(`Relación ${propertyKey} no cargada. Use includes en la consulta.`);
|
|
56
|
-
return null;
|
|
57
|
-
},
|
|
58
|
-
configurable: true,
|
|
59
|
-
enumerable: false,
|
|
60
|
-
});
|
|
61
|
-
};
|
|
62
|
-
exports.belongsTo = belongsTo;
|
|
63
|
-
/** Automatic batch loading for hasMany relations */
|
|
64
|
-
const batchLoadHasMany = async (Model, items, relation) => {
|
|
65
|
-
const { targetModel, foreignKey, localKey } = relation;
|
|
66
|
-
const TargetModel = targetModel();
|
|
67
|
-
const parentKeys = items.map((item) => item[localKey]).filter(Boolean);
|
|
68
|
-
if (!parentKeys.length)
|
|
69
|
-
return new Map();
|
|
70
|
-
const relatedItems = await TargetModel.where({
|
|
71
|
-
[foreignKey]: { in: parentKeys },
|
|
72
|
-
});
|
|
73
|
-
const grouped = new Map();
|
|
74
|
-
relatedItems.forEach((item) => {
|
|
75
|
-
const key = item[foreignKey];
|
|
76
|
-
if (!grouped.has(key))
|
|
77
|
-
grouped.set(key, []);
|
|
78
|
-
grouped.get(key).push(item);
|
|
79
|
-
});
|
|
80
|
-
return grouped;
|
|
81
|
-
};
|
|
82
|
-
/** Automatic batch loading for belongsTo relations with TTL cache */
|
|
83
|
-
const batchLoadBelongsTo = async (Model, items, relation) => {
|
|
84
|
-
const { targetModel, localKey, foreignKey } = relation;
|
|
85
|
-
const TargetModel = targetModel();
|
|
86
|
-
const cacheKey = `${TargetModel.name}_belongsTo`;
|
|
87
|
-
const cache = relCache.get(cacheKey) || new Map();
|
|
88
|
-
relCache.set(cacheKey, cache);
|
|
89
|
-
const now = Date.now();
|
|
90
|
-
const keysToFetch = [];
|
|
91
|
-
const cachedResults = new Map();
|
|
92
|
-
items.forEach((item) => {
|
|
93
|
-
const key = item[localKey];
|
|
94
|
-
if (!key)
|
|
95
|
-
return;
|
|
96
|
-
const cached = cache.get(key);
|
|
97
|
-
if (cached && cached.expires > now) {
|
|
98
|
-
cachedResults.set(key, cached.data);
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
keysToFetch.push(key);
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
if (keysToFetch.length) {
|
|
105
|
-
console.log("DEBUG: batchLoadBelongsTo fetching keys:", keysToFetch, "for foreignKey:", foreignKey);
|
|
106
|
-
console.log("DEBUG: TargetModel:", TargetModel.name);
|
|
107
|
-
try {
|
|
108
|
-
const fetchedItems = await TargetModel.where({
|
|
109
|
-
[foreignKey]: { in: keysToFetch },
|
|
110
|
-
});
|
|
111
|
-
console.log("DEBUG: batchLoadBelongsTo fetched items:", fetchedItems.length);
|
|
112
|
-
const expires = now + 300000;
|
|
113
|
-
fetchedItems.forEach((item) => {
|
|
114
|
-
const key = item[foreignKey];
|
|
115
|
-
cache.set(key, { data: item, expires });
|
|
116
|
-
cachedResults.set(key, item);
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
catch (error) {
|
|
120
|
-
console.error("DEBUG: batchLoadBelongsTo error:", error);
|
|
121
|
-
throw error;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
return cachedResults;
|
|
125
|
-
};
|
|
126
|
-
/** Automatic optimized includes processing with transparent batch loading */
|
|
127
|
-
const processIncludes = async (Model, items, include, depth = 0) => {
|
|
128
|
-
if (!include || depth > 10 || !items.length)
|
|
129
|
-
return items;
|
|
130
|
-
const meta = Model.getMeta();
|
|
131
|
-
// Process all relations in parallel with automatic batching
|
|
132
|
-
const relationPromises = Object.entries(include).map(async ([relationKey, relationOptions]) => {
|
|
133
|
-
const relation = meta.relations.get(relationKey);
|
|
134
|
-
if (!relation)
|
|
135
|
-
return;
|
|
136
|
-
let relatedData;
|
|
137
|
-
// Automatic batch loading based on relation type
|
|
138
|
-
if (relation.type === "hasMany") {
|
|
139
|
-
relatedData = await batchLoadHasMany(Model, items, relation);
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
relatedData = await batchLoadBelongsTo(Model, items, relation);
|
|
143
|
-
}
|
|
144
|
-
// Assign relations to items using private properties for getters
|
|
145
|
-
items.forEach((item) => {
|
|
146
|
-
const key = item[relation.localKey];
|
|
147
|
-
const related = relatedData.get(key);
|
|
148
|
-
// Almacenar en propiedad privada que el getter dinámico busca
|
|
149
|
-
item[`_${relationKey}`] =
|
|
150
|
-
relation.type === "hasMany" ? related || [] : related || null;
|
|
151
|
-
});
|
|
152
|
-
// Recursive processing for nested includes
|
|
153
|
-
if (relationOptions?.include && relatedData.size) {
|
|
154
|
-
const allRelated = Array.from(relatedData.values())
|
|
155
|
-
.flat()
|
|
156
|
-
.filter(Boolean);
|
|
157
|
-
const TargetModel = relation.targetModel();
|
|
158
|
-
await (0, exports.processIncludes)(TargetModel, allRelated, relationOptions.include, depth + 1);
|
|
159
|
-
}
|
|
160
|
-
});
|
|
161
|
-
await Promise.all(relationPromises);
|
|
162
|
-
return items;
|
|
163
|
-
};
|
|
164
|
-
exports.processIncludes = processIncludes;
|
|
165
|
-
/** Auto cleanup expired cache entries */
|
|
166
|
-
const cleanupExpiredCache = () => {
|
|
167
|
-
const now = Date.now();
|
|
168
|
-
relCache.forEach((cache, modelKey) => {
|
|
169
|
-
cache.forEach((entry, key) => {
|
|
170
|
-
if (entry.expires <= now)
|
|
171
|
-
cache.delete(key);
|
|
172
|
-
});
|
|
173
|
-
if (cache.size === 0)
|
|
174
|
-
relCache.delete(modelKey);
|
|
175
|
-
});
|
|
176
|
-
};
|
|
177
|
-
/** Clear relation cache for specific model */
|
|
178
|
-
const clearRelationCache = (Model) => relCache.delete(`${Model.name}_belongsTo`);
|
|
179
|
-
exports.clearRelationCache = clearRelationCache;
|
|
180
|
-
// Auto cleanup every 5 minutes
|
|
181
|
-
let cleanupInterval = null;
|
|
182
|
-
/** Start the cleanup interval */
|
|
183
|
-
const startCleanupInterval = () => {
|
|
184
|
-
if (!cleanupInterval) {
|
|
185
|
-
cleanupInterval = setInterval(cleanupExpiredCache, 300000);
|
|
186
|
-
}
|
|
187
|
-
};
|
|
188
|
-
exports.startCleanupInterval = startCleanupInterval;
|
|
189
|
-
/** Stop the cleanup interval */
|
|
190
|
-
const stopCleanupInterval = () => {
|
|
191
|
-
if (cleanupInterval) {
|
|
192
|
-
clearInterval(cleanupInterval);
|
|
193
|
-
cleanupInterval = null;
|
|
194
|
-
}
|
|
195
|
-
};
|
|
196
|
-
exports.stopCleanupInterval = stopCleanupInterval;
|
|
197
|
-
// Auto-start cleanup interval
|
|
198
|
-
(0, exports.startCleanupInterval)();
|
|
199
|
-
/** Separar opciones de query e include */
|
|
200
|
-
const separateQueryOptions = (options) => {
|
|
201
|
-
const { include, ...queryOptions } = options;
|
|
202
|
-
return { queryOptions, includeOptions: include };
|
|
203
|
-
};
|
|
204
|
-
exports.separateQueryOptions = separateQueryOptions;
|
|
205
|
-
//# sourceMappingURL=relations.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"relations.js","sourceRoot":"","sources":["../../../src/utils/relations.ts"],"names":[],"mappings":"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"}
|