From fb5d4a882ee6b41828ea03698880dcce1964ba98 Mon Sep 17 00:00:00 2001
From: Braden Shepherdson <braden@metabase.com>
Date: Wed, 1 Mar 2023 08:26:21 -0500
Subject: [PATCH] Fix exclusion of CLJS devtools from release builds

The new approach uses a dev-mode-only CLJC reader conditional
`#?(:cljs-dev ...)` to make `metabase.util.devtools` empty
except in dev builds.

The previous approach for this relied on dead code elimination.
But DCE relies on tracing function calls and `:require`s from the
`:entries` list in shadow-cljs.edn. Top-level namespace code is
handled differently; in particular a namespace listed in `:entries`
like `metabase.util.devtools` will always have its top-level code
in the build.
---
 shadow-cljs.edn                 |  4 +++-
 src/metabase/util/devtools.cljc | 15 +++++++++++++++
 src/metabase/util/devtools.cljs | 11 -----------
 3 files changed, 18 insertions(+), 12 deletions(-)
 create mode 100644 src/metabase/util/devtools.cljc
 delete mode 100644 src/metabase/util/devtools.cljs

diff --git a/shadow-cljs.edn b/shadow-cljs.edn
index fffe8512e68..03be358861f 100644
--- a/shadow-cljs.edn
+++ b/shadow-cljs.edn
@@ -11,7 +11,9 @@
  {:app
   {:target     :npm-module
    :output-dir "frontend/src/cljs_release/"
-   :dev        {:output-dir "frontend/src/cljs/"}
+   :dev        {:output-dir "frontend/src/cljs/"
+                :compiler-options {:reader-features #{:cljs-dev}}}
+   :compiler-options {:reader-features #{:cljs-release}}
    :entries    [metabase.domain-entities.queries.util
                 metabase.mbql.js
                 metabase.types
diff --git a/src/metabase/util/devtools.cljc b/src/metabase/util/devtools.cljc
new file mode 100644
index 00000000000..3c0d8e45adc
--- /dev/null
+++ b/src/metabase/util/devtools.cljc
@@ -0,0 +1,15 @@
+(ns metabase.util.devtools
+  "Preload magic to load cljs-devtools. Only imported by dev.js in dev mode; no-op in production."
+  ;; This special context is defined only for dev-mode shadow-cljs builds; see shadow-cljs.edn
+  ;; In release builds, and JVM Clojure, this file is an empty namespace.
+  #?(:cljs-dev (:require
+                 [devtools.core :as devtools])))
+
+#?(:cljs-dev
+   (do
+     ;; The advanced mode check is busted, it always assumes Webpack is advanced.
+     ;; The reader conditionals empty this file in release builds, plus it's only required
+     ;; from frontend/src/metabase/dev.js, which is replaced with dev-noop.js in release mode.
+     (devtools/set-pref! :disable-advanced-mode-check true)
+     (devtools/install!)
+     (js/console.log "CLJS Devtools loaded")))
diff --git a/src/metabase/util/devtools.cljs b/src/metabase/util/devtools.cljs
deleted file mode 100644
index cde2dd01b0d..00000000000
--- a/src/metabase/util/devtools.cljs
+++ /dev/null
@@ -1,11 +0,0 @@
-(ns metabase.util.devtools
-  "Preload magic to load cljs-devtools. Only imported by dev.js in dev mode; no-op in production."
-  (:require
-   [devtools.core :as devtools]))
-
-;; The advanced mode check is busted, it always assumes Webpack is advanced.
-;; This entire file is skipped for release builds; it's only required from frontend/src/metabase/dev.js
-(devtools/set-pref! :disable-advanced-mode-check true)
-(devtools/install!)
-
-(js/console.log "CLJS Devtools loaded")
-- 
GitLab