mirror of
https://github.com/status-im/status-react.git
synced 2025-01-09 18:46:19 +00:00
17ebedd6b8
In PR https://github.com/status-im/status-mobile/pull/17867 we have a namespace named schema.core, but this namespace is taken by library prismatic/schema already (see https://github.com/plumatic/schema/tree/master/src/cljc/schema), a library used by our direct dependency on bidi 2.1.6. This leads to a broken build where the ClojureScript compiler reports undeclared vars (https://clojurescript.org/reference/compiler-options#warnings). We change the order Java resolves dependencies via the classpath mechanism. We now first resolve our own Clojure sources, and then project dependencies.
86 lines
2.8 KiB
Nix
86 lines
2.8 KiB
Nix
#
|
|
# This Nix expression builds the js files for the current repository given a node modules Nix expression
|
|
#
|
|
|
|
{ stdenv, lib, deps, pkgs }:
|
|
|
|
# Path to the file containing secret environment variables
|
|
{ secretsFile ? "" }:
|
|
|
|
stdenv.mkDerivation {
|
|
name = "status-mobile-jsbundle";
|
|
src =
|
|
let path = ./../../..;
|
|
# We use builtins.path so that we can name the resulting derivation,
|
|
# otherwise the name would be taken from the checkout directory,
|
|
# which is outside of our control inherit path;
|
|
in builtins.path {
|
|
inherit path;
|
|
name = "status-mobile-source-jsbundle";
|
|
filter =
|
|
# Keep this filter as restrictive as possible in order to avoid
|
|
# unnecessary rebuilds and limit closure size
|
|
lib.mkFilter {
|
|
root = path;
|
|
ignoreVCS = false;
|
|
include = [
|
|
"VERSION" "BUILD_NUMBER" "scripts/version/.*"
|
|
"src/.*" "shadow-cljs.edn"
|
|
# I want to avoid including the whole .git directory
|
|
".git/HEAD" ".git/objects" ".git/refs/heads/.*"
|
|
# shadow-cljs expects these for deps resolution
|
|
"package.json" "yarn.lock"
|
|
# build stat's images to check if they exist
|
|
"resources/.*" "translations/.*"
|
|
];
|
|
exclude = [
|
|
"resources/fonts/.*"
|
|
];
|
|
};
|
|
};
|
|
buildInputs = with pkgs; [ clojure nodejs bash git openjdk];
|
|
phases = [
|
|
"unpackPhase" "secretsPhase" "patchPhase"
|
|
"configurePhase" "buildPhase" "installPhase"
|
|
];
|
|
|
|
# For optional POKT_TOKEN variable
|
|
secretsPhase = if (secretsFile != "") then ''
|
|
source "${secretsFile}"
|
|
${lib.checkEnvVarSet "POKT_TOKEN"}
|
|
'' else ''
|
|
echo "No secrets provided!"
|
|
'';
|
|
|
|
# Patching shadow-cljs.edn so it uses the local maven repo of dependencies provided by Nix
|
|
patchPhase =
|
|
let anchor = ''{:source-paths ["src" "test/cljs"]'';
|
|
in ''
|
|
substituteInPlace shadow-cljs.edn \
|
|
--replace '${anchor}' \
|
|
'${anchor}
|
|
:maven {:local-repo "${deps.clojure}"}'
|
|
'';
|
|
configurePhase = ''
|
|
# Symlink Node.js modules to build directory
|
|
ln -s ${deps.nodejs}/node_modules
|
|
'';
|
|
buildPhase = ''
|
|
# Assemble CLASSPATH from available clojure dependencies.
|
|
# We prepend 'src' so it can find the local sources and prioritize
|
|
# our own namespaces over dependencies, given that indirect dependencies
|
|
# can also cause naming conflicts (e.g. prismatic/schema already uses
|
|
# namespace schema.core).
|
|
export CLASS_PATH="src:$(find ${deps.clojure} \
|
|
-iname '*.jar' | tr '\n' ':')"
|
|
|
|
# target must be one of the builds defined in shadow-cljs.edn
|
|
java -cp "$CLASS_PATH" clojure.main \
|
|
-m shadow.cljs.devtools.cli release mobile
|
|
'';
|
|
installPhase = ''
|
|
mkdir -p $out
|
|
cp -r result/* $out/
|
|
'';
|
|
}
|