Skip to content

Instantly share code, notes, and snippets.

(in-ns 'cljs.analyzer)
(defn get-expander* [sym env]
(when-not (or (some? (gets env :locals sym)) ; locals hide macros
(and (excluded? env sym) (not (used? env sym))))
(let [nstr (namespace sym)]
(cond
(some? nstr)
(let [ns (get-expander-ns env nstr)]
(when (some? ns)
@thheller
thheller / es6-class.cljs
Created August 24, 2017 13:51
class extends React.Component in CLJS
(defn my-component [props context updater]
(cljs.core/this-as this
(js/React.Component.call this props context updater)
;; anything else you want to set-up. use goog.object/set on this
this))
(gobj/extend
(.. my-component -prototype)
js/React.Component.prototype)
package shadow.build.closure;
import clojure.lang.*;
import com.google.javascript.jscomp.*;
import com.google.javascript.jscomp.Compiler;
import com.google.javascript.jscomp.parsing.parser.FeatureSet;
import com.google.javascript.rhino.Node;
import java.util.List;

shadow-cljs code split

Quick comparison to the cljs.loader recently added to CLJS.

Things shadow-cljs does for you:

  • enable-console-print! is a config option, you do not need to call it
  • loader/set-loaded! will be injected for you as well

Install

@thheller
thheller / shadow-cljs-code-gen.js
Created June 28, 2017 15:39
code generated by shadow-cljs that can be loaded via require
var $CLJS = require("./cljs_env");
require("./cljs.core.js");
require("./shadow.npm.react.js");
require("./shadow.npm.react_native.js");
var cljs=$CLJS.cljs;
var shadow=$CLJS.shadow;
var goog=$CLJS.goog;
var demo=$CLJS.demo || ($CLJS.demo = {});
goog.dependencies_.written["demo.app.js"] = true;
@thheller
thheller / mixed.cljc
Created June 22, 2017 09:53
mixing macros with cljs is ugly
(ns demo.mixed
#?(:cljs (:require-macros [demo.mixed])))
;; CLJ cannot compile JS only code
(defn cljs-only []
(js/console.log "cljs-only doesn't compile in CLJ"))
;; so it needs to put into a reader conditional
#?(:cljs
(ns demo.macro-writing-macros)
(def dom-elements
'[h1
h2])
(defn gen-dom-macro [name]
`(defmacro ~name [p# & c#]
(let [kw# ~(-> name str keyword)
children# (into [] c#)]
var SHADOW_IMPORT_PATH = "/Users/zilence/code/shadow-cljs/target/shadow-cljs/node-repl/dev/cljs-runtime";
var SHADOW_ENV = {};
try {require('source-map-support').install();} catch (e) {console.warn('no "source-map-support" (run "npm install source-map-support --save-dev" to get it)');}
SHADOW_ENV.CLOSURE_NO_DEPS = true;
SHADOW_ENV.CLOSURE_DEFINES = {"shadow.cljs.devtools.client.env.autoload":false,"shadow.cljs.devtools.client.env.proc_id":"4553d9c9-bc8b-4e6b-9a20-ed188e9ffd05","shadow.cljs.devtools.client.env.module_format":"goog","goog.LOCALE":"en","shadow.cljs.devtools.client.env.repl_host":"localhost","shadow.cljs.devtools.client.env.build_id":"node-repl","goog.DEBUG":true,"shadow.cljs.devtools.client.env.reload_with_state":false,"shadow.cljs.devtools.client.env.after_load":null,"shadow.cljs.devtools.client.env.before_load":null,"shadow.cljs.devtools.client.env.repl_port":8200,"shadow.cljs.devtools.client.env.enabled":true,"goog.TRANSPILE":"never"};
var SHADOW_ROOTS = ["goog"];
@thheller
thheller / a.cljs
Last active June 12, 2017 08:40 — forked from tiye/a.cljs
Exploring if I can get Respo component simpler. Tried in Lumo.
(ns demo.a
(:require [demo.b :refer [defcomp]]))
(defcomp my-comp [x y] 1)
(println my-comp)
@thheller
thheller / ns.cljs
Created June 11, 2017 19:22
bad spec errors
(ns demo.browser
(:require ["react" :as react :refer (createElement)]
["react-dom" :as rdom :refer (render)] :foo)
(:import ["react" Component]))