Fork me on GitHub
#clojurescript
<
2017-02-07
>
emccue00:02:10

So the node js route won't be ideal for browser

emccue00:02:05

Basically what happens is that your calls to require execute correctly on node, and when you compile with basic optimizations the times you call require stay in place

emccue00:02:35

From there using browserify on your code would work

emccue00:02:22

But browserify/webpack, as dnolen would be quick to point out, don't do a great job at optimizing and dead code eliminating generated clojurescript code

emccue00:02:44

*the JavaScript generated from clojurescript

emccue00:02:06

In browser, where code size is a big deal, you basically have to use advanced optimizations, which doesn't work with the require function, but instead with js externs and Google closure namespaces

emccue00:02:01

Work is being done to make using code from node doable (both on the clojurescript team and the Google closure team)

emccue00:02:11

But it's all really alpha right now

emccue00:02:25

For now just look on cljsjs for the js libraries you want to use and if you can't find what you need then come back here and someone will help you out

dnolen00:02:08

@msuess require gets compiled away so probably something went wrong. The guide is clear you can鈥檛 use ES6 yet w/ Node modules support

dnolen00:02:33

but it鈥檚 a cutting edge feature so expect a bumpy ride unless you have a lot of patience and are OK with digging into how the feature actually works

velebak02:02:24

Anyone have a line on how to do sha256 hashing in cljs? All the links I'm finding seem to be out of date. TIA

yanglin02:02:33

Hello, if I'm looking to use third-party react component from npm, is http://blob.tomerweller.com/reagent-import-react-components-from-npm a good guide to follow?

yanglin02:02:56

Specifically, the approach is to compile the react components with webpack, attach it to window, and exclude react and react-dom from reagent.

stbgz03:02:09

hey all I have been playing witht the cljs.js/compile-str and I noticed the library resolution function passes a string for the library name. I was wondering what would happen if there are two files name the same coming from different libraries? Anybody knows how collisions get resolved?

emccue04:02:52

@yanglin That guide works iff you have the externs for the libraries you are using or you don't use advanced compilation

emccue04:02:29

Also be sure to add the generated bundle.js to your unit tests

sineer07:02:20

Anyone knows how to get around importing foreign libs that uses flow types ? I can't find anything about this and I am not familiar with flow type...

gcommer07:02:01

what library? usually projects that code with type annotations should be running their code through a compiler step to remove them; there might be another .js file in the package you should refer to instead

sineer07:02:30

I see a scripts/flow.sh

gcommer07:02:56

Oh, you're getting the source directly from github?

gcommer07:02:02

you should get the release builds instead, they'll have the compiled output as normal javascript in the lib/ folder

sineer07:02:49

Thanks, that makes sense 馃檪 I'll try that!

qqq07:02:02

does cljs have access to gen ?

qqq07:02:24

does cljs have access to spec.gen? I'm trying to (:require ,clojure.spec.gen :as gen] in a cljs file, and it can't find it

sineer08:02:14

err, when I :module-type :es6 in my :foreign-libs it fails to find the :provides ["gl-react"] namespace (No such namespace: gl-react, could not locate gl_react.cljs...)

sineer08:02:55

but when I remove the :module-type :es6 then it builds and later fails executing js cause it's a es6 module 馃槥

thheller08:02:23

@qqq the ns is cljs.spec.impl.gen due to a conflict with cljs.spec/gen otherwise

sineer08:02:27

I believe I found out my mistake is I had not browserify'ed my foreign libs.

sineer09:02:38

my foreign lib expects window.react to be defined when it's :required... Any idea how I could (set! js/React react) when I :require cljsjs.react ?

sineer09:02:13

I could fix it by importing react in my index.html but there has to be a more idiomatic way...

sineer09:02:21

I find it's an interesting option that I believe would fix my problem (foreign lib needs window.react define prior to :require) but I'd loose cljsjs... maybe there is an even better solution?

thheller10:02:54

@sineer the :module-type for :foreign-libs is very much a work in progress, webpack should be more reliable for a while

thheller10:02:19

unless you really feel like trying cutting edge stuff

sineer11:02:16

clsjs looks a lot like cljsjs when you're tired!

Aron11:02:17

how to write this in clojurescript: messages.indexOf(link.source) > -1 ? link.target : link.source ?

Aron11:02:36

messages is an array, link.source & .target are integers

Aron11:02:26

