From 7df2c9c905498ce4b31567d6f4b5688cb0e6be1b Mon Sep 17 00:00:00 2001
From: Brandon Wees <brandonwees@gmail.com>
Date: Thu, 10 Apr 2025 11:43:35 -0500
Subject: [PATCH] fix:  patch-package install in docker build and better
 postgres patch (#17523)

* always patch package when running npm i, install immich CLI outside of directory so post install doesnt run

* handles case where query is an object and defined but origin is not.

* move patch-package from a dev dependency to a normal dependency. Also copy the patches folder for the docker build to use and patch with

* fix Dockerfile

* use query.reject instead of throw for queryError

* package-lock to reflect the dev dependency change

* dont throw the error, just provide an empty string for query.origin if it does not exist

* remove npm link and demote patch-package back to a dev dependency

* modify patch to add defensive check to catch queries that will fail to parse and reject
---
 server/Dockerfile                   |  3 ++-
 server/package.json                 |  2 +-
 server/patches/postgres+3.4.5.patch | 33 ++++++++++++++++++-----------
 3 files changed, 24 insertions(+), 14 deletions(-)

diff --git a/server/Dockerfile b/server/Dockerfile
index d7126d12c6..8b611fd42d 100644
--- a/server/Dockerfile
+++ b/server/Dockerfile
@@ -4,6 +4,7 @@ FROM ghcr.io/immich-app/base-server-dev:202503251114@sha256:10e8973e8603c5729436
 RUN apt-get install --no-install-recommends -yqq tini
 WORKDIR /usr/src/app
 COPY server/package.json server/package-lock.json ./
+COPY server/patches ./patches
 RUN npm ci && \
   # exiftool-vendored.pl, sharp-linux-x64 and sharp-linux-arm64 are the only ones we need
   # they're marked as optional dependencies, so we need to copy them manually after pruning
@@ -56,7 +57,7 @@ COPY server/resources resources
 COPY server/package.json server/package-lock.json ./
 COPY server/start*.sh ./
 COPY "docker/scripts/get-cpus.sh" ./
-RUN npm link && npm install -g @immich/cli && npm cache clean --force
+RUN npm install -g @immich/cli && npm cache clean --force
 COPY LICENSE /licenses/LICENSE.txt
 COPY LICENSE /LICENSE
 ENV PATH="${PATH}:/usr/src/app/bin"
diff --git a/server/package.json b/server/package.json
index 257258234c..f96f3a69a0 100644
--- a/server/package.json
+++ b/server/package.json
@@ -33,7 +33,7 @@
     "sync:open-api": "node ./dist/bin/sync-open-api.js",
     "sync:sql": "node ./dist/bin/sync-sql.js",
     "email:dev": "email dev -p 3050 --dir src/emails",
-    "postinstall": "[ \"$npm_config_global\" != \"true\" ] && patch-package || true"
+    "postinstall": "patch-package"
   },
   "dependencies": {
     "@nestjs/bullmq": "^11.0.1",
diff --git a/server/patches/postgres+3.4.5.patch b/server/patches/postgres+3.4.5.patch
index d879416978..019ef9df78 100644
--- a/server/patches/postgres+3.4.5.patch
+++ b/server/patches/postgres+3.4.5.patch
@@ -1,39 +1,48 @@
 diff --git a/node_modules/postgres/cf/src/connection.js b/node_modules/postgres/cf/src/connection.js
-index ee8b1e6..d03b9dd 100644
+index ee8b1e6..acf4566 100644
 --- a/node_modules/postgres/cf/src/connection.js
 +++ b/node_modules/postgres/cf/src/connection.js
-@@ -387,6 +387,8 @@ function Connection(options, queues = {}, { onopen = noop, onend = noop, onclose
+@@ -387,8 +387,10 @@ function Connection(options, queues = {}, { onopen = noop, onend = noop, onclose
    }
  
    function queryError(query, err) {
-+    if (!query || typeof query !== 'object') throw err
++    if (!query || typeof query !== 'object' || !query.reject) throw err
 +
      'query' in err || 'parameters' in err || Object.defineProperties(err, {
-       stack: { value: err.stack + query.origin.replace(/.*\n/, '\n'), enumerable: options.debug },
+-      stack: { value: err.stack + query.origin.replace(/.*\n/, '\n'), enumerable: options.debug },
++      stack: { value: err.stack + (query.origin || '').replace(/.*\n/, '\n'), enumerable: options.debug },
        query: { value: query.string, enumerable: options.debug },
+       parameters: { value: query.parameters, enumerable: options.debug },
+       args: { value: query.args, enumerable: options.debug },
 diff --git a/node_modules/postgres/cjs/src/connection.js b/node_modules/postgres/cjs/src/connection.js
-index f7f58d1..8a37571 100644
+index f7f58d1..b7f2d65 100644
 --- a/node_modules/postgres/cjs/src/connection.js
 +++ b/node_modules/postgres/cjs/src/connection.js
-@@ -385,6 +385,8 @@ function Connection(options, queues = {}, { onopen = noop, onend = noop, onclose
+@@ -385,8 +385,10 @@ function Connection(options, queues = {}, { onopen = noop, onend = noop, onclose
    }
  
    function queryError(query, err) {
-+    if (!query || typeof query !== 'object') throw err
++    if (!query || typeof query !== 'object' || !query.reject) throw err
 +
      'query' in err || 'parameters' in err || Object.defineProperties(err, {
-       stack: { value: err.stack + query.origin.replace(/.*\n/, '\n'), enumerable: options.debug },
+-      stack: { value: err.stack + query.origin.replace(/.*\n/, '\n'), enumerable: options.debug },
++      stack: { value: err.stack + (query.origin || '').replace(/.*\n/, '\n'), enumerable: options.debug },
        query: { value: query.string, enumerable: options.debug },
+       parameters: { value: query.parameters, enumerable: options.debug },
+       args: { value: query.args, enumerable: options.debug },
 diff --git a/node_modules/postgres/src/connection.js b/node_modules/postgres/src/connection.js
-index 97cc97e..58f5298 100644
+index 97cc97e..26f508e 100644
 --- a/node_modules/postgres/src/connection.js
 +++ b/node_modules/postgres/src/connection.js
-@@ -385,6 +385,8 @@ function Connection(options, queues = {}, { onopen = noop, onend = noop, onclose
+@@ -385,8 +385,10 @@ function Connection(options, queues = {}, { onopen = noop, onend = noop, onclose
    }
  
    function queryError(query, err) {
-+    if (!query || typeof query !== 'object') throw err
++    if (!query || typeof query !== 'object' || !query.reject) throw err
 +
      'query' in err || 'parameters' in err || Object.defineProperties(err, {
-       stack: { value: err.stack + query.origin.replace(/.*\n/, '\n'), enumerable: options.debug },
+-      stack: { value: err.stack + query.origin.replace(/.*\n/, '\n'), enumerable: options.debug },
++      stack: { value: err.stack + (query.origin || '').replace(/.*\n/, '\n'), enumerable: options.debug },
        query: { value: query.string, enumerable: options.debug },
+       parameters: { value: query.parameters, enumerable: options.debug },
+       args: { value: query.args, enumerable: options.debug },