Fork me on GitHub
#shadow-cljs
<
2021-07-23
>
Pavel Klavík18:07:30

Hi, I am trying to get Shadow-cljs running on a computer I haven't used for a while. I have updated npm dependencies using npm install, even run npm install -g shadow-cljs, after running shadow-cljs watch client, I get the following error:

shadow-cljs - config: C:\Shared\orgpad\shadow-cljs.edn
shadow-cljs - running: lein run -m shadow.cljs.devtools.cli --npm watch client
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See  for further details.
NPM dependency "react" has installed version "^16.14.0"
"16.13.0" was required by jar:file:/C:/Users/Pavel%20Klavik/.m2/repository/reagent/reagent/0.10.0/reagent-0.10.0.jar!/deps.cljs
NPM dependency "react-dom" has installed version "^16.14.0"
"16.13.0" was required by jar:file:/C:/Users/Pavel%20Klavik/.m2/repository/reagent/reagent/0.10.0/reagent-0.10.0.jar!/deps.cljs
shadow-cljs - HTTP server available at 
shadow-cljs - HTTP server available at 
shadow-cljs - server version: 2.14.6 running at 
shadow-cljs - nREPL server started on port 9000
shadow-cljs - watching build :client
[:client] Configuring build.
[:client] Compiling ...
[:client] Build failure:
The required namespace "goog" is not available, it was required by "devtools/preload.cljs".

thheller18:07:55

weird. I'm guessing version conflict. you are using lein so check that you get the correct clojurescript, closure-compiler, closure-library versions

thheller18:07:28

the npm updates basically do nothing when using lein, so check project.clj instead

Pavel Klavík18:07:44

This is in project.clj:

[thheller/shadow-cljs "2.14.6"]
                 [org.clojure/clojurescript "1.10.866"
                  :exclusions [com.google.javascript/closure-compiler-unshaded
                               org.clojure/google-closure-library
                               org.clojure/google-closure-library-third-party]]

thheller18:07:04

run shadow-cljs clj-repl then ( "goog/base.js")

Pavel Klavík18:07:17

shadow.user=> ( "goog/base.js")
#object[java.net.URL 0x5787e5d4 "jar:file:/C:/Users/Pavel%20Klavik/.m2/repository/org/clojure/google-closure-library/0.0-20201211-3e6c510d/google-closure-library-0.0-20201211-3e6c510d.jar!/goog/base.js"]

Pavel Klavík18:07:15

tried to update to the latest version and the problem remains:

shadow-cljs - HTTP server available at 
shadow-cljs - HTTP server available at 
shadow-cljs - server version: 2.15.2 running at 
shadow-cljs - nREPL server started on port 9000
shadow-cljs - watching build :client
[:client] Configuring build.
[:client] Compiling ...
[:client] Build failure:
The required namespace "goog" is not available, it was required by "devtools/preload.cljs".

thheller18:07:53

yeah not a clue. try the above but with slurp, see if its empty or something

thheller18:07:09

that file provides goog and it appears to be there? maybe try wiping .shadow-cljs although that self wipes on versions updates so unlikely to help

Pavel Klavík18:07:52

the content slurps just fine

thheller18:07:27

try setting :log {:level :debug} in shadow-cljs.edn. maybe that logs something useful

thheller18:07:08

never seen this problem before. can't really think of anything that could cause this.

thheller18:07:44

just in case check ( "cljs/core.cljs") and ( "com/google/javascript/jscomp/Compiler.class")

thheller18:07:11

just to verify they are all the correct expected versions

Pavel Klavík18:07:28

shadow.user=> ( "cljs/core.cljs")
#object[java.net.URL 0x391d2130 "jar:file:/C:/Users/Pavel%20Klavik/.m2/repository/org/clojure/clojurescript/1.10.879/clojurescript-1.10.879.jar!/cljs/core.cljs"]
shadow.user=>  ( "com/google/javascript/jscomp/Compiler.class")
#object[java.net.URL 0x390c8c58 "jar:file:/C:/Users/Pavel%20Klavik/.m2/repository/com/google/javascript/closure-compiler-unshaded/v20210505/closure-compiler-unshaded-v20210505.jar!/com/google/javascript/jscomp/Compiler.class"]

Pavel Klavík18:07:50

