diff options
author | 2023-05-16 11:49:35 -0400 | |
---|---|---|
committer | 2023-05-16 08:49:35 -0700 | |
commit | c842f5bfe30842377a89ef91f610b523469447aa (patch) | |
tree | 6de82519dfe8ad68dc2c3311e107240ab7209b16 | |
parent | fe74c948cd3691295e2a7a8c8f6fa4229583c9ba (diff) | |
download | bun-c842f5bfe30842377a89ef91f610b523469447aa.tar.gz bun-c842f5bfe30842377a89ef91f610b523469447aa.tar.zst bun-c842f5bfe30842377a89ef91f610b523469447aa.zip |
Fix running commonjs modules as entry point (#2885)
* fix cjs run issue
* use a primordial
* fix behavior
* fix it again
* fix tste
-rw-r--r-- | src/bundler/entry_points.zig | 8 | ||||
-rw-r--r-- | test/cli/run/run-cjs.test.ts | 60 |
2 files changed, 64 insertions, 4 deletions
diff --git a/src/bundler/entry_points.zig b/src/bundler/entry_points.zig index b8414a9a5..ff0b79834 100644 --- a/src/bundler/entry_points.zig +++ b/src/bundler/entry_points.zig @@ -190,9 +190,9 @@ pub const ServerEntryPoint = struct { \\export * from '{s}{s}'; \\var entryNamespace = start; \\var cjs = start?.default; - \\if (cjs && typeof cjs === 'function' && cjsSymbol in cjs) {{ + \\if (cjs && cjsSymbol in cjs) {{ \\ // if you module.exports = (class {{}}), don't call it - \\ entryNamespace = ("prototype" in cjs) ? cjs : cjs(); + \\ entryNamespace = import.meta.primordials.isCallable(cjs) ? cjs() : cjs; \\}} \\if (typeof entryNamespace?.then === 'function') {{ \\ entryNamespace = entryNamespace.then((entryNamespace) => {{ @@ -233,9 +233,9 @@ pub const ServerEntryPoint = struct { \\export * from '{s}{s}'; \\var entryNamespace = start; \\var cjs = start?.default; - \\if (cjs && typeof cjs === 'function' && cjsSymbol in cjs) {{ + \\if (cjs && cjsSymbol in cjs) {{ \\ // if you module.exports = (class {{}}), don't call it - \\ entryNamespace = ("prototype" in cjs) ? cjs : cjs(); + \\ entryNamespace = import.meta.primordials.isCallable(cjs) ? cjs() : cjs; \\}} \\if (typeof entryNamespace?.then === 'function') {{ \\ entryNamespace = entryNamespace.then((entryNamespace) => {{ diff --git a/test/cli/run/run-cjs.test.ts b/test/cli/run/run-cjs.test.ts new file mode 100644 index 000000000..935cbe452 --- /dev/null +++ b/test/cli/run/run-cjs.test.ts @@ -0,0 +1,60 @@ +import { expect, test } from "bun:test"; +import { mkdirSync, realpathSync } from "fs"; +import { bunEnv, bunExe } from "harness"; +import { tmpdir } from "os"; +import { join } from "path"; + +test("running a commonjs module works", async () => { + const dir = join(realpathSync(tmpdir()), "bun-run-test1"); + mkdirSync(dir, { recursive: true }); + await Bun.write(join(dir, "index1.js"), "module.exports = 1; console.log('hello world');"); + let { stdout } = Bun.spawnSync({ + cmd: [bunExe(), join(dir, "index1.js")], + cwd: dir, + env: bunEnv, + }); + expect(stdout.toString("utf8")).toEqual("hello world\n"); +}); + +test("running with Symbol.for(CommonJS)", async () => { + const dir = join(realpathSync(tmpdir()), "bun-run-test2"); + mkdirSync(dir, { recursive: true }); + await Bun.write( + join(dir, "index1.js"), + `// @bun +const fn = () => console.log('hello world'); +fn[Symbol.for("CommonJS")] = true; +export default fn; +`, + ); + let { stdout } = Bun.spawnSync({ + cmd: [bunExe(), join(dir, "index1.js")], + cwd: dir, + env: bunEnv, + }); + expect(stdout.toString("utf8")).toEqual("hello world\n"); +}); + + +test("not running with export default class", async () => { + const dir = join(realpathSync(tmpdir()), "bun-run-test2"); + mkdirSync(dir, { recursive: true }); + await Bun.write( + join(dir, "index1.js"), + `// @bun +class Foo { + constructor() { + console.log('hello world'); + } +}; +Foo[Symbol.for("CommonJS")] = true; +export default Foo +`, + ); + let { stdout } = Bun.spawnSync({ + cmd: [bunExe(), join(dir, "index1.js")], + cwd: dir, + env: bunEnv, + }); + expect(stdout.toString("utf8")).toEqual(""); +}); |