diff --git a/library/CHANGES.md b/library/CHANGES.md index c62be46685..ec170571f8 100644 --- a/library/CHANGES.md +++ b/library/CHANGES.md @@ -1,5 +1,10 @@ # CHANGELOG +## 1.0.5 + +- Add progress reporting support +- Remove leaked console.log + ## 1.0.4 - Fix incorrect shapes filtering on creating boolean shapes within components diff --git a/library/package.json b/library/package.json index c1e9898a26..af63f42054 100644 --- a/library/package.json +++ b/library/package.json @@ -1,6 +1,6 @@ { "name": "@penpot/library", - "version": "1.0.4", + "version": "1.0.5", "license": "MPL-2.0", "author": "Kaleidos INC", "packageManager": "yarn@4.9.1+sha512.f95ce356460e05be48d66401c1ae64ef84d163dd689964962c6888a9810865e39097a5e9de748876c2e0bf89b232d583c33982773e9903ae7a76257270986538", diff --git a/library/playground/sample-fill-stroke-and-media.js b/library/playground/sample-fill-stroke-and-media.js index 96cccde0d4..dbc90cdce2 100644 --- a/library/playground/sample-fill-stroke-and-media.js +++ b/library/playground/sample-fill-stroke-and-media.js @@ -80,7 +80,11 @@ import { Writable } from "stream"; } { - let result = await penpot.exportAsBytes(context); + const onProgress = (opts) => { + console.log(`Procesing ${opts.item}/${opts.total}: ${opts.path}`); + }; + + let result = await penpot.exportAsBytes(context, {onProgress}); await writeFile("sample-sync.zip", result); } diff --git a/library/src/lib/export.cljs b/library/src/lib/export.cljs index 1b81e3aa9f..7fee373440 100644 --- a/library/src/lib/export.cljs +++ b/library/src/lib/export.cljs @@ -195,31 +195,78 @@ :relations []}] ["manifest.json" (delay (json/encode params))])) +(defn- generate-procs + [state] + (let [state (deref state)] + (cons (generate-manifest-procs state) + (concat + (generate-files-export-procs state) + (generate-media-export-procs state))))) + +(def ^:private + xf:add-proc-index + (map-indexed + (fn [index proc] + (conj proc index)))) + +(def ^:private ^:function noop-fn + (constantly nil)) + (defn- export - [state writer] - (->> (p/reduce (fn [writer [path data]] - (let [data (if (delay? data) (deref data) data)] - (js/console.log "export" path) - (->> (zip/add writer path data) - (p/fmap (constantly writer))))) - - writer - (cons (generate-manifest-procs @state) - (concat - (generate-files-export-procs @state) - (generate-media-export-procs @state)))) - - (p/mcat (fn [writer] - (zip/close writer))))) + [state writer progress-fn] + (let [procs (into [] xf:add-proc-index (generate-procs state)) + total (count procs)] + (->> (p/reduce (fn [writer [path data index]] + (let [data (if (delay? data) (deref data) data) + report #js {:total total + :item (inc index) + :path path}] + (->> (zip/add writer path data) + (p/fmap (fn [_] + (progress-fn report) + writer))))) + writer + procs) + (p/mcat (fn [writer] + (zip/close writer)))))) (defn export-bytes - [state] - (export state (zip/writer (zip/bytes-writer)))) + ([state] + (export state (zip/writer (zip/bytes-writer)) noop-fn)) + ([state options] + (let [options + (if (object? options) + (json/->clj options) + options) + + progress-fn + (get options :on-progress noop-fn)] + + (export state (zip/writer (zip/bytes-writer)) progress-fn)))) (defn export-blob - [state] - (export state (zip/writer (zip/blob-writer)))) + ([state] + (export state (zip/writer (zip/blob-writer)) noop-fn)) + ([state options] + (let [options + (if (object? options) + (json/->clj options) + options) + + progress-fn + (get options :on-progress noop-fn)] + + (export state (zip/writer (zip/blob-writer)) progress-fn)))) (defn export-stream - [state stream] - (export state (zip/writer stream))) + ([state stream] + (export state (zip/writer stream) noop-fn)) + ([state stream options] + (let [options + (if (object? options) + (json/->clj options) + options) + + progress-fn + (get options :on-progress noop-fn)] + (export state (zip/writer stream) progress-fn))))