diff --git a/lib/modules/manager/azure-pipelines/extract.ts b/lib/modules/manager/azure-pipelines/extract.ts index dbb80ac654aaca06d17b782e37690dbd5512b0aa..50cfc49fc4073fc28adf1da4c422742d30b6a336 100644 --- a/lib/modules/manager/azure-pipelines/extract.ts +++ b/lib/modules/manager/azure-pipelines/extract.ts @@ -1,5 +1,6 @@ import { load } from 'js-yaml'; import { logger } from '../../../logger'; +import { coerceArray } from '../../../util/array'; import { regEx } from '../../../util/regex'; import { AzurePipelinesTasksDatasource } from '../../datasource/azure-pipelines-tasks'; import { GitTagsDatasource } from '../../datasource/git-tags'; @@ -93,23 +94,23 @@ export function extractPackageFile( return null; } - for (const repository of pkg.resources?.repositories ?? []) { + for (const repository of coerceArray(pkg.resources?.repositories)) { const dep = extractRepository(repository); if (dep) { deps.push(dep); } } - for (const container of pkg.resources?.containers ?? []) { + for (const container of coerceArray(pkg.resources?.containers)) { const dep = extractContainer(container); if (dep) { deps.push(dep); } } - for (const { jobs } of pkg.stages ?? []) { - for (const { steps } of jobs ?? []) { - for (const step of steps ?? []) { + for (const { jobs } of coerceArray(pkg.stages)) { + for (const { steps } of coerceArray(jobs)) { + for (const step of coerceArray(steps)) { const task = extractAzurePipelinesTasks(step.task); if (task) { deps.push(task); @@ -118,8 +119,8 @@ export function extractPackageFile( } } - for (const { steps } of pkg.jobs ?? []) { - for (const step of steps ?? []) { + for (const { steps } of coerceArray(pkg.jobs)) { + for (const step of coerceArray(steps)) { const task = extractAzurePipelinesTasks(step.task); if (task) { deps.push(task); @@ -127,7 +128,7 @@ export function extractPackageFile( } } - for (const step of pkg.steps ?? []) { + for (const step of coerceArray(pkg.steps)) { const task = extractAzurePipelinesTasks(step.task); if (task) { deps.push(task); diff --git a/lib/modules/manager/jsonnet-bundler/extract.ts b/lib/modules/manager/jsonnet-bundler/extract.ts index e0b135538cc656c4cc6c4c858fa61a036e7b9a4d..0907faff28cbc78ffb1baf8a0555d735c5dac508 100644 --- a/lib/modules/manager/jsonnet-bundler/extract.ts +++ b/lib/modules/manager/jsonnet-bundler/extract.ts @@ -1,4 +1,5 @@ import { logger } from '../../../logger'; +import { coerceArray } from '../../../util/array'; import { regEx } from '../../../util/regex'; import type { PackageDependency, PackageFile } from '../types'; import type { Dependency, JsonnetFile } from './types'; @@ -26,7 +27,7 @@ export function extractPackageFile( return null; } - for (const dependency of jsonnetFile.dependencies ?? []) { + for (const dependency of coerceArray(jsonnetFile.dependencies)) { const dep = extractDependency(dependency); if (dep) { deps.push(dep); diff --git a/lib/modules/manager/kustomize/extract.ts b/lib/modules/manager/kustomize/extract.ts index 25f6509bd33ed34175e691e5d8aedc58cee2424a..a80836473bfee3629eede89de7f4326948e08540 100644 --- a/lib/modules/manager/kustomize/extract.ts +++ b/lib/modules/manager/kustomize/extract.ts @@ -1,6 +1,7 @@ import is from '@sindresorhus/is'; import { load } from 'js-yaml'; import { logger } from '../../../logger'; +import { coerceArray } from '../../../util/array'; import { regEx } from '../../../util/regex'; import { DockerDatasource } from '../../datasource/docker'; import { GitTagsDatasource } from '../../datasource/git-tags'; @@ -154,7 +155,7 @@ export function extractPackageFile(content: string): PackageFile | null { } // grab the remote bases - for (const base of pkg.bases ?? []) { + for (const base of coerceArray(pkg.bases)) { const dep = extractResource(base); if (dep) { deps.push({ @@ -165,7 +166,7 @@ export function extractPackageFile(content: string): PackageFile | null { } // grab the remote resources - for (const resource of pkg.resources ?? []) { + for (const resource of coerceArray(pkg.resources)) { const dep = extractResource(resource); if (dep) { deps.push({ @@ -176,7 +177,7 @@ export function extractPackageFile(content: string): PackageFile | null { } // grab the remote components - for (const component of pkg.components ?? []) { + for (const component of coerceArray(pkg.components)) { const dep = extractResource(component); if (dep) { deps.push({ @@ -187,7 +188,7 @@ export function extractPackageFile(content: string): PackageFile | null { } // grab the image tags - for (const image of pkg.images ?? []) { + for (const image of coerceArray(pkg.images)) { const dep = extractImage(image); if (dep) { deps.push({ @@ -198,7 +199,7 @@ export function extractPackageFile(content: string): PackageFile | null { } // grab the helm charts - for (const helmChart of pkg.helmCharts ?? []) { + for (const helmChart of coerceArray(pkg.helmCharts)) { const dep = extractHelmChart(helmChart); if (dep) { deps.push({ diff --git a/lib/modules/manager/tekton/extract.ts b/lib/modules/manager/tekton/extract.ts index 27832cff23f28d21175e0ef884ac0e6fa7b5f171..c1bec54fe79f966aa500291cae6f152f989fae10 100644 --- a/lib/modules/manager/tekton/extract.ts +++ b/lib/modules/manager/tekton/extract.ts @@ -1,6 +1,7 @@ import is from '@sindresorhus/is'; import { loadAll } from 'js-yaml'; import { logger } from '../../../logger'; +import { coerceArray } from '../../../util/array'; import { getDep } from '../dockerfile/extract'; import type { PackageDependency, PackageFile } from '../types'; import type { TektonBundle, TektonResource } from './types'; @@ -43,18 +44,18 @@ function getDeps(doc: TektonResource): PackageDependency[] { addDep(doc.spec?.pipelineRef, deps); // Handle Pipeline resource - for (const task of doc.spec?.tasks ?? []) { + for (const task of coerceArray(doc.spec?.tasks)) { addDep(task.taskRef, deps); } // Handle TriggerTemplate resource - for (const resource of doc.spec?.resourcetemplates ?? []) { + for (const resource of coerceArray(doc.spec?.resourcetemplates)) { addDep(resource?.spec?.taskRef, deps); addDep(resource?.spec?.pipelineRef, deps); } // Handle list of TektonResources - for (const item of doc.items ?? []) { + for (const item of coerceArray(doc.items)) { deps.push(...getDeps(item)); } @@ -68,7 +69,7 @@ function addDep(ref: TektonBundle, deps: PackageDependency[]): void { let imageRef: string | undefined; // Find a bundle reference from the Bundle resolver if (ref.resolver === 'bundles') { - for (const field of ref.resource ?? []) { + for (const field of coerceArray(ref.resource)) { if (field.name === 'bundle') { imageRef = field.value; break; diff --git a/lib/modules/manager/velaci/extract.ts b/lib/modules/manager/velaci/extract.ts index 05fa1279b1853e549dbfbaef20509bb023226a84..04c4087773802da6fab093ccb602ba622cacc220 100644 --- a/lib/modules/manager/velaci/extract.ts +++ b/lib/modules/manager/velaci/extract.ts @@ -1,5 +1,6 @@ import { load } from 'js-yaml'; import { logger } from '../../../logger'; +import { coerceArray } from '../../../util/array'; import { getDep } from '../dockerfile/extract'; import type { PackageDependency, PackageFile } from '../types'; import type { VelaPipelineConfiguration } from './types'; @@ -17,14 +18,14 @@ export function extractPackageFile(file: string): PackageFile | null { const deps: PackageDependency[] = []; // iterate over steps - for (const step of doc.steps ?? []) { + for (const step of coerceArray(doc.steps)) { const dep = getDep(step.image); deps.push(dep); } // iterate over services - for (const service of doc.services ?? []) { + for (const service of coerceArray(doc.services)) { const dep = getDep(service.image); deps.push(dep); @@ -32,7 +33,7 @@ export function extractPackageFile(file: string): PackageFile | null { // iterate over stages for (const stage of Object.values(doc.stages ?? {})) { - for (const step of stage.steps ?? []) { + for (const step of coerceArray(stage.steps)) { const dep = getDep(step.image); deps.push(dep); diff --git a/lib/util/array.ts b/lib/util/array.ts new file mode 100644 index 0000000000000000000000000000000000000000..e5998cf29f847b275aa5f2e7fbe93d877ad95175 --- /dev/null +++ b/lib/util/array.ts @@ -0,0 +1,8 @@ +import is from '@sindresorhus/is'; + +export function coerceArray<T>(input: T[] | null | undefined): T[] { + if (is.array(input)) { + return input; + } + return []; +}