Skip to content

Using node:test with Custom ESM Loaders #46292

Description

@shanewholloway

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.

Activity

  1. aduh95 commented on Jan 21, 2023

    @aduh95
    Contributor

    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.

  2. shanewholloway commented on Jan 23, 2023

    @shanewholloway
    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!

  3. added
    test_runnerIssues and PRs related to the test runner subsystem.
    on Jan 24, 2023
  4. MoLow commented on Jan 24, 2023

    @MoLow
    Member

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

  5. linked a pull request that will close this issuetest_runner: support passing globs #47653on May 15, 2023
  6. robcresswell commented on Jul 1, 2023

    @robcresswell

    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

Metadata

Metadata

Assignees

No one assigned

    Labels

    feature requestIssues requesting new Node.js features.test_runnerIssues and PRs related to the test runner subsystem.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions