about summary refs log tree commit diff
path: root/pkgs/by-name/wr/wrangler/package.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/by-name/wr/wrangler/package.nix')
-rw-r--r--pkgs/by-name/wr/wrangler/package.nix98
1 files changed, 98 insertions, 0 deletions
diff --git a/pkgs/by-name/wr/wrangler/package.nix b/pkgs/by-name/wr/wrangler/package.nix
new file mode 100644
index 0000000000000..0390312f70dfc
--- /dev/null
+++ b/pkgs/by-name/wr/wrangler/package.nix
@@ -0,0 +1,98 @@
+{
+  lib,
+  stdenv,
+  fetchFromGitHub,
+  makeWrapper,
+  nodejs,
+  pnpm_9,
+  autoPatchelfHook,
+  cacert,
+  llvmPackages,
+  musl,
+  xorg,
+}:
+stdenv.mkDerivation (finalAttrs: {
+  pname = "wrangler";
+  version = "3.66.0";
+
+  src = fetchFromGitHub {
+    owner = "cloudflare";
+    repo = "workers-sdk";
+    rev = "wrangler@${finalAttrs.version}";
+    hash = "sha256-YY+wp9rmXDWeSvdMC6FQyuDf8XP3GhHeHuFe9q0uNng=";
+  };
+
+  pnpmDeps = pnpm_9.fetchDeps {
+    inherit (finalAttrs) pname version src;
+    hash = "sha256-BjSpgkDYafnDb0SBdL3B6IYWT4EOqCAxdDm+Ev6QIgw=";
+  };
+
+  buildInputs = [
+    llvmPackages.libcxx
+    llvmPackages.libunwind
+    musl
+    xorg.libX11
+  ];
+
+  nativeBuildInputs = [
+    autoPatchelfHook
+    makeWrapper
+    nodejs
+    pnpm_9.configHook
+  ];
+
+  # @cloudflare/vitest-pool-workers wanted to run a server as part of the build process
+  # so I simply removed it
+  postBuild = ''
+    rm -fr packages/vitest-pool-workers
+    NODE_ENV="production" pnpm --filter miniflare run build
+    NODE_ENV="production" pnpm --filter wrangler run build
+  '';
+
+  # I'm sure this is suboptimal but it seems to work. Points:
+  # - when build is run in the original repo, no specific executable seems to be generated; you run the resulting build with pnpm run start
+  # - this means we need to add a dedicated script - perhaps it is possible to create this from the workers-sdk dir, but I don't know how to do this
+  # - the build process builds a version of miniflare which is used by wrangler; for this reason, the miniflare package is copied also
+  # - pnpm stores all content in the top-level node_modules directory, but it is linked to from a node_modules directory inside wrangler
+  # - as they are linked via symlinks, the relative location of them on the filesystem should be maintained
+  installPhase = ''
+    runHook preInstall
+    mkdir -p $out/bin $out/lib $out/lib/packages/wrangler
+    rm -rf node_modules/typescript node_modules/eslint node_modules/prettier node_modules/bin node_modules/.bin node_modules/**/bin node_modules/**/.bin
+    cp -r node_modules $out/lib
+    cp -r packages/miniflare $out/lib/packages
+    cp -r packages/workers-tsconfig $out/lib/packages
+    cp -r packages/wrangler/node_modules $out/lib/packages/wrangler
+    cp -r packages/wrangler/templates $out/lib/packages/wrangler
+    cp -r packages/wrangler/wrangler-dist $out/lib/packages/wrangler
+    rm -rf $out/lib/**/bin $out/lib/**/.bin
+    cp -r packages/wrangler/bin $out/lib/packages/wrangler
+    NODE_PATH_ARRAY=( "$out/lib/node_modules" "$out/lib/packages/wrangler/node_modules" )
+    makeWrapper ${lib.getExe nodejs} $out/bin/wrangler \
+      --inherit-argv0 \
+      --prefix-each NODE_PATH : "$${NODE_PATH_ARRAY[@]}" \
+      --add-flags $out/lib/packages/wrangler/bin/wrangler.js \
+      --set-default SSL_CERT_FILE "${cacert}/etc/ssl/certs/ca-bundle.crt" # https://github.com/cloudflare/workers-sdk/issues/3264
+    runHook postInstall
+  '';
+
+  meta = {
+    description = "Command-line interface for all things Cloudflare Workers";
+    homepage = "https://github.com/cloudflare/workers-sdk#readme";
+    license = with lib.licenses; [
+      mit
+      apsl20
+    ];
+    maintainers = with lib.maintainers; [
+      seanrmurphy
+      dezren39
+      ryand56
+    ];
+    mainProgram = "wrangler";
+    # cpp is required for building workerd.
+    # workerd is used for some wrangler subcommands.
+    # non-linux platforms may experience errors
+    # on certain subcommands due to this issue.
+    platforms = [ "x86_64-linux" ];
+  };
+})