<commit_before>## 0.5.4-4 added :preloads compiler option

* added validation support for :preloads compiler option

* ! removed compojure as a dependency
  Figwheel used compojure in its server to handle routing
  this was overkill, it compilcated the routing and added an unneeded dependency.
  Strange things where happening when `wrap-reload` was being used in an
  embedded `:ring-handler`.  
  There is so little routing functionality in figwheel that I just created
  what was needed with simple ring middleware. If the behavior of your
  :ring-handler changes (routes not being resolved, bad headers etc.)
  please let me know.  For reference here is the commit:
  https://github.com/bhauman/lein-figwheel/commit/f027b10188ed9d1baa6ec04bbdd14e6a493f68b0
* improved the resiliency of the plugin around bad initial config data
  the lein plugin uses config data from the project.clj before its
  has been validated, I added some extra safe guards to protect against
  stack dumps

## 0.5.4-3 some improvements around starting figwheel from the REPL

* I added back `figwheel-sidecar/get-project-builds` which was removed in 0.5.4
  its now here to stay.

#### Improved the expressiveness of (start-figwheel!)

before `(start-figwheel!)` only optionally took a configuration. Now it
takes optional build-ids as well.

So you can do this:

```
(start-figwheel! "dev" "admin")
```

And it will pull in the config from the environment and start
autobuilding the supplied build ids.

Or you can supply a config and build ids ...

```
(start-fighweel!
  {:figwheel-options {:server-port 4000}
   :all-builds [{:id ...}]}
   "dev" "admin")
```

I have also beefed up the error checking and feedback around this call.


## 0.5.4-2 Quick fix for failure due to composite lein profiles

* my profile merging code was choking on composite lein profiles

## 0.5.4 Error messages and way more!

This is the most solid release of Figwheel so far ... enjoy!!

#### Code context in Errors and Warnings

This means you will see the compile errors and warnings displayed
along with the offending code and a pointer to the position of the
failure. This is a big improvement. I've found that even for simple
errors, that I've become accustomed to, the new errors tend to beam the
information into my head much more quickly.

The code pointers are rough at times and no code context information
will be displayed if Figwheel doesn't get any line and column information
from the compiler.

The new error display can be improved further, and I plan to do so.  I
just wanted to get the bits hooked up and a decent display out the
door first.

* added code context to compile errors in heads up display,
  figwheel_server.log and REPL output
* added code context to compile warnings as well

#### Improved Build correctness

There have been several correctness problems that have dogged Figwheel
for a while.

The most important change here is that I have made all code that runs
in the plugin only depend on libs that are either natively available
in Clojure or are included with Leiningen. This should rid us of the
many ways that Figwheel was incompatible with other plugins and
environments. I really had to learn the hard way that this is the only
way to develop Leiningen plugins, and in hindsight, it makes a lot of sense.

A downside of this is that Figwheel "appears" to start slower. But all
my tests have shown that it is starting slightly faster.  And .... as
a bonus `lein trampoline` works very well with Figwheel now.

If you are not already familiar with `lein trampoline`, the following
command will cache the startup args the first time it is run, and will
only launch one JVM on the next execution.

```
LEIN_FAST_TRAMPOLINE=y lein trampoline figwheel
```

In my setup I have the following script in on my path. Using it shaves seconds
off of my startup time

file::/User/bhauman/bin/figt
```
#!/bin/bash

LEIN_FAST_TRAMPOLINE=y rlwrap lein trampoline figwheel "$@"
```

* I have added startup and runtime checks to ensure that the various
  Figwheel library versions match.
* I added a check to the client that will warn you if you are getting messages
  from a server that is a different version than the client.
* Automatically clean a cljs build if the classpath changes or if the
  build `:source-paths` change or if certain ClojureScript compiler
  options change. This means that if you add a dependency in your
  project.clj the next time you start figwheel it will detect that
  change and clean out the build assets before compiling. If you have
  a simple classpath that points to a directory of jars this won't
  help you, but I think this will help a great majority of users.

#### DOA helper application

This is a user experience improvement experiment.  There has been a
problem when the initial compile fails and you open the browser and
nothing happens and your REPL doesn't work.

Inspired by Elm, I am now emitting a small application that announces
the problem when you load it in the browser. This application is a
figwheel client so that it will respond to and display compilation
messages and will provide a REPL execution environment.

It won't load compiled files but as soon as a compilation succeeds it
will auto-refresh and thus pick up your correctly compiled application.

It's still early but I'm thinking that this could be a good feature.

#### Basic Leiningen profile merging

Folks who have been using `(figwheel-start!)` from the REPL have been
confused by Figwheel's inability to merge in the default Leiningen
profiles.

Figwheel will now merge Leiningen profiles without needing to load
`leiningen-core`.

This behavior is new and not comprehensive but will probably work fine
for the majority of cases where someone has a little profile merging
in their project.clj

#### Added commands

The Figwheel lein plugin has added commands and better command-line
feedback for bad args.

The new commands are

`lein figwheel :once build-ids ...`

Which will do what `lein cljsbuild once` does, with figwheel error
messages. This command won't inject the figwheel client code.

`lein figwheel :check-config`

Which will run validation on your configuration.

`lein figwheel :help`

Which prints out the same help information as `lein help figwheel`

You should take a moment and read this help information.

Expect a `:watch` command in the next release....

#### Getting rid of `:build-options` in favor of `:compiler`

A younger, more idealistic version of myself, wanted to have a different
key for compiler options.  So I used `:build-options` internally. As
usual that younger version of myself had no idea what he was doing.

If you are using `:build-options` you will get a validation error
saying that it is deprecated and that you should use `:compiler`.
`:build-options` is still being used internally but I am saving it as
technical debt.

#### Lots more

* huge configuration re-factor so that `(start-figwheel!)` now validates the configuration
  and throws useful exceptions if a configuration problem is found
