about summary refs log tree commit diff
diff options
context:
space:
mode:
-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==