diff --git a/pkgs/by-name/pr/prisma-engines_7/package.nix b/pkgs/by-name/pr/prisma-engines_7/package.nix new file mode 100644 index 000000000000..38fb086cc11f --- /dev/null +++ b/pkgs/by-name/pr/prisma-engines_7/package.nix @@ -0,0 +1,81 @@ +{ + fetchFromGitHub, + lib, + openssl, + pkg-config, + protobuf, + rustPlatform, +}: + +# Updating this package will force an update for prisma. The +# version of prisma-engines and prisma must be the same for them to +# function correctly. +rustPlatform.buildRustPackage rec { + pname = "prisma-engines_7"; + version = "7.0.1"; + + src = fetchFromGitHub { + owner = "prisma"; + repo = "prisma-engines"; + rev = version; + hash = "sha256-+8k+M2+WySR2CeywYlhU/jd3av/4UeUoEOlO/qHUk5o="; + }; + + cargoHash = "sha256-n83hJfSlvuaoBb3w9Rk8+q2emjGCoPDHhFdoVzhf4sM="; + + # Use system openssl. + OPENSSL_NO_VENDOR = 1; + + nativeBuildInputs = [ pkg-config ]; + + buildInputs = [ openssl ]; + + preBuild = '' + export OPENSSL_DIR=${lib.getDev openssl} + export OPENSSL_LIB_DIR=${lib.getLib openssl}/lib + + export PROTOC=${protobuf}/bin/protoc + export PROTOC_INCLUDE="${protobuf}/include"; + + export SQLITE_MAX_VARIABLE_NUMBER=250000 + export SQLITE_MAX_EXPR_DEPTH=10000 + + export GIT_HASH=0000000000000000000000000000000000000000 + ''; + + cargoBuildFlags = [ + "-p" + "schema-engine-cli" + "-p" + "prisma-fmt" + ]; + + # Tests are long to compile + doCheck = false; + + setupHook = ./setup-hook.sh; + + meta = with lib; { + description = "Collection of engines that power the core stack for Prisma"; + homepage = "https://www.prisma.io/"; + license = licenses.asl20; + platforms = platforms.unix; + mainProgram = "prisma"; + maintainers = with maintainers; [ + tomhoule + aqrln + ]; + }; +} + +### Troubleshooting +# Here's an example application using Prisma with Nix: https://github.com/pimeys/nix-prisma-example +# At example's `flake.nix` shellHook, notice the requirement of defining environment variables for prisma, it's values will show on `prisma --version`. +# Read the example's README: https://github.com/pimeys/nix-prisma-example/blob/main/README.md +# Prisma requires 2 packages, `prisma-engines` and `prisma`, to be at *exact* same versions. +# Certify at `package.json` that dependencies "@prisma/client" and "prisma" are equal, meaning no caret (`^`) in version. +# Configure NPM to use exact version: `npm config set save-exact=true` +# Delete `package-lock.json`, delete `node_modules` directory and run `npm install`. +# Run prisma client from `node_modules/.bin/prisma`. +# Run `./node_modules/.bin/prisma --version` and check if both prisma packages versions are equal, current platform is `linux-nixos`, and other keys equal to the prisma environment variables you defined for prisma. +# Test prisma with `generate`, `db push`, etc. It should work. If not, open an issue. diff --git a/pkgs/by-name/pr/prisma-engines_7/setup-hook.sh b/pkgs/by-name/pr/prisma-engines_7/setup-hook.sh new file mode 100644 index 000000000000..719845167aed --- /dev/null +++ b/pkgs/by-name/pr/prisma-engines_7/setup-hook.sh @@ -0,0 +1,2 @@ +export PRISMA_SCHEMA_ENGINE_BINARY="@out@/bin/schema-engine" +export PRISMA_FMT_BINARY="@out@/bin/prisma-fmt" diff --git a/pkgs/by-name/pr/prisma_7/package.nix b/pkgs/by-name/pr/prisma_7/package.nix new file mode 100644 index 000000000000..cba055289a22 --- /dev/null +++ b/pkgs/by-name/pr/prisma_7/package.nix @@ -0,0 +1,108 @@ +{ + lib, + fetchFromGitHub, + stdenv, + nodejs, + pnpm_10, + prisma-engines_7, + jq, + makeWrapper, + moreutils, + callPackage, + pnpmConfigHook, + fetchPnpmDeps, +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "prisma_7"; + version = "7.0.1"; + + src = fetchFromGitHub { + owner = "prisma"; + repo = "prisma"; + rev = finalAttrs.version; + hash = "sha256-bmmthEFMBMJAracWUCU/6Nyic05JglP5t1VAWPVKFnU="; + }; + + nativeBuildInputs = [ + nodejs + pnpmConfigHook + jq + makeWrapper + moreutils + pnpm_10 + ]; + + pnpmDeps = fetchPnpmDeps { + inherit (finalAttrs) pname version src; + fetcherVersion = 1; + hash = "sha256-sJmlMF8nay4/3LTHEWzBWaS8Xq91JRZlzKBfeMnJEMM="; + }; + + patchPhase = '' + runHook prePatch + + for package in packages/*; do + jq --arg version $version '.version = $version' $package/package.json | sponge $package/package.json + done + + runHook postPatch + ''; + + buildPhase = '' + runHook preBuild + + pnpm build + + runHook postBuild + ''; + + # FIXME: Use pnpm deploy: https://github.com/pnpm/pnpm/issues/5315 + installPhase = '' + runHook preInstall + + mkdir -p $out/lib/prisma + + # Fetch CLI workspace dependencies + deps_json=$(pnpm list --filter ./packages/cli --prod --depth Infinity --json) + deps=$(jq -r '[.. | strings | select(startswith("link:../")) | sub("^link:../"; "")] | unique[]' <<< "$deps_json") + + # Remove unnecessary external dependencies + find . -name node_modules -type d -prune -exec rm -rf {} + + pnpm install --offline --ignore-scripts --frozen-lockfile --prod + cp -r node_modules $out/lib/prisma + + # Only install cli and its workspace dependencies + for package in cli $deps; do + filename=$(npm pack --json ./packages/$package | jq -r '.[].filename') + mkdir -p $out/lib/prisma/packages/$package + [ -d "packages/$package/node_modules" ] && \ + cp -r packages/$package/node_modules $out/lib/prisma/packages/$package + tar xf $filename --strip-components=1 -C $out/lib/prisma/packages/$package + done + + # Remove dangling symlinks to packages we didn't copy to $out + find $out/lib/prisma/node_modules/.pnpm/node_modules -type l -exec test ! -e {} \; -delete + + makeWrapper "${lib.getExe nodejs}" "$out/bin/prisma" \ + --add-flags "$out/lib/prisma/packages/cli/build/index.js" \ + --set PRISMA_SCHEMA_ENGINE_BINARY ${prisma-engines_7}/bin/schema-engine + + runHook postInstall + ''; + + dontStrip = true; + + passthru.tests = { + cli = callPackage ./test-cli.nix { }; + }; + + meta = with lib; { + description = "Next-generation ORM for Node.js and TypeScript"; + homepage = "https://www.prisma.io/"; + license = licenses.asl20; + maintainers = with maintainers; [ aqrln ]; + mainProgram = "prisma"; + platforms = platforms.unix; + }; +}) diff --git a/pkgs/by-name/pr/prisma_7/test-cli.nix b/pkgs/by-name/pr/prisma_7/test-cli.nix new file mode 100644 index 000000000000..c2a17e29aa8f --- /dev/null +++ b/pkgs/by-name/pr/prisma_7/test-cli.nix @@ -0,0 +1,83 @@ +{ + lib, + runCommand, + prisma_7, + prisma-engines_7, + sqlite-interactive, + openssl, +}: + +let + prismaMajorVersion = lib.versions.majorMinor prisma_7.version; + enginesMajorVersion = lib.versions.majorMinor prisma-engines_7.version; +in +runCommand "prisma-cli-tests" + { + nativeBuildInputs = [ + prisma_7 + sqlite-interactive + openssl + ]; + meta.timeout = 60; + } + '' + mkdir $out + cd $out + + # Set HOME to a writable directory (Nix sandbox sets it to /homeless-shelter) + export HOME=$TMPDIR + + if [ "${prismaMajorVersion}" != "${enginesMajorVersion}" ]; then + echo "prisma in version ${prismaMajorVersion} and prisma-engines in ${enginesMajorVersion}. Major versions must match." + exit 1 + fi + + # Ensure CLI runs + prisma --help > /dev/null + + # Create project structure manually (prisma init requires network access) + mkdir -p prisma node_modules + + # The config file needs to be able to import from 'prisma/config' + # so we symlink the prisma package into node_modules + ln -s ${prisma_7}/lib/prisma/packages/cli node_modules/prisma + + cat << 'EOF' > prisma.config.ts + import { defineConfig } from 'prisma/config' + + export default defineConfig({ + schema: 'prisma/schema.prisma', + datasource: { + url: 'file:prisma/test.db', + }, + }) + EOF + + # Create a simple data model + cat << 'EOF' > prisma/schema.prisma + datasource db { + provider = "sqlite" + } + + generator client { + provider = "prisma-client" + } + + model A { + id Int @id @default(autoincrement()) + b String @default("foo") + } + EOF + + # Format + prisma format > /dev/null + + # Create the database + prisma db push > /dev/null + + # The database file should exist and be a SQLite database + sqlite3 prisma/test.db "SELECT id, b FROM A" > /dev/null + + # Introspect the database + prisma db pull > /dev/null + '' diff --git a/pkgs/development/node-packages/aliases.nix b/pkgs/development/node-packages/aliases.nix index cc1b6a5f78f8..888896191fef 100644 --- a/pkgs/development/node-packages/aliases.nix +++ b/pkgs/development/node-packages/aliases.nix @@ -287,7 +287,7 @@ mapAliases { inherit (pkgs) prettier; # added 2025-05-31 prettier_d_slim = pkgs.prettier-d-slim; # added 2023-09-14 prettier-plugin-toml = throw "prettier-plugin-toml was removed because it provides no executable"; # added 2025-03-23 - inherit (pkgs) prisma_6; # added 2024-08-31 + inherit (pkgs) prisma; # added 2024-08-31 pscid = throw "'pscid' has been removed because it was unmaintained upstream"; # Added 2025-12-07 pulp = throw "'pulp' has been removed because it was unmaintained upstream"; # Added 2025-12-07 purescript-language-server = throw "'purescript-language-server' has been removed because it was unmaintained within nixpkgs"; # Added 2025-12-12 diff --git a/pkgs/top-level/aliases.nix b/pkgs/top-level/aliases.nix index fc37515607cb..404b9fa505b2 100644 --- a/pkgs/top-level/aliases.nix +++ b/pkgs/top-level/aliases.nix @@ -1331,6 +1331,8 @@ mapAliases { preload = throw "'preload' has been removed due to lack of usage and being broken since its introduction into nixpkgs"; # Added 2025-11-29 presage = throw "presage has been removed, as it has been unmaintained since 2018"; # Added 2025-06-19 preserves-nim = throw "'preserves-nim' has been removed due to a hostile upstream moving tags and breaking src FODs"; # Added 2025-09-01 + prisma = prisma_7; # Added 2025-12-19 + prisma-engines = prisma-engines_7; # Added 2025-12-19 private-gpt = throw "'private-gpt' has been removed from nixpkgs, as it was broken and unmaintained"; # Added 2025-07-28 probe-rs = throw "'probe-rs' has been renamed to/replaced by 'probe-rs-tools'"; # Converted to throw 2025-10-27 proj_7 = throw "proj_7 has been removed, as it was broken and unused"; # Added 2025-09-16