by this point i know that in the array it's only one of them that is present and one of them is always present

Aron11:02:42

and i would like to get back the one that isn't

Aron12:02:25

well, i wrote (if (> (.indexOf messages link.source) -1) link.target link.source) hopefully it will work

Aron12:02:59

now i need to figure out how to modify js Objects 馃槃

sineer12:02:48

your code appears correct, to modify js object use (set! js/obj val)

Aron12:02:08

js/obj ?

sineer12:02:31

replace that by your javascript object ref.. js/ is to access javascript global ns

Aron12:02:32

i am using variables from local scope

Aron12:02:45

yeah, ok, then i understood correctly, thanks

Aron12:02:10

problem is i want to set! a property, not the whole object

Aron12:02:22

and (set! objname "prop" val) is incorrect

sineer12:02:34

its important to understand it properly for when you'll use advanced optimization...

Aron12:02:57

thanks, this is great

thheller12:02:12

@ashnur native interop is usually done via the the . (dot) operator

thheller12:02:29

(if (> (.indexOf messages link.source) -1) link.target link.source) this shouldn't work

thheller12:02:04

(if (> (.indexOf messages link.source) -1) (.-target link) (.-source link)) use (.-property obj) to access properties of objects

thheller12:02:26

same for set (set! (.-property obj) new-value)

thheller12:02:19

oh nvm, the article covers that

Aron12:02:40

yeah, but thanks anyway, better twice than not even once 馃檪

Aron14:02:00

what happens when i doseq over a javascript array?

pesterhazy14:02:04

in lumo:

(doseq [x (into-array [:a :b :c])] (prn x))

Aron14:02:00

@pesterhazy i don't understand

Aron14:02:12

how would trying it tell me what it does actually?

Aron14:02:29

i am already using it, but my question is not about the result, it is about it's action

pesterhazy14:02:49

ah, I didn't understand then

pesterhazy14:02:07

as you can see it hands over to -seq of ISeqable

pesterhazy14:02:30

can't find where ISeqable is defined for arrays though

Aron14:02:59

yeah, that's why i asked :)]

pesterhazy14:02:25

ah wait it checks if it's an array in seq

Aron14:02:30

can't decipher, is it converting into something or there is some default

pesterhazy14:02:48

then it creates an IndexedSeq of the array

pesterhazy14:02:34

it uses aget and keeps track of the index

pesterhazy14:02:44

@ashnur finding the anwer you were looking for?

Aron14:02:08

not yet, no, but i figured first i write it and see if it's slow

Aron14:02:18

so for now i jsut use it

Aron15:02:48

(defn somefn [] (let [localvalue (.jsfunc js/somejsobj (fn [] ( ... how to access localvalue here? ... )))]))

Aron15:02:43

says undeclared

Aron15:02:49

and i think it's correct

pesterhazy15:02:12

you're not showing the actual code

Aron15:02:25

i have not yet written the actual code

Aron15:02:47

you are saying i should be able to access it?

thheller15:02:58

in that example no

Aron15:02:59

i can show more

Aron15:02:21

see how i use timer variable from inside the anonymous function

pesterhazy15:02:23

the lack of identation threw me off

pesterhazy15:02:01

you can use an atom for that if you want

Aron15:02:25

i am afraid of using atoms, because i don't know what they are doing internally

Aron15:02:58

i am not even sure how would help me here

thheller15:02:42

this type of assignment won't work in CLJS

Aron15:02:50

that's what i suspected

pesterhazy15:02:32

(let [!localvalue (atom nil)] (reset! !localvalue (do-something (fn [] (prn @!localvalue)))))

pesterhazy15:02:47

kind of thing. I'm not sure I balanced parentheses correctly there 馃檪

Aron15:02:21

oh, i know then, this @/deref thing does a next-tick

Aron15:02:12

a skip in the event loop

Aron15:02:15

not sure how to say it

rauh15:02:23

@ashnur There is no async in cljs.core

Aron15:02:41

rauh how is that relevant here, i don't see

rauh15:02:02

The deref doesn't do next-tick like you guessed

rauh15:02:13

All of cljs.core is sync

Aron15:02:27

oh, ok, thanks for the correction then

thheller15:02:31

@ashnur deref is just "give me the value of the thing now", basically a property access

thheller15:02:38

@ is just syntax sugar. nothing more.

Aron15:02:21

