├── .gitignore
├── .travis.yml
├── LICENSE
├── README.md
├── boot.properties
├── build.boot
├── dev-resources
└── cljs-api.edn
├── dev
├── lambdax
│ └── boot
│ │ └── addons.clj
└── macro_debug.clj
├── env
├── dev
│ └── cljs
│ │ └── cljs_repl_web
│ │ └── config.cljs
└── prod
│ └── cljs
│ └── cljs_repl_web
│ └── config.cljs
├── resources
└── public
│ ├── android-chrome-144x144.png
│ ├── android-chrome-192x192.png
│ ├── android-chrome-36x36.png
│ ├── android-chrome-48x48.png
│ ├── android-chrome-72x72.png
│ ├── android-chrome-96x96.png
│ ├── apple-touch-icon-114x114.png
│ ├── apple-touch-icon-120x120.png
│ ├── apple-touch-icon-144x144.png
│ ├── apple-touch-icon-152x152.png
│ ├── apple-touch-icon-180x180.png
│ ├── apple-touch-icon-57x57.png
│ ├── apple-touch-icon-60x60.png
│ ├── apple-touch-icon-72x72.png
│ ├── apple-touch-icon-76x76.png
│ ├── apple-touch-icon-precomposed.png
│ ├── apple-touch-icon.png
│ ├── browserconfig.xml
│ ├── favicon-16x16.png
│ ├── favicon-32x32.png
│ ├── favicon-96x96.png
│ ├── favicon.ico
│ ├── index.html
│ ├── js
│ └── clojure-parinfer.js
│ ├── manifest.json
│ ├── mstile-144x144.png
│ ├── mstile-150x150.png
│ ├── mstile-310x150.png
│ ├── mstile-310x310.png
│ ├── mstile-70x70.png
│ ├── safari-pinned-tab.svg
│ └── styles
│ ├── css
│ ├── app.css
│ ├── chosen-sprite.png
│ ├── chosen-sprite@2x.png
│ ├── console.css
│ ├── material-design-iconic-font.min.css
│ ├── re-com.css
│ └── re-console-code-mirror.css
│ ├── fonts
│ ├── Material-Design-Iconic-Font.eot
│ ├── Material-Design-Iconic-Font.svg
│ ├── Material-Design-Iconic-Font.ttf
│ ├── Material-Design-Iconic-Font.woff
│ └── Material-Design-Iconic-Font.woff2
│ └── images
│ ├── cljs.svg
│ ├── header-bg.png
│ ├── loading_cljs.png
│ ├── logo.png
│ └── replumb_logo_img.png
├── scripts
├── brepl
├── brepl.bat
├── brepl.clj
├── build
├── build.bat
├── build.clj
├── node_repl
├── node_repl.bat
├── node_repl.clj
├── release
├── release.bat
├── release.clj
├── repl
├── repl.bat
├── repl.clj
├── sftp-deploy-prod
├── sftp-deploy-test
├── watch
├── watch.bat
└── watch.clj
├── src
├── clj
│ └── cljs_api
│ │ ├── generator.clj
│ │ └── utils.cljc
└── cljs
│ └── cljs_repl_web
│ ├── app.cljs
│ ├── cljs_api.cljs
│ ├── core.cljs
│ ├── gist.cljs
│ ├── handlers.cljs
│ ├── io.cljs
│ ├── localstorage.cljs
│ ├── markdown.cljs
│ ├── replumb_proxy.cljs
│ ├── subs.cljs
│ ├── views.cljs
│ └── views
│ └── utils.cljs
├── test
└── cljs
│ └── cljs_repl_web
│ ├── console
│ └── cljs_test.cljs
│ ├── core_test.cljs
│ └── suite.cljs
└── version.properties
/.gitignore:
--------------------------------------------------------------------------------
1 | pom.xml
2 | pom.xml.asc
3 | *jar
4 | *log
5 | lib/
6 | classes/
7 | target/
8 | checkouts/
9 | .lein-deps-sum
10 | .lein-repl-history
11 | .lein-plugins/
12 | .lein-failures
13 | .nrepl-port
14 | .nrepl-history
15 | .repl/
16 | figwheel_server.log
17 | out/
18 | *.orig
19 | .projectile
20 | .dir-locals.el
21 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: clojure
2 | sudo: false
3 | jdk:
4 | - oraclejdk8
5 | install:
6 | - wget -O boot.jar https://github.com/boot-clj/boot/releases/download/2.6.0-SNAPSHOT/boot.jar
7 | - java -jar boot.jar -V
8 | script: java -jar boot.jar test
9 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Eclipse Public License - v 1.0
2 |
3 | THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC
4 | LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
5 | CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
6 |
7 | 1. DEFINITIONS
8 |
9 | "Contribution" means:
10 |
11 | a) in the case of the initial Contributor, the initial code and documentation
12 | distributed under this Agreement, and
13 | b) in the case of each subsequent Contributor:
14 | i) changes to the Program, and
15 | ii) additions to the Program;
16 |
17 | where such changes and/or additions to the Program originate from and are
18 | distributed by that particular Contributor. A Contribution 'originates'
19 | from a Contributor if it was added to the Program by such Contributor
20 | itself or anyone acting on such Contributor's behalf. Contributions do not
21 | include additions to the Program which: (i) are separate modules of
22 | software distributed in conjunction with the Program under their own
23 | license agreement, and (ii) are not derivative works of the Program.
24 |
25 | "Contributor" means any person or entity that distributes the Program.
26 |
27 | "Licensed Patents" mean patent claims licensable by a Contributor which are
28 | necessarily infringed by the use or sale of its Contribution alone or when
29 | combined with the Program.
30 |
31 | "Program" means the Contributions distributed in accordance with this
32 | Agreement.
33 |
34 | "Recipient" means anyone who receives the Program under this Agreement,
35 | including all Contributors.
36 |
37 | 2. GRANT OF RIGHTS
38 | a) Subject to the terms of this Agreement, each Contributor hereby grants
39 | Recipient a non-exclusive, worldwide, royalty-free copyright license to
40 | reproduce, prepare derivative works of, publicly display, publicly
41 | perform, distribute and sublicense the Contribution of such Contributor,
42 | if any, and such derivative works, in source code and object code form.
43 | b) Subject to the terms of this Agreement, each Contributor hereby grants
44 | Recipient a non-exclusive, worldwide, royalty-free patent license under
45 | Licensed Patents to make, use, sell, offer to sell, import and otherwise
46 | transfer the Contribution of such Contributor, if any, in source code and
47 | object code form. This patent license shall apply to the combination of
48 | the Contribution and the Program if, at the time the Contribution is
49 | added by the Contributor, such addition of the Contribution causes such
50 | combination to be covered by the Licensed Patents. The patent license
51 | shall not apply to any other combinations which include the Contribution.
52 | No hardware per se is licensed hereunder.
53 | c) Recipient understands that although each Contributor grants the licenses
54 | to its Contributions set forth herein, no assurances are provided by any
55 | Contributor that the Program does not infringe the patent or other
56 | intellectual property rights of any other entity. Each Contributor
57 | disclaims any liability to Recipient for claims brought by any other
58 | entity based on infringement of intellectual property rights or
59 | otherwise. As a condition to exercising the rights and licenses granted
60 | hereunder, each Recipient hereby assumes sole responsibility to secure
61 | any other intellectual property rights needed, if any. For example, if a
62 | third party patent license is required to allow Recipient to distribute
63 | the Program, it is Recipient's responsibility to acquire that license
64 | before distributing the Program.
65 | d) Each Contributor represents that to its knowledge it has sufficient
66 | copyright rights in its Contribution, if any, to grant the copyright
67 | license set forth in this Agreement.
68 |
69 | 3. REQUIREMENTS
70 |
71 | A Contributor may choose to distribute the Program in object code form under
72 | its own license agreement, provided that:
73 |
74 | a) it complies with the terms and conditions of this Agreement; and
75 | b) its license agreement:
76 | i) effectively disclaims on behalf of all Contributors all warranties
77 | and conditions, express and implied, including warranties or
78 | conditions of title and non-infringement, and implied warranties or
79 | conditions of merchantability and fitness for a particular purpose;
80 | ii) effectively excludes on behalf of all Contributors all liability for
81 | damages, including direct, indirect, special, incidental and
82 | consequential damages, such as lost profits;
83 | iii) states that any provisions which differ from this Agreement are
84 | offered by that Contributor alone and not by any other party; and
85 | iv) states that source code for the Program is available from such
86 | Contributor, and informs licensees how to obtain it in a reasonable
87 | manner on or through a medium customarily used for software exchange.
88 |
89 | When the Program is made available in source code form:
90 |
91 | a) it must be made available under this Agreement; and
92 | b) a copy of this Agreement must be included with each copy of the Program.
93 | Contributors may not remove or alter any copyright notices contained
94 | within the Program.
95 |
96 | Each Contributor must identify itself as the originator of its Contribution,
97 | if
98 | any, in a manner that reasonably allows subsequent Recipients to identify the
99 | originator of the Contribution.
100 |
101 | 4. COMMERCIAL DISTRIBUTION
102 |
103 | Commercial distributors of software may accept certain responsibilities with
104 | respect to end users, business partners and the like. While this license is
105 | intended to facilitate the commercial use of the Program, the Contributor who
106 | includes the Program in a commercial product offering should do so in a manner
107 | which does not create potential liability for other Contributors. Therefore,
108 | if a Contributor includes the Program in a commercial product offering, such
109 | Contributor ("Commercial Contributor") hereby agrees to defend and indemnify
110 | every other Contributor ("Indemnified Contributor") against any losses,
111 | damages and costs (collectively "Losses") arising from claims, lawsuits and
112 | other legal actions brought by a third party against the Indemnified
113 | Contributor to the extent caused by the acts or omissions of such Commercial
114 | Contributor in connection with its distribution of the Program in a commercial
115 | product offering. The obligations in this section do not apply to any claims
116 | or Losses relating to any actual or alleged intellectual property
117 | infringement. In order to qualify, an Indemnified Contributor must:
118 | a) promptly notify the Commercial Contributor in writing of such claim, and
119 | b) allow the Commercial Contributor to control, and cooperate with the
120 | Commercial Contributor in, the defense and any related settlement
121 | negotiations. The Indemnified Contributor may participate in any such claim at
122 | its own expense.
123 |
124 | For example, a Contributor might include the Program in a commercial product
125 | offering, Product X. That Contributor is then a Commercial Contributor. If
126 | that Commercial Contributor then makes performance claims, or offers
127 | warranties related to Product X, those performance claims and warranties are
128 | such Commercial Contributor's responsibility alone. Under this section, the
129 | Commercial Contributor would have to defend claims against the other
130 | Contributors related to those performance claims and warranties, and if a
131 | court requires any other Contributor to pay any damages as a result, the
132 | Commercial Contributor must pay those damages.
133 |
134 | 5. NO WARRANTY
135 |
136 | EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN
137 | "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
138 | IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE,
139 | NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each
140 | Recipient is solely responsible for determining the appropriateness of using
141 | and distributing the Program and assumes all risks associated with its
142 | exercise of rights under this Agreement , including but not limited to the
143 | risks and costs of program errors, compliance with applicable laws, damage to
144 | or loss of data, programs or equipment, and unavailability or interruption of
145 | operations.
146 |
147 | 6. DISCLAIMER OF LIABILITY
148 |
149 | EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY
150 | CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
151 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION
152 | LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
153 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
154 | ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
155 | EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY
156 | OF SUCH DAMAGES.
157 |
158 | 7. GENERAL
159 |
160 | If any provision of this Agreement is invalid or unenforceable under
161 | applicable law, it shall not affect the validity or enforceability of the
162 | remainder of the terms of this Agreement, and without further action by the
163 | parties hereto, such provision shall be reformed to the minimum extent
164 | necessary to make such provision valid and enforceable.
165 |
166 | If Recipient institutes patent litigation against any entity (including a
167 | cross-claim or counterclaim in a lawsuit) alleging that the Program itself
168 | (excluding combinations of the Program with other software or hardware)
169 | infringes such Recipient's patent(s), then such Recipient's rights granted
170 | under Section 2(b) shall terminate as of the date such litigation is filed.
171 |
172 | All Recipient's rights under this Agreement shall terminate if it fails to
173 | comply with any of the material terms or conditions of this Agreement and does
174 | not cure such failure in a reasonable period of time after becoming aware of
175 | such noncompliance. If all Recipient's rights under this Agreement terminate,
176 | Recipient agrees to cease use and distribution of the Program as soon as
177 | reasonably practicable. However, Recipient's obligations under this Agreement
178 | and any licenses granted by Recipient relating to the Program shall continue
179 | and survive.
180 |
181 | Everyone is permitted to copy and distribute copies of this Agreement, but in
182 | order to avoid inconsistency the Agreement is copyrighted and may only be
183 | modified in the following manner. The Agreement Steward reserves the right to
184 | publish new versions (including revisions) of this Agreement from time to
185 | time. No one other than the Agreement Steward has the right to modify this
186 | Agreement. The Eclipse Foundation is the initial Agreement Steward. The
187 | Eclipse Foundation may assign the responsibility to serve as the Agreement
188 | Steward to a suitable separate entity. Each new version of the Agreement will
189 | be given a distinguishing version number. The Program (including
190 | Contributions) may always be distributed subject to the version of the
191 | Agreement under which it was received. In addition, after a new version of the
192 | Agreement is published, Contributor may elect to distribute the Program
193 | (including its Contributions) under the new version. Except as expressly
194 | stated in Sections 2(a) and 2(b) above, Recipient receives no rights or
195 | licenses to the intellectual property of any Contributor under this Agreement,
196 | whether expressly, by implication, estoppel or otherwise. All rights in the
197 | Program not expressly granted under this Agreement are reserved.
198 |
199 | This Agreement is governed by the laws of the State of New York and the
200 | intellectual property laws of the United States of America. No party to this
201 | Agreement will bring a legal action under this Agreement more than one year
202 | after the cause of action arose. Each party waives its rights to a jury trial in
203 | any resulting litigation.
204 |
205 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Clojure Web Repl ([clojurescript.io](http://www.clojurescript.io))
2 |
3 | A re-frame app designed to embed a pure ClojureScript REPL in a web
4 | page.
5 | Plumbing kindly provided by
6 |
7 |
8 | .
9 |
10 | This project also employs the following libraries, whose authors we thank:
11 |
12 | * [reagent](https://github.com/reagent-project/reagent)
13 | * [re-frame](https://github.com/Day8/re-frame)
14 | * [re-com](https://github.com/Day8/re-com)
15 | * [markdown-clj](https://github.com/yogthos/markdown-clj)
16 | * [hickory](https://github.com/davidsantiago/hickory)
17 | * [CodeMirror](https://github.com/codemirror/CodeMirror)
18 | * [showdown](https://github.com/showdownjs/showdown)
19 | * [enquire.js](https://github.com/WickyNilliams/enquire.js)
20 | * ...and more
21 |
22 | Last but not least, many kudos go to [@jaredly](https://github.com/jaredly) and
23 | his [Reepl](https://github.com/jaredly/reepl) with which we share the
24 | CodeMirror implementation (and yes, we released a separate component
25 | [library](https://github.com/Lambda-X/re-console) with it).
26 |
27 | ## Tooling
28 |
29 | We recently switched this project to [boot](http://boot-clj.com/)
30 |
31 | and we could not be more happy.
32 |
33 | ### Interactive workflow
34 |
35 | Type `boot dev` and then browse to [http://localhost:3000](http://localhost:3000).
36 |
37 | ### Build
38 |
39 | The same easy command is used to build the content directly, which will be
40 | materialized in the `target` folder:
41 |
42 | `boot build -t prod|dev target`
43 |
44 | The `build` command defaults to `prod` when called with no arguments.
45 |
46 | ### Deploy
47 |
48 | In order to deploy just follow the `build` task with `deploy-s3`:
49 |
50 | ```
51 | export ...
52 | export ...
53 | boot build -t prod|dev deploy-s3
54 | ```
55 |
56 | The environment variables to set up are listed
57 | [here](https://github.com/Lambda-X/cljs-repl-web/blob/devel/build.boot#L73)
58 |
59 |
60 | #### Config
61 |
62 | The `cljs-repl-web.config/defaults` var contains the configuration map:
63 |
64 | ```
65 | {:name "Clojurescript.io Website"
66 | :production? true|false
67 | :base-path "root/"
68 | :core-cache-url "/my-cache/core.cljs.cache.aot.json")
69 | :src-paths ["/some/path1" "/some/path2")]
70 | :verbose-repl? true|false}
71 | ```
72 |
73 | #### Serve files
74 |
75 | Sometimes it is useful to serve files from `target`, for instance to check if
76 | everything works fine, kind of simulating the deployment. With `boot` you don't
77 | need no more `python -m SimpleHTTPServer`, only:
78 |
79 | `boot serve -d target wait`
80 |
81 | Check `boot serve -h` for the other options.
82 |
83 | ## Testing
84 |
85 | Tests at the moment use PhantomJS but there are just a few.
86 |
87 | For headless tests you need first of all
88 | [PhantomJS](https://github.com/ariya/phantomjs/). Then you can:
89 |
90 | `boot test -t prod|dev`
91 |
92 | The `auto-test` tasks also provides automatic test execution on file change.
93 |
94 | Featuring [doo](https://github.com/bensu/doo).
95 |
96 | ## Other Resources
97 |
98 | * [CLJSJS](https://github.com/cljsjs/packages)
99 | * [Boot built-in tasks](https://github.com/boot-clj/boot/wiki/Built-in-Tasks)
100 |
101 | ### License
102 |
103 | Distributed under the Eclipse Public License, the same as Clojure.
104 |
105 | Copyright (C) 2015-16 Scalac Sp. z o.o.
106 |
107 | Scalac [scalac.io](http://scalac.io/?utm_source=scalac_github&utm_campaign=scalac1&utm_medium=web) is a full-stack team of great functional developers focused around Scala/Clojure backed by great frontend and mobile developers.
108 |
109 | On our [blog](http://blog.scalac.io/?utm_source=scalac_github&utm_campaign=scalac1&utm_medium=web) we share our knowledge with community on how to write great, clean code, how to work remotely and about our culture.
110 |
--------------------------------------------------------------------------------
/boot.properties:
--------------------------------------------------------------------------------
1 | #http://boot-clj.com
2 | #Mon Feb 15 13:35:26 PST 2016
3 | BOOT_CLOJURE_NAME=org.clojure/clojure
4 | BOOT_CLOJURE_VERSION=1.7.0
5 | BOOT_VERSION=2.6.0-SNAPSHOT
6 | BOOT_EMIT_TARGET=no
7 |
--------------------------------------------------------------------------------
/build.boot:
--------------------------------------------------------------------------------
1 | (def clojure-dep '[org.clojure/clojure "1.8.0"])
2 | (def clojurescript-dep '[org.clojure/clojurescript "1.8.40"])
3 |
4 | (set-env!
5 | :source-paths #{"dev"}
6 | :dependencies (conj '[;; Boot deps
7 | [adzerk/boot-cljs "1.7.228-1" :scope "test"]
8 | [pandeiro/boot-http "0.7.2" :scope "test"]
9 | [adzerk/boot-reload "0.4.4" :scope "test"]
10 | [degree9/boot-semver "1.2.4" :scope "test"]
11 | [replumb/boot-pack-source "0.1.2-1" :scope "test"]
12 | [confetti/confetti "0.1.2-SNAPSHOT" :scope "test"]
13 | [adzerk/env "0.3.0" :scope "test"]
14 |
15 | ;; Repl
16 | [adzerk/boot-cljs-repl "0.3.0" :scope "test"]
17 | [com.cemerick/piggieback "0.2.1" :scope "test"]
18 | [weasel "0.7.0" :scope "test"]
19 | [org.clojure/tools.nrepl "0.2.12" :scope "test"]
20 |
21 | ;; Tests
22 | [crisptrutski/boot-cljs-test "0.2.2-SNAPSHOT" :scope "test"]
23 |
24 | ;; App deps
25 | [org.clojure/core.async "0.2.374"]
26 | [reagent "0.6.0-SNAPSHOT"]
27 | [re-frame "0.7.0"]
28 | [replumb/replumb "0.2.2-SNAPSHOT"]
29 | [cljsjs/highlight "8.4-0"]
30 | [re-console "0.1.4-SNAPSHOT"]
31 | [re-com "0.8.1"]
32 | [cljs-ajax "0.5.1"]
33 | [hickory "0.5.4"]
34 | [cljsjs/showdown "0.4.0-1"]
35 | [org.clojure/tools.reader "1.0.0-alpha3"]
36 | [cljsjs/enquire "2.1.2-0"]
37 | [com.cemerick/piggieback "0.2.1"]
38 | [org.clojars.stumitchell/clairvoyant "0.2.0"]
39 | [binaryage/devtools "0.6.0"]
40 | [day8/re-frame-tracer "0.1.0-SNAPSHOT"]
41 | [cljsjs/codemirror "5.10.0-0"]
42 | [adzerk/cljs-console "0.1.1"]
43 | [re-complete "0.1.4-1-SNAPSHOT"]]
44 | clojure-dep clojurescript-dep))
45 |
46 | (def pack-source-deps (conj '[[replumb/replumb "0.2.2-SNAPSHOT"]
47 | [org.clojure/tools.reader "1.0.0-alpha3"]]
48 | clojurescript-dep))
49 |
50 | (def cljs-api-deps (conj '[[org.clojure/tools.reader "1.0.0-alpha3"]
51 | [endophile "0.1.2"]
52 | [markdown-clj "0.9.78"]]
53 | clojure-dep))
54 |
55 | (require '[adzerk.boot-cljs :refer [cljs]]
56 | '[adzerk.boot-reload :refer [reload]]
57 | '[pandeiro.boot-http :refer [serve]]
58 | '[crisptrutski.boot-cljs-test :refer [test-cljs exit!]]
59 | '[adzerk.boot-cljs-repl :refer [cljs-repl start-repl]]
60 | '[boot-semver.core :refer :all]
61 | '[boot.pod :as pod]
62 | '[clojure.pprint :refer [pprint]]
63 | '[replumb.boot-pack-source :refer [pack-source]]
64 | '[confetti.boot-confetti :refer [create-site sync-bucket]]
65 | '[adzerk.env :as env]
66 | '[lambdax.boot.addons :as addons])
67 |
68 | (def +version+ (get-version))
69 |
70 | ;;;;;;;;;;;;;;;;;;;;;;;
71 | ;;; Env Variables ;;;
72 | ;;;;;;;;;;;;;;;;;;;;;;;
73 |
74 | (env/def
75 | AWS_BUCKET nil
76 | AWS_ACCESS_KEY nil
77 | AWS_SECRET_KEY nil
78 | AWS_CLOUDFRONT_ID nil)
79 |
80 | ;;;;;;;;;;;;;;;;;;;;;;
81 | ;;; Options ;;;
82 | ;;;;;;;;;;;;;;;;;;;;;;
83 |
84 | (task-options! pom {:project "cljs-repl-web"
85 | :version +version+}
86 | test-cljs {:js-env :phantom
87 | :out-file "phantom-tests.js"})
88 |
89 | (def foreign-libs
90 | [{:file "resources/public/js/clojure-parinfer.js"
91 | :provides ["parinfer.codemirror.mode.clojure.clojure-parinfer"]}])
92 |
93 | (def prod-compiler-options
94 | {:closure-defines {"goog.DEBUG" false
95 | "clairvoyant.core.devmode" false}
96 | :optimize-constants true
97 | :static-fns true
98 | :elide-asserts true
99 | :pretty-print false
100 | :source-map-timestamp true
101 | :dump-core false
102 | :parallel-build true
103 | :foreign-libs foreign-libs})
104 |
105 | (def dev-compiler-options
106 | (merge prod-compiler-options
107 | {:closure-defines {"goog.DEBUG" true
108 | "clairvoyant.core.devmode" true}}))
109 |
110 | (defmulti options
111 | "Return the correct option map for the build, dispatching on identity"
112 | identity)
113 |
114 | (defmethod options :generators
115 | [selection]
116 | {:type :generator
117 | :env {:source-paths #{"dev" "src/clj"}
118 | :resource-paths #{"dev-resources"}}})
119 |
120 | (defmethod options :dev
121 | [selection]
122 | {:type :dev
123 | :props {"CLJS_LOG_LEVEL" "DEBUG"}
124 | :env {:source-paths #{"src/clj" "src/cljs" "env/dev/cljs" "dev"}
125 | :resource-paths #{"resources/public/"}}
126 | :cljs {:source-map true
127 | :optimizations :simple
128 | :compiler-options dev-compiler-options}
129 | :test-cljs {:optimizations :simple
130 | :cljs-opts dev-compiler-options
131 | :suite-ns 'cljs-repl-web.suite}})
132 |
133 | (defmethod options :prod
134 | [selection]
135 | {:type :prod
136 | :props {"CLJS_LOG_LEVEL" "INFO"}
137 | :env {:source-paths #{"src/clj" "src/cljs" "env/prod/cljs"}
138 | :resource-paths #{"resources/public/"}}
139 | :cljs {:optimizations :simple
140 | :compiler-options prod-compiler-options}
141 | :test-cljs {:optimizations :simple
142 | :cljs-opts prod-compiler-options
143 | :suite-ns 'cljs-repl-web.suite}})
144 |
145 | (defn set-system-properties!
146 | "Set a system property for each entry in the map m."
147 | [m]
148 | (doseq [kv m]
149 | (System/setProperty (key kv) (val kv))))
150 |
151 | (deftask version-file
152 | "A task that includes the version.properties file in the fileset."
153 | []
154 | (with-pre-wrap [fileset]
155 | (boot.util/info "Add version.properties...\n")
156 | (-> fileset
157 | (add-resource (java.io.File. ".") :include #{#"^version\.properties$"})
158 | commit!)))
159 |
160 | (declare add-cache add-cljs-source)
161 |
162 | ;;;;;;;;;;;;;;;;;;
163 | ;; MAIN TASKS ;;
164 | ;;;;;;;;;;;;;;;;;;
165 |
166 | (deftask build
167 | "Build the final artifact, if no type is passed in, it builds production."
168 | [t type VAL kw "The build type, either prod or dev"]
169 | (let [options (options (or type :prod))]
170 | (boot.util/info "Building %s profile...\n" (:type options))
171 | (apply set-env! (reduce #(into %2 %1) [] (:env options)))
172 | (set-system-properties! (:props options))
173 | (comp (version-file)
174 | (apply cljs (reduce #(into %2 %1) [] (:cljs options)))
175 | (sift :include #{#"main.out"}
176 | :invert true)
177 | (add-cljs-source)
178 | (add-cache :dir "js-cache"))))
179 |
180 | (deftask dev
181 | "Start the dev interactive environment."
182 | []
183 | (boot.util/info "Starting interactive dev...\n")
184 | (let [options (options :dev)]
185 | (apply set-env! (reduce #(into %2 %1) [] (:env options)))
186 | (set-system-properties! (:props options))
187 | (comp (version-file)
188 | (watch)
189 | (cljs-repl)
190 | (reload :on-jsload 'cljs-repl-web.core/main)
191 | (apply cljs (reduce #(into %2 %1) [] (:cljs options)))
192 | (add-cljs-source)
193 | (add-cache :dir "js-cache")
194 | (serve))))
195 |
196 | ;;;;;;;;;;;;;;;;;;;;;
197 | ;; TEST (please) ;;
198 | ;;;;;;;;;;;;;;;;;;;;;
199 |
200 | ;; This prevents a name collision WARNING between the test task and
201 | ;; clojure.core/test, a function that nobody really uses or cares
202 | ;; about.
203 | (ns-unmap 'boot.user 'test)
204 |
205 | (defn test-cljs-opts
206 | [options namespaces exit?]
207 | (cond-> options
208 | namespaces (-> (update-in [:test-cljs :suite-ns] (fn [_] nil))
209 | (assoc-in [:test-cljs :namespaces] namespaces))
210 | exit? (assoc-in [:test-cljs :exit?] exit?)))
211 |
212 | (defn set-test-env!
213 | [options]
214 | (apply set-env! (reduce #(into %2 %1) [] (update-in (:env options) [:source-paths] conj "test/cljs"))))
215 |
216 | (deftask test
217 | "Run tests once.
218 |
219 | If no type is passed in, it tests against the production build. It
220 | optionally accepts (a set of) regular expressions that are used for testing
221 | only some namespaces."
222 | [t type VAL kw "The build type, either prod or dev"
223 | n namespace NAMESPACE #{regex} "Namespace regex to test against"]
224 | (let [options (-> (options (or type :prod))
225 | (test-cljs-opts namespace true))]
226 | (boot.util/info "Testing options %s\n" (with-out-str (pprint options)))
227 | (set-test-env! options)
228 | (apply test-cljs (reduce #(into %2 %1) [] (:test-cljs options)))))
229 |
230 | (deftask auto-test
231 | "Run tests watching for file changes.
232 |
233 | If no type is passed in, it tests against the production build. It optionally
234 | accepts (a set of) regular expressions that are used for testing only some
235 | namespaces."
236 | [t type VAL kw "The build type, either prod or dev"
237 | n namespace NAMESPACE #{regex} "Namespace regex to test against"]
238 | (let [options (-> (options (or type :prod))
239 | (test-cljs-opts namespace false))]
240 | (set-test-env! options)
241 | (comp (watch)
242 | (apply test-cljs (reduce #(into %2 %1) [] (:test-cljs options))))))
243 |
244 | ;;;;;;;;;;;;;;;;;;;
245 | ;; OTHER TASKS ;;
246 | ;;;;;;;;;;;;;;;;;;;
247 |
248 | (deftask add-cljs-source
249 | []
250 | (comp (with-pre-wrap [fs]
251 | (boot.util/info "Pack source files...\n")
252 | fs)
253 | (pack-source :to-dir "cljs-src"
254 | :deps (into #{} pack-source-deps)
255 | :exclusions '#{org.clojure/clojure
256 | org.mozilla/rhino})))
257 |
258 | (deftask deploy-s3
259 | [y dry-run bool "Run dryly :)"
260 | p prune bool "Delete files from S3 bucket not in the current fileset"]
261 | (let [bucket (get (env/env) "AWS_BUCKET")]
262 | (boot.util/info "Deploying on bucket %s...\n" bucket)
263 | (sync-bucket :dry-run dry-run
264 | :prune prune
265 | :bucket bucket
266 | :access-key (get (env/env) "AWS_ACCESS_KEY")
267 | :secret-key (get (env/env) "AWS_SECRET_KEY")
268 | :cloudfront-id (get (env/env) "AWS_CLOUDFRONT_ID"))))
269 |
270 | (deftask cljs-api
271 | "The task generates the Clojurescript API and the cljs-repl-web.cljs-api
272 | namespace.
273 |
274 | It does NOT add it to the fileset, but calls cljs-api.generator/-main and
275 | dumps in src/cljs (hard coded). It should not be part of the build pipeline
276 | unless there is a ClojureScript version change, in which case it should be
277 | executed once:
278 |
279 | # boot cljs-api"
280 | []
281 | (let [custom-env (:env (options :generators))
282 | pod-env (-> (get-env)
283 | (assoc :dependencies cljs-api-deps)
284 | (update :directories concat
285 | (:source-paths custom-env)
286 | (:resource-paths custom-env)))
287 | pod (future (pod/make-pod pod-env))]
288 | (with-pass-thru fs
289 | (boot.util/info "Generating cljs-api...\n")
290 | (pod/with-eval-in @pod
291 | (require 'cljs-api.generator)
292 | (cljs-api.generator/-main)))))
293 |
294 | (def dump-cache-deps '[[boot/core "2.6.0-SNAPSHOT"]
295 | [com.cognitect/transit-clj "0.8.285"]])
296 |
297 | (deftask transit-jsonify
298 | "Materializes the transit+json file resulting from the input transit file path.
299 |
300 | The new file will be added to the fileset root and it is up to the next tasks
301 | to move it to the proper place (use sift --move for this)."
302 | [p transit-path PATH str "The fileset path to the cache file in transit format"
303 | n json-name NAME str "The name of the transit+json file"]
304 | (let [custom-env (:env (options :generators))
305 | pod-env (-> (get-env)
306 | (assoc :dependencies dump-cache-deps)
307 | (update :directories concat
308 | (:source-paths custom-env)
309 | (:resource-paths custom-env)))
310 | pod (future (pod/make-pod pod-env))]
311 | (dbug "transit-path %s - json-name %s\n" transit-path json-name)
312 | (with-pre-wrap fs
313 | (commit!
314 | (let [tmp-dir (tmp-dir!)
315 | input-path (->> transit-path (tmp-get fs) (tmp-file) (.getPath))
316 | out-path (str (addons/normalize-path (.getPath tmp-dir)) json-name)]
317 | (let [new-fs (if-let [transit-json (pod/with-eval-in @pod
318 | (require '[lambdax.boot.addons :as addons])
319 | (.getPath (addons/transit-json ~input-path ~out-path)))]
320 | (do (dbug "Conversion produced %s\n" transit-json)
321 | (add-resource fs tmp-dir))
322 | (do (warn "Could not perform Transit/Json conversion, skipping...\n")
323 | fs))]
324 | (pod/destroy-pod @pod) ;; AR - ugly, I need to find a better way
325 | new-fs))))))
326 |
327 | (deftask add-cache
328 | "The task fetches the core.cljs.cache.aot file from your .m2, and materializes it on the classpath.
329 |
330 | It is added to the filese so it should be part of the build pipeline:
331 |
332 | $ boot build add-cache target"
333 | [d dir PATH str "The dir path where to dump the cljs.core cache file"]
334 | (assert dir "The dir param cannot be nil")
335 | (let [dir (addons/normalize-path dir)
336 | cache-json-name "core.cljs.cache.aot.json"
337 | cache-fs-path "cljs/core.cljs.cache.aot.edn"
338 | cache-fs-path-regex (re-pattern cache-fs-path)]
339 | (comp (with-pass-thru fs
340 | (info "Adding cljs.core cache to %s...\n" dir))
341 | (sift :add-jar {(first clojurescript-dep) cache-fs-path-regex})
342 | (transit-jsonify :transit-path cache-fs-path :json-name cache-json-name)
343 | (sift :include #{cache-fs-path-regex} :invert true)
344 | (sift :move {(re-pattern cache-json-name) (str dir cache-json-name)}))))
345 |
--------------------------------------------------------------------------------
/dev/lambdax/boot/addons.clj:
--------------------------------------------------------------------------------
1 | (ns lambdax.boot.addons
2 | {:boot/export-tasks true}
3 | (:require [boot.core :as core :refer [boot]]
4 | [boot.pod :as pod]
5 | [boot.util :as util]
6 | [clojure.java.io :as io]
7 | [cognitect.transit :as transit])
8 | (:import [java.io ByteArrayOutputStream]))
9 |
10 | (defn transit-json
11 | "Convert a transit file to a transit json file.
12 | Returns the new java.io.File on completion or nil if it fails."
13 | [src-path out-path]
14 | (try
15 | (let [cache (read-string (slurp (io/file src-path)))
16 | out (ByteArrayOutputStream. 1000000)]
17 | (transit/write (transit/writer out :json) cache)
18 | (doto (io/file out-path)
19 | (spit (.toString out "UTF-8"))))
20 | (catch Exception e
21 | (.printStackTrace e *err*)
22 | nil)))
23 |
24 | (defn normalize-path
25 | "Adds a / if missing at the end of the path."
26 | [path]
27 | (str path (when-not (= "/" (last path)) "/")))
28 |
--------------------------------------------------------------------------------
/dev/macro_debug.clj:
--------------------------------------------------------------------------------
1 | (ns ^{:doc
2 | "Thanks to Michael Bradley's following file we are able to debug macros in Clojurescript
3 | https://gist.github.com/michaelsbradleyjr/7509505"}
4 | macro-debug
5 | (:require [cljs.analyzer :as cljs]
6 | clojure.walk))
7 |
8 | (declare ap
9 | cljs-macroexpand*
10 | cljs-macroexpand-1*
11 | cljs-macroexpand-all*
12 |
13 | cljs-macroexpand
14 | cljs-macroexpand-1
15 | cljs-macroexpand-all
16 | debug-*
17 |
18 | ->compiler-console
19 | ->js-log
20 |
21 | debug-*->*
22 | debug->cons
23 | debug-1->cons
24 | debug-all->cons
25 | debug->js
26 | debug-1->js
27 | debug-all->js
28 | defalias
29 |
30 | debug
31 | debug-1
32 | debug-all
33 | expand-symbol
34 | ppstring
35 | prccon)
36 |
37 | (def ^:dynamic *out-fn* nil)
38 |
39 | ;; macros and supporting funcs for macro dev and debug in ClojureScript projects
40 | ;; -----------------------------------------------------------------------------
41 |
42 | (defmacro ^{:private true} ap
43 | [f]
44 | `(apply ~f (conj 'args '&env)))
45 |
46 | (defn cljs-macroexpand*
47 | [env form]
48 | (let [ex (cljs-macroexpand-1* env form)]
49 | (if (identical? ex form)
50 | form
51 | (recur env ex))))
52 |
53 | (defn cljs-macroexpand-1*
54 | [env form]
55 | (cljs/macroexpand-1 env form))
56 |
57 | (defn cljs-macroexpand-all*
58 | [env form]
59 | (clojure.walk/prewalk (fn [x] (if (seq? x) (cljs-macroexpand* env x) x)) form))
60 |
61 | (defmacro cljs-macroexpand
62 | [& args]
63 | (ap cljs-macroexpand*))
64 |
65 | (defmacro cljs-macroexpand-1
66 | [& args]
67 | (ap cljs-macroexpand-1*))
68 |
69 | (defmacro cljs-macroexpand-all
70 | [& args]
71 | (ap cljs-macroexpand-all*))
72 |
73 | (defn- debug-*
74 | [env which expander args]
75 | (let [args (if (< (count args) 2) (conj args nil) args)
76 | [descrip form] args
77 | expanded (expander env form)
78 | expstrng (str "\n"
79 | (str "DESCRIPTION: " (or descrip "(no description supplied)"))
80 | "\n"
81 | "\n"
82 | (str "BEFORE " which
83 | "\n"
84 | "\n"
85 | (ppstring form))
86 | "\n"
87 | (str "AFTER " which
88 | "\n"
89 | "\n"
90 | (ppstring expanded))
91 | "\n")]
92 | (*out-fn* expstrng)))
93 |
94 | (defn- ->compiler-console
95 | [val]
96 | `(do ~(prccon val)))
97 |
98 | (defn- ->js-log
99 | [val]
100 | `(do (.log js/console ~val)))
101 |
102 | (defmacro ^{:private true} debug-*->*
103 | [which out-fn]
104 | (list 'binding ['*out-fn* out-fn]
105 | (list 'debug-* '&env which (symbol (str "cljs-" which "*")) 'args)))
106 |
107 | (defmacro debug->cons
108 | [& args]
109 | (debug-*->* "macroexpand" ->compiler-console))
110 |
111 | (defmacro debug-1->cons
112 | [& args]
113 | (debug-*->* "macroexpand-1" ->compiler-console))
114 |
115 | (defmacro debug-all->cons
116 | [& args]
117 | (debug-*->* "macroexpand-all" ->compiler-console))
118 |
119 | (defmacro debug->js
120 | [& args]
121 | (debug-*->* "macroexpand" ->js-log))
122 |
123 | (defmacro debug-1->js
124 | [& args]
125 | (debug-*->* "macroexpand-1" ->js-log))
126 |
127 | (defmacro debug-all->js
128 | [& args]
129 | (debug-*->* "macroexpand-all" ->js-log))
130 |
131 | (defmacro ^{:private true} defalias
132 | ([name orig]
133 | `(do
134 | (alter-meta!
135 | (if (.hasRoot (var ~orig))
136 | (def ~name (.getRawRoot (var ~orig)))
137 | (def ~name))
138 | #(conj (dissoc % :macro)
139 | (apply dissoc (meta (var ~orig)) (remove #{:macro} (keys %)))))
140 | (var ~name)))
141 | ([name orig doc]
142 | (list `defalias (with-meta name (assoc (meta name) :doc doc)) orig)))
143 |
144 | (defalias debug debug->cons)
145 |
146 | (defalias debug-1 debug-1->cons)
147 |
148 | (defalias debug-all debug-all->cons)
149 |
150 | (defn expand-symbol
151 | "Resolves a symbol to a namespaced symbol, relative to some environment as
152 | obtained with &env within a macro definition."
153 | [env sym]
154 | (:name (cljs/resolve-var env sym)))
155 |
156 | (defn ppstring
157 | [v]
158 | (with-out-str (clojure.pprint/pprint v)))
159 |
160 | (defn prccon
161 | "Prints to the compiler's console at compile time. Sprinkle as needed within
162 | macros and their supporting functions to facilitate debugging during
163 | development."
164 | [& args]
165 | (binding [*out* *err*]
166 | (apply println args)))
167 |
--------------------------------------------------------------------------------
/env/dev/cljs/cljs_repl_web/config.cljs:
--------------------------------------------------------------------------------
1 | (ns cljs-repl-web.config)
2 |
3 | (def defaults
4 | (let [base-path ""]
5 | {:name "Clojurescript.io Website (DEV)"
6 | :production? false
7 | :base-path base-path
8 | :core-cache-url (str base-path "/js-cache/core.cljs.cache.aot.json")
9 | :src-paths [(str base-path "/cljs-src")]
10 | :version-path (str base-path "/version.properties")
11 | :verbose-repl? true}))
12 |
--------------------------------------------------------------------------------
/env/prod/cljs/cljs_repl_web/config.cljs:
--------------------------------------------------------------------------------
1 | (ns cljs-repl-web.config)
2 |
3 | (def defaults
4 | (let [base-path ""]
5 | {:name "Clojurescript.io Website"
6 | :production? true
7 | :base-path base-path
8 | :core-cache-url (str base-path "/js-cache/core.cljs.cache.aot.json")
9 | :src-paths [(str base-path "/cljs-src")]
10 | :version-path (str base-path "/version.properties")
11 | :verbose-repl? true}))
12 |
--------------------------------------------------------------------------------
/resources/public/android-chrome-144x144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lambda-X/cljs-repl-web/0dabe8ff18d8c0f4ae6c9f052dc23eb1f5ad262c/resources/public/android-chrome-144x144.png
--------------------------------------------------------------------------------
/resources/public/android-chrome-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lambda-X/cljs-repl-web/0dabe8ff18d8c0f4ae6c9f052dc23eb1f5ad262c/resources/public/android-chrome-192x192.png
--------------------------------------------------------------------------------
/resources/public/android-chrome-36x36.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lambda-X/cljs-repl-web/0dabe8ff18d8c0f4ae6c9f052dc23eb1f5ad262c/resources/public/android-chrome-36x36.png
--------------------------------------------------------------------------------
/resources/public/android-chrome-48x48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lambda-X/cljs-repl-web/0dabe8ff18d8c0f4ae6c9f052dc23eb1f5ad262c/resources/public/android-chrome-48x48.png
--------------------------------------------------------------------------------
/resources/public/android-chrome-72x72.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lambda-X/cljs-repl-web/0dabe8ff18d8c0f4ae6c9f052dc23eb1f5ad262c/resources/public/android-chrome-72x72.png
--------------------------------------------------------------------------------
/resources/public/android-chrome-96x96.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lambda-X/cljs-repl-web/0dabe8ff18d8c0f4ae6c9f052dc23eb1f5ad262c/resources/public/android-chrome-96x96.png
--------------------------------------------------------------------------------
/resources/public/apple-touch-icon-114x114.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lambda-X/cljs-repl-web/0dabe8ff18d8c0f4ae6c9f052dc23eb1f5ad262c/resources/public/apple-touch-icon-114x114.png
--------------------------------------------------------------------------------
/resources/public/apple-touch-icon-120x120.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lambda-X/cljs-repl-web/0dabe8ff18d8c0f4ae6c9f052dc23eb1f5ad262c/resources/public/apple-touch-icon-120x120.png
--------------------------------------------------------------------------------
/resources/public/apple-touch-icon-144x144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lambda-X/cljs-repl-web/0dabe8ff18d8c0f4ae6c9f052dc23eb1f5ad262c/resources/public/apple-touch-icon-144x144.png
--------------------------------------------------------------------------------
/resources/public/apple-touch-icon-152x152.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lambda-X/cljs-repl-web/0dabe8ff18d8c0f4ae6c9f052dc23eb1f5ad262c/resources/public/apple-touch-icon-152x152.png
--------------------------------------------------------------------------------
/resources/public/apple-touch-icon-180x180.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lambda-X/cljs-repl-web/0dabe8ff18d8c0f4ae6c9f052dc23eb1f5ad262c/resources/public/apple-touch-icon-180x180.png
--------------------------------------------------------------------------------
/resources/public/apple-touch-icon-57x57.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lambda-X/cljs-repl-web/0dabe8ff18d8c0f4ae6c9f052dc23eb1f5ad262c/resources/public/apple-touch-icon-57x57.png
--------------------------------------------------------------------------------
/resources/public/apple-touch-icon-60x60.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lambda-X/cljs-repl-web/0dabe8ff18d8c0f4ae6c9f052dc23eb1f5ad262c/resources/public/apple-touch-icon-60x60.png
--------------------------------------------------------------------------------
/resources/public/apple-touch-icon-72x72.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lambda-X/cljs-repl-web/0dabe8ff18d8c0f4ae6c9f052dc23eb1f5ad262c/resources/public/apple-touch-icon-72x72.png
--------------------------------------------------------------------------------
/resources/public/apple-touch-icon-76x76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lambda-X/cljs-repl-web/0dabe8ff18d8c0f4ae6c9f052dc23eb1f5ad262c/resources/public/apple-touch-icon-76x76.png
--------------------------------------------------------------------------------
/resources/public/apple-touch-icon-precomposed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lambda-X/cljs-repl-web/0dabe8ff18d8c0f4ae6c9f052dc23eb1f5ad262c/resources/public/apple-touch-icon-precomposed.png
--------------------------------------------------------------------------------
/resources/public/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lambda-X/cljs-repl-web/0dabe8ff18d8c0f4ae6c9f052dc23eb1f5ad262c/resources/public/apple-touch-icon.png
--------------------------------------------------------------------------------
/resources/public/browserconfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | #2b5797
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/resources/public/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lambda-X/cljs-repl-web/0dabe8ff18d8c0f4ae6c9f052dc23eb1f5ad262c/resources/public/favicon-16x16.png
--------------------------------------------------------------------------------
/resources/public/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lambda-X/cljs-repl-web/0dabe8ff18d8c0f4ae6c9f052dc23eb1f5ad262c/resources/public/favicon-32x32.png
--------------------------------------------------------------------------------
/resources/public/favicon-96x96.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lambda-X/cljs-repl-web/0dabe8ff18d8c0f4ae6c9f052dc23eb1f5ad262c/resources/public/favicon-96x96.png
--------------------------------------------------------------------------------
/resources/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lambda-X/cljs-repl-web/0dabe8ff18d8c0f4ae6c9f052dc23eb1f5ad262c/resources/public/favicon.ico
--------------------------------------------------------------------------------
/resources/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |