From f6cc07880a399a5456b1b2dfe45b259c2506cc9b Mon Sep 17 00:00:00 2001 From: Juergen Kunz Date: Fri, 28 Nov 2025 11:02:39 +0000 Subject: [PATCH] fix(classes.collection): Fix closure bug in Collection decorator by defining collection getter on original constructor and prototype --- changelog.md | 6 ++++++ ts/00_commitinfo_data.ts | 2 +- ts/classes.collection.ts | 14 ++++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index 58b8735..f6b12a3 100644 --- a/changelog.md +++ b/changelog.md @@ -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 diff --git a/ts/00_commitinfo_data.ts b/ts/00_commitinfo_data.ts index 5e03fb2..308b4d9 100644 --- a/ts/00_commitinfo_data.ts +++ b/ts/00_commitinfo_data.ts @@ -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.' } diff --git a/ts/classes.collection.ts b/ts/classes.collection.ts index bd788ab..9b87d69 100644 --- a/ts/classes.collection.ts +++ b/ts/classes.collection.ts @@ -64,6 +64,20 @@ export function Collection(dbArg: SmartdataDb | TDelayed) { 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.