jetbrains: useFetchCargoVendor (#377020)
[NixPkgs.git] / pkgs / by-name / mo / movim / package.nix
blob11315b9517a3f517ce8038d19477ae5479224f21
2   lib,
3   fetchFromGitHub,
4   writeShellScript,
5   dash,
6   php,
7   phpCfg ? null,
8   withPgsql ? true, # “strongly recommended” according to docs
9   withMysql ? false,
10   minifyStaticFiles ? false, # default files are often not minified
11   esbuild,
12   lightningcss,
13   scour,
14   nixosTests,
17 let
18   defaultMinifyOpts = {
19     script = {
20       enable = false;
21       target = "es2021";
22     };
23     style = {
24       enable = false;
25       browserslist = "defaults, Firefox ESR, last 20 Firefox major versions, last 20 Chrome major versions, last 3 Safari major versions, last 1 KaiOS version, and supports css-variables";
26     };
27     svg = {
28       enable = false;
29     };
30   };
32   minify = lib.recursiveUpdate defaultMinifyOpts (
33     if lib.isBool minifyStaticFiles && minifyStaticFiles then
34       {
35         script.enable = true;
36         style.enable = true;
37         svg.enable = true;
38       }
39     else if lib.isAttrs minifyStaticFiles then
40       lib.filterAttrsRecursive (_: v: v != null) minifyStaticFiles
41     else
42       { }
43   );
45 php.buildComposerProject (finalAttrs: {
46   pname = "movim";
47   version = "0.29";
49   src = fetchFromGitHub {
50     owner = "movim";
51     repo = "movim";
52     tag = "v${finalAttrs.version}";
53     hash = "sha256-hAOT3n0i9t3uWMjqWJlOs4Vakq3y4+GhiFZ4n3jVqtw=";
54   };
56   php = php.buildEnv (
57     {
58       extensions = (
59         { all, enabled }:
60         enabled
61         ++ (with all; [
62           curl
63           dom
64           gd
65           imagick
66           mbstring
67           pdo
68           simplexml
69         ])
70         ++ lib.optionals withPgsql (
71           with all;
72           [
73             pdo_pgsql
74             pgsql
75           ]
76         )
77         ++ lib.optionals withMysql (
78           with all;
79           [
80             mysqli
81             mysqlnd
82             pdo_mysql
83           ]
84         )
85       );
86     }
87     // lib.optionalAttrs (phpCfg != null) {
88       extraConfig = phpCfg;
89     }
90   );
92   nativeBuildInputs =
93     lib.optional minify.script.enable esbuild
94     ++ lib.optional minify.style.enable lightningcss
95     ++ lib.optional minify.svg.enable scour;
97   # no listed license
98   # pinned commonmark
99   composerStrictValidation = false;
101   vendorHash = "sha256-uma3evj/81qz/+1+poIl0FJqWe1e2Ay0Jm446CKOGP0=";
103   postPatch = ''
104     # Our modules are already wrapped, removes missing *.so warnings;
105     # replacing `$configuration` with actually-used flags.
106     substituteInPlace src/Movim/Daemon/Session.php \
107       --replace-fail \
108         "'exec ' . PHP_BINARY . ' ' . \$configuration . '" \
109         "'exec ' . PHP_BINARY . ' -dopcache.enable=1 -dopcache.enable_cli=1 ' . '"
111     # Point to PHP + PHP INI in the Nix store
112     substituteInPlace src/Movim/Console/DaemonCommand.php \
113       --replace-fail "<info>php vendor/bin/phinx migrate</info>" \
114         "<info>${lib.getBin finalAttrs.php} vendor/bin/phinx migrate</info>" \
115       --replace-fail "<info>php daemon.php setAdmin {jid}</info>" \
116         "<info>${finalAttrs.meta.mainProgram} setAdmin {jid}</info>"
118     # BUGFIX: Imagick API Changes for 7.x+
119     # See additionally: https://github.com/movim/movim/pull/1122
120     substituteInPlace src/Movim/Image.php \
121       --replace-fail "Imagick::ALPHACHANNEL_REMOVE" "Imagick::ALPHACHANNEL_OFF" \
122       --replace-fail "Imagick::ALPHACHANNEL_ACTIVATE" "Imagick::ALPHACHANNEL_ON"
123   '';
125   preBuild =
126     lib.optionalString minify.script.enable ''
127       find ./public -type f -iname "*.js" -print0 \
128         | xargs -0 -n 1 -P $NIX_BUILD_CORES ${writeShellScript "movim_script_minify" ''
129           file="$1"
130           tmp="$(mktemp)"
131           esbuild $file --minify --target=${lib.escapeShellArg minify.script.target} --outfile=$tmp
132           [[ "$(stat -c %s $tmp)" -lt "$(stat -c %s $file)" ]] && mv $tmp $file
133         ''}
134     ''
135     + lib.optionalString minify.style.enable ''
136       find ./public -type f -iname "*.css" -print0 \
137         | xargs -0 -n 1 -P $NIX_BUILD_CORES ${writeShellScript "movim_style_minify" ''
138           export BROWSERLIST="${lib.escapeShellArg minify.style.browserslist}"
139           file="$1"
140           tmp="$(mktemp)"
141           lightningcss $file --minify --browserslist --output-file=$tmp
142           [[ "$(stat -c %s $tmp)" -lt "$(stat -c %s $file)" ]] && mv $tmp $file
143         ''}
144     ''
145     + lib.optionalString minify.svg.enable ''
146       find ./public -type f -iname "*.svg" -a -not -path "*/emojis/*" -print0 \
147         | xargs -0 -n 1 -P $NIX_BUILD_CORES ${writeShellScript "movim_svg_minify" ''
148           file="$1"
149           tmp="$(mktemp)"
150           scour -i $file -o $tmp --disable-style-to-xml --enable-comment-stripping --enable-viewboxing --indent=tab
151           [[ "$(stat -c %s $tmp)" -lt "$(stat -c %s $file)" ]] && mv $tmp $file
152         ''}
153     '';
155   postInstall = ''
156     mkdir -p $out/bin
157     echo "#!${lib.getExe dash}" > $out/bin/movim
158     echo "${lib.getExe finalAttrs.php} $out/share/php/${finalAttrs.pname}/daemon.php \"\$@\"" >> $out/bin/${finalAttrs.meta.mainProgram}
159     chmod +x $out/bin/${finalAttrs.meta.mainProgram}
162     mkdir -p $out/share/{bash-completion/completion,fish/vendor_completions.d,zsh/site-functions}
163     $out/bin/movim completion bash | sed "s/daemon.php/movim/g" > $out/share/bash-completion/completion/movim.bash
164     $out/bin/movim completion fish | sed "s/daemon.php/movim/g" > $out/share/fish/vendor_completions.d/movim.fish
165     $out/bin/movim completion zsh | sed "s/daemon.php/movim/g" > $out/share/zsh/site-functions/_movim
166     chmod +x $out/share/{bash-completion/completion/movim.bash,fish/vendor_completions.d/movim.fish,zsh/site-functions/_movim}
167   '';
169   passthru = {
170     tests = { inherit (nixosTests) movim; };
171   };
173   meta = {
174     description = "Federated blogging & chat platform that acts as a web front end for the XMPP protocol";
175     homepage = "https://movim.eu";
176     license = lib.licenses.agpl3Plus;
177     maintainers = with lib.maintainers; [ toastal ];
178     mainProgram = "movim";
179   };