@thheller so, i should do what @pesterhazy suggested to solve this situation? use an atom?

Aron15:02:27

i am not grokking this yet

Aron15:02:32

thanks to everyone

thheller15:02:52

(let [timer-ref
      (atom nil)
      
      timer-fn
      (fn [elapsed]
        ...
        (.stop @timer-ref))
      
      timer
      (js/d3.timer timer-fn)]
  (reset! timer-ref timer))

thheller15:02:24

maybe that is clearer, you need to name for the timer before it actually exists, so timer-ref is a placeholder basically. ie. there will be a thing in here when timer-fn is called

Aron15:02:09

yeah, i realized what was "wrong" with the original situation 馃檪

Aron15:02:29

hmm. i am having a brain freeze... how to have multiple expressions in a conditional? (do) ?

Aron16:02:20

i am sure when i finish this i will see some ways to make it more idiomatic to clojurescript, but for now, it's not very nice ;D

Aron16:02:42

const notCurrentEdge = (fe) => currentEdges.find((ce) => ce.index != fe.index) how to have a predicate like this? currentEdges is an array of objects with index and i am trying to make sure that the object i am checking has an index that's not present. kinda obvious .. not sure what's the best way to do this

Aron16:02:52

basically because i don't have a .find for cljs

matthavener16:02:57

ashnur: you can emulate .find with (first (filter #(not= (.-index %) (.-index fe)) currentEdges))

Aron16:02:46

i did (every? (fn [edge] (!= (aget fe "index") (aget edge "index"))) current-edges)

Aron16:02:57

but maybe it's wrong

Aron16:02:13

i have another error to fix before i can test this

matthavener16:02:35

ah yeah, that works if you鈥檙e just trying to make sure find finds nothing

matthavener16:02:12

ignore me, you are doing the right thing 馃檪

Aron16:02:20

oh, 馃槃

Aron16:02:36

one thing is sure, this learning project is actually doing its job, i am running into a lot of weird stuff

Aron17:02:16

aaand i have found where i need mutation of a list. how can i do forEach? 馃槃

dnolen17:02:46

very illuminating results

Roman Liutikov17:02:16

what I see: cljs needs better JS libs support (which is a wip) and better marketing (wonder how this will end up)

anmonteiro17:02:37

^ 2nd may be a consequence of the 1st too

Aron17:02:39

how do i write this in cljs? const inTheDark = (edge) => (messages.indexOf(edge.source) > -1 ) ^ (messages.indexOf(edge.target) > -1 ) 馃槃

Aron17:02:04

also, this is weird Use of undeclared Var combo-network.core/!=

Aron17:02:32

so why it says undeclared?

thheller18:02:25

@ashnur that is core.logic, you probably want not=

Aron18:02:54

what's the difference

Aron18:02:07

i used = and changed every to not-any

thheller18:02:49

if you want != as it is in JS use not=. core.logic is a logic programming library, an entirely different thing

Aron18:02:07

i understand that i have to use not=

Aron18:02:18

what i don't understand is core.logic, but guess that can wait

Aron18:02:41

i mean i thought that core.logic is just the part where logic stuff is separated but that doesn't mean i can't use it

Aron18:02:51

so, how can i have XOR?

Aron18:02:24

i am fairly sure i can't do the hack from javascript to just use the bitwise oeprator instead, right?

Aron18:02:51

yeah, it needs number arguments

thheller18:02:31

(or one-thing other-thing)

Aron18:02:40

that's not xor

Aron18:02:52

i really hope it isn't

thheller18:02:30

ah ok, you want to call it without numbers but still have the a number as the result

Aron18:02:32

@rauh i am not sure why would you say that as i just mentioned that i tried and it wants number inputs

thheller18:02:34

yeah not in clojure

Aron18:02:47

yeah, i want (xor true false) -> true

Aron18:02:52

not really a new idea

thheller18:02:09

(or true false) => true?

thheller18:02:16

you keep using bools 馃槢

Aron18:02:33

you realize that or is not xor, right?

Aron18:02:41

this is the second time you suggest or

Aron18:02:50

(or true true) gives true while (xor true true) gives false

thheller18:02:13

yes, but xor with bools doesn't compute in my head

Aron18:02:03

what do you mean?

Aron18:02:09

it's just exclusive or

Aron18:02:13

x stands for exclusive

Aron18:02:39

it does the same thing, but not on bits but on "a single bit" which is just a boolean

Aron18:02:59

that's why it works in js where type coercion casts true/false to 1/0

thheller18:02:26

yes, I get that ... just in my history whenever I used binary ops I used it on numbers. just ignore me .. I'm old.

jr18:02:03

ashnur: bit-xor compiles into x ^ x

Aron18:02:23

thheller like i am young 馃槃

Aron18:02:45

@jr that's cool, but if i try to use it with booleans it complains, guess i could cast the boolean into numbers

Aron18:02:54

anyway, i just wrote xor function

tanzoniteblack18:02:09

@ashnur it seems to be more common in the clojure world to use all, some, and, or or when doing boolean logic. Not that you can't use xor if you want, just not overly common in clojure

jr18:02:39

yeah the analyzer tags the input as a number so it will complain

dnolen18:02:09

@roman01la better marketing you mean for the staffing concerns?

dnolen18:02:32

@anmonteiro I think better integration with JS will have some impact - but I do think the marketing problem is a broader issue

dnolen18:02:30

as I鈥檝e said before nearly 60% of users come from Java/Python/Ruby so I think there鈥檚 a lot we can do here

dnolen18:02:40

I remain skeptical of attacking the JS behemoth directly 馃檪

Aron18:02:16

i know that if it wasn't for the java tight coupling, i would've tried cljs 2 years earlier

Aron18:02:40

although now that i said this, you probably want to tie it to java even more just to keep people like me away 馃槢

dnolen18:02:16

@ashnur you are in a persistent minority that we are well aware of 馃槈

dnolen18:02:32

but survey鈥檚 prove it doesn鈥檛 matter that much

Aron18:02:45

i am not sure how can that survey tell anything about this, but sure, as you said, doesn't matter much

dnolen18:02:01

we have questions about pain points

dnolen18:02:06

Java is not high on the list

Aron18:02:35

but it would be crazy for you to have java high on that list because it would go against the tide where you perceive money comes

Aron18:02:49

so to me its kinda obvious why even if i were right you would deny it 馃檪

dnolen18:02:54

it never appears as a problem

dnolen18:02:00

people can add freeform feedback

Aron18:02:03

but again, i don't know if i am right, and it doesn't really matter

Aron18:02:18

yeah, never, only for me :))

