;; shadow-cljs configuration
{:source-paths ["src" "test/cljs"]

 :dependencies [[reagent "1.2.0"]
                [re-frame "1.4.3"]
                [binaryage/oops "0.7.2"]
                [com.andrewmcveigh/cljs-time "0.5.2"]
                [com.taoensso/timbre "6.3.1"]
                [cljs-bean "1.9.0"]
                [com.cognitect/transit-cljs "0.8.280"]
                [camel-snake-kebab "0.4.3"]
                [metosin/malli "0.13.0"]
                [funcool/promesa "11.0.678"]

                ;; Dev dependencies
                [com.github.jpmonettas/flow-storm-inst "3.7.5"]
                [refactor-nrepl "3.9.1"]
                [cider/cider-nrepl "0.31.0"]
                [cider/piggieback "0.4.1"]
                [org.slf4j/slf4j-nop "2.0.9"]
                [re-frisk-remote "1.6.0"]
                [nubank/matcher-combinators "3.9.1"]

                ;; Use the same version specified in the Nix dependency.
                [clj-kondo/clj-kondo "2024.03.13"]

                ;; Routing
                [bidi "2.1.6"]
                ;; Test dependencies
                [day8.re-frame/test "0.1.5"]
                [com.taoensso/tufte "2.6.3"]]

 ;; port and middleware for repl in development
 :nrepl {:port       7888
         :middleware [cider.piggieback/wrap-cljs-repl
                      refactor-nrepl.middleware/wrap-refactor]}

 ;; shadow-cljs web interface
 :http {:port 3449
        :host "0.0.0.0"}

 :cache-blockers #{legacy.status-im.utils.js-resources legacy.status-im.ui.components.icons.icons}

 :builds
 {:mobile
  {:target :react-native
   ;; To match the folder created by Nix build of JSBundle.
   :output-dir "result"
   :init-fn status-im.core/init
   ;; When false, the Shadow-CLJS watcher won't automatically refresh
   ;; the target files (a.k.a hot reload). When false, you can manually
   ;; reload by calling `shadow.cljs.devtools.api/watch-compile-all!`.
   :devtools {:autobuild #shadow/env ["SHADOW_AUTOBUILD_ENABLED" :default true :as :bool]}
   :dev
   {:devtools {:before-load-async status-im.setup.hot-reload/before-reload
               :after-load-async  status-im.setup.hot-reload/reload
               :build-notify      status-im.setup.hot-reload/build-notify
               :preloads          [;; The official recommendation is to
                                   ;; load the debugger preload first.
                                   flow-storm.api
                                   re-frisk-remote.preload
                                   status-im.setup.schema-preload
                                   ;; In order to use component test helpers in the REPL we need to
                                   ;; preload namespaces that are not normally required by
                                   ;; production code, such as @testing-library/react-native.
                                   test-helpers.component]}
    :closure-defines
    {status-im.config/POKT_TOKEN #shadow/env "POKT_TOKEN"
     status-im.config/INFURA_TOKEN #shadow/env "INFURA_TOKEN"
     status-im.config/STATUS_BUILD_PROXY_USER #shadow/env "STATUS_BUILD_PROXY_USER"
     status-im.config/STATUS_BUILD_PROXY_PASSWORD #shadow/env "STATUS_BUILD_PROXY_PASSWORD"
     status-im.config/STATUS_BACKEND_SERVER_ENABLED #shadow/env "STATUS_BACKEND_SERVER_ENABLED"
     status-im.config/STATUS_BACKEND_SERVER_HOST #shadow/env "STATUS_BACKEND_SERVER_HOST"
     status-im.config/STATUS_BACKEND_SERVER_MEDIA_SERVER_ENABLE_TLS
     #shadow/env "STATUS_BACKEND_SERVER_MEDIA_SERVER_ENABLE_TLS"
     status-im.config/STATUS_BACKEND_SERVER_IMAGE_SERVER_URI_PREFIX
     #shadow/env "STATUS_BACKEND_SERVER_IMAGE_SERVER_URI_PREFIX"
     status-im.config/STATUS_BACKEND_SERVER_ROOT_DATA_DIR #shadow/env
                                                           "STATUS_BACKEND_SERVER_ROOT_DATA_DIR"

     ;; Uncomment this line during development if you want to test the integration with Sentry.
     ;;
     ;; status-im.config/SENTRY_DSN_STATUS_GO #shadow/env "SENTRY_DSN_STATUS_GO"

     status-im.config/MIXPANEL_APP_ID #shadow/env "MIXPANEL_APP_ID"
     status-im.config/MIXPANEL_TOKEN #shadow/env "MIXPANEL_TOKEN"
     status-im.config/OPENSEA_API_KEY #shadow/env "OPENSEA_API_KEY"
     status-im.config/RARIBLE_MAINNET_API_KEY #shadow/env "RARIBLE_MAINNET_API_KEY"
     status-im.config/RARIBLE_TESTNET_API_KEY #shadow/env "RARIBLE_TESTNET_API_KEY"
     status-im.config/ALCHEMY_ETHEREUM_MAINNET_TOKEN #shadow/env "ALCHEMY_ETHEREUM_MAINNET_TOKEN"
     status-im.config/ALCHEMY_ETHEREUM_SEPOLIA_TOKEN #shadow/env "ALCHEMY_ETHEREUM_SEPOLIA_TOKEN"
     status-im.config/ALCHEMY_ARBITRUM_MAINNET_TOKEN #shadow/env "ALCHEMY_ARBITRUM_MAINNET_TOKEN"
     status-im.config/ALCHEMY_ARBITRUM_SEPOLIA_TOKEN #shadow/env "ALCHEMY_ARBITRUM_SEPOLIA_TOKEN"
     status-im.config/ALCHEMY_OPTIMISM_MAINNET_TOKEN #shadow/env "ALCHEMY_OPTIMISM_MAINNET_TOKEN"
     status-im.config/ALCHEMY_OPTIMISM_SEPOLIA_TOKEN #shadow/env "ALCHEMY_OPTIMISM_SEPOLIA_TOKEN"}
    :compiler-options {:output-feature-set :es5
                       ;; We disable `:fn-deprecated` warnings because we
                       ;; are managing deprecation via clj-kondo and we
                       ;; don't want the terminal output to be littered
                       ;; with warnings on every code reload.
                       :warnings           {:fn-deprecated false}
                       :closure-defines    {re-frame.trace/trace-enabled? true}
                       :source-map         false
                       ;; This seems to be necessary while using the REPL,
                       ;; otherwise sometimes you'll get weird errors when
                       ;; instrumenting functions.
                       :static-fns         false
                       :infer-externs      true
                       :reader-features    #{:mobile}}
    ;; if you want to use a real device, set your local ip
    ;; in the SHADOW_HOST env variable to make sure that
    ;; it will use the right interface
    :local-ip #shadow/env "SHADOW_HOST"}
   :chunks {:fleets legacy.status-im.fleet.default-fleet/default-fleets}
   :release
   {:closure-defines
    {status-im.config/POKT_TOKEN                     #shadow/env "POKT_TOKEN"
     status-im.config/INFURA_TOKEN                   #shadow/env "INFURA_TOKEN"
     status-im.config/STATUS_BUILD_PROXY_USER        #shadow/env "STATUS_BUILD_PROXY_USER"
     status-im.config/STATUS_BUILD_PROXY_PASSWORD    #shadow/env "STATUS_BUILD_PROXY_PASSWORD"
     status-im.config/OPENSEA_API_KEY                #shadow/env "OPENSEA_API_KEY"
     status-im.config/MIXPANEL_APP_ID                #shadow/env "MIXPANEL_APP_ID"
     status-im.config/MIXPANEL_TOKEN                 #shadow/env "MIXPANEL_TOKEN"
     status-im.config/RARIBLE_MAINNET_API_KEY        #shadow/env "RARIBLE_MAINNET_API_KEY"
     status-im.config/RARIBLE_TESTNET_API_KEY        #shadow/env "RARIBLE_TESTNET_API_KEY"
     status-im.config/ALCHEMY_ETHEREUM_MAINNET_TOKEN #shadow/env "ALCHEMY_ETHEREUM_MAINNET_TOKEN"
     status-im.config/ALCHEMY_ETHEREUM_SEPOLIA_TOKEN #shadow/env "ALCHEMY_ETHEREUM_SEPOLIA_TOKEN"
     status-im.config/ALCHEMY_ARBITRUM_MAINNET_TOKEN #shadow/env "ALCHEMY_ARBITRUM_MAINNET_TOKEN"
     status-im.config/ALCHEMY_ARBITRUM_SEPOLIA_TOKEN #shadow/env "ALCHEMY_ARBITRUM_SEPOLIA_TOKEN"
     status-im.config/ALCHEMY_OPTIMISM_MAINNET_TOKEN #shadow/env "ALCHEMY_OPTIMISM_MAINNET_TOKEN"
     status-im.config/ALCHEMY_OPTIMISM_SEPOLIA_TOKEN #shadow/env "ALCHEMY_OPTIMISM_SEPOLIA_TOKEN"
     status-im.config/SENTRY_DSN_STATUS_GO           #shadow/env "SENTRY_DSN_STATUS_GO"}
    :compiler-options {:output-feature-set :es6
                       ;;disable for android build as there
                       ;;is an intermittent warning with deftype
                       :warnings-as-errors false
                       :infer-externs      :auto
                       :static-fns         true
                       :fn-invoke-direct   true
                       :optimizations      :advanced
                       :js-options         {:js-provider :closure}
                       :reader-features    #{:mobile}}}}
  ;; the tests are ran with node, react-native dependencies are mocked
  ;; by using node --require override.js, which uses the node-library
  ;; produced by the target :mocks below and redefines node require
  ;; function to use the mocks instead of the rn libraries
  :test
  {:output-to #shadow/env "SHADOW_OUTPUT_TO"
   :output-dir "target/test"
   :optimizations :simple
   :target :node-test
   :dev {:devtools {:preloads [status-im.setup.schema-preload
                               status-im.setup.test-preload]}}
   ;; Uncomment line below to `make test-watch` a specific file
   :ns-regexp #shadow/env "SHADOW_NS_REGEXP"
   :main legacy.status-im.test-runner/main
   ;; set :ui-driven to true to let shadow-cljs inject node-repl
   :ui-driven true
   :closure-defines
   {schema.core/throw-on-error?                     true
    status-im.config/POKT_TOKEN                     #shadow/env "POKT_TOKEN"
    status-im.config/INFURA_TOKEN                   #shadow/env "INFURA_TOKEN"
    status-im.config/OPENSEA_API_KEY                #shadow/env "OPENSEA_API_KEY"
    status-im.config/MIXPANEL_APP_ID                #shadow/env "MIXPANEL_APP_ID"
    status-im.config/MIXPANEL_TOKEN                 #shadow/env "MIXPANEL_TOKEN"
    status-im.config/RARIBLE_MAINNET_API_KEY        #shadow/env "RARIBLE_MAINNET_API_KEY"
    status-im.config/RARIBLE_TESTNET_API_KEY        #shadow/env "RARIBLE_TESTNET_API_KEY"
    status-im.config/ALCHEMY_ETHEREUM_MAINNET_TOKEN #shadow/env "ALCHEMY_ETHEREUM_MAINNET_TOKEN"
    status-im.config/ALCHEMY_ETHEREUM_SEPOLIA_TOKEN #shadow/env "ALCHEMY_ETHEREUM_SEPOLIA_TOKEN"
    status-im.config/ALCHEMY_ARBITRUM_MAINNET_TOKEN #shadow/env "ALCHEMY_ARBITRUM_MAINNET_TOKEN"
    status-im.config/ALCHEMY_ARBITRUM_SEPOLIA_TOKEN #shadow/env "ALCHEMY_ARBITRUM_SEPOLIA_TOKEN"
    status-im.config/ALCHEMY_OPTIMISM_MAINNET_TOKEN #shadow/env "ALCHEMY_OPTIMISM_MAINNET_TOKEN"
    status-im.config/ALCHEMY_OPTIMISM_SEPOLIA_TOKEN #shadow/env "ALCHEMY_OPTIMISM_SEPOLIA_TOKEN"
    status-im.config/WALLET_CONNECT_PROJECT_ID      #shadow/env "WALLET_CONNECT_PROJECT_ID"}
   :compiler-options
   {;; needed because we override require and it
    ;; messes with source-map which reports callstack
    ;; exceeded exceptions instead of real issues
    :source-map      false
    ;; needed because we use deref in tests
    :static-fns      false
    :optimizations   :simple
    :warnings        {:fn-deprecated false}
    :infer-externs   true
    :reader-features #{:mobile}}}

  ;; mock.js-dependencies is mocking the react-native libraries
  ;; we build it as a node library so that it can be required by
  ;; override.js
  :mocks
  {:target           :node-library
   :exports          {:mocks mocks.js-dependencies/mock}
   :output-to        "target/mocks/mocks.js"
   :output-dir       "target/mocks"
   :compiler-options {:optimizations :simple
                      :source-map    false}}
  :component-test {:target           :npm-module
                   :entries          [;; We need to tell shadow-cljs to compile
                                      ;; the preloads namespaces because they
                                      ;; will be used directly by Jest in the
                                      ;; option setupFilesAfterEnv.
                                      test-helpers.component-tests-preload
                                      status-im.setup.schema-preload
                                      quo.core-spec
                                      status-im.core-spec]
                   :ns-regexp        "component-spec$"
                   :output-dir       "component-spec"
                   :closure-defines  {schema.core/throw-on-error? true}
                   :compiler-options {:warnings-as-errors false
                                      :warnings           {:fn-deprecated false}
                                      :static-fns         false
                                      :infer-externs      true}}}}