     compile-state
 
     (let [{:keys [op] :as ast}
-          (analyze state compile-state form)
-
-          js
-          (with-out-str
-            (shadow-emit state ast))]
+          (analyze state compile-state form)]
 
       ;; bump for every compiled form might be overkill
       (vreset! last-progress-ref (System/currentTimeMillis))
 
       (-> compile-state
-          (update-in [:js] str js)
+          (update-in [:ast] conj ast)
           (cond->
             (= op :ns)
             (assoc

          (comp/emitln "var " ns "=" (npm/shadow-js-require rc))
          )))))

(defn default-compile-cljs
  [{:keys [last-progress-ref] :as state} {:keys [ns macros-ns] :as compile-state} form]
  ;; ignore (defmacro ...) in normal cljs compilation since they otherwise end
  ;; up as normal vars and can be called as fns. compile as usual when compiling as macro ns

             (not (is-cache-blocked? state rc)))]

    (or (when (and cache? (not (contains? previously-compiled resource-id)))
          (when-let [output (load-cached-cljs-resource state rc)]
            (trigger-ready! state rc)
            output))
        (let [source
              (data/get-source-code state rc)

              output
              (try
                (do-compile-cljs-resource state rc source)
                (catch Exception e
                  (let [{:keys [type ex-kind line] :as data}
                        (ex-data e)
