aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--integration/scripts/browser.js1
-rw-r--r--integration/snapshots-no-hmr/multiple-imports.js25
-rw-r--r--integration/snapshots/cjs-transform-shouldnt-have-static-imports-in-cjs-function.js4
-rw-r--r--integration/snapshots/multiple-imports.js46
-rw-r--r--integration/snippets/cjs-transform-shouldnt-have-static-imports-in-cjs-function.js2
-rw-r--r--integration/snippets/multiple-imports.js13
-rw-r--r--src/js_printer.zig26
7 files changed, 111 insertions, 6 deletions
diff --git a/integration/scripts/browser.js b/integration/scripts/browser.js
index 6ec075b11..86e342d8c 100644
--- a/integration/scripts/browser.js
+++ b/integration/scripts/browser.js
@@ -91,6 +91,7 @@ async function main() {
"/export.js",
"/type-only-imports.ts",
"/global-is-remapped-to-globalThis.js",
+ "/multiple-imports.js",
];
for (let test of tests) {
diff --git a/integration/snapshots-no-hmr/multiple-imports.js b/integration/snapshots-no-hmr/multiple-imports.js
new file mode 100644
index 000000000..7826c8765
--- /dev/null
+++ b/integration/snapshots-no-hmr/multiple-imports.js
@@ -0,0 +1,25 @@
+import {
+__require as require
+} from "http://localhost:8080/__runtime.js";
+import * as JSX from "http://localhost:8080/node_modules/react/jsx-dev-runtime.js";
+import * as $bbcd215f from "http://localhost:8080/node_modules/react/index.js";
+var JSXClassic = require($bbcd215f);
+var jsx = require(JSX).jsxDEV, fileName = "multiple-imports.js", JSXFrag = require(JSX, JSXClassic).Fragment;
+
+var { default: React} = require($bbcd215f);
+var { default: React2} = require($bbcd215f);
+const bacon = React;
+
+const bacon2 = jsx(JSXFrag, {
+ children: ["hello"]
+}, undefined, true, {
+ fileName,
+ lineNumber: 92
+}, this);
+export function test() {
+ console.assert(bacon === React);
+ console.assert(bacon === React2);
+ console.assert(typeof bacon2 !== "undefined");
+ console.assert(React.isValidElement(bacon2));
+ return testDone(import.meta.url);
+}
diff --git a/integration/snapshots/cjs-transform-shouldnt-have-static-imports-in-cjs-function.js b/integration/snapshots/cjs-transform-shouldnt-have-static-imports-in-cjs-function.js
index be7a60e6e..d8e3ccdd1 100644
--- a/integration/snapshots/cjs-transform-shouldnt-have-static-imports-in-cjs-function.js
+++ b/integration/snapshots/cjs-transform-shouldnt-have-static-imports-in-cjs-function.js
@@ -5,9 +5,11 @@ import {
__cJS2eSM
} from "http://localhost:8080/__runtime.js";
import * as _login_b977_0 from "http://localhost:8080/_login.js";
+import * as _login_b977_1 from "http://localhost:8080/_login.js";
import _login from "http://localhost:8080/_login.js";
import _auth from "http://localhost:8080/_auth.js";
import * as _loginReally from "http://localhost:8080/_login.js";
+import * as _loginReally2 from "http://localhost:8080/_login.js";
import * as _authReally from "http://localhost:8080/_auth.js";
export default __cJS2eSM(function(module, exports) {
@@ -16,9 +18,11 @@ export default __cJS2eSM(function(module, exports) {
;
;
;
+ ;
module.exports.iAmCommonJs = true;
exports.YouAreCommonJS = true;
require(_login_b977_0);
+ require(_login_b977_1);
Object.defineProperty(module.exports,"login",{get: () => _login, enumerable: true, configurable: true});
var test = function test() {
return testDone(import.meta.url);
diff --git a/integration/snapshots/multiple-imports.js b/integration/snapshots/multiple-imports.js
new file mode 100644
index 000000000..048988d09
--- /dev/null
+++ b/integration/snapshots/multiple-imports.js
@@ -0,0 +1,46 @@
+import {
+__HMRClient as Bun
+} from "http://localhost:8080/__runtime.js";
+import {
+__require as require
+} from "http://localhost:8080/__runtime.js";
+import {
+__HMRModule as HMR
+} from "http://localhost:8080/__runtime.js";
+import * as JSX from "http://localhost:8080/node_modules/react/jsx-dev-runtime.js";
+import * as $bbcd215f from "http://localhost:8080/node_modules/react/index.js";
+var JSXClassic = require($bbcd215f);
+var jsx = require(JSX).jsxDEV, fileName = "multiple-imports.js", JSXFrag = require(JSX, JSXClassic).Fragment;
+
+var { default: React} = require($bbcd215f);
+var { default: React2} = require($bbcd215f);
+Bun.activate(true);
+
+var hmr = new HMR(2165509932, "multiple-imports.js"), exports = hmr.exports;
+(hmr._load = function() {
+ const bacon = React;
+ const bacon2 = jsx(JSXFrag, {
+ children: ["hello"]
+ }, undefined, true, {
+ fileName,
+ lineNumber: 92
+ }, this);
+ function test() {
+ console.assert(bacon === React);
+ console.assert(bacon === React2);
+ console.assert(typeof bacon2 !== "undefined");
+ console.assert(React.isValidElement(bacon2));
+ return testDone(import.meta.url);
+ }
+ hmr.exportAll({
+ test: () => test
+ });
+})();
+var $$hmr_test = hmr.exports.test;
+hmr._update = function(exports) {
+ $$hmr_test = exports.test;
+};
+
+export {
+ $$hmr_test as test
+};
diff --git a/integration/snippets/cjs-transform-shouldnt-have-static-imports-in-cjs-function.js b/integration/snippets/cjs-transform-shouldnt-have-static-imports-in-cjs-function.js
index 4191b7116..370b1abec 100644
--- a/integration/snippets/cjs-transform-shouldnt-have-static-imports-in-cjs-function.js
+++ b/integration/snippets/cjs-transform-shouldnt-have-static-imports-in-cjs-function.js
@@ -1,11 +1,13 @@
import _login from "./_login";
import _auth from "./_auth";
import * as _loginReally from "./_login";
+import * as _loginReally2 from "./_login";
import * as _authReally from "./_auth";
module.exports.iAmCommonJs = true;
exports.YouAreCommonJS = true;
require("./_login");
+require("./_login");
export { _login as login };
export function test() {
diff --git a/integration/snippets/multiple-imports.js b/integration/snippets/multiple-imports.js
new file mode 100644
index 000000000..320d0105e
--- /dev/null
+++ b/integration/snippets/multiple-imports.js
@@ -0,0 +1,13 @@
+import React from "react";
+import React2 from "react";
+
+const bacon = React;
+const bacon2 = <>hello</>;
+
+export function test() {
+ console.assert(bacon === React);
+ console.assert(bacon === React2);
+ console.assert(typeof bacon2 !== "undefined");
+ console.assert(React.isValidElement(bacon2));
+ return testDone(import.meta.url);
+}
diff --git a/src/js_printer.zig b/src/js_printer.zig
index 12c92f9fc..a0baf5c0e 100644
--- a/src/js_printer.zig
+++ b/src/js_printer.zig
@@ -43,6 +43,9 @@ const first_low_surrogate: u21 = 0xDC00;
const last_low_surrogate: u21 = 0xDFFF;
const assert = std.debug.assert;
+threadlocal var imported_module_ids_list: std.ArrayList(u32) = undefined;
+threadlocal var imported_module_ids_list_unset: bool = true;
+
fn notimpl() void {
Global.panic("Not implemented yet!", .{});
}
@@ -234,6 +237,7 @@ pub fn NewPrinter(
writer: Writer,
has_printed_bundled_import_statement: bool = false,
+ imported_module_ids: std.ArrayList(u32),
renamer: rename.Renamer,
prev_stmt_tag: Stmt.Tag = .s_empty,
@@ -2943,12 +2947,14 @@ pub fn NewPrinter(
const module_id = record.module_id;
- p.print("import * as ");
- p.printModuleId(module_id);
-
- p.print(" from \"");
- p.print(record.path.text);
- p.print("\";\n");
+ if (std.mem.indexOfScalar(u32, p.imported_module_ids.items, module_id) == null) {
+ p.print("import * as ");
+ p.printModuleId(module_id);
+ p.print(" from \"");
+ p.print(record.path.text);
+ p.print("\";\n");
+ try p.imported_module_ids.append(module_id);
+ }
if (record.contains_import_star) {
p.print("var ");
@@ -3761,12 +3767,20 @@ pub fn NewPrinter(
opts: Options,
linker: ?*Linker,
) !Printer {
+ if (imported_module_ids_list_unset) {
+ imported_module_ids_list = std.ArrayList(u32).init(default_allocator);
+ imported_module_ids_list_unset = false;
+ }
+
+ imported_module_ids_list.clearRetainingCapacity();
+
return Printer{
.import_records = tree.import_records,
.options = opts,
.symbols = symbols,
.writer = writer,
.linker = linker,
+ .imported_module_ids = imported_module_ids_list,
.renamer = rename.Renamer.init(symbols, source),
};
}