This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2023-03-31
Channels
- # announcements (5)
- # babashka (5)
- # beginners (24)
- # calva (21)
- # cherry (1)
- # clerk (20)
- # clj-kondo (3)
- # clj-otel (12)
- # clojure (50)
- # clojure-austin (2)
- # clojure-conj (3)
- # clojure-europe (40)
- # clojure-nl (1)
- # clojure-norway (203)
- # clojure-spec (3)
- # clojure-uk (6)
- # clojurescript (8)
- # conjure (1)
- # datomic (1)
- # deps-new (1)
- # emacs (5)
- # graphql (8)
- # gratitude (5)
- # holy-lambda (16)
- # honeysql (18)
- # hyperfiddle (12)
- # java (1)
- # jobs (1)
- # lsp (24)
- # membrane (8)
- # nbb (1)
- # off-topic (19)
- # portal (28)
- # proletarian (11)
- # rdf (63)
- # re-frame (38)
- # reagent (8)
- # reitit (1)
- # releases (6)
- # remote-jobs (1)
- # scittle (4)
- # shadow-cljs (20)
- # spacemacs (4)
- # sql (7)
- # transit (1)
[Reagent app, typical web stuff] How do I recognise whether I'm in dev or prod? I have code that I want to throw an exception in dev, whereas in prod I prefer it to fail silently.
(defn js!> [js-object & parts]
(if PRODUCTION ; <---------------- ???
; Retrieve value under a key in production.
(go/getValueByKeys js-object (clj->js parts))
; Retrieve value under a key in dev; fail if there ain't one.
(or (go/getValueByKeys js-object (clj->js parts))
(throw (ex-info (str "No such key: " (pr-str parts)) {})))))
Then throughout your code you can have
(when debug?
(do stuff))
And the code will never appear in your production build.alternatively, you can just write
(when ^boolean goog.DEBUG
(do stuff))
the reason for the type hint is so that the CLJS code compiles to something like
if (goog.DEBUG) {
do {
...
}
}
which google-closure is able to recognize and eliminateThanks!
or you make your own setting https://shadow-cljs.github.io/docs/UsersGuide.html#closure-defines
I'm trying to import https://www.npmjs.com/package/nostr-tools with
(:require ["nostr-tools" :as tools])
but get this compilation error
ExceptionInfo: failed to convert sources
shadow.build.closure/convert-sources-simple*/fn--13035 (closure.clj:2077)
shadow.build.closure/convert-sources-simple* (closure.clj:2064)
shadow.build.closure/convert-sources-simple* (closure.clj:1928)
shadow.build.closure/convert-sources-simple (closure.clj:2238)
shadow.build.closure/convert-sources-simple (closure.clj:2188)
shadow.build.compiler/maybe-closure-convert (compiler.clj:1244)
shadow.build.compiler/maybe-closure-convert (compiler.clj:1237)
shadow.build.compiler/compile-all (compiler.clj:1493)
shadow.build.compiler/compile-all (compiler.clj:1356)
shadow.build.api/compile-sources (api.clj:261)
shadow.build.api/compile-sources (api.clj:253)
shadow.build/compile (build.clj:512)
shadow.build/compile (build.clj:493)
shadow.cljs.devtools.server.worker.impl/build-compile (impl.clj:368)
shadow.cljs.devtools.server.worker.impl/build-compile (impl.clj:349)
shadow.cljs.devtools.server.worker.impl/fn--15470 (impl.clj:448)
shadow.cljs.devtools.server.worker.impl/fn--15470 (impl.clj:437)
clojure.lang.MultiFn.invoke (MultiFn.java:234)
shadow.cljs.devtools.server.util/server-thread/fn--15243/fn--15244/fn--15252 (util.clj:283)
shadow.cljs.devtools.server.util/server-thread/fn--15243/fn--15244 (util.clj:282)
shadow.cljs.devtools.server.util/server-thread/fn--15243 (util.clj:255)
java.lang.Thread.run (Thread.java:1589)
Caused by:
RuntimeException: INTERNAL COMPILER ERROR.
Please report this problem.
Cannot invoke "java.math.BigInteger.equals(Object)" because "lv" is null
Node(SHEQ): node_modules/@noble/curves/abstract/weierstrass.js:916:25
for (let o = q - 1n; o % 2n === 0n; o /= 2n)
Parent(FOR): node_modules/@noble/curves/abstract/weierstrass.js:916:4
for (let o = q - 1n; o % 2n === 0n; o /= 2n)
com.google.javascript.jscomp.Compiler.throwInternalError (Compiler.java:3243)
com.google.javascript.jscomp.NodeTraversal.throwUnexpectedException (NodeTraversal.java:509)
com.google.javascript.jscomp.NodeTraversal.traverse (NodeTraversal.java:529)
com.google.javascript.jscomp.NodeTraversal$Builder.traverse (NodeTraversal.java:465)
com.google.javascript.jscomp.NodeTraversal.traverse (NodeTraversal.java:535)
com.google.javascript.jscomp.NodeTraversal.traverseScopeRoots (NodeTraversal.java:735)
com.google.javascript.jscomp.PeepholeOptimizationsPass.process (PeepholeOptimizationsPass.java:67)
com.google.javascript.jscomp.PhaseOptimizer$NamedPass.process (PhaseOptimizer.java:240)
com.google.javascript.jscomp.PhaseOptimizer$Loop.process (PhaseOptimizer.java:378)
com.google.javascript.jscomp.PhaseOptimizer.process (PhaseOptimizer.java:179)
com.google.javascript.jscomp.Compiler.performTranspilationAndOptimizations (Compiler.java:2925)
com.google.javascript.jscomp.Compiler.lambda$stage2Passes$6 (Compiler.java:979)
com.google.javascript.jscomp.CompilerExecutor.runInCompilerThread (CompilerExecutor.java:126)
com.google.javascript.jscomp.Compiler.runInCompilerThread (Compiler.java:1027)
com.google.javascript.jscomp.Compiler.stage2Passes (Compiler.java:976)
com.google.javascript.jscomp.Compiler.compile (Compiler.java:859)
jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:104)
java.lang.reflect.Method.invoke (Method.java:578)
clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:167)
clojure.lang.Reflector.invokeInstanceMethod (Reflector.java:102)
shadow.build.closure/convert-sources-simple*/fn--13035/fn--13036 (closure.clj:2067)
shadow.build.closure/convert-sources-simple*/fn--13035 (closure.clj:2065)
shadow.build.closure/convert-sources-simple* (closure.clj:2064)
shadow.build.closure/convert-sources-simple* (closure.clj:1928)
shadow.build.closure/convert-sources-simple (closure.clj:2238)
shadow.build.closure/convert-sources-simple (closure.clj:2188)
shadow.build.compiler/maybe-closure-convert (compiler.clj:1244)
shadow.build.compiler/maybe-closure-convert (compiler.clj:1237)
shadow.build.compiler/compile-all (compiler.clj:1493)
shadow.build.compiler/compile-all (compiler.clj:1356)
shadow.build.api/compile-sources (api.clj:261)
shadow.build.api/compile-sources (api.clj:253)
shadow.build/compile (build.clj:512)
shadow.build/compile (build.clj:493)
shadow.cljs.devtools.server.worker.impl/build-compile (impl.clj:368)
shadow.cljs.devtools.server.worker.impl/build-compile (impl.clj:349)
shadow.cljs.devtools.server.worker.impl/fn--15470 (impl.clj:448)
shadow.cljs.devtools.server.worker.impl/fn--15470 (impl.clj:437)
clojure.lang.MultiFn.invoke (MultiFn.java:234)
shadow.cljs.devtools.server.util/server-thread/fn--15243/fn--15244/fn--15252 (util.clj:283)
shadow.cljs.devtools.server.util/server-thread/fn--15243/fn--15244 (util.clj:282)
shadow.cljs.devtools.server.util/server-thread/fn--15243 (util.clj:255)
java.lang.Thread.run (Thread.java:1589)
Caused by:
NullPointerException: Cannot invoke "java.math.BigInteger.equals(Object)" because "lv" is null
com.google.javascript.jscomp.PeepholeFoldConstants.tryStrictEqualityComparison (PeepholeFoldConstants.java:1394)
com.google.javascript.jscomp.PeepholeFoldConstants.evaluateComparison (PeepholeFoldConstants.java:1423)
com.google.javascript.jscomp.PeepholeFoldConstants.tryFoldComparison (PeepholeFoldConstants.java:1167)
com.google.javascript.jscomp.PeepholeFoldConstants.tryFoldBinaryOperator (PeepholeFoldConstants.java:188)
com.google.javascript.jscomp.PeepholeFoldConstants.optimizeSubtree (PeepholeFoldConstants.java:104)
com.google.javascript.jscomp.PeepholeOptimizationsPass$PeepCallback.visit (PeepholeOptimizationsPass.java:82)
com.google.javascript.jscomp.NodeTraversal.traverseBranch (NodeTraversal.java:963)
com.google.javascript.jscomp.NodeTraversal.traverseBranch (NodeTraversal.java:953)
com.google.javascript.jscomp.NodeTraversal.traverseBranch (NodeTraversal.java:953)
com.google.javascript.jscomp.NodeTraversal.traverseFunction (NodeTraversal.java:1008)
com.google.javascript.jscomp.NodeTraversal.handleFunction (NodeTraversal.java:859)
com.google.javascript.jscomp.NodeTraversal.traverseBranch (NodeTraversal.java:905)
com.google.javascript.jscomp.NodeTraversal.traverseBranch (NodeTraversal.java:953)
com.google.javascript.jscomp.NodeTraversal.traverseFunction (NodeTraversal.java:1008)
com.google.javascript.jscomp.NodeTraversal.handleFunction (NodeTraversal.java:859)
com.google.javascript.jscomp.NodeTraversal.traverseBranch (NodeTraversal.java:905)
com.google.javascript.jscomp.NodeTraversal.traverseBranch (NodeTraversal.java:953)
com.google.javascript.jscomp.NodeTraversal.traverseBranch (NodeTraversal.java:953)
com.google.javascript.jscomp.NodeTraversal.traverseChildren (NodeTraversal.java:1131)
com.google.javascript.jscomp.NodeTraversal.handleScript (NodeTraversal.java:847)
com.google.javascript.jscomp.NodeTraversal.traverseBranch (NodeTraversal.java:902)
com.google.javascript.jscomp.NodeTraversal.traverseBranch (NodeTraversal.java:953)
com.google.javascript.jscomp.NodeTraversal.traverse (NodeTraversal.java:526)
com.google.javascript.jscomp.NodeTraversal$Builder.traverse (NodeTraversal.java:465)
com.google.javascript.jscomp.NodeTraversal.traverse (NodeTraversal.java:535)
com.google.javascript.jscomp.NodeTraversal.traverseScopeRoots (NodeTraversal.java:735)
com.google.javascript.jscomp.PeepholeOptimizationsPass.process (PeepholeOptimizationsPass.java:67)
com.google.javascript.jscomp.PhaseOptimizer$NamedPass.process (PhaseOptimizer.java:240)
com.google.javascript.jscomp.PhaseOptimizer$Loop.process (PhaseOptimizer.java:378)
com.google.javascript.jscomp.PhaseOptimizer.process (PhaseOptimizer.java:179)
com.google.javascript.jscomp.Compiler.performTranspilationAndOptimizations (Compiler.java:2925)
com.google.javascript.jscomp.Compiler.lambda$stage2Passes$6 (Compiler.java:979)
com.google.javascript.jscomp.CompilerExecutor.runInCompilerThread (CompilerExecutor.java:126)
com.google.javascript.jscomp.Compiler.runInCompilerThread (Compiler.java:1027)
com.google.javascript.jscomp.Compiler.stage2Passes (Compiler.java:976)
com.google.javascript.jscomp.Compiler.compile (Compiler.java:859)
jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:104)
java.lang.reflect.Method.invoke (Method.java:578)
clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:167)
clojure.lang.Reflector.invokeInstanceMethod (Reflector.java:102)
shadow.build.closure/convert-sources-simple*/fn--13035/fn--13036 (closure.clj:2067)
shadow.build.closure/convert-sources-simple*/fn--13035 (closure.clj:2065)
shadow.build.closure/convert-sources-simple* (closure.clj:2064)
shadow.build.closure/convert-sources-simple* (closure.clj:1928)
shadow.build.closure/convert-sources-simple (closure.clj:2238)
shadow.build.closure/convert-sources-simple (closure.clj:2188)
shadow.build.compiler/maybe-closure-convert (compiler.clj:1244)
shadow.build.compiler/maybe-closure-convert (compiler.clj:1237)
shadow.build.compiler/compile-all (compiler.clj:1493)
shadow.build.compiler/compile-all (compiler.clj:1356)
shadow.build.api/compile-sources (api.clj:261)
shadow.build.api/compile-sources (api.clj:253)
shadow.build/compile (build.clj:512)
shadow.build/compile (build.clj:493)
shadow.cljs.devtools.server.worker.impl/build-compile (impl.clj:368)
shadow.cljs.devtools.server.worker.impl/build-compile (impl.clj:349)
shadow.cljs.devtools.server.worker.impl/fn--15470 (impl.clj:448)
shadow.cljs.devtools.server.worker.impl/fn--15470 (impl.clj:437)
clojure.lang.MultiFn.invoke (MultiFn.java:234)
shadow.cljs.devtools.server.util/server-thread/fn--15243/fn--15244/fn--15252 (util.clj:283)
shadow.cljs.devtools.server.util/server-thread/fn--15243/fn--15244 (util.clj:282)
shadow.cljs.devtools.server.util/server-thread/fn--15243 (util.clj:255)
java.lang.Thread.run (Thread.java:1589)
no idea what I'm doing wrong. The bundled code does run in the browser.RuntimeException: INTERNAL COMPILER ERROR.
is from the closure compiler. looks like there is a bit of code it doens't like
Dear Clojurians, what is the simplest way for web app to send simple e-mail notifications? My config is: shadow-cljs/reagent/firebase realtime database/firebase google auth. I would like to send notifications to users (which subscribed to receiving them) on some changes that happen in the realtime database – changes are always caused by other app users. How to implement this? Thank you very much.
please ask in #C03S1L9DN or so. this really isn't a shadow-cljs question, it won't be involved in any of that beyond building the code