From 1405689cf87869371b8b51b43d2edf962e0ff518 Mon Sep 17 00:00:00 2001
From: RahulGautamSingh <rahultesnik@gmail.com>
Date: Thu, 26 Sep 2024 00:54:54 +0530
Subject: [PATCH] fix(datasource/custom): better logging for jsonata errors
 (#31520)

---
 lib/modules/datasource/custom/index.spec.ts | 26 +++++++++++++++++++++
 lib/modules/datasource/custom/index.ts      | 12 ++++++++--
 2 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/lib/modules/datasource/custom/index.spec.ts b/lib/modules/datasource/custom/index.spec.ts
index 2d997c6b30..2eb0f46212 100644
--- a/lib/modules/datasource/custom/index.spec.ts
+++ b/lib/modules/datasource/custom/index.spec.ts
@@ -3,6 +3,7 @@ import { getPkgReleases } from '..';
 import { Fixtures } from '../../../../test/fixtures';
 import * as httpMock from '../../../../test/http-mock';
 import { fs } from '../../../../test/util';
+import { logger } from '../../../logger';
 import { CustomDatasource } from './index';
 
 jest.mock('../../../util/fs');
@@ -228,6 +229,31 @@ describe('modules/datasource/custom/index', () => {
       expect(result).toEqual(expected);
     });
 
+    it('returns null if transformation using jsonata rules fail', async () => {
+      httpMock
+        .scope('https://example.com')
+        .get('/v1')
+        .reply(200, '1.0.0 \n2.0.0 \n 3.0.0 ', {
+          'Content-Type': 'text/plain',
+        });
+      const result = await getPkgReleases({
+        datasource: `${CustomDatasource.id}.foo`,
+        packageName: 'myPackage',
+        customDatasources: {
+          foo: {
+            defaultRegistryUrlTemplate: 'https://example.com/v1',
+            transformTemplates: ['$[.name = "Alice" and'],
+            format: 'plain',
+          },
+        },
+      });
+      expect(result).toBeNull();
+      expect(logger.debug).toHaveBeenCalledWith(
+        { err: expect.any(Object), transformTemplate: '$[.name = "Alice" and' },
+        'Error while transforming response',
+      );
+    });
+
     it('return releases for plain text API when only returns a single version', async () => {
       const expected = {
         releases: [
diff --git a/lib/modules/datasource/custom/index.ts b/lib/modules/datasource/custom/index.ts
index d230e14179..0ecdc11bc8 100644
--- a/lib/modules/datasource/custom/index.ts
+++ b/lib/modules/datasource/custom/index.ts
@@ -46,8 +46,16 @@ export class CustomDatasource extends Datasource {
     logger.trace({ data }, `Custom manager fetcher '${format}' returned data.`);
 
     for (const transformTemplate of transformTemplates) {
-      const expression = jsonata(transformTemplate);
-      data = await expression.evaluate(data);
+      try {
+        const expression = jsonata(transformTemplate);
+        data = await expression.evaluate(data);
+      } catch (err) {
+        logger.debug(
+          { err, transformTemplate },
+          'Error while transforming response',
+        );
+        return null;
+      }
     }
 
     try {
-- 
GitLab