{prev}: let xlsxTarball = "https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz"; xlsxIntegrity = "sha512-+nKZ39+nvK7Qq6i0PvWWRA4j/EkfWOtkP/YhMtupm+lJIiHxUrgTr1CcKv1nBk1rHtkRRQ3O2+Ih/q/sA+FXZA=="; patchXlsxLockfile = '' substituteInPlace pnpm-lock.yaml \ --replace-fail \ "resolution: {tarball: ${xlsxTarball}}" \ "resolution: {integrity: ${xlsxIntegrity}, tarball: ${xlsxTarball}}" ''; in prev.n8n.overrideAttrs (finalAttrs: previousAttrs: { version = "2.31.6"; src = prev.fetchFromGitHub { owner = "n8n-io"; repo = "n8n"; tag = "n8n@${finalAttrs.version}"; hash = "sha256-OTVfIHnGTaBogEd93Ak2Pu3Jh7VweQNYbUeahq1Z/64="; }; pnpmDeps = prev.fetchPnpmDeps { inherit (finalAttrs) pname version src; pnpm = prev.pnpm_10; fetcherVersion = 3; prePnpmInstall = patchXlsxLockfile; hash = "sha256-Q3HCJg1KjdRJnPZJEUKcaCrh8tBhT9B3gqMz8xbBZVg="; }; prePnpmInstall = (previousAttrs.prePnpmInstall or "") + patchXlsxLockfile; preBuild = (previousAttrs.preBuild or "") + '' if [ ! -e node_modules/sass-embedded ] && [ -e node_modules/.pnpm/node_modules/sass-embedded ]; then ln -s .pnpm/node_modules/sass-embedded node_modules/sass-embedded fi if [ ! -e node_modules/sqlite3 ] && [ -e node_modules/.pnpm/node_modules/sqlite3 ]; then ln -s .pnpm/node_modules/sqlite3 node_modules/sqlite3 fi ''; # Self-contained update script (./update.sh) — fetches latest stable # release from n8n-io/n8n, recomputes both src and pnpmDeps hashes. # The CI workflow in .gitea/workflows/nix-update.yml discovers and runs it. passthru = (previousAttrs.passthru or {}) // {updateScript = ./update.sh;}; meta = previousAttrs.meta // { changelog = "https://github.com/n8n-io/n8n/releases/tag/n8n@${finalAttrs.version}"; }; })