From d8f2826387036b32950361c6524b89b6a940acd3 Mon Sep 17 00:00:00 2001 From: Steven Davidovitz Date: Wed, 9 Oct 2024 12:07:47 -0700 Subject: [PATCH] fix(circleci): update schema to support self-referential orb type --- lib/modules/manager/circleci/extract.ts | 16 ++++++---------- lib/modules/manager/circleci/schema.ts | 22 +++++++++++++++++++--- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/lib/modules/manager/circleci/extract.ts b/lib/modules/manager/circleci/extract.ts index 624e994e29ec098..47abfedac1a8edd 100644 --- a/lib/modules/manager/circleci/extract.ts +++ b/lib/modules/manager/circleci/extract.ts @@ -7,14 +7,13 @@ import { getDep } from '../dockerfile/extract'; import type { PackageDependency, PackageFileContent } from '../types'; import { CircleCiFile, - type CircleCiJob, - CircleCiOrb, - type CircleCiFile as File, - type CircleCiOrb as Orb, + type CircleCiFile as CircleCiFileType, + type CircleCiJob as CircleCiJobType, + type CircleCiOrb as CircleCiOrbType, } from './schema'; function extractDefinition( - definition: Orb | File, + definition: CircleCiOrbType | CircleCiFileType, packageFile?: string, ): PackageDependency[] { const deps: PackageDependency[] = []; @@ -33,15 +32,12 @@ function extractDefinition( datasource: OrbDatasource.id, }); } else { - const parsed = CircleCiOrb.parse(orb); - if (parsed) { - deps.push(...extractDefinition(parsed)); - } + deps.push(...extractDefinition(orb)); } } // extract environments - const environments: CircleCiJob[] = [ + const environments: CircleCiJobType[] = [ Object.values(definition.executors ?? {}), Object.values(definition.jobs ?? {}), ].flat(); diff --git a/lib/modules/manager/circleci/schema.ts b/lib/modules/manager/circleci/schema.ts index d708598254b0831..2558e7a3eceb110 100644 --- a/lib/modules/manager/circleci/schema.ts +++ b/lib/modules/manager/circleci/schema.ts @@ -9,11 +9,27 @@ export const CircleCiJob = z.object({ docker: z.array(CircleCiDocker).optional(), }); +type Orb = { + executors?: Record; + jobs?: Record; + orbs?: Record; +}; + +type CircleCiJobInput = z.input; + +type OrbInput = { + executors?: Record; + jobs?: Record; + orbs?: Record; +}; + export type CircleCiOrb = z.infer; -export const CircleCiOrb = z.object({ +export const CircleCiOrb: z.ZodType = z.object({ executors: z.record(z.string(), CircleCiJob).optional(), jobs: z.record(z.string(), CircleCiJob).optional(), - orbs: z.record(z.unknown()).optional(), + orbs: z.lazy(() => + z.record(z.string(), z.union([z.string(), CircleCiOrb])).optional(), + ), }); export type CircleCiFile = z.infer; @@ -21,5 +37,5 @@ export const CircleCiFile = z.object({ aliases: z.array(CircleCiDocker).optional(), executors: z.record(z.string(), CircleCiJob).optional(), jobs: z.record(z.string(), CircleCiJob).optional(), - orbs: z.record(z.string(), z.string().or(CircleCiOrb)).optional(), + orbs: z.record(z.string(), z.union([z.string(), CircleCiOrb])).optional(), });