[BOOT] Not possible to import ESM project files
Describe the bug
There is a problem bootstrapping applications created in the ESM format.
When loopback tries to load all project files (controllers, models, services, etc), it uses utility function loadClassesFromFiles from packages/boot/src/booters/booter-utils.ts which is using CommonJs require() to import projects files. CommonJs cannot require ESM files, only by dynamic importing them using import().
As a result, the similar error appears on startup:
Logs
No response
Additional information
The issue is reproduced in the ToDo example:
- Clone repo, install deps.
- Navigate to
examples/todo. - Run with
npm start
Reproduction
https://github.com/alexbal7/loopback-next/tree/fix/esm-files-import
Since loopback supports Node 18+ I believe bootstrap logic can be changed to support dynamic imports. If there is any concerns regarding that, please let me know. Otherwise I will put a draft PR for this change :)
Thanks for raising this! I believe there were discussions on migrating the whole LoopBack project to ESM imports. However, we have not gotten around to doing it.
If the PR is backwards-compatible with CommonJS-like imports, then we'd be happy to review it.