diff --git a/planck-cljs/src/planck/core.cljs b/planck-cljs/src/planck/core.cljs index 529774cf..ef8f6538 100644 --- a/planck-cljs/src/planck/core.cljs +++ b/planck-cljs/src/planck/core.cljs @@ -394,11 +394,7 @@ "Resolves namespace-qualified sym per [[resolve]]. If initial resolve fails, attempts to require `sym`'s namespace and retries." [sym] - (if (qualified-symbol? sym) - (or (resolve sym) - (do (eval `(require '~(-> sym namespace symbol))) - (resolve sym))) - (throw (js/Error. (str "Not a qualified symbol: " sym))))) + (#'repl/requiring-resolve sym)) (s/fdef requiring-resolve :args (s/cat :sym qualified-symbol?) diff --git a/planck-cljs/src/planck/from/clojure/main.cljs b/planck-cljs/src/planck/from/clojure/main.cljs new file mode 100644 index 00000000..221f2ddf --- /dev/null +++ b/planck-cljs/src/planck/from/clojure/main.cljs @@ -0,0 +1,35 @@ +(ns ^:no-doc planck.from.clojure.main + (:require + [planck.core :refer [requiring-resolve with-open spit]] + [planck.io :as io :refer [temp-file]] + [cljs.repl])) + +;; Copied and revised for use in Planck +(defn report-error + "Create and output an exception report for a Throwable to target. + Options: + :target - \"file\" (default), \"stderr\", \"none\" + If file is specified but cannot be written, falls back to stderr." + [t & {:keys [target] + :or {target "file"} :as opts}] + (when-not (= target "none") + (let [trace (cljs.repl/Error->map t) + triage (cljs.repl/ex-triage trace) + message (cljs.repl/ex-str triage) + report (array-map + :planck.repl/message message + :planck.repl/triage triage + :planck.repl/trace trace) + report-str (with-out-str + (binding [*print-namespace-maps* false] + ((requiring-resolve 'clojure.pprint/pprint) report))) + err-path (when (= target "file") + (try + (let [f (temp-file)] + (spit f report-str) + (:path f)) + (catch :default _)))] ;; ignore, fallback to stderr + (binding [*print-fn* *print-err-fn*] + (if err-path + (println (str message \newline "Full report at:" \newline err-path)) + (println (str report-str \newline message))))))) diff --git a/planck-cljs/src/planck/repl.cljs b/planck-cljs/src/planck/repl.cljs index c9a52c33..35ed3f78 100644 --- a/planck-cljs/src/planck/repl.cljs +++ b/planck-cljs/src/planck/repl.cljs @@ -1222,13 +1222,16 @@ (load m (load-opts) cb)) (declare ^{:arglists '([error])} skip-cljsjs-eval-error) +(declare ^{:arglists '([sym])} requiring-resolve) (defn- handle-error [e include-stacktrace?] - (do - (print-error e include-stacktrace?) - (if (not (:repl @app-env)) - (js/PLANCK_EXIT_WITH_VALUE 1) + (if (not (:repl @app-env)) + (do + ((requiring-resolve 'planck.from.clojure.main/report-error) e) + (js/PLANCK_EXIT_WITH_VALUE 1)) + (do + (print-error e include-stacktrace?) (set! *e (skip-cljsjs-eval-error e))))) (defn- get-eval-fn [] @@ -2198,6 +2201,14 @@ [sym] (ns-resolve (.-name *ns*) sym)) +(defn- requiring-resolve + [sym] + (if (qualified-symbol? sym) + (or (resolve sym) + (do (cljs.core/eval `(require '~(-> sym namespace symbol))) + (resolve sym))) + (throw (js/Error. (str "Not a qualified symbol: " sym))))) + (defn get-arglists "Return the argument lists for the given symbol as string, or nil if not found."