zip.cljs 875 B

12345678910111213141516171819202122
  1. (ns frontend.extensions.zip
  2. (:require [clojure.string :as string]
  3. ["jszip" :as JSZip]
  4. [promesa.core :as p]))
  5. (defn make-file [content file-name args]
  6. (let [blob-content (clj->js [content])
  7. last-modified (or (aget content "lastModified") (js/Date.))
  8. args (clj->js args)]
  9. (aset args "lastModified" last-modified)
  10. (js/File. blob-content file-name args)))
  11. (defn make-zip [zip-filename file-name-content _repo]
  12. (let [zip (JSZip.)
  13. folder (.folder zip zip-filename)]
  14. (doseq [[file-name content] file-name-content]
  15. (when-not (string/blank? content)
  16. (.file folder (-> file-name
  17. (string/replace #"^/+" ""))
  18. content)))
  19. (p/let [zip-blob (.generateAsync zip #js {:type "blob"})]
  20. (make-file zip-blob (str zip-filename ".zip") {:type "application/zip"}))))