From 9f07a4663365918abb2bfdef95374c2675207be6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Sun, 30 Aug 2026 20:49:46 +0200 Subject: [PATCH] fix: declare pg as the runtime dependency it already was The Dockerfile asserts that the standalone image can resolve pg, because pg-boss loads it through native Node resolution. That assertion has been passing on a coincidence: pg sat in devDependencies, and the version our own entry pinned happened to match the one @prisma/adapter-pg pulled in, so both names resolved to a single copy in the store and Next's file tracer packed it whole. Bumping the adapter to 7.10.0 moves its transitive pg to 8.23.0 while ours stayed at 8.22.0. The tracer packs only the copy the adapter reaches, the top-level link points at the other one, and the image fails to build on both architectures: Error: Cannot find module '/app/node_modules/pg/lib/index.js' Move pg into dependencies at ^8.23.0. The lockfile now carries one pg version instead of two, so the two resolutions cannot drift apart again on the next adapter release. Carries the adapter bump from #865, which cannot build alone. --- Dockerfile | 11 ++++++++ package.json | 4 +-- pnpm-lock.yaml | 68 +++++++++++++++----------------------------------- 3 files changed, 33 insertions(+), 50 deletions(-) diff --git a/Dockerfile b/Dockerfile index 42284699a..810746d9c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -98,6 +98,17 @@ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static # Next's standalone output must carry the externalized worker dependencies. # Prisma's pure-JS adapter stays bundled; only modules loaded through native # Node resolution belong in this runtime assertion. +# +# `pg` is a direct entry in `dependencies` for this line's sake, and it has to +# stay there. It used to sit in devDependencies and the assertion still passed, +# but only by coincidence: the version our own entry pinned happened to match +# the one @prisma/adapter-pg pulled in, so both names resolved to a single +# copy in the store and the file tracer packed it whole. Bumping the adapter to +# 7.10.0 moved its transitive pg to 8.23.0 while ours stayed at 8.22.0. The +# tracer then packed only the copy the adapter reached, the top-level link +# pointed at the other one, and this line failed with "Cannot find module +# '/app/node_modules/pg/lib/index.js'" on both architectures. Declaring the +# runtime requirement makes the two resolve to the same copy by construction. RUN node -e "require.resolve('pg-boss'); require.resolve('pg')" # @napi-rs/canvas (document PDF rasterization): Next's file tracer copies the diff --git a/package.json b/package.json index 1663dd05c..149df3902 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "@napi-rs/canvas": "1.0.7", "@node-rs/argon2": "^2.1.0", "@parse/node-apn": "^8.1.0", - "@prisma/adapter-pg": "^7.9.1", + "@prisma/adapter-pg": "^7.10.0", "@prisma/client": "^7.8.0", "@simplewebauthn/browser": "^13.3.0", "@simplewebauthn/server": "^13.3.3", @@ -84,6 +84,7 @@ "nodemailer": "9.0.3", "otpauth": "^9.5.1", "p-limit": "^7.3.1", + "pg": "^8.23.0", "pg-boss": "^12.27.0", "prisma": "^7.8.0", "qrcode": "^1.5.4", @@ -127,7 +128,6 @@ "lefthook": "^2.1.10", "pdf-parse": "^2.4.5", "pdfjs-dist": "6.2.108", - "pg": "^8.22.0", "prettier": "^3.9.6", "prettier-plugin-tailwindcss": "^0.8.1", "shadcn": "^4.16.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bce8348aa..1e8326bb4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,8 +53,8 @@ importers: specifier: ^8.1.0 version: 8.1.0(supports-color@7.2.0) '@prisma/adapter-pg': - specifier: ^7.9.1 - version: 7.9.1 + specifier: ^7.10.0 + version: 7.10.0 '@prisma/client': specifier: ^7.8.0 version: 7.8.0(prisma@7.8.0(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(magicast@0.5.2)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@6.0.3))(typescript@6.0.3) @@ -118,6 +118,9 @@ importers: p-limit: specifier: ^7.3.1 version: 7.3.1 + pg: + specifier: ^8.23.0 + version: 8.23.0 pg-boss: specifier: ^12.27.0 version: 12.27.0 @@ -242,9 +245,6 @@ importers: pdfjs-dist: specifier: 6.2.108 version: 6.2.108 - pg: - specifier: ^8.22.0 - version: 8.22.0 prettier: specifier: ^3.9.6 version: 3.9.6 @@ -1918,8 +1918,8 @@ packages: '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} - '@prisma/adapter-pg@7.9.1': - resolution: {integrity: sha512-Ho2RK1KanQxLNSC0sR5bpiiVep10sWPLXCcxK+KXfI/Q69TMRbiafSvLPv3V9snimX72rMCqGlyJ4sBO4lKTAw==} + '@prisma/adapter-pg@7.10.0': + resolution: {integrity: sha512-N7nwSor0HO1Kz6xBv0TPAjAPysKK0fac6p4fVN3ensLOuzc/83Fgmln5k92eK/cvzqdkSR/2kkAqlbcdwVrwpw==} '@prisma/client-runtime-utils@7.8.0': resolution: {integrity: sha512-5NQZztQ0oY/ADFkmd9gPuweH5A1/CCY8YQPorLLO0Mu6a87mY5gsnDkzmFmIHs9NFaLnZojzgddFVN4RpKYrdw==} @@ -1939,20 +1939,20 @@ packages: '@prisma/config@7.8.0': resolution: {integrity: sha512-HFESzd9rx2ZQxlK+TL7tu1HPvCqrHiL6LCxYykI2c34mvaUuIVVl3lYuicJD/MNnzgPnyeBEMlK4WTomJCV5jw==} + '@prisma/debug@7.10.0': + resolution: {integrity: sha512-caygJKtltmRIgdJ3jRpkOr7yM4DW6zxo5uOmojKWFb3asnxWoRkQOwZmXBgD8FZp4htrX+nMpcWqDwzlQ1+Y4g==} + '@prisma/debug@7.2.0': resolution: {integrity: sha512-YSGTiSlBAVJPzX4ONZmMotL+ozJwQjRmZweQNIq/ER0tQJKJynNkRB3kyvt37eOfsbMCXk3gnLF6J9OJ4QWftw==} '@prisma/debug@7.8.0': resolution: {integrity: sha512-p+QZReysDUqXC+mk17q9a+Y/qzh4c2KYliDK30buYUyfrGeTGSyfmc0AIrJRhZJrLHhRiJa9Au/J72h3C+szvA==} - '@prisma/debug@7.9.1': - resolution: {integrity: sha512-/cpVZ4itxtcgB8GHBvZtcmuEjq+lWsLrRJxFMbwZrT1RIdtuKmUm7PPGo/wzfbYpBrk+9WmmBE8CHJw2rybKDQ==} - '@prisma/dev@0.24.3': resolution: {integrity: sha512-ffHlQuKXZiaDt9Go0OnCTdJZrHxK0k7omJKNV86/VjpsXu5EIHZLK0T7JSWgvNlJwh56kW9JFu9v0qJciFzepg==} - '@prisma/driver-adapter-utils@7.9.1': - resolution: {integrity: sha512-vmHehG7nn/heW32DXXpp13DxxAxVVe6n250oEt3dOL2E/4bt3olktKZN0mzSuxMMronyMSkbeW2uCOn3F4g8RQ==} + '@prisma/driver-adapter-utils@7.10.0': + resolution: {integrity: sha512-u8zkcRLlaryO652T4qavBg0HmzNW5tSKdsCn6hc1PhWAp/J6k0vrxLuUs+b9o+HcjsK7Dfa01o4OFSn0frauJA==} '@prisma/engines-version@7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a': resolution: {integrity: sha512-fJPQxCkLgA5EayWaW8eArgCvjJ+N+Kz3VyeNKMEeYiQC4alNkxRKFVAGxv/ZUzuJISKqdw+zGeDbS6mn6RCPOA==} @@ -5823,9 +5823,6 @@ packages: pg-protocol@1.13.0: resolution: {integrity: sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w==} - pg-protocol@1.15.0: - resolution: {integrity: sha512-cq9sECI5s0+uPUXjbz8ioyPJni6RzsRib0US67i5IoTZKw8fNeYlVE7u8F4dG7vEJJtc5wdD1K189lCCUwqWTQ==} - pg-protocol@1.16.0: resolution: {integrity: sha512-sILXutLVjCLjcDuOmvhX5e2Z4cS5qG/6Bu3VkpFwdf/633ElGLpEh9bgmuI5I4sqKqkifQiGyiCcx1HdtrK7tg==} @@ -5833,15 +5830,6 @@ packages: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} engines: {node: '>=4'} - pg@8.22.0: - resolution: {integrity: sha512-8wih1vVIBMxoUM2oB4soJsD9tDnDpLv4OXBJ+EJzFsvycD+lfyIreC2gGHq78f8jbLLt+bvlPTFdFZfJkOuzAA==} - engines: {node: '>= 16.0.0'} - peerDependencies: - pg-native: '>=3.0.1' - peerDependenciesMeta: - pg-native: - optional: true - pg@8.23.0: resolution: {integrity: sha512-Ip2EQCngowJLGOfCwkFhPXU7/ljlhn6Rxlmy4XYfL2Y+vyRM59+8uR2xqRWKdYmbXmxCFOAmKxBuSUCdF34qLg==} engines: {node: '>= 16.0.0'} @@ -8781,11 +8769,11 @@ snapshots: '@polka/url@1.0.0-next.29': {} - '@prisma/adapter-pg@7.9.1': + '@prisma/adapter-pg@7.10.0': dependencies: - '@prisma/driver-adapter-utils': 7.9.1 + '@prisma/driver-adapter-utils': 7.10.0 '@types/pg': 8.20.3 - pg: 8.22.0 + pg: 8.23.0 postgres-array: 3.0.4 transitivePeerDependencies: - pg-native @@ -8808,12 +8796,12 @@ snapshots: transitivePeerDependencies: - magicast + '@prisma/debug@7.10.0': {} + '@prisma/debug@7.2.0': {} '@prisma/debug@7.8.0': {} - '@prisma/debug@7.9.1': {} - '@prisma/dev@0.24.3(typescript@6.0.3)': dependencies: '@electric-sql/pglite': 0.4.1 @@ -8836,9 +8824,9 @@ snapshots: transitivePeerDependencies: - typescript - '@prisma/driver-adapter-utils@7.9.1': + '@prisma/driver-adapter-utils@7.10.0': dependencies: - '@prisma/debug': 7.9.1 + '@prisma/debug': 7.10.0 '@prisma/engines-version@7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a': {} @@ -10021,7 +10009,7 @@ snapshots: '@types/pg@8.20.3': dependencies: '@types/node': 26.1.1 - pg-protocol: 1.15.0 + pg-protocol: 1.16.0 pg-types: 2.2.0 '@types/qrcode@1.5.6': @@ -12866,18 +12854,12 @@ snapshots: pg-int8@1.0.1: {} - pg-pool@3.14.0(pg@8.22.0): - dependencies: - pg: 8.22.0 - pg-pool@3.14.0(pg@8.23.0): dependencies: pg: 8.23.0 pg-protocol@1.13.0: {} - pg-protocol@1.15.0: {} - pg-protocol@1.16.0: {} pg-types@2.2.0: @@ -12888,16 +12870,6 @@ snapshots: postgres-date: 1.0.7 postgres-interval: 1.2.0 - pg@8.22.0: - dependencies: - pg-connection-string: 2.14.0 - pg-pool: 3.14.0(pg@8.22.0) - pg-protocol: 1.15.0 - pg-types: 2.2.0 - pgpass: 1.0.5 - optionalDependencies: - pg-cloudflare: 1.4.0 - pg@8.23.0: dependencies: pg-connection-string: 2.14.0