Skip to content

Commit d35a5b2

Browse files
committed
Support project-level configuration for some settings
#379 #202
1 parent eccc7b7 commit d35a5b2

File tree

4 files changed

+108
-47
lines changed

4 files changed

+108
-47
lines changed

README.md

+30
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,36 @@ Reagent Versions | React Versions | re-frame-10x Artifact | Status |
249249
250250
re-frame-10x includes an experimental code tracing feature for tracing the code in your event handlers. See [day8/re-frame-debux](https://github.com/day8/re-frame-debux) for instructions on how to set it up.
251251
252+
### Project configuration
253+
254+
For some settings, re-frame-10x supports project-level configuration via additional [closure-defines](https://clojurescript.org/reference/compiler-options#closure-defines). This way, some default behavior of 10x can be version-controlled alongside your project. Example:
255+
256+
```cljs
257+
{:closure-defines
258+
{re-frame.trace.trace-enabled? true
259+
day8.re-frame.tracing.trace-enabled? true
260+
day8.re-frame-10x.hidden-namespaces "[com.me.uninteresting re-com.box]"}}
261+
```
262+
263+
- Settings which are already stored take precedence. Be sure to [clear your localStore](https://superuser.com/questions/519628/clear-html5-local-storage-on-a-specific-page) for your project-level config to take effect.
264+
265+
- Keys always begin with `day8.re-frame-10x.`
266+
267+
- Any value which is a collection must appear stringified, due to [limitations in the closure compiler](https://github.com/google/closure-compiler/wiki/Annotating-JavaScript-for-the-Closure-Compiler#define-type-description)
268+
269+
Supported keys:
270+
271+
name | description | type | example
272+
------------------|--------------|----------------|-------
273+
...`history-size` | how many epochs to retain | integer | `25`
274+
...`ignored-events` | ignore events of this type | seq of keywords | `"[:init :event-B]"`
275+
...`hidden-namespaces` | hide trace from these namespaces | seq of symbols | `"[re-com.box re-com.input-text]"`
276+
...`time-travel?` | selecting an event reverts your app-db | boolean | `true`
277+
...`ignored-libs` | ignore low-level trace | seq of keywords | `"[:reagent :re-frame]"`
278+
...`ns-aliases` | display aliased keywords in data inspectors | map of symbol->symbol | `"{long-namespace ln}"`
279+
280+
281+
252282
## Usage
253283
254284
- **Make sure you have followed all of the installation instructions above.**

src/day8/re_frame_10x.cljs

+24-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
[day8.re-frame-10x.inlined-deps.spade.git-sha-93ef290.react :as spade.react]
99
[day8.reagent.impl.batching :refer [patch-next-tick]]
1010
[day8.reagent.impl.component :refer [patch-wrap-funs patch-custom-wrapper]]
11+
[day8.re-frame-10x.tools.coll :refer [sortable-uuid-map pred-map]]
1112
[day8.re-frame-10x.tools.datafy :as tools.datafy]
13+
[day8.re-frame-10x.tools.reader.edn :as reader.edn]
1214
[day8.re-frame-10x.tools.shadow-dom :as tools.shadow-dom]
1315
[day8.re-frame-10x.events :as events]
1416
[day8.re-frame-10x.components.re-com :as rc]
@@ -146,8 +148,29 @@
146148
(patch-wrap-funs)
147149
(patch-next-tick))
148150

151+
(goog-define history-size 25)
152+
(goog-define ignored-events "{}")
153+
(goog-define hidden-namespaces "[re-com.box re-com.input-text]")
154+
(goog-define time-travel? true)
155+
(goog-define ignored-libs "[:reagent :re-frame]")
156+
(goog-define ns-aliases "{long-namespace ln}")
157+
158+
(def project-config
159+
(let [read reader.edn/read-string-maybe
160+
keep-vals (remove (comp nil? second))
161+
view #(do {:ns % :ns-str (str %)})
162+
alias (fn [[k v]] {:ns-full (str k) :ns-alias (str v)})]
163+
(->> {:debug? debug?
164+
:retained-epochs history-size
165+
:ignored-events (some-> ignored-events read sortable-uuid-map)
166+
:filtered-view-trace (some->> hidden-events read (map view) sortable-uuid-map)
167+
:app-db-follows-events? time-travel?
168+
:low-level-trace (some-> ignored-libs read (pred-map #{:re-frame :reagent}))
169+
:ns-aliases (some->> ns-aliases read (map alias) sortable-uuid-map)}
170+
(into {} keep-vals))))
171+
149172
(defn init!
150173
[]
151174
(patch!)
152-
(rf/dispatch-sync [::events/init {:debug? debug?}])
175+
(rf/dispatch-sync [::events/init project-config])
153176
(inject!))

src/day8/re_frame_10x/events.cljs

+42-45
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,8 @@
1111
[day8.re-frame-10x.navigation.views :as navigation.views]
1212
[day8.re-frame-10x.panels.app-db.events :as app-db.events]
1313
[day8.re-frame-10x.panels.settings.events :as settings.events]
14-
[day8.re-frame-10x.panels.traces.events :as traces.events]))
15-
16-
(defn sortable-uuid-map [vals]
17-
(let [entry (fn [id v i]
18-
[id (into {:id id :sort i} v)])]
19-
(into {} (map entry (repeatedly random-uuid) vals (range)))))
14+
[day8.re-frame-10x.panels.traces.events :as traces.events]
15+
[day8.re-frame-10x.tools.coll :refer [sortable-uuid-map]]))
2016

2117
(rf/reg-event-fx
2218
::init
@@ -56,45 +52,46 @@
5652
(rf/inject-cofx ::local-storage/load {:key "ns-aliases"
5753
:or (sortable-uuid-map [{:ns-full "long-namespace" :ns-alias "ln"}])})
5854
rf/unwrap]
59-
(fn [{:keys [panel-width-ratio show-panel selected-tab filter-items app-db-json-ml-expansions
60-
external-window? external-window-dimensions show-epoch-traces? using-trace?
61-
ignored-events low-level-trace filtered-view-trace retained-epochs app-db-paths
62-
app-db-follows-events? ambiance syntax-color-scheme categories data-path-annotations?
63-
show-event-history open-new-inspectors? handle-keys? key-bindings log-outputs log-pretty?
64-
ns-aliases]}
65-
{:keys [debug?]}]
66-
{:fx [(when using-trace?
67-
[:dispatch [::settings.events/enable-tracing]])
68-
[:dispatch [::settings.events/panel-width% panel-width-ratio]]
69-
[:dispatch [::settings.events/show-panel? show-panel]]
70-
[:dispatch [::settings.events/selected-tab selected-tab]]
71-
[:dispatch [::settings.events/set-ignored-events ignored-events]]
72-
[:dispatch [::settings.events/set-filtered-view-trace filtered-view-trace]]
73-
[:dispatch [::settings.events/set-low-level-trace low-level-trace]]
74-
[:dispatch [::settings.events/set-number-of-retained-epochs retained-epochs]]
75-
[:dispatch [::settings.events/app-db-follows-events? app-db-follows-events?]]
76-
[:dispatch [::settings.events/set-ambiance ambiance]]
77-
[:dispatch [::settings.events/set-syntax-color-scheme syntax-color-scheme]]
78-
[:dispatch [::settings.events/debug? debug?]]
79-
;; Important that window dimensions are set before we open an external window.
80-
[:dispatch [::settings.events/external-window-dimensions external-window-dimensions]]
81-
[:dispatch [::app-db.events/set-data-path-annotations? data-path-annotations?]]
82-
(when external-window?
83-
[:dispatch [::navigation.events/launch-external navigation.views/mount]])
84-
[:dispatch [::traces.events/set-queries filter-items]]
85-
[:dispatch [::traces.events/set-categories categories]]
86-
[:dispatch [::traces.events/set-filter-by-selected-epoch? show-epoch-traces?]]
87-
[:dispatch [::app-db.events/paths (into (sorted-map) app-db-paths)]]
88-
[:dispatch [::app-db.events/set-json-ml-paths app-db-json-ml-expansions]]
89-
[:dispatch [:global/add-unload-hook]]
90-
[:dispatch [::app-db.events/reagent-id]]
91-
[:dispatch [::settings.events/show-event-history? show-event-history]]
92-
[:dispatch [::settings.events/open-new-inspectors? open-new-inspectors?]]
93-
[:dispatch [::settings.events/handle-keys? handle-keys?]]
94-
[:dispatch [::settings.events/key-bindings key-bindings]]
95-
[:dispatch [::settings.events/log-outputs log-outputs]]
96-
[:dispatch [::settings.events/log-pretty? log-pretty?]]
97-
[:dispatch [::settings.events/ns-aliases ns-aliases]]]}))
55+
(fn [{::local-storage/keys [stored fallback]} project-config]
56+
(let [{:keys [panel-width-ratio show-panel selected-tab filter-items app-db-json-ml-expansions
57+
external-window? external-window-dimensions show-epoch-traces? using-trace?
58+
ignored-events low-level-trace filtered-view-trace retained-epochs app-db-paths
59+
app-db-follows-events? ambiance syntax-color-scheme categories data-path-annotations?
60+
show-event-history open-new-inspectors? handle-keys? key-bindings log-outputs log-pretty?
61+
ns-aliases debug?]}
62+
(merge fallback project-config stored)]
63+
{:fx [(when using-trace?
64+
[:dispatch [::settings.events/enable-tracing]])
65+
[:dispatch [::settings.events/panel-width% panel-width-ratio]]
66+
[:dispatch [::settings.events/show-panel? show-panel]]
67+
[:dispatch [::settings.events/selected-tab selected-tab]]
68+
[:dispatch [::settings.events/set-ignored-events ignored-events]]
69+
[:dispatch [::settings.events/set-filtered-view-trace filtered-view-trace]]
70+
[:dispatch [::settings.events/set-low-level-trace low-level-trace]]
71+
[:dispatch [::settings.events/set-number-of-retained-epochs retained-epochs]]
72+
[:dispatch [::settings.events/app-db-follows-events? app-db-follows-events?]]
73+
[:dispatch [::settings.events/set-ambiance ambiance]]
74+
[:dispatch [::settings.events/set-syntax-color-scheme syntax-color-scheme]]
75+
[:dispatch [::settings.events/debug? debug?]]
76+
;; Important that window dimensions are set before we open an external window.
77+
[:dispatch [::settings.events/external-window-dimensions external-window-dimensions]]
78+
[:dispatch [::app-db.events/set-data-path-annotations? data-path-annotations?]]
79+
(when external-window?
80+
[:dispatch [::navigation.events/launch-external navigation.views/mount]])
81+
[:dispatch [::traces.events/set-queries filter-items]]
82+
[:dispatch [::traces.events/set-categories categories]]
83+
[:dispatch [::traces.events/set-filter-by-selected-epoch? show-epoch-traces?]]
84+
[:dispatch [::app-db.events/paths (into (sorted-map) app-db-paths)]]
85+
[:dispatch [::app-db.events/set-json-ml-paths app-db-json-ml-expansions]]
86+
[:dispatch [:global/add-unload-hook]]
87+
[:dispatch [::app-db.events/reagent-id]]
88+
[:dispatch [::settings.events/show-event-history? show-event-history]]
89+
[:dispatch [::settings.events/open-new-inspectors? open-new-inspectors?]]
90+
[:dispatch [::settings.events/handle-keys? handle-keys?]]
91+
[:dispatch [::settings.events/key-bindings key-bindings]]
92+
[:dispatch [::settings.events/log-outputs log-outputs]]
93+
[:dispatch [::settings.events/log-pretty? log-pretty?]]
94+
[:dispatch [::settings.events/ns-aliases ns-aliases]]]})))
9895

9996
;; Global
10097

src/day8/re_frame_10x/tools/coll.cljs

+12-1
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,15 @@
5454
:else
5555
(get ret k)))
5656
m
57-
ks))
57+
ks))
58+
59+
(defn sortable-uuid-map [ms]
60+
(let [entry (fn [id v i]
61+
[id (into {:id id :sort i} v)])]
62+
(into {} (map entry (repeatedly random-uuid) ms (range)))))
63+
64+
(defn pred-map [ks possible-ks]
65+
(let [ks (set ks)]
66+
(into {}
67+
(map #(do [% (contains? ks %)]))
68+
possible-ks)))

0 commit comments

Comments
 (0)