fix(classes.collection): Fix closure bug in Collection decorator by defining collection getter on original constructor and prototype

This commit is contained in:
2025-11-28 11:02:39 +00:00
parent bf4b11f1f5
commit f6cc07880a
3 changed files with 21 additions and 1 deletions

View File

@@ -1,5 +1,11 @@
# Changelog
## 2025-11-28 - 7.0.9 - fix(classes.collection)
Fix closure bug in Collection decorator by defining collection getter on original constructor and prototype
- Define the collection getter on the original constructor so class-level references (e.g. `User.collection`) resolve to the decorated collection instead of the original constructor's closure value.
- Also define the getter on the original constructor's prototype to ensure instance access works consistently across runtimes (Deno/Node).
## 2025-11-28 - 7.0.8 - fix(classes.collection)
Fix closure issue in managed decorator so Class.collection/instance.collection resolve correctly

View File

@@ -3,6 +3,6 @@
*/
export const commitinfo = {
name: '@push.rocks/smartdata',
version: '7.0.8',
version: '7.0.9',
description: 'An advanced library for NoSQL data organization and manipulation using TypeScript with support for MongoDB, data validation, collections, and custom data types.'
}

View File

@@ -64,6 +64,20 @@ export function Collection(dbArg: SmartdataDb | TDelayed<SmartdataDb>) {
configurable: true
});
// Closure fix: When class methods reference the class name (e.g., `User.collection`),
// they get the original constructor via closure, not the decorated class.
// Define collection getter on the original constructor.
Object.defineProperty(constructor, 'collection', {
get: getCollection,
enumerable: false,
configurable: true
});
Object.defineProperty(constructor.prototype, 'collection', {
get: getCollection,
enumerable: false,
configurable: true
});
// Deno compatibility note: Property decorators set properties on the prototype.
// Since we removed instance property declarations from SmartDataDbDoc,
// the decorator-set prototype properties are now accessible without shadowing.