;; -*- comment-column: 80; -*-
{:deps
 ;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 ;; !!                                   PLEASE KEEP THESE ORGANIZED ALPHABETICALLY                                  !!
 ;; !!                                   AND ADD A COMMENT EXPLAINING THEIR PURPOSE                                  !!
 ;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 {amalloy/ring-buffer                       {:mvn/version "1.3.1"               ; fixed length queue implementation, used in log buffering
                                             :exclusions  [org.clojure/clojure
                                                           org.clojure/clojurescript]}
  amalloy/ring-gzip-middleware              {:mvn/version "0.1.4"}              ; Ring middleware to GZIP responses if client can handle it
  bigml/histogram                           {:mvn/version "4.1.4"}              ; Histogram data structure
  buddy/buddy-core                          {:mvn/version "1.10.413"            ; various cryptographic functions
                                             :exclusions  [commons-codec/commons-codec
                                                           org.bouncycastle/bcpkix-jdk15on
                                                           org.bouncycastle/bcprov-jdk15on]}
  buddy/buddy-sign                          {:mvn/version "3.4.333"}            ; JSON Web Tokens; High-Level message signing library
  camel-snake-kebab/camel-snake-kebab       {:mvn/version "0.4.3"}              ; util functions for converting between camel, snake, and kebob case
  cheshire/cheshire                         {:mvn/version "5.11.0"}             ; fast JSON encoding (used by Ring JSON middleware)
  clj-commons/iapetos                       {:mvn/version "0.1.13"}             ; prometheus metrics
  clj-http/clj-http                         {:mvn/version "3.12.3"              ; HTTP client
                                             :exclusions  [commons-codec/commons-codec
                                                           commons-io/commons-io
                                                           slingshot/slingshot]}
  clojure.java-time/clojure.java-time       {:mvn/version "1.1.0"}              ; java.time utilities
  clojurewerkz/quartzite                    {:mvn/version "2.1.0"               ; scheduling library
                                             :exclusions  [c3p0/c3p0
                                                           org.quartz-scheduler/quartz]}
  colorize/colorize                         {:mvn/version "0.1.1"               ; string output with ANSI color codes (for logging)
                                             :exclusions  [org.clojure/clojure]}
  com.clearspring.analytics/stream          {:mvn/version "2.9.8"               ; Various sketching algorithms
                                             :exclusions  [it.unimi.dsi/fastutil
                                                           org.slf4j/slf4j-api]}
  com.draines/postal                        {:mvn/version "2.0.5"}              ; SMTP library
  com.github.seancorfield/honeysql          {:mvn/version "2.4.962"}            ; Honey SQL 2. SQL generation from Clojure data maps
  com.github.vertical-blank/sql-formatter   {:mvn/version "2.0.3"}              ; Java SQL formatting library https://github.com/vertical-blank/sql-formatter
  com.google.guava/guava                    {:mvn/version "31.1-jre"}           ; dep for BigQuery, Spark, and GA. Require here rather than letting different dep versions stomp on each other — see comments on #9697
  com.fasterxml.jackson.core/jackson-databind
                                            {:mvn/version "2.14.1"}             ; JSON processor used by snowplow-java-tracker
  com.fasterxml.woodstox/woodstox-core      {:mvn/version "6.4.0"}              ; trans dep of commons-codec (pinned version due to CVE-2022-40151)
  com.h2database/h2                         {:mvn/version "2.1.212"}            ; embedded SQL database
  com.gfredericks/test.chuck                {:mvn/version "0.2.13"}             ; generating strings from regex
  com.snowplowanalytics/snowplow-java-tracker
                                            {:mvn/version "0.12.0"              ; Snowplow analytics
                                             :exclusions [com.fasterxml.jackson.core/jackson-databind]}
  com.taoensso/nippy                        {:mvn/version "3.2.0"}              ; Fast serialization (i.e., GZIP) library for Clojure
  com.vladsch.flexmark/flexmark             {:mvn/version "0.64.0"}             ; Markdown parsing
  com.vladsch.flexmark/flexmark-ext-autolink
                                            {:mvn/version "0.64.0"}             ; Flexmark extension for auto-linking bare URLs
  commons-codec/commons-codec               {:mvn/version "1.15"}               ; Apache Commons -- useful codec util fns
  commons-io/commons-io                     {:mvn/version "2.11.0"}             ; Apache Commons -- useful IO util fns
  commons-net/commons-net                   {:mvn/version "3.9.0"}              ; Apache Commons -- useful network utils. Transitive dep of Snowplow, pinned due to CVE-2021-37533
  commons-validator/commons-validator       {:mvn/version "1.7"                 ; Apache Commons -- useful validation util fns
                                             :exclusions  [commons-beanutils/commons-beanutils
                                                           commons-digester/commons-digester
                                                           commons-logging/commons-logging]}
  compojure/compojure                       {:mvn/version "1.7.0"               ; HTTP Routing library built on Ring
                                             :exclusions  [ring/ring-codec]}
  crypto-random/crypto-random               {:mvn/version "1.2.1"}              ; library for generating cryptographically secure random bytes and strings
  dk.ative/docjure                          {:mvn/version "1.19.0"              ; excel export
                                             :exclusions  [org.apache.poi/poi
                                                           org.apache.poi/poi-ooxml]}
  environ/environ                           {:mvn/version "1.2.0"}              ; env vars/Java properties abstraction
  hiccup/hiccup                             {:mvn/version "1.0.5"}              ; HTML templating
  honeysql/honeysql                         {:mvn/version "1.0.461"             ; Transform Clojure data structures to SQL
                                             :exclusions  [org.clojure/clojurescript]}
  info.sunng/ring-jetty9-adapter            {:mvn/version "0.18.3"}             ; Drop-in replacement for official Ring Jetty adapter. Supports Jetty 11 webserver.
  instaparse/instaparse                     {:mvn/version "1.4.12"}             ; Make your own parser
  io.forward/yaml                           {:mvn/version "1.0.11"              ; Clojure wrapper for YAML library SnakeYAML. Don't upgrade yet, new version doesn't support Java 8 (see https://github.com/owainlewis/yaml/issues/37)
                                             :exclusions  [org.clojure/clojure
                                                           org.flatland/ordered
                                                           org.yaml/snakeyaml]}
  io.github.camsaul/toucan2                 {:mvn/version "1.0.519"}
  io.github.camsaul/toucan2-toucan1         {:mvn/version "1.0.519"}
  io.github.resilience4j/resilience4j-retry {:mvn/version "1.7.1"}              ; Support for retrying operations
  io.prometheus/simpleclient_hotspot        {:mvn/version "0.16.0"}             ; prometheus jvm collector
  io.prometheus/simpleclient_jetty          {:mvn/version "0.16.0"}             ; prometheus jetty collector
  joda-time/joda-time                       {:mvn/version "2.12.2"}
  kixi/stats                                {:mvn/version "0.4.4"               ; Various statistic measures implemented as transducers
                                             :exclusions  [org.clojure/data.avl]}
  medley/medley                             {:mvn/version "1.4.0"}              ; lightweight lib of useful functions
  metabase/connection-pool                  {:mvn/version "1.2.0"}              ; simple wrapper around C3P0. JDBC connection pools
  metabase/saml20-clj                       {:mvn/version "2.1.0"}              ; EE SAML integration
  metabase/throttle                         {:mvn/version "1.0.2"}              ; Tools for throttling access to API endpoints and other code pathways
  metosin/malli                             {:mvn/version "0.10.0"}              ; Data-driven Schemas for Clojure/Script and babashka
  nano-id/nano-id                           {:mvn/version "1.0.0"}              ; NanoID generator for generating entity_ids
  net.cgrand/macrovich                      {:mvn/version "0.2.1"}              ; utils for writing macros for both Clojure & ClojureScript
  net.i2p.crypto/eddsa                      {:mvn/version "0.3.0"}              ; ED25519 key support (optional dependency for org.apache.sshd/sshd-core)
  net.redhogs.cronparser/cron-parser-core   {:mvn/version "3.5"                 ; describe Cron schedule in human-readable language
                                             :exclusions  [joda-time/joda-time  ; exclude joda time 2.3 which has outdated timezone information
                                                           org.slf4j/slf4j-api]}
  net.sf.cssbox/cssbox                      {:mvn/version "5.0.0"               ; HTML / CSS rendering
                                             :exclusions  [org.slf4j/slf4j-api]}
  net.thisptr/jackson-jq                    {:mvn/version "1.0.0-preview.20220705"} ; Java implementation of the JQ json query language
  org.apache.commons/commons-compress       {:mvn/version "1.22"}               ; compression utils
  org.apache.commons/commons-lang3          {:mvn/version "3.12.0"}             ; helper methods for working with java.lang stuff
  org.apache.logging.log4j/log4j-1.2-api    {:mvn/version "2.19.0"}             ; apache logging framework
  org.apache.logging.log4j/log4j-api        {:mvn/version "2.19.0"}             ; add compatibility with log4j 1.2
  org.apache.logging.log4j/log4j-core       {:mvn/version "2.19.0"}             ; apache logging framework
  org.apache.logging.log4j/log4j-jcl        {:mvn/version "2.19.0"}             ; allows the commons-logging API to work with log4j 2
  org.apache.logging.log4j/log4j-jul        {:mvn/version "2.19.0"}             ; java.util.logging (JUL) -> Log4j2 adapter
  org.apache.logging.log4j/log4j-slf4j-impl {:mvn/version "2.19.0"}             ; allows the slf4j API to work with log4j 2
  org.apache.poi/poi                        {:mvn/version "5.2.3"}              ; Work with Office documents (e.g. Excel spreadsheets) -- newer version than one specified by Docjure
  org.apache.poi/poi-ooxml                  {:mvn/version "5.2.3"
                                             :exclusions  [org.bouncycastle/bcpkix-jdk15on
                                                           org.bouncycastle/bcprov-jdk15on]}
  org.apache.sshd/sshd-core                 {:mvn/version "2.9.2"}              ; ssh tunneling and test server
  org.apache.xmlgraphics/batik-all          {:mvn/version "1.16"}               ; SVG -> image
  org.clojars.pntblnk/clj-ldap              {:mvn/version "0.0.17"}             ; LDAP client
  org.bouncycastle/bcpkix-jdk15on           {:mvn/version "1.70"}               ; Bouncy Castle crypto library -- explicit version of BC specified to resolve illegal reflective access errors
  org.bouncycastle/bcprov-jdk15on           {:mvn/version "1.70"}
  org.clojure/clojure                       {:mvn/version "1.11.1"}
  org.clojure/core.async                    {:mvn/version "1.6.673"
                                             :exclusions  [org.clojure/tools.reader]}
  org.clojure/core.logic                    {:mvn/version "1.0.1"}              ; optimized pattern matching library for Clojure
  org.clojure/core.match                    {:mvn/version "1.0.0"}
  org.clojure/core.memoize                  {:mvn/version "1.0.257"}            ; useful FIFO, LRU, etc. caching mechanisms
  org.clojure/data.csv                      {:mvn/version "1.0.1"}              ; CSV parsing / generation
  org.clojure/data.xml                      {:mvn/version "0.0.8"}              ; XML parsing / generation
  org.clojure/java.classpath                {:mvn/version "1.0.0"}              ; examine the Java classpath from Clojure programs
  org.clojure/java.jdbc                     {:mvn/version "0.7.12"}             ; basic JDBC access from Clojure
  org.clojure/java.jmx                      {:mvn/version "1.0.0"}              ; JMX bean library, for exporting diagnostic info
  org.clojure/math.combinatorics            {:mvn/version "0.1.6"}              ; combinatorics functions
  org.clojure/math.numeric-tower            {:mvn/version "0.0.5"}              ; math functions like `ceil`
  org.clojure/tools.logging                 {:mvn/version "1.2.4"}              ; logging framework
  org.clojure/tools.macro                   {:mvn/version "0.1.5"}              ; local macros
  org.clojure/tools.namespace               {:mvn/version "1.3.0"}
  org.clojure/tools.reader                  {:mvn/version "1.3.6"}
  org.clojure/tools.trace                   {:mvn/version "0.7.11"}             ; function tracing
  org.eclipse.jetty/jetty-server            {:mvn/version "11.0.13"}            ; web server
  org.flatland/ordered                      {:mvn/version "1.15.10"}            ; ordered maps & sets
  org.graalvm.js/js                         {:mvn/version "22.3.0"}             ; JavaScript engine
  org.liquibase/liquibase-core              {:mvn/version "4.11.0"              ; migration management (Java lib)
                                             :exclusions  [ch.qos.logback/logback-classic]}
  org.mariadb.jdbc/mariadb-java-client      {:mvn/version "2.7.6"}              ; MySQL/MariaDB driver
  org.mindrot/jbcrypt                       {:mvn/version "0.4"}                ; Crypto library
  org.postgresql/postgresql                 {:mvn/version "42.5.1"}             ; Postgres driver
  org.quartz-scheduler/quartz               {:mvn/version "2.3.2"}              ; Quartz job scheduler, provided by quartzite but this is a newer version.
  org.slf4j/slf4j-api                       {:mvn/version "1.7.36"}             ; abstraction for logging frameworks -- allows end user to plug in desired logging framework at deployment time
  org.tcrawley/dynapath                     {:mvn/version "1.1.0"}              ; Dynamically add Jars (e.g. Oracle or Vertica) to classpath
  org.threeten/threeten-extra               {:mvn/version "1.7.2"}              ; extra Java 8 java.time classes like DayOfMonth and Quarter
  org.yaml/snakeyaml                        {:mvn/version "1.33"}               ; YAML parser
  potemkin/potemkin                         {:mvn/version "0.4.6"               ; utility macros & fns
                                             :exclusions  [riddley/riddley]}
  pretty/pretty                             {:mvn/version "1.0.5"}              ; protocol for defining how custom types should be pretty printed
  prismatic/schema                          {:mvn/version "1.4.1"}              ; Data schema declaration and validation library
  redux/redux                               {:mvn/version "0.1.4"}              ; Utility functions for building and composing transducers
  riddley/riddley                           {:mvn/version "0.2.0"}              ; code walking lib -- used interally by Potemkin, manifold, etc.
  ring/ring-core                            {:mvn/version "1.9.6"}              ; web server (Jetty wrapper)
  ring/ring-json                            {:mvn/version "0.5.1"}              ; Ring middleware for reading/writing JSON automatically
  slingshot/slingshot                       {:mvn/version "0.12.2"}             ; enhanced throw/catch, used by other deps
  stencil/stencil                           {:mvn/version "0.5.0"}              ; Mustache templates for Clojure
  user-agent/user-agent                     {:mvn/version "0.1.0"}              ; User-Agent string parser, for Login History page & elsewhere
  weavejester/dependency                    {:mvn/version "0.2.1"}}             ; Dependency graphs and topological sorting

 ;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 ;; !!         PLEASE KEEP NEW DEPENDENCIES ABOVE ALPHABETICALLY ORGANIZED AND ADD COMMENTS EXPLAINING THEM.         !!
 ;; !!                            *PLEASE DO NOT* ADD NEW ONES TO THE BOTTOM OF THE LIST.                            !!
 ;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


 :paths
 ["src" "shared/src" "resources"]

 ;; These are needed for the Athena and Redshift drivers if you are developing against them locally. If those drivers'
 ;; dependencies are not included (i.e., if we don't have the `:drivers` profile), these repos are effectively
 ;; ignored.
 ;;
 ;; 1. Maven repos from subprojects do not get copied over -- see
 ;; https://ask.clojure.org/index.php/10726/deps-manifest-dependencies-respect-repos-dependent-project
 ;;
 ;; 2. You cannot include `:mvn/repos` inside of an alias -- see
 ;; https://ask.clojure.org/index.php/12367/support-mvn-repos-inside-an-alias -- if we could, this could go in the
 ;; `:drivers` alias instead.
 :mvn/repos
 {"athena"   {:url "https://s3.amazonaws.com/maven-athena"}
  "redshift" {:url "https://s3.amazonaws.com/redshift-maven-repository/release"}
  ;; for metabase/saml20-clj
  "opensaml" {:url "https://build.shibboleth.net/nexus/content/repositories/releases/"}}

 :aliases
 {
;;; Local Dev & test profiles

  ;; for local development: start a REPL with
  ;;
  ;;    clojure -A:dev (basic dev REPL that includes test namespaces)
  ;;    clojure -A:dev:drivers:drivers-dev (dev REPL w/ drivers + tests)
  ;;    clojure -A:dev:ee:ee-dev (dev REPL w/ EE code including tests)
  ;;
  ;; You can start a web server from this REPL with
  ;;
  ;;    (require 'dev)
  ;;    (dev/start!)
  :dev
  {:extra-deps
   {clj-http-fake/clj-http-fake  {:mvn/version "1.0.3"
                                  :exclusions  [slingshot/slingshot]}
    clj-kondo/clj-kondo          {:mvn/version "2023.01.16"}                ; this is not for RUNNING kondo, but so we can hack on custom hooks code from the REPL.
    cloverage/cloverage          {:mvn/version "1.2.4"}
    com.gfredericks/test.chuck   {:mvn/version "0.2.13"}                    ; generating strings from regexes (useful with malli)
    djblue/portal                {:mvn/version "0.35.0"}                    ; ui for inspecting values
    io.github.camsaul/humane-are {:mvn/version "1.0.2"}
    io.github.metabase/hawk      {:sha "45ed36008014f9ac1ea66beb56fb1c4c39f8342b"}
    jonase/eastwood              {:mvn/version "1.3.0"}                     ; inspects namespaces and reports possible problems using tools.analyzer
    lambdaisland/deep-diff2      {:mvn/version "2.7.169"}                   ; way better diffs
    methodical/methodical        {:mvn/version "0.15.1"}                    ; drop-in replacements for Clojure multimethods and adds several advanced features
    org.clojure/algo.generic     {:mvn/version "0.1.3"}
    pjstadig/humane-test-output  {:mvn/version "0.11.0"}
    reifyhealth/specmonstah      {:mvn/version "2.1.0"
                                  :exclusions  [org.clojure/clojure
                                                org.clojure/clojurescript]} ; lets you write test fixtures that are clear, concise, and easy to maintain (clojure.spec)
    ring/ring-mock               {:mvn/version "0.4.0"}                     ; creating Ring request maps for testing purposes
    talltale/talltale            {:mvn/version "0.5.13"}}                   ; generates fake data, useful for prototyping or load testing

   :extra-paths ["dev/src" "local/src" "test" "shared/test" "test_resources"]
   :jvm-opts    ["-Dmb.run.mode=dev"
                 "-Dmb.field.filter.operators.enabled=true"
                 "-Dmb.test.env.setting=ABCDEFG"
                 "-Duser.timezone=UTC"
                 "-Dfile.encoding=UTF-8"
                 "-Duser.language=en"
                 "-Duser.country=US"
                 ;; set the logging properties set in metabase.bootstrap. calling (dev) will load it but putting here to be sure
                 "-Dlog4j2.contextSelector=org.apache.logging.log4j.core.selector.BasicContextSelector"
                 "-Dclojure.tools.logging.factory=clojure.tools.logging.impl/log4j2-factory"
                 ;; If Clojure fails to start (e.g. because of a compilation error somewhere) print the error
                 ;; report/stacktrace to stderr rather than to a random EDN file in /tmp/
                 "-Dclojure.main.report=stderr"
                 ;; Exceptions that get thrown repeatedly are created without stacktraces as a performance
                 ;; optimization in newer Java versions. This makes debugging pretty hard when working on stuff
                 ;; locally -- prefer debuggability over performance for local dev work.
                 "-XX:-OmitStackTraceInFastThrow"
                 ;; prevent Java icon from randomly popping up in macOS dock
                 "-Djava.awt.headless=true"
                 ;; ignore options that aren't present in older versions of Java, like the one below:
                 "-XX:+IgnoreUnrecognizedVMOptions"
                 ;; include more details for debugging NPEs (Java 14+)
                 "-XX:+ShowCodeDetailsInExceptionMessages"]}

  ;; includes test code as source paths. Run tests with clojure -X:dev:test
  :test
  {:extra-paths ["test_config"]
   :exec-fn     metabase.test-runner/find-and-run-tests-cli
   :jvm-opts    ["-Dmb.run.mode=test"
                 "-Dmb.db.in.memory=true"
                 "-Dmb.jetty.join=false"
                 "-Dmb.field.filter.operators.enabled=true"
                 "-Dmb.api.key=test-api-key"
                 ;; Different port from normal `:dev` so you can run tests on a different server.
                 ;; TODO -- figure out how to do a random port like in the old project.clj?
                 "-Dmb.jetty.port=3001"]}

  ;; run the dev server with
  ;; clojure -M:run
  ;; clojure -M:run:drivers (include all drivers)
  ;; clojure -M:run:ee (include EE code)
  :run
  {:main-opts ["-m" "metabase.bootstrap"]
   :jvm-opts  ["-Dmb.run.mode=dev"
               "-Djava.awt.headless=true"                   ; prevent Java icon from randomly popping up in macOS dock
               "-Dmb.jetty.port=3000"]}

  ;; alias for CI-specific options.
  :ci
  {:jvm-opts ["-Xmx2g"
              ;; normally CircleCI sets `CI` as an env var, so this is mostly to replicate that locally. Hawk will not
              ;; print the progress bar in output when this is set. Progress bars aren't very CI friendly
              "-Dci=TRUE"]}

  ;; include EE source code.
  :ee
  {:extra-paths ["enterprise/backend/src"]}

  ;; Include EE tests.
  ;; for ee dev: :dev:ee:ee-dev
  ;; for ee tests: clojure -X:dev:ee:ee-dev:test
  :ee-dev
  {:extra-paths ["enterprise/backend/test"]}

  ;; these aliases exist for symmetry with the ee aliases. Empty for now.
  :oss
  {}

  :oss-dev
  {}

  :cljs
  {:extra-paths ["test" "shared/test"]
   :extra-deps
   {binaryage/devtools                 {:mvn/version "1.0.6"}
    cider/cider-nrepl                  {:mvn/version "0.30.0"}
    cider/piggieback                   {:mvn/version "0.5.3"}
    cljs-bean/cljs-bean                {:mvn/version "1.9.0"}
    com.lambdaisland/glogi             {:mvn/version "1.2.164"}
    io.github.metabase/hawk            {:sha "45ed36008014f9ac1ea66beb56fb1c4c39f8342b"}
    ;; Forcibly targeting a newer release than ships by default with shadow-cljs 2.20.20.
    ;; It fixes an issue where TypeScript can't parse the `cljs_env.js` output file.
    org.clojure/google-closure-library {:mvn/version "0.0-20230227-c7c0a541"}
    refactor-nrepl/refactor-nrepl      {:mvn/version "3.6.0"}
    thheller/shadow-cljs               {:mvn/version "2.20.20"}}}

  ;; for local dev -- include the drivers locally with :dev:drivers
  :drivers
  {:extra-deps
   {metabase/driver-modules {:local/root "modules/drivers"}}}

  ;; for local dev: include drivers as well as their tests.
  ;;
  ;;    clojure -X:dev:drivers:drivers-dev:test
  ;;
  ;; or
  ;;
  ;;    clojure -X:dev:ee:ee-dev:drivers:drivers-dev:test (for EE)
  :drivers-dev
  {:extra-paths
   ["modules/drivers/athena/test"
    "modules/drivers/bigquery-cloud-sdk/test"
    "modules/drivers/druid/test"
    "modules/drivers/googleanalytics/test"
    "modules/drivers/mongo/test"
    "modules/drivers/oracle/test"
    "modules/drivers/presto-jdbc/test"
    "modules/drivers/redshift/test"
    "modules/drivers/snowflake/test"
    "modules/drivers/sparksql/test"
    "modules/drivers/sqlite/test"
    "modules/drivers/sqlserver/test"
    "modules/drivers/vertica/test"]}

;;; Linters

  ;; clojure -M:ee:drivers:check
  ;;
  ;; checks that all the namespaces we actually ship can be compiled, without any dependencies that we don't
  ;; ship (such as `:dev` dependencies). See #27009 for more context.
  :check
  {:extra-deps {athos/clj-check {:git/url "https://github.com/athos/clj-check.git"
                                 :sha     "518d5a1cbfcd7c952f548e6dbfcb9a4a5faf9062"}}
   :main-opts  ["-m" "clj-check.check"
                "src"
                "shared/src"
                "enterprise/backend/src"
                "modules/drivers/athena/src"
                "modules/drivers/bigquery-cloud-sdk/src"
                "modules/drivers/druid/src"
                "modules/drivers/googleanalytics/src"
                "modules/drivers/mongo/src"
                "modules/drivers/oracle/src"
                "modules/drivers/presto-jdbc/src"
                "modules/drivers/redshift/src"
                "modules/drivers/snowflake/src"
                "modules/drivers/sparksql/src"
                "modules/drivers/sqlite/src"
                "modules/drivers/sqlserver/src"
                "modules/drivers/vertica/src"]
   :jvm-opts   ["-Dclojure.main.report=stderr"]}

  ;; clojure -X:dev:ee:ee-dev:drivers:drivers-dev:test:eastwood
  :eastwood
  {:exec-fn   metabase.linters.eastwood/eastwood
   :exec-args {;; manually specify the source paths for the time being (exclude test paths) until we fix Eastwood
               ;; errors in the test paths (once PR #17193 is merged)
               :source-paths    ["src"
                                 "shared/src"
                                 "enterprise/backend/src"
                                 "modules/drivers/athena/src"
                                 "modules/drivers/bigquery-cloud-sdk/src"
                                 "modules/drivers/druid/src"
                                 "modules/drivers/googleanalytics/src"
                                 "modules/drivers/mongo/src"
                                 "modules/drivers/oracle/src"
                                 "modules/drivers/presto-jdbc/src"
                                 "modules/drivers/redshift/src"
                                 "modules/drivers/snowflake/src"
                                 "modules/drivers/sparksql/src"
                                 "modules/drivers/sqlite/src"
                                 "modules/drivers/sqlserver/src"
                                 "modules/drivers/vertica/src"]
               :exclude-linters [ ;; Turn this off temporarily until we finish removing
                                 ;; self-deprecated functions & macros
                                 :deprecations
                                 ;; this has a fit in libs that use Potemkin `import-vars` such
                                 ;; as `java-time`
                                 :implicit-dependencies
                                 ;; too many false positives for now
                                 :unused-ret-vals
                                 ;; Kondo lints this for us anyway, and this isn't as easy to configure.
                                 :wrong-arity]}}

  ;; clojure -T:whitespace-linter
  :whitespace-linter
  {:deps       {com.github.camsaul/whitespace-linter {:sha "e35bc252ccf5cc74f7d543ef95ad8a3e5131f25b"}}
   :ns-default whitespace-linter
   :exec-fn    whitespace-linter/lint
   :exec-args  {:paths            ["./.dir-locals.el"
                                   "./deps.edn"
                                   "./package.json"
                                   "./shadow-cljs.edn"
                                   ".circleci"
                                   ".clj-kondo"
                                   ".github"
                                   "bin"
                                   "enterprise"
                                   "frontend"
                                   "resources"
                                   "shared"
                                   "src"
                                   "test"]
                :include-patterns ["\\.clj.?$"
                                   "\\.edn$"
                                   "\\.el$"
                                   "\\.html$"
                                   "\\.json$"
                                   "\\.jsx?$"
                                   "\\.sh$"
                                   "\\.yaml$"
                                   "\\.yml$"]
                :exclude-patterns [".clj-kondo/better-cond/.*"
                                   ".clj-kondo/com.github.seancorfield/.*"
                                   "resources/i18n/.*\\.edn$"
                                   "resources/frontend_client"
                                   "resources/frontend_shared"
                                   "resources/html-entities.edn"
                                   "frontend/src/cljs"
                                   "frontend/test/metabase/lib/urls\\.unit\\.spec\\.js$"
                                   "frontend/test/metabase/lib/formatting\\.unit\\.spec\\.js$"
                                   "shared/src/metabase/shared/util/currency\\.cljc$"
                                   "#.+#$"
                                   "\\.transit\\.json$"]}}

  ;; clojure -X:dev:ee:ee-dev:test:cloverage
  :cloverage
  {:exec-fn   metabase.cloverage-runner/run-project
   :exec-args {:fail-threshold 69
               :codecov?       true
               ;; don't instrument logging forms, since they won't get executed as part of tests anyway
               ;; log calls expand to these
               :exclude-call
               [clojure.tools.logging/logf
                clojure.tools.logging/logp
                metabase.util.log/logf
                metabase.util.log/logp]

               :src-ns-path
               ["src" "enterprise/backend/src" "shared/src"]

               :test-ns-path
               ["test" "enterprise/backend/test" "shared/test"]

               :ns-regex
               ["^metabase.*" "^metabase-enterprise.*"]

               ;; don't instrument Postgres/MySQL driver namespaces, because we don't current run tests for them
               ;; as part of recording test coverage, which means they can give us false positives.
               ;;
               ;; regex literals aren't allowed in EDN. We parse them in `./test/cloverage.clj`
               :ns-exclude-regex
               ["metabase\\.driver\\.mysql" "metabase\\.driver\\.postgres"]}
   ;; different port from `:test` so you can run it at the same time as `:test`.
   :jvm-opts ["-Dmb.jetty.port=3002"]}

;;; building Uberjar, build and release scripts

  :build
  {:extra-paths
   ["bin/build/resources"
    "bin/build/src"]

   :extra-deps
   {com.bhauman/spell-spec            {:mvn/version "0.1.1"}                    ; used to find misspellings in YAML files
    com.github.seancorfield/depstar   {:mvn/version "2.1.303"}
    expound/expound                   {:mvn/version "0.7.0"}                    ; better output of spec validation errors
    io.github.borkdude/grasp          {:mvn/version "0.0.3"}
    io.github.clojure/tools.build     {:git/tag "v0.9.3" :git/sha "e537cd1"}
    org.clojure/data.xml              {:mvn/version "0.2.0-alpha8"}
    org.clojure/tools.deps.alpha      {:mvn/version "0.12.985"}
    org.fedorahosted.tennera/jgettext {:mvn/version "0.15.1"}}

   :jvm-opts
   ["-Dclojure.main.report=stderr"
    "-XX:-OmitStackTraceInFastThrow"
    "-XX:+IgnoreUnrecognizedVMOptions"
    "-XX:+ShowCodeDetailsInExceptionMessages"]}

  ;; Build everything:
  ;;
  ;;    clojure -X:drivers:build:build/all
  ;;    clojure -X:drivers:build:build/all :edition :ee
  ;;
  ;; Run just a specific build step:
  ;;
  ;;    clojure -X:drivers:build:build/all :steps '[:version]'
  ;;
  ;; the various steps available are:
  ;;
  ;;    :version :translations :frontend :licenses :drivers :uberjar
  :build/all
  {:exec-fn build/build-cli}

  ;; build just the uberjar (without i18n, drivers, etc.)
  ;;
  ;; clojure -X:build:build/uberjar
  ;; clojure -X:build:build/uberjar :edition :ee
  :build/uberjar
  {:exec-fn build.uberjar/uberjar}

  ;; List dependencies without a license. Not really 100% sure why this needs `:dev`
  ;;
  ;; clojure -X:build:build/list-without-license
  :build/list-without-license
  {:exec-fn build/list-without-license}

  ;; Build a single driver.
  ;;
  ;;   clojure -X:build:drivers:build/driver :driver :sqlserver :edition :oss
  :build/driver
  {:exec-fn build-driver/build-driver}

  ;; Build all of the drivers.
  ;;
  ;;    clojure -X:build:drivers:build/drivers
  ;;    clojure -X:build:drivers:build/drivers :edition :ee
  :build/drivers
  {:exec-fn build-drivers/build-drivers}

  ;; Verify that a driver JAR looks correct.
  ;;
  ;;    clojure -X:build:build/verify-driver :driver :mongo
  :build/verify-driver
  {:exec-fn verify-driver/verify-driver}

  ;; Build i18n artifacts.
  ;;
  ;;    clojure -X:build:build/i18n
  :build/i18n
  {:exec-fn i18n.create-artifacts/create-all-artifacts!}

  ;; Build everything, and run the release steps.
  ;;
  ;;    clojure -X:drivers:build:build/release
  ;;    clojure -X:drivers:build:build/release :steps '[:build-uberjar :upload-uberjar]'
  ;;
  ;; Available steps:
  ;;
  ;;    :build-uberjar
  ;;    :upload-uberjar
  ;;    :push-git-tags
  ;;    :publish-draft-release
  ;;    :publish-elastic-beanstalk-artifacts
  ;;    :update-version-info
  :build/release
  {:exec-fn release/release}

  ;; extra paths and deps for working on build scripts, or running the tests.
  :build-dev
  {:extra-paths ["bin/build/test"]

   :extra-deps
   {org.clojure/data.json {:mvn/version "2.0.2"}}}

  ;;; Run tests for the build scripts:
  ;;;
  ;;; clj -X:dev:drivers:build:build-dev:build-test
  :build-test
  {:exec-fn   hawk.core/find-and-run-tests-cli
   :exec-args {:only ["bin/build/test"]}}


;;; Other misc convenience aliases

  ;; Profile Metabase start time with clojure -M:profile
  :profile
  {:main-opts ["-m" "metabase.core" "profile"]
   :jvm-opts  ["-XX:+CITime" ; print time spent in JIT compiler
               "-XX:+PrintGC"]}

  ;; get the H2 shell with clojure -X:dev:h2
  :h2
  {:extra-paths ["dev/src"]
   :exec-fn     dev.h2-shell/shell
   :java-opts   ["-Dfile.encoding=UTF-8"]}

  ;; clojure -M:generate-automagic-dashboards-pot
  :generate-automagic-dashboards-pot
  {:main-opts ["-m" "metabase.automagic-dashboards.rules"]}

  ;; Start a Network REPL (nrepl) that you can connect your editor to.
  ;;
  ;; clojure -M:dev:nrepl (etc.)
  :nrepl
  {:extra-deps {nrepl/nrepl {:mvn/version "0.9.0"}}
   :main-opts  ["-m" "nrepl.cmdline"]}

  ;; - start a Socket REPL on port 50505 that you can connect your editor to:
  :socket {:jvm-opts ["-Dclojure.server.repl={:address,\"0.0.0.0\",:port,50505,:accept,clojure.core.server/repl}"]}

  ;; Liquibase CLI:
  ;;
  ;;    clojure -M:liquibase <command>
  ;;
  ;; e.g.
  ;;
  ;;    clojure -M:liquibase dbDoc target/liquibase
  :liquibase
  {:extra-deps  {ch.qos.logback/logback-classic {:mvn/version "1.4.5"}}
   :extra-paths ["dev/src"]
   :main-opts   ["-m" "dev.liquibase"]}}}

  ;; TODO -- consider creating an alias that includes the `./bin` build-drivers & release code as well so we can work
  ;; on them all from a single REPL process.