Showing preview only (3,365K chars total). Download the full file or copy to clipboard to get everything.
Repository: clojure/clojurescript
Branch: master
Commit: 6c7a1680b29e
Files: 410
Total size: 3.1 MB
Directory structure:
gitextract_7qk_jsor/
├── .github/
│ └── workflows/
│ ├── release.yml
│ └── test.yaml
├── .gitignore
├── .travis.yml
├── LICENSE
├── README.md
├── appveyor.yml
├── ast-ref/
│ ├── ast-ref.edn
│ ├── buildref.sh
│ ├── gen-ref.clj
│ └── quickref.html.tpl
├── benchmark/
│ └── cljs/
│ └── benchmark_runner.cljs
├── bin/
│ ├── cljsc
│ ├── cljsc.bat
│ └── cljsc.clj
├── build.edn
├── changes.md
├── ci/
│ └── install_jsc.sh
├── deps.edn
├── devnotes/
│ ├── README.org
│ ├── bcrepl.org
│ ├── cljs.org
│ ├── corelib.org
│ ├── day1.org
│ ├── day2.org
│ ├── talk.org
│ ├── testing
│ └── todo.org
├── epl-v10.html
├── pom.template.xml
├── pom.xml
├── project.clj
├── resources/
│ ├── lite_test.edn
│ ├── self_host_test.edn
│ ├── self_parity_test.edn
│ └── test.edn
├── samples/
│ ├── dom/
│ │ ├── .gitignore
│ │ ├── src/
│ │ │ └── dom/
│ │ │ └── test.cljs
│ │ └── test.html
│ ├── hello/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── hello-dev.html
│ │ ├── hello.html
│ │ └── src/
│ │ └── hello/
│ │ ├── core.cljs
│ │ └── foo/
│ │ └── bar.cljs
│ ├── hello-js/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── externed-lib.js
│ │ ├── externs.js
│ │ ├── hello-extern.html
│ │ ├── hello-js-dev.html
│ │ ├── hello-js.html
│ │ ├── my-external-lib.js
│ │ └── src/
│ │ └── hello-js/
│ │ ├── core.cljs
│ │ └── extern-example.cljs
│ ├── nodehello.cljs
│ ├── nodels.cljs
│ ├── repl/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── index.html
│ │ ├── repl.clj
│ │ └── src/
│ │ └── repl/
│ │ ├── foo.cljs
│ │ └── test.cljs
│ ├── string-requires-npm-deps/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── build.clj
│ │ └── src/
│ │ └── foo/
│ │ └── core.cljs
│ └── twitterbuzz/
│ ├── .gitignore
│ ├── README.md
│ ├── index-advanced.html
│ ├── index.html
│ ├── reset.css
│ ├── src/
│ │ └── twitterbuzz/
│ │ ├── anneal.cljs
│ │ ├── core.cljs
│ │ ├── dom-helpers.cljs
│ │ ├── layout.cljs
│ │ ├── leaderboard.cljs
│ │ ├── radial.cljs
│ │ ├── showgraph.cljs
│ │ └── timeline.cljs
│ ├── style.css
│ ├── test_data.txt
│ └── tweet_maps.txt
├── script/
│ ├── aot.clj
│ ├── aot_core
│ ├── benchmark
│ ├── bootstrap
│ ├── bootstrap.ps1
│ ├── browser-repl
│ ├── browser_repl.clj
│ ├── build
│ ├── clean
│ ├── compile
│ ├── noderepljs
│ ├── repl
│ ├── repl.bat
│ ├── repl.clj
│ ├── revision
│ ├── self-compile
│ ├── test
│ ├── test-cli
│ ├── test-compile
│ ├── test-self-host
│ ├── test-self-parity
│ ├── test-simple
│ ├── test.ps1
│ ├── uberjar
│ └── vendorize_deps
└── src/
├── assembly/
│ ├── aot.xml
│ └── slim.xml
├── main/
│ ├── cljs/
│ │ ├── cljs/
│ │ │ ├── analyzer/
│ │ │ │ ├── passes/
│ │ │ │ │ ├── and_or.cljc
│ │ │ │ │ └── lite.cljc
│ │ │ │ └── passes.cljc
│ │ │ ├── bootstrap_nodejs.js
│ │ │ ├── core/
│ │ │ │ └── specs/
│ │ │ │ ├── alpha.cljc
│ │ │ │ └── alpha.cljs
│ │ │ ├── core.cljs
│ │ │ ├── externs.js
│ │ │ ├── imul.js
│ │ │ ├── js.clj
│ │ │ ├── js.cljs
│ │ │ ├── loader.cljs
│ │ │ ├── main.clj
│ │ │ ├── math.cljs
│ │ │ ├── module_deps.js
│ │ │ ├── nodejs.cljs
│ │ │ ├── nodejs_externs.js
│ │ │ ├── nodejscli.cljs
│ │ │ ├── pprint.cljc
│ │ │ ├── pprint.cljs
│ │ │ ├── proxy/
│ │ │ │ └── impl.cljs
│ │ │ ├── proxy.cljs
│ │ │ ├── reader.clj
│ │ │ ├── reader.cljs
│ │ │ ├── repl.cljs
│ │ │ ├── source_map/
│ │ │ │ ├── base64.cljs
│ │ │ │ └── base64_vlq.cljs
│ │ │ ├── source_map.cljs
│ │ │ ├── spec/
│ │ │ │ ├── alpha.cljc
│ │ │ │ ├── alpha.cljs
│ │ │ │ ├── gen/
│ │ │ │ │ ├── alpha.cljc
│ │ │ │ │ └── alpha.cljs
│ │ │ │ └── test/
│ │ │ │ ├── alpha.cljc
│ │ │ │ └── alpha.cljs
│ │ │ ├── stacktrace.cljc
│ │ │ ├── test.cljc
│ │ │ └── test.cljs
│ │ ├── clojure/
│ │ │ ├── browser/
│ │ │ │ ├── dom.cljs
│ │ │ │ ├── event.cljs
│ │ │ │ ├── net.cljs
│ │ │ │ ├── repl/
│ │ │ │ │ └── preload.cljs
│ │ │ │ └── repl.cljs
│ │ │ ├── core/
│ │ │ │ ├── protocols.cljs
│ │ │ │ └── reducers.cljs
│ │ │ ├── data.cljs
│ │ │ ├── datafy.cljs
│ │ │ ├── edn.cljs
│ │ │ ├── reflect.cljs
│ │ │ ├── set.cljs
│ │ │ ├── string.cljs
│ │ │ ├── walk.cljs
│ │ │ └── zip.cljs
│ │ └── process/
│ │ └── env.cljs
│ └── clojure/
│ └── cljs/
│ ├── analyzer/
│ │ ├── api.cljc
│ │ ├── impl/
│ │ │ └── namespaces.cljc
│ │ ├── impl.cljc
│ │ ├── macros.clj
│ │ └── utils.clj
│ ├── analyzer.cljc
│ ├── build/
│ │ └── api.clj
│ ├── cli.clj
│ ├── closure.clj
│ ├── compiler/
│ │ ├── api.clj
│ │ └── macros.clj
│ ├── compiler.cljc
│ ├── core/
│ │ ├── macros.clj
│ │ └── server.clj
│ ├── core.cljc
│ ├── env/
│ │ └── macros.clj
│ ├── env.cljc
│ ├── externs.clj
│ ├── foreign/
│ │ └── node.clj
│ ├── instant.clj
│ ├── js_deps.cljc
│ ├── module_graph.cljc
│ ├── repl/
│ │ ├── bootstrap.clj
│ │ ├── browser.clj
│ │ ├── node.clj
│ │ ├── node_repl.js
│ │ ├── reflect.clj
│ │ └── server.clj
│ ├── repl.cljc
│ ├── server/
│ │ ├── browser.clj
│ │ └── node.clj
│ ├── source_map/
│ │ ├── base64.clj
│ │ └── base64_vlq.clj
│ ├── source_map.clj
│ ├── support.cljc
│ ├── tagged_literals.cljc
│ ├── util.cljc
│ └── vendor/
│ ├── bridge.clj
│ ├── clojure/
│ │ ├── data/
│ │ │ └── json.clj
│ │ └── tools/
│ │ ├── reader/
│ │ │ ├── default_data_readers.clj
│ │ │ ├── edn.clj
│ │ │ ├── impl/
│ │ │ │ ├── commons.clj
│ │ │ │ ├── errors.clj
│ │ │ │ ├── inspect.clj
│ │ │ │ └── utils.clj
│ │ │ └── reader_types.clj
│ │ └── reader.clj
│ └── cognitect/
│ └── transit.clj
└── test/
├── cljs/
│ ├── Circle-min.js
│ ├── Circle.js
│ ├── baz.cljs
│ ├── calculator.js
│ ├── calculator_global.js
│ ├── cljs/
│ │ ├── apply_test.cljs
│ │ ├── array_access/
│ │ │ ├── alpha.cljs
│ │ │ ├── beta.cljs
│ │ │ └── helper.clj
│ │ ├── array_access_test.cljc
│ │ ├── array_access_test.cljs
│ │ ├── async_await_test.cljs
│ │ ├── baz.cljs
│ │ ├── binding_test.cljs
│ │ ├── binding_test_other_ns.cljs
│ │ ├── chunked_seq.cljs
│ │ ├── clojure_alias_test.cljs
│ │ ├── collections_test.cljs
│ │ ├── core_test.cljs
│ │ ├── destructuring_test.cljs
│ │ ├── eval_test.cljs
│ │ ├── extend_to_native_test.cljs
│ │ ├── foo/
│ │ │ └── ns_shadow_test.cljs
│ │ ├── hash_map_test.cljs
│ │ ├── hash_set_test.cljs
│ │ ├── hashing_test.cljs
│ │ ├── import_test.cljs
│ │ ├── inference_test.cljs
│ │ ├── inference_util.clj
│ │ ├── interop_test.cljs
│ │ ├── invoke_test.cljs
│ │ ├── iterator_test.cljs
│ │ ├── keyword_macros.clj
│ │ ├── keyword_other.cljs
│ │ ├── keyword_test.cljs
│ │ ├── letfn_test.cljs
│ │ ├── lite_collections_test.cljs
│ │ ├── macro_test/
│ │ │ ├── cljs2261.clj
│ │ │ ├── cljs2261.cljs
│ │ │ ├── cljs2852.clj
│ │ │ └── macros.clj
│ │ ├── macro_test.cljs
│ │ ├── map_entry_test.cljs
│ │ ├── metadata_test.cljc
│ │ ├── new_new_test.cljs
│ │ ├── npm_deps_test.cljs
│ │ ├── ns_test/
│ │ │ ├── bar.cljs
│ │ │ └── foo.cljs
│ │ ├── ns_test.cljs
│ │ ├── other_functions_test.cljs
│ │ ├── parse_test.cljs
│ │ ├── pprint_test.clj
│ │ ├── pprint_test.cljs
│ │ ├── predicates_test.cljs
│ │ ├── primitives_test.cljs
│ │ ├── printing_test.cljs
│ │ ├── proxy_test.cljs
│ │ ├── qualified_method_test.cljs
│ │ ├── reader_test.cljs
│ │ ├── recur_test.cljs
│ │ ├── reducers_test.cljs
│ │ ├── repl_test.cljs
│ │ ├── seqs_test.cljs
│ │ ├── set_equiv_test.cljs
│ │ ├── spec/
│ │ │ ├── test/
│ │ │ │ ├── test_macros.cljc
│ │ │ │ ├── test_ns1.cljs
│ │ │ │ └── test_ns2.cljs
│ │ │ └── test_test.cljs
│ │ ├── spec_test.cljs
│ │ ├── specials_test.cljs
│ │ ├── syntax_quote_test.cljs
│ │ ├── tagged_literals_test.cljs
│ │ ├── test_test.cljs
│ │ ├── top_level.cljs
│ │ ├── var_test.cljs
│ │ └── walk_test.cljs
│ ├── clojure/
│ │ ├── data_test.cljs
│ │ ├── datafy_test.cljs
│ │ ├── edn_test.cljs
│ │ ├── gen_math_test.clj
│ │ ├── math_test.cljs
│ │ ├── set_test.cljs
│ │ ├── string_test.cljs
│ │ └── walk_test.cljs
│ ├── data_readers.cljc
│ ├── data_readers_test/
│ │ ├── core.cljc
│ │ └── records.cljc
│ ├── deps.cljs
│ ├── es6_default_hello.js
│ ├── es6_dep.js
│ ├── es6_hello.js
│ ├── externs.js
│ ├── foo/
│ │ └── ns_shadow_test.cljs
│ ├── hello.cljs
│ ├── js_libs/
│ │ └── tabby.js
│ ├── lite_test_runner.cljs
│ ├── module_test/
│ │ ├── main.cljs
│ │ └── modules/
│ │ ├── a.cljs
│ │ └── b.cljs
│ ├── preloads_test/
│ │ ├── core.cljs
│ │ └── preload.cljs
│ ├── react-min.js
│ ├── reactJS.js
│ ├── single_seg_macros.clj
│ ├── static/
│ │ └── core_test.cljs
│ └── test_runner.cljs
├── cljs_build/
│ ├── adv_src_map/
│ │ └── core.cljs
│ ├── analyzer_test/
│ │ └── no_defs.cljs
│ ├── circular_deps/
│ │ ├── a.cljs
│ │ └── b.cljs
│ ├── cljs_3235/
│ │ ├── core.cljs
│ │ └── foreign.js
│ ├── cljs_3284/
│ │ ├── bean.cljs
│ │ └── core.cljs
│ ├── cljs_3311_regress/
│ │ ├── core.cljs
│ │ └── tests.cljs
│ ├── cljs_3346_as_alias/
│ │ └── core.cljs
│ ├── cljs_3452_str_optimizations/
│ │ └── core.cljs
│ ├── code-split/
│ │ ├── index.html
│ │ ├── repl.clj
│ │ └── src/
│ │ └── code/
│ │ └── split/
│ │ ├── a.cljs
│ │ ├── b.cljs
│ │ ├── c.cljs
│ │ └── d.cljs
│ ├── emit_global_requires_test/
│ │ └── core.cljs
│ ├── emit_node_requires_test/
│ │ ├── core.cljs
│ │ └── native_modules.cljs
│ ├── firebase/
│ │ └── core.cljs
│ ├── foreign-libs-dir/
│ │ └── vendor/
│ │ └── lib.js
│ ├── foreign_libs/
│ │ └── core.cljs
│ ├── foreign_libs_cljs_2249/
│ │ └── core.cljs
│ ├── foreign_libs_cljs_2334/
│ │ ├── core.cljs
│ │ └── lib.js
│ ├── foreign_libs_dir_test/
│ │ └── core.cljs
│ ├── hello-modules/
│ │ ├── index.html
│ │ ├── release.clj
│ │ ├── repl.clj
│ │ └── src/
│ │ ├── bar/
│ │ │ └── core.cljs
│ │ └── foo/
│ │ └── core.cljs
│ ├── json_modules_test/
│ │ ├── a.js
│ │ └── b.json
│ ├── libs_test/
│ │ └── core.cljs
│ ├── loader_test/
│ │ ├── bar.cljs
│ │ ├── foo.cljs
│ │ ├── foreignA.js
│ │ └── foreignB.js
│ ├── node_modules_opt_test/
│ │ └── core.cljs
│ ├── npm_deps_test/
│ │ ├── core.cljs
│ │ ├── invoke.cljs
│ │ └── string_requires.cljs
│ ├── package_json_resolution_test/
│ │ └── core.cljs
│ ├── thirdparty/
│ │ └── add.js
│ └── trivial/
│ ├── core.cljs
│ ├── core2.cljs
│ ├── core3.cljs
│ ├── core4.cljs
│ ├── core5.cljs
│ └── core6.cljs
├── cljs_cli/
│ └── cljs_cli/
│ ├── test.clj
│ ├── test_runner.clj
│ └── util.clj
├── cljs_cp/
│ └── npm_deps_test/
│ └── string_requires_in_classpath.cljs
├── clojure/
│ └── cljs/
│ ├── analyzer/
│ │ ├── as_alias_test.clj
│ │ ├── glib_module_test.clj
│ │ ├── spec_tests.clj
│ │ └── specs.cljc
│ ├── analyzer_api_tests.clj
│ ├── analyzer_pass_tests.clj
│ ├── analyzer_tests.clj
│ ├── build_api_tests.clj
│ ├── closure_tests.clj
│ ├── compiler/
│ │ └── glib_module_test.clj
│ ├── compiler_tests.clj
│ ├── externs_infer_tests.clj
│ ├── externs_parsing_tests.clj
│ ├── foreign/
│ │ └── node_test.clj
│ ├── instant_tests.clj
│ ├── js_deps_tests.clj
│ ├── module_graph_tests.clj
│ ├── module_processing_tests.clj
│ ├── preamble1.js
│ ├── preamble2.js
│ ├── profile.clj
│ ├── repl_tests.clj
│ ├── source_map/
│ │ └── base64_tests.clj
│ ├── test_runner.clj
│ ├── test_util.clj
│ ├── transpile_tests.clj
│ ├── type_inference_tests.clj
│ └── util_tests.clj
├── externs/
│ └── test.js
├── node/
│ └── test.js
└── self/
├── bootstrap_test/
│ ├── core.cljs
│ ├── helper.clj
│ └── macros.clj
├── self_host/
│ └── test.cljs
└── self_parity/
├── auxiliary.cljs
├── setup.clj
└── test.cljs
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/workflows/release.yml
================================================
name: Release on demand
on:
workflow_dispatch:
inputs:
deploy:
description: "Deploy to Maven Central"
required: true
default: false
type: boolean
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Check out
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Set Github identity
run: |
git config --global user.name clojure-build
git config --global user.email "clojure-build@users.noreply.github.com"
- name: Set up Java
uses: actions/setup-java@v3
with:
java-version: 21
distribution: 'temurin'
cache: 'maven'
server-id: central
server-username: MAVEN_USERNAME
server-password: MAVEN_PASSWORD
gpg-private-key: ${{ secrets.CENTRAL_GPG_SECRET_KEY }}
gpg-passphrase: GPG_PASSPHRASE
- name: Release
run: script/build
env:
HUDSON: ${{ github.event.inputs.deploy }}
MAVEN_USERNAME: ${{ secrets.CENTRAL_USERNAME }}
MAVEN_PASSWORD: ${{ secrets.CENTRAL_PASSWORD }}
GPG_PASSPHRASE: ${{ secrets.CENTRAL_GPG_SECRET_KEY_PASSWORD }}
================================================
FILE: .github/workflows/test.yaml
================================================
name: Tests
on: [push]
jobs:
# Runtime Tests
runtime-test:
name: Runtime Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '21'
- uses: DeLaGuardo/setup-clojure@3.1
with:
tools-deps: '1.10.1.763'
- name: Cache maven
uses: actions/cache@v4.2.0
env:
cache-name: cache-maven
with:
path: ~/.m2
key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('deps.edn', '*/deps.edn') }}
restore-keys: |
${{ runner.os }}-${{ env.cache-name }}-
- name: Cache gitlibs
uses: actions/cache@v4.2.0
env:
cache-name: cache-gitlibs
with:
path: ~/.gitlibs
key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('deps.edn', '*/deps.edn') }}
restore-keys: |
${{ runner.os }}-${{ env.cache-name }}-
- name: Build tests
run: clojure -M:runtime.test.build
- name: Run tests
run: |
node builds/out-adv/core-advanced-test.js | tee test-out.txt
grep -qxF '0 failures, 0 errors.' test-out.txt
# Lite Tests
lite-test:
name: Lite Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '21'
- uses: DeLaGuardo/setup-clojure@3.1
with:
tools-deps: '1.10.1.763'
- name: Cache maven
uses: actions/cache@v4.2.0
env:
cache-name: cache-maven
with:
path: ~/.m2
key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('deps.edn', '*/deps.edn') }}
restore-keys: |
${{ runner.os }}-${{ env.cache-name }}-
- name: Cache gitlibs
uses: actions/cache@v4.2.0
env:
cache-name: cache-gitlibs
with:
path: ~/.gitlibs
key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('deps.edn', '*/deps.edn') }}
restore-keys: |
${{ runner.os }}-${{ env.cache-name }}-
- name: Build tests
run: clojure -M:lite.test.build
- name: Run tests
run: |
node builds/out-lite/lite-test.js | tee test-out.txt
grep -qxF '0 failures, 0 errors.' test-out.txt
# Runtime Tests
runtime-windows-test:
name: Runtime Windows Tests
runs-on: windows-2022
steps:
- uses: actions/checkout@v2
- uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '21'
- uses: DeLaGuardo/setup-clojure@3.5
with:
cli: '1.10.1.763'
- name: Build tests
run: clojure -M:runtime.test.build
shell: powershell
- name: Run tests
run: |
node builds/out-adv/core-advanced-test.js | tee test-out.txt
findstr "0 failures, 0 errors." test-out.txt
shell: powershell
# Self-host Tests
self-host-test:
name: Self-host Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '21'
- uses: DeLaGuardo/setup-clojure@3.1
with:
tools-deps: '1.10.1.763'
- name: Cache maven
uses: actions/cache@v4.2.0
env:
cache-name: cache-maven
with:
path: ~/.m2
key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('deps.edn', '*/deps.edn') }}
restore-keys: |
${{ runner.os }}-${{ env.cache-name }}-
- name: Cache gitlibs
uses: actions/cache@v4.2.0
env:
cache-name: cache-gitlibs
with:
path: ~/.gitlibs
key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('deps.edn', '*/deps.edn') }}
restore-keys: |
${{ runner.os }}-${{ env.cache-name }}-
- name: Build tests
run: clojure -M:selfhost.test.build
- name: Run tests
run: |
node builds/out-self/core-self-test.js | tee test-out.txt
grep -qxF '0 failures, 0 errors.' test-out.txt
# Self-parity Tests
self-parity-test:
name: Self-parity Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '21'
- uses: DeLaGuardo/setup-clojure@3.1
with:
tools-deps: '1.10.1.763'
- name: Cache maven
uses: actions/cache@v4.2.0
env:
cache-name: cache-maven
with:
path: ~/.m2
key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('deps.edn', '*/deps.edn') }}
restore-keys: |
${{ runner.os }}-${{ env.cache-name }}-
- name: Cache gitlibs
uses: actions/cache@v4.2.0
env:
cache-name: cache-gitlibs
with:
path: ~/.gitlibs
key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('deps.edn', '*/deps.edn') }}
restore-keys: |
${{ runner.os }}-${{ env.cache-name }}-
- name: Build tests
run: clojure -M:selfparity.test.build
- name: Run tests
run: |
node builds/out-self-parity/main.js | tee test-out.txt
grep -qxF '0 failures, 0 errors.' test-out.txt
# Compiler Tests
compiler-test:
name: Compiler Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '21'
- uses: DeLaGuardo/setup-clojure@3.1
with:
tools-deps: '1.10.1.763'
- name: Cache maven
uses: actions/cache@v4.2.0
env:
cache-name: cache-maven
with:
path: ~/.m2
key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('deps.edn', '*/deps.edn') }}
restore-keys: |
${{ runner.os }}-${{ env.cache-name }}-
- name: Cache gitlibs
uses: actions/cache@v4.2.0
env:
cache-name: cache-gitlibs
with:
path: ~/.gitlibs
key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('deps.edn', '*/deps.edn') }}
restore-keys: |
${{ runner.os }}-${{ env.cache-name }}-
- name: Run tests
run: clojure -M:compiler.test:compiler.test.run
# Compiler Windows Tests
compiler-windows-test:
name: Compiler Windows Tests
runs-on: windows-2022
steps:
- uses: actions/checkout@v2
- uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '21'
- uses: DeLaGuardo/setup-clojure@3.5
with:
cli: '1.10.1.763'
- name: Run tests
run: clojure -M:compiler.test:compiler.test.run
shell: powershell
# CLI Tests
cli-test:
name: CLI Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '21'
- uses: DeLaGuardo/setup-clojure@3.1
with:
tools-deps: '1.10.1.763'
- name: Cache maven
uses: actions/cache@v4.2.0
env:
cache-name: cache-maven
with:
path: ~/.m2
key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('deps.edn', '*/deps.edn') }}
restore-keys: |
${{ runner.os }}-${{ env.cache-name }}-
- name: Cache gitlibs
uses: actions/cache@v4.2.0
env:
cache-name: cache-gitlibs
with:
path: ~/.gitlibs
key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('deps.edn', '*/deps.edn') }}
restore-keys: |
${{ runner.os }}-${{ env.cache-name }}-
- name: Build Uberjar
run: ./script/uberjar
- name: Run tests
run: |
unset JAVA_TOOL_OPTIONS
clojure -M:cli.test.run | tee test-out.txt
grep -qxF '0 failures, 0 errors.' test-out.txt
================================================
FILE: .gitignore
================================================
*~
.idea
/.DS_Store
.DS_Store
/classes
/lib
/target
closure
/core.js
/coreadvanced.js
/coresimple.js
/out
*out
.lein*
*.iml
.repl*
*.swp
*.zip
clojurescript_release_*
closure-release-*
.lein-repl-history
.nrepl-port
.nrepl-repl-history
builds
.cljs*
node_modules
nashorn_code_cache
src/main/cljs/cljs/core.aot.js
src/main/cljs/cljs/core.aot.js.map
src/main/cljs/cljs/core.cljs.cache.aot.edn
src/main/cljs/cljs/core.cljs.cache.aot.json
.node_repl
package.json
package-lock.json
.cpcache
resources/brepl_client.js
================================================
FILE: .travis.yml
================================================
dist: xenial
git:
depth: 1000
language: node_js
node_js:
- "6"
before_install:
- wget https://ftp.mozilla.org/pub/firefox/nightly/latest-mozilla-central/jsshell-linux-x86_64.zip
- unzip jsshell-linux-x86_64.zip -d spidermoney
- sudo apt-get install -y libjavascriptcoregtk-4.0-bin
- wget https://aka.ms/chakracore/cc_linux_x64_1_8_1 -O chakra-core.tar.gz
- tar xvzf chakra-core.tar.gz
- wget https://github.com/oracle/graal/releases/download/vm-1.0.0-rc12/graalvm-ce-1.0.0-rc12-linux-amd64.tar.gz
- tar xzf graalvm-ce-1.0.0-rc12-linux-amd64.tar.gz
before_script:
- script/bootstrap
- script/uberjar
- mkdir -p builds/out-adv
- bin/cljsc src/test/cljs "{:optimizations :advanced
:output-wrapper true
:verbose true
:compiler-stats true
:parallel-build true
:output-dir \"builds/out-adv\"
:npm-deps {:lodash \"4.17.4\"}
:closure-warnings {:non-standard-jsdoc :off :global-this :off}
:language-in :es6
:language-out :es5
:install-deps true
:foreign-libs [{:file \"src/test/cljs/calculator_global.js\"
:provides [\"calculator\"]
:global-exports {calculator Calculator}}
{:file \"src/test/cljs/es6_dep.js\"
:module-type :es6
:provides [\"es6_calc\"]}
{:file \"src/test/cljs/calculator.js\"
:module-type :commonjs
:provides [\"calculator\"]}
{:file \"src/test/cljs/es6_default_hello.js\"
:provides [\"es6_default_hello\"]
:module-type :es6}]}" > builds/out-adv/core-advanced-test.js
script:
- lein test
- jsc builds/out-adv/core-advanced-test.js | tee test-out.txt
- grep '0 failures, 0 errors.' test-out.txt
- ./spidermoney/js -f builds/out-adv/core-advanced-test.js | tee test-out.txt
- grep '0 failures, 0 errors.' test-out.txt
- ./ChakraCoreFiles/bin/ch builds/out-adv/core-advanced-test.js | tee test-out.txt
- grep '0 failures, 0 errors.' test-out.txt
- ./graalvm-ce-1.0.0-rc12/bin/js builds/out-adv/core-advanced-test.js | tee test-out.txt
- grep '0 failures, 0 errors.' test-out.txt
- script/test-self-host | tee test-out.txt
- grep '0 failures, 0 errors.' test-out.txt
- script/test-self-parity | tee test-out.txt
- grep '0 failures, 0 errors.' test-out.txt
- script/test-cli node | tee test-out.txt
- grep '0 failures, 0 errors.' test-out.txt
================================================
FILE: LICENSE
================================================
Eclipse Public License - v 1.0
THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC
LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
1. DEFINITIONS
"Contribution" means:
a) in the case of the initial Contributor, the initial code and documentation
distributed under this Agreement, and
b) in the case of each subsequent Contributor:
i) changes to the Program, and
ii) additions to the Program;
where such changes and/or additions to the Program originate from and are
distributed by that particular Contributor. A Contribution 'originates'
from a Contributor if it was added to the Program by such Contributor
itself or anyone acting on such Contributor's behalf. Contributions do not
include additions to the Program which: (i) are separate modules of
software distributed in conjunction with the Program under their own
license agreement, and (ii) are not derivative works of the Program.
"Contributor" means any person or entity that distributes the Program.
"Licensed Patents" mean patent claims licensable by a Contributor which are
necessarily infringed by the use or sale of its Contribution alone or when
combined with the Program.
"Program" means the Contributions distributed in accordance with this
Agreement.
"Recipient" means anyone who receives the Program under this Agreement,
including all Contributors.
2. GRANT OF RIGHTS
a) Subject to the terms of this Agreement, each Contributor hereby grants
Recipient a non-exclusive, worldwide, royalty-free copyright license to
reproduce, prepare derivative works of, publicly display, publicly
perform, distribute and sublicense the Contribution of such Contributor,
if any, and such derivative works, in source code and object code form.
b) Subject to the terms of this Agreement, each Contributor hereby grants
Recipient a non-exclusive, worldwide, royalty-free patent license under
Licensed Patents to make, use, sell, offer to sell, import and otherwise
transfer the Contribution of such Contributor, if any, in source code and
object code form. This patent license shall apply to the combination of
the Contribution and the Program if, at the time the Contribution is
added by the Contributor, such addition of the Contribution causes such
combination to be covered by the Licensed Patents. The patent license
shall not apply to any other combinations which include the Contribution.
No hardware per se is licensed hereunder.
c) Recipient understands that although each Contributor grants the licenses
to its Contributions set forth herein, no assurances are provided by any
Contributor that the Program does not infringe the patent or other
intellectual property rights of any other entity. Each Contributor
disclaims any liability to Recipient for claims brought by any other
entity based on infringement of intellectual property rights or
otherwise. As a condition to exercising the rights and licenses granted
hereunder, each Recipient hereby assumes sole responsibility to secure
any other intellectual property rights needed, if any. For example, if a
third party patent license is required to allow Recipient to distribute
the Program, it is Recipient's responsibility to acquire that license
before distributing the Program.
d) Each Contributor represents that to its knowledge it has sufficient
copyright rights in its Contribution, if any, to grant the copyright
license set forth in this Agreement.
3. REQUIREMENTS
A Contributor may choose to distribute the Program in object code form under
its own license agreement, provided that:
a) it complies with the terms and conditions of this Agreement; and
b) its license agreement:
i) effectively disclaims on behalf of all Contributors all warranties
and conditions, express and implied, including warranties or
conditions of title and non-infringement, and implied warranties or
conditions of merchantability and fitness for a particular purpose;
ii) effectively excludes on behalf of all Contributors all liability for
damages, including direct, indirect, special, incidental and
consequential damages, such as lost profits;
iii) states that any provisions which differ from this Agreement are
offered by that Contributor alone and not by any other party; and
iv) states that source code for the Program is available from such
Contributor, and informs licensees how to obtain it in a reasonable
manner on or through a medium customarily used for software exchange.
When the Program is made available in source code form:
a) it must be made available under this Agreement; and
b) a copy of this Agreement must be included with each copy of the Program.
Contributors may not remove or alter any copyright notices contained
within the Program.
Each Contributor must identify itself as the originator of its Contribution,
if
any, in a manner that reasonably allows subsequent Recipients to identify the
originator of the Contribution.
4. COMMERCIAL DISTRIBUTION
Commercial distributors of software may accept certain responsibilities with
respect to end users, business partners and the like. While this license is
intended to facilitate the commercial use of the Program, the Contributor who
includes the Program in a commercial product offering should do so in a manner
which does not create potential liability for other Contributors. Therefore,
if a Contributor includes the Program in a commercial product offering, such
Contributor ("Commercial Contributor") hereby agrees to defend and indemnify
every other Contributor ("Indemnified Contributor") against any losses,
damages and costs (collectively "Losses") arising from claims, lawsuits and
other legal actions brought by a third party against the Indemnified
Contributor to the extent caused by the acts or omissions of such Commercial
Contributor in connection with its distribution of the Program in a commercial
product offering. The obligations in this section do not apply to any claims
or Losses relating to any actual or alleged intellectual property
infringement. In order to qualify, an Indemnified Contributor must:
a) promptly notify the Commercial Contributor in writing of such claim, and
b) allow the Commercial Contributor to control, and cooperate with the
Commercial Contributor in, the defense and any related settlement
negotiations. The Indemnified Contributor may participate in any such claim at
its own expense.
For example, a Contributor might include the Program in a commercial product
offering, Product X. That Contributor is then a Commercial Contributor. If
that Commercial Contributor then makes performance claims, or offers
warranties related to Product X, those performance claims and warranties are
such Commercial Contributor's responsibility alone. Under this section, the
Commercial Contributor would have to defend claims against the other
Contributors related to those performance claims and warranties, and if a
court requires any other Contributor to pay any damages as a result, the
Commercial Contributor must pay those damages.
5. NO WARRANTY
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE,
NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each
Recipient is solely responsible for determining the appropriateness of using
and distributing the Program and assumes all risks associated with its
exercise of rights under this Agreement , including but not limited to the
risks and costs of program errors, compliance with applicable laws, damage to
or loss of data, programs or equipment, and unavailability or interruption of
operations.
6. DISCLAIMER OF LIABILITY
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY
CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION
LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY
OF SUCH DAMAGES.
7. GENERAL
If any provision of this Agreement is invalid or unenforceable under
applicable law, it shall not affect the validity or enforceability of the
remainder of the terms of this Agreement, and without further action by the
parties hereto, such provision shall be reformed to the minimum extent
necessary to make such provision valid and enforceable.
If Recipient institutes patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Program itself
(excluding combinations of the Program with other software or hardware)
infringes such Recipient's patent(s), then such Recipient's rights granted
under Section 2(b) shall terminate as of the date such litigation is filed.
All Recipient's rights under this Agreement shall terminate if it fails to
comply with any of the material terms or conditions of this Agreement and does
not cure such failure in a reasonable period of time after becoming aware of
such noncompliance. If all Recipient's rights under this Agreement terminate,
Recipient agrees to cease use and distribution of the Program as soon as
reasonably practicable. However, Recipient's obligations under this Agreement
and any licenses granted by Recipient relating to the Program shall continue
and survive.
Everyone is permitted to copy and distribute copies of this Agreement, but in
order to avoid inconsistency the Agreement is copyrighted and may only be
modified in the following manner. The Agreement Steward reserves the right to
publish new versions (including revisions) of this Agreement from time to
time. No one other than the Agreement Steward has the right to modify this
Agreement. The Eclipse Foundation is the initial Agreement Steward. The
Eclipse Foundation may assign the responsibility to serve as the Agreement
Steward to a suitable separate entity. Each new version of the Agreement will
be given a distinguishing version number. The Program (including
Contributions) may always be distributed subject to the version of the
Agreement under which it was received. In addition, after a new version of the
Agreement is published, Contributor may elect to distribute the Program
(including its Contributions) under the new version. Except as expressly
stated in Sections 2(a) and 2(b) above, Recipient receives no rights or
licenses to the intellectual property of any Contributor under this Agreement,
whether expressly, by implication, estoppel or otherwise. All rights in the
Program not expressly granted under this Agreement are reserved.
This Agreement is governed by the laws of the State of New York and the
intellectual property laws of the United States of America. No party to this
Agreement will bring a legal action under this Agreement more than one year
after the cause of action arose. Each party waives its rights to a jury trial in
any resulting litigation.
================================================
FILE: README.md
================================================
## What is ClojureScript? ##
[ClojureScript](https://clojurescript.org) is a compiler for [Clojure](https://clojure.org) that targets JavaScript. It is designed to emit JavaScript code which is compatible with the advanced compilation mode of the [Google Closure](https://developers.google.com/closure/compiler/) optimizing compiler.
Official web site: https://clojurescript.org
## Releases and dependency information ##
Latest stable release: 1.12.134
* [All released versions](https://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22org.clojure%22%20AND%20a%3A%22clojurescript%22)
[Clojure deps.edn](http://clojure.org/guides/deps_and_cli) dependency information:
```
org.clojure/clojurescript {:mvn/version "1.12.134"}
```
[Leiningen](https://github.com/technomancy/leiningen/) dependency information:
```
[org.clojure/clojurescript "1.12.134"]
```
[Maven](https://maven.apache.org) dependency information:
```
<dependency>
<groupId>org.clojure</groupId>
<artifactId>clojurescript</artifactId>
<version>1.12.134</version>
</dependency>
```
## Getting Started ##
* Read the [Quick Start](https://clojurescript.org/guides/quick-start) guide.
* Read the [Documentation](https://clojurescript.org).
* Try a [tutorial](https://clojurescript.org/guides).
* [Companies using ClojureScript](https://clojurescript.org/community/companies)
## Questions, Feedback? ##
Please point all of your questions and feedback to the
[Clojure mailing list](https://groups.google.com/group/clojure). There
is a community run
[ClojureScript user mailing list](https://groups.google.com/group/clojurescript) and
the IRC channel, `#clojurescript` on [freenode.net](https://freenode.net/), is quite active.
There is also a community run [Slack channel](https://clojurians.slack.com). The
Jira bug/feature tracking application is located at
<https://clojure.atlassian.net/browse/CLJS>. Before submitting issues
please read the
[Reporting Issues](https://github.com/clojure/clojurescript/wiki/Reporting-Issues)
page first.
## Developers Welcome ##
ClojureScript operates under the same license as Clojure. All
contributors must have a signed CA (Contributor's Agreement) and
submit their patch via the appropriate channels. If you're interested
in contributing to the project, please see the
[contributing](https://clojure.org/dev/contributing) page on
[clojure.org](https://clojure.org). For more information about working
on the compiler and testing check the
[Developer section of the wiki](https://github.com/clojure/clojurescript/wiki/Developers).
YourKit
----
<img src="https://www.yourkit.com/images/yklogo.png"></img>
YourKit has given an open source license for their profiler, greatly simplifying the profiling of ClojureScript performance.
YourKit supports open source projects with its full-featured Java Profiler.
YourKit, LLC is the creator of <a href="https://www.yourkit.com/java/profiler/index.jsp">YourKit Java Profiler</a>
and <a href="https://www.yourkit.com/.net/profiler/index.jsp">YourKit .NET Profiler</a>,
innovative and intelligent tools for profiling Java and .NET applications.
## License ##
Copyright (c) Rich Hickey. All rights reserved. The use and
distribution terms for this software are covered by the Eclipse
Public License 1.0 (https://opensource.org/license/epl-1-0/)
which can be found in the file epl-v10.html at the root of this
distribution. By using this software in any fashion, you are
agreeing to be bound by the terms of this license. You must
not remove this notice, or any other, from this software.
================================================
FILE: appveyor.yml
================================================
image: Visual Studio 2017
environment:
nodejs_version: "6"
platform:
- x64
configuration:
- Release
matrix:
allow_failures:
- platform: x64
configuration: Release
cache:
- '%UserProfile%\.m2'
install:
# these need to have a line in between because of Windows line endings
- ps: >-
New-Item c:\scripts -type directory
$env:Path += ";C:\scripts"
Invoke-WebRequest -Uri https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein.bat -OutFile "C:\scripts\lein.bat"
lein self-install
lein version
- ps: Install-Product node $env:nodejs_version x64
- ps: wget 'http://ftp.mozilla.org/pub/firefox/nightly/latest-mozilla-central/jsshell-win64.zip' -OutFile "$pwd\jsshell.zip"
- ps: 7z x "-o$pwd\jsshell" jsshell.zip -r
- ps: wget 'https://aka.ms/chakracore/cc_windows_all_1_8_1' -OutFile "$pwd\chakra-core.zip"
- ps: 7z x "-o$pwd\chakra-core" chakra-core.zip -r
- ps: .\script\bootstrap.ps1
- ps: "[Console]::OutputEncoding = [Text.UTF8Encoding]::UTF8"
- ps: $env:SPIDERMONKEY_HOME = "$pwd/jsshell"
- ps: $SPIDERMONKEY_HOME = "$pwd/jsshell"
- ps: $env:CHAKRACORE_HOME = "$pwd/chakra-core/x64_release"
- ps: $CHAKRACORE_HOME = "$pwd/chakra-core/x64_release"
test_script:
- cmd: lein test
- cmd: powershell -noninteractive -noprofile -command .\script\test.ps1 > test-out.txt
- cmd: type test-out.txt
# Since tests are currently only run in 2 JavaScript environments, look for exactly 2 counts of "0 failures, 0 errors."
- cmd: powershell -noninteractive -noprofile -command if (-not ((sls -Pattern '0 failures, 0 errors.' -SimpleMatch test-out.txt).count -eq 2)) { exit 1 }
# Don't actually build (MSBuild).
build: off
================================================
FILE: ast-ref/ast-ref.edn
================================================
{:all-keys
[[:op "The node op"]
[:form "The ClojureScript form from which the node originated"]
[:env "The environment map"]
[:context "Either :expr, :return or :statement."]
^:optional
[:children "A vector of keywords, representing the children nodes of this node, in order of evaluation"]
; ^:optional
; [:raw-forms "If this node's :form has been macroexpanded, a sequence of all the intermediate forms from the original form to the macroexpanded form"]
;^:optional
;[:top-level "`true` if this is the root node"]
[:tag "The tag this expression is required to have"]
; [:o-tag "The tag of this expression, based on the node's children"]
; ^:optional
; [:ignore-tag "`true` if this node returns a statement rather than an expression"]
; ^:optional
; [:loops "A set of the loop-ids that might cause this node to recur"]
]
:node-keys
[{:op :binding
:doc "Node for a binding symbol"
:keys [[:form "The binding symbol"]
[:name "The binding symbol"]
[:local "One of :arg, :catch, :fn, :let, :letfn, :loop or :field"]
^:optional
[:variadic? "When :local is :arg, a boolean indicating whether this parameter binds to a variable number of arguments"]
^:optional ^:children
[:init "When :local is :let, :letfn or :loop, an AST node representing the bound value"]
^:optional ;^:children
[:shadow "When this binding shadows another local binding, an AST node representing the shadowed local"]
]}
{:op :case
:doc "Node for a case* special-form expression"
:keys [[:form "`(case* expr shift maks default case-map switch-type test-type skip-check?)`"]
^:children
[:test "The AST node for the expression to test against"]
^:children
[:nodes "A vector of :case-node AST nodes representing the test/then clauses of the case* expression"]
^:children
[:default "An AST node representing the default value of the case expression"]
]}
{:op :case-node
:doc "Grouping node for tests/then expressions in a case* expression"
:keys [^:children
[:tests "A vector of :case-test AST nodes representing the test values"]
^:children
[:then "A :case-then AST node representing the value the case expression will evaluate to when one of the :tests expressions matches the :case :test value"]]}
{:op :case-test
:doc "Node for a test value in a case* expression"
:keys [^:children
[:test "A :const AST node representing the test value"]
#_[:hash]]}
{:op :case-then
:doc "Node for a then expression in a case* expression"
:keys [^:children
[:then "An AST node representing the expression the case will evaluate to when the :test expression matches this node's corresponding :case-test value"]
#_[:hash]]}
{:op :const
:doc "Node for a constant literal or a quoted collection literal"
:keys [[:form "A constant literal or a quoted collection literal"]
[:literal? "`true`"]
[:type "one of :nil, :bool, :keyword, :symbol, :string, :number, :type, :record, :map, :vector, :set, :seq, :char, :regex, :class, :var, or :unknown"]
[:val "The value of the constant node"]
;^:optional ^:children
;; FIXME
;[:meta "An AST node representing the metadata of the constant value, if present. The node will be either a :map node or a :const node with :type :map"]
;
;^:optional
;[:id "A numeric id for the constant value, will be the same for every instance of this constant inside the same compilation unit, not present if :type is :nil or :bool"]
]}
{:op :def
:doc "Node for a def special-form expression"
:keys [[:form "`(def name docstring? init?)`"]
[:name "The var symbol to define in the current namespace"]
;[:var "The Var object created (or found, if it already existed) named by the symbol :name in the current namespace"]
;^:optional ^:children
;[:meta "An AST node representing the metadata attached to :name, if present. The node will be either a :map node or a :const node with :type :map"]
^:optional ^:children
[:init "An AST node representing the initial value of the var"]
^:children
[:the-var "A :the-var AST node representing the return of this :def."]
;^:optional
;[:doc "The docstring for this var"]
]}
{:op :defrecord
:doc "Node for a defrecord* special-form expression"
:keys [[:form "`(deftype* name class.name [arg*] :implements [interface*] method*)`"]
;[:interfaces "A set of the interfaces implemented by the type"]
[:t "The symbol name of the defrecord."]
^:children
[:body "An AST node containing method implementations for this record."]
;^:children
;[:fields "A vector of :binding AST nodes with :local :field representing the deftype fields"]
]}
{:op :deftype
:doc "Node for a deftype* special-form expression"
:keys [[:form "`(deftype* name class.name [arg*] :implements [interface*] method*)`"]
;[:interfaces "A set of the interfaces implemented by the type"]
[:t "The symbol name of the deftype"]
;[:class-name "A class for the deftype, should *never* be instantiated or used on instance? checks as this will not be the same class the deftype will evaluate to after compilation"]
^:children
[:body "An AST node containing method implemented for this type."]
;^:children
;[:fields "A vector of :binding AST nodes with :local :field representing the deftype fields"]
]}
{:op :do
:doc "Node for a do special-form expression or for another special-form's body"
:keys [[:form "`(do statement* ret)`"]
^:children
[:statements "A vector of AST nodes representing all but the last expression in the do body"]
^:children
[:ret "An AST node representing the last expression in the do body (the block's return value)"]
^:optional
[:body? "`true` if this node is a synthetic body"]]}
{:op :fn
:doc "Node for a fn* special-form expression"
:keys [[:form "`(fn* name? [arg*] body*)` or `(fn* name? method*)`"]
[:variadic? "`true` if this function contains a variadic arity method"]
[:max-fixed-arity "The number of arguments taken by the fixed-arity method taking the most arguments"]
^:optional ^:children
[:local "A :binding AST node with :local :fn representing the function's local name, if one is supplied"]
^:children
[:methods "A vector of :fn-method AST nodes representing the fn method arities"]
]}
{:op :fn-method
:doc "Node for an arity method in a fn* expression"
:keys [[:form "`([arg*] body*)`"]
[:variadic? "`true` if this fn-method takes a variable number of arguments"]
^:children
[:params "A vector of :binding AST nodes with :local :arg representing this fn-method args"]
[:fixed-arity "The number of non-variadic args this fn-method takes"]
^:children
[:body "Synthetic :do node (with :body? `true`) representing the body of this fn-method"]]}
{:op :host-call
:doc "Node for a host interop call"
:keys [[:form "`(.method target arg*)`"]
[:method "Symbol naming the method to call"]
^:children
[:target "An AST node representing the target object"]
^:children
[:args "A vector of AST nodes representing the args passed to the method call"]]}
{:op :host-field
:doc "Node for a host interop field access"
:keys [[:form "`(.-field target)`"]
[:field "Symbol naming the field to access"]
^:children
[:target "An AST node representing the target object"]]}
{:op :if
:doc "Node for an if special-form expression"
:keys [[:form "`(if test then else?)`"]
^:children
[:test "An AST node representing the test expression"]
^:children
[:then "An AST node representing the expression's return value if :test evaluated to a truthy value"]
^:children
[:else "An AST node representing the expression's return value if :test evaluated to a falsey value, if not supplied it will default to a :const node representing nil"]]}
{:op :invoke
:doc "Node for an invoke expression"
:keys [[:form "`(f arg*)`"]
^:children
[:fn "An AST node representing the function to invoke"]
^:children
[:args "A vector of AST nodes representing the args to the function"]
;FIXME
;^:optional
;[:meta "Map of metadata attached to the invoke :form"]
]}
{:op :js
:doc "Node for a js* special-form expression"
:keys [[:form "`(js* js-string arg*)`"]
[:segs "A vector of js strings that delimit the compiled args"]
^:children
[:args "A vector of AST nodes representing the cljs expressions that will be interposed with the strings in segs"]]}
{:op :js-array
:doc "Node for a js array literal"
:keys [[:form "`#js [item*]`"]
^:children
[:items "A vector of AST nodes representing the items of the js array"]]}
{:op :js-object
:doc "Node for a js object literal"
:keys [[:form "`#js {[key value]*}`"]
[:keys "A vector of values representing the keys of the js object"]
^:children
[:vals "A vector of AST nodes representing the vals of the js object"]]}
{:op :js-var
:doc "Node for a js-var symbol"
:keys [[:form "A symbol naming the js-var in the form: `js/foo`, `js-ns/foo` or `js-var`"]
[:ns "The namespace symbol for this js-var."]
[:name "The fully qualified symbol naming this js-var."]
]}
{:op :let
:doc "Node for a let* special-form expression"
:keys [[:form "`(let* [binding*] body*)`"]
^:children
[:bindings "A vector of :binding AST nodes with :local :let"]
^:children
[:body "Synthetic :do node (with :body? `true`) representing the body of the let expression"]]}
{:op :letfn
:doc "Node for a letfn* special-form expression"
:keys [[:form "`(letfn* [binding*] body*)`"]
^:children
[:bindings "A vector of :binding AST nodes with :local :letfn"]
^:children
[:body "Synthetic :do node (with :body? `true`) representing the body of the letfn expression"]]}
{:op :local
:doc "Node for a local symbol"
:keys [[:form "The local symbol"]
[:name "The uniquified local symbol"]
[:local "One of :arg, :catch, :fn, :let, :letfn, :loop, :field or :this"]
]}
{:op :loop
:doc "Node a loop* special-form expression"
:keys [[:form "`(loop* [binding*] body*)`"]
^:children
[:bindings "A vector of :binding AST nodes with :local :loop"]
^:children
[:body "Synthetic :do node (with :body? `true`) representing the body of the loop expression"]]}
{:op :map
:doc "Node for a map literal with attached metadata and/or non literal elements"
:keys [[:form "`{[key val]*}`"]
^:children
[:keys "A vector of AST nodes representing the keys of the map"]
^:children
[:vals "A vector of AST nodes representing the vals of the map"]]}
{:op :new
:doc "Node for a new special-form expression"
:keys [[:form "`(new Class arg*)`"]
^:children
[:class "A :const AST node with :type :class representing the Class to instantiate"]
^:children
[:args "A vector of AST nodes representing the arguments passed to the Class constructor"]
]}
{:op :no-op
:doc "Node for a no-op"
:keys [
]}
{:op :ns
:doc "Node for a clojure.core/ns form."
:keys [
]}
{:op :ns*
:doc "Node for a special file-loading form."
:keys [
]}
{:op :quote
:doc "Node for a quote special-form expression"
:keys [[:form "`(quote expr)`"]
^:children
[:expr "A :const AST node representing the quoted value"]
[:literal? "`true`"]]}
{:op :recur
:doc "Node for a recur special-form expression"
:keys [[:form "`(recur expr*)`"]
^:children
[:exprs "A vector of AST nodes representing the new bound values for the loop binding on the next loop iteration"]]}
{:op :set
:doc "Node for a set literal with attached metadata and/or non literal elements"
:keys [[:form "`#{item*}`"]
^:children
[:items "A vector of AST nodes representing the items of the set"]]}
{:op :set!
:doc "Node for a set! special-form expression"
:keys [[:form "`(set! target val)`"]
^:children
[:target "An AST node representing the target of the set! expression, must be :assignable?"]
^:children
[:val "An AST node representing the new value for the target"]]}
{:op :the-var
:doc "Node for a var special-form expression"
:keys [[:form "`(var var-name)`"]
^:children
[:var "A :var AST node that this expression refers to"]
^:children
[:sym "An AST node for the quoted fully qualified name of this var."]
^:children
[:meta "A :map AST node of this var's metadata."]
]}
{:op :throw
:doc "Node for a throw special-form statement"
:keys [[:form "`(throw exception)`"]
^:children
[:exception "An AST node representing the exception to throw"]]}
{:op :try
:doc "Node for a try special-form expression"
:keys [[:form "`(try body* catch* finally?)`"]
^:children
[:body "Synthetic :do AST node (with :body? `true`) representing the body of this try expression"]
^:optional
[:name "A binding in scope in :catch. (symbol)"]
^:optional ^:children
[:catch "An AST node representing an unconditional JavaScript catch."]
^:optional ^:children
[:finally "Synthetic :do AST node (with :body? `true`) representing the final clause of this try expression"]]}
{:op :var
:doc "Node for a var symbol"
:keys [[:form "A symbol naming the var"]
[:ns "The namespace symbol this var is defined in."]
[:name "The fully qualified symbol naming this var."]
]}
{:op :vector
:doc "Node for a vector literal with attached metadata and/or non literal elements"
:keys [[:form "`[item*]`"]
^:children
[:items "A vector of AST nodes representing the items of the vector"]]}
{:op :with-meta
:doc "Node for a non quoted collection literal or fn/reify expression with attached metadata"
:keys [[:form "Non quoted collection literal or fn/reify expression with attached metadata"]
^:children
[:meta "An AST node representing the metadata of expression. The node will be either a :map node or a :const node with :type :map"]
^:children
[:expr "The expression this metadata is attached to, :op is one of :vector, :map, :set, :fn or :reify"]]}]}
================================================
FILE: ast-ref/buildref.sh
================================================
#!/bin/sh
java -cp .:`lein cp` clojure.main <<EOF
(load "gen-ref")
(System/exit 0)
EOF
#git pull
#mv quickref.html q.html
#git checkout origin/gh-pages
#mv q.html quickref.html
#git add quickref.html
#git commit -m "update quickref"
#git push origin HEAD:gh-pages
#git checkout master
================================================
FILE: ast-ref/gen-ref.clj
================================================
(use 'clojure.string)
(def tej-ref (read-string (slurp "ast-ref.edn")))
(def html (slurp "quickref.html.tpl"))
(defn fix [x]
(-> (str x)
(replace #"`(.*?)`" "<code>$1</code>")
(replace #":([a-zA-Z\?!\-]*)" "<code>:$1</code>")))
(defn build-children [children]
(if (some #(:optional (meta %)) children)
(let [[c & rest] children]
(let [k (build-children rest)
kc (mapv (fn [x] (cons c x)) k)]
(if (:optional (meta c))
(into k kc)
kc)))
(if (seq children)
[children]
[[]])))
(defn children [keys]
(when-let [children (seq (filter #(:children (meta %)) keys))]
(mapv #(mapv first %) (build-children children))))
(def nodes
(apply str (for [{:keys [op doc keys]} (:node-keys tej-ref) :let [op (name op)]]
(str "<section>"
"<h2>" "<a href=\"#" op "\" name=\"" op "\">#</a>" op "</h2>"
"<h4>" doc "</h4>"
"<dl>"
"<dt> :op </dt> <dd> <code>:" op "</code></dd>"
(apply str (for [[k d :as f] keys]
(str "<dt>" k "</dt>"
"<dd>" (if (:optional (meta f))
"<b>optional</b> ") (fix d) "</dd>")))
(if-let [c (children keys)]
(str "<dt> :children </dt> <dd> "
(join ", " (mapv (fn [c] (str "<code>" c "</code>")) c)) "</dd>"))
"</dl>"
"</section>\n"))))
(def nav
(apply str (for [{op :op} (:node-keys tej-ref) :let [op (name op)]]
(str "<li><a href=\"#" op "\">" op "</a></li>\n"))))
(def common
(apply str (str "<section>"
"<dl>"
(apply str (for [[k d :as f] (:all-keys tej-ref)]
(str "<dt>" k "</dt>"
"<dd>" (if (:optional (meta f))
"<b>optional</b> ") (fix d) "</dd>")))
"</dl>"
"</section>\n")))
(spit "quickref.html"
(-> html
(replace "{nav}" nav)
(replace "{common}" common)
(replace "{nodes}" nodes)))
================================================
FILE: ast-ref/quickref.html.tpl
================================================
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>cljs.analyzer AST Quickref (alpha)</title>
<style>
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
font-family: "Lucida Grande", "Trebuchet MS", "Bitstream Vera Sans", Verdana, Helvetica, sans-serif;
font-size: 13px;
line-height: 20px;
margin: 40px 80px;
}
main {
margin-left: 240px;
width: 680px;
}
dl {
display: flex;
flex-flow: row wrap;
}
dt:nth-of-type(odd), dd:nth-of-type(odd) {
background: #f5f5f5;
}
dt {
padding: 2px 0; width: 120px;
color:#191970;
}
dd { padding: 2px 0; width: 560px;}
.wide-keys dt { width: 160px; }
.wide-keys dd { width: 520px; }
code, dt { font-family: "Menlo"; }
code { color: rgb(160,40,160); }
.page-title {
font-size: 32px;
border-bottom: none;
margin-bottom: 2.75rem;
}
h1 {
border-bottom: 1px solid #ccc;
padding-bottom: 0.75em;
margin-bottom: 1.5rem;
}
h2 {
margin-bottom: 0.2rem;
position: relative;
padding-left: 20px;
margin-left: -20px;
}
h4 {
margin-bottom: 1rem;
}
h2 a {
color: #aaa;
font-size: 16px;
font-weight: normal;
margin-left: -20px;
position: absolute;
text-decoration: none;
vertical-align: middle;
visibility: hidden;
}
h2:hover a {
visibility: visible;
}
p {
margin-bottom: 1rem;
}
section {
/*border-bottom: 1px solid #ccc;*/
margin-bottom: 1rem;
padding-bottom: 1rem;
}
nav {
background: #f5f5f5;
font-size: 11px;
line-height: 14px;
padding: 0.5rem 1rem;
position: fixed;
width: 160px;
}
nav ul {
list-style: none;
margin-bottom: 1rem;
}
nav ul:last-child { margin-bottom: 0; }
</style>
</head>
<body>
<nav>
<strong>Nodes reference</strong>
<ul>
{nav}
</ul>
</nav>
<main>
<h1 class="page-title">cljs.analyzer AST Quickref (alpha)</h1>
<h1>Common AST fields</h1>
{common}
<h1>Nodes reference</h1>
{nodes}
</main>
</body>
</html>
================================================
FILE: benchmark/cljs/benchmark_runner.cljs
================================================
(ns cljs.benchmark-runner
(:refer-clojure :exclude [println])
(:require [cljs.reader :as reader]
[clojure.core.reducers :as r]
[clojure.string :as string]))
(def println print)
(set! *print-fn* js/print)
(simple-benchmark [x 1] (identity x) 1000000)
(println ";; symbol construction")
(simple-benchmark [] (symbol 'foo) 1000000)
(println)
(println ";; array-reduce & ci-reduce")
(def arr (let [arr (array)]
(dotimes [i 1000000]
(.push arr i))
arr))
(defn sum [a b] (+ a b))
(simple-benchmark [coll (seq arr)] (ci-reduce coll + 0) 1)
(simple-benchmark [coll (seq arr)] (ci-reduce coll sum 0) 1)
(simple-benchmark [coll arr] (array-reduce coll + 0) 1)
(simple-benchmark [coll arr] (array-reduce coll sum 0) 1)
(println ";; areduce")
(def x (atom 0))
(simple-benchmark [arr (to-array (range 1000000))] (reset! x (areduce arr i ret 0 (+ ret (aget arr i)))) 1)
(println ";; amap")
(simple-benchmark [arr (to-array (range 1000000))] (amap arr i ret (* 10 (aget arr i))) 1)
(println ";; js-keys")
(simple-benchmark [obj (js-obj "a" 1 "b" 2) f js-keys] (f obj) 400000)
(simple-benchmark [obj (js-obj "a" 1 "b" 2 "c" 3 "d" 4 "e" 5 "f" 6) f js-keys] (f obj) 400000)
(println ";;; instance?")
;; WARNING: will get compiled away under advanced
(simple-benchmark [coll []] (instance? PersistentVector coll) 1000000)
(println ";;; satisfies?")
(simple-benchmark [coll (list 1 2 3)] (satisfies? ISeq coll) 1000000)
(simple-benchmark [coll [1 2 3]] (satisfies? ISeq coll) 1000000)
(println)
(println ";;; array & string ops")
(simple-benchmark [coll (array 1 2 3)] (seq coll) 1000000)
(simple-benchmark [coll "foobar"] (seq coll) 1000000)
(simple-benchmark [coll (array 1 2 3)] (first coll) 1000000)
(simple-benchmark [coll "foobar"] (first coll) 1000000)
(simple-benchmark [coll (array 1 2 3)] (nth coll 2) 1000000)
(simple-benchmark [coll "foobar"] (nth coll 2) 1000000)
(println)
(defprotocol IFoo (foo [x]))
(println ";;; cloning & specify")
(simple-benchmark [coll [1 2 3]] (clone coll) 1000000)
(simple-benchmark [coll [1 2 3]] (specify coll IFoo (foo [_] :bar)) 1000000)
(simple-benchmark [coll (specify [1 2 3] IFoo (foo [_] :bar))] (foo coll) 1000000)
(println)
(println ";;; list ops")
(simple-benchmark [coll (list 1 2 3)] (first coll) 1000000)
(simple-benchmark [coll (list 1 2 3)] (-first coll) 1000000)
(simple-benchmark [coll (list 1 2 3)] (rest coll) 1000000)
(simple-benchmark [coll (list 1 2 3)] (-rest coll) 1000000)
(simple-benchmark [] (list) 1000000)
(simple-benchmark [] (list 1 2 3) 1000000)
(println)
(println ";;; vector ops")
(simple-benchmark [] [] 1000000)
(simple-benchmark [[a b c] (take 3 (repeatedly #(rand-int 10)))] (-count [a b c]) 1000000)
(simple-benchmark [[a b c] (take 3 (repeatedly #(rand-int 10)))] (-count (vec #js [a b c])) 1000000)
(simple-benchmark [[a b c] (take 3 (repeatedly #(rand-int 10)))] (-count (vector a b c)) 1000000)
(simple-benchmark [coll [1 2 3]] (transient coll) 100000)
(simple-benchmark [coll [1 2 3]] (nth coll 0) 1000000)
(simple-benchmark [coll [1 2 3]] (-nth coll 0) 1000000)
(simple-benchmark [coll [1 2 3]] (-nth ^not-native coll 0) 1000000)
(simple-benchmark [coll [1 2 3]] (coll 0) 1000000)
(simple-benchmark [coll [1 2 3]] (conj coll 4) 1000000)
(simple-benchmark [coll [1 2 3]] (-conj coll 4) 1000000)
(simple-benchmark [coll []] (-conj ^not-native coll 1) 1000000)
(simple-benchmark [coll [1]] (-conj ^not-native coll 2) 1000000)
(simple-benchmark [coll [1 2]] (-conj ^not-native coll 3) 1000000)
(simple-benchmark [coll [1 2 3]] (seq coll) 1000000)
(simple-benchmark [coll [1 2 3]] (-seq coll) 1000000)
(simple-benchmark [coll (seq [1 2 3])] (first coll) 1000000)
(simple-benchmark [coll (seq [1 2 3])] (-first coll) 1000000)
(simple-benchmark [coll (seq [1 2 3])] (rest coll) 1000000)
(simple-benchmark [coll (seq [1 2 3])] (-rest coll) 1000000)
(simple-benchmark [coll (seq [1 2 3])] (next coll) 1000000)
(println)
(println ";;; large vector ops")
(simple-benchmark [] (reduce conj [] (range 40000)) 10)
(simple-benchmark [coll (reduce conj [] (range (+ 32768 32)))] (conj coll :foo) 100000)
(simple-benchmark [coll (reduce conj [] (range 40000))] (assoc coll 123 :foo) 100000)
(simple-benchmark [coll (reduce conj [] (range (+ 32768 33)))] (pop coll) 100000)
(println)
(println ";;; chunked seqs")
(let [v (seq (into [] (range 64)))]
(simple-benchmark [] (-first v) 1000000)
(simple-benchmark [] (-next v) 1000000)
(simple-benchmark [] (-rest v) 1000000))
(println)
(println ";;; transients")
(print "transient vector, conj! 1000000 items")
(time
(let [v (transient [])]
(loop [i 0 v v]
(if (> i 1000000)
(persistent! v)
(recur (inc i) (conj! v i))))))
(println ";;; vector equality")
(simple-benchmark
[a (into [] (range 1000000))
b (into [] (range 1000000))]
(= a b) 1)
(println)
(println ";;; keyword compare")
(let [seed ["amelia" "olivia" "jessica" "emily" "lily" "ava" "isla" "sophie" "mia" "isabella" "evie" "poppy" "ruby" "grace" "sophia" "chloe" "freya" "isabelle" "ella" "charlotte" "scarlett" "daisy" "lola" "holly" "eva" "lucy" "millie" "phoebe" "layla" "maisie" "sienna" "alice" "florence" "lilly" "ellie" "erin" "elizabeth" "imogen" "summer" "molly" "hannah" "sofia" "abigail" "jasmine" "matilda" "megan" "rosie" "lexi" "lacey" "emma" "amelie" "maya" "gracie" "emilia" "georgia" "hollie" "evelyn" "eliza" "amber" "eleanor" "bella" "amy" "brooke" "leah" "esme" "harriet" "anna" "katie" "zara" "willow" "elsie" "annabelle" "bethany" "faith" "madison" "isabel" "rose" "julia" "martha" "maryam" "paige" "heidi" "maddison" "niamh" "skye" "aisha" "mollie" "ivy" "francesca" "darcey" "maria" "zoe" "keira" "sarah" "tilly" "isobel" "violet" "lydia" "sara" "caitlin"]]
(simple-benchmark
[arr (into-array (repeatedly 10000 #(keyword (rand-nth seed))))]
(.sort arr compare)
100)
(simple-benchmark
[arr (into-array (repeatedly 10000 #(keyword (rand-nth seed) (rand-nth seed))))]
(.sort arr compare)
100))
(println)
(println ";;; reduce lazy-seqs, vectors, ranges")
(simple-benchmark [coll (take 100000 (iterate inc 0))] (reduce + 0 coll) 1)
(simple-benchmark [coll (range 1000000)] (reduce + 0 coll) 1)
(simple-benchmark [coll (into [] (range 1000000))] (reduce + 0 coll) 1)
(println)
(println ";; apply")
(simple-benchmark [coll (into [] (range 1000000))] (apply + coll) 1)
(simple-benchmark [] (list 1 2 3 4 5) 1000000)
(simple-benchmark [xs (array-seq (array 1 2 3 4 5))] (apply list xs) 1000000)
(simple-benchmark [xs (list 1 2 3 4 5)] (apply list xs) 1000000)
(simple-benchmark [xs [1 2 3 4 5]] (apply list xs) 1000000)
(simple-benchmark [f (fn [a b & more])] (apply f (range 32)) 1000000)
(simple-benchmark [f (fn [a b c d e f g h i j & more])] (apply f (range 32)) 1000000)
(println)
(println ";; update-in")
(simple-benchmark [coll {:foo 1} ks [:foo]] (update-in coll ks inc) 1000000)
(simple-benchmark [coll (array-map :foo 1) ks [:foo]] (update-in coll ks inc) 1000000)
(println)
(println ";;; obj-map")
(simple-benchmark [coll (obj-map)] (assoc coll :foo :bar) 1000000)
(simple-benchmark [coll (obj-map :foo :bar)] (-lookup coll :foo) 1000000)
(simple-benchmark [coll (obj-map :foo :bar)] (assoc coll :baz :woz) 1000000)
(simple-benchmark [coll (obj-map :foo :bar :baz :woz)] (-lookup coll :baz) 1000000)
(simple-benchmark [coll (obj-map :foo :bar :baz :woz :lol :rofl)] (-lookup coll :lol) 1000000)
(println)
(println ";;; array-map")
(simple-benchmark [] {[1] true [2] true [3] true} 1000000)
(simple-benchmark [coll (array-map)] (assoc coll :foo :bar) 1000000)
(simple-benchmark [coll (array-map :foo :bar)] (-lookup coll :foo) 1000000)
(simple-benchmark [coll (array-map :foo :bar)] (assoc coll :baz :woz) 1000000)
(simple-benchmark [coll (array-map :foo :bar :baz :woz)] (-lookup coll :baz) 1000000)
(simple-benchmark [coll (array-map :foo :bar :baz :woz :lol :rofl)] (-lookup coll :lol) 1000000)
(println)
(println ";;; array-map w/ symbols")
(let [a 'foo
b 'bar
c 'baz
d 'woz
e 'lol
f 'rofl]
(simple-benchmark [coll (array-map)] (assoc coll a b) 1000000)
(simple-benchmark [coll (array-map a b)] (-lookup coll a) 1000000)
(simple-benchmark [coll (array-map a b)] (assoc coll c d) 1000000)
(simple-benchmark [coll (array-map a b c d)] (-lookup coll c) 1000000)
(simple-benchmark [coll (array-map a b c d e f)] (-lookup coll e) 1000000))
(println)
(println ";;; array-map w/ inline symbols")
(simple-benchmark [coll (array-map)] (assoc coll 'foo 'bar) 1000000)
(simple-benchmark [coll (array-map 'foo 'bar)] (-lookup coll 'foo) 1000000)
(simple-benchmark [coll (array-map 'foo 'bar)] (assoc coll 'baz 'woz) 1000000)
(simple-benchmark [coll (array-map 'foo 'bar 'baz 'woz)] (-lookup coll 'baz) 1000000)
(simple-benchmark [coll (array-map 'foo 'bar 'baz 'woz 'lol 'rofl)] (-lookup coll 'lol) 1000000)
(println)
(def data-atom (atom {:x 0}))
(println ";;; map / record ops")
(simple-benchmark [coll {:foo 1 :bar 2}] (get coll :foo) 1000000)
(simple-benchmark [coll {'foo 1 'bar 2}] (get coll 'foo) 1000000)
(simple-benchmark [coll {:foo 1 :bar 2}] (-lookup coll :foo nil) 1000000)
(simple-benchmark [coll {'foo 1 'bar 2}] (-lookup coll 'foo nil) 1000000)
(simple-benchmark [coll {:foo 1 :bar 2}] (:foo coll) 1000000)
(simple-benchmark [coll {'foo 1 'bar 2}] ('foo coll) 1000000)
(let [kw :foo
sym 'foo]
(simple-benchmark [coll {:foo 1 :bar 2}] (kw coll) 1000000)
(simple-benchmark [coll {'foo 1 'bar 2}] (sym coll) 1000000))
(simple-benchmark [coll {:foo 1 :bar 2}]
(loop [i 0 m coll]
(if (< i 100000)
(recur (inc i) (assoc m :foo 2))
m))
1)
(defrecord Foo [bar baz])
(simple-benchmark [coll (Foo. 1 2)] (:bar coll) 1000000)
(simple-benchmark [coll (Foo. 1 2)] (-lookup coll :bar) 1000000)
(simple-benchmark [coll (Foo. 1 2)] (assoc coll :bar 2) 1000000)
(simple-benchmark [coll (Foo. 1 2)] (assoc coll :baz 3) 1000000)
(simple-benchmark [coll (Foo. 1 2)]
(loop [i 0 m coll]
(if (< i 1000000)
(recur (inc i) (assoc m :bar 2))
m))
1)
(println)
(println ";;; zipmap")
(simple-benchmark [m {:a 1 :b 2 :c 3}] (zipmap (keys m) (map inc (vals m))) 100000)
(println)
(println ";;; persistent hash maps")
(def pmap (into cljs.core.PersistentHashMap.EMPTY
[[:a 0] [:b 1] [:c 2] [:d 3] [:e 4] [:f 5] [:g 6] [:h 7]
[:i 8] [:j 9] [:k 10] [:l 11] [:m 12] [:n 13] [:o 14] [:p 15]
[:q 16] [:r 17] [:s 18] [:t 19] [:u 20] [:v 21] [:w 22] [:x 23]
[:y 24] [:z 25] [:a0 26] [:b0 27] [:c0 28] [:d0 29] [:e0 30] [:f0 31]]))
(simple-benchmark [key :f0] (hash key) 1000000)
(simple-benchmark [key "f0"] (m3-hash-unencoded-chars key) 1000000)
(simple-benchmark [key :unsynchronized-mutable] (hash key) 1000000)
(def hash-coll-test
(loop [i 0 r []]
(if (< i 1000)
(recur (inc i) (conj r (str "foo" i)))
r)))
(simple-benchmark [coll hash-coll-test] (hash-coll coll) 100)
(simple-benchmark [coll hash-coll-test] (hash-ordered-coll coll) 100)
(def hash-imap-test
(loop [i 0 r {}]
(if (< i 1000)
(recur (inc i) (conj r [(keyword (str "foo" i)) i]))
r)))
(def hash-imap-int-test
(loop [i 0 r {}]
(if (< i 1000)
(recur (inc i) (conj r [i i]))
r)))
(simple-benchmark [coll hash-imap-test] (hash-imap coll) 100)
(simple-benchmark [coll hash-imap-test] (hash-unordered-coll coll) 100)
(simple-benchmark [coll pmap] (:f0 coll) 1000000)
(simple-benchmark [coll pmap] (get coll :f0) 1000000)
(simple-benchmark [coll pmap] (-lookup coll :f0 nil) 1000000)
(simple-benchmark [coll pmap] (-lookup ^not-native hash-imap-test :foo500 nil) 1000000)
(simple-benchmark [coll pmap] (-lookup ^not-native hash-imap-int-test 500 nil) 1000000)
(simple-benchmark [coll pmap] (assoc coll :g0 32) 1000000)
(simple-benchmark [coll pmap]
(loop [i 0 m coll]
(if (< i 1000000)
(recur (inc i) (assoc m :a 1))
m))
1)
(simple-benchmark [coll cljs.core.PersistentHashMap.EMPTY] (assoc coll :f0 1) 1000000)
(println)
(print "transient map, conj! 100000 items")
(time
(let [m (transient cljs.core.PersistentHashMap.EMPTY)]
(loop [i 0 m m]
(if (> i 100000)
(persistent! m)
(recur (inc i) (assoc! m i i))))))
(println ";;; set ops")
(simple-benchmark [] #{} 1000000)
(simple-benchmark [] #{1 2 3} 1000000)
(simple-benchmark [v [1 2 3]] (set v) 1000000)
(simple-benchmark [] (hash-set 1 2 3) 1000000)
(simple-benchmark [coll #{1 2 3}] (conj coll 4) 1000000)
(simple-benchmark [coll #{1 2 3}] (get coll 2) 1000000)
(simple-benchmark [coll #{1 2 3}] (contains? coll 2) 1000000)
(simple-benchmark [coll #{1 2 3}] (coll 2) 1000000)
(println)
(println ";;; seq ops")
(simple-benchmark [coll (range 500000)] (reduce + coll) 1)
(println)
(println ";;; reader")
(def strings
(take 10 (iterate (fn [s] (str s "string")) "string")))
(def big-str-data
(pr-str {:nils (repeat 10 nil)
:bools (concat (repeat 5 false) (repeat 5 true))
:ints (range 10000 10100)
:floats (map #(float (/ % 7)) (range 0 100))
:keywords (map keyword strings)
:symbols (map symbol strings)
:strings strings}))
(simple-benchmark [s "{:foo [1 2 3]}"] (reader/read-string s) 1000)
(simple-benchmark [s big-str-data] (reader/read-string s) 1000)
(println)
(println ";;; range")
(simple-benchmark [r (range 1000000)] (last r) 1)
(println)
(defn ints-seq
([n] (ints-seq 0 n))
([i n]
(when (< i n)
(lazy-seq
(cons i (ints-seq (inc i) n))))))
(def r (ints-seq 1000000))
(println ";;; lazy-seq")
(println ";;; first run")
(simple-benchmark [r r] (last r) 1)
(println ";;; second run")
(simple-benchmark [r r] (last r) 1)
(println)
(println ";; iterators")
(def ipmap (apply hash-map (range 2000)))
(println ";; Sequence iterator")
(simple-benchmark [s (seq ipmap)]
(let [iter (seq-iter s)]
(loop [v nil]
(if (.hasNext iter)
(recur (.next iter))
v)))
1000)
(println ";; Direct iterator")
(simple-benchmark []
(let [iter (-iterator ipmap)]
(loop [v nil]
(if (.hasNext iter)
(recur (.next iter))
v)))
1000)
(println ";;; comprehensions")
(simple-benchmark [xs (range 512)] (last (for [x xs y xs] (+ x y))) 1)
(simple-benchmark [xs (vec (range 512))] (last (for [x xs y xs] (+ x y))) 4)
(simple-benchmark [a (Box. 0) xs (range 512)] (doseq [x xs y xs] (set! a -val (+ (.-val a) x))) 4)
(simple-benchmark [a (Box. 0) xs (vec (range 512))] (doseq [x xs y xs] (set! a -val (+ (.-val a) x))) 4)
(println)
(println ";; reducers")
(simple-benchmark [xs (into [] (range 1000000))] (r/reduce + (r/map inc (r/map inc (r/map inc xs)))) 1)
(println ";; transducers")
(simple-benchmark [xs (into [] (range 1000000))] (transduce (comp (map inc) (map inc) (map inc)) + 0 xs) 1)
(println ";; primitive array reduce 1000000 many ops")
(simple-benchmark [xs (into-array (range 1000000))]
(-> xs (.map inc) (.map inc) (.map inc) (.reduce (fn [a b] (+ a b)) 0)) 1)
(println ";; reduce range 1000000 many ops")
(simple-benchmark [xs (range 1000000)] (reduce + 0 (map inc (map inc (map inc xs)))) 1)
(println ";; transduce range 1000000 many ops ")
(simple-benchmark [xs (range 1000000)] (transduce (comp (map inc) (map inc) (map inc)) + 0 xs) 1)
(println "\n")
(println ";; multimethods")
(defmulti simple-multi identity)
(defmethod simple-multi :foo [x] x)
(simple-benchmark [] (simple-multi :foo) 1000000)
(println "\n")
(println ";; higher-order variadic function calls")
;; Deliberately frustrates static-fn optimization and macros
(simple-benchmark [f array] (f 1 2 3 4 5 6 7 8 9 0) 100000)
(simple-benchmark [f vector] (f 1 2 3 4 5 6 7 8 9 0) 100000)
(simple-benchmark [] (= 1 1 1 1 1 1 1 1 1 0) 100000)
(println "\n")
(println ";; Destructuring a sequence")
(simple-benchmark [v (into [] (range 1000000))]
(loop [[x & xs] v]
(if-not (nil? xs)
(recur xs)
x))
10)
(println "\n")
(println ";;; str")
(simple-benchmark [] (str 1) 1000000)
(simple-benchmark [] (str nil) 1000000)
(simple-benchmark [] (str "1") 1000000)
(simple-benchmark [] (str "1" "2") 1000000)
(simple-benchmark [] (str "1" "2" "3") 1000000)
(println "\n")
(println ";;; clojure.string")
(simple-benchmark [s "a" f clojure.string/capitalize] (f s) 1000000)
(simple-benchmark [s "aBcDeF" f clojure.string/capitalize] (f s) 1000000)
(println ";; printing of numbers and handling of ##Nan, ##Inf, ##-Inf")
(simple-benchmark [x true] (pr-str x) 1000000)
(simple-benchmark [x 10] (pr-str x) 1000000)
(simple-benchmark [x js/NaN] (pr-str x) 1000000)
(simple-benchmark [x js/Infinity] (pr-str x) 1000000)
(simple-benchmark [x js/-Infinity] (pr-str x) 1000000)
(simple-benchmark [x (js-obj)] (pr-str x) 1000000)
(println "\n")
(println ";; cycle")
(simple-benchmark [] (doall (take 1000 (cycle [1 2 3]))) 1000)
(simple-benchmark [] (into [] (take 1000) (cycle [1 2 3])) 1000)
(simple-benchmark [] (reduce + (take 64 (cycle [1 2 3]))) 10000)
(simple-benchmark [] (transduce (take 64) + (cycle [1 2 3])) 10000)
(println "\n")
(println ";; repeat")
(simple-benchmark [] (doall (take 1000 (repeat 1))) 1000)
(simple-benchmark [] (into [] (take 1000) (repeat 1)) 1000)
(simple-benchmark [] (doall (repeat 1000 1)) 1000)
(simple-benchmark [] (into [] (repeat 1000 1)) 1000)
(simple-benchmark [] (reduce + 0 (repeat 1000 1)) 1000)
(simple-benchmark [] (into [] (take 1000) (repeat 1)) 1000)
(simple-benchmark [] (reduce + (take 64 (repeat 1))) 10000)
(simple-benchmark [] (transduce (take 64) + (repeat 1)) 10000)
(simple-benchmark [] (reduce + (take 64 (repeat 48 1))) 10000)
(simple-benchmark [] (transduce (take 64) + (repeat 48 1)) 10000)
(println "\n")
(println ";; iterate")
(simple-benchmark [] (doall (take 1000 (iterate inc 0))) 1000)
(simple-benchmark [] (into [] (take 1000) (iterate inc 0)) 1000)
(simple-benchmark [] (reduce + (take 64 (iterate inc 0))) 10000)
(simple-benchmark [] (transduce (take 64) + (iterate inc 0)) 10000)
(println)
================================================
FILE: bin/cljsc
================================================
#!/bin/sh
# Compile a single cljs file or a directory of cljs files into a
# single JavaScript file.
if [ "$CLOJURESCRIPT_HOME" = "" ]; then
CLOJURESCRIPT_HOME="`dirname $0`/.."
fi
if ! test "$(ls -A "$CLOJURESCRIPT_HOME/lib" 2>/dev/null)"; then
>&2 echo lib/ folder is empty, have you run \`script/bootstrap\`?
exit 1
fi
CLJSC_CP=''
for next in lib/*: src/main/clojure: src/main/cljs: src/test/cljs: src/test/self; do
CLJSC_CP="${CLJSC_CP}${CLOJURESCRIPT_HOME}/${next}"
done
if test "$#" -eq 0
then
echo 'Usage: cljsc <file-or-dir>'
echo ' cljsc <file-or-dir> "{:optimizations :advanced}"'
else
java -server -Xms2g -Xmx4g -cp "$CLJSC_CP" clojure.main "$CLOJURESCRIPT_HOME/bin/cljsc.clj" "$@"
fi
================================================
FILE: bin/cljsc.bat
================================================
@echo off
setLocal EnableDelayedExpansion
if "%CLOJURESCRIPT_HOME%" == "" set CLOJURESCRIPT_HOME=%~dp0..\
set CLASSPATH=%CLOJURESCRIPT_HOME%src\main\clojure;%CLOJURESCRIPT_HOME%src\main\cljs;%CLOJURESCRIPT_HOME%src\test\cljs
for /R "%CLOJURESCRIPT_HOME%lib" %%a in (*.jar) do (
set CLASSPATH=!CLASSPATH!;%%a
)
set CLASSPATH=!CLASSPATH!
if (%1) == () (
echo Usage: "cljsc <file-or-dir> > out.js"
echo "cljsc <file-or-dir> {:optimiztions :advanced} > out.js"
) else (
java -server -cp "%CLASSPATH%" clojure.main "%CLOJURESCRIPT_HOME%\bin\cljsc.clj" %*
)
================================================
FILE: bin/cljsc.clj
================================================
; Copyright (c) Rich Hickey. All rights reserved.
; The use and distribution terms for this software are covered by the
; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
; which can be found in the file epl-v10.html at the root of this distribution.
; By using this software in any fashion, you are agreeing to be bound by
; the terms of this license.
; You must not remove this notice, or any other, from this software.
(require '[cljs.closure :as closure])
(defn transform-cl-args
[args]
(let [source (first args)
opts-string (apply str (interpose " " (rest args)))
options (when (> (count opts-string) 1)
(try (read-string opts-string)
(catch Exception e
(binding [*out* *err*]
(println "Failed to parse command line args:" e)))))]
{:source source :options (merge {:output-to :print} options)}))
(let [args (transform-cl-args *command-line-args*)]
(closure/build (:source args) (:options args))
(.flush *out*)
(shutdown-agents)
(System/exit 0))
================================================
FILE: build.edn
================================================
{:optimizations :advanced
:output-to "builds/out-adv/core-advanced-test.js"
:main test-runner
:output-wrapper true
:verbose true
:compiler-stats true
:parallel-build true
:output-dir "builds/out-adv"
:npm-deps {:lodash "4.17.4"}
:closure-warnings {:non-standard-jsdoc :off :global-this :off}
:install-deps true
:language-in :es6
:language-out :es5
:foreign-libs [{:file "src/test/cljs/calculator_global.js"
:provides ["calculator"]
:global-exports {calculator Calculator}}
{:file "src/test/cljs/es6_dep.js"
:module-type :es6
:provides ["es6_calc"]}
{:file "src/test/cljs/calculator.js"
:module-type :commonjs
:provides ["calculator"]}
{:file "src/test/cljs/es6_default_hello.js"
:provides ["es6_default_hello"]
:module-type :es6}]}
================================================
FILE: changes.md
================================================
## 1.12.134
### Changes
* Be less specific about the behavior of integer coercion fns
* Provide `cljs.proxy/proxy` default
* `cljs.proxy/builder`, `cache-fn` parameterization
### Fixes
* `cljs.proxy` doesn't handle `for .. of` correctly
* Docstrings for `:lite-mode` support fns
* CLJS-3466: support qualified method in return position
* CLJS-3464: `parents` does not walk JavaScript prototype chain
* CLJS-3456: bootstrap wasn't updated for cljs.compiler/emit-global-export change
* CLJS-3463: rename all the lite mode data structures / fns to avoid clashing
## 1.12.116
### Changes
* CLJS-3233: `:refer-global` + `:only`, `:require-global`
* CLJS-3451: make munge-str public
* various small DCE enhancements
* browser REPL reuses same window
### Enhancements
* Clojure method values syntax support
* `cljs.proxy`, experimental namespace for efficient interop
* CLJS-2471: ChunkedSeq should implemented ICounted
* CLJS-3452: optimize str by compiling to + / .toString + compile time optimizations
* `:lite-mode` and `:elide-to-string`, new experimental compiler flags for smaller artifacts
* CLJS-3439: REPL doc support for externs
### Fixes
* Fix REPL load-file issue
* CLJS-3425: Incorrect handling of ##NaN with min/max
* CLJS-3461: don't hard-code destructuring to PAM
* CLJS-3454: New set instances are created when redundant data is added
* CLJS-3438: Inference for `goog.object/containsKey` returns any, not boolean
## 1.12.42
### Changes
* Update Google Closure Compiler dependency to v20250402
* Depend on Clojure fork of Google Closure Library, 0.0-20250515-f04e4c0e
- restores goog.dom.query
- restores goog.isString and other simple fns to goog.base that were unnecessarily removed
- restore debug loader as default
- remove unused Closure directive `unusedPrivateMembers`
* CLJS-3290: implement IHash for js Symbol (#225)
* Updated vendorized tools.reader to 1.4.2
* CLJS-3419: JS Map & Set should return true for seqable?
* CLJS-3421: Throw when calling ana-api/ns-publics on non-existing ns
### Fixes
* CLJS-3242: trailing keys bug
* CLJS-2292: refer-clojure rename should also exclude
* CLJS-3418: Some Closure libraries are not lowered
* CLJS-3413: Macros not loaded w/ single segment namespace loaded via `:preloads`
* CLJS-3411: cljs.core/test behavior does not match docstring (#226)
* CLJS-3320: Compiler warning on trying to use `js` as an ns
* remove unnecessary key-check for HashCollisionNode
* CLJS-3429: Handle More Complex Closure Type Annotations
## 1.11.132
### Fixes
* CLJS-3410: JavaScript double values should not hash to the same result
* CLJS-3381: Invokable JS namespaces used as constructors not hinted properly
* CLJS-3395: `(set! a -x false)` doesn't work
* CLJS-3399: :as-alias does not work with symbols
* CLJS-3401: dedupe '+ and '_PLUS symbols with :optimize-constants
* CLJS-3400: macroexpand does not expand and and or without args correctly
* CLJS-3398: Docstring of with-redefs should mention usage of ^:dynamic in production
* CLJS-3386: defn varargs argument should be nil when no varargs are passed
* CLJS-3384: get-in should not unreduce values.
### Changes
* CLJS-3378: Change default :language-in to :ecmascript-next
* CLJS-3385: Extend empty? to counted? colls that arent seqable, such as transients
* CLJS-3327 Add :node-modules-dirs configuration
* CLJS-3391: add cljs.test/run-test
* CLJS-3369: Speed up random-uuid by generating 4 digits at a time
* CLJS-3014: Promote Error->map to be a core fn
* CLJS-3394: Add ECMASCRIPT options for 2018-2021
* CLJS-2268: Make clojure.string/escape consistent with Clojure
* Bump closure lib to 2023 release
* CLJS-3407: bump tools.reader to 1.3.7
* remove EXPERIMENTAL from ES6 iterator support
* CLJS-3406 implement reset-vals! and swap-vals! through protocol
* CLJS-3363: reduce-kv on seq of map entries
* CLJS-3393: Efficient drop, partition for persistent/algo colls
* CLJS-3408: Handle @extends in externs
* CLJS-3392: datafy support for js/Error and ExceptionInfo
* CLJS-3379: Add support for node_modules with .cjs extension
* CLJS-3387: Browser repl unable to serve wasm files
## 1.11.60
### Fixes
* broaden scope of UUID equiv to implementers of protocol rather than concrete type
* CLJS-3382: Fix regression in .apply after CLJS-3024
## 1.11.57
### Fixes
* CLJS-3377: Objects created from required JS constructor are not correctly hinted
* get-bridged-alias-map is not needed in self-hosted
## 1.11.54
### Changes
* use `require` instead of `load` for `cljs.vendor.bridge`, addresses issue
reported by Bruce Hauman wrt. Figwheel
## 1.11.51
### Changes
* CLJS-3372: Vendorize data.json, transit-clj, and tools.reader
data.json and transit-clj are no longer dependencies. CLJS-3375 bridges
tools.reader for backwards compatibility
* Clojure 1.10 minimum version
* Update Google Closure Compiler, transit-java, tools.reader dependencies to latest
* CLJS-2820 Compile cljs.loader regardless of whether :modules are used
* CLJS-3370: improved uuid regex to only accept hex characters
* Update / clarify docstrings, CLJS-3358, CLJS-3359, CLJS-3360, CLJS-3361, CLJS-3364
* CLJS-3354: map-invert should use transients and reduce-kv instead of reduce
* CLJS-3350: Update test.check dependency
* CLJS-3294: data_readers.cljc doesn't provide a way to have target-specific
behaviour
### Fixes
* CLJS-3373: Externs Inference issue with vars invoked from foreign libs
* CLJS-3368: let binding can shadow globals, leading to strange behavior
* CLJS-3367: Backward conflict test in prefer-method causes incorrect exception
* CLJS-3371: Invalid warning on record constructor
* Fix apply of IFn for more than 20 arguments
* CLJS-3288: selfhost: *eval-fn* not bound for :js sources
* CLJS-3362: some-fn has different short-circuiting when using 3 predicates
* CLJS-3356: halt-when not usable within #'c.c/into
* CLJS-3352: Self-host negative zero emitted as positive zero
* CLJS-3319: make PersistentHashMap release inodes correctly
### Enhancements
* CLJS-3348: Implement new functions for parity with Clojure 1.11
* CLJS-3353: Add the new iteration function introduced in Clojure 1.11
* CLJS-3347: Create clojure.math namespace
* CLJS-3299: port CLJ-2603
* CLJS-3346: :as-alias
* add update-vals & update-keys
## 1.11.4
### Fixes
* CLJS-3345: package.json exports can be a dupe of main
## 1.10.914
### Fixes
* CLJS-3339: cljs.core/hash should type hint call to js/isFinite
* CLJS-3333: defonce expansion non-hygienic with respect to core names
* CLJS-3334: exists? evaluates to true for cljs.user//
* CLJS-3341: Revert dependency issue in dep order patch
### Changes
* CLJS-3332: Cannot require `@firebase/auth`
* CLJS-3335: CI, test-and-or-code-gen-pass fails on Windows
* CLJS-3440: CI, Compiler tests fail test-cljs-3235 regarding react-select
* CLJS-3342: Run CI compiler unit tests on Windows
* CLJS-3338: Missing CI test coverage
* CLJS-3343: Failing js module processing test on Windows
## 1.10.896
### Fixes
* CLJS-3336: REGRESSION: Cannot require `goog`
* CLJS-3337: REPL, Regression for :reload
* Fix Windows path issue in cljs.externs
## 1.10.891
### Changes
* Update Google Closure Compiler `v20210808`
* Update Google Closure Library `0.0-20211011-0726fdeb`
* CLJS-3330: Flag for legacy loading of goog.object & goog.array
### Fixes
* CLJS-3324: hash-map behavior differs from Clojure
* CLJS-3056: runtime namespace load order is independent from ordering in ns macro :require form
* CLJS-3074: Resolve :warning-handlers compiler option when symbols
* CLJS-3317: PersistentVector invoke does not align with Clojure
## 1.10.879
### Changes
* Revert CLJS-3276 - macros that expand to require
### Fixes
* CLJS-3096 Add :exception true to prepl errors
* CLJS-3313: Protocol implementations via metadata: ClojureScript behaves differently from Clojure
## 1.10.866
### Changes
* Google Closure v20210505
### Enhancements
* CLJS-3260: and/or optimization as compiler pass, fixes core.async go macro issue
* CLJS-3276: Support macros that expand to require statements
### Fixes
* CLJS-3309: and/or opt bug - passes to remove dropped locals from anon fns,
missing :children keys on binding nodes
* CLJS-3300: cljs.loader regression
* CLJS-3293: Some npm packages fail to require
* CLJS-3306: subvecs must implement IAssociative -contains-key?
* CLJS-3307: Allow extending IAssociative -contains-key? to native
* CLJS-3305: defrecord must implement IAssociative -contains-key?
* CLJS-3303: checked arrays enabled in advanced
* CLJS-3304: Higher order checked arrays
* CLJS-3284: Use of private deftype by public function in another namespace when
inside an if causes warning
* CLJS-3282: document bundle target in CLI help
* CLJS-3283: Support -contains-key? protocol check in contains?
* CLJS-3296: Update conj docstring for missing arities
* CLJS-3298: visibility diagnostic group typo
* CLJS-3302: Fixup docstring for `default-dispatch-val` and `dispatch-fn`
## 1.10.844
### Changes
* Google Closure Compiler v20210302, Google Closure Library
* Update to tools.reader 1.3.3
### Enhancements
* CLJS-3235: Support accessing a property of a library as a namespace itself
### Fixes
* CLJS-3287: selfhost: eval does not catch and return errors
* CLJS-3263: Always print #inst year with 4 digits
* CLJS-3291: Incorrect #inst parsing with respect to Julian / Gregorian calendar transition
* CLJS-3281: CLI help for target missing comma
* CLJ-3279: Error when :npm-deps is boolean and :install-deps true
* CLJS-3275: compute upstream npm-deps when :npm-deps is not set
* CLJS-3273: preserve ns-name when processing an :ns* op
* CLJS-3200: reduce code generated by destructure macro for maps
* CLJS-3271: nth on range produces nonexistent values considering floating point
* CLJS-3261: Docstring for cljs.js/eval-str specifies incorrect default for :context
* CLJS-2959: sort and sort-by should retain meta
* CLJS-3255: cljs.build.api/build doesn't work with single arity / 2-arity with nil
* CLJS-3019: Error->map should produce qualified symbols for :type
* CLJS-3130: UUID compares equal to other values
* CLJS-3257: `satisfies?` produces an inference warning when given an unhinted argument
* add `:nodejs-rt` to the list of build affecting options
* CLJS-2880: cl-format octal and Unicode character directives fail
## 1.10.764
### Fixes
* Export Google Closure Library config directly to window in brwoser
* CLI: If :main supplied to -c pass it along to -r
* Revert CLJS-2582
## 1.10.758
### Changes
* More useful functions added to cljs.analyzer.api
### Fixes
* CLJS-3242: Code Splitting Breakage
* CLJS-3244: Warnings for clojure.browser.net with :static-fns true
* Fix foreign-lib loading, was checking for `:nodejs` instead of `:nodejs-rt`
* CLJS-3239: Infinite analysis with dotted symbols
* CLJS-3238: Watch incompatible with :bundle, throws :nodejs-related exception
* CLJS-3237: compiling with --target node errors at runtime with document undefined
* CLJS-3236: defprotocol externs inference warnings
* Fix (require ... :reload) REPL pattern
## 1.10.741
### Changes
* Removed REPL/target support for Rhino, Nashorn, Graaljs
* Update Closure Compiler and Google Closure Compiler dependencies
* CLJS-1628: Make instances of js/Symbol printable
### Enhancements
* Add :target :bundle for integration with JavaScript bundlers (webpack, metro, etc.)
* Add cljs.main --install-deps flag
* Add :bundle-cmd compiler option for triggering JS bundler at end of build
* Add :nodejs-rt compiler option to diable Node.js runtime support (for bundles)
* Add :target-fn compiler option to allow users to support other targets outside of ClojureScript
* Add :npm-cmd to allow users to choose `npm` or `yarn` for their dep tool
* Make fast REPL prompt availble to 3rd party REPLs
* Transpile GCL libraries that need it
* Enhance cljs.main to be properly extensible
* repl-env providing namespaces can now be arbitrary not limited to cljs.repl.*
* CLJS-3185: Facilitate protocol static dispatch inlining
* CLJS-3199: Interop with JavaScript's iterable objects via Iterator protocol
### Fixes
* CLJS-3230: seq on empty Iterable produces an empty seq
* CLJS-2908: Don't show quick prompt if :verbose or :repl-verbose
* CLJS-2898: cljs.main: ClojureScript version should not be displayed if there are inits
* CLJS-2863: Need to reject incorrect fn with fixed arity of more params than variadic
* CLJS-3086: Switch clj-nil to not be considered a numeric type
* CLJS-3211: Widen cljs.core/defprotocol sig arguments from list to seq (to include Cons)
* CLJS-712 & CLJS-2957: resolve-var for dot still wrong, externs inference regression
* CLJS-2862: Externs inference warning when extending Object
* CLJS-3161: Include :property for :warning-type :target
* CLJS-3181: Externs inference fails, even when manual type hint is provided
* CLJS-3224: Fix cljs.loader due to usage of removed setModuleUris API
* CLJS-3223: get-js-index 0-arity should call get-js-index 1-arity
* CLJS-3220: Self-host test-import failing on asserts.assert
* CLJS-3218: NPE during Closure transpilation in self-host tests
* CLJS-3217: script/test-self-parity compilation failure stale reference to goog.text.LoremIpsum
* CLJS-3215: Travis has remnant CLI test involving GraalJS
* CLJS-3219: Problem with asserts namespace inside goog.math.Long
* CLJS-3119: get with negative ndx on string inconsistent with Clojure
* CLJS-3214: script/uberjar fails with GraalJS
* CLJS-3210: Single arity arithmetic ops don't warn on bad arguments
* CLJS-3213: Browser REPL server hang when receive unknown POST
* CLJS-3209: With clojurescript 1.10.597 HelloWorld compiled with to 94K of JS with advanced optimizations turned on
* CLJS-3191: Optimize cljs.core/re-find
* CLJS-3192: Optimize cljs.core/re-matches
* CLJS-3193: Optimize cljs.core/re-pattern
* CLJS-3202: Make :/ keyword hash consistent with =
* CLJS-3203: Overriding root path in s/cat using s/gen gives an error
## 1.10.597
### Changes
* CLJS-3120: Add :sigs to protocol var for compatibility with Clojure
* CLJS-2247: Warn when overwriting protocol method
* CLJS-3085: Types are inferred for dynamic vars
* CLJS-3097: Fix compatibility with tools.reader 1.3.1 and bump it
* CLJS-2750: tag coll in ci-reduce as not-native
* CLJS-3095: `apply vector` with array acts as `vec`
* CLJS-3093: Check subvec arguments
* CLJS-2868: Add ^string hints
* CLJS-3054: Align behavior of set/union and into with Clojure
### Enhancements
* CLJS-3077: Avoid generating unnecessary functions
* CLJS-3107: Eliminate checked ifs in TransientArrayMap
* CLJS-3164: Optimize assoc on IAssociative values
* CLJS-3147: Allow Node require from foreign lib
* CLJS-3144: NPM Modules should have all their vars marked to avoid .call invokes
* CLJS-3145: Node.js support libs cljs.nodejs and cljs.nodejscli generate random files
* CLJS-3141: Improve perf of cljs.source-map.base64/encode
* CLJS-3134: Thread predicate-induced inference through and
* CLJS-3123: analyze google closure namespaces
* CLJS-3133: simple-* / qualified-* predicate-induced inference
* CLJS-2886: count specializations for string and array
* CLJS-2950: Direct field access for keyword lookup on records
### Fixes
* CLJS-3190: Double arity warning constructing directly-accessed record
* CLJS-3137: fspec cannot be reused in clojurescript but can be in clojure
* CLJS-3124: Non-number lookup on transient vector succeeds after persistent!
* CLJS-3149: REPL load-file doesn't resolve npm requires correctly
* CLJS-3163: Skip analyzing specials in type-check-induced-tag
* CLJS-3172: Unable to import goog.async.ConditionalDelay
* CLJS-3158: Improperly widened cross-param loop/recur inference
* CLJS-3168: Self-host: externs ns used unconditionally in analyzer
* CLJS-3140: Not inferring on implements?
* CLJS-3143: assoc docstring regarding growing vector
* CLJS-3123: 'for' loop silently ignores extra forms in body
* CLJS-3017: Error->map: Map js/InternalError and js/TypeError
* CLJS-2683: Suppress compiler options in watch log
* CLJS-2881: cl-format character directive with \space fails
* CLJS-2879: Close analysis cache file
* CLJS-3051: Update to Graal RC12 in CI
* CLJS-3088: Update CI to use JavaScriptCore 4
* CLJS-3092: Peek on subvecs doesn't behave properly
* CLJS-3076: let defined variadic functions not destructuring as expected with :static-fns true
* CLJS-3067: Fix compiler crash when requiring cljs.loader w/o modules
* CLJS-3068: Compiler error with if and emit-var
* CLJS-2301: Avoid use of deprecated goog.string/isEmptySafe in clojure.string/blank?
* CLJS-3058: Remove dangling goog.date.relativeWithPlurals reference
* CLJS-3061 Fix docstring for chunked-seq?
## 1.10.520
### Changes
* Browser REPL serves more mime types
### Fixes
* CLJS-3048: Revert CLJS-3038
* CLJS-3049: Undefined fdef is still present in result of (stest/checkable-syms)
## 1.10.516
### Changes
* CLJS-3036: Provide a clojure.edn namespace for Clojure compatibility
* CLJS-2967: Make clojure.spec.alpha reloadable
* CLJS-2968: Support immutable GCC DependencyOptions
* CLJS-2693: Have Range implement IChunkedSeq
* CLJS-2971: Make cljs.spec.alpha/fn-sym private
* CLJS-2912: Reuse seq in some
### Enhancements
* CLJS-2865: Optimize string expression concatenation
* CLJS-2866: Predicate-induced type inference
* CLJS-2901: Return type inference for multi-arity & variadic fns
### Fixes
* CLJS-3043: error__GT_str not defined for cli scripts
* CLJS-3037: Self-host: Add datafy tests to self-parity tests
* CLJS-3031: loop / recur inference, warnings not suppressed on initial pass
* CLJS-3030: Regression with core.async surrounding select-keys / find on String
* CLJS-3038: Improve error message when clojure.test.check is not required
* CLJS-3034: Truthy-induced inference
* CLJS-3023: Instrumenting next gives maximum call stack size exceeded
* CLJS-3033: Maintain backward compatibility test.check keyword
* CLJS-2964: Requiring spec.test.alpha loads clojure.test.check
* CLJS-2103: clarify arg type and order constraints of keys and vals
* CLJS-3011: Port improved runtime exception printing to non-Node REPLs
* CLJS-2981: Mishandling of :npm-deps Boolean value computing upstream deps
* CLJS-3027: sorted-map can no longer be returned by a macro unless it has keyword keys
* CLJS-3028: atom docstring typo
* CLJS-2994 Ensure all prepl :vals are pr-str-ed
* CLJS-3020: cljs.main: Incorrect documentation for the --compile flag
* CLJS-2652: Line breaks in long options for compile
* CLJS-3025: Typo when updating cljs.analyzer.macros/wrapping-errors
* CLJS-2955: Self-host: spec check macro compile-time expansion
* CLJS-2999: Update datafy to use inherent support for protocols via metadata
* CLJS-2945: Print spec failure details
* CLJS-3010: Datafy does not properly check for whether the datafied value supports metadata
* CLJS-3008: Typo in error phase key placed in exception and misplaced cause
* CLJS-2956: Stack overflow when specing core =
* CLJS-2913: improvements to exception messages and printing
* CLJS-3005: empty on Cons shouldn't keep metadata
* CLJS-2958 - make symbol work on keywords and vars
* CLJS-3000: Don't pass meta to next/rest/empty of seqs
* Add support for protocols via metadata
* CLJS-3000: Don't pass meta to next/rest/empty of seqs
* CLJS-1888 - Seqs of PHMs and PAMs do not handle metadata correctly
* CLJS-2794 :Return identity when with-meta is called with identical meta
* CLJS-2980: Calling "check-fn" gives "is not public" warning
* CLJS-2977: Spec instrumentation regression with varargs / :static-fns
* CLJS-2929: Port datafy
* CLJS-2995: Instrumented self-calling multi-arity fn throws maximum call stack exceeded with optimizations advanced
* Fix source maps missing local binding names
* CLJS-2991: Need to wrap js-obj output with parens
* CLJS-2976: s/fdef docstring should refer to cljs.spec.test.alpha/check
* CLJS-2538: nth on fractional indices near array and string bounds
* CLJS-2909: clojure.walk/postwalk does not preserve MapEntry type objects
* CLJS-2537: Negative fractional index in contains? on array
* CLJS-2933: Consistent #object printing whitespace
* CLJS-2873: Improved inference for loop / recur
* CLJS-2989: Fast-path issues for predicate-induced inference based on satisfies?
* CLJS-2867: Inferred return type of namespace is string
* CLJS-2975: unstrument returns symbol of non-instrumented var
* CLJS-2974: empty for non-emptyable should return nil
* CLJS-2825: Eliminate unnecessary ^boolean annotations
* CLJS-2979: re-seq is relying on undefined behavior of subs
* remove redundant exists? check in dynaload
* fix incorrect cljs.core.MapEntry usage
## 1.10.439
### Changes
* CLJS-2904: Default :npm-deps to false
* CLJS-2878: Update Closure Compiler to v20180805
* CLJS-2827: Avoid var special in core macros for private var access
* CLJS-2819: Warn on non-dynamic earmuffed vars
* CLJS-2806: Bump test.check to 0.10.0-alpha3
* CLJS-2815: Support string keys in :global-exports
* CLJS-2812: Support for overriding object printing
* CLJS-2805: Bump tools.reader to 1.3.0
* CLJS-1702: Warning when using private vars
* Align ClojureScript AST to tools.analyzer
### Enhancements
* CLJS-2903: Support fingerprinting
* CLJS-2897: cljs.main: Display initial REPL prompt sooner
* CLJS-2884: Support for GraalJS RC6
* CLJS-2859: Graal.JS: Enable high-res timers by default, allow user-configuration
* CLJS-2831: Add a graaljs REPL environment
* CLJS-1997: Outward function type hint propagation
* CLJS-844: Optimize js->clj by switching to transients
* CLJS-2442: `set` and `vec` performance enhancements
### Fixes
* CLJS-2953: stest/with-instrument-disabled prints warning of private use
* CLJS-2728: Ability to disable macro spec checks
* CLJS-2843: s/explain of evaluated predicate yields :s/unknown
* CLJS-2951: Add a spec generator for some?
* CLJS-2940: Can't define nilable spec on undefined pred
* CLJS-2948: Stack overflow calling instrumented variadic fn with zero args
* CLJS-2793: Instrumenting breaks function with varargs
* CLJS-2934: Enhanced delay printing
* CLJS-2864: Optimize str macro for single arity case
* CLJS-1297: defrecord does not emit IKVReduce protocol
* CLJS-2937: docstring for to-array
* CLJS-2943: Update merge-with to use key / val
* CLJS-2941: seqable? should return true for nil
* CLJS-2915: Tests fail if directory has a period (.) in the path
* CLJS-2782: lein test fails if directory has hyphens
* CLJS-2911: Avoid infinite loop on infinite partitions
* CLJS-2906: cljs.main: Crash when with default REPL
* CLJS-2883: Instrumentation fails compilation with a large number of spec'd functions
* CLJS-2896: Allow parallel analysis and compilation
* CLJS-2893: seq: use .-length instead of alength for strings
* CLJS-2890: fspec role in problem path is not useful
* CLJS-2887: Improve names in core macro specs
* CLJS-2891: stop including data in ex-info message
* CLJS-2888: Printing of spec problems buries the failing predicate which should be more prominent
* CLJS-2861: Self-host: :checked-arrays not working
* CLJS-2852: Clojure imparity: ns-publics returns different arglists for macros
* CLJS-2725: Doc on spec keywords
* CLJS-2665: Port clojure.spec.test.alpha/enumerate-namespace
* CLJS-2848: Default explain printer prints root val and spec
* CLJS-2846: [spec] s/tuple explain-data :pred problem
* CLJS-2847: s/coll-of and s/every gen is very slow if :kind specified without :into
* CLJS-2841: [spec] instrument exception doesn't contain function name in ex-data
* CLJS-2842: [spec] Clarify s/every docstring for :kind
* CLJS-2845: [spec] generate random subsets of or'd required keys in map specs
* CLJS-2844: [spec] Add support for undefining a spec
* CLJS-2840: [spec] s/keys explain-data :pred problem
* CLJS-2839: [spec] s/& explain-data :pred problem
* CLJS-2838: [spec] s/& does not check preds if regex matches empty collection
* CLJS-2837: [spec] `cat` specs should verify value is sequential
* CLJS-2541: binding not made in parallel
* CLJS-2832: Bad code gen for `((not empty?) "foo")` when compiled with no optimizations
* CLJS-2855: Browser REPL prints empty string after require
* CLJS-2821: Update doto docstring to not use Java example
* CLJS-2817: Suppress private var warnings for specs on private vars
* CLJS-2822: cljs.core.specs.alpha: Map bindings should be `:kind map?`
* CLJS-2829: Fix deep object property access for :global-exports
* CLJS-2816: Skip non-string package.json browser entry values
* CLJS-2814: Fix munge-node-lib/global-export on self-host
* CLJS-2811: cljs-1537-circular-deps fail on Windows
* CLJS-2807: Macroexpand failure with set literal
* CLJS-2799: Handle nth on seqables with negative indexes
* CLJS-2798: ChunkCons -next doesn't handle nil more
* CLJS-2589: allow / as a protocol method name in cljs
## 1.10.339
### Changes
* Bump transit-clj to 0.8.309
## 1.10.329
### Changes
* add :val to :const node
* rename ast op :constant -> :const
### Fixes
* CLJS-2787: Record comparison is broken when instance is constructed from another record instance via map factory
* CLJS-2780: Async tests prematurely terminate in Node
* CLJS-2783: with-out-str conflicts with :infer-externs
* CLJS-2730: Fix docstrings in filter, filtev, remove, and take-while
* CLJS-2703: module name substitution test fails if hypen in directory path
* CLJS-2731: Failure comparing sorted sets
* CLJS-2746: Missing provides for JS modules
* CLJS-2772: Trying to run `cljs.main` repl with `:modules` results in `brepl_deps.js` being `clojure.lang.LazySeq`
* CLJS-2736: Elements returned from sets as functions are not the actual elements in the set
* CLJS-2298: REPLs should automatically load user.(cljs|cljc) files at root of Java classpath
## 1.10.312
### Enhancements
* CLJS-1871: A declare with :arglists should generate static function calls
* CLJS-2688 cljs.main: Accumulate all meaningful repeated inits modules using global-exports
* CLJS-2681: Accepting multiple paths to the --watch option for cljs.main
* CLJS-2706: Better error messages when missing namespaces contain dashes
### Changes
* CLJS-2777: Bump Closure-compiler
* validate :main
* CLJS-2771: Elide "use strict"1 from final output
### Fixes
* CLJS-2278 & CLJS-2279
* goog.global lookup must be a string
* CLJS-2775: cljs.main: Node modules not installed if -re node
* CLJS-2767: Externs inference warnings for defrecord and deftype
* CLJS-2754: Broken cli tests
* CLJS-2769: Eliminate goog.structs.AvlTree.Node in self-parity test
* CLJS-2766: Revisions to exists? fails in self-host
* CLJS-2764: exists? is not nil safe
* CLJS-2760 Make browser repl web-severs mime-type case-insensitive
* CLJS-2755: Can't generate uri instances
* CLJS-1677: Requiring [goog] breaks an :advanced build, but the compiler exits successfully
* Recompile cljs.loader in REPL
* CLJS-2733: Throw error message if too few or too many args to throw
* CLJS-2751: script/bootstrap --closure-library-head misses goog/text
* CLJS-2480: Periods at end of analyzer warnings
* CLJS-2618 Fix docstring for `remove-tap`
* CLJS-2743 Fix docstring misspelling
* CLJS-2724: Native Node modules Node (like "fs") cannot be required
* CLJS-2702: Accomodate new Closure Library dependency loading strategy
* CLJS-2741: Function invoke errors report arity off by 1
* CLJS-2745: Add GraalVM to the set of JavaScript engines we can test against
* CLJS-2739: Optimize node_modules indexing
* CLJS-2619: clojure.reflect needs exclude for macroexpand
* CLJS-2713: test-reader fails on Windows
* CLJS-2715: Have goog-define return the var at the REPL
* CLJS-2727: cljs.repl/err-out visible from cljs
* CLJS-2734: Add :arglists to defmulti
* CLJS-2721: test-cljs-2580 failing in windows CI
* CLJS-2726: test-cljs-2678-global-exports-infer failing on Windows
* CLJS-2678: Infer-externs doesn't work for JS modules using global-exports
* CLJS-2718: Setting *warn-on-infer* in REPL throws a SyntaxError
* CLJS-2385: cljs.analyzer/infer-type pass infers tag with incorrect priority
* CLJS-1918: case needs a type hint for keywords case when using *warn-on-infer*
* CLJS-1970: Cannot infer target type for list/vector expressions
* CLJS-2669: Use simple dummy package for test-cljs-2580
* CLJS-2716: Add ChakraCore to Windows CI (AppVeyor)
* CLJS-2147: apply test suit
* CLJS-2711: System newline breaking some tests on Windows
* CLJS-2712: Make Windows CI fail if a test fails
* CLJS-2708: Windows. ClojureScript fails to compile when node.js module is `require`d
## 1.10.238
### Enhancements
* cljs.main, simple command line access to Compiler & REPLs
* cljs.server.* namespaces for integration with -Dclojure.server.repl
* :aot-cache compiler to enable global AOT caching of dependencies in JARs
* :stable-names compiler flag, to support vendorization when using :modules,
defaults to true when using :modules.
* Add :webworker & :nashorn target
* pREPL implementation (usage requires Clojure 1.10.0-alpha)
* Add :package-json-resolution build option, allowing to choose which
package.json entries are being used; defaults to :webpack (if no :target
is set) or :nodejs (if the :target is :nodejs); also supports a custom
vector of entries (e.g. ["browser", "main"]).
### Changes
* CLJS-2592: :npm-deps using ES6 modules with .mjs extensions are not detected correctly
* AOTed ClojureScript artifact is now the default, for sources only use the
"slim" Maven classifier
* Bump Closure Compiler
* REPL now show uniform prompts
* CLJS-2660: Add cljs.core/eval which, delegates to an overridable *eval*
* CLJS-2375: Remove AMD Module Support
* CLJS-2413: Port core.specs.alpha to ClojureScript
* CLJS-2423: Allow custom :output-wrapper function
* Map entries are no longer two element vectors, now MapEntry instances
* *print-fn* automatically set
* CLJS-2561: AOT compile browser REPL client js
* CLJS-2581: Create a cljs.repl/*repl-env* dynamic var and bind it around cljs repl loops
### Fixes
* CLJS-2680: Passing :watch-fn via --compile-opts to cljs.main
* CLJS-2692: cljs.core.specs.alpha: Import list needs to require quote
* CLJS-2696: Large code size in Clojurescript 1.10.x for minimal code with optimizations advanced
* CLJS-2699: Use higher-level Closure API for module-processing
* CLJS-2691: goog.require in module-processed files shouldn't require goog.base
* CLJS-2689: Don't try to use node resolve for goog: modules
* CLJS-2676: Bad cljs.loader behavior for modules with multiple provides
* CLJS-2673: Regression: Can't require cljs.js
* CLJS-2650: Fix JAR compilation of cljs.loader
* CLJS-2671: Double analysis warning for source in JAR with AOT cache
* CLJS-2643: Socket REPL output can be directed to the wrong place
* CLJS-2670: Update cljs.compiler/warning-types
* CLJS-2491: Inference warnings are not reported
* CLJS-2653: REPL crash when mapping stacktrace in Chrome for js/blah
* CLJS-2639: Compiler crash when using aot cache with parallel compile
* CLJS-2520: Synthesize ClojureScript version if using non-built ClojureScript dep
* CLJS-2522: Handle sources that are maps in build-modules
* CLJS-2521: Only expand module graph when modules are actually used
* CLJS-2519: Module loader doesn't load :cljs-base properly
* CLJS-2493: Self host: respect :source-map-timestamp compiler option
* CLJS-2500: Call process-js-modules after compiler restart
* CLJS-2516 Build API fails targeting Node (QuickStart)
* CLJS-2462: subvec on non-integral indexes fails
* CLJS-2474: with-meta on lazy-seq causes separate realization
* CLJS-2501: Fix crash in cljs.util/compiled-by-version and build-options
* CLJS-2476: recur across try should fail compilation
* CLJS-2495: Closure compilation errors should stop Cljs compilation
* CLJS-2496 PHM seq and iter should return MapEntry on nil key case
* CLJS-2473: Infer character literals to have string type
* CLJS-2455: nth fails on eduction
* CLJS-2001: Add map-entry? predicate
* CLJS-2131: Calling empty on a ChunkedSeq should return empty list
* CLJS-1743: Transient maps should support IFn
* CLJS-2452: reverse empty vector returns nil
* CLJS-2450: Allow configuring ignored JS module extensions
* CLJS-2417: Inter-ns s/fdef expansion side effect fails when load cached source
* CLJS-2447: Ignore css JS modules
* CLJS-2397: Multi-arity function instrumentation fails with :static-fns true
CLJS-2197: Calling instrumented var fails to check conformance
* CLJS-2443: doseq should return nil with no collections
* CLJS-2430: Fix foreign-libs with Node target
* CLJS-2414: Self-host: Macro specs are instrumented
* CLJS-2387: CLJS Analyzer does not correctly detect cache hits for analyzed spec files
* CLJS-2405: Register dumped specs fails
* CLJS-2416: Self-host: defn macro Var doesn't have :macro true meta
* CLJS-2425: Remove unnecessary zero? checks from nat-int?
* CLJS-2377: The CLJS compiled uses deprecated modules on Java 9
* Allow clj->js to preserve namespaces
* CLJS-2391: Unable to :stub a function using stest/instrument
* CLJS-2378: keep the :npm-deps-installed? to avoid to reinstall NPM deps
## 1.9.946
### Changes
* CLJS-2300: Delegate clojure.string/capitalize to goog.string/capitalize
* CLJS-2374: Print js/Infinity, js/-Infinity, js/NaN using new reader literals
* bump tools.reader (1.1.0)
* CLJS-2372: update hash to use the new infinity literals
* CLJS-2364: Bump Closure Compiler to the Sep 2017 version
* CLJS-2340: Have js-keys delegate directly to good.object/getKeys
* CLJS-2338: Support renamePrefix{Namespace} closure compiler option
### Fixes
* CLJS-1576: fix source-map string encoding by applying encodeURIComponent and fixing string/replace call
* CLJS-2294: Always use opts with implicit opts added
* CLJS-2166: Add uri? predicate
* CLJS-2368: Self-host: Never compile macro namespaces with `:optimize-constants true
* CLJS-2367: Self-host: :def-emits-var leaks into loaded namespace processing
* CLJS-2352: Emit valid JS for NaN etc. even when used w/ CLJ >= 1.9.0-alpha20
* CLJS-2339: Significant code reload slowdown with :npm-deps
* CLJS-2361: Self-host: circular dependency detection doesn't handle REPL self-require
* CLJS-2356: Self-host: circular dependency detection is not correct
* CLJS-2354: Self-host: `compile-str` doesn't handle `clojure` -> `cljs` aliasing
* CLJS-2353: use portable `node-module-dep?` function in analyze-deps
* CLJS-2345: escape paths emitted as args to cljs.core.load_file
* CLJS-2349: Port reset-vals! and swap-vals! over from Clojure
* CLJS-2336: Call alength once in areduce and amap
* CLJS-2335: Avoid alength on strings
* CLJS-2334: Also gather dependencies from foreign-libs that are modules
* CLJS-2333: module-deps.js doesn't correctly compute `main` if aliased in browser field
* CLJS-2332: module_deps.js doesn't process `export from` correctly
* CLJS-2330: Don't set `"browser"` field for Closure if target is :nodejs
* CLJS-2326: Indexing node_modules can't find `main` when it doesn't have an extension
* CLJS-2328: Args are not provided to *main-cli-fn* with optimizations advanced
* CLJS-2327: module_deps.js doesn't know about browser field advanced usage
## 1.9.908
### Enhancements
* CLJS-2323: data readers support for records
### Changes
* CLJS-2322: Require only `@cljs-oss/module-deps` to be installed to figure out Node.js dep graph
* CLJS-2321: Do not automatically call `set-loaded!` on the user's behalf
* CLJS-2316: Upgrade Closure Compiler to August release
* CLJS-2317: Upgrade Google Closure Library
* CLJS-2234: Make build scripts optionally less verbose
* CLJS-2314: Eliminate str call on literal strings in str macro
* CLJS-2291: Set up Windows CI
* CLJS-2286: Simplify JS module processing
### Fixes
* CLJS-2324: module-graph doesn't munge :requires when indexing inputs
* CLJS-2309: :module foreign-libs order not preserved
* CLJS-2318: module-deps.js doesn't respect the package.json `module` field
* CLJS-2312: Miss-compile: Uncaught SyntaxError: Unexpected token default
* CLJS-2315: module_deps.js can't resolve JSON modules
* CLJS-2313: :language-out is a build affecting option
* CLJS-2306: Provide better warning message when namespace can't be found
* CLJS-2303: Disable duplicate alias checking for self-host
* CLJS-2307: Closure warns on unreachable checked array code
* CLJS-2305 Tests: Unable to resolve symbol: opts in this context
* CLJS-2299: Failure with alias and bad require of clojure.spec
* CLJS-2302: Disable process-shim by default in Node.js targets
* CLJS-2266: Self-host: Cannot require clojure.x where clojure.x has no macros namespace
* CLJS-2304: Fix compiler infrastructure tests on Windows
* CLJS-2261: Issue using interop record constructors in macros namespaces
* CLJS-2296: Foreign libs that expose modules are not being processed under target nod
* CLJS-2293: Self-host: Can't load cljs.js owing to set alias
* CLJS-2295: `index-node-modules-dir` can't determine :main for package.json files that have `.` in the string
* CLJS-1620: In JavaScript ES2015 modules default export name is munged to default$
* CLJS-2287: Self-host: `require` prints result of loading node deps / global exports
* CLJS-2290: Node packages using require('assert') fail compilation
* CLJS-2281: module_deps.js cannot compute inputs for ES6 sources
* CLJS-2284: Fix build API tests not to pollute `out` in the current directory
* CLJS-2282: Some valid keywords are strings in JS object literals
* CLJS-2283: Regression with js-obj and gobject alias
## 1.9.854
### Enhancements
* CLJS-2280: Provide process.env :preload and auto-configure
* CLJS-2279: Infer `:module-type ` for provided `node_modules`
* CLJS-2250: Support :foreign-libs overrides via :provides
* CLJS-2243: Self-host: Add support for :global-exports
* CLJS-2232: Self-host: Add support for string-based requires
* add *print-fn-bodies* knob, set to false
* CLJS-2198: Safe array operations
* CLJS-2217: Support `:rename` for JS modules
* CLJS-2214: Support :global-exports for foreign libraries
* CLJS-1428: Add a cljs.core/*command-line-args* var
* CLJS-2061: Support ns :require for JS libs, allow strings along with symbol
* CLJS-2148: Add warnings for invalid use of aget and aset
* CLJS-2143: Add support for symbol preprocess values
### Changes
* CLJS-2273: Bump tools.reader to 1.0.3 and development dependencies
* CLJS-2235: Allow passing extra maven opts to build scripts
* CLJS-2267: Allow ^:const inlined vars to affect if emission
* CLJS-2245: Add support for using a local `node_modules` installation through a new `:node-modules` compiler flag
* CLJS-2002: Don't throw when no *print-fn* is set
* support Clojure primitive array type hints, core.async no longer
gives warnings
* CLJS-2213: Node.js target should use node_modules index to emit platform specific require
* CLJS-2200: bump to tools.reader 1.0.2
* CLJS-2135: require macro prints last result of loaded-libs
* CLJS-2192: Add ChakraCore testing facilities
* CLJS-1800: Defer to tools.reader for cljs.reader functionality
* CLJS-2163: Clean up uses of aget / aset on objects
* CLJS-2184: Add `ns-publics` and `ns-imports`
* CLJS-2183: Assert arguments are quoted symbols in some core macros
* CLJS-2182: Assert argument to resolve is a quoted symbol
* CLJS-2186: Update docstrings for aget/aset to be consistent with Clojure
* CLJS-2180: Allow compiling `:modules` with whitespace optimizations
* CLJS-1822: Use `:file-min` when processing JS modules with advanced optimizations
* CLJS-2169: Error when compiling with :source-map and advanced optimizations
* CLJS-2037: Throw if overwriting alias in current namespace
* CLJS-2160: Add loaded? and prefetch functions to cljs.loader
* CLJS-2148: Add unsafe-get and use goog.object
* CLJS-2161: Bump Closure Compiler to June 2017 release
### Fixes
* CLJS-1854: Self-host: Reload ns with const
* CLJS-2278: JavaScript object literals are printed wth keys that cannot be read
* CLJS-2276: Self-host: Need test.check dep for CLJS-2275
* CLJS-2275: cljs.spec.alpha/fdef resolves eagerly
* CLJS-2259: Extra .cljs_node_repl directory containing cljs.core output
* CLJS-2274: Update CI script to install deps
* CLJS-2269: Warn on top level code split loads
* CLJS-2272: Tests that depended on default install deps behavior failing
* CLJS-2255: Clean up :npm-deps
* CLJS-2263: Docstring for neg-int? backwards
* CLJS-2262: Correct comment that *warn-on-infer* is file-scope
* CLJS-2258: Stack overflow regression for sequence xform applied to eduction
* CLJS-2256: Generated code doesn't add newline after sourceMappingURL comment
* CLJS-2254: Module Indexing: Provide relative paths for a package's main module
* CLJS-2248: Build API tests rely on Yarn
* CLJS-2239: Self-host: Add `:target :nodejs` to the docstrings in cljs.js
* CLJS-2251: Follow-up fix to CLJS-2249 and related commit
* CLJS-2249: Provide a test for d4b871cce73
* CLJS-2246: Revert CLJS-2245 and CLJS-2240 and fix `lein test`
* CLJS-2244: Orphaned processed JS modules breaks :modules
* CLJS-2242: Lots of undeclared Var warns in cljs.spec.gen.alpha
* CLJS-2241: Multiple requires of Node.js modules in non :nodejs target are not idempotent at the REPL
* CLJS-2229: Ensure that new modules work works correctly with REPLs
* CLJS-2238: Perf regression with node module indexing
* CLJS-2240: don't shell out to module_deps.js if `:npm-deps` not specified
* CLJS-2230: Double checked arrays
* CLJS-2227: Squelch some of the array access tests
* CLJS-2228: Port CLJS-2226 to module_deps.js
* CLJS-1955: data_readers.cljc can't reference handlers in user code
* CLJS-2225: Need to add :checked-arrays to known compiler opts
* CLJS-2226: :npm-deps can't index scoped packages
* CLJS-2224: Resolve-var is wrong wrt. module resolution
* CLJS-2223: Self-host: Undeclared Var deps/native-node-modules
* CLJS-2222: CI failing after CLJS-2217
* CLJS-2219: Enable JSC under test-simple
* CLJS-2218: Make ClojureScript aware of native node modules
* CLJS-2220: Add runtime :npm-deps tests
* CLJS-2212: Replace missing-js-modules with new index-node-modules-dir
* CLJS-2211: Add function to index a top-level node_modules installation
* CLJS-2208: module_deps.js is not compatible with older JS implementations
* CLJS-2207: cljs.test/js-filename is using non-portable .endsWith
* CLJS-1764: Double warning for undeclared Var (REPL only)
* CLJS-2204: Tests failing with respect to lodash/array namespace
* CLJS-2205: NPM deps: Correctly compute `:provides` if file ends in `index.js`
* CLJS-2203: REPL is turning on all warnings by default (including :invalid-array-access)
* CLJS-2201: Self-host: test-js-filename failing
* CLJS-2202: String requires should work from Cljs files in classpath
* CLJS-2199: String requires broken after recompile
* CLJS-2172: memfn docstring refers to Java and reflection
* CLJS-1959: under :nodejs target we should provide __dirname and __filename constants
* CLJS-1966: cljs.test assumes the output directory is '/out/' when determining the filename for a failed or errored test result.
* CLJS-2191: Clean up doc references to clojure.spec.* in favor of cljs.spec.*
* CLJS-2194: cljs.util/relative-name bug
* CLJS-2195: npm-deps tests are not idempotent
* CLJS-2179: Add test for preprocess JS module as symbol
* CLJS-2152: "is not a relative path" exception thrown when `:libs` directory is provided.
* CLJS-2193: :npm-deps dependencies are implicit
* CLJS-1797: Update aot_core to support build with MINGW on Windows
* CLJS-2189: Add test for :preloads
* CLJS-2188: Use :invalid-array-access instead of :invalid-aget / :invalid-aset
* CLJS-2181: Can't compile string sources with modules
* CLJS-2185: Self-host: Docstrings for bootstrap helpers
* CLJS-2178: Add tests for `:npm-deps`
* CLJS-2177: NPM deps & JS modules fixes for Windows
* CLJS-2175: ES6 Module processing broken with Closure v20170626
* CLJS-2175: Add test to check ES6 module processing works
* CLJS-2176: module_deps.js: fix regexes for Windows paths
* CLJS-2173: Fix `npm install` when `:npm-deps` in Windows
* CLJS-2164: Require cljs.js results in warning about new unsafe-get macro
* CLJS-1998: Printing an Object with a null prototype throws an error
* CLJS-2158: cljs_base module generates empty goog.require
* CLJS-2157: Automatically generate cljs.loader/set-loaded! call
* CLJS-2154: Provide compiler info & timing when compiling modules
* CLJS-2151: Rollback removal of dependency information for node targeted compilation
* CLJS-2141: Self-host: cljs.js is using undeclared symbol lib
* CLJS-2145: inode_find issue with hash-map
* CLJS-2142: Can't instrument a namespace containing constants
## 1.9.671
### Fixes
* CLJS-2139: Undeclared var regression in fn bodies
* CLJS-2137: Missing INext on some sequences
* CLJS-2136: Clarify IFind contract to avoid double-lookups
* need to elide :c.a/analyzed in c.a/analyze-wrap-meta to avoid dumping unintended
with-meta expressions
* resolve returns improperly constructed Var
* fix :fn-invoke-direct edgecase around keywords
## 1.9.660
### Changes
* CLJS-2134: Warn on variadic signatures in protocol method implementation
### Fixes
* CLJS-2133: Invalid variadic IFn implementations now fail
## 1.9.655
### Enhancements
* CLJS-2108: faster set equivalence
* CLJS-2099: Optimize apply by avoiding .apply
* CLJS-2046: Optimize expression in call position
* CLJS-1876: Faster reduce for PV, Subvec and ChunkedSeq
* CLJS-2080: Faster equiv-map
* CLJS-2066: Avoid analyzing named fn literal bodies twice
* CLJS-2065: Improve analyzer munge performance
### Changes
* CLJS-2130: Self-host: Add `:fn-invoke-direct` to public API docstrings
* CLJS-2112: Iterator based reduce path
* CLJS-2100: to-array calls seq too often
* CLJS-2041: Compiler flag to drop Function.prototype.call invokes
* CLJS-2093: inline ^:const var values
* CLJS-2042: Variadic invoke calls array_seq inefficiently
* CLJS-2003 remove redundant calls to `str` in munge/demunge
* CLJS-1907: Improve error message from cljs.reader/read-string
* CLJS-1724: Include IIterable in fast-path-protocols
* CLJS-924: Better error message for mistaken use of 'def'
* CLJS-1599: UUIDs are not equal for upper/lower case strings
* NodeJS REPL accepts a :path opt to set NODE_PATH
* CLJS-1886: RangedIterator should only be created from cljs.core.PersistentVector instances
* CLJS-2068: MapEntry, RedNode and BlackNode are IComparable
* CLJS-2073: Don't flush for every emitted line
* CLJS-2089: Warn message wrong for recur to protocol with nil
* CLJS-2085: defrecord recur method head target object
* CLJS-1977: defrecord should use murmur hashing like Clojure
* CLJS-2076: modules should support wildcard namespaces
* CLJS-2078: add resolve macro
### Fixes
* CLJS-2128: Fix regression in CLJS-1886
* CLJS-2126: Add new compiler option :fn-invoke-direct to build-affecting options
* CLJS-2054: Private core names still result in "already declared" warnings
* CLJS-2125: Duplicate HOF invoke warnings if :static-fns true
* CLJS-2119: s/form for s/& is qualified with `clojure.spec.alpha`
* CLJS-2121: Self-host: Document string as valid name arg
* CLJS-2124: Self-host: Tests failing wth Could not find tag parser for :cljs.spec.alpha
* CLJS-2122: Self-host: Non-symbol ns names dumped into env
* CLJS-2117: Self-host: Port CLJS-1989 to self-hosted
* CLJS-1989: s/fdef expansion side effect fails when load cached source
* CLJS-2116: Need to handle un-namespaced symbol when evaluating `foo.core
* CLJS-2109: incorrect syntax-quote symbol resolution (resolve-symbol 'clojure.core) -> 'clojure/core
* CLJS-2113: nth function produces different results from clojure when using a negative index on a sequence
* CLJS-2115: Pass not-found in the native-satisfies? branch of nth
* CLJS-2111: Transit analysis caching broken for JSValue or regex
* CLJS-2101: Undeclared var in do chain of defs
* CLJS-2104: Const-replaced exprs do not emit js "return"
* CLJS-1992: declare after def should have no effect
* CLJS-1251: Missing semicolons when emitting deftype and defrecord mistaken use of 'def'
* CLJS-1685: Incorrectly lazy subvec when start param is nil
* CLJS-1641: Multi-arity defn copies arguments unnecessarily for all cases
* CLJS-2092: Redundant call to equiv-map in PAM.-equiv
* Check for compilation success, and lib folder
* CLJS-2030: Case with grouped keyword test emit result-expr multiple times
* CLJS-2094: Predicates unit tests constructs a uuid with nil
* CLJS-1891: UUID.toString can return non-string
* CLJS-2072: Eliminate reflection in cljs.js-deps/build-index
* CLJS-2012: Find on PHM with nil entry always returns nil entry
* CLJS-2057: fix language-in options (es6 deprecated and add missing es2016)
* CLJS-2060: Backport CLJ-2141 Return only true/false from qualified-* predicates
* CLJS-2091: reify docstring ISeqable example needs correction
* CLJS-2088: fix caching collision between macros ns and regular ns in boostrap
* CLJS-2036: Relative path exception thrown when :preloads requires a :foreign-lib
* CLJS-2083: Test equiv-map for maps which do not impl IKVReduce
* CLJS-2081: Self-host: Regression with CLJS-2079
* CLJS-2079: Records and maps are not equal
* CLJS-2075: PersistentTreeMap.reduce-kv does not honor reduced?
* Browser REPL regression
* CLJS-2069: Self-host: automatic `clojure` -> `cljs` aliasing doesn't work when loading macro namespaces
* CLJS-2067: reduce-kv / inode-kv-reduce fails to honor reduced?
* CLJS-2056: Self-host: test-self-parity failing wrt cljs.core/fn symbol
## 1.9.562
### Enhancements
* CLJS-2027: Add language-in for ECMA 2017 and ECMA Next
* CLJS-2026: Add Compiler option for rewrite polyfills
### Changes
* CLJS-2021: subvec throws when passed non-vector
* CLJS-1884: Give a chance to MetaFn to be removed by closure under :advanced
optimization Replace with-meta calls by -with-meta calls where possible
* CLJS-2052: Port new spec.alpha enhancements
* Update Google Closure Compiler dependency
* Update Google Closure Library dependency
### Fixes
* CLJS-2053: Regression: cljs.spec.alpha/any for fdef
* CLJS-2039: remove extraneous argument from ChunkBuffer.chunk
* Fix assumption that all closure-compliant JS is goog.*
* CLJS-2035: Self-host: Add map-entry-test to self-parity
* CLJS-2033: set-validator! should check current state
* CLJS-2008: Self-host: backport fixes to threading macros
* CLJS-2005: Bad error message with duplicate arity function definitions
* CLJS-2032: Case macro expansion evaluates expression twice when no matching clause
* CLJS-2023: User supplied type hints stopped working on js/goog.DEBUG
* CLJS-2020: defmulti "miss" performance poor
* CLJS-2034: Sequence and Eduction produce infinite loop in transducer that appends to the reduction
## 1.9.542
### Enhancements
* CLJS-1572: REPL doesn't give error for expressions with too many right parentheses
### Changes
* cljs.spec -> cljs.spec.alpha
* CLJS-2013 - Add MapEntry type
* CLJS-2015: Self-host: `defmacro` should return the Var
* CLJS-2017: Upgrade Closure Compiler to latest April 2017 release
### Fixes
* CLJS-485: RegExp flags are being dropped by string/replace
* CLJS-1518: Case macro expansion evaluates expression twice
* CLJS-2024: Self-host: `find-ns-obj` broken for namespaces with 'a' as the first segment
* CLJS-2028: `realized?` throws on LazyTransformer
* CLJS-2010: refer-clojure :rename throws on valid invocations
* CLJS-2007: Whitespace optimizations should respect :main option.
## 1.9.521
### Fixes
* correct CLJS-1923 :foreign-libs regression
## 1.9.518
### Enhancements
* CLJS-1973: Add support for `:npm-deps` in upstream `deps.cljs`
* CLJS-1968: Enable calling JS modules that export a single function
* CLJS-1960: Require CommonJS modules directly from a ClojureScript namespace
### Changes
* CLJS-2006: Upgrade Closure Compiler to April 2017 release
### Fixes
* CLJS-1497: `find` on an associative collection does not return collection key
* CLJS-1996: Support correct checking of :preloads when :optimizations not specified
* CLJS-1994: assoc on nil returns PHM (expected PAM)
* CLJS-1988: add :npm-deps to recognized compiler options
* Fix tiny bug in index-node-modules when no second argument is given
* CLJS-1985: `index-node-modules` should pass opts to `node-inputs`
* CLJS-1987: don't index node modules blindly
* CLJS-1519 Collection invoke errors report arity off by 1
* CLJS-1964: Validate that `:target :nodejs` and no optimizations requires a `:main` option to be present
* CLJS-1956: Add missing JS reserved keywords
* CLJS-1983: res -> mres in spec.cljs
* CLJS-1978: port CLJ-2035
* CLJS-1979: port CLJ-2043 (fix s/form of s/conformer)
* CLJS-1980: port CLJ-2100 (s/nilable form should retain original spec form)
* CLJS-1976: hash-map assoc stackoverflow
* CLJS-1957: Process JS modules errors and warnings don't get printed
* CLJS-1868 - Output simpler dependency rel paths when compiling with Closure libs
* CLJS-1967: Missing ^boolean for removed-leaf? in THM impl
## 1.9.494
### Fixes
* revert CLJS-1636: Mark some symbols in core macros ns as private
## 1.9.493
### Fixes
* CLJS-1948: Possible race condition in compiler w/ parallel-build true
* CLJS-1941: `cljs.compiler/cljs-files-in` shouldn't return `.cljc` files if a `.cljs` file exists for the namespace
* CLJS-1941: `cljs.compiler/cljs-files-in` shouldn't return `.cljc` files if a `.cljs` file exists for the namespace
* CLJS-1940: Undeclared var warning when invoking a protocol method on a `js` interop form
* CLJS-1951: Missing 0 and 1 arity versions of interleave
* CLJS-1952: Bump Closure Compiler to Feb 2017 release
* CLJS-1937: Self-host: undeclared cljs.core$macros/mod when compiling cljs/core.cljs
* CLJS-1936: cljs.analyzer declares vars which are only used in Clojure
* CLJS-1949: Self-host: cljs.compiler/munge doesn't preserve JVM compiler semantics
* CLJS-1950: Eliminate instances of #^
* CLJS-1943: Self-host: `cljs.pprint`'s macros can't be compiled
* CLJS-1945: cljs.spec/every-impl kind-fn kind-form dead code
* CLJS-1944: Can't spec generate non-vector collections
* CLJS-1946: Self-hosted: don't emit `goog.require` calls for foreign libs if optimizations different than `:none`
* CLJS-1636: Mark some symbols in core macros ns as private
* CLJS-1939: Fix Node load_file call for foreign-deps
* CLJS-1942: Self-host: `cljs.env.macros` and `cljs.analyzer.macros` can't be loaded
* CLJS-1935: When calling cljs.spec/valid?, subsequent predicates of cljs.spec/and are evaluated even when early predicate is unsatisfied
## 1.9.473
### Fixes
* CLJS-1931: Closure Compiler {{--generate_exports}} flag not supported
* CLJS-1934: Self-host: require-macros :reload / :reload-all fails
* CLJS-1932: Self-host: Perf regression macroexpand-check
* CLJS-1930: Master broken wrt static field: ES5_STRICT_UNCOMMON
* CLJS-1929: When expanding libs don't include Hidden files
* CLJS-1905: Self-host: Stacktraces for script/test-self-parity
* CLJS-1795: Support more options in the `:closure-warnings` compiler option
* CLJS-1922: Use :file as relative output path for foreign-libs
* CLJS-1831: Self-host: Improperly munge ns names
* CLJS-1925: Use of undeclared Var cljs.user/RegExp when extending protocol for RegExp
* CLJS-1920: cljs.build.api/node-inputs: package.json files are only added if module entries are top-leve
* CLJS-1916: __dirname and __filename are not defined when compiling for Node.js with optimizations :none
* CLJS-1915: cljs.test: Index out of bounds for stack element w/o line/column
## 1.9.456
### Enhancements
* Enhanced JavaScript module support
* Support Node resolution for CommonJS modules
* Externs inference
* Performance enhancements
* CLJS-1835: REPL load special fn
* CLJS-1194: Support for `data_readers.cljc`
### Changes
* expose :closure-module-roots option
* bump Closure Compiler dep
* Under Node.js don't need require entries in the goog.addDependency calls in cljs_deps.js
* do not throw on circular dependencies between Google Closure JS libs
* str macro should call str/1 function directly, added str benchmark
* CLJS-1718: Foreign lib files should be placed in a relative location
* CLJS-1858: Should allow `:cache-analysis true` and `cache-analysis-format nil`
* CLJS-1616: Self-host: improve documentation for compile-str
* CLJS-1643: Emit more informative error when emitting a type which has no emit multimethod case
* CLJS-1816: Basic timing info in verbose output
* add support for emitting inferred externs file
* add cljs.analyzer/analyze-form-seq
* CLJS-1666: Flag to optionally disable transit analysis cache encoding
* Provide more descriptive error message when invalid libspec detected
* CLJS-1768: cljs.spec perf tweaks
* CLJS-1842: Remove analyzer `:merge` hack for REPLs
* CLJS-1839: Relax the constraint that `new` and dot forms must be passed a symbol
* default to :ecmascript3 if :language-out not specified for :es6 module
* respect :language-out when processing ES6 modules
* default to :ecmascript3 if :language-out not specified for :es6 module
* inline some?
### Fixes
* CLJS-1911: Need to bind Node.js require
* CLJS-1909: Self-host: circular dependency when requiring cljs.reader
* CLJS-1906: Self-host: script/test-self-parity fails
* CLJS-1903: Remove anonymous vars from dir and apropos output
* CLJS-1897: Too many externs generated
* CLJS-1895: Externs inference needs to support user supplied externs
* CLJS-1873: Self-host: Unit tests fail owing to test.check dep
* CLJS-1874: Self-host: :fn-var true for macros
* CLJS-1877: :foreign-libs entries should be allowed to specify directories along with individual files
* CLJS-1890: s/form for s/nilable in cljs.spec does not match clojure.spec
* CLJS-1811: Can't compose cljs.spec.test.instrument (or cljs.spec.test.check) with cljs.spec.test.enumerate-namespace
* CLJS-1894: Unnecessary analysis of core.cljs on first compile
* CLJS-1893: Unnecessary analysis of core.cljs
* CLJS-1892: Dependencies in JARs are analyzed every time even if an analysis cache file exists
* CLJS-1887: add :watch-error-fn option
* CLJS-1883 Foreign libs can't be found on Node.js
* CLJS-1882 Fix constant table sort order when using :modules
* CLJS-1853: var metadata in compiled output
* CLJS-1878: prefer `some?` over `(not (nil? %))` in analyzer
* CLJS-1880: missing ^boolean on some hasNext calls
* CLJS-1875 Difference in seqable? between CLJ & CLJS
* CLJS-1829: get does not return not-found on negative indexes
* cljs.spec.test/unstrument shouldn't return the names of vars that weren't instrumented in the first place. Fixes CLJS-1812
* CLJS-1786: Add knob for controlling printing of namespaced maps
* CLJS-1836: nth doesn't throw for IndexedSeqs
* CLJS-1870: Quoted specs check in require macro symbols
* CLJS-1869: Regression importing goog.Uri
* Fix CLJS-1653 regression
* CLJS-1860: Resolve JS modules referred by their fully-qualified namespace
* CLJS-1861: Use usr/bin/env in build scripts for portability
* CLJS-1857: Fix self-host tests
* CLJS-1855: Subvec should implement IIterable
* CLJS-1856: Self-host: load-deps doesn't delegate to itself
* CLJS-1651: Self-host: Cannot replace core macro-function
* CLJS-1848: Analyzer can't find JS modules during macro-expansion
* CLJS-1851: Only output JS module processing time when `:compiler-stats` is true
* CLJS-1850: *unchecked-if* not declared ^:dynamic warning after commit a732f0
* CLJS-1849: Self-host: regression introduced by CLJS-1794
* CLJS-1844: port over Maria Geller's externs file parsing code
* CLJS-1845: Assoc on subvec should throw if out of bounds
* CLJS-1847: REPL should recognize `clojure.core/load`
* CLJS-1745: refer-clojure doesn't pull in previously excluded vars
* CLJS-1794: incomplete alias created for namespace cljs.spec warning under advanced compilation
* CLJS-1834: REPL regression, require of ns from the ns itself errors out in circular reference
* fix ns aliasing regression for JS namespaces
* CLJS-1837: Port halt-when over from Clojure
* CLJS-1820: "No such namespace" warning when referring to JS module namespace without using alias
* CLJS-1828: Add `:rename` to `require`'s docstring
## 1.9.293
### Enhancements
* CLJS-1346: Support require outside of ns
### Changes
* CLJS-1762: Bump Closure Compiler, refactor module support
* CLJS-1658: testing for protocol membership may return false positives
* CLJS-1536: REPL def symbol init collision
* CLJS-1805: Source map should take false
* CLJS-1804: Self-host: process namespace side-effects for new require without NS
* CLJS-1803: Use new require capability in REPLs
* CLJS-1796: Measure Google Closure specific optimization time
* CLJS-1782: Self-host: allow namespaces to require their own macros
* CLJS-1563: :source-map option to cljs.build.api/build should take nil
* CLJS-1785: Warn on reference to js/foo shadowed by local binding
### Fixes
* make String an implicit ns like Math. revert char? and clarify docstring. add unit tests for char?
* fix cljs.spec.test/check docstring
* CLJS-1826: Self-host: load-deps doesn't honor `:reload` and `reload-all`
* CLJS-1825: :source-map error when passing `false` under simple optimizations
* CLJS-1821: `add-preloads` should only touch sources if `:preloads` option specified
* CLJS-1814: Move docstrings for require, etc. from `cljs.repl` to their new definitions in `cljs.core`
* CLJS-1809: Add 0/1 arity to `into`
* CLJS-1824: transit cache feature leaks files
* CLJS-1294: Let macroexpand(-1) accept any quoted argument.
* CLJS-1818: (hash false) returns different value from Clojure
* CLJS-1817: Strange result when assoc'ing 0 to persistent hash map
* CLJS-1815: Fix failing analyzer tests
* follow-up on CLJS-460 defmulti ignores optional :hierarchy argument
* CLJS-1807: Better error messages for `ns*` calls
* CLJS-1802: Generated namespaces should be of the form `cljs.user.fileXXXX`
* CLJ-1935: Use multimethod dispatch value method lookup to take hierarchies into account in multi-spec
* CLJS-1682 :foreign-libs with module conversion does not works properly if it is used form deps.cljs
* CLJS-1710: spec/double-in not implemented
* CLJS-1787: Make cljs.spec explain pluggable
* CLJS-1781: Add cljs.hash-map-test to self-parity tests
* CLJS-1788: Port CLJ-2004: include retag in multi-spec form
* CLJS-1765: Empty iterator for hash maps with nil key
* CLJS-1784: nth doesn't throw on strings or arrays
* CLJS-1773: Self-host: Don't resolve unqualified symbols / keywords with $macros
* CLJS-1770: goog-defines broken for integers
* CLJS-1600: Destructuring defprotocol fn args causes defrecord impls to silently fail
* CLJS-1335: resolve-macro-var: information missing for macros
* CLJS-1633: Improve error associated with invalid foreign-libs :file path
* CLJS-1775: `get` with `nil` returns as if `get` with `0`
* CLJS-1780: Records without extmaps fail to iterate
* CLJS-1774: Self-host: Report filenames in warns in test-self-parity
* CLJS-1779: keyword 2-arity constructor accepts anything for both parameters which leads to different hashing
## 1.9.229
### Fixes
* CLJS-1772: Dependency index can incorrectly overwrite `.cljs` files with `.cljc` files if both are present
* pass unconform along on conformer with-gen instead of warning
## 1.9.227
### Fixes
* CLJS-1763: Defining a var that clashes with `cljs.core` throws a compiler error instead of warning
## 1.9.225
### Fixes
* CLJS-1759: Errors writing transit analysis cache if parallel build
* CLJS-1760: Self-host: test-cljs-1757 failing in test-self-parity
* CLJS-1751: port fix lost type hints in map destructuring
* CLJS-1756: Add test.check JAR to the bootstrap script
* CLJS-1757: cljs.spec/exercise-fn doesn't work when passed a quoted symbol
* CLJS-1754: Add boolean? generator
* fix REPL regression which removed warnings
## 1.9.216
### Fixes
* CLJS-1749: Missing `cljs.spec.impl.gen/double*`
* CLJS-1747: Port `clojure.spec/assert` over to ClojureScript
* fix CLJS-1663 multi-arity fn instrument regression
## 1.9.211
### Fixes
* CLJS-1746: Log the result of loading a dependency
* CLJS-1657: Self-host: Implicit macro loading with alias
* CLJS-1742: Add docstring for new refer-clojure REPL special
* CLJS-1274: Allow assignment to namespace-qualified names in current namespace
* CLJS-1744: rest produces nil for larger maps
* CLJS-1740: Self-host: Need to port more of CLJS-1733
* CLJS-1741: Add :rename to :refer-clojure in ns docstring
* CLJS-1737: Self-host: clojure alias implicit macro use regression
* invalid cljs.spec/merge res call
* CLJS-1739: seq on map literal with 9 elements leads to rest producing nil
* CLJS-1738: Self-host: need to update call to check-use-macros-inferring-missing
## 1.9.198
### Enhancements
* CLJS-1508: Extend ns form to support :rename option
* CLJS-1507: Implicit macro loading: macro var inference in :refer
* CLJS-1692: Autoalias clojure.* to exisiting cljs.* namespaces if
possible
* CLJS-1350: Compiler support for browser REPL
* CLJS-1729: Support `use` special function in REPLs
* CLJS-1730: Support `refer-clojure` special function in REPLs
### Changes
* CLJS-1515: Self-host: Allow :file key in cljs.js/*load-fn*
* add toString implementation to Vars
* Use a js array to create collections in cljs.reader
* CLJS-1640: Use the unshaded version of the closure compiler
* add :browser-repl to list of known opts
* add browser REPL preload
* parity with Clojure 1.9.0-alpha10 clojure.spec
* bump to tools.reader 1.0.0-beta3
### Fixes
* CLJS-1733: Macro inference issue for macros & runtime vars with the same name
* CLJS-1735: Self-host: cljs.spec speced-vars instance
* CLJS-1736: cljs.spec.test: checkable-syms* called with 0-arity
* CLJS-1708: Self-host: [iu]nstrument-1 needs to qualify [iu]nstrument-1*
* CLJS-1707: Self-host: with-instrument-disabled needs to qualify *instrument-enabled*
* CLJS-1732: Add docstrings for new use and use-macros REPL specials
* CLJS-1720: Qualify symbols and namespaced keywords in spec macros
* CLJS-1731: Self-host: do_template problem with script/test-self-parity
* CLJS-1556: Invalid code emit for obj literal
* CLJS-1607: bug with `specify!` in JS prototypes with `static-fns` true
* CLJS-1591 avoid analyzing invoke arguments multiple times
* CLJS-1638: :elide-asserts disables atom validators in :advanced
* CLJS-1721: 3-arity get-in fails on types which do not implement ILookup
* CLJS-1728: Update doc for ns for new :rename capability
* CLJS-1727: Regression when evaluating non-sequential forms at the REPL
* CLJS-1490: Watch macro files in cljs.build.api/watch
* CLJS-1719: Port destructuring namespaced keys and symbols
* CLJS-1653: cljs.spec: keys* causes exception
* CLJS-1700: Support clojure.* aliasing when not in vector
* CLJS-1717 remove map from equiv-map
* CLJS-1716: No longer possible to use same alias for :require-macros and :require
* Use keyword options in js->clj 1-arg impl
* Add support for regex in transit for compiler analysis cache
* Escape non-Latin1 characters before base64 encoding the source-map string
* CLJS-1698: cljs.spec: every res call needs &env
* CLJS-1695: Self-host: Port cljs / clojure namespace aliasing
* CLJS-1697: doc on inferred macros fails
* CLJS-1699: Update docstring for ns
* CLJS-1694: Self-host: Port macro var inference in :refer
## 1.9.89
### Enhancements
* CLJS-1688: :preloads compiler option for loading other entry points prior to :main
* cljs.spec - support gen overrides by name in addition to path
* cljs.spec - every and every-kv
### Changes
* added bounded-count
### Fixes
* missing cljs.spec/fn-specs -> cljs.spec/get-spec in cljs.spec.test ns
* CLJS-1687: Self-host: cljs.spec: inst-in-range? and int-in-range? need qualification
* CLJS-1668: cljs.spec: c alias needs expansion in int-in
## 1.9.76
### Enhancements
* CLJS-1648: Getting Source Info into ex-info data for Analysis Errors
* cljs.spec updated to Clojure 1.9.0-alpha7 changes
### Changes
* bump Google Closure Library dep
* AOT cljs.spec nses
### Fixes
* CLJS-1679: Self-host: Incorporate spec tests
* CLJS-1680: Self-host: Don't require items no longer provided by Closure
* CLJS-1654: cljs.spec: var name in s/fdef non-conformance
* CLJS-1655: cljs.spec: conformer docstring indicates :clojure.spec/invalid
* CLJS-1656: Self-host: cljs.spec: speced-vars* fn not resolving
* CLJS-1661: cljs.spec: non-spec'ed fn var printing
* compute read/write opts for transit if possible, handle JSValue
* CLJS-1660: cljs.spec: Always return var from instrument / unstrument
* CLJS-1671: Bad cljs.spec interactive instrumentation session
* CLJS-1664: The filename aux.cljs is a problem on windows.
* CLJS-1667: bad describe* for and-spec-impl
* CLJS-1699: Self-host: s/fdef ns-qualify *ns* name field access
## 1.9.36
### Enhancements
* Write analysis caches as Transit if transit-clj available
### Changes
* Clojure 1f25347
* Clojure 47b8d6b
* Optimize seq (&) destructuring as per commit (0aa3467) of Clojure
### Fixes
* CLJS-1611: Function arity dispatch returns arity
* only print specs in REPL if we actually have some
* CLJS-1663: Calling instrumented multi-arity function causes exception
* CLJS-1650: `cljs.reader/read-map` now returns array-map/hash-map based on the size of the sequence.
## 1.9.14
### Enhancements
* clojure.spec ported to cljs.spec
### Fixes
* CLJS-1649: Possible issue with in cljs.reader or cljs.core/PersistentHashMap
* CLJS-1647: Rethrow exception from parallel-build
* CLJS-1642: cljs.core/reductions does not respect 'reduced'
* CLJS-1635: Var type implements IEquiv but not IHash
* CLJS-1629: Fix warning about duplicate test-pr-str
* CLJS-1637: Missing docstrings for a few vars
## 1.8.51
### Changes
* bump Closure Compiler to v20160315
* bump tools.reader to 1.0.0-beta1
* CLJS-1624: Avoid useage of JSC_HOME in test bash scripts
### Enhancements
* CLJS-1626: cljs.test for bootstrap
### Fixes
* CLJS-1588: defrecord satisfies? behavior under bootstrap
* CLJS-1632: docs / arglist consistency
* CLJS-1612: Resolve ns aliases in syntax-quote
* CLJS-1621: Foreign libs modules of different types don't compile together
* CLJS-1617: inlined `list` evaluation order
* :parallel-build race condition
## 1.8.40
### Fixes
* CLJS-1603: Only warn for misspelled comp/REPL opts
* :warning-handlers missing for known compiler options
* CLJS-1592: Self-host: Robustness for core tests
## 1.8.34
### Changes
* CLJS-1582: Type-hint extend-type first arg for primitives
* CLJS-1590: split, split-lines differs from Clojure on empty string
* CLJS-1594: NaN and both infinities cannot be elements of a set
* CLJS-1597: Redundant IPrintWithWriter test in pr-writer-impl
* CLJS-1583: (hash (symbol "/")) does not match (hash '/)
* bump tools reader
* CLJS-1492: Warn when using :optimisations instead of :optimizations
* less cryptic error if :main doesn't correspond to any file
* CLJS-744: ISequential types should implement JS indexOf, lastIndexOf
* CLJS-1411: make-array signature differs from clojure
### Fixes
* CLJS-1589: Self-host: case fail with nil
* CLJS-1596: Self-host: :load-macros and :analyze-deps don't work in cljs.js
* CLJS-1420 - get-in behavior differs from Clojure by always deferring to the 3 arity fn
* CLJS-1585: Self-host: Alias-scoped keywords
* CLJS-1577: Self-host: syntax-quote resolves on dot forms
* CLJS-1564: Self-host: cached macro *loaded* update
* CLJS-1584: Self-host: core/str error with condp
* CLJS-1521: Self-host: Macro namespaces cannot be aliased
* CLJS-1573: Self-host: Invalid UTF escaping in cljs-in-cljs
* CLJS-1570: :parallel-build causes invalid truth check in cljs.reader/read-number
* CLJS-1568: LazyTransformer doesn't implement IMeta
* CLJS-1578: Corrupted Analysis Files Break Compilation
* CLJS-1579: cljs.source-map/invert-reverse-map discards gcol
* CLJS-1580: Self-host: goog.provide offsets source-maps
* CLJS-1569: IndexedSeq doesn't implement IWithMeta / IMeta
* CLJS-1567: make-array macro missing > 2 arg arity
* CLJS-1571: Make special-symbol? true for 'var
* CLJS-1555: make-array macro missing 2 arg arity
* CLJS-970: generate assert message when compiling
* CLJS-1565: Self-host: whitespace optimization is broken
* CLJS-1541: Self-host: Cannot require 'cljs.js using cljs.jar
* CLJS-1550: Enhance docstring for extend-type wrt type-sym
* CLJS-1551: Self-host: assert-args dormant in macros
* CLJS-1552: doc for & should match fn
* CLJS-1488: cljs.repl/source Cannot read source of cljs functions that use #js reader
* CLJS-1557: Make special-symbol? return true for catch and finally
* CLJS-1542: Self-host: cljs/compile-str not handling errors properly
* CLJS-1318: Fix typo in documentation of `specify`
* CLJS-620: Warnings are generated when using a macro in argument position
* CLJS-1547: Wrong output encoding when compile with goog.LOCALE
* CLJS-1546: cljs.core/run! does not always return nil
## 1.7.228
### Enhancements
* New experimental :parallel-build compiler option
### Changes
* CLJS-1538: Type hint some cljs.core predicates
* Docstring typos
* CLJS-1463: (js-debugger) should generate nil-returning expression
* CLJS-1516: better error message when calling macros with arity
* CLJS-1514: Remove Alpha designators on *-watch and ex-*
* clojure.core/require is not thread safe, use locks
* CLJS-1505: Add tests to characterize `type` and `instance?` behavior
* CLJS-1491: Check :source-map is boolean when :optimizations :none
* split sm/encode into 2 functions so JSON generation is optional
### Fixes
* CLJS-1539: Parallel compilation fails on circular dependencies
* CLJS-1425: self-host: cljs.js/eval cb argument inconsistent with docstring
* CLJS-1425: self-host: cljs.js/eval cb argument inconsistent with docstring
* CLJS-1524: Bad hashing for Cons
* CLJS-1487: Fix handling of timestamp comparison for dependencies in JARs
* CLJS-1498: Fix parallel build logging
* CLJS-1477: Do not attempt to resolve "native" type symbols
* CLJS-1236: `constructor` needs to munged if used as namespace segment
* CLJS-1330: self-host: .toString on int needs parens
* CLJS-1512: Self-host: arithmetic form meta missing :numeric
* CLJS-1506: doc for referred fn displays alias ns
* CLJS-1504: Self-host: Pseudo-namespace for macro namespace analysis
metadata
* CLJS-1483: Minor DCE regression with advanced compilation mode
## 1.7.170
This is a breaking change for tooling libraries like lein-cljsbuild,
lein-figwheel, and boot-cljs. Refer to the corresponding documentation to
determine which version you should use.
### Enhancements
* Refactor build pipeline
* CLJS-1478: Self-host: Allow static-fns opt
### Changes
* Generate larger range of random UUIDs
* make browser REPL file reloads less chatty
* CLJS-1475: indicate that cljs.reader/read is safe
* CLJS-1470: Bump GCL Dependency
* bump Google Closure dep
### Fixes
* in system-time check that js/process.hrtime is actually a thing
* CLJS-1228: cljs.util/topo-sort is polynomial on larger dependency graphs
* check that performance.now method actually exists
* CLJS-1476: Self-host: Protocol prefixing broken for three- (or more) segment namespaces
* CLJS-1472 Patch for CLJS-1467 causes regression for nodejscli
* CLJS-1469 :modules regression
* CLJS-1445: Syntax error for var args in protocol methods
* Warn if protocol impl methods do not match its protocol
* CLJS-1451 Protocol impl do not support qualified method names
* CLJS-1422: cljs.js/eval-str fails for ns form on node.js with simple optimizations
* CLJS-1423: self-host: Requiring analyzer/compiler breaks unchecked Boolean
* CLJS-1466: Improperly munged output path for GClosure JavaScript
* CLJS-1467: Foreign Libraries not included when using :main with :simple or :advanced
## 1.7.145
### Enhancements
* CLJS-1455: high resoluting timing where available
* CLJS-1403: Add updated Windows shell scripts
* CLJS-1017: support :main for :advanced and :simple builds
* CLJS-1409: allow basic type checking of protocols
* CLJS-1404: var resolution for @param and @return
* CLJS-1395: Node.js REPL debug port support
### Changes
* CLJS-1464: docstrings for transducer arities
* Latest Google Closure Compiler dependency
* Node.js REPL sets *target*
* add cljs.analyzer.api/get-js-index
* add goog.object to list of implicit namespaces
* CLJS-1393: turn *target* into goog-define
### Fixes
* UUID hashing
* CLJS-1465: fix *main-cli-fn* doc
* CLJS-1456: bad require forms at REPL can corrupt REPL session
* CLJS-1449: self host :require-macros bug
* CLJS-1462: self host regression
* Add header bits for Node.js under :none
* CLJS-1457: unicode symbol munging
* CLJS-1442: self host, docstring typos
* CLJS-1441: portable clojure.string
* CLJS-1436: self-host, dep ns not loaded
* CLJS-1440: self-host, eval support in Web Workers
* CLJS-1400: self-host, doseq broken
* CLJS-1435: self-host, bad lexical scope
* CLJS-1434: clojure.walk no longer preseves meta
* CLJS-1432: '$ and '. symbol collision under advanced
* CLJS-1304: c.string/replace differs from Clojure
* CLJS-1430: bad code gen for self host .toString method calls
* CLJS-1353: range inconsistent with Clojure
* CLJS-1431: load-file doc output missing arglists
* CLJS-1433: cljs.js/*eval-fn* passed nil :cache
* CLJS-1299: add more support for literals to cljs.reader
* CLJS-1417: cljs.js require macros failures
* CLJS-1416: cljs.util/last-modified leaks files
* CLJS-1481: self host defprotocol regression
* CLJS-1414: only munge @param & @return if type checking
* CLJS-1401: unify runtime & compile UUID hashing
* CLJS-1395: no trailing semicolons after JS comment
* CLJS-1394: reify gensyms can clash
## 1.7.48
### Enhancements
* provide goog-define macro to support proper use of goog.define
* CLJS-1177: A compiler support for non-Closure transforms (JSX, etc)
* CLJS-1296: browser REPL should queue prints before connection then flush after connection
* add :dump-core compiler option for cljs.js config
* CLJS-1386: Symbols should be added to the constants table
### Changes
* Bump Closure Compiler dependency
* Bump Closure Library dependency
### Fixes
* CLJS-1392: cljs.repl/source regression
* CLJS-1391: Error when building for target :nodejs
* CLJS-1388: Stacktrace element handling for :output-dir w/o file/line/column
* CLJS-1311: Improve error reporting when converting JavaScript modules
* CLJS-1387: support local Closure libs that conform to classpath
## 1.7.28
### Enhancements
* New namespace cljs.js provides analysis, compilation, and eval
* CLJS-1360: Refactor JS module processing to work with recent Google Closure compiler changes
* CLJS-1282: Add a :pprint option to the default reporter in cljs.test
* CLJS-1308: :analyze-path should be extended to take a vector of paths
* CLJS-1230: ES 2015 Module Processing
* CLJS-1231: AMD Module Processing
* CLJS-1092: CommonJS Module processing
### Changes
* CLJS-1376: Printing in a tagged literal data form
* CLJS-836: Replace seq-based iterators with direct iterator for all non-seq collections that use SeqIterator
* CLJS-1367: Expose default-warning-handler and warning-enabled?
* CLJS-1267: Added the :end-test-all-vars and :end-test-vars events to have end events for all cljs.test api functions
* CLJS-1337: Move parse ns side-effects into a separate compiler pass
* CLJS-1247: Split out error printing from regular printing
* CLJS-1329: Support for reading #js tagged literals in bootstrap
* CLJS-1191: rebased patch Update clojure.walk to the current version on clojure
* CLJS-1321: remove getNamespace & getName method calls from defrecord
* CLJS-1281: Preserve test order
* CLJS-934: In the REPL return vars after defs
### Fixes
* CLJS-1316 let does not detect invalid binding vector when it contains destructuring
* CLJS-1033: take a drop accept nil as n argument
* CLJS-1324: Compiler fails to raise warning/error when invoking a keyword without arguments
* CLJS-1352: cljs.js: Allow conditional readers
* CLJS-1348: meta is printing for def at REPL
* CLJS-1342: cljs.reader/read-string should throw Error when not called with string
* CLJS-1341: Fix CommonJS conversion bug
* CLJS-1333: Analyze meta on quoted symbols
* CLJS-1210: Javascript built-in arguments replaces nil arguments locally defined by let
* CLJS-1248: alter-meta! does not work on vars
* CLJS-1276: var equality differs from Clojure
* CLJS-1310: ns libspec error message misses :import
* CLJS-428: Added step to escape docstrings with */ and associated test
* CLJS-1331: Regex literal emits invalid JS
* CLJS-1338: NPE in confirm-var-exists if suffix is ".."
* CLJS-1319: Cannot locate module namespace when filename contains dash
* CLJS-1317: Incremental compilation issues for :nodejs target
* CLJS-1227 Raise error when if form has more than 4 statements
* CLJS-1306: Browser REPL :asset-path with leading slash breaks source map support
* CLJS-1290: :refer does not work with Closure JS namespaces
* CLJS-1307: Doc for ns missing
* CLJS-1301: local :foreign-libs are not picked up the first time browser REPL is started
## 0.0-3308
### Changes
* Clojure 1.7.0-RC1 dependency
* CLJS-1292: Add IPrintWithWriter implementation for TaggedLiteral
* add cljs.core/random-uuid
* flush immediately when forwarding Node process out & err
* CLJS-1256 cache UUID hash value
* CLJS-1226: Added the :end-run-tests event to cljs.test and a dummy event handler for it
### Fixes
* CLJS-1200: compare behaves differently from Clojure
* CLJS-1293: Warning settings not conveyed via REPL
* CLJS-1291: pprint whitespace/letter checks are incomplete
* CLJS-1288: compiler doesn't emit "goog.require" for foreign library when optimization level is not set
* check that we actually read something in cjls.repl.server/read-request
* clarify cljs.test/run-tests docstring
* CLJS-1285: load-file regression
* CLJS-1284: IndexedSeq -seq implementation incorrect for i >= alength of internal array
* finish CLJS-1176, remove stray .isAlive method call
* add zero arity `newline` to match Clojure
* CLJS-1206: Images in HTML don't show up when served from localhost:9000
* CLJS-1272: :include-macros description inaccurate in require
* CLJS-1275: Corrected :test-paths in project.clj
* CLJS-1270: Docstring for delay not printed by cljs.repl/doc
* CLJS-1268: cljc support for cljs.closure/compile-file
* CLJS-1269: realized? docstring refers to promise and future
* match Clojure behavior for get on string / array. Need to coerce key into int.
* CLJS-1263: :libs regression, can no longer specify specific files
* CLJS-1209: Reduce produces additional final nil when used w/ eduction
* CLJS-1261: source fn fails for fns with conditional code
## 0.0-3269
### Fixes
* REPL support for Closure libraries that follow classpath conventions
* don't break closure libs that follow classpath conventions
* build missing .map source map & .edn caches files
## 0.0-3264
### Fixes
* Add missing JS files back to the build
* CLJS-1168: REPL fails to find .js files in :libs
* CLJS-1196: Assert failed on 3190+ while :require-ing .js file in :libs directory
* CLJS-1235: non-upstream :foreign-libs not copied to :output-dir
* CLJS-1258: stack trace mapping does not appear to work with :asset-path
* CLJS-1257: find-doc regression
## 0.0-3255
### Changes
* Update Closure Library dependency
* CLJS-1252: Update Closure Compiler Dependency to v20150505
* .clj -> .cljc for important analysis / compilation bits
* add public cljs.compiler.api namespace
* CLJS-1224: cljs.repl: Memoize stack frame mapping
* depend on tools.reader 0.9.2
### Enhancements
* add cljs.pprint/pp macro
* CLJS-710: port clojure.pprint
* CLJS-1178: Compiler does not know Math ns is not not-native
* add getBasis methods to deftype and defrecord ctors a la Clojure JVM
* support ^long and ^double type hints
### Fixes
* fix cljs-1198 async testing regression
* CLJS-1254: Update REPL browser agent detection CLJS-1253: Create/Use new Closure Library Release
* CLJS-1225: Variadic function with same name as parent function gives runtime error in advanced compile mode.
* CLJS-1246: Add cljs.core/record? predicate.
* CLJS-1239: Make eduction variadic.
* CLJS-1244: tagged-literal precondition check missing wrapping vector
* CLJS-1243: Add TaggedLiteral type & related fns
* CLJS-1240: Add cljs.core/var?
* CLJS-1214: :arglists meta has needless quoting CLJS-1232: bad arglists for doc, regression
* CLJS-1212: Error in set ctor for > 8-entry map literal
* CLJS-1218: Syntax quoting an alias created with :require-macros throws ClassCastException
* CLJS-1213: cljs.analyzer incorrectly marks all defs as tests when eliding test metadata
* CLJS-742: Compilation with :output-file option set fails
## 0.0-3211
### Changes
* CLJS-1205: Conditional reading in REPLs
* CLJS-1204: cljs.build.api/watch can now take compilation inputs
* CLJS-1203: standard way to pass multiple directories to build
### Fixes
* CLJS-1216: incorrect max fixed arity for fns both multi-arity and variadic
* cljs.analyzer/parse-ns did not bind *cljs-file*
* CLJS-1201: compare broken for IIndexed collections
* CLJS-1202: cljs.repl/load-file is not additive
* CLJS-1199: array-map should skip dropped elements of IndexedSeq
* CLJS-1197: load-file does not reload associated macro namespace
## 0.0-3196
### Enhancements
* Conditional reading
* map clojure.core/in-ns to REPL in-ns special for existing tools
* CLJS-1171: map clojure.repl/doc, clojure.repl/source, clojure.repl/dir
* add macroexpand and macroexpand-1 macros
* CLJS-1019: REPL source map caching support
* CLJS-1154: Unmunged function names for stacktrace
### Changes
* Clojure 1.7.0-beta1 dependency
* tools.reader 0.9.1 dependency
* CLJS-1188: multi-arity fns hinder cross-module code motion
* cljs.test needs to default to sync
* CLJS-1184: log module building activity under verbose
* CLJS-1175: CLJS defmulti doesn't exhibit same defonce behavior as Clojure's defmulti, suggesting an even better reloading behavior
* CLJS-1176: redirect node REPL output through *out* and *err*, not System/out, System/err
* CLJS-1144 - expose defaul-dispatch-val and dispatch-fn multifn accessors
* CLJ-1172: supply main entry points for all standard REPLs
* less noisy REPL prompt
* add docstrings & validation to macroexpand & macroexpand-1
### Fixes
* CLJS-1192: eliminate JDK8 API dependency in cljs.repl.node
* CLJS-1158: Regression: compiler fails to see symbols defined in another namespace
* CLJS-1189: array-map will return PersistentHashMap if applied to more than (.-HASHMAP-THRESHOLD PersistentArrayMap) pairs
* CLJS-1183: load-file doesn't copy source to output directory
* CLJS-1187: var ast contains internal nodes with bad analysis :context
* CLJS-1182: semantics of load-file should be require + implicit :reload
* CLJS-1179: strange load-file behavior
* CLJS-808: Warning from `find-classpath-lib` mistakenly included in generated source
* CLJS-1169: cannot use REPL load-file on files that declare single segment namespaces
* don't use print unless printing the result of eval
* CLJS-1162: Failure to printStackTrace when REPL initialized
* CLJS-1161: actually print error stack traces to *err*, allow higher-level rebindings of *cljs-ns*
* CLJS-841: cljs.closure/build file locks
* CLJS-1156: load-file fails with :make-reader issue
* CLJS-1152: (require 'some.ns :reload) causes printing to stop working in browser REPL
* CLJS-1157: Stacktrace unmunging blindly use locals
* CLJS-1155: REPL :watch support does not play nicely with :cljs/quit
* CLJS-1137: :cljs/quit fails to actually quit in browser REPL
* CLJS-1148: ClojureScript REPL must maintain eval/print pairing
* make quit-prompt configurable
* CLJS-1149: cljs.repl/repl needs to support :compiler-env option
* CLJS-1140: typo in cljs.repl/repl, `:need-prompt prompt` instead of `:need-prompt need-prompt`
## 0.0-3126
### Fixes
* Need to wrap REPL -setup calls in cljs.compiler/with-core-cljs
## 0.0-3123
### Fixes
* CLJS-1131: cljs.closure/add-dependencies needs to be more aggressively set oriented
* CLJS-1132: compile-file analysis pass optimization broken under Closure optimization and :cache-analysis true
## 0.0-3119
### Fixes
* CLJS-1130: :foreign-libs regression under Closure optimized builds
## 0.0-3117
### Fixes
* CLJS-1126: File are not recompiled when build affecting options changes
## 0.0-3115
### Enhancements
* CLJS-806: support ^:const
* CLJS-1115: Reusable repl-bootstrap! fn
### Changes
* CLJS-667: validate extend-type and extend-protocol shape
* CLJS-1112: :repl-requires option for REPL evaluation environment
* CLJS-1111: browser REPL should have no side effects until -setup
### Fixes
* CLJS-1085: Allow to pass test environment to cljs.test/run-all-tests
* CLJS-867: extend-type with Object methods requires multi-arity style definition
* CLJS-1118: cljs.repl/doc support for protocols
* CLJS-889: re-pattern works on strings containing \u2028 or \u2029
* CLJS-109: Compiler errors/warnings should be displayed when cljs namespace 'package' names start with an unacceptable javascript symbol
* CLJS-891: Defs in "parent" namespaces clash with "child" namespaces with the same name?
* CLJS-813: Warn about reserved JS keyword usage in namespace names
* CLJS-876: merged sourcemap doesn't account for output-wrapper
* CLJS-1062: Incorrect deftype/defrecord definition leads to complex error messages
* CLJS-1120: analyze-deps does not appear to work when analyzing analysis caches
* CLJS-1119: constant table emission logic is incorrect
* CLJS-977: implement IKVReduce in Subvec
* CLJS-1117: Dependencies in JARs don't use cached analysis
* CLJS-689: js/-Infinity munges to _Infinity
* CLJS-1114: browser REPL script loading race condition
* CLJS-1110: cljs.closure/watch needs to print errors to *err*
* CLJS-1101 cljs.test might throw when trying to detect file-and-line
* CLJS-1090: macros imported from clojure.core missing docs
* CLJS-1108: :modules :output-to needs to create directories
* CLJS-1095: UUID to implement IComparable
* CLJS-1096: Update js/Date -equiv and -compare semantics based on Date.valueOf() value
* CLJS-1102 clojure.test should print column number of exception when available
## 0.0-3058
### Enhancements
* browser REPL source mapping for Firefox, Safari, Chrome
* macro support in REPL special functions
* CLJS-897: AOT core.cljs CLJS-899: AOT cache core.cljs analysis
* CLJS-1078: Nashorn REPL should use persistent code cache
* CLJS-1079: add way to execute arbitrary fn upon watch build completion
* CLJS-1034: Support REPL-defined functions in stacktrace infrastructure
* source mapping for Rhino
* CLJS-1071: support symbol keys in :closure-defines
* CLJS-1014: Support Closure Defines under :none
* CLJS-1068: node target define
* CLJS-1069: Generic :jsdoc support
* CLJS-1030: add `cljs.repl/pst`
* add `cljs.repl/apropos`, `cljs.repl/find-doc`, `cljs.repl/dir`
* fix `cljs.analyzer.api/all-ns` docstring
* add `cljs.analyzer.api/ns-publics`
* CLJS-1055: cljs.repl/doc should support namespaces and special forms
* Add ClojureScript special form doc map
* CLJS-1054: add clojure.repl/source functionality to cljs.repl
* CLJS-1053: REPLs need import special fn
### Changes
* move :init up in cljs.repl/repl
* CLJS-1087: with-out-str unexpectedly affected by *print-newline*
* CLJS-1093: Better compiler defaults
* Bump deps latest Closure Compiler, Rhino 1.7R5, data.json 0.2.6, tool.reader 0.8.16
* more sensible error if cljs.repl/repl arguments after the first incorrectly supplied
* default REPLs to :cache-analysis true
* default :output-dir for Nashorn and Node REPLs
* change ES6 Map `get` support to take additional `not-found` parameter
* deprecate clojure.reflect namespace now that REPLs are significantly enhanced, static vars, etc.
### Fixes
* stop blowing away cljs.user in browser REPL so REPL fns/macros remain available
* CLJS-1098: Browser REPL needs to support :reload and :reload-all
* CLJS-1097: source map url for AOTed cljs.core is wrong
* CLJS-1094: read option not used by cljs.repl/repl*
* CLJS-1089: AOT analysis cache has bad :file paths
* CLJS-1057: Nashorn REPL should not use EDN rep for errors
* CLJS-1086: Keyword constants should have stable names
* CLJS-964: Redefining exists? does not emit a warning like redefining array? does.
* CLJS-937: local fn name should be lexically munged
* CLJS-1082: analysis memoization bug
* CLJS-978: Analysis caching doesn't account for constants table
* CLJS-865: remove `cljs.js-deps/goog-resource` hack
* CLJS-1077: analyze-deps infinite recursive loop
* manually set *e in Rhino on JS exception
* REPL options merging needs to be more disciplined
* CLJS-1072: Calling .hasOwnProperty("source") in Clojurescript's string/replace will break with ES6
* CLJS-1064: ex-info is not printable
* Fix REPLs emitting code into .repl directory
* CLJS-1066: Rhino REPL regression
* be more disciplined about ints in murmur3 code
* Node.js REPL should work even if :output-dir not supplied
* Nashorn environment doesn't supply console, setup printing correctly
## 0.0-2913
* Support custom :output-to for :cljs-base module
## 0.0-2911
### Enhancements
* CLJS-1042: Google Closure Modules :source-map support
* CLJS-1041: Google Closure Modules :foreign-libs support
* Google Closure Modules support via :modules
* CLJS-1040: Source-mapped script stack frames for the Nashorn repl
### Changes
* CLJS-960: On carriage return REPLs should always show new REPL prompt
* CLJS-941: Warn when a symbol is defined multiple times in a file
* REPLs now support parameterization a la clojure.main/repl
* all REPLs analyze cljs.core before entering loop
* can emit :closure-source-map option for preserving JS->JS map
* REPLs can now merge new REPL/compiler options via -setup
### Fixes
* CLJS-998: Nashorn REPL does not support require special fn
* CLJS-1052: Cannot require ns from within the ns at the REPL for reloading purposes
* CLJS-975: preserve :reload & :reload-all in ns macro sugar
* CLJS-1039: Under Emacs source directory watching triggers spurious recompilation
* CLJS-1046: static vars do not respect user compile time metadata
* CLJS-989: ClojureScript REPL loops on EOF signal
* fix DCE regression for trivial programs
* CLJS-1036: use getResources not findResources in get-upstream-deps*
## 0.0-2850
### Enhancements
* CLJS-1035: REPLs should support watch recompilation
### Fixes
* CLJS-1037: cls.analyzer/ns-dependents fails for common cases
## 0.0-2843
### Enhancements
* CLJS-1032: Node.js target should support :main
* require cljs.test macro ns in cljs.test to get macro inference goodness
* include :url entries to original sources in mapped stacktraces if it can be determined from the classpath
* support custom mapped stacktrace printing
* provide data oriented stacktrace mapping api
* CLJS-1025: make REPL source mapping infrastructure generic
* CLJS-1010: Printing hook for cljs-devtools
* CLJS-1016: make "..." marker configurable
### Changes
* CLJS-887: browser repl should serve CSS
* CLJS-1031: Get Closure Compiler over https in the bootstrap script
### Fixes
* cljs.nodejscli ns needs to set `goog.global` when `COMPILED` is true, this fixes the fundamental issues for ASYNC-110
* CLJS-967: "java.net.ConnectException: Connection refused" when running node repl
* pass relevant source map options in the incremental compile case
* add some missing source-map customization flags to optimized builds
* fix missed Rhino REPL regression, the surrounding REPL infrastructure creates cljs.user for us
* util.print has been deprecated in Node.js v0.12. Switch to console.log in Node.js REPLs.
* change `cljs.closure/watch` so it correctly watches all subdirectories do not recompile unless changed path is a file with .cljs or .js extension
## 0.0-2816
### Fixes
* CLJS-1001: reify did not elide reader metadata
## 0.0-2814
### Enhancements
* add simple source directory `cljs.closure/watch` watcher using java.nio
* CLJS-1022: Concatenate foreign dependencies safely
* CLJS-988: Support async testing in cljs.test
* CLJS-1018: Add support for cljs.core/*e Modify the JavaScript that is sent for evaluation to wrap in a try and then catch any exception thrown, assign it to *e, and then rethrow.
* CLJS-1012: Correct behavior when *print-length* is set to 0
* Added new :closure-extra-annotations compiler option allowing to define extra JSDoc annotation used by closure libraries.
* Mirrored source map support APIs on server/client
* Unified source mapping support in REPLs
* Nashorn REPL (thanks Pieter van Prooijen)
### Fixes
* CLJS-1023: regression, macro-autoload-ns? and ns-dependents need to throw on cyclic dependencies
* fix require with browser REPL, set base path to "goog/"
* CLJS-1020: off by one error in REPL source map support
* Node.js 0.12 support
* browser REPL needs to respect :output-dir
* CLJS-1006: Implicit dependency of clojure.browser.repl on cljs.repl
* CLJS-1005: Browser REPL creates 'out' directory no matter what
* CLJS-1003: fix cljs.test run-tests do-report :summary issues
* CLJS-1003: Cannot pass custom env to run-tests
* Windows Node.js REPL issues
## 0.0-2760
### Fixes
* ns spec handling regression
## 0.0-2758
### Fixes
* fix autoload macro enhancement
## 0.0-2755
### Enhancements
* CLJS-948: simplify macro usage
### Fixes
* CLJS-927: real incremental compilation
* Browser REPL regressions
* CLJS-991: Wrong inference - inconsistent behavior?
* CLJS-993: binding macro returns non-nil with empty body
* CLJS-972: Node.js REPL eats errors in required ns when using require
* CLJS-986: Add :target to the list of build options that should trigger recompilation
* CLJS-976: Node REPL breaks from uncaught exceptions
## 0.0-2740
### Changes
* local :foreign-libs can precisely override upstream :foreign-libs
* :foreign-libs :file-min is only used under :advanced optimizations
* file generated by supplying :main now idempotent
* more informative error if :main incorrectly supplied
### Fixes
* many fixes around file/resource handling for Windows users
## 0.0-2727
### Fixes
* Allow :main script imports to be configured via :asset-path
## 0.0-2725
### Fixes
* Fix Node.js support regression
## 0.0-2723
### Enhancements
* CLJS-851: simplify :none script inclusion if :main supplied
* CLJS-983: make ExceptionInfo printable
### Fixes
## 0.0-2719
### Changes
* CLJS-985: make ex-info not lose stack information
* CLJS-984: Update Node.js REPL support to use public API
* CLJS-963: do not bother computing goog/dep.js under :none
### Fixes
* CLJS-982: Var derefing should respect Clojure semantics
* CLJS-980: ClojureScript REPL stacktraces overrun prompt in many cases
* CLJS-979: ClojureScript REPL needs error handling for the special functions
* CLJS-971: :reload should work for require-macros special fn
* CLJS-936: Multi arity bitwise operators
* CLJS-962: fix inconsistent hashing of empty collections
## 0.0-2665
### Changes
* REPL -setup now must take opts
* CLJS-916: Optimize use of js-arguments in array and variadic
functions
* special case `'cljs.core/unquote`
* CLJS-945: Compile core with :static-fns true by default
* CLJS-958: Node.js REPL: Upon error, last successfully item printed
## 0.0-2657
### Changes
* Add require-macros REPL special fn
## 0.0-2655
### Changes
* add defonced cljs.core/*loaded-libs* dynamic var
* cljs.core/*print-fn* is now defonced
* throw on (var foo) when foo is not defined
* cljs.analyzer.api/resolve matches cljs.core/resolve if
var doesn't exist return nil
### Fixes
* require needs to respect Clojure semantics, do not
reload unless requested
* add ns/require support for :reload & :reload-all
## 0.0-2644
### Fixes
* CLJS-953: require REPL special fn can only take one argument
* CLJS-952: Bad type hinting on bit-test
* CLJS-947: REPL require of goog namespaces does not work
* CLJS-951: goog.require emitted multiple times under Node.js REPL
* CLJS-946: goog.require in REPLs will not reload recompiled libs
* CLJS-950: Revert adding compiled-by string to CLJS deps file
* CLJS-929: Minor fixes to test script
* CLJS-946: goog.require in REPLs will not reload recompiled libs
## 0.0-2629
### Enhancements
* Add Node.js REPL
* REPLs can now reuse build/analysis caching
* in-ns, require, doc support in REPLs
### Changes
* add :verbose flag to compiler to output compiler activity
* add *load-macros* to cljs.analyzer to optionally disable macro loading
* errors during ns parsing always through
* `cljs.util/compiled-by-version` needs to always return String
* pin Closure Compiler in bootstrap script
* refactor cljs.build.api namespace
### Fixes
* add cljs.test/are macro
* CLJS-931 : cljs.compiler/requires-compilation? ignores changes to build options
* CLJS-943: REPL require special fn is brittle
* CLJS-941: Warn when a symbol is defined multiple times in a file
* CLJS-942: Randomized port for Node.js REPL if port not specified
* CLJS-675: QuickStart example not working properly
* CLJS-935: script/noderepljs leaves node running after exit
* CLJS-918: preserve :arglists metadata in analysis cache
* CLJS-907: False positives from arithmetic checks
* CLJS-919 compare-and-set! relies on Atom record structure instead of protocols
* CLJS-920 add-watch/remove-watch should return reference, as in Clojure
* CLJS-921: cljs.repl/doc output includes namespace twice
## 0.0-2511
### Enhancements
* analysis caching via :cache-analysis build flag
## 0.0-2505
### Changes
* Stop generating random files for IJavaScript Strings
* added :source-map-timestamp build flag to get cache busting source
map urls
* Enhancements to bootstrap script
* Stop warning about deps.cljs usage
### Fixes
* Fix Node.js source mapping regression introduced by commit 254e548
* CLJS-914: thrown-with-msg? is unable to get message of exception
* CLJS-915: On empty call, List and PersistentQueue do not retain meta, sorted-set/sorted map do not retain comparator
## 0.0-2498
### Fixes
* Support cljs.test/use-fixtures
## 0.0-2496
### Enhancements
* cljs.test added, mirrors clojure.test
* New cljs.analyzer.api namespace for easier access to analysis info from macros
* New cljs.analyzer.api namespace for easier access to analysis info from macros
* Support :test metadata on vars
* Support static vars
* cljs.source-map for client side source mapping
* expose ClojureScript :warnings build option
* CLJS-909: Add stable api for consumers of compiler data.
### Changes
* convert all ClojureScript tests to cljs.test
* add volatile! from Clojure 1.7
* stateful transducers use volatile!
* added `js-debugger` macro, compiles to "debugger;"
* CLJS-892: Improve performance of compare-symbols/compare-keywords
* CLJS-696: remove arguments usage from defrecord constructor
* unroll `partial`, copy & pasted from Clojure core.clj
* optimize clojure.string/join
### Fixes
* fix `cljs.nodejs/enable-util-print!`, incorrectly monkey patched `cjls.core/string-print` instead of setting `cljs.core/*print-fn*`
* cljs.reader bug, '/ incorrectly read
* avoid emitting the same goog.require
## 0.0-2411
### Enhancements
* forcing source maps to load for dynamic js reloads
* All ISeqable types are now ES6 iterable
* CLJS-863: Invalid arity error when calling 0-arity multimethod
* CLJS-622: better error reporting for zero arity protocol methods
* CLJS-506: expose more Closure minification knobs
### Changes
* CLJS-807: Emitter cannot emit BigInt or BigDecimal
* CLJS-749: Ignore .repl-* given that CLJS version is appended by default.
* CLJS-749: Append CLJS version to browser repl-env
* CLJS-749: *clojurescript-version* is unbound return empty string
* implement INamed for multi-method
* revert CLJS-801
* CLJS-888: Omit redundant {} around emitted recur
* CLJS-888: Better placement of newlines in emitter
* Join preambles with newline line to catch cases with files without newlines.
* add js-in interop macro
* Add nthrest
* CLJS-510: Throw error when :output-wrapper and :optimizations :whitespace combined
* CLJS-875: bump tools.reader dep to 0.8.10
* CLJS-879: add `update` from Clojure 1.7
* CLJS-857: change deftype*/defrecord* special forms to include their inline methods decls
### Fixes
* CLJS-885: relax type inference around numbers
* fix var resolution bug pointed out by Brandon Bloom
* CLJS-853: propagate read-time metadata on fn and reify forms at runtime
* CLJS-716: support hashing of JavaScript dates
* CLJS-814: clojure.string/reverse breaks surrogate pairs
* Recursively check IEncodeClojure in js->clj
* CLJS-873: non-higher-order calls to array-map should return PAMs
* CLJS-881: check for duplicate keys in array-map
* select-keys did not preserve metadata
## 0.0-2371
### Fixes
* CLJS-862: fix inconsistent re-pattern
* CLJS-866: Faulty ns macro desugaring
* CLJS-869: When preamble is not found in source directory, compiler does not report it
## 0.0-2356
### Fixes
* fix var analysis so that some.ns/foo.bar is handled correctly
* CLJS-854: cljs.reader could not read numbers under IE8
## 0.0-2342
### Changes
* depend on tools.reader 0.8.9
## 0.0-2341
### Enhancements
* transducers
### Fixes
* CLJS-704: warn if protocol extended to type multiple times in extend-type
* CLJS-702: warn if protocol doesn't match declared
* CLJS-859: use https for the bootstrap script
* CLJS-855: combinatorial code generation under advanced
* CLJS-858: resolve-existing var does not check vars outside current ns
* CLJS-852: same group-by as Clojure
* CLJS-847: Safari toString fix
* CLJS-846: preserve namespace metadata
## 0.0-2322
### Fixes
* CLJS-839: Mobile Safari Math.imul issue
* CLJS-845: incorrect behavior of `sequence` when given multiple collections
* count check in equiv-sequential if both arguments are ICounted
* only keep the param names when storing :method-params instead of the
entire param AST
* preserve var metadata for deftype* and defrecord*
* preserve var metadata when creating deftype/record factory fns
* CLJS-831: Extending EventType to js/Element breaks Nashorn
## 0.0-2311
### Fixes
* fix typo which broke browser REPL
* lazier seq iterators a la CLJ-1497
## 0.0-2307
### Enhancement
* Allow multi-arity anonymous fns to optimize
## 0.0-2301
### Changes
* transducers
### Fixes
* eliminate dead branches in conditionals to prevent Closure warnings
* bad var resolution if when local contained .
## 0.0-2280
### Changes
* depend on latest org.clojure/google-closure-library
### Fixes
* fix constants table bug where keywords did not include precomputed hash-code
## 0.0-2277
## Enhancements
* All IEquiv implementor now export equiv Object method
## Fixes
* CLJS-824: Unsigned hash for keywords produced via keyword fn
* CLJS-827: CLJS-827: wrap macro expansion in try/catch
* CLJS-826: fix broken closure release script
* CLJS-825: conflict between node js support files
* typo in unchecked-subtract-int
## 0.0-2268
### Changes
* Experimental support for ES6 Map/Set interface
### Fixes
* CLJS-823: use non-native imul in Safari
* CLJS-810: re-matches returns [] if string is nil
## 0.0-2261
### Changes
* Dependency on Clojure 1.6.0
### Enhancements
* Murmur3 hashing for collections
### Fixes
* CLJS-817: Warning on use of undeclared var when creating recursive definition
* CLJS-819: cljs.reader cannot handle character classes beginning with slashes in regex literals
* CLJS-820: Missing invoke without arguments in MetaFn
* CLJS-816: clojure.set/rename-keys accidentally deletes keys
## 0.0-2234
### Fixes
* CLJS-812: Recur from case statement generated invalid JavaScript
* CLJS-811: use the correct class loader in cljs.js-deps/goog-resource
* fix fns with metadata under advanced compilation
* CLJS-809: dissoc :file metadata introduced by tools.reader 0.8.4
* mark cljs.reader vars as ^:dynamic to avoid compiler warnings
================================================
FILE: ci/install_jsc.sh
================================================
#!/usr/bin/env bash
if [ ! -d WebKit ]
then
git clone -b Safari-611.1.5.1 --depth=1 https://github.com/WebKit/WebKit.git WebKit;
cd WebKit;
Tools/Scripts/build-jsc --jsc-only;
cd ..
fi
================================================
FILE: deps.edn
================================================
{:paths ["src/main/clojure" "src/main/cljs" "resources"]
:deps
{com.google.javascript/closure-compiler {:mvn/version "v20250820"}
com.cognitect/transit-java {:mvn/version "1.0.362"}
org.clojure/clojure {:mvn/version "1.10.0"}
org.clojure/core.specs.alpha {:mvn/version "0.1.24"}
org.clojure/google-closure-library {:mvn/version "0.0-20250515-f04e4c0e"}
org.clojure/spec.alpha {:mvn/version "0.1.143"}
org.clojure/tools.reader {:mvn/version "1.3.6"}
org.clojure/test.check {:mvn/version "1.1.1"}}
:aliases
{:cljs-repl {:extra-paths ["src/test/cljs"]
:main-opts ["-m" "cljs.main" "-re" "node" "-d" ".cljs_repl" "-r"]}
:cljs-brepl {:extra-paths ["src/test/cljs"]
:main-opts ["-m" "cljs.main" "-d" ".cljs_brepl" "-r"]}
:cljs-lite-repl {:extra-paths ["src/test/cljs"]
:main-opts ["-m" "cljs.main" "-co" "{:lite-mode true}" "-re" "node" "-d" ".cljs_lite_repl" "-r"]}
:cli.test.run {:extra-paths ["src/test/cljs_cli"]
:main-opts ["-i" "src/test/cljs_cli/cljs_cli/test_runner.clj"
"-e" "(cljs-cli.test-runner/-main)"]}
:compiler.test {:extra-paths ["src/test/cljs" "src/test/cljs_build" "src/test/cljs_cp"
"src/test/clojure" "src/test/self"]
:extra-deps {org.clojure/spec.alpha {:mvn/version "0.5.238"}}}
:compiler.test.run {:main-opts ["-i" "src/test/clojure/cljs/test_runner.clj"
"-e" "(cljs.test-runner/-main)"]}
:runtime.test.build {:extra-paths ["src/test/cljs"]
:main-opts ["-m" "cljs.main" "-co" "resources/test.edn" "-c"]}
:lite.test.build {:extra-paths ["src/test/cljs"]
:main-opts ["-m" "cljs.main" "-co" "resources/lite_test.edn" "-c"]}
:selfhost.test.build {:extra-paths ["src/test/self"]
:main-opts ["-m" "cljs.main" "-co" "resources/self_host_test.edn" "-c"]}
:selfparity.test.build {:extra-paths ["src/test/self"]
:main-opts ["-i" "src/test/self/self_parity/setup.clj"
"-e" "(self-parity.setup/-main)"
"-m" "cljs.main" "-co" "resources/self_parity_test.edn" "-c"]}
:uberjar {:extra-deps {com.github.seancorfield/depstar {:mvn/version "2.0.193"}}
:exec-fn hf.depstar/uberjar
:exec-args {:aot true}}}}
================================================
FILE: devnotes/README.org
================================================
* ClojureScript
- What: Clojure running on Javascript VMs
- Why: Clojure rocks, Javascript reaches
- When: Now! - a compiler exists, we need libraries and tool integration. Full day sessions 6/10 and 6/17
- Where: In stealth mode 'here' at Clojure/core
- How: ClojureScript -> ClojureScript-Compiler -> Javascript -> [Google-Closure-JS->JS-Compiler -> Optimized-Javascript] ->Browser/V8/Node/PhoneGap...
- Who: You, if you're interested in:
- How hand-written recursive descent compilers work (the ClojureScript compiler is about 1/6 the code of the CoffeeScript compiler)
- Writing libraries using Clojure's latest type and polymorphism tools
- How Clojure works - its data structures and abstractions
- Extending the reach of Clojure
- Google's industrial-strength JS tools
- Investigating how powerful code-emitting tools can change the face
of web and mobile development...
* Getting Started
- Clone the repo
- cd clojurescript
- run script/bootstrap
- copy clojure.jar into /lib
- script/repl will start a properly-classpathed repl
* Starting the clojurescript repl
- (require '[cljs.compiler :as comp])
- (def jse (comp/repl-env))
- (comp/repl jse)
* Reading list
- If you are interested in participating, please read:
- [[http://www.amazon.com/Closure-Definitive-Guide-Michael-Bolin/dp/1449381871][Closure-Definitive-Guide-Michael-Bolin]]
- and maybe:
- [[http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742][JavaScript-Good-Parts-Douglas-Crockford]]
- [[http://www.amazon.com/Performance-JavaScript-Faster-Application-Interfaces/dp/059680279X][Performance-JavaScript-Faster-Application-Interfaces]]
- [[http://www.amazon.com/JavaScript-Patterns-Stoyan-Stefanov/dp/0596806752][JavaScript-Patterns-Stoyan-Stefanov]]
- Those looking to cram tonight can get the O'Reilly Closure book on kindle above or ebook directly:
- [[http://oreilly.com/catalog/0636920001416/]]
* More info
[[https://github.com/relevance/clojurescript/wiki][Check the Wiki]]
================================================
FILE: devnotes/bcrepl.org
================================================
* ClojureScript browser connected REPL
** send cljs compiler output to the browser to be evaluated
** send results back to the command line process to be printed
** side effects happen in the browser
** abstract communication away using goog library
*** Goog abstraction for websockets? Ideal!
*** Polling? It will work everywhere.
*** Ideally an abstraction over both that prefers websockets but doesn't fail and doesn't complain loudly.
** evaluation daemon for the browser
** launch browser
** transparent update of bound symbols? We should test.
** brepl has its own solution for deps, we'd like to tie into the ClojureScript dependency story
** require mechanisms are out; the source that forms the repl's environment will need to be updated and the page reloaded
================================================
FILE: devnotes/cljs.org
================================================
* ClojureScript
* Rationale
** What
*** Compiler that compiles (a subset of?) Clojure to Javascript
** Why?
*** Because js is the only universally available client target
**** and can't be supplanted due to its browser integration and installed base
**** yet isn't very good, expressive, concise, or robust
**** but JS engines continue to get lots of optimization love, and are now quite capable perf-wise
*** Use same skillset and libs for client and server
**** only other similar options are:
***** JS native client, JS (e.g. node) server
****** node still much less powerful than JVM, and might be a mere fad
***** Java (GWT) client, Java native server
****** GWT has lots of baggage due to semantic mismatches etc
****** but familiar tooling if already a Java dev
***** esoteric, open question as to skills and libs:
****** [[http://clamato.net/][Clamato Smalltalk]]
****** [[http://www.wescheme.org/][Moby Scheme]]
*** Clojure semantics can fit well on JS
**** i.e. defn/type/protocol won't fight with js core model
*** ClojureJS arguably becomes most powerful lang on client
**** Robust, simple Clojure model
**** Macros etc
*** Might be best way to run Clojure on mobile
*** js a possible path to delivering Clojure libs to C-linkage clients
**** via embedded Google V8 js engine
**** somewhat speculative, but considering for M
**** V8 wrappers exist for Python, Ruby, PHP etc
** How?
*** Compiler written in Clojure, generates (readable?) JS
*** Optionally run that JS through Google Closure js->js compiler
**** for minification, dead code elimination etc
*** Use Google Closure js library where needed for implementation support
**** e.g. goog.math has Long arithmetic
**** module system
**** use gclosure annotations for stronger type checking or better code gen?
**** dependency system
*** Macros written in Clojure proper, run by the compiler
**** stick to subset in macros if eval supported
*** Any runtime support written completely in itself
**** make deftype and protocols work early
** Non-objectives
*** complete Clojure
**** feel free to subset, especially at first
**** but try to make anything present in both work identically
*** compiling e.g. core.clj as-is
**** don't want to touch Clojure itself for this
**** bootstrap will differ anyway
** Ancillary benefits
*** Analysis component of compiler might serve Clojure-in-Clojure, or other tooling
**** maybe - we'll need far less analysis support in js than we do in Java
*** Boost for Clojure adoption due to increased reach
*** Power tool for exploring next-gen client approach
* Implementation
** Primitives
*** DONE def
*** fn*
**** DONE basics
**** DONE recur
**** DONE variable arity
**** DONE arity overloading
**** closures shouldn't map directly to js closures? - no, they should
***** they capture entire surrounding environment
****** hearsay, V8 already better
***** premature optimization to avoid that? - yes
***** shouldn't js engines do that for us? - yes
***** try goog.partial? - not for this
**** variable arity how?
***** switch on arguments.length
*** DONE if
**** need to match Clojure semantics (nil/false)
***** must deal with undefined (group with nil/false?)
*** DONE let*
**** must fix local scoping problem
***** nested fns or renaming?
**** let* semantics
*** DONE do
**** as with Java, not an expression
**** doFn(...) -> returns last arg
***** must alloc array for arguments?
*** TODO global
**** use 'var for this?
***** already Clojure special op
***** but wrong semantics, (var x) is *ns*-relative
***** no true unqualified globals in Clojure
*** DONE recur
**** to loop
**** to fn head
***** can't do in single pass
*** DONE invoke
*** DONE macros
*** DONE ns
**** (ns my.ns (:require your.ns ...) (:macros a-clojure-ns ...))
***** aliases?
**** =>
***** make a clojure ns? cljs.my.ns?
***** goog.provide('my.ns'); goog.require('your.ns');
***** (
*** DONE deftype*
**** maps to prototype/contructor combo
**** deftype macro is deftype* + extend-type
***** extend-type with ::fields meta on param vectors
*** TODO reify*
**** yes, for one-off protocol impls
**** no ctor created, just put impls on object
***** can share code with putting impls on prototype?
*** DONE defprotocol*
**** not primitive in Clojure proper
**** extend, when given ctor, modifies prototype with slot
***** slot is ns-qualified
***** what about core prototypes - Object, Array et al (String, Number, Boolean, Function)?
****** poor citizenship to modify these?
****** Object different in that it is used as map
****** nested window scope issues?
**** protocol fns just turn (my.ns/foo x a b c) into x["my.ns/foo"](a, b ,c)
***** foo(x, a, b, c)
****** must pass target
***** better - x.my$ns$foo(a, b ,c)
****** can be minified
*** DONE extend-type
*** defrecord?
**** any way to get (:foo x) => x.foo?
***** beware GClojure renaming
*** DONE new
**** what to do? ordinary invoke works fine
***** new could be aliased, not special form then
***** not ordinary - first arg not evaluated
****** but should be in JS since new is an operator on a function, not a name
**** new itself shouldn't be evaluated, won't pass fnOf
**** (my.ns.Blah. x y z) - just macroexpander stuff
**** (Blah. x y z) - requires import and registry
***** class aliases a bigger issue, will there be more conflicts?
***** any interpretation will fit only one ns strategy (e.g. gclosure's, and thus ClojureScript's)
***** start without this
*** DONE dot
**** field/zero-arg-method distinguished how?
***** not, just support scoped var and be done
*** DONE set! (assign)
**** same binding rules?
***** no
**** or just allow assign to scoped 'vars'?
*** DONE name munging
**** special chars
**** js reserved words
*** DONE (js* code-string)
**** with name escaping
*** TODO exceptions
**** throw
**** try
**** catch
***** won't have exception type
**** finally
*** quote?
*** TODO Evaluated collections
**** Map
**** Vector
*** vars?
*** case?
*** callable non-function types?
**** seems not possible portably
**** could do with __proto__ (non-standard, all but IE support, even IE9 doesn't)
**** how would Clojure feel without callable collections and keywords?
**** could do with conditional every invocation:
***** (f instanceof Function?f:f.cljs_lang_invoke)(args)
***** but where to put f (in expr context)?
****** needs helper fn
****** fnOf(f)(args)
******* function fnOf(x){return (f instanceof Function?f:f.cljs_lang_invoke);}
****** i.e. every call is 2 calls
******* tracing jit will inline?
** Translation
| Op | JS | Notes | Questions |
|----------------------------------+------------------------------------+-------------------------------------------+------------------------------------------------------|
| (def x 42) | cljs.my.ns['x'] = 42 | Following gclosure module system | No vars? Compilation-time representation of ns? |
| | cljs.my.ns.x = 42 | only this one will get minified | but this precludes special chars in names |
| | | | def returns var in Clojure, no var here |
|----------------------------------+------------------------------------+-------------------------------------------+------------------------------------------------------|
| (fn [x y] ...) | (function (x, y) {...}) | never do named function, use anon + def | Use for closures too? |
| (fn [x y] ... (recur...) | | rewrite as fn + nested loop | require analysis to transmit recur fact up |
| | | | rewrite when? |
| | | block always in return context | access to this for methods? |
|----------------------------------+------------------------------------+-------------------------------------------+------------------------------------------------------|
| (if test then else) | (test ? then : else) | | |
|----------------------------------+------------------------------------+-------------------------------------------+------------------------------------------------------|
| (do e1 e2 e3) | cljs.dofn(e1,e2,e3) | dofn returns last arg, allocs array? | requires js bootstrap file? |
| | | no, forces all to be exprs | no fn needed when not expr context |
| | (function () {e1;e2;return e3;})() | | |
| | | expr context becomes return except when | |
| | | single expr | |
|----------------------------------+------------------------------------+-------------------------------------------+------------------------------------------------------|
| (let [x 1 y 2] ...) | (function [x,y] {...})(1, 2) | need to create nested functions for let* | how to detect ref to earlier? |
| | var x__42 = 1;var y__43 = 2; ... | var numbering | statement/expr dichotomy if inline? |
| | (function [] | could wrap in no-arg function always | needed for expr anyhow |
| | {var x = 1; var y = 2; ...})() | if always wrapped, don't need numbers? | can we do var x = 42; var x = 43? |
| | | might still when nested | yes, but not var x = 42 ...nesting... var x = x |
| | | | |
| | | expr always becomes return context | |
|----------------------------------+------------------------------------+-------------------------------------------+------------------------------------------------------|
| (. x y) | x.y or x.y()? | no type info to distinguish | bigger problem, both calling and retrieving |
| | | | fn in slot are viable, Clojure says method wins |
| (. x y ...) | x.y(...) | | |
| | | | |
| (: x y) ? | x.y | | make all calls, add special field accessor |
| x.y | x.y | . not used for classes in JS | so not global, but scoped? |
| | | can't test from Clojure | but would want resolution of first segment to locals |
| | | | what do macros use? |
| | | | |
| (. x (y)) | already defined for this case | wasn't going to carry this into cljs, but | no arg == field, penalize no-arg methods? |
| ((. x y)) | more
gitextract_7qk_jsor/
├── .github/
│ └── workflows/
│ ├── release.yml
│ └── test.yaml
├── .gitignore
├── .travis.yml
├── LICENSE
├── README.md
├── appveyor.yml
├── ast-ref/
│ ├── ast-ref.edn
│ ├── buildref.sh
│ ├── gen-ref.clj
│ └── quickref.html.tpl
├── benchmark/
│ └── cljs/
│ └── benchmark_runner.cljs
├── bin/
│ ├── cljsc
│ ├── cljsc.bat
│ └── cljsc.clj
├── build.edn
├── changes.md
├── ci/
│ └── install_jsc.sh
├── deps.edn
├── devnotes/
│ ├── README.org
│ ├── bcrepl.org
│ ├── cljs.org
│ ├── corelib.org
│ ├── day1.org
│ ├── day2.org
│ ├── talk.org
│ ├── testing
│ └── todo.org
├── epl-v10.html
├── pom.template.xml
├── pom.xml
├── project.clj
├── resources/
│ ├── lite_test.edn
│ ├── self_host_test.edn
│ ├── self_parity_test.edn
│ └── test.edn
├── samples/
│ ├── dom/
│ │ ├── .gitignore
│ │ ├── src/
│ │ │ └── dom/
│ │ │ └── test.cljs
│ │ └── test.html
│ ├── hello/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── hello-dev.html
│ │ ├── hello.html
│ │ └── src/
│ │ └── hello/
│ │ ├── core.cljs
│ │ └── foo/
│ │ └── bar.cljs
│ ├── hello-js/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── externed-lib.js
│ │ ├── externs.js
│ │ ├── hello-extern.html
│ │ ├── hello-js-dev.html
│ │ ├── hello-js.html
│ │ ├── my-external-lib.js
│ │ └── src/
│ │ └── hello-js/
│ │ ├── core.cljs
│ │ └── extern-example.cljs
│ ├── nodehello.cljs
│ ├── nodels.cljs
│ ├── repl/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── index.html
│ │ ├── repl.clj
│ │ └── src/
│ │ └── repl/
│ │ ├── foo.cljs
│ │ └── test.cljs
│ ├── string-requires-npm-deps/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── build.clj
│ │ └── src/
│ │ └── foo/
│ │ └── core.cljs
│ └── twitterbuzz/
│ ├── .gitignore
│ ├── README.md
│ ├── index-advanced.html
│ ├── index.html
│ ├── reset.css
│ ├── src/
│ │ └── twitterbuzz/
│ │ ├── anneal.cljs
│ │ ├── core.cljs
│ │ ├── dom-helpers.cljs
│ │ ├── layout.cljs
│ │ ├── leaderboard.cljs
│ │ ├── radial.cljs
│ │ ├── showgraph.cljs
│ │ └── timeline.cljs
│ ├── style.css
│ ├── test_data.txt
│ └── tweet_maps.txt
├── script/
│ ├── aot.clj
│ ├── aot_core
│ ├── benchmark
│ ├── bootstrap
│ ├── bootstrap.ps1
│ ├── browser-repl
│ ├── browser_repl.clj
│ ├── build
│ ├── clean
│ ├── compile
│ ├── noderepljs
│ ├── repl
│ ├── repl.bat
│ ├── repl.clj
│ ├── revision
│ ├── self-compile
│ ├── test
│ ├── test-cli
│ ├── test-compile
│ ├── test-self-host
│ ├── test-self-parity
│ ├── test-simple
│ ├── test.ps1
│ ├── uberjar
│ └── vendorize_deps
└── src/
├── assembly/
│ ├── aot.xml
│ └── slim.xml
├── main/
│ ├── cljs/
│ │ ├── cljs/
│ │ │ ├── analyzer/
│ │ │ │ ├── passes/
│ │ │ │ │ ├── and_or.cljc
│ │ │ │ │ └── lite.cljc
│ │ │ │ └── passes.cljc
│ │ │ ├── bootstrap_nodejs.js
│ │ │ ├── core/
│ │ │ │ └── specs/
│ │ │ │ ├── alpha.cljc
│ │ │ │ └── alpha.cljs
│ │ │ ├── core.cljs
│ │ │ ├── externs.js
│ │ │ ├── imul.js
│ │ │ ├── js.clj
│ │ │ ├── js.cljs
│ │ │ ├── loader.cljs
│ │ │ ├── main.clj
│ │ │ ├── math.cljs
│ │ │ ├── module_deps.js
│ │ │ ├── nodejs.cljs
│ │ │ ├── nodejs_externs.js
│ │ │ ├── nodejscli.cljs
│ │ │ ├── pprint.cljc
│ │ │ ├── pprint.cljs
│ │ │ ├── proxy/
│ │ │ │ └── impl.cljs
│ │ │ ├── proxy.cljs
│ │ │ ├── reader.clj
│ │ │ ├── reader.cljs
│ │ │ ├── repl.cljs
│ │ │ ├── source_map/
│ │ │ │ ├── base64.cljs
│ │ │ │ └── base64_vlq.cljs
│ │ │ ├── source_map.cljs
│ │ │ ├── spec/
│ │ │ │ ├── alpha.cljc
│ │ │ │ ├── alpha.cljs
│ │ │ │ ├── gen/
│ │ │ │ │ ├── alpha.cljc
│ │ │ │ │ └── alpha.cljs
│ │ │ │ └── test/
│ │ │ │ ├── alpha.cljc
│ │ │ │ └── alpha.cljs
│ │ │ ├── stacktrace.cljc
│ │ │ ├── test.cljc
│ │ │ └── test.cljs
│ │ ├── clojure/
│ │ │ ├── browser/
│ │ │ │ ├── dom.cljs
│ │ │ │ ├── event.cljs
│ │ │ │ ├── net.cljs
│ │ │ │ ├── repl/
│ │ │ │ │ └── preload.cljs
│ │ │ │ └── repl.cljs
│ │ │ ├── core/
│ │ │ │ ├── protocols.cljs
│ │ │ │ └── reducers.cljs
│ │ │ ├── data.cljs
│ │ │ ├── datafy.cljs
│ │ │ ├── edn.cljs
│ │ │ ├── reflect.cljs
│ │ │ ├── set.cljs
│ │ │ ├── string.cljs
│ │ │ ├── walk.cljs
│ │ │ └── zip.cljs
│ │ └── process/
│ │ └── env.cljs
│ └── clojure/
│ └── cljs/
│ ├── analyzer/
│ │ ├── api.cljc
│ │ ├── impl/
│ │ │ └── namespaces.cljc
│ │ ├── impl.cljc
│ │ ├── macros.clj
│ │ └── utils.clj
│ ├── analyzer.cljc
│ ├── build/
│ │ └── api.clj
│ ├── cli.clj
│ ├── closure.clj
│ ├── compiler/
│ │ ├── api.clj
│ │ └── macros.clj
│ ├── compiler.cljc
│ ├── core/
│ │ ├── macros.clj
│ │ └── server.clj
│ ├── core.cljc
│ ├── env/
│ │ └── macros.clj
│ ├── env.cljc
│ ├── externs.clj
│ ├── foreign/
│ │ └── node.clj
│ ├── instant.clj
│ ├── js_deps.cljc
│ ├── module_graph.cljc
│ ├── repl/
│ │ ├── bootstrap.clj
│ │ ├── browser.clj
│ │ ├── node.clj
│ │ ├── node_repl.js
│ │ ├── reflect.clj
│ │ └── server.clj
│ ├── repl.cljc
│ ├── server/
│ │ ├── browser.clj
│ │ └── node.clj
│ ├── source_map/
│ │ ├── base64.clj
│ │ └── base64_vlq.clj
│ ├── source_map.clj
│ ├── support.cljc
│ ├── tagged_literals.cljc
│ ├── util.cljc
│ └── vendor/
│ ├── bridge.clj
│ ├── clojure/
│ │ ├── data/
│ │ │ └── json.clj
│ │ └── tools/
│ │ ├── reader/
│ │ │ ├── default_data_readers.clj
│ │ │ ├── edn.clj
│ │ │ ├── impl/
│ │ │ │ ├── commons.clj
│ │ │ │ ├── errors.clj
│ │ │ │ ├── inspect.clj
│ │ │ │ └── utils.clj
│ │ │ └── reader_types.clj
│ │ └── reader.clj
│ └── cognitect/
│ └── transit.clj
└── test/
├── cljs/
│ ├── Circle-min.js
│ ├── Circle.js
│ ├── baz.cljs
│ ├── calculator.js
│ ├── calculator_global.js
│ ├── cljs/
│ │ ├── apply_test.cljs
│ │ ├── array_access/
│ │ │ ├── alpha.cljs
│ │ │ ├── beta.cljs
│ │ │ └── helper.clj
│ │ ├── array_access_test.cljc
│ │ ├── array_access_test.cljs
│ │ ├── async_await_test.cljs
│ │ ├── baz.cljs
│ │ ├── binding_test.cljs
│ │ ├── binding_test_other_ns.cljs
│ │ ├── chunked_seq.cljs
│ │ ├── clojure_alias_test.cljs
│ │ ├── collections_test.cljs
│ │ ├── core_test.cljs
│ │ ├── destructuring_test.cljs
│ │ ├── eval_test.cljs
│ │ ├── extend_to_native_test.cljs
│ │ ├── foo/
│ │ │ └── ns_shadow_test.cljs
│ │ ├── hash_map_test.cljs
│ │ ├── hash_set_test.cljs
│ │ ├── hashing_test.cljs
│ │ ├── import_test.cljs
│ │ ├── inference_test.cljs
│ │ ├── inference_util.clj
│ │ ├── interop_test.cljs
│ │ ├── invoke_test.cljs
│ │ ├── iterator_test.cljs
│ │ ├── keyword_macros.clj
│ │ ├── keyword_other.cljs
│ │ ├── keyword_test.cljs
│ │ ├── letfn_test.cljs
│ │ ├── lite_collections_test.cljs
│ │ ├── macro_test/
│ │ │ ├── cljs2261.clj
│ │ │ ├── cljs2261.cljs
│ │ │ ├── cljs2852.clj
│ │ │ └── macros.clj
│ │ ├── macro_test.cljs
│ │ ├── map_entry_test.cljs
│ │ ├── metadata_test.cljc
│ │ ├── new_new_test.cljs
│ │ ├── npm_deps_test.cljs
│ │ ├── ns_test/
│ │ │ ├── bar.cljs
│ │ │ └── foo.cljs
│ │ ├── ns_test.cljs
│ │ ├── other_functions_test.cljs
│ │ ├── parse_test.cljs
│ │ ├── pprint_test.clj
│ │ ├── pprint_test.cljs
│ │ ├── predicates_test.cljs
│ │ ├── primitives_test.cljs
│ │ ├── printing_test.cljs
│ │ ├── proxy_test.cljs
│ │ ├── qualified_method_test.cljs
│ │ ├── reader_test.cljs
│ │ ├── recur_test.cljs
│ │ ├── reducers_test.cljs
│ │ ├── repl_test.cljs
│ │ ├── seqs_test.cljs
│ │ ├── set_equiv_test.cljs
│ │ ├── spec/
│ │ │ ├── test/
│ │ │ │ ├── test_macros.cljc
│ │ │ │ ├── test_ns1.cljs
│ │ │ │ └── test_ns2.cljs
│ │ │ └── test_test.cljs
│ │ ├── spec_test.cljs
│ │ ├── specials_test.cljs
│ │ ├── syntax_quote_test.cljs
│ │ ├── tagged_literals_test.cljs
│ │ ├── test_test.cljs
│ │ ├── top_level.cljs
│ │ ├── var_test.cljs
│ │ └── walk_test.cljs
│ ├── clojure/
│ │ ├── data_test.cljs
│ │ ├── datafy_test.cljs
│ │ ├── edn_test.cljs
│ │ ├── gen_math_test.clj
│ │ ├── math_test.cljs
│ │ ├── set_test.cljs
│ │ ├── string_test.cljs
│ │ └── walk_test.cljs
│ ├── data_readers.cljc
│ ├── data_readers_test/
│ │ ├── core.cljc
│ │ └── records.cljc
│ ├── deps.cljs
│ ├── es6_default_hello.js
│ ├── es6_dep.js
│ ├── es6_hello.js
│ ├── externs.js
│ ├── foo/
│ │ └── ns_shadow_test.cljs
│ ├── hello.cljs
│ ├── js_libs/
│ │ └── tabby.js
│ ├── lite_test_runner.cljs
│ ├── module_test/
│ │ ├── main.cljs
│ │ └── modules/
│ │ ├── a.cljs
│ │ └── b.cljs
│ ├── preloads_test/
│ │ ├── core.cljs
│ │ └── preload.cljs
│ ├── react-min.js
│ ├── reactJS.js
│ ├── single_seg_macros.clj
│ ├── static/
│ │ └── core_test.cljs
│ └── test_runner.cljs
├── cljs_build/
│ ├── adv_src_map/
│ │ └── core.cljs
│ ├── analyzer_test/
│ │ └── no_defs.cljs
│ ├── circular_deps/
│ │ ├── a.cljs
│ │ └── b.cljs
│ ├── cljs_3235/
│ │ ├── core.cljs
│ │ └── foreign.js
│ ├── cljs_3284/
│ │ ├── bean.cljs
│ │ └── core.cljs
│ ├── cljs_3311_regress/
│ │ ├── core.cljs
│ │ └── tests.cljs
│ ├── cljs_3346_as_alias/
│ │ └── core.cljs
│ ├── cljs_3452_str_optimizations/
│ │ └── core.cljs
│ ├── code-split/
│ │ ├── index.html
│ │ ├── repl.clj
│ │ └── src/
│ │ └── code/
│ │ └── split/
│ │ ├── a.cljs
│ │ ├── b.cljs
│ │ ├── c.cljs
│ │ └── d.cljs
│ ├── emit_global_requires_test/
│ │ └── core.cljs
│ ├── emit_node_requires_test/
│ │ ├── core.cljs
│ │ └── native_modules.cljs
│ ├── firebase/
│ │ └── core.cljs
│ ├── foreign-libs-dir/
│ │ └── vendor/
│ │ └── lib.js
│ ├── foreign_libs/
│ │ └── core.cljs
│ ├── foreign_libs_cljs_2249/
│ │ └── core.cljs
│ ├── foreign_libs_cljs_2334/
│ │ ├── core.cljs
│ │ └── lib.js
│ ├── foreign_libs_dir_test/
│ │ └── core.cljs
│ ├── hello-modules/
│ │ ├── index.html
│ │ ├── release.clj
│ │ ├── repl.clj
│ │ └── src/
│ │ ├── bar/
│ │ │ └── core.cljs
│ │ └── foo/
│ │ └── core.cljs
│ ├── json_modules_test/
│ │ ├── a.js
│ │ └── b.json
│ ├── libs_test/
│ │ └── core.cljs
│ ├── loader_test/
│ │ ├── bar.cljs
│ │ ├── foo.cljs
│ │ ├── foreignA.js
│ │ └── foreignB.js
│ ├── node_modules_opt_test/
│ │ └── core.cljs
│ ├── npm_deps_test/
│ │ ├── core.cljs
│ │ ├── invoke.cljs
│ │ └── string_requires.cljs
│ ├── package_json_resolution_test/
│ │ └── core.cljs
│ ├── thirdparty/
│ │ └── add.js
│ └── trivial/
│ ├── core.cljs
│ ├── core2.cljs
│ ├── core3.cljs
│ ├── core4.cljs
│ ├── core5.cljs
│ └── core6.cljs
├── cljs_cli/
│ └── cljs_cli/
│ ├── test.clj
│ ├── test_runner.clj
│ └── util.clj
├── cljs_cp/
│ └── npm_deps_test/
│ └── string_requires_in_classpath.cljs
├── clojure/
│ └── cljs/
│ ├── analyzer/
│ │ ├── as_alias_test.clj
│ │ ├── glib_module_test.clj
│ │ ├── spec_tests.clj
│ │ └── specs.cljc
│ ├── analyzer_api_tests.clj
│ ├── analyzer_pass_tests.clj
│ ├── analyzer_tests.clj
│ ├── build_api_tests.clj
│ ├── closure_tests.clj
│ ├── compiler/
│ │ └── glib_module_test.clj
│ ├── compiler_tests.clj
│ ├── externs_infer_tests.clj
│ ├── externs_parsing_tests.clj
│ ├── foreign/
│ │ └── node_test.clj
│ ├── instant_tests.clj
│ ├── js_deps_tests.clj
│ ├── module_graph_tests.clj
│ ├── module_processing_tests.clj
│ ├── preamble1.js
│ ├── preamble2.js
│ ├── profile.clj
│ ├── repl_tests.clj
│ ├── source_map/
│ │ └── base64_tests.clj
│ ├── test_runner.clj
│ ├── test_util.clj
│ ├── transpile_tests.clj
│ ├── type_inference_tests.clj
│ └── util_tests.clj
├── externs/
│ └── test.js
├── node/
│ └── test.js
└── self/
├── bootstrap_test/
│ ├── core.cljs
│ ├── helper.clj
│ └── macros.clj
├── self_host/
│ └── test.cljs
└── self_parity/
├── auxiliary.cljs
├── setup.clj
└── test.cljs
SYMBOL INDEX (13 symbols across 9 files)
FILE: samples/hello-js/my-external-lib.js
function send_alert (line 1) | function send_alert(msg) {
FILE: src/main/cljs/cljs/bootstrap_nodejs.js
function nodeGlobalRequire (line 110) | function nodeGlobalRequire(file) {
FILE: src/main/cljs/cljs/externs.js
function IEquiv (line 20) | function IEquiv() {}
function Java (line 26) | function Java() {}
FILE: src/main/cljs/cljs/module_deps.js
method enter (line 38) | enter(path) {
function getPackageJsonMainEntry (line 99) | function getPackageJsonMainEntry(pkgJson) {
function depProvides (line 122) | function depProvides(provides, file) {
FILE: src/main/cljs/cljs/nodejs_externs.js
function require (line 2) | function require(){}
function process (line 3) | function process(){}
FILE: src/test/cljs/es6_default_hello.js
function sayHello (line 1) | function sayHello () {
FILE: src/test/cljs/react-min.js
function s (line 9) | function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&re...
FILE: src/test/cljs/reactJS.js
function s (line 8) | function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&re...
FILE: src/test/cljs_build/thirdparty/add.js
function add (line 9) | function add(a, b) {
Condensed preview — 410 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,438K chars).
[
{
"path": ".github/workflows/release.yml",
"chars": 1158,
"preview": "name: Release on demand\n\non:\n workflow_dispatch:\n inputs:\n deploy:\n description: \"Deploy to Maven Centra"
},
{
"path": ".github/workflows/test.yaml",
"chars": 8350,
"preview": "name: Tests\non: [push]\n\njobs:\n # Runtime Tests\n runtime-test:\n name: Runtime Tests\n runs-on: ubuntu-latest\n s"
},
{
"path": ".gitignore",
"chars": 512,
"preview": "*~\n.idea\n/.DS_Store\n.DS_Store\n/classes\n/lib\n/target\nclosure\n/core.js\n/coreadvanced.js\n/coresimple.js\n/out\n*out\n.lein*\n*."
},
{
"path": ".travis.yml",
"chars": 3041,
"preview": "dist: xenial\n\ngit:\n depth: 1000\n\nlanguage: node_js\n\nnode_js:\n - \"6\"\n\nbefore_install:\n - wget https://ftp.mozilla.org/"
},
{
"path": "LICENSE",
"chars": 11516,
"preview": "Eclipse Public License - v 1.0\n\nTHE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC\nLICENSE (\"AG"
},
{
"path": "README.md",
"chars": 3578,
"preview": "## What is ClojureScript? ##\n\n[ClojureScript](https://clojurescript.org) is a compiler for [Clojure](https://clojure.org"
},
{
"path": "appveyor.yml",
"chars": 1721,
"preview": "image: Visual Studio 2017\n\nenvironment:\n nodejs_version: \"6\"\n\nplatform:\n - x64\n\nconfiguration:\n - Release\n\nmatrix:\n "
},
{
"path": "ast-ref/ast-ref.edn",
"chars": 15371,
"preview": "{:all-keys\n\n [[:op \"The node op\"]\n [:form \"The ClojureScript form from which the node originated\"]\n [:env \"The environ"
},
{
"path": "ast-ref/buildref.sh",
"chars": 289,
"preview": "#!/bin/sh\n\njava -cp .:`lein cp` clojure.main <<EOF\n (load \"gen-ref\")\n (System/exit 0)\nEOF\n\n#git pull\n#mv quickref.html q"
},
{
"path": "ast-ref/gen-ref.clj",
"chars": 2262,
"preview": "(use 'clojure.string)\n\n(def tej-ref (read-string (slurp \"ast-ref.edn\")))\n(def html (slurp \"quickref.html.tpl\"))\n\n(defn f"
},
{
"path": "ast-ref/quickref.html.tpl",
"chars": 2072,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <title>cljs.analyzer AST Quickref (alpha)</title>\n <style>\n *"
},
{
"path": "benchmark/cljs/benchmark_runner.cljs",
"chars": 18469,
"preview": "(ns cljs.benchmark-runner\n (:refer-clojure :exclude [println])\n (:require [cljs.reader :as reader]\n [clojur"
},
{
"path": "bin/cljsc",
"chars": 725,
"preview": "#!/bin/sh\n\n# Compile a single cljs file or a directory of cljs files into a\n# single JavaScript file.\n\nif [ \"$CLOJURESCR"
},
{
"path": "bin/cljsc.bat",
"chars": 581,
"preview": "@echo off\r\nsetLocal EnableDelayedExpansion\r\n\r\nif \"%CLOJURESCRIPT_HOME%\" == \"\" set CLOJURESCRIPT_HOME=%~dp0..\\\r\n\r\nset CLA"
},
{
"path": "bin/cljsc.clj",
"chars": 1109,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "build.edn",
"chars": 928,
"preview": "{:optimizations :advanced\n :output-to \"builds/out-adv/core-advanced-test.js\"\n :main test-runner\n :output-wrapper true\n :"
},
{
"path": "changes.md",
"chars": 107127,
"preview": "## 1.12.134\n\n### Changes\n* Be less specific about the behavior of integer coercion fns\n* Provide `cljs.proxy/proxy` defa"
},
{
"path": "ci/install_jsc.sh",
"chars": 193,
"preview": "#!/usr/bin/env bash\nif [ ! -d WebKit ]\nthen\n git clone -b Safari-611.1.5.1 --depth=1 https://github.com/WebKit/WebKit.g"
},
{
"path": "deps.edn",
"chars": 2599,
"preview": "{:paths [\"src/main/clojure\" \"src/main/cljs\" \"resources\"]\n :deps\n {com.google.javascript/closure-compiler {:mvn/version \""
},
{
"path": "devnotes/README.org",
"chars": 2003,
"preview": "* ClojureScript\n- What: Clojure running on Javascript VMs\n- Why: Clojure rocks, Javascript reaches\n- When: Now! - a comp"
},
{
"path": "devnotes/bcrepl.org",
"chars": 769,
"preview": "* ClojureScript browser connected REPL\n** send cljs compiler output to the browser to be evaluated\n** send results back "
},
{
"path": "devnotes/cljs.org",
"chars": 31486,
"preview": "* ClojureScript\n* Rationale\n** What\n*** Compiler that compiles (a subset of?) Clojure to Javascript\n** Why?\n*** Because "
},
{
"path": "devnotes/corelib.org",
"chars": 8807,
"preview": "* DONE *\n* *'\n* DONE *1\n* DONE *2\n* DONE *3\n* *agent*\n* *allow-unresolved-vars*\n* DONE *assert*\n* *clojure-version*\n* *c"
},
{
"path": "devnotes/day1.org",
"chars": 7892,
"preview": "* ClojureScript Day #1\n* Important things to note\n** This should be a dialog, not a lecture\n*** stop me, ask questions, "
},
{
"path": "devnotes/day2.org",
"chars": 976,
"preview": "* ClojureScript Day #2\n* Welcome Thortech!\n** Eric, Frank and Tom\n*** Long time cohorts\n* Tips\n** Don't define things in"
},
{
"path": "devnotes/talk.org",
"chars": 3268,
"preview": "* Title\n** Clojure\n*** Rocks\n** Javascript\n*** Reaches\n** Announcing Clojure on Javascript\n*** ClojureScript\n* Problem s"
},
{
"path": "devnotes/testing",
"chars": 258,
"preview": "Definitely a work-in-progress.\n\nTo run tests before you commit:\n\n script/test\n\nTo add tests:\n\n * Create test fiels "
},
{
"path": "devnotes/todo.org",
"chars": 2498,
"preview": "#+TODO: TODO IN-PROGRESS REVIEW DONE\n* The near term tasks\n* Compiler\n** IN-PROGRESS throw/try/catch/finally\t\t\t :@stu"
},
{
"path": "epl-v10.html",
"chars": 12917,
"preview": "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www"
},
{
"path": "pom.template.xml",
"chars": 19656,
"preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocat"
},
{
"path": "pom.xml",
"chars": 19642,
"preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocat"
},
{
"path": "project.clj",
"chars": 1580,
"preview": "(defproject org.clojure/clojurescript \"0.0-SNAPSHOT\"\n :description \"ClojureScript compiler and core runtime library\"\n "
},
{
"path": "resources/lite_test.edn",
"chars": 886,
"preview": "{:optimizations :advanced\n :main lite-test-runner\n :output-to \"builds/out-lite/lite-test.js\"\n :out"
},
{
"path": "resources/self_host_test.edn",
"chars": 245,
"preview": "{:optimizations :simple\n :main self-host.test\n :static-fns true\n :output-to \"builds/out-self/core-self-test.js\"\n :output"
},
{
"path": "resources/self_parity_test.edn",
"chars": 211,
"preview": "{:optimizations :none\n :main self-parity.test\n :language-out :es6\n :verbose true\n :output-to \"builds/out-self-parity/mai"
},
{
"path": "resources/test.edn",
"chars": 757,
"preview": "{:optimizations :advanced\n :main test-runner\n :output-to \"builds/out-adv/core-advanced-test.js\"\n :output-dir \"builds/out"
},
{
"path": "samples/dom/.gitignore",
"chars": 11,
"preview": "out/\ndom.js"
},
{
"path": "samples/dom/src/dom/test.cljs",
"chars": 1409,
"preview": "(ns dom.test\n (:require [clojure.browser.event :as event]\n [clojure.browser.dom :as dom]))\n\n(defn log [& a"
},
{
"path": "samples/dom/test.html",
"chars": 1033,
"preview": "<!doctype html>\n<!--[if lt IE 7 ]> <html lang=\"en\" class=\"no-js ie6\"> <![endif]-->\n<!--[if IE 7 ]> <html lang=\"en\" cl"
},
{
"path": "samples/hello/.gitignore",
"chars": 14,
"preview": "out/\nhello.js\n"
},
{
"path": "samples/hello/README.md",
"chars": 997,
"preview": "*NOTE: this sample is now out of date. Please refer to the Quick Start*\n\nSimple ClojureScript Project Example.\n\nOne-time"
},
{
"path": "samples/hello/hello-dev.html",
"chars": 539,
"preview": "<html>\n <head>\n <title>Hello ClojureScript</title>\n </head>\n <body>\n <h1>Hello ClojureScript!</h1>\n <!-- In "
},
{
"path": "samples/hello/hello.html",
"chars": 340,
"preview": "<html>\n <head>\n <title>Hello ClojureScript</title>\n </head>\n <body>\n <h1>Hello ClojureScript!</h1>\n <script "
},
{
"path": "samples/hello/src/hello/core.cljs",
"chars": 576,
"preview": "(ns hello.core\n (:require [hello.foo.bar :as bar]\n [cljs.reader :as reader]))\n\n(defn ^{:export greet} greet "
},
{
"path": "samples/hello/src/hello/foo/bar.cljs",
"chars": 54,
"preview": "(ns hello.foo.bar)\n\n(defn sum [xs]\n (reduce + 0 xs))\n"
},
{
"path": "samples/hello-js/.gitignore",
"chars": 15,
"preview": "out/\nhello*.js\n"
},
{
"path": "samples/hello-js/README.md",
"chars": 1759,
"preview": "*NOTE: this sample is now out of date. Please refer to the Quick Start*\n\nSimple ClojureScript Project Example Using an E"
},
{
"path": "samples/hello-js/externed-lib.js",
"chars": 117,
"preview": "external = {};\n\nexternal.lib = {\n send_alert : function (msg) {\n alert(\"Sending Alert via \" + msg + \"!\");\n }\n};\n"
},
{
"path": "samples/hello-js/externs.js",
"chars": 79,
"preview": "var external = {};\nexternal.lib = {};\nexternal.lib.send_alert = function() {};\n"
},
{
"path": "samples/hello-js/hello-extern.html",
"chars": 427,
"preview": "<html>\n <head>\n <title>Hello Externed JavaScript Library</title>\n </head>\n <body>\n <h1>Hello Externed JavaScrip"
},
{
"path": "samples/hello-js/hello-js-dev.html",
"chars": 594,
"preview": "<html>\n <head>\n <title>Hello External JavaScript Library</title>\n </head>\n <body>\n <h1>Hello External JavaScrip"
},
{
"path": "samples/hello-js/hello-js.html",
"chars": 524,
"preview": "<html>\n <head>\n <title>Hello External JavaScript Library</title>\n </head>\n <body>\n <h1>Hello External JavaScrip"
},
{
"path": "samples/hello-js/my-external-lib.js",
"chars": 73,
"preview": "function send_alert(msg) {\n alert(\"Sending Alert via \" + msg + \"!\");\n};\n"
},
{
"path": "samples/hello-js/src/hello-js/core.cljs",
"chars": 237,
"preview": "(ns hello-js.core)\n\n(defn ^:export popup-msg\n [msg]\n (js/send_alert msg))\n\n(popup-msg \"ClojureScript calling a global "
},
{
"path": "samples/hello-js/src/hello-js/extern-example.cljs",
"chars": 157,
"preview": "(ns hello.extern-example)\n\n(defn ^:export foo [] 42)\n\n(external.lib/send_alert \"ClojureScript calling a function defined"
},
{
"path": "samples/nodehello.cljs",
"chars": 412,
"preview": "(ns nodehello\n (:require [cljs.nodejs :as nodejs]))\n\n(defn -main [& args]\n (println (apply str (map [\\space \"world\" \"h"
},
{
"path": "samples/nodels.cljs",
"chars": 453,
"preview": "; This one doesn't yet work with :optimizations :advanced\n(ns nodels\n (:require [cljs.nodejs :as nodejs]))\n\n(def fs (no"
},
{
"path": "samples/repl/.gitignore",
"chars": 13,
"preview": "out/\nmain.js\n"
},
{
"path": "samples/repl/README.md",
"chars": 2838,
"preview": "*NOTE: this sample is now out of date. Please refer to the Quick\nStart*\n\n# ClojureScript REPL Examples\n\nThe ClojureScrip"
},
{
"path": "samples/repl/index.html",
"chars": 993,
"preview": "<!doctype html>\n<!--[if lt IE 7 ]> <html lang=\"en\" class=\"no-js ie6\"> <![endif]-->\n<!--[if IE 7 ]> <html lang=\"en\" cl"
},
{
"path": "samples/repl/repl.clj",
"chars": 222,
"preview": "(require '[cljs.closure :as cljsc])\n(require '[cljs.repl :as repl])\n(require '[cljs.repl.browser :as brepl])\n\n(cljsc/bui"
},
{
"path": "samples/repl/src/repl/foo.cljs",
"chars": 41,
"preview": "(ns repl.foo)\n\n(defn bar [a b]\n (+ a b))"
},
{
"path": "samples/repl/src/repl/test.cljs",
"chars": 2243,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by th"
},
{
"path": "samples/string-requires-npm-deps/.gitignore",
"chars": 5,
"preview": "out/\n"
},
{
"path": "samples/string-requires-npm-deps/README.md",
"chars": 404,
"preview": "# ClojureScript string-based requires demo\n\nRunning:\n\n1. At the root of the ClojureScript repo, run `./script/bootstrap`"
},
{
"path": "samples/string-requires-npm-deps/build.clj",
"chars": 317,
"preview": "(require '[cljs.build.api :as b])\n\n(b/build \"src\"\n {:output-dir \"out\"\n :output-to \"out/main.js\"\n :optimizations :no"
},
{
"path": "samples/string-requires-npm-deps/src/foo/core.cljs",
"chars": 306,
"preview": "(ns foo.core\n (:require [react :refer [createElement]]\n [\"react-dom/server\" :as rds :refer [renderToString]]"
},
{
"path": "samples/twitterbuzz/.gitignore",
"chars": 20,
"preview": "out/\ntwitterbuzz.js\n"
},
{
"path": "samples/twitterbuzz/README.md",
"chars": 1501,
"preview": "*NOTE: this sample is now out of date. Please refer to the Quick Start*\n\n# ClojureScript \"TwitterBuzz\" Demo\n\n## One-time"
},
{
"path": "samples/twitterbuzz/index-advanced.html",
"chars": 2710,
"preview": "<!doctype html>\n<!--[if lt IE 7 ]> <html lang=\"en\" class=\"no-js ie6\"> <![endif]-->\n<!--[if IE 7 ]> <html lang=\"en\" cl"
},
{
"path": "samples/twitterbuzz/index.html",
"chars": 3037,
"preview": "<!doctype html>\n<!--[if lt IE 7 ]> <html lang=\"en\" class=\"no-js ie6\"> <![endif]-->\n<!--[if IE 7 ]> <html lang=\"en\" cl"
},
{
"path": "samples/twitterbuzz/reset.css",
"chars": 965,
"preview": "/* Eric Meyer's Reset Reloaded */\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, "
},
{
"path": "samples/twitterbuzz/src/twitterbuzz/anneal.cljs",
"chars": 2318,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "samples/twitterbuzz/src/twitterbuzz/core.cljs",
"chars": 10868,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "samples/twitterbuzz/src/twitterbuzz/dom-helpers.cljs",
"chars": 3454,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "samples/twitterbuzz/src/twitterbuzz/layout.cljs",
"chars": 3628,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "samples/twitterbuzz/src/twitterbuzz/leaderboard.cljs",
"chars": 1635,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "samples/twitterbuzz/src/twitterbuzz/radial.cljs",
"chars": 2933,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "samples/twitterbuzz/src/twitterbuzz/showgraph.cljs",
"chars": 4728,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "samples/twitterbuzz/src/twitterbuzz/timeline.cljs",
"chars": 1507,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "samples/twitterbuzz/style.css",
"chars": 5792,
"preview": "/* TwitterBuzz: A ClojureScript Demo */\n\n/* Default Tags */\nbody { \n font-family: Helvetica Neue, Arial, Lucida Grande,"
},
{
"path": "samples/twitterbuzz/test_data.txt",
"chars": 19641,
"preview": "{\"usaturn\" {:image-url \"http://a0.twimg.com/profile_images/1365715199/md_normal.png\", :last-tweet \"うーん、尼から「プログラミングClojur"
},
{
"path": "samples/twitterbuzz/tweet_maps.txt",
"chars": 118801,
"preview": "({:text \"Creating a Query DSL using Clojure and MongoDB http://tob.sn/qgCxkm #mongodb\", :from_user \"tobsn\", :metadata {:"
},
{
"path": "script/aot.clj",
"chars": 59,
"preview": "(require '[cljs.closure :as cljsc])\n(cljsc/aot-cache-core)\n"
},
{
"path": "script/aot_core",
"chars": 898,
"preview": "#!/usr/bin/env bash\n\nset -e\n\nif [[ -z \"$CLJS_SCRIPT_QUIET\" ]]; then\n set -x\nfi\n\nFILE_SEP='/'\nPATH_SEP=':'\nOS_ID=`uname "
},
{
"path": "script/benchmark",
"chars": 1522,
"preview": "#!/bin/sh\n\nrm -rf builds/out-adv-bench\nmkdir -p builds/out-adv-bench\n\nbin/cljsc benchmark \"{:optimizations :advanced :ou"
},
{
"path": "script/bootstrap",
"chars": 6280,
"preview": "#!/bin/sh\n\nset -e\n\nCLOJURE_RELEASE=\"1.9.0\"\nSPEC_ALPHA_RELEASE=\"0.1.143\"\nCORE_SPECS_ALPHA_RELEASE=\"0.1.24\"\nCLOSURE_RELEAS"
},
{
"path": "script/bootstrap.ps1",
"chars": 5333,
"preview": "$ErrorActionPreference = \"Stop\"\r\n$root = Resolve-Path \"$PSScriptRoot\\..\"\r\n$shell = New-Object -com shell.application\r\n\r\n"
},
{
"path": "script/browser-repl",
"chars": 361,
"preview": "#!/bin/sh\n\nif [ \"$CLOJURESCRIPT_HOME\" = \"\" ]; then\n CLOJURESCRIPT_HOME=\"`dirname $0`/..\"\nfi\n\nCLJSC_CP=''\nfor next in li"
},
{
"path": "script/browser_repl.clj",
"chars": 105,
"preview": "(require '[cljs.repl :as repl])\n(require '[cljs.repl.browser :as browser])\n(repl/repl (browser/repl-env))"
},
{
"path": "script/build",
"chars": 2750,
"preview": "#!/usr/bin/env bash\n\n# This script must be run within the ClojureScript top-level project\n# directory.\n\nset -e\n\nif [[ -z"
},
{
"path": "script/clean",
"chars": 175,
"preview": "#!/bin/sh\n\nrm -rf closure\nrm -rf compilation\nrm -rf lib\nrm -rf target\nrm -rf builds\nrm -rf clojure\nrm -rf out\nrm -rf nod"
},
{
"path": "script/compile",
"chars": 1589,
"preview": "#!/bin/sh\n\nrm -f core.js\n\njava -server -Xmx2G -Xms2G -Xmn256m -cp 'lib/*:src/main/clojure:src/main/cljs' clojure.main - "
},
{
"path": "script/noderepljs",
"chars": 377,
"preview": "#!/bin/sh\n\nif [ \"$CLOJURESCRIPT_HOME\" = \"\" ]; then\n CLOJURESCRIPT_HOME=\"`dirname $0`/..\"\nfi\n\nCLJSC_CP=''\nfor next in li"
},
{
"path": "script/repl",
"chars": 289,
"preview": "#!/bin/sh\n\nif [ \"$CLOJURESCRIPT_HOME\" = \"\" ]; then\n CLOJURESCRIPT_HOME=\"`dirname $0`/..\"\nfi\n\nCLJSC_CP=''\nfor next in cl"
},
{
"path": "script/repl.bat",
"chars": 352,
"preview": "@echo off\r\nsetLocal EnableDelayedExpansion\r\n\r\nif \"%CLOJURESCRIPT_HOME%\" == \"\" set CLOJURESCRIPT_HOME=%~dp0..\\\r\n\r\nset CLA"
},
{
"path": "script/repl.clj",
"chars": 113,
"preview": "(require '[cljs.repl :as repl])\n(require '[cljs.repl.node :as node])\n(repl/repl (node/repl-env :debug-port 5002))"
},
{
"path": "script/revision",
"chars": 640,
"preview": "#!/usr/bin/env bash\n\nset -ex\n\n# The command `git describe --match v0.0` will return a string like\n#\n# v0.0-856-g329708b\n"
},
{
"path": "script/self-compile",
"chars": 145,
"preview": "#!/usr/bin/env bash\n\nrm -rf classes\nmkdir classes\n./script/repl -e \"(compile 'cljs.repl.node) (compile 'cljs.repl.browse"
},
{
"path": "script/test",
"chars": 3138,
"preview": "#!/bin/sh\n\nrm -rf builds/out-adv\nrm -rf out\nrm -rf target\nrm -rf package.json\nrm -rf package-lock.json\n\necho {} > packag"
},
{
"path": "script/test-cli",
"chars": 177,
"preview": "#!/bin/sh\n\nif [ ! -f target/cljs.jar ]; then\n echo \"Run script/uberjar first\"\n exit 1\nfi\n\njava -cp target/cljs.jar:src"
},
{
"path": "script/test-compile",
"chars": 507,
"preview": "#!/bin/sh\n\necho \"Generating sample javascript\"\nmkdir compilation\n\ncat >compilation/test.js <<EOF\nfunction create_alert(m"
},
{
"path": "script/test-self-host",
"chars": 467,
"preview": "#!/bin/sh\n\n# stop blowing compiled stuff\nrm -rf builds/out-self\nmkdir -p builds/out-self\n\nif ! bin/cljsc src/test/self/s"
},
{
"path": "script/test-self-parity",
"chars": 816,
"preview": "#!/bin/sh\n\n# stop blowing compiled stuff\nrm -rf builds/out-self-parity\nmkdir -p builds/out-self-parity\n\n# extract needed"
},
{
"path": "script/test-simple",
"chars": 3177,
"preview": "#!/bin/sh\n\n# stop blowing compiled stuff\nrm -rf builds/out-simp\nrm -rf package.json\nrm -rf package-lock.json\n\necho {} > "
},
{
"path": "script/test.ps1",
"chars": 2106,
"preview": "$ErrorActionPreference = \"Stop\"\r\n$root = Resolve-Path $PSScriptRoot\\..\r\n\r\n$testjs = \"builds/out-adv/core-advanced-test.j"
},
{
"path": "script/uberjar",
"chars": 2113,
"preview": "#!/usr/bin/env bash\n\n# This script must be run within the ClojureScript top-level project\n# directory.\n\nset -e\n\nif [[ -z"
},
{
"path": "script/vendorize_deps",
"chars": 1677,
"preview": "#!/usr/bin/env bash\n\nset -e\n\nmkdir -p src/main/clojure/cljs/vendor\ncd src/main/clojure/cljs\n\nDJSON_RELEASE=\"2.4.0\"\nTRANS"
},
{
"path": "src/assembly/aot.xml",
"chars": 908,
"preview": "<assembly>\n <id>aot</id>\n <formats>\n <format>jar</format>\n </formats>\n <includeBaseDirectory>false</includeBaseDi"
},
{
"path": "src/assembly/slim.xml",
"chars": 835,
"preview": "<assembly>\n <id>slim</id>\n <formats>\n <format>jar</format>\n </formats>\n <includeBaseDirectory>false</includeBaseD"
},
{
"path": "src/main/cljs/cljs/analyzer/passes/and_or.cljc",
"chars": 3426,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by th"
},
{
"path": "src/main/cljs/cljs/analyzer/passes/lite.cljc",
"chars": 1030,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by th"
},
{
"path": "src/main/cljs/cljs/analyzer/passes.cljc",
"chars": 1037,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by th"
},
{
"path": "src/main/cljs/cljs/bootstrap_nodejs.js",
"chars": 4530,
"preview": "// Copyright 2013 The Closure Library Authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// "
},
{
"path": "src/main/cljs/cljs/core/specs/alpha.cljc",
"chars": 7469,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/cljs/core/specs/alpha.cljs",
"chars": 535,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/cljs/core.cljs",
"chars": 374448,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/cljs/externs.js",
"chars": 752,
"preview": "/**\n * Copyright (c) Rich Hickey. All rights reserved.\n * The use and distribution terms for this software are covered b"
},
{
"path": "src/main/cljs/cljs/imul.js",
"chars": 448,
"preview": "if(typeof Math.imul == \"undefined\" || (Math.imul(0xffffffff,5) == 0)) {\n Math.imul = function (a, b) {\n var ah"
},
{
"path": "src/main/cljs/cljs/js.clj",
"chars": 903,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/cljs/js.cljs",
"chars": 62024,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/cljs/loader.cljs",
"chars": 3926,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/cljs/main.clj",
"chars": 2403,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by th"
},
{
"path": "src/main/cljs/cljs/math.cljs",
"chars": 34936,
"preview": "(ns ^{:doc \"ClojureScript wrapper functions for math operations\"\n :author \"Paula Gearon\" }\n cljs.math)\n\n(def\n ^"
},
{
"path": "src/main/cljs/cljs/module_deps.js",
"chars": 7626,
"preview": "// NOTE: This code should only employ single quotes for strings.\n// If double quotes are used, then when the contents of"
},
{
"path": "src/main/cljs/cljs/nodejs.cljs",
"chars": 1084,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/cljs/nodejs_externs.js",
"chars": 61,
"preview": "var global = {};\nfunction require(){};\nfunction process(){};\n"
},
{
"path": "src/main/cljs/cljs/nodejscli.cljs",
"chars": 995,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/cljs/pprint.cljc",
"chars": 6436,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by th"
},
{
"path": "src/main/cljs/cljs/pprint.cljs",
"chars": 128124,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/cljs/proxy/impl.cljs",
"chars": 970,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/cljs/proxy.cljs",
"chars": 6043,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/cljs/reader.clj",
"chars": 844,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by th"
},
{
"path": "src/main/cljs/cljs/reader.cljs",
"chars": 7209,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/cljs/repl.cljs",
"chars": 8303,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by th"
},
{
"path": "src/main/cljs/cljs/source_map/base64.cljs",
"chars": 943,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/cljs/source_map/base64_vlq.cljs",
"chars": 3436,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/cljs/source_map.cljs",
"chars": 12350,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/cljs/spec/alpha.cljc",
"chars": 22344,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/cljs/spec/alpha.cljs",
"chars": 54229,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/cljs/spec/gen/alpha.cljc",
"chars": 2048,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/cljs/spec/gen/alpha.cljs",
"chars": 6136,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/cljs/spec/test/alpha.cljc",
"chars": 11693,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/cljs/spec/test/alpha.cljs",
"chars": 11684,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/cljs/stacktrace.cljc",
"chars": 24706,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by th"
},
{
"path": "src/main/cljs/cljs/test.cljc",
"chars": 16789,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/cljs/test.cljs",
"chars": 21064,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/clojure/browser/dom.cljs",
"chars": 4664,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/clojure/browser/event.cljs",
"chars": 2837,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/clojure/browser/net.cljs",
"chars": 5130,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/clojure/browser/repl/preload.cljs",
"chars": 624,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/clojure/browser/repl.cljs",
"chars": 10387,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/clojure/core/protocols.cljs",
"chars": 941,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/clojure/core/reducers.cljs",
"chars": 8612,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/clojure/data.cljs",
"chars": 4195,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/clojure/datafy.cljs",
"chars": 1916,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/clojure/edn.cljs",
"chars": 2306,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by th"
},
{
"path": "src/main/cljs/clojure/reflect.cljs",
"chars": 2212,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/clojure/set.cljs",
"chars": 5036,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/clojure/string.cljs",
"chars": 8438,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/clojure/walk.cljs",
"chars": 3564,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/clojure/zip.cljs",
"chars": 9020,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/cljs/process/env.cljs",
"chars": 565,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by th"
},
{
"path": "src/main/clojure/cljs/analyzer/api.cljc",
"chars": 10317,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/clojure/cljs/analyzer/impl/namespaces.cljc",
"chars": 2921,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by th"
},
{
"path": "src/main/clojure/cljs/analyzer/impl.cljc",
"chars": 1250,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/clojure/cljs/analyzer/macros.clj",
"chars": 2201,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/clojure/cljs/analyzer/utils.clj",
"chars": 1241,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/clojure/cljs/analyzer.cljc",
"chars": 208980,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/clojure/cljs/build/api.clj",
"chars": 11783,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/clojure/cljs/cli.clj",
"chars": 29688,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by th"
},
{
"path": "src/main/clojure/cljs/closure.clj",
"chars": 145030,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/clojure/cljs/compiler/api.clj",
"chars": 4059,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/clojure/cljs/compiler/macros.clj",
"chars": 743,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/clojure/cljs/compiler.cljc",
"chars": 74742,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/clojure/cljs/core/macros.clj",
"chars": 1698,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/clojure/cljs/core/server.clj",
"chars": 7357,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/clojure/cljs/core.cljc",
"chars": 147796,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/clojure/cljs/env/macros.clj",
"chars": 1377,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/clojure/cljs/env.cljc",
"chars": 4127,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/clojure/cljs/externs.clj",
"chars": 15674,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/clojure/cljs/foreign/node.clj",
"chars": 9156,
"preview": "(ns cljs.foreign.node\n (:require [cljs.vendor.clojure.data.json :as json]\n [clojure.java.io :as io]\n "
},
{
"path": "src/main/clojure/cljs/instant.clj",
"chars": 2206,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by th"
},
{
"path": "src/main/clojure/cljs/js_deps.cljc",
"chars": 16439,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by th"
},
{
"path": "src/main/clojure/cljs/module_graph.cljc",
"chars": 15433,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/clojure/cljs/repl/bootstrap.clj",
"chars": 2694,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by th"
},
{
"path": "src/main/clojure/cljs/repl/browser.clj",
"chars": 19493,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by th"
},
{
"path": "src/main/clojure/cljs/repl/node.clj",
"chars": 9803,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by th"
},
{
"path": "src/main/clojure/cljs/repl/node_repl.js",
"chars": 3445,
"preview": "/**\n * Copyright (c) Rich Hickey. All rights reserved.\n * The use and distribution terms for this software are covered b"
},
{
"path": "src/main/clojure/cljs/repl/reflect.clj",
"chars": 2931,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by th"
},
{
"path": "src/main/clojure/cljs/repl/server.clj",
"chars": 7822,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by th"
},
{
"path": "src/main/clojure/cljs/repl.cljc",
"chars": 65977,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by th"
},
{
"path": "src/main/clojure/cljs/server/browser.clj",
"chars": 1664,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/clojure/cljs/server/node.clj",
"chars": 1630,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/clojure/cljs/source_map/base64.clj",
"chars": 1293,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by th"
},
{
"path": "src/main/clojure/cljs/source_map/base64_vlq.clj",
"chars": 3478,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by th"
},
{
"path": "src/main/clojure/cljs/source_map.clj",
"chars": 14374,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by th"
},
{
"path": "src/main/clojure/cljs/support.cljc",
"chars": 800,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
},
{
"path": "src/main/clojure/cljs/tagged_literals.cljc",
"chars": 2998,
"preview": ";; Copyright (c) Rich Hickey. All rights reserved.\n;; The use and distribution terms for this software are covered by th"
},
{
"path": "src/main/clojure/cljs/util.cljc",
"chars": 13207,
"preview": "; Copyright (c) Rich Hickey. All rights reserved.\n; The use and distribution terms for this software are covered by "
}
]
// ... and 210 more files (download for full content)
About this extraction
This page contains the full source code of the clojure/clojurescript GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 410 files (3.1 MB), approximately 843.1k tokens, and a symbol index with 13 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.