* fixed printing in the REPL, before you couldn't call `(println "hi")`
  and see the output in the REPL.  This works for nREPL as well as a
  direct `cljs.repl`.
* made printing much more robust, executing `(js/setInterval #(println "hi") 1000)`
  in the REPL works sending output to the REPL
* fixed REPL js runtime stacktraces, these must have been broken for a
  while, sorry about that
* a new `:open-urls` option in the per-build client `:figwheel` configuration.
  This is a vector of URLs that Figwheel will open the first time a
  build completes. These are opened with `clojure.java.browse/browse-url`.
  You could put `http://cljs.info/cheatsheet/` info in there :)
* fail fast if figwheel server doesn't start because of a port bind error
* disable ansi colored output with `:figwheel > :ansi-color-output false`
* figwheel now provides the `:open-file-command` script a third
  argument that is the column position of the problem. Yes this means
  that heads up display errors can pop you to the line and *column*
  if you click on them.
* beefed up logging around `:open-file-command` so that one can debug it more easily  
* redirected `:ring-handler` exceptions and general printing output to the
  figwheel-server.log
* ring exceptions and stack traces are displayed in the response HTML as well  
* fixed a problem where `window.location` was being called in a node environment
* if you want to limit the classpath to only use the paths from the specified builds
  (i.e. builds supplied on the command line) you can set `:figwheel > :load-all-builds false`
* removed awt beep from source code to remove the annoying Java system icons
* fixed `:repl false` configuration option
* fixed and improved `(reload-config)` REPL command, reports config errors now



## 0.5.3-2 Fix regression for initial build errors

* cleaned up initial compile failure experience. There are horrendous errors
  if you start figwheel and you have a syntax error in your initial build.
  #fixes 392
* hopefully fixed CustomEvent dispatch in IE Edge made
* :source-map-timestamp default to true unless specifically set to false.
  This is for :figwheel builds only.
* fixed a problem with :js-client-host, it now uses the localhost.hostname + server-port
* Added :websocket-url template tags, see the Readme.
* When reading raw project.clj extract data only from first form that starts with 'defproject

## 0.5.3-1 First take on improving compiler error messages

I'm planning on investing some time in fixing up the error messages. This is just a
first take.

## 0.5.3

* fail fast if trying to launch cljs REPL in nREPL environment and piggieback is not available
  fixes issue #347
* passing :notify-command a more descriptive message, and call it on the very first build
  much more system notification friendly now, fixes PR #376
* PR #369 added :server-hostname and :server-ip as options for build > :figwheel > :websocket-host
  this will insert host specific info to the figwheel client config
* PR #371 added :closure-output-charset compiler option to config validation
* moved to Clojure 1.8.0
* add :nrepl-host to configuration validation
* PR #363 print out actual server ip in "Figwheel: Starting server at"

## 0.5.2 Quick fix for Windows

* fix null pointer because of bad resource path to config docs

## 0.5.1 Configuration Validation

* added a fairly comprehensive configuration validation that is triggered
  when running 'lein figwheel' - there is a large surface area here so if
  you discover problems please report them

## 0.5.0-5 More work on system dependency conflicts

* adding system asserts to ensure and warn if not using Java 1.8 or Clojure 1.7.0
* adding polling option for hawk file watcher; just add :hawk-options {:watcher :polling} to base figwheel config
* added friendlier 404 page

## 0.5.0-4

* finally fixing the dependency conflicts

## 0.5.0-3

* change repl-api commands like `figwheel-start!` so that they don't return the SystemMap
  as this was behaving badly in various REPL configurations 28e03af
* figwheel-running? checks if figwheel is actually running now bb146e1
* guard access to localStorage on client fdb49a2
* Print exception when requiring ring handler fails f663acc
* add support for notify-command back a475c59
* Add exclusions to fix sidecar confusing dependencies b263835
* For custom ring handler, bind to var, not to its value 789ff03
* create directories for logfile ce39ac0

## 0.5.0-2

* bumping http-kit to 0.2.19 get's rid of nasty exit exception
* fix REPL helpers check for figwheel's running status
* fixed REPL problem where pprint would produce extra output

## 0.5.0-1

* added back `figwheel-sidecar.repl/get-project-cljs-builds` and deprecated
* made the repl special-fn `(build-once)` work for builds that aren't opt none
* made the repl special-fn `(clean-builds)` work for builds that aren't opt none

## 0.5.0 Complete Refactor

* Figwheel is has undergone a large refactor and is now working better than ever
* Figwheel is now internally composed of components and has been
  re-organized according to concerns - this is not quite finished yet so the internal api may be be unstable
* this exposes the ability to compose component systems as you see fit and offering the ability to
  send messages from your own components to the figwheel client
* moved to a FSEvent file watching strategy using the hawk library, this
  should ease CPU usage quite a bit
* you can override the build function with the new `:cljs-build-fn` figwheel option
* you can opt out of `.clj` or `.cljc` macro reloading
* the build function follows a middleware strategy allowing you to splice in build time functionality
  - this can easiliy allow you to skip all magic figwheel injections and just run straight `cljs.build.api/build`
* hot loading javascript has been solidified even further
* figwheel repl controls are much more sensible now, they alter a component system map
* fixed various build config "parsing" problems
* support for an external configuration file "figwheel.edn"
* figwheel no longer overides `:recompile-dependents` default value bringing it inline with cljs compiler defaults
* much much much more ...

## 0.4.1

