1{
2 lib,
3 stdenv,
4 fetchFromGitHub,
5 fetchNpmDeps,
6 nix-update-script,
7 npmHooks,
8 dart-sass,
9 nodejs,
10 python3,
11}:
12let
13 version = "2.0.0-rc.4";
14 src = fetchFromGitHub {
15 owner = "plankanban";
16 repo = "planka";
17 tag = "v${version}";
18 hash = "sha256-RUOIOXrpoNGxoKwUlgkPsk4kTnA95E+iwYIjBzSBoTA=";
19 };
20 meta = {
21 description = "Kanban-style project mastering tool for everyone";
22 homepage = "https://docs.planka.cloud/";
23 license = {
24 fullName = "Planka Community License";
25 url = "https://github.com/plankanban/planka/blob/master/LICENSE.md";
26 free = false;
27 redistributable = true;
28 };
29 maintainers = with lib.maintainers; [ pyrox0 ];
30 };
31
32 frontend = stdenv.mkDerivation (finalAttrs: {
33 pname = "planka-frontend";
34 inherit version src meta;
35
36 sourceRoot = "${finalAttrs.src.name}/client";
37
38 npmDeps = fetchNpmDeps {
39 inherit (finalAttrs) src sourceRoot;
40 hash = "sha256-XtVwO8253XBVtG0jrikeVr1yaS1PpphCbN5B6jz54qc=";
41 };
42
43 npmFlags = [
44 "--ignore-scripts"
45 ];
46
47 nativeBuildInputs = [
48 npmHooks.npmConfigHook
49 nodejs
50 dart-sass
51 ];
52
53 buildPhase = ''
54 runHook preBuild
55
56 npx patch-package
57
58 # Replace dart path in sass-embedded since node_modules doesn't have the native binary
59 substituteInPlace node_modules/sass-embedded/dist/lib/src/compiler-path.js \
60 --replace-fail 'compilerCommand = (() => {' 'compilerCommand = (() => { return ["${lib.getExe dart-sass}"];'
61
62 npm run build
63
64 runHook postBuild
65 '';
66
67 installPhase = ''
68 runHook preInstall
69
70 mkdir $out/
71 mv dist $out/dist
72
73 runHook postInstall
74 '';
75 });
76
77 serverPython = python3.withPackages (ps: [ ps.apprise ]);
78in
79stdenv.mkDerivation (finalAttrs: {
80 pname = "planka";
81 inherit version src meta;
82
83 sourceRoot = "${finalAttrs.src.name}/server";
84
85 npmDeps = fetchNpmDeps {
86 inherit (finalAttrs) src sourceRoot;
87 hash = "sha256-yW9uzPALGdPrrUV129ToXayLyeLbAK9mCl2emCPYUdc=";
88 };
89
90 npmFlags = [ "--ignore-scripts" ];
91
92 nativeBuildInputs = [
93 npmHooks.npmConfigHook
94 nodejs
95 ];
96
97 buildInputs = [
98 serverPython
99 nodejs
100 ];
101
102 preBuild = ''
103 # Patch notifs helper to use nixpkgs' python
104 substituteInPlace api/helpers/utils/send-notifications.js \
105 --replace-fail '(`$' '(`' \
106 --replace-fail "{sails.config.appPath}/.venv/bin/python3" "${lib.getExe serverPython}"
107 '';
108
109 buildPhase = ''
110 runHook preBuild
111
112 npx patch-package
113
114 runHook postBuild
115 '';
116
117 installPhase = ''
118 runHook preInstall
119
120 npm prune --omit=dev --no-save $npmFlags "$${npmFlagsArray[@]}"
121 find node_modules -maxdepth 1 -type d -empty -delete
122
123 mkdir -p $out/lib/node_modules/planka
124 mkdir $out/bin
125 mv * $out/lib/node_modules/planka
126 cp -t $out/lib/node_modules/planka/public -r ${frontend}/dist/*
127 cp ${frontend}/dist/index.html $out/lib/node_modules/planka/views/index.html
128
129 ln -s $out/lib/node_modules/planka/start.sh $out/bin/planka
130
131 runHook postInstall
132 '';
133
134 passthru.updateScript = nix-update-script { extraArgs = [ "--version=unstable" ]; };
135})