├── .gitignore
├── LICENSE
├── Makefile
├── Procfile
├── README.md
├── RELEASE_CHECKLIST.md
├── bin
└── rename-project.sh
├── dev
├── client
│ └── cljs
│ │ └── user.cljs
└── server
│ └── user.clj
├── docs
└── img
│ ├── figwheel.png
│ └── server.png
├── package.json
├── project.clj
├── resources
└── public
│ ├── cards.html
│ ├── css
│ ├── edn.css
│ └── test.css
│ ├── index-dev.html
│ ├── index.html
│ └── test.html
├── script
└── figwheel.clj
├── specs
├── client
│ └── untangled_template
│ │ ├── all_tests.cljs
│ │ ├── sample_spec.cljs
│ │ ├── spec_main.cljs
│ │ ├── tests_to_run.cljs
│ │ └── ui
│ │ └── root_spec.cljs
└── server
│ └── sample
│ └── sample_spec.clj
└── src
├── cards
└── untangled_template
│ ├── cards.cljs
│ └── intro.cljs
├── client
└── untangled_template
│ ├── core.cljs
│ ├── main.cljs
│ ├── state
│ └── mutations.cljs
│ └── ui
│ ├── components.cljs
│ ├── login.cljs
│ ├── main.cljs
│ ├── new_user.cljs
│ └── root.cljs
└── server
├── config
├── defaults.edn
├── dev.edn
└── prod.edn
└── untangled_template
├── api
├── mutations.clj
└── read.clj
├── core.clj
└── system.clj
/.gitignore:
--------------------------------------------------------------------------------
1 | *.class
2 | *.iml
3 | *.jar
4 | .idea
5 | checkouts
6 | classes
7 | figwheel_server.log
8 | lein-template.iml
9 | node_modules
10 | pom.xml
11 | pom.xml.asc
12 | resources/public/js
13 | target
14 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright 2016 NAVIS
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
4 | documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
5 | rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
6 | persons to whom the Software is furnished to do so, subject to the following conditions:
7 |
8 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
9 |
10 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
11 | WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
12 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
13 | OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
14 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | LEIN_RUN = rlwrap lein run -m clojure.main ./script/figwheel.clj
2 |
3 | # Run the dev and test cljs builds in figwheel
4 | dev:
5 | lein do clean, -U deps ; JVM_OPTS="-server -Ddev -Dtest" ${LEIN_RUN}
6 |
7 | # Run the test cljs builds in figwheel
8 | test:
9 | JVM_OPTS="-server -Dtest" ${LEIN_RUN}
10 |
11 | # Run the cards cljs builds in figwheel
12 | cards:
13 | JVM_OPTS="-server -Dcards" ${LEIN_RUN}
14 |
15 | # Run a REPL capable of running the web server
16 | server:
17 | rlwrap lein run -m clojure.main
18 |
19 | server-tests:
20 | lein test-refresh :run-once
21 |
22 | # Run the command-line (karma-based) automated cljs tests
23 | ci-cljs-tests:
24 | npm install
25 | lein do clean, doo chrome automated-tests once
26 |
27 | # Run all tests (once) from the command line. Useful for CI
28 | ci-tests: ci-cljs-tests server-tests
29 |
30 | clean:
31 | lein clean
32 |
33 | rename:
34 | bin/rename-project.sh
35 |
36 | help:
37 | @ make -rpn | sed -n -e '/^$$/ { n ; /^[^ ]*:/p; }' | sort | egrep --color '^[^ ]*:'
38 |
39 | .PHONY: dev test cards server server-tests ci-cljs-tests ci-tests clean rename help
40 |
--------------------------------------------------------------------------------
/Procfile:
--------------------------------------------------------------------------------
1 | web: java $JVM_OPTS -Dconfig=config/prod.edn -jar target/untangled_template.jar
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Template
2 |
3 | This is a Full Stack template with specs, dev cards, and client code.
4 | It contains a mock login/signup screen, top-level tab routing (once logged in), etc.
5 |
6 | You must run the server (and use it through the server) for login to work, but ANY username/password are accepted. The
7 | server always approves login.
8 |
9 | It is set up to be deployable to Heroku (or anywhere) as a standalone jar.
10 |
11 | ## Contents
12 |
13 | ```
14 | ├── Makefile Convenience targets
15 | ├── Procfile Sample Heroku deployment file
16 | ├── dev
17 | │ ├── client
18 | │ │ └── cljs
19 | │ │ └── user.cljs REPL helpers and entry point for cljs dev mode
20 | │ └── server
21 | │ └── user.clj REPL functions for starting server and cljs builds
22 | ├── package.json NODE config, used for running CI cljs tests
23 | ├── project.clj
24 | ├── resources
25 | │ └── public
26 | │ ├── cards.html Devcards HTML page
27 | │ ├── css
28 | │ │ ├── edn.css CSS files for rendering specs in browser
29 | │ │ └── test.css
30 | │ ├── index-dev.html Dev mode application home page
31 | │ ├── index.html Production mode application home page
32 | │ └── test.html Tests HTML page
33 | ├── script
34 | │ └── figwheel.clj CLJ script for starting figwheel automatically
35 | ├── specs
36 | │ ├── client
37 | │ │ └── untangled_template
38 | │ │ ├── all_tests.cljs CI file for running all tests
39 | │ │ ├── sample_spec.cljs Sample CLJS specification
40 | │ │ ├── spec_main.cljs File to join all specs into a browser-runnable spec
41 | │ │ ├── tests_to_run.cljs Common file (for CI and Browser) to ensure all tests are loaded
42 | │ │ └── ui
43 | │ │ └── root_spec.cljs Sample Specification
44 | │ ├── config
45 | │ └── server
46 | │ └── sample
47 | │ └── sample_spec.clj Sample Server-side specification
48 | ├── src
49 | │ ├── cards
50 | │ │ └── untangled_template
51 | │ │ ├── cards.cljs Devcards setup
52 | │ │ └── intro.cljs Sample Devcard
53 | │ ├── client
54 | │ │ └── untangled_template
55 | │ │ ├── core.cljs Definition of app. Used by production and dev modes
56 | │ │ ├── main.cljs Production entry point for cljs app
57 | │ │ ├── state
58 | │ │ │ └── mutations.cljs A place to put Om mutations
59 | │ │ └── ui
60 | │ │ ├── components.cljs Sample UI component
61 | │ │ ├── login.cljs UI Login screen. Includes some mutations.
62 | │ │ ├── main.cljs UI Main screen
63 | │ │ ├── new_user.cljs UI New User Screen
64 | │ │ └── root.cljs Root UI with Union query for tab switching. Includes nav mutations.
65 | │ └── server
66 | │ ├── config Server EDN configuration files
67 | │ │ ├── defaults.edn Always applied (but always used as a base for config merge)
68 | │ │ ├── dev.edn Dev-mode config (auto-selected by user.clj setup)
69 | │ │ └── prod.edn Production-mode config. Selected via -Dconfig=config/prod.edn
70 | │ └── untangled_template
71 | │ ├── api
72 | │ │ ├── mutations.clj Server-side Om mutations
73 | │ │ └── read.clj Server-side Om queries
74 | │ ├── core.clj Server-side entry point for production mode
75 | │ └── system.clj Server-side system configuration (shared for dev and production)
76 | ```
77 |
78 | ## Setting up Run Configurations (IntelliJ)
79 |
80 | Add a figwheel config:
81 |
82 |
83 |
84 | Add a server config:
85 |
86 |
87 |
88 | Then run *both* from IntelliJ.
89 |
90 | ## Using from other editors
91 |
92 | See the Makefile for useful command-line targets, which are useful for
93 | when working from a lower-level system editor.
94 |
95 | The simplest approach is to start a REPL:
96 |
97 | ```
98 | lein repl
99 | ```
100 |
101 | *You will need two REPLs*: one for the server, and one for you dev builds of the client.
102 |
103 | There is a pre-supplied function named `start-figwheel` that will start the cljs builds and figwheel hot code push.
104 |
105 | ## Using the server
106 |
107 | In the server REPL, start the server with:
108 |
109 | ```
110 | (go)
111 | ```
112 |
113 | To reload the server code:
114 |
115 | ```
116 | (reset)
117 | ```
118 |
119 | IF your compile fails, Recompile after failed compile:
120 |
121 | ```
122 | (refresh)
123 | (go)
124 | ```
125 |
126 | If you cannot find `refresh`, try:
127 |
128 | ```
129 | (tools-ns/refresh)
130 | ```
131 |
132 | ## Using the Full Stack App (dev mode)
133 |
134 | Open a browser on:
135 |
136 | ```
137 | http://localhost:3000/index-dev.html
138 | ```
139 |
140 | ## Dev Cards
141 |
142 | Open a browser on:
143 |
144 | ```
145 | http://localhost:3449/cards.html
146 | ```
147 |
148 | ## Specs
149 |
150 | Open a browser on:
151 |
152 | ```
153 | http://localhost:3449/test.html
154 | ```
155 |
156 | ## Continuous Integration Tests
157 |
158 | The project is set up to be able to run both the UI and Server tests from a
159 | standard *NIX command-line (untested with Windows, but works with OSX and
160 | Linux).
161 |
162 | The UI tests use node, karma, and doo to accomplish tests.
163 |
164 | The Makefile has targets for running the various CI tests modes. You
165 | must install Node and NPM. In OSX, Home Brew can make quick work of that.
166 |
167 | ## Makefile
168 |
169 | There is a GNU `Makefile` in the project that can start various command
170 | line interactions. This file is commented so you can see what targets
171 | are valid.
172 |
173 | Example: Run a REPL that is ready to run the Untangled Server:
174 |
175 | ```
176 | make server
177 | ```
178 |
179 | # Deploying
180 |
181 | Build the standalone Jar with:
182 |
183 | ```
184 | lein uberjar
185 | ```
186 |
187 | will build `target/untangled_template.jar`.
188 |
189 | The production `prod.edn` file (in src/config) grabs the web PORT from
190 | the environment (as required by Heroku). So, this jar can be run with:
191 |
192 | ```
193 | export PORT=8080 # the web server port to use
194 | java -Dconfig=config/prod.edn -jar untangled_template.jar
195 | ```
196 |
197 | The `Procfile` gives the correct information to heroku, so if you've
198 | configured the app (see Heroku docs) you should be able to deploy with
199 | git:
200 |
201 | ```
202 | git push heroku master
203 | ```
204 |
--------------------------------------------------------------------------------
/RELEASE_CHECKLIST.md:
--------------------------------------------------------------------------------
1 | # RELEASE CHECKLIST
2 |
3 | Before releasing a new version of this template, you must ensure the
4 | following things work as expected:
5 |
6 | - Versions
7 | - All deps are up-to-date
8 | - All tooling (lein plugins, etc) are up-to-date
9 | - There are NO warnings from `lein deps :tree`
10 | - IDE Development for IntelliJ, Emacs, and VIM
11 | - Figwheel
12 | - Server run AND code reload
13 | - Uberjar build:
14 | - Does a production cljs build
15 | - Includes all necessary resources and files
16 | - Is runnable according to the README instructions
17 | - The UI works
18 | - The server can be configured (e.g. PORT) as described in README
19 | - The following figwheel configs work as expected, and hot reload:
20 | - CSS
21 | - Cards
22 | - General development
23 | - Tests
24 | - Tests
25 | - Are runnable from UI (client)
26 | - Work with test-refresh (server)
27 | - Are runnable from CI (server and client)
28 |
--------------------------------------------------------------------------------
/bin/rename-project.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | ([[ -n "$DEBUG" ]] || [[ -n "$TRACE" ]]) && set -x
3 | set -e
4 |
5 | assert_clean_work_tree () {
6 | if [[ -z "$OVERRIDE" ]] && [[ -n "$(git status -s)" ]]; then
7 | echo "[ERROR]: Uncommited changes!"
8 | git status
9 | exit 1
10 | fi
11 | }
12 |
13 | search_and_replace () {
14 | #LC_ALL=C is important because we have utf-8 symbols in the readme
15 | #and sed will corrupt them & git will explode otherwise
16 | #stackoverflow.com/questions/19242275/re-error-illegal-byte-sequence-on-mac-os-x
17 | #stackoverflow.com/questions/1115854/how-to-resolve-error-bad-index-fatal-index-file-corrupt-when-using-git
18 | export LC_ALL=C
19 | for f in $(grep --exclude="$0" --exclude-dir=".git" -lr "$1" *); do
20 | #using .bak in place extension for portability between sed versions
21 | #is more portable (& easier) than no backup
22 | sed -i.bak "s/$1/$2/g" "$f"
23 | rm ${f}.bak
24 | done
25 | unset LC_ALL
26 | }
27 |
28 | rename_matching_dirs () {
29 | for d in $(find . -type d -name "$1"); do
30 | mv "$d" "$(dirname $d)/$2"
31 | done
32 | }
33 |
34 | main () {
35 | assert_clean_work_tree
36 | read -p "Renaming 'untangled-template' to: " ns
37 | search_and_replace "untangled-template" "$ns"
38 | local fdir="${ns//-/_}"
39 | search_and_replace "untangled_template" "$fdir"
40 | rename_matching_dirs "untangled_template" "$fdir"
41 | }
42 |
43 | main "$@"
44 |
--------------------------------------------------------------------------------
/dev/client/cljs/user.cljs:
--------------------------------------------------------------------------------
1 | (ns cljs.user
2 | (:require
3 | [untangled.client.core :as uc]
4 | [om.next :as om]
5 |
6 | [untangled-template.core :as core]
7 | [untangled-template.ui.root :as root]
8 |
9 | [cljs.pprint :refer [pprint]]))
10 |
11 | (enable-console-print!)
12 |
13 | (reset! core/app (uc/mount @core/app root/Root "app"))
14 |
15 | (defn app-state [] @(:reconciler @core/app))
16 |
17 | (defn log-app-state [& keywords]
18 | (pprint (let [app-state (app-state)]
19 | (if (= 0 (count keywords))
20 | app-state
21 | (select-keys app-state keywords)))))
22 |
23 | (defn dump-query [comp]
24 | (let [component (om/class->any (:reconciler @core/app) comp)]
25 | (om/full-query component)))
26 |
27 | (defn dump-query-kw [kw]
28 | (let [component (om/ref->any (:reconciler @core/app) kw)]
29 | (om/full-query component)))
30 |
31 | (defn q
32 | "Run the query of the given UI class and return the result as a map of the query that was run and the data that was returned.
33 | NOTE: If the component is mounted in several places on the UI, you may not get the expected result. Be sure to check
34 | the QUERY part of the result to see the query used."
35 | [ui-class]
36 | (let [query (dump-query ui-class)
37 | state (app-state)]
38 | {:QUERY query
39 | :RESULT (om/db->tree query state state)}))
40 |
41 | (defn qkw
42 | "Find a component that uses the given keyword in its query, then run that query against the app database and show
43 | the result. NOTE: If more than one component matches, your results may vary. Be sure to examine the query that
44 | was used."
45 | [query-kw]
46 | (let [query (dump-query-kw query-kw)
47 | state (app-state)]
48 | {:QUERY query
49 | :RESULT (om/db->tree query state state)}))
50 |
--------------------------------------------------------------------------------
/dev/server/user.clj:
--------------------------------------------------------------------------------
1 | (ns user
2 | (:require
3 | [clojure.pprint :refer [pprint]]
4 | [clojure.stacktrace :refer [print-stack-trace]]
5 |
6 | [clojure.tools.namespace.repl :as tools-ns :refer [set-refresh-dirs]]
7 | [com.stuartsierra.component :as component]
8 | [figwheel-sidecar.system :as fig]
9 | [untangled-template.system :as sys]))
10 |
11 | ;;FIGWHEEL
12 | (def figwheel (atom nil))
13 |
14 | ; Usable from a REPL to start one-or-more figwheel builds
15 | (defn start-figwheel
16 | "Start Figwheel on the given builds, or defaults to build-ids in `figwheel-config`."
17 | ([]
18 | (let [figwheel-config (fig/fetch-config)
19 | props (System/getProperties)
20 | all-builds (->> figwheel-config :data :all-builds (mapv :id))]
21 | (start-figwheel (keys (select-keys props all-builds)))))
22 | ([build-ids]
23 | (let [figwheel-config (fig/fetch-config)
24 | default-build-ids (-> figwheel-config :data :build-ids)
25 | build-ids (if (empty? build-ids) default-build-ids build-ids)
26 | preferred-config (assoc-in figwheel-config [:data :build-ids] build-ids)]
27 | (reset! figwheel (component/system-map
28 | :css-watcher (fig/css-watcher {:watch-paths ["resources/public/css"]})
29 | :figwheel-system (fig/figwheel-system preferred-config)))
30 | (println "STARTING FIGWHEEL ON BUILDS: " build-ids)
31 | (swap! figwheel component/start)
32 | (fig/cljs-repl (:figwheel-system @figwheel)))))
33 |
34 | ;; ==================== SERVER ====================
35 |
36 | (set-refresh-dirs "dev/server" "src/server" "specs/server")
37 |
38 | (defn started? [sys]
39 | (-> sys :config :value))
40 |
41 | (defonce system (atom nil))
42 | (def cfg-paths {:dev "config/dev.edn"})
43 |
44 | (defn refresh [& args]
45 | {:pre [(not @system)]}
46 | (apply tools-ns/refresh args))
47 |
48 | (defn init [path]
49 | {:pre [(not (started? @system))
50 | (get cfg-paths path)]}
51 | (when-let [new-system (sys/make-system (get cfg-paths path))]
52 | (reset! system new-system)))
53 |
54 | (defn start []
55 | {:pre [@system (not (started? @system))]}
56 | (swap! system component/start))
57 |
58 | (defn stop []
59 | (when (started? @system)
60 | (swap! system component/stop))
61 | (reset! system nil))
62 |
63 | (defn go
64 | ([] (go :dev))
65 | ([path] {:pre [(not @system) (not (started? @system))]}
66 | (init path)
67 | (start)))
68 |
69 | (defn reset []
70 | (stop)
71 | (refresh :after 'user/go))
72 |
73 | (defn engage [path & build-ids]
74 | (stop) (go path) (start-figwheel build-ids))
75 |
--------------------------------------------------------------------------------
/docs/img/figwheel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/untangled-web/untangled-template/af934820cf8f73567dc2f6a87b976b022dedf416/docs/img/figwheel.png
--------------------------------------------------------------------------------
/docs/img/server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/untangled-web/untangled-template/af934820cf8f73567dc2f6a87b976b022dedf416/docs/img/server.png
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "untangled-template-spec",
3 | "version": "1.0.0",
4 | "description": "Testing",
5 | "main": "index.js",
6 | "directories": {},
7 | "dependencies": {
8 | },
9 | "devDependencies": {
10 | "karma": "^0.13.19",
11 | "karma-chrome-launcher": "^0.2.2",
12 | "karma-cljs-test": "^0.1.0",
13 | "karma-firefox-launcher": "^0.1.7"
14 | },
15 | "author": "",
16 | "license": "MIT"
17 | }
18 |
--------------------------------------------------------------------------------
/project.clj:
--------------------------------------------------------------------------------
1 | (defproject untangled-template "0.1.0-SNAPSHOT"
2 | :description "A clonable & upstream untangled template"
3 | :license {:name "MIT" :url "https://opensource.org/licenses/MIT"}
4 |
5 | :dependencies [[org.clojure/clojure "1.9.0-alpha14"]
6 | [org.clojure/clojurescript "1.9.494"]
7 | [commons-io "2.5"]
8 |
9 | [navis/untangled-client "0.7.0"]
10 | [untangled/om-css "1.0.0"]
11 | [org.omcljs/om "1.0.0-alpha48"]
12 |
13 | [navis/untangled-spec "0.3.9" :scope "test" :exclusions [io.aviso/pretty]]
14 | [lein-doo "0.1.7" :scope "test"]
15 | [org.clojure/core.async "0.2.395"]
16 | [http-kit "2.2.0"]
17 | [com.taoensso/timbre "4.7.4"]
18 | [navis/untangled-server "0.7.0"]]
19 |
20 | :plugins [[lein-cljsbuild "1.1.5"]
21 | [lein-doo "0.1.7"]
22 | [com.jakemccrary/lein-test-refresh "0.17.0"]]
23 |
24 | :doo {:build "automated-tests"
25 | :paths {:karma "node_modules/karma/bin/karma"}}
26 |
27 | :uberjar-name "untangled_template.jar"
28 |
29 | :test-refresh {:report untangled-spec.reporters.terminal/untangled-report
30 | :with-repl true
31 | :changes-only true}
32 |
33 | :source-paths ["src/server"]
34 | :test-paths ["specs" "specs/server" "specs/config"]
35 | :clean-targets ^{:protect false} ["target" "resources/public/js" "resources/private"]
36 |
37 | :figwheel {:css-dirs ["resources/public/css"]}
38 |
39 | :cljsbuild {:builds [{:id "production"
40 | :source-paths ["src/client"]
41 | :jar true
42 | :compiler {:asset-path "js/prod"
43 | :main untangled-template.main
44 | :optimizations :simple
45 | :output-dir "resources/public/js/prod"
46 | :output-to "resources/public/js/untangled_template.min.js"}}
47 | {:id "dev"
48 | :figwheel true
49 | :source-paths ["src/client" "dev/client"]
50 | :compiler {:asset-path "js/dev"
51 | :external-config
52 | {:devtools/config
53 | ;;github.com/binaryage/cljs-devtools/blob/master/docs/configuration.md
54 | {:print-config-overrides true}}
55 | :main cljs.user
56 | :optimizations :none
57 | :output-dir "resources/public/js/dev"
58 | :output-to "resources/public/js/untangled_template.js"
59 | :preloads [devtools.preload]
60 | :source-map-timestamp true}}
61 | {:id "test"
62 | :source-paths ["specs/client" "src/client"]
63 | :figwheel true
64 | :compiler {:asset-path "js/specs"
65 | :main untangled-template.spec-main
66 | :optimizations :none
67 | :output-dir "resources/public/js/specs"
68 | :output-to "resources/public/js/specs.js"
69 | :preloads [devtools.preload]}}
70 | {:id "automated-tests"
71 | :source-paths ["specs/client" "src/client"]
72 | :compiler {:asset-path "js/ci"
73 | :main untangled-template.all-tests
74 | :optimizations :none
75 | :output-dir "resources/private/js/ci"
76 | :output-to "resources/private/js/unit-tests.js"}}
77 | {:id "cards"
78 | :figwheel {:devcards true}
79 | :source-paths ["src/client" "src/cards"]
80 | :compiler {:asset-path "js/cards"
81 | :main untangled-template.cards
82 | :optimizations :none
83 | :output-dir "resources/public/js/cards"
84 | :output-to "resources/public/js/cards.js"
85 | :preloads [devtools.preload]
86 | :source-map-timestamp true}}]}
87 |
88 | :profiles {:uberjar {:main untangled-template.core
89 | :aot :all
90 | :prep-tasks ["compile"
91 | ["cljsbuild" "once" "production"]]}
92 | :dev {:source-paths ["dev/client" "dev/server" "src/client" "src/server"]
93 | :dependencies [[binaryage/devtools "0.9.1"]
94 | [org.clojure/tools.namespace "0.2.11"]
95 | [com.cemerick/piggieback "0.2.1"]
96 | [figwheel-sidecar "0.5.9" :exclusions [org.clojure/tools.reader]]
97 | [devcards "0.2.2" :exclusions [org.omcljs/om]]]
98 | :repl-options {:init-ns user
99 | :nrepl-middleware [cemerick.piggieback/wrap-cljs-repl]}}})
100 |
--------------------------------------------------------------------------------
/resources/public/cards.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |