├── .circleci ├── .gitignore ├── Makefile ├── README.md ├── bb.edn ├── bin │ ├── bump-dev-version.bash │ ├── merge-dev-into-published.bash │ ├── merge-published-into-dev.bash │ ├── package-vsix.bash │ ├── publish-release-on-github.bash │ ├── publish-to-open-vsx.bash │ ├── publish-to-the-marketplace-2.bash │ ├── publish-to-the-marketplace.bash │ └── tamper-calva-version.bash ├── config.yml ├── config.ys ├── jobs │ ├── build.yaml │ ├── bump-dev-version.yaml │ ├── checkout.yaml │ ├── deploy-docs.yaml │ ├── eslint-check.yaml │ ├── github-release.yaml │ ├── marketplace-preview-publish.yaml │ ├── marketplace-publish.yaml │ ├── merge-dev-into-published.yaml │ ├── merge-published-into-dev.yaml │ ├── open-vsx-publish.yaml │ ├── prettier-check.yaml │ ├── test-cljslib.yaml │ ├── test-e2e-sub-projects.yaml │ ├── test-e2e.yaml │ ├── test-grammar.yaml │ ├── test-integration.yaml │ └── test-ts-unit.yaml ├── lib │ └── helpers.ys └── workflows │ ├── build-test.yaml │ ├── calva-io-build.yaml │ └── release-publish.yaml ├── .clj-kondo └── config.edn ├── .dockerignore ├── .eslintignore ├── .eslintrc.js ├── .github └── FUNDING.yml ├── .gitignore ├── .gitpod.dockerfile ├── .gitpod.yml ├── .joyride └── deps.edn ├── .mailmap ├── .node-version ├── .prettierignore ├── .prettierrc ├── .vscode ├── extensions.json ├── launch.json ├── settings.json └── tasks.json ├── .vscodeignore ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── assets ├── calva-64h.png ├── calva.png ├── calva128x128.png ├── cw_screenshot.png ├── fonts │ ├── FiraCode-Bold.woff2 │ ├── FiraCode-Light.woff2 │ ├── FiraCode-Medium.woff2 │ └── FiraCode-Regular.woff2 ├── howto │ ├── cljc-clj-cljs.gif │ ├── dimming-ignores.gif │ ├── error.png │ ├── evaluate.gif │ ├── features.gif │ ├── outline-view.gif │ ├── paredit-up-wrap.gif │ ├── rainbow-guides.gif │ ├── references-code-lens.gif │ ├── signature-help.gif │ ├── status_clj.png │ ├── status_cljs.png │ ├── status_not_connected.png │ └── top-level-comment-eval.gif ├── images │ ├── alex-miller-likes-it.png │ ├── calva-icon.png │ ├── calva-symbol-logo.svg │ ├── calva-symbol-white.svg │ ├── calva-symbol.svg │ ├── clj-type-clojure-cli.svg │ ├── clj-type-leiningen.png │ ├── clj-type-leiningen.svg │ ├── clj-type-shadow-cljs.png │ ├── clj-type-shadow-cljs.svg │ ├── clj.svg │ ├── cljs-type-figwheel-main.svg │ ├── cljs-type-figwheel.svg │ ├── cljs-type-shadow-cljs.png │ ├── cljs-type-shadow-cljs.svg │ ├── cljs.svg │ ├── clojure-cli.svg │ ├── cognitect-logo.jpg │ ├── empty.svg │ ├── icons │ │ ├── bool-dark.svg │ │ ├── bool-light.svg │ │ ├── kv-pair-dark.svg │ │ ├── kv-pair-light.svg │ │ ├── kw-dark.svg │ │ ├── kw-light.svg │ │ ├── list-dark.svg │ │ ├── list-light.svg │ │ ├── map-dark.svg │ │ ├── map-light.svg │ │ ├── numeric-dark.svg │ │ ├── numeric-light.svg │ │ ├── regex-dark.svg │ │ ├── regex-light.svg │ │ ├── set-dark.svg │ │ ├── set-light.svg │ │ ├── string-dark.svg │ │ ├── string-light.svg │ │ ├── symbol-dark.svg │ │ ├── symbol-light.svg │ │ ├── tag-dark.svg │ │ ├── tag-light.svg │ │ ├── var-dark.svg │ │ ├── var-light.svg │ │ ├── vector-dark.svg │ │ └── vector-light.svg │ ├── pitch-logo.png │ ├── pitch-logo.svg │ ├── star-calva-repo.png │ └── thortech-solutions.png ├── mission-control-shortcuts.gif ├── repl-window-screenshot.png ├── styles │ ├── _theme-dark.scss │ ├── _theme-light.scss │ ├── fonts.css │ └── webview.scss ├── top-level-eval.gif └── webview.html ├── bundled └── drams-menu │ ├── drams-dev.edn │ └── drams-published.edn ├── cljfmt.edn ├── deps-clj-version ├── deps.clj.jar ├── deps.edn ├── docs ├── Overview.png ├── PULL_REQUEST_TEMPLATE.md ├── PULL_REQUEST_TEMPLATE │ └── docs.md ├── grammar │ └── things-to-consider.md ├── integration.md ├── overview.plantuml └── site │ ├── CNAME │ ├── _static │ └── css │ │ └── custom.css │ ├── api.md │ ├── async-out.md │ ├── babashka.md │ ├── basilisp.md │ ├── calva-symbol-logo-white.svg │ ├── clj-java-decompiler.md │ ├── clojure-lsp.md │ ├── clojuredart.md │ ├── clojuredocs.md │ ├── commands-top10.md │ ├── commands.md │ ├── connect-sequences.md │ ├── connect.md │ ├── contribute.md │ ├── custom-commands.md │ ├── customizing-jack-in-and-connect.md │ ├── customizing.md │ ├── debugger.md │ ├── emacs-keybindings.md │ ├── eval-tips.md │ ├── evaluation.md │ ├── fiddle-files.md │ ├── finding-commands.md │ ├── flares.md │ ├── formatting.md │ ├── get-started-with-clojure.md │ ├── getting-started.md │ ├── hiccup.md │ ├── images │ ├── agical-logo-1200x400.png │ ├── alex-miller-likes-it.png │ ├── calva-64h.png │ ├── calva-convert-html-to-hiccup.mp4 │ ├── calva-copy-html-as-hiccup.png │ ├── calva-icon.png │ ├── calva-monorepo-project-roots-menu.png │ ├── calva-project-roots-search-exclude.png │ ├── calva-symbol-logo-white.svg │ ├── calva-symbol-logo.svg │ ├── calva.png │ ├── calva128x128.png │ ├── clojure-lsp │ │ ├── fallback-server.png │ │ ├── management-menu.png │ │ └── trace-server-setting.png │ ├── clojuredocs-hover-when-not-example-1.png │ ├── custom-command-menu.png │ ├── debugger │ │ ├── break.gif │ │ ├── breakpoint-in-test.png │ │ ├── dbg-form.gif │ │ ├── dbg-function.gif │ │ ├── debugger-call-stack.gif │ │ ├── eval-editor.gif │ │ ├── instrumenting-a-function.gif │ │ ├── navigation-buttons.png │ │ ├── stepping.gif │ │ └── viewing-variable-values.png │ ├── finding-commands.png │ ├── flare.png │ ├── getting-started-with-clojure │ │ ├── get-started-with-clojure-header-wo-header.png │ │ ├── get-started-with-clojure-header.png │ │ ├── gitpod-new-workspace.png │ │ ├── gitpod-sign-in.png │ │ ├── gitpod-vscode-menu.png │ │ └── vscode-command-palette-calva-getting-started.png │ ├── howto │ │ ├── cljc-clj-cljs.gif │ │ ├── cljc-toggle-button.png │ │ ├── clojurescript-quick-start.png │ │ ├── dimming-ignores.gif │ │ ├── error.png │ │ ├── evaluate.gif │ │ ├── features.gif │ │ ├── hello-repl.png │ │ ├── live-share-port.png │ │ ├── mission-control-shortcuts.gif │ │ ├── output │ │ │ ├── eval-results-1.png │ │ │ ├── eval-results-2.png │ │ │ ├── load-current-namespace.png │ │ │ ├── output-window-connected.png │ │ │ ├── peek-last-result.gif │ │ │ ├── print-stacktrace-codelense.png │ │ │ ├── repl-file-debugger.png │ │ │ ├── select-last-result.png │ │ │ └── stack-traces.gif │ │ ├── paredit-up-wrap.gif │ │ ├── polylith-repl.png │ │ ├── signature-help.gif │ │ ├── start-hello-repl.png │ │ ├── status_clj.png │ │ ├── status_cljs.png │ │ ├── status_not_connected.png │ │ ├── top-level-comment-eval.gif │ │ └── top-level-eval.gif │ ├── inspector │ │ ├── calva-inspector-rainbow.png │ │ └── inspector-view.png │ ├── merch │ │ ├── calva-t-shirt-symbol+logo+rich-comments.png │ │ ├── calva-t-shirt-symbol+rich-comments.png │ │ ├── t-shirt-calva-symbol-and-logo.png │ │ ├── t-shirt-calva-symbol.png │ │ └── t-shirt-rich-comments.png │ ├── ns-form │ │ └── ns-form-autocreation.gif │ ├── paredit │ │ ├── backward-down-sexp.gif │ │ ├── backward-sexp-or-up.gif │ │ ├── backward-sexp.gif │ │ ├── backward-up-sexp.gif │ │ ├── barf-backward.gif │ │ ├── barf-forward.gif │ │ ├── close-list.gif │ │ ├── convolute.gif │ │ ├── drag-backward-forward.gif │ │ ├── drag-backward-up-forward-down.gif │ │ ├── drag-forward-up-backward-down.gif │ │ ├── drag-pairs-in-binding-box.gif │ │ ├── drag-pairs-in-maps.gif │ │ ├── force-backspace.gif │ │ ├── force-delete.gif │ │ ├── forward-down-sexp.gif │ │ ├── forward-sexp-or-up.gif │ │ ├── forward-sexp.gif │ │ ├── forward-up-sexp.gif │ │ ├── grow-selection.gif │ │ ├── join.gif │ │ ├── kill-backward-sexp.gif │ │ ├── kill-close-list.gif │ │ ├── kill-forward-sexp.gif │ │ ├── kill-left.gif │ │ ├── kill-open-list.gif │ │ ├── kill-right.gif │ │ ├── lateral-grow.gif │ │ ├── open-list.gif │ │ ├── raise-sexp.gif │ │ ├── raise.gif │ │ ├── rewrap.gif │ │ ├── select-backward-down-sexp.gif │ │ ├── select-backward-sexp-or-up.gif │ │ ├── select-backward-sexp.gif │ │ ├── select-backward-up-sexp.gif │ │ ├── select-close-list.gif │ │ ├── select-forward-down-sexp.gif │ │ ├── select-forward-sexp-or-up.gif │ │ ├── select-forward-sexp.gif │ │ ├── select-forward-up-sexp.gif │ │ ├── select-open-list.gif │ │ ├── select-right.gif │ │ ├── select-top-level-form.gif │ │ ├── shrink-selection.gif │ │ ├── slurp-backward.gif │ │ ├── slurp-forward.gif │ │ ├── splice-killing-backward.gif │ │ ├── splice-killing-forward.gif │ │ ├── splice.gif │ │ ├── split.gif │ │ ├── strict-backspace.gif │ │ ├── strict-delete.gif │ │ ├── string-as-list.gif │ │ ├── transpose.gif │ │ ├── wrap-around-brackets.gif │ │ ├── wrap-around-curlies.gif │ │ ├── wrap-around-parens.gif │ │ └── wrap-around-quotes.gif │ ├── pitch-logo.png │ ├── refactoring │ │ ├── addMissingLibspec.gif │ │ ├── cleanNs.gif │ │ ├── cyclePrivacy.gif │ │ ├── expandLet.gif │ │ ├── extractFunction.gif │ │ ├── inlineSymbol.gif │ │ ├── introduceLet.gif │ │ ├── moveToLet.gif │ │ ├── quick-fix.png │ │ ├── threadFirst.gif │ │ ├── threadFirstAll.gif │ │ ├── threadLast.gif │ │ ├── threadLastAll.gif │ │ ├── unwindAll.gif │ │ └── unwindThread.gif │ └── vscode-extension-by-rating.png │ ├── img │ ├── index.md │ ├── inspector.md │ ├── jack-in-guide.md │ ├── joyride.md │ ├── krell.md │ ├── linting.md │ ├── live-share.md │ ├── luminus.md │ ├── merch.md │ ├── namespace-form-auto-creation.md │ ├── nbb.md │ ├── notebooks.md │ ├── nrepl_and_cider-nrepl.md │ ├── output-view.md │ ├── output.md │ ├── paredit.md │ ├── parinfer.md │ ├── polylith.md │ ├── pprint.md │ ├── quirks.md │ ├── re-frame-template.md │ ├── rebl.md │ ├── refactoring.md │ ├── remote-development.md │ ├── repl-window.md │ ├── reveal.md │ ├── rich-comments.md │ ├── shadow-cljs.md │ ├── sponsors.md │ ├── stylesheets │ └── extra.css │ ├── syntax-highlighting.md │ ├── tao.md │ ├── test-runner.md │ ├── theming │ ├── img │ │ ├── android-icon-144x144.png │ │ ├── android-icon-192x192.png │ │ ├── android-icon-36x36.png │ │ ├── android-icon-48x48.png │ │ ├── android-icon-72x72.png │ │ ├── android-icon-96x96.png │ │ ├── apple-icon-114x114.png │ │ ├── apple-icon-120x120.png │ │ ├── apple-icon-144x144.png │ │ ├── apple-icon-152x152.png │ │ ├── apple-icon-180x180.png │ │ ├── apple-icon-57x57.png │ │ ├── apple-icon-60x60.png │ │ ├── apple-icon-72x72.png │ │ ├── apple-icon-76x76.png │ │ ├── apple-icon-precomposed.png │ │ ├── apple-icon.png │ │ ├── browserconfig.xml │ │ ├── calva-symbol-white.svg │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── favicon-96x96.png │ │ ├── favicon.ico │ │ ├── manifest.json │ │ ├── ms-icon-144x144.png │ │ ├── ms-icon-150x150.png │ │ ├── ms-icon-310x310.png │ │ └── ms-icon-70x70.png │ └── main.html │ ├── try-first.md │ ├── vim.md │ ├── virgil.md │ ├── when-clauses.md │ ├── why-calva.md │ ├── workspace-layouts.md │ └── wsl.md ├── jsconfig.json ├── language-configuration.json ├── mkdocs.yml ├── netlfiy.toml ├── notebooks-spritz ├── .vscodeignore ├── LICENSE.md ├── README.md ├── calva-spritz-1.0.0.vsix ├── package-lock.json ├── package.json └── spritz-icon.png ├── package-lock.json ├── package.json ├── repl-output-ui └── css │ └── main.css ├── requirements.txt ├── scripts ├── build-and-test │ ├── Dockerfile │ ├── README.md │ └── run.sh └── publish.clj ├── shadow-cljs.edn ├── snippets.jsonc ├── src ├── NotebookProvider.ts ├── analytics.ts ├── api │ ├── document.ts │ ├── editor.ts │ ├── index.ts │ ├── info.ts │ ├── pprint.ts │ ├── ranges.ts │ ├── repl-v0.ts │ ├── repl-v1.ts │ └── vscode.ts ├── calva-fmt │ ├── .vscodeignore │ ├── README.md │ ├── assets │ │ ├── align-items.gif │ │ ├── calva-fmt.png │ │ ├── format-current-form.gif │ │ ├── infer-parens.gif │ │ └── parinfer.gif │ ├── atom-language-clojure │ │ ├── .atom │ │ │ ├── .apm │ │ │ │ └── .apmrc │ │ │ └── config.cson │ │ ├── .coffeelintignore │ │ ├── .travis.yml │ │ ├── LICENSE.md │ │ ├── README.md │ │ ├── appveyor.yml │ │ ├── coffeelint.json │ │ ├── grammars │ │ │ └── clojure.cson │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── run-grammar-tests.sh │ │ ├── settings │ │ │ └── language-clojure.cson │ │ ├── snippets │ │ │ └── language-clojure.cson │ │ └── spec │ │ │ └── clojure-spec.coffee │ ├── src │ │ ├── extension.ts │ │ ├── format-index.ts │ │ ├── format.ts │ │ ├── healer.ts │ │ ├── infer.ts │ │ ├── providers │ │ │ ├── ontype_formatter.ts │ │ │ └── range_formatter.ts │ │ ├── respacer.ts │ │ └── state.ts │ └── update-grammar.js ├── cljs-lib │ ├── src │ │ ├── calva │ │ │ ├── dartclojure.cljs │ │ │ ├── fmt │ │ │ │ ├── editor.cljs │ │ │ │ ├── formatter.cljs │ │ │ │ ├── inferer.cljs │ │ │ │ ├── playground.cljs │ │ │ │ └── util.cljs │ │ │ ├── html2hiccup.cljs │ │ │ ├── interpolate.cljs │ │ │ ├── js2cljs │ │ │ │ └── converter.cljs │ │ │ ├── js_utils.cljs │ │ │ ├── main.cljs │ │ │ ├── parse.cljs │ │ │ ├── pprint │ │ │ │ └── printer.cljs │ │ │ ├── read_config.cljs │ │ │ ├── repl │ │ │ │ └── webview │ │ │ │ │ ├── core.cljs │ │ │ │ │ └── ui.cljs │ │ │ ├── state.cljs │ │ │ └── util.cljs │ │ ├── js_cljs │ │ │ └── core.cljs │ │ ├── pez_cljfmt │ │ │ ├── core.clj │ │ │ └── core.cljs │ │ └── pez_rewrite_clj │ │ │ ├── node.cljs │ │ │ ├── node │ │ │ ├── coercer.cljs │ │ │ ├── comment.cljs │ │ │ ├── fn.cljs │ │ │ ├── forms.cljs │ │ │ ├── keyword.cljs │ │ │ ├── meta.cljs │ │ │ ├── protocols.cljs │ │ │ ├── quote.cljs │ │ │ ├── reader_macro.cljs │ │ │ ├── seq.cljs │ │ │ ├── stringz.cljs │ │ │ ├── token.cljs │ │ │ ├── uneval.cljs │ │ │ └── whitespace.cljs │ │ │ ├── paredit.cljs │ │ │ ├── parser.cljs │ │ │ ├── parser │ │ │ ├── core.cljs │ │ │ ├── keyword.cljs │ │ │ ├── string.cljs │ │ │ ├── token.cljs │ │ │ └── whitespace.cljs │ │ │ ├── reader.cljs │ │ │ ├── zip.cljs │ │ │ └── zip │ │ │ ├── base.cljs │ │ │ ├── editz.cljs │ │ │ ├── findz.cljs │ │ │ ├── insert.cljs │ │ │ ├── move.cljs │ │ │ ├── removez.cljs │ │ │ ├── seqz.cljs │ │ │ ├── utils.cljs │ │ │ └── whitespace.cljs │ └── test │ │ ├── calva │ │ ├── fmt │ │ │ ├── editor_test.cljs │ │ │ ├── formatter_test.cljs │ │ │ └── util_test.cljs │ │ ├── html2hiccup_test.cljs │ │ ├── interpolate_test.cljs │ │ ├── js2cljs │ │ │ └── converter_test.cljs │ │ ├── js_utils_test.cljs │ │ ├── parse_test.cljs │ │ ├── pprint │ │ │ └── printer_test.cljs │ │ ├── repl │ │ │ └── webview │ │ │ │ └── core_test.cljs │ │ └── state_test.cljs │ │ ├── pez_rewrite_clj │ │ ├── node_test.cljs │ │ ├── paredit_test.cljs │ │ ├── runner.cljs │ │ ├── zip │ │ │ ├── editz_test.cljs │ │ │ ├── findz_test.cljs │ │ │ └── seqz_test.cljs │ │ └── zip_test.cljs │ │ └── test_util.cljs ├── clojuredocs.ts ├── config.ts ├── connector.ts ├── converters.ts ├── cursor-doc │ ├── backspace-on-whitespace.ts │ ├── clojure-lexer.ts │ ├── cursor-context.ts │ ├── indent.ts │ ├── lexer.ts │ ├── model.ts │ ├── paredit.ts │ ├── token-cursor.ts │ ├── undo.ts │ └── utilities.ts ├── custom-snippets.ts ├── debugger │ ├── calva-debug.ts │ ├── decorations.ts │ └── util.ts ├── doc-mirror │ └── index.ts ├── edit.ts ├── evaluate.ts ├── extension-test │ ├── e2e-test │ │ ├── .joyride │ │ │ ├── scripts │ │ │ │ └── workspace_activate.cljs │ │ │ └── src │ │ │ │ ├── config.cljs │ │ │ │ ├── db.cljs │ │ │ │ ├── macros.cljs │ │ │ │ ├── test_runner.cljs │ │ │ │ └── tests │ │ │ │ └── a_test.cljs │ │ ├── .vscode │ │ │ └── settings.json │ │ ├── bb.edn │ │ ├── launch.js │ │ ├── package-lock.json │ │ ├── package.json │ │ └── runTests.js │ ├── integration │ │ ├── integration-text-notation.ts │ │ ├── runTests.ts │ │ └── suite │ │ │ ├── annotations-test.ts │ │ │ ├── format-test.ts │ │ │ ├── highlight-test.ts │ │ │ ├── index.ts │ │ │ ├── jack-in-test.ts │ │ │ ├── project-utils-test.ts │ │ │ ├── serialization-test.ts │ │ │ └── util.ts │ └── unit │ │ ├── calva-fmt │ │ ├── healer-test.ts │ │ └── respacer-test.ts │ │ ├── common │ │ ├── text-notation-test.ts │ │ └── text-notation.ts │ │ ├── completion-test.ts │ │ ├── cursor-doc │ │ ├── clojure-lexer-test.ts │ │ ├── cursor-context-test.ts │ │ ├── indent-test.ts │ │ ├── paredit-test.ts │ │ ├── token-cursor-test.ts │ │ └── utilities-test.ts │ │ ├── debugger │ │ └── util-test.ts │ │ ├── file-switcher │ │ └── util-test.ts │ │ ├── formatting-test.ts │ │ ├── lsp │ │ └── semantic-token-filter-test.ts │ │ ├── nrepl │ │ └── util-test.ts │ │ ├── paredit │ │ └── commands-test.ts │ │ ├── results-output │ │ └── util-test.ts │ │ ├── test-runner-test.ts │ │ └── util │ │ ├── cursor-get-text-test.ts │ │ ├── fiddle-files-test.ts │ │ ├── ns-form-test.ts │ │ ├── regex-test.ts │ │ └── string-test.ts ├── extension.ts ├── fiddle-files.ts ├── file-switcher │ ├── file-switcher.ts │ └── util.ts ├── files-cache.ts ├── flare-handler.ts ├── formatter-config.ts ├── greet.ts ├── highlight │ ├── CHANGELOG.md │ ├── LICENSE.txt │ ├── README.md │ └── src │ │ └── extension.ts ├── joyride.ts ├── live-share.ts ├── lsp │ ├── api.ts │ ├── client │ │ ├── client.ts │ │ ├── downloader.ts │ │ ├── index.ts │ │ ├── messages.ts │ │ └── semantic-token-filter.ts │ ├── commands │ │ ├── index.ts │ │ ├── lsp-commands.ts │ │ └── vscode-commands.ts │ ├── config.ts │ ├── definitions.ts │ ├── index.ts │ ├── project-tree.ts │ ├── provider.ts │ ├── queue.ts │ ├── state.ts │ ├── status-bar.ts │ └── utils.ts ├── namespace.ts ├── nrepl │ ├── bencode.ts │ ├── cider.ts │ ├── connect-types.ts │ ├── connectSequence.ts │ ├── deps-clj.ts │ ├── drams.ts │ ├── index.ts │ ├── jack-in-terminal.ts │ ├── jack-in.ts │ ├── logging.ts │ ├── project-types.ts │ ├── repl-menu.ts │ ├── repl-session.ts │ └── util.ts ├── overrides.ts ├── paredit │ ├── commands.ts │ ├── extension.ts │ └── statusbar.ts ├── printer.ts ├── project-root.ts ├── providers │ ├── annotations.ts │ ├── codelense.ts │ ├── completion-util.ts │ ├── completion.ts │ ├── content.ts │ ├── definition.ts │ ├── hover.ts │ ├── infoparser.ts │ ├── inspector.ts │ └── signature.ts ├── refresh.ts ├── repl-window │ ├── repl-doc.ts │ └── repl-history.ts ├── results-output │ ├── output.ts │ └── util.ts ├── select.ts ├── state.ts ├── status.ts ├── statusbar.ts ├── testRunner.ts ├── util │ ├── cursor-get-text.ts │ ├── fiddle-files.ts │ ├── get-text.ts │ ├── ns-form.ts │ ├── object.ts │ ├── regex.ts │ ├── string-result.ts │ └── string.ts ├── utilities.ts └── when-contexts.ts ├── test-data ├── .calva │ └── config.edn ├── .cljfmt.edn ├── .joyride │ ├── deps.edn │ └── scripts │ │ ├── activate.cljs │ │ ├── calva_lab.cljs │ │ ├── clojure_file.clj │ │ └── hello.cljs ├── .vscode │ └── settings.json ├── clojure_core.clj ├── custom-jack-in.bb ├── custom-jack-in.sh ├── deps.edn ├── empty-folder │ └── .keep ├── integration-test │ ├── reformattable.clj │ └── test.clj ├── lab │ └── pirate_lang.clj ├── projects │ ├── .gitignore │ ├── auto-jack-in-absolute │ │ ├── .vscode │ │ │ └── settings.json │ │ ├── deps.edn │ │ └── src │ │ │ └── minimal │ │ │ └── hello.clj │ ├── cljs-only │ │ ├── deps.edn │ │ ├── index.html │ │ └── src │ │ │ └── hello_world │ │ │ └── core.cljs │ ├── completions │ │ ├── deps.edn │ │ └── src │ │ │ ├── aliased.clj │ │ │ ├── aliasing.clj │ │ │ └── another_ns.clj │ ├── current-form │ │ ├── deps.edn │ │ └── src │ │ │ └── top_level.clj │ ├── deps-main-opts │ │ ├── deps.edn │ │ └── src │ │ │ └── main_opts │ │ │ └── hello.clj │ ├── e2e-sub-projects │ │ ├── .joyride │ │ │ ├── scripts │ │ │ │ └── workspace_activate.cljs │ │ │ └── src │ │ │ │ ├── config.cljs │ │ │ │ ├── db.cljs │ │ │ │ ├── macros.cljs │ │ │ │ ├── test_runner.cljs │ │ │ │ └── tests │ │ │ │ └── example_test.cljs │ │ ├── no-project-here │ │ │ ├── project-a │ │ │ │ ├── a.cljs │ │ │ │ └── deps.edn │ │ │ ├── project-b │ │ │ │ └── b.cljs │ │ │ └── sub-projects │ │ │ │ ├── proj1 │ │ │ │ └── deps.edn │ │ │ │ └── proj2 │ │ │ │ └── deps.edn │ │ ├── project-a │ │ │ ├── a.cljs │ │ │ └── deps.edn │ │ ├── project-b │ │ │ └── b.cljs │ │ └── sub-projects │ │ │ ├── proj1 │ │ │ └── deps.edn │ │ │ └── proj2 │ │ │ └── deps.edn │ ├── frankenstein │ │ ├── deps.edn │ │ ├── src │ │ │ ├── overshadow_core.clj │ │ │ └── pretty_printing.clj │ │ └── test │ │ │ └── output_test.clj │ ├── kaocha-project │ │ ├── deps.edn │ │ ├── env │ │ │ └── dev │ │ │ │ └── user.clj │ │ ├── src │ │ │ └── foo.clj │ │ ├── test │ │ │ └── foo_test.clj │ │ └── tests.edn │ ├── lein-project │ │ ├── .gitignore │ │ ├── project.clj │ │ ├── src │ │ │ └── lein_project │ │ │ │ └── core.clj │ │ └── test │ │ │ └── lein_project │ │ │ └── core_test.clj │ ├── load-bar-requiring-foo │ │ ├── README.md │ │ ├── deps.edn │ │ └── src │ │ │ ├── bar.clj │ │ │ └── foo.clj │ ├── minimal-basilisp │ │ ├── basilisp.edn │ │ └── src │ │ │ └── test.lpy │ ├── minimal-deps │ │ ├── deps.edn │ │ └── src │ │ │ └── minimal │ │ │ └── hello.clj │ ├── minimal-reveal │ │ ├── README.md │ │ ├── deps.edn │ │ └── src │ │ │ └── hello.clj │ ├── minimal-shadow-only │ │ ├── .gitignore │ │ ├── .joyride │ │ │ └── deps.edn │ │ ├── .vscode │ │ │ └── settings.json │ │ ├── deps.edn │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ └── style.css │ │ │ └── index.html │ │ ├── shadow-cljs.edn │ │ └── src │ │ │ └── main │ │ │ └── core.cljs │ ├── mono-repo-2 │ │ ├── .gitignore │ │ ├── README.md │ │ ├── libs │ │ │ ├── lib1 │ │ │ │ ├── deps.edn │ │ │ │ └── src │ │ │ │ │ └── mycorp │ │ │ │ │ └── lib1 │ │ │ │ │ └── core.clj │ │ │ └── lib2 │ │ │ │ ├── deps.edn │ │ │ │ └── src │ │ │ │ └── mycorp │ │ │ │ └── lib2 │ │ │ │ └── core.clj │ │ ├── project1 │ │ │ ├── deps.edn │ │ │ ├── project1.code-workspace │ │ │ └── src │ │ │ │ └── mycorp │ │ │ │ └── project1 │ │ │ │ └── core.clj │ │ └── project2 │ │ │ ├── deps.edn │ │ │ ├── project2.code-workspace │ │ │ └── src │ │ │ └── mycorp │ │ │ └── project2 │ │ │ └── core.clj │ ├── mono-repo │ │ ├── README.md │ │ ├── deps.edn │ │ ├── distinct-workspaces.code-workspace │ │ ├── projects │ │ │ ├── a │ │ │ │ ├── deps.edn │ │ │ │ └── src │ │ │ │ │ ├── a │ │ │ │ │ └── core.clj │ │ │ │ │ └── main.clj │ │ │ └── b │ │ │ │ ├── .gitignore │ │ │ │ ├── .lsp │ │ │ │ └── config.edn │ │ │ │ ├── deps.edn │ │ │ │ └── src │ │ │ │ └── b │ │ │ │ └── main.clj │ │ └── workspace.code-workspace │ ├── my-gradle │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build.gradle │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ ├── gradle-wrapper.jar │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ ├── settings.gradle │ │ └── src │ │ │ ├── main │ │ │ └── clojure │ │ │ │ └── my │ │ │ │ └── group │ │ │ │ └── mylib.clj │ │ │ └── test │ │ │ └── clojure │ │ │ └── my │ │ │ └── group │ │ │ └── mylib_test.clj │ ├── pirate-lang │ │ ├── .joyride │ │ │ ├── deps.edn │ │ │ └── scripts │ │ │ │ └── ns_experiment.cljs │ │ ├── deps.edn │ │ ├── dev │ │ │ └── fiddles │ │ │ │ └── pez │ │ │ │ └── pirate_lang.clj │ │ ├── env │ │ │ └── dev │ │ │ │ ├── fiddles │ │ │ │ └── pez │ │ │ │ │ └── pirate_lang.clj │ │ │ │ └── repl.clj │ │ ├── src │ │ │ └── pez │ │ │ │ ├── long_text.fiddle │ │ │ │ ├── pirate_lang.clj │ │ │ │ └── pirate_lang.fiddle │ │ ├── src2 │ │ │ └── pez │ │ │ │ ├── foo_clj.clj │ │ │ │ ├── foo_cljc.cljc │ │ │ │ └── foo_cljs.cljs │ │ └── test │ │ │ └── pez │ │ │ └── pirate_lang_test.clj │ ├── repl-connected-code │ │ ├── .vscode │ │ │ └── settings.json │ │ ├── README.md │ │ ├── deps.edn │ │ └── src │ │ │ └── repro │ │ │ └── hello.clj │ └── shadow-w-backend │ │ ├── .gitignore │ │ ├── README.md │ │ ├── deps.edn │ │ ├── env │ │ └── dev │ │ │ └── fiddles │ │ │ └── main │ │ │ ├── common.cljc │ │ │ └── server.clj │ │ ├── package.json │ │ ├── project.clj │ │ ├── public │ │ ├── css │ │ │ └── style.css │ │ └── index.html │ │ ├── shadow-cljs.edn │ │ └── src │ │ └── main │ │ ├── common.cljc │ │ ├── common.fiddle │ │ ├── core.cljs │ │ ├── core.fiddle │ │ ├── server.clj │ │ └── server.fiddle ├── test-files │ ├── calva-247-hang.clj │ ├── calva-252-hang.clj │ ├── cljfmt-sabndbox.clj │ ├── comment_continuation.clj │ ├── debugger_metadata.clj │ ├── formatter_sandbox.clj │ ├── hiccup.clj │ ├── highlight_test.clj │ ├── indent.clj │ ├── indenter-cases.clj │ ├── indenter_vs_formatter.clj │ ├── issue418.cljc │ ├── issue_2270_quote.clj │ ├── javascript-code.js │ ├── metadata_toplevel_select_issue.clj │ ├── nom.clj │ ├── notebook.clj │ ├── ns_form.cljc │ ├── one_line.clj │ ├── paredit_sandbox.clj │ ├── paste-formatted.clj │ ├── pprinter.clj │ ├── select.clj │ ├── some-html.html │ ├── test.sh │ ├── test2.clj │ ├── test3.clj │ ├── top_level.clj │ └── unbalance.clj └── workspaces │ ├── workspace.code-workspace │ ├── ws-a │ ├── a.cljs │ ├── clojure_core.clj │ ├── deps.edn │ └── pirate_lang.clj │ ├── ws-b │ ├── b.cljs │ └── pirate-lang │ │ └── deps.edn │ └── ws-sub-projs │ ├── proj1 │ └── deps.edn │ └── proj2 │ └── deps.edn ├── todo.org ├── tsconfig.eslint.json ├── tsconfig.json └── webpack.config.js /.circleci/.gitignore: -------------------------------------------------------------------------------- 1 | /_config.yml 2 | /shellcheck* 3 | -------------------------------------------------------------------------------- /.circleci/README.md: -------------------------------------------------------------------------------- 1 | # CircleCI `config.yml` 2 | 3 | CircleCI uses the `config.yml` file. 4 | 5 | This file is generated from the `config.ys` file which references many other 6 | files in this directory. 7 | 8 | To regenerate `config.yml` after changing source files, run one of these 9 | commands: 10 | 11 | ``` 12 | $ make build 13 | $ bb build 14 | ``` 15 | 16 | 17 | ## Layout 18 | 19 | * `Makefile` - for building `config.yml` and running tests. 20 | * Auto installs deps 21 | * `config.ys` - The main [YS](https://yamlscript.org) file that evaluates to 22 | the correct CircleCI `config.yml` file. 23 | * `bin/` - All the longer bash sections refactored to testable .bash files. 24 | * `jobs/` - Each `job` yaml section refactored to its own file. 25 | * `workflows/` - Each `workflow` yaml section refactored to its own file. 26 | * `lib/helpers.ys` - A YAMLScript library of helper functions. 27 | 28 | 29 | ## Testing 30 | 31 | To run tests that check various things, run one of: 32 | 33 | ``` 34 | $ make test 35 | $ bb test 36 | ``` 37 | -------------------------------------------------------------------------------- /.circleci/bb.edn: -------------------------------------------------------------------------------- 1 | {:deps {medley/medley {:mvn/version "1.3.0"}} 2 | :min-bb-version "0.4.0" 3 | :tasks 4 | {:requires ([babashka.fs :as fs]) 5 | :init 6 | (do 7 | (defn ? [x] (println "<<<\n" x "\n>>>") x) 8 | (defn env [s] (System/getenv s)) 9 | (def PATH (str "/tmp/yamlscript/bin:" (env "PATH"))) 10 | (def YSPATH (str (fs/cwd) "/lib")) 11 | (def ENV {:extra-env {"PATH" PATH 12 | "YSPATH" YSPATH}}) 13 | (defn sh [& xs] 14 | (do 15 | (apply println "+" xs) 16 | (apply shell ENV xs))) 17 | (defn make [target] (sh (str "make " target)))) 18 | ;; For now just call 'make' for the bb task: 19 | build (make "build") 20 | test (make "test") 21 | clean (make "clean")}} 22 | 23 | -------------------------------------------------------------------------------- /.circleci/bin/bump-dev-version.bash: -------------------------------------------------------------------------------- 1 | git config --global user.email "$GITHUB_USER_EMAIL" 2 | git config --global user.name "$GITHUB_USER_NAME" 3 | git checkout dev 4 | npm run bump-version 5 | git pull 6 | git add . 7 | git commit -m "Bring on version $(node -p "require('./package').version")!" 8 | git push origin HEAD 9 | -------------------------------------------------------------------------------- /.circleci/bin/merge-dev-into-published.bash: -------------------------------------------------------------------------------- 1 | git config --global user.email "$GITHUB_USER_EMAIL" 2 | git config --global user.name "$GITHUB_USER_NAME" 3 | git checkout published 4 | git pull 5 | git merge origin/dev --no-ff -m "Merge branch dev into published" 6 | git push origin HEAD 7 | -------------------------------------------------------------------------------- /.circleci/bin/merge-published-into-dev.bash: -------------------------------------------------------------------------------- 1 | git config --global user.email "$GITHUB_USER_EMAIL" 2 | git config --global user.name "$GITHUB_USER_NAME" 3 | git checkout dev 4 | git pull 5 | git merge origin/published --no-ff -m "Merge branch published into dev [skip ci]" 6 | git push origin HEAD 7 | -------------------------------------------------------------------------------- /.circleci/bin/package-vsix.bash: -------------------------------------------------------------------------------- 1 | if [[ $CIRCLE_TAG =~ ^v([0-9]+\.[0-9]+\.[0-9]+)$ ]]; then 2 | echo 'Packaging as release' 3 | PACKAGE_CMD=(vsce package --githubBranch published) 4 | 5 | else 6 | echo 'Packaging as pre-release' 7 | PACKAGE_CMD=(vsce package --pre-release) 8 | fi 9 | 10 | npx "${PACKAGE_CMD[@]}" 11 | -------------------------------------------------------------------------------- /.circleci/bin/publish-release-on-github.bash: -------------------------------------------------------------------------------- 1 | EXTRA_RELEASE_OPTIONS=() 2 | 3 | if [[ $CIRCLE_TAG =~ ^v([0-9]+\.[0-9]+\.[0-9]+)$ ]]; then 4 | echo "Publishing GitHub Release: $CIRCLE_TAG" 5 | else 6 | echo "Publishing GitHub Prerelease: $CIRCLE_TAG" 7 | EXTRA_RELEASE_OPTIONS=(-prerelease) 8 | fi 9 | 10 | [[ $CIRCLE_TAG =~ ^v([0-9]+\.[0-9]+\.[0-9]+) ]] || exit 11 | TAG_VERSION=${BASH_REMATCH[1]} 12 | 13 | BODY=$(awk ' 14 | /^## \['"$TAG_VERSION"'\]/, started && 15 | /^##/ { 16 | started=1; 17 | if ($0 !~ /(^#|^\s*$)/) { 18 | gsub(/["$]/, "\\\\&"); 19 | print 20 | } 21 | }' CHANGELOG.md) 22 | 23 | echo $'Changes: \n'"$BODY" 24 | 25 | if [[ $IS_LOCAL == YES ]]; then 26 | GHR_CMD='echo' 27 | else 28 | GHR_CMD=ghr 29 | fi 30 | 31 | $GHR_CMD -t "$GITHUB_TOKEN" \ 32 | "${EXTRA_RELEASE_OPTIONS[@]}" \ 33 | -u "$CIRCLE_PROJECT_USERNAME" \ 34 | -r "$CIRCLE_PROJECT_REPONAME" \ 35 | -b "$BODY" \ 36 | -c "$CIRCLE_SHA1" \ 37 | -delete "$CIRCLE_TAG" \ 38 | /tmp/artifacts/ 39 | -------------------------------------------------------------------------------- /.circleci/bin/publish-to-open-vsx.bash: -------------------------------------------------------------------------------- 1 | OVSX_CMD=( 2 | ovsx publish "/tmp/artifacts/calva-$( 3 | node -p 'require("./package.json").version' 4 | ).vsix" --pat "$OVSX_PUBLISH_TOKEN" 5 | ) 6 | 7 | if [[ $IS_LOCAL == YES ]]; then 8 | echo "Dry npx ${OVSX_CMD[*]}" 9 | 10 | else 11 | npx "${OVSX_CMD[@]}" 12 | fi 13 | -------------------------------------------------------------------------------- /.circleci/bin/publish-to-the-marketplace-2.bash: -------------------------------------------------------------------------------- 1 | VSCE_CMD=( 2 | vsce publish --packagePath "/tmp/artifacts/calva-$( 3 | node -p 'require("./package.json").version' 4 | ).vsix" -p "$PUBLISH_TOKEN" 5 | ) 6 | 7 | if [[ $IS_LOCAL == YES ]]; then 8 | echo "Dry npx ${VSCE_CMD[*]}" 9 | 10 | else 11 | npx "${VSCE_CMD[@]}" 12 | fi 13 | -------------------------------------------------------------------------------- /.circleci/bin/publish-to-the-marketplace.bash: -------------------------------------------------------------------------------- 1 | VSCE_CMD=( 2 | vsce publish --pre-release --packagePath "/tmp/artifacts/calva-$( 3 | node -p 'require("./package.json").version' 4 | ).vsixi" -p "$PUBLISH_TOKEN" 5 | ) 6 | 7 | if [[ $IS_LOCAL == YES ]]; then 8 | echo "Dry npx ${VSCE_CMD[*]}" 9 | 10 | else 11 | npx "${VSCE_CMD[@]}" 12 | fi 13 | -------------------------------------------------------------------------------- /.circleci/jobs/bump-dev-version.yaml: -------------------------------------------------------------------------------- 1 | !YS-v0: 2 | 3 | docker: 4 | - image: cimg/node:15.8 5 | 6 | steps: 7 | - !:add-ssh: ssh-fingerprint-1 8 | 9 | - checkout 10 | 11 | - !:bin Bump dev version 12 | -------------------------------------------------------------------------------- /.circleci/jobs/deploy-docs.yaml: -------------------------------------------------------------------------------- 1 | !YS-v0: 2 | 3 | docker: 4 | - image: cimg/python:3.8-node 5 | 6 | environment: 7 | MKDOCS_ENV: production 8 | 9 | steps: 10 | - !:add-ssh: ssh-fingerprint-1 11 | 12 | - checkout 13 | 14 | - !:cmd 15 | - Update system package lists 16 | - sudo apt-get update 17 | 18 | - !:cmd 19 | - Install mkdocs-materials dependencies 20 | - sudo apt-get install libcairo2-dev libfreetype6-dev 21 | libffi-dev libjpeg-dev libpng-dev libz-dev 22 | 23 | - !:cmd 24 | - Install mkdocs and mkdocs-materials 25 | - pip install -r requirements.txt 26 | 27 | - !:cmd 28 | - Deploy docs 29 | - git checkout published; 30 | mkdocs gh-deploy --config-file mkdocs.yml 31 | --message "[skip ci]" --clean 32 | -------------------------------------------------------------------------------- /.circleci/jobs/eslint-check.yaml: -------------------------------------------------------------------------------- 1 | !YS-v0: 2 | docker: 3 | - image: cimg/node:22.16.0 4 | 5 | working_directory: ~/calva 6 | 7 | steps: 8 | - !:attach-workspace /tmp 9 | 10 | - !:cmd 11 | - Restore build 12 | - rmdir ~/calva && cp -r /tmp/build ~/calva 13 | 14 | - !:cmd 15 | - Run eslint check 16 | - npm run eslint 17 | -------------------------------------------------------------------------------- /.circleci/jobs/github-release.yaml: -------------------------------------------------------------------------------- 1 | !YS-v0: 2 | 3 | docker: 4 | - image: cibuilds/github:0.10 5 | 6 | working_directory: ~/calva 7 | 8 | steps: 9 | - !:attach-workspace /tmp 10 | 11 | - !:cmd 12 | - Restore build 13 | - rmdir ~/calva && cp -r /tmp/build ~/calva 14 | 15 | - !:bin Publish Release on GitHub 16 | -------------------------------------------------------------------------------- /.circleci/jobs/marketplace-preview-publish.yaml: -------------------------------------------------------------------------------- 1 | !YS-v0: 2 | docker: 3 | - image: cimg/node:22.16.0 4 | 5 | working_directory: ~/calva 6 | 7 | steps: 8 | - !:attach-workspace /tmp 9 | 10 | - !:cmd 11 | - Restore build 12 | - rmdir ~/calva && cp -r /tmp/build ~/calva 13 | 14 | - !:bin Publish to the marketplace 15 | -------------------------------------------------------------------------------- /.circleci/jobs/marketplace-publish.yaml: -------------------------------------------------------------------------------- 1 | !YS-v0: 2 | docker: 3 | - image: cimg/node:22.16.0 4 | 5 | working_directory: ~/calva 6 | 7 | steps: 8 | - !:attach-workspace /tmp 9 | 10 | - !:cmd 11 | - Restore build 12 | - rmdir ~/calva && cp -r /tmp/build ~/calva 13 | 14 | - !:bin* 15 | - Publish to the marketplace 16 | - publish-to-the-marketplace-2 17 | -------------------------------------------------------------------------------- /.circleci/jobs/merge-dev-into-published.yaml: -------------------------------------------------------------------------------- 1 | !YS-v0: 2 | 3 | docker: 4 | - image: cimg/node:15.8 5 | 6 | steps: 7 | - !:add-ssh: ssh-fingerprint-1 8 | 9 | - checkout 10 | 11 | - !:bin Merge dev into published 12 | -------------------------------------------------------------------------------- /.circleci/jobs/merge-published-into-dev.yaml: -------------------------------------------------------------------------------- 1 | !YS-v0: 2 | 3 | docker: 4 | - image: cimg/node:15.8 5 | 6 | steps: 7 | - !:add-ssh: ssh-fingerprint-1 8 | 9 | - checkout 10 | 11 | - !:bin Merge published into dev 12 | -------------------------------------------------------------------------------- /.circleci/jobs/open-vsx-publish.yaml: -------------------------------------------------------------------------------- 1 | !YS-v0: 2 | docker: 3 | - image: cimg/node:22.16.0 4 | 5 | working_directory: ~/calva 6 | 7 | steps: 8 | - !:attach-workspace /tmp 9 | 10 | - !:cmd 11 | - Restore build 12 | - rmdir ~/calva && cp -r /tmp/build ~/calva 13 | 14 | - !:bin Publish to Open VSX 15 | -------------------------------------------------------------------------------- /.circleci/jobs/prettier-check.yaml: -------------------------------------------------------------------------------- 1 | !YS-v0: 2 | docker: 3 | - image: cimg/node:22.16.0 4 | 5 | working_directory: ~/calva 6 | 7 | steps: 8 | - !:attach-workspace /tmp 9 | 10 | - !:cmd 11 | - Restore build 12 | - rmdir ~/calva && cp -r /tmp/build ~/calva 13 | 14 | - !:cmd 15 | - Run prettier format check 16 | - npm run prettier-check 17 | -------------------------------------------------------------------------------- /.circleci/jobs/test-cljslib.yaml: -------------------------------------------------------------------------------- 1 | !YS-v0: 2 | docker: 3 | - image: cimg/node:22.16.0 4 | 5 | working_directory: ~/calva 6 | 7 | steps: 8 | - !:attach-workspace /tmp 9 | 10 | - !:cmd 11 | - Restore build 12 | - rmdir ~/calva && cp -r /tmp/build ~/calva 13 | 14 | - !:cmd 15 | - Run CLJS Tests 16 | - npm run calva-lib-test 17 | 18 | - !:store 19 | test_results: ~/calva/junit 20 | -------------------------------------------------------------------------------- /.circleci/jobs/test-e2e-sub-projects.yaml: -------------------------------------------------------------------------------- 1 | !YS-v0: 2 | 3 | docker: 4 | - image: cimg/clojure:1.11-browsers 5 | 6 | working_directory: ~/calva 7 | 8 | steps: 9 | - !:attach-workspace /tmp 10 | 11 | - !:cmd 12 | - Restore build 13 | - rmdir ~/calva && cp -r /tmp/build ~/calva 14 | 15 | - !:cmd 16 | - Apt install missing dependencies 17 | - sudo apt-key adv --keyserver keyserver.ubuntu.com 18 | --recv-keys E88979FB9B30ACF2; 19 | sudo apt update && sudo apt install -y libnss3 20 | 21 | - !:cmd 22 | - Run VSIX E2E Tests for test-data/projects/e2e-sub-projects 23 | - npm run e2e-test -- 24 | --calva-vsix=/tmp/artifacts/calva-$( 25 | node -p 'require("./package.json").version' 26 | ).vsix 27 | --test-workspace=test-data/projects/e2e-sub-projects 28 | 29 | - !:store 30 | test_results: ~/calva/junit 31 | -------------------------------------------------------------------------------- /.circleci/jobs/test-e2e.yaml: -------------------------------------------------------------------------------- 1 | !YS-v0: 2 | 3 | docker: 4 | - image: cimg/clojure:1.11-browsers 5 | 6 | working_directory: ~/calva 7 | 8 | steps: 9 | - !:attach-workspace /tmp 10 | 11 | - !:cmd 12 | - Restore build 13 | - rmdir ~/calva && cp -r /tmp/build ~/calva 14 | 15 | - !:cmd 16 | - Apt install missing dependencies 17 | - sudo apt-key adv --keyserver keyserver.ubuntu.com 18 | --recv-keys E88979FB9B30ACF2; 19 | sudo apt update && sudo apt install -y libnss3 20 | 21 | - !:cmd 22 | - Run VSIX E2E Tests 23 | - npm run e2e-test -- 24 | --calva-vsix=/tmp/artifacts/calva-$( 25 | node -p 'require("./package.json").version' 26 | ).vsix 27 | --test-workspace=src/extension-test/e2e-test 28 | 29 | - !:store 30 | test_results: ~/calva/junit 31 | -------------------------------------------------------------------------------- /.circleci/jobs/test-ts-unit.yaml: -------------------------------------------------------------------------------- 1 | !YS-v0: 2 | docker: 3 | - image: cimg/node:22.16.0 4 | 5 | working_directory: ~/calva 6 | 7 | steps: 8 | - !:attach-workspace /tmp 9 | 10 | - !:cmd 11 | - Restore build 12 | - rmdir ~/calva && cp -r /tmp/build ~/calva 13 | 14 | - !:cmd 15 | - Run TS Unit Tests 16 | - npm run unit-test 17 | 18 | - !:store 19 | test_results: ~/calva/junit 20 | -------------------------------------------------------------------------------- /.circleci/lib/helpers.ys: -------------------------------------------------------------------------------- 1 | !YS-v0 2 | 3 | ns: helpers 4 | 5 | defn bin: 6 | (label name):: 7 | run: 8 | name:: label 9 | command:: 10 | read: "bin/$name.bash" 11 | 12 | (label): 13 | name =: label:lc.replace(' ', '-') 14 | bin: label name 15 | 16 | defn cmd([label code]):: 17 | run: 18 | name:: label 19 | command:: code 20 | 21 | defn docker(image):: 22 | docker: 23 | image:: image 24 | 25 | defn add-ssh(fingerprint):: 26 | add_ssh_keys: 27 | fingerprints:: -[fingerprint] 28 | 29 | defn attach-workspace(path):: 30 | attach_workspace: 31 | at:: path 32 | 33 | defn store(pair): 34 | type =: pair:keys.0 35 | path =: pair:vals.0 36 | =>:: 37 | ! "store_$type": 38 | path:: path 39 | -------------------------------------------------------------------------------- /.circleci/workflows/build-test.yaml: -------------------------------------------------------------------------------- 1 | !YS-v0: 2 | 3 | jobs: 4 | - checkout: 5 | filters: 6 | tags: 7 | ignore: /^v\d+\.\d+\.\d+-?.*/ 8 | 9 | - prettier-check: {requires: [checkout]} 10 | - test-grammar: {requires: [checkout]} 11 | - build: {requires: [checkout]} 12 | 13 | - eslint-check: {requires: [build]} 14 | - test-cljslib: {requires: [build]} 15 | - test-integration: {requires: [build]} 16 | - test-e2e: {requires: [build]} 17 | - test-e2e-sub-projects: {requires: [build]} 18 | - test-ts-unit: {requires: [build]} 19 | 20 | - marketplace-preview-publish: 21 | requires: 22 | - prettier-check 23 | - eslint-check 24 | - test-grammar 25 | - test-cljslib 26 | - test-integration 27 | - test-e2e 28 | - test-e2e-sub-projects 29 | - test-ts-unit 30 | filters: 31 | branches: 32 | # dev (disabled for now because 33 | # https://github.com/microsoft/vsmarketplace/issues/310) 34 | only: disabled 35 | context: Calva 36 | -------------------------------------------------------------------------------- /.circleci/workflows/calva-io-build.yaml: -------------------------------------------------------------------------------- 1 | jobs: 2 | - deploy-docs: 3 | filters: 4 | branches: 5 | only: published 6 | context: Calva 7 | 8 | - merge-published-into-dev: 9 | filters: 10 | branches: 11 | only: published 12 | context: Calva 13 | -------------------------------------------------------------------------------- /.clj-kondo/config.edn: -------------------------------------------------------------------------------- 1 | {:linters 2 | {:unresolved-symbol 3 | {:exclude [(clojure.test/is [match?])]}}} 4 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /.shadow-cljs 3 | /out 4 | /.vscode-test 5 | /.vscode 6 | /.lsp 7 | /.clj-kondo 8 | /site 9 | /test-data 10 | /repl-output-ui 11 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [PEZ, bpringe, corasaurus-hex, Cyrik, riotrah] 4 | # patreon: # Replace with a single Patreon username 5 | # open_collective: # Replace with a single Open Collective username 6 | # ko_fi: # Replace with a single Ko-fi username 7 | # tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | # community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | # liberapay: # Replace with a single Liberapay username 10 | # issuehunt: # Replace with a single IssueHunt username 11 | # otechie: # Replace with a single Otechie username 12 | # custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] -------------------------------------------------------------------------------- /.gitpod.dockerfile: -------------------------------------------------------------------------------- 1 | FROM gitpod/workspace-full 2 | 3 | RUN brew install clojure/tools/clojure 4 | RUN brew install leiningen -------------------------------------------------------------------------------- /.gitpod.yml: -------------------------------------------------------------------------------- 1 | image: 2 | file: .gitpod.dockerfile 3 | tasks: 4 | - init: npm i 5 | # command: clojure -Sdeps '{:deps {nrepl {:mvn/version "0.6.0"} cider/cider-nrepl {:mvn/version "0.23.0"}}}' -m nrepl.cmdline --middleware "[cider.nrepl/cider-middleware]" 6 | vscode: 7 | extensions: 8 | - betterthantomorrow.calva@2.0.90:QqaT9WwNey/mBcvg2i0WUA== -------------------------------------------------------------------------------- /.joyride/deps.edn: -------------------------------------------------------------------------------- 1 | ;; clojure-lsp needs this config to analyze Joyride code 2 | ;; To tell clojure-lsp about this file: 3 | ;; 1. Add a source-alias to `.lsp/config.edn`. Minimal config file content: 4 | ;; {:source-aliases #{:joyride}} 5 | ;; 2. Add a `:joyride` alias to the project root deps.edn file. 6 | ;; Minimal file content: 7 | ;; {:aliases {:joyride {:extra-deps {joyride/workspace {:local/root ".joyride"}}}}} 8 | 9 | {:deps {org.clojure/clojurescript {:mvn/version "1.11.54"} 10 | funcool/promesa {:mvn/version "9.0.471"} 11 | rewrite-clj/rewrite-clj {:mvn/version "1.1.46"} 12 | joyride/user {:local/root "/Users/pez/.config/joyride"}} 13 | :paths ["src" "scripts"]} -------------------------------------------------------------------------------- /.mailmap: -------------------------------------------------------------------------------- 1 | Peter Strömberg Peter 2 | Peter Strömberg Peter Strömberg 3 | Peter Strömberg Peter Strömberg 4 | Brandon Ringe Brandon 5 | Brandon Ringe Brandon Ringe <12722744+bpringe@users.noreply.github.com> -------------------------------------------------------------------------------- /.node-version: -------------------------------------------------------------------------------- 1 | 16 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /.shadow-cljs 3 | /out 4 | /.vscode-test 5 | /site 6 | .cache 7 | **/public/ 8 | **/target/ 9 | **/.shadow-cljs/ 10 | **/out/ 11 | clojure.tmLanguage.json 12 | /repl-output-ui 13 | *.md 14 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 100, 3 | "tabWidth": 2, 4 | "useTabs": false, 5 | "semi": true, 6 | "singleQuote": true, 7 | "quoteProps": "as-needed", 8 | "jsxSingleQuote": false, 9 | "trailingComma": "es5", 10 | "bracketSpacing": true, 11 | "bracketSameLine": false, 12 | "arrowParens": "always", 13 | "proseWrap": "preserve", 14 | "htmlWhitespaceSensitivity": "css", 15 | "endOfLine": "auto", 16 | "embeddedLanguageFormatting": "auto", 17 | "overrides": [ 18 | { 19 | "files": [ 20 | "*.css" 21 | ], 22 | "options": { 23 | "singleQuote": false 24 | } 25 | } 26 | ] 27 | } -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["esbenp.prettier-vscode", "hbenl.vscode-mocha-test-adapter"] 3 | } 4 | -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | # Put everything on the blacklist by default 2 | * 3 | */** 4 | **/.DS_Store 5 | */**/.DS_Store 6 | 7 | # Whitelist 8 | !language-configuration.json 9 | !clojure.tmLanguage.json 10 | !assets/** 11 | !out/** 12 | !repl-output-ui/** 13 | !package.json 14 | !README.md 15 | !CHANGELOG.md 16 | !LICENSE 17 | !clojure-lsp.jar 18 | !clojure-lsp-version 19 | !deps.clj.jar 20 | !deps-clj-version 21 | !bundled/** 22 | !snippets.jsonc 23 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | While you are here, please consider [Sponsoring Calva Development](https://github.com/sponsors/PEZ) ❤️ 2 | 3 | See also this wiki page: [How to Contribute](https://github.com/BetterThanTomorrow/calva/wiki/How-to-Contribute) 4 | 5 | Happy Coding! 6 | -------------------------------------------------------------------------------- /assets/calva-64h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/calva-64h.png -------------------------------------------------------------------------------- /assets/calva.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/calva.png -------------------------------------------------------------------------------- /assets/calva128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/calva128x128.png -------------------------------------------------------------------------------- /assets/cw_screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/cw_screenshot.png -------------------------------------------------------------------------------- /assets/fonts/FiraCode-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/fonts/FiraCode-Bold.woff2 -------------------------------------------------------------------------------- /assets/fonts/FiraCode-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/fonts/FiraCode-Light.woff2 -------------------------------------------------------------------------------- /assets/fonts/FiraCode-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/fonts/FiraCode-Medium.woff2 -------------------------------------------------------------------------------- /assets/fonts/FiraCode-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/fonts/FiraCode-Regular.woff2 -------------------------------------------------------------------------------- /assets/howto/cljc-clj-cljs.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/howto/cljc-clj-cljs.gif -------------------------------------------------------------------------------- /assets/howto/dimming-ignores.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/howto/dimming-ignores.gif -------------------------------------------------------------------------------- /assets/howto/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/howto/error.png -------------------------------------------------------------------------------- /assets/howto/evaluate.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/howto/evaluate.gif -------------------------------------------------------------------------------- /assets/howto/features.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/howto/features.gif -------------------------------------------------------------------------------- /assets/howto/outline-view.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/howto/outline-view.gif -------------------------------------------------------------------------------- /assets/howto/paredit-up-wrap.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/howto/paredit-up-wrap.gif -------------------------------------------------------------------------------- /assets/howto/rainbow-guides.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/howto/rainbow-guides.gif -------------------------------------------------------------------------------- /assets/howto/references-code-lens.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/howto/references-code-lens.gif -------------------------------------------------------------------------------- /assets/howto/signature-help.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/howto/signature-help.gif -------------------------------------------------------------------------------- /assets/howto/status_clj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/howto/status_clj.png -------------------------------------------------------------------------------- /assets/howto/status_cljs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/howto/status_cljs.png -------------------------------------------------------------------------------- /assets/howto/status_not_connected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/howto/status_not_connected.png -------------------------------------------------------------------------------- /assets/howto/top-level-comment-eval.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/howto/top-level-comment-eval.gif -------------------------------------------------------------------------------- /assets/images/alex-miller-likes-it.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/images/alex-miller-likes-it.png -------------------------------------------------------------------------------- /assets/images/calva-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/images/calva-icon.png -------------------------------------------------------------------------------- /assets/images/clj-type-leiningen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/images/clj-type-leiningen.png -------------------------------------------------------------------------------- /assets/images/clj-type-shadow-cljs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/images/clj-type-shadow-cljs.png -------------------------------------------------------------------------------- /assets/images/cljs-type-shadow-cljs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/images/cljs-type-shadow-cljs.png -------------------------------------------------------------------------------- /assets/images/cognitect-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/images/cognitect-logo.jpg -------------------------------------------------------------------------------- /assets/images/empty.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /assets/images/icons/bool-light.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /assets/images/icons/kv-pair-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /assets/images/icons/kv-pair-light.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /assets/images/icons/kw-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /assets/images/icons/kw-light.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /assets/images/icons/list-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/images/icons/list-light.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/images/icons/regex-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /assets/images/icons/regex-light.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /assets/images/icons/string-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /assets/images/icons/string-light.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /assets/images/icons/var-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /assets/images/icons/var-light.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /assets/images/icons/vector-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/images/icons/vector-light.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/images/pitch-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/images/pitch-logo.png -------------------------------------------------------------------------------- /assets/images/pitch-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /assets/images/star-calva-repo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/images/star-calva-repo.png -------------------------------------------------------------------------------- /assets/images/thortech-solutions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/images/thortech-solutions.png -------------------------------------------------------------------------------- /assets/mission-control-shortcuts.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/mission-control-shortcuts.gif -------------------------------------------------------------------------------- /assets/repl-window-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/repl-window-screenshot.png -------------------------------------------------------------------------------- /assets/styles/fonts.css: -------------------------------------------------------------------------------- 1 | @font-face{ 2 | font-family: 'Fira Code'; 3 | src: url('../fonts/FiraCode-Light.woff2') format('woff2'); 4 | font-weight: 300; 5 | font-style: normal; 6 | } 7 | 8 | @font-face{ 9 | font-family: 'Fira Code'; 10 | src: url('../fonts/FiraCode-Regular.woff2') format('woff2'); 11 | font-weight: 400; 12 | font-style: normal; 13 | } 14 | 15 | @font-face{ 16 | font-family: 'Fira Code'; 17 | src: url('../fonts/FiraCode-Medium.woff2') format('woff2'); 18 | font-weight: 500; 19 | font-style: normal; 20 | } 21 | 22 | @font-face{ 23 | font-family: 'Fira Code'; 24 | src: url('../fonts/FiraCode-Bold.woff2') format('woff2'); 25 | font-weight: 700; 26 | font-style: normal; 27 | } -------------------------------------------------------------------------------- /assets/top-level-eval.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/assets/top-level-eval.gif -------------------------------------------------------------------------------- /cljfmt.edn: -------------------------------------------------------------------------------- 1 | {:remove-surrounding-whitespace? true 2 | :remove-trailing-whitespace? true 3 | :remove-consecutive-blank-lines? true 4 | :indent-line-comments? true 5 | 6 | :insert-missing-whitespace? true 7 | :align-associative? false 8 | :extra-indents {foo [[:inner 0]]} 9 | :test (foo 1 10 | 2 11 | {:a a 12 | :aa a 13 | :bbb bbb})} -------------------------------------------------------------------------------- /deps-clj-version: -------------------------------------------------------------------------------- 1 | v1.12.0.1530 -------------------------------------------------------------------------------- /deps.clj.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/deps.clj.jar -------------------------------------------------------------------------------- /docs/Overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/Overview.png -------------------------------------------------------------------------------- /docs/grammar/things-to-consider.md: -------------------------------------------------------------------------------- 1 | 2 | From @sogaiu: 3 | @pez in processing clj-ish files from github using tree-sitter or clj-kondo, here are a few things that come up that can lead to errors / warnings: 4 | * template files - people do things like: (ns {{namespace}}.rendering or :{{name}} (mustache?) -- small number of instances of other styles too 5 | * missing, misplaced, or incorrectly placed closing delimiters 6 | * non-clojure text in (comment or #_ blocks 7 | * questionable(?) symbols and keywords - things that the repl might accept, but for which i didn't find a statement of support (e.g. # in keywords, keywords with multiple slashes in them) (edited) 8 | 9 | ``` 10 | Error: Property failed after 58 tests 11 | { seed: -1913189269, path: "57:0:0:0:0:0:0:0:0:0:0:2:1:1:1:1:1:1:1:1:1:1:1:1:1:1:2:9:8:8:8:8:8:8:8:0:0:0:0:0:0", endOnFailure: true } 12 | Counterexample: ["##~"] 13 | Shrunk 40 time(s) 14 | Got error: AssertionError: expected 'junk' to equal 'id' 15 | ``` -------------------------------------------------------------------------------- /docs/site/CNAME: -------------------------------------------------------------------------------- 1 | calva.io -------------------------------------------------------------------------------- /docs/site/_static/css/custom.css: -------------------------------------------------------------------------------- 1 | .wy-table-responsive table td, .wy-table-responsive table th { 2 | white-space: normal; 3 | } -------------------------------------------------------------------------------- /docs/site/babashka.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Babashka 3 | description: Learn how to use Calva to get REPL powered Interactive Programming with Babashka, a civilized scripting language and task manager. 4 | search: 5 | boost: 5 6 | --- 7 | 8 | # Using Calva with Babashka 9 | 10 | Since [Babashka](https://babashka.org) can be started such that it is an nREPL server, Calva can connect to it and a lot of the features will work. 11 | 12 | Calva can also start Babashka and connect its REPL for you, using the Jack-in command. 13 | 14 | !!! Note "Don't expect complete support" 15 | Babashka's nREPL server is still a bit limited compared to a full cider-nrepl enhanced "regular" Clojure nREPL server. Things like function signatures, and more do not work. 16 | 17 | This might of course improve in the future, especially if you provide some PRs towards the Babashka nREPL. -------------------------------------------------------------------------------- /docs/site/calva-symbol-logo-white.svg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/calva-symbol-logo-white.svg -------------------------------------------------------------------------------- /docs/site/eval-tips.md: -------------------------------------------------------------------------------- 1 | evaluation.md -------------------------------------------------------------------------------- /docs/site/images/agical-logo-1200x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/agical-logo-1200x400.png -------------------------------------------------------------------------------- /docs/site/images/alex-miller-likes-it.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/alex-miller-likes-it.png -------------------------------------------------------------------------------- /docs/site/images/calva-64h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/calva-64h.png -------------------------------------------------------------------------------- /docs/site/images/calva-convert-html-to-hiccup.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/calva-convert-html-to-hiccup.mp4 -------------------------------------------------------------------------------- /docs/site/images/calva-copy-html-as-hiccup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/calva-copy-html-as-hiccup.png -------------------------------------------------------------------------------- /docs/site/images/calva-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/calva-icon.png -------------------------------------------------------------------------------- /docs/site/images/calva-monorepo-project-roots-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/calva-monorepo-project-roots-menu.png -------------------------------------------------------------------------------- /docs/site/images/calva-project-roots-search-exclude.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/calva-project-roots-search-exclude.png -------------------------------------------------------------------------------- /docs/site/images/calva.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/calva.png -------------------------------------------------------------------------------- /docs/site/images/calva128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/calva128x128.png -------------------------------------------------------------------------------- /docs/site/images/clojure-lsp/fallback-server.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/clojure-lsp/fallback-server.png -------------------------------------------------------------------------------- /docs/site/images/clojure-lsp/management-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/clojure-lsp/management-menu.png -------------------------------------------------------------------------------- /docs/site/images/clojure-lsp/trace-server-setting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/clojure-lsp/trace-server-setting.png -------------------------------------------------------------------------------- /docs/site/images/clojuredocs-hover-when-not-example-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/clojuredocs-hover-when-not-example-1.png -------------------------------------------------------------------------------- /docs/site/images/custom-command-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/custom-command-menu.png -------------------------------------------------------------------------------- /docs/site/images/debugger/break.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/debugger/break.gif -------------------------------------------------------------------------------- /docs/site/images/debugger/breakpoint-in-test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/debugger/breakpoint-in-test.png -------------------------------------------------------------------------------- /docs/site/images/debugger/dbg-form.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/debugger/dbg-form.gif -------------------------------------------------------------------------------- /docs/site/images/debugger/dbg-function.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/debugger/dbg-function.gif -------------------------------------------------------------------------------- /docs/site/images/debugger/debugger-call-stack.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/debugger/debugger-call-stack.gif -------------------------------------------------------------------------------- /docs/site/images/debugger/eval-editor.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/debugger/eval-editor.gif -------------------------------------------------------------------------------- /docs/site/images/debugger/instrumenting-a-function.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/debugger/instrumenting-a-function.gif -------------------------------------------------------------------------------- /docs/site/images/debugger/navigation-buttons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/debugger/navigation-buttons.png -------------------------------------------------------------------------------- /docs/site/images/debugger/stepping.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/debugger/stepping.gif -------------------------------------------------------------------------------- /docs/site/images/debugger/viewing-variable-values.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/debugger/viewing-variable-values.png -------------------------------------------------------------------------------- /docs/site/images/finding-commands.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/finding-commands.png -------------------------------------------------------------------------------- /docs/site/images/flare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/flare.png -------------------------------------------------------------------------------- /docs/site/images/getting-started-with-clojure/get-started-with-clojure-header-wo-header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/getting-started-with-clojure/get-started-with-clojure-header-wo-header.png -------------------------------------------------------------------------------- /docs/site/images/getting-started-with-clojure/get-started-with-clojure-header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/getting-started-with-clojure/get-started-with-clojure-header.png -------------------------------------------------------------------------------- /docs/site/images/getting-started-with-clojure/gitpod-new-workspace.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/getting-started-with-clojure/gitpod-new-workspace.png -------------------------------------------------------------------------------- /docs/site/images/getting-started-with-clojure/gitpod-sign-in.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/getting-started-with-clojure/gitpod-sign-in.png -------------------------------------------------------------------------------- /docs/site/images/getting-started-with-clojure/gitpod-vscode-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/getting-started-with-clojure/gitpod-vscode-menu.png -------------------------------------------------------------------------------- /docs/site/images/getting-started-with-clojure/vscode-command-palette-calva-getting-started.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/getting-started-with-clojure/vscode-command-palette-calva-getting-started.png -------------------------------------------------------------------------------- /docs/site/images/howto/cljc-clj-cljs.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/cljc-clj-cljs.gif -------------------------------------------------------------------------------- /docs/site/images/howto/cljc-toggle-button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/cljc-toggle-button.png -------------------------------------------------------------------------------- /docs/site/images/howto/clojurescript-quick-start.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/clojurescript-quick-start.png -------------------------------------------------------------------------------- /docs/site/images/howto/dimming-ignores.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/dimming-ignores.gif -------------------------------------------------------------------------------- /docs/site/images/howto/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/error.png -------------------------------------------------------------------------------- /docs/site/images/howto/evaluate.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/evaluate.gif -------------------------------------------------------------------------------- /docs/site/images/howto/features.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/features.gif -------------------------------------------------------------------------------- /docs/site/images/howto/hello-repl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/hello-repl.png -------------------------------------------------------------------------------- /docs/site/images/howto/live-share-port.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/live-share-port.png -------------------------------------------------------------------------------- /docs/site/images/howto/mission-control-shortcuts.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/mission-control-shortcuts.gif -------------------------------------------------------------------------------- /docs/site/images/howto/output/eval-results-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/output/eval-results-1.png -------------------------------------------------------------------------------- /docs/site/images/howto/output/eval-results-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/output/eval-results-2.png -------------------------------------------------------------------------------- /docs/site/images/howto/output/load-current-namespace.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/output/load-current-namespace.png -------------------------------------------------------------------------------- /docs/site/images/howto/output/output-window-connected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/output/output-window-connected.png -------------------------------------------------------------------------------- /docs/site/images/howto/output/peek-last-result.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/output/peek-last-result.gif -------------------------------------------------------------------------------- /docs/site/images/howto/output/print-stacktrace-codelense.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/output/print-stacktrace-codelense.png -------------------------------------------------------------------------------- /docs/site/images/howto/output/repl-file-debugger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/output/repl-file-debugger.png -------------------------------------------------------------------------------- /docs/site/images/howto/output/select-last-result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/output/select-last-result.png -------------------------------------------------------------------------------- /docs/site/images/howto/output/stack-traces.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/output/stack-traces.gif -------------------------------------------------------------------------------- /docs/site/images/howto/paredit-up-wrap.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/paredit-up-wrap.gif -------------------------------------------------------------------------------- /docs/site/images/howto/polylith-repl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/polylith-repl.png -------------------------------------------------------------------------------- /docs/site/images/howto/signature-help.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/signature-help.gif -------------------------------------------------------------------------------- /docs/site/images/howto/start-hello-repl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/start-hello-repl.png -------------------------------------------------------------------------------- /docs/site/images/howto/status_clj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/status_clj.png -------------------------------------------------------------------------------- /docs/site/images/howto/status_cljs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/status_cljs.png -------------------------------------------------------------------------------- /docs/site/images/howto/status_not_connected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/status_not_connected.png -------------------------------------------------------------------------------- /docs/site/images/howto/top-level-comment-eval.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/top-level-comment-eval.gif -------------------------------------------------------------------------------- /docs/site/images/howto/top-level-eval.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/howto/top-level-eval.gif -------------------------------------------------------------------------------- /docs/site/images/inspector/calva-inspector-rainbow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/inspector/calva-inspector-rainbow.png -------------------------------------------------------------------------------- /docs/site/images/inspector/inspector-view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/inspector/inspector-view.png -------------------------------------------------------------------------------- /docs/site/images/merch/calva-t-shirt-symbol+logo+rich-comments.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/merch/calva-t-shirt-symbol+logo+rich-comments.png -------------------------------------------------------------------------------- /docs/site/images/merch/calva-t-shirt-symbol+rich-comments.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/merch/calva-t-shirt-symbol+rich-comments.png -------------------------------------------------------------------------------- /docs/site/images/merch/t-shirt-calva-symbol-and-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/merch/t-shirt-calva-symbol-and-logo.png -------------------------------------------------------------------------------- /docs/site/images/merch/t-shirt-calva-symbol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/merch/t-shirt-calva-symbol.png -------------------------------------------------------------------------------- /docs/site/images/merch/t-shirt-rich-comments.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/merch/t-shirt-rich-comments.png -------------------------------------------------------------------------------- /docs/site/images/ns-form/ns-form-autocreation.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/ns-form/ns-form-autocreation.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/backward-down-sexp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/backward-down-sexp.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/backward-sexp-or-up.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/backward-sexp-or-up.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/backward-sexp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/backward-sexp.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/backward-up-sexp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/backward-up-sexp.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/barf-backward.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/barf-backward.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/barf-forward.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/barf-forward.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/close-list.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/close-list.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/convolute.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/convolute.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/drag-backward-forward.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/drag-backward-forward.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/drag-backward-up-forward-down.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/drag-backward-up-forward-down.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/drag-forward-up-backward-down.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/drag-forward-up-backward-down.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/drag-pairs-in-binding-box.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/drag-pairs-in-binding-box.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/drag-pairs-in-maps.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/drag-pairs-in-maps.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/force-backspace.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/force-backspace.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/force-delete.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/force-delete.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/forward-down-sexp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/forward-down-sexp.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/forward-sexp-or-up.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/forward-sexp-or-up.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/forward-sexp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/forward-sexp.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/forward-up-sexp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/forward-up-sexp.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/grow-selection.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/grow-selection.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/join.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/join.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/kill-backward-sexp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/kill-backward-sexp.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/kill-close-list.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/kill-close-list.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/kill-forward-sexp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/kill-forward-sexp.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/kill-left.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/kill-left.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/kill-open-list.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/kill-open-list.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/kill-right.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/kill-right.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/lateral-grow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/lateral-grow.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/open-list.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/open-list.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/raise-sexp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/raise-sexp.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/raise.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/raise.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/rewrap.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/rewrap.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/select-backward-down-sexp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/select-backward-down-sexp.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/select-backward-sexp-or-up.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/select-backward-sexp-or-up.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/select-backward-sexp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/select-backward-sexp.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/select-backward-up-sexp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/select-backward-up-sexp.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/select-close-list.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/select-close-list.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/select-forward-down-sexp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/select-forward-down-sexp.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/select-forward-sexp-or-up.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/select-forward-sexp-or-up.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/select-forward-sexp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/select-forward-sexp.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/select-forward-up-sexp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/select-forward-up-sexp.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/select-open-list.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/select-open-list.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/select-right.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/select-right.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/select-top-level-form.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/select-top-level-form.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/shrink-selection.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/shrink-selection.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/slurp-backward.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/slurp-backward.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/slurp-forward.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/slurp-forward.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/splice-killing-backward.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/splice-killing-backward.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/splice-killing-forward.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/splice-killing-forward.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/splice.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/splice.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/split.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/split.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/strict-backspace.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/strict-backspace.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/strict-delete.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/strict-delete.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/string-as-list.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/string-as-list.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/transpose.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/transpose.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/wrap-around-brackets.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/wrap-around-brackets.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/wrap-around-curlies.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/wrap-around-curlies.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/wrap-around-parens.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/wrap-around-parens.gif -------------------------------------------------------------------------------- /docs/site/images/paredit/wrap-around-quotes.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/paredit/wrap-around-quotes.gif -------------------------------------------------------------------------------- /docs/site/images/pitch-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/pitch-logo.png -------------------------------------------------------------------------------- /docs/site/images/refactoring/addMissingLibspec.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/refactoring/addMissingLibspec.gif -------------------------------------------------------------------------------- /docs/site/images/refactoring/cleanNs.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/refactoring/cleanNs.gif -------------------------------------------------------------------------------- /docs/site/images/refactoring/cyclePrivacy.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/refactoring/cyclePrivacy.gif -------------------------------------------------------------------------------- /docs/site/images/refactoring/expandLet.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/refactoring/expandLet.gif -------------------------------------------------------------------------------- /docs/site/images/refactoring/extractFunction.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/refactoring/extractFunction.gif -------------------------------------------------------------------------------- /docs/site/images/refactoring/inlineSymbol.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/refactoring/inlineSymbol.gif -------------------------------------------------------------------------------- /docs/site/images/refactoring/introduceLet.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/refactoring/introduceLet.gif -------------------------------------------------------------------------------- /docs/site/images/refactoring/moveToLet.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/refactoring/moveToLet.gif -------------------------------------------------------------------------------- /docs/site/images/refactoring/quick-fix.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/refactoring/quick-fix.png -------------------------------------------------------------------------------- /docs/site/images/refactoring/threadFirst.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/refactoring/threadFirst.gif -------------------------------------------------------------------------------- /docs/site/images/refactoring/threadFirstAll.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/refactoring/threadFirstAll.gif -------------------------------------------------------------------------------- /docs/site/images/refactoring/threadLast.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/refactoring/threadLast.gif -------------------------------------------------------------------------------- /docs/site/images/refactoring/threadLastAll.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/refactoring/threadLastAll.gif -------------------------------------------------------------------------------- /docs/site/images/refactoring/unwindAll.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/refactoring/unwindAll.gif -------------------------------------------------------------------------------- /docs/site/images/refactoring/unwindThread.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/refactoring/unwindThread.gif -------------------------------------------------------------------------------- /docs/site/images/vscode-extension-by-rating.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/images/vscode-extension-by-rating.png -------------------------------------------------------------------------------- /docs/site/img: -------------------------------------------------------------------------------- 1 | theming/img -------------------------------------------------------------------------------- /docs/site/namespace-form-auto-creation.md: -------------------------------------------------------------------------------- 1 | # Namespace Form Auto-creation 2 | 3 | When you create a new clojure file, a file with `.clj`, `.cljc` or `.cljs` extension, an appropriate namespace form will be added to the file. This feature is provided by [clojure-lsp](https://clojure-lsp.github.io/clojure-lsp/). 4 | 5 | ![Example of ns form autocreation.](images/ns-form/ns-form-autocreation.gif) 6 | 7 | -------------------------------------------------------------------------------- /docs/site/stylesheets/extra.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --md-primary-fg-color: rgb(219, 149, 80); 3 | --md-accent-fg-color: rgb(144, 180, 254); 4 | /* --md-admonition-bg-color: var(--md-accent-fg-color); */ 5 | } 6 | 7 | .md-typeset .admonition, .md-typeset details, 8 | .md-typeset .admonition.note, .md-typeset details.note { 9 | border: 0.075rem solid var(--md-accent-fg-color); 10 | } -------------------------------------------------------------------------------- /docs/site/theming/img/android-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/theming/img/android-icon-144x144.png -------------------------------------------------------------------------------- /docs/site/theming/img/android-icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/theming/img/android-icon-192x192.png -------------------------------------------------------------------------------- /docs/site/theming/img/android-icon-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/theming/img/android-icon-36x36.png -------------------------------------------------------------------------------- /docs/site/theming/img/android-icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/theming/img/android-icon-48x48.png -------------------------------------------------------------------------------- /docs/site/theming/img/android-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/theming/img/android-icon-72x72.png -------------------------------------------------------------------------------- /docs/site/theming/img/android-icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/theming/img/android-icon-96x96.png -------------------------------------------------------------------------------- /docs/site/theming/img/apple-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/theming/img/apple-icon-114x114.png -------------------------------------------------------------------------------- /docs/site/theming/img/apple-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/theming/img/apple-icon-120x120.png -------------------------------------------------------------------------------- /docs/site/theming/img/apple-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/theming/img/apple-icon-144x144.png -------------------------------------------------------------------------------- /docs/site/theming/img/apple-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/theming/img/apple-icon-152x152.png -------------------------------------------------------------------------------- /docs/site/theming/img/apple-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/theming/img/apple-icon-180x180.png -------------------------------------------------------------------------------- /docs/site/theming/img/apple-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/theming/img/apple-icon-57x57.png -------------------------------------------------------------------------------- /docs/site/theming/img/apple-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/theming/img/apple-icon-60x60.png -------------------------------------------------------------------------------- /docs/site/theming/img/apple-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/theming/img/apple-icon-72x72.png -------------------------------------------------------------------------------- /docs/site/theming/img/apple-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/theming/img/apple-icon-76x76.png -------------------------------------------------------------------------------- /docs/site/theming/img/apple-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/theming/img/apple-icon-precomposed.png -------------------------------------------------------------------------------- /docs/site/theming/img/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/theming/img/apple-icon.png -------------------------------------------------------------------------------- /docs/site/theming/img/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | #ffffff -------------------------------------------------------------------------------- /docs/site/theming/img/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/theming/img/favicon-16x16.png -------------------------------------------------------------------------------- /docs/site/theming/img/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/theming/img/favicon-32x32.png -------------------------------------------------------------------------------- /docs/site/theming/img/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/theming/img/favicon-96x96.png -------------------------------------------------------------------------------- /docs/site/theming/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/theming/img/favicon.ico -------------------------------------------------------------------------------- /docs/site/theming/img/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "App", 3 | "icons": [ 4 | { 5 | "src": "/android-icon-36x36.png", 6 | "sizes": "36x36", 7 | "type": "image/png", 8 | "density": "0.75" 9 | }, 10 | { 11 | "src": "/android-icon-48x48.png", 12 | "sizes": "48x48", 13 | "type": "image/png", 14 | "density": "1.0" 15 | }, 16 | { 17 | "src": "/android-icon-72x72.png", 18 | "sizes": "72x72", 19 | "type": "image/png", 20 | "density": "1.5" 21 | }, 22 | { 23 | "src": "/android-icon-96x96.png", 24 | "sizes": "96x96", 25 | "type": "image/png", 26 | "density": "2.0" 27 | }, 28 | { 29 | "src": "/android-icon-144x144.png", 30 | "sizes": "144x144", 31 | "type": "image/png", 32 | "density": "3.0" 33 | }, 34 | { 35 | "src": "/android-icon-192x192.png", 36 | "sizes": "192x192", 37 | "type": "image/png", 38 | "density": "4.0" 39 | } 40 | ] 41 | } 42 | -------------------------------------------------------------------------------- /docs/site/theming/img/ms-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/theming/img/ms-icon-144x144.png -------------------------------------------------------------------------------- /docs/site/theming/img/ms-icon-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/theming/img/ms-icon-150x150.png -------------------------------------------------------------------------------- /docs/site/theming/img/ms-icon-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/theming/img/ms-icon-310x310.png -------------------------------------------------------------------------------- /docs/site/theming/img/ms-icon-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/docs/site/theming/img/ms-icon-70x70.png -------------------------------------------------------------------------------- /docs/site/theming/main.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block libs %} 4 | {{ super() }} 5 | {% if config.extra.mkdocs_env == 'production' %} 6 | 7 | {% endif %} 8 | {% endblock %} 9 | -------------------------------------------------------------------------------- /docs/site/wsl.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: WSL 3 | description: Windows Subsystem for Linux is fully supported, here's some tips 4 | --- 5 | 6 | # Calva ❤️ WSL 7 | 8 | The use of Calva with WSL (Windows Subsystem for Linux) is fully supported through the [Remote - WSL](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl) extension. Simply install the extension and open your project with one of the `Remote-WSL` commands. Calva will run directly in the WSL environment and no further configuration is required. 9 | 10 | ## Steps Involved 11 | 12 | 1. Enable WSL 13 | 1. Install Ubuntu in WSL 14 | 1. Install Java in WSL 15 | 1. Install latest Clojure in WSL 16 | 1. Install the Remote - WSL extension in VS Code 17 | 1. Launch remote window 18 | 1. Install Calva (gets installed into the WSL instance) 19 | 1. Work away 20 | 21 | See also [Remote Development](remote-development.md). 22 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "lib": ["es6"] 6 | }, 7 | "exclude": ["node_modules"] 8 | } 9 | -------------------------------------------------------------------------------- /language-configuration.json: -------------------------------------------------------------------------------- 1 | { 2 | "comments": { 3 | "lineComment": ";;" 4 | }, 5 | "wordPattern": "[^\\s,#()[\\]{}꞉;\"\\\\@]+", 6 | "brackets": [ 7 | ["{", "}"], 8 | ["[", "]"], 9 | ["(", ")"] 10 | ], 11 | "autoClosingPairs": [ 12 | ["{", "}"], 13 | ["[", "]"], 14 | ["(", ")"], 15 | { "open": "\"", "close": "\"", "notIn": ["string"] } 16 | ], 17 | "surroundingPairs": [ 18 | ["{", "}"], 19 | ["[", "]"], 20 | ["(", ")"], 21 | ["\"", "\""] 22 | ], 23 | "folding": { 24 | "offSide": true 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /netlfiy.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | publish = "docs/site" 3 | command = """ 4 | restore_home_cache ".cache" "pip cache" && 5 | restore_cwd_cache '.venv' 'python virtualenv' && 6 | pip install -r requirements.txt && 7 | mkdocs build -d docs/site 8 | """ 9 | -------------------------------------------------------------------------------- /notebooks-spritz/.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/** 2 | .vscode-test/** 3 | src/** 4 | .gitignore 5 | .yarnrc 6 | vsc-extension-quickstart.md 7 | **/tsconfig.json 8 | **/.eslintrc.json 9 | **/*.map 10 | **/*.ts 11 | -------------------------------------------------------------------------------- /notebooks-spritz/LICENSE.md: -------------------------------------------------------------------------------- 1 | # LICENSE 2 | 3 | Spritz is free to use as you wish. -------------------------------------------------------------------------------- /notebooks-spritz/calva-spritz-1.0.0.vsix: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/notebooks-spritz/calva-spritz-1.0.0.vsix -------------------------------------------------------------------------------- /notebooks-spritz/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "calva-spritz", 3 | "version": "1.0.5", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "calva-spritz", 9 | "version": "1.0.5", 10 | "license": "MIT", 11 | "engines": { 12 | "vscode": "^1.67.0" 13 | } 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /notebooks-spritz/spritz-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/notebooks-spritz/spritz-icon.png -------------------------------------------------------------------------------- /repl-output-ui/css/main.css: -------------------------------------------------------------------------------- 1 | .output-element-container { 2 | padding-bottom: 5px; 3 | } 4 | 5 | .evaluated-code-container { 6 | border: solid; 7 | margin-top: 30px; 8 | } 9 | 10 | .border-text { 11 | display: block; 12 | float: left; 13 | clear: left; 14 | padding-left: 10px; 15 | padding-right: 10px; 16 | margin-top: -10px; 17 | margin-left: 10px; 18 | background-color: var(--vscode-editor-background); 19 | } 20 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | mkdocs==1.5.3 2 | mkdocs-material==9.5.16 3 | Pillow==10.3.0 4 | CairoSVG==2.7.1 -------------------------------------------------------------------------------- /scripts/build-and-test/README.md: -------------------------------------------------------------------------------- 1 | # Build and test 2 | 3 | This folder contains a docker-based build pipeline that mirrors the [circleci config](.circleci/config.yml). Useful for manually running CI build steps for the purpose of troubleshooting. 4 | -------------------------------------------------------------------------------- /scripts/build-and-test/run.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -euo pipefail # sane error handling 4 | 5 | TARGET="${1:-}" 6 | 7 | if [ -z "$TARGET" ]; then 8 | echo 'Must run as ./run.sh where target is one of the steps in the Dockerfile. 9 | For example ./run.sh step-test-integration' 1>&2 10 | exit 1 11 | fi 12 | 13 | set -x # Show commands as they are run 14 | 15 | SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) 16 | CONTEXT_DIR="$SCRIPT_DIR/../../" 17 | DISPLAY="${DISPLAY:-:0}" # default to ":0" 18 | DOCKER_IMG_NAME="calva-ci-$TARGET" 19 | 20 | echo "Building image: $DOCKER_IMG_NAME" 21 | 22 | DOCKER_BUILDKIT=1 docker build \ 23 | --tag "$DOCKER_IMG_NAME" \ 24 | --target "$TARGET" \ 25 | --file "$SCRIPT_DIR/Dockerfile" \ 26 | "$CONTEXT_DIR" 27 | 28 | docker run -ti --net host -e DISPLAY="$DISPLAY" --rm --ipc=host "$DOCKER_IMG_NAME" -------------------------------------------------------------------------------- /snippets.jsonc: -------------------------------------------------------------------------------- 1 | { 2 | // Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope 3 | // is left empty or omitted, the snippet gets applied to all languages. The prefix is what is 4 | // used to trigger the snippet and the body will be expanded and inserted. Possible variables are: 5 | // $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. 6 | // Placeholders with the same ids are connected. 7 | // Example: 8 | // "Print to console": { 9 | // "scope": "javascript,typescript", 10 | // "prefix": "log", 11 | // "body": [ 12 | // "console.log('$1');", 13 | // "$2" 14 | // ], 15 | // "description": "Log output to console" 16 | // } 17 | 18 | "RCF": { 19 | "prefix": "(rcf", 20 | "body": [ 21 | "(comment", 22 | " $0", 23 | " :rcf" 24 | ], 25 | "description": "RCF" 26 | } 27 | } -------------------------------------------------------------------------------- /src/api/document.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode'; 2 | import * as namespace from '../namespace'; 3 | 4 | export function getNamespace(document?: vscode.TextDocument) { 5 | return namespace.getDocumentNamespace(document || {})?.[0] ?? null; 6 | } 7 | 8 | export const getNamespaceAndNsForm = namespace.getDocumentNamespace; 9 | -------------------------------------------------------------------------------- /src/api/editor.ts: -------------------------------------------------------------------------------- 1 | import * as editor from '../edit'; 2 | 3 | export const replace = editor.replace; 4 | -------------------------------------------------------------------------------- /src/api/index.ts: -------------------------------------------------------------------------------- 1 | import * as replV0 from './repl-v0'; 2 | import * as replV1 from './repl-v1'; 3 | import * as ranges from './ranges'; 4 | import * as calvaVsCode from './vscode'; 5 | import * as editor from './editor'; 6 | import * as document from './document'; 7 | import * as pprint from './pprint'; 8 | import * as info from './info'; 9 | 10 | export function getApi() { 11 | return { 12 | v0: { 13 | evaluateCode: replV0.evaluateCode, // old mistake 14 | repl: replV0, 15 | ranges, 16 | vscode: calvaVsCode, 17 | editor, 18 | pprint, 19 | }, 20 | v1: { 21 | repl: replV1, 22 | ranges, 23 | vscode: calvaVsCode, 24 | editor, 25 | document, 26 | pprint, 27 | info, 28 | }, 29 | }; 30 | } 31 | -------------------------------------------------------------------------------- /src/api/info.ts: -------------------------------------------------------------------------------- 1 | import { clojureDocsCiderNReplLookup } from '../clojuredocs'; 2 | import * as replSession from '../nrepl/repl-session'; 3 | 4 | // TODO: Only nRepl lookups for now. Figure out how to enable clojure-lsp. 5 | 6 | export const getClojureDocsDotOrg = async (symbol: string, ns = 'user') => { 7 | const session = replSession.getSession('clj'); 8 | if (!session) { 9 | return { error: "Can't retrieve REPL session for session key. Is the REPL connected?" }; 10 | } 11 | const clojureDocs = await clojureDocsCiderNReplLookup(session, symbol, ns); 12 | return clojureDocs; 13 | }; 14 | 15 | export const getSymbolInfo = async (symbol: string, sessionKey: string, ns = 'user') => { 16 | const client = replSession.getSession(sessionKey); 17 | if (!client || !client.supports('info')) { 18 | return { error: "Can't retrieve REPL session for session key. Is the REPL connected?" }; 19 | } 20 | const res = await client.info(ns, symbol); 21 | return res; 22 | }; 23 | -------------------------------------------------------------------------------- /src/api/pprint.ts: -------------------------------------------------------------------------------- 1 | import * as printer from '../printer'; 2 | 3 | export const prettyPrint = printer.prettyPrint; 4 | export const prettyPrintingOptions = printer.prettyPrintingOptions; 5 | -------------------------------------------------------------------------------- /src/api/vscode.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode'; 2 | 3 | export const registerDocumentSymbolProvider = vscode.languages.registerDocumentSymbolProvider; 4 | -------------------------------------------------------------------------------- /src/calva-fmt/.vscodeignore: -------------------------------------------------------------------------------- 1 | .gitignore 2 | jsconfig.json 3 | tsconfig.json 4 | vsc-extension-quickstart.md 5 | .eslintrc.json 6 | .nrepl-port 7 | 8 | .vscode/** 9 | .vscode-test/** 10 | test/** 11 | cljc/** 12 | lib/** 13 | test_js/** 14 | js/** 15 | 16 | .shadow-cljs/** 17 | atom-language-clojure/** 18 | -------------------------------------------------------------------------------- /src/calva-fmt/assets/align-items.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/src/calva-fmt/assets/align-items.gif -------------------------------------------------------------------------------- /src/calva-fmt/assets/calva-fmt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/src/calva-fmt/assets/calva-fmt.png -------------------------------------------------------------------------------- /src/calva-fmt/assets/format-current-form.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/src/calva-fmt/assets/format-current-form.gif -------------------------------------------------------------------------------- /src/calva-fmt/assets/infer-parens.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/src/calva-fmt/assets/infer-parens.gif -------------------------------------------------------------------------------- /src/calva-fmt/assets/parinfer.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/src/calva-fmt/assets/parinfer.gif -------------------------------------------------------------------------------- /src/calva-fmt/atom-language-clojure/.atom/.apm/.apmrc: -------------------------------------------------------------------------------- 1 | ; This file is auto-generated and should not be edited since any 2 | ; modifications will be lost the next time any apm command is run. 3 | ; 4 | ; You should instead edit your .apmrc config located in ~/.atom/.apmrc 5 | cache = /home/atom/.atom/.apm 6 | ; Hide progress-bar to prevent npm from altering apm console output. 7 | progress = false -------------------------------------------------------------------------------- /src/calva-fmt/atom-language-clojure/.atom/config.cson: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/calva-fmt/atom-language-clojure/.coffeelintignore: -------------------------------------------------------------------------------- 1 | spec/fixtures 2 | -------------------------------------------------------------------------------- /src/calva-fmt/atom-language-clojure/.travis.yml: -------------------------------------------------------------------------------- 1 | language: objective-c 2 | 3 | notifications: 4 | email: 5 | on_success: never 6 | on_failure: change 7 | 8 | script: 'curl -s https://raw.githubusercontent.com/atom/ci/master/build-package.sh | sh' 9 | 10 | git: 11 | depth: 10 12 | 13 | branches: 14 | only: 15 | - master 16 | -------------------------------------------------------------------------------- /src/calva-fmt/atom-language-clojure/appveyor.yml: -------------------------------------------------------------------------------- 1 | version: "{build}" 2 | 3 | platform: x64 4 | 5 | branches: 6 | only: 7 | - master 8 | 9 | clone_depth: 10 10 | 11 | skip_tags: true 12 | 13 | environment: 14 | APM_TEST_PACKAGES: 15 | 16 | matrix: 17 | - ATOM_CHANNEL: stable 18 | - ATOM_CHANNEL: beta 19 | 20 | install: 21 | - ps: Install-Product node 4 22 | 23 | build_script: 24 | - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/atom/ci/master/build-package.ps1')) 25 | 26 | test: off 27 | deploy: off 28 | -------------------------------------------------------------------------------- /src/calva-fmt/atom-language-clojure/coffeelint.json: -------------------------------------------------------------------------------- 1 | { 2 | "max_line_length": { 3 | "level": "ignore" 4 | }, 5 | "no_empty_param_list": { 6 | "level": "error" 7 | }, 8 | "arrow_spacing": { 9 | "level": "error" 10 | }, 11 | "no_interpolation_in_single_quotes": { 12 | "level": "error" 13 | }, 14 | "no_debugger": { 15 | "level": "error" 16 | }, 17 | "prefer_english_operator": { 18 | "level": "error" 19 | }, 20 | "colon_assignment_spacing": { 21 | "spacing": { 22 | "left": 0, 23 | "right": 1 24 | }, 25 | "level": "error" 26 | }, 27 | "braces_spacing": { 28 | "spaces": 0, 29 | "level": "error" 30 | }, 31 | "spacing_after_comma": { 32 | "level": "error" 33 | }, 34 | "no_stand_alone_at": { 35 | "level": "error" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/calva-fmt/atom-language-clojure/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "language-clojure", 3 | "version": "0.22.7", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "language-clojure", 9 | "version": "0.22.7", 10 | "license": "MIT", 11 | "engines": { 12 | "atom": "*", 13 | "node": "*" 14 | } 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/calva-fmt/atom-language-clojure/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "language-clojure", 3 | "version": "0.22.7", 4 | "description": "Clojure language support in Atom", 5 | "engines": { 6 | "atom": "*", 7 | "node": "*" 8 | }, 9 | "homepage": "http://atom.github.io/language-clojure", 10 | "repository": { 11 | "type": "git", 12 | "url": "https://github.com/atom/language-clojure" 13 | }, 14 | "license": "MIT", 15 | "bugs": { 16 | "url": "https://github.com/atom/language-clojure/issues" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/calva-fmt/atom-language-clojure/run-grammar-tests.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | ATOM_SCRIPT_PATH="apm" 4 | 5 | echo "Running specs..." 6 | "${ATOM_SCRIPT_PATH}" test spec 7 | 8 | exit -------------------------------------------------------------------------------- /src/calva-fmt/atom-language-clojure/settings/language-clojure.cson: -------------------------------------------------------------------------------- 1 | '.source.clojure': 2 | 'editor': 3 | 'commentStart': '; ' 4 | 'autocomplete': 5 | 'extraWordCharacters': '-' 6 | -------------------------------------------------------------------------------- /src/calva-fmt/src/providers/range_formatter.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode'; 2 | import * as formatter from '../format'; 3 | 4 | export class RangeEditProvider implements vscode.DocumentRangeFormattingEditProvider { 5 | provideDocumentRangeFormattingEdits( 6 | document: vscode.TextDocument, 7 | range: vscode.Range, 8 | _options, 9 | _token 10 | ) { 11 | return formatter.formatRangeEdits(document, range); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/calva-fmt/src/state.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode'; 2 | import * as Immutable from 'immutable'; 3 | import * as ImmutableCursor from 'immutable-cursor'; 4 | 5 | const mode = { 6 | language: 'clojure', 7 | //scheme: 'file' 8 | }; 9 | 10 | let data; 11 | const initialData = { 12 | documents: {}, 13 | }; 14 | 15 | reset(); 16 | 17 | const cursor = ImmutableCursor.from(data, [], (nextState) => { 18 | data = Immutable.fromJS(nextState); 19 | }); 20 | 21 | function deref() { 22 | return data; 23 | } 24 | 25 | function reset() { 26 | data = Immutable.fromJS(initialData); 27 | } 28 | 29 | function config() { 30 | const configOptions = vscode.workspace.getConfiguration('calva.fmt'); 31 | return { 32 | parinferOnSelectionChange: configOptions.get('inferParensOnCursorMove'), 33 | }; 34 | } 35 | 36 | export { cursor, mode, deref, reset, config }; 37 | -------------------------------------------------------------------------------- /src/cljs-lib/src/calva/fmt/util.cljs: -------------------------------------------------------------------------------- 1 | (ns calva.fmt.util 2 | (:require [clojure.string])) 3 | 4 | 5 | (defn log 6 | "logs out the object `o` excluding any keywords in `exclude-kws`" 7 | [o & exlude-kws] 8 | (println (pr-str (if (map? o) (apply dissoc o exlude-kws) o))) 9 | o) 10 | 11 | 12 | (defn escape-regexp 13 | "Escapes regexp characters in `s`" 14 | [s] 15 | (clojure.string/replace s #"([.*+?^${}()|\[\]\\])" "\\$1")) 16 | 17 | 18 | (defn current-line 19 | "Finds the text of the current line in `text` from cursor position `index`" 20 | [text index] 21 | (let [head (subs text 0 index) 22 | tail (subs text index)] 23 | (str (second (re-find #"\n?(.*)$" head)) 24 | (second (re-find #"^(.*)\n?" tail))))) 25 | 26 | 27 | (defn re-pos-first 28 | "Find position of first match of `re` in `s`" 29 | [re s] 30 | (if-let [m (.match s re)] 31 | (.-index m) 32 | -1)) 33 | 34 | 35 | (defn split-into-lines 36 | [s] 37 | (clojure.string/split s #"\r?\n" -1)) 38 | 39 | -------------------------------------------------------------------------------- /src/cljs-lib/src/calva/js_utils.cljs: -------------------------------------------------------------------------------- 1 | (ns calva.js-utils 2 | (:require [cljs.reader])) 3 | 4 | (defn jsify 5 | "Converts clojure data to js data" 6 | [o] 7 | (clj->js o :keyword-fn (fn [kw] (str (symbol kw))))) 8 | 9 | (defn cljify [o] 10 | (js->clj o :keywordize-keys true)) 11 | 12 | -------------------------------------------------------------------------------- /src/cljs-lib/src/calva/main.cljs: -------------------------------------------------------------------------------- 1 | (ns calva.main) 2 | 3 | (defn main [& args] 4 | (js/console.log "Hello from calva-lib")) 5 | -------------------------------------------------------------------------------- /src/cljs-lib/src/calva/read_config.cljs: -------------------------------------------------------------------------------- 1 | (ns calva.read-config 2 | (:require [calva.js-utils :refer [jsify]] 3 | [calva.parse :as parse] 4 | [vvvvalvalval.supdate.api :refer [supdate]])) 5 | 6 | (def ^:private updaters {:customREPLCommandSnippets [{:snippet str}] 7 | :customREPLHoverSnippets [{:snippet str}]}) 8 | 9 | (defn update-config-edn 10 | [config] 11 | (-> config 12 | parse/parse-clj-edn 13 | (supdate updaters))) 14 | 15 | (defn config-edn->js 16 | [config] 17 | (jsify (update-config-edn config))) 18 | 19 | (defn ^:export config-edn->js-bridge 20 | [config] 21 | (config-edn->js config)) 22 | 23 | (comment 24 | (parse/parse-clj-edn "{:foo (str \"**EDN edn current-form**: \" $current-form)}") 25 | (update-config-edn "{:customREPLCommandSnippets 26 | [{:name \"foo\" 27 | :snippet (str \"**EDN edn current-form**: \" $current-form)}]}")) 28 | 29 | -------------------------------------------------------------------------------- /src/cljs-lib/src/calva/state.cljs: -------------------------------------------------------------------------------- 1 | (ns calva.state) 2 | 3 | (defonce ^:private state (atom {})) 4 | 5 | (defn set-state-value! [key value] 6 | (swap! state assoc key value)) 7 | 8 | (defn remove-state-value! [key] 9 | (swap! state dissoc key)) 10 | 11 | (defn get-state-value [key] 12 | (get @state key)) 13 | 14 | (defn get-state [] 15 | @state) 16 | 17 | (comment 18 | (set-state-value! "hello" "world") 19 | (get-state) 20 | (remove-state-value! "hello")) 21 | -------------------------------------------------------------------------------- /src/cljs-lib/src/pez_cljfmt/core.clj: -------------------------------------------------------------------------------- 1 | (ns pez-cljfmt.core 2 | (:require [clojure.java.io :as io])) 3 | 4 | (def read-resource* (comp read-string slurp io/resource)) 5 | (defmacro read-resource [path] `'~(read-resource* path)) -------------------------------------------------------------------------------- /src/cljs-lib/src/pez_rewrite_clj/node/comment.cljs: -------------------------------------------------------------------------------- 1 | (ns pez-rewrite-clj.node.comment 2 | (:require [pez-rewrite-clj.node.protocols :as node])) 3 | 4 | ;; ## Node 5 | 6 | (defrecord CommentNode [s] 7 | node/Node 8 | (tag [_] :comment) 9 | (printable-only? [_] true) 10 | (sexpr [_] 11 | (throw (js/Error. "Unsupported operation"))) 12 | (length [_] 13 | (+ 1 (count s))) 14 | (string [_] 15 | (str ";" s)) 16 | 17 | Object 18 | (toString [this] 19 | (node/string this))) 20 | 21 | ;;(node/make-printable! CommentNode) 22 | 23 | ;; ## Constructor 24 | 25 | (defn comment-node 26 | "Create node representing an EDN comment." 27 | [s] 28 | (->CommentNode s)) 29 | 30 | (defn comment? 31 | "Check whether a node represents a comment." 32 | [node] 33 | (= (node/tag node) :comment)) 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /src/cljs-lib/src/pez_rewrite_clj/node/token.cljs: -------------------------------------------------------------------------------- 1 | (ns pez-rewrite-clj.node.token 2 | (:require [pez-rewrite-clj.node.protocols :as node])) 3 | 4 | ;; ## Node 5 | 6 | (defrecord TokenNode [value string-value] 7 | node/Node 8 | (tag [_] :token) 9 | (printable-only? [_] false) 10 | (sexpr [_] value) 11 | (length [_] (.-length string-value)) 12 | (string [_] string-value) 13 | 14 | Object 15 | (toString [this] 16 | (node/string this))) 17 | 18 | ; TODO 19 | ;(node/make-printable! TokenNode) 20 | 21 | ;; ## Constructor 22 | 23 | (defn token-node 24 | "Create node for an unspecified EDN token." 25 | ([value] 26 | (token-node value (pr-str value))) 27 | ([value string-value] 28 | (->TokenNode value string-value))) 29 | -------------------------------------------------------------------------------- /src/cljs-lib/src/pez_rewrite_clj/parser.cljs: -------------------------------------------------------------------------------- 1 | (ns pez-rewrite-clj.parser 2 | (:require [pez-rewrite-clj.parser.core :as p] 3 | [pez-rewrite-clj.node :as node] 4 | [pez-rewrite-clj.reader :as r])) 5 | 6 | ;; ## Parser Core 7 | 8 | (defn parse 9 | "Parse next form from the given reader." 10 | [^not-native reader] 11 | (p/parse-next reader)) 12 | 13 | (defn parse-all 14 | "Parse all forms from the given reader." 15 | [^not-native reader] 16 | (let [nodes (->> (repeatedly #(parse reader)) 17 | (take-while identity) 18 | (doall))] 19 | (with-meta 20 | (node/forms-node nodes) 21 | (meta (first nodes))))) 22 | 23 | ;; ## Specialized Parsers 24 | 25 | (defn parse-string 26 | "Parse first form in the given string." 27 | [s] 28 | (parse (r/indexing-push-back-reader s))) 29 | 30 | (defn parse-string-all 31 | "Parse all forms in the given string." 32 | [s] 33 | (parse-all (r/indexing-push-back-reader s))) 34 | 35 | 36 | -------------------------------------------------------------------------------- /src/cljs-lib/src/pez_rewrite_clj/parser/keyword.cljs: -------------------------------------------------------------------------------- 1 | (ns pez-rewrite-clj.parser.keyword 2 | (:require [pez-rewrite-clj.node :as node] 3 | [cljs.tools.reader.reader-types] 4 | [pez-rewrite-clj.reader :as r])) 5 | 6 | (defn parse-keyword 7 | [^not-native reader] 8 | (r/read-char reader) 9 | (if-let [c (r/peek-char reader)] 10 | (if (identical? c \:) 11 | (node/keyword-node 12 | (r/read-keyword reader ":") 13 | true) 14 | (do 15 | (r/unread reader \:) 16 | (node/keyword-node (r/read-keyword reader ":")))) 17 | (r/throw-reader reader "unexpected EOF while reading keyword."))) 18 | -------------------------------------------------------------------------------- /src/cljs-lib/src/pez_rewrite_clj/parser/whitespace.cljs: -------------------------------------------------------------------------------- 1 | (ns pez-rewrite-clj.parser.whitespace 2 | (:require [pez-rewrite-clj.node :as node] 3 | [pez-rewrite-clj.reader :as r])) 4 | 5 | (defn parse-whitespace 6 | "Parse as much whitespace as possible. The created node can either contain 7 | only linebreaks or only space/tabs." 8 | [^not-native reader] 9 | (if (r/linebreak? (r/peek-char reader)) 10 | (node/newline-node 11 | (r/read-while reader r/linebreak?)) 12 | (node/whitespace-node 13 | (r/read-while reader r/space?)))) 14 | -------------------------------------------------------------------------------- /src/cljs-lib/test/calva/fmt/editor_test.cljs: -------------------------------------------------------------------------------- 1 | (ns calva.fmt.editor-test 2 | (:require [cljs.test :include-macros true :refer [deftest is]] 3 | [calva.fmt.editor :as sut])) 4 | 5 | 6 | (deftest raplacement-edits-for-diffing-lines 7 | (is (= [] 8 | (sut/raplacement-edits-for-diffing-lines "foo\nfoo\nbar\nbar" 9 | "foo\nfoo\nbar\nbar"))) 10 | (is (= [{:edit "replace", :start {:line 1, :character 0}, :end {:line 1, :character 6}, :text "bar"} 11 | {:edit "replace", :start {:line 2, :character 0}, :end {:line 2, :character 3}, :text "baz"}] 12 | (sut/raplacement-edits-for-diffing-lines "foo\nfooooo\nbar\nbar" 13 | "foo\nbar\nbaz\nbar")))) 14 | -------------------------------------------------------------------------------- /src/cljs-lib/test/calva/js2cljs/converter_test.cljs: -------------------------------------------------------------------------------- 1 | (ns calva.js2cljs.converter-test 2 | (:require [calva.js2cljs.converter :as sut] 3 | [clojure.spec.alpha :as s] 4 | [cljs.test :refer [testing deftest is]])) 5 | 6 | ;; valid result 7 | (s/def ::result string?) 8 | 9 | ;; invalid result 10 | (s/def ::message string?) 11 | (s/def ::number-of-parsed-lines pos-int?) 12 | (s/def ::name string?) 13 | (s/def ::exception (s/keys :req-un [::name ::message])) 14 | (s/def ::error (s/keys :req-un [::message ::number-of-parsed-lines ::exception])) 15 | (s/def ::invalid-result (s/keys :req-un [::error])) 16 | 17 | (deftest valid-results-test 18 | (testing "Returns a map with a `:result` string entry when conversion succeeds" 19 | (is (s/valid? ::result (:result (sut/convert "foo")))))) 20 | 21 | (deftest invalid-results-test 22 | (testing "Returns a map with an `:error` entry when conversion fails" 23 | (is (s/valid? ::invalid-result (sut/convert "import * as foo from 'foo';"))))) -------------------------------------------------------------------------------- /src/cljs-lib/test/calva/js_utils_test.cljs: -------------------------------------------------------------------------------- 1 | (ns calva.js-utils-test 2 | (:require [cljs.test :refer [deftest is testing]] 3 | [calva.js-utils :refer [jsify]])) 4 | 5 | (deftest jsify-test 6 | (testing "Converts map with vector containing map" 7 | (is (= (pr-str (jsify {:foo [1 {:bar :baz}]})) 8 | (pr-str #js {:foo #js [1 #js {:bar "baz"}]})))) 9 | (testing "Converts map with namespaced keywords" 10 | (is (= (pr-str (jsify {:foo/bar :foo/bar})) 11 | (pr-str #js {"foo/bar" "foo/bar"}))))) -------------------------------------------------------------------------------- /src/cljs-lib/test/pez_rewrite_clj/runner.cljs: -------------------------------------------------------------------------------- 1 | (ns pez-rewrite-clj.runner 2 | (:require [doo.runner :refer-macros [doo-tests]] 3 | [pez-rewrite-clj.zip-test] 4 | [pez-rewrite-clj.paredit-test] 5 | [pez-rewrite-clj.node-test] 6 | [pez-rewrite-clj.zip.seqz-test] 7 | [pez-rewrite-clj.zip.findz-test] 8 | [pez-rewrite-clj.zip.editz-test])) 9 | 10 | (doo-tests 'pez-rewrite-clj.zip-test 11 | 'pez-rewrite-clj.paredit-test 12 | 'pez-rewrite-clj.node-test 13 | 'pez-rewrite-clj.zip.seqz-test 14 | 'pez-rewrite-clj.zip.findz-test 15 | 'pez-rewrite-clj.zip.editz-test) 16 | -------------------------------------------------------------------------------- /src/cljs-lib/test/pez_rewrite_clj/zip/editz_test.cljs: -------------------------------------------------------------------------------- 1 | (ns pez-rewrite-clj.zip.editz-test 2 | (:require [cljs.test :refer-macros [deftest is testing run-tests]] 3 | [pez-rewrite-clj.zip :as z] 4 | [pez-rewrite-clj.node :as n] 5 | [pez-rewrite-clj.zip.editz :as e])) 6 | 7 | 8 | 9 | (deftest splice 10 | (is (= "[1 2 [3 4]]" (-> "[[1 2] [3 4]]" 11 | z/of-string 12 | z/down 13 | e/splice 14 | z/root-string)))) 15 | -------------------------------------------------------------------------------- /src/cljs-lib/test/test_util.cljs: -------------------------------------------------------------------------------- 1 | (ns test-util) 2 | 3 | (defn wrap-spy 4 | "This is a helper that returns a function that calls the spy (created by the tortue/spy library), 5 | so that the shadow-cljs doesn't complain, which it does if a spy is used and called directly in a test - it will say 6 | the thing is not a function. 7 | 8 | See: 9 | - https://github.com/alexanderjamesking/spy/issues/29 10 | - https://clojurescript.org/reference/compiler-options#static-fns 11 | 12 | (Setting static-fns to false in the build config's compiler-options doesn't fully fix the issue.)" 13 | [spy] 14 | (fn [& args] 15 | (apply spy args))) 16 | -------------------------------------------------------------------------------- /src/extension-test/e2e-test/.joyride/scripts/workspace_activate.cljs: -------------------------------------------------------------------------------- 1 | (ns workspace-activate 2 | (:require [db :as db] 3 | ["vscode" :as vscode])) 4 | 5 | #_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]} 6 | (defn ws-root [] 7 | (first vscode/workspace.workspaceFolders)) 8 | 9 | (swap! db/!state assoc :ws-activated? true) -------------------------------------------------------------------------------- /src/extension-test/e2e-test/.joyride/src/config.cljs: -------------------------------------------------------------------------------- 1 | (ns config) 2 | 3 | (defn ns-symbols [] 4 | ['tests.a-test]) -------------------------------------------------------------------------------- /src/extension-test/e2e-test/.joyride/src/db.cljs: -------------------------------------------------------------------------------- 1 | (ns db 2 | (:require [cljs.test])) 3 | 4 | (def !state (atom {:running nil 5 | :ws-activated? false 6 | :pass 0 7 | :fail 0 8 | :error 0})) 9 | 10 | -------------------------------------------------------------------------------- /src/extension-test/e2e-test/.joyride/src/macros.cljs: -------------------------------------------------------------------------------- 1 | (ns macros) 2 | 3 | (defmacro deftest-async [name opts & body] 4 | (let [[opts body] 5 | (if (map? opts) 6 | [opts body] 7 | [nil (cons opts body)])] 8 | `(cljs.test/deftest ~name 9 | ~@(when-let [pre (:before opts)] 10 | [pre]) 11 | (cljs.test/async 12 | ~'done 13 | (-> (do ~@body) 14 | (.catch (fn [err#] 15 | (cljs.test/is (= 1 0) (str err# (.-stack err#))))) 16 | (.finally 17 | (fn [] 18 | ~@(when-let [post (:after opts)] 19 | [post]) 20 | (~'done)))))))) -------------------------------------------------------------------------------- /src/extension-test/e2e-test/.joyride/src/tests/a_test.cljs: -------------------------------------------------------------------------------- 1 | (ns tests.a-test 2 | (:require [cljs.test :refer [deftest testing is]] 3 | [promesa.core :as p] 4 | ["ext://betterthantomorrow.joyride" :as joyride] 5 | ["ext://betterthantomorrow.calva$v0" :as calva] 6 | [macros :refer [deftest-async]])) 7 | 8 | (deftest calva-required 9 | (testing "Requires Calva" 10 | (is (not= nil? calva/ranges)))) 11 | 12 | (deftest-async joyride-required 13 | (testing "Requires the Joyride extension" 14 | (p/let [question (joyride/runCode "42")] 15 | (is (= 42 question))))) 16 | -------------------------------------------------------------------------------- /src/extension-test/e2e-test/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "workbench.colorCustomizations": { 3 | "sash.hoverBorder": "#DB9550", 4 | "titleBar.activeBackground": "#90B4FE", 5 | "titleBar.activeForeground": "#131722", 6 | "titleBar.inactiveBackground": "#90B4FEd5", 7 | "titleBar.inactiveForeground": "#13172299" 8 | }, 9 | "window.zoomLevel": 0 10 | } 11 | -------------------------------------------------------------------------------- /src/extension-test/e2e-test/bb.edn: -------------------------------------------------------------------------------- 1 | {:paths [".joyride/scripts" ".joyride/src"]} -------------------------------------------------------------------------------- /src/extension-test/e2e-test/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "calva-vsix-test-workspace", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "calva-vsix-test-workspace", 9 | "version": "1.0.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "minimist": "^1.2.7" 13 | } 14 | }, 15 | "node_modules/minimist": { 16 | "version": "1.2.7", 17 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", 18 | "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", 19 | "funding": { 20 | "url": "https://github.com/sponsors/ljharb" 21 | } 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/extension-test/e2e-test/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "calva-vsix-test-workspace", 3 | "version": "1.0.0", 4 | "description": "VSIX e2e test workspace for Calva", 5 | "scripts": {}, 6 | "keywords": [], 7 | "author": { 8 | "name": "Better Than Tomorrow", 9 | "email": "pez@pezius.com" 10 | }, 11 | "license": "MIT", 12 | "dependencies": { 13 | "minimist": "^1.2.7" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/extension-test/e2e-test/runTests.js: -------------------------------------------------------------------------------- 1 | const vscode = require('vscode'); 2 | 3 | exports.run = async () => { 4 | await vscode.commands.executeCommand('calva.activateCalva'); 5 | return vscode.commands.executeCommand( 6 | 'joyride.runCode', 7 | "(require '[test-runner :as runner]) (runner/run-all-tests)" 8 | ); 9 | }; 10 | -------------------------------------------------------------------------------- /src/extension-test/unit/util/regex-test.ts: -------------------------------------------------------------------------------- 1 | import * as expect from 'expect'; 2 | import { testCljOrJsRegex } from '../../../util/regex'; 3 | 4 | describe('regex', () => { 5 | describe('testCljOrJsRegex', () => { 6 | it('works with the clojure regex string', () => { 7 | expect(testCljOrJsRegex('#"^\\w"', 'function1')).toBeTruthy(); 8 | }); 9 | it('works with the js regex string', () => { 10 | expect(testCljOrJsRegex('/^\\w/', 'function1')).toBeTruthy(); 11 | }); 12 | it('works with the plain text', () => { 13 | expect(testCljOrJsRegex('ANY', 'ANY')).toBeTruthy(); 14 | }); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /src/lsp/client/index.ts: -------------------------------------------------------------------------------- 1 | export * from './downloader'; 2 | export * from './client'; 3 | -------------------------------------------------------------------------------- /src/lsp/client/semantic-token-filter.ts: -------------------------------------------------------------------------------- 1 | export function filterCommentTokens(data: Uint32Array, remove: number) { 2 | const filteredData: number[] = []; 3 | let accumulatedDeltaLine = 0; 4 | 5 | for (let i = 0; i < data.length; i += 5) { 6 | const [deltaLine, deltaStart, length, tokenType, modifiers] = [ 7 | data[i], 8 | data[i + 1], 9 | data[i + 2], 10 | data[i + 3], 11 | data[i + 4], 12 | ]; 13 | 14 | if (tokenType == remove) { 15 | accumulatedDeltaLine += deltaLine; 16 | continue; 17 | } 18 | 19 | filteredData.push( 20 | filteredData.length === 0 ? deltaLine : deltaLine + accumulatedDeltaLine, 21 | deltaStart, 22 | length, 23 | tokenType, 24 | modifiers 25 | ); 26 | accumulatedDeltaLine = 0; 27 | } 28 | 29 | return filteredData; 30 | } 31 | -------------------------------------------------------------------------------- /src/lsp/commands/index.ts: -------------------------------------------------------------------------------- 1 | export * from './vscode-commands'; 2 | export * from './lsp-commands'; 3 | -------------------------------------------------------------------------------- /src/lsp/config.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode'; 2 | 3 | export enum AutoStartBehaviour { 4 | WorkspaceOpened = 'when-workspace-opened-use-workspace-root', 5 | FirstWorkspace = 'always-use-first-workspace-root', 6 | FileOpened = 'when-file-opened-use-furthest-project', 7 | Never = 'never', 8 | } 9 | 10 | /** 11 | * Get the auto-start config from vscode. 12 | * 13 | * Translates boolean values into the AutoStartBehaviour enum for backwards compatibility 14 | * - true -> WorkspaceOpened 15 | * - false -> Never 16 | */ 17 | export const getAutoStartBehaviour = () => { 18 | const config = vscode.workspace.getConfiguration('calva'); 19 | const auto_start = config.get('enableClojureLspOnStart'); 20 | if (typeof auto_start === 'boolean') { 21 | if (auto_start) { 22 | return AutoStartBehaviour.WorkspaceOpened; 23 | } else { 24 | return AutoStartBehaviour.Never; 25 | } 26 | } 27 | return auto_start; 28 | }; 29 | -------------------------------------------------------------------------------- /src/lsp/index.ts: -------------------------------------------------------------------------------- 1 | export * as api from './api'; 2 | export * from './provider'; 3 | export * from './state'; 4 | -------------------------------------------------------------------------------- /src/lsp/queue.ts: -------------------------------------------------------------------------------- 1 | import * as stream from 'node:stream/web'; 2 | 3 | /** 4 | * A simple async queue implementation backed by a node transform stream in passthrough mode. This will 5 | * process items synchronously. 6 | */ 7 | export const createQueue = (handler: (item: T) => Promise) => { 8 | const queue = new stream.TransformStream(); 9 | const writer = queue.writable.getWriter(); 10 | 11 | void (async () => { 12 | for await (const item of queue.readable) { 13 | await handler(item).catch((err) => { 14 | console.error('Failed to process queue item', err); 15 | }); 16 | } 17 | })().catch((err) => { 18 | console.error(err); 19 | }); 20 | 21 | return { 22 | push: (item: T) => writer.write(item), 23 | }; 24 | }; 25 | -------------------------------------------------------------------------------- /src/lsp/state.ts: -------------------------------------------------------------------------------- 1 | import * as state from '../../out/cljs-lib/cljs-lib'; 2 | import { ClientProvider } from './provider'; 3 | 4 | const STATE_KEY = 'LSP_CLIENT_PROVIDER'; 5 | 6 | export const registerGlobally = (provider: ClientProvider) => { 7 | state.setStateValue(STATE_KEY, provider); 8 | }; 9 | 10 | export const getClientProvider = (): ClientProvider => { 11 | const provider = state.getStateValue(STATE_KEY); 12 | if (!provider) { 13 | throw new Error('Failed to get LSP ClientProvider from global state'); 14 | } 15 | return provider; 16 | }; 17 | -------------------------------------------------------------------------------- /src/nrepl/connect-types.ts: -------------------------------------------------------------------------------- 1 | export enum ConnectType { 2 | Connect, 3 | JackIn, 4 | } 5 | -------------------------------------------------------------------------------- /src/providers/completion-util.ts: -------------------------------------------------------------------------------- 1 | import { CompletionItemKind, CompletionItemLabel } from 'vscode'; 2 | 3 | type CompletionObject = { 4 | label: string | CompletionItemLabel; 5 | kind: CompletionItemKind | number; 6 | [key: string]: any; 7 | }; 8 | 9 | export function mergeCompletions(a: CompletionObject[], b: CompletionObject[]): CompletionObject[] { 10 | const merge = (map: Map, obj: CompletionObject) => { 11 | const key = `${obj.label},${obj.kind}`; 12 | const existingObj = map.get(key); 13 | if (!existingObj || obj.score >= existingObj.score) { 14 | map.set(key, obj); 15 | } 16 | return map; 17 | }; 18 | 19 | const mergedMap = [...a, ...b].reduce(merge, new Map()); 20 | 21 | return Array.from(mergedMap.values()); 22 | } 23 | -------------------------------------------------------------------------------- /src/providers/content.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode'; 2 | import * as state from '../state'; 3 | import * as util from '../utilities'; 4 | 5 | export default class JarContentProvider implements vscode.TextDocumentContentProvider { 6 | state: any; 7 | 8 | constructor() { 9 | this.state = state; 10 | } 11 | 12 | provideTextDocumentContent(uri, token) { 13 | return util.getJarContents(uri); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/status.ts: -------------------------------------------------------------------------------- 1 | import statusbar from './statusbar'; 2 | import * as state from './state'; 3 | import { updateReplSessionType } from './nrepl/repl-session'; 4 | 5 | function update() { 6 | updateReplSessionType(); 7 | statusbar.update(); 8 | } 9 | 10 | export default { 11 | update, 12 | }; 13 | -------------------------------------------------------------------------------- /src/util/object.ts: -------------------------------------------------------------------------------- 1 | /** A cheesy deep-equal function for matching scanner states. Good enough to compare plain old js objects. */ 2 | function deepEqual(x: any, y: any): boolean { 3 | if (x == y) { 4 | return true; 5 | } 6 | if (x instanceof Array && y instanceof Array) { 7 | if (x.length == y.length) { 8 | for (let i = 0; i < x.length; i++) { 9 | if (!deepEqual(x[i], y[i])) { 10 | return false; 11 | } 12 | } 13 | return true; 14 | } else { 15 | return false; 16 | } 17 | } else if ( 18 | !(x instanceof Array) && 19 | !(y instanceof Array) && 20 | x instanceof Object && 21 | y instanceof Object 22 | ) { 23 | for (const f in x) { 24 | if (!deepEqual(x[f], y[f])) { 25 | return false; 26 | } 27 | } 28 | for (const f in y) { 29 | if (!Object.prototype.hasOwnProperty.call(x, f)) { 30 | return false; 31 | } 32 | } 33 | return true; 34 | } 35 | return false; 36 | } 37 | 38 | export { deepEqual }; 39 | -------------------------------------------------------------------------------- /src/util/regex.ts: -------------------------------------------------------------------------------- 1 | import { trim } from 'lodash'; 2 | 3 | export const isCljOrJsRegex = (regexp: string) => { 4 | return regexp.startsWith('#"') || regexp.startsWith('/'); 5 | }; 6 | 7 | export const testCljOrJsRegex = (regexp: string, str: string) => { 8 | if (str.startsWith(':')) { 9 | // We don't want to match keywords 10 | // https://github.com/weavejester/cljfmt/issues/298 11 | return false; 12 | } 13 | const clojureReMatches = regexp.match(/^#"(.*)"$/); 14 | const normalizedRe = 15 | (clojureReMatches && RegExp(clojureReMatches[1])) || RegExp(trim(regexp, '/')); 16 | return normalizedRe.test(str.replace(/^.*\//, '')); 17 | }; 18 | -------------------------------------------------------------------------------- /src/util/string-result.ts: -------------------------------------------------------------------------------- 1 | function indentAllLines(indent: number, result: string) { 2 | const prepend = `${' '.repeat(indent)}`; 3 | return result 4 | .replace(/\n\r?$/, '') 5 | .split(/\n\r?/) 6 | .join(`\n${prepend}`); 7 | } 8 | 9 | function commentifyResult(firstPrefix: string, restPrefix: string, result: string) { 10 | const lines = result.split(/\n\r?/); 11 | const restPrefixed = lines.join(`\n${restPrefix}`); 12 | return `${firstPrefix}${restPrefixed}`; 13 | } 14 | 15 | export function resultAsComment(indent: number, result: string, commentStyle: string) { 16 | const commentified = 17 | commentStyle === 'ignore' 18 | ? commentifyResult('#_', ' ', result) 19 | : commentStyle === 'rcf' 20 | ? commentifyResult('(comment\n ', ' ', result) + ')' 21 | : commentifyResult(';;=> ', ';; ', result); 22 | const indented = indentAllLines(indent, commentified); 23 | const prepend = `${' '.repeat(indent)}`; 24 | return `\n${prepend}${indented}`; 25 | } 26 | -------------------------------------------------------------------------------- /test-data/.calva/config.edn: -------------------------------------------------------------------------------- 1 | {#_#_:customREPLHoverSnippets 2 | [{:name "edn hover symbol" 3 | :snippet (str "**EDN edn hover symbol**: " $hover-text)} 4 | {:name "edn hover symbol quoted" 5 | :snippet (str "**EDN edn hover symbol quoted** " '$hover-text)} 6 | {:name "edn hover hover-current-form" 7 | :snippet (str "**EDN edn hover hover-current-form** " "$hover-current-form")} 8 | {:name "edn hover show val" 9 | :snippet (str "### EDN show val\n```clojure\n" (pr-str (eval (symbol (str "$ns" "/" "$hover-top-level-defined-symbol")))) "\n```")} 10 | {:name "edn hover current-form" 11 | :snippet (str "**EDN edn hover current-form** " "$current-form ")}] 12 | :customREPLCommandSnippets 13 | [{:name "EDN current form" 14 | :snippet (str "**EDN edn current-form**: " $current-form)} 15 | {:name "EDN selection" 16 | :snippet (str "foo" $selection)}]} 17 | 18 | -------------------------------------------------------------------------------- /test-data/.cljfmt.edn: -------------------------------------------------------------------------------- 1 | {:remove-surrounding-whitespace? true 2 | :remove-trailing-whitespace? true 3 | :remove-consecutive-blank-lines? true 4 | :insert-missing-whitespace? true 5 | :indent-line-comments? true 6 | :extra-indents {#re "fooa?$" [[:inner 0]] 7 | #re "bar" [[:block 0]] 8 | #re "^baz" [[:inner 0]] 9 | with-special [[:default]]} 10 | 11 | :test {:fooa (fooa 1 12 | 2 13 | {:a a 14 | :aa a 15 | :bbb bbb}) 16 | :foo (foo 1 17 | 2 18 | 3) 19 | :foob (foob 1 20 | 2 21 | 3) 22 | :baz (bazzo 1 23 | :x) 24 | :with (with-something 1 25 | :x) 26 | :with-special (with-special 1 27 | :x) 28 | :let (let [] 29 | hello) 30 | :-> (-> foo/bar 31 | 1 32 | 2)} 33 | :test-2 (defn f [x] 34 | x)} 35 | -------------------------------------------------------------------------------- /test-data/.joyride/deps.edn: -------------------------------------------------------------------------------- 1 | ;; clojure-lsp needs this config to analyze Joyride code 2 | ;; To tell clojure-lsp about this file: 3 | ;; 1. Add a source-alias to `.lsp/config.edn`. Minimal config file content: 4 | ;; {:source-aliases #{:joyride}} 5 | ;; 2. Add a `:joyride` alias to the project root deps.edn file. 6 | ;; Minimal file content: 7 | ;; {:aliases {:joyride {:extra-deps {joyride/workspace {:local/root ".joyride"}}}}} 8 | 9 | {:deps {org.clojure/clojurescript {:mvn/version "1.11.54"} 10 | funcool/promesa {:mvn/version "9.0.471"} 11 | rewrite-clj/rewrite-clj {:mvn/version "1.1.46"} 12 | joyride/user {:local/root "/Users/pez/.config/joyride"}} 13 | :paths ["src" "scripts"]} -------------------------------------------------------------------------------- /test-data/.joyride/scripts/activate.cljs: -------------------------------------------------------------------------------- 1 | (ns activate) 2 | 3 | (println "Hello Joyride activate") -------------------------------------------------------------------------------- /test-data/.joyride/scripts/calva_lab.cljs: -------------------------------------------------------------------------------- 1 | (ns calva-lab 2 | (:require [joyride.core :as joy] 3 | [promesa.core :as p])) 4 | 5 | (defn -main [] 6 | ; Calva needs to have provided its nrepl client on globalThis 7 | (-> (p/let [session (.-session js/nClient) 8 | info (.info session "clojure.core", "map") 9 | doc (.-doc info)] 10 | doc) 11 | (p/catch (fn [e] 12 | (js/console.error "Sadness" e))))) 13 | 14 | (when (= (joy/invoked-script) joy/*file*) 15 | (-main)) 16 | -------------------------------------------------------------------------------- /test-data/.joyride/scripts/clojure_file.clj: -------------------------------------------------------------------------------- 1 | (ns clojure-file) 2 | 3 | {:foo "bar"} -------------------------------------------------------------------------------- /test-data/.joyride/scripts/hello.cljs: -------------------------------------------------------------------------------- 1 | (ns hello 2 | (:require ["vscode" :as vscode] 3 | [promesa.core :as p])) 4 | 5 | (comment 6 | (+ 1 2 3 4 5 6 7 8) 7 | (-> (vscode/window.showInformationMessage 8 | "Come on, Join the Joyride!" 9 | "Be a Joyrider") 10 | (p/then (fn [choice] 11 | (println "You choose to:" choice)))) 12 | ) 13 | 14 | "Hello World" -------------------------------------------------------------------------------- /test-data/custom-jack-in.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Initialize variables 4 | aliases_string="" 5 | cider_nrepl_version="" 6 | 7 | # Parse the command-line arguments 8 | while [[ "$#" -gt 0 ]]; do 9 | case "$1" in 10 | --aliases) 11 | aliases_string="$2" 12 | shift 2 13 | ;; 14 | --cider-nrepl-version) 15 | cider_nrepl_version="$2" 16 | shift 2 17 | ;; 18 | *) 19 | echo "Unknown parameter: $1" 20 | exit 1 21 | ;; 22 | esac 23 | done 24 | 25 | # Split the aliases string into an array using comma as the delimiter 26 | IFS="," read -ra aliases <<< "$aliases_string" 27 | 28 | # Process the array and scalar as needed 29 | echo "Aliases:" 30 | for alias in "${aliases[@]}"; do 31 | echo "$alias" 32 | done 33 | 34 | echo "CIDER nREPL version: $cider_nrepl_version" 35 | -------------------------------------------------------------------------------- /test-data/deps.edn: -------------------------------------------------------------------------------- 1 | {:deps {org.clojure/clojure {:mvn/version "1.12.0"} 2 | pez/pirate-lang {:local/root "projects/pirate-lang"}} 3 | :paths ["integration-test" ".joyride/scripts"]} -------------------------------------------------------------------------------- /test-data/empty-folder/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/test-data/empty-folder/.keep -------------------------------------------------------------------------------- /test-data/integration-test/reformattable.clj: -------------------------------------------------------------------------------- 1 | (ns test) 2 | 3 | (def hover-map 4 | {:stuff "in-here" 5 | :ohter "yeah" 6 | :deeper {:a 1, "foo" :bar, [1 2 3] (vec (range 2000))}}) 7 | 8 | (defn foo [] 9 | (println "bar")) 10 | 11 | (foo) -------------------------------------------------------------------------------- /test-data/integration-test/test.clj: -------------------------------------------------------------------------------- 1 | (ns test) 2 | 3 | (def hover-map 4 | {:stuff "in-here" 5 | :ohter "yeah" 6 | :deeper {:a 1, "foo" :bar, [1 2 3] (vec (range 2000))}}) 7 | 8 | (defn foo [] 9 | (println "bar")) 10 | 11 | (foo) -------------------------------------------------------------------------------- /test-data/projects/.gitignore: -------------------------------------------------------------------------------- 1 | **/public/js/ 2 | **/target/ 3 | package-lock.json 4 | -------------------------------------------------------------------------------- /test-data/projects/auto-jack-in-absolute/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "calva.replConnectSequences": [ 3 | { 4 | "name": "Absolute root path", 5 | "projectType": "deps.edn", 6 | "cljsType": "none", 7 | "autoSelectForJackIn": true, 8 | //"projectRootPath": ["..", "auto-jack-in-absolute"] 9 | "projectRootPath": ["/Users", "pez/Projects/calva/test-data/projects/auto-jack-in-absolute"] 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /test-data/projects/auto-jack-in-absolute/deps.edn: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-data/projects/auto-jack-in-absolute/src/minimal/hello.clj: -------------------------------------------------------------------------------- 1 | (ns minimal.hello) 2 | 3 | (defn -main [& args] 4 | (println "Hello")) -------------------------------------------------------------------------------- /test-data/projects/cljs-only/deps.edn: -------------------------------------------------------------------------------- 1 | {:deps {org.clojure/clojurescript {:mvn/version "1.11.54"}}} 2 | -------------------------------------------------------------------------------- /test-data/projects/completions/deps.edn: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-data/projects/completions/src/aliased.clj: -------------------------------------------------------------------------------- 1 | ;; aliased.clj 2 | (ns aliased) 3 | -------------------------------------------------------------------------------- /test-data/projects/completions/src/aliasing.clj: -------------------------------------------------------------------------------- 1 | ;; aliasing.clj 2 | (ns aliasing 3 | (:require [aliased :as ns-alias])) 4 | -------------------------------------------------------------------------------- /test-data/projects/completions/src/another_ns.clj: -------------------------------------------------------------------------------- 1 | ;; another_ns.clj 2 | (ns another-ns) 3 | 4 | (def ns-alias 0) 5 | 6 | (defn bar 7 | [] 8 | (ns-a)) ;; Autocomplete will only suggest "ns-alias alias to: aliased" LSP-OUTPUT 9 | 10 | (defn foo 11 | [ns-alias] 12 | (ns-a)) ;; Autocomplete will only suggest "ns-alias alias to: aliased" 13 | 14 | (defn baz 15 | [] 16 | (let [ns-alias 0] 17 | ns-a)) ;; Autocomplete will only suggest "ns-alias alias to: aliased" -------------------------------------------------------------------------------- /test-data/projects/current-form/deps.edn: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-data/projects/current-form/src/top_level.clj: -------------------------------------------------------------------------------- 1 | (ns top-level 2 | (:require 3 | [foo] 4 | [bar])) 5 | 6 | (defn -main 7 | "I don't do a whole lot ... yet." 8 | {:rfc (comment 9 | ; I want to alt+enter eval this println 10 | (println "Nested RFC"))} 11 | [& _args] 12 | (println "Hello, World!")) 13 | 14 | (def x 15 | 'y) 16 | 17 | (comment 18 | (-main)) -------------------------------------------------------------------------------- /test-data/projects/deps-main-opts/deps.edn: -------------------------------------------------------------------------------- 1 | {:aliases {:has-main-opts {:main-opts ["-m" "main-opts.hello"]} 2 | :has-main-opts-starting-nrepl {:main-opts ["-m" "nrepl.cmdline" "--middleware" "[cider.nrepl/cider-middleware]"]}}} -------------------------------------------------------------------------------- /test-data/projects/deps-main-opts/src/main_opts/hello.clj: -------------------------------------------------------------------------------- 1 | (ns main-opts.hello) 2 | 3 | (defn -main [& args] 4 | (println "Hello")) -------------------------------------------------------------------------------- /test-data/projects/e2e-sub-projects/.joyride/scripts/workspace_activate.cljs: -------------------------------------------------------------------------------- 1 | ../../../../../src/extension-test/e2e-test/.joyride/scripts/workspace_activate.cljs -------------------------------------------------------------------------------- /test-data/projects/e2e-sub-projects/.joyride/src/config.cljs: -------------------------------------------------------------------------------- 1 | (ns config) 2 | 3 | (defn ns-symbols [] 4 | ['tests.example-test]) -------------------------------------------------------------------------------- /test-data/projects/e2e-sub-projects/.joyride/src/db.cljs: -------------------------------------------------------------------------------- 1 | ../../../../../src/extension-test/e2e-test/.joyride/src/db.cljs -------------------------------------------------------------------------------- /test-data/projects/e2e-sub-projects/.joyride/src/macros.cljs: -------------------------------------------------------------------------------- 1 | ../../../../../src/extension-test/e2e-test/.joyride/src/macros.cljs -------------------------------------------------------------------------------- /test-data/projects/e2e-sub-projects/.joyride/src/test_runner.cljs: -------------------------------------------------------------------------------- 1 | ../../../../../src/extension-test/e2e-test/.joyride/src/test_runner.cljs -------------------------------------------------------------------------------- /test-data/projects/e2e-sub-projects/.joyride/src/tests/example_test.cljs: -------------------------------------------------------------------------------- 1 | (ns tests.example-test 2 | (:require [cljs.test :refer [deftest testing is]] 3 | [promesa.core :as p] 4 | [macros :refer [deftest-async]])) 5 | 6 | (deftest a-sync-test 7 | (testing "A sync test" 8 | (is (not= nil? 1)))) 9 | 10 | (deftest-async an-async-test 11 | (testing "Requires the Joyride extension" 12 | (p/let [answer (p/resolved 42)] 13 | (is (= 42 answer))))) 14 | -------------------------------------------------------------------------------- /test-data/projects/e2e-sub-projects/no-project-here/project-a/a.cljs: -------------------------------------------------------------------------------- 1 | (ns a) -------------------------------------------------------------------------------- /test-data/projects/e2e-sub-projects/no-project-here/project-a/deps.edn: -------------------------------------------------------------------------------- 1 | {:paths ["."]} -------------------------------------------------------------------------------- /test-data/projects/e2e-sub-projects/no-project-here/project-b/b.cljs: -------------------------------------------------------------------------------- 1 | (ns b) -------------------------------------------------------------------------------- /test-data/projects/e2e-sub-projects/no-project-here/sub-projects/proj1/deps.edn: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-data/projects/e2e-sub-projects/no-project-here/sub-projects/proj2/deps.edn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/test-data/projects/e2e-sub-projects/no-project-here/sub-projects/proj2/deps.edn -------------------------------------------------------------------------------- /test-data/projects/e2e-sub-projects/project-a/a.cljs: -------------------------------------------------------------------------------- 1 | (ns a) -------------------------------------------------------------------------------- /test-data/projects/e2e-sub-projects/project-a/deps.edn: -------------------------------------------------------------------------------- 1 | {:paths ["."]} -------------------------------------------------------------------------------- /test-data/projects/e2e-sub-projects/project-b/b.cljs: -------------------------------------------------------------------------------- 1 | (ns b) -------------------------------------------------------------------------------- /test-data/projects/e2e-sub-projects/sub-projects/proj1/deps.edn: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-data/projects/e2e-sub-projects/sub-projects/proj2/deps.edn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/test-data/projects/e2e-sub-projects/sub-projects/proj2/deps.edn -------------------------------------------------------------------------------- /test-data/projects/frankenstein/deps.edn: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-data/projects/frankenstein/src/overshadow_core.clj: -------------------------------------------------------------------------------- 1 | (ns overshadow-core) 2 | 3 | (defn abs []) -------------------------------------------------------------------------------- /test-data/projects/frankenstein/test/output_test.clj: -------------------------------------------------------------------------------- 1 | (ns output-test 2 | (:require [clojure.test :refer [deftest is testing]])) 3 | 4 | (deftest extra-lines 5 | ;; Test that Calva doesn't add or remove whitespace from test output 6 | ;; NB: "seven" and "eight" are lost, we never get them back from the nREPL server, I think 7 | (testing "printing w/ retained whitespace" 8 | (is (nil? (do 9 | (print "one") 10 | (println "two") 11 | (println "three") 12 | (print " four") 13 | (println " five") 14 | (println " six") 15 | (print "seven") 16 | (print "eight")))))) -------------------------------------------------------------------------------- /test-data/projects/kaocha-project/deps.edn: -------------------------------------------------------------------------------- 1 | {:paths ["src"] 2 | :aliases {:dev {:extra-paths ["env/dev"]} 3 | :test {:extra-paths ["test"] 4 | :extra-deps {lambdaisland/kaocha {:mvn/version "1.71.1119"}}}}} 5 | -------------------------------------------------------------------------------- /test-data/projects/kaocha-project/env/dev/user.clj: -------------------------------------------------------------------------------- 1 | (ns user 2 | (:require [kaocha.repl :as k])) 3 | 4 | (comment 5 | 1 6 | (k/run :unit)) -------------------------------------------------------------------------------- /test-data/projects/kaocha-project/src/foo.clj: -------------------------------------------------------------------------------- 1 | (ns foo) 2 | 3 | (defn foo [] 4 | :foo) 5 | 6 | (defn bar [] 7 | :bar) 8 | -------------------------------------------------------------------------------- /test-data/projects/kaocha-project/test/foo_test.clj: -------------------------------------------------------------------------------- 1 | (ns foo-test 2 | (:require [clojure.test :refer [deftest testing is]] 3 | [foo :as sut])) 4 | 5 | (deftest foo 6 | (testing "The foo" 7 | (is (= :foo (sut/foo))))) 8 | 9 | (deftest bar 10 | (testing "The bar" 11 | (is (= :baz (sut/bar))))) 12 | 13 | (deftest boom 14 | (testing "The boom" 15 | (is (= :boom (/ 1 0))))) -------------------------------------------------------------------------------- /test-data/projects/kaocha-project/tests.edn: -------------------------------------------------------------------------------- 1 | #kaocha/v1 {} -------------------------------------------------------------------------------- /test-data/projects/lein-project/.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /classes 3 | /checkouts 4 | profiles.clj 5 | pom.xml 6 | pom.xml.asc 7 | *.jar 8 | *.class 9 | /.lein-* 10 | /.nrepl-port 11 | /.prepl-port 12 | .hgignore 13 | .hg/ 14 | -------------------------------------------------------------------------------- /test-data/projects/lein-project/project.clj: -------------------------------------------------------------------------------- 1 | (defproject lein-project "0.1.0-SNAPSHOT" 2 | :description "FIXME: write description" 3 | :url "http://example.com/FIXME" 4 | :license {:name "EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0" 5 | :url "https://www.eclipse.org/legal/epl-2.0/"} 6 | :dependencies [[org.clojure/clojure "1.11.1"]] 7 | :repl-options {:init-ns lein-project.core}) 8 | -------------------------------------------------------------------------------- /test-data/projects/lein-project/src/lein_project/core.clj: -------------------------------------------------------------------------------- 1 | (ns lein-project.core) 2 | 3 | (defn foo 4 | "I don't do a whole lot." 5 | [x] 6 | (println x "Hello, World!")) 7 | -------------------------------------------------------------------------------- /test-data/projects/lein-project/test/lein_project/core_test.clj: -------------------------------------------------------------------------------- 1 | (ns lein-project.core-test 2 | (:require [clojure.test :refer :all] 3 | [lein-project.core :refer :all])) 4 | 5 | (deftest a-test 6 | (testing "FIXME, I fail." 7 | (is (= 0 1)))) 8 | -------------------------------------------------------------------------------- /test-data/projects/load-bar-requiring-foo/README.md: -------------------------------------------------------------------------------- 1 | # Repro attempt of evaluated symbols getting lost 2 | 3 | We've had reports about evaluated symbols being unloaded. See [src/bar.clj](src/bar.clj) for repro attempt instructions. 4 | 5 | It's probably more to it than this minimal project can expose. If you think you have a repro, please use this project as a base and describe the changes (a comparison from a fork of the Calva repro, or some other way). -------------------------------------------------------------------------------- /test-data/projects/load-bar-requiring-foo/deps.edn: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-data/projects/load-bar-requiring-foo/src/bar.clj: -------------------------------------------------------------------------------- 1 | (ns bar 2 | (:require [foo])) 3 | 4 | ; We've had reports about evaluated symbols being unloaded 5 | ; The following could be a repro, even if it isn't when I (@PEZ) try it. 6 | 7 | ; 0. Start REPL 8 | ; 1. Load this file 9 | ; 2. Uncomment the following line 10 | ;(foo/profile) 11 | ; 3. Evaluate the above top level form 12 | 13 | ; Expected result: "Profile called" is returned 14 | ; Result when issue is hitting: Error: no such var foo/profile -------------------------------------------------------------------------------- /test-data/projects/load-bar-requiring-foo/src/foo.clj: -------------------------------------------------------------------------------- 1 | (ns foo) 2 | 3 | (defn profile [] 4 | "Profile called") -------------------------------------------------------------------------------- /test-data/projects/minimal-basilisp/basilisp.edn: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /test-data/projects/minimal-basilisp/src/test.lpy: -------------------------------------------------------------------------------- 1 | (ns test) 2 | 3 | (def hover-map 4 | {:stuff "in-here" 5 | :ohter "yeah" 6 | :deeper {:a 1, "foo" :bar, [1 2 3] (vec (range 2000))}}) 7 | 8 | (defn foo [] 9 | (println "bar")) 10 | 11 | (foo) 12 | -------------------------------------------------------------------------------- /test-data/projects/minimal-deps/deps.edn: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-data/projects/minimal-deps/src/minimal/hello.clj: -------------------------------------------------------------------------------- 1 | (ns minimal.hello) 2 | 3 | (defn -main [& args] 4 | (println "Hello")) -------------------------------------------------------------------------------- /test-data/projects/minimal-reveal/deps.edn: -------------------------------------------------------------------------------- 1 | {:paths ["src"] 2 | :deps {org.clojure/clojure {:mvn/version "1.11.1"}} 3 | :aliases 4 | {:reveal-nrepl-middleware 5 | {:extra-deps {vlaaad/reveal {:mvn/version "1.3.275"}} 6 | :jvm-opts ["--add-opens" "javafx.graphics/com.sun.javafx.tk=ALL-UNNAMED"] 7 | :main-opts ["-m" "nrepl.cmdline" 8 | "--middleware" "[vlaaad.reveal.nrepl/middleware,cider.nrepl/cider-middleware]"]}}} -------------------------------------------------------------------------------- /test-data/projects/minimal-reveal/src/hello.clj: -------------------------------------------------------------------------------- 1 | (ns hello) 2 | 3 | (comment 4 | (repeat 7 (zipmap [:answer :foo] [42 :bar])) 5 | ) -------------------------------------------------------------------------------- /test-data/projects/minimal-shadow-only/.gitignore: -------------------------------------------------------------------------------- 1 | **/public/js/ 2 | **/target/ 3 | package-lock.json 4 | **/node_modules 5 | **/.cache 6 | **/.portal 7 | **/.shadow-cljs 8 | .lein* 9 | .nrepl-port -------------------------------------------------------------------------------- /test-data/projects/minimal-shadow-only/.joyride/deps.edn: -------------------------------------------------------------------------------- 1 | ;; clojure-lsp needs this config to analyze Joyride code 2 | ;; To tell clojure-lsp about this file: 3 | ;; 1. Add a source-alias to `.lsp/config.edn`. E.g.: 4 | ;; :source-aliases #{:src :test :joyride} 5 | ;; (The clojure-lsp defaults are `:src :test`.) 6 | ;; 2. Add a `:joyride` alias to the project root deps.edn file. 7 | ;; Minimal file content: 8 | ;; {:aliases {:joyride {:extra-deps {joyride/workspace {:local/root ".joyride"}}}}} 9 | ;; 10 | ;; To also tell clojure-lsp about your Joyride user scripts, see instructions 11 | ;; in your User Joyride config directory `deps.edn` file. 12 | ;; (`~/.config/joyride/deps.edn` on Mac/Linux, somewhere similar on Windows?) 13 | {:deps {org.clojure/clojurescript {:mvn/version "1.11.54"} 14 | funcool/promesa {:mvn/version "9.0.471"} 15 | rewrite-clj/rewrite-clj {:mvn/version "1.1.46"}} 16 | :paths ["src" "scripts"]} -------------------------------------------------------------------------------- /test-data/projects/minimal-shadow-only/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "calva.autoOpenJackInTerminal": true, 3 | "calva.autoConnectRepl": true, 4 | "calva.replConnectSequences": [ 5 | { 6 | "projectType": "shadow-cljs", 7 | "name": "Start ShadowCLJS REPL", 8 | //"autoSelectForJackIn": true, 9 | "projectRootPath": ["."], 10 | "cljsType": "shadow-cljs", 11 | "menuSelections": { 12 | "cljsLaunchBuilds": ["app"], 13 | "cljsDefaultBuild": "app" 14 | } 15 | }, 16 | { 17 | "projectType": "deps.edn", 18 | "name": "Connect ShadowCLJS REPL", 19 | "autoSelectForConnect": true, 20 | "projectRootPath": ["."], 21 | "cljsType": "shadow-cljs", 22 | "menuSelections": { 23 | "cljsDefaultBuild": "frontend" 24 | } 25 | } 26 | ] 27 | } 28 | -------------------------------------------------------------------------------- /test-data/projects/minimal-shadow-only/deps.edn: -------------------------------------------------------------------------------- 1 | {:paths ["src"] 2 | :deps {org.clojure/clojure {:mvn/version "1.11.1"} 3 | org.clojure/clojurescript {:mvn/version "1.11.60"} 4 | thheller/shadow-cljs {:mvn/version "2.24.1"} 5 | binaryage/devtools {:mvn/version "1.0.6"} 6 | reagent/reagent {:mvn/version "1.1.1"}} 7 | } -------------------------------------------------------------------------------- /test-data/projects/minimal-shadow-only/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "react": "^17.0.2", 4 | "react-dom": "^17.0.2", 5 | "shadow-cljs": "^2.19.9" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /test-data/projects/minimal-shadow-only/public/css/style.css: -------------------------------------------------------------------------------- 1 | /* some style */ 2 | -------------------------------------------------------------------------------- /test-data/projects/minimal-shadow-only/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | The app should replace this. Have you started the app? 12 |
13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /test-data/projects/minimal-shadow-only/shadow-cljs.edn: -------------------------------------------------------------------------------- 1 | {:deps true 2 | :source-paths ["src"] 3 | :dependencies [[org.clojure/clojure "1.12.0"] 4 | [binaryage/devtools "1.0.6"] 5 | #_[ org.clojure/clojurescript {:mvn/version "1.11.60"}] 6 | [ thheller/shadow-cljs "2.28.19"] 7 | [ binaryage/devtools "1.0.6"] 8 | [ reagent/reagent "1.1.1"]] 9 | :dev-http {8700 "public"} 10 | :builds 11 | {:app {:target :browser 12 | :output-dir "public/js/compiled" 13 | :asset-path "/js/compiled" 14 | :modules {:main {:init-fn main.core/init}}}}} -------------------------------------------------------------------------------- /test-data/projects/minimal-shadow-only/src/main/core.cljs: -------------------------------------------------------------------------------- 1 | (ns main.core 2 | (:require [reagent.core :as r] 3 | [reagent.dom :as rdom])) 4 | 5 | (defonce app-state (r/atom {:text "Hello world!"})) 6 | 7 | (defn hello-world [] 8 | [:div 9 | [:h1 (:text @app-state)] 10 | [:h3 "Edit this and watch it change!"]]) 11 | 12 | (defn ^:dev/after-load start [] 13 | (js/console.log "start") 14 | (rdom/render [hello-world] 15 | (. js/document (getElementById "app")))) 16 | 17 | (defn ^:export init [] 18 | (js/console.log "init") 19 | (start)) 20 | 21 | (defn ^:dev/before-load stop [] 22 | (js/console.log "stop")) 23 | -------------------------------------------------------------------------------- /test-data/projects/mono-repo-2/.gitignore: -------------------------------------------------------------------------------- 1 | .cpcache 2 | .nrepl-port 3 | .clj-kondo/* 4 | !.clj-kondo/config.edn 5 | .lsp/* 6 | !.lsp/config.edn 7 | .calva -------------------------------------------------------------------------------- /test-data/projects/mono-repo-2/libs/lib1/deps.edn: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-data/projects/mono-repo-2/libs/lib1/src/mycorp/lib1/core.clj: -------------------------------------------------------------------------------- 1 | (ns mycorp.lib1.core 2 | (:require [clojure.string])) 3 | 4 | ; make sure that you can jump to clojure.string/capitalize 5 | (defn myfunk 6 | [] 7 | (prn (clojure.string/capitalize "hi from lib1"))) 8 | 9 | ; this shouldn't be linted as unused-pulic-var due to `$repo/.clj-kondo/config.edn` 10 | (def an-unused-var 123) 11 | 12 | 13 | ; this should be linted as unused-private-var 14 | (defn- an-unused-private-var [] 123) -------------------------------------------------------------------------------- /test-data/projects/mono-repo-2/libs/lib2/deps.edn: -------------------------------------------------------------------------------- 1 | {:deps {mycorp/lib1 {:local/root "../lib1"}}} -------------------------------------------------------------------------------- /test-data/projects/mono-repo-2/libs/lib2/src/mycorp/lib2/core.clj: -------------------------------------------------------------------------------- 1 | (ns mycorp.lib2.core 2 | (:require [mycorp.lib1.core])) 3 | 4 | ; make sure that you can jump to the definition of mycorp.lib1.core/myfunk 5 | (defn myfunk [] 6 | (mycorp.lib1.core/myfunk) 7 | (prn "Hi from lib2")) -------------------------------------------------------------------------------- /test-data/projects/mono-repo-2/project1/deps.edn: -------------------------------------------------------------------------------- 1 | {:deps {mycorp/lib2 {:local/root "../libs/lib2"}}} -------------------------------------------------------------------------------- /test-data/projects/mono-repo-2/project1/project1.code-workspace: -------------------------------------------------------------------------------- 1 | { 2 | "folders": [ 3 | { 4 | "name": "Root", 5 | "path": ".." 6 | }, 7 | { 8 | "name": "project1", 9 | "path": "./src/mycorp/project1" 10 | }, 11 | { 12 | "name": "libs/lib1", 13 | "path": "../libs/lib1/src/mycorp/lib1" 14 | }, 15 | { 16 | "name": "libs/lib2", 17 | "path": "../libs/lib2/src/mycorp/lib2" 18 | } 19 | ], 20 | } -------------------------------------------------------------------------------- /test-data/projects/mono-repo-2/project1/src/mycorp/project1/core.clj: -------------------------------------------------------------------------------- 1 | (ns mycorp.project1.core 2 | (:require [mycorp.lib2.core])) 3 | 4 | ; make sure that you can jump to the definition of mycorp.lib2.core/myfunk 5 | (defn myfunk [] 6 | (mycorp.lib2.core/myfunk) 7 | (prn "Hi from project1")) 8 | 9 | ; make sure that you can run this after starting a deps.edn repl in mono-repo-2/project1 with the "Calva: start a project REPL..." command 10 | ; it should print: 11 | ; "Hi from lib1" 12 | ; "Hi from lib2" 13 | ; "Hi from project1" 14 | (comment 15 | (myfunk)) -------------------------------------------------------------------------------- /test-data/projects/mono-repo-2/project2/deps.edn: -------------------------------------------------------------------------------- 1 | {:deps {mycorp/lib1 {:local/root "../libs/lib1"}}} -------------------------------------------------------------------------------- /test-data/projects/mono-repo-2/project2/project2.code-workspace: -------------------------------------------------------------------------------- 1 | { 2 | "folders": [ 3 | { 4 | "name": "Root", 5 | "path": ".." 6 | }, 7 | { 8 | "name": "project2", 9 | "path": "./src/mycorp/project2" 10 | }, 11 | { 12 | "name": "libs/lib1", 13 | "path": "../libs/lib1/src/mycorp/lib1" 14 | } 15 | ], 16 | "settings": {} 17 | } -------------------------------------------------------------------------------- /test-data/projects/mono-repo-2/project2/src/mycorp/project2/core.clj: -------------------------------------------------------------------------------- 1 | (ns mycorp.project2.core 2 | (:require [mycorp.lib1.core])) 3 | 4 | ; make sure that you can jump to the definition of mycorp.lib1.core/myfunk 5 | (defn myfunk [] 6 | (mycorp.lib1.core/myfunk) 7 | (prn "Hi from project2")) 8 | 9 | 10 | (comment 11 | (myfunk)) -------------------------------------------------------------------------------- /test-data/projects/mono-repo/README.md: -------------------------------------------------------------------------------- 1 | # Minimal mono-repo 2 | 3 | To be used to check that the clojure-lsp behaves correctly with mono-repos and multiple open projects. 4 | 5 | ## Instructions: 6 | 7 | + Open just the project root and confirm that the clojure-lsp server is started in the root. 8 | + Add one of the `projects/` sub-directories to the same vscode workspace and confirm that there is still only a single lsp server booted 9 | + Confirm that go-to-definition works as expected across workspace folders 10 | 11 | Open the `./distinct-workspaces.code-workspace` workspace to confirm that a total of two lsp-servers are started 12 | -------------------------------------------------------------------------------- /test-data/projects/mono-repo/deps.edn: -------------------------------------------------------------------------------- 1 | {:deps {org.clojure/clojure {:mvn/version "1.11.1"} 2 | a/a {:local/root "projects/a"} 3 | b/b {:local/root "projects/b"}}} 4 | -------------------------------------------------------------------------------- /test-data/projects/mono-repo/distinct-workspaces.code-workspace: -------------------------------------------------------------------------------- 1 | { 2 | "folders": [ 3 | { 4 | "path": "." 5 | }, 6 | { 7 | "path": "projects/a" 8 | }, 9 | { 10 | "path": "projects/b" 11 | }, 12 | { 13 | "path": "../kaocha-project" 14 | } 15 | ], 16 | "settings": { 17 | // Starts one LSP proecess per workspace root folder with a Clojure project. 18 | "calva.enableClojureLspOnStart": "when-workspace-opened-use-workspace-root" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /test-data/projects/mono-repo/projects/a/deps.edn: -------------------------------------------------------------------------------- 1 | {:deps {org.clojure/clojure {:mvn/version "1.11.1"}}} 2 | -------------------------------------------------------------------------------- /test-data/projects/mono-repo/projects/a/src/a/core.clj: -------------------------------------------------------------------------------- 1 | (ns a.core) 2 | 3 | (defn function-a [] 4 | (println "output")) 5 | -------------------------------------------------------------------------------- /test-data/projects/mono-repo/projects/a/src/main.clj: -------------------------------------------------------------------------------- 1 | (ns main) 2 | -------------------------------------------------------------------------------- /test-data/projects/mono-repo/projects/b/.gitignore: -------------------------------------------------------------------------------- 1 | !.lsp 2 | .lsp/** 3 | !.lsp/config.edn 4 | -------------------------------------------------------------------------------- /test-data/projects/mono-repo/projects/b/.lsp/config.edn: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /test-data/projects/mono-repo/projects/b/deps.edn: -------------------------------------------------------------------------------- 1 | {:deps {org.clojure/clojure {:mvn/version "1.11.1"}}} 2 | -------------------------------------------------------------------------------- /test-data/projects/mono-repo/projects/b/src/b/main.clj: -------------------------------------------------------------------------------- 1 | (ns b.main 2 | (:require [a.core :as a])) 3 | 4 | (defn main [] 5 | (a/function-a)) 6 | -------------------------------------------------------------------------------- /test-data/projects/mono-repo/workspace.code-workspace: -------------------------------------------------------------------------------- 1 | { 2 | "folders": [ 3 | { 4 | "path": "." 5 | }, 6 | { 7 | "path": "projects/a" 8 | }, 9 | { 10 | "path": "projects/b" 11 | } 12 | ], 13 | "settings": { 14 | // Starts one LSP proecess per workspace root folder with a Clojure project. 15 | "calva.enableClojureLspOnStart": "when-workspace-opened-use-workspace-root" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /test-data/projects/my-gradle/.gitignore: -------------------------------------------------------------------------------- 1 | # Gradle 2 | /.gradle/ 3 | /build/ 4 | 5 | # Eclipse 6 | /.settings/ 7 | /.project 8 | /.classpath 9 | /bin/ 10 | 11 | # Calva 12 | /.clj-kondo/ 13 | /.lsp/ 14 | -------------------------------------------------------------------------------- /test-data/projects/my-gradle/README.md: -------------------------------------------------------------------------------- 1 | # my-gradle 2 | 3 | Sample project using Gradle and [clojurephant](https://github.com/clojurephant) to build a Clojure library. 4 | 5 | The upstream version of this sample project is: https://github.com/clojurephant/sample-clojurephant-clj-lib 6 | 7 | ## Usage 8 | 9 | Run the project's tests (they'll fail until you edit them): 10 | 11 | $ ./gradlew test 12 | 13 | Start an nREPL server: 14 | 15 | $ ./gradlew clojureRepl 16 | -------------------------------------------------------------------------------- /test-data/projects/my-gradle/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'dev.clojurephant.clojure' version '0.7.0' 3 | id 'maven-publish' 4 | } 5 | 6 | group = 'my.group' 7 | version = '0.1.0-SNAPSHOT' 8 | 9 | repositories { 10 | mavenCentral() 11 | maven { 12 | name = 'clojars' 13 | url = 'https://repo.clojars.org' 14 | } 15 | } 16 | 17 | dependencies { 18 | implementation 'org.clojure:clojure:1.11.0' 19 | 20 | testRuntimeOnly 'org.ajoberstar:jovial:0.3.0' 21 | 22 | devImplementation 'org.clojure:tools.namespace:1.3.0' 23 | } 24 | 25 | tasks.withType(Test) { 26 | useJUnitPlatform() 27 | } 28 | -------------------------------------------------------------------------------- /test-data/projects/my-gradle/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/test-data/projects/my-gradle/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /test-data/projects/my-gradle/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /test-data/projects/my-gradle/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'my-gradle' 2 | -------------------------------------------------------------------------------- /test-data/projects/my-gradle/src/main/clojure/my/group/mylib.clj: -------------------------------------------------------------------------------- 1 | (ns my.group.mylib) 2 | 3 | (defn foo 4 | "I don't do a whole lot." 5 | [x] 6 | (println x "Hello, World!")) 7 | -------------------------------------------------------------------------------- /test-data/projects/my-gradle/src/test/clojure/my/group/mylib_test.clj: -------------------------------------------------------------------------------- 1 | (ns my.group.mylib-test 2 | (:require [clojure.test :refer :all] 3 | [my.group.mylib :refer :all])) 4 | 5 | (deftest a-test 6 | (testing "FIXME, I fail." 7 | (is (= 0 1)))) 8 | -------------------------------------------------------------------------------- /test-data/projects/pirate-lang/.joyride/deps.edn: -------------------------------------------------------------------------------- 1 | ;; clojure-lsp needs this config to analyze Joyride code 2 | ;; To tell clojure-lsp about this file: 3 | ;; 1. Add a source-alias to `.lsp/config.edn`. Minimal config file content: 4 | ;; {:source-aliases #{:joyride}} 5 | ;; 2. Add a `:joyride` alias to the project root deps.edn file. 6 | ;; Minimal file content: 7 | ;; {:aliases {:joyride {:extra-deps {joyride/workspace {:local/root ".joyride"}}}}} 8 | ;; 9 | ;; To also tell clojure-lsp about your Joyride user scripts, see instructions 10 | ;; in your User Joyride config directory `deps.edn` file. 11 | ;; (`~/.config/joyride/deps.edn` on Mac/Linux, somewhere similar on Windows?) 12 | {:deps {org.clojure/clojurescript {:mvn/version "1.11.54"} 13 | funcool/promesa {:mvn/version "9.0.471"} 14 | rewrite-clj/rewrite-clj {:mvn/version "1.1.46"}} 15 | :paths ["src" "scripts"]} -------------------------------------------------------------------------------- /test-data/projects/pirate-lang/deps.edn: -------------------------------------------------------------------------------- 1 | {:paths ["resources" "src"] 2 | :deps {org.clojure/clojure {:mvn/version "1.12.0"}} 3 | :aliases 4 | {:socket {:jvm-opts ["-Dclojure.server.repl={:port 5555 :accept clojure.core.server/repl}"]} 5 | :test {:extra-paths ["test"] 6 | :extra-deps {org.clojure/test.check {:mvn/version "0.10.0"}}} 7 | :dev {:extra-paths ["env/dev"]} 8 | :runner 9 | {:extra-deps {com.cognitect/test-runner 10 | {:git/url "https://github.com/cognitect-labs/test-runner" 11 | :sha "76568540e7f40268ad2b646110f237a60295fa3c"}} 12 | :main-opts ["-m" "cognitect.test-runner" 13 | "-d" "test"]}}} 14 | -------------------------------------------------------------------------------- /test-data/projects/pirate-lang/dev/fiddles/pez/pirate_lang.clj: -------------------------------------------------------------------------------- 1 | (+ 1 2) -------------------------------------------------------------------------------- /test-data/projects/pirate-lang/env/dev/fiddles/pez/pirate_lang.clj: -------------------------------------------------------------------------------- 1 | (ns pez.pirate-lang) 2 | 3 | {:hello "world"} 4 | 5 | (comment 6 | {:hello "world"} 7 | {:hello ["world"]} 8 | {:hello ['world]} 9 | :rcf) 10 | -------------------------------------------------------------------------------- /test-data/projects/pirate-lang/env/dev/repl.clj: -------------------------------------------------------------------------------- 1 | (ns repl 2 | (:require [pez.pirate-lang-test])) -------------------------------------------------------------------------------- /test-data/projects/pirate-lang/src2/pez/foo_clj.clj: -------------------------------------------------------------------------------- 1 | (ns pez.foo-clj) -------------------------------------------------------------------------------- /test-data/projects/pirate-lang/src2/pez/foo_cljc.cljc: -------------------------------------------------------------------------------- 1 | (ns pez.foo-cljc) -------------------------------------------------------------------------------- /test-data/projects/pirate-lang/src2/pez/foo_cljs.cljs: -------------------------------------------------------------------------------- 1 | (ns pez.foo-cljs) -------------------------------------------------------------------------------- /test-data/projects/pirate-lang/test/pez/pirate_lang_test.clj: -------------------------------------------------------------------------------- 1 | (ns pez.pirate-lang-test 2 | (:require [clojure.test :refer [deftest is testing]] 3 | [pez.pirate-lang :as sut])) 4 | 5 | (def swedish-o {:alphabet "abcdefghijklmnopqrstuvwxyzåäö" 6 | :vowels "aeiouåäö" 7 | :pirate-char "o"}) 8 | (deftest a-test 9 | (testing "Speak rövarspråk" 10 | (testing "Swedish" 11 | (is (= "HoHaror dodu hohörortot totalolasos omom rorövovarorsospoproråkoketot?" 12 | (sut/to-pirate-talk "Har du hört talas om rövarspråket?" sut/swedish-o)))))) 13 | 14 | (deftest b-a-test 15 | (testing "Hear rövarspråk" 16 | (is (= "Har du hört talas om rövarspråket?" 17 | (sut/from-pirate-talk "HoHaror dodu hohörortot totalolasos omom rorövovarorsospoproråkoketot?" sut/swedish-o))))) 18 | 19 | (deftest a-test-b 20 | (println "running a-test-b") 21 | (is (= 1 1))) -------------------------------------------------------------------------------- /test-data/projects/repl-connected-code/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "calva.replConnectSequences": [ 3 | { 4 | "name": "Test broken jack-in code evaluation", 5 | "projectType": "deps.edn", 6 | "afterCLJReplJackInCode": "\"afterCLJReplJackInCode evaluated\"", 7 | "cljsType": "none" 8 | } 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /test-data/projects/repl-connected-code/README.md: -------------------------------------------------------------------------------- 1 | # Issue #2025 repro 2 | 3 | Issue #2025 reports that if there is no active editor, evaluating `afterCLJReplJackInCode` of a [REPL Connect Sequence](https://calva.io/connect-sequences/) fails. 4 | 5 | This project has a connect sequence with a simple `afterCLJReplJackInCode` code snippet. It works nicely if there is an editor active when jacking in or connecting the REPL. But without an active editor the code isn't run. Repro: 6 | 7 | 1. Open this project in VS Code. 8 | 2. Close any editors that are open. 9 | 2. Jack-in, selecting the **Test broken jack-in code evaluation** sequence. 10 | 11 | * **Expected**: `"afterCLJReplJackInCode evaluated"` is printed in the REPL window 12 | * **Actual**: `; Evaluation failed.` is printed in the REPL window 13 | -------------------------------------------------------------------------------- /test-data/projects/repl-connected-code/deps.edn: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-data/projects/repl-connected-code/src/repro/hello.clj: -------------------------------------------------------------------------------- 1 | (ns repro.hello) 2 | 3 | "Hello" -------------------------------------------------------------------------------- /test-data/projects/shadow-w-backend/.gitignore: -------------------------------------------------------------------------------- 1 | **/public/js/ 2 | **/target/ 3 | package-lock.json 4 | **/node_modules 5 | **/.cache 6 | **/.portal 7 | **/.shadow-cljs 8 | .lein* 9 | .nrepl-port -------------------------------------------------------------------------------- /test-data/projects/shadow-w-backend/README.md: -------------------------------------------------------------------------------- 1 | # {{name}} 2 | 3 | ## Run 4 | 5 | ``` shell 6 | yarn install 7 | 8 | yarn watch 9 | ``` 10 | 11 | ## Clean 12 | 13 | ``` shell 14 | yarn clean 15 | ``` 16 | 17 | ## Release 18 | 19 | ``` shell 20 | yarn release 21 | ``` 22 | 23 | ## License 24 | 25 | Copyright © 2017 FIXME 26 | 27 | Distributed under the Eclipse Public License either version 1.0 or (at 28 | your option) any later version. 29 | -------------------------------------------------------------------------------- /test-data/projects/shadow-w-backend/deps.edn: -------------------------------------------------------------------------------- 1 | {:paths ["src"] 2 | :deps {org.clojure/clojure {:mvn/version "1.12.0"} 3 | org.clojure/clojurescript {:mvn/version "1.11.132"} 4 | thheller/shadow-cljs {:mvn/version "2.28.19"} 5 | binaryage/devtools {:mvn/version "1.0.6"} 6 | reagent/reagent {:mvn/version "1.1.1"}} 7 | :aliases {:dev {} 8 | :dev-too {}} 9 | } -------------------------------------------------------------------------------- /test-data/projects/shadow-w-backend/env/dev/fiddles/main/common.cljc: -------------------------------------------------------------------------------- 1 | (hello "projects/shadow-w-backend/env/dev/fiddles/main/common.cljc") -------------------------------------------------------------------------------- /test-data/projects/shadow-w-backend/env/dev/fiddles/main/server.clj: -------------------------------------------------------------------------------- 1 | (println "projects/shadow-w-backend/env/dev/fiddles/main/server.clj") -------------------------------------------------------------------------------- /test-data/projects/shadow-w-backend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "react": "^17.0.2", 4 | "react-dom": "^17.0.2", 5 | "shadow-cljs": "^2.19.9" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /test-data/projects/shadow-w-backend/project.clj: -------------------------------------------------------------------------------- 1 | (defproject lein-app "0.1.0-SNAPSHOT" 2 | :description "FIXME: write description" 3 | :dependencies [[org.clojure/clojure "1.11.1"] 4 | [org.clojure/clojurescript "1.11.60"] 5 | [thheller/shadow-cljs "2.19.9"] 6 | [binaryage/devtools "1.0.6"] 7 | [reagent "1.1.1"]] 8 | :repl-options {:nrepl-middleware [shadow.cljs.devtools.server.nrepl/middleware]} 9 | :source-paths ["src"] 10 | :main ^:skip-aot main.server 11 | :target-path "target/%s" 12 | :profiles {:uberjar {:aot :all 13 | :jvm-opts ["-Dclojure.compiler.direct-linking=true"]}}) 14 | -------------------------------------------------------------------------------- /test-data/projects/shadow-w-backend/public/css/style.css: -------------------------------------------------------------------------------- 1 | /* some style */ 2 | -------------------------------------------------------------------------------- /test-data/projects/shadow-w-backend/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | The app should replace this. Have you started the app? 12 |
13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /test-data/projects/shadow-w-backend/shadow-cljs.edn: -------------------------------------------------------------------------------- 1 | {:deps true 2 | ;; :source-paths ["src"] 3 | ;; :dependencies [[binaryage/devtools "1.0.6"] 4 | ;; [reagent "1.1.1"]] 5 | :dev-http {8711 "public"} 6 | :builds 7 | {:app {:target :browser 8 | :output-dir "public/js/compiled" 9 | :asset-path "/js/compiled" 10 | :modules {:main {:init-fn main.core/init}}} 11 | :app-too {:target :browser 12 | :output-dir "public/js/compiled-too" 13 | :asset-path "/js/compiled-too" 14 | :modules {:main {:init-fn main.core/init}}}}} -------------------------------------------------------------------------------- /test-data/projects/shadow-w-backend/src/main/common.cljc: -------------------------------------------------------------------------------- 1 | (ns main.common) 2 | 3 | (defn hello [s] 4 | #?(:cljs (js/console.log "Hello" s) 5 | :clj (println "Hello" s))) -------------------------------------------------------------------------------- /test-data/projects/shadow-w-backend/src/main/common.fiddle: -------------------------------------------------------------------------------- 1 | (hello) -------------------------------------------------------------------------------- /test-data/projects/shadow-w-backend/src/main/core.cljs: -------------------------------------------------------------------------------- 1 | (ns main.core 2 | (:require [reagent.core :as r] 3 | [reagent.dom :as rdom])) 4 | 5 | (defonce app-state (r/atom {:text "Hello"})) 6 | 7 | (defn hello-world [x] 8 | [:div 9 | [:h1 (:text @app-state) " " x "!"] 10 | [:h3 "Edit this and watch it change!"]]) 11 | 12 | (defn ^:dev/after-load start [] 13 | (js/console.log "start") 14 | (rdom/render [hello-world "world"] 15 | (. js/document (getElementById "app")))) 16 | 17 | (defn ^:export init [] 18 | (js/console.log "init") 19 | (start)) 20 | 21 | (defn ^:dev/before-load stop [] 22 | (js/console.log "stop")) 23 | -------------------------------------------------------------------------------- /test-data/projects/shadow-w-backend/src/main/core.fiddle: -------------------------------------------------------------------------------- 1 | (js/console.log "projects/shadow-w-backend/src/main/core.fiddle") -------------------------------------------------------------------------------- /test-data/projects/shadow-w-backend/src/main/server.clj: -------------------------------------------------------------------------------- 1 | (ns main.server 2 | (:gen-class)) 3 | 4 | (defn -main 5 | "I don't do a whole lot ... yet." 6 | [& _args] 7 | (println "Hello, World!")) 8 | 9 | (comment 10 | (-main) 11 | ) -------------------------------------------------------------------------------- /test-data/projects/shadow-w-backend/src/main/server.fiddle: -------------------------------------------------------------------------------- 1 | (js/console.log "projects/shadow-w-backend/src/main/server.fiddle") 2 | (println "projects/shadow-w-backend/src/main/server.fiddle") -------------------------------------------------------------------------------- /test-data/test-files/calva-247-hang.clj: -------------------------------------------------------------------------------- 1 | ;; https://github.com/BetterThanTomorrow/calva/issues/1573 2 | 3 | ;; Confirm that structural editing works here: 4 | 5 | (defn foo [{:keys [bar]}] 'baz) 6 | 7 | ;; Then place the cursor inside the last paren and press delete 8 | 9 | ([{) 10 | 11 | ;; Calva stops working 😭 12 | 13 | ;; Until https://github.com/BetterThanTomorrow/calva/commit/d77359fcea16bc052ab829853d5711434330a375 14 | ;; 🎉 -------------------------------------------------------------------------------- /test-data/test-files/calva-252-hang.clj: -------------------------------------------------------------------------------- 1 | ;; https://github.com/BetterThanTomorrow/calva/issues/1585 2 | 3 | ;; Confirm that structural editing works here: 4 | 5 | (defn foo [{:keys [bar]}] 'baz) 6 | 7 | ;; Here a repro that works for at least one user: 8 | ;; Place the cursor to the right of the closing square bracket and press delete 9 | ;; until the text is `(let [a] a)`. Then highlight the select the closing square 10 | ;; bracket and press delete. Structural editing and rainbow parens is now broken. 11 | 12 | (let [a "123"] a) 13 | 14 | 15 | ;; This reproduces it for me (PEZ) 16 | ;; Delete the closing square bracket 17 | ;; With the cursor behind `[a` do **Paredit Barf Forward** 18 | ;; BOOM 19 | 20 | (let [a] a) 21 | 22 | -------------------------------------------------------------------------------- /test-data/test-files/cljfmt-sabndbox.clj: -------------------------------------------------------------------------------- 1 | [:/ 2 | [:a "iuna"] 3 | [:b "urina"]] 4 | 5 | (def foo 6 | (let [a b 7 | aa bb 8 | ccc {:a b :aa bb :ccc ccc}])) 9 | 10 | (tabular 0 11 | (foo 12 | (bar 13 | 0))) 14 | 15 | (f 16 | ##Inf) 17 | 18 | (let [[time id] (->> (range init-time ##Inf) 19 | (some time-id-now))] 20 | (println (* (- time init-time) id))) 21 | 22 | (let [start 0 23 | [max-i max-id] (apply max-key second ids) 24 | offset (+ max-i (rem start max-id))] 25 | (->> 26 | (range (- start offset) max-id) 27 | (filter all-ordered?) 28 | (first) 29 | (println))) 30 | 31 | (let {^String x "foo" 32 | some-longer-var "bar"}) 33 | 34 | (comment) 35 | 36 | -------------------------------------------------------------------------------- /test-data/test-files/comment_continuation.clj: -------------------------------------------------------------------------------- 1 | (ns user) 2 | 3 | (comment 4 | (defn all-is-not-lost [] 5 | (let [dividend (->> [1 2 3] 6 | (map inc) 7 | (apply *) 8 | ;; foo 9 | (+ 3)) 10 | divisor 42] 11 | (/ dividend divisor))) 12 | (all-is-not-lost)) -------------------------------------------------------------------------------- /test-data/test-files/debugger_metadata.clj: -------------------------------------------------------------------------------- 1 | (ns debugger-metadata) 2 | 3 | #dbg 4 | (defn test-metadata-symbol 5 | [x] 6 | (let [y x] 7 | ^{:hello "world"} 8 | (+ x ^{:inner "meta"} (+ 1 y)))) 9 | 10 | (defn test-metadata-symbol2 11 | [x] 12 | (let [y x] 13 | ^{:hello "world"} 14 | (+ x ^{:inner "meta"} (+ 1 #break y)))) 15 | 16 | (comment 17 | (test-metadata-symbol 42) 18 | (test-metadata-symbol2 42)) -------------------------------------------------------------------------------- /test-data/test-files/hiccup.clj: -------------------------------------------------------------------------------- 1 | (defonce Stack (rnn-stack/createNativeStackNavigator)) 2 | 3 | (r/with-let [counter (rf/subscribe [:get-counter]) 4 | tap-enabled? (rf/subscribe [:counter-tappable?]) 5 | remaining-time (rf/subscribe [:timer/remaining-time])] 6 | [:> rn/View {:style {:flex 1 7 | :padding-vertical 50 8 | :justify-content :space-between 9 | :align-items :center 10 | :background-color :white}}]) 11 | -------------------------------------------------------------------------------- /test-data/test-files/indent.clj: -------------------------------------------------------------------------------- 1 | ;; https://github.com/BetterThanTomorrow/calva/issues/1622 2 | 3 | ;; Misbehaves in the indenter 4 | (let [context|]) 5 | 6 | ;; Behaves in the indenter 7 | (let [contexs|]) 8 | 9 | ;; (Both behave in the formatter) 10 | 11 | ;; Probably because `context` has default indents `[[:inner 0]]` 12 | 13 | ;; `[[:inner 0]]` 14 | [fn|] 15 | 16 | ;; `[[:block 0]]` 17 | [do|] 18 | 19 | ;; `[[:block 1]]` 20 | [let|] 21 | 22 | ;; `[[:inner 0]]` 23 | [foo|] 24 | 25 | ;; Also goes for maps and sets 26 | 27 | {fn|} 28 | 29 | #{fn|} -------------------------------------------------------------------------------- /test-data/test-files/indenter-cases.clj: -------------------------------------------------------------------------------- 1 | #_:clj-kondo/ignore 2 | (ns foo 3 | {:clj-kondo/config '{:linters {:unresolved-symbol {:level :off} 4 | :unused-bindings {:level :off}}}}) 5 | 6 | ; Should indent like `(def ...` 7 | (foo/defbars body 8 | [:body {}]) 9 | 10 | ; Should not indent like `(def ...` 11 | 12 | (foo/ddefbars body 13 | [:body {}]) 14 | 15 | 16 | ; Should indent like `(let ...` 17 | (clojure.core/let [x :x] 18 | x) 19 | 20 | ; Should not indent like `(let ...` 21 | (clojure.core-let [x :x] 22 | x) 23 | 24 | ; Should indent using `[[:inner 0]]` 25 | ; Assuming a custom `cljfmt.edn` is used and it has: 26 | ; `{:indents {inner-0-form [[:inner 0]]}}` 27 | (foo/inner-0-form :a 28 | ss 29 | :foo) 30 | 31 | ; Should not indent using `[[:inner 0]]` 32 | (foo-inner-0-form :a 33 | ss 34 | :foo) 35 | 36 | ; Should indent like 37 | (deftype MyType [arg1 arg2] 38 | IMyProto 39 | (method1 [this] |(print "hello"))) 40 | -------------------------------------------------------------------------------- /test-data/test-files/indenter_vs_formatter.clj: -------------------------------------------------------------------------------- 1 | ;; indent :a by putting the cursor in front and hit enter, then hit tab 2 | 3 | (doseq [x xs] :a) 4 | 5 | ;; do the same here 6 | (for [x xs] :a) 7 | -------------------------------------------------------------------------------- /test-data/test-files/issue_2270_quote.clj: -------------------------------------------------------------------------------- 1 | "a 2 | a 3 | " -------------------------------------------------------------------------------- /test-data/test-files/javascript-code.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | import * as foo from 'foo'; 4 | 5 | var MongoClient = require('mongodb').MongoClient; 6 | var url = 'mongodb://localhost:27017/mydb'; 7 | 8 | MongoClient.connect(url, function (err, db) { 9 | if (err) throw err; 10 | console.log('Database created!'); 11 | db.close(); 12 | }); 13 | -------------------------------------------------------------------------------- /test-data/test-files/metadata_toplevel_select_issue.clj: -------------------------------------------------------------------------------- 1 | (a ^{} b) 2 | c 3 | -------------------------------------------------------------------------------- /test-data/test-files/nom.clj: -------------------------------------------------------------------------------- 1 | (ns nom 2 | (:gen-class)) 3 | 4 | failure-expected-here-dont-freak-out 5 | 6 | This noming squirrel will cause compilation of this file to fail. 7 | 8 | ,;;:;, 9 | ;;;;; 10 | ,:;;:; ,'=. 11 | ;:;:;' .=" ,'_\ 12 | ':;:;,/ ,__:=@ 13 | ';;:; =./)_ 14 | `"=\_ )_"` 15 | ``'" -------------------------------------------------------------------------------- /test-data/test-files/ns_form.cljc: -------------------------------------------------------------------------------- 1 | (ns ^:a ns-form) 2 | (def a) -------------------------------------------------------------------------------- /test-data/test-files/one_line.clj: -------------------------------------------------------------------------------- 1 | foo bar -------------------------------------------------------------------------------- /test-data/test-files/paste-formatted.clj: -------------------------------------------------------------------------------- 1 | (fn a [] 2 | (b c 3 | d) 4 | (b c 5 | d 6 | (e f 7 | (g h 8 | i)))) 9 | 10 | (fn j [] 11 | k) 12 | -------------------------------------------------------------------------------- /test-data/test-files/select.clj: -------------------------------------------------------------------------------- 1 | (comment 2 | @(rf/subscribe [:foo])) 3 | 4 | #aa aaa bbb 5 | 6 | ^aa aaa bbb 7 | 8 | ^:aa aaa bbb 9 | 10 | ^:a #a a b 11 | 12 | b aaa bbb ^{:aa aa} 13 | 14 | #a ^:a a 15 | 16 | a 17 | 18 | ^{:aa aa} #aa aaa bbb 19 | 20 | bbb 21 | #aa (def foo 22 | bar) 23 | 24 | ^aa (def foo 25 | bar) 26 | bbb 27 | 28 | ^:aa (def foo 29 | bar) 30 | bbb 31 | 32 | ^{:aa aa} (def foo 33 | bar) 34 | bbb 35 | 36 | ^{:aa aa} #aa (def foo 37 | bar) 38 | bbb 39 | 40 | #aa ^{:aa aa} (def foo 41 | bar) 42 | bbb 43 | 44 | #a #b a 45 | 46 | #_(def foo 47 | bar) 48 | 49 | (defn test-reader [_ form] 50 | {:meta (meta form) 51 | :form form}) 52 | 53 | (set! *default-data-reader-fn* test-reader) 54 | 55 | 56 | 57 | (c 58 | #f 59 | (#b 60 | [:f :b :z]) 61 | #x 62 | #y 63 | 1) 64 | 65 | 66 | 67 | ^{:a b} 68 | #c 69 | ^d 70 | "foo" 71 | 72 | 73 | () 74 | 75 | 76 | 77 | #{a b} -------------------------------------------------------------------------------- /test-data/test-files/test.sh: -------------------------------------------------------------------------------- 1 | { :keys [{1 2 ")" 3}] } -------------------------------------------------------------------------------- /test-data/test-files/test2.clj: -------------------------------------------------------------------------------- 1 | (a(b 2 | (c 3 | #f 4 | (#b 5 | [:f :b :z]) 6 | #z 7 | 1))) 8 | (comment 9 | 1 10 | #foo 11 | #bar 12 | #baz 13 | #{:foo (#foo '[1 2 3])}) 14 | 15 | (comment 16 | 17 | #foo :bar 18 | (foo #foo ('foo^' :bar)) 19 | #_ 'abc 20 | #foo @~#(foo :bar) \space 21 | \' {:foo (#foo '[1 2 3])} 'abc 22 | #_#_ 23 | #foo 24 | #bar 25 | #baz 26 | #{:foo (#foo '[1 2 3])} 27 | #foo 28 | 'bar 29 | \a [] "a" 30 | 31 | ) 32 | 33 | "#########" ; 34 | -------------------------------------------------------------------------------- /test-data/test-files/test3.clj: -------------------------------------------------------------------------------- 1 | (let [#_#_x (get c :x "x") 2 | y (get c :y "y") 3 | #_#_z (get c :z "z") 4 | å {:ä :ö}] 5 | (str y å #_#_x z)) -------------------------------------------------------------------------------- /test-data/test-files/top_level.clj: -------------------------------------------------------------------------------- 1 | (ns top-level 2 | (:gen-class)) 3 | 4 | (defn -main 5 | "I don't do a whole lot ... yet." 6 | {:rfc (comment 7 | (bar :baz) 8 | 9 | (foo [] 10 | bar 11 | ))} 12 | [& _args] 13 | (println "Hello, World!")) 14 | 15 | (comment 16 | (-main) 17 | 18 | (foo [] 19 | bar 20 | )) 21 | 22 | (hej 23 | (bar :baz) 24 | 25 | (foo [] 26 | bar 27 | )) 28 | 29 | (foo []) (bar :baz) 30 | 31 | (foo [] 32 | bar) -------------------------------------------------------------------------------- /test-data/test-files/unbalance.clj: -------------------------------------------------------------------------------- 1 | (ns unbalance) 2 | 3 | (def foo)) 4 | 5 | :foo 6 | -------------------------------------------------------------------------------- /test-data/workspaces/ws-a/a.cljs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/test-data/workspaces/ws-a/a.cljs -------------------------------------------------------------------------------- /test-data/workspaces/ws-a/deps.edn: -------------------------------------------------------------------------------- 1 | {:paths ["."]} -------------------------------------------------------------------------------- /test-data/workspaces/ws-b/b.cljs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/test-data/workspaces/ws-b/b.cljs -------------------------------------------------------------------------------- /test-data/workspaces/ws-b/pirate-lang/deps.edn: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-data/workspaces/ws-sub-projs/proj1/deps.edn: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-data/workspaces/ws-sub-projs/proj2/deps.edn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BetterThanTomorrow/calva/9e8f5c1a03ba201e6cb7ae9d19c6c9390cdd80ce/test-data/workspaces/ws-sub-projs/proj2/deps.edn -------------------------------------------------------------------------------- /tsconfig.eslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": [".eslintrc.js", "**/*.js", "**/*.ts"], 4 | "exclude": ["node_modules"] 5 | } 6 | --------------------------------------------------------------------------------