GithubHelp home page GithubHelp logo

Comments (4)

aduth avatar aduth commented on June 21, 2024

Another related effect of this is that MSW doesn't intercept correctly when using named ES module exports from the relevant default Node modules.

Example:

// Not intercepted:
import { get } from 'node:https';

get('https://example.com', (response) => { /* ... */ });
// Intercepted as expected:
import https from 'node:https';

https.get('https://example.com', (response) => { /* ... */ });

from msw.

kettanaito avatar kettanaito commented on June 21, 2024

Hi, @mickdekkers. Thanks for reporting this!

Alas, this is a technical limitation, and to my best knowledge we cannot solve it. When you import something as a wildcard import * as X from Y, JavaScript creates a special object called Y in that module's scope. The properties of that object are readonly and their reassignment seems to be protected even on runtime.

This code throws:

import * as http from 'http'

http.get = () => {}

This code doesn't:

import http from 'http'

http.get = () => {}

The same goes for named exports mentioned by @aduth. Reassigning the named export is not possible because it's a local variable created in that module's scope upon importing. You cannot reassign those:

import { get } from 'http'

get = () => {} // Error

I don't think it's possible to support these two use cases. If it's the code you control, I recommend importing the native Node.js modules using the default export. If it's the code you don't own, neither of us can do much about it.

from msw.

kettanaito avatar kettanaito commented on June 21, 2024

For the third-party code, I believe import * as http from 'http' is an incorrect way to import built-in Node.js modules. You can consider raising a pull request to that library's repo and see if they would agree on that.

from msw.

aduth avatar aduth commented on June 21, 2024

I wonder if the new Node module loader hooks could be an option here to override how the HTTP modules are resolved?

https://nodejs.org/api/module.html#hooks

Granted:

  • It may add some complexity for how hooks are registered
  • May be additional overhead to manage both ESM and CommonJS
  • Hooks are “release candidate” but still not fully stable

from msw.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.