* fixed bug where GCL javascript modules with '-' in the namespace were not being hot reloaded
* fixed Node.js support on windows (a path error ... who'd have guessed??)
* improved the api for starting and stopping figwheel from scripts and such
* added a way to quit out of the cljs-repl build choosing loop

## 0.4.0

* `:nrepl-middleware` server configuration has been added (see readme)
  Thanks to <NAME> @otijhuis, give him a shout out!
* both cider and piggieback have been removed, you must include the deps you
  want in your project.clj.
* fix for #233: a stacktrace bug in the REPL
* update string/replace usage, this could have affected REPL evaluations: thanks to @nikitonsky
* make `:ring-handler` a var so it picks up changes - thanks to @nikitonsky
* toggle auto loading on and off quickly with `(figwheel.client/toggle-autoload)` or `figwheel.client.toggle_autoload()` in the dev console

## 0.3.9

* fixes incompatability with weasel and cljs browser repl

## 0.3.8

#### Incompatable with weasel repl and others that use the cljs browser repl. Expect a new release very soon.

* **Hot reloading Javascript!** this works for `:foreign-libs`, `:libs`
  and Google Closure libs in your `:source-paths` that follow Clojure
  namespacing conventions - this is hot!
* **fixed the loading order of dependencies** this silently broke a while back. Dependency
  loading has been overhauled to work with the latest CLJS and should be much more stable.
* `(require ... :reload)` and `(require ... :reload-all)` work correctly now
* adding `:reload-dependents` client config parameter. It forces the "reloading"
  of files that are dependent on changed files. This is very fast operation and can
  potentially obviate the need for `^:figwheel-always`
* **removed cljsbuild as a dependency**, this removes **crossovers** and **notify-command** from figwheel
* new Community CLJS logo
* fixing Node so that `figwheel.connect` works
* added http PATCH to CORS


## 0.3.7

* update to clojure 1.7.0!
* hopefully fix #194 update http-kit 

## 0.3.6

* no change

## 0.3.5

* small fixes to allow Atom.io usage see pr-188 and pr-189 for details
* small devcards tweak

## 0.3.4

* fix #183 htmlEscape warnings and errors in the heads up display
* fix #179 add `:server-ip` server config option to all folks to not
  default to binding "0.0.0.0" which exposes the connection to the network
* add `:devcards` option to figwheel client config, more on this later
* add `:websocket-host :js-client-host` option to allow the client to use the `location.host` of
  the loaded page. Thanks to @peterschwarz
* fix #180 cider no longer hard coded to repl, but auto detected, allows folks
  to use `[cider-nrepl 0.9.0]` a little more easily
* making reloading of build config an explicit `reload-config` special-fn in the repl
* fix #164 explicitly close the client side websocket on onload

## 0.3.3

* ensure that we are only adding inserting the figwheel.connect require when `:figwheel` is
  set in the build

## 0.3.2

* provide global custom events "figwheel.js-reload" and "figwheel.before-js-reload" for folks to hook into
* initial build wasn't providing figwheel start hook to output-to file
* merge PR #150 allow to configure binding host of nREPL 
* bump clojure requirement to be inline with clojurescript "0.1.7beta3" to fix #152
* fix #151 stop depending on presence of project.clj 
* fix #147 handle presence of a deps.cljs on the source path 
* fix #145 cannot read property cljs$lang$maxFixedArity
* merge PR #146 correctly detect if in html document 

## 0.3.1

* fixed regression on supporting map based build configs

## 0.3.0

* the `(reset-autobuild)` REPL command now reloads the build config
  from your `project.clj`
* simplified necessary build config parameters, no longer have to have
  `:optimizations`, `:output-to`, `:output-dir`

## 0.2.9

* fixes #137 missing connect.cljs 

## 0.2.8

* vastly simplified configuration. You no longer need to write the
  client code manually and then figure out how to have it excluded in
  production. Simply add `:fighweel true` to builds that you want
  figwheel to run on. The client code will be injected to the build.
  You can inspect the generated client code in
  `target/figwheel_temp/<build id>/fighweel/connect.cljs`
* fixed #126 where inclusion of figwheel.client in an advenced build
  caused "undefined is not a function" problems. This is fixed please
  don't include figwheel.client in advanced builds. It won't work.
* fixed #124

## 0.2.7

* **support Reader Conditionals**
* require cljs-3165
* re-fixed #118 topo-sort incorrect implementation
* heads up display includes file and line information for reader exceptions
  - Thanks to <NAME> 

## 0.2.6

* fixed shared compile-env for cljs-3196
* fixed #108 double file loading
* fixed #107 repl `:false` starts two compile processes
* fixed #118 topo-sort incorrect implementation
* fixed #106 empty build `:id` caused NPE
* fixed #65  friendly error for already bound port error
* upgraded cljsbuild
* upgraded figwheel-sidecar dependencies

## 0.2.5

* **First non snapshot release**
* `^:figwheel-always` was causing a double file reload when editing the marked ns
* minor fixes to be compatible with ClojureScript REPL changes
* CSS changes broadast to all named builds, this should work fine as long as
  CSS files for different builds are named distinctly
* fixed problem where using unquoted namespaces in `:modules` configurations was
  preventing figwheel from starting

## 0.2.5-SNAPSHOT

* **nREPL and cider support for the REPL** adding an `:nrepl-port` along
  with a port number to the `:figwheel` config in your project.clj will
  start an nREPL server into the running figwheel process.
  https://github.com/bhauman/lein-figwheel/wiki/Using-the-Figwheel-REPL-within-NRepl
* **disabling hod loading for REPL only development**
  Setting a new client side config option `:autobuild` to `false` will disable
  the automatic loading of code on file changes. Now that the cljs REPL
  development experience is maturing it's nice to have the option to do
  REPL only development. Its a client side option so that you can change
  back and forth between the styles of development fairly easily.

## 0.2.4-SNAPSHOT

* adds source mapped stacktraces to REPL
* does away dependents calculations when `:recompile-dependents` is `false`
* corrects a complexity bug in calculating dependents
* requires ClojureScript 0.0-2843 or greater

## 0.2.3-SNAPSHOT

* **Node.js support!**: figwheel and the built-in REPL now supports running
  inside a Node.js evironment. This is very initial support for Node so if you
  run into trouble please let me know.
* **Possible Breaking Change**: Figwheel now reloads files (js/css) from where
  they are originally loaded from. This should work in almost every setup
  imaginable. The `:url-rewriter` client config option shouldn't be
  needed in most cases now. If you are currently using `:url-rewriter` it will
  be broken as the form of the url argument is changing.
* The above change means that you no longer are required to have your
  cljs target files on a resource path the figwheel server can see. If
  you are loading your app from the figwheel server the current :output-dir
  requirement still stands.  If you are not going to load your app from the
  figwheel server then you you can place the files wherever you want.
* **node-webkit** should also be much easier to use as a result of the above
  changes
* **Fully loads dependents**: A new feature in the CLJS compiler is that it
  recompiles all files that are dependent on a changed .cljs file. Figwheel is
  complementing this behavior by doing the same: when a file changes all
  its dependents are loaded as well, in correct dependency order.
  This has the marvelous benefit of reloading the application root file
  whenever one of its dependencies change. This can obviate the need for
  `:on-jsload` but just having app restarting/rerendering code
  (like `React.render`) at the bottom of your root application file.
* `^:figwheel-always` can now be added as meta data to cljs namespaces that
  you want to be reloaded whenever there is a file change in your source
  tree. With this flag you won't really need `:on-jsload`, even for complex
  setups. Namespaces marked `figwheel-always` do not have to be required.
  So you can put this on your test runner namespace and viola!, you will have
  your tests running in the client env on every reload. Pretty cool.
* No more undefined errors in the REPL when you try to define things
  in the `cljs.user` ns after refreshing the browser.
* better REPL support in general for (require :reload) and :reload-all
* `:debug` is a new client config option, when it is truthy figwheel
  will print out copious amounts of debug information.
* `:load-unchanged-files` is a client option that if set to `false` will cause
  the client to not reload files that haven't changed. With this option set to
  `false` files will only load if their *content* has changed. This option defaults
  to `true`.

## 0.2.2-SNAPSHOT

* **lein figwheel now launches a REPL into your application**, this REPL shares the
  compilation environment with the autobuilder, this makes the REPL pretty darn
  intelligent about what is loaded in your browser env already.
  For ex. do `(in-ns 'your.cljs.namespace)` and poke around  
* for a better repl experience launch lein figwheel with rlwrap
  `$ rlwrap lein figwheel`
  you can install rlwrap on OSX with brew: `brew install rlwrap`
* you can control the autobuild process from the CLJS REPL, no lein reboot
* the repl can be disabled with `:repl false` in the `:figwheel` config
* the logfile for figwheel server output can be configured with `:server-logfile` in
  `:figwheel` config  
* in 0.2.0 figwheel stopped honoring cljsbuild `:notify-command`, figwheel now honors
  `:notify-command` only on successful compiles, this should be especially helpful to
  those who are using `:notify-command` to run tests
* **requires `org.clojure/clojurescript "0.0-2665"` or greater**

## 0.2.1-SNAPSHOT

* now supports multiple builds i.e lein figwheel example example-admin
* refactored figwheel-sidecar/auto-builder and clojurescript-build/auto
  a bunch to facilitate better reuse

## 0.2.0-SNAPSHOT

* **extremely fast incremental builds when editing Clojure (.clj) files**
* you can now call the figwheel autobuilder/change-server from the repl or your
  own build script (not documented yet)
* isolated server and building code into to its own project to so that including
  the client code doesn't polute projects with clj based deps,
  the server and builder code only get's included in the plugin
* fixed bug where warning handler was getting added over and over in the build loop
* fixed bug: files that are't required don't get loaded but the console message 
  was saying that they were
* if you want to force an unrequired file to get loaded you can now do this
  `(ns ^:figwheel-load example.core `
* if you want to prevent a file from being reloaded you can now do this
  `(ns ^:figwheel-no-load example.setup `

## 0.1.7-SNAPSHOT

* compile warning notifications forwarded to client
* block file reload if compile warnings are present
  (there is still a race condition in cljsbuild that prevents this
   from working 100% of the time)
  to overide this use `:load-warninged-code true` in the figwheel client
* got rid of the `defonce` macro. It is built into cljs
* added a heads up display to the client!!! You can opt out of this with
  `:heads-up-display false` in the client config
* the heads up display 'can' trigger a file to open in your editor, if you do
  the work to get `emacsclient` or your editor's equivalent working correctly.
  In the `:figwheel` configuration in your `project.clj` you need to include
  an `:open-file-command` option. This should be the name of a script on your
  path that takes a file and a line number. The reccomendation here is to write
  your own script and put it in ~/bin.
* `:open-file-command` is `emacsclient` aware so you can just provide `"emacsclient"`
  as an option and it will just work.
* protection from connecting to another project by mistake
* > 46 commits and many more changes
* completely compatible with previous versions of figwheel unless you are using
  figwheel's `defonce` and not ClojureScripts

## 0.1.6-SNAPSHOT

* better configuration validation and feedback for configuration errors
* cleaned up, documented and added tests for plugin code
* @font-face tags caused cors error, added promiscuous CORS support
* added check for WebSocket support to prevent errors in IE8

## 0.1.5-SNAPSHOT

* fixed windows path bug
* made map based cljsbuild configurations work
* fixed :http-server-root option

## 0.1.4-SNAPSHOT

###
* Fixed LightTable incompatability
* Figwheel now respects :resource-paths and you can have your compiled files in any resource path
* Added :ring-handler configuration option to allow quck embedding of a dev server

## history starts here :)
<commit_msg>more change log updates<commit_after>## 0.5.4-4 added :preloads compiler option

* added validation support for :preloads compiler option

* ! removed compojure as a dependency
  Figwheel used compojure in its server to handle routing
  this was overkill. It complicated the routing while adding an unneeded dependency.
  Strange things where happening when `wrap-reload` was being used in an
  embedded `:ring-handler`.  
  There is so little routing functionality in figwheel that I just created
  what was needed with simple ring middleware. If the behavior of your
  :ring-handler changes (routes not being resolved, bad headers etc.)
  please let me know.  For reference here is the commit:
  https://github.com/bhauman/lein-figwheel/commit/f027b10188ed9d1baa6ec04bbdd14e6a493f68b0
* improved the resiliency of the plugin around bad initial config data
  the lein plugin uses config data from the project.clj before its
  has been validated, I added some extra safe guards to protect against
  stack dumps

## 0.5.4-3 some improvements around starting figwheel from the REPL

* I added back `figwheel-sidecar/get-project-builds` which was removed in 0.5.4
  its now here to stay.

#### Improved the expressiveness of (start-figwheel!)

before `(start-figwheel!)` only optionally took a configuration. Now it
takes optional build-ids as well.

So you can do this:

```
(start-figwheel! "dev" "admin")
```

And it will pull in the config from the environment and start
autobuilding the supplied build ids.

Or you can supply a config and build ids ...

```
(start-fighweel!
  {:figwheel-options {:server-port 4000}
   :all-builds [{:id ...}]}
   "dev" "admin")
```

I have also beefed up the error checking and feedback around this call.


## 0.5.4-2 Quick fix for failure due to composite lein profiles

* my profile merging code was choking on composite lein profiles

## 0.5.4 Error messages and way more!

This is the most solid release of Figwheel so far ... enjoy!!

#### Code context in Errors and Warnings

This means you will see the compile errors and warnings displayed
along with the offending code and a pointer to the position of the
failure. This is a big improvement. I've found that even for simple
errors, that I've become accustomed to, the new errors tend to beam the
information into my head much more quickly.

The code pointers are rough at times and no code context information
will be displayed if Figwheel doesn't get any line and column information
from the compiler.

The new error display can be improved further, and I plan to do so.  I
just wanted to get the bits hooked up and a decent display out the
door first.

* added code context to compile errors in heads up display,
  figwheel_server.log and REPL output
* added code context to compile warnings as well

#### Improved Build correctness

There have been several correctness problems that have dogged Figwheel
for a while.

The most important change here is that I have made all code that runs
in the plugin only depend on libs that are either natively available
in Clojure or are included with Leiningen. This should rid us of the
many ways that Figwheel was incompatible with other plugins and
environments. I really had to learn the hard way that this is the only
way to develop Leiningen plugins, and in hindsight, it makes a lot of sense.

A downside of this is that Figwheel "appears" to start slower. But all
my tests have shown that it is starting slightly faster.  And .... as
a bonus `lein trampoline` works very well with Figwheel now.

If you are not already familiar with `lein trampoline`, the following
command will cache the startup args the first time it is run, and will
only launch one JVM on the next execution.

```
LEIN_FAST_TRAMPOLINE=y lein trampoline figwheel
```

In my setup I have the following script in on my path. Using it shaves seconds
off of my startup time

file::/User/bhauman/bin/figt
```
#!/bin/bash

LEIN_FAST_TRAMPOLINE=y rlwrap lein trampoline figwheel "$@"
```

* I have added startup and runtime checks to ensure that the various
  Figwheel library versions match.
* I added a check to the client that will warn you if you are getting messages
  from a server that is a different version than the client.
* Automatically clean a cljs build if the classpath changes or if the
  build `:source-paths` change or if certain ClojureScript compiler
  options change. This means that if you add a dependency in your
  project.clj the next time you start figwheel it will detect that
  change and clean out the build assets before compiling. If you have
  a simple classpath that points to a directory of jars this won't
  help you, but I think this will help a great majority of users.

#### DOA helper application

This is a user experience improvement experiment.  There has been a
problem when the initial compile fails and you open the browser and
nothing happens and your REPL doesn't work.

Inspired by Elm, I am now emitting a small application that announces
the problem when you load it in the browser. This application is a
figwheel client so that it will respond to and display compilation
messages and will provide a REPL execution environment.

It won't load compiled files but as soon as a compilation succeeds it
will auto-refresh and thus pick up your correctly compiled application.

It's still early but I'm thinking that this could be a good feature.

#### Basic Leiningen profile merging

Folks who have been using `(figwheel-start!)` from the REPL have been
confused by Figwheel's inability to merge in the default Leiningen
profiles.

Figwheel will now merge Leiningen profiles without needing to load
`leiningen-core`.

This behavior is new and not comprehensive but will probably work fine
for the majority of cases where someone has a little profile merging
in their project.clj

#### Added commands

The Figwheel lein plugin has added commands and better command-line
feedback for bad args.

The new commands are

`lein figwheel :once build-ids ...`

Which will do what `lein cljsbuild once` does, with figwheel error
messages. This command won't inject the figwheel client code.

`lein figwheel :check-config`

Which will run validation on your configuration.

`lein figwheel :help`

Which prints out the same help information as `lein help figwheel`

You should take a moment and read this help information.

Expect a `:watch` command in the next release....

#### Getting rid of `:build-options` in favor of `:compiler`

A younger, more idealistic version of myself, wanted to have a different
key for compiler options.  So I used `:build-options` internally. As
usual that younger version of myself had no idea what he was doing.

If you are using `:build-options` you will get a validation error
saying that it is deprecated and that you should use `:compiler`.
`:build-options` is still being used internally but I am saving it as
technical debt.

#### Lots more

* huge configuration re-factor so that `(start-figwheel!)` now validates the configuration
  and throws useful exceptions if a configuration problem is found
* fixed printing in the REPL, before you couldn't call `(println "hi")`
  and see the output in the REPL.  This works for nREPL as well as a
  direct `cljs.repl`.
* made printing much more robust, executing `(js/setInterval #(println "hi") 1000)`
  in the REPL works sending output to the REPL
* fixed REPL js runtime stacktraces, these must have been broken for a
  while, sorry about that
* a new `:open-urls` option in the per-build client `:figwheel` configuration.
  This is a vector of URLs that Figwheel will open the first time a
  build completes. These are opened with `clojure.java.browse/browse-url`.
  You could put `http://cljs.info/cheatsheet/` info in there :)
