fix(ext/node): add missing _preloadModules hook (#18447)

This internal node hook is used by libraries such as `ts-node` when used
as a require hook `node -r ts-node/register`. That combination is often
used with test frameworks like `mocha` or `jasmine`.

We had a reference to `Module._preloadModules` in our code, but the
implementation was missing. While fixing this I also noticed that the
`fakeParent` module that we create internally always threw because of
the `pathDirname` check on the module id in the constructor of `Mdoule`.
So this code path was probably broken for a while.

```txt
✖ ERROR: Error: Empty filepath.
    at pathDirname (ext:deno_node/01_require.js:245:11)
    at new Module (ext:deno_node/01_require.js:446:15)
    at Function.Module._resolveFilename (ext:deno_node/01_require.js:754:28)
    at Function.resolve (ext:deno_node/01_require.js:1015:19)
```
This commit is contained in:
Marvin Hagemeister 2023-03-27 21:54:22 +02:00 committed by GitHub
parent 101abf3541
commit 8c051dbd1a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 40 additions and 5 deletions

View file

@ -0,0 +1,14 @@
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
import { Module } from "node:module";
import { assertStrictEquals } from "../../../test_util/std/testing/asserts.ts";
Deno.test("[node/module _preloadModules] has internal require hook", () => {
// Check if it's there
// deno-lint-ignore no-explicit-any
(Module as any)._preloadModules([
"./cli/tests/unit_node/testdata/add_global_property.js",
]);
// deno-lint-ignore no-explicit-any
assertStrictEquals((globalThis as any).foo, "Hello");
});