Skip to content

Commit

Permalink
fix(circleci): update schema to support self-referential orb type
Browse files Browse the repository at this point in the history
  • Loading branch information
steved committed Oct 22, 2024
1 parent 0840187 commit d4a3c40
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 13 deletions.
16 changes: 6 additions & 10 deletions lib/modules/manager/circleci/extract.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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[] = [];
Expand All @@ -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();
Expand Down
22 changes: 19 additions & 3 deletions lib/modules/manager/circleci/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,33 @@ export const CircleCiJob = z.object({
docker: z.array(CircleCiDocker).optional(),
});

type Orb = {
executors?: Record<string, CircleCiJob>;
jobs?: Record<string, CircleCiJob>;
orbs?: Record<string, string | Orb>;
};

type CircleCiJobInput = z.input<typeof CircleCiJob>;

type OrbInput = {
executors?: Record<string, CircleCiJobInput>;
jobs?: Record<string, CircleCiJobInput>;
orbs?: Record<string, string | OrbInput>;
};

export type CircleCiOrb = z.infer<typeof CircleCiOrb>;
export const CircleCiOrb = z.object({
export const CircleCiOrb: z.ZodType<Orb, any, OrbInput> = 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<typeof CircleCiFile>;
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(),
});

0 comments on commit d4a3c40

Please sign in to comment.