* fail fast if figwheel server doesn't start because of a port bind error
* disable ansi colored output with `:figwheel > :ansi-color-output false`
* figwheel now provides the `:open-file-command` script a third
  argument that is the column position of the problem. Yes this means
  that heads up display errors can pop you to the line and *column*
  if you click on them.
* beefed up logging around `:open-file-command` so that one can debug it more easily  
* redirected `:ring-handler` exceptions and general printing output to the
  figwheel-server.log
* ring exceptions and stack traces are displayed in the response HTML as well  
* fixed a problem where `window.location` was being called in a node environment
* if you want to limit the classpath to only use the paths from the specified builds
  (i.e. builds supplied on the command line) you can set `:figwheel > :load-all-builds false`
* removed awt beep from source code to remove the annoying Java system icons
* fixed `:repl false` configuration option
* fixed and improved `(reload-config)` REPL command, reports config errors now



## 0.5.3-2 Fix regression for initial build errors

* cleaned up initial compile failure experience. There are horrendous errors
  if you start figwheel and you have a syntax error in your initial build.
  #fixes 392
* hopefully fixed CustomEvent dispatch in IE Edge made
* :source-map-timestamp default to true unless specifically set to false.
  This is for :figwheel builds only.
* fixed a problem with :js-client-host, it now uses the localhost.hostname + server-port
* Added :websocket-url template tags, see the Readme.
* When reading raw project.clj extract data only from first form that starts with 'defproject