Aron18:02:27

see, you deny my existence :))

thheller18:02:46

someone wrote a library for CLJS/CLJ macros to make it easier to generate platform specific code, anyone remember the name?

thheller18:02:33

other than the (:ns &env) thingy

dnolen18:02:49

@ashnur no, just not a priority and unlikely to be - there鈥檚 just more important things to work on

anmonteiro18:02:20

@thheller I believe this is what you're looking for https://github.com/cgrand/macrovich

thheller18:02:19

@anmonteiro thats the one, thanks

rauh19:02:10

@ashnur if you have bools your xor is not=

sineer19:02:15

FYI, I discovered dirac (cljs repl for devtools!) two days ago and it rocks! Coolest repl I ever seen 馃檪 Check it out if you haven't already...

sineer19:02:45

Also, I'm extremely happy to have a working gl-react canvas in devcards with om next 馃檪

rauh20:02:27

@ashnur Well (not= true true), true false, false false, false true are all equal to (xor a b)

Aron20:02:01

it's so obvious

Aron20:02:02

thanks rauh

pesterhazy20:02:42

(defn xor [a b] (not= (boolean a) (boolean b)))

Roman Liutikov20:02:54

@dnolen: I meant better marking for broader adoption

rayk21:02:57

Has any seen the error

[Violation] Parser was blocked due to document.write(<script>)
in the browser, when running figwheel, I believe it related to CLOSURE complier injecting it's JS require (Maybe)... Anyhow any pointers would be great. (It odes not appear to be stopping the app from loading).

dnolen21:02:58

@rayk I鈥檓 assuming this is in Firefox or something?

rayk21:02:12

Chrome Canary

dnolen21:02:18

we only do that under dev - so not a big deal

rayk21:02:08

Thanks... will not waste the time chasing it down...

sineer21:02:11

I found cljs-http to do http get but I'm wondering if there's a simpler or more common way to load resource files? a simple blocking load would do...

dnolen21:02:12

@sineer blocking load isn鈥檛 desirable since JavaScript is single threaded

pesterhazy21:02:17

