renovate 44.90.3 → 44.91.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/options/index.js +1 -1
- package/dist/config/options/index.js.map +1 -1
- package/dist/global-config-option-defaults.generated.js +1 -1
- package/dist/global-config-option-defaults.generated.js.map +1 -1
- package/dist/modules/manager/ansible-galaxy/collections.js +4 -6
- package/dist/modules/manager/ansible-galaxy/collections.js.map +1 -1
- package/dist/modules/manager/azure-pipelines/extract.js +1 -0
- package/dist/modules/manager/azure-pipelines/extract.js.map +1 -1
- package/dist/modules/manager/bazel/artifacts.js +5 -1
- package/dist/modules/manager/bazel/artifacts.js.map +1 -1
- package/dist/modules/manager/bazel/parser.js +15 -0
- package/dist/modules/manager/bazel/parser.js.map +1 -1
- package/dist/modules/manager/bazel/rules/http.js.map +1 -1
- package/dist/modules/manager/bundler/common.js +1 -0
- package/dist/modules/manager/bundler/common.js.map +1 -1
- package/dist/modules/manager/cargo/artifacts.js +2 -0
- package/dist/modules/manager/cargo/artifacts.js.map +1 -1
- package/dist/modules/manager/cargo/extract.js.map +1 -1
- package/dist/modules/manager/cocoapods/extract.js +3 -0
- package/dist/modules/manager/cocoapods/extract.js.map +1 -1
- package/dist/modules/manager/composer/artifacts.js +1 -0
- package/dist/modules/manager/composer/artifacts.js.map +1 -1
- package/dist/modules/manager/composer/schema.js.map +1 -1
- package/dist/modules/manager/cpanfile/parser.js +2 -0
- package/dist/modules/manager/cpanfile/parser.js.map +1 -1
- package/dist/modules/manager/deps-edn/extract.js +3 -1
- package/dist/modules/manager/deps-edn/extract.js.map +1 -1
- package/dist/modules/manager/droneci/extract.js +4 -6
- package/dist/modules/manager/droneci/extract.js.map +1 -1
- package/dist/modules/manager/fingerprint.generated.js +11 -11
- package/dist/modules/manager/fingerprint.generated.js.map +1 -1
- package/dist/modules/manager/flux/extract.js +1 -0
- package/dist/modules/manager/flux/extract.js.map +1 -1
- package/dist/modules/manager/github-actions/extract.js +3 -0
- package/dist/modules/manager/github-actions/extract.js.map +1 -1
- package/dist/modules/manager/github-actions/known-actions.js +38 -2
- package/dist/modules/manager/github-actions/known-actions.js.map +1 -1
- package/dist/modules/manager/gitlabci/extract.js +1 -0
- package/dist/modules/manager/gitlabci/extract.js.map +1 -1
- package/dist/modules/manager/glasskube/extract.js +2 -0
- package/dist/modules/manager/glasskube/extract.js.map +1 -1
- package/dist/modules/manager/gomod/artifacts-extra.js +1 -0
- package/dist/modules/manager/gomod/artifacts-extra.js.map +1 -1
- package/dist/modules/manager/gomod/artifacts.js +1 -0
- package/dist/modules/manager/gomod/artifacts.js.map +1 -1
- package/dist/modules/manager/gomod/extract.js +1 -0
- package/dist/modules/manager/gomod/extract.js.map +1 -1
- package/dist/modules/manager/gradle/artifacts.js +1 -1
- package/dist/modules/manager/gradle/artifacts.js.map +1 -1
- package/dist/modules/manager/gradle-wrapper/utils.js +1 -0
- package/dist/modules/manager/gradle-wrapper/utils.js.map +1 -1
- package/dist/modules/manager/npm/extract/common/dependency.js +2 -1
- package/dist/modules/manager/npm/extract/common/dependency.js.map +1 -1
- package/dist/modules/manager/pep621/extract.js +1 -2
- package/dist/modules/manager/pep621/extract.js.map +1 -1
- package/dist/modules/manager/quadlet/extract.js +2 -4
- package/dist/modules/manager/quadlet/extract.js.map +1 -1
- package/dist/modules/manager/swift/artifacts.js +3 -1
- package/dist/modules/manager/swift/artifacts.js.map +1 -1
- package/dist/modules/manager/swift/extract.js +1 -0
- package/dist/modules/manager/swift/extract.js.map +1 -1
- package/dist/modules/manager/terraform/extractors/others/modules.js.map +1 -1
- package/dist/modules/manager/terraform/lockfile/index.js +1 -0
- package/dist/modules/manager/terraform/lockfile/index.js.map +1 -1
- package/dist/modules/manager/terragrunt/extract.js +1 -0
- package/dist/modules/manager/terragrunt/extract.js.map +1 -1
- package/dist/modules/manager/tflint-plugin/extract.js +1 -0
- package/dist/modules/manager/tflint-plugin/extract.js.map +1 -1
- package/dist/modules/manager/tflint-plugin/plugins.js.map +1 -1
- package/package.json +1 -1
- package/renovate-schema.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifacts.js","names":[],"sources":["../../../../lib/modules/manager/swift/artifacts.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { parseGitUrl } from '../../../util/git/url.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { trimTrailingSlash } from '../../../util/url.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { getDigest } from '../../datasource/index.ts';\nimport { scm } from '../../platform/scm.ts';\nimport type {\n PackageDependency,\n UpdateArtifact,\n UpdateArtifactsResult,\n Upgrade,\n} from '../types.ts';\nimport type { PackageResolvedPin } from './schema.ts';\nimport { PackageResolvedJson } from './schema.ts';\n\nasync function findPackageResolvedFiles(): Promise<string[]> {\n const fileList = await scm.getFileList();\n return fileList.filter((f) => f.endsWith('Package.resolved'));\n}\n\nfunction normalizeUrl(url: string): string {\n try {\n const parsed = parseGitUrl(url);\n // Only use parsed result when both resource and full_name are present,\n // otherwise fall through to basic normalization\n if (parsed.resource && parsed.full_name) {\n // Normalize to host/full_name form to allow cross-protocol matching\n // e.g. https://github.com/owner/repo, git@github.com:owner/repo.git\n // -> github.com/owner/repo\n return `${parsed.resource}/${trimTrailingSlash(parsed.full_name)}`.toLowerCase();\n }\n } catch {\n // Fall through to basic normalization\n }\n return url\n .replace(regEx(/\\.git$/), '')\n .replace(regEx(/\\/$/), '')\n .toLowerCase();\n}\n\nfunction matchPinForDep(\n dep: PackageDependency,\n pins: PackageResolvedPin[],\n): PackageResolvedPin | null {\n let depUrl: string;\n\n if (dep.datasource === GitTagsDatasource.id) {\n depUrl = dep.depName ?? '';\n } else {\n const registryUrl = dep.registryUrls?.[0] ?? 'https://github.com';\n depUrl = `${registryUrl}/${dep.depName}`;\n }\n\n const normalizedDepUrl = normalizeUrl(depUrl);\n\n return (\n pins.find((pin) => normalizeUrl(pin.location) === normalizedDepUrl) ?? null\n );\n}\n\nasync function resolveCommitSha(\n dep: Upgrade,\n newVersion: string,\n): Promise<string | null> {\n if (dep.newDigest) {\n return dep.newDigest;\n }\n\n const datasource = dep.datasource;\n const packageName = dep.packageName ?? dep.depName;\n if (!datasource || !packageName) {\n return null;\n }\n\n try {\n const digest = await getDigest(\n {\n datasource,\n packageName,\n registryUrls: dep.registryUrls,\n },\n newVersion,\n );\n return digest;\n } catch (err) {\n logger.debug(\n { err, packageName, newVersion },\n 'swift: failed to resolve commit SHA',\n );\n return null;\n }\n}\n\nfunction updatePinInJson(\n content: string,\n pin: PackageResolvedPin,\n newVersion: string,\n newRevision: string | null,\n): string {\n let updated = content;\n\n // Find the pin block by its unique identity value\n const identityPattern = regEx(\n `\"identity\"\\\\s*:\\\\s*\"${RegExp.escape(pin.identity)}\"`,\n );\n const identityMatch = identityPattern.exec(updated);\n /* istanbul ignore if: identity always exists after JSON parse + matchPinForDep */\n if (!identityMatch) {\n return content;\n }\n\n // Find the enclosing object block (search for the opening brace before identity)\n const beforeIdentity = updated.slice(0, identityMatch.index);\n const blockStart = beforeIdentity.lastIndexOf('{');\n /* istanbul ignore if: valid JSON always has enclosing braces */\n if (blockStart === -1) {\n return content;\n }\n\n // Find the closing brace of this pin block (handle nested braces)\n let braceDepth = 0;\n let blockEnd = -1;\n for (let i = blockStart; i < updated.length; i++) {\n if (updated[i] === '{') {\n braceDepth++;\n } else if (updated[i] === '}') {\n braceDepth--;\n if (braceDepth === 0) {\n blockEnd = i + 1;\n break;\n }\n }\n }\n /* istanbul ignore if: valid JSON always has matching braces */\n if (blockEnd === -1) {\n return content;\n }\n\n let pinBlock = updated.slice(blockStart, blockEnd);\n\n // Replace version within the pin block\n const versionPattern = regEx(/(?<prefix>\"version\"\\s*:\\s*)\"[^\"]*\"/);\n pinBlock = pinBlock.replace(versionPattern, `$<prefix>\"${newVersion}\"`);\n\n // Replace revision within the pin block if we have a new one\n if (newRevision) {\n const revisionPattern = regEx(/(?<prefix>\"revision\"\\s*:\\s*)\"[^\"]*\"/);\n pinBlock = pinBlock.replace(revisionPattern, `$<prefix>\"${newRevision}\"`);\n }\n\n updated = updated.slice(0, blockStart) + pinBlock + updated.slice(blockEnd);\n return updated;\n}\n\nexport async function updateArtifacts({\n updatedDeps,\n config,\n}: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> {\n if (config.isLockFileMaintenance) {\n logger.debug('swift: lockFileMaintenance is not supported');\n return null;\n }\n\n if (!updatedDeps.length) {\n logger.debug('swift: no updatedDeps, nothing to do');\n return null;\n }\n\n const resolvedFiles = await findPackageResolvedFiles();\n if (!resolvedFiles.length) {\n logger.debug('swift: no Package.resolved files found');\n return null;\n }\n\n const results: UpdateArtifactsResult[] = [];\n\n for (const resolvedFile of resolvedFiles) {\n const content = await readLocalFile(resolvedFile, 'utf8');\n if (!content) {\n logger.debug({ resolvedFile }, 'swift: could not read Package.resolved');\n continue;\n }\n\n const parseResult = PackageResolvedJson.safeParse(content);\n if (!parseResult.success) {\n logger.debug(\n { resolvedFile, err: parseResult.error },\n 'swift: could not parse Package.resolved',\n );\n continue;\n }\n\n const parsed = parseResult.data;\n let updated = content;\n\n for (const dep of updatedDeps) {\n const newValue = dep.newValue;\n if (!newValue) {\n continue;\n }\n\n // shouldn't happen\n if (!dep.newVersion) {\n logger.debug(\n {\n depName: dep.depName,\n newVersion: dep.newVersion,\n newValue: dep.newValue,\n },\n 'swift: found a newValue but not a newVersion',\n );\n continue;\n }\n\n const pin = matchPinForDep(dep, parsed.pins);\n if (!pin) {\n logger.debug(\n { depName: dep.depName },\n 'swift: no matching pin found in Package.resolved',\n );\n continue;\n }\n\n const resolvedVersion = dep.newVersion.replace(regEx(/^v/), '');\n\n // Skip if already up-to-date\n if (pin.state.version === resolvedVersion) {\n logger.debug(\n { depName: dep.depName, resolvedVersion },\n 'swift: pin already at target version',\n );\n continue;\n }\n\n const newRevision = await resolveCommitSha(dep, dep.newVersion);\n updated = updatePinInJson(updated, pin, resolvedVersion, newRevision);\n }\n\n if (updated !== content) {\n results.push({\n file: {\n type: 'addition',\n path: resolvedFile,\n contents: updated,\n },\n });\n }\n }\n\n return results.length ? results : null;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"artifacts.js","names":[],"sources":["../../../../lib/modules/manager/swift/artifacts.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { parseGitUrl } from '../../../util/git/url.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { trimTrailingSlash } from '../../../util/url.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { getDigest } from '../../datasource/index.ts';\nimport { scm } from '../../platform/scm.ts';\nimport type {\n PackageDependency,\n UpdateArtifact,\n UpdateArtifactsResult,\n Upgrade,\n} from '../types.ts';\nimport type { PackageResolvedPin } from './schema.ts';\nimport { PackageResolvedJson } from './schema.ts';\n\nasync function findPackageResolvedFiles(): Promise<string[]> {\n const fileList = await scm.getFileList();\n return fileList.filter((f) => f.endsWith('Package.resolved'));\n}\n\nfunction normalizeUrl(url: string): string {\n try {\n const parsed = parseGitUrl(url);\n // Only use parsed result when both resource and full_name are present,\n // otherwise fall through to basic normalization\n if (parsed.resource && parsed.full_name) {\n // Normalize to host/full_name form to allow cross-protocol matching\n // e.g. https://github.com/owner/repo, git@github.com:owner/repo.git\n // -> github.com/owner/repo\n return `${parsed.resource}/${trimTrailingSlash(parsed.full_name)}`.toLowerCase();\n }\n } catch {\n // Fall through to basic normalization\n }\n return url\n .replace(regEx(/\\.git$/), '')\n .replace(regEx(/\\/$/), '')\n .toLowerCase();\n}\n\nfunction matchPinForDep(\n dep: PackageDependency,\n pins: PackageResolvedPin[],\n): PackageResolvedPin | null {\n let depUrl: string;\n\n if (dep.datasource === GitTagsDatasource.id) {\n /* v8 ignore next -- extract always sets depName for a git-tags dep */\n depUrl = dep.depName ?? '';\n } else {\n const registryUrl = dep.registryUrls?.[0] ?? 'https://github.com';\n depUrl = `${registryUrl}/${dep.depName}`;\n }\n\n const normalizedDepUrl = normalizeUrl(depUrl);\n\n return (\n pins.find((pin) => normalizeUrl(pin.location) === normalizedDepUrl) ?? null\n );\n}\n\nasync function resolveCommitSha(\n dep: Upgrade,\n newVersion: string,\n): Promise<string | null> {\n if (dep.newDigest) {\n return dep.newDigest;\n }\n\n const datasource = dep.datasource;\n const packageName = dep.packageName ?? dep.depName;\n if (!datasource || !packageName) {\n return null;\n }\n\n try {\n const digest = await getDigest(\n {\n datasource,\n packageName,\n registryUrls: dep.registryUrls,\n },\n newVersion,\n );\n return digest;\n } catch (err) {\n logger.debug(\n { err, packageName, newVersion },\n 'swift: failed to resolve commit SHA',\n );\n return null;\n }\n}\n\nfunction updatePinInJson(\n content: string,\n pin: PackageResolvedPin,\n newVersion: string,\n newRevision: string | null,\n): string {\n let updated = content;\n\n // Find the pin block by its unique identity value\n const identityPattern = regEx(\n `\"identity\"\\\\s*:\\\\s*\"${RegExp.escape(pin.identity)}\"`,\n );\n const identityMatch = identityPattern.exec(updated);\n /* istanbul ignore if: identity always exists after JSON parse + matchPinForDep */\n if (!identityMatch) {\n return content;\n }\n\n // Find the enclosing object block (search for the opening brace before identity)\n const beforeIdentity = updated.slice(0, identityMatch.index);\n const blockStart = beforeIdentity.lastIndexOf('{');\n /* istanbul ignore if: valid JSON always has enclosing braces */\n if (blockStart === -1) {\n return content;\n }\n\n // Find the closing brace of this pin block (handle nested braces)\n let braceDepth = 0;\n let blockEnd = -1;\n for (let i = blockStart; i < updated.length; i++) {\n if (updated[i] === '{') {\n braceDepth++;\n } else if (updated[i] === '}') {\n braceDepth--;\n if (braceDepth === 0) {\n blockEnd = i + 1;\n break;\n }\n }\n }\n /* istanbul ignore if: valid JSON always has matching braces */\n if (blockEnd === -1) {\n return content;\n }\n\n let pinBlock = updated.slice(blockStart, blockEnd);\n\n // Replace version within the pin block\n const versionPattern = regEx(/(?<prefix>\"version\"\\s*:\\s*)\"[^\"]*\"/);\n pinBlock = pinBlock.replace(versionPattern, `$<prefix>\"${newVersion}\"`);\n\n // Replace revision within the pin block if we have a new one\n if (newRevision) {\n const revisionPattern = regEx(/(?<prefix>\"revision\"\\s*:\\s*)\"[^\"]*\"/);\n pinBlock = pinBlock.replace(revisionPattern, `$<prefix>\"${newRevision}\"`);\n }\n\n updated = updated.slice(0, blockStart) + pinBlock + updated.slice(blockEnd);\n return updated;\n}\n\nexport async function updateArtifacts({\n updatedDeps,\n config,\n}: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> {\n if (config.isLockFileMaintenance) {\n logger.debug('swift: lockFileMaintenance is not supported');\n return null;\n }\n\n if (!updatedDeps.length) {\n logger.debug('swift: no updatedDeps, nothing to do');\n return null;\n }\n\n const resolvedFiles = await findPackageResolvedFiles();\n if (!resolvedFiles.length) {\n logger.debug('swift: no Package.resolved files found');\n return null;\n }\n\n const results: UpdateArtifactsResult[] = [];\n\n for (const resolvedFile of resolvedFiles) {\n const content = await readLocalFile(resolvedFile, 'utf8');\n if (!content) {\n logger.debug({ resolvedFile }, 'swift: could not read Package.resolved');\n continue;\n }\n\n const parseResult = PackageResolvedJson.safeParse(content);\n if (!parseResult.success) {\n logger.debug(\n { resolvedFile, err: parseResult.error },\n 'swift: could not parse Package.resolved',\n );\n continue;\n }\n\n const parsed = parseResult.data;\n let updated = content;\n\n for (const dep of updatedDeps) {\n const newValue = dep.newValue;\n if (!newValue) {\n continue;\n }\n\n // shouldn't happen\n if (!dep.newVersion) {\n logger.debug(\n {\n depName: dep.depName,\n newVersion: dep.newVersion,\n newValue: dep.newValue,\n },\n 'swift: found a newValue but not a newVersion',\n );\n continue;\n }\n\n const pin = matchPinForDep(dep, parsed.pins);\n if (!pin) {\n logger.debug(\n { depName: dep.depName },\n 'swift: no matching pin found in Package.resolved',\n );\n continue;\n }\n\n const resolvedVersion = dep.newVersion.replace(regEx(/^v/), '');\n\n // Skip if already up-to-date\n if (pin.state.version === resolvedVersion) {\n logger.debug(\n { depName: dep.depName, resolvedVersion },\n 'swift: pin already at target version',\n );\n continue;\n }\n\n const newRevision = await resolveCommitSha(dep, dep.newVersion);\n updated = updatePinInJson(updated, pin, resolvedVersion, newRevision);\n }\n\n if (updated !== content) {\n results.push({\n file: {\n type: 'addition',\n path: resolvedFile,\n contents: updated,\n },\n });\n }\n }\n\n return results.length ? results : null;\n}\n"],"mappings":"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"}
|
|
@@ -253,6 +253,7 @@ function extractPackageFile(content) {
|
|
|
253
253
|
switch (state) {
|
|
254
254
|
case null:
|
|
255
255
|
if (deps.length) break;
|
|
256
|
+
// v8 ignore else -- this state is only re-entered at a deps boundary
|
|
256
257
|
if (label === DEPS) state = "dependencies";
|
|
257
258
|
break;
|
|
258
259
|
case "dependencies":
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/swift/extract.ts"],"sourcesContent":["import { detectPlatform } from '../../../util/common.ts';\nimport { getHttpUrl } from '../../../util/git/url.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { parseUrl } from '../../../util/url.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport { GitlabTagsDatasource } from '../../datasource/gitlab-tags/index.ts';\nimport type { PackageDependency, PackageFileContent } from '../types.ts';\nimport type { MatchResult } from './types.ts';\n\nconst regExps = {\n wildcard: regEx(/^.*?/),\n space: regEx(/(?:\\s+|\\/\\/[^\\n]*|\\/\\*.*\\*\\/)+/s),\n depsKeyword: regEx(/dependencies/),\n colon: regEx(/:/),\n beginSection: regEx(/\\[/),\n endSection: regEx(/],?/),\n package: regEx(/\\s*.\\s*package\\s*\\(\\s*/),\n urlKey: regEx(/url/),\n stringLiteral: regEx(/\"[^\"]+\"/),\n comma: regEx(/,/),\n from: regEx(/from/),\n rangeOp: regEx(/\\.\\.[.<]/),\n exactVersion: regEx(/\\.\\s*exact\\s*\\(\\s*/),\n exactVersionLabel: regEx(/\\s*exact:/),\n traitsLabel: regEx(/\\s*traits\\s*:/),\n // This pattern consumes any `traits` content until the next package declaration,\n // as the traits syntax can be quite complex and does not need to be parsed in detail for package extraction.\n traitsConsumeToNextPackage: regEx(/.*\\.\\s*package\\s*\\(\\s*/),\n};\n\nconst WILDCARD = 'wildcard';\nconst SPACE = 'space';\nconst DEPS = 'depsKeyword';\nconst COLON = 'colon';\nconst BEGIN_SECTION = 'beginSection';\nconst END_SECTION = 'endSection';\nconst PACKAGE = 'package';\nconst URL_KEY = 'urlKey';\nconst STRING_LITERAL = 'stringLiteral';\nconst COMMA = 'comma';\nconst FROM = 'from';\nconst RANGE_OP = 'rangeOp';\nconst EXACT_VERSION = 'exactVersion';\nconst EXACT_VERSION_LABEL = 'exactVersionLabel';\nconst TRAITS_LABEL = 'traitsLabel';\nconst TRAITS_CONSUME_TO_NEXT_PACKAGE = 'traitsConsumeToNextPackage';\n\nconst searchLabels = {\n wildcard: WILDCARD,\n space: SPACE,\n depsKeyword: DEPS,\n colon: COLON,\n beginSection: BEGIN_SECTION,\n endSection: END_SECTION,\n package: PACKAGE,\n urlKey: URL_KEY,\n stringLiteral: STRING_LITERAL,\n comma: COMMA,\n from: FROM,\n rangeOp: RANGE_OP,\n exactVersion: EXACT_VERSION,\n exactVersionLabel: EXACT_VERSION_LABEL,\n traitsLabel: TRAITS_LABEL,\n traitsConsumeToNextPackage: TRAITS_CONSUME_TO_NEXT_PACKAGE,\n};\n\nfunction searchKeysForState(state: string | null): (keyof typeof regExps)[] {\n switch (state) {\n case 'dependencies':\n return [SPACE, COLON, WILDCARD];\n case 'dependencies:':\n return [SPACE, BEGIN_SECTION, WILDCARD];\n case 'dependencies: [':\n return [SPACE, PACKAGE, COMMA, TRAITS_LABEL, END_SECTION];\n case '.package(':\n return [SPACE, URL_KEY, PACKAGE, END_SECTION];\n case '.package(url':\n return [SPACE, COLON, PACKAGE, END_SECTION];\n case '.package(url:':\n return [SPACE, STRING_LITERAL, PACKAGE, END_SECTION];\n case '.package(url: [depName]':\n return [SPACE, COMMA, PACKAGE, END_SECTION];\n case '.package(url: [depName],':\n return [\n SPACE,\n FROM,\n STRING_LITERAL,\n RANGE_OP,\n EXACT_VERSION,\n EXACT_VERSION_LABEL,\n PACKAGE,\n END_SECTION,\n ];\n case '.package(url: [depName], .exact(':\n return [SPACE, STRING_LITERAL, PACKAGE, COMMA, TRAITS_LABEL, END_SECTION];\n case '.package(url: [depName], exact:':\n return [SPACE, STRING_LITERAL, PACKAGE, COMMA, TRAITS_LABEL, END_SECTION];\n case '.package(url: [depName], from':\n return [SPACE, COLON, PACKAGE, COMMA, TRAITS_LABEL, END_SECTION];\n case '.package(url: [depName], from:':\n return [SPACE, STRING_LITERAL, PACKAGE, COMMA, TRAITS_LABEL, END_SECTION];\n case '.package(url: [depName], [value]':\n return [SPACE, RANGE_OP, PACKAGE, COMMA, TRAITS_LABEL, END_SECTION];\n case '.package(url: [depName], [rangeFrom][rangeOp]':\n return [SPACE, STRING_LITERAL, PACKAGE, COMMA, TRAITS_LABEL, END_SECTION];\n case 'traits:':\n return [SPACE, TRAITS_CONSUME_TO_NEXT_PACKAGE];\n default:\n return [DEPS];\n }\n}\nfunction getMatch(str: string, state: string | null): MatchResult | null {\n const keys = searchKeysForState(state);\n let result: MatchResult | null = null;\n for (const key of keys) {\n const regex = regExps[key];\n const label = searchLabels[key];\n const match = regex.exec(str);\n if (match) {\n const idx = match.index;\n const substr = match[0];\n const len = substr.length;\n if (idx === 0) {\n return { idx, len, label, substr };\n }\n if (!result || idx < result.idx) {\n result = { idx, len, label, substr };\n }\n }\n }\n return result;\n}\n\nfunction parseDependencyUrl(\n url: string | null,\n): { depName: string; datasource: string; registryUrls?: string[] } | null {\n // istanbul ignore if\n if (!url) {\n return null;\n }\n\n let normalizedUrl: string;\n try {\n normalizedUrl = getHttpUrl(url);\n } catch {\n return null;\n }\n\n const parsedUrl = parseUrl(normalizedUrl);\n // v8 ignore if -- getHttpUrl always returns a parseable URL\n if (!parsedUrl) {\n return null;\n }\n const { host, pathname, protocol } = parsedUrl;\n const platform = detectPlatform(normalizedUrl);\n if (platform === 'github' || platform === 'gitlab') {\n const depName = pathname\n .replace(regEx(/^\\//), '')\n .replace(regEx(/\\.git$/), '')\n .replace(regEx(/\\/$/), '');\n const datasource =\n platform === 'github' ? GithubTagsDatasource.id : GitlabTagsDatasource.id;\n\n const isGitHubPublic = host === 'github.com';\n const isGitLabPublic = host === 'gitlab.com';\n\n if (!isGitHubPublic && !isGitLabPublic) {\n const baseUrl = `${protocol}//${host}`;\n return { depName, datasource, registryUrls: [baseUrl] };\n }\n\n return { depName, datasource };\n }\n return { depName: url, datasource: GitTagsDatasource.id };\n}\n\nexport function extractPackageFile(content: string): PackageFileContent | null {\n if (!content) {\n return null;\n }\n\n const deps: PackageDependency[] = [];\n const result: PackageFileContent = {\n deps,\n };\n\n let restStr = content;\n let state: string | null = null;\n let match = getMatch(restStr, state);\n\n let packageName: string | null = null;\n let currentValue: string | null = null;\n\n function yieldDep(): void {\n // istanbul ignore if\n if (!packageName) {\n return;\n }\n const parsedUrl = parseDependencyUrl(packageName);\n if (parsedUrl && currentValue) {\n const { depName, datasource, registryUrls } = parsedUrl;\n\n const dep: PackageDependency = {\n datasource,\n depName,\n currentValue,\n ...(registryUrls?.length && { registryUrls }),\n };\n\n deps.push(dep);\n }\n packageName = null;\n currentValue = null;\n }\n\n while (match) {\n const { idx, len, label, substr } = match;\n\n switch (state) {\n case null:\n if (deps.length) {\n break;\n }\n if (label === DEPS) {\n state = 'dependencies';\n }\n break;\n case 'dependencies':\n if (label === COLON) {\n state = 'dependencies:';\n } else if (label !== SPACE) {\n state = null;\n }\n break;\n case 'dependencies:':\n if (label === BEGIN_SECTION) {\n state = 'dependencies: [';\n } else if (label !== SPACE) {\n state = null;\n }\n break;\n case 'dependencies: [':\n if (label === END_SECTION) {\n yieldDep();\n state = null;\n } else if (label === PACKAGE) {\n yieldDep();\n state = '.package(';\n } else if (label === TRAITS_LABEL) {\n state = 'traits:';\n }\n break;\n case '.package(':\n if (label === END_SECTION) {\n yieldDep();\n state = null;\n } else if (label === URL_KEY) {\n state = '.package(url';\n } else if (label === PACKAGE) {\n yieldDep();\n }\n break;\n case '.package(url':\n if (label === END_SECTION) {\n yieldDep();\n state = null;\n } else if (label === COLON) {\n state = '.package(url:';\n } else if (label === PACKAGE) {\n yieldDep();\n state = '.package(';\n }\n break;\n case '.package(url:':\n if (label === END_SECTION) {\n yieldDep();\n state = null;\n } else if (label === STRING_LITERAL) {\n packageName = substr\n .replace(regEx(/^\"/), '')\n .replace(regEx(/\"$/), '');\n state = '.package(url: [depName]';\n } else if (label === PACKAGE) {\n yieldDep();\n state = '.package(';\n }\n break;\n case '.package(url: [depName]':\n if (label === END_SECTION) {\n yieldDep();\n state = null;\n } else if (label === COMMA) {\n state = '.package(url: [depName],';\n } else if (label === PACKAGE) {\n yieldDep();\n state = '.package(';\n }\n break;\n case '.package(url: [depName],':\n if (label === END_SECTION) {\n yieldDep();\n state = null;\n } else if (label === FROM) {\n currentValue = substr;\n state = '.package(url: [depName], from';\n } else if (label === STRING_LITERAL) {\n currentValue = substr;\n state = '.package(url: [depName], [value]';\n } else if (label === RANGE_OP) {\n currentValue = substr;\n state = '.package(url: [depName], [rangeFrom][rangeOp]';\n } else if (label === EXACT_VERSION) {\n state = '.package(url: [depName], .exact(';\n } else if (label === EXACT_VERSION_LABEL) {\n state = '.package(url: [depName], exact:';\n } else if (label === PACKAGE) {\n yieldDep();\n state = '.package(';\n }\n break;\n case '.package(url: [depName], .exact(':\n if (label === END_SECTION) {\n yieldDep();\n state = null;\n } else if (label === STRING_LITERAL) {\n currentValue = substr.slice(1, substr.length - 1);\n yieldDep();\n } else if (label === PACKAGE) {\n yieldDep();\n state = '.package(';\n }\n break;\n case '.package(url: [depName], exact:':\n if (label === END_SECTION) {\n yieldDep();\n state = null;\n } else if (label === STRING_LITERAL) {\n currentValue = substr.slice(1, substr.length - 1);\n yieldDep();\n state = 'dependencies: [';\n } else if (label === PACKAGE) {\n yieldDep();\n state = '.package(';\n }\n break;\n case '.package(url: [depName], from':\n if (label === END_SECTION) {\n yieldDep();\n state = null;\n } else if (label === COLON) {\n currentValue += substr;\n state = '.package(url: [depName], from:';\n } else if (label === SPACE) {\n currentValue += substr;\n } else if (label === PACKAGE) {\n yieldDep();\n state = '.package(';\n }\n break;\n case '.package(url: [depName], from:':\n if (label === END_SECTION) {\n yieldDep();\n state = null;\n } else if (label === STRING_LITERAL) {\n currentValue += substr;\n yieldDep();\n state = 'dependencies: [';\n } else if (label === SPACE) {\n currentValue += substr;\n } else if (label === PACKAGE) {\n yieldDep();\n state = '.package(';\n }\n break;\n case '.package(url: [depName], [value]':\n if (label === END_SECTION) {\n yieldDep();\n state = null;\n } else if (label === RANGE_OP) {\n currentValue += substr;\n state = '.package(url: [depName], [rangeFrom][rangeOp]';\n } else if (label === SPACE) {\n currentValue += substr;\n } else if (label === PACKAGE) {\n yieldDep();\n state = '.package(';\n }\n break;\n case '.package(url: [depName], [rangeFrom][rangeOp]':\n if (label === END_SECTION) {\n yieldDep();\n state = null;\n } else if (label === STRING_LITERAL) {\n currentValue += substr;\n state = 'dependencies: [';\n } else if (label === SPACE) {\n currentValue += substr;\n } else if (label === PACKAGE) {\n yieldDep();\n state = '.package(';\n }\n break;\n case 'traits:':\n if (label === TRAITS_CONSUME_TO_NEXT_PACKAGE) {\n yieldDep();\n state = '.package(';\n }\n break;\n }\n restStr = restStr.slice(idx + len);\n match = getMatch(restStr, state);\n }\n return deps.length ? result : null;\n}\n"],"mappings":";;;;;;;;AAUA,MAAM,UAAU;CACd,UAAU,MAAM,MAAM;CACtB,OAAO,MAAM,iCAAiC;CAC9C,aAAa,MAAM,cAAc;CACjC,OAAO,MAAM,GAAG;CAChB,cAAc,MAAM,IAAI;CACxB,YAAY,MAAM,KAAK;CACvB,SAAS,MAAM,wBAAwB;CACvC,QAAQ,MAAM,KAAK;CACnB,eAAe,MAAM,SAAS;CAC9B,OAAO,MAAM,GAAG;CAChB,MAAM,MAAM,MAAM;CAClB,SAAS,MAAM,UAAU;CACzB,cAAc,MAAM,oBAAoB;CACxC,mBAAmB,MAAM,WAAW;CACpC,aAAa,MAAM,eAAe;CAGlC,4BAA4B,MAAM,wBAAwB;AAC5D;AAEA,MAAM,WAAW;AACjB,MAAM,QAAQ;AACd,MAAM,OAAO;AACb,MAAM,QAAQ;AACd,MAAM,gBAAgB;AACtB,MAAM,cAAc;AACpB,MAAM,UAAU;AAChB,MAAM,UAAU;AAChB,MAAM,iBAAiB;AACvB,MAAM,QAAQ;AACd,MAAM,OAAO;AACb,MAAM,WAAW;AACjB,MAAM,gBAAgB;AACtB,MAAM,sBAAsB;AAC5B,MAAM,eAAe;AACrB,MAAM,iCAAiC;AAEvC,MAAM,eAAe;CACnB,UAAU;CACV,OAAO;CACP,aAAa;CACb,OAAO;CACP,cAAc;CACd,YAAY;CACZ,SAAS;CACT,QAAQ;CACR,eAAe;CACf,OAAO;CACP,MAAM;CACN,SAAS;CACT,cAAc;CACd,mBAAmB;CACnB,aAAa;CACb,4BAA4B;AAC9B;AAEA,SAAS,mBAAmB,OAAgD;CAC1E,QAAQ,OAAR;EACE,KAAK,gBACH,OAAO;GAAC;GAAO;GAAO;EAAQ;EAChC,KAAK,iBACH,OAAO;GAAC;GAAO;GAAe;EAAQ;EACxC,KAAK,mBACH,OAAO;GAAC;GAAO;GAAS;GAAO;GAAc;EAAW;EAC1D,KAAK,aACH,OAAO;GAAC;GAAO;GAAS;GAAS;EAAW;EAC9C,KAAK,gBACH,OAAO;GAAC;GAAO;GAAO;GAAS;EAAW;EAC5C,KAAK,iBACH,OAAO;GAAC;GAAO;GAAgB;GAAS;EAAW;EACrD,KAAK,2BACH,OAAO;GAAC;GAAO;GAAO;GAAS;EAAW;EAC5C,KAAK,4BACH,OAAO;GACL;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF;EACF,KAAK,oCACH,OAAO;GAAC;GAAO;GAAgB;GAAS;GAAO;GAAc;EAAW;EAC1E,KAAK,mCACH,OAAO;GAAC;GAAO;GAAgB;GAAS;GAAO;GAAc;EAAW;EAC1E,KAAK,iCACH,OAAO;GAAC;GAAO;GAAO;GAAS;GAAO;GAAc;EAAW;EACjE,KAAK,kCACH,OAAO;GAAC;GAAO;GAAgB;GAAS;GAAO;GAAc;EAAW;EAC1E,KAAK,oCACH,OAAO;GAAC;GAAO;GAAU;GAAS;GAAO;GAAc;EAAW;EACpE,KAAK,iDACH,OAAO;GAAC;GAAO;GAAgB;GAAS;GAAO;GAAc;EAAW;EAC1E,KAAK,WACH,OAAO,CAAC,OAAO,8BAA8B;EAC/C,SACE,OAAO,CAAC,IAAI;CAChB;AACF;AACA,SAAS,SAAS,KAAa,OAA0C;CACvE,MAAM,OAAO,mBAAmB,KAAK;CACrC,IAAI,SAA6B;CACjC,KAAK,MAAM,OAAO,MAAM;EACtB,MAAM,QAAQ,QAAQ;EACtB,MAAM,QAAQ,aAAa;EAC3B,MAAM,QAAQ,MAAM,KAAK,GAAG;EAC5B,IAAI,OAAO;GACT,MAAM,MAAM,MAAM;GAClB,MAAM,SAAS,MAAM;GACrB,MAAM,MAAM,OAAO;GACnB,IAAI,QAAQ,GACV,OAAO;IAAE;IAAK;IAAK;IAAO;GAAO;GAEnC,IAAI,CAAC,UAAU,MAAM,OAAO,KAC1B,SAAS;IAAE;IAAK;IAAK;IAAO;GAAO;EAEvC;CACF;CACA,OAAO;AACT;AAEA,SAAS,mBACP,KACyE;;CAEzE,IAAI,CAAC,KACH,OAAO;CAGT,IAAI;CACJ,IAAI;EACF,gBAAgB,WAAW,GAAG;CAChC,QAAQ;EACN,OAAO;CACT;CAEA,MAAM,YAAY,SAAS,aAAa;;CAExC,IAAI,CAAC,WACH,OAAO;CAET,MAAM,EAAE,MAAM,UAAU,aAAa;CACrC,MAAM,WAAW,eAAe,aAAa;CAC7C,IAAI,aAAa,YAAY,aAAa,UAAU;EAClD,MAAM,UAAU,SACb,QAAQ,MAAM,KAAK,GAAG,EAAE,CAAC,CACzB,QAAQ,MAAM,QAAQ,GAAG,EAAE,CAAC,CAC5B,QAAQ,MAAM,KAAK,GAAG,EAAE;EAC3B,MAAM,aACJ,aAAa,WAAW,qBAAqB,KAAK,qBAAqB;EAKzE,IAAI,EAHmB,SAAS,iBAGT,EAFA,SAAS,eAI9B,OAAO;GAAE;GAAS;GAAY,cAAc,CAAC,GAD1B,SAAS,IAAI,MACoB;EAAE;EAGxD,OAAO;GAAE;GAAS;EAAW;CAC/B;CACA,OAAO;EAAE,SAAS;EAAK,YAAY,kBAAkB;CAAG;AAC1D;AAEA,SAAgB,mBAAmB,SAA4C;CAC7E,IAAI,CAAC,SACH,OAAO;CAGT,MAAM,OAA4B,CAAC;CACnC,MAAM,SAA6B,EACjC,KACF;CAEA,IAAI,UAAU;CACd,IAAI,QAAuB;CAC3B,IAAI,QAAQ,SAAS,SAAS,KAAK;CAEnC,IAAI,cAA6B;CACjC,IAAI,eAA8B;CAElC,SAAS,WAAiB;;EAExB,IAAI,CAAC,aACH;EAEF,MAAM,YAAY,mBAAmB,WAAW;EAChD,IAAI,aAAa,cAAc;GAC7B,MAAM,EAAE,SAAS,YAAY,iBAAiB;GAE9C,MAAM,MAAyB;IAC7B;IACA;IACA;IACA,GAAI,cAAc,UAAU,EAAE,aAAa;GAC7C;GAEA,KAAK,KAAK,GAAG;EACf;EACA,cAAc;EACd,eAAe;CACjB;CAEA,OAAO,OAAO;EACZ,MAAM,EAAE,KAAK,KAAK,OAAO,WAAW;EAEpC,QAAQ,OAAR;GACE,KAAK;IACH,IAAI,KAAK,QACP;IAEF,IAAI,UAAU,MACZ,QAAQ;IAEV;GACF,KAAK;IACH,IAAI,UAAU,OACZ,QAAQ;SACH,IAAI,UAAU,OACnB,QAAQ;IAEV;GACF,KAAK;IACH,IAAI,UAAU,eACZ,QAAQ;SACH,IAAI,UAAU,OACnB,QAAQ;IAEV;GACF,KAAK;IACH,IAAI,UAAU,aAAa;KACzB,SAAS;KACT,QAAQ;IACV,OAAO,IAAI,UAAU,SAAS;KAC5B,SAAS;KACT,QAAQ;IACV,OAAO,IAAI,UAAU,cACnB,QAAQ;IAEV;GACF,KAAK;IACH,IAAI,UAAU,aAAa;KACzB,SAAS;KACT,QAAQ;IACV,OAAO,IAAI,UAAU,SACnB,QAAQ;SACH,IAAI,UAAU,SACnB,SAAS;IAEX;GACF,KAAK;IACH,IAAI,UAAU,aAAa;KACzB,SAAS;KACT,QAAQ;IACV,OAAO,IAAI,UAAU,OACnB,QAAQ;SACH,IAAI,UAAU,SAAS;KAC5B,SAAS;KACT,QAAQ;IACV;IACA;GACF,KAAK;IACH,IAAI,UAAU,aAAa;KACzB,SAAS;KACT,QAAQ;IACV,OAAO,IAAI,UAAU,gBAAgB;KACnC,cAAc,OACX,QAAQ,MAAM,IAAI,GAAG,EAAE,CAAC,CACxB,QAAQ,MAAM,IAAI,GAAG,EAAE;KAC1B,QAAQ;IACV,OAAO,IAAI,UAAU,SAAS;KAC5B,SAAS;KACT,QAAQ;IACV;IACA;GACF,KAAK;IACH,IAAI,UAAU,aAAa;KACzB,SAAS;KACT,QAAQ;IACV,OAAO,IAAI,UAAU,OACnB,QAAQ;SACH,IAAI,UAAU,SAAS;KAC5B,SAAS;KACT,QAAQ;IACV;IACA;GACF,KAAK;IACH,IAAI,UAAU,aAAa;KACzB,SAAS;KACT,QAAQ;IACV,OAAO,IAAI,UAAU,MAAM;KACzB,eAAe;KACf,QAAQ;IACV,OAAO,IAAI,UAAU,gBAAgB;KACnC,eAAe;KACf,QAAQ;IACV,OAAO,IAAI,UAAU,UAAU;KAC7B,eAAe;KACf,QAAQ;IACV,OAAO,IAAI,UAAU,eACnB,QAAQ;SACH,IAAI,UAAU,qBACnB,QAAQ;SACH,IAAI,UAAU,SAAS;KAC5B,SAAS;KACT,QAAQ;IACV;IACA;GACF,KAAK;IACH,IAAI,UAAU,aAAa;KACzB,SAAS;KACT,QAAQ;IACV,OAAO,IAAI,UAAU,gBAAgB;KACnC,eAAe,OAAO,MAAM,GAAG,OAAO,SAAS,CAAC;KAChD,SAAS;IACX,OAAO,IAAI,UAAU,SAAS;KAC5B,SAAS;KACT,QAAQ;IACV;IACA;GACF,KAAK;IACH,IAAI,UAAU,aAAa;KACzB,SAAS;KACT,QAAQ;IACV,OAAO,IAAI,UAAU,gBAAgB;KACnC,eAAe,OAAO,MAAM,GAAG,OAAO,SAAS,CAAC;KAChD,SAAS;KACT,QAAQ;IACV,OAAO,IAAI,UAAU,SAAS;KAC5B,SAAS;KACT,QAAQ;IACV;IACA;GACF,KAAK;IACH,IAAI,UAAU,aAAa;KACzB,SAAS;KACT,QAAQ;IACV,OAAO,IAAI,UAAU,OAAO;KAC1B,gBAAgB;KAChB,QAAQ;IACV,OAAO,IAAI,UAAU,OACnB,gBAAgB;SACX,IAAI,UAAU,SAAS;KAC5B,SAAS;KACT,QAAQ;IACV;IACA;GACF,KAAK;IACH,IAAI,UAAU,aAAa;KACzB,SAAS;KACT,QAAQ;IACV,OAAO,IAAI,UAAU,gBAAgB;KACnC,gBAAgB;KAChB,SAAS;KACT,QAAQ;IACV,OAAO,IAAI,UAAU,OACnB,gBAAgB;SACX,IAAI,UAAU,SAAS;KAC5B,SAAS;KACT,QAAQ;IACV;IACA;GACF,KAAK;IACH,IAAI,UAAU,aAAa;KACzB,SAAS;KACT,QAAQ;IACV,OAAO,IAAI,UAAU,UAAU;KAC7B,gBAAgB;KAChB,QAAQ;IACV,OAAO,IAAI,UAAU,OACnB,gBAAgB;SACX,IAAI,UAAU,SAAS;KAC5B,SAAS;KACT,QAAQ;IACV;IACA;GACF,KAAK;IACH,IAAI,UAAU,aAAa;KACzB,SAAS;KACT,QAAQ;IACV,OAAO,IAAI,UAAU,gBAAgB;KACnC,gBAAgB;KAChB,QAAQ;IACV,OAAO,IAAI,UAAU,OACnB,gBAAgB;SACX,IAAI,UAAU,SAAS;KAC5B,SAAS;KACT,QAAQ;IACV;IACA;GACF,KAAK,WACH,IAAI,UAAU,gCAAgC;IAC5C,SAAS;IACT,QAAQ;GACV;EAEJ;EACA,UAAU,QAAQ,MAAM,MAAM,GAAG;EACjC,QAAQ,SAAS,SAAS,KAAK;CACjC;CACA,OAAO,KAAK,SAAS,SAAS;AAChC"}
|
|
1
|
+
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/swift/extract.ts"],"sourcesContent":["import { detectPlatform } from '../../../util/common.ts';\nimport { getHttpUrl } from '../../../util/git/url.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { parseUrl } from '../../../util/url.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport { GitlabTagsDatasource } from '../../datasource/gitlab-tags/index.ts';\nimport type { PackageDependency, PackageFileContent } from '../types.ts';\nimport type { MatchResult } from './types.ts';\n\nconst regExps = {\n wildcard: regEx(/^.*?/),\n space: regEx(/(?:\\s+|\\/\\/[^\\n]*|\\/\\*.*\\*\\/)+/s),\n depsKeyword: regEx(/dependencies/),\n colon: regEx(/:/),\n beginSection: regEx(/\\[/),\n endSection: regEx(/],?/),\n package: regEx(/\\s*.\\s*package\\s*\\(\\s*/),\n urlKey: regEx(/url/),\n stringLiteral: regEx(/\"[^\"]+\"/),\n comma: regEx(/,/),\n from: regEx(/from/),\n rangeOp: regEx(/\\.\\.[.<]/),\n exactVersion: regEx(/\\.\\s*exact\\s*\\(\\s*/),\n exactVersionLabel: regEx(/\\s*exact:/),\n traitsLabel: regEx(/\\s*traits\\s*:/),\n // This pattern consumes any `traits` content until the next package declaration,\n // as the traits syntax can be quite complex and does not need to be parsed in detail for package extraction.\n traitsConsumeToNextPackage: regEx(/.*\\.\\s*package\\s*\\(\\s*/),\n};\n\nconst WILDCARD = 'wildcard';\nconst SPACE = 'space';\nconst DEPS = 'depsKeyword';\nconst COLON = 'colon';\nconst BEGIN_SECTION = 'beginSection';\nconst END_SECTION = 'endSection';\nconst PACKAGE = 'package';\nconst URL_KEY = 'urlKey';\nconst STRING_LITERAL = 'stringLiteral';\nconst COMMA = 'comma';\nconst FROM = 'from';\nconst RANGE_OP = 'rangeOp';\nconst EXACT_VERSION = 'exactVersion';\nconst EXACT_VERSION_LABEL = 'exactVersionLabel';\nconst TRAITS_LABEL = 'traitsLabel';\nconst TRAITS_CONSUME_TO_NEXT_PACKAGE = 'traitsConsumeToNextPackage';\n\nconst searchLabels = {\n wildcard: WILDCARD,\n space: SPACE,\n depsKeyword: DEPS,\n colon: COLON,\n beginSection: BEGIN_SECTION,\n endSection: END_SECTION,\n package: PACKAGE,\n urlKey: URL_KEY,\n stringLiteral: STRING_LITERAL,\n comma: COMMA,\n from: FROM,\n rangeOp: RANGE_OP,\n exactVersion: EXACT_VERSION,\n exactVersionLabel: EXACT_VERSION_LABEL,\n traitsLabel: TRAITS_LABEL,\n traitsConsumeToNextPackage: TRAITS_CONSUME_TO_NEXT_PACKAGE,\n};\n\nfunction searchKeysForState(state: string | null): (keyof typeof regExps)[] {\n switch (state) {\n case 'dependencies':\n return [SPACE, COLON, WILDCARD];\n case 'dependencies:':\n return [SPACE, BEGIN_SECTION, WILDCARD];\n case 'dependencies: [':\n return [SPACE, PACKAGE, COMMA, TRAITS_LABEL, END_SECTION];\n case '.package(':\n return [SPACE, URL_KEY, PACKAGE, END_SECTION];\n case '.package(url':\n return [SPACE, COLON, PACKAGE, END_SECTION];\n case '.package(url:':\n return [SPACE, STRING_LITERAL, PACKAGE, END_SECTION];\n case '.package(url: [depName]':\n return [SPACE, COMMA, PACKAGE, END_SECTION];\n case '.package(url: [depName],':\n return [\n SPACE,\n FROM,\n STRING_LITERAL,\n RANGE_OP,\n EXACT_VERSION,\n EXACT_VERSION_LABEL,\n PACKAGE,\n END_SECTION,\n ];\n case '.package(url: [depName], .exact(':\n return [SPACE, STRING_LITERAL, PACKAGE, COMMA, TRAITS_LABEL, END_SECTION];\n case '.package(url: [depName], exact:':\n return [SPACE, STRING_LITERAL, PACKAGE, COMMA, TRAITS_LABEL, END_SECTION];\n case '.package(url: [depName], from':\n return [SPACE, COLON, PACKAGE, COMMA, TRAITS_LABEL, END_SECTION];\n case '.package(url: [depName], from:':\n return [SPACE, STRING_LITERAL, PACKAGE, COMMA, TRAITS_LABEL, END_SECTION];\n case '.package(url: [depName], [value]':\n return [SPACE, RANGE_OP, PACKAGE, COMMA, TRAITS_LABEL, END_SECTION];\n case '.package(url: [depName], [rangeFrom][rangeOp]':\n return [SPACE, STRING_LITERAL, PACKAGE, COMMA, TRAITS_LABEL, END_SECTION];\n case 'traits:':\n return [SPACE, TRAITS_CONSUME_TO_NEXT_PACKAGE];\n default:\n return [DEPS];\n }\n}\nfunction getMatch(str: string, state: string | null): MatchResult | null {\n const keys = searchKeysForState(state);\n let result: MatchResult | null = null;\n for (const key of keys) {\n const regex = regExps[key];\n const label = searchLabels[key];\n const match = regex.exec(str);\n if (match) {\n const idx = match.index;\n const substr = match[0];\n const len = substr.length;\n if (idx === 0) {\n return { idx, len, label, substr };\n }\n if (!result || idx < result.idx) {\n result = { idx, len, label, substr };\n }\n }\n }\n return result;\n}\n\nfunction parseDependencyUrl(\n url: string | null,\n): { depName: string; datasource: string; registryUrls?: string[] } | null {\n // istanbul ignore if\n if (!url) {\n return null;\n }\n\n let normalizedUrl: string;\n try {\n normalizedUrl = getHttpUrl(url);\n } catch {\n return null;\n }\n\n const parsedUrl = parseUrl(normalizedUrl);\n // v8 ignore if -- getHttpUrl always returns a parseable URL\n if (!parsedUrl) {\n return null;\n }\n const { host, pathname, protocol } = parsedUrl;\n const platform = detectPlatform(normalizedUrl);\n if (platform === 'github' || platform === 'gitlab') {\n const depName = pathname\n .replace(regEx(/^\\//), '')\n .replace(regEx(/\\.git$/), '')\n .replace(regEx(/\\/$/), '');\n const datasource =\n platform === 'github' ? GithubTagsDatasource.id : GitlabTagsDatasource.id;\n\n const isGitHubPublic = host === 'github.com';\n const isGitLabPublic = host === 'gitlab.com';\n\n if (!isGitHubPublic && !isGitLabPublic) {\n const baseUrl = `${protocol}//${host}`;\n return { depName, datasource, registryUrls: [baseUrl] };\n }\n\n return { depName, datasource };\n }\n return { depName: url, datasource: GitTagsDatasource.id };\n}\n\nexport function extractPackageFile(content: string): PackageFileContent | null {\n if (!content) {\n return null;\n }\n\n const deps: PackageDependency[] = [];\n const result: PackageFileContent = {\n deps,\n };\n\n let restStr = content;\n let state: string | null = null;\n let match = getMatch(restStr, state);\n\n let packageName: string | null = null;\n let currentValue: string | null = null;\n\n function yieldDep(): void {\n // istanbul ignore if\n if (!packageName) {\n return;\n }\n const parsedUrl = parseDependencyUrl(packageName);\n if (parsedUrl && currentValue) {\n const { depName, datasource, registryUrls } = parsedUrl;\n\n const dep: PackageDependency = {\n datasource,\n depName,\n currentValue,\n ...(registryUrls?.length && { registryUrls }),\n };\n\n deps.push(dep);\n }\n packageName = null;\n currentValue = null;\n }\n\n while (match) {\n const { idx, len, label, substr } = match;\n\n switch (state) {\n case null:\n if (deps.length) {\n break;\n }\n // v8 ignore else -- this state is only re-entered at a deps boundary\n if (label === DEPS) {\n state = 'dependencies';\n }\n break;\n case 'dependencies':\n if (label === COLON) {\n state = 'dependencies:';\n } else if (label !== SPACE) {\n state = null;\n }\n break;\n case 'dependencies:':\n if (label === BEGIN_SECTION) {\n state = 'dependencies: [';\n } else if (label !== SPACE) {\n state = null;\n }\n break;\n case 'dependencies: [':\n if (label === END_SECTION) {\n yieldDep();\n state = null;\n } else if (label === PACKAGE) {\n yieldDep();\n state = '.package(';\n } else if (label === TRAITS_LABEL) {\n state = 'traits:';\n }\n break;\n case '.package(':\n if (label === END_SECTION) {\n yieldDep();\n state = null;\n } else if (label === URL_KEY) {\n state = '.package(url';\n } else if (label === PACKAGE) {\n yieldDep();\n }\n break;\n case '.package(url':\n if (label === END_SECTION) {\n yieldDep();\n state = null;\n } else if (label === COLON) {\n state = '.package(url:';\n } else if (label === PACKAGE) {\n yieldDep();\n state = '.package(';\n }\n break;\n case '.package(url:':\n if (label === END_SECTION) {\n yieldDep();\n state = null;\n } else if (label === STRING_LITERAL) {\n packageName = substr\n .replace(regEx(/^\"/), '')\n .replace(regEx(/\"$/), '');\n state = '.package(url: [depName]';\n } else if (label === PACKAGE) {\n yieldDep();\n state = '.package(';\n }\n break;\n case '.package(url: [depName]':\n if (label === END_SECTION) {\n yieldDep();\n state = null;\n } else if (label === COMMA) {\n state = '.package(url: [depName],';\n } else if (label === PACKAGE) {\n yieldDep();\n state = '.package(';\n }\n break;\n case '.package(url: [depName],':\n if (label === END_SECTION) {\n yieldDep();\n state = null;\n } else if (label === FROM) {\n currentValue = substr;\n state = '.package(url: [depName], from';\n } else if (label === STRING_LITERAL) {\n currentValue = substr;\n state = '.package(url: [depName], [value]';\n } else if (label === RANGE_OP) {\n currentValue = substr;\n state = '.package(url: [depName], [rangeFrom][rangeOp]';\n } else if (label === EXACT_VERSION) {\n state = '.package(url: [depName], .exact(';\n } else if (label === EXACT_VERSION_LABEL) {\n state = '.package(url: [depName], exact:';\n } else if (label === PACKAGE) {\n yieldDep();\n state = '.package(';\n }\n break;\n case '.package(url: [depName], .exact(':\n if (label === END_SECTION) {\n yieldDep();\n state = null;\n } else if (label === STRING_LITERAL) {\n currentValue = substr.slice(1, substr.length - 1);\n yieldDep();\n } else if (label === PACKAGE) {\n yieldDep();\n state = '.package(';\n }\n break;\n case '.package(url: [depName], exact:':\n if (label === END_SECTION) {\n yieldDep();\n state = null;\n } else if (label === STRING_LITERAL) {\n currentValue = substr.slice(1, substr.length - 1);\n yieldDep();\n state = 'dependencies: [';\n } else if (label === PACKAGE) {\n yieldDep();\n state = '.package(';\n }\n break;\n case '.package(url: [depName], from':\n if (label === END_SECTION) {\n yieldDep();\n state = null;\n } else if (label === COLON) {\n currentValue += substr;\n state = '.package(url: [depName], from:';\n } else if (label === SPACE) {\n currentValue += substr;\n // NOTE: a label that is none of the above ends the manifest, so the\n // implicit else never runs. A coverage-ignore hint cannot suppress it\n // on an `else if`.\n } else if (label === PACKAGE) {\n yieldDep();\n state = '.package(';\n }\n break;\n case '.package(url: [depName], from:':\n if (label === END_SECTION) {\n yieldDep();\n state = null;\n } else if (label === STRING_LITERAL) {\n currentValue += substr;\n yieldDep();\n state = 'dependencies: [';\n } else if (label === SPACE) {\n currentValue += substr;\n // NOTE: a label that is none of the above ends the manifest, so the\n // implicit else never runs. A coverage-ignore hint cannot suppress it\n // on an `else if`.\n } else if (label === PACKAGE) {\n yieldDep();\n state = '.package(';\n }\n break;\n case '.package(url: [depName], [value]':\n if (label === END_SECTION) {\n yieldDep();\n state = null;\n } else if (label === RANGE_OP) {\n currentValue += substr;\n state = '.package(url: [depName], [rangeFrom][rangeOp]';\n } else if (label === SPACE) {\n currentValue += substr;\n // NOTE: a label that is none of the above ends the manifest, so the\n // implicit else never runs. A coverage-ignore hint cannot suppress it\n // on an `else if`.\n } else if (label === PACKAGE) {\n yieldDep();\n state = '.package(';\n }\n break;\n case '.package(url: [depName], [rangeFrom][rangeOp]':\n if (label === END_SECTION) {\n yieldDep();\n state = null;\n } else if (label === STRING_LITERAL) {\n currentValue += substr;\n state = 'dependencies: [';\n } else if (label === SPACE) {\n currentValue += substr;\n // NOTE: a label that is none of the above ends the manifest, so the\n // implicit else never runs. A coverage-ignore hint cannot suppress it\n // on an `else if`.\n } else if (label === PACKAGE) {\n yieldDep();\n state = '.package(';\n }\n break;\n case 'traits:':\n if (label === TRAITS_CONSUME_TO_NEXT_PACKAGE) {\n yieldDep();\n state = '.package(';\n }\n break;\n }\n restStr = restStr.slice(idx + len);\n match = getMatch(restStr, state);\n }\n return deps.length ? result : null;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modules.js","names":[],"sources":["../../../../../../lib/modules/manager/terraform/extractors/others/modules.ts"],"sourcesContent":["import { isNullOrUndefined, isPlainObject } from '@sindresorhus/is';\nimport { logger } from '../../../../../logger/index.ts';\nimport { regEx } from '../../../../../util/regex.ts';\nimport { BitbucketTagsDatasource } from '../../../../datasource/bitbucket-tags/index.ts';\nimport { GitTagsDatasource } from '../../../../datasource/git-tags/index.ts';\nimport { GithubTagsDatasource } from '../../../../datasource/github-tags/index.ts';\nimport { TerraformModuleDatasource } from '../../../../datasource/terraform-module/index.ts';\nimport { isOCIRegistry } from '../../../helmv3/oci.ts';\nimport type { ExtractConfig, PackageDependency } from '../../../types.ts';\nimport { DependencyExtractor } from '../../base.ts';\nimport type { TerraformDefinitionFile } from '../../hcl/types.ts';\nimport type { ProviderLock } from '../../lockfile/types.ts';\nimport { applyOciDependency } from '../../util.ts';\n\nexport const githubRefMatchRegex = regEx(\n /github\\.com(?:[/:])(?<project>[^/]+\\/[a-z0-9-_.]+).*\\?(?:depth=\\d+&)?ref=(?<tag>.*?)(?:&depth=\\d+)?$/i,\n);\nexport const bitbucketRefMatchRegex = regEx(\n /(?:git::)?(?<url>(?:http|https|ssh)?(?::\\/\\/)?(?:.*@)?(?<path>bitbucket\\.org\\/(?<workspace>.*)\\/(?<project>.*)\\.git\\/?(?<subfolder>.*)))\\?(?:depth=\\d+&)?ref=(?<tag>.*?)(?:&depth=\\d+)?$/,\n);\nexport const gitTagsRefMatchRegex = regEx(\n /(?:git::)?(?<url>(?:(?:http|https|ssh):\\/\\/)?(?:.*@)?(?<path>[^:/]+[:/](?<project>[^/]+(?:\\/[^/]+)*))(?:\\.git)?)(?:(?:\\/\\/)?(?<subfolder>[^?]*))?\\?(?:depth=\\d+&)?ref=(?<tag>.*?)(?:&depth=\\d+)?$/,\n);\nexport const azureDevOpsSshRefMatchRegex = regEx(\n /(?:git::)?(?<url>git@ssh\\.dev\\.azure\\.com:v3\\/(?<organization>[^/]*)\\/(?<project>[^/]*)\\/(?<repository>[^/]*))(?<modulepath>.*)?\\?(?:depth=\\d+&)?ref=(?<tag>.*?)(?:&depth=\\d+)?$/,\n);\n\nexport const hostnameMatchRegex = regEx(\n /^(?<hostname>[a-zA-Z\\d](?:[a-zA-Z\\d-]*\\.)+[a-zA-Z\\d]+)/,\n);\n\nexport class ModuleExtractor extends DependencyExtractor {\n getCheckList(): string[] {\n return ['module'];\n }\n\n extract(\n hclRoot: TerraformDefinitionFile,\n _locks: ProviderLock[],\n config: ExtractConfig,\n ): PackageDependency[] {\n const modules = hclRoot.module;\n if (isNullOrUndefined(modules)) {\n return [];\n }\n\n /* v8 ignore next -- needs test */\n if (!isPlainObject(modules)) {\n logger.debug({ modules }, 'Terraform: unexpected `modules` value');\n return [];\n }\n\n const dependencies = [];\n for (const [depName, moduleElements] of Object.entries(modules)) {\n for (const moduleElement of moduleElements) {\n const dep = {\n depName,\n depType: 'module',\n currentValue: moduleElement.version,\n managerData: {\n source: moduleElement.source,\n },\n };\n dependencies.push(this.analyseTerraformModule(dep, config));\n }\n }\n\n return dependencies;\n }\n\n private analyseTerraformModule(\n dep: PackageDependency,\n config: ExtractConfig,\n ): PackageDependency {\n // TODO #22198\n const source = dep.managerData!.source as string;\n\n if (isOCIRegistry(source)) {\n applyOciDependency(dep, source, config.registryAliases);\n return dep;\n }\n\n const githubRefMatch = githubRefMatchRegex.exec(source);\n const bitbucketRefMatch = bitbucketRefMatchRegex.exec(source);\n const gitTagsRefMatch = gitTagsRefMatchRegex.exec(source);\n const azureDevOpsSshRefMatch = azureDevOpsSshRefMatchRegex.exec(source);\n\n if (githubRefMatch?.groups) {\n dep.packageName = githubRefMatch.groups.project.replace(\n regEx(/\\.git$/),\n '',\n );\n dep.depName = `github.com/${dep.packageName}`;\n dep.currentValue = githubRefMatch.groups.tag;\n dep.datasource = GithubTagsDatasource.id;\n } else if (bitbucketRefMatch?.groups) {\n dep.depName = `${bitbucketRefMatch.groups.workspace}/${bitbucketRefMatch.groups.project}`;\n dep.packageName = dep.depName;\n dep.currentValue = bitbucketRefMatch.groups.tag;\n dep.datasource = BitbucketTagsDatasource.id;\n } else if (azureDevOpsSshRefMatch?.groups) {\n dep.depName = `${azureDevOpsSshRefMatch.groups.organization}/${azureDevOpsSshRefMatch.groups.project}/${azureDevOpsSshRefMatch.groups.repository}${azureDevOpsSshRefMatch.groups.modulepath}`;\n dep.packageName = azureDevOpsSshRefMatch.groups.url;\n dep.currentValue = azureDevOpsSshRefMatch.groups.tag;\n dep.datasource = GitTagsDatasource.id;\n } else if (gitTagsRefMatch?.groups) {\n if (gitTagsRefMatch.groups.subfolder) {\n logger.debug('Terraform module contains subdirectory');\n }\n dep.depName = gitTagsRefMatch.groups.path.replace(regEx(/\\.git$/), '');\n dep.packageName = gitTagsRefMatch.groups.url.replace(regEx(/\\.git$/), '');\n dep.currentValue = gitTagsRefMatch.groups.tag;\n dep.datasource = GitTagsDatasource.id;\n } else if (source) {\n const moduleParts = source.split('//')[0].split('/');\n if (moduleParts[0] === '.' || moduleParts[0] === '..') {\n dep.skipReason = 'local';\n } else if (moduleParts.length >= 3) {\n const hostnameMatch = hostnameMatchRegex.exec(source);\n if (hostnameMatch?.groups) {\n dep.registryUrls = [`https://${hostnameMatch.groups.hostname}`];\n }\n dep.depName = moduleParts.join('/');\n dep.datasource = TerraformModuleDatasource.id;\n }\n } else {\n logger.debug({ dep }, 'terraform dep has no source');\n dep.skipReason = 'no-source';\n }\n\n return dep;\n }\n}\n"],"mappings":";;;;;;;;;;;AAcA,MAAa,sBAAsB,MACjC,uGACF;AACA,MAAa,yBAAyB,MACpC,0LACF;AACA,MAAa,uBAAuB,MAClC,mMACF;AACA,MAAa,8BAA8B,MACzC,kLACF;AAEA,MAAa,qBAAqB,MAChC,wDACF;AAEA,IAAa,kBAAb,cAAqC,oBAAoB;CACvD,eAAyB;EACvB,OAAO,CAAC,QAAQ;CAClB;CAEA,QACE,SACA,QACA,QACqB;EACrB,MAAM,UAAU,QAAQ;EACxB,IAAI,kBAAkB,OAAO,GAC3B,OAAO,CAAC;;EAIV,IAAI,CAAC,cAAc,OAAO,GAAG;GAC3B,OAAO,MAAM,EAAE,QAAQ,GAAG,uCAAuC;GACjE,OAAO,CAAC;EACV;EAEA,MAAM,eAAe,CAAC;EACtB,KAAK,MAAM,CAAC,SAAS,mBAAmB,OAAO,QAAQ,OAAO,GAC5D,KAAK,MAAM,iBAAiB,gBAAgB;GAC1C,MAAM,MAAM;IACV;IACA,SAAS;IACT,cAAc,cAAc;IAC5B,aAAa,EACX,QAAQ,cAAc,OACxB;GACF;GACA,aAAa,KAAK,KAAK,uBAAuB,KAAK,MAAM,CAAC;EAC5D;EAGF,OAAO;CACT;CAEA,uBACE,KACA,QACmB;EAEnB,MAAM,SAAS,IAAI,YAAa;EAEhC,IAAI,cAAc,MAAM,GAAG;GACzB,mBAAmB,KAAK,QAAQ,OAAO,eAAe;GACtD,OAAO;EACT;EAEA,MAAM,iBAAiB,oBAAoB,KAAK,MAAM;EACtD,MAAM,oBAAoB,uBAAuB,KAAK,MAAM;EAC5D,MAAM,kBAAkB,qBAAqB,KAAK,MAAM;EACxD,MAAM,yBAAyB,4BAA4B,KAAK,MAAM;EAEtE,IAAI,gBAAgB,QAAQ;GAC1B,IAAI,cAAc,eAAe,OAAO,QAAQ,QAC9C,MAAM,QAAQ,GACd,EACF;GACA,IAAI,UAAU,cAAc,IAAI;GAChC,IAAI,eAAe,eAAe,OAAO;GACzC,IAAI,aAAa,qBAAqB;EACxC,OAAO,IAAI,mBAAmB,QAAQ;GACpC,IAAI,UAAU,GAAG,kBAAkB,OAAO,UAAU,GAAG,kBAAkB,OAAO;GAChF,IAAI,cAAc,IAAI;GACtB,IAAI,eAAe,kBAAkB,OAAO;GAC5C,IAAI,aAAa,wBAAwB;EAC3C,OAAO,IAAI,wBAAwB,QAAQ;GACzC,IAAI,UAAU,GAAG,uBAAuB,OAAO,aAAa,GAAG,uBAAuB,OAAO,QAAQ,GAAG,uBAAuB,OAAO,aAAa,uBAAuB,OAAO;GACjL,IAAI,cAAc,uBAAuB,OAAO;GAChD,IAAI,eAAe,uBAAuB,OAAO;GACjD,IAAI,aAAa,kBAAkB;EACrC,OAAO,IAAI,iBAAiB,QAAQ;GAClC,IAAI,gBAAgB,OAAO,WACzB,OAAO,MAAM,wCAAwC;GAEvD,IAAI,UAAU,gBAAgB,OAAO,KAAK,QAAQ,MAAM,QAAQ,GAAG,EAAE;GACrE,IAAI,cAAc,gBAAgB,OAAO,IAAI,QAAQ,MAAM,QAAQ,GAAG,EAAE;GACxE,IAAI,eAAe,gBAAgB,OAAO;GAC1C,IAAI,aAAa,kBAAkB;EACrC,OAAO,IAAI,QAAQ;GACjB,MAAM,cAAc,OAAO,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,MAAM,GAAG;GACnD,IAAI,YAAY,OAAO,OAAO,YAAY,OAAO,MAC/C,IAAI,aAAa;
|
|
1
|
+
{"version":3,"file":"modules.js","names":[],"sources":["../../../../../../lib/modules/manager/terraform/extractors/others/modules.ts"],"sourcesContent":["import { isNullOrUndefined, isPlainObject } from '@sindresorhus/is';\nimport { logger } from '../../../../../logger/index.ts';\nimport { regEx } from '../../../../../util/regex.ts';\nimport { BitbucketTagsDatasource } from '../../../../datasource/bitbucket-tags/index.ts';\nimport { GitTagsDatasource } from '../../../../datasource/git-tags/index.ts';\nimport { GithubTagsDatasource } from '../../../../datasource/github-tags/index.ts';\nimport { TerraformModuleDatasource } from '../../../../datasource/terraform-module/index.ts';\nimport { isOCIRegistry } from '../../../helmv3/oci.ts';\nimport type { ExtractConfig, PackageDependency } from '../../../types.ts';\nimport { DependencyExtractor } from '../../base.ts';\nimport type { TerraformDefinitionFile } from '../../hcl/types.ts';\nimport type { ProviderLock } from '../../lockfile/types.ts';\nimport { applyOciDependency } from '../../util.ts';\n\nexport const githubRefMatchRegex = regEx(\n /github\\.com(?:[/:])(?<project>[^/]+\\/[a-z0-9-_.]+).*\\?(?:depth=\\d+&)?ref=(?<tag>.*?)(?:&depth=\\d+)?$/i,\n);\nexport const bitbucketRefMatchRegex = regEx(\n /(?:git::)?(?<url>(?:http|https|ssh)?(?::\\/\\/)?(?:.*@)?(?<path>bitbucket\\.org\\/(?<workspace>.*)\\/(?<project>.*)\\.git\\/?(?<subfolder>.*)))\\?(?:depth=\\d+&)?ref=(?<tag>.*?)(?:&depth=\\d+)?$/,\n);\nexport const gitTagsRefMatchRegex = regEx(\n /(?:git::)?(?<url>(?:(?:http|https|ssh):\\/\\/)?(?:.*@)?(?<path>[^:/]+[:/](?<project>[^/]+(?:\\/[^/]+)*))(?:\\.git)?)(?:(?:\\/\\/)?(?<subfolder>[^?]*))?\\?(?:depth=\\d+&)?ref=(?<tag>.*?)(?:&depth=\\d+)?$/,\n);\nexport const azureDevOpsSshRefMatchRegex = regEx(\n /(?:git::)?(?<url>git@ssh\\.dev\\.azure\\.com:v3\\/(?<organization>[^/]*)\\/(?<project>[^/]*)\\/(?<repository>[^/]*))(?<modulepath>.*)?\\?(?:depth=\\d+&)?ref=(?<tag>.*?)(?:&depth=\\d+)?$/,\n);\n\nexport const hostnameMatchRegex = regEx(\n /^(?<hostname>[a-zA-Z\\d](?:[a-zA-Z\\d-]*\\.)+[a-zA-Z\\d]+)/,\n);\n\nexport class ModuleExtractor extends DependencyExtractor {\n getCheckList(): string[] {\n return ['module'];\n }\n\n extract(\n hclRoot: TerraformDefinitionFile,\n _locks: ProviderLock[],\n config: ExtractConfig,\n ): PackageDependency[] {\n const modules = hclRoot.module;\n if (isNullOrUndefined(modules)) {\n return [];\n }\n\n /* v8 ignore next -- needs test */\n if (!isPlainObject(modules)) {\n logger.debug({ modules }, 'Terraform: unexpected `modules` value');\n return [];\n }\n\n const dependencies = [];\n for (const [depName, moduleElements] of Object.entries(modules)) {\n for (const moduleElement of moduleElements) {\n const dep = {\n depName,\n depType: 'module',\n currentValue: moduleElement.version,\n managerData: {\n source: moduleElement.source,\n },\n };\n dependencies.push(this.analyseTerraformModule(dep, config));\n }\n }\n\n return dependencies;\n }\n\n private analyseTerraformModule(\n dep: PackageDependency,\n config: ExtractConfig,\n ): PackageDependency {\n // TODO #22198\n const source = dep.managerData!.source as string;\n\n if (isOCIRegistry(source)) {\n applyOciDependency(dep, source, config.registryAliases);\n return dep;\n }\n\n const githubRefMatch = githubRefMatchRegex.exec(source);\n const bitbucketRefMatch = bitbucketRefMatchRegex.exec(source);\n const gitTagsRefMatch = gitTagsRefMatchRegex.exec(source);\n const azureDevOpsSshRefMatch = azureDevOpsSshRefMatchRegex.exec(source);\n\n if (githubRefMatch?.groups) {\n dep.packageName = githubRefMatch.groups.project.replace(\n regEx(/\\.git$/),\n '',\n );\n dep.depName = `github.com/${dep.packageName}`;\n dep.currentValue = githubRefMatch.groups.tag;\n dep.datasource = GithubTagsDatasource.id;\n } else if (bitbucketRefMatch?.groups) {\n dep.depName = `${bitbucketRefMatch.groups.workspace}/${bitbucketRefMatch.groups.project}`;\n dep.packageName = dep.depName;\n dep.currentValue = bitbucketRefMatch.groups.tag;\n dep.datasource = BitbucketTagsDatasource.id;\n } else if (azureDevOpsSshRefMatch?.groups) {\n dep.depName = `${azureDevOpsSshRefMatch.groups.organization}/${azureDevOpsSshRefMatch.groups.project}/${azureDevOpsSshRefMatch.groups.repository}${azureDevOpsSshRefMatch.groups.modulepath}`;\n dep.packageName = azureDevOpsSshRefMatch.groups.url;\n dep.currentValue = azureDevOpsSshRefMatch.groups.tag;\n dep.datasource = GitTagsDatasource.id;\n } else if (gitTagsRefMatch?.groups) {\n if (gitTagsRefMatch.groups.subfolder) {\n logger.debug('Terraform module contains subdirectory');\n }\n dep.depName = gitTagsRefMatch.groups.path.replace(regEx(/\\.git$/), '');\n dep.packageName = gitTagsRefMatch.groups.url.replace(regEx(/\\.git$/), '');\n dep.currentValue = gitTagsRefMatch.groups.tag;\n dep.datasource = GitTagsDatasource.id;\n } else if (source) {\n const moduleParts = source.split('//')[0].split('/');\n if (moduleParts[0] === '.' || moduleParts[0] === '..') {\n dep.skipReason = 'local';\n // NOTE: a shorter path is not a registry module, so the implicit else\n // never runs. A coverage-ignore hint cannot suppress it on an `else if`.\n } else if (moduleParts.length >= 3) {\n const hostnameMatch = hostnameMatchRegex.exec(source);\n if (hostnameMatch?.groups) {\n dep.registryUrls = [`https://${hostnameMatch.groups.hostname}`];\n }\n dep.depName = moduleParts.join('/');\n dep.datasource = TerraformModuleDatasource.id;\n }\n } else {\n logger.debug({ dep }, 'terraform dep has no source');\n dep.skipReason = 'no-source';\n }\n\n return dep;\n }\n}\n"],"mappings":"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"}
|
|
@@ -89,6 +89,7 @@ async function updateArtifacts({ packageFileName, updatedDeps, config }) {
|
|
|
89
89
|
continue;
|
|
90
90
|
}
|
|
91
91
|
if (dep.isLockfileUpdate) {
|
|
92
|
+
// v8 ignore else -- needs a lockfile update that also produces a change
|
|
92
93
|
if (!get(dep.versioning).getSatisfyingVersion([dep.newVersion], updateLock.constraints)) {
|
|
93
94
|
logger.debug(`Skipping. Lockfile update with "${newVersion}" does not statisfy constraints "${updateLock.constraints}" for "${packageName}"`);
|
|
94
95
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["p.map","getVersioning"],"sources":["../../../../../lib/modules/manager/terraform/lockfile/index.ts"],"sourcesContent":["import { isTruthy } from '@sindresorhus/is';\nimport { logger } from '../../../../logger/index.ts';\nimport { coerceArray } from '../../../../util/array.ts';\nimport { coerceObject } from '../../../../util/object.ts';\nimport * as p from '../../../../util/promises.ts';\nimport { regEx } from '../../../../util/regex.ts';\nimport { getDefaultVersioning } from '../../../datasource/common.ts';\nimport type { GetPkgReleasesConfig } from '../../../datasource/index.ts';\nimport { getPkgReleases } from '../../../datasource/index.ts';\nimport { get as getVersioning } from '../../../versioning/index.ts';\nimport type {\n UpdateArtifact,\n UpdateArtifactsResult,\n Upgrade,\n} from '../../types.ts';\nimport { massageProviderLookupName } from '../util.ts';\nimport { TerraformProviderHash } from './hash.ts';\nimport type { ProviderLock, ProviderLockUpdate } from './types.ts';\nimport {\n extractLocks,\n findLockFile,\n isPinnedVersion,\n massageNewValue,\n readLockFile,\n sortConstraints,\n writeLockUpdates,\n} from './util.ts';\n\nasync function updateAllLocks(\n locks: ProviderLock[],\n): Promise<ProviderLockUpdate[]> {\n const updates = await p.map(\n locks,\n async (lock) => {\n const updateConfig: GetPkgReleasesConfig = {\n datasource: 'terraform-provider',\n packageName: lock.packageName,\n registryUrls: [lock.registryUrl],\n };\n const { releases } = coerceObject(await getPkgReleases(updateConfig));\n if (!releases) {\n return null;\n }\n const versioning = getVersioning(\n getDefaultVersioning('terraform-provider'),\n );\n const versionsList = releases.map((release) => release.version);\n const newVersion = versioning.getSatisfyingVersion(\n versionsList,\n lock.constraints,\n );\n\n // if the new version is the same as the last, signal that no update is needed\n if (!newVersion || newVersion === lock.version) {\n return null;\n }\n const update: ProviderLockUpdate = {\n newVersion,\n newConstraint: lock.constraints,\n newHashes: coerceArray(\n await TerraformProviderHash.createHashes(\n lock.registryUrl,\n lock.packageName,\n newVersion,\n ),\n ),\n ...lock,\n };\n return update;\n },\n { concurrency: 4 },\n );\n\n return updates.filter(isTruthy);\n}\n\nexport function getNewConstraint(\n dep: Upgrade<Record<string, unknown>>,\n oldConstraint: string | undefined,\n): string | undefined {\n const {\n currentValue,\n currentVersion,\n newValue: rawNewValue,\n newVersion,\n packageName,\n } = dep;\n\n const newValue = massageNewValue(rawNewValue);\n\n if (oldConstraint && currentValue && newValue && currentValue === newValue) {\n logger.debug(\n `Leaving constraints \"${oldConstraint}\" unchanged for \"${packageName}\" as current and new values are the same`,\n );\n return oldConstraint;\n }\n\n if (\n oldConstraint &&\n currentValue &&\n newValue &&\n oldConstraint.includes(currentValue)\n ) {\n logger.debug(\n `Updating constraint \"${oldConstraint}\" to replace \"${currentValue}\" with \"${newValue}\" for \"${packageName}\"`,\n );\n //remove surplus .0 version\n return sortConstraints(\n oldConstraint.replace(\n regEx(`(,\\\\s|^)${RegExp.escape(currentValue)}(\\\\.0)*`),\n `$1${newValue}`,\n ),\n );\n }\n\n if (\n oldConstraint &&\n currentVersion &&\n newVersion &&\n oldConstraint.includes(currentVersion)\n ) {\n logger.debug(\n `Updating constraint \"${oldConstraint}\" to replace \"${currentVersion}\" with \"${newVersion}\" for \"${packageName}\"`,\n );\n return sortConstraints(oldConstraint.replace(currentVersion, newVersion));\n }\n\n if (isPinnedVersion(newValue)) {\n logger.debug(`Pinning constraint for \"${packageName}\" to \"${newVersion}\"`);\n return newVersion;\n }\n\n logger.debug(\n `Could not detect constraint to update for \"${packageName}\" so setting to newValue \"${newValue}\"`,\n );\n return newValue;\n}\n\nexport async function updateArtifacts({\n packageFileName,\n updatedDeps,\n config,\n}: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> {\n logger.debug(`terraform.updateArtifacts(${packageFileName})`);\n\n const lockFilePath = await findLockFile(packageFileName);\n\n if (!lockFilePath) {\n logger.debug('No .terraform.lock.hcl found');\n return null;\n }\n\n try {\n const lockFileContent = await readLockFile(lockFilePath);\n if (!lockFileContent) {\n logger.debug('No .terraform.lock.hcl found');\n return null;\n }\n const locks = extractLocks(lockFileContent);\n if (!locks) {\n logger.debug('No Locks in .terraform.lock.hcl found');\n return null;\n }\n\n const updates: ProviderLockUpdate[] = [];\n if (config.isLockFileMaintenance) {\n // update all locks in the file during maintenance --> only update version in constraints\n const maintenanceUpdates = await updateAllLocks(locks);\n updates.push(...maintenanceUpdates);\n } else {\n const providerDeps = updatedDeps.filter((dep) =>\n // TODO #22198\n ['provider', 'required_provider'].includes(dep.depType!),\n );\n logger.debug(`Found ${providerDeps.length} provider deps`);\n for (const dep of providerDeps) {\n massageProviderLookupName(dep);\n const { registryUrls, newVersion, packageName } = dep;\n\n const updateLock = locks.find(\n (value) => value.packageName === packageName,\n );\n /* v8 ignore next -- needs test */\n if (!updateLock) {\n logger.debug(`Skipping. No lock found for \"${packageName}\"`);\n continue;\n }\n if (dep.isLockfileUpdate) {\n const versioning = getVersioning(dep.versioning);\n const satisfyingVersion = versioning.getSatisfyingVersion(\n [dep.newVersion!],\n updateLock.constraints,\n );\n\n if (!satisfyingVersion) {\n logger.debug(\n `Skipping. Lockfile update with \"${newVersion}\" does not statisfy constraints \"${updateLock.constraints}\" for \"${packageName}\"`,\n );\n continue;\n }\n }\n\n // use registryURL defined in the update and fall back to the one defined in the lockfile\n const registryUrl = registryUrls?.[0] ?? updateLock.registryUrl;\n\n const newConstraint = getNewConstraint(dep, updateLock.constraints);\n const update: ProviderLockUpdate = {\n // TODO #22198\n newVersion: newVersion!,\n newConstraint: newConstraint!,\n newHashes: coerceArray(\n await TerraformProviderHash.createHashes(\n registryUrl,\n updateLock.packageName,\n newVersion!,\n ),\n ),\n ...updateLock,\n };\n updates.push(update);\n }\n }\n // if no updates have been found or there are failed hashes abort\n if (\n updates.length === 0 ||\n updates.some((value) => !value.newHashes?.length)\n ) {\n logger.debug('No updates found or hash creation failed');\n return null;\n }\n logger.debug(`Writing updates to ${lockFilePath}`);\n const res = writeLockUpdates(updates, lockFilePath, lockFileContent);\n return [res];\n } catch (err) {\n return [\n {\n artifactError: {\n fileName: lockFilePath,\n stderr: err.message,\n },\n },\n ];\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["p.map","getVersioning"],"sources":["../../../../../lib/modules/manager/terraform/lockfile/index.ts"],"sourcesContent":["import { isTruthy } from '@sindresorhus/is';\nimport { logger } from '../../../../logger/index.ts';\nimport { coerceArray } from '../../../../util/array.ts';\nimport { coerceObject } from '../../../../util/object.ts';\nimport * as p from '../../../../util/promises.ts';\nimport { regEx } from '../../../../util/regex.ts';\nimport { getDefaultVersioning } from '../../../datasource/common.ts';\nimport type { GetPkgReleasesConfig } from '../../../datasource/index.ts';\nimport { getPkgReleases } from '../../../datasource/index.ts';\nimport { get as getVersioning } from '../../../versioning/index.ts';\nimport type {\n UpdateArtifact,\n UpdateArtifactsResult,\n Upgrade,\n} from '../../types.ts';\nimport { massageProviderLookupName } from '../util.ts';\nimport { TerraformProviderHash } from './hash.ts';\nimport type { ProviderLock, ProviderLockUpdate } from './types.ts';\nimport {\n extractLocks,\n findLockFile,\n isPinnedVersion,\n massageNewValue,\n readLockFile,\n sortConstraints,\n writeLockUpdates,\n} from './util.ts';\n\nasync function updateAllLocks(\n locks: ProviderLock[],\n): Promise<ProviderLockUpdate[]> {\n const updates = await p.map(\n locks,\n async (lock) => {\n const updateConfig: GetPkgReleasesConfig = {\n datasource: 'terraform-provider',\n packageName: lock.packageName,\n registryUrls: [lock.registryUrl],\n };\n const { releases } = coerceObject(await getPkgReleases(updateConfig));\n if (!releases) {\n return null;\n }\n const versioning = getVersioning(\n getDefaultVersioning('terraform-provider'),\n );\n const versionsList = releases.map((release) => release.version);\n const newVersion = versioning.getSatisfyingVersion(\n versionsList,\n lock.constraints,\n );\n\n // if the new version is the same as the last, signal that no update is needed\n if (!newVersion || newVersion === lock.version) {\n return null;\n }\n const update: ProviderLockUpdate = {\n newVersion,\n newConstraint: lock.constraints,\n newHashes: coerceArray(\n await TerraformProviderHash.createHashes(\n lock.registryUrl,\n lock.packageName,\n newVersion,\n ),\n ),\n ...lock,\n };\n return update;\n },\n { concurrency: 4 },\n );\n\n return updates.filter(isTruthy);\n}\n\nexport function getNewConstraint(\n dep: Upgrade<Record<string, unknown>>,\n oldConstraint: string | undefined,\n): string | undefined {\n const {\n currentValue,\n currentVersion,\n newValue: rawNewValue,\n newVersion,\n packageName,\n } = dep;\n\n const newValue = massageNewValue(rawNewValue);\n\n if (oldConstraint && currentValue && newValue && currentValue === newValue) {\n logger.debug(\n `Leaving constraints \"${oldConstraint}\" unchanged for \"${packageName}\" as current and new values are the same`,\n );\n return oldConstraint;\n }\n\n if (\n oldConstraint &&\n currentValue &&\n newValue &&\n oldConstraint.includes(currentValue)\n ) {\n logger.debug(\n `Updating constraint \"${oldConstraint}\" to replace \"${currentValue}\" with \"${newValue}\" for \"${packageName}\"`,\n );\n //remove surplus .0 version\n return sortConstraints(\n oldConstraint.replace(\n regEx(`(,\\\\s|^)${RegExp.escape(currentValue)}(\\\\.0)*`),\n `$1${newValue}`,\n ),\n );\n }\n\n if (\n oldConstraint &&\n currentVersion &&\n newVersion &&\n oldConstraint.includes(currentVersion)\n ) {\n logger.debug(\n `Updating constraint \"${oldConstraint}\" to replace \"${currentVersion}\" with \"${newVersion}\" for \"${packageName}\"`,\n );\n return sortConstraints(oldConstraint.replace(currentVersion, newVersion));\n }\n\n if (isPinnedVersion(newValue)) {\n logger.debug(`Pinning constraint for \"${packageName}\" to \"${newVersion}\"`);\n return newVersion;\n }\n\n logger.debug(\n `Could not detect constraint to update for \"${packageName}\" so setting to newValue \"${newValue}\"`,\n );\n return newValue;\n}\n\nexport async function updateArtifacts({\n packageFileName,\n updatedDeps,\n config,\n}: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> {\n logger.debug(`terraform.updateArtifacts(${packageFileName})`);\n\n const lockFilePath = await findLockFile(packageFileName);\n\n if (!lockFilePath) {\n logger.debug('No .terraform.lock.hcl found');\n return null;\n }\n\n try {\n const lockFileContent = await readLockFile(lockFilePath);\n if (!lockFileContent) {\n logger.debug('No .terraform.lock.hcl found');\n return null;\n }\n const locks = extractLocks(lockFileContent);\n if (!locks) {\n logger.debug('No Locks in .terraform.lock.hcl found');\n return null;\n }\n\n const updates: ProviderLockUpdate[] = [];\n if (config.isLockFileMaintenance) {\n // update all locks in the file during maintenance --> only update version in constraints\n const maintenanceUpdates = await updateAllLocks(locks);\n updates.push(...maintenanceUpdates);\n } else {\n const providerDeps = updatedDeps.filter((dep) =>\n // TODO #22198\n ['provider', 'required_provider'].includes(dep.depType!),\n );\n logger.debug(`Found ${providerDeps.length} provider deps`);\n for (const dep of providerDeps) {\n massageProviderLookupName(dep);\n const { registryUrls, newVersion, packageName } = dep;\n\n const updateLock = locks.find(\n (value) => value.packageName === packageName,\n );\n /* v8 ignore next -- needs test */\n if (!updateLock) {\n logger.debug(`Skipping. No lock found for \"${packageName}\"`);\n continue;\n }\n if (dep.isLockfileUpdate) {\n const versioning = getVersioning(dep.versioning);\n const satisfyingVersion = versioning.getSatisfyingVersion(\n [dep.newVersion!],\n updateLock.constraints,\n );\n\n // v8 ignore else -- needs a lockfile update that also produces a change\n if (!satisfyingVersion) {\n logger.debug(\n `Skipping. Lockfile update with \"${newVersion}\" does not statisfy constraints \"${updateLock.constraints}\" for \"${packageName}\"`,\n );\n continue;\n }\n }\n\n // use registryURL defined in the update and fall back to the one defined in the lockfile\n const registryUrl = registryUrls?.[0] ?? updateLock.registryUrl;\n\n const newConstraint = getNewConstraint(dep, updateLock.constraints);\n const update: ProviderLockUpdate = {\n // TODO #22198\n newVersion: newVersion!,\n newConstraint: newConstraint!,\n newHashes: coerceArray(\n await TerraformProviderHash.createHashes(\n registryUrl,\n updateLock.packageName,\n newVersion!,\n ),\n ),\n ...updateLock,\n };\n updates.push(update);\n }\n }\n // if no updates have been found or there are failed hashes abort\n if (\n updates.length === 0 ||\n updates.some((value) => !value.newHashes?.length)\n ) {\n logger.debug('No updates found or hash creation failed');\n return null;\n }\n logger.debug(`Writing updates to ${lockFilePath}`);\n const res = writeLockUpdates(updates, lockFilePath, lockFileContent);\n return [res];\n } catch (err) {\n return [\n {\n artifactError: {\n fileName: lockFilePath,\n stderr: err.message,\n },\n },\n ];\n }\n}\n"],"mappings":";;;;;;;;;;;;;AA4BA,eAAe,eACb,OAC+B;CA2C/B,QAAO,MA1CeA,IACpB,OACA,OAAO,SAAS;EACd,MAAM,eAAqC;GACzC,YAAY;GACZ,aAAa,KAAK;GAClB,cAAc,CAAC,KAAK,WAAW;EACjC;EACA,MAAM,EAAE,aAAa,aAAa,MAAM,eAAe,YAAY,CAAC;EACpE,IAAI,CAAC,UACH,OAAO;EAET,MAAM,aAAaC,IACjB,qBAAqB,oBAAoB,CAC3C;EACA,MAAM,eAAe,SAAS,KAAK,YAAY,QAAQ,OAAO;EAC9D,MAAM,aAAa,WAAW,qBAC5B,cACA,KAAK,WACP;EAGA,IAAI,CAAC,cAAc,eAAe,KAAK,SACrC,OAAO;EAcT,OAAO;GAXL;GACA,eAAe,KAAK;GACpB,WAAW,YACT,MAAM,sBAAsB,aAC1B,KAAK,aACL,KAAK,aACL,UACF,CACF;GACA,GAAG;EAEO;CACd,GACA,EAAE,aAAa,EAAE,CACnB,EAAA,CAEe,OAAO,QAAQ;AAChC;AAEA,SAAgB,iBACd,KACA,eACoB;CACpB,MAAM,EACJ,cACA,gBACA,UAAU,aACV,YACA,gBACE;CAEJ,MAAM,WAAW,gBAAgB,WAAW;CAE5C,IAAI,iBAAiB,gBAAgB,YAAY,iBAAiB,UAAU;EAC1E,OAAO,MACL,wBAAwB,cAAc,mBAAmB,YAAY,yCACvE;EACA,OAAO;CACT;CAEA,IACE,iBACA,gBACA,YACA,cAAc,SAAS,YAAY,GACnC;EACA,OAAO,MACL,wBAAwB,cAAc,gBAAgB,aAAa,UAAU,SAAS,SAAS,YAAY,EAC7G;EAEA,OAAO,gBACL,cAAc,QACZ,MAAM,WAAW,OAAO,OAAO,YAAY,EAAE,QAAQ,GACrD,KAAK,UACP,CACF;CACF;CAEA,IACE,iBACA,kBACA,cACA,cAAc,SAAS,cAAc,GACrC;EACA,OAAO,MACL,wBAAwB,cAAc,gBAAgB,eAAe,UAAU,WAAW,SAAS,YAAY,EACjH;EACA,OAAO,gBAAgB,cAAc,QAAQ,gBAAgB,UAAU,CAAC;CAC1E;CAEA,IAAI,gBAAgB,QAAQ,GAAG;EAC7B,OAAO,MAAM,2BAA2B,YAAY,QAAQ,WAAW,EAAE;EACzE,OAAO;CACT;CAEA,OAAO,MACL,8CAA8C,YAAY,4BAA4B,SAAS,EACjG;CACA,OAAO;AACT;AAEA,eAAsB,gBAAgB,EACpC,iBACA,aACA,UAC0D;CAC1D,OAAO,MAAM,6BAA6B,gBAAgB,EAAE;CAE5D,MAAM,eAAe,MAAM,aAAa,eAAe;CAEvD,IAAI,CAAC,cAAc;EACjB,OAAO,MAAM,8BAA8B;EAC3C,OAAO;CACT;CAEA,IAAI;EACF,MAAM,kBAAkB,MAAM,aAAa,YAAY;EACvD,IAAI,CAAC,iBAAiB;GACpB,OAAO,MAAM,8BAA8B;GAC3C,OAAO;EACT;EACA,MAAM,QAAQ,aAAa,eAAe;EAC1C,IAAI,CAAC,OAAO;GACV,OAAO,MAAM,uCAAuC;GACpD,OAAO;EACT;EAEA,MAAM,UAAgC,CAAC;EACvC,IAAI,OAAO,uBAAuB;GAEhC,MAAM,qBAAqB,MAAM,eAAe,KAAK;GACrD,QAAQ,KAAK,GAAG,kBAAkB;EACpC,OAAO;GACL,MAAM,eAAe,YAAY,QAAQ,QAEvC,CAAC,YAAY,mBAAmB,CAAC,CAAC,SAAS,IAAI,OAAQ,CACzD;GACA,OAAO,MAAM,SAAS,aAAa,OAAO,eAAe;GACzD,KAAK,MAAM,OAAO,cAAc;IAC9B,0BAA0B,GAAG;IAC7B,MAAM,EAAE,cAAc,YAAY,gBAAgB;IAElD,MAAM,aAAa,MAAM,MACtB,UAAU,MAAM,gBAAgB,WACnC;;IAEA,IAAI,CAAC,YAAY;KACf,OAAO,MAAM,gCAAgC,YAAY,EAAE;KAC3D;IACF;IACA,IAAI,IAAI,kBAQF;;SAAA,CAPeA,IAAc,IAAI,UACF,CAAC,CAAC,qBACnC,CAAC,IAAI,UAAW,GAChB,WAAW,WAIQ,GAAG;MACtB,OAAO,MACL,mCAAmC,WAAW,mCAAmC,WAAW,YAAY,SAAS,YAAY,EAC/H;MACA;KACF;;IAIF,MAAM,cAAc,eAAe,MAAM,WAAW;IAGpD,MAAM,SAA6B;KAErB;KACZ,eAJoB,iBAAiB,KAAK,WAAW,WAI1B;KAC3B,WAAW,YACT,MAAM,sBAAsB,aAC1B,aACA,WAAW,aACX,UACF,CACF;KACA,GAAG;IACL;IACA,QAAQ,KAAK,MAAM;GACrB;EACF;EAEA,IACE,QAAQ,WAAW,KACnB,QAAQ,MAAM,UAAU,CAAC,MAAM,WAAW,MAAM,GAChD;GACA,OAAO,MAAM,0CAA0C;GACvD,OAAO;EACT;EACA,OAAO,MAAM,sBAAsB,cAAc;EAEjD,OAAO,CADK,iBAAiB,SAAS,cAAc,eAC1C,CAAC;CACb,SAAS,KAAK;EACZ,OAAO,CACL,EACE,eAAe;GACb,UAAU;GACV,QAAQ,IAAI;EACd,EACF,CACF;CACF;AACF"}
|
|
@@ -29,6 +29,7 @@ function extractPackageFile(content, packageFile) {
|
|
|
29
29
|
/* istanbul ignore next */
|
|
30
30
|
default: logger.trace(`Could not identify TerragruntDependencyType ${terragruntDependency.groups.type} on line ${lineNumber}.`);
|
|
31
31
|
}
|
|
32
|
+
// v8 ignore else -- only the ignored default case leaves this unset
|
|
32
33
|
if (result) {
|
|
33
34
|
lineNumber = result.lineNumber;
|
|
34
35
|
deps = deps.concat(result.dependencies);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/terragrunt/extract.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport type { PackageDependency, PackageFileContent } from '../types.ts';\nimport { analyseTerragruntModule, extractTerragruntModule } from './modules.ts';\nimport type { ExtractionResult, TerraformManagerData } from './types.ts';\nimport {\n checkFileContainsDependency,\n getTerragruntDependencyType,\n} from './util.ts';\n\nconst dependencyBlockExtractionRegex = regEx(/^\\s*(?<type>[a-z_]+)\\s+{\\s*$/);\nconst contentCheckList = ['terraform {'];\nconst includeBlockCheck = regEx(/include\\s*(?:\".*\")?\\s*\\{/);\n\nexport function extractPackageFile(\n content: string,\n packageFile?: string,\n): PackageFileContent | null {\n logger.trace({ content }, `terragrunt.extractPackageFile(${packageFile!})`);\n if (!checkFileContainsDependency(content, contentCheckList)) {\n if (content.match(includeBlockCheck)) {\n return { deps: [] };\n }\n return null;\n }\n let deps: PackageDependency<TerraformManagerData>[] = [];\n try {\n const lines = content.split(newlineRegex);\n for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) {\n const line = lines[lineNumber];\n const terragruntDependency = dependencyBlockExtractionRegex.exec(line);\n if (terragruntDependency?.groups) {\n logger.trace(\n `Matched ${terragruntDependency.groups.type} on line ${lineNumber}`,\n );\n const tfDepType = getTerragruntDependencyType(\n terragruntDependency.groups.type,\n );\n let result: ExtractionResult | null = null;\n switch (tfDepType) {\n case 'terraform': {\n result = extractTerragruntModule(lineNumber, lines);\n break;\n }\n /* istanbul ignore next */\n default:\n logger.trace(\n `Could not identify TerragruntDependencyType ${terragruntDependency.groups.type} on line ${lineNumber}.`,\n );\n break;\n }\n if (result) {\n lineNumber = result.lineNumber;\n deps = deps.concat(result.dependencies);\n result = null;\n }\n }\n }\n } catch (err) /* istanbul ignore next */ {\n logger.debug({ err, packageFile }, 'Error extracting terragrunt plugins');\n }\n deps.forEach((dep) => {\n // TODO #22198\n switch (dep.managerData!.terragruntDependencyType) {\n case 'terraform':\n analyseTerragruntModule(dep);\n break;\n /* istanbul ignore next */\n default:\n }\n\n delete dep.managerData;\n });\n return { deps };\n}\n"],"mappings":";;;;;AAUA,MAAM,iCAAiC,MAAM,8BAA8B;AAC3E,MAAM,mBAAmB,CAAC,aAAa;AACvC,MAAM,oBAAoB,MAAM,0BAA0B;AAE1D,SAAgB,mBACd,SACA,aAC2B;CAC3B,OAAO,MAAM,EAAE,QAAQ,GAAG,iCAAiC,YAAa,EAAE;CAC1E,IAAI,CAAC,4BAA4B,SAAS,gBAAgB,GAAG;EAC3D,IAAI,QAAQ,MAAM,iBAAiB,GACjC,OAAO,EAAE,MAAM,CAAC,EAAE;EAEpB,OAAO;CACT;CACA,IAAI,OAAkD,CAAC;CACvD,IAAI;EACF,MAAM,QAAQ,QAAQ,MAAM,YAAY;EACxC,KAAK,IAAI,aAAa,GAAG,aAAa,MAAM,QAAQ,cAAc,GAAG;GACnE,MAAM,OAAO,MAAM;GACnB,MAAM,uBAAuB,+BAA+B,KAAK,IAAI;GACrE,IAAI,sBAAsB,QAAQ;IAChC,OAAO,MACL,WAAW,qBAAqB,OAAO,KAAK,WAAW,YACzD;IACA,MAAM,YAAY,4BAChB,qBAAqB,OAAO,IAC9B;IACA,IAAI,SAAkC;IACtC,QAAQ,WAAR;KACE,KAAK;MACH,SAAS,wBAAwB,YAAY,KAAK;MAClD;;KAGF,SACE,OAAO,MACL,+CAA+C,qBAAqB,OAAO,KAAK,WAAW,WAAW,EACxG;IAEJ
|
|
1
|
+
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/terragrunt/extract.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport type { PackageDependency, PackageFileContent } from '../types.ts';\nimport { analyseTerragruntModule, extractTerragruntModule } from './modules.ts';\nimport type { ExtractionResult, TerraformManagerData } from './types.ts';\nimport {\n checkFileContainsDependency,\n getTerragruntDependencyType,\n} from './util.ts';\n\nconst dependencyBlockExtractionRegex = regEx(/^\\s*(?<type>[a-z_]+)\\s+{\\s*$/);\nconst contentCheckList = ['terraform {'];\nconst includeBlockCheck = regEx(/include\\s*(?:\".*\")?\\s*\\{/);\n\nexport function extractPackageFile(\n content: string,\n packageFile?: string,\n): PackageFileContent | null {\n logger.trace({ content }, `terragrunt.extractPackageFile(${packageFile!})`);\n if (!checkFileContainsDependency(content, contentCheckList)) {\n if (content.match(includeBlockCheck)) {\n return { deps: [] };\n }\n return null;\n }\n let deps: PackageDependency<TerraformManagerData>[] = [];\n try {\n const lines = content.split(newlineRegex);\n for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) {\n const line = lines[lineNumber];\n const terragruntDependency = dependencyBlockExtractionRegex.exec(line);\n if (terragruntDependency?.groups) {\n logger.trace(\n `Matched ${terragruntDependency.groups.type} on line ${lineNumber}`,\n );\n const tfDepType = getTerragruntDependencyType(\n terragruntDependency.groups.type,\n );\n let result: ExtractionResult | null = null;\n switch (tfDepType) {\n case 'terraform': {\n result = extractTerragruntModule(lineNumber, lines);\n break;\n }\n /* istanbul ignore next */\n default:\n logger.trace(\n `Could not identify TerragruntDependencyType ${terragruntDependency.groups.type} on line ${lineNumber}.`,\n );\n break;\n }\n // v8 ignore else -- only the ignored default case leaves this unset\n if (result) {\n lineNumber = result.lineNumber;\n deps = deps.concat(result.dependencies);\n result = null;\n }\n }\n }\n } catch (err) /* istanbul ignore next */ {\n logger.debug({ err, packageFile }, 'Error extracting terragrunt plugins');\n }\n deps.forEach((dep) => {\n // TODO #22198\n switch (dep.managerData!.terragruntDependencyType) {\n case 'terraform':\n analyseTerragruntModule(dep);\n break;\n /* istanbul ignore next */\n default:\n }\n\n delete dep.managerData;\n });\n return { deps };\n}\n"],"mappings":";;;;;AAUA,MAAM,iCAAiC,MAAM,8BAA8B;AAC3E,MAAM,mBAAmB,CAAC,aAAa;AACvC,MAAM,oBAAoB,MAAM,0BAA0B;AAE1D,SAAgB,mBACd,SACA,aAC2B;CAC3B,OAAO,MAAM,EAAE,QAAQ,GAAG,iCAAiC,YAAa,EAAE;CAC1E,IAAI,CAAC,4BAA4B,SAAS,gBAAgB,GAAG;EAC3D,IAAI,QAAQ,MAAM,iBAAiB,GACjC,OAAO,EAAE,MAAM,CAAC,EAAE;EAEpB,OAAO;CACT;CACA,IAAI,OAAkD,CAAC;CACvD,IAAI;EACF,MAAM,QAAQ,QAAQ,MAAM,YAAY;EACxC,KAAK,IAAI,aAAa,GAAG,aAAa,MAAM,QAAQ,cAAc,GAAG;GACnE,MAAM,OAAO,MAAM;GACnB,MAAM,uBAAuB,+BAA+B,KAAK,IAAI;GACrE,IAAI,sBAAsB,QAAQ;IAChC,OAAO,MACL,WAAW,qBAAqB,OAAO,KAAK,WAAW,YACzD;IACA,MAAM,YAAY,4BAChB,qBAAqB,OAAO,IAC9B;IACA,IAAI,SAAkC;IACtC,QAAQ,WAAR;KACE,KAAK;MACH,SAAS,wBAAwB,YAAY,KAAK;MAClD;;KAGF,SACE,OAAO,MACL,+CAA+C,qBAAqB,OAAO,KAAK,WAAW,WAAW,EACxG;IAEJ;;IAEA,IAAI,QAAQ;KACV,aAAa,OAAO;KACpB,OAAO,KAAK,OAAO,OAAO,YAAY;KACtC,SAAS;IACX;GACF;EACF;CACF,SAAS,gCAAgC;EACvC,OAAO,MAAM;GAAE;GAAK;EAAY,GAAG,qCAAqC;CAC1E;CACA,KAAK,SAAS,QAAQ;EAEpB,QAAQ,IAAI,YAAa,0BAAzB;GACE,KAAK,aACH,wBAAwB,GAAG;EAI/B;EAEA,OAAO,IAAI;CACb,CAAC;CACD,OAAO,EAAE,KAAK;AAChB"}
|
|
@@ -20,6 +20,7 @@ function extractPackageFile(content, packageFile, _config) {
|
|
|
20
20
|
logger.trace(`Matched TFLint plugin on line ${lineNumber}`);
|
|
21
21
|
let result = null;
|
|
22
22
|
result = extractTFLintPlugin(lineNumber, lines, tfLintPlugin.groups.pluginName);
|
|
23
|
+
// v8 ignore else -- `extractTFLintPlugin()` always returns a result
|
|
23
24
|
if (result) {
|
|
24
25
|
lineNumber = result.lineNumber;
|
|
25
26
|
deps = deps.concat(result.dependencies);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/tflint-plugin/extract.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport { extractTFLintPlugin } from './plugins.ts';\nimport type { ExtractionResult } from './types.ts';\nimport { checkFileContainsPlugins } from './util.ts';\n\nconst dependencyBlockExtractionRegex = regEx(\n /^\\s*plugin\\s+\"(?<pluginName>[^\"]+)\"\\s+{\\s*$/,\n);\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n _config: ExtractConfig,\n): PackageFileContent | null {\n logger.trace({ content }, `tflint.extractPackageFile(${packageFile})`);\n if (!checkFileContainsPlugins(content)) {\n logger.debug(\n { packageFile },\n 'preflight content check has not found any relevant content',\n );\n return null;\n }\n\n let deps: PackageDependency[] = [];\n\n try {\n const lines = content.split(newlineRegex);\n\n for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) {\n const line = lines[lineNumber];\n const tfLintPlugin = dependencyBlockExtractionRegex.exec(line);\n if (tfLintPlugin?.groups) {\n logger.trace(`Matched TFLint plugin on line ${lineNumber}`);\n let result: ExtractionResult | null = null;\n result = extractTFLintPlugin(\n lineNumber,\n lines,\n tfLintPlugin.groups.pluginName,\n );\n if (result) {\n lineNumber = result.lineNumber;\n deps = deps.concat(result.dependencies);\n result = null;\n }\n }\n }\n } catch (err) /* istanbul ignore next */ {\n logger.debug({ err, packageFile }, 'Error extracting TFLint plugins');\n }\n\n return deps.length ? { deps } : null;\n}\n"],"mappings":";;;;;AAWA,MAAM,iCAAiC,MACrC,6CACF;AAEA,SAAgB,mBACd,SACA,aACA,SAC2B;CAC3B,OAAO,MAAM,EAAE,QAAQ,GAAG,6BAA6B,YAAY,EAAE;CACrE,IAAI,CAAC,yBAAyB,OAAO,GAAG;EACtC,OAAO,MACL,EAAE,YAAY,GACd,4DACF;EACA,OAAO;CACT;CAEA,IAAI,OAA4B,CAAC;CAEjC,IAAI;EACF,MAAM,QAAQ,QAAQ,MAAM,YAAY;EAExC,KAAK,IAAI,aAAa,GAAG,aAAa,MAAM,QAAQ,cAAc,GAAG;GACnE,MAAM,OAAO,MAAM;GACnB,MAAM,eAAe,+BAA+B,KAAK,IAAI;GAC7D,IAAI,cAAc,QAAQ;IACxB,OAAO,MAAM,iCAAiC,YAAY;IAC1D,IAAI,SAAkC;IACtC,SAAS,oBACP,YACA,OACA,aAAa,OAAO,UACtB
|
|
1
|
+
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/tflint-plugin/extract.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport { extractTFLintPlugin } from './plugins.ts';\nimport type { ExtractionResult } from './types.ts';\nimport { checkFileContainsPlugins } from './util.ts';\n\nconst dependencyBlockExtractionRegex = regEx(\n /^\\s*plugin\\s+\"(?<pluginName>[^\"]+)\"\\s+{\\s*$/,\n);\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n _config: ExtractConfig,\n): PackageFileContent | null {\n logger.trace({ content }, `tflint.extractPackageFile(${packageFile})`);\n if (!checkFileContainsPlugins(content)) {\n logger.debug(\n { packageFile },\n 'preflight content check has not found any relevant content',\n );\n return null;\n }\n\n let deps: PackageDependency[] = [];\n\n try {\n const lines = content.split(newlineRegex);\n\n for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) {\n const line = lines[lineNumber];\n const tfLintPlugin = dependencyBlockExtractionRegex.exec(line);\n if (tfLintPlugin?.groups) {\n logger.trace(`Matched TFLint plugin on line ${lineNumber}`);\n let result: ExtractionResult | null = null;\n result = extractTFLintPlugin(\n lineNumber,\n lines,\n tfLintPlugin.groups.pluginName,\n );\n // v8 ignore else -- `extractTFLintPlugin()` always returns a result\n if (result) {\n lineNumber = result.lineNumber;\n deps = deps.concat(result.dependencies);\n result = null;\n }\n }\n }\n } catch (err) /* istanbul ignore next */ {\n logger.debug({ err, packageFile }, 'Error extracting TFLint plugins');\n }\n\n return deps.length ? { deps } : null;\n}\n"],"mappings":";;;;;AAWA,MAAM,iCAAiC,MACrC,6CACF;AAEA,SAAgB,mBACd,SACA,aACA,SAC2B;CAC3B,OAAO,MAAM,EAAE,QAAQ,GAAG,6BAA6B,YAAY,EAAE;CACrE,IAAI,CAAC,yBAAyB,OAAO,GAAG;EACtC,OAAO,MACL,EAAE,YAAY,GACd,4DACF;EACA,OAAO;CACT;CAEA,IAAI,OAA4B,CAAC;CAEjC,IAAI;EACF,MAAM,QAAQ,QAAQ,MAAM,YAAY;EAExC,KAAK,IAAI,aAAa,GAAG,aAAa,MAAM,QAAQ,cAAc,GAAG;GACnE,MAAM,OAAO,MAAM;GACnB,MAAM,eAAe,+BAA+B,KAAK,IAAI;GAC7D,IAAI,cAAc,QAAQ;IACxB,OAAO,MAAM,iCAAiC,YAAY;IAC1D,IAAI,SAAkC;IACtC,SAAS,oBACP,YACA,OACA,aAAa,OAAO,UACtB;;IAEA,IAAI,QAAQ;KACV,aAAa,OAAO;KACpB,OAAO,KAAK,OAAO,OAAO,YAAY;KACtC,SAAS;IACX;GACF;EACF;CACF,SAAS,gCAAgC;EACvC,OAAO,MAAM;GAAE;GAAK;EAAY,GAAG,iCAAiC;CACtE;CAEA,OAAO,KAAK,SAAS,EAAE,KAAK,IAAI;AAClC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugins.js","names":[],"sources":["../../../../lib/modules/manager/tflint-plugin/plugins.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { GithubReleasesDatasource } from '../../datasource/github-releases/index.ts';\nimport type { PackageDependency } from '../types.ts';\nimport type { ExtractionResult } from './types.ts';\nimport { keyValueExtractionRegex } from './util.ts';\n\nexport function extractTFLintPlugin(\n startingLine: number,\n lines: string[],\n // TODO: remove unused parameter\n _pluginName: string,\n): ExtractionResult {\n let lineNumber = startingLine;\n const deps: PackageDependency[] = [];\n\n let pluginSource: string | null = null;\n let currentVersion: string | null = null;\n\n let braceCounter = 0;\n do {\n // istanbul ignore if\n if (lineNumber > lines.length - 1) {\n logger.debug(`Malformed TFLint configuration file detected.`);\n }\n\n const line = lines[lineNumber];\n\n // istanbul ignore else\n if (isString(line)) {\n // `{` will be counted with +1 and `}` with -1.\n // Therefore if we reach braceCounter == 0 then we found the end of the tflint configuration block.\n const openBrackets = coerceArray(line.match(regEx(/\\{/g))).length;\n const closedBrackets = coerceArray(line.match(regEx(/\\}/g))).length;\n braceCounter = braceCounter + openBrackets - closedBrackets;\n\n // only update fields inside the root block\n if (braceCounter === 1) {\n const kvMatch = keyValueExtractionRegex.exec(line);\n if (kvMatch?.groups) {\n if (kvMatch.groups.key === 'version') {\n currentVersion = kvMatch.groups.value;\n } else if (kvMatch.groups.key === 'source') {\n pluginSource = kvMatch.groups.value;\n }\n }\n }\n } else {\n // stop - something went wrong\n braceCounter = 0;\n }\n lineNumber += 1;\n } while (braceCounter !== 0);\n\n const dep = analyseTFLintPlugin(pluginSource, currentVersion);\n deps.push(dep);\n\n // remove last lineNumber addition to not skip a line after the last bracket\n lineNumber -= 1;\n return { lineNumber, dependencies: deps };\n}\n\nfunction analyseTFLintPlugin(\n source: string | null,\n version: string | null,\n): PackageDependency {\n const dep: PackageDependency = {};\n\n if (source) {\n dep.depType = 'plugin';\n\n const sourceParts = source.split('/');\n if (sourceParts[0] === 'github.com') {\n dep.currentValue = version;\n dep.datasource = GithubReleasesDatasource.id;\n dep.depName = sourceParts.slice(1).join('/');\n } else {\n dep.skipReason = 'unsupported-datasource';\n dep.depName = source;\n }\n } else {\n logger.debug({ dep }, 'tflint plugin has no source');\n dep.skipReason = 'no-source';\n }\n\n return dep;\n}\n"],"mappings":";;;;;;;AASA,SAAgB,oBACd,cACA,OAEA,aACkB;CAClB,IAAI,aAAa;CACjB,MAAM,OAA4B,CAAC;CAEnC,IAAI,eAA8B;CAClC,IAAI,iBAAgC;CAEpC,IAAI,eAAe;CACnB,GAAG;;EAED,IAAI,aAAa,MAAM,SAAS,GAC9B,OAAO,MAAM,+CAA+C;EAG9D,MAAM,OAAO,MAAM;;EAGnB,IAAI,SAAS,IAAI,GAAG;GAGlB,MAAM,eAAe,YAAY,KAAK,MAAM,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;GAC3D,MAAM,iBAAiB,YAAY,KAAK,MAAM,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;GAC7D,eAAe,eAAe,eAAe;GAG7C,IAAI,iBAAiB,GAAG;IACtB,MAAM,UAAU,wBAAwB,KAAK,IAAI;IACjD,IAAI,SAAS,QAAQ;KACnB,IAAI,QAAQ,OAAO,QAAQ,WACzB,iBAAiB,QAAQ,OAAO;
|
|
1
|
+
{"version":3,"file":"plugins.js","names":[],"sources":["../../../../lib/modules/manager/tflint-plugin/plugins.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { GithubReleasesDatasource } from '../../datasource/github-releases/index.ts';\nimport type { PackageDependency } from '../types.ts';\nimport type { ExtractionResult } from './types.ts';\nimport { keyValueExtractionRegex } from './util.ts';\n\nexport function extractTFLintPlugin(\n startingLine: number,\n lines: string[],\n // TODO: remove unused parameter\n _pluginName: string,\n): ExtractionResult {\n let lineNumber = startingLine;\n const deps: PackageDependency[] = [];\n\n let pluginSource: string | null = null;\n let currentVersion: string | null = null;\n\n let braceCounter = 0;\n do {\n // istanbul ignore if\n if (lineNumber > lines.length - 1) {\n logger.debug(`Malformed TFLint configuration file detected.`);\n }\n\n const line = lines[lineNumber];\n\n // istanbul ignore else\n if (isString(line)) {\n // `{` will be counted with +1 and `}` with -1.\n // Therefore if we reach braceCounter == 0 then we found the end of the tflint configuration block.\n const openBrackets = coerceArray(line.match(regEx(/\\{/g))).length;\n const closedBrackets = coerceArray(line.match(regEx(/\\}/g))).length;\n braceCounter = braceCounter + openBrackets - closedBrackets;\n\n // only update fields inside the root block\n if (braceCounter === 1) {\n const kvMatch = keyValueExtractionRegex.exec(line);\n if (kvMatch?.groups) {\n if (kvMatch.groups.key === 'version') {\n currentVersion = kvMatch.groups.value;\n // NOTE: the key regex only matches these two, so the implicit else\n // never runs. A coverage-ignore hint cannot suppress it on an\n // `else if`.\n } else if (kvMatch.groups.key === 'source') {\n pluginSource = kvMatch.groups.value;\n }\n }\n }\n } else {\n // stop - something went wrong\n braceCounter = 0;\n }\n lineNumber += 1;\n } while (braceCounter !== 0);\n\n const dep = analyseTFLintPlugin(pluginSource, currentVersion);\n deps.push(dep);\n\n // remove last lineNumber addition to not skip a line after the last bracket\n lineNumber -= 1;\n return { lineNumber, dependencies: deps };\n}\n\nfunction analyseTFLintPlugin(\n source: string | null,\n version: string | null,\n): PackageDependency {\n const dep: PackageDependency = {};\n\n if (source) {\n dep.depType = 'plugin';\n\n const sourceParts = source.split('/');\n if (sourceParts[0] === 'github.com') {\n dep.currentValue = version;\n dep.datasource = GithubReleasesDatasource.id;\n dep.depName = sourceParts.slice(1).join('/');\n } else {\n dep.skipReason = 'unsupported-datasource';\n dep.depName = source;\n }\n } else {\n logger.debug({ dep }, 'tflint plugin has no source');\n dep.skipReason = 'no-source';\n }\n\n return dep;\n}\n"],"mappings":";;;;;;;AASA,SAAgB,oBACd,cACA,OAEA,aACkB;CAClB,IAAI,aAAa;CACjB,MAAM,OAA4B,CAAC;CAEnC,IAAI,eAA8B;CAClC,IAAI,iBAAgC;CAEpC,IAAI,eAAe;CACnB,GAAG;;EAED,IAAI,aAAa,MAAM,SAAS,GAC9B,OAAO,MAAM,+CAA+C;EAG9D,MAAM,OAAO,MAAM;;EAGnB,IAAI,SAAS,IAAI,GAAG;GAGlB,MAAM,eAAe,YAAY,KAAK,MAAM,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;GAC3D,MAAM,iBAAiB,YAAY,KAAK,MAAM,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;GAC7D,eAAe,eAAe,eAAe;GAG7C,IAAI,iBAAiB,GAAG;IACtB,MAAM,UAAU,wBAAwB,KAAK,IAAI;IACjD,IAAI,SAAS,QAAQ;KACnB,IAAI,QAAQ,OAAO,QAAQ,WACzB,iBAAiB,QAAQ,OAAO;UAI3B,IAAI,QAAQ,OAAO,QAAQ,UAChC,eAAe,QAAQ,OAAO;IAElC;GACF;EACF,OAEE,eAAe;EAEjB,cAAc;CAChB,SAAS,iBAAiB;CAE1B,MAAM,MAAM,oBAAoB,cAAc,cAAc;CAC5D,KAAK,KAAK,GAAG;CAGb,cAAc;CACd,OAAO;EAAE;EAAY,cAAc;CAAK;AAC1C;AAEA,SAAS,oBACP,QACA,SACmB;CACnB,MAAM,MAAyB,CAAC;CAEhC,IAAI,QAAQ;EACV,IAAI,UAAU;EAEd,MAAM,cAAc,OAAO,MAAM,GAAG;EACpC,IAAI,YAAY,OAAO,cAAc;GACnC,IAAI,eAAe;GACnB,IAAI,aAAa,yBAAyB;GAC1C,IAAI,UAAU,YAAY,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG;EAC7C,OAAO;GACL,IAAI,aAAa;GACjB,IAAI,UAAU;EAChB;CACF,OAAO;EACL,OAAO,MAAM,EAAE,IAAI,GAAG,6BAA6B;EACnD,IAAI,aAAa;CACnB;CAEA,OAAO;AACT"}
|
package/package.json
CHANGED
package/renovate-schema.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$id": "https://docs.renovatebot.com/renovate-schema.json",
|
|
3
|
-
"title": "JSON schema for Renovate 44.
|
|
3
|
+
"title": "JSON schema for Renovate 44.91.0 config files (https://renovatebot.com/)",
|
|
4
4
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
5
|
-
"x-renovate-version": "44.
|
|
5
|
+
"x-renovate-version": "44.91.0",
|
|
6
6
|
"allowComments": true,
|
|
7
7
|
"type": "object",
|
|
8
8
|
"definitions": {
|