loopback-next icon indicating copy to clipboard operation
loopback-next copied to clipboard

[BOOT] Not possible to import ESM project files

Open alexbaluhin opened this issue 1 year ago • 2 comments

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:

image

Logs

No response

Additional information

The issue is reproduced in the ToDo example:

  1. Clone repo, install deps.
  2. Navigate to examples/todo.
  3. Run with npm start

Reproduction

https://github.com/alexbal7/loopback-next/tree/fix/esm-files-import

alexbaluhin avatar Feb 01 '24 11:02 alexbaluhin

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 :)

alexbaluhin avatar Feb 01 '24 11:02 alexbaluhin

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.

achrinza avatar Feb 20 '24 07:02 achrinza