Added compiled JavaScript to repository for GitHub pages

This feels like a mistake...
This commit is contained in:
Simon Brooke 2020-10-20 14:44:11 +01:00
parent 3d5a2fb322
commit dc226b1f25
468 changed files with 212152 additions and 2 deletions

View file

@ -0,0 +1,43 @@
(ns devtools.async
(:require-macros [devtools.util :refer [oget oset ocall oapply]])
(:require [goog.async.nextTick :as next-tick]))
(defn ^:dynamic available? []
(exists? js/Promise))
(def ^:dynamic *installed* false)
(def ^:dynamic *original-set-immediate* nil)
; see http://stackoverflow.com/a/30741722/84283
(defn rethrow-outside-promise [e]
(js/setTimeout #(throw e) 0))
(defn promise-based-set-immediate [callback]
(-> (ocall js/Promise "resolve")
(ocall "then" callback)
(ocall "catch" rethrow-outside-promise))
nil)
(defn install-async-set-immediate! []
(set! *original-set-immediate* next-tick/setImmediate_)
(set! next-tick/setImmediate_ promise-based-set-immediate))
(defn uninstall-async-set-immediate! []
(set! next-tick/setImmediate_ *original-set-immediate*))
; -- installation -----------------------------------------------------------------------------------------------------------
(defn installed? []
*installed*)
(defn install! []
(when-not *installed*
(set! *installed* true)
(oset js/Error ["stackTraceLimit"] js/Infinity)
(install-async-set-immediate!)
true))
(defn uninstall! []
(when *installed*
(set! *installed* false)
(uninstall-async-set-immediate!)))

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,67 @@
// Compiled by ClojureScript 1.9.229 {}
goog.provide('devtools.async');
goog.require('cljs.core');
goog.require('goog.async.nextTick');
devtools.async.available_QMARK_ = (function devtools$async$available_QMARK_(){
return typeof Promise !== 'undefined';
});
devtools.async._STAR_installed_STAR_ = false;
devtools.async._STAR_original_set_immediate_STAR_ = null;
devtools.async.rethrow_outside_promise = (function devtools$async$rethrow_outside_promise(e){
return setTimeout((function (){
throw e;
}),(0));
});
devtools.async.promise_based_set_immediate = (function devtools$async$promise_based_set_immediate(callback){
var o__41049__auto___42135 = (function (){var o__41049__auto__ = (function (){var o__41049__auto__ = Promise;
return goog.object.get(o__41049__auto__,"resolve").call(o__41049__auto__);
})();
return goog.object.get(o__41049__auto__,"then").call(o__41049__auto__,callback);
})();
goog.object.get(o__41049__auto___42135,"catch").call(o__41049__auto___42135,devtools.async.rethrow_outside_promise);
return null;
});
devtools.async.install_async_set_immediate_BANG_ = (function devtools$async$install_async_set_immediate_BANG_(){
devtools.async._STAR_original_set_immediate_STAR_ = goog.async.nextTick.setImmediate_;
return goog.async.nextTick.setImmediate_ = devtools.async.promise_based_set_immediate;
});
devtools.async.uninstall_async_set_immediate_BANG_ = (function devtools$async$uninstall_async_set_immediate_BANG_(){
return goog.async.nextTick.setImmediate_ = devtools.async._STAR_original_set_immediate_STAR_;
});
devtools.async.installed_QMARK_ = (function devtools$async$installed_QMARK_(){
return devtools.async._STAR_installed_STAR_;
});
devtools.async.install_BANG_ = (function devtools$async$install_BANG_(){
if(cljs.core.truth_(devtools.async._STAR_installed_STAR_)){
return null;
} else {
devtools.async._STAR_installed_STAR_ = true;
var G__42137_42138 = Error;
var target__41068__auto___42139 = G__42137_42138;
if(cljs.core.truth_(target__41068__auto___42139)){
} else {
throw (new Error([cljs.core.str("Assert failed: "),cljs.core.str([cljs.core.str("unable to locate object path "),cljs.core.str(null),cljs.core.str(" in "),cljs.core.str(G__42137_42138)].join('')),cljs.core.str("\n"),cljs.core.str("target__41068__auto__")].join('')));
}
goog.object.set(target__41068__auto___42139,cljs.core.last.call(null,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, ["stackTraceLimit"], null)),Infinity);
devtools.async.install_async_set_immediate_BANG_.call(null);
return true;
}
});
devtools.async.uninstall_BANG_ = (function devtools$async$uninstall_BANG_(){
if(cljs.core.truth_(devtools.async._STAR_installed_STAR_)){
devtools.async._STAR_installed_STAR_ = false;
return devtools.async.uninstall_async_set_immediate_BANG_.call(null);
} else {
return null;
}
});
//# sourceMappingURL=async.js.map?rel=1603199213777

View file

@ -0,0 +1 @@
{"version":3,"file":"\/Users\/simon\/workspace\/swinging-needle-meter\/docs\/js\/compiled\/out\/devtools\/async.js","sources":["async.cljs?rel=1603199213778"],"lineCount":67,"mappings":";AAAA;;;AAIA,kCAAA,lCAAgBA;AAAhB,AACE,cAASC;;AAEX,uCAAA,vCAAeC;AACf,oDAAA,pDAAeC;AAGf,yCAAA,zCAAMC,0FAAyBC;AAA\/B,AACE,kBAAA,XAACC;AAAD,AAAgB,MAAOD;GAAvB;;AAEF,6CAAA,7CAAME,kGAA6BC;AAAnC,iEACM,iBAAAC,mBAAOR,xEACP,iBAAAQ,9CACA,IAAAA;AAFA,AAAA,OAAA,AAAAC,gBAAAD,iBAAA,gBAAAA;;AACA,AAAA,OAAA,AAAAC,gBAAAD,iBAAA,aAAAA,iBAAcD;;AACd,AAAA,AAAA,AAAAE,gBAAAD,uBAAA,cAAAA,uBAAeL;;AAHrB;;AAMA,mDAAA,nDAAMO;AAAN,AACE,AAAMR,oDAAyBS;;AAC\/B,OAAMA,oCAAwBL;;AAEhC,qDAAA,rDAAMM;AAAN,AACE,OAAMD,oCAAwBT;;AAIhC,kCAAA,lCAAMW;AAAN,AACEZ;;AAEF,+BAAA,\/BAAMa;AAAN,AACE,oBAAUb;AAAV;;AAAA,AACE,uCAAA,vCAAMA;;AACN,IAAAc,iBAAME;IAAND,8BAAAD;AAAA,AAAA,oBAAAC;AAAA;AAAA,AAAA,MAAA,KAAAC,MAAA,eAAA,iCAAA,eAAA,+CAAA,oBAAA,sBAAAF,yCAAA,oBAAA;;;AAAA,AAAAG,gBAAAF,4BAAA,AAAAG,yBAAA,mFAAA,2BAAmCC;;AAAnCL;AACA,AAACL;;AAHH;;;AAMF,iCAAA,jCAAMW;AAAN,AACE,oBAAMpB;AAAN,AACE,uCAAA,vCAAMA;;AACN,OAACW;;AAFH","names":["devtools.async\/available?","js\/Promise","devtools.async\/*installed*","devtools.async\/*original-set-immediate*","devtools.async\/rethrow-outside-promise","e","js\/setTimeout","devtools.async\/promise-based-set-immediate","callback","o__41049__auto__","goog.object\/get","devtools.async\/install-async-set-immediate!","goog.async.nextTick\/setImmediate_","devtools.async\/uninstall-async-set-immediate!","devtools.async\/installed?","devtools.async\/install!","G__42137","target__41068__auto__","js\/Error","goog.object\/set","cljs.core\/last","js\/Infinity","devtools.async\/uninstall!"]}

View file

@ -0,0 +1,110 @@
(ns devtools.core
(:require [devtools.prefs :as prefs]
[devtools.hints :as hints]
[devtools.defaults :refer [feature-groups]]
[devtools.formatters :as formatters]
[devtools.async :as async]
[devtools.toolbox] ; this auto-requires the toolbox namespace, used by cljs-oops
[devtools.util :refer [display-banner-if-needed! install-feature! resolve-features! make-lib-info
print-config-overrides-if-requested!]]))
; -- public API -------------------------------------------------------------------------------------------------------------
(defn is-feature-available? [feature]
(case feature
:formatters (formatters/available?)
:hints (hints/available?)
:async (async/available?)))
(defn available?
([] (available? (prefs/pref :features-to-install)))
([features-desc]
(let [features (resolve-features! features-desc feature-groups)]
(if (empty? features)
false
(every? is-feature-available? features)))))
(defn is-feature-installed? [feature]
(case feature
:formatters (formatters/installed?)
:hints (hints/installed?)
:async (async/installed?)))
(defn installed?
([] (installed? (prefs/pref :features-to-install)))
([features-desc]
(let [features (resolve-features! features-desc feature-groups)]
(if (empty? features)
false
(every? is-feature-installed? features)))))
(defn install!
([] (install! (prefs/pref :features-to-install)))
([features-desc]
(let [features (resolve-features! features-desc feature-groups)]
(display-banner-if-needed! features feature-groups)
(print-config-overrides-if-requested! "config overrides prior install:\n")
(install-feature! :formatters features is-feature-available? formatters/install!)
(install-feature! :hints features is-feature-available? hints/install!)
(install-feature! :async features is-feature-available? async/install!))))
(defn uninstall! []
(formatters/uninstall!)
(hints/uninstall!)
(async/uninstall!))
(defn set-prefs! [new-prefs]
(prefs/set-prefs! new-prefs))
(defn get-prefs []
(prefs/get-prefs))
(defn set-pref! [pref val]
(prefs/set-pref! pref val))
; -- deprecated API ---------------------------------------------------------------------------------------------------------
(defn enable! []
(.warn js/console (str "devtools.core/enable! was removed "
"and has no effect in " (make-lib-info) " "
"=> remove the call")))
(defn disable! []
(.warn js/console (str "devtools.core/disable! was removed "
"and has no effect in " (make-lib-info) " "
"=> remove the call")))
(defn set-single-feature! [_feature _val]
(.warn js/console (str "devtools.core/set-single-feature! was removed "
"and has no effect in " (make-lib-info) " "
"=> use (devtools.core/install! features) to install custom features")))
(defn enable-single-feature! [_feature]
(.warn js/console (str "devtools.core/enable-single-feature! was removed "
"and has no effect in " (make-lib-info) " "
"=> use (devtools.core/install! features) to install custom features")))
(defn disable-single-feature! [_feature]
(.warn js/console (str "devtools.core/disable-single-feature! was removed "
"and has no effect in " (make-lib-info) " "
"=> use (devtools.core/install! features) to install custom features")))
(defn enable-feature! [& _features]
(.warn js/console (str "devtools.core/enable-feature! was removed "
"and has no effect in " (make-lib-info) " "
"=> use (devtools.core/install! features) to install custom features")))
(defn disable-feature! [& _features]
(.warn js/console (str "devtools.core/disable-feature! was removed "
"and has no effect in " (make-lib-info) " "
"=> use (devtools.core/install! features) to install custom features")))
(defn single-feature-available? [_feature]
(.warn js/console (str "devtools.core/single-feature-available? was removed "
"and has no effect in " (make-lib-info) " "
"=> use devtools.core/is-feature-available? instead")))
(defn feature-available? [& _features]
(.warn js/console (str "devtools.core/feature-available? was removed "
"and has no effect in " (make-lib-info) " "
"=> use devtools.core/is-feature-available? instead")))

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,321 @@
// Compiled by ClojureScript 1.9.229 {}
goog.provide('devtools.core');
goog.require('cljs.core');
goog.require('devtools.prefs');
goog.require('devtools.toolbox');
goog.require('devtools.hints');
goog.require('devtools.async');
goog.require('devtools.formatters');
goog.require('devtools.util');
goog.require('devtools.defaults');
devtools.core.is_feature_available_QMARK_ = (function devtools$core$is_feature_available_QMARK_(feature){
var G__42171 = (((feature instanceof cljs.core.Keyword))?feature.fqn:null);
switch (G__42171) {
case "formatters":
return devtools.formatters.available_QMARK_.call(null);
break;
case "hints":
return devtools.hints.available_QMARK_.call(null);
break;
case "async":
return devtools.async.available_QMARK_.call(null);
break;
default:
throw (new Error([cljs.core.str("No matching clause: "),cljs.core.str(feature)].join('')));
}
});
devtools.core.available_QMARK_ = (function devtools$core$available_QMARK_(var_args){
var args42173 = [];
var len__26205__auto___42176 = arguments.length;
var i__26206__auto___42177 = (0);
while(true){
if((i__26206__auto___42177 < len__26205__auto___42176)){
args42173.push((arguments[i__26206__auto___42177]));
var G__42178 = (i__26206__auto___42177 + (1));
i__26206__auto___42177 = G__42178;
continue;
} else {
}
break;
}
var G__42175 = args42173.length;
switch (G__42175) {
case 0:
return devtools.core.available_QMARK_.cljs$core$IFn$_invoke$arity$0();
break;
case 1:
return devtools.core.available_QMARK_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
break;
default:
throw (new Error([cljs.core.str("Invalid arity: "),cljs.core.str(args42173.length)].join('')));
}
});
devtools.core.available_QMARK_.cljs$core$IFn$_invoke$arity$0 = (function (){
return devtools.core.available_QMARK_.call(null,devtools.prefs.pref.call(null,new cljs.core.Keyword(null,"features-to-install","features-to-install",102899261)));
});
devtools.core.available_QMARK_.cljs$core$IFn$_invoke$arity$1 = (function (features_desc){
var features = devtools.util.resolve_features_BANG_.call(null,features_desc,devtools.defaults.feature_groups);
if(cljs.core.empty_QMARK_.call(null,features)){
return false;
} else {
return cljs.core.every_QMARK_.call(null,devtools.core.is_feature_available_QMARK_,features);
}
});
devtools.core.available_QMARK_.cljs$lang$maxFixedArity = 1;
devtools.core.is_feature_installed_QMARK_ = (function devtools$core$is_feature_installed_QMARK_(feature){
var G__42181 = (((feature instanceof cljs.core.Keyword))?feature.fqn:null);
switch (G__42181) {
case "formatters":
return devtools.formatters.installed_QMARK_.call(null);
break;
case "hints":
return devtools.hints.installed_QMARK_.call(null);
break;
case "async":
return devtools.async.installed_QMARK_.call(null);
break;
default:
throw (new Error([cljs.core.str("No matching clause: "),cljs.core.str(feature)].join('')));
}
});
devtools.core.installed_QMARK_ = (function devtools$core$installed_QMARK_(var_args){
var args42183 = [];
var len__26205__auto___42186 = arguments.length;
var i__26206__auto___42187 = (0);
while(true){
if((i__26206__auto___42187 < len__26205__auto___42186)){
args42183.push((arguments[i__26206__auto___42187]));
var G__42188 = (i__26206__auto___42187 + (1));
i__26206__auto___42187 = G__42188;
continue;
} else {
}
break;
}
var G__42185 = args42183.length;
switch (G__42185) {
case 0:
return devtools.core.installed_QMARK_.cljs$core$IFn$_invoke$arity$0();
break;
case 1:
return devtools.core.installed_QMARK_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
break;
default:
throw (new Error([cljs.core.str("Invalid arity: "),cljs.core.str(args42183.length)].join('')));
}
});
devtools.core.installed_QMARK_.cljs$core$IFn$_invoke$arity$0 = (function (){
return devtools.core.installed_QMARK_.call(null,devtools.prefs.pref.call(null,new cljs.core.Keyword(null,"features-to-install","features-to-install",102899261)));
});
devtools.core.installed_QMARK_.cljs$core$IFn$_invoke$arity$1 = (function (features_desc){
var features = devtools.util.resolve_features_BANG_.call(null,features_desc,devtools.defaults.feature_groups);
if(cljs.core.empty_QMARK_.call(null,features)){
return false;
} else {
return cljs.core.every_QMARK_.call(null,devtools.core.is_feature_installed_QMARK_,features);
}
});
devtools.core.installed_QMARK_.cljs$lang$maxFixedArity = 1;
devtools.core.install_BANG_ = (function devtools$core$install_BANG_(var_args){
var args42190 = [];
var len__26205__auto___42193 = arguments.length;
var i__26206__auto___42194 = (0);
while(true){
if((i__26206__auto___42194 < len__26205__auto___42193)){
args42190.push((arguments[i__26206__auto___42194]));
var G__42195 = (i__26206__auto___42194 + (1));
i__26206__auto___42194 = G__42195;
continue;
} else {
}
break;
}
var G__42192 = args42190.length;
switch (G__42192) {
case 0:
return devtools.core.install_BANG_.cljs$core$IFn$_invoke$arity$0();
break;
case 1:
return devtools.core.install_BANG_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
break;
default:
throw (new Error([cljs.core.str("Invalid arity: "),cljs.core.str(args42190.length)].join('')));
}
});
devtools.core.install_BANG_.cljs$core$IFn$_invoke$arity$0 = (function (){
return devtools.core.install_BANG_.call(null,devtools.prefs.pref.call(null,new cljs.core.Keyword(null,"features-to-install","features-to-install",102899261)));
});
devtools.core.install_BANG_.cljs$core$IFn$_invoke$arity$1 = (function (features_desc){
var features = devtools.util.resolve_features_BANG_.call(null,features_desc,devtools.defaults.feature_groups);
devtools.util.display_banner_if_needed_BANG_.call(null,features,devtools.defaults.feature_groups);
devtools.util.print_config_overrides_if_requested_BANG_.call(null,"config overrides prior install:\n");
devtools.util.install_feature_BANG_.call(null,new cljs.core.Keyword(null,"formatters","formatters",-1875637118),features,devtools.core.is_feature_available_QMARK_,devtools.formatters.install_BANG_);
devtools.util.install_feature_BANG_.call(null,new cljs.core.Keyword(null,"hints","hints",-991113151),features,devtools.core.is_feature_available_QMARK_,devtools.hints.install_BANG_);
return devtools.util.install_feature_BANG_.call(null,new cljs.core.Keyword(null,"async","async",1050769601),features,devtools.core.is_feature_available_QMARK_,devtools.async.install_BANG_);
});
devtools.core.install_BANG_.cljs$lang$maxFixedArity = 1;
devtools.core.uninstall_BANG_ = (function devtools$core$uninstall_BANG_(){
devtools.formatters.uninstall_BANG_.call(null);
devtools.hints.uninstall_BANG_.call(null);
return devtools.async.uninstall_BANG_.call(null);
});
devtools.core.set_prefs_BANG_ = (function devtools$core$set_prefs_BANG_(new_prefs){
return devtools.prefs.set_prefs_BANG_.call(null,new_prefs);
});
devtools.core.get_prefs = (function devtools$core$get_prefs(){
return devtools.prefs.get_prefs.call(null);
});
devtools.core.set_pref_BANG_ = (function devtools$core$set_pref_BANG_(pref,val){
return devtools.prefs.set_pref_BANG_.call(null,pref,val);
});
devtools.core.enable_BANG_ = (function devtools$core$enable_BANG_(){
return console.warn([cljs.core.str("devtools.core/enable! was removed "),cljs.core.str("and has no effect in "),cljs.core.str(devtools.util.make_lib_info.call(null)),cljs.core.str(" "),cljs.core.str("=> remove the call")].join(''));
});
devtools.core.disable_BANG_ = (function devtools$core$disable_BANG_(){
return console.warn([cljs.core.str("devtools.core/disable! was removed "),cljs.core.str("and has no effect in "),cljs.core.str(devtools.util.make_lib_info.call(null)),cljs.core.str(" "),cljs.core.str("=> remove the call")].join(''));
});
devtools.core.set_single_feature_BANG_ = (function devtools$core$set_single_feature_BANG_(_feature,_val){
return console.warn([cljs.core.str("devtools.core/set-single-feature! was removed "),cljs.core.str("and has no effect in "),cljs.core.str(devtools.util.make_lib_info.call(null)),cljs.core.str(" "),cljs.core.str("=> use (devtools.core/install! features) to install custom features")].join(''));
});
devtools.core.enable_single_feature_BANG_ = (function devtools$core$enable_single_feature_BANG_(_feature){
return console.warn([cljs.core.str("devtools.core/enable-single-feature! was removed "),cljs.core.str("and has no effect in "),cljs.core.str(devtools.util.make_lib_info.call(null)),cljs.core.str(" "),cljs.core.str("=> use (devtools.core/install! features) to install custom features")].join(''));
});
devtools.core.disable_single_feature_BANG_ = (function devtools$core$disable_single_feature_BANG_(_feature){
return console.warn([cljs.core.str("devtools.core/disable-single-feature! was removed "),cljs.core.str("and has no effect in "),cljs.core.str(devtools.util.make_lib_info.call(null)),cljs.core.str(" "),cljs.core.str("=> use (devtools.core/install! features) to install custom features")].join(''));
});
devtools.core.enable_feature_BANG_ = (function devtools$core$enable_feature_BANG_(var_args){
var args__26212__auto__ = [];
var len__26205__auto___42198 = arguments.length;
var i__26206__auto___42199 = (0);
while(true){
if((i__26206__auto___42199 < len__26205__auto___42198)){
args__26212__auto__.push((arguments[i__26206__auto___42199]));
var G__42200 = (i__26206__auto___42199 + (1));
i__26206__auto___42199 = G__42200;
continue;
} else {
}
break;
}
var argseq__26213__auto__ = ((((0) < args__26212__auto__.length))?(new cljs.core.IndexedSeq(args__26212__auto__.slice((0)),(0),null)):null);
return devtools.core.enable_feature_BANG_.cljs$core$IFn$_invoke$arity$variadic(argseq__26213__auto__);
});
devtools.core.enable_feature_BANG_.cljs$core$IFn$_invoke$arity$variadic = (function (_features){
return console.warn([cljs.core.str("devtools.core/enable-feature! was removed "),cljs.core.str("and has no effect in "),cljs.core.str(devtools.util.make_lib_info.call(null)),cljs.core.str(" "),cljs.core.str("=> use (devtools.core/install! features) to install custom features")].join(''));
});
devtools.core.enable_feature_BANG_.cljs$lang$maxFixedArity = (0);
devtools.core.enable_feature_BANG_.cljs$lang$applyTo = (function (seq42197){
return devtools.core.enable_feature_BANG_.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq.call(null,seq42197));
});
devtools.core.disable_feature_BANG_ = (function devtools$core$disable_feature_BANG_(var_args){
var args__26212__auto__ = [];
var len__26205__auto___42202 = arguments.length;
var i__26206__auto___42203 = (0);
while(true){
if((i__26206__auto___42203 < len__26205__auto___42202)){
args__26212__auto__.push((arguments[i__26206__auto___42203]));
var G__42204 = (i__26206__auto___42203 + (1));
i__26206__auto___42203 = G__42204;
continue;
} else {
}
break;
}
var argseq__26213__auto__ = ((((0) < args__26212__auto__.length))?(new cljs.core.IndexedSeq(args__26212__auto__.slice((0)),(0),null)):null);
return devtools.core.disable_feature_BANG_.cljs$core$IFn$_invoke$arity$variadic(argseq__26213__auto__);
});
devtools.core.disable_feature_BANG_.cljs$core$IFn$_invoke$arity$variadic = (function (_features){
return console.warn([cljs.core.str("devtools.core/disable-feature! was removed "),cljs.core.str("and has no effect in "),cljs.core.str(devtools.util.make_lib_info.call(null)),cljs.core.str(" "),cljs.core.str("=> use (devtools.core/install! features) to install custom features")].join(''));
});
devtools.core.disable_feature_BANG_.cljs$lang$maxFixedArity = (0);
devtools.core.disable_feature_BANG_.cljs$lang$applyTo = (function (seq42201){
return devtools.core.disable_feature_BANG_.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq.call(null,seq42201));
});
devtools.core.single_feature_available_QMARK_ = (function devtools$core$single_feature_available_QMARK_(_feature){
return console.warn([cljs.core.str("devtools.core/single-feature-available? was removed "),cljs.core.str("and has no effect in "),cljs.core.str(devtools.util.make_lib_info.call(null)),cljs.core.str(" "),cljs.core.str("=> use devtools.core/is-feature-available? instead")].join(''));
});
devtools.core.feature_available_QMARK_ = (function devtools$core$feature_available_QMARK_(var_args){
var args__26212__auto__ = [];
var len__26205__auto___42206 = arguments.length;
var i__26206__auto___42207 = (0);
while(true){
if((i__26206__auto___42207 < len__26205__auto___42206)){
args__26212__auto__.push((arguments[i__26206__auto___42207]));
var G__42208 = (i__26206__auto___42207 + (1));
i__26206__auto___42207 = G__42208;
continue;
} else {
}
break;
}
var argseq__26213__auto__ = ((((0) < args__26212__auto__.length))?(new cljs.core.IndexedSeq(args__26212__auto__.slice((0)),(0),null)):null);
return devtools.core.feature_available_QMARK_.cljs$core$IFn$_invoke$arity$variadic(argseq__26213__auto__);
});
devtools.core.feature_available_QMARK_.cljs$core$IFn$_invoke$arity$variadic = (function (_features){
return console.warn([cljs.core.str("devtools.core/feature-available? was removed "),cljs.core.str("and has no effect in "),cljs.core.str(devtools.util.make_lib_info.call(null)),cljs.core.str(" "),cljs.core.str("=> use devtools.core/is-feature-available? instead")].join(''));
});
devtools.core.feature_available_QMARK_.cljs$lang$maxFixedArity = (0);
devtools.core.feature_available_QMARK_.cljs$lang$applyTo = (function (seq42205){
return devtools.core.feature_available_QMARK_.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq.call(null,seq42205));
});
//# sourceMappingURL=core.js.map?rel=1603199214023

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,394 @@
(ns devtools.defaults
; warning: when touching this ns form, update also eval-css-arg in defaults.clj
(:require-macros [devtools.defaults :as d :refer [css span named-color]]))
(def known-features [:formatters :hints :async])
(def default-features [:formatters])
(def feature-groups {:all known-features
:default default-features})
(def prefs
{; -- installation --------------------------------------------------------------------------------------------------------
; you can specify a list/vector of features from known-features or a keyword from feature-groups
:features-to-install :default
:print-config-overrides false
:suppress-preload-install false
:bypass-availability-checks false
:file-reader nil
; -- feature tweaks ------------------------------------------------------------------------------------------------------
:render-metas true
:render-nils true
:render-bools true
:render-strings true
:render-numbers true
:render-keywords true
:render-symbols true
:render-instances true
:render-types true
:render-functions true
:disable-cljs-fn-formatting false ; deprecated, use :render-functions instead
; -- verbosity controls --------------------------------------------------------------------------------------------------
:max-print-level 2
:body-line-max-print-level 3
:max-header-elements 5
:min-expandable-sequable-count 0 ; false/nil means "never expandable", 0 means "always expandable" (unless empty)
:min-expandable-sequable-count-for-well-known-types 4 ; false/nil means "never expandable", 0 means "always expandable" (unless empty)
:max-number-body-items 100
:string-prefix-limit 20
:string-postfix-limit 20
:sanity-hint-min-length 128
:max-instance-header-fields 3
:max-instance-custom-printing-level 2
:max-list-protocols 5
:max-protocol-method-arities-list 3
:initial-hierarchy-depth-budget (dec 20) ; set to false to disable, issue #22
; by default, well known types will render only via cljs printer, we won't wrap them in the blue-ish type info
:well-known-types #{"cljs.core/Keyword"
"cljs.core/Symbol"
"cljs.core/TaggedLiteral"
"cljs.core/LazySeq"
"cljs.core/LazyTransformer"
"cljs.core/IndexedSeq"
"cljs.core/RSeq"
"cljs.core/PersistentQueueSeq"
"cljs.core/PersistentTreeMapSeq"
"cljs.core/NodeSeq"
"cljs.core/ArrayNodeSeq"
"cljs.core/List"
"cljs.core/Cons"
"cljs.core/EmptyList"
"cljs.core/PersistentVector"
"cljs.core/ChunkedCons"
"cljs.core/ChunkedSeq"
"cljs.core/Subvec"
"cljs.core/BlackNode"
"cljs.core/RedNode"
"cljs.core/ObjMap"
"cljs.core/KeySeq"
"cljs.core/ValSeq"
"cljs.core/PersistentArrayMapSeq"
"cljs.core/PersistentArrayMap"
"cljs.core/PersistentHashMap"
"cljs.core/PersistentTreeMap"
"cljs.core/PersistentHashSet"
"cljs.core/PersistentTreeSet"
"cljs.core/Range"
"cljs.core/ES6IteratorSeq"
"cljs.core/Eduction"
"cljs.core/UUID"
"cljs.core/ExceptionInfo"}
; -- pluggable markup ----------------------------------------------------------------------------------------------------
:more-marker "…"
:body-items-more-label "more…"
:string-abbreviation-marker " … "
:multi-arity-symbol "…"
:more-symbol "…"
:plus-symbol "+"
:header-field-value-spacer (span (css (str "color:" (named-color :field-spacer) ";")) "=")
:body-field-value-spacer (span (css (str "color:" (named-color :field-spacer) ";")) "=")
:header-field-separator " "
:more-fields-symbol "…"
:instance-value-separator ""
:fields-header-open-symbol ""
:fields-header-close-symbol ""
:fields-header-no-fields-symbol (span :header-field-name-style "∅")
:rest-symbol " & "
:args-open-symbol "["
:args-close-symbol "]"
:new-line-string-replacer "↵"
:line-index-separator ""
:dq "\""
:protocol-method-arities-more-symbol "…"
:protocol-method-arities-list-header-separator " "
:spacer " "
:nil-label "nil"
:default-envelope-header "\uD83D\uDCE8" ; U+1F4E8: INCOMING ENVELOPE, http://www.charbase.com/1f4e8-unicode-incoming-envelope
:list-separator " "
:list-open-symbol ""
:list-close-symbol ""
:empty-basis-symbol (span (css) :basis-icon (span :type-basis-item-style "∅"))
:expandable-symbol ""
:header-expander-symbol (span (css) "~")
; -- backgrounds ---------------------------------------------------------------------------------------------------------
:instance-custom-printing-background (d/get-custom-printing-background-markup)
:type-header-background (d/get-instance-type-header-background-markup)
:native-reference-background (d/get-native-reference-background-markup)
:protocol-background (d/get-protocol-background-markup)
:instance-header-background nil
; -- icons ---------------------------------------------------------------------------------------------------------------
:basis-icon (d/icon "β" (named-color :basis))
:protocols-icon (d/icon "⊢" (named-color :protocol))
:fields-icon (d/icon "∋" (named-color :field))
:method-icon (d/icon "m" (named-color :method))
:ns-icon (d/icon "in" (named-color :ns))
:native-icon (d/icon "js" (named-color :native))
:lambda-icon (d/icon "λ" (named-color :lambda))
:fn-icon (d/icon "fn" (named-color :fn))
:circular-ref-icon (d/icon "∞" (named-color :circular-ref) :slim)
; -- tags ----------------------------------------------------------------------------------------------------------------
:cljs-land-tag [:span :cljs-land-style]
:header-tag [:span :header-style]
:item-tag [:span :item-style]
:nil-tag [:span :nil-style]
:bool-tag [:span :bool-style]
:keyword-tag [:span :keyword-style]
:symbol-tag [:span :symbol-style]
:integer-tag [:span :integer-style]
:float-tag [:span :float-style]
:string-tag [:span :string-style]
:expanded-string-tag [:span :expanded-string-style]
:circular-reference-tag [:span :circular-reference-wrapper-style]
:circular-reference-body-tag [:span :circular-reference-body-style]
:native-reference-tag [:span :native-reference-style]
:native-reference-wrapper-tag [:span :native-reference-wrapper-style]
:meta-wrapper-tag [:span :meta-wrapper-style]
:meta-header-tag [:span :meta-style]
:meta-body-tag [:span :meta-body-style]
:meta-reference-tag [:span :meta-reference-style]
:body-tag [:span :body-style]
:index-tag [:span :index-style]
:standard-ol-tag [:ol :standard-ol-style]
:standard-ol-no-margin-tag [:ol :standard-ol-no-margin-style]
:standard-li-tag [:li :standard-li-style]
:standard-li-no-margin-tag [:li :standard-li-no-margin-style]
:aligned-li-tag [:li :aligned-li-style]
:body-items-more-tag [:span :body-items-more-style]
:fn-args-tag [:span :fn-args-style]
:fn-name-tag [:span :fn-name-style]
:fn-prefix-tag [:span :fn-prefix-style]
:fn-header-tag [:span :fn-header-style]
:fn-multi-arity-args-indent-tag [:span :fn-multi-arity-args-indent-style]
:fn-ns-name-tag [:span :fn-ns-name-style]
:type-wrapper-tag [:span :type-wrapper-style]
:type-header-tag [:span :type-header-style]
:type-name-tag [:span :type-name-style]
:type-ref-tag [:span :type-ref-style]
:type-basis-tag [:span :type-basis-style]
:type-basis-item-tag [:span :type-basis-item-style]
:standalone-type-tag [:span :standalone-type-style]
:header-field-tag [:span :header-field-style]
:header-field-name-tag [:span :header-field-name-style]
:header-field-value-tag [:span :header-field-value-style]
:instance-body-fields-table-tag [:table :instance-body-fields-table-style]
:body-field-tr-tag [:tr :body-field-tr-style]
:body-field-td1-tag [:td :body-field-td1-style]
:body-field-td2-tag [:td :body-field-td2-style]
:body-field-td3-tag [:td :body-field-td3-style]
:body-field-name-tag [:span :body-field-name-style]
:body-field-value-tag [:span :body-field-value-style]
:fields-header-tag [:span :fields-header-style]
:protocol-method-arities-header-tag [:span :protocol-method-arities-header-style]
:protocol-name-tag [:span :protocol-name-style]
:protocol-method-tag [:span :protocol-method-style]
:protocol-method-name-tag [:span :protocol-method-name-style]
:protocol-ns-name-tag [:span :protocol-ns-name-style]
:protocols-header-tag [:span :protocols-header-style]
:protocol-more-tag [:span :protocol-more-style]
:fast-protocol-tag [:span :fast-protocol-style]
:slow-protocol-tag [:span :slow-protocol-style]
:instance-value-tag [:span :instance-value-style]
:instance-custom-printing-wrapper-tag [:span :instance-custom-printing-wrapper-style]
:instance-header-tag [:span :instance-header-style]
:instance-type-header-tag [:span :instance-type-header-style]
:list-tag [:span :list-style]
:expandable-tag [:span :expandable-style]
:expandable-inner-tag [:span :expandable-inner-style]
:instance-custom-printing-tag [:span :instance-custom-printing-style]
:default-envelope-tag [:span :default-envelope-style]
; -- DOM tags mapping ----------------------------------------------------------------------------------------------------
:span "span"
:div "div"
:ol "ol"
:li "li"
:table "table"
:td "td"
:tr "tr"
; -- styles --------------------------------------------------------------------------------------------------------------
:cljs-land-style (css (str "background-color: " (named-color :signature-background) ";")
(str "color: " (named-color :base-text-color) ";") ; prevent leaking in text colors from "outside"
"border-radius: 2px;")
:header-style (css "white-space: nowrap;") ; this prevents jumping of content when expanding sections due to content wrapping
:expandable-style (css "white-space: nowrap;"
"padding-left: 3px;")
:expandable-inner-style (css "margin-left: -3px;")
:item-style (css "display: inline-block;"
"white-space: nowrap;"
"border-left: 2px solid rgba(100, 100, 100, 0.2);"
"padding: 0px 4px 0px 4px;"
"margin: 1px 0px 0px 0px;")
:fn-header-style (css)
:fn-prefix-style (css)
:nil-style (css (str "color: " (named-color :nil) ";"))
:keyword-style (css (str "color: " (named-color :keyword) ";"))
:integer-style (css (str "color: " (named-color :integer) ";"))
:float-style (css (str "color: " (named-color :float) ";"))
:string-style (css (str "color: " (named-color :string) ";"))
:symbol-style (css (str "color: " (named-color :symbol) ";"))
:bool-style (css (str "color: " (named-color :bool) ";"))
; native reference wrapper is here to counter some "evil" internal DevTools styles in treeoutline.css
; namely :host padding[1] and li min-height[2]
; [1] https://github.com/binaryage/dirac/blob/acdf79e782510f6cdac609def3f561d5d04c86c8/front_end/ui/treeoutline.css#L9
; [2] https://github.com/binaryage/dirac/blob/acdf79e782510f6cdac609def3f561d5d04c86c8/front_end/ui/treeoutline.css#L80
:native-reference-wrapper-style (css "position: relative;"
"display: inline-flex;")
:native-reference-style (css "padding: 0px 3px;"
"margin: -4px 0px -2px;"
"position: relative;"
"top: 1px;")
:type-wrapper-style (css "position: relative;"
"padding-left: 1px;"
"border-radius: 2px;")
:type-ref-style (css "position: relative;")
:type-header-style (css (d/get-common-type-header-style)
"border-radius: 2px;")
:type-name-style (css "padding-right: 4px;")
:type-basis-style (css "margin-right: 3px;")
:type-basis-item-style (css (str "color: " (named-color :basis) ";")
"margin-right: 6px;")
:protocol-name-style (css "position: relative;")
:fast-protocol-style (css (d/get-common-protocol-style)
(str "color: " (named-color :fast-protocol) ";"))
:slow-protocol-style (css (d/get-common-protocol-style)
(str "color: " (named-color :slow-protocol) ";"))
:protocol-more-style (css "font-size: 8px;"
"position: relative;")
:protocol-ns-name-style (css (str "color: " (named-color :ns) ";"))
:list-style (css)
:body-field-name-style (css (str "color: " (named-color :field) ";"))
:body-field-value-style (css "margin-left: 6px;")
:header-field-name-style (css (str "color: " (named-color :field) ";"))
:body-field-td1-style (css "vertical-align: top;"
"padding: 0;"
"padding-right: 4px;")
:body-field-td2-style (css "vertical-align: top;"
"padding: 0;")
:body-field-td3-style (css "vertical-align: top;"
"padding: 0;")
:instance-header-style (css (d/type-outline-style)
"position:relative;")
:expandable-wrapper-style (css)
:standalone-type-style (css (d/type-outline-style))
:instance-custom-printing-style (css "position: relative;"
"padding: 0 2px 0 4px;")
:instance-custom-printing-wrapper-style (css "position: relative;"
"border-radius: 2px;")
:instance-type-header-style (css (d/get-common-type-header-style)
"border-radius: 2px 0 0 2px;")
:instance-body-fields-table-style (css "border-spacing: 0;"
"border-collapse: collapse;"
"margin-bottom: -2px;" ; weird spacing workaround
"display: inline-block;")
:fields-header-style (css "padding: 0px 3px;")
:protocol-method-name-style (css "margin-right: 6px;"
(str "color: " (named-color :protocol) " ;"))
:meta-wrapper-style (css (str "box-shadow: 0px 0px 0px 1px " (named-color :meta) " inset;")
"margin-top: 1px;"
"border-radius: 2px;")
:meta-reference-style (css (str "background-color:" (named-color :meta) ";")
"border-radius: 0 2px 2px 0;")
:meta-style (css (str "color: " (named-color :meta-text) ";")
"padding: 0px 3px;"
"-webkit-user-select: none;")
:meta-body-style (css (str "background-color: " (named-color :meta 0.1) ";")
(str "box-shadow: 0px 0px 0px 1px " (named-color :meta) " inset;")
"position: relative;"
"top: -1px;"
"padding: 3px 12px;"
"border-bottom-right-radius: 2px;")
:fn-ns-name-style (css (str "color: " (named-color :ns) ";"))
:fn-name-style (css (str "color: " (named-color :fn) ";")
"margin-right: 2px;")
:fn-args-style (css (str "color: " (named-color :fn-args) ";"))
:fn-multi-arity-args-indent-style (css "visibility: hidden;")
:standard-ol-style (css "list-style-type: none;"
"padding-left: 0px;"
"margin-top: 0px;"
"margin-bottom: 0px;"
"margin-left: 0px;")
:standard-ol-no-margin-style (css "list-style-type: none;"
"padding-left: 0px;"
"margin-top: 0px;"
"margin-bottom: 0px;"
"margin-left: 0px;")
:standard-li-style (css "margin-left: 0px;"
(d/get-body-line-common-style))
:standard-li-no-margin-style (css "margin-left: 0px;"
(d/get-body-line-common-style))
:aligned-li-style (css "margin-left: 0px;"
(d/get-body-line-common-style))
:body-items-more-style (css (str "background-color:" (named-color :more-background) ";")
"min-width: 50px;"
"display: inline-block;"
(str "color: " (named-color :more) ";")
"cursor: pointer;"
"line-height: 14px;"
"font-size: 10px;"
"border-radius: 2px;"
"padding: 0px 4px 0px 4px;"
"margin: 1px 0px 0px 0px;"
"-webkit-user-select: none;")
:body-style (css "display: inline-block;"
"padding: 3px 12px;"
(str "border-top: 2px solid " (named-color :body-border) ";")
"margin: 1px;"
"margin-top: 0px;"
(str "background-color: " (named-color :signature-background) ";"))
:index-style (css "min-width: 50px;"
"display: inline-block;"
"text-align: right;"
"vertical-align: top;"
(str "background-color: " (named-color :index-background) ";")
(str "color: " (named-color :index) ";")
"opacity: 0.5;"
"margin-right: 3px;"
"padding: 0px 4px 0px 4px;"
"margin: 1px 0px 0px 0px;"
"-webkit-user-select: none;")
:expanded-string-style (css "padding: 0px 12px 0px 12px;"
(str "color: " (named-color :string) ";")
"white-space: pre;"
(str "border-top: 1px solid " (named-color :expanded-string-border) ";")
"border-radius: 1px;"
"margin: 0px 0px 2px 0px;"
(str "background-color: " (named-color :expanded-string-background) ";"))
:default-envelope-style (css)
; -- pluggable api handlers ----------------------------------------------------------------------------------------------
:header-pre-handler nil
:header-post-handelr nil
:has-body-pre-handler nil
:has-body-post-handler nil
:body-pre-handler nil
:body-post-handler nil
; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
})

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
{"version":3,"file":"\/Users\/simon\/workspace\/swinging-needle-meter\/docs\/js\/compiled\/out\/devtools\/defaults.js","sources":["defaults.cljs?rel=1603199210896"],"lineCount":9,"mappings":";AAAA;;AAIA,mCAAA,mFAAA,kEAAA,uDAAA,\/OAAKA;AACL,qCAAA,mFAAA,xHAAKC;AACL,mCAAA,2CAAA,mFAAA,jKAAKC,gIAAyBF,6FACAC;AAE9B,0BAAA,wCAAA,sFAAA,iGAAA,sFAAA,qEAAA,gFAAA,gEAAA,oGAAA,yFAAA,4FAAA,6EAAA,yGAAA,kFAAA,sFAAA,6FAAA,6FAAA,mFAAA,gFAAA,2FAAA,sFAAA,mFAAA,yEAAA,8FAAA,iEAAA,2EAAA,wEAAA,mEAAA,sEAAA,qEAAA,+EAAA,wEAAA,iHAAA,0FAAA,uDAAA,0EAAA,wFAAA,uEAAA,4DAAA,uFAAA,+DAAA,qFAAA,oFAAA,mHAAA,qFAAA,8DAAA,mEAAA,+EAAA,iGAAA,4DAAA,qEAAA,iFAAA,iGAAA,kFAAA,mEAAA,yGAAA,yEAAA,iGAAA,wEAAA,wEAAA,iDAAA,gGAAA,gDAAA,+EAAA,0EAAA,oFAAA,yFAAA,2EAAA,0EAAA,kEAAA,iEAAA,wFAAA,6EAAA,8FAAA,wFAAA,kFAAA,kDAAA,uFAAA,oEAAA,0EAAA,8EAAA,uFAAA,kEAAA,0FAAA,8EAAA,mEAAA,iEAAA,8EAAA,2EAAA,iFAAA,qEAAA,kDAAA,0GAAA,+DAAA,8EAAA,qFAAA,+EAAA,yFAAA,iFAAA,oGAAA,wHAAA,oEAAA,iEAAA,6EAAA,oEAAA,4GAAA,kJAAA,iEAAA,kEAAA,+EAAA,mEAAA,4DAAA,qFAAA,uEAAA,kEAAA,iFAAA,wFAAA,mDAAA,yEAAA,gFAAA,kEAAA,iEAAA,kFAAA,oFAAA,kEAAA,0FAAA,+EAAA,oEAAA,uFAAA,uEAAA,mHAAA,uEAAA,mGAAA,2FAAA,0FAAA,iGAAA,gDAAA,yGAAA,qGAAA,kFAAA,8FAAA,yDAAA,oFAAA,6EAAA,qFAAA,0EAAA,+FAAA,6DAAA,8GAAA,gFAAA,iGAAA,mFAAA,qEAAA,8EAAA,sFAAA,iGAAA,iEAAA,uIAAA,mFAAA,iEAAA,gFAAA,0EAAA,oFAAA,kFAAA,4DAAA,kEAAA,qFAAA,8FAAA,6DAAA,kFAAA,6FAAA,6EAAA,2EAAA,8GAAA,0EAAA,gFAAA,8EAAA,2EAAA,4EAAA,oGAAA,uFAAA,sFAAA,yEAAA,wGAAA,8EAAA,+EAAA,0GAAA,wEAAA,gHAAA,iGAAA,qEAAA,2EAAA,kFAAA,iFAAA,mEAAA,4EAAA,yFAAA,+EAAA,8EAAA,mFAAA,4EAAA,qGAAA,iGAAA,mFAAA,0FAAA,qHAAA,+EAAA,0EAAA,kFAAA,2EAAA,qFAAA,mFAAA,kFAAA,0DAAA,oFAAA,8FAAA,wFAAA,uEAAA,wFAAA,qDAAA,4JAAA,MAAA,6BAAA,mFAAA,qDAAA,2HAAA,mFAAA,qDAAA,8cAAA,GAAA,kBAAA,mFAAA,qDAAA,+FAAA,GAAA,MAAA,yCAAA,4pCAAA,mFAAA,gDAAA,4GAAA,mFAAA,qDAAA,6EAAA,KAAA,mFAAA,qDAAA,kFAAA,mFAAA,qDAAA,qGAAA,KAAA,mFAAA,qDAAA,sHAAA,wBAAA,aAAA,yDAAA,mFAAA,qDAAA,mLAAA,mFAAA,qDAAA,0EAAA,mFAAA,qDAAA,2MAAA,SAAA,KAAA,mFAAA,qDAAA,yEAAA,MAAA,mFAAA,qDAAA,4FAAA,KAAA,mFAAA,qDAAA,yEAAA,mFAAA,qDAAA,kFAAA,IAAA,WAAA,0eAAA,mFAAA,uDAAA,sHAAA,kDAAA,mFAAA,qDAAA,kFAAA,IAAA,iRAAA,KAAA,mFAAA,qDAAA,4FAAA,KAAA,mFAAA,qDAAA,2HAAA,mFAAA,qDAAA,upBAAA,MAAA,KAAA,sBAAA,KAAA,oPAAA,SAAA,qMAAA,mFAAA,qDAAA,+EAAA,mFAAA,qDAAA,qwBAAA,mFAAA,qDAAA,yFAAA,mFAAA,gDAAA,8IAAA,KAAA,oVAAA,MAAA,mIAAA,IAAA,mFAAA,iDAAA,4NAAA,SAAA,mFAAA,qDAAA,4EAAA,mFAAA,qDAAA,+jBAAA,IAAA,8eAAA,mFAAA,qDAAA,0KAAA,KAAA,mFAAA,qDAAA,0EAAA,mFAAA,qDAAA,kGAAA,mFAAA,qDAAA,8GAAA,mFAAA,qDAAA,4IAAA,MAAA,mFAAA,qDAAA,oFAAA,KAAA,SAAA,mFAAA,qDAAA,8EAAA,mFAAA,qDAAA,+FAAA,mFAAA,qDAAA,+HAAA,mFAAA,qDAAA,iJAAA,mFAAA,qDAAA,61BAAA,uHAAA,8CAAA,uBAAA,mFAAA,qDAAA,yGAAA,sDAAA,mFAAA,kDAAA,2FAAA,mFAAA,qDAAA,wHAAA,mFAAA,gDAAA,yGAAA,mFAAA,qDAAA,8JAAA,mFAAA,iDAAA,yOAAA,KAAA,IAAA,KAAA,4IAAA,IAAA,mFAAA,qDAAA,yUAAA,GAAA,KAAA,mFAAA,qDAAA,msCAAA,mFAAA,qDAAA,+EAAA,mFAAA,qDAAA,+FAAA,mFAAA,qDAAA,yGAAA,mFAAA,qDAAA,yEAAA,mFAAA,qDAAA,yIAAA,kFAAA,wBAAA,8BAAA,sBAAA,gCAAA,sBAAA,uCAAA,wBAAA,mCAAA,wBAAA,2BAAA,2BAAA,oCAAA,iCAAA,sCAAA,oCAAA,yBAAA,uBAAA,sBAAA,4BAAA,wBAAA,sBAAA,wBAAA,kCAAA,mCAAA,0BAAA,yBAAA,yBAAA,+BAAA,mCAAA,mCAAA,yBAAA,4BAAA,6BAAA,olBAAA,mFAAA,gDAAA,oHAAA,mFAAA,qDAAA,8GAAA,KAAA,mFAAA,qDAAA,kGAAA,mFAAA,gDAAA,4HAAA,KAAA,GAAA,mFAAA,qDAAA,sHAAA,mFAAA,qDAAA,qFAAA,mFAAA,qDAAA,8HAAA,IAAA,mFAAA,qDAAA,kFAAA,2FAAA,SAAA,KAAA,mFAAA,qDAAA,yEAAA,MAAA,mFAAA,qDAAA,2FAAA,mFAAA,qDAAA,0FAAA,2KAAA,mFAAA,qDAAA,gHAAA,GAAA,uEAAA,mFAAA,qDAAA,gIAAA,mFAAA,iDAAA,6FAAA,mFAAA,qDAAA,sFAAA,+FAAA,mFAAA,qDAAA,qIAAA,mFAAA,qDAAA,4lBAAA,IAAA,mFAAA,qDAAA,qYAAA,525CAAKE,q0kBAwCkD,CAAA,OAAA,k5KA8CA,mFAAA,mFAAA,0FAAA,rCAAM,t0KACN,mFAAA,mFAAA,0FAAA,rCAAM,o\/QAMN,mFAAA,mFAAA,qDAAA,mGAAA,o+PAeA,mFAAA,mFAAA,kEAAA,bAAM,8EAAkB,mFAAA,mFAAA,qDAAA,gGAAA,+6QAExB,mFAAA,mFAAA,kEAAA,bAAM,xpZAIN,mFAAA,mFAAA,qDAAA,t7cACA,mFAAA,mFAAA,qDAAA,i5cACA,mFAAA,mFAAA,qDAAA,v2bACA,mFAAA,mFAAA,qDAAA,g5TAKA,mFAAA,mFAAA,qDAAA,8PAAA,vuUACA,mFAAA,mFAAA,qDAAA,8PAAA,o9MACA,mFAAA,mFAAA,qDAAA,8PAAA,25DACA,mFAAA,mFAAA,qDAAA,8PAAA,u0dACA,mFAAA,mFAAA,qDAAA,gQAAA,rlrBACA,mFAAA,mFAAA,qDAAA,8PAAA,+kDACA,mFAAA,mFAAA,qDAAA,8PAAA,6\/VACA,mFAAA,mFAAA,qDAAA,8PAAA,yvEACA,mFAAA,mFAAA,qDAAA,4PAAA,htdAsFA,1jIAIA,iriBACA,p5hBAEA,43bACA,h2bAMA,+lJACA,\/0PACA,k51BACA,1iYACA,hlEACA,u8CACA,59cACA,ytcACA,4rRAMA,gqEAEA,jweAKA,8pXAGA,puWACA,urMAEA,0iLACA,trRACA,gmbAEA,xltBACA,86ZAEA,w7RAEA,rpmBAEA,uzBACA,8sNAEA,3rNACA,gqPACA,4cACA,1tLAGA,hlSAEA,6nFAEA,qmhBAEA,r8oBACA,wtfACA,x+JAEA,23JAEA,i3CAEA,vtCAIA,9pTAEA,u4jBAGA,t9sBAGA,m\/zBAEA,vxFAGA,l9EAOA,9rlBACA,9EAEA,4gkBACA,7pSACA,\/uDAKA,v1DAKA,k9QAEA,8sRAEA,jikBAGA,84CAWA,w9QAMA,1mTAWA,+pMAOA","names":["devtools.defaults\/known-features","devtools.defaults\/default-features","devtools.defaults\/feature-groups","devtools.defaults\/prefs"]}

View file

@ -0,0 +1,86 @@
(ns devtools.format
(:require-macros [devtools.util :refer [oget oset ocall oapply safe-call]]))
; WARNING this namespace is here for legacy reasons, it will be removed in future!
; ---------------------------------------------------------------------------------------------------------------------------
; PROTOCOL SUPPORT
(defprotocol ^:deprecated IDevtoolsFormat ; use IFormat instead
(-header [value])
(-has-body [value])
(-body [value]))
; -- helpers ----------------------------------------------------------------------------------------------------------------
(def ^:dynamic *setup-done*)
(defn setup! []
(when-not *setup-done*
(set! *setup-done* true)
; note: we cannote require devtools.formatters.templating or .markup because that would lead to circular requires
(def make-template-fn (oget js/window "devtools" "formatters" "templating" "make_template"))
(def make-group-fn (oget js/window "devtools" "formatters" "templating" "make_group"))
(def make-reference-fn (oget js/window "devtools" "formatters" "templating" "make_reference"))
(def make-surrogate-fn (oget js/window "devtools" "formatters" "templating" "make_surrogate"))
(def render-markup-fn (oget js/window "devtools" "formatters" "templating" "render_markup"))
(def <header>-fn (oget js/window "devtools" "formatters" "markup" "_LT_header_GT_"))
(def <standard-body>-fn (oget js/window "devtools" "formatters" "markup" "_LT_standard_body_GT_"))
(assert make-template-fn)
(assert make-group-fn)
(assert make-reference-fn)
(assert make-surrogate-fn)
(assert render-markup-fn)
(assert <header>-fn)
(assert <standard-body>-fn)))
(defn- render-markup [& args]
(setup!)
(apply render-markup-fn args))
; ---------------------------------------------------------------------------------------------------------------------------
; deprecated functionality, implemented for easier transition from v0.7.x to v0.8
(defn ^:deprecated make-template [& args]
(setup!)
(apply make-template-fn args))
(defn ^:deprecated make-group [& args]
(setup!)
(apply make-group-fn args))
(defn ^:deprecated make-surrogate [& args]
(setup!)
(apply make-surrogate-fn args))
(defn ^:deprecated template [& args]
(setup!)
(apply make-template-fn args))
(defn ^:deprecated group [& args]
(setup!)
(apply make-group-fn args))
(defn ^:deprecated surrogate [& args]
(setup!)
(apply make-surrogate-fn args))
(defn ^:deprecated reference [object & [state-override]]
(setup!)
(apply make-reference-fn [object #(merge % state-override)]))
(defn ^:deprecated standard-reference [target]
(setup!)
(make-template-fn :ol :standard-ol-style (make-template-fn :li :standard-li-style (make-reference-fn target))))
(defn ^:deprecated build-header [& args]
(setup!)
(render-markup (apply <header>-fn args)))
(defn ^:deprecated standard-body-template [lines & rest]
(setup!)
(let [args (concat [(map (fn [x] [x]) lines)] rest)]
(render-markup (apply <standard-body>-fn args))))

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,596 @@
// Compiled by ClojureScript 1.9.229 {}
goog.provide('devtools.format');
goog.require('cljs.core');
/**
* @interface
*/
devtools.format.IDevtoolsFormat = function(){};
devtools.format._header = (function devtools$format$_header(value){
if((!((value == null))) && (!((value.devtools$format$IDevtoolsFormat$_header$arity$1 == null)))){
return value.devtools$format$IDevtoolsFormat$_header$arity$1(value);
} else {
var x__25793__auto__ = (((value == null))?null:value);
var m__25794__auto__ = (devtools.format._header[goog.typeOf(x__25793__auto__)]);
if(!((m__25794__auto__ == null))){
return m__25794__auto__.call(null,value);
} else {
var m__25794__auto____$1 = (devtools.format._header["_"]);
if(!((m__25794__auto____$1 == null))){
return m__25794__auto____$1.call(null,value);
} else {
throw cljs.core.missing_protocol.call(null,"IDevtoolsFormat.-header",value);
}
}
}
});
devtools.format._has_body = (function devtools$format$_has_body(value){
if((!((value == null))) && (!((value.devtools$format$IDevtoolsFormat$_has_body$arity$1 == null)))){
return value.devtools$format$IDevtoolsFormat$_has_body$arity$1(value);
} else {
var x__25793__auto__ = (((value == null))?null:value);
var m__25794__auto__ = (devtools.format._has_body[goog.typeOf(x__25793__auto__)]);
if(!((m__25794__auto__ == null))){
return m__25794__auto__.call(null,value);
} else {
var m__25794__auto____$1 = (devtools.format._has_body["_"]);
if(!((m__25794__auto____$1 == null))){
return m__25794__auto____$1.call(null,value);
} else {
throw cljs.core.missing_protocol.call(null,"IDevtoolsFormat.-has-body",value);
}
}
}
});
devtools.format._body = (function devtools$format$_body(value){
if((!((value == null))) && (!((value.devtools$format$IDevtoolsFormat$_body$arity$1 == null)))){
return value.devtools$format$IDevtoolsFormat$_body$arity$1(value);
} else {
var x__25793__auto__ = (((value == null))?null:value);
var m__25794__auto__ = (devtools.format._body[goog.typeOf(x__25793__auto__)]);
if(!((m__25794__auto__ == null))){
return m__25794__auto__.call(null,value);
} else {
var m__25794__auto____$1 = (devtools.format._body["_"]);
if(!((m__25794__auto____$1 == null))){
return m__25794__auto____$1.call(null,value);
} else {
throw cljs.core.missing_protocol.call(null,"IDevtoolsFormat.-body",value);
}
}
}
});
devtools.format.setup_BANG_ = (function devtools$format$setup_BANG_(){
if(cljs.core.truth_(devtools.format._STAR_setup_done_STAR_)){
return null;
} else {
devtools.format._STAR_setup_done_STAR_ = true;
devtools.format.make_template_fn = (function (){var temp__4657__auto__ = goog.object.get(window,"devtools");
if(cljs.core.truth_(temp__4657__auto__)){
var o__41062__auto__ = temp__4657__auto__;
var temp__4657__auto____$1 = goog.object.get(o__41062__auto__,"formatters");
if(cljs.core.truth_(temp__4657__auto____$1)){
var o__41062__auto____$1 = temp__4657__auto____$1;
var temp__4657__auto____$2 = goog.object.get(o__41062__auto____$1,"templating");
if(cljs.core.truth_(temp__4657__auto____$2)){
var o__41061__auto__ = temp__4657__auto____$2;
return goog.object.get(o__41061__auto__,"make_template");
} else {
return null;
}
} else {
return null;
}
} else {
return null;
}
})();
devtools.format.make_group_fn = (function (){var temp__4657__auto__ = goog.object.get(window,"devtools");
if(cljs.core.truth_(temp__4657__auto__)){
var o__41062__auto__ = temp__4657__auto__;
var temp__4657__auto____$1 = goog.object.get(o__41062__auto__,"formatters");
if(cljs.core.truth_(temp__4657__auto____$1)){
var o__41062__auto____$1 = temp__4657__auto____$1;
var temp__4657__auto____$2 = goog.object.get(o__41062__auto____$1,"templating");
if(cljs.core.truth_(temp__4657__auto____$2)){
var o__41061__auto__ = temp__4657__auto____$2;
return goog.object.get(o__41061__auto__,"make_group");
} else {
return null;
}
} else {
return null;
}
} else {
return null;
}
})();
devtools.format.make_reference_fn = (function (){var temp__4657__auto__ = goog.object.get(window,"devtools");
if(cljs.core.truth_(temp__4657__auto__)){
var o__41062__auto__ = temp__4657__auto__;
var temp__4657__auto____$1 = goog.object.get(o__41062__auto__,"formatters");
if(cljs.core.truth_(temp__4657__auto____$1)){
var o__41062__auto____$1 = temp__4657__auto____$1;
var temp__4657__auto____$2 = goog.object.get(o__41062__auto____$1,"templating");
if(cljs.core.truth_(temp__4657__auto____$2)){
var o__41061__auto__ = temp__4657__auto____$2;
return goog.object.get(o__41061__auto__,"make_reference");
} else {
return null;
}
} else {
return null;
}
} else {
return null;
}
})();
devtools.format.make_surrogate_fn = (function (){var temp__4657__auto__ = goog.object.get(window,"devtools");
if(cljs.core.truth_(temp__4657__auto__)){
var o__41062__auto__ = temp__4657__auto__;
var temp__4657__auto____$1 = goog.object.get(o__41062__auto__,"formatters");
if(cljs.core.truth_(temp__4657__auto____$1)){
var o__41062__auto____$1 = temp__4657__auto____$1;
var temp__4657__auto____$2 = goog.object.get(o__41062__auto____$1,"templating");
if(cljs.core.truth_(temp__4657__auto____$2)){
var o__41061__auto__ = temp__4657__auto____$2;
return goog.object.get(o__41061__auto__,"make_surrogate");
} else {
return null;
}
} else {
return null;
}
} else {
return null;
}
})();
devtools.format.render_markup_fn = (function (){var temp__4657__auto__ = goog.object.get(window,"devtools");
if(cljs.core.truth_(temp__4657__auto__)){
var o__41062__auto__ = temp__4657__auto__;
var temp__4657__auto____$1 = goog.object.get(o__41062__auto__,"formatters");
if(cljs.core.truth_(temp__4657__auto____$1)){
var o__41062__auto____$1 = temp__4657__auto____$1;
var temp__4657__auto____$2 = goog.object.get(o__41062__auto____$1,"templating");
if(cljs.core.truth_(temp__4657__auto____$2)){
var o__41061__auto__ = temp__4657__auto____$2;
return goog.object.get(o__41061__auto__,"render_markup");
} else {
return null;
}
} else {
return null;
}
} else {
return null;
}
})();
devtools.format._LT_header_GT__fn = (function (){var temp__4657__auto__ = goog.object.get(window,"devtools");
if(cljs.core.truth_(temp__4657__auto__)){
var o__41062__auto__ = temp__4657__auto__;
var temp__4657__auto____$1 = goog.object.get(o__41062__auto__,"formatters");
if(cljs.core.truth_(temp__4657__auto____$1)){
var o__41062__auto____$1 = temp__4657__auto____$1;
var temp__4657__auto____$2 = goog.object.get(o__41062__auto____$1,"markup");
if(cljs.core.truth_(temp__4657__auto____$2)){
var o__41061__auto__ = temp__4657__auto____$2;
return goog.object.get(o__41061__auto__,"_LT_header_GT_");
} else {
return null;
}
} else {
return null;
}
} else {
return null;
}
})();
devtools.format._LT_standard_body_GT__fn = (function (){var temp__4657__auto__ = goog.object.get(window,"devtools");
if(cljs.core.truth_(temp__4657__auto__)){
var o__41062__auto__ = temp__4657__auto__;
var temp__4657__auto____$1 = goog.object.get(o__41062__auto__,"formatters");
if(cljs.core.truth_(temp__4657__auto____$1)){
var o__41062__auto____$1 = temp__4657__auto____$1;
var temp__4657__auto____$2 = goog.object.get(o__41062__auto____$1,"markup");
if(cljs.core.truth_(temp__4657__auto____$2)){
var o__41061__auto__ = temp__4657__auto____$2;
return goog.object.get(o__41061__auto__,"_LT_standard_body_GT_");
} else {
return null;
}
} else {
return null;
}
} else {
return null;
}
})();
if(cljs.core.truth_(devtools.format.make_template_fn)){
} else {
throw (new Error("Assert failed: make-template-fn"));
}
if(cljs.core.truth_(devtools.format.make_group_fn)){
} else {
throw (new Error("Assert failed: make-group-fn"));
}
if(cljs.core.truth_(devtools.format.make_reference_fn)){
} else {
throw (new Error("Assert failed: make-reference-fn"));
}
if(cljs.core.truth_(devtools.format.make_surrogate_fn)){
} else {
throw (new Error("Assert failed: make-surrogate-fn"));
}
if(cljs.core.truth_(devtools.format.render_markup_fn)){
} else {
throw (new Error("Assert failed: render-markup-fn"));
}
if(cljs.core.truth_(devtools.format._LT_header_GT__fn)){
} else {
throw (new Error("Assert failed: <header>-fn"));
}
if(cljs.core.truth_(devtools.format._LT_standard_body_GT__fn)){
return null;
} else {
throw (new Error("Assert failed: <standard-body>-fn"));
}
}
});
devtools.format.render_markup = (function devtools$format$render_markup(var_args){
var args__26212__auto__ = [];
var len__26205__auto___41315 = arguments.length;
var i__26206__auto___41316 = (0);
while(true){
if((i__26206__auto___41316 < len__26205__auto___41315)){
args__26212__auto__.push((arguments[i__26206__auto___41316]));
var G__41317 = (i__26206__auto___41316 + (1));
i__26206__auto___41316 = G__41317;
continue;
} else {
}
break;
}
var argseq__26213__auto__ = ((((0) < args__26212__auto__.length))?(new cljs.core.IndexedSeq(args__26212__auto__.slice((0)),(0),null)):null);
return devtools.format.render_markup.cljs$core$IFn$_invoke$arity$variadic(argseq__26213__auto__);
});
devtools.format.render_markup.cljs$core$IFn$_invoke$arity$variadic = (function (args){
devtools.format.setup_BANG_.call(null);
return cljs.core.apply.call(null,devtools.format.render_markup_fn,args);
});
devtools.format.render_markup.cljs$lang$maxFixedArity = (0);
devtools.format.render_markup.cljs$lang$applyTo = (function (seq41314){
return devtools.format.render_markup.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq.call(null,seq41314));
});
devtools.format.make_template = (function devtools$format$make_template(var_args){
var args__26212__auto__ = [];
var len__26205__auto___41319 = arguments.length;
var i__26206__auto___41320 = (0);
while(true){
if((i__26206__auto___41320 < len__26205__auto___41319)){
args__26212__auto__.push((arguments[i__26206__auto___41320]));
var G__41321 = (i__26206__auto___41320 + (1));
i__26206__auto___41320 = G__41321;
continue;
} else {
}
break;
}
var argseq__26213__auto__ = ((((0) < args__26212__auto__.length))?(new cljs.core.IndexedSeq(args__26212__auto__.slice((0)),(0),null)):null);
return devtools.format.make_template.cljs$core$IFn$_invoke$arity$variadic(argseq__26213__auto__);
});
devtools.format.make_template.cljs$core$IFn$_invoke$arity$variadic = (function (args){
devtools.format.setup_BANG_.call(null);
return cljs.core.apply.call(null,devtools.format.make_template_fn,args);
});
devtools.format.make_template.cljs$lang$maxFixedArity = (0);
devtools.format.make_template.cljs$lang$applyTo = (function (seq41318){
return devtools.format.make_template.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq.call(null,seq41318));
});
devtools.format.make_group = (function devtools$format$make_group(var_args){
var args__26212__auto__ = [];
var len__26205__auto___41323 = arguments.length;
var i__26206__auto___41324 = (0);
while(true){
if((i__26206__auto___41324 < len__26205__auto___41323)){
args__26212__auto__.push((arguments[i__26206__auto___41324]));
var G__41325 = (i__26206__auto___41324 + (1));
i__26206__auto___41324 = G__41325;
continue;
} else {
}
break;
}
var argseq__26213__auto__ = ((((0) < args__26212__auto__.length))?(new cljs.core.IndexedSeq(args__26212__auto__.slice((0)),(0),null)):null);
return devtools.format.make_group.cljs$core$IFn$_invoke$arity$variadic(argseq__26213__auto__);
});
devtools.format.make_group.cljs$core$IFn$_invoke$arity$variadic = (function (args){
devtools.format.setup_BANG_.call(null);
return cljs.core.apply.call(null,devtools.format.make_group_fn,args);
});
devtools.format.make_group.cljs$lang$maxFixedArity = (0);
devtools.format.make_group.cljs$lang$applyTo = (function (seq41322){
return devtools.format.make_group.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq.call(null,seq41322));
});
devtools.format.make_surrogate = (function devtools$format$make_surrogate(var_args){
var args__26212__auto__ = [];
var len__26205__auto___41327 = arguments.length;
var i__26206__auto___41328 = (0);
while(true){
if((i__26206__auto___41328 < len__26205__auto___41327)){
args__26212__auto__.push((arguments[i__26206__auto___41328]));
var G__41329 = (i__26206__auto___41328 + (1));
i__26206__auto___41328 = G__41329;
continue;
} else {
}
break;
}
var argseq__26213__auto__ = ((((0) < args__26212__auto__.length))?(new cljs.core.IndexedSeq(args__26212__auto__.slice((0)),(0),null)):null);
return devtools.format.make_surrogate.cljs$core$IFn$_invoke$arity$variadic(argseq__26213__auto__);
});
devtools.format.make_surrogate.cljs$core$IFn$_invoke$arity$variadic = (function (args){
devtools.format.setup_BANG_.call(null);
return cljs.core.apply.call(null,devtools.format.make_surrogate_fn,args);
});
devtools.format.make_surrogate.cljs$lang$maxFixedArity = (0);
devtools.format.make_surrogate.cljs$lang$applyTo = (function (seq41326){
return devtools.format.make_surrogate.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq.call(null,seq41326));
});
devtools.format.template = (function devtools$format$template(var_args){
var args__26212__auto__ = [];
var len__26205__auto___41331 = arguments.length;
var i__26206__auto___41332 = (0);
while(true){
if((i__26206__auto___41332 < len__26205__auto___41331)){
args__26212__auto__.push((arguments[i__26206__auto___41332]));
var G__41333 = (i__26206__auto___41332 + (1));
i__26206__auto___41332 = G__41333;
continue;
} else {
}
break;
}
var argseq__26213__auto__ = ((((0) < args__26212__auto__.length))?(new cljs.core.IndexedSeq(args__26212__auto__.slice((0)),(0),null)):null);
return devtools.format.template.cljs$core$IFn$_invoke$arity$variadic(argseq__26213__auto__);
});
devtools.format.template.cljs$core$IFn$_invoke$arity$variadic = (function (args){
devtools.format.setup_BANG_.call(null);
return cljs.core.apply.call(null,devtools.format.make_template_fn,args);
});
devtools.format.template.cljs$lang$maxFixedArity = (0);
devtools.format.template.cljs$lang$applyTo = (function (seq41330){
return devtools.format.template.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq.call(null,seq41330));
});
devtools.format.group = (function devtools$format$group(var_args){
var args__26212__auto__ = [];
var len__26205__auto___41335 = arguments.length;
var i__26206__auto___41336 = (0);
while(true){
if((i__26206__auto___41336 < len__26205__auto___41335)){
args__26212__auto__.push((arguments[i__26206__auto___41336]));
var G__41337 = (i__26206__auto___41336 + (1));
i__26206__auto___41336 = G__41337;
continue;
} else {
}
break;
}
var argseq__26213__auto__ = ((((0) < args__26212__auto__.length))?(new cljs.core.IndexedSeq(args__26212__auto__.slice((0)),(0),null)):null);
return devtools.format.group.cljs$core$IFn$_invoke$arity$variadic(argseq__26213__auto__);
});
devtools.format.group.cljs$core$IFn$_invoke$arity$variadic = (function (args){
devtools.format.setup_BANG_.call(null);
return cljs.core.apply.call(null,devtools.format.make_group_fn,args);
});
devtools.format.group.cljs$lang$maxFixedArity = (0);
devtools.format.group.cljs$lang$applyTo = (function (seq41334){
return devtools.format.group.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq.call(null,seq41334));
});
devtools.format.surrogate = (function devtools$format$surrogate(var_args){
var args__26212__auto__ = [];
var len__26205__auto___41339 = arguments.length;
var i__26206__auto___41340 = (0);
while(true){
if((i__26206__auto___41340 < len__26205__auto___41339)){
args__26212__auto__.push((arguments[i__26206__auto___41340]));
var G__41341 = (i__26206__auto___41340 + (1));
i__26206__auto___41340 = G__41341;
continue;
} else {
}
break;
}
var argseq__26213__auto__ = ((((0) < args__26212__auto__.length))?(new cljs.core.IndexedSeq(args__26212__auto__.slice((0)),(0),null)):null);
return devtools.format.surrogate.cljs$core$IFn$_invoke$arity$variadic(argseq__26213__auto__);
});
devtools.format.surrogate.cljs$core$IFn$_invoke$arity$variadic = (function (args){
devtools.format.setup_BANG_.call(null);
return cljs.core.apply.call(null,devtools.format.make_surrogate_fn,args);
});
devtools.format.surrogate.cljs$lang$maxFixedArity = (0);
devtools.format.surrogate.cljs$lang$applyTo = (function (seq41338){
return devtools.format.surrogate.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq.call(null,seq41338));
});
devtools.format.reference = (function devtools$format$reference(var_args){
var args__26212__auto__ = [];
var len__26205__auto___41349 = arguments.length;
var i__26206__auto___41350 = (0);
while(true){
if((i__26206__auto___41350 < len__26205__auto___41349)){
args__26212__auto__.push((arguments[i__26206__auto___41350]));
var G__41351 = (i__26206__auto___41350 + (1));
i__26206__auto___41350 = G__41351;
continue;
} else {
}
break;
}
var argseq__26213__auto__ = ((((1) < args__26212__auto__.length))?(new cljs.core.IndexedSeq(args__26212__auto__.slice((1)),(0),null)):null);
return devtools.format.reference.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__26213__auto__);
});
devtools.format.reference.cljs$core$IFn$_invoke$arity$variadic = (function (object,p__41345){
var vec__41346 = p__41345;
var state_override = cljs.core.nth.call(null,vec__41346,(0),null);
devtools.format.setup_BANG_.call(null);
return cljs.core.apply.call(null,devtools.format.make_reference_fn,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [object,((function (vec__41346,state_override){
return (function (p1__41342_SHARP_){
return cljs.core.merge.call(null,p1__41342_SHARP_,state_override);
});})(vec__41346,state_override))
], null));
});
devtools.format.reference.cljs$lang$maxFixedArity = (1);
devtools.format.reference.cljs$lang$applyTo = (function (seq41343){
var G__41344 = cljs.core.first.call(null,seq41343);
var seq41343__$1 = cljs.core.next.call(null,seq41343);
return devtools.format.reference.cljs$core$IFn$_invoke$arity$variadic(G__41344,seq41343__$1);
});
devtools.format.standard_reference = (function devtools$format$standard_reference(target){
devtools.format.setup_BANG_.call(null);
return devtools.format.make_template_fn.call(null,new cljs.core.Keyword(null,"ol","ol",932524051),new cljs.core.Keyword(null,"standard-ol-style","standard-ol-style",2143825615),devtools.format.make_template_fn.call(null,new cljs.core.Keyword(null,"li","li",723558921),new cljs.core.Keyword(null,"standard-li-style","standard-li-style",413442955),devtools.format.make_reference_fn.call(null,target)));
});
devtools.format.build_header = (function devtools$format$build_header(var_args){
var args__26212__auto__ = [];
var len__26205__auto___41353 = arguments.length;
var i__26206__auto___41354 = (0);
while(true){
if((i__26206__auto___41354 < len__26205__auto___41353)){
args__26212__auto__.push((arguments[i__26206__auto___41354]));
var G__41355 = (i__26206__auto___41354 + (1));
i__26206__auto___41354 = G__41355;
continue;
} else {
}
break;
}
var argseq__26213__auto__ = ((((0) < args__26212__auto__.length))?(new cljs.core.IndexedSeq(args__26212__auto__.slice((0)),(0),null)):null);
return devtools.format.build_header.cljs$core$IFn$_invoke$arity$variadic(argseq__26213__auto__);
});
devtools.format.build_header.cljs$core$IFn$_invoke$arity$variadic = (function (args){
devtools.format.setup_BANG_.call(null);
return devtools.format.render_markup.call(null,cljs.core.apply.call(null,devtools.format._LT_header_GT__fn,args));
});
devtools.format.build_header.cljs$lang$maxFixedArity = (0);
devtools.format.build_header.cljs$lang$applyTo = (function (seq41352){
return devtools.format.build_header.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq.call(null,seq41352));
});
devtools.format.standard_body_template = (function devtools$format$standard_body_template(var_args){
var args__26212__auto__ = [];
var len__26205__auto___41358 = arguments.length;
var i__26206__auto___41359 = (0);
while(true){
if((i__26206__auto___41359 < len__26205__auto___41358)){
args__26212__auto__.push((arguments[i__26206__auto___41359]));
var G__41360 = (i__26206__auto___41359 + (1));
i__26206__auto___41359 = G__41360;
continue;
} else {
}
break;
}
var argseq__26213__auto__ = ((((1) < args__26212__auto__.length))?(new cljs.core.IndexedSeq(args__26212__auto__.slice((1)),(0),null)):null);
return devtools.format.standard_body_template.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__26213__auto__);
});
devtools.format.standard_body_template.cljs$core$IFn$_invoke$arity$variadic = (function (lines,rest){
devtools.format.setup_BANG_.call(null);
var args = cljs.core.concat.call(null,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.map.call(null,(function (x){
return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [x], null);
}),lines)], null),rest);
return devtools.format.render_markup.call(null,cljs.core.apply.call(null,devtools.format._LT_standard_body_GT__fn,args));
});
devtools.format.standard_body_template.cljs$lang$maxFixedArity = (1);
devtools.format.standard_body_template.cljs$lang$applyTo = (function (seq41356){
var G__41357 = cljs.core.first.call(null,seq41356);
var seq41356__$1 = cljs.core.next.call(null,seq41356);
return devtools.format.standard_body_template.cljs$core$IFn$_invoke$arity$variadic(G__41357,seq41356__$1);
});
//# sourceMappingURL=format.js.map?rel=1603199212051

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,99 @@
(ns devtools.formatters
(:require [goog.labs.userAgent.browser :as ua]
[devtools.prefs :as prefs]
[devtools.util :refer [get-formatters-safe set-formatters-safe!]]
[devtools.formatters.core :refer [header-api-call has-body-api-call body-api-call]]))
(def ^:dynamic *installed* false)
(def ^:dynamic *sanitizer-enabled* true)
(def ^:dynamic *monitor-enabled* false)
(def obsolete-formatter-key "devtoolsFormatter")
(defn ^:dynamic available? []
(and (ua/isChrome) (ua/isVersionOrHigher 47))) ; Chrome 47+
(deftype CLJSDevtoolsFormatter [])
; devtools.debug namespace may not be present => no debugging
(defn- find-fn-in-debug-ns [fn-name]
(try
(aget js/window "devtools" "debug" fn-name)
(catch :default _
nil)))
(defn- monitor-api-call-if-avail [name api-call args]
(if-let [monitor-api-call (find-fn-in-debug-ns "monitor_api_call")]
(monitor-api-call name api-call args)
(apply api-call args)))
(defn- log-exception-if-avail [& args]
(if-let [log-exception (find-fn-in-debug-ns "log_exception")]
(apply log-exception args)))
; monitors api calls in a separate debug console if debug namespace is available
(defn- monitor-api-calls [name api-call]
(fn [& args]
(if-not *monitor-enabled*
(apply api-call args)
(monitor-api-call-if-avail name api-call args))))
; wraps our api calls in a try-catch block to prevent leaking of exceptions in case something went wrong
(defn- sanitize [name api-call]
(fn [& args]
(if-not *sanitizer-enabled*
(apply api-call args) ; raw API call
(try
(apply api-call args) ; wrapped API call
(catch :default e
(log-exception-if-avail (str name ": " e))
nil)))))
(defn- build-cljs-formatter []
(let [wrap (fn [name api-call]
(let [monitor (partial monitor-api-calls name)
sanitizer (partial sanitize name)]
((comp monitor sanitizer) api-call)
api-call))
formatter (CLJSDevtoolsFormatter.)
define! (fn [name fn]
(aset formatter name (wrap name fn)))]
(define! "header" header-api-call)
(define! "hasBody" has-body-api-call)
(define! "body" body-api-call)
formatter))
(defn- is-ours? [o]
(instance? CLJSDevtoolsFormatter o))
(defn- present? []
(let [formatters (get-formatters-safe)]
(boolean (some is-ours? formatters))))
(defn- install-our-formatter! [formatter]
(let [formatters (.slice (get-formatters-safe))] ; slice effectively duplicates the array
(.push formatters formatter) ; acting on duplicated array
(set-formatters-safe! formatters)
(if (prefs/pref :legacy-formatter)
(aset js/window obsolete-formatter-key formatter))))
(defn- uninstall-our-formatters! []
(let [new-formatters (remove is-ours? (vec (get-formatters-safe)))
new-formatters-js (if (empty? new-formatters) nil (into-array new-formatters))]
(set-formatters-safe! new-formatters-js)))
; -- installation -----------------------------------------------------------------------------------------------------------
(defn installed? []
*installed*)
(defn install! []
(when-not *installed*
(set! *installed* true)
(install-our-formatter! (build-cljs-formatter))
true))
(defn uninstall! []
(when *installed*
(set! *installed* false)
(uninstall-our-formatters!)))

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,221 @@
// Compiled by ClojureScript 1.9.229 {}
goog.provide('devtools.formatters');
goog.require('cljs.core');
goog.require('goog.labs.userAgent.browser');
goog.require('devtools.prefs');
goog.require('devtools.util');
goog.require('devtools.formatters.core');
devtools.formatters._STAR_installed_STAR_ = false;
devtools.formatters._STAR_sanitizer_enabled_STAR_ = true;
devtools.formatters._STAR_monitor_enabled_STAR_ = false;
devtools.formatters.obsolete_formatter_key = "devtoolsFormatter";
devtools.formatters.available_QMARK_ = (function devtools$formatters$available_QMARK_(){
var and__25118__auto__ = goog.labs.userAgent.browser.isChrome();
if(cljs.core.truth_(and__25118__auto__)){
return goog.labs.userAgent.browser.isVersionOrHigher((47));
} else {
return and__25118__auto__;
}
});
/**
* @constructor
*/
devtools.formatters.CLJSDevtoolsFormatter = (function (){
})
devtools.formatters.CLJSDevtoolsFormatter.getBasis = (function (){
return cljs.core.PersistentVector.EMPTY;
});
devtools.formatters.CLJSDevtoolsFormatter.cljs$lang$type = true;
devtools.formatters.CLJSDevtoolsFormatter.cljs$lang$ctorStr = "devtools.formatters/CLJSDevtoolsFormatter";
devtools.formatters.CLJSDevtoolsFormatter.cljs$lang$ctorPrWriter = (function (this__25736__auto__,writer__25737__auto__,opt__25738__auto__){
return cljs.core._write.call(null,writer__25737__auto__,"devtools.formatters/CLJSDevtoolsFormatter");
});
devtools.formatters.__GT_CLJSDevtoolsFormatter = (function devtools$formatters$__GT_CLJSDevtoolsFormatter(){
return (new devtools.formatters.CLJSDevtoolsFormatter());
});
devtools.formatters.find_fn_in_debug_ns = (function devtools$formatters$find_fn_in_debug_ns(fn_name){
try{return (window["devtools"]["debug"][fn_name]);
}catch (e42143){var _ = e42143;
return null;
}});
devtools.formatters.monitor_api_call_if_avail = (function devtools$formatters$monitor_api_call_if_avail(name,api_call,args){
var temp__4655__auto__ = devtools.formatters.find_fn_in_debug_ns.call(null,"monitor_api_call");
if(cljs.core.truth_(temp__4655__auto__)){
var monitor_api_call = temp__4655__auto__;
return monitor_api_call.call(null,name,api_call,args);
} else {
return cljs.core.apply.call(null,api_call,args);
}
});
devtools.formatters.log_exception_if_avail = (function devtools$formatters$log_exception_if_avail(var_args){
var args__26212__auto__ = [];
var len__26205__auto___42145 = arguments.length;
var i__26206__auto___42146 = (0);
while(true){
if((i__26206__auto___42146 < len__26205__auto___42145)){
args__26212__auto__.push((arguments[i__26206__auto___42146]));
var G__42147 = (i__26206__auto___42146 + (1));
i__26206__auto___42146 = G__42147;
continue;
} else {
}
break;
}
var argseq__26213__auto__ = ((((0) < args__26212__auto__.length))?(new cljs.core.IndexedSeq(args__26212__auto__.slice((0)),(0),null)):null);
return devtools.formatters.log_exception_if_avail.cljs$core$IFn$_invoke$arity$variadic(argseq__26213__auto__);
});
devtools.formatters.log_exception_if_avail.cljs$core$IFn$_invoke$arity$variadic = (function (args){
var temp__4655__auto__ = devtools.formatters.find_fn_in_debug_ns.call(null,"log_exception");
if(cljs.core.truth_(temp__4655__auto__)){
var log_exception = temp__4655__auto__;
return cljs.core.apply.call(null,log_exception,args);
} else {
return null;
}
});
devtools.formatters.log_exception_if_avail.cljs$lang$maxFixedArity = (0);
devtools.formatters.log_exception_if_avail.cljs$lang$applyTo = (function (seq42144){
return devtools.formatters.log_exception_if_avail.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq.call(null,seq42144));
});
devtools.formatters.monitor_api_calls = (function devtools$formatters$monitor_api_calls(name,api_call){
return (function() {
var G__42148__delegate = function (args){
if(cljs.core.not.call(null,devtools.formatters._STAR_monitor_enabled_STAR_)){
return cljs.core.apply.call(null,api_call,args);
} else {
return devtools.formatters.monitor_api_call_if_avail.call(null,name,api_call,args);
}
};
var G__42148 = function (var_args){
var args = null;
if (arguments.length > 0) {
var G__42149__i = 0, G__42149__a = new Array(arguments.length - 0);
while (G__42149__i < G__42149__a.length) {G__42149__a[G__42149__i] = arguments[G__42149__i + 0]; ++G__42149__i;}
args = new cljs.core.IndexedSeq(G__42149__a,0);
}
return G__42148__delegate.call(this,args);};
G__42148.cljs$lang$maxFixedArity = 0;
G__42148.cljs$lang$applyTo = (function (arglist__42150){
var args = cljs.core.seq(arglist__42150);
return G__42148__delegate(args);
});
G__42148.cljs$core$IFn$_invoke$arity$variadic = G__42148__delegate;
return G__42148;
})()
;
});
devtools.formatters.sanitize = (function devtools$formatters$sanitize(name,api_call){
return (function() {
var G__42153__delegate = function (args){
if(cljs.core.not.call(null,devtools.formatters._STAR_sanitizer_enabled_STAR_)){
return cljs.core.apply.call(null,api_call,args);
} else {
try{return cljs.core.apply.call(null,api_call,args);
}catch (e42152){var e = e42152;
devtools.formatters.log_exception_if_avail.call(null,[cljs.core.str(name),cljs.core.str(": "),cljs.core.str(e)].join(''));
return null;
}}
};
var G__42153 = function (var_args){
var args = null;
if (arguments.length > 0) {
var G__42154__i = 0, G__42154__a = new Array(arguments.length - 0);
while (G__42154__i < G__42154__a.length) {G__42154__a[G__42154__i] = arguments[G__42154__i + 0]; ++G__42154__i;}
args = new cljs.core.IndexedSeq(G__42154__a,0);
}
return G__42153__delegate.call(this,args);};
G__42153.cljs$lang$maxFixedArity = 0;
G__42153.cljs$lang$applyTo = (function (arglist__42155){
var args = cljs.core.seq(arglist__42155);
return G__42153__delegate(args);
});
G__42153.cljs$core$IFn$_invoke$arity$variadic = G__42153__delegate;
return G__42153;
})()
;
});
devtools.formatters.build_cljs_formatter = (function devtools$formatters$build_cljs_formatter(){
var wrap = (function (name,api_call){
var monitor = cljs.core.partial.call(null,devtools.formatters.monitor_api_calls,name);
var sanitizer = cljs.core.partial.call(null,devtools.formatters.sanitize,name);
cljs.core.comp.call(null,monitor,sanitizer).call(null,api_call);
return api_call;
});
var formatter = (new devtools.formatters.CLJSDevtoolsFormatter());
var define_BANG_ = ((function (wrap,formatter){
return (function (name,fn){
return (formatter[name] = wrap.call(null,name,fn));
});})(wrap,formatter))
;
define_BANG_.call(null,"header",devtools.formatters.core.header_api_call);
define_BANG_.call(null,"hasBody",devtools.formatters.core.has_body_api_call);
define_BANG_.call(null,"body",devtools.formatters.core.body_api_call);
return formatter;
});
devtools.formatters.is_ours_QMARK_ = (function devtools$formatters$is_ours_QMARK_(o){
return (o instanceof devtools.formatters.CLJSDevtoolsFormatter);
});
devtools.formatters.present_QMARK_ = (function devtools$formatters$present_QMARK_(){
var formatters = devtools.util.get_formatters_safe.call(null);
return cljs.core.boolean$.call(null,cljs.core.some.call(null,devtools.formatters.is_ours_QMARK_,formatters));
});
devtools.formatters.install_our_formatter_BANG_ = (function devtools$formatters$install_our_formatter_BANG_(formatter){
var formatters = devtools.util.get_formatters_safe.call(null).slice();
formatters.push(formatter);
devtools.util.set_formatters_safe_BANG_.call(null,formatters);
if(cljs.core.truth_(devtools.prefs.pref.call(null,new cljs.core.Keyword(null,"legacy-formatter","legacy-formatter",-1954119499)))){
return (window[devtools.formatters.obsolete_formatter_key] = formatter);
} else {
return null;
}
});
devtools.formatters.uninstall_our_formatters_BANG_ = (function devtools$formatters$uninstall_our_formatters_BANG_(){
var new_formatters = cljs.core.remove.call(null,devtools.formatters.is_ours_QMARK_,cljs.core.vec.call(null,devtools.util.get_formatters_safe.call(null)));
var new_formatters_js = ((cljs.core.empty_QMARK_.call(null,new_formatters))?null:cljs.core.into_array.call(null,new_formatters));
return devtools.util.set_formatters_safe_BANG_.call(null,new_formatters_js);
});
devtools.formatters.installed_QMARK_ = (function devtools$formatters$installed_QMARK_(){
return devtools.formatters._STAR_installed_STAR_;
});
devtools.formatters.install_BANG_ = (function devtools$formatters$install_BANG_(){
if(cljs.core.truth_(devtools.formatters._STAR_installed_STAR_)){
return null;
} else {
devtools.formatters._STAR_installed_STAR_ = true;
devtools.formatters.install_our_formatter_BANG_.call(null,devtools.formatters.build_cljs_formatter.call(null));
return true;
}
});
devtools.formatters.uninstall_BANG_ = (function devtools$formatters$uninstall_BANG_(){
if(cljs.core.truth_(devtools.formatters._STAR_installed_STAR_)){
devtools.formatters._STAR_installed_STAR_ = false;
return devtools.formatters.uninstall_our_formatters_BANG_.call(null);
} else {
return null;
}
});
//# sourceMappingURL=formatters.js.map?rel=1603199213854

View file

@ -0,0 +1 @@
{"version":3,"file":"\/Users\/simon\/workspace\/swinging-needle-meter\/docs\/js\/compiled\/out\/devtools\/formatters.js","sources":["formatters.cljs?rel=1603199213855"],"lineCount":221,"mappings":";AAAA;;;;;;AAMA,4CAAA,5CAAeA;AACf,oDAAA,pDAAeC;AACf,kDAAA,lDAAeC;AAEf,6CAAA,7CAAKC;AAEL,uCAAA,vCAAgBC;AAAhB,AACE,IAAAC,qBAAK,AAACC;AAAN,AAAA,oBAAAD;AAAmB,qDAAA,9CAACE;;AAApBF;;;AAEF,AAAA;;;;;;AAAA;AAAA,AAAA,qDAAA,rDAASO;AAAT,AAAA;;;AAAA,AAAA,2DAAA,3DAASA;;AAAT,AAAA,8DAAA,9DAASA;;AAAT,AAAA,mEAAA,WAAAJ,oBAAAC,sBAAAC,xHAASE;AAAT,AAAA,OAAAD,2BAAAF,sBAAA;;;AAAA,iDAAA,jDAASI;AAAT,AAAA,YAAAD;;;AAASA,AAGT,0CAAA,1CAAOE,4FAAqBC;AAA5B,AACE,IAAA,AACE,eAAA,YAAA,nBAAME,4BAA6BF;gBADrC,QAAAC,JAEkBE;AAFlB,AAAA;;AAKF,gDAAA,hDAAOC,wGAA2BC,KAAKC,SAASC;AAAhD,AACE,IAAAC,qBAA0B,kDAAA,lDAACT;AAA3B,AAAA,oBAAAS;AAAA,uBAAAA,nBAASC;AAAT,AACE,OAACA,2BAAiBJ,KAAKC,SAASC;;AAChC,OAACG,0BAAMJ,SAASC;;;AAEpB,AAAA,6CAAA,qDAAAI,lGAAOM;AAAP,AAAA,IAAAL,sBAAA;AAAA,AAAA,IAAAC,2BAAA,AAAA;AAAA,AAAA,IAAAC,yBAAA;;AAAA,AAAA,GAAA,CAAAA,yBAAAD;AAAA,AAAA,AAAAD,yBAAA,CAAA,UAAAE;;AAAA,eAAA,CAAAA,yBAAA;;;;AAAA;;;;AAAA,IAAAC,wBAAA,EAAA,CAAA,MAAA,AAAAH,6BAAA,AAAA,KAAAI,qBAAA,AAAAJ,0BAAA,KAAA,IAAA,OAAA;AAAA,AAAA,OAAAK,gFAAAF;;;AAAA,AAAA,AAAA,AAAAE,kFAAA,WAAiCV;AAAjC,AACE,IAAAC,qBAAuB,kDAAA,lDAACT;AAAxB,AAAA,oBAAAS;AAAA,oBAAAA,hBAASY;AAAT,AACE,OAACV,0BAAMU,cAAcb;;AADvB;;;;AADF,AAAA,AAAAU,qEAAA;;AAAA,AAAA,AAAAA,+DAAA,WAAAC;AAAA,AAAA,OAAAD,gFAAA,AAAAE,wBAAAD;;;AAAA,AAKA,wCAAA,xCAAOG,wFAAmBhB,KAAKC;AAA\/B,AACE;mCAAOC;AAAP,AACE,GAAA,AAAAe,wBAAQnC;AACN,OAACuB,0BAAMJ,SAASC;;AAChB,OAACH,wDAA0BC,KAAKC,SAASC;;;;IAHtCA;;;;EAAAA;;oCAAAA;;;IAAAA;0BAAAA;;;;;;;AAMT,+BAAA,\/BAAOgB,sEAAUlB,KAAKC;AAAtB,AACE;mCAAOC;AAAP,AACE,GAAA,AAAAe,wBAAQpC;AACN,OAACwB,0BAAMJ,SAASC;;AAChB,IAAA,AACE,OAACG,0BAAMJ,SAASC;gBADlB,QAAAiB,JAEkBC;AAFlB,AAGI,AAACR,qDAAuB,mCAAA,pBAAKZ,wCAAUoB;;AAH3C;;;;IAHGlB;;;;EAAAA;;oCAAAA;;;IAAAA;0BAAAA;;;;;;;AAST,2CAAA,3CAAOmB;AAAP,AACE,IAAMC,OAAK,WAAKtB,KAAKC;AAAV,AACE,IAAMsB,UAAQ,AAACC,4BAAQR,sCAAkBhB;IACnCyB,YAAU,AAACD,4BAAQN,6BAASlB;AADlC,AAEE,AAAC,AAAC0B,yBAAKH,QAAQE,qBAAWxB;;AAC1BA;;IACT0B,YAAU,KAAAnC;IACVoC,eAAQ;kBAAK5B,KAAK6B;AAAV,AACE,QAAMF,UAAU3B,QAAK,AAACsB,eAAKtB,KAAK6B;;;AAPhD,AAQE,uBAAA,vBAACD,gCAAiBE;;AAClB,uBAAA,vBAACF,iCAAkBG;;AACnB,uBAAA,vBAACH,8BAAeI;;AAChBL;;AAEJ,qCAAA,rCAAOM,kFAAUC;AAAjB,AACE,qBAAW1C,bAAsB0C;;AAEnC,qCAAA,rCAAOC;AAAP,AACE,IAAMC,aAAW,AAACC;AAAlB,AACE,OAACC,6BAAQ,AAACC,yBAAKN,mCAASG;;AAE5B,kDAAA,lDAAOI,4GAAwBb;AAA\/B,AACE,IAAMS,aAAW,AAAQ,AAACC;AAA1B,AACE,AAAOD,gBAAWT;;AAClB,AAACc,kDAAqBL;;AACtB,oBAAI,8BAAA,9BAACM;AACH,QAAM7C,OAAUd,8CAAuB4C;;AADzC;;;AAGJ,qDAAA,rDAAOgB;AAAP,AACE,IAAMC,iBAAe,AAACC,2BAAOZ,mCAAS,AAACa,wBAAI,AAACT;IACtCU,oBAAkB,oDAAA,lDAAI,AAACC,iCAAOJ,sBAAoB,AAACK,+BAAWL;AADpE,AAEE,OAACH,kDAAqBM;;AAI1B,uCAAA,vCAAMG;AAAN,AACEtE;;AAEF,oCAAA,pCAAMuE;AAAN,AACE,oBAAUvE;AAAV;;AAAA,AACE,4CAAA,5CAAMA;;AACN,AAAC4D,0DAAuB,AAACnB;;AAF3B;;;AAKF,sCAAA,tCAAM+B;AAAN,AACE,oBAAMxE;AAAN,AACE,4CAAA,5CAAMA;;AACN,OAAC+D;;AAFH","names":["devtools.formatters\/*installed*","devtools.formatters\/*sanitizer-enabled*","devtools.formatters\/*monitor-enabled*","devtools.formatters\/obsolete-formatter-key","devtools.formatters\/available?","and__25118__auto__","goog.labs.userAgent.browser\/isChrome","goog.labs.userAgent.browser\/isVersionOrHigher","this__25736__auto__","writer__25737__auto__","opt__25738__auto__","cljs.core\/-write","devtools.formatters\/CLJSDevtoolsFormatter","devtools.formatters\/->CLJSDevtoolsFormatter","devtools.formatters\/find-fn-in-debug-ns","fn-name","e42143","js\/window","_","devtools.formatters\/monitor-api-call-if-avail","name","api-call","args","temp__4655__auto__","monitor-api-call","cljs.core\/apply","var_args","args__26212__auto__","len__26205__auto__","i__26206__auto__","argseq__26213__auto__","cljs.core\/IndexedSeq","devtools.formatters\/log-exception-if-avail","seq42144","cljs.core\/seq","log-exception","devtools.formatters\/monitor-api-calls","cljs.core\/not","devtools.formatters\/sanitize","e42152","e","devtools.formatters\/build-cljs-formatter","wrap","monitor","cljs.core\/partial","sanitizer","cljs.core\/comp","formatter","define!","fn","devtools.formatters.core\/header-api-call","devtools.formatters.core\/has-body-api-call","devtools.formatters.core\/body-api-call","devtools.formatters\/is-ours?","o","devtools.formatters\/present?","formatters","devtools.util\/get-formatters-safe","cljs.core\/boolean","cljs.core\/some","devtools.formatters\/install-our-formatter!","devtools.util\/set-formatters-safe!","devtools.prefs\/pref","devtools.formatters\/uninstall-our-formatters!","new-formatters","cljs.core\/remove","cljs.core\/vec","new-formatters-js","cljs.core\/empty?","cljs.core\/into-array","devtools.formatters\/installed?","devtools.formatters\/install!","devtools.formatters\/uninstall!"]}

View file

@ -0,0 +1,88 @@
(ns devtools.formatters.budgeting
(:require-macros [devtools.util :refer [oget oset ocall oapply safe-call]])
(:require [devtools.formatters.templating :refer [render-markup]]
[devtools.formatters.state :refer [get-depth-budget set-depth-budget]]
[devtools.formatters.helpers :refer [pref]]
[devtools.formatters.markup :refer [<header-expander>]]))
; This functionality provides a workaround to issue #22 (https://github.com/binaryage/cljs-devtools/issues/22).
; The idea is to track hierarchy depth for json-ml(s) we are generating.
; If we are about to cross the depth limit hardcoded in WebKit,
; instead we render simple expandable placeholders which resume full rendering in their bodies (when expanded by user).
; Note that this technique has some quirks, it may break styling in some pathological cases.
; we need to reserve some depth levels for our expander symbol markup
(def header-expander-depth-cost 2)
; -- tracking over-budget values -------------------------------------------------------------------------------------------
; note: phantomjs does not have WeakSet, so we have to emulate it when testing
(def over-budget-values (if (exists? js/WeakSet) (js/WeakSet.) (volatile! #{})))
(defn add-over-budget-value! [value]
(if (volatile? over-budget-values)
(vreset! over-budget-values (conj @over-budget-values value))
(ocall over-budget-values "add" value)))
(defn delete-over-budget-value! [value]
(if (volatile? over-budget-values)
(vreset! over-budget-values (disj @over-budget-values value))
(ocall over-budget-values "delete" value)))
(defn has-over-budget-value? [value]
(if (volatile? over-budget-values)
(contains? @over-budget-values value)
(ocall over-budget-values "has" value)))
; -- depth budget accounting ------------------------------------------------------------------------------------------------
(defn object-reference? [json-ml]
(= (first json-ml) "object"))
(defn determine-depth [json-ml]
(if (array? json-ml)
(inc (apply max (map determine-depth json-ml)))
0))
(defn has-any-object-reference? [json-ml]
(if (array? json-ml)
(if (object-reference? json-ml)
true
(some has-any-object-reference? json-ml))))
(defn transfer-remaining-depth-budget! [object-reference depth-budget]
{:pre [(not (neg? depth-budget))]}
(let [data (second object-reference)
_ (assert (object? data))
config (oget data "config")]
(oset data ["config"] (set-depth-budget config depth-budget))))
(defn distribute-budget! [json-ml depth-budget]
{:pre [(not (neg? depth-budget))]}
(if (array? json-ml)
(let [new-depth-budget (dec depth-budget)]
(if (object-reference? json-ml)
(transfer-remaining-depth-budget! json-ml new-depth-budget)
(doseq [item json-ml]
(distribute-budget! item new-depth-budget)))))
json-ml)
; -- api --------------------------------------------------------------------------------------------------------------------
(defn was-over-budget?! [value]
(when (has-over-budget-value? value)
(delete-over-budget-value! value)
true))
(defn alter-json-ml-to-fit-in-remaining-budget! [value json-ml]
(if-let [initial-hierarchy-depth-budget (pref :initial-hierarchy-depth-budget)] ; this is hardcoded in InjectedScriptSource.js in WebKit, look for maxCustomPreviewRecursionDepth
(let [remaining-depth-budget (or (get-depth-budget) (dec initial-hierarchy-depth-budget))
depth (determine-depth json-ml)
final? (not (has-any-object-reference? json-ml))
needed-depth (if final? depth (+ depth header-expander-depth-cost))]
(if (>= remaining-depth-budget needed-depth)
(distribute-budget! json-ml remaining-depth-budget)
(let [expander-ml (render-markup (<header-expander> value))]
(add-over-budget-value! value) ; we need to record over-budget values to for later was-over-budget?! check, see has-body* in formatters.core
expander-ml)))
json-ml))

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,180 @@
// Compiled by ClojureScript 1.9.229 {}
goog.provide('devtools.formatters.budgeting');
goog.require('cljs.core');
goog.require('devtools.formatters.templating');
goog.require('devtools.formatters.state');
goog.require('devtools.formatters.helpers');
goog.require('devtools.formatters.markup');
devtools.formatters.budgeting.header_expander_depth_cost = (2);
devtools.formatters.budgeting.over_budget_values = ((typeof WeakSet !== 'undefined')?(new WeakSet()):cljs.core.volatile_BANG_.call(null,cljs.core.PersistentHashSet.EMPTY));
devtools.formatters.budgeting.add_over_budget_value_BANG_ = (function devtools$formatters$budgeting$add_over_budget_value_BANG_(value){
if(cljs.core.volatile_QMARK_.call(null,devtools.formatters.budgeting.over_budget_values)){
return cljs.core.vreset_BANG_.call(null,devtools.formatters.budgeting.over_budget_values,cljs.core.conj.call(null,cljs.core.deref.call(null,devtools.formatters.budgeting.over_budget_values),value));
} else {
var o__41049__auto__ = devtools.formatters.budgeting.over_budget_values;
return goog.object.get(o__41049__auto__,"add").call(o__41049__auto__,value);
}
});
devtools.formatters.budgeting.delete_over_budget_value_BANG_ = (function devtools$formatters$budgeting$delete_over_budget_value_BANG_(value){
if(cljs.core.volatile_QMARK_.call(null,devtools.formatters.budgeting.over_budget_values)){
return cljs.core.vreset_BANG_.call(null,devtools.formatters.budgeting.over_budget_values,cljs.core.disj.call(null,cljs.core.deref.call(null,devtools.formatters.budgeting.over_budget_values),value));
} else {
var o__41049__auto__ = devtools.formatters.budgeting.over_budget_values;
return goog.object.get(o__41049__auto__,"delete").call(o__41049__auto__,value);
}
});
devtools.formatters.budgeting.has_over_budget_value_QMARK_ = (function devtools$formatters$budgeting$has_over_budget_value_QMARK_(value){
if(cljs.core.volatile_QMARK_.call(null,devtools.formatters.budgeting.over_budget_values)){
return cljs.core.contains_QMARK_.call(null,cljs.core.deref.call(null,devtools.formatters.budgeting.over_budget_values),value);
} else {
var o__41049__auto__ = devtools.formatters.budgeting.over_budget_values;
return goog.object.get(o__41049__auto__,"has").call(o__41049__auto__,value);
}
});
devtools.formatters.budgeting.object_reference_QMARK_ = (function devtools$formatters$budgeting$object_reference_QMARK_(json_ml){
return cljs.core._EQ_.call(null,cljs.core.first.call(null,json_ml),"object");
});
devtools.formatters.budgeting.determine_depth = (function devtools$formatters$budgeting$determine_depth(json_ml){
if(cljs.core.array_QMARK_.call(null,json_ml)){
return (cljs.core.apply.call(null,cljs.core.max,cljs.core.map.call(null,devtools$formatters$budgeting$determine_depth,json_ml)) + (1));
} else {
return (0);
}
});
devtools.formatters.budgeting.has_any_object_reference_QMARK_ = (function devtools$formatters$budgeting$has_any_object_reference_QMARK_(json_ml){
if(cljs.core.array_QMARK_.call(null,json_ml)){
if(cljs.core.truth_(devtools.formatters.budgeting.object_reference_QMARK_.call(null,json_ml))){
return true;
} else {
return cljs.core.some.call(null,devtools$formatters$budgeting$has_any_object_reference_QMARK_,json_ml);
}
} else {
return null;
}
});
devtools.formatters.budgeting.transfer_remaining_depth_budget_BANG_ = (function devtools$formatters$budgeting$transfer_remaining_depth_budget_BANG_(object_reference,depth_budget){
if(!((depth_budget < (0)))){
} else {
throw (new Error("Assert failed: (not (neg? depth-budget))"));
}
var data = cljs.core.second.call(null,object_reference);
var _ = ((cljs.core.object_QMARK_.call(null,data))?null:(function(){throw (new Error("Assert failed: (object? data)"))})());
var config = goog.object.get(data,"config");
var G__41808 = data;
var target__41068__auto__ = G__41808;
if(cljs.core.truth_(target__41068__auto__)){
} else {
throw (new Error([cljs.core.str("Assert failed: "),cljs.core.str([cljs.core.str("unable to locate object path "),cljs.core.str(null),cljs.core.str(" in "),cljs.core.str(G__41808)].join('')),cljs.core.str("\n"),cljs.core.str("target__41068__auto__")].join('')));
}
goog.object.set(target__41068__auto__,cljs.core.last.call(null,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, ["config"], null)),devtools.formatters.state.set_depth_budget.call(null,config,depth_budget));
return G__41808;
});
devtools.formatters.budgeting.distribute_budget_BANG_ = (function devtools$formatters$budgeting$distribute_budget_BANG_(json_ml,depth_budget){
if(!((depth_budget < (0)))){
} else {
throw (new Error("Assert failed: (not (neg? depth-budget))"));
}
if(cljs.core.array_QMARK_.call(null,json_ml)){
var new_depth_budget_41817 = (depth_budget - (1));
if(cljs.core.truth_(devtools.formatters.budgeting.object_reference_QMARK_.call(null,json_ml))){
devtools.formatters.budgeting.transfer_remaining_depth_budget_BANG_.call(null,json_ml,new_depth_budget_41817);
} else {
var seq__41813_41818 = cljs.core.seq.call(null,json_ml);
var chunk__41814_41819 = null;
var count__41815_41820 = (0);
var i__41816_41821 = (0);
while(true){
if((i__41816_41821 < count__41815_41820)){
var item_41822 = cljs.core._nth.call(null,chunk__41814_41819,i__41816_41821);
devtools$formatters$budgeting$distribute_budget_BANG_.call(null,item_41822,new_depth_budget_41817);
var G__41823 = seq__41813_41818;
var G__41824 = chunk__41814_41819;
var G__41825 = count__41815_41820;
var G__41826 = (i__41816_41821 + (1));
seq__41813_41818 = G__41823;
chunk__41814_41819 = G__41824;
count__41815_41820 = G__41825;
i__41816_41821 = G__41826;
continue;
} else {
var temp__4657__auto___41827 = cljs.core.seq.call(null,seq__41813_41818);
if(temp__4657__auto___41827){
var seq__41813_41828__$1 = temp__4657__auto___41827;
if(cljs.core.chunked_seq_QMARK_.call(null,seq__41813_41828__$1)){
var c__25941__auto___41829 = cljs.core.chunk_first.call(null,seq__41813_41828__$1);
var G__41830 = cljs.core.chunk_rest.call(null,seq__41813_41828__$1);
var G__41831 = c__25941__auto___41829;
var G__41832 = cljs.core.count.call(null,c__25941__auto___41829);
var G__41833 = (0);
seq__41813_41818 = G__41830;
chunk__41814_41819 = G__41831;
count__41815_41820 = G__41832;
i__41816_41821 = G__41833;
continue;
} else {
var item_41834 = cljs.core.first.call(null,seq__41813_41828__$1);
devtools$formatters$budgeting$distribute_budget_BANG_.call(null,item_41834,new_depth_budget_41817);
var G__41835 = cljs.core.next.call(null,seq__41813_41828__$1);
var G__41836 = null;
var G__41837 = (0);
var G__41838 = (0);
seq__41813_41818 = G__41835;
chunk__41814_41819 = G__41836;
count__41815_41820 = G__41837;
i__41816_41821 = G__41838;
continue;
}
} else {
}
}
break;
}
}
} else {
}
return json_ml;
});
devtools.formatters.budgeting.was_over_budget_QMARK__BANG_ = (function devtools$formatters$budgeting$was_over_budget_QMARK__BANG_(value){
if(cljs.core.truth_(devtools.formatters.budgeting.has_over_budget_value_QMARK_.call(null,value))){
devtools.formatters.budgeting.delete_over_budget_value_BANG_.call(null,value);
return true;
} else {
return null;
}
});
devtools.formatters.budgeting.alter_json_ml_to_fit_in_remaining_budget_BANG_ = (function devtools$formatters$budgeting$alter_json_ml_to_fit_in_remaining_budget_BANG_(value,json_ml){
var temp__4655__auto__ = devtools.formatters.helpers.pref.call(null,new cljs.core.Keyword(null,"initial-hierarchy-depth-budget","initial-hierarchy-depth-budget",-482715807));
if(cljs.core.truth_(temp__4655__auto__)){
var initial_hierarchy_depth_budget = temp__4655__auto__;
var remaining_depth_budget = (function (){var or__25130__auto__ = devtools.formatters.state.get_depth_budget.call(null);
if(cljs.core.truth_(or__25130__auto__)){
return or__25130__auto__;
} else {
return (initial_hierarchy_depth_budget - (1));
}
})();
var depth = devtools.formatters.budgeting.determine_depth.call(null,json_ml);
var final_QMARK_ = cljs.core.not.call(null,devtools.formatters.budgeting.has_any_object_reference_QMARK_.call(null,json_ml));
var needed_depth = ((final_QMARK_)?depth:(depth + devtools.formatters.budgeting.header_expander_depth_cost));
if((remaining_depth_budget >= needed_depth)){
return devtools.formatters.budgeting.distribute_budget_BANG_.call(null,json_ml,remaining_depth_budget);
} else {
var expander_ml = devtools.formatters.templating.render_markup.call(null,devtools.formatters.markup._LT_header_expander_GT_.call(null,value));
devtools.formatters.budgeting.add_over_budget_value_BANG_.call(null,value);
return expander_ml;
}
} else {
return json_ml;
}
});
//# sourceMappingURL=budgeting.js.map?rel=1603199213223

View file

@ -0,0 +1 @@
{"version":3,"file":"\/Users\/simon\/workspace\/swinging-needle-meter\/docs\/js\/compiled\/out\/devtools\/formatters\/budgeting.js","sources":["budgeting.cljs?rel=1603199213224"],"lineCount":180,"mappings":";AAAA;;;;;;AAcA,2DAAA,3DAAKA;AAKL,AAAKC,mDAAmB,EAAI,OAASC,yBAAY,KAAAA,WAAc,mCAAA,nCAACC;AAEhE,4DAAA,5DAAMC,gIAAwBC;AAA9B,AACE,GAAI,AAACC,oCAAUL;AACb,OAACM,iCAAQN,iDAAmB,yBAAA,AAAAO,zBAACC,mDAAMR,kDAAmBI;;AACtD,IAAAK,mBAAOT;AAAP,AAAA,OAAA,AAAAU,gBAAAD,iBAAA,YAAAA,iBAAgCL;;;AAEpC,+DAAA,\/DAAMO,sIAA2BP;AAAjC,AACE,GAAI,AAACC,oCAAUL;AACb,OAACM,iCAAQN,iDAAmB,yBAAA,AAAAO,zBAACK,mDAAMZ,kDAAmBI;;AACtD,IAAAK,mBAAOT;AAAP,AAAA,OAAA,AAAAU,gBAAAD,iBAAA,eAAAA,iBAAmCL;;;AAEvC,6DAAA,7DAAMS,kIAAwBT;AAA9B,AACE,GAAI,AAACC,oCAAUL;AACb,2CAAA,AAAAO,pCAACO,8DAAWd,kDAAmBI;;AAC\/B,IAAAK,mBAAOT;AAAP,AAAA,OAAA,AAAAU,gBAAAD,iBAAA,YAAAA,iBAAgCL;;;AAIpC,wDAAA,xDAAMW,wHAAmBC;AAAzB,AACE,mEAAA,5DAACC,yBAAE,AAACC,0BAAMF;;AAEZ,gDAAA,hDAAMG,wGAAiBH;AAAvB,AACE,GAAI,AAACI,iCAAOJ;AACV,kIAAA,1HAAK,AAACK,0BAAMC,cAAI,AAACC,wBAAIC,8CAAgBR;;AADvC;;;AAIF,gEAAA,hEAAMS,wIAA2BT;AAAjC,AACE,GAAI,AAACI,iCAAOJ;AACV,oBAAI,AAACD,gEAAkBC;AAAvB;;AAEE,OAACU,yBAAKC,8DAA0BX;;;AAHpC;;;AAKF,sEAAA,tEAAMa,oJAAkCC,iBAAiBC;AAAzD,AAAA,GACS,EAAK,gBAAA,fAAMA;AADpB;AAAA,AAAA,MAAA,KAAAH,MAAA;;;AAEE,IAAMI,OAAK,AAACC,2BAAOH;IACbI,IAAE,2CAAA,KAAA,AAAA,kBAAA,KAAAN,MAAA,3EAAQ,AAACO,kCAAQH;IACnBI,SAAO,AAAA1B,qBAAA,LAAMsB;AAFnB,AAGE,IAAAK,WAAML;IAANM,wBAAAD;AAAA,AAAA,oBAAAC;AAAA;AAAA,AAAA,MAAA,KAAAV,MAAA,eAAA,iCAAA,eAAA,+CAAA,oBAAA,sBAAAS,mCAAA,oBAAA;;;AAAA,AAAAE,gBAAAD,sBAAA,AAAAE,yBAAA,mFAAA,kBAAsB,AAACC,qDAAiBL,OAAOL;;AAA\/CM;;AAEJ,wDAAA,xDAAMK,wHAAoB1B,QAAQe;AAAlC,AAAA,GACS,EAAK,gBAAA,fAAMA;AADpB;AAAA,AAAA,MAAA,KAAAH,MAAA;;;AAEE,GAAI,AAACR,iCAAOJ;AACV,IAAM2B,yBAAiB,gBAAA,fAAKZ;AAA5B,AACE,oBAAI,AAAChB,gEAAkBC;AACrB,AAACa,8EAAiCb,QAAQ2B;;AAC1C,IAAAC,mBAAA,AAAAC,wBAAa7B;IAAb8B,qBAAA;IAAAC,qBAAA;IAAAC,iBAAA;;AAAA,AAAA,GAAA,AAAA,CAAAA,iBAAAD;AAAA,iBAAA,AAAAE,yBAAAH,mBAAAE,zDAAQS;AAAR,AAAA,AACE,AAACC,gEAAmBD,WAAKd;;AAD3B,eAAAC;eAAAE;eAAAC;eAAA,CAAAC,iBAAA;;;;;;;AAAA,IAAAE,2BAAA,AAAAL,wBAAAD;AAAA,AAAA,GAAAM;AAAA,AAAA,IAAAN,uBAAAM;AAAA,AAAA,GAAA,AAAAC,uCAAAP;AAAA,IAAAQ,yBAAA,AAAAC,gCAAAT;AAAA,AAAA,eAAA,AAAAU,+BAAAV;eAAAQ;eAAA,AAAAG,0BAAAH;eAAA;;;;;;;AAAA,iBAAA,AAAAlC,0BAAA0B,vCAAQa;AAAR,AAAA,AACE,AAACC,gEAAmBD,WAAKd;;AAD3B,eAAA,AAAAa,yBAAAZ;eAAA;eAAA;eAAA;;;;;;;;AAAA;;;;;;AAJN;;AAMA5B;;AAIF,6DAAA,7DAAM2C,kIAAmBvD;AAAzB,AACE,oBAAM,AAACS,qEAAuBT;AAA9B,AACE,AAACO,uEAA0BP;;AAD7B;;AAAA;;;AAIF,+EAAA,\/EAAMwD,sKAA2CxD,MAAMY;AAAvD,AACE,IAAA6C,qBAAwC,2CAAA,3CAACE;AAAzC,AAAA,oBAAAF;AAAA,qCAAAA,jCAASC;AAAT,AACE,IAAME,yBAAuB,iBAAAC,oBAAI,AAACC;AAAL,AAAA,oBAAAD;AAAAA;;AAAuB,yCAAA,jCAAKH;;;IACnDK,QAAM,AAAChD,wDAAgBH;IACvBoD,eAAO,AAACC,wBAAI,AAAC5C,wEAA0BT;IACvCsD,eAAa,EAAIF,cAAOD,MAAM,CAAGA,QAAMpE;AAH7C,AAIE,GAAI,CAAIiE,0BAAuBM;AAC7B,OAAC5B,gEAAmB1B,QAAQgD;;AAC5B,IAAMO,cAAY,AAACC,uDAAc,AAACC,6DAAkBrE;AAApD,AACE,AAACD,oEAAuBC;;AACxBmE;;;AACNvD","names":["devtools.formatters.budgeting\/header-expander-depth-cost","devtools.formatters.budgeting\/over-budget-values","js\/WeakSet","cljs.core\/volatile!","devtools.formatters.budgeting\/add-over-budget-value!","value","cljs.core\/volatile?","cljs.core\/vreset!","cljs.core\/deref","cljs.core\/conj","o__41049__auto__","goog.object\/get","devtools.formatters.budgeting\/delete-over-budget-value!","cljs.core\/disj","devtools.formatters.budgeting\/has-over-budget-value?","cljs.core\/contains?","devtools.formatters.budgeting\/object-reference?","json-ml","cljs.core\/=","cljs.core\/first","devtools.formatters.budgeting\/determine-depth","cljs.core\/array?","cljs.core\/apply","cljs.core\/max","cljs.core\/map","determine-depth","devtools.formatters.budgeting\/has-any-object-reference?","cljs.core\/some","has-any-object-reference?","js\/Error","devtools.formatters.budgeting\/transfer-remaining-depth-budget!","object-reference","depth-budget","data","cljs.core\/second","_","cljs.core\/object?","config","G__41808","target__41068__auto__","goog.object\/set","cljs.core\/last","devtools.formatters.state\/set-depth-budget","devtools.formatters.budgeting\/distribute-budget!","new-depth-budget","seq__41813","cljs.core\/seq","chunk__41814","count__41815","i__41816","cljs.core\/-nth","temp__4657__auto__","cljs.core\/chunked-seq?","c__25941__auto__","cljs.core\/chunk-first","cljs.core\/chunk-rest","cljs.core\/count","cljs.core\/next","item","distribute-budget!","devtools.formatters.budgeting\/was-over-budget?!","devtools.formatters.budgeting\/alter-json-ml-to-fit-in-remaining-budget!","temp__4655__auto__","initial-hierarchy-depth-budget","devtools.formatters.helpers\/pref","remaining-depth-budget","or__25130__auto__","devtools.formatters.state\/get-depth-budget","depth","final?","cljs.core\/not","needed-depth","expander-ml","devtools.formatters.templating\/render-markup","devtools.formatters.markup\/<header-expander>"]}

View file

@ -0,0 +1,84 @@
(ns devtools.formatters.core
(:require-macros [devtools.util :refer [oget oset ocall oapply safe-call]])
(:require [devtools.prefs :refer [pref]]
[devtools.format :refer [IDevtoolsFormat]]
[devtools.protocols :refer [IFormat]]
[devtools.formatters.templating :refer [surrogate? render-markup get-surrogate-body]]
[devtools.formatters.helpers :refer [cljs-value?]]
[devtools.formatters.state :refer [prevent-recursion? *current-state* get-default-state update-current-state!
reset-depth-limits]]
[devtools.formatters.markup :refer [<header> <surrogate-header> <surrogate-body>]]
[devtools.formatters.budgeting :refer [was-over-budget?! alter-json-ml-to-fit-in-remaining-budget!]]))
; -- RAW API ----------------------------------------------------------------------------------------------------------------
(defn want-value?* [value]
(and (not (prevent-recursion?))
(or (cljs-value? value) (surrogate? value))))
(defn header* [value]
(let [json-ml (cond
(surrogate? value) (render-markup (<surrogate-header> value))
(safe-call satisfies? false IDevtoolsFormat value) (devtools.format/-header value)
(safe-call satisfies? false IFormat value) (devtools.protocols/-header value)
:else (render-markup (<header> value)))]
(alter-json-ml-to-fit-in-remaining-budget! value json-ml))) ; see issue #22
(defn has-body* [value]
; note: body is emulated using surrogate references
(if (was-over-budget?! value) ; see issue #22
false ; see alter-json-ml-to-fit-in-remaining-budget!, in case we didn't fit into budget, a header-expander placeholder with body was added in place
(boolean
(cond
(surrogate? value) (some? (get-surrogate-body value))
(safe-call satisfies? false IDevtoolsFormat value) (devtools.format/-has-body value)
(safe-call satisfies? false IFormat value) (devtools.protocols/-has-body value)
:else false))))
(defn body* [value]
(update-current-state! reset-depth-limits)
(cond
(surrogate? value) (render-markup (<surrogate-body> value))
(safe-call satisfies? false IDevtoolsFormat value) (devtools.format/-body value)
(safe-call satisfies? false IFormat value) (devtools.protocols/-body value)))
; ---------------------------------------------------------------------------------------------------------------------------
; config-aware RAW API, see state management documentation state.cljs
(defn config-wrapper [raw-fn]
(fn [value config]
(binding [*current-state* (or config (get-default-state))]
(raw-fn value))))
(def want-value? (config-wrapper want-value?*))
(def header (config-wrapper header*))
(def has-body (config-wrapper has-body*))
(def body (config-wrapper body*))
; -- API CALLS --------------------------------------------------------------------------------------------------------------
(defn wrap-with-exception-guard [f]
(fn [& args]
(try
(apply f args)
(catch :default e
(.error js/console "CLJS DevTools internal error:" e)
nil))))
(defn build-api-call [raw-fn pre-handler-key post-handler-key]
"Wraps raw API call in a function which calls pre-handler and post-handler.
pre-handler gets a chance to pre-process value before it is passed to cljs-devtools
post-handler gets a chance to post-process value returned by cljs-devtools."
(let [handler (fn [value config]
(let [pre-handler (or (pref pre-handler-key) identity)
post-handler (or (pref post-handler-key) identity)
preprocessed-value (pre-handler value)
result (if (want-value? preprocessed-value config)
(raw-fn preprocessed-value config))]
(post-handler result)))]
(wrap-with-exception-guard handler)))
(def header-api-call (build-api-call header :header-pre-handler :header-post-handler))
(def has-body-api-call (build-api-call has-body :has-body-pre-handler :has-body-post-handler))
(def body-api-call (build-api-call body :body-pre-handler :body-post-handler))

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,218 @@
// Compiled by ClojureScript 1.9.229 {}
goog.provide('devtools.formatters.core');
goog.require('cljs.core');
goog.require('devtools.prefs');
goog.require('devtools.format');
goog.require('devtools.protocols');
goog.require('devtools.formatters.templating');
goog.require('devtools.formatters.helpers');
goog.require('devtools.formatters.state');
goog.require('devtools.formatters.markup');
goog.require('devtools.formatters.budgeting');
devtools.formatters.core.want_value_QMARK__STAR_ = (function devtools$formatters$core$want_value_QMARK__STAR_(value){
var and__25118__auto__ = cljs.core.not.call(null,devtools.formatters.state.prevent_recursion_QMARK_.call(null));
if(and__25118__auto__){
var or__25130__auto__ = devtools.formatters.helpers.cljs_value_QMARK_.call(null,value);
if(cljs.core.truth_(or__25130__auto__)){
return or__25130__auto__;
} else {
return devtools.formatters.templating.surrogate_QMARK_.call(null,value);
}
} else {
return and__25118__auto__;
}
});
devtools.formatters.core.header_STAR_ = (function devtools$formatters$core$header_STAR_(value){
var json_ml = (cljs.core.truth_(devtools.formatters.templating.surrogate_QMARK_.call(null,value))?devtools.formatters.templating.render_markup.call(null,devtools.formatters.markup._LT_surrogate_header_GT_.call(null,value)):(cljs.core.truth_((function (){try{if(!((value == null))){
if((false) || (value.devtools$format$IDevtoolsFormat$)){
return true;
} else {
if((!value.cljs$lang$protocol_mask$partition$)){
return cljs.core.native_satisfies_QMARK_.call(null,devtools.format.IDevtoolsFormat,value);
} else {
return false;
}
}
} else {
return cljs.core.native_satisfies_QMARK_.call(null,devtools.format.IDevtoolsFormat,value);
}
}catch (e41845){var e__41074__auto__ = e41845;
return false;
}})())?devtools.format._header.call(null,value):(cljs.core.truth_((function (){try{if(!((value == null))){
if((false) || (value.devtools$protocols$IFormat$)){
return true;
} else {
if((!value.cljs$lang$protocol_mask$partition$)){
return cljs.core.native_satisfies_QMARK_.call(null,devtools.protocols.IFormat,value);
} else {
return false;
}
}
} else {
return cljs.core.native_satisfies_QMARK_.call(null,devtools.protocols.IFormat,value);
}
}catch (e41847){var e__41074__auto__ = e41847;
return false;
}})())?devtools.protocols._header.call(null,value):devtools.formatters.templating.render_markup.call(null,devtools.formatters.markup._LT_header_GT_.call(null,value))
)));
return devtools.formatters.budgeting.alter_json_ml_to_fit_in_remaining_budget_BANG_.call(null,value,json_ml);
});
devtools.formatters.core.has_body_STAR_ = (function devtools$formatters$core$has_body_STAR_(value){
if(cljs.core.truth_(devtools.formatters.budgeting.was_over_budget_QMARK__BANG_.call(null,value))){
return false;
} else {
return cljs.core.boolean$.call(null,(cljs.core.truth_(devtools.formatters.templating.surrogate_QMARK_.call(null,value))?cljs.core.some_QMARK_.call(null,devtools.formatters.templating.get_surrogate_body.call(null,value)):(cljs.core.truth_((function (){try{if(!((value == null))){
if((false) || (value.devtools$format$IDevtoolsFormat$)){
return true;
} else {
if((!value.cljs$lang$protocol_mask$partition$)){
return cljs.core.native_satisfies_QMARK_.call(null,devtools.format.IDevtoolsFormat,value);
} else {
return false;
}
}
} else {
return cljs.core.native_satisfies_QMARK_.call(null,devtools.format.IDevtoolsFormat,value);
}
}catch (e41853){var e__41074__auto__ = e41853;
return false;
}})())?devtools.format._has_body.call(null,value):(cljs.core.truth_((function (){try{if(!((value == null))){
if((false) || (value.devtools$protocols$IFormat$)){
return true;
} else {
if((!value.cljs$lang$protocol_mask$partition$)){
return cljs.core.native_satisfies_QMARK_.call(null,devtools.protocols.IFormat,value);
} else {
return false;
}
}
} else {
return cljs.core.native_satisfies_QMARK_.call(null,devtools.protocols.IFormat,value);
}
}catch (e41855){var e__41074__auto__ = e41855;
return false;
}})())?devtools.protocols._has_body.call(null,value):false
))));
}
});
devtools.formatters.core.body_STAR_ = (function devtools$formatters$core$body_STAR_(value){
devtools.formatters.state.update_current_state_BANG_.call(null,devtools.formatters.state.reset_depth_limits);
if(cljs.core.truth_(devtools.formatters.templating.surrogate_QMARK_.call(null,value))){
return devtools.formatters.templating.render_markup.call(null,devtools.formatters.markup._LT_surrogate_body_GT_.call(null,value));
} else {
if(cljs.core.truth_((function (){try{if(!((value == null))){
if((false) || (value.devtools$format$IDevtoolsFormat$)){
return true;
} else {
if((!value.cljs$lang$protocol_mask$partition$)){
return cljs.core.native_satisfies_QMARK_.call(null,devtools.format.IDevtoolsFormat,value);
} else {
return false;
}
}
} else {
return cljs.core.native_satisfies_QMARK_.call(null,devtools.format.IDevtoolsFormat,value);
}
}catch (e41861){var e__41074__auto__ = e41861;
return false;
}})())){
return devtools.format._body.call(null,value);
} else {
if(cljs.core.truth_((function (){try{if(!((value == null))){
if((false) || (value.devtools$protocols$IFormat$)){
return true;
} else {
if((!value.cljs$lang$protocol_mask$partition$)){
return cljs.core.native_satisfies_QMARK_.call(null,devtools.protocols.IFormat,value);
} else {
return false;
}
}
} else {
return cljs.core.native_satisfies_QMARK_.call(null,devtools.protocols.IFormat,value);
}
}catch (e41863){var e__41074__auto__ = e41863;
return false;
}})())){
return devtools.protocols._body.call(null,value);
} else {
return null;
}
}
}
});
devtools.formatters.core.config_wrapper = (function devtools$formatters$core$config_wrapper(raw_fn){
return (function (value,config){
var _STAR_current_state_STAR_41866 = devtools.formatters.state._STAR_current_state_STAR_;
devtools.formatters.state._STAR_current_state_STAR_ = (function (){var or__25130__auto__ = config;
if(cljs.core.truth_(or__25130__auto__)){
return or__25130__auto__;
} else {
return devtools.formatters.state.get_default_state.call(null);
}
})();
try{return raw_fn.call(null,value);
}finally {devtools.formatters.state._STAR_current_state_STAR_ = _STAR_current_state_STAR_41866;
}});
});
devtools.formatters.core.want_value_QMARK_ = devtools.formatters.core.config_wrapper.call(null,devtools.formatters.core.want_value_QMARK__STAR_);
devtools.formatters.core.header = devtools.formatters.core.config_wrapper.call(null,devtools.formatters.core.header_STAR_);
devtools.formatters.core.has_body = devtools.formatters.core.config_wrapper.call(null,devtools.formatters.core.has_body_STAR_);
devtools.formatters.core.body = devtools.formatters.core.config_wrapper.call(null,devtools.formatters.core.body_STAR_);
devtools.formatters.core.wrap_with_exception_guard = (function devtools$formatters$core$wrap_with_exception_guard(f){
return (function() {
var G__41869__delegate = function (args){
try{return cljs.core.apply.call(null,f,args);
}catch (e41868){var e = e41868;
console.error("CLJS DevTools internal error:",e);
return null;
}};
var G__41869 = function (var_args){
var args = null;
if (arguments.length > 0) {
var G__41870__i = 0, G__41870__a = new Array(arguments.length - 0);
while (G__41870__i < G__41870__a.length) {G__41870__a[G__41870__i] = arguments[G__41870__i + 0]; ++G__41870__i;}
args = new cljs.core.IndexedSeq(G__41870__a,0);
}
return G__41869__delegate.call(this,args);};
G__41869.cljs$lang$maxFixedArity = 0;
G__41869.cljs$lang$applyTo = (function (arglist__41871){
var args = cljs.core.seq(arglist__41871);
return G__41869__delegate(args);
});
G__41869.cljs$core$IFn$_invoke$arity$variadic = G__41869__delegate;
return G__41869;
})()
;
});
devtools.formatters.core.build_api_call = (function devtools$formatters$core$build_api_call(raw_fn,pre_handler_key,post_handler_key){
var handler = (function (value,config){
var pre_handler = (function (){var or__25130__auto__ = devtools.prefs.pref.call(null,pre_handler_key);
if(cljs.core.truth_(or__25130__auto__)){
return or__25130__auto__;
} else {
return cljs.core.identity;
}
})();
var post_handler = (function (){var or__25130__auto__ = devtools.prefs.pref.call(null,post_handler_key);
if(cljs.core.truth_(or__25130__auto__)){
return or__25130__auto__;
} else {
return cljs.core.identity;
}
})();
var preprocessed_value = pre_handler.call(null,value);
var result = (cljs.core.truth_(devtools.formatters.core.want_value_QMARK_.call(null,preprocessed_value,config))?raw_fn.call(null,preprocessed_value,config):null);
return post_handler.call(null,result);
});
return devtools.formatters.core.wrap_with_exception_guard.call(null,handler);
});
devtools.formatters.core.header_api_call = devtools.formatters.core.build_api_call.call(null,devtools.formatters.core.header,new cljs.core.Keyword(null,"header-pre-handler","header-pre-handler",-1997722262),new cljs.core.Keyword(null,"header-post-handler","header-post-handler",514828618));
devtools.formatters.core.has_body_api_call = devtools.formatters.core.build_api_call.call(null,devtools.formatters.core.has_body,new cljs.core.Keyword(null,"has-body-pre-handler","has-body-pre-handler",1787020038),new cljs.core.Keyword(null,"has-body-post-handler","has-body-post-handler",-863451271));
devtools.formatters.core.body_api_call = devtools.formatters.core.build_api_call.call(null,devtools.formatters.core.body,new cljs.core.Keyword(null,"body-pre-handler","body-pre-handler",1211926529),new cljs.core.Keyword(null,"body-post-handler","body-post-handler",-1040905424));
//# sourceMappingURL=core.js.map?rel=1603199213329

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,115 @@
(ns devtools.formatters.helpers
(:require-macros [devtools.util :refer [oget oset ocall oapply safe-call]])
(:require [devtools.prefs :as prefs]
[devtools.munging :as munging]
[devtools.format :refer [IDevtoolsFormat]]
[devtools.protocols :refer [ITemplate IGroup ISurrogate IFormat]]))
(defn pref [v]
(if (keyword? v)
(recur (prefs/pref v))
v))
(defn get-constructor [o]
(oget o "constructor"))
; ---------------------------------------------------------------------------------------------------------------------------
(defn is-prototype? [o]
(identical? (.-prototype (.-constructor o)) o))
(defn is-js-symbol? [o]
(= (goog/typeOf o) "symbol"))
(defn cljs-function? [value]
(and (not (pref :disable-cljs-fn-formatting)) ; TODO: this should be deprecated
(not (var? value)) ; HACK: vars have IFn protocol and would act as functions TODO: implement custom rendering for vars
(munging/cljs-fn? value)))
(defn has-formatting-protocol? [value]
(or (safe-call satisfies? false IPrintWithWriter value)
(safe-call satisfies? false IDevtoolsFormat value) ; legacy
(safe-call satisfies? false IFormat value)))
; IRC #clojurescript @ freenode.net on 2015-01-27:
; [13:40:09] darwin_: Hi, what is the best way to test if I'm handled ClojureScript data value or plain javascript object?
; [14:04:34] dnolen: there is a very low level thing you can check
; [14:04:36] dnolen: https://github.com/clojure/clojurescript/blob/c2550c4fdc94178a7957497e2bfde54e5600c457/src/clj/cljs/core.clj#L901
; [14:05:00] dnolen: this property is unlikely to change - still it's probably not something anything anyone should use w/o a really good reason
(defn cljs-type? [f]
(and (goog/isObject f) ; see http://stackoverflow.com/a/22482737/84283
(not (is-prototype? f))
(oget f "cljs$lang$type")))
(defn cljs-instance? [value]
(and (goog/isObject value) ; see http://stackoverflow.com/a/22482737/84283
(cljs-type? (get-constructor value))))
(defn cljs-land-value? [value]
(or (cljs-instance? value)
(has-formatting-protocol? value))) ; some raw js types can be extend-protocol to support cljs printing, see issue #21
(defn cljs-value? [value]
(and
(or (cljs-land-value? value)
(cljs-function? value))
(not (is-prototype? value))
(not (is-js-symbol? value))))
(defn bool? [value]
(or (true? value) (false? value)))
(defn instance-of-a-well-known-type? [value]
(let [well-known-types (pref :well-known-types)
constructor-fn (get-constructor value)
[ns name] (munging/parse-constructor-info constructor-fn)
fully-qualified-type-name (str ns "/" name)]
(contains? well-known-types fully-qualified-type-name)))
(defn should-render-instance? [value]
(and (cljs-instance? value)
(not (instance-of-a-well-known-type? value))))
(defn directly-printable? [value]
(or (string? value)
(number? value)
(bool? value)))
; ---------------------------------------------------------------------------------------------------------------------------
(defn abbreviated? [template]
(some #(= (pref :more-marker) %) template))
(defn abbreviate-long-string [string marker prefix-limit postfix-limit]
(let [prefix (apply str (take prefix-limit string))
postfix (apply str (take-last postfix-limit string))]
(str prefix marker postfix)))
(defn get-more-marker [more-count]
(str (pref :plus-symbol) more-count (pref :more-symbol)))
(defn wrap-arity [arity]
(let [args-open-symbol (pref :args-open-symbol)
args-close-symbol (pref :args-close-symbol)]
(str args-open-symbol arity args-close-symbol)))
(defn fetch-field-value [obj field]
[field (oget obj (munge field))])
(defn fetch-fields-values [obj fields]
(map (partial fetch-field-value obj) fields))
(defn expandable? [obj]
(if (seqable? obj)
(if-let [min-count (pref (if (instance-of-a-well-known-type? obj)
:min-expandable-sequable-count-for-well-known-types
:min-expandable-sequable-count))]
(if-not (empty? obj)
(let [actual-count (bounded-count min-count obj)]
(>= actual-count min-count))))))
(defn should-render? [pref-key value default-check]
(if-let [render-pref (pref pref-key)]
(cond
(true? render-pref) (default-check value)
(fn? render-pref) (render-pref value))))

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,235 @@
// Compiled by ClojureScript 1.9.229 {}
goog.provide('devtools.formatters.helpers');
goog.require('cljs.core');
goog.require('devtools.prefs');
goog.require('devtools.munging');
goog.require('devtools.format');
goog.require('devtools.protocols');
devtools.formatters.helpers.pref = (function devtools$formatters$helpers$pref(v){
while(true){
if((v instanceof cljs.core.Keyword)){
var G__41363 = devtools.prefs.pref.call(null,v);
v = G__41363;
continue;
} else {
return v;
}
break;
}
});
devtools.formatters.helpers.get_constructor = (function devtools$formatters$helpers$get_constructor(o){
return goog.object.get(o,"constructor");
});
devtools.formatters.helpers.is_prototype_QMARK_ = (function devtools$formatters$helpers$is_prototype_QMARK_(o){
return (o.constructor.prototype === o);
});
devtools.formatters.helpers.is_js_symbol_QMARK_ = (function devtools$formatters$helpers$is_js_symbol_QMARK_(o){
return cljs.core._EQ_.call(null,goog.typeOf(o),"symbol");
});
devtools.formatters.helpers.cljs_function_QMARK_ = (function devtools$formatters$helpers$cljs_function_QMARK_(value){
var and__25118__auto__ = cljs.core.not.call(null,devtools.formatters.helpers.pref.call(null,new cljs.core.Keyword(null,"disable-cljs-fn-formatting","disable-cljs-fn-formatting",1903786837)));
if(and__25118__auto__){
var and__25118__auto____$1 = !(cljs.core.var_QMARK_.call(null,value));
if(and__25118__auto____$1){
return devtools.munging.cljs_fn_QMARK_.call(null,value);
} else {
return and__25118__auto____$1;
}
} else {
return and__25118__auto__;
}
});
devtools.formatters.helpers.has_formatting_protocol_QMARK_ = (function devtools$formatters$helpers$has_formatting_protocol_QMARK_(value){
var or__25130__auto__ = (function (){try{if(!((value == null))){
if(((value.cljs$lang$protocol_mask$partition0$ & (2147483648))) || (value.cljs$core$IPrintWithWriter$)){
return true;
} else {
if((!value.cljs$lang$protocol_mask$partition0$)){
return cljs.core.native_satisfies_QMARK_.call(null,cljs.core.IPrintWithWriter,value);
} else {
return false;
}
}
} else {
return cljs.core.native_satisfies_QMARK_.call(null,cljs.core.IPrintWithWriter,value);
}
}catch (e41376){var e__41074__auto__ = e41376;
return false;
}})();
if(cljs.core.truth_(or__25130__auto__)){
return or__25130__auto__;
} else {
var or__25130__auto____$1 = (function (){try{if(!((value == null))){
if((false) || (value.devtools$format$IDevtoolsFormat$)){
return true;
} else {
if((!value.cljs$lang$protocol_mask$partition$)){
return cljs.core.native_satisfies_QMARK_.call(null,devtools.format.IDevtoolsFormat,value);
} else {
return false;
}
}
} else {
return cljs.core.native_satisfies_QMARK_.call(null,devtools.format.IDevtoolsFormat,value);
}
}catch (e41380){var e__41074__auto__ = e41380;
return false;
}})();
if(cljs.core.truth_(or__25130__auto____$1)){
return or__25130__auto____$1;
} else {
try{if(!((value == null))){
if((false) || (value.devtools$protocols$IFormat$)){
return true;
} else {
if((!value.cljs$lang$protocol_mask$partition$)){
return cljs.core.native_satisfies_QMARK_.call(null,devtools.protocols.IFormat,value);
} else {
return false;
}
}
} else {
return cljs.core.native_satisfies_QMARK_.call(null,devtools.protocols.IFormat,value);
}
}catch (e41382){var e__41074__auto__ = e41382;
return false;
}}
}
});
devtools.formatters.helpers.cljs_type_QMARK_ = (function devtools$formatters$helpers$cljs_type_QMARK_(f){
var and__25118__auto__ = goog.isObject(f);
if(cljs.core.truth_(and__25118__auto__)){
var and__25118__auto____$1 = cljs.core.not.call(null,devtools.formatters.helpers.is_prototype_QMARK_.call(null,f));
if(and__25118__auto____$1){
return goog.object.get(f,"cljs$lang$type");
} else {
return and__25118__auto____$1;
}
} else {
return and__25118__auto__;
}
});
devtools.formatters.helpers.cljs_instance_QMARK_ = (function devtools$formatters$helpers$cljs_instance_QMARK_(value){
var and__25118__auto__ = goog.isObject(value);
if(cljs.core.truth_(and__25118__auto__)){
return devtools.formatters.helpers.cljs_type_QMARK_.call(null,devtools.formatters.helpers.get_constructor.call(null,value));
} else {
return and__25118__auto__;
}
});
devtools.formatters.helpers.cljs_land_value_QMARK_ = (function devtools$formatters$helpers$cljs_land_value_QMARK_(value){
var or__25130__auto__ = devtools.formatters.helpers.cljs_instance_QMARK_.call(null,value);
if(cljs.core.truth_(or__25130__auto__)){
return or__25130__auto__;
} else {
return devtools.formatters.helpers.has_formatting_protocol_QMARK_.call(null,value);
}
});
devtools.formatters.helpers.cljs_value_QMARK_ = (function devtools$formatters$helpers$cljs_value_QMARK_(value){
var and__25118__auto__ = (function (){var or__25130__auto__ = devtools.formatters.helpers.cljs_land_value_QMARK_.call(null,value);
if(cljs.core.truth_(or__25130__auto__)){
return or__25130__auto__;
} else {
return devtools.formatters.helpers.cljs_function_QMARK_.call(null,value);
}
})();
if(cljs.core.truth_(and__25118__auto__)){
return (cljs.core.not.call(null,devtools.formatters.helpers.is_prototype_QMARK_.call(null,value))) && (cljs.core.not.call(null,devtools.formatters.helpers.is_js_symbol_QMARK_.call(null,value)));
} else {
return and__25118__auto__;
}
});
devtools.formatters.helpers.bool_QMARK_ = (function devtools$formatters$helpers$bool_QMARK_(value){
return (value === true) || (value === false);
});
devtools.formatters.helpers.instance_of_a_well_known_type_QMARK_ = (function devtools$formatters$helpers$instance_of_a_well_known_type_QMARK_(value){
var well_known_types = devtools.formatters.helpers.pref.call(null,new cljs.core.Keyword(null,"well-known-types","well-known-types",70638649));
var constructor_fn = devtools.formatters.helpers.get_constructor.call(null,value);
var vec__41387 = devtools.munging.parse_constructor_info.call(null,constructor_fn);
var ns = cljs.core.nth.call(null,vec__41387,(0),null);
var name = cljs.core.nth.call(null,vec__41387,(1),null);
var fully_qualified_type_name = [cljs.core.str(ns),cljs.core.str("/"),cljs.core.str(name)].join('');
return cljs.core.contains_QMARK_.call(null,well_known_types,fully_qualified_type_name);
});
devtools.formatters.helpers.should_render_instance_QMARK_ = (function devtools$formatters$helpers$should_render_instance_QMARK_(value){
var and__25118__auto__ = devtools.formatters.helpers.cljs_instance_QMARK_.call(null,value);
if(cljs.core.truth_(and__25118__auto__)){
return cljs.core.not.call(null,devtools.formatters.helpers.instance_of_a_well_known_type_QMARK_.call(null,value));
} else {
return and__25118__auto__;
}
});
devtools.formatters.helpers.directly_printable_QMARK_ = (function devtools$formatters$helpers$directly_printable_QMARK_(value){
var or__25130__auto__ = typeof value === 'string';
if(or__25130__auto__){
return or__25130__auto__;
} else {
var or__25130__auto____$1 = typeof value === 'number';
if(or__25130__auto____$1){
return or__25130__auto____$1;
} else {
return devtools.formatters.helpers.bool_QMARK_.call(null,value);
}
}
});
devtools.formatters.helpers.abbreviated_QMARK_ = (function devtools$formatters$helpers$abbreviated_QMARK_(template){
return cljs.core.some.call(null,(function (p1__41390_SHARP_){
return cljs.core._EQ_.call(null,devtools.formatters.helpers.pref.call(null,new cljs.core.Keyword(null,"more-marker","more-marker",-14717935)),p1__41390_SHARP_);
}),template);
});
devtools.formatters.helpers.abbreviate_long_string = (function devtools$formatters$helpers$abbreviate_long_string(string,marker,prefix_limit,postfix_limit){
var prefix = cljs.core.apply.call(null,cljs.core.str,cljs.core.take.call(null,prefix_limit,string));
var postfix = cljs.core.apply.call(null,cljs.core.str,cljs.core.take_last.call(null,postfix_limit,string));
return [cljs.core.str(prefix),cljs.core.str(marker),cljs.core.str(postfix)].join('');
});
devtools.formatters.helpers.get_more_marker = (function devtools$formatters$helpers$get_more_marker(more_count){
return [cljs.core.str(devtools.formatters.helpers.pref.call(null,new cljs.core.Keyword(null,"plus-symbol","plus-symbol",-1984915189))),cljs.core.str(more_count),cljs.core.str(devtools.formatters.helpers.pref.call(null,new cljs.core.Keyword(null,"more-symbol","more-symbol",-2139760242)))].join('');
});
devtools.formatters.helpers.wrap_arity = (function devtools$formatters$helpers$wrap_arity(arity){
var args_open_symbol = devtools.formatters.helpers.pref.call(null,new cljs.core.Keyword(null,"args-open-symbol","args-open-symbol",-1336957557));
var args_close_symbol = devtools.formatters.helpers.pref.call(null,new cljs.core.Keyword(null,"args-close-symbol","args-close-symbol",777697973));
return [cljs.core.str(args_open_symbol),cljs.core.str(arity),cljs.core.str(args_close_symbol)].join('');
});
devtools.formatters.helpers.fetch_field_value = (function devtools$formatters$helpers$fetch_field_value(obj,field){
return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [field,goog.object.get(obj,cljs.core.munge.call(null,field))], null);
});
devtools.formatters.helpers.fetch_fields_values = (function devtools$formatters$helpers$fetch_fields_values(obj,fields){
return cljs.core.map.call(null,cljs.core.partial.call(null,devtools.formatters.helpers.fetch_field_value,obj),fields);
});
devtools.formatters.helpers.expandable_QMARK_ = (function devtools$formatters$helpers$expandable_QMARK_(obj){
if(cljs.core.seqable_QMARK_.call(null,obj)){
var temp__4655__auto__ = devtools.formatters.helpers.pref.call(null,(cljs.core.truth_(devtools.formatters.helpers.instance_of_a_well_known_type_QMARK_.call(null,obj))?new cljs.core.Keyword(null,"min-expandable-sequable-count-for-well-known-types","min-expandable-sequable-count-for-well-known-types",-1879576081):new cljs.core.Keyword(null,"min-expandable-sequable-count","min-expandable-sequable-count",63566227)));
if(cljs.core.truth_(temp__4655__auto__)){
var min_count = temp__4655__auto__;
if(!(cljs.core.empty_QMARK_.call(null,obj))){
var actual_count = cljs.core.bounded_count.call(null,min_count,obj);
return (actual_count >= min_count);
} else {
return null;
}
} else {
return null;
}
} else {
return null;
}
});
devtools.formatters.helpers.should_render_QMARK_ = (function devtools$formatters$helpers$should_render_QMARK_(pref_key,value,default_check){
var temp__4655__auto__ = devtools.formatters.helpers.pref.call(null,pref_key);
if(cljs.core.truth_(temp__4655__auto__)){
var render_pref = temp__4655__auto__;
if(render_pref === true){
return default_check.call(null,value);
} else {
if(cljs.core.fn_QMARK_.call(null,render_pref)){
return render_pref.call(null,value);
} else {
return null;
}
}
} else {
return null;
}
});
//# sourceMappingURL=helpers.js.map?rel=1603199212173

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,452 @@
(ns devtools.formatters.markup
(:require-macros [devtools.util :refer [oget oset ocall oapply safe-call]]
[devtools.formatters.markup :refer [emit-markup-db]])
(:require [devtools.formatters.helpers :refer [bool? cljs-function? cljs-type? cljs-instance?
should-render-instance? expandable? abbreviated?
abbreviate-long-string get-constructor pref should-render?
get-more-marker wrap-arity fetch-fields-values]]
[devtools.formatters.printing :refer [managed-print-via-writer managed-print-via-protocol]]
[devtools.formatters.state :refer [set-prevent-recursion set-managed-print-level reset-depth-limits]]
[devtools.formatters.templating :refer [get-surrogate-body
get-surrogate-target
get-surrogate-start-index
get-surrogate-header]]
[devtools.munging :as munging]))
; reusable hiccup-like templates
(declare get-markup-db)
; -- cljs printing ---------------------------------------------------------------------------------------------------------
(defn print-with [method value tag & [max-level]]
(let [job-fn #(method value tag (get-markup-db))]
(if (some? max-level)
(binding [*print-level* (inc max-level)] ; when printing do at most print-level deep recursion
(job-fn))
(job-fn))))
(defn print-via-writer [value tag & [max-level]]
(print-with managed-print-via-writer value tag max-level))
(defn print-via-protocol [value tag & [max-level]]
(print-with managed-print-via-protocol value tag max-level))
; -- references -------------------------------------------------------------------------------------------------------------
(defn <expandable> [& children]
(let [inner-markup (concat [:expandable-inner-tag] children)]
[:expandable-tag :expandable-symbol inner-markup]))
(defn <raw-surrogate> [& args]
(concat ["surrogate"] args))
(defn <surrogate> [& [object header body start-index]]
(let [header (if (some? body) (<expandable> header) header)]
(<raw-surrogate> object header body start-index)))
(defn <reference> [& args]
(concat ["reference"] args))
(defn <reference-surrogate> [& args]
(<reference> (apply <surrogate> args)))
(defn <circular-reference> [& children]
(<reference-surrogate> nil [:circular-reference-tag :circular-ref-icon] (concat [:circular-reference-body-tag] children)))
(defn <native-reference> [object]
(let [reference (<reference> object #(set-prevent-recursion % true))]
[:native-reference-wrapper-tag :native-reference-background [:native-reference-tag reference]]))
(defn <header-expander> [object]
(<reference> (<raw-surrogate> object :header-expander-symbol :target) reset-depth-limits))
; -- simple markup ----------------------------------------------------------------------------------------------------------
(defn <cljs-land> [& children]
(concat [:cljs-land-tag] children))
(defn <nil> []
; this code is duplicated in templating.cljs, see make-reference
[:nil-tag :nil-label])
(defn <bool> [bool]
[:bool-tag (str bool)])
(defn <keyword> [keyword]
[:keyword-tag (str keyword)])
(defn <symbol> [symbol]
[:symbol-tag (str symbol)])
(defn <number> [number]
(if (integer? number)
[:integer-tag number]
[:float-tag number]))
; -- string markup ----------------------------------------------------------------------------------------------------------
(defn <string> [string]
(let [dq (pref :dq)
re-nl (js/RegExp. "\n" "g")
nl-marker (pref :new-line-string-replacer)
inline-string (.replace string re-nl nl-marker)
max-inline-string-size (+ (pref :string-prefix-limit) (pref :string-postfix-limit))
quote-string (fn [s] (str dq s dq))
should-abbreviate? (> (count inline-string) max-inline-string-size)]
(if should-abbreviate?
(let [abbreviated-string (abbreviate-long-string inline-string
(pref :string-abbreviation-marker)
(pref :string-prefix-limit)
(pref :string-postfix-limit))
abbreviated-string-markup [:string-tag (quote-string abbreviated-string)]
string-with-nl-markers (.replace string re-nl (str nl-marker "\n"))
details-markup [:expanded-string-tag string-with-nl-markers]]
(<reference-surrogate> string abbreviated-string-markup details-markup))
[:string-tag (quote-string inline-string)])))
; -- generic preview markup -------------------------------------------------------------------------------------------------
(defn <preview> [value]
(print-via-writer value :header-tag (pref :max-print-level)))
; -- body-related templates -------------------------------------------------------------------------------------------------
(defn <body> [markup]
[:body-tag markup])
(defn <aligned-body> [markups-lists]
(let [prepend-li-tag (fn [line]
(if line
(concat [:aligned-li-tag] line)))
aligned-lines (keep prepend-li-tag markups-lists)]
(<body> (concat [:standard-ol-no-margin-tag] aligned-lines))))
(defn <standard-body> [markups-lists & [no-margin?]]
(let [ol-tag (if no-margin? :standard-ol-no-margin-tag :standard-ol-tag)
li-tag (if no-margin? :standard-li-no-margin-tag :standard-li-tag)
prepend-li-tag (fn [line]
(if line
(concat [li-tag] line)))
lines-markups (keep prepend-li-tag markups-lists)]
(concat [ol-tag] lines-markups)))
(defn <standard-body-reference> [o]
(<standard-body> [[(<reference> o)]]))
; -- generic details markup -------------------------------------------------------------------------------------------------
(defn <index> [value]
[:index-tag value :line-index-separator])
(defn- body-line [index value]
(let [index-markup (<index> index)
value-markup (print-via-writer value :item-tag (pref :body-line-max-print-level))]
[index-markup value-markup]))
; TODO: this fn is screaming for rewrite
(defn- prepare-body-lines [data starting-index]
(loop [work data
index starting-index
lines []]
(if (empty? work)
lines
(recur (rest work) (inc index) (conj lines (body-line index (first work)))))))
(defn- body-lines [value starting-index]
(let [seq (seq value)
max-number-body-items (pref :max-number-body-items)
chunk (take max-number-body-items seq)
rest (drop max-number-body-items seq)
lines (prepare-body-lines chunk starting-index)
continue? (not (empty? (take 1 rest)))]
(if-not continue?
lines
(let [more-label-markup [:body-items-more-tag :body-items-more-label]
start-index (+ starting-index max-number-body-items)
more-markup (<reference-surrogate> rest more-label-markup :target start-index)]
(conj lines [more-markup])))))
(defn <details> [value starting-index]
(let [has-continuation? (pos? starting-index)
body-markup (<standard-body> (body-lines value starting-index) has-continuation?)]
(if has-continuation?
body-markup
(<body> body-markup))))
; -- generic list template --------------------------------------------------------------------------------------------------
(defn <list-details> [items _opts]
(<aligned-body> (map list items)))
(defn <list> [items max-count & [opts]]
(let [items-markups (take max-count items)
more-count (- (count items) max-count)
more? (pos? more-count)
separator (or (:separator opts) :list-separator)
more-symbol (if more?
(if-let [more-symbol (:more-symbol opts)]
(if (fn? more-symbol)
(more-symbol more-count)
more-symbol)
(get-more-marker more-count)))
preview-markup (concat [(or (:tag opts) :list-tag)
(or (:open-symbol opts) :list-open-symbol)]
(interpose separator items-markups)
(if more? [separator more-symbol])
[(or (:close-symbol opts) :list-close-symbol)])]
(if more?
(let [details-markup (:details opts)
default-details-fn (partial <list-details> items opts)]
(<reference-surrogate> nil preview-markup (or details-markup default-details-fn)))
preview-markup)))
; -- mete-related markup ----------------------------------------------------------------------------------------------------
(defn <meta> [metadata]
(let [body [:meta-body-tag (<preview> metadata)]
header [:meta-header-tag "meta"]]
[:meta-reference-tag (<reference-surrogate> metadata header body)]))
(defn <meta-wrapper> [metadata & children]
(concat [:meta-wrapper-tag] children [(<meta> metadata)]))
; -- function markup --------------------------------------------------------------------------------------------------------
(defn <function-details> [fn-obj ns _name arities prefix]
{:pre [(fn? fn-obj)]}
(let [arities (map wrap-arity arities)
make-arity-markup-list (fn [arity]
[[:fn-multi-arity-args-indent-tag prefix]
[:fn-args-tag arity]])
arities-markupts-lists (if (> (count arities) 1) (map make-arity-markup-list arities))
ns-markups-list (if-not (empty? ns) [:ns-icon [:fn-ns-name-tag ns]])
native-markups-list [:native-icon (<native-reference> fn-obj)]]
(<aligned-body> (concat arities-markupts-lists [ns-markups-list native-markups-list]))))
(defn <arities> [arities]
(let [multi-arity? (> (count arities) 1)]
[:fn-args-tag (wrap-arity (if multi-arity?
(pref :multi-arity-symbol)
(first arities)))]))
(defn <function> [fn-obj]
{:pre [(fn? fn-obj)]}
(let [[ns name] (munging/parse-fn-info fn-obj)
lambda? (empty? name)
spacer-symbol (pref :spacer)
rest-symbol (pref :rest-symbol)
multi-arity-symbol (pref :multi-arity-symbol)
arities (munging/extract-arities fn-obj true spacer-symbol multi-arity-symbol rest-symbol)
arities-markup (<arities> arities)
name-markup (if-not lambda? [:fn-name-tag name])
icon-markup (if lambda? :lambda-icon :fn-icon)
prefix-markup [:fn-prefix-tag icon-markup name-markup]
preview-markup [:fn-header-tag prefix-markup arities-markup]
details-fn (partial <function-details> fn-obj ns name arities prefix-markup)]
(<reference-surrogate> fn-obj preview-markup details-fn)))
; -- type markup ------------------------------------------------------------------------------------------------------------
(defn <type-basis-item> [basis-item]
[:type-basis-item-tag (name basis-item)])
(defn <type-basis> [basis]
(let [item-markups (map <type-basis-item> basis)
children-markups (interpose :type-basis-item-separator item-markups)]
(concat [:type-basis-tag] children-markups)))
(defn <type-details> [constructor-fn ns _name basis]
(let [ns-markup (if-not (empty? ns) [:ns-icon [:fn-ns-name-tag ns]])
basis-markup (if (empty? basis)
[:empty-basis-symbol]
[:basis-icon (<type-basis> basis)])
native-markup [:native-icon (<native-reference> constructor-fn)]]
(<aligned-body> [basis-markup ns-markup native-markup])))
(defn <type> [constructor-fn & [header-tag]]
(let [[ns name basis] (munging/parse-constructor-info constructor-fn)
name-markup [:type-name-tag name]
preview-markup [(or header-tag :type-header-tag) :type-symbol name-markup]
details-markup-fn (partial <type-details> constructor-fn ns name basis)]
[:type-wrapper-tag
:type-header-background
[:type-ref-tag (<reference-surrogate> constructor-fn preview-markup details-markup-fn)]]))
(defn <standalone-type> [constructor-fn & [header-tag]]
[:standalone-type-tag (<type> constructor-fn header-tag)])
; -- protocols markup -------------------------------------------------------------------------------------------------------
(defn <protocol-method-arity> [arity-fn]
(<reference> arity-fn))
(defn <protocol-method-arities-details> [fns]
(<aligned-body> (map <protocol-method-arity> fns)))
(defn <protocol-method-arities> [fns & [max-fns]]
(let [max-fns (or max-fns (pref :max-protocol-method-arities-list))
more? (> (count fns) max-fns)
aritites-markups (map <protocol-method-arity> (take max-fns fns))
preview-markup (concat [:protocol-method-arities-header-tag :protocol-method-arities-header-open-symbol]
(interpose :protocol-method-arities-list-header-separator aritites-markups)
(if more? [:protocol-method-arities-more-symbol])
[:protocol-method-arities-header-close-symbol])]
(if more?
(let [details-markup-fn (partial <protocol-method-arities-details> fns)]
(<reference-surrogate> nil preview-markup details-markup-fn))
preview-markup)))
(defn <protocol-method> [name arities]
[:protocol-method-tag
:method-icon
[:protocol-method-name-tag name]
(<protocol-method-arities> arities)])
(defn <protocol-details> [obj ns _name selector _fast?]
(let [protocol-obj (munging/get-protocol-object selector)
ns-markups-list (if-not (empty? ns) [:ns-icon [:protocol-ns-name-tag ns]])
native-markups-list (if (some? protocol-obj) [:native-icon (<native-reference> protocol-obj)])
methods (munging/collect-protocol-methods obj selector)
methods-markups (map (fn [[name arities]] (<protocol-method> name arities)) methods)
methods-markups-lists (map list methods-markups)]
(<aligned-body> (concat methods-markups-lists [ns-markups-list native-markups-list]))))
(defn <protocol> [obj protocol & [tag]]
(let [{:keys [ns name selector fast?]} protocol
preview-markup [(or tag :protocol-name-tag) name]
prefix-markup [(if fast? :fast-protocol-tag :slow-protocol-tag) :protocol-background]]
(if (some? obj)
(let [details-markup-fn (partial <protocol-details> obj ns name selector fast?)]
(conj prefix-markup (<reference-surrogate> obj preview-markup details-markup-fn)))
(conj prefix-markup preview-markup))))
(defn <more-protocols> [more-count]
(let [fake-protocol {:name (get-more-marker more-count)}]
(<protocol> nil fake-protocol :protocol-more-tag)))
(defn <protocols-list> [obj protocols & [max-protocols]]
(let [max-protocols (or max-protocols (pref :max-list-protocols))
protocols-markups (map (partial <protocol> obj) protocols)]
(<list> protocols-markups max-protocols {:tag :protocols-header-tag
:open-symbol :protocols-list-open-symbol
:close-symbol :protocols-list-close-symbol
:separator :header-protocol-separator
:more-symbol <more-protocols>})))
; -- instance fields markup -------------------------------------------------------------------------------------------------
(defn <field> [name value]
[:header-field-tag
[:header-field-name-tag (str name)]
:header-field-value-spacer
[:header-field-value-tag (<reference> (<surrogate> value) #(set-managed-print-level % 1))]
:header-field-separator])
(defn <fields-details-row> [field]
(let [[name value] field]
[:body-field-tr-tag
[:body-field-td1-tag
:body-field-symbol
[:body-field-name-tag (str name)]]
[:body-field-td2-tag
:body-field-value-spacer]
[:body-field-td3-tag
[:body-field-value-tag (<reference-surrogate> value)]]]))
(defn <fields> [fields & [max-fields]]
(if (zero? (count fields))
[:fields-header-tag :fields-header-no-fields-symbol]
(let [max-fields (or max-fields (pref :max-instance-header-fields))
more? (> (count fields) max-fields)
fields-markups (map (fn [[name value]] (<field> name value)) (take max-fields fields))]
(concat [:fields-header-tag
:fields-header-open-symbol]
fields-markups
[(if more? :more-fields-symbol)
:fields-header-close-symbol]))))
(defn <fields-details> [fields obj]
(let [protocols (munging/scan-protocols obj)
has-protocols? (not (empty? protocols))
fields-markup (if-not (zero? (count fields))
[:fields-icon (concat [:instance-body-fields-table-tag] (map <fields-details-row> fields))])
protocols-list-markup (if has-protocols? [:protocols-icon (<protocols-list> obj protocols)])
native-markup [:native-icon (<native-reference> obj)]]
(<aligned-body> [fields-markup protocols-list-markup native-markup])))
; -- type/record instance markup --------------------------------------------------------------------------------------------
(defn <instance> [value]
(let [constructor-fn (get-constructor value)
[_ns _name basis] (munging/parse-constructor-info constructor-fn)
custom-printing? (implements? IPrintWithWriter value)
type-markup (<type> constructor-fn :instance-type-header-tag)
fields (fetch-fields-values value basis)
fields-markup (<fields> fields (if custom-printing? 0))
fields-details-markup-fn #(<fields-details> fields value)
fields-preview-markup [:instance-value-tag (<reference-surrogate> value fields-markup fields-details-markup-fn)]
custom-printing-markup (if custom-printing?
[:instance-custom-printing-wrapper-tag
:instance-custom-printing-background
(print-via-protocol value :instance-custom-printing-tag)])]
[:instance-header-tag
:instance-header-background
fields-preview-markup
custom-printing-markup
type-markup]))
; ---------------------------------------------------------------------------------------------------------------------------
(defn <header> [value]
(<cljs-land> (<preview> value)))
(defn <surrogate-header> [surrogate]
(or (get-surrogate-header surrogate)
(<preview> (get-surrogate-target surrogate))))
(defn <surrogate-target> [surrogate]
(let [target (get-surrogate-target surrogate)]
(if (seqable? target)
(let [starting-index (get-surrogate-start-index surrogate)]
(<details> target starting-index))
(<standard-body-reference> target))))
(defn <surrogate-body> [surrogate]
(if-let [body (get-surrogate-body surrogate)]
(if (= :target body)
(<surrogate-target> surrogate)
body)))
; ---------------------------------------------------------------------------------------------------------------------------
(defn <atomic> [value]
(cond
(should-render? :render-nils value nil?) (<nil>)
(should-render? :render-bools value bool?) (<bool> value)
(should-render? :render-strings value string?) (<string> value)
(should-render? :render-numbers value number?) (<number> value)
(should-render? :render-keywords value keyword?) (<keyword> value)
(should-render? :render-symbols value symbol?) (<symbol> value)
(should-render? :render-instances value should-render-instance?) (<instance> value)
(should-render? :render-types value cljs-type?) (<standalone-type> value)
(should-render? :render-functions value cljs-function?) (<function> value)))
; ---------------------------------------------------------------------------------------------------------------------------
(def ^:dynamic *markup-db*)
; emit-markup-db macro will generate a map of all markup <functions> in this namespace:
;
; {:atomic <atomic>
; :reference <reference>
; :native-reference <native-reference>
; ...}
;
; we generate it only on first call and cache it in *markup-db*
; emitting markup db statically into def would prevent dead-code elimination
;
(defn get-markup-db []
(if (nil? *markup-db*)
(set! *markup-db* (emit-markup-db)))
*markup-db*)

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,145 @@
(ns devtools.formatters.printing
(:require-macros [devtools.util :refer [oget oset ocall oapply safe-call]])
(:require [devtools.prefs :refer [pref]]
[devtools.format :refer [IDevtoolsFormat]]
[devtools.protocols :refer [ITemplate IGroup ISurrogate IFormat]]
[devtools.formatters.state :refer [push-object-to-current-history! *current-state* get-current-state
is-circular? get-managed-print-level set-managed-print-level
update-current-state!]]
[devtools.formatters.helpers :refer [cljs-value? expandable? abbreviated? directly-printable? should-render?]]))
; -- helpers ----------------------------------------------------------------------------------------------------------------
(defn markup? [value]
(::markup (meta value)))
(defn mark-as-markup [value]
(with-meta value {::markup true}))
(defn build-markup [markup-db fn-key & args]
(let [f (get markup-db fn-key)]
(assert f (str "missing markup method in markup-db: " fn-key))
(mark-as-markup (apply f args))))
(defn wrap-value-as-reference-if-needed [markup-db value]
(if (or (directly-printable? value) (markup? value))
value
(build-markup markup-db :reference-surrogate value)))
; -- TemplateWriter ---------------------------------------------------------------------------------------------------------
(deftype TemplateWriter [^:mutable group markup-db]
Object
(merge [_ a] (set! group (concat group a)))
(get-group [_] group)
IWriter
(-write [_ o] (set! group (concat group [(wrap-value-as-reference-if-needed markup-db o)]))) ; issue #21
(-flush [_] nil))
(defn make-template-writer [markup-db]
(TemplateWriter. [] markup-db))
; -- post-processing --------------------------------------------------------------------------------------------------------
(defn already-reference? [group]
(if-let [tag (first (first group))]
(= tag "reference")))
(defn wrap-group-in-reference-if-needed [group obj markup-db]
(if (and (not (already-reference? group))
(or (expandable? obj) (abbreviated? group)))
(let [expandable-markup (apply build-markup markup-db :expandable group)
surrogate-markup (build-markup markup-db :raw-surrogate obj expandable-markup :target)
reference-markup (build-markup markup-db :reference surrogate-markup)]
[reference-markup])
group))
(defn wrap-group-in-circular-warning-if-needed [group markup-db circular?]
(if circular?
[(apply build-markup markup-db :circular-reference group)]
group))
(defn wrap-group-in-meta-if-needed [group value markup-db]
(if (should-render? :render-metas value #(some? (meta %)))
[(apply (partial (:meta-wrapper markup-db) (meta value)) group)]
group))
; default printer implementation can do this:
; :else (write-all writer "#<" (str obj) ">")
; we want to wrap stringified obj in a reference for further inspection
;
; this behaviour changed in https://github.com/clojure/clojurescript/commit/34c3b8985ed8197d90f441c46d168c4024a20eb8
; newly functions and :else branch print "#object [" ... "]"
;
; in some situations obj can still be a clojurescript value (e.g. deftypes)
; we have to implement a special flag to prevent infinite recursion
; see https://github.com/binaryage/cljs-devtools/issues/2
; https://github.com/binaryage/cljs-devtools/issues/8
(defn detect-edge-case-and-patch-it [group obj markup-db]
(cond
(or
(and (= (count group) 5) (= (nth group 0) "#object[") (= (nth group 4) "\"]")) ; function case
(and (= (count group) 5) (= (nth group 0) "#object[") (= (nth group 4) "]")) ; :else -constructor case
(and (= (count group) 3) (= (nth group 0) "#object[") (= (nth group 2) "]"))) ; :else -cljs$lang$ctorStr case
[(build-markup markup-db :native-reference obj)]
(and (= (count group) 3) (= (nth group 0) "#<") (= (str obj) (nth group 1)) (= (nth group 2) ">")) ; old code prior r1.7.28
[(nth group 0) (build-markup :native-reference obj) (nth group 2)]
:else group))
(defn post-process-printed-output [output-group obj markup-db circular?]
(-> output-group
(detect-edge-case-and-patch-it obj markup-db) ; an ugly hack
(wrap-group-in-reference-if-needed obj markup-db)
(wrap-group-in-circular-warning-if-needed markup-db circular?)
(wrap-group-in-meta-if-needed obj markup-db)))
; -- alternative printer ----------------------------------------------------------------------------------------------------
(defn alt-printer-job [obj writer opts]
(let [{:keys [markup-db]} opts]
(if (or (safe-call satisfies? false IDevtoolsFormat obj)
(safe-call satisfies? false IFormat obj)) ; we have to wrap value in reference if detected IFormat
(-write writer (build-markup markup-db :reference obj))
(if-let [atomic-markup (build-markup markup-db :atomic obj)]
(-write writer atomic-markup)
(let [default-impl (:fallback-impl opts)
; we want to limit print-level, at max-print-level level use maximal abbreviation e.g. [...] or {...}
inner-opts (if (= *print-level* 1) (assoc opts :print-length 0) opts)]
(default-impl obj writer inner-opts))))))
(defn alt-printer-impl [obj writer opts]
(binding [*current-state* (get-current-state)]
(let [{:keys [markup-db]} opts
circular? (is-circular? obj)
inner-writer (make-template-writer (:markup-db opts))]
(push-object-to-current-history! obj)
(alt-printer-job obj inner-writer opts)
(.merge writer (post-process-printed-output (.get-group inner-writer) obj markup-db circular?)))))
; -- common code for managed printing ---------------------------------------------------------------------------------------
(defn managed-print [tag markup-db printer]
(let [writer (make-template-writer markup-db)
opts {:alt-impl alt-printer-impl
:markup-db markup-db
:print-length (pref :max-header-elements)
:more-marker (pref :more-marker)}
job-fn #(printer writer opts)]
(if-let [managed-print-level (get-managed-print-level)]
(binding [*print-level* managed-print-level]
(update-current-state! #(set-managed-print-level % nil)) ; reset managed-print-level so it does not propagate further down in expaded data
(job-fn))
(job-fn))
(concat [(pref tag)] (.get-group writer))))
; -- public printing API ----------------------------------------------------------------------------------------------------
(defn managed-print-via-writer [value tag markup-db]
(managed-print tag markup-db (fn [writer opts]
(pr-seq-writer [value] writer opts)))) ; note we use pr-seq-writer becasue pr-writer is private for some reason
(defn managed-print-via-protocol [value tag markup-db]
(managed-print tag markup-db (fn [writer opts]
(-pr-writer value writer opts))))

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,292 @@
// Compiled by ClojureScript 1.9.229 {}
goog.provide('devtools.formatters.printing');
goog.require('cljs.core');
goog.require('devtools.prefs');
goog.require('devtools.format');
goog.require('devtools.protocols');
goog.require('devtools.formatters.state');
goog.require('devtools.formatters.helpers');
devtools.formatters.printing.markup_QMARK_ = (function devtools$formatters$printing$markup_QMARK_(value){
return new cljs.core.Keyword("devtools.formatters.printing","markup","devtools.formatters.printing/markup",-1990109186).cljs$core$IFn$_invoke$arity$1(cljs.core.meta.call(null,value));
});
devtools.formatters.printing.mark_as_markup = (function devtools$formatters$printing$mark_as_markup(value){
return cljs.core.with_meta.call(null,value,new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword("devtools.formatters.printing","markup","devtools.formatters.printing/markup",-1990109186),true], null));
});
devtools.formatters.printing.build_markup = (function devtools$formatters$printing$build_markup(var_args){
var args__26212__auto__ = [];
var len__26205__auto___41404 = arguments.length;
var i__26206__auto___41405 = (0);
while(true){
if((i__26206__auto___41405 < len__26205__auto___41404)){
args__26212__auto__.push((arguments[i__26206__auto___41405]));
var G__41406 = (i__26206__auto___41405 + (1));
i__26206__auto___41405 = G__41406;
continue;
} else {
}
break;
}
var argseq__26213__auto__ = ((((2) < args__26212__auto__.length))?(new cljs.core.IndexedSeq(args__26212__auto__.slice((2)),(0),null)):null);
return devtools.formatters.printing.build_markup.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__26213__auto__);
});
devtools.formatters.printing.build_markup.cljs$core$IFn$_invoke$arity$variadic = (function (markup_db,fn_key,args){
var f = cljs.core.get.call(null,markup_db,fn_key);
if(cljs.core.truth_(f)){
} else {
throw (new Error([cljs.core.str("Assert failed: "),cljs.core.str([cljs.core.str("missing markup method in markup-db: "),cljs.core.str(fn_key)].join('')),cljs.core.str("\n"),cljs.core.str("f")].join('')));
}
return devtools.formatters.printing.mark_as_markup.call(null,cljs.core.apply.call(null,f,args));
});
devtools.formatters.printing.build_markup.cljs$lang$maxFixedArity = (2);
devtools.formatters.printing.build_markup.cljs$lang$applyTo = (function (seq41401){
var G__41402 = cljs.core.first.call(null,seq41401);
var seq41401__$1 = cljs.core.next.call(null,seq41401);
var G__41403 = cljs.core.first.call(null,seq41401__$1);
var seq41401__$2 = cljs.core.next.call(null,seq41401__$1);
return devtools.formatters.printing.build_markup.cljs$core$IFn$_invoke$arity$variadic(G__41402,G__41403,seq41401__$2);
});
devtools.formatters.printing.wrap_value_as_reference_if_needed = (function devtools$formatters$printing$wrap_value_as_reference_if_needed(markup_db,value){
if(cljs.core.truth_((function (){var or__25130__auto__ = devtools.formatters.helpers.directly_printable_QMARK_.call(null,value);
if(cljs.core.truth_(or__25130__auto__)){
return or__25130__auto__;
} else {
return devtools.formatters.printing.markup_QMARK_.call(null,value);
}
})())){
return value;
} else {
return devtools.formatters.printing.build_markup.call(null,markup_db,new cljs.core.Keyword(null,"reference-surrogate","reference-surrogate",274031791),value);
}
});
/**
* @constructor
* @implements {cljs.core.IWriter}
* @implements {devtools.formatters.printing.Object}
*/
devtools.formatters.printing.TemplateWriter = (function (group,markup_db){
this.group = group;
this.markup_db = markup_db;
this.cljs$lang$protocol_mask$partition0$ = 1073741824;
this.cljs$lang$protocol_mask$partition1$ = 0;
})
devtools.formatters.printing.TemplateWriter.prototype.merge = (function (a){
var self__ = this;
var _ = this;
return self__.group = cljs.core.concat.call(null,self__.group,a);
});
devtools.formatters.printing.TemplateWriter.prototype.get_group = (function (){
var self__ = this;
var _ = this;
return self__.group;
});
devtools.formatters.printing.TemplateWriter.prototype.cljs$core$IWriter$_write$arity$2 = (function (_,o){
var self__ = this;
var ___$1 = this;
return self__.group = cljs.core.concat.call(null,self__.group,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [devtools.formatters.printing.wrap_value_as_reference_if_needed.call(null,self__.markup_db,o)], null));
});
devtools.formatters.printing.TemplateWriter.prototype.cljs$core$IWriter$_flush$arity$1 = (function (_){
var self__ = this;
var ___$1 = this;
return null;
});
devtools.formatters.printing.TemplateWriter.getBasis = (function (){
return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"group","group",-2071839637,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),new cljs.core.Symbol(null,"markup-db","markup-db",-1841597035,null)], null);
});
devtools.formatters.printing.TemplateWriter.cljs$lang$type = true;
devtools.formatters.printing.TemplateWriter.cljs$lang$ctorStr = "devtools.formatters.printing/TemplateWriter";
devtools.formatters.printing.TemplateWriter.cljs$lang$ctorPrWriter = (function (this__25736__auto__,writer__25737__auto__,opt__25738__auto__){
return cljs.core._write.call(null,writer__25737__auto__,"devtools.formatters.printing/TemplateWriter");
});
devtools.formatters.printing.__GT_TemplateWriter = (function devtools$formatters$printing$__GT_TemplateWriter(group,markup_db){
return (new devtools.formatters.printing.TemplateWriter(group,markup_db));
});
devtools.formatters.printing.make_template_writer = (function devtools$formatters$printing$make_template_writer(markup_db){
return (new devtools.formatters.printing.TemplateWriter(cljs.core.PersistentVector.EMPTY,markup_db));
});
devtools.formatters.printing.already_reference_QMARK_ = (function devtools$formatters$printing$already_reference_QMARK_(group){
var temp__4655__auto__ = cljs.core.first.call(null,cljs.core.first.call(null,group));
if(cljs.core.truth_(temp__4655__auto__)){
var tag = temp__4655__auto__;
return cljs.core._EQ_.call(null,tag,"reference");
} else {
return null;
}
});
devtools.formatters.printing.wrap_group_in_reference_if_needed = (function devtools$formatters$printing$wrap_group_in_reference_if_needed(group,obj,markup_db){
if(cljs.core.truth_((function (){var and__25118__auto__ = cljs.core.not.call(null,devtools.formatters.printing.already_reference_QMARK_.call(null,group));
if(and__25118__auto__){
var or__25130__auto__ = devtools.formatters.helpers.expandable_QMARK_.call(null,obj);
if(cljs.core.truth_(or__25130__auto__)){
return or__25130__auto__;
} else {
return devtools.formatters.helpers.abbreviated_QMARK_.call(null,group);
}
} else {
return and__25118__auto__;
}
})())){
var expandable_markup = cljs.core.apply.call(null,devtools.formatters.printing.build_markup,markup_db,new cljs.core.Keyword(null,"expandable","expandable",-704609097),group);
var surrogate_markup = devtools.formatters.printing.build_markup.call(null,markup_db,new cljs.core.Keyword(null,"raw-surrogate","raw-surrogate",904931181),obj,expandable_markup,new cljs.core.Keyword(null,"target","target",253001721));
var reference_markup = devtools.formatters.printing.build_markup.call(null,markup_db,new cljs.core.Keyword(null,"reference","reference",-1711695023),surrogate_markup);
return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [reference_markup], null);
} else {
return group;
}
});
devtools.formatters.printing.wrap_group_in_circular_warning_if_needed = (function devtools$formatters$printing$wrap_group_in_circular_warning_if_needed(group,markup_db,circular_QMARK_){
if(cljs.core.truth_(circular_QMARK_)){
return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.apply.call(null,devtools.formatters.printing.build_markup,markup_db,new cljs.core.Keyword(null,"circular-reference","circular-reference",970308727),group)], null);
} else {
return group;
}
});
devtools.formatters.printing.wrap_group_in_meta_if_needed = (function devtools$formatters$printing$wrap_group_in_meta_if_needed(group,value,markup_db){
if(cljs.core.truth_(devtools.formatters.helpers.should_render_QMARK_.call(null,new cljs.core.Keyword(null,"render-metas","render-metas",1141294116),value,(function (p1__41407_SHARP_){
return cljs.core.some_QMARK_.call(null,cljs.core.meta.call(null,p1__41407_SHARP_));
})))){
return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.apply.call(null,cljs.core.partial.call(null,new cljs.core.Keyword(null,"meta-wrapper","meta-wrapper",-1989845587).cljs$core$IFn$_invoke$arity$1(markup_db),cljs.core.meta.call(null,value)),group)], null);
} else {
return group;
}
});
devtools.formatters.printing.detect_edge_case_and_patch_it = (function devtools$formatters$printing$detect_edge_case_and_patch_it(group,obj,markup_db){
if(((cljs.core._EQ_.call(null,cljs.core.count.call(null,group),(5))) && (cljs.core._EQ_.call(null,cljs.core.nth.call(null,group,(0)),"#object[")) && (cljs.core._EQ_.call(null,cljs.core.nth.call(null,group,(4)),"\"]"))) || ((cljs.core._EQ_.call(null,cljs.core.count.call(null,group),(5))) && (cljs.core._EQ_.call(null,cljs.core.nth.call(null,group,(0)),"#object[")) && (cljs.core._EQ_.call(null,cljs.core.nth.call(null,group,(4)),"]"))) || ((cljs.core._EQ_.call(null,cljs.core.count.call(null,group),(3))) && (cljs.core._EQ_.call(null,cljs.core.nth.call(null,group,(0)),"#object[")) && (cljs.core._EQ_.call(null,cljs.core.nth.call(null,group,(2)),"]")))){
return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [devtools.formatters.printing.build_markup.call(null,markup_db,new cljs.core.Keyword(null,"native-reference","native-reference",-2013708658),obj)], null);
} else {
if((cljs.core._EQ_.call(null,cljs.core.count.call(null,group),(3))) && (cljs.core._EQ_.call(null,cljs.core.nth.call(null,group,(0)),"#<")) && (cljs.core._EQ_.call(null,[cljs.core.str(obj)].join(''),cljs.core.nth.call(null,group,(1)))) && (cljs.core._EQ_.call(null,cljs.core.nth.call(null,group,(2)),">"))){
return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.nth.call(null,group,(0)),devtools.formatters.printing.build_markup.call(null,new cljs.core.Keyword(null,"native-reference","native-reference",-2013708658),obj),cljs.core.nth.call(null,group,(2))], null);
} else {
return group;
}
}
});
devtools.formatters.printing.post_process_printed_output = (function devtools$formatters$printing$post_process_printed_output(output_group,obj,markup_db,circular_QMARK_){
return devtools.formatters.printing.wrap_group_in_meta_if_needed.call(null,devtools.formatters.printing.wrap_group_in_circular_warning_if_needed.call(null,devtools.formatters.printing.wrap_group_in_reference_if_needed.call(null,devtools.formatters.printing.detect_edge_case_and_patch_it.call(null,output_group,obj,markup_db),obj,markup_db),markup_db,circular_QMARK_),obj,markup_db);
});
devtools.formatters.printing.alt_printer_job = (function devtools$formatters$printing$alt_printer_job(obj,writer,opts){
var map__41416 = opts;
var map__41416__$1 = ((((!((map__41416 == null)))?((((map__41416.cljs$lang$protocol_mask$partition0$ & (64))) || (map__41416.cljs$core$ISeq$))?true:false):false))?cljs.core.apply.call(null,cljs.core.hash_map,map__41416):map__41416);
var markup_db = cljs.core.get.call(null,map__41416__$1,new cljs.core.Keyword(null,"markup-db","markup-db",812838734));
if(cljs.core.truth_((function (){var or__25130__auto__ = (function (){try{if(!((obj == null))){
if((false) || (obj.devtools$format$IDevtoolsFormat$)){
return true;
} else {
if((!obj.cljs$lang$protocol_mask$partition$)){
return cljs.core.native_satisfies_QMARK_.call(null,devtools.format.IDevtoolsFormat,obj);
} else {
return false;
}
}
} else {
return cljs.core.native_satisfies_QMARK_.call(null,devtools.format.IDevtoolsFormat,obj);
}
}catch (e41420){var e__41074__auto__ = e41420;
return false;
}})();
if(cljs.core.truth_(or__25130__auto__)){
return or__25130__auto__;
} else {
try{if(!((obj == null))){
if((false) || (obj.devtools$protocols$IFormat$)){
return true;
} else {
if((!obj.cljs$lang$protocol_mask$partition$)){
return cljs.core.native_satisfies_QMARK_.call(null,devtools.protocols.IFormat,obj);
} else {
return false;
}
}
} else {
return cljs.core.native_satisfies_QMARK_.call(null,devtools.protocols.IFormat,obj);
}
}catch (e41422){var e__41074__auto__ = e41422;
return false;
}}
})())){
return cljs.core._write.call(null,writer,devtools.formatters.printing.build_markup.call(null,markup_db,new cljs.core.Keyword(null,"reference","reference",-1711695023),obj));
} else {
var temp__4655__auto__ = devtools.formatters.printing.build_markup.call(null,markup_db,new cljs.core.Keyword(null,"atomic","atomic",-120459460),obj);
if(cljs.core.truth_(temp__4655__auto__)){
var atomic_markup = temp__4655__auto__;
return cljs.core._write.call(null,writer,atomic_markup);
} else {
var default_impl = new cljs.core.Keyword(null,"fallback-impl","fallback-impl",-1501286995).cljs$core$IFn$_invoke$arity$1(opts);
var inner_opts = ((cljs.core._EQ_.call(null,cljs.core._STAR_print_level_STAR_,(1)))?cljs.core.assoc.call(null,opts,new cljs.core.Keyword(null,"print-length","print-length",1931866356),(0)):opts);
return default_impl.call(null,obj,writer,inner_opts);
}
}
});
devtools.formatters.printing.alt_printer_impl = (function devtools$formatters$printing$alt_printer_impl(obj,writer,opts){
var _STAR_current_state_STAR_41427 = devtools.formatters.state._STAR_current_state_STAR_;
devtools.formatters.state._STAR_current_state_STAR_ = devtools.formatters.state.get_current_state.call(null);
try{var map__41428 = opts;
var map__41428__$1 = ((((!((map__41428 == null)))?((((map__41428.cljs$lang$protocol_mask$partition0$ & (64))) || (map__41428.cljs$core$ISeq$))?true:false):false))?cljs.core.apply.call(null,cljs.core.hash_map,map__41428):map__41428);
var markup_db = cljs.core.get.call(null,map__41428__$1,new cljs.core.Keyword(null,"markup-db","markup-db",812838734));
var circular_QMARK_ = devtools.formatters.state.is_circular_QMARK_.call(null,obj);
var inner_writer = devtools.formatters.printing.make_template_writer.call(null,new cljs.core.Keyword(null,"markup-db","markup-db",812838734).cljs$core$IFn$_invoke$arity$1(opts));
devtools.formatters.state.push_object_to_current_history_BANG_.call(null,obj);
devtools.formatters.printing.alt_printer_job.call(null,obj,inner_writer,opts);
return writer.merge(devtools.formatters.printing.post_process_printed_output.call(null,inner_writer.get_group(),obj,markup_db,circular_QMARK_));
}finally {devtools.formatters.state._STAR_current_state_STAR_ = _STAR_current_state_STAR_41427;
}});
devtools.formatters.printing.managed_print = (function devtools$formatters$printing$managed_print(tag,markup_db,printer){
var writer = devtools.formatters.printing.make_template_writer.call(null,markup_db);
var opts = new cljs.core.PersistentArrayMap(null, 4, [new cljs.core.Keyword(null,"alt-impl","alt-impl",670969595),devtools.formatters.printing.alt_printer_impl,new cljs.core.Keyword(null,"markup-db","markup-db",812838734),markup_db,new cljs.core.Keyword(null,"print-length","print-length",1931866356),devtools.prefs.pref.call(null,new cljs.core.Keyword(null,"max-header-elements","max-header-elements",713629864)),new cljs.core.Keyword(null,"more-marker","more-marker",-14717935),devtools.prefs.pref.call(null,new cljs.core.Keyword(null,"more-marker","more-marker",-14717935))], null);
var job_fn = ((function (writer,opts){
return (function (){
return printer.call(null,writer,opts);
});})(writer,opts))
;
var temp__4655__auto___41433 = devtools.formatters.state.get_managed_print_level.call(null);
if(cljs.core.truth_(temp__4655__auto___41433)){
var managed_print_level_41434 = temp__4655__auto___41433;
var _STAR_print_level_STAR_41432_41435 = cljs.core._STAR_print_level_STAR_;
cljs.core._STAR_print_level_STAR_ = managed_print_level_41434;
try{devtools.formatters.state.update_current_state_BANG_.call(null,((function (_STAR_print_level_STAR_41432_41435,managed_print_level_41434,temp__4655__auto___41433,writer,opts,job_fn){
return (function (p1__41430_SHARP_){
return devtools.formatters.state.set_managed_print_level.call(null,p1__41430_SHARP_,null);
});})(_STAR_print_level_STAR_41432_41435,managed_print_level_41434,temp__4655__auto___41433,writer,opts,job_fn))
);
job_fn.call(null);
}finally {cljs.core._STAR_print_level_STAR_ = _STAR_print_level_STAR_41432_41435;
}} else {
job_fn.call(null);
}
return cljs.core.concat.call(null,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [devtools.prefs.pref.call(null,tag)], null),writer.get_group());
});
devtools.formatters.printing.managed_print_via_writer = (function devtools$formatters$printing$managed_print_via_writer(value,tag,markup_db){
return devtools.formatters.printing.managed_print.call(null,tag,markup_db,(function (writer,opts){
return cljs.core.pr_seq_writer.call(null,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [value], null),writer,opts);
}));
});
devtools.formatters.printing.managed_print_via_protocol = (function devtools$formatters$printing$managed_print_via_protocol(value,tag,markup_db){
return devtools.formatters.printing.managed_print.call(null,tag,markup_db,(function (writer,opts){
return cljs.core._pr_writer.call(null,value,writer,opts);
}));
});
//# sourceMappingURL=printing.js.map?rel=1603199212398

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,73 @@
(ns devtools.formatters.state)
; - state management --------------------------------------------------------------------------------------------------------
;
; we have to maintain some state:
; a) to prevent infinite recursion in some pathological cases (https://github.com/binaryage/cljs-devtools/issues/2)
; b) to keep track of printed objects to visually signal circular data structures
;
; We dynamically bind *current-config* to the config passed from "outside" when entering calls to our API methods.
; Initially the state is empty, but we accumulate there a history of seen values when rendering individual values
; in depth-first traversal order. See alt-printer-impl where we re-bind *current-config* for each traversal level.
; But there is a catch. For larger data structures our printing methods usually do not print everything at once.
; We can include so called "object references" which are just placeholders which can be expanded later
; by DevTools UI (when user clicks a disclosure triangle).
; For proper continuation in rendering of those references we have to carry our existing state over.
; We use "config" feature of custom formatters system to pass current state to future API calls.
(def ^:dynamic *current-state* nil)
(defn valid-current-state? []
(some? *current-state*))
(defn get-default-state []
{})
(defn get-current-state []
{:pre [(valid-current-state?)]}
*current-state*)
(defn update-current-state! [f & args]
{:pre [(valid-current-state?)]}
(set! *current-state* (apply f *current-state* args)))
; -- high level API ---------------------------------------------------------------------------------------------------------
(defn push-object-to-current-history! [object]
(update-current-state! update :history conj object))
(defn get-current-history []
(:history (get-current-state)))
(defn is-circular? [object]
(let [history (get-current-history)]
(some #(identical? % object) history)))
(defn ^bool prevent-recursion? []
(boolean (:prevent-recursion (get-current-state))))
(defn set-prevent-recursion [state val]
(if (some? val)
(assoc state :prevent-recursion val)
(dissoc state :prevent-recursion)))
(defn get-managed-print-level []
(:managed-print-level (get-current-state)))
(defn set-managed-print-level [state val]
(if (some? val)
(assoc state :managed-print-level val)
(dissoc state :managed-print-level)))
(defn get-depth-budget []
(:depth-budget (get-current-state)))
(defn set-depth-budget [state val]
(if (some? val)
(assoc state :depth-budget val)
(dissoc state :depth-budget)))
(defn reset-depth-limits [state]
(-> state
(set-depth-budget nil)
(set-managed-print-level nil)))

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,104 @@
// Compiled by ClojureScript 1.9.229 {}
goog.provide('devtools.formatters.state');
goog.require('cljs.core');
devtools.formatters.state._STAR_current_state_STAR_ = null;
devtools.formatters.state.valid_current_state_QMARK_ = (function devtools$formatters$state$valid_current_state_QMARK_(){
return cljs.core.some_QMARK_.call(null,devtools.formatters.state._STAR_current_state_STAR_);
});
devtools.formatters.state.get_default_state = (function devtools$formatters$state$get_default_state(){
return cljs.core.PersistentArrayMap.EMPTY;
});
devtools.formatters.state.get_current_state = (function devtools$formatters$state$get_current_state(){
if(cljs.core.truth_(devtools.formatters.state.valid_current_state_QMARK_.call(null))){
} else {
throw (new Error("Assert failed: (valid-current-state?)"));
}
return devtools.formatters.state._STAR_current_state_STAR_;
});
devtools.formatters.state.update_current_state_BANG_ = (function devtools$formatters$state$update_current_state_BANG_(var_args){
var args__26212__auto__ = [];
var len__26205__auto___41395 = arguments.length;
var i__26206__auto___41396 = (0);
while(true){
if((i__26206__auto___41396 < len__26205__auto___41395)){
args__26212__auto__.push((arguments[i__26206__auto___41396]));
var G__41397 = (i__26206__auto___41396 + (1));
i__26206__auto___41396 = G__41397;
continue;
} else {
}
break;
}
var argseq__26213__auto__ = ((((1) < args__26212__auto__.length))?(new cljs.core.IndexedSeq(args__26212__auto__.slice((1)),(0),null)):null);
return devtools.formatters.state.update_current_state_BANG_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__26213__auto__);
});
devtools.formatters.state.update_current_state_BANG_.cljs$core$IFn$_invoke$arity$variadic = (function (f,args){
if(cljs.core.truth_(devtools.formatters.state.valid_current_state_QMARK_.call(null))){
} else {
throw (new Error("Assert failed: (valid-current-state?)"));
}
return devtools.formatters.state._STAR_current_state_STAR_ = cljs.core.apply.call(null,f,devtools.formatters.state._STAR_current_state_STAR_,args);
});
devtools.formatters.state.update_current_state_BANG_.cljs$lang$maxFixedArity = (1);
devtools.formatters.state.update_current_state_BANG_.cljs$lang$applyTo = (function (seq41393){
var G__41394 = cljs.core.first.call(null,seq41393);
var seq41393__$1 = cljs.core.next.call(null,seq41393);
return devtools.formatters.state.update_current_state_BANG_.cljs$core$IFn$_invoke$arity$variadic(G__41394,seq41393__$1);
});
devtools.formatters.state.push_object_to_current_history_BANG_ = (function devtools$formatters$state$push_object_to_current_history_BANG_(object){
return devtools.formatters.state.update_current_state_BANG_.call(null,cljs.core.update,new cljs.core.Keyword(null,"history","history",-247395220),cljs.core.conj,object);
});
devtools.formatters.state.get_current_history = (function devtools$formatters$state$get_current_history(){
return new cljs.core.Keyword(null,"history","history",-247395220).cljs$core$IFn$_invoke$arity$1(devtools.formatters.state.get_current_state.call(null));
});
devtools.formatters.state.is_circular_QMARK_ = (function devtools$formatters$state$is_circular_QMARK_(object){
var history = devtools.formatters.state.get_current_history.call(null);
return cljs.core.some.call(null,((function (history){
return (function (p1__41398_SHARP_){
return (p1__41398_SHARP_ === object);
});})(history))
,history);
});
devtools.formatters.state.prevent_recursion_QMARK_ = (function devtools$formatters$state$prevent_recursion_QMARK_(){
return cljs.core.boolean$.call(null,new cljs.core.Keyword(null,"prevent-recursion","prevent-recursion",-1498371606).cljs$core$IFn$_invoke$arity$1(devtools.formatters.state.get_current_state.call(null)));
});
devtools.formatters.state.set_prevent_recursion = (function devtools$formatters$state$set_prevent_recursion(state,val){
if(cljs.core.some_QMARK_.call(null,val)){
return cljs.core.assoc.call(null,state,new cljs.core.Keyword(null,"prevent-recursion","prevent-recursion",-1498371606),val);
} else {
return cljs.core.dissoc.call(null,state,new cljs.core.Keyword(null,"prevent-recursion","prevent-recursion",-1498371606));
}
});
devtools.formatters.state.get_managed_print_level = (function devtools$formatters$state$get_managed_print_level(){
return new cljs.core.Keyword(null,"managed-print-level","managed-print-level",-844058473).cljs$core$IFn$_invoke$arity$1(devtools.formatters.state.get_current_state.call(null));
});
devtools.formatters.state.set_managed_print_level = (function devtools$formatters$state$set_managed_print_level(state,val){
if(cljs.core.some_QMARK_.call(null,val)){
return cljs.core.assoc.call(null,state,new cljs.core.Keyword(null,"managed-print-level","managed-print-level",-844058473),val);
} else {
return cljs.core.dissoc.call(null,state,new cljs.core.Keyword(null,"managed-print-level","managed-print-level",-844058473));
}
});
devtools.formatters.state.get_depth_budget = (function devtools$formatters$state$get_depth_budget(){
return new cljs.core.Keyword(null,"depth-budget","depth-budget",-335905888).cljs$core$IFn$_invoke$arity$1(devtools.formatters.state.get_current_state.call(null));
});
devtools.formatters.state.set_depth_budget = (function devtools$formatters$state$set_depth_budget(state,val){
if(cljs.core.some_QMARK_.call(null,val)){
return cljs.core.assoc.call(null,state,new cljs.core.Keyword(null,"depth-budget","depth-budget",-335905888),val);
} else {
return cljs.core.dissoc.call(null,state,new cljs.core.Keyword(null,"depth-budget","depth-budget",-335905888));
}
});
devtools.formatters.state.reset_depth_limits = (function devtools$formatters$state$reset_depth_limits(state){
return devtools.formatters.state.set_managed_print_level.call(null,devtools.formatters.state.set_depth_budget.call(null,state,null),null);
});
//# sourceMappingURL=state.js.map?rel=1603199212244

View file

@ -0,0 +1 @@
{"version":3,"file":"\/Users\/simon\/workspace\/swinging-needle-meter\/docs\/js\/compiled\/out\/devtools\/formatters\/state.js","sources":["state.cljs?rel=1603199212244"],"lineCount":104,"mappings":";AAAA;;AAiBA,sDAAA,tDAAeA;AAEf,uDAAA,vDAAMC;AAAN,AACE,OAACC,gCAAMF;;AAET,8CAAA,9CAAMG;AAAN,AAAA;;AAGA,8CAAA,9CAAME;AAAN,AAAA,oBACS,AAACJ;AADV;AAAA,AAAA,MAAA,KAAAG,MAAA;;;AAEEJ;;AAEF,AAAA,uDAAA,+DAAAM,tHAAMM;AAAN,AAAA,IAAAL,sBAAA;AAAA,AAAA,IAAAC,2BAAA,AAAA;AAAA,AAAA,IAAAC,yBAAA;;AAAA,AAAA,GAAA,CAAAA,yBAAAD;AAAA,AAAA,AAAAD,yBAAA,CAAA,UAAAE;;AAAA,eAAA,CAAAA,yBAAA;;;;AAAA;;;;AAAA,IAAAC,wBAAA,EAAA,CAAA,MAAA,AAAAH,6BAAA,AAAA,KAAAI,qBAAA,AAAAJ,0BAAA,KAAA,IAAA,OAAA;AAAA,AAAA,OAAAK,0FAAA,CAAA,UAAA,MAAAF;;;AAAA,AAAA,AAAA,AAAAE,4FAAA,WAA6BK,EAAIC;AAAjC,AAAA,oBACS,AAACjB;AADV;AAAA,AAAA,MAAA,KAAAG,MAAA;;;AAEE,OAAMJ,sDAAgB,AAACmB,0BAAMF,EAAEjB,oDAAgBkB;;;AAFjD,AAAA,AAAAN,+EAAA;;AAAA,AAAA,AAAAA,yEAAA,WAAAC;AAAA,AAAA,IAAAC,WAAA,AAAAC,0BAAAF;IAAAA,eAAA,AAAAG,yBAAAH;AAAA,AAAA,OAAAD,0FAAAE,SAAAD;;;AAAA,AAMA,iEAAA,jEAAMO,0IAAiCC;AAAvC,AACE,uFAAA,hFAACT,+DAAsBU,4EAAgBC,eAAKF;;AAE9C,gDAAA,hDAAMG;AAAN,AACE,OAAA,yFAAU,AAACnB;;AAEb,+CAAA,\/CAAMoB,sGAAcJ;AAApB,AACE,IAAMK,UAAQ,AAACF;AAAf,AACE,gCAAA,zBAACI;kBAADD;AAAA,AAAO,QAAAA,qBAAcN;;CAAQK;;AAEjC,qDAAA,rDAAYG;AAAZ,AACE,OAACC,6BAAQ,AAAA,8GAAoB,AAACzB;;AAEhC,kDAAA,lDAAM0B,4GAAuBC,MAAMC;AAAnC,AACE,GAAI,AAAC\/B,gCAAM+B;AACT,uCAAA,hCAACC,0BAAMF,sFAAyBC;;AAChC,wCAAA,jCAACE,2BAAOH;;;AAEZ,oDAAA,pDAAMI;AAAN,AACE,OAAA,iHAAsB,AAAC\/B;;AAEzB,oDAAA,pDAAMgC,gHAAyBL,MAAMC;AAArC,AACE,GAAI,AAAC\/B,gCAAM+B;AACT,uCAAA,hCAACC,0BAAMF,yFAA2BC;;AAClC,wCAAA,jCAACE,2BAAOH;;;AAEZ,6CAAA,7CAAMM;AAAN,AACE,OAAA,mGAAe,AAACjC;;AAElB,6CAAA,7CAAMkC,kGAAkBP,MAAMC;AAA9B,AACE,GAAI,AAAC\/B,gCAAM+B;AACT,uCAAA,hCAACC,0BAAMF,2EAAoBC;;AAC3B,wCAAA,jCAACE,2BAAOH;;;AAEZ,+CAAA,\/CAAMQ,sGAAoBR;AAA1B,wHACMA,rDACA,2DAAA,3DAACO,nEACD,oIAAA,7HAACF","names":["devtools.formatters.state\/*current-state*","devtools.formatters.state\/valid-current-state?","cljs.core\/some?","devtools.formatters.state\/get-default-state","js\/Error","devtools.formatters.state\/get-current-state","var_args","args__26212__auto__","len__26205__auto__","i__26206__auto__","argseq__26213__auto__","cljs.core\/IndexedSeq","devtools.formatters.state\/update-current-state!","seq41393","G__41394","cljs.core\/first","cljs.core\/next","f","args","cljs.core\/apply","devtools.formatters.state\/push-object-to-current-history!","object","cljs.core\/update","cljs.core\/conj","devtools.formatters.state\/get-current-history","devtools.formatters.state\/is-circular?","history","p1__41398#","cljs.core\/some","devtools.formatters.state\/prevent-recursion?","cljs.core\/boolean","devtools.formatters.state\/set-prevent-recursion","state","val","cljs.core\/assoc","cljs.core\/dissoc","devtools.formatters.state\/get-managed-print-level","devtools.formatters.state\/set-managed-print-level","devtools.formatters.state\/get-depth-budget","devtools.formatters.state\/set-depth-budget","devtools.formatters.state\/reset-depth-limits"]}

View file

@ -0,0 +1,214 @@
(ns devtools.formatters.templating
(:require [cljs.pprint]
[clojure.walk :refer [prewalk]]
[devtools.util :refer-macros [oget oset ocall oapply safe-call]]
[devtools.protocols :refer [ITemplate IGroup ISurrogate IFormat]]
[devtools.formatters.helpers :refer [pref cljs-value?]]
[devtools.formatters.state :refer [get-current-state prevent-recursion?]]
[clojure.string :as string]))
; -- object marking support -------------------------------------------------------------------------------------------------
(defn mark-as-group! [value]
(specify! value IGroup)
value)
(defn group? [value]
(satisfies? IGroup value))
(defn mark-as-template! [value]
(specify! value ITemplate)
value)
(defn template? [value]
(satisfies? ITemplate value))
(defn mark-as-surrogate! [value]
(specify! value ISurrogate)
value)
(defn surrogate? [value]
(satisfies? ISurrogate value))
(defn reference? [value]
(and (group? value)
(= (aget value 0) "object")))
; ---------------------------------------------------------------------------------------------------------------------------
(defn make-group [& items]
(let [group (mark-as-group! #js [])]
(doseq [item items]
(if (some? item)
(if (coll? item)
(.apply (aget group "push") group (mark-as-group! (into-array item))) ; convenience helper to splat cljs collections
(.push group (pref item)))))
group))
(defn make-template
[tag style & children]
(let [tag (pref tag)
style (pref style)
template (mark-as-template! #js [tag (if (empty? style)
#js {}
#js {"style" style})])]
(doseq [child children]
(if (some? child)
(if (coll? child)
(.apply (aget template "push") template (mark-as-template! (into-array (keep pref child)))) ; convenience helper to splat cljs collections
(if-let [child-value (pref child)]
(.push template child-value)))))
template))
(defn concat-templates! [template & templates]
(mark-as-template! (.apply (oget template "concat") template (into-array (map into-array (keep pref templates))))))
(defn extend-template! [template & args]
(concat-templates! template args))
(defn make-surrogate
; passing :target as body means that targt object body should be rendered using standard templates
; see <surrogate-body> in markup.cljs
([object] (make-surrogate object nil))
([object header] (make-surrogate object header nil))
([object header body] (make-surrogate object header body 0))
([object header body start-index]
(mark-as-surrogate! (js-obj
"target" object
"header" header
"body" body
"startIndex" (or start-index 0)))))
(defn get-surrogate-target [surrogate]
{:pre [(surrogate? surrogate)]}
(oget surrogate "target"))
(defn get-surrogate-header [surrogate]
{:pre [(surrogate? surrogate)]}
(oget surrogate "header"))
(defn get-surrogate-body [surrogate]
{:pre [(surrogate? surrogate)]}
(oget surrogate "body"))
(defn get-surrogate-start-index [surrogate]
{:pre [(surrogate? surrogate)]}
(oget surrogate "startIndex"))
(defn make-reference [object & [state-override-fn]]
{:pre [(or (nil? state-override-fn) (fn? state-override-fn))]}
(if (nil? object)
; this code is duplicated in markup.cljs <nil>
(make-template :span :nil-style :nil-label)
(let [sub-state (if (some? state-override-fn)
(state-override-fn (get-current-state))
(get-current-state))]
(make-group "object" #js {"object" object
"config" sub-state}))))
; -- JSON ML support --------------------------------------------------------------------------------------------------------
; a renderer from hiccup-like data markup to json-ml
;
; [[tag style] child1 child2 ...] -> #js [tag #js {"style" ...} child1 child2 ...]
;
(declare render-json-ml*)
(def ^:dynamic *current-render-stack* [])
(def ^:dynamic *current-render-path* [])
(defn pprint-str [markup]
(with-out-str
(binding [*print-level* 300]
(cljs.pprint/pprint markup))))
(defn print-preview [markup]
(binding [*print-level* 1]
(pr-str markup)))
(defn add-stack-separators [stack]
(interpose "-------------" stack))
(defn replace-fns-with-markers [stack]
(let [f (fn [v]
(if (fn? v)
"##fn##"
v))]
(prewalk f stack)))
(defn pprint-render-calls [stack]
(map pprint-str stack))
(defn pprint-render-stack [stack]
(string/join "\n" (-> stack
reverse
replace-fns-with-markers
pprint-render-calls
add-stack-separators)))
(defn pprint-render-path [path]
(pprint-str path))
(defn assert-markup-error [msg]
(assert false (str msg "\n"
"Render path: " (pprint-render-path *current-render-path*) "\n"
"Render stack:\n"
(pprint-render-stack *current-render-stack*))))
(defn surrogate-markup? [markup]
(and (sequential? markup) (= (first markup) "surrogate")))
(defn render-special [name args]
(case name
"surrogate" (let [obj (first args)
converted-args (map render-json-ml* (rest args))]
(apply make-surrogate (concat [obj] converted-args)))
"reference" (let [obj (first args)
converted-obj (if (surrogate-markup? obj) (render-json-ml* obj) obj)]
(apply make-reference (concat [converted-obj] (rest args))))
(assert-markup-error (str "no matching special tag name: '" name "'"))))
(defn emptyish? [v]
(if (or (seqable? v) (array? v) (string? v))
(empty? v)
false))
(defn render-subtree [tag children]
(let [[html-tag style] tag]
(apply make-template html-tag style (map render-json-ml* (remove emptyish? (map pref children))))))
(defn render-json-ml* [markup]
(if-not (sequential? markup)
markup
(binding [*current-render-path* (conj *current-render-path* (first markup))]
(let [tag (pref (first markup))]
(cond
(string? tag) (render-special tag (rest markup))
(sequential? tag) (render-subtree tag (rest markup))
:else (assert-markup-error (str "invalid json-ml markup at " (print-preview markup) ":")))))))
(defn render-json-ml [markup]
(binding [*current-render-stack* (conj *current-render-stack* markup)
*current-render-path* (conj *current-render-path* "<render-json-ml>")]
(render-json-ml* markup)))
; -- template rendering -----------------------------------------------------------------------------------------------------
(defn ^:dynamic assert-failed-markup-rendering [initial-value value]
(assert false (str "result of markup rendering must be a template,\n"
"resolved to " (pprint-str value)
"initial value: " (pprint-str initial-value))))
(defn render-markup* [initial-value value]
(cond
(fn? value) (recur initial-value (value))
(keyword? value) (recur initial-value (pref value))
(sequential? value) (recur initial-value (render-json-ml value))
(template? value) value
(surrogate? value) value
(reference? value) value
:else (assert-failed-markup-rendering initial-value value)))
(defn render-markup [value]
(render-markup* value value))

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,681 @@
// Compiled by ClojureScript 1.9.229 {}
goog.provide('devtools.formatters.templating');
goog.require('cljs.core');
goog.require('cljs.pprint');
goog.require('clojure.walk');
goog.require('devtools.util');
goog.require('devtools.protocols');
goog.require('devtools.formatters.helpers');
goog.require('devtools.formatters.state');
goog.require('clojure.string');
devtools.formatters.templating.mark_as_group_BANG_ = (function devtools$formatters$templating$mark_as_group_BANG_(value){
var x41457_41458 = value;
x41457_41458.devtools$protocols$IGroup$ = true;
return value;
});
devtools.formatters.templating.group_QMARK_ = (function devtools$formatters$templating$group_QMARK_(value){
if(!((value == null))){
if((false) || (value.devtools$protocols$IGroup$)){
return true;
} else {
if((!value.cljs$lang$protocol_mask$partition$)){
return cljs.core.native_satisfies_QMARK_.call(null,devtools.protocols.IGroup,value);
} else {
return false;
}
}
} else {
return cljs.core.native_satisfies_QMARK_.call(null,devtools.protocols.IGroup,value);
}
});
devtools.formatters.templating.mark_as_template_BANG_ = (function devtools$formatters$templating$mark_as_template_BANG_(value){
var x41462_41463 = value;
x41462_41463.devtools$protocols$ITemplate$ = true;
return value;
});
devtools.formatters.templating.template_QMARK_ = (function devtools$formatters$templating$template_QMARK_(value){
if(!((value == null))){
if((false) || (value.devtools$protocols$ITemplate$)){
return true;
} else {
if((!value.cljs$lang$protocol_mask$partition$)){
return cljs.core.native_satisfies_QMARK_.call(null,devtools.protocols.ITemplate,value);
} else {
return false;
}
}
} else {
return cljs.core.native_satisfies_QMARK_.call(null,devtools.protocols.ITemplate,value);
}
});
devtools.formatters.templating.mark_as_surrogate_BANG_ = (function devtools$formatters$templating$mark_as_surrogate_BANG_(value){
var x41467_41468 = value;
x41467_41468.devtools$protocols$ISurrogate$ = true;
return value;
});
devtools.formatters.templating.surrogate_QMARK_ = (function devtools$formatters$templating$surrogate_QMARK_(value){
if(!((value == null))){
if((false) || (value.devtools$protocols$ISurrogate$)){
return true;
} else {
if((!value.cljs$lang$protocol_mask$partition$)){
return cljs.core.native_satisfies_QMARK_.call(null,devtools.protocols.ISurrogate,value);
} else {
return false;
}
}
} else {
return cljs.core.native_satisfies_QMARK_.call(null,devtools.protocols.ISurrogate,value);
}
});
devtools.formatters.templating.reference_QMARK_ = (function devtools$formatters$templating$reference_QMARK_(value){
var and__25118__auto__ = devtools.formatters.templating.group_QMARK_.call(null,value);
if(cljs.core.truth_(and__25118__auto__)){
return cljs.core._EQ_.call(null,(value[(0)]),"object");
} else {
return and__25118__auto__;
}
});
devtools.formatters.templating.make_group = (function devtools$formatters$templating$make_group(var_args){
var args__26212__auto__ = [];
var len__26205__auto___41476 = arguments.length;
var i__26206__auto___41477 = (0);
while(true){
if((i__26206__auto___41477 < len__26205__auto___41476)){
args__26212__auto__.push((arguments[i__26206__auto___41477]));
var G__41478 = (i__26206__auto___41477 + (1));
i__26206__auto___41477 = G__41478;
continue;
} else {
}
break;
}
var argseq__26213__auto__ = ((((0) < args__26212__auto__.length))?(new cljs.core.IndexedSeq(args__26212__auto__.slice((0)),(0),null)):null);
return devtools.formatters.templating.make_group.cljs$core$IFn$_invoke$arity$variadic(argseq__26213__auto__);
});
devtools.formatters.templating.make_group.cljs$core$IFn$_invoke$arity$variadic = (function (items){
var group = devtools.formatters.templating.mark_as_group_BANG_.call(null,[]);
var seq__41472_41479 = cljs.core.seq.call(null,items);
var chunk__41473_41480 = null;
var count__41474_41481 = (0);
var i__41475_41482 = (0);
while(true){
if((i__41475_41482 < count__41474_41481)){
var item_41483 = cljs.core._nth.call(null,chunk__41473_41480,i__41475_41482);
if(cljs.core.some_QMARK_.call(null,item_41483)){
if(cljs.core.coll_QMARK_.call(null,item_41483)){
(group["push"]).apply(group,devtools.formatters.templating.mark_as_group_BANG_.call(null,cljs.core.into_array.call(null,item_41483)));
} else {
group.push(devtools.formatters.helpers.pref.call(null,item_41483));
}
} else {
}
var G__41484 = seq__41472_41479;
var G__41485 = chunk__41473_41480;
var G__41486 = count__41474_41481;
var G__41487 = (i__41475_41482 + (1));
seq__41472_41479 = G__41484;
chunk__41473_41480 = G__41485;
count__41474_41481 = G__41486;
i__41475_41482 = G__41487;
continue;
} else {
var temp__4657__auto___41488 = cljs.core.seq.call(null,seq__41472_41479);
if(temp__4657__auto___41488){
var seq__41472_41489__$1 = temp__4657__auto___41488;
if(cljs.core.chunked_seq_QMARK_.call(null,seq__41472_41489__$1)){
var c__25941__auto___41490 = cljs.core.chunk_first.call(null,seq__41472_41489__$1);
var G__41491 = cljs.core.chunk_rest.call(null,seq__41472_41489__$1);
var G__41492 = c__25941__auto___41490;
var G__41493 = cljs.core.count.call(null,c__25941__auto___41490);
var G__41494 = (0);
seq__41472_41479 = G__41491;
chunk__41473_41480 = G__41492;
count__41474_41481 = G__41493;
i__41475_41482 = G__41494;
continue;
} else {
var item_41495 = cljs.core.first.call(null,seq__41472_41489__$1);
if(cljs.core.some_QMARK_.call(null,item_41495)){
if(cljs.core.coll_QMARK_.call(null,item_41495)){
(group["push"]).apply(group,devtools.formatters.templating.mark_as_group_BANG_.call(null,cljs.core.into_array.call(null,item_41495)));
} else {
group.push(devtools.formatters.helpers.pref.call(null,item_41495));
}
} else {
}
var G__41496 = cljs.core.next.call(null,seq__41472_41489__$1);
var G__41497 = null;
var G__41498 = (0);
var G__41499 = (0);
seq__41472_41479 = G__41496;
chunk__41473_41480 = G__41497;
count__41474_41481 = G__41498;
i__41475_41482 = G__41499;
continue;
}
} else {
}
}
break;
}
return group;
});
devtools.formatters.templating.make_group.cljs$lang$maxFixedArity = (0);
devtools.formatters.templating.make_group.cljs$lang$applyTo = (function (seq41471){
return devtools.formatters.templating.make_group.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq.call(null,seq41471));
});
devtools.formatters.templating.make_template = (function devtools$formatters$templating$make_template(var_args){
var args__26212__auto__ = [];
var len__26205__auto___41507 = arguments.length;
var i__26206__auto___41508 = (0);
while(true){
if((i__26206__auto___41508 < len__26205__auto___41507)){
args__26212__auto__.push((arguments[i__26206__auto___41508]));
var G__41509 = (i__26206__auto___41508 + (1));
i__26206__auto___41508 = G__41509;
continue;
} else {
}
break;
}
var argseq__26213__auto__ = ((((2) < args__26212__auto__.length))?(new cljs.core.IndexedSeq(args__26212__auto__.slice((2)),(0),null)):null);
return devtools.formatters.templating.make_template.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__26213__auto__);
});
devtools.formatters.templating.make_template.cljs$core$IFn$_invoke$arity$variadic = (function (tag,style,children){
var tag__$1 = devtools.formatters.helpers.pref.call(null,tag);
var style__$1 = devtools.formatters.helpers.pref.call(null,style);
var template = devtools.formatters.templating.mark_as_template_BANG_.call(null,[tag__$1,((cljs.core.empty_QMARK_.call(null,style__$1))?({}):({"style": style__$1}))]);
var seq__41503_41510 = cljs.core.seq.call(null,children);
var chunk__41504_41511 = null;
var count__41505_41512 = (0);
var i__41506_41513 = (0);
while(true){
if((i__41506_41513 < count__41505_41512)){
var child_41514 = cljs.core._nth.call(null,chunk__41504_41511,i__41506_41513);
if(cljs.core.some_QMARK_.call(null,child_41514)){
if(cljs.core.coll_QMARK_.call(null,child_41514)){
(template["push"]).apply(template,devtools.formatters.templating.mark_as_template_BANG_.call(null,cljs.core.into_array.call(null,cljs.core.keep.call(null,devtools.formatters.helpers.pref,child_41514))));
} else {
var temp__4655__auto___41515 = devtools.formatters.helpers.pref.call(null,child_41514);
if(cljs.core.truth_(temp__4655__auto___41515)){
var child_value_41516 = temp__4655__auto___41515;
template.push(child_value_41516);
} else {
}
}
} else {
}
var G__41517 = seq__41503_41510;
var G__41518 = chunk__41504_41511;
var G__41519 = count__41505_41512;
var G__41520 = (i__41506_41513 + (1));
seq__41503_41510 = G__41517;
chunk__41504_41511 = G__41518;
count__41505_41512 = G__41519;
i__41506_41513 = G__41520;
continue;
} else {
var temp__4657__auto___41521 = cljs.core.seq.call(null,seq__41503_41510);
if(temp__4657__auto___41521){
var seq__41503_41522__$1 = temp__4657__auto___41521;
if(cljs.core.chunked_seq_QMARK_.call(null,seq__41503_41522__$1)){
var c__25941__auto___41523 = cljs.core.chunk_first.call(null,seq__41503_41522__$1);
var G__41524 = cljs.core.chunk_rest.call(null,seq__41503_41522__$1);
var G__41525 = c__25941__auto___41523;
var G__41526 = cljs.core.count.call(null,c__25941__auto___41523);
var G__41527 = (0);
seq__41503_41510 = G__41524;
chunk__41504_41511 = G__41525;
count__41505_41512 = G__41526;
i__41506_41513 = G__41527;
continue;
} else {
var child_41528 = cljs.core.first.call(null,seq__41503_41522__$1);
if(cljs.core.some_QMARK_.call(null,child_41528)){
if(cljs.core.coll_QMARK_.call(null,child_41528)){
(template["push"]).apply(template,devtools.formatters.templating.mark_as_template_BANG_.call(null,cljs.core.into_array.call(null,cljs.core.keep.call(null,devtools.formatters.helpers.pref,child_41528))));
} else {
var temp__4655__auto___41529 = devtools.formatters.helpers.pref.call(null,child_41528);
if(cljs.core.truth_(temp__4655__auto___41529)){
var child_value_41530 = temp__4655__auto___41529;
template.push(child_value_41530);
} else {
}
}
} else {
}
var G__41531 = cljs.core.next.call(null,seq__41503_41522__$1);
var G__41532 = null;
var G__41533 = (0);
var G__41534 = (0);
seq__41503_41510 = G__41531;
chunk__41504_41511 = G__41532;
count__41505_41512 = G__41533;
i__41506_41513 = G__41534;
continue;
}
} else {
}
}
break;
}
return template;
});
devtools.formatters.templating.make_template.cljs$lang$maxFixedArity = (2);
devtools.formatters.templating.make_template.cljs$lang$applyTo = (function (seq41500){
var G__41501 = cljs.core.first.call(null,seq41500);
var seq41500__$1 = cljs.core.next.call(null,seq41500);
var G__41502 = cljs.core.first.call(null,seq41500__$1);
var seq41500__$2 = cljs.core.next.call(null,seq41500__$1);
return devtools.formatters.templating.make_template.cljs$core$IFn$_invoke$arity$variadic(G__41501,G__41502,seq41500__$2);
});
devtools.formatters.templating.concat_templates_BANG_ = (function devtools$formatters$templating$concat_templates_BANG_(var_args){
var args__26212__auto__ = [];
var len__26205__auto___41537 = arguments.length;
var i__26206__auto___41538 = (0);
while(true){
if((i__26206__auto___41538 < len__26205__auto___41537)){
args__26212__auto__.push((arguments[i__26206__auto___41538]));
var G__41539 = (i__26206__auto___41538 + (1));
i__26206__auto___41538 = G__41539;
continue;
} else {
}
break;
}
var argseq__26213__auto__ = ((((1) < args__26212__auto__.length))?(new cljs.core.IndexedSeq(args__26212__auto__.slice((1)),(0),null)):null);
return devtools.formatters.templating.concat_templates_BANG_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__26213__auto__);
});
devtools.formatters.templating.concat_templates_BANG_.cljs$core$IFn$_invoke$arity$variadic = (function (template,templates){
return devtools.formatters.templating.mark_as_template_BANG_.call(null,goog.object.get(template,"concat").apply(template,cljs.core.into_array.call(null,cljs.core.map.call(null,cljs.core.into_array,cljs.core.keep.call(null,devtools.formatters.helpers.pref,templates)))));
});
devtools.formatters.templating.concat_templates_BANG_.cljs$lang$maxFixedArity = (1);
devtools.formatters.templating.concat_templates_BANG_.cljs$lang$applyTo = (function (seq41535){
var G__41536 = cljs.core.first.call(null,seq41535);
var seq41535__$1 = cljs.core.next.call(null,seq41535);
return devtools.formatters.templating.concat_templates_BANG_.cljs$core$IFn$_invoke$arity$variadic(G__41536,seq41535__$1);
});
devtools.formatters.templating.extend_template_BANG_ = (function devtools$formatters$templating$extend_template_BANG_(var_args){
var args__26212__auto__ = [];
var len__26205__auto___41542 = arguments.length;
var i__26206__auto___41543 = (0);
while(true){
if((i__26206__auto___41543 < len__26205__auto___41542)){
args__26212__auto__.push((arguments[i__26206__auto___41543]));
var G__41544 = (i__26206__auto___41543 + (1));
i__26206__auto___41543 = G__41544;
continue;
} else {
}
break;
}
var argseq__26213__auto__ = ((((1) < args__26212__auto__.length))?(new cljs.core.IndexedSeq(args__26212__auto__.slice((1)),(0),null)):null);
return devtools.formatters.templating.extend_template_BANG_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__26213__auto__);
});
devtools.formatters.templating.extend_template_BANG_.cljs$core$IFn$_invoke$arity$variadic = (function (template,args){
return devtools.formatters.templating.concat_templates_BANG_.call(null,template,args);
});
devtools.formatters.templating.extend_template_BANG_.cljs$lang$maxFixedArity = (1);
devtools.formatters.templating.extend_template_BANG_.cljs$lang$applyTo = (function (seq41540){
var G__41541 = cljs.core.first.call(null,seq41540);
var seq41540__$1 = cljs.core.next.call(null,seq41540);
return devtools.formatters.templating.extend_template_BANG_.cljs$core$IFn$_invoke$arity$variadic(G__41541,seq41540__$1);
});
devtools.formatters.templating.make_surrogate = (function devtools$formatters$templating$make_surrogate(var_args){
var args41545 = [];
var len__26205__auto___41550 = arguments.length;
var i__26206__auto___41551 = (0);
while(true){
if((i__26206__auto___41551 < len__26205__auto___41550)){
args41545.push((arguments[i__26206__auto___41551]));
var G__41552 = (i__26206__auto___41551 + (1));
i__26206__auto___41551 = G__41552;
continue;
} else {
}
break;
}
var G__41547 = args41545.length;
switch (G__41547) {
case 1:
return devtools.formatters.templating.make_surrogate.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
break;
case 2:
return devtools.formatters.templating.make_surrogate.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
break;
case 3:
return devtools.formatters.templating.make_surrogate.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
break;
case 4:
return devtools.formatters.templating.make_surrogate.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
break;
default:
throw (new Error([cljs.core.str("Invalid arity: "),cljs.core.str(args41545.length)].join('')));
}
});
devtools.formatters.templating.make_surrogate.cljs$core$IFn$_invoke$arity$1 = (function (object){
return devtools.formatters.templating.make_surrogate.call(null,object,null);
});
devtools.formatters.templating.make_surrogate.cljs$core$IFn$_invoke$arity$2 = (function (object,header){
return devtools.formatters.templating.make_surrogate.call(null,object,header,null);
});
devtools.formatters.templating.make_surrogate.cljs$core$IFn$_invoke$arity$3 = (function (object,header,body){
return devtools.formatters.templating.make_surrogate.call(null,object,header,body,(0));
});
devtools.formatters.templating.make_surrogate.cljs$core$IFn$_invoke$arity$4 = (function (object,header,body,start_index){
return devtools.formatters.templating.mark_as_surrogate_BANG_.call(null,(function (){var obj41549 = {"target":object,"header":header,"body":body,"startIndex":(function (){var or__25130__auto__ = start_index;
if(cljs.core.truth_(or__25130__auto__)){
return or__25130__auto__;
} else {
return (0);
}
})()};
return obj41549;
})());
});
devtools.formatters.templating.make_surrogate.cljs$lang$maxFixedArity = 4;
devtools.formatters.templating.get_surrogate_target = (function devtools$formatters$templating$get_surrogate_target(surrogate){
if(cljs.core.truth_(devtools.formatters.templating.surrogate_QMARK_.call(null,surrogate))){
} else {
throw (new Error("Assert failed: (surrogate? surrogate)"));
}
return goog.object.get(surrogate,"target");
});
devtools.formatters.templating.get_surrogate_header = (function devtools$formatters$templating$get_surrogate_header(surrogate){
if(cljs.core.truth_(devtools.formatters.templating.surrogate_QMARK_.call(null,surrogate))){
} else {
throw (new Error("Assert failed: (surrogate? surrogate)"));
}
return goog.object.get(surrogate,"header");
});
devtools.formatters.templating.get_surrogate_body = (function devtools$formatters$templating$get_surrogate_body(surrogate){
if(cljs.core.truth_(devtools.formatters.templating.surrogate_QMARK_.call(null,surrogate))){
} else {
throw (new Error("Assert failed: (surrogate? surrogate)"));
}
return goog.object.get(surrogate,"body");
});
devtools.formatters.templating.get_surrogate_start_index = (function devtools$formatters$templating$get_surrogate_start_index(surrogate){
if(cljs.core.truth_(devtools.formatters.templating.surrogate_QMARK_.call(null,surrogate))){
} else {
throw (new Error("Assert failed: (surrogate? surrogate)"));
}
return goog.object.get(surrogate,"startIndex");
});
devtools.formatters.templating.make_reference = (function devtools$formatters$templating$make_reference(var_args){
var args__26212__auto__ = [];
var len__26205__auto___41560 = arguments.length;
var i__26206__auto___41561 = (0);
while(true){
if((i__26206__auto___41561 < len__26205__auto___41560)){
args__26212__auto__.push((arguments[i__26206__auto___41561]));
var G__41562 = (i__26206__auto___41561 + (1));
i__26206__auto___41561 = G__41562;
continue;
} else {
}
break;
}
var argseq__26213__auto__ = ((((1) < args__26212__auto__.length))?(new cljs.core.IndexedSeq(args__26212__auto__.slice((1)),(0),null)):null);
return devtools.formatters.templating.make_reference.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__26213__auto__);
});
devtools.formatters.templating.make_reference.cljs$core$IFn$_invoke$arity$variadic = (function (object,p__41556){
var vec__41557 = p__41556;
var state_override_fn = cljs.core.nth.call(null,vec__41557,(0),null);
if(((state_override_fn == null)) || (cljs.core.fn_QMARK_.call(null,state_override_fn))){
} else {
throw (new Error("Assert failed: (or (nil? state-override-fn) (fn? state-override-fn))"));
}
if((object == null)){
return devtools.formatters.templating.make_template.call(null,new cljs.core.Keyword(null,"span","span",1394872991),new cljs.core.Keyword(null,"nil-style","nil-style",-1505044832),new cljs.core.Keyword(null,"nil-label","nil-label",-587789203));
} else {
var sub_state = ((cljs.core.some_QMARK_.call(null,state_override_fn))?state_override_fn.call(null,devtools.formatters.state.get_current_state.call(null)):devtools.formatters.state.get_current_state.call(null));
return devtools.formatters.templating.make_group.call(null,"object",({"object": object, "config": sub_state}));
}
});
devtools.formatters.templating.make_reference.cljs$lang$maxFixedArity = (1);
devtools.formatters.templating.make_reference.cljs$lang$applyTo = (function (seq41554){
var G__41555 = cljs.core.first.call(null,seq41554);
var seq41554__$1 = cljs.core.next.call(null,seq41554);
return devtools.formatters.templating.make_reference.cljs$core$IFn$_invoke$arity$variadic(G__41555,seq41554__$1);
});
devtools.formatters.templating._STAR_current_render_stack_STAR_ = cljs.core.PersistentVector.EMPTY;
devtools.formatters.templating._STAR_current_render_path_STAR_ = cljs.core.PersistentVector.EMPTY;
devtools.formatters.templating.pprint_str = (function devtools$formatters$templating$pprint_str(markup){
var sb__26116__auto__ = (new goog.string.StringBuffer());
var _STAR_print_newline_STAR_41566_41569 = cljs.core._STAR_print_newline_STAR_;
var _STAR_print_fn_STAR_41567_41570 = cljs.core._STAR_print_fn_STAR_;
cljs.core._STAR_print_newline_STAR_ = true;
cljs.core._STAR_print_fn_STAR_ = ((function (_STAR_print_newline_STAR_41566_41569,_STAR_print_fn_STAR_41567_41570,sb__26116__auto__){
return (function (x__26117__auto__){
return sb__26116__auto__.append(x__26117__auto__);
});})(_STAR_print_newline_STAR_41566_41569,_STAR_print_fn_STAR_41567_41570,sb__26116__auto__))
;
try{var _STAR_print_level_STAR_41568_41571 = cljs.core._STAR_print_level_STAR_;
cljs.core._STAR_print_level_STAR_ = (300);
try{cljs.pprint.pprint.call(null,markup);
}finally {cljs.core._STAR_print_level_STAR_ = _STAR_print_level_STAR_41568_41571;
}}finally {cljs.core._STAR_print_fn_STAR_ = _STAR_print_fn_STAR_41567_41570;
cljs.core._STAR_print_newline_STAR_ = _STAR_print_newline_STAR_41566_41569;
}
return [cljs.core.str(sb__26116__auto__)].join('');
});
devtools.formatters.templating.print_preview = (function devtools$formatters$templating$print_preview(markup){
var _STAR_print_level_STAR_41573 = cljs.core._STAR_print_level_STAR_;
cljs.core._STAR_print_level_STAR_ = (1);
try{return cljs.core.pr_str.call(null,markup);
}finally {cljs.core._STAR_print_level_STAR_ = _STAR_print_level_STAR_41573;
}});
devtools.formatters.templating.add_stack_separators = (function devtools$formatters$templating$add_stack_separators(stack){
return cljs.core.interpose.call(null,"-------------",stack);
});
devtools.formatters.templating.replace_fns_with_markers = (function devtools$formatters$templating$replace_fns_with_markers(stack){
var f = (function (v){
if(cljs.core.fn_QMARK_.call(null,v)){
return "##fn##";
} else {
return v;
}
});
return clojure.walk.prewalk.call(null,f,stack);
});
devtools.formatters.templating.pprint_render_calls = (function devtools$formatters$templating$pprint_render_calls(stack){
return cljs.core.map.call(null,devtools.formatters.templating.pprint_str,stack);
});
devtools.formatters.templating.pprint_render_stack = (function devtools$formatters$templating$pprint_render_stack(stack){
return clojure.string.join.call(null,"\n",devtools.formatters.templating.add_stack_separators.call(null,devtools.formatters.templating.pprint_render_calls.call(null,devtools.formatters.templating.replace_fns_with_markers.call(null,cljs.core.reverse.call(null,stack)))));
});
devtools.formatters.templating.pprint_render_path = (function devtools$formatters$templating$pprint_render_path(path){
return devtools.formatters.templating.pprint_str.call(null,path);
});
devtools.formatters.templating.assert_markup_error = (function devtools$formatters$templating$assert_markup_error(msg){
throw (new Error([cljs.core.str("Assert failed: "),cljs.core.str([cljs.core.str(msg),cljs.core.str("\n"),cljs.core.str("Render path: "),cljs.core.str(devtools.formatters.templating.pprint_render_path.call(null,devtools.formatters.templating._STAR_current_render_path_STAR_)),cljs.core.str("\n"),cljs.core.str("Render stack:\n"),cljs.core.str(devtools.formatters.templating.pprint_render_stack.call(null,devtools.formatters.templating._STAR_current_render_stack_STAR_))].join('')),cljs.core.str("\n"),cljs.core.str("false")].join('')));
});
devtools.formatters.templating.surrogate_markup_QMARK_ = (function devtools$formatters$templating$surrogate_markup_QMARK_(markup){
return (cljs.core.sequential_QMARK_.call(null,markup)) && (cljs.core._EQ_.call(null,cljs.core.first.call(null,markup),"surrogate"));
});
devtools.formatters.templating.render_special = (function devtools$formatters$templating$render_special(name,args){
var G__41575 = name;
switch (G__41575) {
case "surrogate":
var obj = cljs.core.first.call(null,args);
var converted_args = cljs.core.map.call(null,devtools.formatters.templating.render_json_ml_STAR_,cljs.core.rest.call(null,args));
return cljs.core.apply.call(null,devtools.formatters.templating.make_surrogate,cljs.core.concat.call(null,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [obj], null),converted_args));
break;
case "reference":
var obj = cljs.core.first.call(null,args);
var converted_obj = (cljs.core.truth_(devtools.formatters.templating.surrogate_markup_QMARK_.call(null,obj))?devtools.formatters.templating.render_json_ml_STAR_.call(null,obj):obj);
return cljs.core.apply.call(null,devtools.formatters.templating.make_reference,cljs.core.concat.call(null,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [converted_obj], null),cljs.core.rest.call(null,args)));
break;
default:
return devtools.formatters.templating.assert_markup_error.call(null,[cljs.core.str("no matching special tag name: '"),cljs.core.str(name),cljs.core.str("'")].join(''));
}
});
devtools.formatters.templating.emptyish_QMARK_ = (function devtools$formatters$templating$emptyish_QMARK_(v){
if((cljs.core.seqable_QMARK_.call(null,v)) || (cljs.core.array_QMARK_.call(null,v)) || (typeof v === 'string')){
return cljs.core.empty_QMARK_.call(null,v);
} else {
return false;
}
});
devtools.formatters.templating.render_subtree = (function devtools$formatters$templating$render_subtree(tag,children){
var vec__41580 = tag;
var html_tag = cljs.core.nth.call(null,vec__41580,(0),null);
var style = cljs.core.nth.call(null,vec__41580,(1),null);
return cljs.core.apply.call(null,devtools.formatters.templating.make_template,html_tag,style,cljs.core.map.call(null,devtools.formatters.templating.render_json_ml_STAR_,cljs.core.remove.call(null,devtools.formatters.templating.emptyish_QMARK_,cljs.core.map.call(null,devtools.formatters.helpers.pref,children))));
});
devtools.formatters.templating.render_json_ml_STAR_ = (function devtools$formatters$templating$render_json_ml_STAR_(markup){
if(!(cljs.core.sequential_QMARK_.call(null,markup))){
return markup;
} else {
var _STAR_current_render_path_STAR_41584 = devtools.formatters.templating._STAR_current_render_path_STAR_;
devtools.formatters.templating._STAR_current_render_path_STAR_ = cljs.core.conj.call(null,devtools.formatters.templating._STAR_current_render_path_STAR_,cljs.core.first.call(null,markup));
try{var tag = devtools.formatters.helpers.pref.call(null,cljs.core.first.call(null,markup));
if(typeof tag === 'string'){
return devtools.formatters.templating.render_special.call(null,tag,cljs.core.rest.call(null,markup));
} else {
if(cljs.core.sequential_QMARK_.call(null,tag)){
return devtools.formatters.templating.render_subtree.call(null,tag,cljs.core.rest.call(null,markup));
} else {
return devtools.formatters.templating.assert_markup_error.call(null,[cljs.core.str("invalid json-ml markup at "),cljs.core.str(devtools.formatters.templating.print_preview.call(null,markup)),cljs.core.str(":")].join(''));
}
}
}finally {devtools.formatters.templating._STAR_current_render_path_STAR_ = _STAR_current_render_path_STAR_41584;
}}
});
devtools.formatters.templating.render_json_ml = (function devtools$formatters$templating$render_json_ml(markup){
var _STAR_current_render_stack_STAR_41587 = devtools.formatters.templating._STAR_current_render_stack_STAR_;
var _STAR_current_render_path_STAR_41588 = devtools.formatters.templating._STAR_current_render_path_STAR_;
devtools.formatters.templating._STAR_current_render_stack_STAR_ = cljs.core.conj.call(null,devtools.formatters.templating._STAR_current_render_stack_STAR_,markup);
devtools.formatters.templating._STAR_current_render_path_STAR_ = cljs.core.conj.call(null,devtools.formatters.templating._STAR_current_render_path_STAR_,"<render-json-ml>");
try{return devtools.formatters.templating.render_json_ml_STAR_.call(null,markup);
}finally {devtools.formatters.templating._STAR_current_render_path_STAR_ = _STAR_current_render_path_STAR_41588;
devtools.formatters.templating._STAR_current_render_stack_STAR_ = _STAR_current_render_stack_STAR_41587;
}});
devtools.formatters.templating.assert_failed_markup_rendering = (function devtools$formatters$templating$assert_failed_markup_rendering(initial_value,value){
throw (new Error([cljs.core.str("Assert failed: "),cljs.core.str([cljs.core.str("result of markup rendering must be a template,\n"),cljs.core.str("resolved to "),cljs.core.str(devtools.formatters.templating.pprint_str.call(null,value)),cljs.core.str("initial value: "),cljs.core.str(devtools.formatters.templating.pprint_str.call(null,initial_value))].join('')),cljs.core.str("\n"),cljs.core.str("false")].join('')));
});
devtools.formatters.templating.render_markup_STAR_ = (function devtools$formatters$templating$render_markup_STAR_(initial_value,value){
while(true){
if(cljs.core.fn_QMARK_.call(null,value)){
var G__41589 = initial_value;
var G__41590 = value.call(null);
initial_value = G__41589;
value = G__41590;
continue;
} else {
if((value instanceof cljs.core.Keyword)){
var G__41591 = initial_value;
var G__41592 = devtools.formatters.helpers.pref.call(null,value);
initial_value = G__41591;
value = G__41592;
continue;
} else {
if(cljs.core.sequential_QMARK_.call(null,value)){
var G__41593 = initial_value;
var G__41594 = devtools.formatters.templating.render_json_ml.call(null,value);
initial_value = G__41593;
value = G__41594;
continue;
} else {
if(cljs.core.truth_(devtools.formatters.templating.template_QMARK_.call(null,value))){
return value;
} else {
if(cljs.core.truth_(devtools.formatters.templating.surrogate_QMARK_.call(null,value))){
return value;
} else {
if(cljs.core.truth_(devtools.formatters.templating.reference_QMARK_.call(null,value))){
return value;
} else {
return devtools.formatters.templating.assert_failed_markup_rendering.call(null,initial_value,value);
}
}
}
}
}
}
break;
}
});
devtools.formatters.templating.render_markup = (function devtools$formatters$templating$render_markup(value){
return devtools.formatters.templating.render_markup_STAR_.call(null,value,value);
});
//# sourceMappingURL=templating.js.map?rel=1603199212660

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,146 @@
(ns devtools.hints
(:require [devtools.prefs :refer [pref]]
[cljs.stacktrace :as stacktrace]))
(defn ^:dynamic available? []
true)
; Question: How much time have you lost staring at "Cannot read property 'call' of null" kind of errors?
;
; ---------------------------------------------------------------------------------------------------------------------------
;
; The idea is to try enhance error object's .stack and .message fields with additional info about
; the call site causing null type error. With optimizations :none the name of the null call site can be seen.
;
; The enahncing handler function tries to:
; 1) parse error's stack trace.
; 2) look original javascript source file up (via sync AJAX fetch by default).
; 3) locate reported line and column.
; 4) presents problematic line with a column hint as addition to .stack or .message strings.
; Technically the trick here is to override TypeError.prototype.toString
; and global window.onerror handler to enhance uncaught errors.
;
; With that we should handle two situations:
; 1) either error gets printed (typically in user's catch via console), so patched toString() method gets called.
; 2) or it is uncaught and our global error handler should take care of possible enhancement
; before devtools present it to the user themselves.
;
; note: Tested under Chrome only
(def ^:dynamic *installed* false)
(def ^:dynamic *original-global-error-handler* nil)
(def ^:dynamic *original-type-error-prototype-to-string* nil)
(def processed-errors (volatile! nil))
; ---------------------------------------------------------------------------------------------------------------------------
(defn set-processed-errors! [val]
(vreset! processed-errors val))
(defn get-processed-errors! []
(if-let [val @processed-errors]
val
(if (exists? js/WeakSet)
(set-processed-errors! (js/WeakSet.)))))
; ---------------------------------------------------------------------------------------------------------------------------
(defn empty-as-nil [str]
(if (empty? str) nil str))
(defn ajax-reader [url]
(let [xhr (js/XMLHttpRequest.)]
(.open xhr "GET" url false)
(.send xhr)
(empty-as-nil (.-responseText xhr))))
(defn retrieve-javascript-source [where]
(let [reader (or (pref :file-reader) ajax-reader)]
(reader where)))
(defn get-line [lines line-number]
(aget lines (dec line-number))) ; line numbering is 1-based
(defn extend-content [content lines line-number min-length]
(if (or (> (count content) min-length)
(not (pos? line-number)))
content
(let [prev-line-number (dec line-number)
prev-line (get-line lines prev-line-number)
new-content (str prev-line "\n" content)]
(extend-content new-content lines prev-line-number min-length))))
(defn mark-call-closed-at-column [line column]
(let [n (dec column) ; column number is 1-based
prefix (.substring line 0 n)
postfix (.substring line n)]
(str prefix " <<< ☢ NULL ☢ <<< " postfix)))
(defn mark-null-call-site-location [file line-number column]
(let [content (retrieve-javascript-source file)
lines (.split content "\n")
line (get-line lines line-number)
marked-line (mark-call-closed-at-column line column)
min-length (or (pref :sanity-hint-min-length) 128)]
(extend-content marked-line lines line-number min-length)))
(defn make-sense-of-the-error [message file line-number column]
(cond
(re-matches #"Cannot read property 'call' of.*" message) (mark-null-call-site-location file line-number column)
:else nil))
(defn error-object-sense [error]
(try
(let [native-stack-trace (.-stack error)
stack-trace (stacktrace/parse-stacktrace {} native-stack-trace {:ua-product :chrome} {:asset-root ""})
top-item (second stack-trace) ; first line is just an error message
{:keys [file line column]} top-item]
(make-sense-of-the-error (.-message error) file line column))
(catch :default _e
; silently fail in case of troubles parsing stack trace
false)))
(defn type-error-to-string [self]
(if-let [seen-errors (get-processed-errors!)]
(when-not (.has seen-errors self)
(.add seen-errors self)
(when-let [sense (error-object-sense self)]
(set! (.-message self) (str (.-message self) ", a sanity hint:\n" sense))))) ; this is dirty, patch message field before it gets used
(.call *original-type-error-prototype-to-string* self))
(defn global-error-handler [message url line column error]
(let [res (if *original-global-error-handler*
(*original-global-error-handler* message url line column error))]
(if-not res
(when-let [sense (error-object-sense error)]
(.info js/console "A sanity hint for incoming uncaught error:\n" sense)
false)
true)))
(defn install-type-error-enhancer []
(set! *original-global-error-handler* (.-onerror js/window))
(set! (.-onerror js/window) global-error-handler)
(let [prototype (.-prototype js/TypeError)]
(set! *original-type-error-prototype-to-string* (.-toString prototype))
(set! (.-toString prototype) #(this-as self (type-error-to-string self))))) ; work around http://dev.clojure.org/jira/browse/CLJS-1545
; -- installation -----------------------------------------------------------------------------------------------------------
(defn installed? []
*installed*)
(defn install! []
(when-not *installed*
(set! *installed* true)
(install-type-error-enhancer)
true))
(defn uninstall! []
(when *installed*
(set! *installed* false)
(assert *original-type-error-prototype-to-string*)
(set! (.-onerror js/window) *original-global-error-handler*)
(let [prototype (.-prototype js/TypeError)]
(set! (.-toString prototype) *original-type-error-prototype-to-string*))))

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,191 @@
// Compiled by ClojureScript 1.9.229 {}
goog.provide('devtools.hints');
goog.require('cljs.core');
goog.require('devtools.prefs');
goog.require('cljs.stacktrace');
devtools.hints.available_QMARK_ = (function devtools$hints$available_QMARK_(){
return true;
});
devtools.hints._STAR_installed_STAR_ = false;
devtools.hints._STAR_original_global_error_handler_STAR_ = null;
devtools.hints._STAR_original_type_error_prototype_to_string_STAR_ = null;
devtools.hints.processed_errors = cljs.core.volatile_BANG_.call(null,null);
devtools.hints.set_processed_errors_BANG_ = (function devtools$hints$set_processed_errors_BANG_(val){
return cljs.core.vreset_BANG_.call(null,devtools.hints.processed_errors,val);
});
devtools.hints.get_processed_errors_BANG_ = (function devtools$hints$get_processed_errors_BANG_(){
var temp__4655__auto__ = cljs.core.deref.call(null,devtools.hints.processed_errors);
if(cljs.core.truth_(temp__4655__auto__)){
var val = temp__4655__auto__;
return val;
} else {
if(typeof WeakSet !== 'undefined'){
return devtools.hints.set_processed_errors_BANG_.call(null,(new WeakSet()));
} else {
return null;
}
}
});
devtools.hints.empty_as_nil = (function devtools$hints$empty_as_nil(str){
if(cljs.core.empty_QMARK_.call(null,str)){
return null;
} else {
return str;
}
});
devtools.hints.ajax_reader = (function devtools$hints$ajax_reader(url){
var xhr = (new XMLHttpRequest());
xhr.open("GET",url,false);
xhr.send();
return devtools.hints.empty_as_nil.call(null,xhr.responseText);
});
devtools.hints.retrieve_javascript_source = (function devtools$hints$retrieve_javascript_source(where){
var reader = (function (){var or__25130__auto__ = devtools.prefs.pref.call(null,new cljs.core.Keyword(null,"file-reader","file-reader",-450847664));
if(cljs.core.truth_(or__25130__auto__)){
return or__25130__auto__;
} else {
return devtools.hints.ajax_reader;
}
})();
return reader.call(null,where);
});
devtools.hints.get_line = (function devtools$hints$get_line(lines,line_number){
return (lines[(line_number - (1))]);
});
devtools.hints.extend_content = (function devtools$hints$extend_content(content,lines,line_number,min_length){
if(((cljs.core.count.call(null,content) > min_length)) || (!((line_number > (0))))){
return content;
} else {
var prev_line_number = (line_number - (1));
var prev_line = devtools.hints.get_line.call(null,lines,prev_line_number);
var new_content = [cljs.core.str(prev_line),cljs.core.str("\n"),cljs.core.str(content)].join('');
return devtools$hints$extend_content.call(null,new_content,lines,prev_line_number,min_length);
}
});
devtools.hints.mark_call_closed_at_column = (function devtools$hints$mark_call_closed_at_column(line,column){
var n = (column - (1));
var prefix = line.substring((0),n);
var postfix = line.substring(n);
return [cljs.core.str(prefix),cljs.core.str(" <<< \u2622 NULL \u2622 <<< "),cljs.core.str(postfix)].join('');
});
devtools.hints.mark_null_call_site_location = (function devtools$hints$mark_null_call_site_location(file,line_number,column){
var content = devtools.hints.retrieve_javascript_source.call(null,file);
var lines = content.split("\n");
var line = devtools.hints.get_line.call(null,lines,line_number);
var marked_line = devtools.hints.mark_call_closed_at_column.call(null,line,column);
var min_length = (function (){var or__25130__auto__ = devtools.prefs.pref.call(null,new cljs.core.Keyword(null,"sanity-hint-min-length","sanity-hint-min-length",104958154));
if(cljs.core.truth_(or__25130__auto__)){
return or__25130__auto__;
} else {
return (128);
}
})();
return devtools.hints.extend_content.call(null,marked_line,lines,line_number,min_length);
});
devtools.hints.make_sense_of_the_error = (function devtools$hints$make_sense_of_the_error(message,file,line_number,column){
if(cljs.core.truth_(cljs.core.re_matches.call(null,/Cannot read property 'call' of.*/,message))){
return devtools.hints.mark_null_call_site_location.call(null,file,line_number,column);
} else {
return null;
}
});
devtools.hints.error_object_sense = (function devtools$hints$error_object_sense(error){
try{var native_stack_trace = error.stack;
var stack_trace = cljs.stacktrace.parse_stacktrace.call(null,cljs.core.PersistentArrayMap.EMPTY,native_stack_trace,new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"ua-product","ua-product",938384227),new cljs.core.Keyword(null,"chrome","chrome",1718738387)], null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"asset-root","asset-root",1771735072),""], null));
var top_item = cljs.core.second.call(null,stack_trace);
var map__42162 = top_item;
var map__42162__$1 = ((((!((map__42162 == null)))?((((map__42162.cljs$lang$protocol_mask$partition0$ & (64))) || (map__42162.cljs$core$ISeq$))?true:false):false))?cljs.core.apply.call(null,cljs.core.hash_map,map__42162):map__42162);
var file = cljs.core.get.call(null,map__42162__$1,new cljs.core.Keyword(null,"file","file",-1269645878));
var line = cljs.core.get.call(null,map__42162__$1,new cljs.core.Keyword(null,"line","line",212345235));
var column = cljs.core.get.call(null,map__42162__$1,new cljs.core.Keyword(null,"column","column",2078222095));
return devtools.hints.make_sense_of_the_error.call(null,error.message,file,line,column);
}catch (e42161){var _e = e42161;
return false;
}});
devtools.hints.type_error_to_string = (function devtools$hints$type_error_to_string(self){
var temp__4655__auto___42164 = devtools.hints.get_processed_errors_BANG_.call(null);
if(cljs.core.truth_(temp__4655__auto___42164)){
var seen_errors_42165 = temp__4655__auto___42164;
if(cljs.core.truth_(seen_errors_42165.has(self))){
} else {
seen_errors_42165.add(self);
var temp__4657__auto___42166 = devtools.hints.error_object_sense.call(null,self);
if(cljs.core.truth_(temp__4657__auto___42166)){
var sense_42167 = temp__4657__auto___42166;
self.message = [cljs.core.str(self.message),cljs.core.str(", a sanity hint:\n"),cljs.core.str(sense_42167)].join('');
} else {
}
}
} else {
}
return devtools.hints._STAR_original_type_error_prototype_to_string_STAR_.call(self);
});
devtools.hints.global_error_handler = (function devtools$hints$global_error_handler(message,url,line,column,error){
var res = (cljs.core.truth_(devtools.hints._STAR_original_global_error_handler_STAR_)?devtools.hints._STAR_original_global_error_handler_STAR_.call(null,message,url,line,column,error):null);
if(cljs.core.not.call(null,res)){
var temp__4657__auto__ = devtools.hints.error_object_sense.call(null,error);
if(cljs.core.truth_(temp__4657__auto__)){
var sense = temp__4657__auto__;
console.info("A sanity hint for incoming uncaught error:\n",sense);
return false;
} else {
return null;
}
} else {
return true;
}
});
devtools.hints.install_type_error_enhancer = (function devtools$hints$install_type_error_enhancer(){
devtools.hints._STAR_original_global_error_handler_STAR_ = window.onerror;
window.onerror = devtools.hints.global_error_handler;
var prototype = TypeError.prototype;
devtools.hints._STAR_original_type_error_prototype_to_string_STAR_ = prototype.toString;
return prototype.toString = ((function (prototype){
return (function (){
var self = this;
return devtools.hints.type_error_to_string.call(null,self);
});})(prototype))
;
});
devtools.hints.installed_QMARK_ = (function devtools$hints$installed_QMARK_(){
return devtools.hints._STAR_installed_STAR_;
});
devtools.hints.install_BANG_ = (function devtools$hints$install_BANG_(){
if(cljs.core.truth_(devtools.hints._STAR_installed_STAR_)){
return null;
} else {
devtools.hints._STAR_installed_STAR_ = true;
devtools.hints.install_type_error_enhancer.call(null);
return true;
}
});
devtools.hints.uninstall_BANG_ = (function devtools$hints$uninstall_BANG_(){
if(cljs.core.truth_(devtools.hints._STAR_installed_STAR_)){
devtools.hints._STAR_installed_STAR_ = false;
if(cljs.core.truth_(devtools.hints._STAR_original_type_error_prototype_to_string_STAR_)){
} else {
throw (new Error("Assert failed: *original-type-error-prototype-to-string*"));
}
window.onerror = devtools.hints._STAR_original_global_error_handler_STAR_;
var prototype = TypeError.prototype;
return prototype.toString = devtools.hints._STAR_original_type_error_prototype_to_string_STAR_;
} else {
return null;
}
});
//# sourceMappingURL=hints.js.map?rel=1603199213931

View file

@ -0,0 +1 @@
{"version":3,"file":"\/Users\/simon\/workspace\/swinging-needle-meter\/docs\/js\/compiled\/out\/devtools\/hints.js","sources":["hints.cljs?rel=1603199213932"],"lineCount":191,"mappings":";AAAA;;;;AAIA,kCAAA,lCAAgBA;AAAhB,AAAA;;AA0BA,uCAAA,vCAAeC;AACf,2DAAA,3DAAeC;AACf,qEAAA,rEAAeC;AAEf,AAAKC,kCAAiB,mCAAA,nCAACC;AAIvB,4CAAA,5CAAMC,gGAAuBC;AAA7B,AACE,OAACC,iCAAQJ,gCAAiBG;;AAE5B,4CAAA,5CAAME;AAAN,AACE,IAAAC,qBAAA,AAAAC,0BAAcP;AAAd,AAAA,oBAAAM;AAAA,UAAAA,NAASH;AAAT,AACEA;;AACA,GAAI,OAASK;AACX,OAACN,oDAAsB,KAAAM;;AADzB;;;;AAKJ,8BAAA,9BAAMC,oEAAcC;AAApB,AACE,GAAI,AAACC,iCAAOD;AAAZ;;AAAqBA;;;AAEvB,6BAAA,7BAAME,kEAAaC;AAAnB,AACE,IAAMC,MAAI,KAAAC;AAAV,AACE,SAAA,UAAA,nBAAOD,eAAUD;;AACjB,AAAOC;;AACP,OAACL,sCAAa,AAAgBK;;AAElC,4CAAA,5CAAME,gGAA4BC;AAAlC,AACE,IAAMC,SAAO,iBAAAC,oBAAI,8BAAA,9BAACC;AAAL,AAAA,oBAAAD;AAAAA;;AAAwBP;;;AAArC,AACE,OAACM,iBAAOD;;AAEZ,0BAAA,1BAAMI,4DAAUC,MAAMC;AAAtB,AACE,QAAMD,MAAM,eAAA,dAAKC;;AAEnB,gCAAA,hCAAMC,wEAAgBC,QAAQH,MAAMC,YAAYG;AAAhD,AACE,GAAI,CAAI,CAAG,AAACC,0BAAMF,WAASC,iBACnB,EAAK,eAAA,dAAMH;AACjBE;;AACA,IAAMG,mBAAiB,eAAA,dAAKL;IACtBM,YAAU,AAACR,kCAASC,MAAMM;IAC1BE,cAAY,wCAAA,zBAAKD,6CAAeJ;AAFtC,AAGE,OAACM,wCAAeD,YAAYR,MAAMM,iBAAiBF;;;AAEzD,4CAAA,5CAAMM,gGAA4BC,KAAKC;AAAvC,AACE,IAAMC,IAAE,UAAA,TAAKD;IACPE,SAAO,eAAA,fAAYH,mBAAOE;IAC1BE,UAAQ,AAAYJ,eAAKE;AAF\/B,AAGE,4CAAA,tBAAKC,oEAA4BC;;AAErC,8CAAA,9CAAMC,oGAA8BC,KAAKhB,YAAYW;AAArD,AACE,IAAMT,UAAQ,AAACT,oDAA2BuB;IACpCjB,QAAM,cAAA,dAAQG;IACdQ,OAAK,AAACZ,kCAASC,MAAMC;IACrBiB,cAAY,AAACR,oDAA2BC,KAAKC;IAC7CR,aAAW,iBAAAP,oBAAI,8BAAA,9BAACC;AAAL,AAAA,oBAAAD;AAAAA;;AAAA;;;AAJjB,AAKE,OAACK,wCAAegB,YAAYlB,MAAMC,YAAYG;;AAElD,yCAAA,zCAAMe,0FAAyBC,QAAQH,KAAKhB,YAAYW;AAAxD,AACE,oBACE,+BAAA,\/BAACS,kEAA+CD;AAAS,OAACJ,sDAA6BC,KAAKhB,YAAYW;;AAD1G,AAAA;;;;AAIF,oCAAA,pCAAMU,gFAAoBC;AAA1B,AACE,IAAA,AACE,IAAMM,qBAAmB,AAASN;IAC5BO,cAAY,2CAAA,sDAAA,2CAAA,gEAAA,iEAAA,2CAAA,iEAAA,zXAACC,8EAA+BF;IAC5CG,WAAS,AAACC,2BAAOH;IAFvBL,aAGiCO;IAHjCP,iBAAA,EAAA,EAAA,EAAA,CAAAA,cAAA,QAAA,EAAA,CAAA,CAAA,AAAAA,iDAAA,WAAA,AAAAA,6BAAA,KAAA,OAAA,QAAA,AAAAC,0BAAAC,mBAAAF,YAAAA;WAAA,AAAAG,wBAAAH,eAAA,9CAGcR;WAHd,AAAAW,wBAAAH,eAAA,9CAGmBd;aAHnB,AAAAiB,wBAAAH,eAAA,hDAGwBb;AAHxB,AAIE,OAACO,iDAAwB,AAAWI,cAAON,KAAKN,KAAKC;gBALzD,SAAAY,LAMkBU;AANlB,AAAA;;AAUF,sCAAA,tCAAMC,oFAAsBC;AAA5B,AACE,IAAApD,2BAAqB,AAACD;AAAtB,AAAA,oBAAAC;AAAA,wBAAAA,pBAASqD;AAAT,AACE,oBAAU,AAAMA,sBAAYD;AAA5B;AAAA,AACE,AAAMC,sBAAYD;;AAClB,IAAAE,2BAAiB,AAAChB,4CAAmBc;AAArC,AAAA,oBAAAE;AAAA,AAAA,kBAAAA,dAAWC;AAAX,AACE,AAAM,AAAWH,eAAM,2CAAA,5BAAK,AAAWA,gEAA2BG;;AADpE;;;AAHJ;;AAKA,OAAO9D,wEAA0C2D;;AAEnD,sCAAA,tCAAMI,oFAAsBpB,QAAQ7B,IAAIoB,KAAKC,OAAOW;AAApD,AACE,IAAMkB,MAAI,8KAAA,5JAAIjE,0DACF,AAACA,mEAAgC4C,QAAQ7B,IAAIoB,KAAKC,OAAOW;AADrE,AAEE,GAAA,AAAAmB,wBAAQD;AACN,IAAAH,qBAAiB,AAAChB,4CAAmBC;AAArC,AAAA,oBAAAe;AAAA,AAAA,YAAAA,RAAWC;AAAX,AACE,aAAA,bAAOI,4DAA0DJ;;AADnE;;AAAA;;;AADF;;;AAMJ,6CAAA,7CAAMK;AAAN,AACE,AAAMpE,2DAAgC,AAAWqE;;AACjD,AAAM,AAAWA,iBAAWL;;AAC5B,IAAMM,YAAU,AAAaC;AAA7B,AACE,AAAMtE,qEAA0C,AAAYqE;;AAC5D,4BAAA,rBAAM,AAAYA;;AAAlB,AAA8B,WAAA,PAASV;AAAT,AAAc,OAACD,8CAAqBC;;;;AAItE,kCAAA,lCAAMY;AAAN,AACEzE;;AAEF,+BAAA,\/BAAM0E;AAAN,AACE,oBAAU1E;AAAV;;AAAA,AACE,uCAAA,vCAAMA;;AACN,AAACqE;;AAFH;;;AAKF,iCAAA,jCAAMM;AAAN,AACE,oBAAM3E;AAAN,AACE,uCAAA,vCAAMA;;AACN,oBAAQE;AAAR;AAAA,AAAA,MAAA,KAAA0E,MAAA;;;AACA,AAAM,AAAWN,iBAAWrE;;AAC5B,IAAMsE,YAAU,AAAaC;AAA7B,AACE,OAAM,AAAYD,qBAAWrE;;AALjC","names":["devtools.hints\/available?","devtools.hints\/*installed*","devtools.hints\/*original-global-error-handler*","devtools.hints\/*original-type-error-prototype-to-string*","devtools.hints\/processed-errors","cljs.core\/volatile!","devtools.hints\/set-processed-errors!","val","cljs.core\/vreset!","devtools.hints\/get-processed-errors!","temp__4655__auto__","cljs.core\/deref","js\/WeakSet","devtools.hints\/empty-as-nil","str","cljs.core\/empty?","devtools.hints\/ajax-reader","url","xhr","js\/XMLHttpRequest","devtools.hints\/retrieve-javascript-source","where","reader","or__25130__auto__","devtools.prefs\/pref","devtools.hints\/get-line","lines","line-number","devtools.hints\/extend-content","content","min-length","cljs.core\/count","prev-line-number","prev-line","new-content","extend-content","devtools.hints\/mark-call-closed-at-column","line","column","n","prefix","postfix","devtools.hints\/mark-null-call-site-location","file","marked-line","devtools.hints\/make-sense-of-the-error","message","cljs.core\/re-matches","devtools.hints\/error-object-sense","error","e42161","map__42162","cljs.core\/apply","cljs.core\/hash-map","cljs.core\/get","native-stack-trace","stack-trace","cljs.stacktrace\/parse-stacktrace","top-item","cljs.core\/second","_e","devtools.hints\/type-error-to-string","self","seen-errors","temp__4657__auto__","sense","devtools.hints\/global-error-handler","res","cljs.core\/not","js\/console","devtools.hints\/install-type-error-enhancer","js\/window","prototype","js\/TypeError","devtools.hints\/installed?","devtools.hints\/install!","devtools.hints\/uninstall!","js\/Error"]}

View file

@ -0,0 +1,607 @@
(ns devtools.munging
"This namespace implements various heuristics to map Javascript names back to corresponding ClojureScript names.
The functionality here heavily depends on observed ClojureScript compiler and runtime behaviour (fragile!).
Answers given by functions in this namespace cannot be perfect because generated Javascript naming schemes produced by
ClojureScript compiler were not designed with easy reversibility in mind. We recommend this functionality to be used for
presentation in the UI only. The goal here is to provide user with more familiar view of runtime state of her app
in most common cases (on best effort basis).
Our main weapons in this uneven fight are:
1. munged function names as they appear in Javascript (generated by ClojureScript)
2. we can also analyze function sources accessible via .toString
3. special cljs$core$IFn$_invoke protocol props generated for multi-arity functions
We can also cheat and look at runtime state of browser environment to determine some answers about namespaces.
If you discovered breakage or a new case which should be covered by this code, please open an issue:
https://github.com/binaryage/cljs-devtools/issues"
(:refer-clojure :exclude [js-reserved?])
(:require-macros [devtools.munging :refer [get-fast-path-protocol-partitions-count
get-fast-path-protocols-lookup-table]])
(:require [clojure.string :as string]
[devtools.util :refer-macros [oget oset ocall safe-call]]
[goog.object :as gobj])
(:import [goog.string StringBuffer]))
(declare collect-fn-arities)
(def dollar-replacement "~﹩~")
(def max-fixed-arity-to-scan 64)
; -- helpers ----------------------------------------------------------------------------------------------------------------
(defn js-reserved? [x]
; js-reserved? is private for some reason
(ocall (oget js/window "cljs" "core") "js_reserved_QMARK_" x))
(defn get-fn-source-safely [f]
(try
(ocall f "toString")
(catch :default _
"")))
(defn get-fn-fixed-arity [f n]
(oget f (str "cljs$core$IFn$_invoke$arity$" n)))
(defn get-fn-variadic-arity [f]
(oget f (str "cljs$core$IFn$_invoke$arity$variadic")))
(defn get-fn-max-fixed-arity [f]
(oget f "cljs$lang$maxFixedArity"))
(defn get-type-name [t]
(let [sb (StringBuffer.)
writer (StringBufferWriter. sb)]
(try
; we cannot use (type->str f) because it does not work for defrecords as of v1.9.89
; instead we rely on .cljs$lang$ctorPrWriter which is defined for both deftypes and defrecords
; and it is used here: https://github.com/clojure/clojurescript/blob/cfbefad0b9f2ae9af92ebc2ec211c8472a884ddf/src/main/cljs/cljs/core.cljs#L9173
; relevant JIRA ticket: http://dev.clojure.org/jira/browse/CLJS-1725
(ocall t "cljs$lang$ctorPrWriter" t writer)
(catch :default _
"?"))
(-flush writer)
(str sb)))
(defn char-to-subscript
"Given a character with a single digit converts it into a subscript character.
Zero chracter maps to unicode 'SUBSCRIPT ZERO' (U+2080)."
[char]
{:pre [(string? char)
(= (count char) 1)]}
(let [char-code (ocall (js/String. char) "charCodeAt" 0) ; this is an ugly trick to overcome a V8? bug, char string might not be a real string "object"
num-code (- char-code 48)
subscript-code (+ 0x2080 num-code)]
(ocall js/String "fromCharCode" subscript-code)))
(defn make-subscript
"Given a subscript number converts it into a string representation consisting of unicode subscript characters (digits)."
[subscript]
{:pre [(number? subscript)]}
(string/join (map char-to-subscript (str subscript))))
(defn char-to-superscript
"Given a character with a single digit converts it into a superscript character.
Zero chracter maps to unicode 'SUPERSCRIPT ZERO' (U+2070)."
[char]
{:pre [(string? char)
(= (count char) 1)]}
(let [char-code (ocall (js/String. char) "charCodeAt" 0) ; this is an ugly trick to overcome a V8? bug, char string might not be a real string "object"
num-code (- char-code 48)
superscript-code (case num-code ; see https://en.wikipedia.org/wiki/Unicode_subscripts_and_superscripts
1 0x00B9
2 0x00B2
3 0x00B3
(+ 0x2070 num-code))]
(ocall js/String "fromCharCode" superscript-code)))
(defn make-superscript
"Given a superscript number converts it into a string representation consisting of unicode superscript characters (digits)."
[superscript]
{:pre [(number? superscript)]}
(string/join (map char-to-superscript (str superscript))))
; -- cljs naming conventions ------------------------------------------------------------------------------------------------
(defn cljs-fn-name?
"Given a Javascript name answers if the name was likely generated by ClojureScript.
We use a simple heuristic here:
The name must contain at least two separate dollars because we assume two-segment namespaces."
[munged-name]
(if (string? munged-name)
(some? (re-matches #"^[^$]*\$[^$]+\$.*$" munged-name))))
(defn parse-fn-source
"Given a function source code parses out [name args]. Note that both strings are still munged.
Suitable for further processing.
For exampe for input below the function will return [\"devtools_sample$core$hello\" \"name, unused_param\"]:
function devtools_sample$core$hello(name, unused_param){
return [cljs.core.str(\"hello, \"),cljs.core.str(name),cljs.core.str(\"!\")].join('');
}
"
[fn-source]
(if-let [meat (second (re-find #"function\s(.*?)\{" fn-source))]
(if-let [match (re-find #"(.*?)\((.*)\)" meat)]
(rest match))))
(defn trivial-fn-source? [fn-source]
{:pre [(string? fn-source)]}
(or (some? (re-matches #"function\s*\(\s*\)\s*\{\s*\}\s*" fn-source))
(some? (re-matches #"function.*\(\)\s*\{\s*\[native code\]\s*\}\s*" fn-source))))
(defn cljs-fn?
"Given a Javascript function object returns true if the function looks like a ClojureScript function.
Uses various heuristics:
1. must be fn? (is javascript function or satisfies Fn and IFn protocols)
2. and name must be cljs-fn-name? (name can come from f.name or parsed out of function source)
3. or if anonymous function, must be non-trivial"
[f]
(if (safe-call fn? false f) ; calling fn? on window object could throw for some weird reason
(let [name (oget f name)]
(if-not (empty? name)
(cljs-fn-name? name)
(let [fn-source (get-fn-source-safely f)]
(let [[name] (parse-fn-source fn-source)]
(if-not (empty? name)
(cljs-fn-name? name)
(not (trivial-fn-source? fn-source))))))))) ; we assume non-trivial anonymous functions to come from cljs
; -- demunging --------------------------------------------------------------------------------------------------------------
(defn dollar-preserving-demunge
"Standard cljs.core/demunge is too agresive in replacing dollars.
This wrapper function works around it by leaving dollars intact."
[munged-name]
(-> munged-name
(string/replace "$" dollar-replacement)
(demunge)
(string/replace dollar-replacement "$")))
(defn revert-reserved [s]
(or (if-let [m (re-matches #"(.*)\$" s)]
(if (js-reserved? (second m))
(second m)))
s))
(defn reserved-aware-demunge [munged-name]
(-> munged-name
(dollar-preserving-demunge)
(revert-reserved)))
(defn proper-demunge [munged-name]
(reserved-aware-demunge munged-name))
(defn proper-arg-demunge [munged-arg-name]
(-> munged-arg-name
(proper-demunge)
(string/replace #"^-(.*)$" "_$1"))) ; leading dash was probably a leading underscore (convention)
(defn proper-ns-demunge [munged-ns-name]
(-> munged-ns-name
(proper-demunge)
(string/replace "$" ".")))
(defn ns-exists? [ns-module-name]
{:pre [(string? ns-module-name)]}
(if-let [goog-namespaces (oget js/window "goog" "dependencies_" "nameToPath")]
(some? (oget goog-namespaces ns-module-name))))
(defn detect-namespace-prefix
"Given a name broken into namespace parts returns [detected-ns remaining-parts],
where detected-ns is a string representing longest detected existing namespace and
remaining-parts is a vector of remaing input parts not included in the detected-ns concatenation.
For given input [\"cljs\" \"core\" \"first\"] returns [\"cljs.core\" [\"first\"]] (asumming cljs.core exists)"
[tokens & [ns-detector]]
(let [effective-detector (or ns-detector ns-exists?)]
(loop [name-tokens []
remaining-tokens tokens]
(if (empty? remaining-tokens)
["" name-tokens]
(let [ns-name (string/join "." remaining-tokens)]
(if (effective-detector ns-name)
[ns-name name-tokens]
(recur (concat [(last remaining-tokens)] name-tokens) (butlast remaining-tokens))))))))
(defn normalize-arity [arity-tokens]
(if-not (empty? arity-tokens)
(let [arity (first arity-tokens)]
(case arity
"variadic" arity
(ocall js/window "parseInt" arity 10)))))
(defn strip-arity [tokens]
(let [[prefix-tokens arity-tokens] (split-with #(not= % "arity") tokens)]
[prefix-tokens (normalize-arity (rest arity-tokens))]))
(defn parse-protocol [tokens detector]
(loop [remaining-tokens tokens
name-tokens []]
(if (empty? remaining-tokens)
[name-tokens]
(let [[protocol-ns name-and-method-tokens] (detect-namespace-prefix remaining-tokens detector)]
(if (empty? protocol-ns)
(recur (rest remaining-tokens) (conj name-tokens (first remaining-tokens)))
[name-tokens protocol-ns (first name-and-method-tokens) (rest name-and-method-tokens)]))))) ; we assume protocol names are always a single-token
(defn break-munged-name
"Given a munged-name from Javascript lands attempts to break it into:
[fn-ns fn-name protocol-ns protocol-name protocol-method arity].
Protocol and arity elements are optional. Function elements are always present or \"\".
examples for input:
cljs$core$rest => ['cljs.core', 'rest']
cljs.core.reduce$cljs$core$IFn$_invoke$arity$3 => ['cljs.core' 'reduce' 'cljs.core' 'IFn' '_invoke' 3]"
([munged-name]
(break-munged-name munged-name nil))
([munged-name ns-detector]
(if (empty? munged-name)
["" ""]
(let [effective-detector (or ns-detector ns-exists?)
tokens (vec (.split munged-name #"[$.]"))
[tokens arity] (strip-arity tokens)
[fn-ns tokens] (detect-namespace-prefix tokens effective-detector)
; remianing parts contains function name,
; but may be optionally followed by protocol namespace, protocol name and protocol method
[fn-name-tokens protocol-ns protocol-name protocol-method-tokens] (parse-protocol tokens effective-detector)
fn-name (string/join "$" fn-name-tokens)
protocol-method (if protocol-method-tokens (string/join "$" protocol-method-tokens))]
[fn-ns fn-name protocol-ns protocol-name protocol-method arity]))))
(defn break-and-demunge-name
"Given a munged-name from Javascript lands attempts to break it into a namespace part and remaining short name.
Then applies appropriate demunging on them and returns ClojureScript versions of the names."
([munged-name]
(break-and-demunge-name munged-name nil))
([munged-name ns-detector]
(let [result (break-munged-name munged-name ns-detector)
[munged-ns munged-name munged-protocol-ns munged-protocol-name munged-protocol-method arity] result]
[(proper-ns-demunge munged-ns)
(proper-demunge munged-name)
(if munged-protocol-ns (proper-ns-demunge munged-protocol-ns))
(if munged-protocol-name (proper-demunge munged-protocol-name))
(if munged-protocol-method (proper-demunge munged-protocol-method))
arity])))
; -- fn info ----------------------------------------------------------------------------------------------------------------
(defn parse-fn-source-info
"Given function source code tries to retrieve [ns name & args] on best effort basis, where
ns is demunged namespace part of the function name (or \"\" if namespace cannot be detected)
name is demunged short name (or \"\" if function is anonymous or name cannot be retrieved)
args is optional number of demunged argument names.
Please note that this function always returns a vector with something. In worst cases [\"\" \"\"].
"
[fn-source]
(if-let [[munged-name args] (parse-fn-source fn-source)]
(let [[ns name] (break-and-demunge-name munged-name)
demunged-args (map (comp proper-arg-demunge string/trim) (string/split args #","))]
(concat [ns name] demunged-args))
["" ""]))
(defn parse-fn-info
"Given Javascript function object tries to retrieve [ns name & args] as in parse-fn-source-info (on best effort basis)."
[f]
(let [fn-source (get-fn-source-safely f)]
(parse-fn-source-info fn-source)))
(defn parse-fn-info-deep
"Given a Javascript function object tries to retrieve [ns name & args] as in parse-fn-info (on best effort basis).
The difference from parse-fn-info is that this function prefers to read args from arities if available.
It recurses arbitrary deep following IFn protocol leads.
If we hit multi-arity situation in leaf, we don't attempt to list arguments and return ::multi-arity placeholder instead.
The reason for reading arities is that it gives more accurate parameter names in some cases.
We observed that variadic functions don't always contain original parameter names, but individual IFn arity functions do."
[f]
(let [fn-info (parse-fn-info f)
arities (collect-fn-arities f)]
(if (some? arities)
(if (> (count arities) 1)
(concat (take 2 fn-info) ::multi-arity)
(concat (take 2 fn-info) (drop 2 (parse-fn-info-deep (second (first arities))))))
fn-info)))
; -- support for human-readable names ---------------------------------------------------------------------------------------
(defn find-index-of-human-prefix
"Given a demunged ClojureScript parameter name. Tries to detect human readable part and returns the index where it ends.
Returns nil if no prefix can be detected.
The idea is to convert macro-generated parameters and other generated names to more friendly names.
We observed that param names generated by gensym have prefix followed by big numbers.
Other generated names contain two dashes after prefix (originally probably using underscores)."
[name]
(let [sep-start (.indexOf name "--")
num-prefix (count (second (re-find #"(.*?)\d{2,}" name)))
finds (filter pos? [sep-start num-prefix])]
(if-not (empty? finds)
(apply min finds))))
(defn humanize-name
"Given a name and intermediate state. Convert name to a human readable version by keeping human readable prefix with
optional subscribt postfix and store it in ::result. Subscript number is picked based on state. State keeps track of
previously assigned subscripts. Returns a new state."
[state name]
(let [index (find-index-of-human-prefix name)
prefix (if (> index 0) (.substring name 0 index) name)]
(if-let [subscript (get state prefix)]
(-> state
(update ::result conj (str prefix (make-subscript subscript)))
(update prefix inc))
(-> state
(update ::result conj prefix)
(assoc prefix 2)))))
(defn humanize-names
"Given a list of names, returns a list of human-readable versions of those names.
It detects human-readable prefix using a simple heuristics. When names repeat it assigns simple subscripts starting with 2.
Subscripts are assigned left-to-right.
Given [\"p--a\" \"p--b\" \"x\" \"p--c\"] returns [\"p\" \"p₂\" \"x\" \"p₃\"]"
[names]
(with-meta (::result (reduce humanize-name {::result []} names)) (meta names)))
; -- arities ----------------------------------------------------------------------------------------------------------------
(defn collect-fn-fixed-arities [f max-arity]
(loop [arity 0
collection {}]
(if (> arity max-arity)
collection
(recur (inc arity) (if-let [arity-fn (get-fn-fixed-arity f arity)]
(assoc collection arity arity-fn)
collection)))))
(defn collect-fn-variadic-arities [f]
(if-let [variadic-arity (get-fn-variadic-arity f)]
{::variadic variadic-arity}))
(defn review-arity [[arity arity-fn]]
(let [sub-arities (collect-fn-arities arity-fn)]
(if (::variadic sub-arities)
[::variadic arity-fn]
[arity arity-fn])))
(defn review-arities
"Some arities can be marked as fixed arity but in fact point to a variadic-arity function. We want to detect this case
and turn such improperly categorized arities to ::variadic."
[arities]
(if (::variadic arities)
arities
(into {} (map review-arity arities))))
(defn collect-fn-arities
"Given a Javascript function object, tries to inspect known arity properties generated by ClojureScript compiler and
collects all available arity functions into a map. Arities are keyed by arity count and variadic arity gets ::variadic key."
[f]
(let [max-fixed-arity (get-fn-max-fixed-arity f)
fixed-arities (collect-fn-fixed-arities f (or max-fixed-arity max-fixed-arity-to-scan)) ; we cannot rely on cljs$lang$maxFixedArity when people implement IFn protocol by hand
variadic-arities (collect-fn-variadic-arities f)
arities (review-arities (merge fixed-arities variadic-arities))]
(if-not (empty? arities)
arities)))
; -- args lists -------------------------------------------------------------------------------------------------------------
(defn arity-keywords-comparator
"::variadic goes last, other keywords compare by name."
[x y]
(cond
(= ::variadic x) 1
(= ::variadic y) -1
:else (compare (name x) (name y))))
(defn arities-key-comparator
"numbers go first (ordered), then keywords (ordered by name), and then ::variadic sticks last"
[x y]
(let [kx? (keyword? x)
ky? (keyword? y)]
(cond
(and kx? ky?) (arity-keywords-comparator x y)
kx? 1
ky? -1
:else (compare x y))))
(defn arities-to-args-lists*
[arities]
(let [sorted-keys (sort arities-key-comparator (keys arities))
sorted-fns (map #(get arities %) sorted-keys)
sorted-infos (map parse-fn-info-deep sorted-fns)
sorted-args-lists (map #(drop 2 %) sorted-infos)]
(if (= (last sorted-keys) ::variadic)
(concat (butlast sorted-args-lists) [(vary-meta (last sorted-args-lists) assoc ::variadic true)])
sorted-args-lists)))
(defn arities-to-args-lists
"Given a map of arity functions. Tries to parse individual functions and prepare an arguments list for each arity.
Returned list of arguments list is sorted by arity count, variadic arity goes last if available.
The function also optionally humanizes argument names in each arguments list if requested."
[arities & [humanize?]]
(let [args-lists (arities-to-args-lists* arities)]
(if humanize?
(map humanize-names args-lists)
args-lists)))
; -- UI presentation --------------------------------------------------------------------------------------------------------
(defn args-lists-to-strings
"Converts a list of arguments lists into a list of strings suitable for UI presentation."
[args-lists spacer-symbol multi-arity-symbol rest-symbol]
(let [string-mapper (fn [arg]
(case arg
::multi-arity multi-arity-symbol
arg))
printer (fn [args-list]
(let [variadic? (::variadic (meta args-list))
args-strings (map string-mapper args-list)]
(str (string/join spacer-symbol (butlast args-strings))
(if variadic? rest-symbol spacer-symbol)
(last args-strings))))]
(->> args-lists
(map printer)
(map string/trim))))
(defn extract-arities [f humanize? spacer-symbol multi-arity-symbol rest-symbol]
(-> (or (collect-fn-arities f) {:naked f})
(arities-to-args-lists humanize?)
(args-lists-to-strings spacer-symbol multi-arity-symbol rest-symbol)))
(defn common-protocol? [protocol-ns protocol-name]
(and (= protocol-ns "cljs.core")
(= protocol-name "IFn")))
(defn present-fn-part [fn-ns fn-name include-ns?]
(str
(if (and include-ns? (not (empty? fn-ns))) (str fn-ns "/"))
fn-name))
(defn present-protocol-part [protocol-ns protocol-name protocol-method include-protocol-ns?]
(str (if include-protocol-ns? protocol-ns)
(if-not (empty? protocol-name) (str (if include-protocol-ns? ".") protocol-name))
(if-not (empty? protocol-method) (str (if (or include-protocol-ns? (not (empty? protocol-name))) ":")
protocol-method))))
(defn present-function-name
"Given javascript function name tries to present it as plain string for display in UI on best effort basis."
[munged-name options]
(let [{:keys [include-ns? include-protocol-ns? silence-common-protocols? ns-detector]} options
[fn-ns fn-name protocol-ns protocol-name protocol-method arity] (break-and-demunge-name munged-name ns-detector)
arity-str (if (some? arity)
(if (= arity "variadic")
"\u207F" ; 'SUPERSCRIPT LATIN SMALL LETTER N' (U+207F)
(make-superscript arity)))]
(if (empty? fn-name)
munged-name
(let [fn-part (present-fn-part fn-ns fn-name include-ns?)
protocol-part (if (and protocol-ns
(not (and silence-common-protocols?
(common-protocol? protocol-ns protocol-name))))
(present-protocol-part protocol-ns protocol-name protocol-method include-protocol-ns?))]
(str
(or protocol-part fn-part)
arity-str
(if protocol-part (str " (" fn-part ")")))))))
; -- types ------------------------------------------------------------------------------------------------------------------
(defn get-basis [f]
(ocall f "getBasis"))
(defn parse-constructor-info
"Given a Javascript constructor function tries to retrieve [ns name basis]. Returns nil if not a cljs type."
[f]
(if (and (goog/isObject f) (oget f "cljs$lang$type"))
(let [type-name (get-type-name f)
parts (.split type-name #"/")
basis (safe-call get-basis [] f)]
(assert (<= (count parts) 2))
(while (< (count parts) 2)
(.unshift parts nil))
(conj (vec parts) basis))))
; -- protocols --------------------------------------------------------------------------------------------------------------
(defn protocol-path [protocol-selector]
(string/split protocol-selector #"\."))
(defn get-protocol-object [protocol-selector]
(loop [obj js/window
path (protocol-path protocol-selector)]
(if (empty? path)
obj
(if (goog/isObject obj)
(recur (oget obj (first path)) (rest path))))))
(defn protocol-exists? [protocol-selector]
(some? (get-protocol-object protocol-selector)))
(defn get-protocol-selector [key]
(if-let [m (re-matches #"(.*)\$$" key)]
(if-not (string/includes? key "cljs$lang$protocol_mask$partition")
(let [protocol-selector (string/replace (second m) "$" ".")]
(if (protocol-exists? protocol-selector)
protocol-selector)))))
(defn demunge-protocol-selector [protocol-selector]
(let [parts (map proper-demunge (protocol-path protocol-selector))
_ (assert (>= (count parts) 2)
(str "expected protocol selector to contain at least one dot: '" protocol-selector "'"))
ns (string/join "." (butlast parts))
name (last parts)]
[ns name protocol-selector]))
(def fast-path-protocols-lookup-table (get-fast-path-protocols-lookup-table))
(defn key-for-protocol-partition [partition]
(str "cljs$lang$protocol_mask$partition" partition "$"))
(defn scan-fast-path-protocols-partition [obj partition]
{:pre [(number? partition)]}
(let [partition-key (key-for-protocol-partition partition)
partition-bits (or (oget obj partition-key) 0)]
(if (> partition-bits 0)
(let [lookup-table (get fast-path-protocols-lookup-table partition)
_ (assert (map? lookup-table)
(str "fast-path-protocols-lookup-table does not contain lookup table for partition " partition))
* (fn [accum [bit protocol]]
(if (zero? (bit-and partition-bits bit))
accum
(conj accum protocol)))]
(reduce * [] lookup-table)))))
(defn scan-fast-path-protocols [obj]
(apply concat (map (partial scan-fast-path-protocols-partition obj) (range (get-fast-path-protocol-partitions-count)))))
(defn scan-slow-path-protocols [obj]
(let [keys (gobj/getKeys obj)
selectors (keep get-protocol-selector keys)]
(map demunge-protocol-selector selectors)))
(defn make-protocol-descriptor [ns name selector fast?]
{:ns ns
:name name
:selector selector
:fast? fast?})
(defn convert-to-protocol-descriptor [fast? [ns name selector]]
(make-protocol-descriptor ns name selector fast?))
(defn protocol-descriptors-comparator [a b]
(compare (:name a) (:name b)))
(defn scan-protocols [obj]
(let [fast-path-protocols (map (partial convert-to-protocol-descriptor true) (scan-fast-path-protocols obj))
slow-path-protocols (map (partial convert-to-protocol-descriptor false) (scan-slow-path-protocols obj))
all-protocols (concat fast-path-protocols slow-path-protocols)]
(sort protocol-descriptors-comparator all-protocols)))
(defn collect-protocol-methods [obj protocol-selector]
(let [key-prefix (string/replace protocol-selector #"\." "\\$")
pattern (re-pattern (str "^" key-prefix "\\$(.*)\\$arity\\$(\\d+)$"))
all-keys (gobj/getKeys obj)
matches (keep (partial re-matches pattern) all-keys)
methods (group-by second matches)
match-to-arity (fn [match]
(let [arity (nth match 2)]
(ocall js/window "parseInt" arity 10)))
match-arity-comparator (fn [a b]
(compare (match-to-arity a) (match-to-arity b)))
post-process (fn [[munged-name matches]]
(let [name (proper-demunge munged-name)
sorted-matches (sort match-arity-comparator matches)
sorted-fns (map #(oget obj (first %)) sorted-matches)]
[name sorted-fns]))
by-name-comparator (fn [a b]
(compare (first a) (first b)))]
; TODO: he we could be able to retrieve parameter lists from protocol definition methods
; parameter names there are usually more consistent than parameters picked by protocol implementors
(sort by-name-comparator (map post-process methods))))

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,23 @@
(ns devtools.prefs
(:require [devtools.defaults :as defaults]))
(def ^:dynamic *prefs* defaults/prefs)
(defn get-prefs []
*prefs*)
(defn pref [key]
(key *prefs*))
(defn set-prefs! [new-prefs]
(set! *prefs* new-prefs))
(defn set-pref! [key val]
(set-prefs! (assoc (get-prefs) key val)))
(defn merge-prefs! [m]
(set-prefs! (merge (get-prefs) m)))
(defn update-pref! [key f & args]
(let [new-val (apply f (pref key) args)]
(set-pref! key new-val)))

View file

@ -0,0 +1 @@
{:rename-macros {}, :renames {}, :use-macros {}, :excludes #{}, :name devtools.prefs, :imports nil, :requires {defaults devtools.defaults, devtools.defaults devtools.defaults}, :uses nil, :defs {*prefs* {:name devtools.prefs/*prefs*, :file "docs/js/compiled/out/devtools/prefs.cljs", :line 4, :column 1, :end-line 4, :end-column 23, :dynamic true, :meta {:file "/Users/simon/workspace/swinging-needle-meter/docs/js/compiled/out/devtools/prefs.cljs", :line 4, :column 16, :end-line 4, :end-column 23, :dynamic true}}, get-prefs {:protocol-inline nil, :meta {:file "/Users/simon/workspace/swinging-needle-meter/docs/js/compiled/out/devtools/prefs.cljs", :line 6, :column 7, :end-line 6, :end-column 16, :arglists (quote ([]))}, :name devtools.prefs/get-prefs, :variadic false, :file "docs/js/compiled/out/devtools/prefs.cljs", :end-column 16, :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 6, :end-line 6, :max-fixed-arity 0, :fn-var true, :arglists (quote ([]))}, pref {:protocol-inline nil, :meta {:file "/Users/simon/workspace/swinging-needle-meter/docs/js/compiled/out/devtools/prefs.cljs", :line 9, :column 7, :end-line 9, :end-column 11, :arglists (quote ([key]))}, :name devtools.prefs/pref, :variadic false, :file "docs/js/compiled/out/devtools/prefs.cljs", :end-column 11, :method-params ([key]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 9, :end-line 9, :max-fixed-arity 1, :fn-var true, :arglists (quote ([key]))}, set-prefs! {:protocol-inline nil, :meta {:file "/Users/simon/workspace/swinging-needle-meter/docs/js/compiled/out/devtools/prefs.cljs", :line 12, :column 7, :end-line 12, :end-column 17, :arglists (quote ([new-prefs]))}, :name devtools.prefs/set-prefs!, :variadic false, :file "docs/js/compiled/out/devtools/prefs.cljs", :end-column 17, :method-params ([new-prefs]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 12, :end-line 12, :max-fixed-arity 1, :fn-var true, :arglists (quote ([new-prefs]))}, set-pref! {:protocol-inline nil, :meta {:file "/Users/simon/workspace/swinging-needle-meter/docs/js/compiled/out/devtools/prefs.cljs", :line 15, :column 7, :end-line 15, :end-column 16, :arglists (quote ([key val]))}, :name devtools.prefs/set-pref!, :variadic false, :file "docs/js/compiled/out/devtools/prefs.cljs", :end-column 16, :method-params ([key val]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 15, :end-line 15, :max-fixed-arity 2, :fn-var true, :arglists (quote ([key val]))}, merge-prefs! {:protocol-inline nil, :meta {:file "/Users/simon/workspace/swinging-needle-meter/docs/js/compiled/out/devtools/prefs.cljs", :line 18, :column 7, :end-line 18, :end-column 19, :arglists (quote ([m]))}, :name devtools.prefs/merge-prefs!, :variadic false, :file "docs/js/compiled/out/devtools/prefs.cljs", :end-column 19, :method-params ([m]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 18, :end-line 18, :max-fixed-arity 1, :fn-var true, :arglists (quote ([m]))}, update-pref! {:protocol-inline nil, :meta {:file "/Users/simon/workspace/swinging-needle-meter/docs/js/compiled/out/devtools/prefs.cljs", :line 21, :column 7, :end-line 21, :end-column 19, :arglists (quote ([key f & args])), :top-fn {:variadic true, :max-fixed-arity 2, :method-params [(key f args)], :arglists ([key f & args]), :arglists-meta (nil)}}, :name devtools.prefs/update-pref!, :variadic true, :file "docs/js/compiled/out/devtools/prefs.cljs", :end-column 19, :top-fn {:variadic true, :max-fixed-arity 2, :method-params [(key f args)], :arglists ([key f & args]), :arglists-meta (nil)}, :method-params [(key f args)], :protocol-impl nil, :arglists-meta (nil), :column 1, :line 21, :end-line 21, :max-fixed-arity 2, :fn-var true, :arglists ([key f & args])}}, :require-macros {defaults devtools.defaults, devtools.defaults devtools.defaults}, :doc nil}

View file

@ -0,0 +1,57 @@
// Compiled by ClojureScript 1.9.229 {}
goog.provide('devtools.prefs');
goog.require('cljs.core');
goog.require('devtools.defaults');
devtools.prefs._STAR_prefs_STAR_ = devtools.defaults.prefs;
devtools.prefs.get_prefs = (function devtools$prefs$get_prefs(){
return devtools.prefs._STAR_prefs_STAR_;
});
devtools.prefs.pref = (function devtools$prefs$pref(key){
return key.call(null,devtools.prefs._STAR_prefs_STAR_);
});
devtools.prefs.set_prefs_BANG_ = (function devtools$prefs$set_prefs_BANG_(new_prefs){
return devtools.prefs._STAR_prefs_STAR_ = new_prefs;
});
devtools.prefs.set_pref_BANG_ = (function devtools$prefs$set_pref_BANG_(key,val){
return devtools.prefs.set_prefs_BANG_.call(null,cljs.core.assoc.call(null,devtools.prefs.get_prefs.call(null),key,val));
});
devtools.prefs.merge_prefs_BANG_ = (function devtools$prefs$merge_prefs_BANG_(m){
return devtools.prefs.set_prefs_BANG_.call(null,cljs.core.merge.call(null,devtools.prefs.get_prefs.call(null),m));
});
devtools.prefs.update_pref_BANG_ = (function devtools$prefs$update_pref_BANG_(var_args){
var args__26212__auto__ = [];
var len__26205__auto___41036 = arguments.length;
var i__26206__auto___41037 = (0);
while(true){
if((i__26206__auto___41037 < len__26205__auto___41036)){
args__26212__auto__.push((arguments[i__26206__auto___41037]));
var G__41038 = (i__26206__auto___41037 + (1));
i__26206__auto___41037 = G__41038;
continue;
} else {
}
break;
}
var argseq__26213__auto__ = ((((2) < args__26212__auto__.length))?(new cljs.core.IndexedSeq(args__26212__auto__.slice((2)),(0),null)):null);
return devtools.prefs.update_pref_BANG_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__26213__auto__);
});
devtools.prefs.update_pref_BANG_.cljs$core$IFn$_invoke$arity$variadic = (function (key,f,args){
var new_val = cljs.core.apply.call(null,f,devtools.prefs.pref.call(null,key),args);
return devtools.prefs.set_pref_BANG_.call(null,key,new_val);
});
devtools.prefs.update_pref_BANG_.cljs$lang$maxFixedArity = (2);
devtools.prefs.update_pref_BANG_.cljs$lang$applyTo = (function (seq41033){
var G__41034 = cljs.core.first.call(null,seq41033);
var seq41033__$1 = cljs.core.next.call(null,seq41033);
var G__41035 = cljs.core.first.call(null,seq41033__$1);
var seq41033__$2 = cljs.core.next.call(null,seq41033__$1);
return devtools.prefs.update_pref_BANG_.cljs$core$IFn$_invoke$arity$variadic(G__41034,G__41035,seq41033__$2);
});
//# sourceMappingURL=prefs.js.map?rel=1603199211164

View file

@ -0,0 +1 @@
{"version":3,"file":"\/Users\/simon\/workspace\/swinging-needle-meter\/docs\/js\/compiled\/out\/devtools\/prefs.js","sources":["prefs.cljs?rel=1603199211164"],"lineCount":57,"mappings":";AAAA;;;AAGA,AAAeA,mCAAQC;AAEvB,2BAAA,3BAAMC;AAAN,AACEF;;AAEF,sBAAA,tBAAMG,oDAAMC;AAAZ,AACE,OAACA,cAAIJ;;AAEP,iCAAA,jCAAMK,0EAAYC;AAAlB,AACE,OAAMN,mCAAQM;;AAEhB,gCAAA,hCAAMC,wEAAWH,IAAII;AAArB,AACE,OAACH,yCAAW,AAACI,0BAAM,AAACP,oCAAWE,IAAII;;AAErC,mCAAA,nCAAME,8EAAcC;AAApB,AACE,OAACN,yCAAW,AAACO,0BAAM,AAACV,oCAAWS;;AAEjC,AAAA,mCAAA,2CAAAE,9EAAMM;AAAN,AAAA,IAAAL,sBAAA;AAAA,AAAA,IAAAC,2BAAA,AAAA;AAAA,AAAA,IAAAC,yBAAA;;AAAA,AAAA,GAAA,CAAAA,yBAAAD;AAAA,AAAA,AAAAD,yBAAA,CAAA,UAAAE;;AAAA,eAAA,CAAAA,yBAAA;;;;AAAA;;;;AAAA,IAAAC,wBAAA,EAAA,CAAA,MAAA,AAAAH,6BAAA,AAAA,KAAAI,qBAAA,AAAAJ,0BAAA,KAAA,IAAA,OAAA;AAAA,AAAA,OAAAK,sEAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAAF;;;AAAA,AAAA,AAAA,AAAAE,wEAAA,WAAoBf,IAAIqB,EAAIC;AAA5B,AACE,IAAMC,UAAQ,AAACC,0BAAMH,EAAE,AAACtB,8BAAKC,KAAKsB;AAAlC,AACE,OAACnB,wCAAUH,IAAIuB;;;AAFnB,AAAA,AAAAR,2DAAA;;AAAA,AAAA,AAAAA,qDAAA,WAAAC;AAAA,AAAA,IAAAC,WAAA,AAAAC,0BAAAF;IAAAA,eAAA,AAAAG,yBAAAH;IAAAI,WAAA,AAAAF,0BAAAF;IAAAA,eAAA,AAAAG,yBAAAH;AAAA,AAAA,OAAAD,sEAAAE,SAAAG,SAAAJ;;;AAAA","names":["devtools.prefs\/*prefs*","devtools.defaults\/prefs","devtools.prefs\/get-prefs","devtools.prefs\/pref","key","devtools.prefs\/set-prefs!","new-prefs","devtools.prefs\/set-pref!","val","cljs.core\/assoc","devtools.prefs\/merge-prefs!","m","cljs.core\/merge","var_args","args__26212__auto__","len__26205__auto__","i__26206__auto__","argseq__26213__auto__","cljs.core\/IndexedSeq","devtools.prefs\/update-pref!","seq41033","G__41034","cljs.core\/first","cljs.core\/next","G__41035","f","args","new-val","cljs.core\/apply"]}

View file

@ -0,0 +1,16 @@
(ns devtools.preload
(:require-macros [devtools.preload :refer [gen-config]])
(:require [devtools.prefs :as prefs]
[devtools.core :as core]))
; this namespace is intended to be included in cljs compiler :preloads
; overrides for default configuration can be specified in :external-config > :devtools/config
; see https://github.com/binaryage/cljs-devtools/blob/master/docs/installation.md#install-it-via-preloads
; https://github.com/binaryage/cljs-devtools/blob/master/docs/configuration.md#configuration-via-preloads
(def config (gen-config))
(prefs/merge-prefs! config)
(if-not (prefs/pref :suppress-preload-install)
(core/install!))

View file

@ -0,0 +1 @@
{:rename-macros {}, :renames {}, :use-macros {gen-config devtools.preload}, :excludes #{}, :name devtools.preload, :imports nil, :requires {prefs devtools.prefs, devtools.prefs devtools.prefs, core devtools.core, devtools.core devtools.core}, :uses nil, :defs {config {:name devtools.preload/config, :file "docs/js/compiled/out/devtools/preload.cljs", :line 11, :column 1, :end-line 11, :end-column 12, :meta {:file "/Users/simon/workspace/swinging-needle-meter/docs/js/compiled/out/devtools/preload.cljs", :line 11, :column 6, :end-line 11, :end-column 12}}}, :require-macros {devtools.preload devtools.preload}, :cljs.analyzer/constants {:seen #{:suppress-preload-install :all :features-to-install}, :order [:features-to-install :all :suppress-preload-install]}, :doc nil}

View file

@ -0,0 +1,13 @@
// Compiled by ClojureScript 1.9.229 {}
goog.provide('devtools.preload');
goog.require('cljs.core');
goog.require('devtools.prefs');
goog.require('devtools.core');
devtools.preload.config = new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"features-to-install","features-to-install",102899261),new cljs.core.Keyword(null,"all","all",892129742)], null);
devtools.prefs.merge_prefs_BANG_.call(null,devtools.preload.config);
if(cljs.core.not.call(null,devtools.prefs.pref.call(null,new cljs.core.Keyword(null,"suppress-preload-install","suppress-preload-install",1724845090)))){
devtools.core.install_BANG_.call(null);
} else {
}
//# sourceMappingURL=preload.js.map?rel=1603199214053

View file

@ -0,0 +1 @@
{"version":3,"file":"\/Users\/simon\/workspace\/swinging-needle-meter\/docs\/js\/compiled\/out\/devtools\/preload.js","sources":["preload.cljs?rel=1603199214054"],"lineCount":13,"mappings":";AAAA;;;;AAUA,AAAKA,0BAAO,2CAAA,kFAAA;AAEZ,AAACC,2CAAmBD;AAEpB,GAAA,AAAAE,wBAAQ,8BAAA,9BAACC;AACP,AAACC;;AADH","names":["devtools.preload\/config","devtools.prefs\/merge-prefs!","cljs.core\/not","devtools.prefs\/pref","devtools.core\/install!"]}

View file

@ -0,0 +1,15 @@
(ns devtools.protocols)
(defprotocol ITemplate
"Marker protocol indicating a devtools template.")
(defprotocol IGroup
"Marker protocol indicating a devtools group.")
(defprotocol ISurrogate
"Marker protocol indicating a devtools surrogate object.")
(defprotocol IFormat
(-header [value])
(-has-body [value])
(-body [value]))

View file

@ -0,0 +1 @@
{:rename-macros {}, :renames {}, :use-macros {}, :excludes #{}, :name devtools.protocols, :imports nil, :requires nil, :uses nil, :defs {ITemplate {:meta {:file "/Users/simon/workspace/swinging-needle-meter/docs/js/compiled/out/devtools/protocols.cljs", :line 3, :column 14, :end-line 3, :end-column 23, :doc "Marker protocol indicating a devtools template.", :protocol-symbol true, :jsdoc ("@interface"), :protocol-info {:methods {}}}, :protocol-symbol true, :name devtools.protocols/ITemplate, :file "docs/js/compiled/out/devtools/protocols.cljs", :end-column 23, :column 1, :line 3, :protocol-info {:methods {}}, :info nil, :end-line 3, :impls #{}, :doc "Marker protocol indicating a devtools template.", :jsdoc ("@interface")}, IGroup {:meta {:file "/Users/simon/workspace/swinging-needle-meter/docs/js/compiled/out/devtools/protocols.cljs", :line 6, :column 14, :end-line 6, :end-column 20, :doc "Marker protocol indicating a devtools group.", :protocol-symbol true, :jsdoc ("@interface"), :protocol-info {:methods {}}}, :protocol-symbol true, :name devtools.protocols/IGroup, :file "docs/js/compiled/out/devtools/protocols.cljs", :end-column 20, :column 1, :line 6, :protocol-info {:methods {}}, :info nil, :end-line 6, :impls #{}, :doc "Marker protocol indicating a devtools group.", :jsdoc ("@interface")}, ISurrogate {:meta {:file "/Users/simon/workspace/swinging-needle-meter/docs/js/compiled/out/devtools/protocols.cljs", :line 9, :column 14, :end-line 9, :end-column 24, :doc "Marker protocol indicating a devtools surrogate object.", :protocol-symbol true, :jsdoc ("@interface"), :protocol-info {:methods {}}}, :protocol-symbol true, :name devtools.protocols/ISurrogate, :file "docs/js/compiled/out/devtools/protocols.cljs", :end-column 24, :column 1, :line 9, :protocol-info {:methods {}}, :info nil, :end-line 9, :impls #{}, :doc "Marker protocol indicating a devtools surrogate object.", :jsdoc ("@interface")}, IFormat {:meta {:file "/Users/simon/workspace/swinging-needle-meter/docs/js/compiled/out/devtools/protocols.cljs", :line 12, :column 14, :end-line 12, :end-column 21, :doc nil, :protocol-symbol true, :jsdoc ("@interface"), :protocol-info {:methods {-header [[value]], -has-body [[value]], -body [[value]]}}}, :protocol-symbol true, :name devtools.protocols/IFormat, :file "docs/js/compiled/out/devtools/protocols.cljs", :end-column 21, :column 1, :line 12, :protocol-info {:methods {-header [[value]], -has-body [[value]], -body [[value]]}}, :info nil, :end-line 12, :impls #{}, :doc nil, :jsdoc ("@interface")}, -header {:protocol-inline nil, :meta {:file "/Users/simon/workspace/swinging-needle-meter/docs/js/compiled/out/devtools/protocols.cljs", :line 13, :column 4, :end-line 13, :end-column 11, :protocol devtools.protocols/IFormat, :doc nil, :arglists (quote ([value]))}, :protocol devtools.protocols/IFormat, :name devtools.protocols/-header, :variadic false, :file "docs/js/compiled/out/devtools/protocols.cljs", :end-column 11, :method-params ([value]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 12, :end-line 13, :max-fixed-arity 1, :fn-var true, :arglists (quote ([value])), :doc nil}, -has-body {:protocol-inline nil, :meta {:file "/Users/simon/workspace/swinging-needle-meter/docs/js/compiled/out/devtools/protocols.cljs", :line 14, :column 4, :end-line 14, :end-column 13, :protocol devtools.protocols/IFormat, :doc nil, :arglists (quote ([value]))}, :protocol devtools.protocols/IFormat, :name devtools.protocols/-has-body, :variadic false, :file "docs/js/compiled/out/devtools/protocols.cljs", :end-column 13, :method-params ([value]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 12, :end-line 14, :max-fixed-arity 1, :fn-var true, :arglists (quote ([value])), :doc nil}, -body {:protocol-inline nil, :meta {:file "/Users/simon/workspace/swinging-needle-meter/docs/js/compiled/out/devtools/protocols.cljs", :line 15, :column 4, :end-line 15, :end-column 9, :protocol devtools.protocols/IFormat, :doc nil, :arglists (quote ([value]))}, :protocol devtools.protocols/IFormat, :name devtools.protocols/-body, :variadic false, :file "docs/js/compiled/out/devtools/protocols.cljs", :end-column 9, :method-params ([value]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 12, :end-line 15, :max-fixed-arity 1, :fn-var true, :arglists (quote ([value])), :doc nil}}, :require-macros nil, :doc nil}

View file

@ -0,0 +1,89 @@
// Compiled by ClojureScript 1.9.229 {}
goog.provide('devtools.protocols');
goog.require('cljs.core');
/**
* Marker protocol indicating a devtools template.
* @interface
*/
devtools.protocols.ITemplate = function(){};
/**
* Marker protocol indicating a devtools group.
* @interface
*/
devtools.protocols.IGroup = function(){};
/**
* Marker protocol indicating a devtools surrogate object.
* @interface
*/
devtools.protocols.ISurrogate = function(){};
/**
* @interface
*/
devtools.protocols.IFormat = function(){};
devtools.protocols._header = (function devtools$protocols$_header(value){
if((!((value == null))) && (!((value.devtools$protocols$IFormat$_header$arity$1 == null)))){
return value.devtools$protocols$IFormat$_header$arity$1(value);
} else {
var x__25793__auto__ = (((value == null))?null:value);
var m__25794__auto__ = (devtools.protocols._header[goog.typeOf(x__25793__auto__)]);
if(!((m__25794__auto__ == null))){
return m__25794__auto__.call(null,value);
} else {
var m__25794__auto____$1 = (devtools.protocols._header["_"]);
if(!((m__25794__auto____$1 == null))){
return m__25794__auto____$1.call(null,value);
} else {
throw cljs.core.missing_protocol.call(null,"IFormat.-header",value);
}
}
}
});
devtools.protocols._has_body = (function devtools$protocols$_has_body(value){
if((!((value == null))) && (!((value.devtools$protocols$IFormat$_has_body$arity$1 == null)))){
return value.devtools$protocols$IFormat$_has_body$arity$1(value);
} else {
var x__25793__auto__ = (((value == null))?null:value);
var m__25794__auto__ = (devtools.protocols._has_body[goog.typeOf(x__25793__auto__)]);
if(!((m__25794__auto__ == null))){
return m__25794__auto__.call(null,value);
} else {
var m__25794__auto____$1 = (devtools.protocols._has_body["_"]);
if(!((m__25794__auto____$1 == null))){
return m__25794__auto____$1.call(null,value);
} else {
throw cljs.core.missing_protocol.call(null,"IFormat.-has-body",value);
}
}
}
});
devtools.protocols._body = (function devtools$protocols$_body(value){
if((!((value == null))) && (!((value.devtools$protocols$IFormat$_body$arity$1 == null)))){
return value.devtools$protocols$IFormat$_body$arity$1(value);
} else {
var x__25793__auto__ = (((value == null))?null:value);
var m__25794__auto__ = (devtools.protocols._body[goog.typeOf(x__25793__auto__)]);
if(!((m__25794__auto__ == null))){
return m__25794__auto__.call(null,value);
} else {
var m__25794__auto____$1 = (devtools.protocols._body["_"]);
if(!((m__25794__auto____$1 == null))){
return m__25794__auto____$1.call(null,value);
} else {
throw cljs.core.missing_protocol.call(null,"IFormat.-body",value);
}
}
}
});
//# sourceMappingURL=protocols.js.map?rel=1603199211828

View file

@ -0,0 +1 @@
{"version":3,"file":"\/Users\/simon\/workspace\/swinging-needle-meter\/docs\/js\/compiled\/out\/devtools\/protocols.js","sources":["protocols.cljs?rel=1603199211829"],"lineCount":89,"mappings":";AAAA;;AAEA,AAAA;AAAA;;;;+BAAA,\/BAAaA;;AAAb,AAGA,AAAA;AAAA;;;;4BAAA,5BAAaC;;AAAb,AAGA,AAAA;AAAA;;;;gCAAA,hCAAaC;;AAAb,AAGA,AAAA;AAAA;;;6BAAA,7BAAaQ;;AAAb,6BAAA,7BACGC,kEAASC;AADZ,AAAA,GAAA,CAAA,EAAA,UAAA,YAAA,EAAA,CAAA,oDAAA,5EACYA,wBAAAA;AADZ,OACYA,iDAAAA;;AADZ,IAAAT,mBAAA,EAAA,UAAA,OAAA,hBACYS,qBAAAA;IADZR,mBAAA,CAAAC,2BAAA,AAAAC,YAAAH;AAAA,AAAA,GAAA,EAAA,CAAAC,oBAAA;AAAA,OAAAA,2BACYQ;;AADZ,IAAAR,uBAAA,CAAAC,2BAAA;AAAA,AAAA,GAAA,EAAA,CAAAD,wBAAA;AAAA,OAAAA,+BACYQ;;AADZ,MAAA,AAAAL,qCAAA,kBACYK;;;;;;AADZ,+BAAA,\/BAEGC,sEAAWD;AAFd,AAAA,GAAA,CAAA,EAAA,UAAA,YAAA,EAAA,CAAA,sDAAA,9EAEcA,wBAAAA;AAFd,OAEcA,mDAAAA;;AAFd,IAAAT,mBAAA,EAAA,UAAA,OAAA,hBAEcS,qBAAAA;IAFdR,mBAAA,CAAAI,6BAAA,AAAAF,YAAAH;AAAA,AAAA,GAAA,EAAA,CAAAC,oBAAA;AAAA,OAAAA,2BAEcQ;;AAFd,IAAAR,uBAAA,CAAAI,6BAAA;AAAA,AAAA,GAAA,EAAA,CAAAJ,wBAAA;AAAA,OAAAA,+BAEcQ;;AAFd,MAAA,AAAAL,qCAAA,oBAEcK;;;;;;AAFd,2BAAA,3BAGGE,8DAAOF;AAHV,AAAA,GAAA,CAAA,EAAA,UAAA,YAAA,EAAA,CAAA,kDAAA,1EAGUA,wBAAAA;AAHV,OAGUA,+CAAAA;;AAHV,IAAAT,mBAAA,EAAA,UAAA,OAAA,hBAGUS,qBAAAA;IAHVR,mBAAA,CAAAK,yBAAA,AAAAH,YAAAH;AAAA,AAAA,GAAA,EAAA,CAAAC,oBAAA;AAAA,OAAAA,2BAGUQ;;AAHV,IAAAR,uBAAA,CAAAK,yBAAA;AAAA,AAAA,GAAA,EAAA,CAAAL,wBAAA;AAAA,OAAAA,+BAGUQ;;AAHV,MAAA,AAAAL,qCAAA,gBAGUK;;;;;;AAHV","names":["devtools.protocols\/ITemplate","devtools.protocols\/IGroup","devtools.protocols\/ISurrogate","x__25793__auto__","m__25794__auto__","devtools\/protocols.-header","goog\/typeOf","cljs.core\/missing-protocol","devtools\/protocols.-has-body","devtools\/protocols.-body","devtools.protocols\/IFormat","devtools.protocols\/-header","value","devtools.protocols\/-has-body","devtools.protocols\/-body"]}

View file

@ -0,0 +1,38 @@
(ns devtools.toolbox
(:require [devtools.protocols :refer [IFormat]]
[devtools.formatters.templating :refer [render-markup]]
[devtools.formatters.markup :refer [<preview> <body> <standard-body-reference> <surrogate>]]))
(defn envelope
"This is a simple wrapper for logging \"busy\" objects.
This is especially handy when you happen to be logging javascript objects with many properties.
Standard javascript console renderer tends to print a lot of infomation in the header in some cases and that can make
console output pretty busy. By using envelope you can force your own short header and let the details expand on demand
via disclosure triangle. The header can be styled and you can optionally specify preferred wrapping tag (advanced)."
([obj]
(envelope obj :default-envelope-header))
([obj header]
(envelope obj header :default-envelope-style))
([obj header style]
(envelope obj header style :span))
([obj header style tag]
(reify
IFormat
(-header [_] (render-markup [[tag style] (if (fn? header) (header obj) header)]))
(-has-body [_] true)
(-body [_] (render-markup (<body> (<standard-body-reference> obj)))))))
(defn force-format
"Forces object to be rendered by cljs-devtools during console logging.
Unfortunately custom formatters subsystem in DevTools is not applied to primitive values like numbers, strings, null, etc.
This wrapper can be used as a workaround if you really need to force cljs-devtools rendering:
(.log js/console nil) ; will render 'null'
(.log js/console (force-format nil)) ; will render 'nil' and not 'null'
See https://github.com/binaryage/cljs-devtools/issues/17
"
[obj]
(render-markup (<surrogate> obj)))

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,156 @@
// Compiled by ClojureScript 1.9.229 {}
goog.provide('devtools.toolbox');
goog.require('cljs.core');
goog.require('devtools.protocols');
goog.require('devtools.formatters.templating');
goog.require('devtools.formatters.markup');
/**
* This is a simple wrapper for logging "busy" objects.
* This is especially handy when you happen to be logging javascript objects with many properties.
* Standard javascript console renderer tends to print a lot of infomation in the header in some cases and that can make
* console output pretty busy. By using envelope you can force your own short header and let the details expand on demand
* via disclosure triangle. The header can be styled and you can optionally specify preferred wrapping tag (advanced).
*/
devtools.toolbox.envelope = (function devtools$toolbox$envelope(var_args){
var args41874 = [];
var len__26205__auto___41880 = arguments.length;
var i__26206__auto___41881 = (0);
while(true){
if((i__26206__auto___41881 < len__26205__auto___41880)){
args41874.push((arguments[i__26206__auto___41881]));
var G__41882 = (i__26206__auto___41881 + (1));
i__26206__auto___41881 = G__41882;
continue;
} else {
}
break;
}
var G__41876 = args41874.length;
switch (G__41876) {
case 1:
return devtools.toolbox.envelope.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
break;
case 2:
return devtools.toolbox.envelope.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
break;
case 3:
return devtools.toolbox.envelope.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
break;
case 4:
return devtools.toolbox.envelope.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
break;
default:
throw (new Error([cljs.core.str("Invalid arity: "),cljs.core.str(args41874.length)].join('')));
}
});
devtools.toolbox.envelope.cljs$core$IFn$_invoke$arity$1 = (function (obj){
return devtools.toolbox.envelope.call(null,obj,new cljs.core.Keyword(null,"default-envelope-header","default-envelope-header",-90723598));
});
devtools.toolbox.envelope.cljs$core$IFn$_invoke$arity$2 = (function (obj,header){
return devtools.toolbox.envelope.call(null,obj,header,new cljs.core.Keyword(null,"default-envelope-style","default-envelope-style",-1676750479));
});
devtools.toolbox.envelope.cljs$core$IFn$_invoke$arity$3 = (function (obj,header,style){
return devtools.toolbox.envelope.call(null,obj,header,style,new cljs.core.Keyword(null,"span","span",1394872991));
});
devtools.toolbox.envelope.cljs$core$IFn$_invoke$arity$4 = (function (obj,header,style,tag){
if(typeof devtools.toolbox.t_devtools$toolbox41877 !== 'undefined'){
} else {
/**
* @constructor
* @implements {devtools.protocols.IFormat}
* @implements {cljs.core.IMeta}
* @implements {cljs.core.IWithMeta}
*/
devtools.toolbox.t_devtools$toolbox41877 = (function (obj,header,style,tag,meta41878){
this.obj = obj;
this.header = header;
this.style = style;
this.tag = tag;
this.meta41878 = meta41878;
this.cljs$lang$protocol_mask$partition0$ = 393216;
this.cljs$lang$protocol_mask$partition1$ = 0;
})
devtools.toolbox.t_devtools$toolbox41877.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (_41879,meta41878__$1){
var self__ = this;
var _41879__$1 = this;
return (new devtools.toolbox.t_devtools$toolbox41877(self__.obj,self__.header,self__.style,self__.tag,meta41878__$1));
});
devtools.toolbox.t_devtools$toolbox41877.prototype.cljs$core$IMeta$_meta$arity$1 = (function (_41879){
var self__ = this;
var _41879__$1 = this;
return self__.meta41878;
});
devtools.toolbox.t_devtools$toolbox41877.prototype.devtools$protocols$IFormat$ = true;
devtools.toolbox.t_devtools$toolbox41877.prototype.devtools$protocols$IFormat$_header$arity$1 = (function (_){
var self__ = this;
var ___$1 = this;
return devtools.formatters.templating.render_markup.call(null,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [self__.tag,self__.style], null),((cljs.core.fn_QMARK_.call(null,self__.header))?self__.header.call(null,self__.obj):self__.header)], null));
});
devtools.toolbox.t_devtools$toolbox41877.prototype.devtools$protocols$IFormat$_has_body$arity$1 = (function (_){
var self__ = this;
var ___$1 = this;
return true;
});
devtools.toolbox.t_devtools$toolbox41877.prototype.devtools$protocols$IFormat$_body$arity$1 = (function (_){
var self__ = this;
var ___$1 = this;
return devtools.formatters.templating.render_markup.call(null,devtools.formatters.markup._LT_body_GT_.call(null,devtools.formatters.markup._LT_standard_body_reference_GT_.call(null,self__.obj)));
});
devtools.toolbox.t_devtools$toolbox41877.getBasis = (function (){
return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"obj","obj",-1672671807,null),new cljs.core.Symbol(null,"header","header",1759972661,null),new cljs.core.Symbol(null,"style","style",1143888791,null),new cljs.core.Symbol(null,"tag","tag",350170304,null),new cljs.core.Symbol(null,"meta41878","meta41878",1348382615,null)], null);
});
devtools.toolbox.t_devtools$toolbox41877.cljs$lang$type = true;
devtools.toolbox.t_devtools$toolbox41877.cljs$lang$ctorStr = "devtools.toolbox/t_devtools$toolbox41877";
devtools.toolbox.t_devtools$toolbox41877.cljs$lang$ctorPrWriter = (function (this__25736__auto__,writer__25737__auto__,opt__25738__auto__){
return cljs.core._write.call(null,writer__25737__auto__,"devtools.toolbox/t_devtools$toolbox41877");
});
devtools.toolbox.__GT_t_devtools$toolbox41877 = (function devtools$toolbox$__GT_t_devtools$toolbox41877(obj__$1,header__$1,style__$1,tag__$1,meta41878){
return (new devtools.toolbox.t_devtools$toolbox41877(obj__$1,header__$1,style__$1,tag__$1,meta41878));
});
}
return (new devtools.toolbox.t_devtools$toolbox41877(obj,header,style,tag,cljs.core.PersistentArrayMap.EMPTY));
});
devtools.toolbox.envelope.cljs$lang$maxFixedArity = 4;
/**
* Forces object to be rendered by cljs-devtools during console logging.
*
* Unfortunately custom formatters subsystem in DevTools is not applied to primitive values like numbers, strings, null, etc.
* This wrapper can be used as a workaround if you really need to force cljs-devtools rendering:
*
* (.log js/console nil) ; will render 'null'
* (.log js/console (force-format nil)) ; will render 'nil' and not 'null'
*
* See https://github.com/binaryage/cljs-devtools/issues/17
*
*/
devtools.toolbox.force_format = (function devtools$toolbox$force_format(obj){
return devtools.formatters.templating.render_markup.call(null,devtools.formatters.markup._LT_surrogate_GT_.call(null,obj));
});
//# sourceMappingURL=toolbox.js.map?rel=1603199213373

View file

@ -0,0 +1 @@
{"version":3,"file":"\/Users\/simon\/workspace\/swinging-needle-meter\/docs\/js\/compiled\/out\/devtools\/toolbox.js","sources":["toolbox.cljs?rel=1603199213374"],"lineCount":156,"mappings":";AAAA;;;;;AAKA,AAAA;;;;;;;4BAAA,oCAAAA,hEAAMK;AAAN,AAAA,IAAAJ,YAAA;AAAA,AAAA,IAAAC,2BAAA,AAAA;AAAA,AAAA,IAAAC,yBAAA;;AAAA,AAAA,GAAA,CAAAA,yBAAAD;AAAA,AAAA,AAAAD,eAAA,CAAA,UAAAE;;AAAA,eAAA,CAAAA,yBAAA;;;;AAAA;;;;AAAA,IAAAC,WAAA,AAAAH;AAAA,AAAA,QAAAG;KAAA;AAAA,OAAAC,wDAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,wDAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,wDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,wDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAC,MAAA,eAAA,iCAAA,AAAAL;;;;;AAAA,AAAA,0DAAA,1DAAMI,qEAMFE;AANJ,AAOG,+CAAA,xCAACF,oCAASE;;;AAPb,AAAA,0DAAA,1DAAMF,qEAQFE,IAAIC;AARR,AASG,sDAAA,\/CAACH,oCAASE,IAAIC;;;AATjB,AAAA,0DAAA,1DAAMH,qEAUFE,IAAIC,OAAOC;AAVf,AAWG,4DAAA,rDAACJ,oCAASE,IAAIC,OAAOC;;;AAXxB,AAAA,0DAAA,1DAAMJ,qEAYFE,IAAIC,OAAOC,MAAMC;AAZrB,AAaG,AAAA,GAAA,OAAAC;AAAA;AAAA,AAAA,AAAA;;;;;;;;;;;;;;;;AAAA,AAAA,AAAA,AAAA,AAAAA,4FAAA,WAAAC,OAAAC;;AAAA,AAAA,IAAAD,aAAA;qDADCL,WAAIC,cAAOC,aAAMC,3FAClB,AAAA,YAAAC,0FAAAE;;;AAAA,AAAA,AAAA,AAAAF,mFAAA,WAAAC;;AAAA,AAAA,IAAAA,aAAA;AAAA,AAAAC;;;AAAA,AAAA,AAAA,AAAAF,iFAAA;;AAAA,AAAA,AAAA,AAAAA,gGAAA,WAEYQ;;AAFZ,AAAA,YAAA,RAEYA;AAFZ,AAEe,8DAAA,mFAAA,1IAACC,6NAAgBV,WAAID,qBAAO,EAAI,AAACY,8BAAIb,gBAAQ,AAACA,wBAAOD,YAAKC;;;AAFzE,AAAA,AAAA,AAAAG,kGAAA,WAGcQ;;AAHd,AAAA,YAAA,RAGcA;AAHd,AAAA;;;AAAA,AAAA,AAAA,AAAAR,8FAAA,WAIUQ;;AAJV,AAAA,YAAA,RAIUA;AAJV,AAIa,OAACC,uDAAc,AAACE,kDAAO,AAACC,qEAA0BhB;;;AAJ\/D,AAAA,AAAAI,oDAAA;AAAA,AAAA,0FAAA,wDAAA,6DAAA,2DAAA,sDAAA;;;AAAA,AAAA,AAAAA,0DAAA;;AAAA,AAAA,AAAAA,6DAAA;;AAAA,AAAA,AAAAA,kEAAA,WAAAG,oBAAAC,sBAAAC;AAAA,AAAA,OAAAC,2BAAAF,sBAAA;;;wGADCR,QAAIC,WAAOC,UAAMC,rIAClB,AAAAQ,gDAAA,6FAAAL;qDADCN,QAAIC,WAAOC,UAAMC,lFAClB,AAAA,YAAAC,8EAAAE;;;AAAAF;;qDADCJ,IAAIC,OAAOC,MAAMC,tEAClB,YAAAC,8DAAA;;;AAbH,AAAA,oDAAA,pDAAMN;;AAAN,AAmBA;;;;;;;;;;;;gCAAA,hCAAMmB,wEAWHjB;AAXH,AAYE,OAACa,uDAAc,AAACK,uDAAYlB","names":["var_args","args41874","len__26205__auto__","i__26206__auto__","G__41876","devtools.toolbox\/envelope","js\/Error","obj","header","style","tag","devtools.toolbox\/t_devtools$toolbox41877","_41879","meta41878","this__25736__auto__","writer__25737__auto__","opt__25738__auto__","cljs.core\/-write","devtools.toolbox\/->t_devtools$toolbox41877","_","devtools.formatters.templating\/render-markup","cljs.core\/fn?","devtools.formatters.markup\/<body>","devtools.formatters.markup\/<standard-body-reference>","devtools.toolbox\/force-format","devtools.formatters.markup\/<surrogate>"]}

View file

@ -0,0 +1,188 @@
(ns devtools.util
(:require-macros [devtools.util :refer [oget ocall oset]])
(:require [goog.userAgent :as ua]
[clojure.data :as data]
[cljs.pprint :refer [pprint]]
[devtools.version :refer [get-current-version]]
[devtools.defaults :as defaults]
[devtools.prefs :as prefs]))
(def ^:dynamic *custom-formatters-active* false)
(def ^:dynamic *console-open* false)
(def ^:dynamic *custom-formatters-warning-reported* false)
(defn ^:dynamic make-version-info []
(let [version (get-current-version)]
(str "v" version)))
(defn ^:dynamic make-lib-info []
(str "CLJS DevTools " (get-current-version)))
(defn ^:dynamic unknown-feature-msg [feature known-features lib-info]
(str "No such feature " feature " is currently available in " lib-info ". "
"The list of supported features is " (pr-str known-features) "."))
(defn ^:dynamic feature-not-available-msg [feature]
(str "Feature " feature " cannot be installed. "
"Unsupported browser " (ua/getUserAgentString) "."))
(defn ^:dynamic custom-formatters-not-active-msg []
(str "CLJS DevTools: some custom formatters were not rendered.\n"
"https://github.com/binaryage/cljs-devtools/blob/master/docs/faq.md#why-some-custom-formatters-were-not-rendered"))
(defn get-lib-info []
(make-lib-info))
(def formatter-key "devtoolsFormatters")
(defn get-formatters-safe []
(let [formatters (aget js/window formatter-key)]
(if (array? formatters) ; TODO: maybe issue a warning if formatters are anything else than array or nil
formatters
#js [])))
(defn set-formatters-safe! [new-formatters]
{:pre [(or (nil? new-formatters) (array? new-formatters))]}
(aset js/window formatter-key (if (empty? new-formatters) nil new-formatters)))
(defn print-config-overrides-if-requested! [msg]
(when (prefs/pref :print-config-overrides)
(let [diff (second (data/diff defaults/prefs (prefs/get-prefs)))]
(if-not (empty? diff)
(.info js/console msg (with-out-str (pprint diff)))))))
; -- custom formatters detection --------------------------------------------------------------------------------------------
(deftype CustomFormattersDetector [])
; https://github.com/binaryage/cljs-devtools/issues/16
(defn make-detector []
(let [detector (CustomFormattersDetector.)]
(aset detector "header" (fn [_object _config]
(set! *custom-formatters-active* true)
nil))
(aset detector "hasBody" (constantly false))
(aset detector "body" (constantly nil))
detector))
(defn install-detector! [detector]
(let [formatters (get-formatters-safe)]
(.push formatters detector)
(set-formatters-safe! formatters)))
(defn uninstall-detector! [detector]
; play it safe here, this method is called asynchronously
; in theory someone else could have installed additional custom formatters
; we have to be careful removing only ours formatters
(let [current-formatters (aget js/window formatter-key)]
(if (array? current-formatters)
(let [new-formatters (.filter current-formatters #(not (= detector %)))]
(set-formatters-safe! new-formatters)))))
(defn check-custom-formatters-active! []
(if (and *console-open* (not *custom-formatters-active*))
(when-not *custom-formatters-warning-reported*
(set! *custom-formatters-warning-reported* true)
(.warn js/console (custom-formatters-not-active-msg)))))
(defn uninstall-detector-and-check-custom-formatters-active! [detector]
(uninstall-detector! detector)
(check-custom-formatters-active!))
; a variation of http://stackoverflow.com/a/30638226/84283
(defn make-detection-printer []
(let [f (fn [])]
(oset f ["toString"] (fn []
(set! *console-open* true)
(js/setTimeout check-custom-formatters-active! 0) ; console is being opened, schedule another check
""))
f))
(defn wrap-with-custom-formatter-detection! [f]
(if-not (prefs/pref :dont-detect-custom-formatters)
(let [detector (make-detector)]
; this is a tricky business here
; we cannot ask DevTools if custom formatters are available and/or enabled
; we abuse the fact that we are printing info banner upon cljs-devtools installation anyways
; we install a special CustomFormattersDetector formatter which just records calls to it
; but does not format anything, it skips the opportunity to format the output so it has no visual effect
; this way we are able to detect if custom formatters are active and record it in *custom-formatters-active*
; but this technique does not work when printing happens when DevTools console is closed
; we have to add another system for detection of when console opens and re-detect custom formatters with opened console
(install-detector! detector)
(f "%c%s" "color:transparent" (make-detection-printer))
; note that custom formatters are applied asynchronously
; we have to uninstall our detector a bit later
(js/setTimeout (partial uninstall-detector-and-check-custom-formatters-active! detector) 0))
(f)))
; -- banner -----------------------------------------------------------------------------------------------------------------
(defn feature-for-display [installed-features feature]
(let [color (if (some #{feature} installed-features) "color:#0000ff" "color:#ccc")]
["%c%s" [color (str feature)]]))
(defn feature-list-display [installed-features feature-groups]
(let [labels (map (partial feature-for-display installed-features) (:all feature-groups))
* (fn [accum val]
[(str (first accum) " " (first val))
(concat (second accum) (second val))])]
(reduce * (first labels) (rest labels))))
(defn display-banner! [installed-features feature-groups fmt & params]
(let [[fmt-str fmt-params] (feature-list-display installed-features feature-groups)]
(wrap-with-custom-formatter-detection! (fn [add-fmt & add-args]
(let [items (concat [(str fmt " " fmt-str add-fmt)] params fmt-params add-args)]
(.apply (.-info js/console) js/console (into-array items)))))))
(defn display-banner-if-needed! [features-to-install feature-groups]
(if-not (prefs/pref :dont-display-banner)
(do
(let [banner (str "Installing %c%s%c and enabling features")
lib-info-style "color:black;font-weight:bold;"
reset-style "color:black"]
(display-banner! features-to-install feature-groups banner lib-info-style (get-lib-info) reset-style)))
; detection cannot be performed if we are not allowed to print something to console => assume active
(set! *custom-formatters-active* true)))
; -- unknown features -------------------------------------------------------------------------------------------------------
(defn report-unknown-features! [features known-features]
(let [lib-info (get-lib-info)]
(doseq [feature features]
(if-not (some #{feature} known-features)
(.warn js/console (unknown-feature-msg feature known-features lib-info))))))
(defn is-known-feature? [known-features feature]
(boolean (some #{feature} known-features)))
(defn convert-legacy-feature [feature]
(case feature
:custom-formatters :formatters
:sanity-hints :hints
feature))
(defn convert-legacy-features [features]
(map convert-legacy-feature features))
(defn sanititze-features! [features feature-groups]
(let [known-features (:all feature-groups)
features (convert-legacy-features features)] ; new feature names were introduced in v0.8
(report-unknown-features! features known-features)
(filter (partial is-known-feature? known-features) features)))
(defn resolve-features! [features-desc feature-groups]
(let [features (cond
(and (keyword? features-desc) (features-desc feature-groups)) (features-desc feature-groups)
(nil? features-desc) (:default feature-groups)
(seqable? features-desc) features-desc
:else [features-desc])]
(sanititze-features! features feature-groups)))
; -- installer --------------------------------------------------------------------------------------------------------------
(defn install-feature! [feature features-to-install available-fn install-fn]
(if (some #{feature} features-to-install)
(if (or (prefs/pref :bypass-availability-checks) (available-fn feature))
(install-fn)
(.warn js/console (feature-not-available-msg feature)))))

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,402 @@
// Compiled by ClojureScript 1.9.229 {}
goog.provide('devtools.util');
goog.require('cljs.core');
goog.require('devtools.prefs');
goog.require('clojure.data');
goog.require('devtools.version');
goog.require('goog.userAgent');
goog.require('cljs.pprint');
goog.require('devtools.defaults');
devtools.util._STAR_custom_formatters_active_STAR_ = false;
devtools.util._STAR_console_open_STAR_ = false;
devtools.util._STAR_custom_formatters_warning_reported_STAR_ = false;
devtools.util.make_version_info = (function devtools$util$make_version_info(){
var version = "0.8.2";
return [cljs.core.str("v"),cljs.core.str(version)].join('');
});
devtools.util.make_lib_info = (function devtools$util$make_lib_info(){
return [cljs.core.str("CLJS DevTools "),cljs.core.str("0.8.2")].join('');
});
devtools.util.unknown_feature_msg = (function devtools$util$unknown_feature_msg(feature,known_features,lib_info){
return [cljs.core.str("No such feature "),cljs.core.str(feature),cljs.core.str(" is currently available in "),cljs.core.str(lib_info),cljs.core.str(". "),cljs.core.str("The list of supported features is "),cljs.core.str(cljs.core.pr_str.call(null,known_features)),cljs.core.str(".")].join('');
});
devtools.util.feature_not_available_msg = (function devtools$util$feature_not_available_msg(feature){
return [cljs.core.str("Feature "),cljs.core.str(feature),cljs.core.str(" cannot be installed. "),cljs.core.str("Unsupported browser "),cljs.core.str(goog.userAgent.getUserAgentString()),cljs.core.str(".")].join('');
});
devtools.util.custom_formatters_not_active_msg = (function devtools$util$custom_formatters_not_active_msg(){
return [cljs.core.str("CLJS DevTools: some custom formatters were not rendered.\n"),cljs.core.str("https://github.com/binaryage/cljs-devtools/blob/master/docs/faq.md#why-some-custom-formatters-were-not-rendered")].join('');
});
devtools.util.get_lib_info = (function devtools$util$get_lib_info(){
return devtools.util.make_lib_info.call(null);
});
devtools.util.formatter_key = "devtoolsFormatters";
devtools.util.get_formatters_safe = (function devtools$util$get_formatters_safe(){
var formatters = (window[devtools.util.formatter_key]);
if(cljs.core.array_QMARK_.call(null,formatters)){
return formatters;
} else {
return [];
}
});
devtools.util.set_formatters_safe_BANG_ = (function devtools$util$set_formatters_safe_BANG_(new_formatters){
if(((new_formatters == null)) || (cljs.core.array_QMARK_.call(null,new_formatters))){
} else {
throw (new Error("Assert failed: (or (nil? new-formatters) (array? new-formatters))"));
}
return (window[devtools.util.formatter_key] = ((cljs.core.empty_QMARK_.call(null,new_formatters))?null:new_formatters));
});
devtools.util.print_config_overrides_if_requested_BANG_ = (function devtools$util$print_config_overrides_if_requested_BANG_(msg){
if(cljs.core.truth_(devtools.prefs.pref.call(null,new cljs.core.Keyword(null,"print-config-overrides","print-config-overrides",-274716965)))){
var diff = cljs.core.second.call(null,clojure.data.diff.call(null,devtools.defaults.prefs,devtools.prefs.get_prefs.call(null)));
if(!(cljs.core.empty_QMARK_.call(null,diff))){
return console.info(msg,(function (){var sb__26116__auto__ = (new goog.string.StringBuffer());
var _STAR_print_newline_STAR_41084_41086 = cljs.core._STAR_print_newline_STAR_;
var _STAR_print_fn_STAR_41085_41087 = cljs.core._STAR_print_fn_STAR_;
cljs.core._STAR_print_newline_STAR_ = true;
cljs.core._STAR_print_fn_STAR_ = ((function (_STAR_print_newline_STAR_41084_41086,_STAR_print_fn_STAR_41085_41087,sb__26116__auto__,diff){
return (function (x__26117__auto__){
return sb__26116__auto__.append(x__26117__auto__);
});})(_STAR_print_newline_STAR_41084_41086,_STAR_print_fn_STAR_41085_41087,sb__26116__auto__,diff))
;
try{cljs.pprint.pprint.call(null,diff);
}finally {cljs.core._STAR_print_fn_STAR_ = _STAR_print_fn_STAR_41085_41087;
cljs.core._STAR_print_newline_STAR_ = _STAR_print_newline_STAR_41084_41086;
}
return [cljs.core.str(sb__26116__auto__)].join('');
})());
} else {
return null;
}
} else {
return null;
}
});
/**
* @constructor
*/
devtools.util.CustomFormattersDetector = (function (){
})
devtools.util.CustomFormattersDetector.getBasis = (function (){
return cljs.core.PersistentVector.EMPTY;
});
devtools.util.CustomFormattersDetector.cljs$lang$type = true;
devtools.util.CustomFormattersDetector.cljs$lang$ctorStr = "devtools.util/CustomFormattersDetector";
devtools.util.CustomFormattersDetector.cljs$lang$ctorPrWriter = (function (this__25736__auto__,writer__25737__auto__,opt__25738__auto__){
return cljs.core._write.call(null,writer__25737__auto__,"devtools.util/CustomFormattersDetector");
});
devtools.util.__GT_CustomFormattersDetector = (function devtools$util$__GT_CustomFormattersDetector(){
return (new devtools.util.CustomFormattersDetector());
});
devtools.util.make_detector = (function devtools$util$make_detector(){
var detector = (new devtools.util.CustomFormattersDetector());
(detector["header"] = ((function (detector){
return (function (_object,_config){
devtools.util._STAR_custom_formatters_active_STAR_ = true;
return null;
});})(detector))
);
(detector["hasBody"] = cljs.core.constantly.call(null,false));
(detector["body"] = cljs.core.constantly.call(null,null));
return detector;
});
devtools.util.install_detector_BANG_ = (function devtools$util$install_detector_BANG_(detector){
var formatters = devtools.util.get_formatters_safe.call(null);
formatters.push(detector);
return devtools.util.set_formatters_safe_BANG_.call(null,formatters);
});
devtools.util.uninstall_detector_BANG_ = (function devtools$util$uninstall_detector_BANG_(detector){
var current_formatters = (window[devtools.util.formatter_key]);
if(cljs.core.array_QMARK_.call(null,current_formatters)){
var new_formatters = current_formatters.filter(((function (current_formatters){
return (function (p1__41088_SHARP_){
return !(cljs.core._EQ_.call(null,detector,p1__41088_SHARP_));
});})(current_formatters))
);
return devtools.util.set_formatters_safe_BANG_.call(null,new_formatters);
} else {
return null;
}
});
devtools.util.check_custom_formatters_active_BANG_ = (function devtools$util$check_custom_formatters_active_BANG_(){
if(cljs.core.truth_((function (){var and__25118__auto__ = devtools.util._STAR_console_open_STAR_;
if(cljs.core.truth_(and__25118__auto__)){
return cljs.core.not.call(null,devtools.util._STAR_custom_formatters_active_STAR_);
} else {
return and__25118__auto__;
}
})())){
if(cljs.core.truth_(devtools.util._STAR_custom_formatters_warning_reported_STAR_)){
return null;
} else {
devtools.util._STAR_custom_formatters_warning_reported_STAR_ = true;
return console.warn(devtools.util.custom_formatters_not_active_msg.call(null));
}
} else {
return null;
}
});
devtools.util.uninstall_detector_and_check_custom_formatters_active_BANG_ = (function devtools$util$uninstall_detector_and_check_custom_formatters_active_BANG_(detector){
devtools.util.uninstall_detector_BANG_.call(null,detector);
return devtools.util.check_custom_formatters_active_BANG_.call(null);
});
devtools.util.make_detection_printer = (function devtools$util$make_detection_printer(){
var f = (function (){
return null;
});
var G__41090_41091 = f;
var target__41068__auto___41092 = G__41090_41091;
if(cljs.core.truth_(target__41068__auto___41092)){
} else {
throw (new Error([cljs.core.str("Assert failed: "),cljs.core.str([cljs.core.str("unable to locate object path "),cljs.core.str(null),cljs.core.str(" in "),cljs.core.str(G__41090_41091)].join('')),cljs.core.str("\n"),cljs.core.str("target__41068__auto__")].join('')));
}
goog.object.set(target__41068__auto___41092,cljs.core.last.call(null,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, ["toString"], null)),((function (G__41090_41091,target__41068__auto___41092,f){
return (function (){
devtools.util._STAR_console_open_STAR_ = true;
setTimeout(devtools.util.check_custom_formatters_active_BANG_,(0));
return "";
});})(G__41090_41091,target__41068__auto___41092,f))
);
return f;
});
devtools.util.wrap_with_custom_formatter_detection_BANG_ = (function devtools$util$wrap_with_custom_formatter_detection_BANG_(f){
if(cljs.core.not.call(null,devtools.prefs.pref.call(null,new cljs.core.Keyword(null,"dont-detect-custom-formatters","dont-detect-custom-formatters",-29005804)))){
var detector = devtools.util.make_detector.call(null);
devtools.util.install_detector_BANG_.call(null,detector);
f.call(null,"%c%s","color:transparent",devtools.util.make_detection_printer.call(null));
return setTimeout(cljs.core.partial.call(null,devtools.util.uninstall_detector_and_check_custom_formatters_active_BANG_,detector),(0));
} else {
return f.call(null);
}
});
devtools.util.feature_for_display = (function devtools$util$feature_for_display(installed_features,feature){
var color = (cljs.core.truth_(cljs.core.some.call(null,cljs.core.PersistentHashSet.fromArray([feature], true),installed_features))?"color:#0000ff":"color:#ccc");
return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, ["%c%s",new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [color,[cljs.core.str(feature)].join('')], null)], null);
});
devtools.util.feature_list_display = (function devtools$util$feature_list_display(installed_features,feature_groups){
var labels = cljs.core.map.call(null,cljs.core.partial.call(null,devtools.util.feature_for_display,installed_features),new cljs.core.Keyword(null,"all","all",892129742).cljs$core$IFn$_invoke$arity$1(feature_groups));
var _STAR_ = ((function (labels){
return (function (accum,val){
return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [[cljs.core.str(cljs.core.first.call(null,accum)),cljs.core.str(" "),cljs.core.str(cljs.core.first.call(null,val))].join(''),cljs.core.concat.call(null,cljs.core.second.call(null,accum),cljs.core.second.call(null,val))], null);
});})(labels))
;
return cljs.core.reduce.call(null,_STAR_,cljs.core.first.call(null,labels),cljs.core.rest.call(null,labels));
});
devtools.util.display_banner_BANG_ = (function devtools$util$display_banner_BANG_(var_args){
var args__26212__auto__ = [];
var len__26205__auto___41100 = arguments.length;
var i__26206__auto___41101 = (0);
while(true){
if((i__26206__auto___41101 < len__26205__auto___41100)){
args__26212__auto__.push((arguments[i__26206__auto___41101]));
var G__41102 = (i__26206__auto___41101 + (1));
i__26206__auto___41101 = G__41102;
continue;
} else {
}
break;
}
var argseq__26213__auto__ = ((((3) < args__26212__auto__.length))?(new cljs.core.IndexedSeq(args__26212__auto__.slice((3)),(0),null)):null);
return devtools.util.display_banner_BANG_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__26213__auto__);
});
devtools.util.display_banner_BANG_.cljs$core$IFn$_invoke$arity$variadic = (function (installed_features,feature_groups,fmt,params){
var vec__41097 = devtools.util.feature_list_display.call(null,installed_features,feature_groups);
var fmt_str = cljs.core.nth.call(null,vec__41097,(0),null);
var fmt_params = cljs.core.nth.call(null,vec__41097,(1),null);
return devtools.util.wrap_with_custom_formatter_detection_BANG_.call(null,((function (vec__41097,fmt_str,fmt_params){
return (function() {
var G__41103__delegate = function (add_fmt,add_args){
var items = cljs.core.concat.call(null,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [[cljs.core.str(fmt),cljs.core.str(" "),cljs.core.str(fmt_str),cljs.core.str(add_fmt)].join('')], null),params,fmt_params,add_args);
return console.info.apply(console,cljs.core.into_array.call(null,items));
};
var G__41103 = function (add_fmt,var_args){
var add_args = null;
if (arguments.length > 1) {
var G__41104__i = 0, G__41104__a = new Array(arguments.length - 1);
while (G__41104__i < G__41104__a.length) {G__41104__a[G__41104__i] = arguments[G__41104__i + 1]; ++G__41104__i;}
add_args = new cljs.core.IndexedSeq(G__41104__a,0);
}
return G__41103__delegate.call(this,add_fmt,add_args);};
G__41103.cljs$lang$maxFixedArity = 1;
G__41103.cljs$lang$applyTo = (function (arglist__41105){
var add_fmt = cljs.core.first(arglist__41105);
var add_args = cljs.core.rest(arglist__41105);
return G__41103__delegate(add_fmt,add_args);
});
G__41103.cljs$core$IFn$_invoke$arity$variadic = G__41103__delegate;
return G__41103;
})()
;})(vec__41097,fmt_str,fmt_params))
);
});
devtools.util.display_banner_BANG_.cljs$lang$maxFixedArity = (3);
devtools.util.display_banner_BANG_.cljs$lang$applyTo = (function (seq41093){
var G__41094 = cljs.core.first.call(null,seq41093);
var seq41093__$1 = cljs.core.next.call(null,seq41093);
var G__41095 = cljs.core.first.call(null,seq41093__$1);
var seq41093__$2 = cljs.core.next.call(null,seq41093__$1);
var G__41096 = cljs.core.first.call(null,seq41093__$2);
var seq41093__$3 = cljs.core.next.call(null,seq41093__$2);
return devtools.util.display_banner_BANG_.cljs$core$IFn$_invoke$arity$variadic(G__41094,G__41095,G__41096,seq41093__$3);
});
devtools.util.display_banner_if_needed_BANG_ = (function devtools$util$display_banner_if_needed_BANG_(features_to_install,feature_groups){
if(cljs.core.not.call(null,devtools.prefs.pref.call(null,new cljs.core.Keyword(null,"dont-display-banner","dont-display-banner",-1175550370)))){
var banner = [cljs.core.str("Installing %c%s%c and enabling features")].join('');
var lib_info_style = "color:black;font-weight:bold;";
var reset_style = "color:black";
return devtools.util.display_banner_BANG_.call(null,features_to_install,feature_groups,banner,lib_info_style,devtools.util.get_lib_info.call(null),reset_style);
} else {
return devtools.util._STAR_custom_formatters_active_STAR_ = true;
}
});
devtools.util.report_unknown_features_BANG_ = (function devtools$util$report_unknown_features_BANG_(features,known_features){
var lib_info = devtools.util.get_lib_info.call(null);
var seq__41110 = cljs.core.seq.call(null,features);
var chunk__41111 = null;
var count__41112 = (0);
var i__41113 = (0);
while(true){
if((i__41113 < count__41112)){
var feature = cljs.core._nth.call(null,chunk__41111,i__41113);
if(cljs.core.not.call(null,cljs.core.some.call(null,cljs.core.PersistentHashSet.fromArray([feature], true),known_features))){
console.warn(devtools.util.unknown_feature_msg.call(null,feature,known_features,lib_info));
} else {
}
var G__41114 = seq__41110;
var G__41115 = chunk__41111;
var G__41116 = count__41112;
var G__41117 = (i__41113 + (1));
seq__41110 = G__41114;
chunk__41111 = G__41115;
count__41112 = G__41116;
i__41113 = G__41117;
continue;
} else {
var temp__4657__auto__ = cljs.core.seq.call(null,seq__41110);
if(temp__4657__auto__){
var seq__41110__$1 = temp__4657__auto__;
if(cljs.core.chunked_seq_QMARK_.call(null,seq__41110__$1)){
var c__25941__auto__ = cljs.core.chunk_first.call(null,seq__41110__$1);
var G__41118 = cljs.core.chunk_rest.call(null,seq__41110__$1);
var G__41119 = c__25941__auto__;
var G__41120 = cljs.core.count.call(null,c__25941__auto__);
var G__41121 = (0);
seq__41110 = G__41118;
chunk__41111 = G__41119;
count__41112 = G__41120;
i__41113 = G__41121;
continue;
} else {
var feature = cljs.core.first.call(null,seq__41110__$1);
if(cljs.core.not.call(null,cljs.core.some.call(null,cljs.core.PersistentHashSet.fromArray([feature], true),known_features))){
console.warn(devtools.util.unknown_feature_msg.call(null,feature,known_features,lib_info));
} else {
}
var G__41122 = cljs.core.next.call(null,seq__41110__$1);
var G__41123 = null;
var G__41124 = (0);
var G__41125 = (0);
seq__41110 = G__41122;
chunk__41111 = G__41123;
count__41112 = G__41124;
i__41113 = G__41125;
continue;
}
} else {
return null;
}
}
break;
}
});
devtools.util.is_known_feature_QMARK_ = (function devtools$util$is_known_feature_QMARK_(known_features,feature){
return cljs.core.boolean$.call(null,cljs.core.some.call(null,cljs.core.PersistentHashSet.fromArray([feature], true),known_features));
});
devtools.util.convert_legacy_feature = (function devtools$util$convert_legacy_feature(feature){
var G__41127 = (((feature instanceof cljs.core.Keyword))?feature.fqn:null);
switch (G__41127) {
case "custom-formatters":
return new cljs.core.Keyword(null,"formatters","formatters",-1875637118);
break;
case "sanity-hints":
return new cljs.core.Keyword(null,"hints","hints",-991113151);
break;
default:
return feature;
}
});
devtools.util.convert_legacy_features = (function devtools$util$convert_legacy_features(features){
return cljs.core.map.call(null,devtools.util.convert_legacy_feature,features);
});
devtools.util.sanititze_features_BANG_ = (function devtools$util$sanititze_features_BANG_(features,feature_groups){
var known_features = new cljs.core.Keyword(null,"all","all",892129742).cljs$core$IFn$_invoke$arity$1(feature_groups);
var features__$1 = devtools.util.convert_legacy_features.call(null,features);
devtools.util.report_unknown_features_BANG_.call(null,features__$1,known_features);
return cljs.core.filter.call(null,cljs.core.partial.call(null,devtools.util.is_known_feature_QMARK_,known_features),features__$1);
});
devtools.util.resolve_features_BANG_ = (function devtools$util$resolve_features_BANG_(features_desc,feature_groups){
var features = (cljs.core.truth_((function (){var and__25118__auto__ = (features_desc instanceof cljs.core.Keyword);
if(and__25118__auto__){
return features_desc.call(null,feature_groups);
} else {
return and__25118__auto__;
}
})())?features_desc.call(null,feature_groups):(((features_desc == null))?new cljs.core.Keyword(null,"default","default",-1987822328).cljs$core$IFn$_invoke$arity$1(feature_groups):((cljs.core.seqable_QMARK_.call(null,features_desc))?features_desc:new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [features_desc], null)
)));
return devtools.util.sanititze_features_BANG_.call(null,features,feature_groups);
});
devtools.util.install_feature_BANG_ = (function devtools$util$install_feature_BANG_(feature,features_to_install,available_fn,install_fn){
if(cljs.core.truth_(cljs.core.some.call(null,cljs.core.PersistentHashSet.fromArray([feature], true),features_to_install))){
if(cljs.core.truth_((function (){var or__25130__auto__ = devtools.prefs.pref.call(null,new cljs.core.Keyword(null,"bypass-availability-checks","bypass-availability-checks",1934691680));
if(cljs.core.truth_(or__25130__auto__)){
return or__25130__auto__;
} else {
return available_fn.call(null,feature);
}
})())){
return install_fn.call(null);
} else {
return console.warn(devtools.util.feature_not_available_msg.call(null,feature));
}
} else {
return null;
}
});
//# sourceMappingURL=util.js.map?rel=1603199211312

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,7 @@
(ns devtools.version
(:require-macros [devtools.version :refer [get-current-version]]))
(def current-version (get-current-version))
(defn get-current-version []
current-version)

View file

@ -0,0 +1 @@
{:rename-macros {}, :renames {}, :use-macros {get-current-version devtools.version}, :excludes #{}, :name devtools.version, :imports nil, :requires nil, :uses nil, :defs {current-version {:name devtools.version/current-version, :file "docs/js/compiled/out/devtools/version.cljs", :line 4, :column 1, :end-line 4, :end-column 21, :meta {:file "/Users/simon/workspace/swinging-needle-meter/docs/js/compiled/out/devtools/version.cljs", :line 4, :column 6, :end-line 4, :end-column 21}}, get-current-version {:protocol-inline nil, :meta {:file "/Users/simon/workspace/swinging-needle-meter/docs/js/compiled/out/devtools/version.cljs", :line 6, :column 7, :end-line 6, :end-column 26, :arglists (quote ([]))}, :name devtools.version/get-current-version, :variadic false, :file "docs/js/compiled/out/devtools/version.cljs", :end-column 26, :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 6, :end-line 6, :max-fixed-arity 0, :fn-var true, :arglists (quote ([]))}}, :require-macros {devtools.version devtools.version}, :doc nil}

View file

@ -0,0 +1,9 @@
// Compiled by ClojureScript 1.9.229 {}
goog.provide('devtools.version');
goog.require('cljs.core');
devtools.version.current_version = "0.8.2";
devtools.version.get_current_version = (function devtools$version$get_current_version(){
return devtools.version.current_version;
});
//# sourceMappingURL=version.js.map?rel=1603199207052

View file

@ -0,0 +1 @@
{"version":3,"file":"\/Users\/simon\/workspace\/swinging-needle-meter\/docs\/js\/compiled\/out\/devtools\/version.js","sources":["version.cljs?rel=1603199207052"],"lineCount":9,"mappings":";AAAA;;AAGA,AAAKA,mCAAgB;AAErB,uCAAA,vCAAMC;AAAN,AACED","names":["devtools.version\/current-version","devtools.version\/get-current-version"]}