From 384d6792aa14f077a2a63f2bd402cacc1c949d3c Mon Sep 17 00:00:00 2001
From: Evan Wallace <evan.exe@gmail.com>
Date: Sun, 7 Mar 2021 14:05:19 -0800
Subject: [PATCH] fix "+" characters in data URLs

---
 internal/bundler/bundler_loader_test.go          | 16 ++++++++++++++++
 internal/bundler/snapshots/snapshots_default.txt |  6 ++++++
 internal/resolver/dataurl.go                     |  2 +-
 3 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/internal/bundler/bundler_loader_test.go b/internal/bundler/bundler_loader_test.go
index 3f2f1de7c1..5e9bb224b7 100644
--- a/internal/bundler/bundler_loader_test.go
+++ b/internal/bundler/bundler_loader_test.go
@@ -523,6 +523,22 @@ func TestLoaderDataURLTextJavaScriptCannotImport(t *testing.T) {
 	})
 }
 
+// The "+" character must not be interpreted as a " " character
+func TestLoaderDataURLTextJavaScriptPlusCharacter(t *testing.T) {
+	default_suite.expectBundled(t, bundled{
+		files: map[string]string{
+			"/entry.js": `
+				import "data:text/javascript,console.log(1+2)";
+			`,
+		},
+		entryPaths: []string{"/entry.js"},
+		options: config.Options{
+			Mode:         config.ModeBundle,
+			AbsOutputDir: "/out",
+		},
+	})
+}
+
 func TestLoaderDataURLApplicationJSON(t *testing.T) {
 	default_suite.expectBundled(t, bundled{
 		files: map[string]string{
diff --git a/internal/bundler/snapshots/snapshots_default.txt b/internal/bundler/snapshots/snapshots_default.txt
index f5413dbfa4..49f1eb2c92 100644
--- a/internal/bundler/snapshots/snapshots_default.txt
+++ b/internal/bundler/snapshots/snapshots_default.txt
@@ -1294,6 +1294,12 @@ console.log(123);
 // <data:text/javascript;charset=UTF-8;base64,Y29uc29sZS5sb2coMjM0KQ...>
 console.log(234);
 
+================================================================================
+TestLoaderDataURLTextJavaScriptPlusCharacter
+---------- /out/entry.js ----------
+// <data:text/javascript,console.log(1+2)>
+console.log(1 + 2);
+
 ================================================================================
 TestLoaderDataURLUnknownMIME
 ---------- /out/entry.js ----------
diff --git a/internal/resolver/dataurl.go b/internal/resolver/dataurl.go
index 1e788b59ba..7b0ac80cd9 100644
--- a/internal/resolver/dataurl.go
+++ b/internal/resolver/dataurl.go
@@ -68,7 +68,7 @@ func (parsed DataURL) DecodeData() (string, error) {
 	}
 
 	// Try to read percent-escaped data
-	content, err := url.QueryUnescape(parsed.data)
+	content, err := url.PathUnescape(parsed.data)
 	if err != nil {
 		return "", fmt.Errorf("Could not decode percent-escaped data: %s", err.Error())
 	}