diff --git a/lib/datasource/helm/index.ts b/lib/datasource/helm/index.ts index 269189702f08857b6381b23d753e1126eab19597..3090fe30131aa6026f5fe4516851f804ec45dadd 100644 --- a/lib/datasource/helm/index.ts +++ b/lib/datasource/helm/index.ts @@ -1,6 +1,5 @@ import is from '@sindresorhus/is'; -import yaml from 'js-yaml'; - +import { load } from 'js-yaml'; import { logger } from '../../logger'; import { ExternalHostError } from '../../types/errors/external-host-error'; import * as packageCache from '../../util/cache/package'; @@ -56,7 +55,7 @@ export async function getRepositoryData( throw err; } try { - const doc = yaml.safeLoad(res.body, { + const doc = load(res.body, { json: true, }) as HelmRepository; if (!is.plainObject<HelmRepository>(doc)) { diff --git a/lib/manager/argocd/extract.ts b/lib/manager/argocd/extract.ts index 3ff72772f8ce2a311c730b7e3afcb63dabb7ff0a..40083281be1721a1faa2770507fd1371fa065a3d 100644 --- a/lib/manager/argocd/extract.ts +++ b/lib/manager/argocd/extract.ts @@ -1,4 +1,4 @@ -import { safeLoadAll } from 'js-yaml'; +import { loadAll } from 'js-yaml'; import * as gitTags from '../../datasource/git-tags'; import * as helm from '../../datasource/helm'; import type { ExtractConfig, PackageDependency, PackageFile } from '../types'; @@ -40,7 +40,7 @@ export function extractPackageFile( return null; } - const definitions: ApplicationDefinition[] = safeLoadAll(content); + const definitions: ApplicationDefinition[] = loadAll(content); const deps = definitions .map((definition) => createDependency(definition)) diff --git a/lib/manager/azure-pipelines/extract.ts b/lib/manager/azure-pipelines/extract.ts index 8307542e9d8faebdc60b4ca389f774f543203975..c7ab5686adf9446b8568bdda8736df35e62fb246 100644 --- a/lib/manager/azure-pipelines/extract.ts +++ b/lib/manager/azure-pipelines/extract.ts @@ -1,4 +1,4 @@ -import { safeLoad } from 'js-yaml'; +import { load } from 'js-yaml'; import * as datasourceGitTags from '../../datasource/git-tags'; import { logger } from '../../logger'; import { getDep } from '../dockerfile/extract'; @@ -54,7 +54,7 @@ export function parseAzurePipelines( ): AzurePipelines | null { let pkg = null; try { - pkg = safeLoad(content, { json: true }); + pkg = load(content, { json: true }); } catch (err) /* istanbul ignore next */ { logger.info({ filename, err }, 'Error parsing azure-pipelines content'); return null; diff --git a/lib/manager/batect/extract.ts b/lib/manager/batect/extract.ts index 1062361f69e823987c004075a6c8bde8d93e8694..dd3982ae5c49af211afa6fd83453b03df4987371 100644 --- a/lib/manager/batect/extract.ts +++ b/lib/manager/batect/extract.ts @@ -1,4 +1,4 @@ -import { safeLoad } from 'js-yaml'; +import { load } from 'js-yaml'; import * as upath from 'upath'; import { id as gitTagDatasource } from '../../datasource/git-tags'; import { logger } from '../../logger'; @@ -16,7 +16,7 @@ import type { } from './types'; function loadConfig(content: string): BatectConfig { - const config = safeLoad(content); + const config = load(content); if (typeof config !== 'object') { throw new Error( diff --git a/lib/manager/cloudbuild/extract.ts b/lib/manager/cloudbuild/extract.ts index 57a39b90168aa3b6e6b88850ab222ecd9bcaec0c..aac1400da4157ddb43c5dfcdf45889958cdb6f5e 100644 --- a/lib/manager/cloudbuild/extract.ts +++ b/lib/manager/cloudbuild/extract.ts @@ -1,5 +1,5 @@ import is from '@sindresorhus/is'; -import yaml from 'js-yaml'; +import { load } from 'js-yaml'; import { logger } from '../../logger'; import { getDep } from '../dockerfile/extract'; import type { PackageDependency, PackageFile } from '../types'; @@ -7,7 +7,8 @@ import type { PackageDependency, PackageFile } from '../types'; export function extractPackageFile(content: string): PackageFile { const deps: PackageDependency[] = []; try { - const doc = yaml.safeLoad(content) as any; + // TODO: fix types + const doc: any = load(content); if (doc?.steps && is.array(doc.steps)) { for (const step of doc.steps) { if (step.name) { diff --git a/lib/manager/docker-compose/extract.ts b/lib/manager/docker-compose/extract.ts index 7e276b0db50bca837153e7e0e23dceff9e610b9d..5e17f930005ea522ee032536ac1b8a2e4785b307 100644 --- a/lib/manager/docker-compose/extract.ts +++ b/lib/manager/docker-compose/extract.ts @@ -1,5 +1,5 @@ import is from '@sindresorhus/is'; -import { safeLoad } from 'js-yaml'; +import { load } from 'js-yaml'; import { logger } from '../../logger'; import { getDep } from '../dockerfile/extract'; import type { PackageFile } from '../types'; @@ -35,7 +35,7 @@ export function extractPackageFile( let config: DockerComposeConfig; try { // TODO: fix me (#9610) - config = safeLoad(content, { json: true }) as DockerComposeConfig; + config = load(content, { json: true }) as DockerComposeConfig; if (!config) { logger.debug( { fileName }, diff --git a/lib/manager/gitlabci-include/extract.ts b/lib/manager/gitlabci-include/extract.ts index c56c6735d0a56cade7c61108fd4727d6b82cdcf2..ff1484b988822070569fd7d1087c3dd7b7ed3d44 100644 --- a/lib/manager/gitlabci-include/extract.ts +++ b/lib/manager/gitlabci-include/extract.ts @@ -1,5 +1,5 @@ import is from '@sindresorhus/is'; -import yaml from 'js-yaml'; +import { load } from 'js-yaml'; import * as datasourceGitlabTags from '../../datasource/gitlab-tags'; import { logger } from '../../logger'; import { SkipReason } from '../../types'; @@ -32,9 +32,9 @@ export function extractPackageFile( const deps: PackageDependency[] = []; try { // TODO: fix me (#9610) - const doc = yaml.safeLoad(replaceReferenceTags(content), { + const doc: any = load(replaceReferenceTags(content), { json: true, - }) as any; + }); if (doc?.include && is.array(doc.include)) { for (const includeObj of doc.include) { if (includeObj.file && includeObj.project) { diff --git a/lib/manager/gitlabci/extract.ts b/lib/manager/gitlabci/extract.ts index 7ef26896f205cb9de3335c50bd4aa4d1bbf01937..f971fd304317f3915fcad55afb6acbf809b862cf 100644 --- a/lib/manager/gitlabci/extract.ts +++ b/lib/manager/gitlabci/extract.ts @@ -1,5 +1,5 @@ import is from '@sindresorhus/is'; -import yaml from 'js-yaml'; +import { load } from 'js-yaml'; import { logger } from '../../logger'; import { readLocalFile } from '../../util/fs'; import { getDep } from '../dockerfile/extract'; @@ -106,7 +106,7 @@ export async function extractAllPackageFiles( } let doc: GitlabPipeline; try { - doc = yaml.safeLoad(replaceReferenceTags(content), { + doc = load(replaceReferenceTags(content), { json: true, }) as GitlabPipeline; } catch (err) { diff --git a/lib/manager/helm-requirements/extract.ts b/lib/manager/helm-requirements/extract.ts index 4ea6d08a761ff298177fa536d56b9437f3cee659..01bd698f36c46a92c4ec42591edc0b0752d6b3b2 100644 --- a/lib/manager/helm-requirements/extract.ts +++ b/lib/manager/helm-requirements/extract.ts @@ -1,5 +1,5 @@ import is from '@sindresorhus/is'; -import yaml from 'js-yaml'; +import { load } from 'js-yaml'; import * as datasourceHelm from '../../datasource/helm'; import { logger } from '../../logger'; import { SkipReason } from '../../types'; @@ -11,9 +11,10 @@ export function extractPackageFile( config: ExtractConfig ): PackageFile { let deps = []; - let doc; + // TODO: fix type + let doc: any; try { - doc = yaml.safeLoad(content, { json: true }); + doc = load(content, { json: true }); } catch (err) { logger.debug({ fileName }, 'Failed to parse helm requirements.yaml'); return null; diff --git a/lib/manager/helm-values/extract.ts b/lib/manager/helm-values/extract.ts index 6ee1da6bea19994cf3f85aa2ef9f260e3d9d82bc..6d5e6de0342cf6a4ed798bf8ec2261a41aed953f 100644 --- a/lib/manager/helm-values/extract.ts +++ b/lib/manager/helm-values/extract.ts @@ -1,4 +1,4 @@ -import yaml from 'js-yaml'; +import { load } from 'js-yaml'; import { logger } from '../../logger'; import { id as dockerVersioning } from '../../versioning/docker'; import { getDep } from '../dockerfile/extract'; @@ -58,7 +58,7 @@ export function extractPackageFile(content: string): PackageFile { // a parser that allows extracting line numbers would be preferable, with // the current approach we need to match anything we find again during the update // TODO: fix me (#9610) - parsedContent = yaml.safeLoad(content, { json: true }) as any; + parsedContent = load(content, { json: true }) as any; } catch (err) { logger.debug({ err }, 'Failed to parse helm-values YAML'); return null; diff --git a/lib/manager/helmfile/extract.ts b/lib/manager/helmfile/extract.ts index 72d7bda798367cabf418decf62b09fb832da706e..66d47da65cfa855bef760371b22bf43195a92c62 100644 --- a/lib/manager/helmfile/extract.ts +++ b/lib/manager/helmfile/extract.ts @@ -1,5 +1,5 @@ import is from '@sindresorhus/is'; -import yaml from 'js-yaml'; +import { loadAll } from 'js-yaml'; import * as datasourceHelm from '../../datasource/helm'; import { logger } from '../../logger'; import { SkipReason } from '../../types'; @@ -18,7 +18,7 @@ export function extractPackageFile( let docs: Doc[]; const aliases: Record<string, string> = {}; try { - docs = yaml.safeLoadAll(content, null, { json: true }); + docs = loadAll(content, null, { json: true }); } catch (err) { logger.debug({ err, fileName }, 'Failed to parse helmfile helmfile.yaml'); return null; diff --git a/lib/manager/helmv3/extract.ts b/lib/manager/helmv3/extract.ts index 739f205a6ae8d447eef67bcf3416c3f8566f90b8..b19cb3d79a6d19ac51089f4893e2e2076c0e0b03 100644 --- a/lib/manager/helmv3/extract.ts +++ b/lib/manager/helmv3/extract.ts @@ -1,5 +1,5 @@ import is from '@sindresorhus/is'; -import yaml from 'js-yaml'; +import { load } from 'js-yaml'; import * as datasourceHelm from '../../datasource/helm'; import { logger } from '../../logger'; import { SkipReason } from '../../types'; @@ -19,7 +19,7 @@ export async function extractPackageFile( }; try { // TODO: fix me (#9610) - chart = yaml.safeLoad(content, { json: true }) as any; + chart = load(content, { json: true }) as any; if (!(chart?.apiVersion && chart.name && chart.version)) { logger.debug( { fileName }, diff --git a/lib/manager/helmv3/update.spec.ts b/lib/manager/helmv3/update.spec.ts index ee49e109d43ab9b1f74d056317c47f1e71fe4057..2969d756dfe5d3a677e0dcf2abed50007884552d 100644 --- a/lib/manager/helmv3/update.spec.ts +++ b/lib/manager/helmv3/update.spec.ts @@ -1,10 +1,10 @@ -import yaml from 'js-yaml'; +import { dump } from 'js-yaml'; import { getName } from '../../../test/util'; import * as helmv3Updater from './update'; describe(getName(), () => { describe('.bumpPackageVersion()', () => { - const content = yaml.safeDump({ + const content = dump({ apiVersion: 'v2', name: 'test', version: '0.0.2', diff --git a/lib/manager/jenkins/extract.ts b/lib/manager/jenkins/extract.ts index cd9e641110f92de4ef6878fd82f8bc378e8fd7d6..1ea64b039dc438d27a48aedbace34cff0add0271 100644 --- a/lib/manager/jenkins/extract.ts +++ b/lib/manager/jenkins/extract.ts @@ -1,4 +1,4 @@ -import yaml from 'js-yaml'; +import { load } from 'js-yaml'; import * as datasourceJenkins from '../../datasource/jenkins-plugins'; import { logger } from '../../logger'; import { SkipReason } from '../../types'; @@ -53,7 +53,7 @@ function extractYaml(content: string): PackageDependency[] { const deps: PackageDependency[] = []; try { - const doc = yaml.safeLoad(content, { json: true }) as JenkinsPlugins; + const doc = load(content, { json: true }) as JenkinsPlugins; if (doc?.plugins) { for (const plugin of doc.plugins) { if (plugin.artifactId) { diff --git a/lib/manager/kustomize/extract.ts b/lib/manager/kustomize/extract.ts index e96f7ae194c3fee6f6238b24cd302213de7eb43c..265716beb543d25ee2a6106b346ecf0cb055de43 100644 --- a/lib/manager/kustomize/extract.ts +++ b/lib/manager/kustomize/extract.ts @@ -1,4 +1,4 @@ -import { safeLoad } from 'js-yaml'; +import { load } from 'js-yaml'; import * as datasourceDocker from '../../datasource/docker'; import * as datasourceGitTags from '../../datasource/git-tags'; import * as datasourceGitHubTags from '../../datasource/github-tags'; @@ -62,7 +62,7 @@ export function extractImage(image: Image): PackageDependency | null { export function parseKustomize(content: string): Kustomize | null { let pkg = null; try { - pkg = safeLoad(content, { json: true }); + pkg = load(content, { json: true }); } catch (e) /* istanbul ignore next */ { return null; } diff --git a/lib/manager/npm/extract/pnpm.spec.ts b/lib/manager/npm/extract/pnpm.spec.ts index b0ade19f8da7e7c1e252bfbeae7d791b58651ec2..72ce6298ac5f22f54e60d854fa1a60295de6dd76 100644 --- a/lib/manager/npm/extract/pnpm.spec.ts +++ b/lib/manager/npm/extract/pnpm.spec.ts @@ -17,7 +17,7 @@ describe(getName(), () => { it('detects errors in pnpm-workspace.yml file structure', async () => { jest .spyOn(fs, 'readLocalFile') - .mockResolvedValueOnce('p!!!ckages:\n\t- "packages/*"'); + .mockResolvedValueOnce('p!!!ckages:\n - "packages/*"'); const workSpaceFilePath = getFixturePath( 'pnpm-monorepo/pnpm-workspace.yml', @@ -35,7 +35,7 @@ describe(getName(), () => { }); it('detects errors when opening pnpm-workspace.yml file', async () => { - jest.spyOn(yaml, 'safeLoad').mockImplementationOnce(() => { + jest.spyOn(yaml, 'load').mockImplementationOnce(() => { throw new Error(); }); diff --git a/lib/manager/npm/extract/pnpm.ts b/lib/manager/npm/extract/pnpm.ts index d71e7e59408db752df4aa666989fa3fb8a7ba1e2..2e6baa97c1435c0e89f0edb9120367d99c282b9d 100644 --- a/lib/manager/npm/extract/pnpm.ts +++ b/lib/manager/npm/extract/pnpm.ts @@ -1,5 +1,5 @@ import is from '@sindresorhus/is'; -import { safeLoad } from 'js-yaml'; +import { load } from 'js-yaml'; import { logger } from '../../../logger'; import { findLocalSiblingOrParent, @@ -15,7 +15,7 @@ export async function extractPnpmFilters( fileName: string ): Promise<string[] | null> { try { - const contents = safeLoad(await readLocalFile(fileName, 'utf8'), { + const contents = load(await readLocalFile(fileName, 'utf8'), { json: true, }) as PnpmWorkspaceFile; if ( diff --git a/lib/manager/npm/post-update/index.ts b/lib/manager/npm/post-update/index.ts index 1e45616c596e8bfc5244621f2cc13c83cf93ff26..6549253827928a7a42448bd20042d3c8c49f5092 100644 --- a/lib/manager/npm/post-update/index.ts +++ b/lib/manager/npm/post-update/index.ts @@ -1,7 +1,7 @@ import is from '@sindresorhus/is'; import { parseSyml } from '@yarnpkg/parsers'; import deepmerge from 'deepmerge'; -import { safeDump, safeLoad } from 'js-yaml'; +import { dump, load } from 'js-yaml'; import upath from 'upath'; import { getAdminConfig } from '../../../config/admin'; import { SYSTEM_INSUFFICIENT_DISK_SPACE } from '../../../constants/error-messages'; @@ -543,12 +543,15 @@ export async function getAdditionalFiles( existingYarnrcYmlContent = await readLocalFile(yarnRcYmlFilename, 'utf8'); if (existingYarnrcYmlContent) { try { - const existingYarnrRcYml = safeLoad(existingYarnrcYmlContent); + const existingYarnrRcYml = load(existingYarnrcYmlContent) as Record< + string, + unknown + >; const updatedYarnYrcYml = deepmerge( existingYarnrRcYml, additionalYarnRcYml ); - await writeLocalFile(yarnRcYmlFilename, safeDump(updatedYarnYrcYml)); + await writeLocalFile(yarnRcYmlFilename, dump(updatedYarnYrcYml)); logger.debug('Added authentication to .yarnrc.yml'); } catch (err) { logger.warn({ err }, 'Error appending .yarnrc.yml content'); diff --git a/lib/manager/pre-commit/extract.ts b/lib/manager/pre-commit/extract.ts index 0bdf1996be8a4f1aad3a2a10c4bf2238940cb8c2..4c316ef9a672db79298cf2e270c762880281239d 100644 --- a/lib/manager/pre-commit/extract.ts +++ b/lib/manager/pre-commit/extract.ts @@ -1,5 +1,5 @@ import is from '@sindresorhus/is'; -import yaml from 'js-yaml'; +import { load } from 'js-yaml'; import { PLATFORM_TYPE_GITEA, PLATFORM_TYPE_GITHUB, @@ -155,9 +155,10 @@ export function extractPackageFile( content: string, filename: string ): PackageFile | null { - let parsedContent: Record<string, unknown> | PreCommitConfig; + type ParsedContent = Record<string, unknown> | PreCommitConfig; + let parsedContent: ParsedContent; try { - parsedContent = yaml.safeLoad(content, { json: true }) as any; + parsedContent = load(content, { json: true }) as ParsedContent; } catch (err) { logger.debug({ filename, err }, 'Failed to parse pre-commit config YAML'); return null; diff --git a/lib/manager/pub/extract.ts b/lib/manager/pub/extract.ts index 62665497dbd310f3523dcbec86b075c1dfd932c4..f749d123cb8e5100f41be17c1c6c2efecdd224a4 100644 --- a/lib/manager/pub/extract.ts +++ b/lib/manager/pub/extract.ts @@ -1,4 +1,4 @@ -import { safeLoad } from 'js-yaml'; +import { load } from 'js-yaml'; import { DartDatasource } from '../../datasource/dart'; import { logger } from '../../logger'; import type { PackageDependency, PackageFile } from '../types'; @@ -41,7 +41,7 @@ export function extractPackageFile( ): PackageFile | null { try { // TODO: fix me (#9610) - const doc = safeLoad(content, { json: true }) as any; + const doc = load(content, { json: true }) as any; const deps = [ ...getDeps(doc.dependencies, { depType: 'dependencies', diff --git a/lib/manager/travis/extract.ts b/lib/manager/travis/extract.ts index 64f990fb3e7f66d929eed8a48e8c269ce40c1b44..ab5e5e605e277f0f6023129ae6bf36c0ef5ea771 100644 --- a/lib/manager/travis/extract.ts +++ b/lib/manager/travis/extract.ts @@ -1,12 +1,13 @@ import is from '@sindresorhus/is'; -import yaml from 'js-yaml'; +import { load } from 'js-yaml'; import { logger } from '../../logger'; import type { PackageDependency, PackageFile } from '../types'; export function extractPackageFile(content: string): PackageFile | null { - let doc; + // TODO: fix type + let doc: any; try { - doc = yaml.safeLoad(content, { json: true }); + doc = load(content, { json: true }); } catch (err) { logger.warn({ err, content }, 'Failed to parse .travis.yml file.'); return null; diff --git a/package.json b/package.json index a1778a9534c17bc8a1af92a0fc2f32da411247ba..b637a31c6d28e530998375306c76f002c92be00e 100644 --- a/package.json +++ b/package.json @@ -156,7 +156,7 @@ "hasha": "5.2.2", "ignore": "5.1.8", "ini": "2.0.0", - "js-yaml": "3.14.1", + "js-yaml": "4.1.0", "json-dup-key-validator": "1.0.3", "json-stringify-pretty-compact": "3.0.0", "json5": "2.2.0", @@ -212,7 +212,7 @@ "@types/global-agent": "2.1.0", "@types/ini": "1.3.30", "@types/jest": "26.0.23", - "@types/js-yaml": "3.12.6", + "@types/js-yaml": "4.0.1", "@types/json-dup-key-validator": "1.0.0", "@types/linkify-markdown": "1.0.0", "@types/luxon": "1.26.5", diff --git a/yarn.lock b/yarn.lock index bf11d8246fb95085988454408cae324113ca4284..0cdb80600278b8d125ca9600c99f780fc609cdc3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1651,10 +1651,10 @@ jest-diff "^26.0.0" pretty-format "^26.0.0" -"@types/js-yaml@3.12.6": - version "3.12.6" - resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.6.tgz#7f10c926aa41e189a2755c4c7fcf8e4573bd7ac1" - integrity sha512-cK4XqrLvP17X6c0C8n4iTbT59EixqyXL3Fk8/Rsk4dF3oX4dg70gYUXrXVUUHpnsGMPNlTQMqf+TVmNPX6FmSQ== +"@types/js-yaml@4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.1.tgz#5544730b65a480b18ace6b6ce914e519cec2d43b" + integrity sha512-xdOvNmXmrZqqPy3kuCQ+fz6wA0xU5pji9cd1nDrflWaAWtYLLGk5ykW0H6yg5TVyehHP1pfmuuSaZkhP+kspVA== "@types/json-dup-key-validator@1.0.0": version "1.0.0" @@ -5735,7 +5735,14 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.14.1, js-yaml@^3.10.0, js-yaml@^3.13.1: +js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +js-yaml@^3.10.0, js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==