## 0.5.3-1 First take on improving compiler error messages

I'm planning on investing some time in fixing up the error messages. This is just a
first take.

## 0.5.3

* fail fast if trying to launch cljs REPL in nREPL environment and piggieback is not available
  fixes issue #347
* passing :notify-command a more descriptive message, and call it on the very first build
  much more system notification friendly now, fixes PR #376
* PR #369 added :server-hostname and :server-ip as options for build > :figwheel > :websocket-host
  this will insert host specific info to the figwheel client config
* PR #371 added :closure-output-charset compiler option to config validation
* moved to Clojure 1.8.0
* add :nrepl-host to configuration validation
* PR #363 print out actual server ip in "Figwheel: Starting server at"

## 0.5.2 Quick fix for Windows

* fix null pointer because of bad resource path to config docs

## 0.5.1 Configuration Validation

* added a fairly comprehensive configuration validation that is triggered
  when running 'lein figwheel' - there is a large surface area here so if
  you discover problems please report them

## 0.5.0-5 More work on system dependency conflicts

* adding system asserts to ensure and warn if not using Java 1.8 or Clojure 1.7.0
* adding polling option for hawk file watcher; just add :hawk-options {:watcher :polling} to base figwheel config
* added friendlier 404 page

## 0.5.0-4

* finally fixing the dependency conflicts

