anchor.diff:  :cache-analysis true
   ----
   
  -[[recompile-dependents]]
  -=== :recompile-dependents
  -
  -For correctness the ClojureScript compiler now always recompiles
  -dependent namespaces when a parent namespace changes. This prevents
  -corrupted builds and swallowed warnings. However this can impact compile
  -times depending on the structure of the application. This option
  -defaults to `true`.
  -
  -[source,clojure]
  -----
  -:recompile-dependents false
  -----
  -
  -[[static-fns]]
  -=== :static-fns
  -
  -Employs static dispatch to specific function arities in emitted
  -JavaScript, as opposed to making use of the `call` construct. Defaults
  -to false except under advanced optimizations. Useful to have set to
  -false at REPL development to facilitate function redefinition, and
  -useful to set to true for release for performance.
  -
  -This setting does not apply to the standard library, which is always
  -compiled with `:static-fns` implicitly set to true.
  -
  -[source,clojure]
  -----
  -:static-fns true
  -----
  +[[closure-defines]]
  +=== :closure-defines
  +
  +Set the values of Closure libraries' variables annotated with
  +https://developers.google.com/closure/compiler/docs/js-for-compiler#tag-define[@define]
  +or with the `cljs.core/goog-define` helper macro. A common usage is
  +setting `goog.DEBUG` to false:
  +
  +[source,clojure]
  +----
  +:closure-defines {"goog.DEBUG" false}
  +----
  +
  +You can also use symbols:
  +
  +[source,clojure]
  +----
  +:closure-defines {my.cool-ns/some-def true}
  +----
  +
  +Note when using Lein the quote is unnecessary due to implicit quoting.
   
   [NOTE]
   ====
  -To enable static dispatch for calls to declared functions, supply `:arglists` meta. For example, if `(declare foo)` preceeds `(foo 1 2)`, dynamic dispatch will be employed. If instead `(declare ^{:arglists '([x y])} foo)` preceeds `(foo 1 2)`, static dispatch will be employed if `:static-fns` is enabled.
  -====
  -
  -[[fn-invoke-direct]]
  -=== :fn-invoke-direct
  -
  -Requires `:static-fns true`.
  -This option emits slightly different code that can speed up your code
  -around 10-30%. Higher order function that don't implement the `IFn` protocol
  -are normally called with `f.call(null, arg0, arg1 ...)`. With this option
  -enabled the compiler calls them with a faster `f(arg0, arg1 ...` instead.
  -
  -[CAUTION]
  -====
  -The `:fn-invoke-direct` feature is in alpha status. For some libraries such
  -as Reagent, `:fn-invoke-direct` is known to generate incorrect code.
  -====
  -
  -
  -[source,clojure]
  -----
  -:fn-invoke-direct true
  -----
  -
  -[[warnings]]
  -=== :warnings
  -
  -This flag will turn on/off compiler warnings for references to
  -undeclared vars, wrong function call arities, etc. Can be a boolean for
  -enabling/disabling common warnings, or a map of specific warning keys
  -with associated booleans. Defaults to true.
  -
  -[source,clojure]
  -----
  -:warnings true
  -;; OR
  -:warnings {:fn-deprecated false} ;; suppress this warning
  -----
  -
  -The following warnings are supported:
  -
  -* `:preamble-missing`, missing preamble
  -* `:unprovided`, required namespace not provided
  -* `:undeclared-var`, undeclared var
  -* `:private-var-access`, private var access from another namespace
  -* `:undeclared-ns`, var references non-existent namespace
  -* `:undeclared-ns-form`, namespace reference in ns form that does not
  -exist
  -* `:redef`, var redefinition
  -* `:dynamic`, dynamic binding of non-dynamic var
  -* `:fn-var`, var previously bound to fn changed to different type
  -* `:fn-arity`, invalid invoke arity
  -* `:fn-deprecated`, deprecated function usage
  -* `:declared-arglists-mismatch`, declared `:arglists` mismatch defined
  -* `:protocol-deprecated`, deprecated protocol usage
  -* `:undeclared-protocol-symbol`, undeclared protocol referred
  -* `:invalid-protocol-symbol`, invalid protocol symbol
  -* `:multiple-variadic-overloads`, multiple variadic arities
  -* `:variadic-max-arity`, arity greater than variadic arity
  -* `:overload-arity`, duplicate arities
  -* `:extending-base-js-type`, JavaScript base type extension
  -* `:invoke-ctor`, type constructor invoked as function
  -* `:invalid-arithmetic`, invalid arithmetic
  -* `:invalid-array-access`, invalid use of `aget` or `aset`
  -* `:protocol-invalid-method`, protocol method does not match declaration
  -* `:protocol-duped-method`, duplicate protocol method implementation
  -* `:protocol-multiple-impls`, protocol implemented multiple times
  -* `:protocol-with-variadic-method`, protocol declares variadic signature
  -* `:protocol-with-overwriting-method`, protocol method overwrites other protocol method
  -* `:protocol-impl-with-variadic-method`, protocol impl employs variadic signature
  -* `:protocol-impl-recur-with-target`, target passed in recur to protocol method head
  -* `:single-segment-namespace`, single segment namespace
  -* `:munged-namespace`, namespace name contains a reserved JavaScript keyword
  -* `:ns-var-clash`, namespace clashes with var
  -* `:extend-type-invalid-method-shape`, method arities must be grouped together
  -* `:unsupported-js-module-type`, unsupported JavaScript module type
  -* `:unsupported-preprocess-value`, unsupported foreign lib preprocess value
  -* `:js-shadowed-by-local`, name shadowed by a local
  -* `:infer-warning`, warnings related to externs inference
  -
  -[[elide-asserts]]
  -=== :elide-asserts
  -
  -This flag will cause all `(assert` _x_ `)` calls to be removed during
  -compilation, including implicit ``assert``s associated with `:pre` and
  -`:post` conditions. Useful for production. Default is always false even
  -in advanced compilation. Does NOT specify `goog.asserts.ENABLE_ASSERTS`,
  -which is different and used by the Closure library.
  -
  -[NOTE]
  -====
  -Note that, with JVM ClojureScript, it is not possible to dynamically set
  -`pass:[*assert*]` to false at runtime; this compiler flag must explicitly be
  -used to effect the elision. With self-hosted ClojureScript, on the other
  -hand, setting `pass:[*assert*]` will cause `asserts` to be elided as in
  -Clojure.
  -====
  -
  -[source,clojure]
  -----
  -:elide-asserts true
  -----
  -
  -[[pseudo-names]]
  -=== :pseudo-names
  -
  -With `:advanced` mode optimizations, determines whether readable names
  -are emitted. This can be useful when debugging issues in the optimized
  -JavaScript and can aid in finding missing <<compiler-options#externs,externs>>.
  -Defaults to false.
  -
  -[source,clojure]
  -----
  -:pseudo-names true
  -----
  -
  -[[print-input-delimiter]]
  -=== :print-input-delimiter
  -
  -Determines whether comments will be output in the JavaScript that can be
  -used to determine the original source of the compiled code.
  -
  -Defaults to false.
  -
  -[source,clojure]
  -----
  -:print-input-delimiter false
  -----
  -
  -[[output-wrapper]]
  -=== :output-wrapper
  -
  -Wrap the Javascript output to avoid clobbering globals. There are four
  -possible value types:
  -
  -1. Function - Takes one argument, the compiled javascript output. Should
  -              return some other valid javascript output. For the simplest
  -              case, just string concatenate the javascript output with
  -              something akin to #3 (the default wrapper)
  -2. String - Some `format` interpolation compatible string. For example,
  -            `"(function(){%s};)()"`. `format` receives the compiled
  -            javascript output as the second argument and nothing else.
  -3. Truthy - Wrap with the default `(function(){...};)()`
  -4. Falsey - Don't wrap. This is the default.
  -
  -[source,clojure]
  -----
  -;; function
  -(fn [js-output]
  -  (str "(function(){" js-output "};).call(window);"))
  -
  -;; string
  -"(function(){%s};).call(window);"
  -
  -;; truthy
  -true
  -
  -;; falsey
  -false
  -----
  -
  -[[libs]]
  -=== :libs
  -
  -Adds dependencies on external js libraries, i.e. Google
  -Closure-compatible javascript files with correct `goog.provides()` and
  -`goog.requires()` calls. Note that files in these directories will be
  -watched and a rebuild will occur if they are modified.
  -
  -Paths or filenames can be given. Relative paths are relative to the
  -current working directory (usually project root).
  -
  -Defaults to the empty vector `[]`
  -
  -[source,clojure]
  -----
  -:libs ["closure/library/third_party/closure"
  -       "src/js"
  -       "src/org/example/example.js"]
  -----
  -
  -[[preamble]]
  -=== :preamble
  -
  -Prepends the contents of the given files to each output file.  Files
  -should reside on the classpath. Only valid with optimizations other
  -than `:none`.
  -
  -Defaults to the empty vector `[]`
  -
  -[source,clojure]
  -----
  -:preamble ["license.js"]
  -----
  -
  -[[hashbang]]
  -=== :hashbang
  -
  -When using `:target :nodejs` the compiler will emit a shebang as the
  -first line of the compiled source, making it executable. When your
  -intention is to build a node.js module, instead of executable, use this
  -option to remove the shebang.
  -
  -[source,clojure]
  -----
  -:hashbang false
  -----
  -
  -[[compiler-stats]]
  -=== :compiler-stats
  -
  -Report basic timing measurements on compiler activity.
  -
  -Defaults to `false`.
  -
  -[source,clojure]
  -----
  -:compiler-stats true
  -----
  -
  -[[language-in-and-language-out]]
  -=== :language-in and :language-out
  -
  -Configure the input and output languages for the closure library. May be:
  -
  -* `:ecmascript-next` identical to `:es-next`
  -* `:ecmascript-2017` identical to `:es-2017`
  -* `:ecmascript-2016` identical to `:es-2016`
  -* `:ecmascript-2015` identical to `:es-2015`, `:ecmascript6`, `:es6`, `:ecmascript6-strict`, `:es6-strict`
  -* `:ecmascript6-typed` identical to `:es6-typed`
  -* `:ecmascript5` identical to `:es5`
  -* `:ecmascript5-strict` identical to `:es5-strict`
  -* `:ecmascript3` identical to `:es3`
  -* `:no-transpile`
  -
  -`:language-in` defaults to `:ecmascript5`
  -`:language-out` defaults to `:no-transpile`
  -
  -[source,clojure]
  -----
  -:language-in  :ecmascript5
  -:language-out :no-transpile
  +For `:optimizations :none`, a `:main` option must be specified for
  +defines to work, and only `goog-define` defines are affected.
  +`:closure-defines` currently does not have any effect with
  +`:optimizations :whitespace`.
  +====
  +
  +You can use the variables set in `:closure-defines` to eliminate parts
  +of your code at compile time (DCE). However, to do so you must use `if`
  +or `cond` in combination with an `identical?` comparison. Any other
  +forms (such as `case` or `condp`) will work correctly at runtime, but
  +the javascript output will contain the dead code branches.
  +
  +For example, if you want to make a localized build of your application
  +which only contains the translation messages relevant for the locale:
  +
  +[source,clojure]
  +----
  +(def messages
  +  (cond
  +    (identical? js/goog.LOCALE "nl") i18n.nl/messages
  +    (identical? js/goog.LOCALE "fr") i18n.fr/messages
  +    :else i18n.en/messages))
  +----
  +
  +[[closure-extra-annotations]]
  +=== :closure-extra-annotations
  +
  +Define extra JSDoc annotations that a closure library might use so that
  +they don't trigger compiler warnings.
  +
  +[source,clojure]
  +----
  +:closure-extra-annotations #{"api"}
   ----
   
   [[closure-output-charset]]
  