C:\Shared\orgpad>shadow-cljs watch client
shadow-cljs - config: C:\Shared\orgpad\shadow-cljs.edn
shadow-cljs - socket connect failed, server process dead?
shadow-cljs - running: lein run -m shadow.cljs.devtools.cli --npm watch client
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See  for further details.
NPM dependency "react" has installed version "^16.14.0"
"16.13.0" was required by jar:file:/C:/Users/Pavel%20Klavik/.m2/repository/reagent/reagent/0.10.0/reagent-0.10.0.jar!/deps.cljs
NPM dependency "react-dom" has installed version "^16.14.0"
"16.13.0" was required by jar:file:/C:/Users/Pavel%20Klavik/.m2/repository/reagent/reagent/0.10.0/reagent-0.10.0.jar!/deps.cljs
[2021-07-23 20:29:33.876 - FINE] :shadow.cljs.devtools.server/clj-check - {:cli-pid "4900"}
[2021-07-23 20:29:34.274 - FINE] :shadow.cljs.devtools.server.nrepl/config - {:port 9000}
[2021-07-23 20:29:34.597 - FINE] :shadow.remote.relay.local/client-hello - {:client-id 1, :client-info {:connection-info {}, :since #inst "2021-07-23T18:29:34.588-00:00", :type :runtime, :lang :clj, :desc "JVM Clojure Runtime"}}
shadow-cljs - HTTP server available at 
[2021-07-23 20:29:34.617 - FINE] :shadow.cljs.devtools.server.dev-http/http-serve - {:handler-state {:mime-mappings #object[io.undertow.util.MimeMappings 0x2d7166ee "io.undertow.util.MimeMappings@2d7166ee"], :managers [#object[io.undertow.server.handlers.resource.ClassPathResourceManager 0xfcc8351 "io.undertow.server.handlers.resource.ClassPathResourceManager@fcc8351"] #object[io.undertow.server.handlers.resource.PathResourceManager 0x2c1e3665 "io.undertow.server.handlers.resource.PathResourceManager@2c1e3665"]], :handler #object[shadow.cljs.devtools.server.dev_http$eval58051$fn$reify__58063 0x12d50827 "shadow.cljs.devtools.server.dev_http$eval58051$fn$reify__58063@12d50827"]}, :config {:port 3500, :host "0.0.0.0", :ssl-context #object[javax.net.ssl.SSLContext 0x34b55a85 "javax.net.ssl.SSLContext@34b55a85"]}, :https-port 3500}
shadow-cljs - HTTP server available at 
[2021-07-23 20:29:34.625 - FINE] :shadow.cljs.devtools.server.dev-http/http-serve - {:handler-state {:mime-mappings #object[io.undertow.util.MimeMappings 0x3feab37d "io.undertow.util.MimeMappings@3feab37d"], :managers [#object[io.undertow.server.handlers.resource.ClassPathResourceManager 0x41629597 "io.undertow.server.handlers.resource.ClassPathResourceManager@41629597"] #object[io.undertow.server.handlers.resource.PathResourceManager 0x44325f66 "io.undertow.server.handlers.resource.PathResourceManager@44325f66"]], :handler #object[shadow.cljs.devtools.server.dev_http$eval58051$fn$reify__58063 0x578d7574 "shadow.cljs.devtools.server.dev_http$eval58051$fn$reify__58063@578d7574"]}, :config {:port 3600, :host "0.0.0.0", :ssl-context #object[javax.net.ssl.SSLContext 0x34b55a85 "javax.net.ssl.SSLContext@34b55a85"]}, :https-port 3600}
[2021-07-23 20:29:34.632 - FINE] :shadow.cljs.devtools.server/start
shadow-cljs - server version: 2.15.2 running at 
shadow-cljs - nREPL server started on port 9000
shadow-cljs - watching build :client
[2021-07-23 20:29:34.636 - FINE] :shadow.cljs.devtools.server.worker/start - {:build-id :client, :proc-id "6f72937f-94bd-4bdb-9f19-008dc0ed22d2"}
[2021-07-23 20:29:34.643 - FINE] :shadow.remote.relay.local/client-hello - {:client-id 2, :client-info {:connection-info {}, :since #inst "2021-07-23T18:29:34.636-00:00", :type :build-worker, :desc "Worker for build :client", :shadow.cljs.model/worker-id "6f72937f-94bd-4bdb-9f19-008dc0ed22d2", :shadow.cljs.model/worker-for :client}}
[:client] Configuring build.
[:client] Compiling ...
[:client] Build failure:
The required namespace "goog" is not available, it was required by "devtools/preload.cljs".

thheller18:07:26

hmm yeah nothing

thheller18:07:48

try creating an empty project npx create-cljs-project dummy cd dummy npx shadow-cljs browser-repl

Pavel Klavík18:07:52

it seems to work:

shadow-cljs - config: C:\Shared\dummy\shadow-cljs.edn
shadow-cljs - updating dependencies
Retrieving org/clojure/core.async/1.3.618/core.async-1.3.618.jar from 
Retrieving org/clojure/tools.reader/1.3.6/tools.reader-1.3.6.jar from 
Retrieving commons-io/commons-io/2.10.0/commons-io-2.10.0.jar from 
Retrieving expound/expound/0.8.9/expound-0.8.9.jar from 
Retrieving ring/ring-codec/1.1.3/ring-codec-1.1.3.jar from 
Retrieving crypto-random/crypto-random/1.2.1/crypto-random-1.2.1.jar from 
Retrieving thheller/shadow-cljs/2.15.2/shadow-cljs-2.15.2-aot.jar from 
Retrieving ring/ring-core/1.9.4/ring-core-1.9.4.jar from 
shadow-cljs - dependencies updated
shadow-cljs - server version: 2.15.2 running at 
shadow-cljs - nREPL server started on port 62056
[:browser-repl] Configuring build.
[:browser-repl] Compiling ...
[:browser-repl] Build completed. (119 files, 118 compiled, 0 warnings, 11.46s)
cljs.user=>

thheller18:07:32

and in your lein project? npx shadow-cljs browser-repl I mean?

Pavel Klavík18:07:34

also fails:

[:browser-repl] Configuring build.
[:browser-repl] Compiling ...
[:browser-repl] Build failure:
The required namespace "goog" is not available, it was required by "devtools/preload.cljs".

[2021-07-23 20:37:08.192 - FINE] :shadow.remote.relay.local/client-hello - {:client-id 3, :client-info {:connection-info {}, :since #inst "2021-07-23T18:37:08.191-00:00", :type :repl-session, :build-id :browser-repl, :proc-id "de1528ef-bc61-4bb8-869d-c0e23ee42dff"}}
cljs.user=>

thheller18:07:09

ok that narrows it down somewhat I guess? I don't know to what though 😛

Pavel Klavík18:07:39

this is how shadow-cljs.edn looks:

{:lein     true
 :jvm-opts ["-Dfile.encoding=UTF8" "-Xmx2G"]
 :nrepl    {:port 9000}
 :ssl      {:keystore "keystore.jks"
            :password "openpassword"}
 :log      {:level :debug}
 :builds   {:client     {:target           :browser
                         :output-dir       "resources/public/js/compiled"
                         :asset-path       "/js/compiled"
                         :module-loader    true
                         :modules          {:shared {:entries []}
                                            :main   {:init-fn    orgpad.client.core/init
                                                     :depends-on #{:shared}}
                                            :admin  {:entries    [orgpad.client.views.administration.core]
                                                     :depends-on #{:main}}
                                            :layout {:entries    [orgpad.client.layout.webworker.core]
                                                     :depends-on #{:shared}
                                                     :web-worker true}}
                         :compiler-options {:infer-externs      :auto
                                            :output-feature-set :es6}
                         :devtools         {:after-load     orgpad.client.core/mount-root
                                            :before-load    orgpad.client.core/stop-web-workers
                                            :watch-dir      "resources/public"
                                            :browser-inject :main
                                            :loader-mode    :eval}}
            :landing    {:target     :browser
                         :output-dir "landing/resources/js"
                         :asset-path "/js"
                         :modules    {:main {:init-fn orgpad.landing.dev/init}}
                         :devtools   {:http-root      "landing/resources"
                                      :http-port      3500
                                      :after-load     orgpad.landing.dev/mount-root
                                      :watch-dir      "landing/resources"
                                      :browser-inject :main}}
            :emails     {:target     :browser
                         :output-dir "emails/js"
                         :asset-path "/js"
                         :modules    {:main {:init-fn orgpad.server.email.dev/init}}
                         :devtools   {:http-root      "emails"
                                      :http-port      3600
                                      :after-load     orgpad.server.email.dev/mount-root
                                      :watch-dir      "emails"
                                      :browser-inject :main}}
            :screenshot {:target           :node-script
                         :main             orgpad.screenshot.core/main
                         :output-to        "screenshot/screenshot.js"
                         :devtools         {:autoload true}
                         :compiler-options {:optimizations :simple}}}}

thheller18:07:45

maybe try commenting out the devtools dependency

thheller18:07:11

build configs don't matter when browser-repl also fails

Pavel Klavík18:07:15

this is project.clj:

(defproject orgpad "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.10.3"]
                 [org.clojure/tools.cli "1.0.206"]
                 [com.taoensso/sente "1.16.2"]
                 [com.taoensso/timbre "5.1.2"]
                 [bidi "2.1.6"]
                 ; Use epoll on Linux for a lot more efficient polling of incomming packets
                 ; 
                 ; 
                 ; 
                 [io.netty/netty-transport-native-epoll "4.1.25.Final" :classifier "linux-x86_64"]
                 [aleph "0.4.6"]
                 [mount "0.1.16"]
                 [nrepl "0.8.3"]
                 [cprop "0.1.16"]
                 [cheshire "5.10.0"]
                 [clojure.java-time "0.3.2"]
                 [dnsjava/dnsjava "3.3.1"]
                 [org.postgresql/postgresql "42.2.12.jre7"]
                 [luminus-migrations "0.6.7"]
                 [conman "0.8.4"]
                 [expound "0.8.4"]
                 [yogthos/config "1.1.7"]
                 [selmer "1.12.22"]
                 [ring/ring-anti-forgery "1.3.0"]
                 [ring/ring-defaults "0.3.2"]
                 [ring/ring-devel "1.8.0"]
                 [ring/ring-codec "1.1.2"]
                 [ring/ring-json "0.5.0"]
                 [metosin/ring-http-response "0.9.1"]
                 [buddy/buddy-hashers "1.4.0"]
                 [co.deps/ring-etag-middleware "0.2.1"]
                 [bk/ring-gzip "0.3.0"]
                 [com.cognitect/transit-clj "1.0.324"]
                 [ring-basic-authentication "1.0.5"]
                 [ring-oauth2 "0.1.4"]
                 [clj-http "3.11.0"]
                 [hiccup "2.0.0-alpha2"]
                 [com.draines/postal "2.0.4"]
                 [cljc.java-time "0.1.8"]
                 [com.amazonaws/aws-java-sdk-s3 "1.11.1034"]
                 [byte-streams "0.2.5-alpha2"]
                 [camel-snake-kebab "0.4.1"]
                 [bouncer "1.0.1"]
                 [garden "1.3.10"]
                 [orgpad/volcano "0.1.2"]
                 [tea-time "1.0.1"]
                 [com.twelvemonkeys.imageio/imageio-jpeg "3.6.2"]
                 [com.twelvemonkeys.imageio/imageio-tiff "3.6.2"]
                 [com.twelvemonkeys.imageio/imageio-batik "3.6.2"]
                 [net.coobird/thumbnailator "0.4.13"]
                 [org.apache.xmlgraphics/batik-transcoder "1.14"]

                 [thheller/shadow-cljs "2.15.2"]
                 [org.clojure/clojurescript "1.10.879"
                  :exclusions [com.google.javascript/closure-compiler-unshaded
                               org.clojure/google-closure-library
                               org.clojure/google-closure-library-third-party]]
                 [reagent "0.10.0"]
                 [re-frame "0.12.0"]
                 [day8.re-frame/http-fx "v0.2.0"]
                 [hickory "0.7.1"]
                 [venantius/accountant "0.2.5"]
                 [pathetic "0.5.1"]

                 ; Node.js dependencies, should duplicate dependencies from shadow-cljs.edn for Cursive.
                 [macchiato/core "0.2.17"]
                 [macchiato/env "0.0.6"]]

  :plugins [[lein-garden "0.3.0"]
            [lein-ns-dep-graph "0.2.0-SNAPSHOT"]]

  :main orgpad.server.core

  :min-lein-version "2.5.3"

  :source-paths ["src"]

  :clean-targets ^{:protect false} ["resources/public/js/compiled" "target"
                                    "test/js"]

  :resource-paths ["resources"]

  :garden {:builds [{:id           "orgpad"
                     :source-paths ["src"]
                     :stylesheet   orgpad.css.core/orgpad
                     :compiler     {:output-to     "resources/public/css/orgpad.css"
                                    :pretty-print? false}}
                    {:id           "landing"
                     :source-paths ["src"]
                     :stylesheet   orgpad.landing.css.core/landing
                     :compiler     {:output-to     "landing/resources/l/css/landing.css"
                                    :pretty-print? false}}]}

  :profiles
  {:dev     {:jvm-opts       ["-Dconf=dev-config.edn" "-Xmx2G"]
             :dependencies   [[binaryage/devtools "0.9.10"]]
             :plugins        [[lein-doo "0.1.8"]]
             :source-paths   ["env/dev/clj"]
             :resource-paths ["env/dev/resources" "landing/target"]}
   :uberjar {:source-paths   ["env/prod/clj"]
             :omit-source    true
             :main           orgpad.server.core
             :aot            [orgpad.server.core]
             :uberjar-name   "orgpad.jar"
             :prep-tasks     ["clean"
                              ["garden" "once"]
                              ["run" "-m" "shadow.cljs.devtools.cli" "release" "screenshot"]
                              ["run" "-m" "orgpad.landing.build/build!"]
                              ["run" "-m" "orgpad.server.email.build/build!"]
                              ["run" "-m" "orgpad.build/release"]
                              "compile"]
             :resource-paths ["env/prod/resources"]}})

thheller18:07:42

comment out [binaryage/devtools "0.9.10"]. don't know why it fails on goog since everything depends on it

thheller18:07:58

as always I strongly recommend keeping your CLJ and CLJS dependencies separate. either in shadow-cljs.edn or different lein profiles. your setup of everything always is pretty much the worst case for dependency issues

Pavel Klavík18:07:09

the error is now different:

[:client] Build failure:
The required namespace "goog" is not available, it was required by "shadow/cljs/devtools/client/console.cljs".

Pavel Klavík18:07:27

I can try to put dependencies back into shadow-cljs to see whether it will fix the problem

thheller18:07:54

no, it is still the same error. it just fails on the first file it tries to compile, which is the :preloads. that one is added by watch, the other is added automatically when devtools are on the classpath

thheller18:07:02

I don't really have a clue what could cause this. maybe check your lein version? although I don't really know why that would affect anything

thheller18:07:43

just trying to limit factors

Pavel Klavík18:07:58

so after moving dependencies back to shadow-cljs, everything seems to work:

C:\Shared\orgpad>shadow-cljs watch client
shadow-cljs - config: C:\Shared\orgpad\shadow-cljs.edn
shadow-cljs - socket connect failed, server process dead?
shadow-cljs - updating dependencies
shadow-cljs - dependencies updated
NPM dependency "react" has installed version "^16.14.0"
"16.13.0" was required by jar:file:/C:/Users/Pavel%20Klavik/.m2/repository/reagent/reagent/0.10.0/reagent-0.10.0.jar!/deps.cljs
NPM dependency "react-dom" has installed version "^16.14.0"
"16.13.0" was required by jar:file:/C:/Users/Pavel%20Klavik/.m2/repository/reagent/reagent/0.10.0/reagent-0.10.0.jar!/deps.cljs
[2021-07-23 20:48:16.503 - WARNING] TCP Port 9630 in use.
shadow-cljs - HTTP server available at 
shadow-cljs - HTTP server available at 
shadow-cljs - server version: 2.15.2 running at 
shadow-cljs - nREPL server started on port 9000
shadow-cljs - watching build :client
[:client] Configuring build.
[:client] Compiling ...
Browserslist: caniuse-lite is outdated. Please run next command `npm update`

[:client] Build completed. (1134 files, 1128 compiled, 0 warnings, 57.48s)

Pavel Klavík18:07:46

btw. I don't probably need to have this in my lein dev profile, since it is only used to run our server?

:dependencies   [[binaryage/devtools "0.9.10"]]

thheller18:07:17

the dev profile is used by default unless you are on the jar/uberjar tasks, so it does apply when running shadow-cljs as well

thheller18:07:53

interesting that it works without lein

thheller18:07:03

I don't know what [lein-ns-dep-graph "0.2.0-SNAPSHOT"] is? maybe that does something weird?

Pavel Klavík19:07:10

that is just something which produces graphs between namespaces using graph-viz

Pavel Klavík19:07:29

Not really useful anymore since the project is huge. Maybe I will write output to OrgPad in the future instead.

Pavel Klavík19:07:29

Btw. concerning the problem where our server was locking js files so they cannot be recompiled Shadow-cljs. I have decided to not serve them by ring-resource middleware, but instead running Shadow-cljs HTTP server and redirecting requests starting with /js/ from our server to Shadow-cljs. It seems to fix the issue.

thheller19:07:02

hmm good to know

Pavel Klavík19:07:14

In the end, it seems cleaner to let Shadow-cljs handle everything concerning these files.

thheller19:07:11

I never had an issue letting other servers serve my JS. although I never use ring-resource so that might be a factor 😛

Pavel Klavík20:07:01

How do you do this? Maybe it would simpler than our solution with redirecting to Shadow-cljs HTTP server.

thheller06:07:01

Some older projects have nginx in front serving all static files. Others just use JVM Undertow (similar to shadow-undertow but older)

Pavel Klavík19:07:08

it seems to just use java.io.resource under the hood, so unclear what changed: we didn't do any changes in the code recently, or upgrading any dependencies

Pavel Klavík19:07:57

maybe something related to update in Windows since these problems occur randomly on different computers (on my laptop sometimes, on my desktop almost never, much more frequently on another two computers)

thheller19:07:28

my primary PC is windows so I would have run into this at some point I'd assume