about summary refs log tree commit diff
diff options
context:
space:
mode:
authorsternenseemann <sternenseemann@systemli.org>2022-02-27 15:57:45 +0100
committersterni <sternenseemann@systemli.org>2022-02-27 16:53:18 +0100
commit52afa9c88cc910e964b8706f8fb378563eed97ec (patch)
treefc270e81ab578f41869aba9be8845d67ceb94624
parent4b039fcdd97b49cc09a0aed35eefd2d2b3207ad8 (diff)
chore(web): switch to napalm from yarn2nix
These days, support for npm's package-lock.json seems to besser than for
yarn, so let's drop yarn2nix which is not quite where it needs to be
yet (we pinned an experimental branch after all) and use napalm instead.
For this we have to migrate from yarn to npm completely.

Using npmlock2nix would be preferrable (as it doesn't require building a
Haskell registry server), but there we end up running into an unsolved
issue [1].

[1]: https://github.com/svanderburg/node2nix/issues/106
-rw-r--r--README.md13
-rw-r--r--default.nix12
-rw-r--r--pkgs.nix6
-rw-r--r--web/GNUmakefile4
-rw-r--r--web/default.nix50
-rw-r--r--web/package-lock.json198
-rw-r--r--web/yarn.lock18
7 files changed, 235 insertions, 66 deletions
diff --git a/README.md b/README.md
index bdf8b20..64d32a0 100644
--- a/README.md
+++ b/README.md
@@ -59,7 +59,8 @@ Then you should be able to run `likely-music` from the command line (in the latt
 First make sure you have the following prerequisites installed:
 
 * Functional Haskell environment, i. e. `ghc` and `cabal-install`
-* `yarn`
+* `npm`
+* `esbuild`
 * A MIDI to WAV synthesizer
     * One possibility is fluidsynth:
         * `fluidsynth`
@@ -71,15 +72,13 @@ Then run the following commands:
 ```bash
 cd /path/to/likely-music
 
-cd web
-yarn install --pure-lockfile
-yarn run build:assets
-yarn run build:prod
+pushd web
+make
 
 # optionally if you want to avoid relative path problems
-export LIKELY_MUSIC_FRONTEND=/path/to/web/dist
+export LIKELY_MUSIC_FRONTEND=$(realpath dist)
 
-cd ..
+popd
 cabal v2-build
 cabal v2-run likely-music-backend
 ```
diff --git a/default.nix b/default.nix
index acf0984..dbbd8ad 100644
--- a/default.nix
+++ b/default.nix
@@ -1,3 +1,11 @@
-{ pkgs ? import <nixpkgs> {} }:
+let
+  napalmSrc = builtins.fetchTarball {
+    url = "https://github.com/nix-community/napalm/archive/master.tar.gz";
+  };
+in
 
-import ./pkgs.nix { inherit pkgs; }
+{ pkgs ? import <nixpkgs> {}
+, napalm ? pkgs.callPackage napalmSrc {}
+}:
+
+import ./pkgs.nix { inherit pkgs napalm; }
diff --git a/pkgs.nix b/pkgs.nix
index c1f6f06..9bbd31f 100644
--- a/pkgs.nix
+++ b/pkgs.nix
@@ -1,11 +1,13 @@
-{ pkgs }:
+{ pkgs, napalm }:
 
 rec {
   # likely-music haskellPackage
   likely-music-lib = likely-music-backend;
   likely-music-backend = pkgs.haskellPackages.callPackage ./likely-music-backend.nix { };
 
-  likely-music-frontend = pkgs.callPackage ./web { };
+  likely-music-frontend = pkgs.callPackage ./web {
+    inherit napalm;
+  };
 
   # executable wrapper around everything with correct paths
   likely-music = pkgs.runCommand "likely-music" { } ''
diff --git a/web/GNUmakefile b/web/GNUmakefile
index a1738fa..4b56313 100644
--- a/web/GNUmakefile
+++ b/web/GNUmakefile
@@ -2,7 +2,7 @@
 DIST ?= dist
 # Change this to "development" for source maps and non-minifyed code
 NODE_ENV ?= production
-# If true, we don't attempt to fetch dependencies via yarn
+# If true, we don't attempt to fetch dependencies via npm
 OFFLINE ?= false
 
 ifeq ($(NODE_ENV),production)
@@ -26,7 +26,7 @@ $(DIST):
 	mkdir -p $@
 
 node_modules:
-	$(OFFLINE) || yarn install --frozen-lockfile --prod
+	$(OFFLINE) || npm install --production --omit=peer --omit=dev
 
 $(DIST)/vis-network.min.css: node_modules $(DIST)
 	$(ESBUILD) node_modules/vis-network/dist/dist/vis-network.min.css --outfile=$@
diff --git a/web/default.nix b/web/default.nix
index ea3733b..32aa17a 100644
--- a/web/default.nix
+++ b/web/default.nix
@@ -1,50 +1,30 @@
-{ stdenv, lib, fetchFromGitHub, callPackage, esbuild }:
+{ stdenv, lib, esbuild, napalm, nix-gitignore }:
 
 let
-  pkgInfo = lib.importJSON ./package.json;
-  src = yarn2nix-lib.removePrefixes [ "node_modules" "dist" ] ./.;
-#  yarn2nixSrc = /home/lukas/src/nix/yarn2nix;
-  yarn2nixSrc = fetchFromGitHub {
-    owner  = "sternenseemann";
-    repo   = "yarn2nix";
-    rev    = "b0825bbe4b40f39763d53ba0044431a44b5f25cf";
-    sha256 = "1q8wc5rnb00xwzcqsgb6wfkmymipf2bv1g2i33l5wyadp0hd18cp";
+  src = builtins.path {
+    name = "likely-music-frontend-source";
+    path = ./.;
+    filter = nix-gitignore.gitignoreFilter (builtins.readFile ../.gitignore) ./..;
   };
-  yarn2nix = import yarn2nixSrc { };
-  yarn2nix-lib = yarn2nix.nixLib;
-  deps = yarn2nix-lib.callYarnLock ./yarn.lock { };
-  template = yarn2nix-lib.callPackageJson ./package.json { };
-  calledTemplate = template (yarn2nix-lib.buildNodeDeps deps);
-  node_modules = yarn2nix-lib.linkNodeDeps {
-    inherit (pkgInfo) name;
-    dependencies = calledTemplate.nodeBuildInputs;
-  };
-
 in
 
-stdenv.mkDerivation rec {
-  pname = pkgInfo.name;
-  inherit (pkgInfo) version;
-  inherit src;
-
-  nativeBuildInputs = [ esbuild ];
-
-  makeFlags = [
-    "OFFLINE=true"
+napalm.buildPackage src {
+  nativeBuildInputs = [
+    esbuild
   ];
 
-  NODE_PATH = node_modules;
-  preBuild = ''
-    ln -s ${node_modules} node_modules
-  '';
+  npmCommands = "make";
 
   installPhase = ''
-    mkdir -p $out/share/
-    mv dist $out/share/${pname}
+    runHook preInstall
+    mkdir -p $out/share
+    mv dist $out/share/likely-music-frontend
+    runHook postInstall
   '';
 
-  meta = calledTemplate.meta // {
+  meta = {
     description = "Frontend of likely music, a probabilistic music notation software";
     homepage = "https://github.com/sternenseemann/likely-music";
+    license = lib.licenses.agpl3Only;
   };
 }
diff --git a/web/package-lock.json b/web/package-lock.json
new file mode 100644
index 0000000..f11cffc
--- /dev/null
+++ b/web/package-lock.json
@@ -0,0 +1,198 @@
+{
+  "name": "likely-music-frontend",
+  "version": "0.1.1",
+  "lockfileVersion": 2,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "likely-music-frontend",
+      "version": "0.1.1",
+      "license": "AGPL-3.0-only",
+      "dependencies": {
+        "immutable": "^3.8.1",
+        "vis-data": "^6.6.1",
+        "vis-network": "^7.10.0"
+      }
+    },
+    "node_modules/@egjs/hammerjs": {
+      "version": "2.0.17",
+      "resolved": "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz",
+      "integrity": "sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==",
+      "peer": true,
+      "dependencies": {
+        "@types/hammerjs": "^2.0.36"
+      },
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/@types/hammerjs": {
+      "version": "2.0.41",
+      "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.41.tgz",
+      "integrity": "sha512-ewXv/ceBaJprikMcxCmWU1FKyMAQ2X7a9Gtmzw8fcg2kIePI1crERDM818W+XYrxqdBBOdlf2rm137bU+BltCA==",
+      "peer": true
+    },
+    "node_modules/component-emitter": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
+      "peer": true
+    },
+    "node_modules/immutable": {
+      "version": "3.8.2",
+      "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz",
+      "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/keycharm": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/keycharm/-/keycharm-0.3.1.tgz",
+      "integrity": "sha512-zn47Ti4FJT9zdF+YBBLWJsfKF/fYQHkrYlBeB5Ez5e2PjW7SoIxr43yehAne2HruulIoid4NKZZxO0dHBygCtQ==",
+      "peer": true
+    },
+    "node_modules/moment": {
+      "version": "2.29.1",
+      "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
+      "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==",
+      "peer": true,
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/timsort": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
+      "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=",
+      "peer": true
+    },
+    "node_modules/uuid": {
+      "version": "8.3.2",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+      "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+      "peer": true,
+      "bin": {
+        "uuid": "dist/bin/uuid"
+      }
+    },
+    "node_modules/vis-data": {
+      "version": "6.6.1",
+      "resolved": "https://registry.npmjs.org/vis-data/-/vis-data-6.6.1.tgz",
+      "integrity": "sha512-xmujDB2Dzf8T04rGFJ9OP4OA6zRVrz8R9hb0CVKryBrZRCljCga9JjSfgctA8S7wdZu7otDtUIwX4ZOgfV/57w==",
+      "hasInstallScript": true,
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/visjs"
+      },
+      "peerDependencies": {
+        "moment": "^2.24.0",
+        "uuid": "^7.0.0 || ^8.0.0",
+        "vis-util": "^4.0.0"
+      }
+    },
+    "node_modules/vis-network": {
+      "version": "7.10.2",
+      "resolved": "https://registry.npmjs.org/vis-network/-/vis-network-7.10.2.tgz",
+      "integrity": "sha512-KDx2agbDnaiE0Bye4AcCRqTn5mxzDKhdUNpKkzSn0AOLBmdhNtPGjxAFluAmvFVyiSK5R6Q5KIWdLjeIMu/PAQ==",
+      "hasInstallScript": true,
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/visjs"
+      },
+      "peerDependencies": {
+        "@egjs/hammerjs": "^2.0.0",
+        "component-emitter": "^1.3.0",
+        "keycharm": "^0.2.0 || ^0.3.0",
+        "moment": "^2.24.0",
+        "timsort": "^0.3.0",
+        "uuid": "^3.4.0 || ^7.0.0 || ^8.0.0",
+        "vis-data": "^6.2.1",
+        "vis-util": "^3.0.0 || ^4.0.0"
+      }
+    },
+    "node_modules/vis-util": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/vis-util/-/vis-util-4.3.4.tgz",
+      "integrity": "sha512-hJIZNrwf4ML7FYjs+m+zjJfaNvhjk3/1hbMdQZVnwwpOFJS/8dMG8rdbOHXcKoIEM6U5VOh3HNpaDXxGkOZGpw==",
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/visjs"
+      }
+    }
+  },
+  "dependencies": {
+    "@egjs/hammerjs": {
+      "version": "2.0.17",
+      "resolved": "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz",
+      "integrity": "sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==",
+      "peer": true,
+      "requires": {
+        "@types/hammerjs": "^2.0.36"
+      }
+    },
+    "@types/hammerjs": {
+      "version": "2.0.41",
+      "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.41.tgz",
+      "integrity": "sha512-ewXv/ceBaJprikMcxCmWU1FKyMAQ2X7a9Gtmzw8fcg2kIePI1crERDM818W+XYrxqdBBOdlf2rm137bU+BltCA==",
+      "peer": true
+    },
+    "component-emitter": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
+      "peer": true
+    },
+    "immutable": {
+      "version": "3.8.2",
+      "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz",
+      "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM="
+    },
+    "keycharm": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/keycharm/-/keycharm-0.3.1.tgz",
+      "integrity": "sha512-zn47Ti4FJT9zdF+YBBLWJsfKF/fYQHkrYlBeB5Ez5e2PjW7SoIxr43yehAne2HruulIoid4NKZZxO0dHBygCtQ==",
+      "peer": true
+    },
+    "moment": {
+      "version": "2.29.1",
+      "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
+      "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==",
+      "peer": true
+    },
+    "timsort": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
+      "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=",
+      "peer": true
+    },
+    "uuid": {
+      "version": "8.3.2",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+      "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+      "peer": true
+    },
+    "vis-data": {
+      "version": "6.6.1",
+      "resolved": "https://registry.npmjs.org/vis-data/-/vis-data-6.6.1.tgz",
+      "integrity": "sha512-xmujDB2Dzf8T04rGFJ9OP4OA6zRVrz8R9hb0CVKryBrZRCljCga9JjSfgctA8S7wdZu7otDtUIwX4ZOgfV/57w==",
+      "requires": {}
+    },
+    "vis-network": {
+      "version": "7.10.2",
+      "resolved": "https://registry.npmjs.org/vis-network/-/vis-network-7.10.2.tgz",
+      "integrity": "sha512-KDx2agbDnaiE0Bye4AcCRqTn5mxzDKhdUNpKkzSn0AOLBmdhNtPGjxAFluAmvFVyiSK5R6Q5KIWdLjeIMu/PAQ==",
+      "requires": {}
+    },
+    "vis-util": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/vis-util/-/vis-util-4.3.4.tgz",
+      "integrity": "sha512-hJIZNrwf4ML7FYjs+m+zjJfaNvhjk3/1hbMdQZVnwwpOFJS/8dMG8rdbOHXcKoIEM6U5VOh3HNpaDXxGkOZGpw==",
+      "peer": true
+    }
+  }
+}
diff --git a/web/yarn.lock b/web/yarn.lock
deleted file mode 100644
index 093f548..0000000
--- a/web/yarn.lock
+++ /dev/null
@@ -1,18 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-immutable@^3.8.1:
-  version "3.8.2"
-  resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3"
-  integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=
-
-vis-data@^6.6.1:
-  version "6.6.1"
-  resolved "https://registry.yarnpkg.com/vis-data/-/vis-data-6.6.1.tgz#2aa52e46c305ad46bb7abe6e7634e2eecd743b15"
-  integrity sha512-xmujDB2Dzf8T04rGFJ9OP4OA6zRVrz8R9hb0CVKryBrZRCljCga9JjSfgctA8S7wdZu7otDtUIwX4ZOgfV/57w==
-
-vis-network@^7.10.0:
-  version "7.10.2"
-  resolved "https://registry.yarnpkg.com/vis-network/-/vis-network-7.10.2.tgz#b318f1907cf006d9640c4c31a262e0782405a3cf"
-  integrity sha512-KDx2agbDnaiE0Bye4AcCRqTn5mxzDKhdUNpKkzSn0AOLBmdhNtPGjxAFluAmvFVyiSK5R6Q5KIWdLjeIMu/PAQ==