18 inherit (stdenv.hostPlatform) system;
20 throwSystem = throw "Unsupported system: ${system}";
23 x86_64-linux = "linux";
24 aarch64-linux = "linux-arm64";
25 x86_64-darwin = "mac";
26 aarch64-darwin = "mac-arm64";
28 .${system} or throwSystem;
32 src = fetchFromGitHub {
36 hash = "sha256-cKjVDy1wFo8NlF8v+8YBuQUF2OUYjCmv27uhEoVUrno=";
39 babel-bundle = buildNpmPackage {
40 pname = "babel-bundle";
42 sourceRoot = "${src.name}/packages/playwright/bundles/babel";
43 npmDepsHash = "sha256-HrDTkP2lHl2XKD8aGpmnf6YtSe/w9UePH5W9QfbaoMg=";
49 expect-bundle = buildNpmPackage {
50 pname = "expect-bundle";
52 sourceRoot = "${src.name}/packages/playwright/bundles/expect";
53 npmDepsHash = "sha256-qnFx/AQZtmxNFrrabfOpsWy6I64DFJf3sWrJzL1wfU4=";
59 utils-bundle = buildNpmPackage {
60 pname = "utils-bundle";
62 sourceRoot = "${src.name}/packages/playwright/bundles/utils";
63 npmDepsHash = "sha256-d+nE11x/493BexI70mVbnZFLQClU88sscbNwruXjx1M=";
69 utils-bundle-core = buildNpmPackage {
70 pname = "utils-bundle-core";
72 sourceRoot = "${src.name}/packages/playwright-core/bundles/utils";
73 npmDepsHash = "sha256-aktxEDQKxsDcInyjDKDuIu4zwtrAH0lRda/mP1IayPA=";
79 zip-bundle = buildNpmPackage {
82 sourceRoot = "${src.name}/packages/playwright-core/bundles/zip";
83 npmDepsHash = "sha256-62Apz8uX6d4HKDqQxR6w5Vs31tl63McWGPwT6s2YsBE=";
90 playwright = buildNpmPackage {
94 sourceRoot = "${src.name}"; # update.sh depends on sourceRoot presence
95 npmDepsHash = "sha256-FaDTJmIiaaOCvq6tARfiWX5IBTTNOJ/iVkRsO4D8aqc=";
97 nativeBuildInputs = [ cacert ];
99 ELECTRON_SKIP_BINARY_DOWNLOAD = true;
102 sed -i '/\/\/ Update test runner./,/^\s*$/{d}' utils/build/build.js
103 sed -i '/\/\/ Update bundles./,/^\s*$/{d}' utils/build/build.js
104 sed -i '/execSync/d' ./utils/generate_third_party_notice.js
105 sed -i '/plugins: /d' ./packages/playwright/bundles/utils/build.js
106 sed -i '/plugins: /d' ./packages/playwright-core/bundles/zip/build.js
107 chmod +w packages/playwright/bundles/babel
108 ln -s ${babel-bundle}/node_modules packages/playwright/bundles/babel/node_modules
109 chmod +w packages/playwright/bundles/expect
110 ln -s ${expect-bundle}/node_modules packages/playwright/bundles/expect/node_modules
111 chmod +w packages/playwright/bundles/utils
112 ln -s ${utils-bundle}/node_modules packages/playwright/bundles/utils/node_modules
113 chmod +w packages/playwright-core/bundles/utils
114 ln -s ${utils-bundle-core}/node_modules packages/playwright-core/bundles/utils/node_modules
115 chmod +w packages/playwright-core/bundles/zip
116 ln -s ${zip-bundle}/node_modules packages/playwright-core/bundles/zip/node_modules
125 cp -r packages/playwright/node_modules "$out/lib/node_modules"
127 mkdir -p "$out/lib/node_modules/playwright"
128 cp -r packages/playwright/!(bundles|src|node_modules|.*) "$out/lib/node_modules/playwright"
130 mkdir -p "$out/lib/node_modules/playwright-core"
131 cp -r packages/playwright-core/!(bundles|src|bin|.*) "$out/lib/node_modules/playwright-core"
133 mkdir -p "$out/lib/node_modules/@playwright/test"
134 cp -r packages/playwright-test/* "$out/lib/node_modules/@playwright/test"
140 description = "Framework for Web Testing and Automation";
141 homepage = "https://playwright.dev";
142 license = lib.licenses.asl20;
143 maintainers = with lib.maintainers; [ kalekseev ];
144 inherit (nodejs.meta) platforms;
148 playwright-core = stdenv.mkDerivation (finalAttrs: {
149 pname = "playwright-core";
150 inherit (playwright) version src meta;
155 cp -r ${playwright}/lib/node_modules/playwright-core "$out"
161 browsersJSON = (lib.importJSON ./browsers.json).browsers;
164 x86_64-linux = browsers-linux { };
165 aarch64-linux = browsers-linux { };
166 x86_64-darwin = browsers-mac;
167 aarch64-darwin = browsers-mac;
169 .${system} or throwSystem;
170 browsers-chromium = browsers-linux { };
174 playwright-test = stdenv.mkDerivation (finalAttrs: {
175 pname = "playwright-test";
176 inherit (playwright) version src;
178 nativeBuildInputs = [ makeWrapper ];
184 cp -r ${playwright}/* $out
186 makeWrapper "${nodejs}/bin/node" "$out/bin/playwright" \
187 --add-flags "$out/lib/node_modules/@playwright/test/cli.js" \
188 --prefix NODE_PATH : ${placeholder "out"}/lib/node_modules \
189 --set-default PLAYWRIGHT_BROWSERS_PATH "${playwright-core.passthru.browsers}"
194 meta = playwright.meta // {
195 mainProgram = "playwright";
199 browsers-mac = stdenv.mkDerivation {
200 pname = "playwright-browsers";
201 inherit (playwright) version;
205 nativeBuildInputs = [ cacert ];
210 export PLAYWRIGHT_BROWSERS_PATH=$out
211 ${playwright-core}/cli.js install
217 meta.platforms = lib.platforms.darwin;
220 browsers-linux = lib.makeOverridable (
226 fontconfig_file ? makeFontsConf {
227 fontDirectories = [ ];
232 lib.optionals withChromium [ "chromium" ]
233 ++ lib.optionals withFirefox [ "firefox" ]
234 ++ lib.optionals withWebkit [ "webkit" ]
235 ++ lib.optionals withFfmpeg [ "ffmpeg" ];
237 linkFarm "playwright-browsers" (
242 value = playwright-core.passthru.browsersJSON.${name};
245 # TODO check platform for revisionOverrides
246 "${name}-${value.revision}"
248 callPackage (./. + "/${name}.nix") (
250 inherit suffix system throwSystem;
251 inherit (value) revision;
253 // lib.optionalAttrs (name == "chromium") {
254 inherit fontconfig_file;
264 playwright-core = playwright-core;
265 playwright-test = playwright-test;