From a8c83970ac34a7be28f3f0ed1b4501c615972f0e Mon Sep 17 00:00:00 2001
From: Aleksandr Mezin <amezin@plesk.com>
Date: Tue, 28 Nov 2023 11:28:09 +0200
Subject: [PATCH] feat(datasource/custom): expose newDigest in result (#26007)

---
 lib/modules/datasource/custom/index.spec.ts | 30 +++++++++++++++++++++
 lib/modules/datasource/custom/readme.md     |  3 ++-
 lib/modules/datasource/custom/schema.ts     | 25 +++++++++++------
 3 files changed, 49 insertions(+), 9 deletions(-)

diff --git a/lib/modules/datasource/custom/index.spec.ts b/lib/modules/datasource/custom/index.spec.ts
index a6b57f0e7a..001e807c47 100644
--- a/lib/modules/datasource/custom/index.spec.ts
+++ b/lib/modules/datasource/custom/index.spec.ts
@@ -89,6 +89,36 @@ describe('modules/datasource/custom/index', () => {
       expect(result).toEqual(expected);
     });
 
+    it('return releases with digests for api directly exposing in renovate format', async () => {
+      const expected = {
+        releases: [
+          {
+            version: 'v1.0.0',
+            newDigest: '0123456789abcdef',
+          },
+        ],
+      };
+      const content = {
+        releases: [
+          {
+            version: 'v1.0.0',
+            digest: '0123456789abcdef',
+          },
+        ],
+      };
+      httpMock.scope('https://example.com').get('/v1').reply(200, content);
+      const result = await getPkgReleases({
+        datasource: `${CustomDatasource.id}.foo`,
+        packageName: 'myPackage',
+        customDatasources: {
+          foo: {
+            defaultRegistryUrlTemplate: 'https://example.com/v1',
+          },
+        },
+      });
+      expect(result).toEqual(expected);
+    });
+
     it('return releases for plain text API directly exposing in Renovate format', async () => {
       const expected = {
         releases: [
diff --git a/lib/modules/datasource/custom/readme.md b/lib/modules/datasource/custom/readme.md
index d23540771a..863d51800f 100644
--- a/lib/modules/datasource/custom/readme.md
+++ b/lib/modules/datasource/custom/readme.md
@@ -68,7 +68,8 @@ All available options:
       "releaseTimestamp": "2022-12-24T18:21Z",
       "changelogUrl": "https://github.com/demo-org/demo/blob/main/CHANGELOG.md#v0710",
       "sourceUrl": "https://github.com/demo-org/demo",
-      "sourceDirectory": "monorepo/folder"
+      "sourceDirectory": "monorepo/folder",
+      "digest": "c667f758f9e46e1d8111698e8d3a181c0b10f430"
     }
   ],
   "sourceUrl": "https://github.com/demo-org/demo",
diff --git a/lib/modules/datasource/custom/schema.ts b/lib/modules/datasource/custom/schema.ts
index b618f98012..532d44b5a1 100644
--- a/lib/modules/datasource/custom/schema.ts
+++ b/lib/modules/datasource/custom/schema.ts
@@ -2,14 +2,23 @@ import { z } from 'zod';
 
 export const ReleaseResultZodSchema = z.object({
   releases: z.array(
-    z.object({
-      version: z.string(),
-      isDeprecated: z.boolean().optional(),
-      releaseTimestamp: z.string().optional(),
-      sourceUrl: z.string().optional(),
-      sourceDirectory: z.string().optional(),
-      changelogUrl: z.string().optional(),
-    }),
+    z
+      .object({
+        version: z.string(),
+        isDeprecated: z.boolean().optional(),
+        releaseTimestamp: z.string().optional(),
+        sourceUrl: z.string().optional(),
+        sourceDirectory: z.string().optional(),
+        changelogUrl: z.string().optional(),
+        digest: z.string().optional(),
+      })
+      .transform((input) => {
+        return {
+          ...input,
+          newDigest: input.digest,
+          digest: undefined,
+        };
+      }),
   ),
   sourceUrl: z.string().optional(),
   sourceDirectory: z.string().optional(),
-- 
GitLab