about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/web/playwright/driver.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/web/playwright/driver.nix')
-rw-r--r--nixpkgs/pkgs/development/web/playwright/driver.nix136
1 files changed, 136 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/web/playwright/driver.nix b/nixpkgs/pkgs/development/web/playwright/driver.nix
new file mode 100644
index 000000000000..7f755eda21ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/web/playwright/driver.nix
@@ -0,0 +1,136 @@
+{ lib
+, stdenv
+, chromium
+, ffmpeg
+, git
+, jq
+, nodejs
+, fetchFromGitHub
+, fetchurl
+, makeFontsConf
+, makeWrapper
+, runCommand
+, unzip
+, cacert
+}:
+let
+  inherit (stdenv.hostPlatform) system;
+
+  throwSystem = throw "Unsupported system: ${system}";
+
+  driver = stdenv.mkDerivation (finalAttrs:
+    let
+      suffix = {
+        x86_64-linux = "linux";
+        aarch64-linux = "linux-arm64";
+        x86_64-darwin = "mac";
+        aarch64-darwin = "mac-arm64";
+      }.${system} or throwSystem;
+      filename = "playwright-${finalAttrs.version}-${suffix}.zip";
+    in
+    {
+    pname = "playwright-driver";
+    # run ./pkgs/development/python-modules/playwright/update.sh to update
+    version = "1.40.0";
+
+    src = fetchurl {
+      url = "https://playwright.azureedge.net/builds/driver/${filename}";
+      sha256 = {
+        x86_64-linux = "0y9n23r4yfcgm4a50rfgicl91vrllak0d8h26yagh6h8hl0r3nhh";
+        aarch64-linux = "0zd456klidi4sg7wahfrdbs2bwiq3q6ngxd4iv3vi9f9w9nq2p2k";
+        x86_64-darwin = "0yaiwg9821w9nszzkrp5skzf5792nahvfqnr4axk84dcngslxvmk";
+        aarch64-darwin = "1b1jmv6l97ss8c4sc3n1xckn05fpq3fihjbjxr2qz6i9dsy3xj57";
+      }.${system} or throwSystem;
+    };
+
+    sourceRoot = ".";
+
+    nativeBuildInputs = [ unzip ];
+
+    postPatch = ''
+      # Use Nix's NodeJS instead of the bundled one.
+      substituteInPlace playwright.sh --replace '"$SCRIPT_PATH/node"' '"${nodejs}/bin/node"'
+      rm node
+
+      # Hard-code the script path to $out directory to avoid a dependency on coreutils
+      substituteInPlace playwright.sh \
+        --replace 'SCRIPT_PATH="$(cd "$(dirname "$0")" ; pwd -P)"' "SCRIPT_PATH=$out"
+
+      patchShebangs playwright.sh package/bin/*.sh
+    '';
+
+    installPhase = ''
+      runHook preInstall
+
+      mkdir -p $out/bin
+      mv playwright.sh $out/bin/playwright
+      mv package $out/
+
+      runHook postInstall
+    '';
+
+    passthru = {
+      inherit filename;
+      browsers = {
+        x86_64-linux = browsers-linux { };
+        aarch64-linux = browsers-linux { };
+        x86_64-darwin = browsers-mac;
+        aarch64-darwin = browsers-mac;
+      }.${system} or throwSystem;
+      browsers-chromium = browsers-linux {};
+    };
+  });
+
+  browsers-mac = stdenv.mkDerivation {
+    pname = "playwright-browsers";
+    inherit (driver) version;
+
+    dontUnpack = true;
+
+    nativeBuildInputs = [
+      cacert
+    ];
+
+    installPhase = ''
+      runHook preInstall
+
+      export PLAYWRIGHT_BROWSERS_PATH=$out
+      ${driver}/bin/playwright install
+      rm -r $out/.links
+
+      runHook postInstall
+    '';
+
+    meta.platforms = lib.platforms.darwin;
+  };
+
+  browsers-linux = { withChromium ? true }: let
+    fontconfig = makeFontsConf {
+      fontDirectories = [];
+    };
+  in
+    runCommand ("playwright-browsers"
+    + lib.optionalString withChromium "-chromium")
+  {
+    nativeBuildInputs = [
+      makeWrapper
+      jq
+    ];
+  } (''
+    BROWSERS_JSON=${driver}/package/browsers.json
+  '' + lib.optionalString withChromium ''
+    CHROMIUM_REVISION=$(jq -r '.browsers[] | select(.name == "chromium").revision' $BROWSERS_JSON)
+    mkdir -p $out/chromium-$CHROMIUM_REVISION/chrome-linux
+
+    # See here for the Chrome options:
+    # https://github.com/NixOS/nixpkgs/issues/136207#issuecomment-908637738
+    makeWrapper ${chromium}/bin/chromium $out/chromium-$CHROMIUM_REVISION/chrome-linux/chrome \
+      --set SSL_CERT_FILE /etc/ssl/certs/ca-bundle.crt \
+      --set FONTCONFIG_FILE ${fontconfig}
+  '' + ''
+    FFMPEG_REVISION=$(jq -r '.browsers[] | select(.name == "ffmpeg").revision' $BROWSERS_JSON)
+    mkdir -p $out/ffmpeg-$FFMPEG_REVISION
+    ln -s ${ffmpeg}/bin/ffmpeg $out/ffmpeg-$FFMPEG_REVISION/ffmpeg-linux
+  '');
+in
+  driver