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