Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Using node:test with Custom ESM Loaders #46292

Closed
shanewholloway opened this issue Jan 20, 2023 · 4 comments
Closed

Using node:test with Custom ESM Loaders #46292

shanewholloway opened this issue Jan 20, 2023 · 4 comments
Labels
feature request Issues that request new features to be added to Node.js. test_runner Issues and PRs related to the test runner subsystem.

Comments

@shanewholloway
Copy link

What is the problem this feature will solve?

The builtin node:test functionality does not accommodate Custom ESM Loaders for specifying tests. The documented test-runner-execution-mode only matches .js | .cjs | .mjs extension files.

What is the feature you are proposing to solve the problem?

Ideally, the test-runner-execution-mode would allow for registered Custom ESM Loaders automatically. If not possible, specifying allowed file extensions via environment variable would work.

What alternatives have you considered?

Current workaround is a manual shim -- using a standard file extension and importing the Custom ESM modules from there.

@shanewholloway shanewholloway added the feature request Issues that request new features to be added to Node.js. label Jan 20, 2023
@aduh95
Copy link
Contributor

aduh95 commented Jan 21, 2023

FWIW here's the workaround I'm using on a project of mine:

// test/index.ts
import fs from "node:fs/promises";

async function* findTestFiles(url) {
  for await (const dirent of await fs.opendir(url)) {
    if (dirent.name === "node_modules" || dirent.name.startsWith(".")) continue;

    if (dirent.isDirectory())
      yield* findTestFiles(new URL(`${dirent.name}/`, url));
    else if (dirent.name.endsWith(".test.ts")) yield new URL(dirent.name, url);
  }
}

for await (const file of findTestFiles(new URL("../", import.meta.url))) {
  await import(file);
}

And I have this in my package.json:

{
  "scripts": {
    "test": "node --loader '#ts-loader' test/index.ts",
    "test-only": "node --test-only --loader '#ts-loader' test/index.ts"
  }
}

The above "just works" if you're using node:test (or any other test lib btw).

You can also specify custom loader hooks in the NODE_OPTIONS env variable, which is then used by node --test when loading sub-files.

But I guess what you meant was asking for a solution to provide custom file extensions / file name patterns for --test CLI flag, which I agree would be nice and doesn't have a solution yet. There have been discussions around adding a config file for Node.js entrypoint to specify those kind of things (file name patterns for --test, custom loader hooks, etc.) but no one is championing this AFAIK. I personally kind of wish that userland would come up with ad-hoc solutions and we would just have to pick the most popular one so we know the API is aligned with what the community needs/wants.

@shanewholloway
Copy link
Author

Thanks for the concise and helpful findTestFiles workaround code.

Yes, I'm advocating for direct support of custom loader files in the test suite. It would allow for leveraging features like parallelization in the new node:test runner. As it is now, I'm excited to have a builtin test system, file watcher, and custom loaders!

@MoLow MoLow added the test_runner Issues and PRs related to the test runner subsystem. label Jan 24, 2023
@MoLow
Copy link
Member

MoLow commented Jan 24, 2023

Ideally I would love if the test runner can support a glob expression, that will require glob support in core

@robcresswell
Copy link

robcresswell commented Jul 1, 2023

In case anyone else is following this, I think this is solved by #47653 from @MoLow as referenced above; it was somewhat difficult for me to understand because the CI seems to use some kind of magic and "closes" PRs instead of "merging" them

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature request Issues that request new features to be added to Node.js. test_runner Issues and PRs related to the test runner subsystem.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants