From 394bb29f3f0f286e2249247f5568a8defd2ed679 Mon Sep 17 00:00:00 2001
From: Martin Herndl <martin.herndl@icis.com>
Date: Tue, 22 Mar 2022 09:50:46 +0100
Subject: [PATCH] fix(npm): add trailing newline when composing lockfiles
 (#14753)

---
 lib/modules/manager/npm/__snapshots__/utils.spec.ts.snap   | 3 ++-
 .../manager/npm/post-update/__snapshots__/npm.spec.ts.snap | 3 ++-
 lib/modules/manager/npm/utils.spec.ts                      | 7 +++++++
 lib/modules/manager/npm/utils.ts                           | 2 +-
 4 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/lib/modules/manager/npm/__snapshots__/utils.spec.ts.snap b/lib/modules/manager/npm/__snapshots__/utils.spec.ts.snap
index 070bcab6d4..e107e13d1f 100644
--- a/lib/modules/manager/npm/__snapshots__/utils.spec.ts.snap
+++ b/lib/modules/manager/npm/__snapshots__/utils.spec.ts.snap
@@ -13,5 +13,6 @@ exports[`modules/manager/npm/utils composeLockFile composes lockfile string out
   },
   \\"requires\\": true,
   \\"version\\": \\"1.0.0\\"
-}"
+}
+"
 `;
diff --git a/lib/modules/manager/npm/post-update/__snapshots__/npm.spec.ts.snap b/lib/modules/manager/npm/post-update/__snapshots__/npm.spec.ts.snap
index 6c274a61ef..df3d739b11 100644
--- a/lib/modules/manager/npm/post-update/__snapshots__/npm.spec.ts.snap
+++ b/lib/modules/manager/npm/post-update/__snapshots__/npm.spec.ts.snap
@@ -176,7 +176,8 @@ exports[`modules/manager/npm/post-update/npm performs lock file updates retainin
       \\"integrity\\": \\"sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==\\"
     }
   }
-}"
+}
+"
 `;
 
 exports[`modules/manager/npm/post-update/npm performs lock file updates retaining the package.json counterparts 2`] = `
diff --git a/lib/modules/manager/npm/utils.spec.ts b/lib/modules/manager/npm/utils.spec.ts
index 6b5945592f..c5c7d81336 100644
--- a/lib/modules/manager/npm/utils.spec.ts
+++ b/lib/modules/manager/npm/utils.spec.ts
@@ -53,5 +53,12 @@ describe('modules/manager/npm/utils', () => {
       const lockFileComposed = composeLockFile(lockFile, '  ');
       expect(lockFileComposed).toMatchSnapshot();
     });
+
+    it('adds trailing newline to match npms behaviour and avoid diffs', () => {
+      const lockFile = loadFixture('lockfile-parsing/package-lock.json');
+      const { detectedIndent, lockFileParsed } = parseLockFile(lockFile);
+      const lockFileComposed = composeLockFile(lockFileParsed, detectedIndent);
+      expect(lockFileComposed).toBe(lockFile);
+    });
   });
 });
diff --git a/lib/modules/manager/npm/utils.ts b/lib/modules/manager/npm/utils.ts
index 20057b30d9..55d757d475 100644
--- a/lib/modules/manager/npm/utils.ts
+++ b/lib/modules/manager/npm/utils.ts
@@ -16,5 +16,5 @@ export function parseLockFile(lockFile: string): ParseLockFileResult {
 }
 
 export function composeLockFile(lockFile: LockFile, indent: string): string {
-  return JSON.stringify(lockFile, null, indent);
+  return JSON.stringify(lockFile, null, indent) + '\n';
 }
-- 
GitLab