   [opts & sources]
   (let [disk-sources (map #(source-on-disk opts %) sources)]
     (let [goog-deps (io/file (output-directory opts) "goog/deps.js")]
-      (do (mkdirs goog-deps)
+      (do (comp/mkdirs goog-deps)
           (spit goog-deps (deps-file opts (filter #(= (:group %) :goog) disk-sources)))
           (output-deps-file opts (remove #(= (:group %) :goog) disk-sources))))))
 

                   (remove #(nil? (:uri %)))))]
      (loop [required-files (cljs-deps requires)
             visited (set required-files)
             js-deps []]
        (if (seq required-files)
          (let [next-file (first required-files)
                js (get-compiled-cljs opts next-file)
                transative (remove #(contains? visited %) (cljs-deps (-requires js)))]
            (recur (into (rest required-files) transative)
                   (conj visited transative)
                   (conj js-deps js)))
          (dependency-order js-deps))))))

(comment
  ;; only get cljs deps
  (cljs-dependencies {} ["goog.string" "cljs.core"])
  ;; get transative deps
  (cljs-dependencies {} ["clojure.string"])
  ;; don't get cljs.core twice
  (cljs-dependencies {} ["cljs.core" "clojure.string"])

  [opts & inputs]
  (let [requires (mapcat -requires inputs)
        required-cljs (cljs-dependencies opts requires)
        required (dependencies opts (set (concat (mapcat -requires required-cljs) requires)))]
    (concat (map #(-> (javascript-file (or (:url %) (io/resource (:file %)))
                                       (:provides %)
                                       (:requires %))
                      (assoc :group (:group %))) required)
            required-cljs
            inputs)))

(comment
  ;; add dependencies to literal js