## 0.5.0-3

* change repl-api commands like `figwheel-start!` so that they don't return the SystemMap
  as this was behaving badly in various REPL configurations 28e03af
* figwheel-running? checks if figwheel is actually running now bb146e1
* guard access to localStorage on client fdb49a2
* Print exception when requiring ring handler fails f663acc
* add support for notify-command back a475c59
* Add exclusions to fix sidecar confusing dependencies b263835
* For custom ring handler, bind to var, not to its value 789ff03
* create directories for logfile ce39ac0

## 0.5.0-2

* bumping http-kit to 0.2.19 get's rid of nasty exit exception
* fix REPL helpers check for figwheel's running status
* fixed REPL problem where pprint would produce extra output

## 0.5.0-1

* added back `figwheel-sidecar.repl/get-project-cljs-builds` and deprecated
* made the repl special-fn `(build-once)` work for builds that aren't opt none
* made the repl special-fn `(clean-builds)` work for builds that aren't opt none

## 0.5.0 Complete Refactor

* Figwheel is has undergone a large refactor and is now working better than ever
* Figwheel is now internally composed of components and has been
  re-organized according to concerns - this is not quite finished yet so the internal api may be be unstable
* this exposes the ability to compose component systems as you see fit and offering the ability to
  send messages from your own components to the figwheel client
* moved to a FSEvent file watching strategy using the hawk library, this
  should ease CPU usage quite a bit
* you can override the build function with the new `:cljs-build-fn` figwheel option
* you can opt out of `.clj` or `.cljc` macro reloading
* the build function follows a middleware strategy allowing you to splice in build time functionality
  - this can easiliy allow you to skip all magic figwheel injections and just run straight `cljs.build.api/build`
* hot loading javascript has been solidified even further
* figwheel repl controls are much more sensible now, they alter a component system map
* fixed various build config "parsing" problems
* support for an external configuration file "figwheel.edn"
* figwheel no longer overides `:recompile-dependents` default value bringing it inline with cljs compiler defaults
* much much much more ...

## 0.4.1

