(config)
| 329 | export default Container |
| 330 | |
| 331 | async function createHelpers(config) { |
| 332 | const helpers = {} |
| 333 | for (let helperName in config) { |
| 334 | try { |
| 335 | let HelperClass |
| 336 | |
| 337 | // Check if helper class was stored in config during ESM import processing |
| 338 | if (config[helperName]._helperClass) { |
| 339 | HelperClass = config[helperName]._helperClass |
| 340 | debug(`helper ${helperName} loaded from ESM import`) |
| 341 | } |
| 342 | |
| 343 | // ESM import (legacy check) |
| 344 | if (!HelperClass && typeof helperName === 'function' && helperName.prototype) { |
| 345 | HelperClass = helperName |
| 346 | helperName = HelperClass.constructor.name |
| 347 | } |
| 348 | |
| 349 | // classical require - may be async for ESM modules |
| 350 | if (!HelperClass) { |
| 351 | const helperResult = requireHelperFromModule(helperName, config) |
| 352 | if (helperResult instanceof Promise) { |
| 353 | // Handle async ESM loading - create placeholder |
| 354 | helpers[helperName] = {} |
| 355 | asyncHelperPromise = asyncHelperPromise |
| 356 | .then(() => helperResult) |
| 357 | .then(async ResolvedHelperClass => { |
| 358 | debug(`helper ${helperName} resolved type: ${typeof ResolvedHelperClass}`, ResolvedHelperClass) |
| 359 | |
| 360 | // Extract default export from ESM module wrapper if needed |
| 361 | if (ResolvedHelperClass && ResolvedHelperClass.__esModule && ResolvedHelperClass.default) { |
| 362 | ResolvedHelperClass = ResolvedHelperClass.default |
| 363 | debug(`extracted default export for ${helperName}, new type: ${typeof ResolvedHelperClass}`) |
| 364 | } |
| 365 | |
| 366 | if (typeof ResolvedHelperClass !== 'function') { |
| 367 | throw new Error(`Helper '${helperName}' is not a class. Got: ${typeof ResolvedHelperClass}`) |
| 368 | } |
| 369 | |
| 370 | checkHelperRequirements(ResolvedHelperClass) |
| 371 | helpers[helperName] = new ResolvedHelperClass(config[helperName]) |
| 372 | debug(`helper ${helperName} async loaded`) |
| 373 | }) |
| 374 | continue |
| 375 | } else { |
| 376 | HelperClass = helperResult |
| 377 | } |
| 378 | } |
| 379 | |
| 380 | // handle async CJS modules that use dynamic import |
| 381 | if (isAsyncFunction(HelperClass)) { |
| 382 | helpers[helperName] = {} |
| 383 | |
| 384 | asyncHelperPromise = asyncHelperPromise |
| 385 | .then(() => HelperClass()) |
| 386 | .then(ResolvedHelperClass => { |
| 387 | // Check if ResolvedHelperClass is a constructor function |
| 388 | if (typeof ResolvedHelperClass?.constructor !== 'function') { |
no test coverage detected