diff --git a/lib/modules/datasource/conan/index.ts b/lib/modules/datasource/conan/index.ts index b8cc3d77d3a21b41f2d5fbfd0d882b810162fef9..b4fae4da514b3c3e37dfb28f744337c45c966f87 100644 --- a/lib/modules/datasource/conan/index.ts +++ b/lib/modules/datasource/conan/index.ts @@ -1,9 +1,9 @@ import is from '@sindresorhus/is'; -import { load } from 'js-yaml'; import { logger } from '../../../logger'; import { cache } from '../../../util/cache/package/decorator'; import { GithubHttp } from '../../../util/http/github'; import { ensureTrailingSlash, joinUrlParts } from '../../../util/url'; +import { load } from '../../../util/yaml'; import * as allVersioning from '../../versioning'; import { Datasource } from '../datasource'; import type { diff --git a/lib/modules/datasource/custom/formats/yaml.ts b/lib/modules/datasource/custom/formats/yaml.ts index 076ded0a7f9a5b7a830b3b41f780cc47ff34dc08..f20f32d13000453e0671afc2275faec4b519e197 100644 --- a/lib/modules/datasource/custom/formats/yaml.ts +++ b/lib/modules/datasource/custom/formats/yaml.ts @@ -1,18 +1,18 @@ -import yaml from 'js-yaml'; import { readLocalFile } from '../../../../util/fs'; import type { Http } from '../../../../util/http'; +import { load } from '../../../../util/yaml'; import type { CustomDatasourceFetcher } from './types'; export class YamlFetcher implements CustomDatasourceFetcher { async fetch(http: Http, registryURL: string): Promise<unknown> { const response = await http.get(registryURL); - return yaml.load(response.body); + return load(response.body); } async readFile(registryURL: string): Promise<unknown> { const fileContent = await readLocalFile(registryURL, 'utf8'); - return yaml.load(fileContent!); + return load(fileContent!); } } diff --git a/lib/modules/datasource/helm/common.spec.ts b/lib/modules/datasource/helm/common.spec.ts index 2de9e3d13b21a3df3c50cdf653bdc834614957bd..63db19e8c4ed45fcd914dba6ed4ccd269c6c3389 100644 --- a/lib/modules/datasource/helm/common.spec.ts +++ b/lib/modules/datasource/helm/common.spec.ts @@ -1,5 +1,5 @@ -import { load } from 'js-yaml'; import { Fixtures } from '../../../../test/fixtures'; +import { load } from '../../../util/yaml'; import { findSourceUrl } from './common'; import type { HelmRepository } from './types'; diff --git a/lib/modules/datasource/helm/index.ts b/lib/modules/datasource/helm/index.ts index 5f5eb92fdef39ae7ea749e567a4ab0e6aa172d68..aeff449f255eee7e7736bb87d42e4158c9240438 100644 --- a/lib/modules/datasource/helm/index.ts +++ b/lib/modules/datasource/helm/index.ts @@ -1,9 +1,9 @@ import is from '@sindresorhus/is'; -import { load } from 'js-yaml'; import { logger } from '../../../logger'; import { cache } from '../../../util/cache/package/decorator'; import type { HttpResponse } from '../../../util/http/types'; import { ensureTrailingSlash } from '../../../util/url'; +import { load } from '../../../util/yaml'; import * as helmVersioning from '../../versioning/helm'; import { Datasource } from '../datasource'; import type { GetReleasesConfig, ReleaseResult } from '../types'; diff --git a/lib/modules/manager/argocd/extract.ts b/lib/modules/manager/argocd/extract.ts index 249fb4a9a9e4f7641d8c41db67a0659c5abe759e..8553a748f064f401bd1f9c7700c213989791af46 100644 --- a/lib/modules/manager/argocd/extract.ts +++ b/lib/modules/manager/argocd/extract.ts @@ -1,8 +1,8 @@ import is from '@sindresorhus/is'; -import { loadAll } from 'js-yaml'; import { logger } from '../../../logger'; import { coerceArray } from '../../../util/array'; import { trimTrailingSlash } from '../../../util/url'; +import { loadAll } from '../../../util/yaml'; import { DockerDatasource } from '../../datasource/docker'; import { GitTagsDatasource } from '../../datasource/git-tags'; import { HelmDatasource } from '../../datasource/helm'; diff --git a/lib/modules/manager/azure-pipelines/extract.ts b/lib/modules/manager/azure-pipelines/extract.ts index 33f770c2f9c5e364203d1b3c1545d474bcb55a38..b5d353dec58c98a98e103128c751fdc9998a2720 100644 --- a/lib/modules/manager/azure-pipelines/extract.ts +++ b/lib/modules/manager/azure-pipelines/extract.ts @@ -1,9 +1,9 @@ -import { load } from 'js-yaml'; import { GlobalConfig } from '../../../config/global'; import { logger } from '../../../logger'; import { coerceArray } from '../../../util/array'; import { regEx } from '../../../util/regex'; import { joinUrlParts } from '../../../util/url'; +import { load } from '../../../util/yaml'; import { AzurePipelinesTasksDatasource } from '../../datasource/azure-pipelines-tasks'; import { GitTagsDatasource } from '../../datasource/git-tags'; import { getDep } from '../dockerfile/extract'; diff --git a/lib/modules/manager/batect/extract.ts b/lib/modules/manager/batect/extract.ts index b2c8105dc29a1cf3d454965a904a99eeb7d12a39..fd9f4c4a03d784641be207ef32750dead72841e3 100644 --- a/lib/modules/manager/batect/extract.ts +++ b/lib/modules/manager/batect/extract.ts @@ -1,8 +1,8 @@ import is from '@sindresorhus/is'; -import { load } from 'js-yaml'; import upath from 'upath'; import { logger } from '../../../logger'; import { readLocalFile } from '../../../util/fs'; +import { load } from '../../../util/yaml'; import { GitTagsDatasource } from '../../datasource/git-tags'; import { id as dockerVersioning } from '../../versioning/docker'; import { id as semverVersioning } from '../../versioning/semver'; diff --git a/lib/modules/manager/cloudbuild/extract.ts b/lib/modules/manager/cloudbuild/extract.ts index b00c00e8122cabf5fb9005eef39a7a4cc9e55328..6f04657b95545e333fee93fa842f42a1fa0ad371 100644 --- a/lib/modules/manager/cloudbuild/extract.ts +++ b/lib/modules/manager/cloudbuild/extract.ts @@ -1,6 +1,6 @@ import is from '@sindresorhus/is'; -import { load } from 'js-yaml'; import { logger } from '../../../logger'; +import { load } from '../../../util/yaml'; import { getDep } from '../dockerfile/extract'; import type { PackageDependency, PackageFileContent } from '../types'; diff --git a/lib/modules/manager/crossplane/extract.ts b/lib/modules/manager/crossplane/extract.ts index 35f70e8783b56063bb709248a3132d6d3e72ef9b..605a70fdf540c55b5364de0fd749bd1082d15acc 100644 --- a/lib/modules/manager/crossplane/extract.ts +++ b/lib/modules/manager/crossplane/extract.ts @@ -1,5 +1,5 @@ -import { loadAll } from 'js-yaml'; import { logger } from '../../../logger'; +import { loadAll } from '../../../util/yaml'; import { getDep } from '../dockerfile/extract'; import type { ExtractConfig, diff --git a/lib/modules/manager/docker-compose/extract.ts b/lib/modules/manager/docker-compose/extract.ts index 67ffe6db2356df9949e4574c8d2c1c9a4f3e8dd0..06ccb814744e219e4737df136a85aea2bd8b996f 100644 --- a/lib/modules/manager/docker-compose/extract.ts +++ b/lib/modules/manager/docker-compose/extract.ts @@ -1,7 +1,7 @@ import is from '@sindresorhus/is'; -import { load } from 'js-yaml'; import { logger } from '../../../logger'; import { newlineRegex, regEx } from '../../../util/regex'; +import { load } from '../../../util/yaml'; import { getDep } from '../dockerfile/extract'; import type { ExtractConfig, PackageFileContent } from '../types'; import type { DockerComposeConfig } from './types'; diff --git a/lib/modules/manager/fleet/extract.ts b/lib/modules/manager/fleet/extract.ts index 65fa42d8de2ea81856864ab65fcfa5925ee7418b..cee52e074f950ae798924e66fef020f2bd54e375 100644 --- a/lib/modules/manager/fleet/extract.ts +++ b/lib/modules/manager/fleet/extract.ts @@ -1,7 +1,7 @@ import is from '@sindresorhus/is'; -import { loadAll } from 'js-yaml'; import { logger } from '../../../logger'; import { regEx } from '../../../util/regex'; +import { loadAll } from '../../../util/yaml'; import { GitTagsDatasource } from '../../datasource/git-tags'; import { HelmDatasource } from '../../datasource/helm'; import { checkIfStringIsPath } from '../terraform/util'; diff --git a/lib/modules/manager/flux/extract.ts b/lib/modules/manager/flux/extract.ts index 89c260319a705aaa86035ea67de7452443d98d08..036c1a46f142c7f7c07d4561e4d25c8256499c2a 100644 --- a/lib/modules/manager/flux/extract.ts +++ b/lib/modules/manager/flux/extract.ts @@ -1,8 +1,8 @@ import is from '@sindresorhus/is'; -import { loadAll } from 'js-yaml'; import { logger } from '../../../logger'; import { readLocalFile } from '../../../util/fs'; import { regEx } from '../../../util/regex'; +import { loadAll } from '../../../util/yaml'; import { BitbucketTagsDatasource } from '../../datasource/bitbucket-tags'; import { DockerDatasource } from '../../datasource/docker'; import { GitRefsDatasource } from '../../datasource/git-refs'; diff --git a/lib/modules/manager/github-actions/extract.ts b/lib/modules/manager/github-actions/extract.ts index 4f0e59b5ae79a4d1093d42ec5e65ae0dde490dbc..e0415683c9a1c26ad6f3f89ea08acb478548af8e 100644 --- a/lib/modules/manager/github-actions/extract.ts +++ b/lib/modules/manager/github-actions/extract.ts @@ -1,9 +1,9 @@ import is from '@sindresorhus/is'; -import { load } from 'js-yaml'; import { GlobalConfig } from '../../../config/global'; import { logger } from '../../../logger'; import { isNotNullOrUndefined } from '../../../util/array'; import { newlineRegex, regEx } from '../../../util/regex'; +import { load } from '../../../util/yaml'; import { GithubRunnersDatasource } from '../../datasource/github-runners'; import { GithubTagsDatasource } from '../../datasource/github-tags'; import * as dockerVersioning from '../../versioning/docker'; diff --git a/lib/modules/manager/gitlabci-include/common.spec.ts b/lib/modules/manager/gitlabci-include/common.spec.ts index 7484698925386af35226eef68ff5d2b1e93a05b0..c71f0cf03fb05fa88d3057f40560dcc89f38bc73 100644 --- a/lib/modules/manager/gitlabci-include/common.spec.ts +++ b/lib/modules/manager/gitlabci-include/common.spec.ts @@ -1,5 +1,5 @@ -import { load } from 'js-yaml'; import { Fixtures } from '../../../../test/fixtures'; +import { load } from '../../../util/yaml'; import type { GitlabPipeline } from '../gitlabci/types'; import { replaceReferenceTags } from '../gitlabci/utils'; import { diff --git a/lib/modules/manager/gitlabci-include/extract.ts b/lib/modules/manager/gitlabci-include/extract.ts index 9c4a2892042396b0e4d7191a9b4f126961bcd605..b38d730e485e2c61ad5f7a75e2e989348138b540 100644 --- a/lib/modules/manager/gitlabci-include/extract.ts +++ b/lib/modules/manager/gitlabci-include/extract.ts @@ -1,8 +1,8 @@ import is from '@sindresorhus/is'; -import { load } from 'js-yaml'; import { GlobalConfig } from '../../../config/global'; import { logger } from '../../../logger'; import { regEx } from '../../../util/regex'; +import { load } from '../../../util/yaml'; import { GitlabTagsDatasource } from '../../datasource/gitlab-tags'; import type { GitlabInclude, diff --git a/lib/modules/manager/gitlabci/extract.ts b/lib/modules/manager/gitlabci/extract.ts index 00da59a140dad44a80c56a9fc7a91496e003c12f..a520e0349a74c5cf6d7d35975c3d84ce8d39a986 100644 --- a/lib/modules/manager/gitlabci/extract.ts +++ b/lib/modules/manager/gitlabci/extract.ts @@ -1,8 +1,8 @@ import is from '@sindresorhus/is'; -import { load } from 'js-yaml'; import { logger } from '../../../logger'; import { readLocalFile } from '../../../util/fs'; import { trimLeadingSlash } from '../../../util/url'; +import { load } from '../../../util/yaml'; import type { ExtractConfig, PackageDependency, diff --git a/lib/modules/manager/helm-requirements/extract.ts b/lib/modules/manager/helm-requirements/extract.ts index 5a6a8567aa84ad42154f3bae1f7adfeaafda9865..52834af8251d67924d7c2d42b3ed016d6d6c5b0e 100644 --- a/lib/modules/manager/helm-requirements/extract.ts +++ b/lib/modules/manager/helm-requirements/extract.ts @@ -1,6 +1,6 @@ import is from '@sindresorhus/is'; -import { load } from 'js-yaml'; import { logger } from '../../../logger'; +import { load } from '../../../util/yaml'; import { HelmDatasource } from '../../datasource/helm'; import type { ExtractConfig, diff --git a/lib/modules/manager/helm-values/extract.ts b/lib/modules/manager/helm-values/extract.ts index 1f9ea32f61b571b05ee559df95d14682b641a622..e75026dec80a47d62a77da40094a8a181c07e627 100644 --- a/lib/modules/manager/helm-values/extract.ts +++ b/lib/modules/manager/helm-values/extract.ts @@ -1,5 +1,5 @@ -import { loadAll } from 'js-yaml'; import { logger } from '../../../logger'; +import { loadAll } from '../../../util/yaml'; import { id as dockerVersioning } from '../../versioning/docker'; import { getDep } from '../dockerfile/extract'; import type { PackageDependency, PackageFileContent } from '../types'; diff --git a/lib/modules/manager/helmfile/extract.ts b/lib/modules/manager/helmfile/extract.ts index 0a29612900046597f0d122a1730a161f490a883b..0ca299a2232b7aeaa3d44fdc792f82529746e8fb 100644 --- a/lib/modules/manager/helmfile/extract.ts +++ b/lib/modules/manager/helmfile/extract.ts @@ -1,7 +1,7 @@ import is from '@sindresorhus/is'; -import { loadAll } from 'js-yaml'; import { logger } from '../../../logger'; import { regEx } from '../../../util/regex'; +import { loadAll } from '../../../util/yaml'; import { DockerDatasource } from '../../datasource/docker'; import { HelmDatasource } from '../../datasource/helm'; import type { @@ -18,13 +18,6 @@ import { const isValidChartName = (name: string | undefined): boolean => !!name && !regEx(/[!@#$%^&*(),.?":{}/|<>A-Z]/).test(name); -function extractYaml(content: string): string { - // regex remove go templated ({{ . }}) values - return content - .replace(regEx(/{{`.+?`}}/gs), '') - .replace(regEx(/{{.+?}}/g), ''); -} - function isLocalPath(possiblePath: string): boolean { return ['./', '../', '/'].some((localPrefix) => possiblePath.startsWith(localPrefix), @@ -42,7 +35,10 @@ export async function extractPackageFile( // Record kustomization usage for all deps, since updating artifacts is run on the helmfile.yaml as a whole. let needKustomize = false; try { - docs = loadAll(extractYaml(content), null, { json: true }) as Doc[]; + docs = loadAll(content, null, { + removeTemplates: true, + json: true, + }) as Doc[]; } catch (err) { logger.debug( { err, packageFile }, diff --git a/lib/modules/manager/helmsman/extract.ts b/lib/modules/manager/helmsman/extract.ts index 504b2f43af57867eb2d4b11a8c03edf9bb7f69ca..f776cd0b2f0a45dbe1083f3d7c7161e577485e8a 100644 --- a/lib/modules/manager/helmsman/extract.ts +++ b/lib/modules/manager/helmsman/extract.ts @@ -1,7 +1,7 @@ import is from '@sindresorhus/is'; -import { load } from 'js-yaml'; import { logger } from '../../../logger'; import { regEx } from '../../../util/regex'; +import { load } from '../../../util/yaml'; import { DockerDatasource } from '../../datasource/docker'; import { HelmDatasource } from '../../datasource/helm'; import type { diff --git a/lib/modules/manager/helmv3/artifacts.ts b/lib/modules/manager/helmv3/artifacts.ts index 93616df86e557bdd3947a5705597099886665097..7f7df8d6c600b48b7b80a1312a941be7623016f3 100644 --- a/lib/modules/manager/helmv3/artifacts.ts +++ b/lib/modules/manager/helmv3/artifacts.ts @@ -1,5 +1,4 @@ import is from '@sindresorhus/is'; -import yaml from 'js-yaml'; import pMap from 'p-map'; import { quote } from 'shlex'; import { TEMPORARY_ERROR } from '../../../constants/error-messages'; @@ -14,6 +13,7 @@ import { } from '../../../util/fs'; import { getRepoStatus } from '../../../util/git'; import * as hostRules from '../../../util/host-rules'; +import * as yaml from '../../../util/yaml'; import { DockerDatasource } from '../../datasource/docker'; import { HelmDatasource } from '../../datasource/helm'; import type { UpdateArtifact, UpdateArtifactsResult } from '../types'; diff --git a/lib/modules/manager/helmv3/extract.ts b/lib/modules/manager/helmv3/extract.ts index d7fc59518c0e169173c7f18c2ffff3b28aa9301c..f6d9e9d4649ad28f418eb12be88e8d9efba2eb86 100644 --- a/lib/modules/manager/helmv3/extract.ts +++ b/lib/modules/manager/helmv3/extract.ts @@ -1,7 +1,7 @@ import is from '@sindresorhus/is'; -import { load } from 'js-yaml'; import { logger } from '../../../logger'; import { getSiblingFileName, localPathExists } from '../../../util/fs'; +import { load } from '../../../util/yaml'; import { HelmDatasource } from '../../datasource/helm'; import type { ExtractConfig, diff --git a/lib/modules/manager/helmv3/update.spec.ts b/lib/modules/manager/helmv3/update.spec.ts index 43062508b6da9323a2ea78519358b4076692c102..854dcfc2e8f6da6173f1b0957a604fba4df37554 100644 --- a/lib/modules/manager/helmv3/update.spec.ts +++ b/lib/modules/manager/helmv3/update.spec.ts @@ -1,4 +1,4 @@ -import { dump } from 'js-yaml'; +import { dump } from '../../../util/yaml'; import * as helmv3Updater from '.'; describe('modules/manager/helmv3/update', () => { diff --git a/lib/modules/manager/jenkins/extract.ts b/lib/modules/manager/jenkins/extract.ts index c8b1dad120d01d5bc29bfe6a5e5a364361f114d8..51d3fa54acaca81cadee10df27f1006bb3f91649 100644 --- a/lib/modules/manager/jenkins/extract.ts +++ b/lib/modules/manager/jenkins/extract.ts @@ -1,8 +1,8 @@ import is from '@sindresorhus/is'; -import { load } from 'js-yaml'; import { logger } from '../../../logger'; import { isSkipComment } from '../../../util/ignore'; import { newlineRegex, regEx } from '../../../util/regex'; +import { load } from '../../../util/yaml'; import { JenkinsPluginsDatasource } from '../../datasource/jenkins-plugins'; import * as mavenVersioning from '../../versioning/maven'; import type { PackageDependency, PackageFileContent } from '../types'; diff --git a/lib/modules/manager/kubernetes/extract.ts b/lib/modules/manager/kubernetes/extract.ts index 4588f63d1f07db1055287d1a99c29daed570794c..9920f16007281c6569ec6d1070e078b040fda46e 100644 --- a/lib/modules/manager/kubernetes/extract.ts +++ b/lib/modules/manager/kubernetes/extract.ts @@ -1,7 +1,7 @@ import is from '@sindresorhus/is'; -import { loadAll } from 'js-yaml'; import { logger } from '../../../logger'; import { newlineRegex, regEx } from '../../../util/regex'; +import { loadAll } from '../../../util/yaml'; import { KubernetesApiDatasource, supportedApis, diff --git a/lib/modules/manager/kustomize/extract.ts b/lib/modules/manager/kustomize/extract.ts index 8af061713a609e0cb730ccaa12bbcb414c9bde93..bca4d553c03da7bf001da751fbbdb8c3b344067e 100644 --- a/lib/modules/manager/kustomize/extract.ts +++ b/lib/modules/manager/kustomize/extract.ts @@ -1,8 +1,8 @@ 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 { load } from '../../../util/yaml'; import { DockerDatasource } from '../../datasource/docker'; import { GitTagsDatasource } from '../../datasource/git-tags'; import { GithubTagsDatasource } from '../../datasource/github-tags'; diff --git a/lib/modules/manager/npm/extract/pnpm.spec.ts b/lib/modules/manager/npm/extract/pnpm.spec.ts index 9927655a776f07eef73e4d10c7055cd98b3045bc..590a941f9f33237337e3905b6eae6749786289c6 100644 --- a/lib/modules/manager/npm/extract/pnpm.spec.ts +++ b/lib/modules/manager/npm/extract/pnpm.spec.ts @@ -1,8 +1,8 @@ -import yaml from 'js-yaml'; import { Fixtures } from '../../../../../test/fixtures'; import { getFixturePath, logger, partial } from '../../../../../test/util'; import { GlobalConfig } from '../../../../config/global'; import * as fs from '../../../../util/fs'; +import * as yaml from '../../../../util/yaml'; import type { PackageFile } from '../../types'; import type { NpmManagerData } from '../types'; import { diff --git a/lib/modules/manager/npm/extract/pnpm.ts b/lib/modules/manager/npm/extract/pnpm.ts index 3de992b46027baa9729390deff05ebaf2a417b7d..d358212cdbc8408bee5d6879799b86db276d2d89 100644 --- a/lib/modules/manager/npm/extract/pnpm.ts +++ b/lib/modules/manager/npm/extract/pnpm.ts @@ -1,6 +1,5 @@ import is from '@sindresorhus/is'; import { findPackages } from 'find-packages'; -import { load } from 'js-yaml'; import upath from 'upath'; import { GlobalConfig } from '../../../../config/global'; import { logger } from '../../../../logger'; @@ -10,6 +9,7 @@ import { localPathExists, readLocalFile, } from '../../../../util/fs'; +import { load } from '../../../../util/yaml'; import type { PackageFile } from '../../types'; import type { PnpmDependencySchema, PnpmLockFile } from '../post-update/types'; import type { NpmManagerData } from '../types'; diff --git a/lib/modules/manager/npm/post-update/index.ts b/lib/modules/manager/npm/post-update/index.ts index 5b8d92b4e1a4cba2abfc567c34361a8bf147633f..fa318343b0528a54348bbab34400b03f09e3abab 100644 --- a/lib/modules/manager/npm/post-update/index.ts +++ b/lib/modules/manager/npm/post-update/index.ts @@ -1,7 +1,6 @@ // TODO: types (#22198) import is from '@sindresorhus/is'; import deepmerge from 'deepmerge'; -import { dump, load } from 'js-yaml'; import upath from 'upath'; import { logger } from '../../../../logger'; import { ExternalHostError } from '../../../../types/errors/external-host-error'; @@ -18,6 +17,7 @@ import type { FileChange } from '../../../../util/git/types'; import * as hostRules from '../../../../util/host-rules'; import { newlineRegex, regEx } from '../../../../util/regex'; import { ensureTrailingSlash } from '../../../../util/url'; +import { dump, load } from '../../../../util/yaml'; import { NpmDatasource } from '../../../datasource/npm'; import { scm } from '../../../platform/scm'; import type { PackageFile, PostUpdateConfig, Upgrade } from '../../types'; diff --git a/lib/modules/manager/npm/post-update/pnpm.ts b/lib/modules/manager/npm/post-update/pnpm.ts index c3db89f25a67945043cff1ae3ded1a1dc07747c6..9cbffebfdef9192163f73202b5efee4012dbcb21 100644 --- a/lib/modules/manager/npm/post-update/pnpm.ts +++ b/lib/modules/manager/npm/post-update/pnpm.ts @@ -1,5 +1,4 @@ import is from '@sindresorhus/is'; -import { load } from 'js-yaml'; import upath from 'upath'; import { GlobalConfig } from '../../../../config/global'; import { TEMPORARY_ERROR } from '../../../../constants/error-messages'; @@ -11,6 +10,7 @@ import type { ToolConstraint, } from '../../../../util/exec/types'; import { deleteLocalFile, readLocalFile } from '../../../../util/fs'; +import { load } from '../../../../util/yaml'; import type { PostUpdateConfig, Upgrade } from '../../types'; import { getNodeToolConstraint } from './node-version'; import type { GenerateLockFileResult, PnpmLockFile } from './types'; diff --git a/lib/modules/manager/pre-commit/extract.ts b/lib/modules/manager/pre-commit/extract.ts index 30a6eac49c65b450dd01d1bf6e09f8470955e611..345e3d66d9e864eb4ac400e81f31fd65727ce988 100644 --- a/lib/modules/manager/pre-commit/extract.ts +++ b/lib/modules/manager/pre-commit/extract.ts @@ -1,10 +1,10 @@ import is from '@sindresorhus/is'; -import { load } from 'js-yaml'; import { logger } from '../../../logger'; import type { SkipReason } from '../../../types'; import { detectPlatform } from '../../../util/common'; import { find } from '../../../util/host-rules'; import { regEx } from '../../../util/regex'; +import { load } from '../../../util/yaml'; import { GithubTagsDatasource } from '../../datasource/github-tags'; import { GitlabTagsDatasource } from '../../datasource/gitlab-tags'; import type { PackageDependency, PackageFileContent } from '../types'; diff --git a/lib/modules/manager/tekton/extract.ts b/lib/modules/manager/tekton/extract.ts index 810a4a8673bb8826ecf68cb4f9568c6a15cd948d..9c4ab35d74ec1b77840a197da49c342a75026b81 100644 --- a/lib/modules/manager/tekton/extract.ts +++ b/lib/modules/manager/tekton/extract.ts @@ -1,7 +1,7 @@ import is from '@sindresorhus/is'; -import { loadAll } from 'js-yaml'; import { logger } from '../../../logger'; import { coerceArray } from '../../../util/array'; +import { loadAll } from '../../../util/yaml'; import { getDep } from '../dockerfile/extract'; import type { PackageDependency, PackageFileContent } from '../types'; import type { diff --git a/lib/modules/manager/travis/extract.ts b/lib/modules/manager/travis/extract.ts index 886cc4a0f4b1e80a80f02c58227ceb2cffa82128..9427813c07aed74934c915fbdfe4d3a1c0a2ac11 100644 --- a/lib/modules/manager/travis/extract.ts +++ b/lib/modules/manager/travis/extract.ts @@ -1,6 +1,6 @@ import is from '@sindresorhus/is'; -import { load } from 'js-yaml'; import { logger } from '../../../logger'; +import { load } from '../../../util/yaml'; import { GithubTagsDatasource } from '../../datasource/github-tags'; import type { PackageDependency, PackageFileContent } from '../types'; import type { TravisMatrixItem, TravisYaml } from './types'; diff --git a/lib/modules/manager/velaci/extract.ts b/lib/modules/manager/velaci/extract.ts index 50ea39a6ea3aa29195ac3ecd231630782e731d16..6be65899f03bfb3482955c048754bab2eb1c425d 100644 --- a/lib/modules/manager/velaci/extract.ts +++ b/lib/modules/manager/velaci/extract.ts @@ -1,6 +1,6 @@ -import { load } from 'js-yaml'; import { logger } from '../../../logger'; import { coerceArray } from '../../../util/array'; +import { load } from '../../../util/yaml'; import { getDep } from '../dockerfile/extract'; import type { PackageDependency, PackageFileContent } from '../types'; import type { VelaPipelineConfiguration } from './types'; diff --git a/lib/modules/manager/woodpecker/extract.ts b/lib/modules/manager/woodpecker/extract.ts index 6012709aaff281e52cc9fa40727f40c611930f94..a5fabef1c75bb437ad9ca71d9ed209cf3f62c9a7 100644 --- a/lib/modules/manager/woodpecker/extract.ts +++ b/lib/modules/manager/woodpecker/extract.ts @@ -1,6 +1,6 @@ import is from '@sindresorhus/is'; -import { load } from 'js-yaml'; import { logger } from '../../../logger'; +import { load } from '../../../util/yaml'; import { getDep } from '../dockerfile/extract'; import type { ExtractConfig, PackageFileContent } from '../types'; import type { WoodpeckerConfig } from './types'; diff --git a/lib/util/schema-utils.ts b/lib/util/schema-utils.ts index f2b5bed1e490d7adf00b339cee9ea8d59085f8ec..28698d2c8f81beda5ec66d4fb58b7450a62d86d7 100644 --- a/lib/util/schema-utils.ts +++ b/lib/util/schema-utils.ts @@ -1,9 +1,9 @@ -import { load, loadAll } from 'js-yaml'; import JSON5 from 'json5'; import { DateTime } from 'luxon'; import type { JsonArray, JsonValue } from 'type-fest'; import { z } from 'zod'; import { parse as parseToml } from './toml'; +import { load, loadAll } from './yaml'; interface ErrorContext<T> { error: z.ZodError; diff --git a/lib/util/yaml.spec.ts b/lib/util/yaml.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..39b1ba55a07d6d9cf7bf7dc51883f181ea271440 --- /dev/null +++ b/lib/util/yaml.spec.ts @@ -0,0 +1,115 @@ +import { codeBlock } from 'common-tags'; +import { load, loadAll } from './yaml'; + +describe('util/yaml', () => { + describe('loadAll', () => { + it('should return empty array for empty string', () => { + expect(loadAll(``)).toEqual([]); + }); + + it('should parse content with single document', () => { + expect( + loadAll(codeBlock` + myObject: + aString: value + `), + ).toEqual([ + { + myObject: { + aString: 'value', + }, + }, + ]); + }); + + it('should parse content with multiple documents', () => { + expect( + loadAll(codeBlock` + myObject: + aString: value + --- + foo: bar + `), + ).toEqual([ + { + myObject: { + aString: 'value', + }, + }, + { + foo: 'bar', + }, + ]); + }); + + it('should parse content with templates', () => { + expect( + loadAll( + codeBlock` + myObject: + aString: {{ value }} + --- + foo: {{ foo.bar }} + `, + undefined, + { removeTemplates: true }, + ), + ).toEqual([ + { + myObject: { + aString: null, + }, + }, + { + foo: null, + }, + ]); + }); + }); + + describe('load', () => { + it('should return undefined', () => { + expect(load(``)).toBeUndefined(); + }); + + it('should parse content with single document', () => { + expect( + load(codeBlock` + myObject: + aString: value + `), + ).toEqual({ + myObject: { + aString: 'value', + }, + }); + }); + + it('should parse content with multiple documents', () => { + expect(() => + load(codeBlock` + myObject: + aString: value + --- + foo: bar + `), + ).toThrow(); + }); + + it('should parse content with template', () => { + expect( + load( + codeBlock` + myObject: + aString: {{value}} + `, + { removeTemplates: true }, + ), + ).toEqual({ + myObject: { + aString: null, + }, + }); + }); + }); +}); diff --git a/lib/util/yaml.ts b/lib/util/yaml.ts new file mode 100644 index 0000000000000000000000000000000000000000..620c330dfacb372792e7ce262606dd5201e7be2d --- /dev/null +++ b/lib/util/yaml.ts @@ -0,0 +1,41 @@ +import { + DumpOptions, + LoadOptions, + loadAll as multiple, + load as single, + dump as upstreamDump, +} from 'js-yaml'; +import { regEx } from './regex'; + +interface YamlOptions extends LoadOptions { + removeTemplates?: boolean; +} + +export function loadAll( + content: string, + iterator?: null | undefined, + options?: YamlOptions, +): unknown[] { + const massagedContent = massageContent(content, options); + + return multiple(massagedContent, iterator, options); +} + +export function load(content: string, options?: YamlOptions): unknown { + const massagedContent = massageContent(content, options); + return single(massagedContent, options); +} + +export function dump(obj: any, opts?: DumpOptions | undefined): string { + return upstreamDump(obj, opts); +} + +function massageContent(content: string, options?: YamlOptions): string { + if (options?.removeTemplates) { + return content + .replace(regEx(/{{`.+?`}}/gs), '') + .replace(regEx(/{{.+?}}/g), ''); + } + + return content; +} diff --git a/lib/workers/global/config/parse/file.ts b/lib/workers/global/config/parse/file.ts index 3d0ecb7d9d42eea5d00fd6f88779526c701523cf..f66cee56d1b494b009b933e82bf1e6fe19038e1a 100644 --- a/lib/workers/global/config/parse/file.ts +++ b/lib/workers/global/config/parse/file.ts @@ -1,6 +1,5 @@ import is from '@sindresorhus/is'; import fs from 'fs-extra'; -import { load } from 'js-yaml'; import JSON5 from 'json5'; import upath from 'upath'; import { migrateConfig } from '../../../../config/migration'; @@ -8,6 +7,7 @@ import type { AllConfig, RenovateConfig } from '../../../../config/types'; import { logger } from '../../../../logger'; import { parseJson } from '../../../../util/common'; import { readSystemFile } from '../../../../util/fs'; +import { load } from '../../../../util/yaml'; export async function getParsedContent(file: string): Promise<RenovateConfig> { if (upath.basename(file) === '.renovaterc') {