positive.code: :optimize-constants true
  ----
  
  [[parallel-build]]
  === :parallel-build
  
  
negative.code: :target-fn 'some.custom.dev-bootstrap
  ----
  
  [[warnings]]
  === :warnings
  
  This flag will turn on/off compiler warnings for references to
  undeclared vars, wrong function call arities, etc. Can be a boolean for
  enabling/disabling common warnings, or a map of specific warning keys
  with associated booleans. Defaults to true.
  
  [source,clojure]
  ----
  :warnings true
  ;; OR
  :warnings {:fn-deprecated false} ;; suppress this warning
  ----
  
  The following warnings are supported:
  
  * `:preamble-missing`, missing preamble
  * `:unprovided`, required namespace not provided
  * `:undeclared-var`, undeclared var
  * `:private-var-access`, private var access from another namespace
  * `:undeclared-ns`, var references non-existent namespace
  * `:undeclared-ns-form`, namespace reference in ns form that does not
  exist
  * `:redef`, var redefinition
  * `:dynamic`, dynamic binding of non-dynamic var
  * `:fn-var`, var previously bound to fn changed to different type
  * `:fn-arity`, invalid invoke arity
  * `:fn-deprecated`, deprecated function usage
  * `:declared-arglists-mismatch`, declared `:arglists` mismatch defined
  * `:protocol-deprecated`, deprecated protocol usage
  * `:undeclared-protocol-symbol`, undeclared protocol referred
  * `:invalid-protocol-symbol`, invalid protocol symbol
  * `:multiple-variadic-overloads`, multiple variadic arities
  * `:variadic-max-arity`, arity greater than variadic arity
  * `:overload-arity`, duplicate arities
  * `:extending-base-js-type`, JavaScript base type extension
  * `:invoke-ctor`, type constructor invoked as function
  * `:invalid-arithmetic`, invalid arithmetic
  * `:invalid-array-access`, invalid use of `aget` or `aset`
  * `:protocol-invalid-method`, protocol method does not match declaration
  * `:protocol-duped-method`, duplicate protocol method implementation
  * `:protocol-multiple-impls`, protocol implemented multiple times
  * `:protocol-with-variadic-method`, protocol declares variadic signature
  * `:protocol-with-overwriting-method`, protocol method overwrites other protocol method
  * `:protocol-impl-with-variadic-method`, protocol impl employs variadic signature
  * `:protocol-impl-recur-with-target`, target passed in recur to protocol method head
  * `:single-segment-namespace`, single segment namespace
  * `:munged-namespace`, namespace name contains a reserved JavaScript keyword
  * `:ns-var-clash`, namespace clashes with var
  * `:extend-type-invalid-method-shape`, method arities must be grouped together
  * `:unsupported-js-module-type`, unsupported JavaScript module type
  * `:unsupported-preprocess-value`, unsupported foreign lib preprocess value
  * `:js-shadowed-by-local`, name shadowed by a local
  * `:infer-warning`, warnings related to externs inference
  
  [[watch-fn]]
  === :watch-fn
  
  Is a function that will be called after a successful build.
  
  *Only available for `cljs.build.api/watch`*
  
  [source,clojure]
  ----
  :watch-fn (fn [] (println "Updated build"))
  ----
  