Repository navigation
Using node:test with Custom ESM Loaders #46292
Description
Activity
- addedfeature requestIssues requesting new Node.js features.Issues requesting new Node.js features.
on Jan 20, 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_OPTIONSenv variable, which is then used bynode --testwhen loading sub-files.But I guess what you meant was asking for a solution to provide custom file extensions / file name patterns for
--testCLI 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.Reacted by Jarek RenczReacted by Toni Villena, Steven and Thomas.GThanks for the concise and helpful
findTestFilesworkaround 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:testrunner. As it is now, I'm excited to have a builtin test system, file watcher, and custom loaders!- addedtest_runnerIssues and PRs related to the test runner subsystem.Issues and PRs related to the test runner subsystem.
on Jan 24, 2023 Ideally I would love if the test runner can support a glob expression, that will require glob support in core
- linked a pull request that will close this issuetest_runner: support passing globs #47653
on May 15, 2023
What is the problem this feature will solve?
The builtin
node:testfunctionality does not accommodate Custom ESM Loaders for specifying tests. The documented test-runner-execution-mode only matches.js | .cjs | .mjsextension 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.