From 4cfb6b296bdd980375e0c180a9f580e495b51e2a Mon Sep 17 00:00:00 2001
From: Sergei Zharinov <zharinov@users.noreply.github.com>
Date: Fri, 24 Jan 2025 08:30:56 -0300
Subject: [PATCH] fix(bitrise): Streamline Zod schema (#33769)

---
 lib/modules/manager/bitrise/extract.ts | 28 ++++------------------
 lib/modules/manager/bitrise/schema.ts  | 33 ++++++++++++++++++--------
 2 files changed, 27 insertions(+), 34 deletions(-)

diff --git a/lib/modules/manager/bitrise/extract.ts b/lib/modules/manager/bitrise/extract.ts
index 8bc593e922..c006740cf3 100644
--- a/lib/modules/manager/bitrise/extract.ts
+++ b/lib/modules/manager/bitrise/extract.ts
@@ -1,35 +1,15 @@
-import is from '@sindresorhus/is';
 import { logger } from '../../../logger';
-import { parseSingleYaml } from '../../../util/yaml';
-import type { PackageDependency, PackageFileContent } from '../types';
+import type { PackageFileContent } from '../types';
 import { BitriseFile } from './schema';
-import { parseStep } from './utils';
 
 export function extractPackageFile(
   content: string,
   packageFile: string,
 ): PackageFileContent | null {
-  const deps: PackageDependency[] = [];
-
-  try {
-    const parsed = parseSingleYaml(content, {
-      customSchema: BitriseFile,
-    });
-
-    const workflows = Object.values(parsed.workflows);
-    for (const workflow of workflows) {
-      const steps = workflow.steps.flatMap((step) => Object.keys(step));
-      for (const step of steps) {
-        const dep = parseStep(step, parsed.default_step_lib_source);
-
-        if (!is.nullOrUndefined(dep)) {
-          deps.push(dep);
-        }
-      }
-    }
-  } catch (err) {
+  const deps = BitriseFile.catch(({ error: err }) => {
     logger.debug({ err, packageFile }, `Failed to parse Bitrise YAML config`);
-  }
+    return [];
+  }).parse(content);
 
   if (!deps.length) {
     return null;
diff --git a/lib/modules/manager/bitrise/schema.ts b/lib/modules/manager/bitrise/schema.ts
index f32030d93d..02c1d037a2 100644
--- a/lib/modules/manager/bitrise/schema.ts
+++ b/lib/modules/manager/bitrise/schema.ts
@@ -1,12 +1,25 @@
 import { z } from 'zod';
+import { filterMap } from '../../../util/filter-map';
+import { Yaml } from '../../../util/schema-utils';
+import { parseStep } from './utils';
 
-export const BitriseStep = z.record(z.string(), z.unknown());
-
-export const BitriseWorkflow = z.object({
-  steps: z.array(BitriseStep),
-});
-
-export const BitriseFile = z.object({
-  default_step_lib_source: z.string().optional(),
-  workflows: z.record(z.string(), BitriseWorkflow),
-});
+export const BitriseFile = Yaml.pipe(
+  z
+    .object({
+      default_step_lib_source: z.string().optional(),
+      workflows: z
+        .record(
+          z
+            .object({
+              steps: z
+                .array(z.record(z.unknown()).transform((x) => Object.keys(x)))
+                .transform((steps) => steps.flat()),
+            })
+            .transform(({ steps }) => steps),
+        )
+        .transform((x) => Object.values(x).flat()),
+    })
+    .transform(({ default_step_lib_source: defaultRegistry, workflows }) =>
+      filterMap(workflows, (workflow) => parseStep(workflow, defaultRegistry)),
+    ),
+);
-- 
GitLab