* fixed bug where GCL javascript modules with '-' in the namespace were not being hot reloaded
* fixed Node.js support on windows (a path error ... who'd have guessed??)
* improved the api for starting and stopping figwheel from scripts and such
* added a way to quit out of the cljs-repl build choosing loop

## 0.4.0

* `:nrepl-middleware` server configuration has been added (see readme)
  Thanks to <NAME> @otijhuis, give him a shout out!
* both cider and piggieback have been removed, you must include the deps you
  want in your project.clj.
* fix for #233: a stacktrace bug in the REPL
* update string/replace usage, this could have affected REPL evaluations: thanks to @nikitonsky
* make `:ring-handler` a var so it picks up changes - thanks to @nikitonsky
* toggle auto loading on and off quickly with `(figwheel.client/toggle-autoload)` or `figwheel.client.toggle_autoload()` in the dev console

## 0.3.9

* fixes incompatability with weasel and cljs browser repl

## 0.3.8

#### Incompatable with weasel repl and others that use the cljs browser repl. Expect a new release very soon.

* **Hot reloading Javascript!** this works for `:foreign-libs`, `:libs`
  and Google Closure libs in your `:source-paths` that follow Clojure
  namespacing conventions - this is hot!
* **fixed the loading order of dependencies** this silently broke a while back. Dependency
  loading has been overhauled to work with the latest CLJS and should be much more stable.
* `(require ... :reload)` and `(require ... :reload-all)` work correctly now
* adding `:reload-dependents` client config parameter. It forces the "reloading"
  of files that are dependent on changed files. This is very fast operation and can
  potentially obviate the need for `^:figwheel-always`
* **removed cljsbuild as a dependency**, this removes **crossovers** and **notify-command** from figwheel
* new Community CLJS logo
* fixing Node so that `figwheel.connect` works
* added http PATCH to CORS


## 0.3.7

* update to clojure 1.7.0!
* hopefully fix #194 update http-kit 

## 0.3.6

* no change

## 0.3.5

* small fixes to allow Atom.io usage see pr-188 and pr-189 for details
* small devcards tweak

## 0.3.4

* fix #183 htmlEscape warnings and errors in the heads up display
* fix #179 add `:server-ip` server config option to all folks to not
  default to binding "0.0.0.0" which exposes the connection to the network
* add `:devcards` option to figwheel client config, more on this later
* add `:websocket-host :js-client-host` option to allow the client to use the `location.host` of
  the loaded page. Thanks to @peterschwarz
* fix #180 cider no longer hard coded to repl, but auto detected, allows folks
  to use `[cider-nrepl 0.9.0]` a little more easily
* making reloading of build config an explicit `reload-config` special-fn in the repl
* fix #164 explicitly close the client side websocket on onload

## 0.3.3

* ensure that we are only adding inserting the figwheel.connect require when `:figwheel` is
  set in the build

## 0.3.2

* provide global custom events "figwheel.js-reload" and "figwheel.before-js-reload" for folks to hook into
* initial build wasn't providing figwheel start hook to output-to file
* merge PR #150 allow to configure binding host of nREPL 
* bump clojure requirement to be inline with clojurescript "0.1.7beta3" to fix #152
* fix #151 stop depending on presence of project.clj 
* fix #147 handle presence of a deps.cljs on the source path 
* fix #145 cannot read property cljs$lang$maxFixedArity
* merge PR #146 correctly detect if in html document 

## 0.3.1

* fixed regression on supporting map based build configs

## 0.3.0

* the `(reset-autobuild)` REPL command now reloads the build config
  from your `project.clj`
* simplified necessary build config parameters, no longer have to have
  `:optimizations`, `:output-to`, `:output-dir`

## 0.2.9

* fixes #137 missing connect.cljs 

## 0.2.8

* vastly simplified configuration. You no longer need to write the
  client code manually and then figure out how to have it excluded in
  production. Simply add `:fighweel true` to builds that you want
  figwheel to run on. The client code will be injected to the build.
  You can inspect the generated client code in
  `target/figwheel_temp/<build id>/fighweel/connect.cljs`
* fixed #126 where inclusion of figwheel.client in an advenced build
  caused "undefined is not a function" problems. This is fixed please
  don't include figwheel.client in advanced builds. It won't work.
* fixed #124

## 0.2.7

* **support Reader Conditionals**
* require cljs-3165
* re-fixed #118 topo-sort incorrect implementation
* heads up display includes file and line information for reader exceptions
  - Thanks to <NAME> 

## 0.2.6

* fixed shared compile-env for cljs-3196
* fixed #108 double file loading
* fixed #107 repl `:false` starts two compile processes
* fixed #118 topo-sort incorrect implementation
* fixed #106 empty build `:id` caused NPE
* fixed #65  friendly error for already bound port error
* upgraded cljsbuild
* upgraded figwheel-sidecar dependencies

## 0.2.5

* **First non snapshot release**
* `^:figwheel-always` was causing a double file reload when editing the marked ns
* minor fixes to be compatible with ClojureScript REPL changes
* CSS changes broadast to all named builds, this should work fine as long as
  CSS files for different builds are named distinctly
* fixed problem where using unquoted namespaces in `:modules` configurations was
  preventing figwheel from starting

## 0.2.5-SNAPSHOT

* **nREPL and cider support for the REPL** adding an `:nrepl-port` along
  with a port number to the `:figwheel` config in your project.clj will
  start an nREPL server into the running figwheel process.
  https://github.com/bhauman/lein-figwheel/wiki/Using-the-Figwheel-REPL-within-NRepl
* **disabling hod loading for REPL only development**
  Setting a new client side config option `:autobuild` to `false` will disable
  the automatic loading of code on file changes. Now that the cljs REPL
  development experience is maturing it's nice to have the option to do
  REPL only development. Its a client side option so that you can change
  back and forth between the styles of development fairly easily.

## 0.2.4-SNAPSHOT

* adds source mapped stacktraces to REPL
* does away dependents calculations when `:recompile-dependents` is `false`
* corrects a complexity bug in calculating dependents
* requires ClojureScript 0.0-2843 or greater

## 0.2.3-SNAPSHOT

* **Node.js support!**: figwheel and the built-in REPL now supports running
  inside a Node.js evironment. This is very initial support for Node so if you
  run into trouble please let me know.
* **Possible Breaking Change**: Figwheel now reloads files (js/css) from where
  they are originally loaded from. This should work in almost every setup
  imaginable. The `:url-rewriter` client config option shouldn't be
  needed in most cases now. If you are currently using `:url-rewriter` it will
  be broken as the form of the url argument is changing.
* The above change means that you no longer are required to have your
  cljs target files on a resource path the figwheel server can see. If
  you are loading your app from the figwheel server the current :output-dir
  requirement still stands.  If you are not going to load your app from the
  figwheel server then you you can place the files wherever you want.
* **node-webkit** should also be much easier to use as a result of the above
  changes
* **Fully loads dependents**: A new feature in the CLJS compiler is that it
  recompiles all files that are dependent on a changed .cljs file. Figwheel is
  complementing this behavior by doing the same: when a file changes all
  its dependents are loaded as well, in correct dependency order.
  This has the marvelous benefit of reloading the application root file
  whenever one of its dependencies change. This can obviate the need for
  `:on-jsload` but just having app restarting/rerendering code
  (like `React.render`) at the bottom of your root application file.
* `^:figwheel-always` can now be added as meta data to cljs namespaces that
  you want to be reloaded whenever there is a file change in your source
  tree. With this flag you won't really need `:on-jsload`, even for complex
  setups. Namespaces marked `figwheel-always` do not have to be required.
  So you can put this on your test runner namespace and viola!, you will have
  your tests running in the client env on every reload. Pretty cool.
* No more undefined errors in the REPL when you try to define things
  in the `cljs.user` ns after refreshing the browser.
* better REPL support in general for (require :reload) and :reload-all
* `:debug` is a new client config option, when it is truthy figwheel
  will print out copious amounts of debug information.
* `:load-unchanged-files` is a client option that if set to `false` will cause
  the client to not reload files that haven't changed. With this option set to
  `false` files will only load if their *content* has changed. This option defaults
  to `true`.

## 0.2.2-SNAPSHOT

* **lein figwheel now launches a REPL into your application**, this REPL shares the
  compilation environment with the autobuilder, this makes the REPL pretty darn
  intelligent about what is loaded in your browser env already.
  For ex. do `(in-ns 'your.cljs.namespace)` and poke around  
* for a better repl experience launch lein figwheel with rlwrap
  `$ rlwrap lein figwheel`
  you can install rlwrap on OSX with brew: `brew install rlwrap`
* you can control the autobuild process from the CLJS REPL, no lein reboot
* the repl can be disabled with `:repl false` in the `:figwheel` config
* the logfile for figwheel server output can be configured with `:server-logfile` in
  `:figwheel` config  
* in 0.2.0 figwheel stopped honoring cljsbuild `:notify-command`, figwheel now honors
  `:notify-command` only on successful compiles, this should be especially helpful to
  those who are using `:notify-command` to run tests
* **requires `org.clojure/clojurescript "0.0-2665"` or greater**

## 0.2.1-SNAPSHOT

* now supports multiple builds i.e lein figwheel example example-admin
* refactored figwheel-sidecar/auto-builder and clojurescript-build/auto
  a bunch to facilitate better reuse

## 0.2.0-SNAPSHOT

* **extremely fast incremental builds when editing Clojure (.clj) files**
* you can now call the figwheel autobuilder/change-server from the repl or your
  own build script (not documented yet)
* isolated server and building code into to its own project to so that including
  the client code doesn't polute projects with clj based deps,
  the server and builder code only get's included in the plugin
* fixed bug where warning handler was getting added over and over in the build loop
* fixed bug: files that are't required don't get loaded but the console message 
  was saying that they were
* if you want to force an unrequired file to get loaded you can now do this
  `(ns ^:figwheel-load example.core `
* if you want to prevent a file from being reloaded you can now do this
  `(ns ^:figwheel-no-load example.setup `

## 0.1.7-SNAPSHOT

* compile warning notifications forwarded to client
* block file reload if compile warnings are present
  (there is still a race condition in cljsbuild that prevents this
   from working 100% of the time)
  to overide this use `:load-warninged-code true` in the figwheel client
* got rid of the `defonce` macro. It is built into cljs
* added a heads up display to the client!!! You can opt out of this with
  `:heads-up-display false` in the client config
* the heads up display 'can' trigger a file to open in your editor, if you do
  the work to get `emacsclient` or your editor's equivalent working correctly.
  In the `:figwheel` configuration in your `project.clj` you need to include
  an `:open-file-command` option. This should be the name of a script on your
  path that takes a file and a line number. The reccomendation here is to write
  your own script and put it in ~/bin.
* `:open-file-command` is `emacsclient` aware so you can just provide `"emacsclient"`
  as an option and it will just work.
* protection from connecting to another project by mistake
* > 46 commits and many more changes
* completely compatible with previous versions of figwheel unless you are using
  figwheel's `defonce` and not ClojureScripts

## 0.1.6-SNAPSHOT

* better configuration validation and feedback for configuration errors
* cleaned up, documented and added tests for plugin code
* @font-face tags caused cors error, added promiscuous CORS support
* added check for WebSocket support to prevent errors in IE8

## 0.1.5-SNAPSHOT

* fixed windows path bug
* made map based cljsbuild configurations work
* fixed :http-server-root option

## 0.1.4-SNAPSHOT

###
* Fixed LightTable incompatability
* Figwheel now respects :resource-paths and you can have your compiled files in any resource path
* Added :ring-handler configuration option to allow quck embedding of a dev server

## history starts here :)

{'fraction_non_alphanumeric': 0.05990389546257431, 'fraction_numerical': 0.01314315017758447, 'mean_word_length': 4.129274232830005, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 19, 'https://': 4, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 2, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4243461', 'n_tokens_mistral': 14919, 'n_tokens_neox': 14222, 'n_words': 7781}