From 52afa9c88cc910e964b8706f8fb378563eed97ec Mon Sep 17 00:00:00 2001 From: sternenseemann Date: Sun, 27 Feb 2022 15:57:45 +0100 Subject: 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 --- README.md | 13 ++-- default.nix | 12 ++- pkgs.nix | 6 +- web/GNUmakefile | 4 +- web/default.nix | 50 ++++--------- web/package-lock.json | 198 ++++++++++++++++++++++++++++++++++++++++++++++++++ web/yarn.lock | 18 ----- 7 files changed, 235 insertions(+), 66 deletions(-) create mode 100644 web/package-lock.json delete mode 100644 web/yarn.lock 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 {} }: +let + napalmSrc = builtins.fetchTarball { + url = "https://github.com/nix-community/napalm/archive/master.tar.gz"; + }; +in -import ./pkgs.nix { inherit pkgs; } +{ pkgs ? import {} +, 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== -- cgit 1.4.1