browsers don't do sync 馃槥

dnolen21:02:27

@pesterhazy you can do a sync get but I don鈥檛 recommend it

sineer21:02:49

yeah I was just thinking about that trying to think of a way if at all possible.. it's for devcards stuff and to defonce some shaders data..

pesterhazy21:02:24

@dnolen, really? you can send synchronous network requests from javascript in a browser?

sineer21:02:51

node.js has blocking fs read also if I remember correctly

sineer21:02:39

I guess I'll just have to use cljs-http... Out of curiosity is there anything simpler (no core.async dep maybe) ?

sineer21:02:43

yeah that's what I was looking for 馃檪 Thanks! I remember using something similar with react-native

pesterhazy22:02:24

From a cljs repl, is there any way to block until some async event happens?

pesterhazy22:02:43

I can do this:

cljs.user=> (def r (atom nil))
#'cljs.user/r
cljs.user=> (goog.net.XhrIo/send "" #(reset! r (-> % .-target .getResponseJson js->clj)))
#object[Object [object Object]]
cljs.user=> @r

pesterhazy22:02:02

but it would be neat if I could programmatically wait for the result (instead of manually checking the atom periodically)

stbgz22:02:45

@pesterhazy can you not use channels for that

pesterhazy22:02:50

@stbgz how would that work?

superstructor22:02:54

@sineer do you use any wrapper for gl-react or does it "just work" with om-next ? I鈥檓 a reagent user so not very familiar with om-next.

sineer22:02:17

I'm working on a cljs lib/wrapper for gl-react it's just prototype yet but I'm making great progress 馃檪

sineer22:02:56

I havent seen gl-react used with cljs anywhere but there isn't much to it... the hard work is getting the foreign libs to work

stbgz22:02:52

@pesterhazy I swear I鈥檝e seen that being done with channels, but I can鈥檛 find the doc anymore, I鈥檒l ping you if I find it

sineer22:02:07

gl-react is just a react component so you can use it with plain react or which ever cljs wrapper you prefer 馃檪

geoffs23:02:18

@stbgz maybe you're thinking of using <!! i.e. blocking take, which is intentionally missing from the cljs implementation of core.async

johanatan23:02:57

does anyone know how to get goog.DEBUG to end up false in CLJS 1.9.229 ? I've tried :closure-defines {:goog.DEBUG false} and :closure-defines {"goog.DEBUG" false} to no avail.

johanatan23:02:25

[both in my profile with :optimizations :advanced]

anmonteiro23:02:32

@johanatan either 'goog.DEBUG false or "goog.DEBUG" false should work

anmonteiro23:02:50

what's the symptom you get?

johanatan23:02:54

hmm, ok. I think i've found the problem

johanatan23:02:07

do i need lein cljsbuild once prod to actually build the prod profile?

johanatan23:02:22

i think i was still actually building the debug one with lein cljsbuild once

anmonteiro23:02:47

I don't use cljsbuild, so I couldn't tell you

johanatan23:02:14

yep, lein cljsbuild once prod is invoking the right build now. will see how that turns out. thx!

anmonteiro23:02:41

don't forget to add the ^boolean type hint too

anmonteiro23:02:55

helps with DCE

darwin23:02:52

in general I stay away from :closure-defines, too many sharp edges

darwin23:02:02

macros will do the same job predictably

johanatan23:02:25

do you have an example of using macros for prod vs dev builds?

darwin23:02:46

give me a sec

johanatan23:02:25

hmm, my prod build seems to be broken with this cryptic stack trace:

java.lang.ClassCastException: clojure.lang.PersistentList cannot be cast to clojure.lang.Named
	at clojure.core$name.invokeStatic(core.clj:1546)
	at clojure.core$name.invoke(core.clj:1540)
	at cljs.closure$make_options.invokeStatic(closure.clj:263)
	at cljs.closure$make_options.invoke(closure.clj:253)
	at cljs.closure$optimize.invokeStatic(closure.clj:1266)
	at cljs.closure$optimize.doInvoke(closure.clj:1259)
	at clojure.lang.RestFn.applyTo(RestFn.java:139)
	at clojure.core$apply.invokeStatic(core.clj:648)
	at clojure.core$apply.invoke(core.clj:641)
	at cljs.closure$build.invokeStatic(closure.clj:2020)
	at cljs.closure$build.invoke(closure.clj:1927)
	at cljs.build.api$build.invokeStatic(api.clj:199)
	at cljs.build.api$build.invoke(api.clj:187)
	at cljs.build.api$build.invokeStatic(api.clj:190)
	at cljs.build.api$build.invoke(api.clj:187)
	at cljsbuild.compiler$compile_cljs$fn__5973.invoke(compiler.clj:60)
	at cljsbuild.compiler$compile_cljs.invokeStatic(compiler.clj:59)
	at cljsbuild.compiler$compile_cljs.invoke(compiler.clj:48)
	at cljsbuild.compiler$run_compiler.invokeStatic(compiler.clj:168)
	at cljsbuild.compiler$run_compiler.invoke(compiler.clj:122)
	at user$eval6110$iter__6146__6150$fn__6151$fn__6169.invoke(form-init7676291134357241625.clj:1)
	at user$eval6110$iter__6146__6150$fn__6151.invoke(form-init7676291134357241625.clj:1)
	at clojure.lang.LazySeq.sval(LazySeq.java:40)
	at clojure.lang.LazySeq.seq(LazySeq.java:49)
	at clojure.lang.RT.seq(RT.java:521)
	at clojure.core$seq__4357.invokeStatic(core.clj:137)
	at clojure.core$dorun.invokeStatic(core.clj:3024)
	at clojure.core$doall.invokeStatic(core.clj:3039)
	at clojure.core$doall.invoke(core.clj:3039)
	at user$eval6110.invokeStatic(form-init7676291134357241625.clj:1)
	at user$eval6110.invoke(form-init7676291134357241625.clj:1)
	at clojure.lang.Compiler.eval(Compiler.java:6927)
	at clojure.lang.Compiler.eval(Compiler.java:6917)
	at clojure.lang.Compiler.load(Compiler.java:7379)
	at clojure.lang.Compiler.loadFile(Compiler.java:7317)
	at clojure.main$load_script.invokeStatic(main.clj:275)
	at clojure.main$init_opt.invokeStatic(main.clj:277)
	at clojure.main$init_opt.invoke(main.clj:277)
	at clojure.main$initialize.invokeStatic(main.clj:308)
	at clojure.main$null_opt.invokeStatic(main.clj:342)
	at clojure.main$null_opt.invoke(main.clj:339)
	at clojure.main$main.invokeStatic(main.clj:421)
	at clojure.main$main.doInvoke(main.clj:384)
	at clojure.lang.RestFn.invoke(RestFn.java:421)
	at clojure.lang.Var.invoke(Var.java:383)
	at clojure.lang.AFn.applyToHelper(AFn.java:156)
	at clojure.lang.Var.applyTo(Var.java:700)
	at clojure.main.main(main.java:37)
Subprocess failed

johanatan23:02:33

Any idea on that one?

johanatan23:02:56

is that from the 'goog.DEBUG as recommended above?

anmonteiro23:02:02

I may have missed the correct syntax 馃檪

anmonteiro23:02:03

try 'goog/DEBUG

johanatan23:02:10

yep, changing it to "goog.DEBUG" has fixed that

anmonteiro23:02:17

slash instead of dot

johanatan23:02:20

oh, hmm. ahh ok

darwin23:02:05

@johanatan in a macro you can have access to compiler options, and you can decide to emit clojurescript code or not, for example depending on the :optimizations key https://github.com/binaryage/cljs-oops/blob/276de0b73fbcef6a7ad43b31470ecaf2139da097/src/lib/oops/config.clj#L21-L23

darwin23:02:57

this technique can be combined with preloads and leiningen profiles

johanatan23:02:26

and what are the "sharp edges" involved with the closure approach?

johanatan23:02:38

for a simple "debug" flag, would it be fine?

darwin23:02:54

the sharp edges were related to DCE, I expected it to happen and it silently didn鈥檛, once because of missing ^boolean type hint, second time because of using js/goog.DEBUG form

darwin23:02:30

but code worked, it just prevented DCE, so it wasn鈥檛 that bad 馃檪

darwin23:02:27

anyways :closure-defines is not widely used I would say, so there might be some quirks not only with DCE

johanatan23:02:02

what is DCE?

anmonteiro23:02:44

Dead Code Elimination

johanatan23:02:43

btw, i had to use goog.DEBUG here. goog/DEBUG did not work

johanatan23:02:52

perhaps you're on a later version than I ?