jsdom-worker icon indicating copy to clipboard operation
jsdom-worker copied to clipboard

Support import and require

Open theahura opened this issue 2 years ago • 3 comments

I'm using jsdom-worker to support third party libs that use service workers in a jest runtime. The third party lib uses require all over the place, which causes issues when jest is otherwise configured as a module (i.e. using import). One way to solve this is to polyfill require -- for example, https://stackoverflow.com/a/71883023/3269537

import { createRequire } from "module";
const require = createRequire(import.meta.url);

It would be really convenient if jsdom-worker supported both require and import, so that it is agnostic to what code is actually being loaded. Can we simply inject the above here: https://github.com/developit/jsdom-worker/blob/main/src/index.js#L129? Happy to send out a pr that tries this

theahura avatar May 12 '23 17:05 theahura

Update: gave this a shot, ran into some issues. Because this library uses the Function object constructor to generate the code from string, it's using CommonJS regardless of what runtime you're actually configuring. This means that import * as foo from 'foo' as well as require(foo) don't work

theahura avatar May 13 '23 00:05 theahura

You can create a require function with the following in common.js:

const createRequire = import('module').createRequire; const require = createRequire(__filename);

theahura avatar May 13 '23 01:05 theahura

Still couldn't quite get this working, left the trail here: https://stackoverflow.com/questions/76240658/use-require-or-import-instead-exec-or-the-function-constructor

theahura avatar May 17 '23 20:05 theahura