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