{ lib, buildNpmPackage, fetchFromGitHub, python3, nodejs, }: let version = "2.9.3"; tree-sitter-elixir = fetchFromGitHub { owner = "elixir-lang"; repo = "tree-sitter-elixir"; rev = "v0.3.5"; hash = "sha256-C5/+t49pcFh45GqLZRjRs/sH8Ej+dklR/brad+snsyQ="; }; in buildNpmPackage rec { pname = "dolos"; inherit version; inherit nodejs; src = fetchFromGitHub { owner = "dodona-edu"; repo = "dolos"; rev = "v${version}"; hash = "sha256-kilCxSe4njHyoXVXpyLmx5HnGkzFptLYOypQmldGnzc="; fetchSubmodules = true; }; npmWorkspace = "cli"; npmDepsHash = "sha256-3RMUWo6vybfi0BvQ12jjxuYFPDe3HkTv24L3BsuOCFg="; nativeBuildInputs = [ python3 ]; TREE_SITTER_BUILD_FROM_SOURCE = "1"; npm_config_build_from_source = "true"; dontNpmBuild = true; npmRebuildFlags = [ "--ignore-scripts" ]; postConfigure = '' sed -i '2s/^/process.exit(0);\n/' node_modules/tree-sitter-cli/install.js npm rebuild ''; preBuild = '' cp -r ${tree-sitter-elixir} parsers/elixir chmod -R u+w parsers/elixir cat > parsers/elixir/binding.gyp << 'GYPEOF' { "targets": [ { "target_name": "tree_sitter_elixir_binding", "dependencies": [ " parsers/binding.gyp << 'GYPEOF' { "includes": [ "bash/binding.gyp", "c/binding.gyp", "cpp/binding.gyp", "c_sharp/binding.gyp", "elm/binding.gyp", "elixir/binding.gyp", "go/binding.gyp", "groovy/binding.gyp", "java/binding.gyp", "javascript/binding.gyp", "modelica/binding.gyp", "ocaml/binding.gyp", "php/binding.gyp", "python/binding.gyp", "r/binding.gyp", "rust/binding.gyp", "scala/binding.gyp", "sql/binding.gyp", "typescript/binding.gyp", "verilog/binding.gyp" ] } GYPEOF sed -i '/^parsers.verilog/a \ parsers.elixir = require("./build/Release/tree_sitter_elixir_binding");\ parsers.elixir.nodeTypeInfo = require("./elixir/src/node-types.json"); ' parsers/index.js npm run build -w parsers ''; buildPhase = '' runHook preBuild npm run build -w cli npm run build -w lib npm run build -w core npm run build -w web runHook postBuild ''; postInstall = '' cp -r lib $out/lib/node_modules/dolos-meta/lib chmod -R u+w $out/lib/node_modules/dolos-meta/lib cp -r core $out/lib/node_modules/dolos-meta/core chmod -R u+w $out/lib/node_modules/dolos-meta/core cp -r parsers $out/lib/node_modules/dolos-meta/parsers chmod -R u+w $out/lib/node_modules/dolos-meta/parsers dolonsDir="$out/lib/node_modules/dolos-meta/node_modules/@dodona" rm -rf "$dolonsDir/dolos-web" mkdir -p "$dolonsDir/dolos-web" install -m644 web/index.js "$dolonsDir/dolos-web/index.js" install -m644 web/index.d.ts "$dolonsDir/dolos-web/index.d.ts" 2>/dev/null || true install -m644 web/package.json "$dolonsDir/dolos-web/package.json" cp -r web/dist "$dolonsDir/dolos-web/dist" chmod -R u+w "$dolonsDir/dolos-web" rm "$dolonsDir/dolos" ln -s ../.. "$dolonsDir/dolos" ''; meta = { description = "Source code plagiarism detection tool for programming exercises"; homepage = "https://dolos.ugent.be"; license = lib.licenses.mit; mainProgram = "dolos"; platforms = lib.platforms.linux ++ lib.platforms.darwin; }; }